diff --git a/package-lock.json b/package-lock.json index d2a65ca..b221257 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,27 +24,27 @@ } }, "@babel/compat-data": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.7.tgz", - "integrity": "sha512-qJzAIcv03PyaWqxRgO4mSU3lihncDT296vnyuE2O8uA4w3UHWI4S3hgeZd1L8W1Bft40w9JxJ2b412iDUFFRhw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.25.4.tgz", + "integrity": "sha512-+LGRog6RAsCJrrrg/IO6LGmpphNe5DiK30dGjCoxxeGv49B10/3XYGxPsAwrDlMFcFEvdAUavDT8r9k/hSyQqQ==", "dev": true }, "@babel/core": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.7.tgz", - "integrity": "sha512-nykK+LEK86ahTkX/3TgauT0ikKoNCfKHEaZYTUVupJdTLzGNvrblu4u6fa7DhZONAltdf8e662t/abY8idrd/g==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.25.2.tgz", + "integrity": "sha512-BBt3opiCOxUr9euZ5/ro/Xv8/V7yJ5bjYMqG/C1YAo8MIKAnumZalCN+msbci3Pigy4lIQfPUpfMM27HMGaYEA==", "dev": true, "requires": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helpers": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/generator": "^7.25.0", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-module-transforms": "^7.25.2", + "@babel/helpers": "^7.25.0", + "@babel/parser": "^7.25.0", + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.2", + "@babel/types": "^7.25.2", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -53,12 +53,12 @@ } }, "@babel/generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.7.tgz", - "integrity": "sha512-oipXieGC3i45Y1A41t4tAqpnEZWgB/lC6Ehh6+rOviR5XWpTtMmLN+fGjz9vOiNRt0p6RtO6DtD0pdU3vpqdSA==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.25.6.tgz", + "integrity": "sha512-VPC82gr1seXOpkjAAKoLhP50vx4vGNlF4msF64dSFq1P8RfB+QAuJWGHPXXPc8QyfVWwwB/TNNU4+ayZmHNbZw==", "dev": true, "requires": { - "@babel/types": "^7.24.7", + "@babel/types": "^7.25.6", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" @@ -84,39 +84,37 @@ } }, "@babel/helper-compilation-targets": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.24.7.tgz", - "integrity": "sha512-ctSdRHBi20qWOfy27RUb4Fhp07KSJ3sXcuSvTrXrc4aG8NSYDo1ici3Vhg9bg69y5bj0Mr1lh0aeEgTvc12rMg==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.2.tgz", + "integrity": "sha512-U2U5LsSaZ7TAt3cfaymQ8WHh0pxvdHoEk6HVpaexxixjyEquMh0L0YNJNM6CTGKMXV1iksi0iZkGw4AcFkPaaw==", "dev": true, "requires": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "browserslist": "^4.22.2", + "@babel/compat-data": "^7.25.2", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", "lru-cache": "^5.1.1", "semver": "^6.3.1" } }, "@babel/helper-create-class-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.24.7.tgz", - "integrity": "sha512-kTkaDl7c9vO80zeX1rJxnuRpEsD5tA81yh11X1gQo+PhSti3JS+7qeZo9U4RHobKRiFPKaGK3svUAeb8D0Q7eg==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.25.4.tgz", + "integrity": "sha512-ro/bFs3/84MDgDmMwbcHgDa8/E6J3QKNTk4xJJnVeFtGE+tL0K26E3pNxhYz2b67fJpt7Aphw5XcploKXuCvCQ==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.8", "@babel/helper-optimise-call-expression": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-replace-supers": "^7.25.0", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/traverse": "^7.25.4", "semver": "^6.3.1" } }, "@babel/helper-create-regexp-features-plugin": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.24.7.tgz", - "integrity": "sha512-03TCmXy2FtXJEZfbXDTSqq1fRJArk7lX9DOFC/47VthYcxyIOx+eXQmdo6DOQvrbpIix+KfXwvuXdFDZHxt+rA==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.25.2.tgz", + "integrity": "sha512-+wqVGP+DFmqwFD3EH6TMTfUNeqDehV3E/dl+Sd54eaXqm17tEUNbEIn4sVivVowbvUpOtIGxdo3GoXyDH9N/9g==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.24.7", @@ -137,42 +135,14 @@ "resolve": "^1.14.2" } }, - "@babel/helper-environment-visitor": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.24.7.tgz", - "integrity": "sha512-DoiN84+4Gnd0ncbBOM9AZENV4a5ZiL39HYMyZJGZ/AZEykHYdJw0wW3kdcsh9/Kn+BRXHLkkklZ51ecPKmI1CQ==", - "dev": true, - "requires": { - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.24.7.tgz", - "integrity": "sha512-FyoJTsj/PEUWu1/TYRiXTIHc8lbw+TDYkZuoE43opPS5TrI7MyONBE1oNvfguEXAD9yhQRrVBnXdXzSLQl9XnA==", - "dev": true, - "requires": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" - } - }, - "@babel/helper-hoist-variables": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.24.7.tgz", - "integrity": "sha512-MJJwhkoGy5c4ehfoRyrJ/owKeMl19U54h27YYftT0o2teQ3FJ3nQUf/I3LlJsX4l3qlw7WRXUmiyajvHXoTubQ==", - "dev": true, - "requires": { - "@babel/types": "^7.24.7" - } - }, "@babel/helper-member-expression-to-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.7.tgz", - "integrity": "sha512-LGeMaf5JN4hAT471eJdBs/GK1DoYIJ5GCtZN/EsL6KUiiDZOvO/eKE11AMZJa2zP4zk4qe9V2O/hxAmkRc8p6w==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.24.8.tgz", + "integrity": "sha512-LABppdt+Lp/RlBxqrh4qgf1oEH/WxdzQNDJIu5gC/W1GyvPVrOBiItmmM8wan2fm4oYqFuFfkXmlGpLQhPY8CA==", "dev": true, "requires": { - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" } }, "@babel/helper-module-imports": { @@ -186,16 +156,15 @@ } }, "@babel/helper-module-transforms": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.24.7.tgz", - "integrity": "sha512-1fuJEwIrp+97rM4RWdO+qrRsZlAeL1lQJoPqtCYWv0NL115XM93hIH4CSRln2w52SqvmY5hqdtauB6QFCDiZNQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.25.2.tgz", + "integrity": "sha512-BjyRAbix6j/wv83ftcVJmBt72QtHI56C7JXZoG2xATiLpmoC7dpd8WnkikExHDVPpi/3qCmO6WY1EaXOluiecQ==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.24.7", "@babel/helper-module-imports": "^7.24.7", "@babel/helper-simple-access": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.2" } }, "@babel/helper-optimise-call-expression": { @@ -208,31 +177,31 @@ } }, "@babel/helper-plugin-utils": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.7.tgz", - "integrity": "sha512-Rq76wjt7yz9AAc1KnlRKNAi/dMSVWgDRx43FHoJEbcYU6xOWaE2dVPwcdTukJrjxS65GITyfbvEYHvkirZ6uEg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.24.8.tgz", + "integrity": "sha512-FFWx5142D8h2Mgr/iPVGH5G7w6jDn4jUSpZTyDnQO0Yn7Ks2Kuz6Pci8H6MPCoUJegd/UZQ3tAvfLCxQSnWWwg==", "dev": true }, "@babel/helper-remap-async-to-generator": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.24.7.tgz", - "integrity": "sha512-9pKLcTlZ92hNZMQfGCHImUpDOlAgkkpqalWEeftW5FBya75k8Li2ilerxkM/uBEj01iBZXcCIB/bwvDYgWyibA==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.25.0.tgz", + "integrity": "sha512-NhavI2eWEIz/H9dbrG0TuOicDhNexze43i5z7lEqwYm0WEZVTwnPpA0EafUTP7+6/W79HWIP2cTe3Z5NiSTVpw==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-wrap-function": "^7.24.7" + "@babel/helper-wrap-function": "^7.25.0", + "@babel/traverse": "^7.25.0" } }, "@babel/helper-replace-supers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.24.7.tgz", - "integrity": "sha512-qTAxxBM81VEyoAY0TtLrx1oAEJc09ZK67Q9ljQToqCnA+55eNwCORaxlKyu+rNfX86o8OXRUSNUnrtsAZXM9sg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.0.tgz", + "integrity": "sha512-q688zIvQVYtZu+i2PsdIu/uWGRpfxzr5WESsfpShfZECkO+d2o+WROWezCi/Q6kJ0tfPa5+pUGUlfx2HhrA3Bg==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-member-expression-to-functions": "^7.24.7", - "@babel/helper-optimise-call-expression": "^7.24.7" + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/traverse": "^7.25.0" } }, "@babel/helper-simple-access": { @@ -255,19 +224,10 @@ "@babel/types": "^7.24.7" } }, - "@babel/helper-split-export-declaration": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.24.7.tgz", - "integrity": "sha512-oy5V7pD+UvfkEATUKvIjvIAH/xCzfsFVw7ygW2SI6NClZzquT+mwdTfgfdbUiceh6iQO0CHtCPsyze/MZ2YbAA==", - "dev": true, - "requires": { - "@babel/types": "^7.24.7" - } - }, "@babel/helper-string-parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.7.tgz", - "integrity": "sha512-7MbVt6xrwFQbunH2DNQsAP5sTGxfqQtErvBIvIMi6EQnbgUOuVYanvREcmFrOPhoXBrTtjhhP+lW+o5UfK+tDg==" + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", + "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==" }, "@babel/helper-validator-identifier": { "version": "7.24.7", @@ -275,30 +235,29 @@ "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==" }, "@babel/helper-validator-option": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.7.tgz", - "integrity": "sha512-yy1/KvjhV/ZCL+SM7hBrvnZJ3ZuT9OuZgIJAGpPEToANvc3iM6iDvBnRjtElWibHU6n8/LPR/EjX9EtIEYO3pw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.24.8.tgz", + "integrity": "sha512-xb8t9tD1MHLungh/AIoWYN+gVHaB9kwlu8gffXGSt3FFEIT7RjS+xWbc2vUD1UTZdIpKj/ab3rdqJ7ufngyi2Q==", "dev": true }, "@babel/helper-wrap-function": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.24.7.tgz", - "integrity": "sha512-N9JIYk3TD+1vq/wn77YnJOqMtfWhNewNE+DJV4puD2X7Ew9J4JvrzrFDfTfyv5EgEXVy9/Wt8QiOErzEmv5Ifw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.25.0.tgz", + "integrity": "sha512-s6Q1ebqutSiZnEjaofc/UKDyC4SbzV5n5SrA2Gq8UawLycr3i04f1dX4OzoQVnexm6aOCh37SQNYlJ/8Ku+PMQ==", "dev": true, "requires": { - "@babel/helper-function-name": "^7.24.7", - "@babel/template": "^7.24.7", - "@babel/traverse": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/template": "^7.25.0", + "@babel/traverse": "^7.25.0", + "@babel/types": "^7.25.0" } }, "@babel/helpers": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.7.tgz", - "integrity": "sha512-NlmJJtvcw72yRJRcnCmGvSi+3jDEg8qFu3z0AFoymmzLx5ERVWyzd9kVXr7Th9/8yIJi2Zc6av4Tqz3wFs8QWg==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.25.6.tgz", + "integrity": "sha512-Xg0tn4HcfTijTwfDwYlvVCl43V6h4KyVVX2aEm4qdO/PC6L2YvzLHFdmxhoeSA3eslcE6+ZVXHgWwopXYLNq4Q==", "requires": { - "@babel/template": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6" } }, "@babel/highlight": { @@ -313,27 +272,39 @@ } }, "@babel/parser": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.7.tgz", - "integrity": "sha512-9uUYRm6OqQrCqQdG1iCBwBPZgN8ciDBro2nIOFaiRz1/BCxaI7CNvQbDHvsArAC7Tw9Hda/B3U+6ui9u4HWXPw==" + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", + "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "requires": { + "@babel/types": "^7.25.6" + } }, "@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.24.7.tgz", - "integrity": "sha512-TiT1ss81W80eQsN+722OaeQMY/G4yTb4G9JrqeiDADs3N8lbPMGldWi9x8tyqCW5NLx1Jh2AvkE6r6QvEltMMQ==", + "version": "7.25.3", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.25.3.tgz", + "integrity": "sha512-wUrcsxZg6rqBXG05HG1FPYgsP6EvwF4WpBbxIpWIIYnH8wG0gzx3yZY3dtEHas4sTAOGkbTsc9EGPxwff8lRoA==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.3" + } + }, + "@babel/plugin-bugfix-safari-class-field-initializer-scope": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.25.0.tgz", + "integrity": "sha512-Bm4bH2qsX880b/3ziJ8KD711LT7z4u8CFudmjqle65AZj/HNUFhEf90dqYv6O86buWvSBmeQDjv0Tn2aF/bIBA==", + "dev": true, + "requires": { + "@babel/helper-plugin-utils": "^7.24.8" } }, "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.24.7.tgz", - "integrity": "sha512-unaQgZ/iRu/By6tsjMZzpeBZjChYfLYry6HrEXPoz3KmfF0sVBQ1l8zKMQ4xRGLWVsjuvB8nQfjNP/DcfEOCsg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.25.0.tgz", + "integrity": "sha512-lXwdNZtTmeVOOFtwM/WDe7yg1PL8sYhRk/XH0FzbR2HDQ0xC+EnQ/JHeoMYSavtU115tnUk0q9CDyq8si+LMAA==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" } }, "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { @@ -348,13 +319,13 @@ } }, "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.24.7.tgz", - "integrity": "sha512-utA4HuR6F4Vvcr+o4DnjL8fCOlgRFGbeeBEGNg3ZTrLFw6VWG5XmUrvcQ0FjIYMU2ST4XcR2Wsp7t9qOAPnxMg==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.25.0.tgz", + "integrity": "sha512-tggFrk1AIShG/RUQbEwt2Tr/E+ObkfwrPjR6BjbRvsx24+PSjK8zrq0GWPNCjo8qpRx4DuJzlcvWJqlm+0h3kw==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.0" } }, "@babel/plugin-proposal-private-property-in-object": { @@ -409,21 +380,21 @@ } }, "@babel/plugin-syntax-import-assertions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.24.7.tgz", - "integrity": "sha512-Ec3NRUMoi8gskrkBe3fNmEQfxDvY8bgfQpz6jlk/41kX9eUjvpyqWU7PBP/pLAvMaSQjbMNKJmvX57jP+M6bPg==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.25.6.tgz", + "integrity": "sha512-aABl0jHw9bZ2karQ/uUD6XP4u0SG22SJrOHFoL6XB1R7dTovOP4TzTlsxOYC5yQ1pdscVK2JTUnF6QL3ARoAiQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" } }, "@babel/plugin-syntax-import-attributes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.24.7.tgz", - "integrity": "sha512-hbX+lKKeUMGihnK8nvKqmXBInriT3GVjzXKFriV3YC6APGxMbP8RZNFwy91+hocLXq90Mta+HshoB31802bb8A==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.25.6.tgz", + "integrity": "sha512-sXaDXaJN9SNLymBdlWFA+bjzBhFD617ZaFiY13dGt7TVslVvVgA6fkZOP7Ki3IGElC45lwHdOTrCtKZGVAWeLQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" } }, "@babel/plugin-syntax-import-meta": { @@ -536,15 +507,15 @@ } }, "@babel/plugin-transform-async-generator-functions": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.24.7.tgz", - "integrity": "sha512-o+iF77e3u7ZS4AoAuJvapz9Fm001PuD2V3Lp6OSE4FYQke+cSewYtnek+THqGRWyQloRCyvWL1OkyfNEl9vr/g==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.25.4.tgz", + "integrity": "sha512-jz8cV2XDDTqjKPwVPJBIjORVEmSGYhdRa8e5k5+vN+uwcjSrSxUaebBRa4ko1jqNF2uxyg8G6XYk30Jv285xzg==", "dev": true, "requires": { - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-remap-async-to-generator": "^7.24.7", - "@babel/plugin-syntax-async-generators": "^7.8.4" + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-remap-async-to-generator": "^7.25.0", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/traverse": "^7.25.4" } }, "@babel/plugin-transform-async-to-generator": { @@ -568,22 +539,22 @@ } }, "@babel/plugin-transform-block-scoping": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.24.7.tgz", - "integrity": "sha512-Nd5CvgMbWc+oWzBsuaMcbwjJWAcp5qzrbg69SZdHSP7AMY0AbWFqFO0WTFCA1jxhMCwodRwvRec8k0QUbZk7RQ==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.25.0.tgz", + "integrity": "sha512-yBQjYoOjXlFv9nlXb3f1casSHOZkWr29NX+zChVanLg5Nc157CrbEX9D7hxxtTpuFy7Q0YzmmWfJxzvps4kXrQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" } }, "@babel/plugin-transform-class-properties": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.24.7.tgz", - "integrity": "sha512-vKbfawVYayKcSeSR5YYzzyXvsDFWU2mD8U5TFeXtbCPLFUqe7GyCgvO6XDHzje862ODrOwy6WCPmKeWHbCFJ4w==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.25.4.tgz", + "integrity": "sha512-nZeZHyCWPfjkdU5pA/uHiTaDAFUEqkpzf1YoQT2NeSynCGYq9rxfyI3XpQbfx/a0hSnFH6TGlEXvae5Vi7GD8g==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" } }, "@babel/plugin-transform-class-static-block": { @@ -598,18 +569,16 @@ } }, "@babel/plugin-transform-classes": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.24.7.tgz", - "integrity": "sha512-CFbbBigp8ln4FU6Bpy6g7sE8B/WmCmzvivzUC6xDAdWVsjYTXijpuuGJmYkAaoWAzcItGKT3IOAbxRItZ5HTjw==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.25.4.tgz", + "integrity": "sha512-oexUfaQle2pF/b6E0dwsxQtAol9TLSO88kQvym6HHBWFliV2lGdrPieX+WgMRLSJDVzdYywk7jXbLPuO2KLTLg==", "dev": true, "requires": { "@babel/helper-annotate-as-pure": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-replace-supers": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-replace-supers": "^7.25.0", + "@babel/traverse": "^7.25.4", "globals": "^11.1.0" } }, @@ -624,12 +593,12 @@ } }, "@babel/plugin-transform-destructuring": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.7.tgz", - "integrity": "sha512-19eJO/8kdCQ9zISOf+SEUJM/bAUIsvY3YDnXZTupUCQ8LgrWnsG/gFB9dvXqdXnRXMAM8fvt7b0CBKQHNGy1mw==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.24.8.tgz", + "integrity": "sha512-36e87mfY8TnRxc7yc6M9g9gOB7rKgSahqkIKwLpz4Ppk2+zC2Cy1is0uwtuSG6AE4zlTOUa+7JGz9jCJGLqQFQ==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" } }, "@babel/plugin-transform-dotall-regex": { @@ -651,6 +620,16 @@ "@babel/helper-plugin-utils": "^7.24.7" } }, + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": { + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.25.0.tgz", + "integrity": "sha512-YLpb4LlYSc3sCUa35un84poXoraOiQucUTTu8X1j18JV+gNa8E0nyUf/CjZ171IRGr4jEguF+vzJU66QZhn29g==", + "dev": true, + "requires": { + "@babel/helper-create-regexp-features-plugin": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8" + } + }, "@babel/plugin-transform-dynamic-import": { "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.24.7.tgz", @@ -692,14 +671,14 @@ } }, "@babel/plugin-transform-function-name": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.24.7.tgz", - "integrity": "sha512-U9FcnA821YoILngSmYkW6FjyQe2TyZD5pHt4EVIhmcTkrJw/3KqcrRSxuOo5tFZJi7TE19iDyI1u+weTI7bn2w==", + "version": "7.25.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.25.1.tgz", + "integrity": "sha512-TVVJVdW9RKMNgJJlLtHsKDTydjZAbwIsn6ySBPQaEAUU5+gVvlJt/9nRmqVbsV/IBanRjzWoaAQKLoamWVOUuA==", "dev": true, "requires": { - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/traverse": "^7.25.1" } }, "@babel/plugin-transform-json-strings": { @@ -713,12 +692,12 @@ } }, "@babel/plugin-transform-literals": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.24.7.tgz", - "integrity": "sha512-vcwCbb4HDH+hWi8Pqenwnjy+UiklO4Kt1vfspcQYFhJdpthSnW8XvWGyDZWKNVrVbVViI/S7K9PDJZiUmP2fYQ==", + "version": "7.25.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.25.2.tgz", + "integrity": "sha512-HQI+HcTbm9ur3Z2DkO+jgESMAMcYLuN/A7NRw9juzxAezN9AvqvUTnpKP/9kkYANz6u7dFlAyOu44ejuGySlfw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" } }, "@babel/plugin-transform-logical-assignment-operators": { @@ -751,26 +730,26 @@ } }, "@babel/plugin-transform-modules-commonjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.7.tgz", - "integrity": "sha512-iFI8GDxtevHJ/Z22J5xQpVqFLlMNstcLXh994xifFwxxGslr2ZXXLWgtBeLctOD63UFDArdvN6Tg8RFw+aEmjQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.24.8.tgz", + "integrity": "sha512-WHsk9H8XxRs3JXKWFiqtQebdh9b/pTk4EgueygFzYlTKAg0Ud985mSevdNjdXdFBATSKVJGQXP1tv6aGbssLKA==", "dev": true, "requires": { - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-simple-access": "^7.24.7" } }, "@babel/plugin-transform-modules-systemjs": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.24.7.tgz", - "integrity": "sha512-GYQE0tW7YoaN13qFh3O1NCY4MPkUiAH3fiF7UcV/I3ajmDKEdG3l+UOcbAm4zUE3gnvUU+Eni7XrVKo9eO9auw==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.25.0.tgz", + "integrity": "sha512-YPJfjQPDXxyQWg/0+jHKj1llnY5f/R6a0p/vP4lPymxLu7Lvl4k2WMitqi08yxwQcCVUUdG9LCUj4TNEgAp3Jw==", "dev": true, "requires": { - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-module-transforms": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-identifier": "^7.24.7" + "@babel/helper-module-transforms": "^7.25.0", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "@babel/traverse": "^7.25.0" } }, "@babel/plugin-transform-modules-umd": { @@ -855,12 +834,12 @@ } }, "@babel/plugin-transform-optional-chaining": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.7.tgz", - "integrity": "sha512-tK+0N9yd4j+x/4hxF3F0e0fu/VdcxU18y5SevtyM/PCFlQvXbR0Zmlo2eBrKtVipGNFzpq56o8WsIIKcJFUCRQ==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.24.8.tgz", + "integrity": "sha512-5cTOLSMs9eypEy8JUVvIKOu6NgvbJMnpG62VpIHrTmROdQ+L5mDAaI40g25k5vXti55JWNX5jCkq3HZxXBQANw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", "@babel/plugin-syntax-optional-chaining": "^7.8.3" } @@ -875,13 +854,13 @@ } }, "@babel/plugin-transform-private-methods": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.24.7.tgz", - "integrity": "sha512-COTCOkG2hn4JKGEKBADkA8WNb35TGkkRbI5iT845dB+NyqgO8Hn+ajPbSnIQznneJTa3d30scb6iz/DhH8GsJQ==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.25.4.tgz", + "integrity": "sha512-ao8BG7E2b/URaUQGqN3Tlsg+M3KlHY6rJ1O1gXAEUnZoyNQnvKyH87Kfg+FoxSeyWUB8ISZZsC91C44ZuBFytw==", "dev": true, "requires": { - "@babel/helper-create-class-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-class-features-plugin": "^7.25.4", + "@babel/helper-plugin-utils": "^7.24.8" } }, "@babel/plugin-transform-private-property-in-object": { @@ -962,12 +941,12 @@ } }, "@babel/plugin-transform-typeof-symbol": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.7.tgz", - "integrity": "sha512-VtR8hDy7YLB7+Pet9IarXjg/zgCMSF+1mNS/EQEiEaUPoFXCVsHG64SIxcaaI2zJgRiv+YmgaQESUfWAdbjzgg==", + "version": "7.24.8", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.24.8.tgz", + "integrity": "sha512-adNTUpDCVnmAE58VEqKlAA6ZBlNkMnWD0ZcW76lyNFN3MJniyGFZfNwERVk8Ap56MCnXztmDr19T4mPTztcuaw==", "dev": true, "requires": { - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-plugin-utils": "^7.24.8" } }, "@babel/plugin-transform-unicode-escapes": { @@ -1000,29 +979,30 @@ } }, "@babel/plugin-transform-unicode-sets-regex": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.24.7.tgz", - "integrity": "sha512-2G8aAvF4wy1w/AGZkemprdGMRg5o6zPNhbHVImRz3lss55TYCBd6xStN19rt8XJHq20sqV0JbyWjOWwQRwV/wg==", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.25.4.tgz", + "integrity": "sha512-qesBxiWkgN1Q+31xUE9RcMk79eOXXDCv6tfyGMRSs4RGlioSg2WVyQAm07k726cSE56pa+Kb0y9epX2qaXzTvA==", "dev": true, "requires": { - "@babel/helper-create-regexp-features-plugin": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7" + "@babel/helper-create-regexp-features-plugin": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8" } }, "@babel/preset-env": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.24.7.tgz", - "integrity": "sha512-1YZNsc+y6cTvWlDHidMBsQZrZfEFjRIo/BZCT906PMdzOyXtSLTgqGdrpcuTDCXyd11Am5uQULtDIcCfnTc8fQ==", - "dev": true, - "requires": { - "@babel/compat-data": "^7.24.7", - "@babel/helper-compilation-targets": "^7.24.7", - "@babel/helper-plugin-utils": "^7.24.7", - "@babel/helper-validator-option": "^7.24.7", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", + "version": "7.25.4", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.25.4.tgz", + "integrity": "sha512-W9Gyo+KmcxjGahtt3t9fb14vFRWvPpu5pT6GBlovAK6BTBcxgjfVMSQCfJl4oi35ODrxP6xx2Wr8LNST57Mraw==", + "dev": true, + "requires": { + "@babel/compat-data": "^7.25.4", + "@babel/helper-compilation-targets": "^7.25.2", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.25.3", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.25.0", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.25.0", "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.25.0", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", "@babel/plugin-syntax-async-generators": "^7.8.4", "@babel/plugin-syntax-class-properties": "^7.12.13", @@ -1043,29 +1023,30 @@ "@babel/plugin-syntax-top-level-await": "^7.14.5", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", "@babel/plugin-transform-arrow-functions": "^7.24.7", - "@babel/plugin-transform-async-generator-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.25.4", "@babel/plugin-transform-async-to-generator": "^7.24.7", "@babel/plugin-transform-block-scoped-functions": "^7.24.7", - "@babel/plugin-transform-block-scoping": "^7.24.7", - "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.25.0", + "@babel/plugin-transform-class-properties": "^7.25.4", "@babel/plugin-transform-class-static-block": "^7.24.7", - "@babel/plugin-transform-classes": "^7.24.7", + "@babel/plugin-transform-classes": "^7.25.4", "@babel/plugin-transform-computed-properties": "^7.24.7", - "@babel/plugin-transform-destructuring": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", "@babel/plugin-transform-dotall-regex": "^7.24.7", "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.25.0", "@babel/plugin-transform-dynamic-import": "^7.24.7", "@babel/plugin-transform-exponentiation-operator": "^7.24.7", "@babel/plugin-transform-export-namespace-from": "^7.24.7", "@babel/plugin-transform-for-of": "^7.24.7", - "@babel/plugin-transform-function-name": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.25.1", "@babel/plugin-transform-json-strings": "^7.24.7", - "@babel/plugin-transform-literals": "^7.24.7", + "@babel/plugin-transform-literals": "^7.25.2", "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", "@babel/plugin-transform-member-expression-literals": "^7.24.7", "@babel/plugin-transform-modules-amd": "^7.24.7", - "@babel/plugin-transform-modules-commonjs": "^7.24.7", - "@babel/plugin-transform-modules-systemjs": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-modules-systemjs": "^7.25.0", "@babel/plugin-transform-modules-umd": "^7.24.7", "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", "@babel/plugin-transform-new-target": "^7.24.7", @@ -1074,9 +1055,9 @@ "@babel/plugin-transform-object-rest-spread": "^7.24.7", "@babel/plugin-transform-object-super": "^7.24.7", "@babel/plugin-transform-optional-catch-binding": "^7.24.7", - "@babel/plugin-transform-optional-chaining": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", "@babel/plugin-transform-parameters": "^7.24.7", - "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.25.4", "@babel/plugin-transform-private-property-in-object": "^7.24.7", "@babel/plugin-transform-property-literals": "^7.24.7", "@babel/plugin-transform-regenerator": "^7.24.7", @@ -1085,16 +1066,16 @@ "@babel/plugin-transform-spread": "^7.24.7", "@babel/plugin-transform-sticky-regex": "^7.24.7", "@babel/plugin-transform-template-literals": "^7.24.7", - "@babel/plugin-transform-typeof-symbol": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.8", "@babel/plugin-transform-unicode-escapes": "^7.24.7", "@babel/plugin-transform-unicode-property-regex": "^7.24.7", "@babel/plugin-transform-unicode-regex": "^7.24.7", - "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.25.4", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.10", - "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-corejs3": "^0.10.6", "babel-plugin-polyfill-regenerator": "^0.6.1", - "core-js-compat": "^3.31.0", + "core-js-compat": "^3.37.1", "semver": "^6.3.1" } }, @@ -1116,48 +1097,45 @@ "dev": true }, "@babel/runtime": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", - "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.25.6.tgz", + "integrity": "sha512-VBj9MYyDb9tuLq7yzqjgzt6Q+IBQLrGZfdjOekyEirZPHxXWoTSGUTMrpsfi58Up73d13NfYLv8HT9vmznjzhQ==", "dev": true, "requires": { "regenerator-runtime": "^0.14.0" } }, "@babel/template": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.7.tgz", - "integrity": "sha512-jYqfPrU9JTF0PmPy1tLYHW4Mp4KlgxJD9l2nP9fD6yT/ICi554DmrWBAEYpIelzjHf1msDP3PxJIRt/nFNfBig==", + "version": "7.25.0", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.25.0.tgz", + "integrity": "sha512-aOOgh1/5XzKvg1jvVz7AVrx2piJ2XBi227DHmbY6y+bM9H2FlN+IfecYu4Xl0cNiiVejlsCri89LUsbj8vJD9Q==", "requires": { "@babel/code-frame": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7" + "@babel/parser": "^7.25.0", + "@babel/types": "^7.25.0" } }, "@babel/traverse": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.7.tgz", - "integrity": "sha512-yb65Ed5S/QAcewNPh0nZczy9JdYXkkAbIsEo+P7BE7yO3txAY30Y/oPa3QkQ5It3xVG2kpKMg9MsdxZaO31uKA==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.25.6.tgz", + "integrity": "sha512-9Vrcx5ZW6UwK5tvqsj0nGpp/XzqthkT0dqIc9g1AdtygFToNtTF67XzYS//dm+SAK9cp3B9R4ZO/46p63SCjlQ==", "dev": true, "requires": { "@babel/code-frame": "^7.24.7", - "@babel/generator": "^7.24.7", - "@babel/helper-environment-visitor": "^7.24.7", - "@babel/helper-function-name": "^7.24.7", - "@babel/helper-hoist-variables": "^7.24.7", - "@babel/helper-split-export-declaration": "^7.24.7", - "@babel/parser": "^7.24.7", - "@babel/types": "^7.24.7", + "@babel/generator": "^7.25.6", + "@babel/parser": "^7.25.6", + "@babel/template": "^7.25.0", + "@babel/types": "^7.25.6", "debug": "^4.3.1", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.7.tgz", - "integrity": "sha512-XEFXSlxiG5td2EJRe8vOmRbaXVgfcBlszKujvVmWIK/UpywWljQCfzAv3RQCGujWQ1RD4YYWEAqDXfuJiy8f5Q==", + "version": "7.25.6", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", + "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", "requires": { - "@babel/helper-string-parser": "^7.24.7", + "@babel/helper-string-parser": "^7.24.8", "@babel/helper-validator-identifier": "^7.24.7", "to-fast-properties": "^2.0.0" } @@ -1208,9 +1186,9 @@ } }, "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", "dev": true }, "@jridgewell/trace-mapping": { @@ -1244,26 +1222,6 @@ "@types/node": "*" } }, - "@types/eslint": { - "version": "8.56.10", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", - "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", - "dev": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.7", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.7.tgz", - "integrity": "sha512-MzMFlSLBqNF2gcHWO0G1vP/YQyfvrxZ0bF+u7mzUdZ1/xK4A4sru+nraZz5i3iEIk1l1uyicaDVTB4QbbEkAYg==", - "dev": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, "@types/estree": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", @@ -1277,12 +1235,12 @@ "dev": true }, "@types/node": { - "version": "20.14.5", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.5.tgz", - "integrity": "sha512-aoRR+fJkZT2l0aGOJhuA8frnCSoNX6W7U2mpNq63+BxBIj5BQFt8rHy627kijCmm63ijdSdwvGgpUsU6MBsZZA==", + "version": "22.5.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.5.2.tgz", + "integrity": "sha512-acJsPTEqYqulZS/Yp/S3GgeE6GZ0qYODUR8aVr/DkhHQ8l9nd4j5x1/ZJy9/gHrRlFMqkO6i0I3E27Alu4jjPg==", "dev": true, "requires": { - "undici-types": "~5.26.4" + "undici-types": "~6.19.2" } }, "@ungap/promise-all-settled": { @@ -1481,9 +1439,9 @@ } }, "acorn": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", - "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "version": "8.12.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.1.tgz", + "integrity": "sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==", "dev": true }, "acorn-import-attributes": { @@ -1621,9 +1579,9 @@ "integrity": "sha512-08kcGqnYf/YmjoRhfxyu+CLxBjUtHLXLXX/vUfx9l2LYzG3c1m61nrpyFUZI6zeS+Li/wWMMidD9KgrqtGq3mA==" }, "aws4": { - "version": "1.13.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.0.tgz", - "integrity": "sha512-3AungXC4I8kKsS9PuS4JH2nc+0bVY/mjgrephHTIi8fpEeGsTHBUJeosp0Wc1myYMElmD0B3Oc4XL/HVJ4PV2g==" + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.13.2.tgz", + "integrity": "sha512-lHe62zvbTB5eEABUVi/AwVh0ZKY9rMMDhmm+eeyuuUQbQ3+J+fONVQOZyj+DdrvD4BY33uYniyRJ4UJIaSKAfw==" }, "babel-loader": { "version": "8.3.0", @@ -1649,13 +1607,13 @@ } }, "babel-plugin-polyfill-corejs3": { - "version": "0.10.4", - "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.4.tgz", - "integrity": "sha512-25J6I8NGfa5YkCDogHRID3fVCadIR8/pGl1/spvCkzb6lVn6SR3ojpx9nOn9iEBcUsjY24AmdKm5khcfKdylcg==", + "version": "0.10.6", + "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.10.6.tgz", + "integrity": "sha512-b37+KR2i/khY5sKmWNVQAnitvquQbNdWy6lJdsr0kmquCKEEUgMKK4SboVM3HtfnZilfjr4MMQ7vY58FVWDtIA==", "dev": true, "requires": { - "@babel/helper-define-polyfill-provider": "^0.6.1", - "core-js-compat": "^3.36.1" + "@babel/helper-define-polyfill-provider": "^0.6.2", + "core-js-compat": "^3.38.0" } }, "babel-plugin-polyfill-regenerator": { @@ -1915,15 +1873,15 @@ } }, "browserslist": { - "version": "4.23.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.1.tgz", - "integrity": "sha512-TUfofFo/KsK/bWZ9TWQ5O26tsWW4Uhmt8IYklbnUa70udB6P2wA7w7o4PY4muaEPBQaAX+CEnmmIA41NVHtPVw==", + "version": "4.23.3", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.3.tgz", + "integrity": "sha512-btwCFJVjI4YWDNfau8RhZ+B1Q/VLoUITrm3RlP6y1tYGWIOa+InuYiRGXUBXo8nA1qKmHMyLB/iVQg5TT4eFoA==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30001629", - "electron-to-chromium": "^1.4.796", - "node-releases": "^2.0.14", - "update-browserslist-db": "^1.0.16" + "caniuse-lite": "^1.0.30001646", + "electron-to-chromium": "^1.5.4", + "node-releases": "^2.0.18", + "update-browserslist-db": "^1.1.0" } }, "buffer": { @@ -1980,9 +1938,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001636", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001636.tgz", - "integrity": "sha512-bMg2vmr8XBsbL6Lr0UHXy/21m84FTxDLWn2FSqMd5PrlbMxwJlQnC2YWYxVgp66PZE+BBNF2jYQUBKCo1FDeZg==", + "version": "1.0.30001655", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001655.tgz", + "integrity": "sha512-jRGVy3iSGO5Uutn2owlb5gR6qsGngTw9ZTb4ali9f3glshcNmJ2noam4Mo9zia5P9Dk3jNNydy7vQjuE5dQmfg==", "dev": true }, "caseless": { @@ -1991,9 +1949,9 @@ "integrity": "sha512-4tYFyifaFfGacoiObjJegolkwSU4xQNGbVgUiNYVUxbQ2x2lUsFvY4hVgVzGiIe6WLOPqycWXA40l+PWsxthUw==" }, "chai": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.4.1.tgz", - "integrity": "sha512-13sOfMv2+DWduEU+/xbun3LScLoqN17nBeTLUsmDfKdoiC1fr0n9PU4guu4AhRcOVFk/sW8LyZWHuhWtQZiF+g==", + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.5.0.tgz", + "integrity": "sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==", "dev": true, "requires": { "assertion-error": "^1.1.0", @@ -2002,7 +1960,7 @@ "get-func-name": "^2.0.2", "loupe": "^2.3.6", "pathval": "^1.1.1", - "type-detect": "^4.0.8" + "type-detect": "^4.1.0" } }, "chalk": { @@ -2183,12 +2141,12 @@ "dev": true }, "core-js-compat": { - "version": "3.37.1", - "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", - "integrity": "sha512-9TNiImhKvQqSUkOvk/mMRZzOANTiEVC7WaBNhHcKM7x+/5E1l5NvsysR19zuDQScE8k+kfQXWRN3AtS/eOSHpg==", + "version": "3.38.1", + "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.38.1.tgz", + "integrity": "sha512-JRH6gfXxGmrzF3tZ57lFx97YARxCXPaMzPo6jELZhv88pBH5VXpQ+y0znKGlFnzuaihqhLbefxSJxWJMPtfDzw==", "dev": true, "requires": { - "browserslist": "^4.23.0" + "browserslist": "^4.23.3" } }, "core-util-is": { @@ -2313,9 +2271,9 @@ "dev": true }, "debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.6.tgz", + "integrity": "sha512-O/09Bd4Z1fBrU4VzkhFqVgpPzaGbw6Sm9FEkBT1A/YBXQFGuuSxa1dN2nxgxS34JmKXqYx8CZAwEVoJFImUXIg==", "dev": true, "requires": { "ms": "2.1.2" @@ -2450,15 +2408,15 @@ "dev": true }, "electron-to-chromium": { - "version": "1.4.805", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.805.tgz", - "integrity": "sha512-8W4UJwX/w9T0QSzINJckTKG6CYpAUTqsaWcWIsdud3I1FYJcMgW9QqT1/4CBff/pP/TihWh13OmiyY8neto6vw==", + "version": "1.5.13", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.13.tgz", + "integrity": "sha512-lbBcvtIJ4J6sS4tb5TLp1b4LyfCdMkwStzXPyAgVgTRAsep4bvrAGaBOP7ZJtQMNJpSQ9SqG4brWOroNaQtm7Q==", "dev": true }, "elliptic": { - "version": "6.5.5", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.5.tgz", - "integrity": "sha512-7EjbcmUm17NQFu4Pmgmq2olYMj8nwMnpcddByChSUjArp8F5DQWcIcpriwO4ZToLNAJig0yiyjswfyGNje/ixw==", + "version": "6.5.7", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", + "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", "dev": true, "requires": { "bn.js": "^4.11.9", @@ -2515,15 +2473,15 @@ } }, "engine.io-parser": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", - "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "dev": true }, "enhanced-resolve": { - "version": "5.17.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.0.tgz", - "integrity": "sha512-dwDPwZL0dmye8Txp2gzFmA6sxALaSvdRDjPH0viLcKrtlOL3tw62nWWweVD1SdILDTJrbrL6tdWVN58Wo6U3eA==", + "version": "5.17.1", + "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.17.1.tgz", + "integrity": "sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==", "dev": true, "requires": { "graceful-fs": "^4.2.4", @@ -2531,10 +2489,21 @@ } }, "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "dev": true + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.1.tgz", + "integrity": "sha512-QHuXVeZx9d+tIQAz/XztU0ZwZf2Agg9CcXcgE1rurqvdBeDBrpSwjl8/6XUqMg7tw2Y7uAdKb2sRv+bSEFqQ5A==", + "dev": true, + "requires": { + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + } + } }, "envinfo": { "version": "7.13.0", @@ -2558,9 +2527,9 @@ "dev": true }, "es-module-lexer": { - "version": "1.5.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.3.tgz", - "integrity": "sha512-i1gCgmR9dCl6Vil6UKPI/trA69s08g/syhiDK9TG0Nf1RJjjFI+AzoWW7sPufzkgYAn861skuCwJa0pIIHYxvg==", + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-1.5.4.tgz", + "integrity": "sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==", "dev": true }, "es6-promise": { @@ -2569,9 +2538,9 @@ "integrity": "sha512-oyOjMhyKMLEjOOtvkwg0G4pAzLQ9WdbbeX7WdqKzvYXu+UFgD0Zo/Brq5Q49zNmnGPPzV5rmYvrr0jz1zWx8Iw==" }, "escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true }, "escape-html": { @@ -3080,9 +3049,9 @@ "dev": true }, "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", + "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", "dev": true, "requires": { "pkg-dir": "^4.2.0", @@ -3137,12 +3106,12 @@ "dev": true }, "is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, "requires": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" } }, "is-extglob": { @@ -3380,9 +3349,9 @@ } }, "karma": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.3.tgz", - "integrity": "sha512-LuucC/RE92tJ8mlCwqEoRWXP38UMAqpnq98vktmS9SznSoUPPUJQbc91dHcxcunROvfQjdORVA/YFviH+Xci9Q==", + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", + "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", "dev": true, "requires": { "@colors/colors": "1.5.0", @@ -3464,8 +3433,8 @@ "dev": true }, "libsbgn.js": { - "version": "github:sbgn/libsbgn.js#50a24ce54eb2e987310e006af573e31d049a0e7a", - "from": "github:sbgn/libsbgn.js#develop", + "version": "github:sbgn/libsbgn.js#f7e265ae530c101ce44387a64080fc50107f01ff", + "from": "github:sbgn/libsbgn.js#master", "requires": { "n3": "0.11.1", "rdflib": "git+https://github.com/royludo/rdflib.js.git", @@ -3963,9 +3932,9 @@ } }, "node-releases": { - "version": "2.0.14", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", - "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.18.tgz", + "integrity": "sha512-d9VeXT4SJ7ZeOqGX6R5EM022wpL+eWPooLI+5UpWn2jCT1aosUQEhQP214x33Wkwx3JQMvIm+tIoVOdodFS40g==", "dev": true }, "normalize-path": { @@ -3986,9 +3955,9 @@ "dev": true }, "object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.2", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.2.tgz", + "integrity": "sha512-IRZSRuzJiynemAXPYtPe5BoI/RESNYR7TYm50MC5Mqbd3Jmw5y790sErYw3V6SryFJD64b74qQQs9wn5Bg/k3g==", "dev": true }, "object-is": { @@ -4166,9 +4135,9 @@ "integrity": "sha512-7EAHlyLHI56VEIdK57uwHdHKIaAGbnXPiw0yWbarQZOKaKpvUIgW0jWRVLiatnM+XXlSwsanIBH/hzGMJulMow==" }, "picocolors": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", - "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.0.tgz", + "integrity": "sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==" }, "picomatch": { "version": "2.3.1", @@ -4772,9 +4741,9 @@ "dev": true }, "terser": { - "version": "5.31.1", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.1.tgz", - "integrity": "sha512-37upzU1+viGvuFtBo9NPufCb9dwM0+l9hMxYyWfBA+fbwrPqNJAhbZ6W47bBFnZHKHTUBnMvi87434qq+qnxOg==", + "version": "5.31.6", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.31.6.tgz", + "integrity": "sha512-PQ4DAriWzKj+qgehQ7LK5bQqCFNMmlhjR2PFFLuqGCpuCAauxemVBWwWOxo3UIwWQx8+Pr61Df++r76wDmkQBg==", "dev": true, "requires": { "@jridgewell/source-map": "^0.3.3", @@ -4882,9 +4851,9 @@ "integrity": "sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==" }, "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", "dev": true }, "type-is": { @@ -4904,9 +4873,9 @@ "dev": true }, "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, "unicode-canonical-property-names-ecmascript": { @@ -4950,9 +4919,9 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.16.tgz", - "integrity": "sha512-KVbTxlBYlckhF5wgfyZXTWnMn7MMZjMu9XG8bPlliUOP9ThaF4QnhP8qrjrH7DRzHfSk0oQv1wToW+iA5GajEQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.0.tgz", + "integrity": "sha512-EdRAaAyk2cUE1wOf2DkEhzxqOQvFOoRJFNS6NeyJ01Gp2beMRpBAINjM2iDXE3KCuKhwnvHIQCJm6ThL2Z+HzQ==", "dev": true, "requires": { "escalade": "^3.1.2", @@ -4968,13 +4937,13 @@ } }, "url": { - "version": "0.11.3", - "resolved": "https://registry.npmjs.org/url/-/url-0.11.3.tgz", - "integrity": "sha512-6hxOLGfZASQK/cijlZnZJTq8OXAkt/3YGfQX45vvMYXpZoo8NdWZcY73K108Jf759lS1Bv/8wXnHDTSz17dSRw==", + "version": "0.11.4", + "resolved": "https://registry.npmjs.org/url/-/url-0.11.4.tgz", + "integrity": "sha512-oCwdVC7mTuWiPyjLUz/COz5TLk6wgp0RCsN+wHZ2Ekneac9w8uuV0njcbbie2ME+Vs+d6duwmYuR3HgQXs1fOg==", "dev": true, "requires": { "punycode": "^1.4.1", - "qs": "^6.11.2" + "qs": "^6.12.3" }, "dependencies": { "punycode": { @@ -4984,9 +4953,9 @@ "dev": true }, "qs": { - "version": "6.12.1", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.12.1.tgz", - "integrity": "sha512-zWmv4RSuB9r2mYQw3zxQuHWeU+42aKi1wWig/j4ele4ygELZ7PEO6MM7rim9oAQH2A5MWfsAVf/jPvTPgCbvUQ==", + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", + "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "dev": true, "requires": { "side-channel": "^1.0.6" @@ -5053,9 +5022,9 @@ "dev": true }, "watchpack": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", - "integrity": "sha512-8wrBCMtVhqcXP2Sup1ctSkga6uc2Bx0IIvKyT7yTFier5AXHooSI+QyQQAtTb7+E0IUCCKyTFmXqdqgum2XWGg==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.2.tgz", + "integrity": "sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==", "dev": true, "requires": { "glob-to-regexp": "^0.4.1", @@ -5063,12 +5032,11 @@ } }, "webpack": { - "version": "5.92.0", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.92.0.tgz", - "integrity": "sha512-Bsw2X39MYIgxouNATyVpCNVWBCuUwDgWtN78g6lSdPJRLaQ/PUVm/oXcaRAyY/sMFoKFQrsPeqvTizWtq7QPCA==", + "version": "5.94.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.94.0.tgz", + "integrity": "sha512-KcsGn50VT+06JH/iunZJedYGUJS5FGjow8wb9c0v5n1Om8O1g4L6LjtfxwlXIATopoQu+vOXXa7gYisWxCoPyg==", "dev": true, "requires": { - "@types/eslint-scope": "^3.7.3", "@types/estree": "^1.0.5", "@webassemblyjs/ast": "^1.12.1", "@webassemblyjs/wasm-edit": "^1.12.1", @@ -5077,7 +5045,7 @@ "acorn-import-attributes": "^1.9.5", "browserslist": "^4.21.10", "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.17.0", + "enhanced-resolve": "^5.17.1", "es-module-lexer": "^1.2.1", "eslint-scope": "5.1.1", "events": "^3.2.0", diff --git a/package.json b/package.json index 3219d97..c74fedf 100644 --- a/package.json +++ b/package.json @@ -18,14 +18,14 @@ }, "homepage": "https://github.com/iVis-at-Bilkent/sbgnviz.js/", "peerDependencies": { - "cytoscape": "iVis-at-Bilkent/cytoscape.js#unstable", + "cytoscape": "iVis-at-Bilkent/cytoscape.js#master", "file-saver": "^2.0.2", "jquery": "^3.3.1", "tippy.js": "^3.4.0" }, "dependencies": { "@babel/helpers": "^7.22.6", - "libsbgn.js": "github:sbgn/libsbgn.js#develop", + "libsbgn.js": "github:sbgn/libsbgn.js#master", "libsbmljs_stable": "^5.18.0-beta1", "mime-types": "^2.1.35", "pretty-data": "^0.40.0", diff --git a/sbgnviz.js b/sbgnviz.js index 6355203..a237c45 100644 --- a/sbgnviz.js +++ b/sbgnviz.js @@ -35,7 +35,7 @@ eval("(function () {\n var sbgnviz = function sbgnviz(_options) {\n var libs \*********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { -eval("var classes = __webpack_require__(/*! ../utilities/classes */ \"./src/utilities/classes.js\");\nvar libs = (__webpack_require__(/*! ../utilities/lib-utilities */ \"./src/utilities/lib-utilities.js\").getLibs)();\nvar jQuery = $ = libs.jQuery;\nvar cytoscape = libs.cytoscape;\nvar Tippy = libs.tippy;\nmodule.exports = function () {\n var elementUtilities, graphUtilities, mainUtilities, undoRedoActionFunctions, optionUtilities, experimentalDataOverlay;\n var refreshPaddings, options, cy;\n var sbgnCyInstance = function sbgnCyInstance(param) {\n elementUtilities = param.elementUtilities;\n graphUtilities = param.graphUtilities;\n experimentalDataOverlay = param.experimentalDataOverlay;\n mainUtilities = param.mainUtilities;\n undoRedoActionFunctions = param.undoRedoActionFunctions;\n refreshPaddings = graphUtilities.refreshPaddings.bind(graphUtilities);\n optionUtilities = param.optionUtilities;\n options = optionUtilities.getOptions();\n\n // cy = param.sbgnCyInstance.getCy();\n\n /*\n * Returns the coordinates of the point located on the given angle on the circle with the given centeral coordinates and radius.\n */\n var getPointOnCircle = function getPointOnCircle(centerX, centerY, radius, angleInDegree) {\n var angleInRadian = angleInDegree * (Math.PI / 180); // Convert degree to radian\n return {\n x: radius * Math.cos(angleInRadian) + centerX,\n y: -1 * radius * Math.sin(angleInRadian) + centerY // We multiply with -1 here because JS y coordinate sign is the oposite of the Mathamatical coordinates system\n };\n };\n\n /*\n * Generates a polygon string approximating a circle with given center, radius, start, end angles and number of points to represent the circle\n */\n var generateCircleString = function generateCircleString(centerX, centerY, radius, angleFrom, angleTo, numOfPoints) {\n var circleStr = \"\";\n var stepSize = (angleTo - angleFrom) / numOfPoints; // We will increment the current angle by step size in each iteration\n var currentAngle = angleFrom; // current angle will be updated in each iteration\n\n for (var i = 0; i < numOfPoints; i++) {\n var point = getPointOnCircle(centerX, centerY, radius, currentAngle);\n currentAngle += stepSize;\n circleStr += point.x + \" \" + point.y + \" \";\n }\n return circleStr;\n };\n\n /*\n * Generates a string representing processes/logical operators with ports.\n * lineHW: Half width of line through the circle to the intersection point\n * shapeHW: Half width of the shape discluding the ports (It is radius for the circular shapes)\n * type: Type of the shape discluding the ports. Options are 'circle', 'rectangle'\n * orientation: Orientation of the ports Options are 'horizontal', 'vertical'\n */\n\n var generateShapeWithPortString = function generateShapeWithPortString(lineHW, shapeHW, type, orientation) {\n var polygonStr;\n var numOfPoints = 30; // Number of points that both halves of circle will have\n if (orientation === 'horizontal') {\n var abovePoints, belowPoints;\n if (type === 'circle') {\n abovePoints = generateCircleString(0, 0, shapeHW, 180, 0, numOfPoints);\n belowPoints = generateCircleString(0, 0, shapeHW, 360, 180, numOfPoints);\n } else if (type === 'rectangle') {\n abovePoints = '-' + shapeHW + ' -' + shapeHW + ' ' + shapeHW + ' -' + shapeHW + ' ';\n belowPoints = shapeHW + ' ' + shapeHW + ' -' + shapeHW + ' ' + shapeHW + ' ';\n }\n polygonStr = \"-1 -\" + lineHW + \" -\" + shapeHW + \" -\" + lineHW + \" \";\n polygonStr += abovePoints;\n polygonStr += shapeHW + \" -\" + lineHW + \" 1 -\" + lineHW + \" 1 \" + lineHW + \" \" + shapeHW + \" \" + lineHW + \" \";\n polygonStr += belowPoints;\n polygonStr += \"-\" + shapeHW + \" \" + lineHW + \" -1 \" + lineHW;\n } else {\n var leftPoints, rightPoints;\n if (type === 'circle') {\n leftPoints = generateCircleString(0, 0, shapeHW, 90, 270, numOfPoints);\n rightPoints = generateCircleString(0, 0, shapeHW, -90, 90, numOfPoints);\n } else if (type === 'rectangle') {\n leftPoints = '-' + shapeHW + ' -' + shapeHW + ' -' + shapeHW + ' ' + shapeHW + ' ';\n rightPoints = shapeHW + ' ' + shapeHW + ' ' + shapeHW + ' -' + shapeHW + ' ';\n }\n polygonStr = \"-\" + lineHW + \" -\" + 1 + \" -\" + lineHW + \" -\" + shapeHW + \" \";\n polygonStr += leftPoints;\n polygonStr += \"-\" + lineHW + \" \" + shapeHW + \" -\" + lineHW + \" 1 \" + lineHW + \" 1 \" + lineHW + \" \" + shapeHW + \" \";\n polygonStr += rightPoints;\n polygonStr += lineHW + \" -\" + shapeHW + \" \" + lineHW + \" -1\";\n }\n return polygonStr;\n };\n\n // Note that in ChiSE this function is in a seperate file but in the viewer it has just 2 methods and so it is located in this file\n function registerUndoRedoActions() {\n // create or get the undo-redo instance\n var ur = cy.undoRedo();\n\n // register general actions\n // register add remove actions\n ur.action(\"deleteElesSimple\", undoRedoActionFunctions.deleteElesSimple, undoRedoActionFunctions.restoreEles);\n ur.action(\"deleteNodesSmart\", undoRedoActionFunctions.deleteNodesSmart, undoRedoActionFunctions.restoreEles);\n ur.action(\"setPortsOrdering\", undoRedoActionFunctions.setPortsOrdering, undoRedoActionFunctions.setPortsOrdering);\n\n //experimental data ovarlay\n ur.action(\"removeAll\", undoRedoActionFunctions.removeAll, undoRedoActionFunctions.restoreAll);\n ur.action(\"hideExperiment\", undoRedoActionFunctions.hideExp, undoRedoActionFunctions.unhideExp);\n ur.action(\"unhideExperiment\", undoRedoActionFunctions.unhideExp, undoRedoActionFunctions.hideExp);\n ur.action(\"hideFile\", undoRedoActionFunctions.hideFile, undoRedoActionFunctions.hideFileUndo);\n ur.action(\"unhideFile\", undoRedoActionFunctions.unhideFile, undoRedoActionFunctions.unhideFileUndo);\n ur.action(\"removeExperiment\", undoRedoActionFunctions.removeExp, undoRedoActionFunctions.addExp);\n ur.action(\"removeFile\", undoRedoActionFunctions.removeFile, undoRedoActionFunctions.addFile);\n ur.action(\"expButtonChange\", undoRedoActionFunctions.expButtonChange, undoRedoActionFunctions.expButtonChange);\n ur.action(\"fileButtonChangeHide\", undoRedoActionFunctions.fileButtonChangeHide, undoRedoActionFunctions.fileButtonChangeUnHide);\n ur.action(\"fileButtonChangeUnHide\", undoRedoActionFunctions.fileButtonChangeUnHide, undoRedoActionFunctions.fileButtonChangeHide);\n\n //ur.action(\"expButtonUnhide\", undoRedoActionFunctions.changeExpButton2, undoRedoActionFunctions.expButtonHide);\n //ur.action(\"parseData\", undoRedoActionFunctions.parseData, undoRedoActionFunctions.removeFile);\n }\n function showTooltip(event) {\n var node = event.target || event.cyTarget;\n var canHaveTooltip = function canHaveTooltip(node) {\n return elementUtilities.isSIFNode(node) || node.data(\"tooltip\") !== null;\n };\n if (!canHaveTooltip(node)) {\n return;\n }\n var ref; // used only for positioning\n var pos = event.position || event.cyPosition;\n var pan = cy.pan();\n var zoom = cy.zoom();\n var infobox = classes.AuxiliaryUnit.checkPoint(pos.x, pos.y, node, 0);\n var tooltipContent;\n if (!infobox) {\n tooltipContent = node.data('tooltip');\n if (tooltipContent == undefined || tooltipContent == '') {\n return;\n }\n ref = node.popperRef();\n } else {\n tooltipContent = infobox['tooltip'];\n if (tooltipContent == undefined) {\n return;\n }\n var modelPos = classes.AuxiliaryUnit.getAbsoluteCoord(infobox, cy);\n var modelW = infobox.bbox.w;\n var modelH = infobox.bbox.h;\n var renderedW = modelW * zoom;\n var renderedH = modelH * zoom;\n modelPos.x -= modelW / 2;\n modelPos.y -= modelH / 2;\n var renderedPos = elementUtilities.convertToRenderedPosition(modelPos, pan, zoom);\n var renderedDims = {\n w: renderedW,\n h: renderedH\n };\n ref = node.popperRef({\n renderedPosition: function renderedPosition() {\n return renderedPos;\n },\n renderedDimensions: function renderedDimensions() {\n return renderedDims;\n }\n });\n }\n var placement = infobox ? infobox.anchorSide : 'bottom';\n var destroyTippy;\n var tippy = Tippy.one(ref, {\n content: function () {\n var content = document.createElement('div');\n content.style['font-size'] = 12 * zoom + 'px';\n content.innerHTML = tooltipContent;\n return content;\n }(),\n trigger: 'manual',\n hideOnClick: true,\n arrow: true,\n placement: placement,\n onHidden: function onHidden() {\n cy.off('pan zoom', destroyTippy);\n node.off('position', destroyTippy);\n cy.off('tapdrag', destroyTippy);\n }\n });\n destroyTippy = function destroyTippy() {\n tippy.destroy();\n };\n cy.on('pan zoom', destroyTippy);\n node.on('position', destroyTippy);\n cy.on('tapdrag', destroyTippy);\n setTimeout(function () {\n return tippy.show();\n }, 250);\n }\n function bindCyEvents() {\n cy.on('tapdragover', 'node', function (event) {\n var waitDuration = 200;\n var nodeTapdragout;\n var currEvent = event;\n var node = currEvent.target || currEvent.cyTarget;\n var inQueue = true;\n var clearNodeEvent = function clearNodeEvent() {\n if (nodeTapdragout) {\n node.off('tapdragout', nodeTapdragout);\n }\n if (nodeTapdrag) {\n node.off('tapdrag', nodeTapdrag);\n }\n };\n var getShowTooltipAsycn = function getShowTooltipAsycn() {\n return setTimeout(function () {\n showTooltip(currEvent);\n inQueue = false;\n }, waitDuration);\n };\n var showTooltipAsycn = getShowTooltipAsycn();\n node.on('tapdragout', nodeTapdragout = function nodeTapdragout(e) {\n clearTimeout(showTooltipAsycn);\n clearNodeEvent();\n });\n node.on('tapdrag', nodeTapdrag = function nodeTapdrag(e) {\n currEvent = e;\n if (!inQueue) {\n showTooltipAsycn = getShowTooltipAsycn();\n inQueue = true;\n }\n });\n });\n cy.on('tapend', 'node', function (event) {\n cy.style().update();\n });\n cy.on(\"expandcollapse.beforecollapse\", \"node\", function (event) {\n var node = this;\n //The children info of complex nodes should be shown when they are collapsed\n if (node._private.data[\"class\"].startsWith(\"complex\")) {\n //The node is being collapsed store infolabel to use it later\n var infoLabel = elementUtilities.getInfoLabel(node);\n node._private.data.infoLabel = infoLabel;\n }\n });\n cy.on(\"expandcollapse.aftercollapse\", \"node\", function (event) {\n var node = this;\n // The width and height of just collapsed nodes should be 36, but they are supposed to be resizable. Therefore, we\n // set their data('bbox') accordingly. We do not store their existing bbox.w and bbox.h because they have no significance for compounds (for now).\n cy.startBatch();\n var bbox = node.data('bbox');\n bbox.w = 36;\n bbox.h = 36;\n node.data('bbox', bbox);\n cy.endBatch();\n });\n cy.on(\"expandcollapse.beforeexpand\", \"node\", function (event) {\n var node = this;\n node.removeData(\"infoLabel\");\n });\n cy.on(\"expandcollapse.afterexpand\", \"node\", function (event) {\n var node = this;\n cy.nodes().updateCompoundBounds();\n if (!options.recalculateOnComplexityManagement) {\n cy.style().update();\n }\n //Don't show children info when the complex node is expanded\n if (node._private.data[\"class\"].startsWith(\"complex\")) {\n node.removeStyle('content');\n }\n });\n cy.on(\"beforeDo\", function (e, name, args) {\n if (name == \"layout\" || name == \"collapse\" || name == \"expand\" || name == \"collapseRecursively\" || name == \"expandRecursively\" || name == \"batch\" && (args.length > 0 && args[0]['name'] == \"thinBorder\" || args.length > 0 && args[0]['name'] == \"thickenBorder\")) {\n var parents = cy.elements(\":parent\").jsons(); // parent nodes\n var simples = cy.elements().not(\":parent\").jsons(); // simple nodes and edges\n var allElements = parents.concat(simples); // all elements\n args.allElements = allElements;\n var ports = {};\n cy.nodes().forEach(function (node) {\n if (elementUtilities.canHavePorts(node)) {\n ports[node.id()] = JSON.parse(JSON.stringify(node.data(\"ports\")));\n }\n });\n args.ports = ports;\n args.viewport = {\n pan: JSON.parse(JSON.stringify(cy.pan())),\n zoom: cy.zoom()\n };\n if (name == \"layout\") mainUtilities.beforePerformLayout();\n }\n });\n cy.on(\"beforeRedo\", function (e, name, args) {\n if (name == \"layout\" || name == \"collapse\" || name == \"expand\" || name == \"collapseRecursively\" || name == \"expandRecursively\" || name == \"batch\" && (args.length > 0 && args[0]['name'] == \"thinBorder\" || args.length > 0 && args[0]['name'] == \"thickenBorder\")) {\n var parents = cy.elements(\":parent\").jsons(); // parent nodes\n var simples = cy.elements().not(\":parent\").jsons(); // simple nodes and edges\n var allElements = parents.concat(simples); // all elements\n args.allElements2 = allElements;\n var ports = {};\n cy.nodes().forEach(function (node) {\n if (elementUtilities.canHavePorts(node)) {\n ports[node.id()] = JSON.parse(JSON.stringify(node.data(\"ports\")));\n }\n });\n args.ports2 = ports;\n args.viewport2 = {\n pan: JSON.parse(JSON.stringify(cy.pan())),\n zoom: cy.zoom()\n };\n }\n });\n cy.on(\"afterDo\", function (e, name, args, res) {\n if (name == \"layout\" || name == \"collapse\" || name == \"expand\" || name == \"collapseRecursively\" || name == \"expandRecursively\" || name == \"batch\" && (args.length > 0 && args[0]['name'] == \"thinBorder\" || args.length > 0 && args[0]['name'] == \"thickenBorder\")) {\n res.allElements = args.allElements;\n res.ports = args.ports;\n res.viewport = args.viewport;\n }\n });\n cy.on(\"afterRedo\", function (e, name, args, res) {\n if (name == \"layout\" || name == \"collapse\" || name == \"expand\" || name == \"collapseRecursively\" || name == \"expandRecursively\" || name == \"batch\" && (args.length > 0 && args[0]['name'] == \"thinBorder\" || args.length > 0 && args[0]['name'] == \"thickenBorder\")) {\n res.allElements = args.allElements2;\n res.ports = args.ports2;\n res.viewport = args.viewport2;\n cy.json({\n flatEles: true,\n elements: args.allElements\n });\n cy.batch(function () {\n cy.nodes().forEach(function (node) {\n if (elementUtilities.canHavePorts(node)) {\n node.data(\"ports\", args.ports[node.id()]);\n }\n });\n });\n cy.pan(args.viewport[\"pan\"]);\n cy.zoom(args.viewport[\"zoom\"]);\n }\n });\n cy.on(\"beforeUndo\", function (e, name, args) {\n if (name == \"layout\" || name == \"collapse\" || name == \"expand\" || name == \"collapseRecursively\" || name == \"expandRecursively\" || name == \"batch\" && (args.length > 0 && args[0]['name'] == \"thinBorder\" || args.length > 0 && args[0]['name'] == \"thickenBorder\")) {\n var parents = cy.elements(\":parent\").jsons(); // parent nodes\n var simples = cy.elements().not(\":parent\").jsons(); // simple nodes and edges\n var allElements = parents.concat(simples); // all elements\n args.allElements2 = allElements;\n var ports = {};\n cy.nodes().forEach(function (node) {\n if (elementUtilities.canHavePorts(node)) {\n ports[node.id()] = JSON.parse(JSON.stringify(node.data(\"ports\")));\n }\n });\n args.ports2 = ports;\n args.viewport2 = {\n pan: JSON.parse(JSON.stringify(cy.pan())),\n zoom: cy.zoom()\n };\n }\n });\n cy.on(\"afterUndo\", function (e, name, args, res) {\n if (name == \"layout\" || name == \"collapse\" || name == \"expand\" || name == \"collapseRecursively\" || name == \"expandRecursively\" || name == \"batch\" && (args.length > 0 && args[0]['name'] == \"thinBorder\" || args.length > 0 && args[0]['name'] == \"thickenBorder\")) {\n res.allElements = args.allElements2;\n res.ports = args.ports2;\n res.viewport = args.viewport2;\n cy.json({\n flatEles: true,\n elements: args.allElements\n });\n cy.batch(function () {\n cy.nodes().forEach(function (node) {\n if (elementUtilities.canHavePorts(node)) {\n node.data(\"ports\", args.ports[node.id()]);\n }\n });\n });\n cy.pan(args.viewport[\"pan\"]);\n cy.zoom(args.viewport[\"zoom\"]);\n }\n });\n cy.on('layoutstop', function (event) {\n /*\n * 'preset' layout is called to give the initial positions of nodes by sbgnviz.\n * Seems like 'grid' layout is called by Cytoscape.js core in loading graphs.\n * If the layout is not one of these (normally it is supposed to be 'cose-bilkent')\n * and ports are enabled call 'elementUtilities.changePortsOrientationAfterLayout()'\n */\n if (event.layout.options.name !== 'preset' && event.layout.options.name !== 'grid') {\n // 3000 nodes/edges check is for performance improvement\n if (graphUtilities.portsEnabled === true && !(cy.nodes().length > 3000 || cy.edges().length > 3000)) {\n elementUtilities.changePortsOrientationAfterLayout();\n }\n }\n });\n $(document).on('updateGraphEnd', function (event, _cy, isLayoutRequired, callback) {\n // if the event is not triggered for this cy instance return directly\n if (_cy != cy) {\n return;\n }\n var setCompoundInfoboxes = function setCompoundInfoboxes(node, isLayoutRequired, cyInstance) {\n if (cyInstance == undefined) return;\n if (node.data().infoboxCalculated) {\n return;\n } else if (node.isParent()) {\n node.children().forEach(function (childNode) {\n setCompoundInfoboxes(childNode, isLayoutRequired, cyInstance);\n });\n }\n node.data(\"infoboxCalculated\", true);\n node.data('auxunitlayouts', {});\n // for each statesandinfos\n\n var correctInfoBoxCoord = true;\n for (var i = 0; i < node.data('statesandinfos').length; i++) {\n var statesandinfos = node.data('statesandinfos')[i];\n var bbox = statesandinfos.bbox;\n var infoBoxOnNode = classes.AuxiliaryUnit.setAnchorSide(statesandinfos, node);\n correctInfoBoxCoord = correctInfoBoxCoord && infoBoxOnNode;\n }\n for (var i = 0; i < node.data('statesandinfos').length; i++) {\n var statesandinfos = node.data('statesandinfos')[i];\n var bbox = statesandinfos.bbox;\n if ((isLayoutRequired === undefined || !isLayoutRequired) && correctInfoBoxCoord) {\n var cordResult = classes.AuxiliaryUnit.convertToRelativeCoord(statesandinfos, bbox.x + bbox.w / 2, bbox.y + bbox.h / 2, cyInstance, node);\n statesandinfos.bbox.x = cordResult.x;\n statesandinfos.bbox.y = cordResult.y;\n statesandinfos.isDisplayed = true;\n var location = statesandinfos.anchorSide; // top bottom right left\n var layouts = node.data('auxunitlayouts');\n if (!layouts[location]) {\n // layout doesn't exist yet for this location\n layouts[location] = classes.AuxUnitLayout.construct(node, location);\n }\n // populate the layout of this side\n classes.AuxUnitLayout.addAuxUnit(layouts[location], cyInstance, statesandinfos, undefined, true); //positions are precomputed\n } else {\n if (!node.data('auxunitlayouts')) {\n // ensure minimal initialization\n node.data('auxunitlayouts', {});\n }\n var location = classes.AuxUnitLayout.selectNextAvailable(node, cy);\n if (!node.data('auxunitlayouts')[location]) {\n node.data('auxunitlayouts')[location] = classes.AuxUnitLayout.construct(node, location);\n }\n var layout = node.data('auxunitlayouts')[location];\n statesandinfos.anchorSide = location;\n switch (location) {\n case \"top\":\n statesandinfos.bbox.y = 0;\n break;\n case \"bottom\":\n statesandinfos.bbox.y = 100;\n break;\n case \"left\":\n statesandinfos.bbox.x = 0;\n break;\n case \"right\":\n statesandinfos.bbox.x = 100;\n break;\n }\n classes.AuxUnitLayout.addAuxUnit(layout, cyInstance, statesandinfos);\n }\n }\n if (isLayoutRequired === true) {\n var locations = classes.AuxUnitLayout.checkFit(node, cy);\n if (locations !== undefined && locations.length > 0) {\n classes.AuxUnitLayout.fitUnits(node, cy, locations);\n }\n }\n };\n // list all entitytypes andstore them in the global scratch\n // only stateful EPN (complex, macromolecule or nucleic acid) are concerned\n\n // assign statesandinfos to their layout\n cy.style().update();\n // cy.startBatch();\n\n // this check is for performance improvement\n if (!(cy.nodes().length > 3000 || cy.edges().length > 3000)) {\n cy.nodes().forEach(function (node) {\n setCompoundInfoboxes(node, isLayoutRequired, cy);\n });\n }\n if (callback) {\n callback();\n }\n\n //cy.endBatch();\n });\n }\n var selectionColor = '#89898a';\n var sbgnStyleSheet = cytoscape.stylesheet().selector(\"node\").css({\n 'text-valign': 'center',\n 'text-halign': 'center',\n 'text-opacity': 1,\n 'opacity': 1,\n 'padding': 0\n }).selector(\"node[class]\").css({\n 'shape': function shape(ele) {\n return elementUtilities.getCyShape(ele);\n },\n 'content': function content(ele) {\n return elementUtilities.getElementContent(ele);\n },\n 'font-size': function fontSize(ele) {\n // If node labels are expected to be adjusted automatically or element cannot have label\n // or ele.data('font-size') is not defined return elementUtilities.getLabelTextSize()\n // else return ele.data('font-size')\n var opt = options.adjustNodeLabelFontSizeAutomatically;\n var adjust = typeof opt === 'function' ? opt() : opt;\n if (!adjust && ele.data('font-size') != undefined) {\n return ele.data('font-size');\n }\n return elementUtilities.getLabelTextSize(ele);\n }\n }).selector(\"node[class][font-family]\").style({\n 'font-family': function fontFamily(ele) {\n return ele.data('font-family');\n }\n }).selector(\"node[class][font-style]\").style({\n 'font-style': function fontStyle(ele) {\n return ele.data('font-style');\n }\n }).selector(\"node[class][font-weight]\").style({\n 'font-weight': function fontWeight(ele) {\n return ele.data('font-weight');\n }\n }).selector(\"node[class][color]\").style({\n 'color': function color(ele) {\n return ele.data('color');\n }\n }).selector(\"node[class][background-color]\").style({\n 'background-color': function backgroundColor(ele) {\n return ele.data('background-color');\n }\n }).selector(\"node[class][background-opacity]\").style({\n 'background-opacity': function backgroundOpacity(ele) {\n return ele.data('background-opacity');\n }\n }).selector(\"node[class][border-width]\").style({\n 'border-width': function borderWidth(ele) {\n return ele.data('border-width');\n }\n }).selector(\"node[class][border-color]\").style({\n 'border-color': function borderColor(ele) {\n return ele.data('border-color');\n }\n }).selector(\"node[class][text-wrap]\").style({\n 'text-wrap': function textWrap(ele) {\n var opt = options.fitLabelsToNodes;\n var isFit = typeof opt === 'function' ? opt() : opt;\n if (isFit) {\n return 'ellipsis';\n }\n return ele.data('text-wrap');\n }\n }).selector(\"node\").style({\n 'text-max-width': function textMaxWidth(ele) {\n var opt = options.fitLabelsToNodes;\n var isFit = typeof opt === 'function' ? opt() : opt;\n if (isFit) {\n return ele.width();\n }\n return '1000px';\n }\n }).selector(\"edge[class][line-color]\").style({\n 'line-color': function lineColor(ele) {\n return ele.data('line-color');\n },\n 'source-arrow-color': function sourceArrowColor(ele) {\n return ele.data('line-color');\n },\n 'target-arrow-color': function targetArrowColor(ele) {\n return ele.data('line-color');\n }\n }).selector(\"edge[class][width]\").style({\n 'width': function width(ele) {\n return ele.data('width');\n }\n }).selector(\"node[class='association'],[class='dissociation'],[class='and'],[class='or'],[class='not'],[class='process'],[class='omitted process'],[class='uncertain process'],[class='truncated process'],[class='unknown logical operator']\").css({\n 'shape-polygon-points': function shapePolygonPoints(ele) {\n if (graphUtilities.portsEnabled === true && ele.data('ports').length === 2) {\n // We assume that the ports of the edge are symetric according to the node center so just checking one port is enough for us\n var port = ele.data('ports')[0];\n // If the ports are located above/below of the node then the orientation is 'vertical' else it is 'horizontal'\n var orientation = port.x === 0 ? 'vertical' : 'horizontal';\n // The half width of the actual shape discluding the ports\n var shapeHW = orientation === 'vertical' ? 50 / Math.abs(port.y) : 50 / Math.abs(port.x);\n // Get the class of the node\n var _class = ele.data('class');\n // If class is one of process, omitted process or uncertain process then the type of actual shape is 'rectangle' else it is 'circle'\n var type = _class.endsWith('process') ? 'rectangle' : 'circle';\n\n // Generate a polygon string with above parameters and return it\n return generateShapeWithPortString(0.01, shapeHW, type, orientation);\n }\n\n // This element is not expected to have a poygonial shape (Because it does not have 2 ports) just return a trivial string here not to have a run time bug\n return '-1 -1 1 1 1 0';\n }\n }).selector(\"node[class='perturbing agent']\").css({\n 'shape-polygon-points': '-1, -1, -0.5, 0, -1, 1, 1, 1, 0.5, 0, 1, -1'\n }).selector(\"node[class='tag']\").css({\n 'shape-polygon-points': '-1, -1, 0.25, -1, 1, 0, 0.25, 1, -1, 1'\n }).selector(\"node:parent[class^='complex']\") // start with complex\n .css({\n 'text-valign': 'bottom',\n 'text-halign': 'center',\n 'text-margin-y': elementUtilities.getComplexMargin,\n 'padding': elementUtilities.getComplexPadding,\n 'compound-sizing-wrt-labels': 'exclude'\n }).selector(\"node[class='compartment']\").css({\n 'text-valign': 'bottom',\n 'text-halign': 'center',\n 'text-margin-y': -1 * options.extraCompartmentPadding,\n 'compound-sizing-wrt-labels': 'exclude'\n }).selector(\"node:parent[class='compartment']\").css({\n 'padding': function padding() {\n return graphUtilities.getCompoundPaddings() + options.extraCompartmentPadding;\n }\n }).selector(\"node[class='submap']\").css({\n 'text-valign': 'bottom',\n 'text-halign': 'center',\n 'text-margin-y': -1 * options.extraCompartmentPadding,\n 'compound-sizing-wrt-labels': 'exclude'\n }).selector(\"node:parent[class='submap'],[class='topology group']\").css({\n 'padding': function padding() {\n return graphUtilities.getCompoundPaddings() + options.extraCompartmentPadding;\n }\n }).selector(\"node:childless[bbox]\").css({\n 'width': 'data(bbox.w)',\n 'height': 'data(bbox.h)'\n }).selector(\"node:parent[minHeight]\").css({\n 'min-height': function minHeight(ele) {\n if (graphUtilities.compoundSizesConsidered) {\n return ele.data('minHeight');\n }\n return 0;\n }\n }).selector(\"node:parent[minHeightBiasTop]\").css({\n 'min-height-bias-top': function minHeightBiasTop(ele) {\n var min = parseFloat(ele.data('minHeightBiasTop'));\n return (min >= 0 ? min : 100) + '%';\n }\n }).selector(\"node:parent[minHeightBiasBottom]\").css({\n 'min-height-bias-bottom': function minHeightBiasBottom(ele) {\n var min = parseFloat(ele.data('minHeightBiasBottom'));\n return (min >= 0 ? min : 100) + '%';\n }\n }).selector(\"node:parent[minWidth]\").css({\n 'min-width': function minWidth(ele) {\n if (graphUtilities.compoundSizesConsidered) {\n return ele.data('minWidth');\n }\n return 0;\n }\n }).selector(\"node:parent[minWidthBiasLeft]\").css({\n 'min-width-bias-left': function minWidthBiasLeft(ele) {\n var min = parseFloat(ele.data('minWidthBiasLeft'));\n return (min >= 0 ? min : 100) + '%';\n }\n }).selector(\"node:parent[minWidthBiasRight]\").css({\n 'min-width-bias-right': function minWidthBiasRight(ele) {\n var min = parseFloat(ele.data('minWidthBiasRight'));\n return (min >= 0 ? min : 100) + '%';\n }\n }).selector(\"node.cy-expand-collapse-collapsed-node\").css({\n 'border-style': 'dashed'\n })\n // .selector(\"node:selected\")\n // .css({\n // 'border-color': selectionColor,\n // 'target-arrow-color': '#000',\n // \t'text-outline-color': '#000',\n // \t'border-width': function(ele){\n // \t\treturn Math.max(parseFloat(ele.data('border-width')) + 2, 3);\n // \t }\n // })\n .selector(\"node:active\").css({\n 'background-opacity': 0.7,\n 'overlay-color': selectionColor,\n 'overlay-padding': '14'\n }).selector(\"edge\").css({\n 'curve-style': 'bezier',\n 'target-arrow-fill': function targetArrowFill(ele) {\n return elementUtilities.getCyTargetArrowFill(ele);\n },\n 'source-arrow-fill': 'hollow',\n 'text-border-color': function textBorderColor(ele) {\n if (ele.selected()) {\n return selectionColor;\n }\n return ele.css('line-color');\n },\n 'color': function color(ele) {\n if (ele.selected()) {\n return selectionColor;\n }\n return ele.css('line-color');\n },\n 'arrow-scale': 1.25\n }).selector(\"edge.cy-expand-collapse-meta-edge\").css({\n 'line-color': '#C4C4C4',\n 'source-arrow-color': '#C4C4C4',\n 'target-arrow-color': '#C4C4C4'\n })\n // .selector(\"edge:selected\")\n // .css({\n // 'line-color': selectionColor,\n // 'source-arrow-color': selectionColor,\n // \t'target-arrow-color': selectionColor,\n // \t'width': function(ele){\n // \t\treturn Math.max(parseFloat(ele.data('width')) + 2, 3);\n // \t }\n // })\n .selector(\"edge:active\").css({\n 'background-opacity': 0.7,\n 'overlay-color': selectionColor,\n 'overlay-padding': '8'\n }).selector(\"edge[cardinality > 0]\").css({\n 'text-rotation': 'autorotate',\n 'text-background-shape': 'rectangle',\n 'text-border-opacity': '1',\n 'text-border-width': '1',\n 'text-background-color': 'white',\n 'text-background-opacity': '1'\n }).selector(\"edge[class='consumption'][cardinality > 0]\").css({\n 'source-label': function sourceLabel(ele) {\n return '' + ele.data('cardinality');\n },\n 'source-text-margin-y': '-10',\n 'source-text-offset': '18',\n 'font-size': '13'\n }).selector(\"edge[class='production'][cardinality > 0]\").css({\n 'target-label': function targetLabel(ele) {\n return '' + ele.data('cardinality');\n },\n 'target-text-margin-y': '-10',\n 'target-text-offset': '18',\n 'font-size': '13'\n }).selector(\"edge[class]\").css({\n 'target-arrow-shape': function targetArrowShape(ele) {\n return elementUtilities.getCyArrowShape(ele);\n },\n 'source-arrow-shape': 'none',\n 'source-endpoint': function sourceEndpoint(ele) {\n return elementUtilities.getEndPoint(ele, 'source');\n },\n 'target-endpoint': function targetEndpoint(ele) {\n return elementUtilities.getEndPoint(ele, 'target');\n },\n 'line-style': function lineStyle(ele) {\n return elementUtilities.getArrayLineStyle(ele);\n },\n 'line-dash-pattern': function lineDashPattern(ele) {\n return elementUtilities.getArrayLineDashStyle(ele);\n }\n }).selector(\"core\").css({\n 'selection-box-color': selectionColor,\n 'selection-box-opacity': '0.2',\n 'selection-box-border-color': selectionColor\n });\n var sbgnNetworkContainer = $(options.networkContainerSelector);\n\n // create and init cytoscape:\n cytoscape({\n container: sbgnNetworkContainer,\n style: sbgnStyleSheet,\n showOverlay: false,\n minZoom: 0.125,\n maxZoom: 16,\n boxSelectionEnabled: true,\n motionBlur: true,\n wheelSensitivity: 0.1,\n ready: function ready() {\n cy = this;\n // If undoable register undo/redo actions\n if (options.undoable) {\n registerUndoRedoActions();\n }\n bindCyEvents();\n }\n });\n };\n sbgnCyInstance.getCy = function () {\n return cy;\n };\n return sbgnCyInstance;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2Jnbi1leHRlbnNpb25zL3NiZ24tY3ktaW5zdGFuY2UtZmFjdG9yeS5qcyIsIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxPQUFPLEdBQUdDLG1CQUFPLENBQUMsd0RBQXNCLENBQUM7QUFDN0MsSUFBSUMsSUFBSSxHQUFHRCxtR0FBNkMsQ0FBQyxDQUFDO0FBQzFELElBQUlHLE1BQU0sR0FBR0MsQ0FBQyxHQUFHSCxJQUFJLENBQUNFLE1BQU07QUFDNUIsSUFBSUUsU0FBUyxHQUFHSixJQUFJLENBQUNJLFNBQVM7QUFDOUIsSUFBSUMsS0FBSyxHQUFHTCxJQUFJLENBQUNNLEtBQUs7QUFHdEJDLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHLFlBQVk7RUFFNUIsSUFBSUMsZ0JBQWdCLEVBQUVDLGNBQWMsRUFBRUMsYUFBYSxFQUFFQyx1QkFBdUIsRUFBRUMsZUFBZSxFQUFFQyx1QkFBdUI7RUFDdEgsSUFBSUMsZUFBZSxFQUFFQyxPQUFPLEVBQUVDLEVBQUU7RUFFaEMsSUFBSUMsY0FBYyxHQUFHLFNBQWpCQSxjQUFjQSxDQUFhQyxLQUFLLEVBQUU7SUFDckNWLGdCQUFnQixHQUFHVSxLQUFLLENBQUNWLGdCQUFnQjtJQUN6Q0MsY0FBYyxHQUFHUyxLQUFLLENBQUNULGNBQWM7SUFDckNJLHVCQUF1QixHQUFHSyxLQUFLLENBQUNMLHVCQUF1QjtJQUN2REgsYUFBYSxHQUFHUSxLQUFLLENBQUNSLGFBQWE7SUFDbkNDLHVCQUF1QixHQUFHTyxLQUFLLENBQUNQLHVCQUF1QjtJQUN2REcsZUFBZSxHQUFHTCxjQUFjLENBQUNLLGVBQWUsQ0FBQ0ssSUFBSSxDQUFDVixjQUFjLENBQUM7SUFFckVHLGVBQWUsR0FBR00sS0FBSyxDQUFDTixlQUFlO0lBQ3ZDRyxPQUFPLEdBQUdILGVBQWUsQ0FBQ1EsVUFBVSxDQUFDLENBQUM7O0lBRXRDOztJQUVBO0FBQ0Y7QUFDQTtJQUNFLElBQUlDLGdCQUFnQixHQUFHLFNBQW5CQSxnQkFBZ0JBLENBQWFDLE9BQU8sRUFBRUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVDLGFBQWEsRUFBRTtNQUN6RSxJQUFJQyxhQUFhLEdBQUdELGFBQWEsSUFBSUUsSUFBSSxDQUFDQyxFQUFFLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQztNQUNyRCxPQUFPO1FBQ05DLENBQUMsRUFBRUwsTUFBTSxHQUFHRyxJQUFJLENBQUNHLEdBQUcsQ0FBQ0osYUFBYSxDQUFDLEdBQUdKLE9BQU87UUFDN0NTLENBQUMsRUFBRSxDQUFDLENBQUMsR0FBR1AsTUFBTSxHQUFHRyxJQUFJLENBQUNLLEdBQUcsQ0FBQ04sYUFBYSxDQUFDLEdBQUdILE9BQU8sQ0FBQztNQUNwRCxDQUFDO0lBQ0YsQ0FBQzs7SUFFRDtBQUNGO0FBQ0E7SUFDRSxJQUFJVSxvQkFBb0IsR0FBRyxTQUF2QkEsb0JBQW9CQSxDQUFhWCxPQUFPLEVBQUVDLE9BQU8sRUFBRUMsTUFBTSxFQUFFVSxTQUFTLEVBQUVDLE9BQU8sRUFBRUMsV0FBVyxFQUFFO01BQy9GLElBQUlDLFNBQVMsR0FBRyxFQUFFO01BQ2xCLElBQUlDLFFBQVEsR0FBRyxDQUFDSCxPQUFPLEdBQUdELFNBQVMsSUFBSUUsV0FBVyxDQUFDLENBQUM7TUFDcEQsSUFBSUcsWUFBWSxHQUFHTCxTQUFTLENBQUMsQ0FBQzs7TUFFOUIsS0FBSyxJQUFJTSxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdKLFdBQVcsRUFBRUksQ0FBQyxFQUFFLEVBQUU7UUFDckMsSUFBSUMsS0FBSyxHQUFHcEIsZ0JBQWdCLENBQUNDLE9BQU8sRUFBRUMsT0FBTyxFQUFFQyxNQUFNLEVBQUVlLFlBQVksQ0FBQztRQUNwRUEsWUFBWSxJQUFJRCxRQUFRO1FBQ3hCRCxTQUFTLElBQUlJLEtBQUssQ0FBQ1osQ0FBQyxHQUFHLEdBQUcsR0FBR1ksS0FBSyxDQUFDVixDQUFDLEdBQUcsR0FBRztNQUMzQztNQUVBLE9BQU9NLFNBQVM7SUFDakIsQ0FBQzs7SUFFRDtBQUNGO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7SUFFRSxJQUFJSywyQkFBMkIsR0FBRyxTQUE5QkEsMkJBQTJCQSxDQUFhQyxNQUFNLEVBQUVDLE9BQU8sRUFBRUMsSUFBSSxFQUFFQyxXQUFXLEVBQUU7TUFDL0UsSUFBSUMsVUFBVTtNQUNkLElBQUlYLFdBQVcsR0FBRyxFQUFFLENBQUMsQ0FBQztNQUN0QixJQUFJVSxXQUFXLEtBQUssWUFBWSxFQUFFO1FBQ2pDLElBQUlFLFdBQVcsRUFBRUMsV0FBVztRQUU1QixJQUFJSixJQUFJLEtBQUssUUFBUSxFQUFFO1VBQ3RCRyxXQUFXLEdBQUdmLG9CQUFvQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUVXLE9BQU8sRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFUixXQUFXLENBQUM7VUFDdEVhLFdBQVcsR0FBR2hCLG9CQUFvQixDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUVXLE9BQU8sRUFBRSxHQUFHLEVBQUUsR0FBRyxFQUFFUixXQUFXLENBQUM7UUFDekUsQ0FBQyxNQUNJLElBQUlTLElBQUksS0FBSyxXQUFXLEVBQUU7VUFDOUJHLFdBQVcsR0FBRyxHQUFHLEdBQUdKLE9BQU8sR0FBRyxJQUFJLEdBQUdBLE9BQU8sR0FBRyxHQUFHLEdBQUdBLE9BQU8sR0FBRyxJQUFJLEdBQUdBLE9BQU8sR0FBRyxHQUFHO1VBQ25GSyxXQUFXLEdBQUdMLE9BQU8sR0FBRyxHQUFHLEdBQUdBLE9BQU8sR0FBRyxJQUFJLEdBQUdBLE9BQU8sR0FBRyxHQUFHLEdBQUdBLE9BQU8sR0FBRyxHQUFHO1FBQzdFO1FBRUFHLFVBQVUsR0FBRyxNQUFNLEdBQUdKLE1BQU0sR0FBRyxJQUFJLEdBQUdDLE9BQU8sR0FBRyxJQUFJLEdBQUdELE1BQU0sR0FBRyxHQUFHO1FBQ25FSSxVQUFVLElBQUlDLFdBQVc7UUFDekJELFVBQVUsSUFBSUgsT0FBTyxHQUFHLElBQUksR0FBR0QsTUFBTSxHQUFHLE1BQU0sR0FBR0EsTUFBTSxHQUFHLEtBQUssR0FBR0EsTUFBTSxHQUFHLEdBQUcsR0FBR0MsT0FBTyxHQUFHLEdBQUcsR0FBR0QsTUFBTSxHQUFHLEdBQUc7UUFDN0dJLFVBQVUsSUFBSUUsV0FBVztRQUN6QkYsVUFBVSxJQUFJLEdBQUcsR0FBR0gsT0FBTyxHQUFHLEdBQUcsR0FBR0QsTUFBTSxHQUFHLE1BQU0sR0FBR0EsTUFBTTtNQUM3RCxDQUFDLE1BQ0k7UUFDSixJQUFJTyxVQUFVLEVBQUVDLFdBQVc7UUFFM0IsSUFBSU4sSUFBSSxLQUFLLFFBQVEsRUFBRTtVQUN0QkssVUFBVSxHQUFHakIsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRVcsT0FBTyxFQUFFLEVBQUUsRUFBRSxHQUFHLEVBQUVSLFdBQVcsQ0FBQztVQUN0RWUsV0FBVyxHQUFHbEIsb0JBQW9CLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRVcsT0FBTyxFQUFFLENBQUMsRUFBRSxFQUFFLEVBQUUsRUFBRVIsV0FBVyxDQUFDO1FBQ3hFLENBQUMsTUFDSSxJQUFJUyxJQUFJLEtBQUssV0FBVyxFQUFFO1VBQzlCSyxVQUFVLEdBQUcsR0FBRyxHQUFHTixPQUFPLEdBQUcsSUFBSSxHQUFHQSxPQUFPLEdBQUcsSUFBSSxHQUFHQSxPQUFPLEdBQUcsR0FBRyxHQUFHQSxPQUFPLEdBQUcsR0FBRztVQUNsRk8sV0FBVyxHQUFHUCxPQUFPLEdBQUcsR0FBRyxHQUFHQSxPQUFPLEdBQUcsR0FBRyxHQUFHQSxPQUFPLEdBQUcsSUFBSSxHQUFHQSxPQUFPLEdBQUcsR0FBRztRQUM3RTtRQUVBRyxVQUFVLEdBQUcsR0FBRyxHQUFHSixNQUFNLEdBQUcsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFJLEdBQUdBLE1BQU0sR0FBRyxJQUFJLEdBQUdDLE9BQU8sR0FBRyxHQUFHO1FBQzNFRyxVQUFVLElBQUlHLFVBQVU7UUFDeEJILFVBQVUsSUFBSSxHQUFHLEdBQUdKLE1BQU0sR0FBRyxHQUFHLEdBQUdDLE9BQU8sR0FBRyxJQUFJLEdBQUdELE1BQU0sR0FBRyxLQUFLLEdBQUdBLE1BQU0sR0FBRyxLQUFLLEdBQUdBLE1BQU0sR0FBRyxHQUFHLEdBQUdDLE9BQU8sR0FBRyxHQUFHO1FBQ2xIRyxVQUFVLElBQUlJLFdBQVc7UUFDekJKLFVBQVUsSUFBSUosTUFBTSxHQUFHLElBQUksR0FBR0MsT0FBTyxHQUFHLEdBQUcsR0FBR0QsTUFBTSxHQUFHLEtBQUs7TUFDN0Q7TUFFQSxPQUFPSSxVQUFVO0lBQ2xCLENBQUM7O0lBRUQ7SUFDQSxTQUFTSyx1QkFBdUJBLENBQUEsRUFBRztNQUNsQztNQUNBLElBQUlDLEVBQUUsR0FBR3JDLEVBQUUsQ0FBQ3NDLFFBQVEsQ0FBQyxDQUFDOztNQUV0QjtNQUNBO01BQ0FELEVBQUUsQ0FBQ0UsTUFBTSxDQUFDLGtCQUFrQixFQUFFNUMsdUJBQXVCLENBQUM2QyxnQkFBZ0IsRUFBRTdDLHVCQUF1QixDQUFDOEMsV0FBVyxDQUFDO01BQzVHSixFQUFFLENBQUNFLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRTVDLHVCQUF1QixDQUFDK0MsZ0JBQWdCLEVBQUUvQyx1QkFBdUIsQ0FBQzhDLFdBQVcsQ0FBQztNQUM1R0osRUFBRSxDQUFDRSxNQUFNLENBQUMsa0JBQWtCLEVBQUU1Qyx1QkFBdUIsQ0FBQ2dELGdCQUFnQixFQUFFaEQsdUJBQXVCLENBQUNnRCxnQkFBZ0IsQ0FBQzs7TUFFakg7TUFDQU4sRUFBRSxDQUFDRSxNQUFNLENBQUMsV0FBVyxFQUFFNUMsdUJBQXVCLENBQUNpRCxTQUFTLEVBQUVqRCx1QkFBdUIsQ0FBQ2tELFVBQVUsQ0FBQztNQUM3RlIsRUFBRSxDQUFDRSxNQUFNLENBQUMsZ0JBQWdCLEVBQUU1Qyx1QkFBdUIsQ0FBQ21ELE9BQU8sRUFBRW5ELHVCQUF1QixDQUFDb0QsU0FBUyxDQUFDO01BQy9GVixFQUFFLENBQUNFLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRTVDLHVCQUF1QixDQUFDb0QsU0FBUyxFQUFFcEQsdUJBQXVCLENBQUNtRCxPQUFPLENBQUM7TUFDakdULEVBQUUsQ0FBQ0UsTUFBTSxDQUFDLFVBQVUsRUFBRTVDLHVCQUF1QixDQUFDcUQsUUFBUSxFQUFFckQsdUJBQXVCLENBQUNzRCxZQUFZLENBQUM7TUFDN0ZaLEVBQUUsQ0FBQ0UsTUFBTSxDQUFDLFlBQVksRUFBRTVDLHVCQUF1QixDQUFDdUQsVUFBVSxFQUFFdkQsdUJBQXVCLENBQUN3RCxjQUFjLENBQUM7TUFDbkdkLEVBQUUsQ0FBQ0UsTUFBTSxDQUFDLGtCQUFrQixFQUFFNUMsdUJBQXVCLENBQUN5RCxTQUFTLEVBQUV6RCx1QkFBdUIsQ0FBQzBELE1BQU0sQ0FBQztNQUNoR2hCLEVBQUUsQ0FBQ0UsTUFBTSxDQUFDLFlBQVksRUFBRTVDLHVCQUF1QixDQUFDMkQsVUFBVSxFQUFFM0QsdUJBQXVCLENBQUM0RCxPQUFPLENBQUM7TUFDNUZsQixFQUFFLENBQUNFLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRTVDLHVCQUF1QixDQUFDNkQsZUFBZSxFQUFFN0QsdUJBQXVCLENBQUM2RCxlQUFlLENBQUM7TUFDOUduQixFQUFFLENBQUNFLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRTVDLHVCQUF1QixDQUFDOEQsb0JBQW9CLEVBQUU5RCx1QkFBdUIsQ0FBQytELHNCQUFzQixDQUFDO01BQy9IckIsRUFBRSxDQUFDRSxNQUFNLENBQUMsd0JBQXdCLEVBQUU1Qyx1QkFBdUIsQ0FBQytELHNCQUFzQixFQUFFL0QsdUJBQXVCLENBQUM4RCxvQkFBb0IsQ0FBQzs7TUFFakk7TUFDQTtJQUNEO0lBRUEsU0FBU0UsV0FBV0EsQ0FBQ0MsS0FBSyxFQUFFO01BQzNCLElBQUlDLElBQUksR0FBR0QsS0FBSyxDQUFDRSxNQUFNLElBQUlGLEtBQUssQ0FBQ0csUUFBUTtNQUV6QyxJQUFJQyxjQUFjLEdBQUcsU0FBakJBLGNBQWNBLENBQWFILElBQUksRUFBRTtRQUNwQyxPQUFPckUsZ0JBQWdCLENBQUN5RSxTQUFTLENBQUNKLElBQUksQ0FBQyxJQUFJQSxJQUFJLENBQUNLLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxJQUFJO01BQ3pFLENBQUM7TUFFRCxJQUFJLENBQUNGLGNBQWMsQ0FBQ0gsSUFBSSxDQUFDLEVBQUU7UUFDMUI7TUFDRDtNQUVBLElBQUlNLEdBQUcsQ0FBQyxDQUFDO01BQ1QsSUFBSUMsR0FBRyxHQUFHUixLQUFLLENBQUNTLFFBQVEsSUFBSVQsS0FBSyxDQUFDVSxVQUFVO01BQzVDLElBQUlDLEdBQUcsR0FBR3ZFLEVBQUUsQ0FBQ3VFLEdBQUcsQ0FBQyxDQUFDO01BQ2xCLElBQUlDLElBQUksR0FBR3hFLEVBQUUsQ0FBQ3dFLElBQUksQ0FBQyxDQUFDO01BRXBCLElBQUlDLE9BQU8sR0FBRzVGLE9BQU8sQ0FBQzZGLGFBQWEsQ0FBQ0MsVUFBVSxDQUFDUCxHQUFHLENBQUN2RCxDQUFDLEVBQUV1RCxHQUFHLENBQUNyRCxDQUFDLEVBQUU4QyxJQUFJLEVBQUUsQ0FBQyxDQUFDO01BQ3JFLElBQUllLGNBQWM7TUFHbEIsSUFBSSxDQUFDSCxPQUFPLEVBQUU7UUFDYkcsY0FBYyxHQUFHZixJQUFJLENBQUNLLElBQUksQ0FBQyxTQUFTLENBQUM7UUFDckMsSUFBSVUsY0FBYyxJQUFJQyxTQUFTLElBQUlELGNBQWMsSUFBSSxFQUFFLEVBQUU7VUFDeEQ7UUFDRDtRQUVBVCxHQUFHLEdBQUdOLElBQUksQ0FBQ2lCLFNBQVMsQ0FBQyxDQUFDO01BQ3ZCLENBQUMsTUFDSTtRQUNKRixjQUFjLEdBQUdILE9BQU8sQ0FBQyxTQUFTLENBQUM7UUFFbkMsSUFBSUcsY0FBYyxJQUFJQyxTQUFTLEVBQUU7VUFDaEM7UUFDRDtRQUVBLElBQUlFLFFBQVEsR0FBR2xHLE9BQU8sQ0FBQzZGLGFBQWEsQ0FBQ00sZ0JBQWdCLENBQUNQLE9BQU8sRUFBRXpFLEVBQUUsQ0FBQztRQUNsRSxJQUFJaUYsTUFBTSxHQUFHUixPQUFPLENBQUNTLElBQUksQ0FBQ0MsQ0FBQztRQUMzQixJQUFJQyxNQUFNLEdBQUdYLE9BQU8sQ0FBQ1MsSUFBSSxDQUFDRyxDQUFDO1FBQzNCLElBQUlDLFNBQVMsR0FBR0wsTUFBTSxHQUFHVCxJQUFJO1FBQzdCLElBQUllLFNBQVMsR0FBR0gsTUFBTSxHQUFHWixJQUFJO1FBQzdCTyxRQUFRLENBQUNsRSxDQUFDLElBQUlvRSxNQUFNLEdBQUcsQ0FBQztRQUN4QkYsUUFBUSxDQUFDaEUsQ0FBQyxJQUFJcUUsTUFBTSxHQUFHLENBQUM7UUFDeEIsSUFBSUksV0FBVyxHQUFHaEcsZ0JBQWdCLENBQUNpRyx5QkFBeUIsQ0FBQ1YsUUFBUSxFQUFFUixHQUFHLEVBQUVDLElBQUksQ0FBQztRQUVqRixJQUFJa0IsWUFBWSxHQUFHO1VBQUVQLENBQUMsRUFBRUcsU0FBUztVQUFFRCxDQUFDLEVBQUVFO1FBQVUsQ0FBQztRQUVqRHBCLEdBQUcsR0FBR04sSUFBSSxDQUFDaUIsU0FBUyxDQUFDO1VBQ3BCYSxnQkFBZ0IsRUFBRSxTQUFBQSxpQkFBQSxFQUFZO1lBQzdCLE9BQU9ILFdBQVc7VUFDbkIsQ0FBQztVQUNESSxrQkFBa0IsRUFBRSxTQUFBQSxtQkFBQSxFQUFZO1lBQy9CLE9BQU9GLFlBQVk7VUFDcEI7UUFDRCxDQUFDLENBQUM7TUFDSDtNQUdBLElBQUlHLFNBQVMsR0FBR3BCLE9BQU8sR0FBR0EsT0FBTyxDQUFDcUIsVUFBVSxHQUFHLFFBQVE7TUFDdkQsSUFBSUMsWUFBWTtNQUVoQixJQUFJMUcsS0FBSyxHQUFHRCxLQUFLLENBQUM0RyxHQUFHLENBQUM3QixHQUFHLEVBQUU7UUFDMUI4QixPQUFPLEVBQUcsWUFBTTtVQUNmLElBQUlBLE9BQU8sR0FBR0MsUUFBUSxDQUFDQyxhQUFhLENBQUMsS0FBSyxDQUFDO1VBRTNDRixPQUFPLENBQUNHLEtBQUssQ0FBQyxXQUFXLENBQUMsR0FBRyxFQUFFLEdBQUc1QixJQUFJLEdBQUcsSUFBSTtVQUM3Q3lCLE9BQU8sQ0FBQ0ksU0FBUyxHQUFHekIsY0FBYztVQUVsQyxPQUFPcUIsT0FBTztRQUNmLENBQUMsQ0FBRSxDQUFDO1FBQ0pLLE9BQU8sRUFBRSxRQUFRO1FBQ2pCQyxXQUFXLEVBQUUsSUFBSTtRQUNqQkMsS0FBSyxFQUFFLElBQUk7UUFDWFgsU0FBUyxFQUFUQSxTQUFTO1FBQ1RZLFFBQVEsRUFBRSxTQUFBQSxTQUFBLEVBQVk7VUFDckJ6RyxFQUFFLENBQUMwRyxHQUFHLENBQUMsVUFBVSxFQUFFWCxZQUFZLENBQUM7VUFDaENsQyxJQUFJLENBQUM2QyxHQUFHLENBQUMsVUFBVSxFQUFFWCxZQUFZLENBQUM7VUFDbEMvRixFQUFFLENBQUMwRyxHQUFHLENBQUMsU0FBUyxFQUFFWCxZQUFZLENBQUM7UUFDaEM7TUFDRCxDQUFDLENBQUM7TUFFRkEsWUFBWSxHQUFHLFNBQUFBLGFBQUEsRUFBWTtRQUMxQjFHLEtBQUssQ0FBQ3NILE9BQU8sQ0FBQyxDQUFDO01BQ2hCLENBQUM7TUFFRDNHLEVBQUUsQ0FBQzRHLEVBQUUsQ0FBQyxVQUFVLEVBQUViLFlBQVksQ0FBQztNQUMvQmxDLElBQUksQ0FBQytDLEVBQUUsQ0FBQyxVQUFVLEVBQUViLFlBQVksQ0FBQztNQUNqQy9GLEVBQUUsQ0FBQzRHLEVBQUUsQ0FBQyxTQUFTLEVBQUViLFlBQVksQ0FBQztNQUU5QmMsVUFBVSxDQUFDO1FBQUEsT0FBTXhILEtBQUssQ0FBQ3lILElBQUksQ0FBQyxDQUFDO01BQUEsR0FBRSxHQUFHLENBQUM7SUFDcEM7SUFFQSxTQUFTQyxZQUFZQSxDQUFBLEVBQUc7TUFFdkIvRyxFQUFFLENBQUM0RyxFQUFFLENBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxVQUFVaEQsS0FBSyxFQUFFO1FBQzdDLElBQUlvRCxZQUFZLEdBQUcsR0FBRztRQUN0QixJQUFJQyxjQUFjO1FBQ2xCLElBQUlDLFNBQVMsR0FBR3RELEtBQUs7UUFDckIsSUFBSUMsSUFBSSxHQUFHcUQsU0FBUyxDQUFDcEQsTUFBTSxJQUFJb0QsU0FBUyxDQUFDbkQsUUFBUTtRQUNqRCxJQUFJb0QsT0FBTyxHQUFHLElBQUk7UUFFbEIsSUFBSUMsY0FBYyxHQUFHLFNBQWpCQSxjQUFjQSxDQUFBLEVBQWU7VUFDaEMsSUFBSUgsY0FBYyxFQUFFO1lBQ25CcEQsSUFBSSxDQUFDNkMsR0FBRyxDQUFDLFlBQVksRUFBRU8sY0FBYyxDQUFDO1VBQ3ZDO1VBRUEsSUFBSUksV0FBVyxFQUFFO1lBQ2hCeEQsSUFBSSxDQUFDNkMsR0FBRyxDQUFDLFNBQVMsRUFBRVcsV0FBVyxDQUFDO1VBQ2pDO1FBQ0QsQ0FBQztRQUVELElBQUlDLG1CQUFtQixHQUFHLFNBQXRCQSxtQkFBbUJBLENBQUEsRUFBZTtVQUNyQyxPQUFPVCxVQUFVLENBQUMsWUFBWTtZQUM3QmxELFdBQVcsQ0FBQ3VELFNBQVMsQ0FBQztZQUN0QkMsT0FBTyxHQUFHLEtBQUs7VUFDaEIsQ0FBQyxFQUFFSCxZQUFZLENBQUM7UUFDakIsQ0FBQztRQUVELElBQUlPLGdCQUFnQixHQUFHRCxtQkFBbUIsQ0FBQyxDQUFDO1FBRTVDekQsSUFBSSxDQUFDK0MsRUFBRSxDQUFDLFlBQVksRUFBRUssY0FBYyxHQUFHLFNBQUFBLGVBQVVPLENBQUMsRUFBRTtVQUNuREMsWUFBWSxDQUFDRixnQkFBZ0IsQ0FBQztVQUM5QkgsY0FBYyxDQUFDLENBQUM7UUFDakIsQ0FBQyxDQUFDO1FBRUZ2RCxJQUFJLENBQUMrQyxFQUFFLENBQUMsU0FBUyxFQUFFUyxXQUFXLEdBQUcsU0FBQUEsWUFBVUcsQ0FBQyxFQUFFO1VBQzdDTixTQUFTLEdBQUdNLENBQUM7VUFDYixJQUFJLENBQUNMLE9BQU8sRUFBRTtZQUNiSSxnQkFBZ0IsR0FBR0QsbUJBQW1CLENBQUMsQ0FBQztZQUN4Q0gsT0FBTyxHQUFHLElBQUk7VUFDZjtRQUNELENBQUMsQ0FBQztNQUNILENBQUMsQ0FBQztNQUVGbkgsRUFBRSxDQUFDNEcsRUFBRSxDQUFDLFFBQVEsRUFBRSxNQUFNLEVBQUUsVUFBVWhELEtBQUssRUFBRTtRQUN4QzVELEVBQUUsQ0FBQ29HLEtBQUssQ0FBQyxDQUFDLENBQUNzQixNQUFNLENBQUMsQ0FBQztNQUNwQixDQUFDLENBQUM7TUFFRjFILEVBQUUsQ0FBQzRHLEVBQUUsQ0FBQywrQkFBK0IsRUFBRSxNQUFNLEVBQUUsVUFBVWhELEtBQUssRUFBRTtRQUMvRCxJQUFJQyxJQUFJLEdBQUcsSUFBSTtRQUNmO1FBQ0EsSUFBSUEsSUFBSSxDQUFDOEQsUUFBUSxDQUFDekQsSUFBSSxTQUFNLENBQUMwRCxVQUFVLENBQUMsU0FBUyxDQUFDLEVBQUU7VUFDbkQ7VUFDQSxJQUFJQyxTQUFTLEdBQUdySSxnQkFBZ0IsQ0FBQ3NJLFlBQVksQ0FBQ2pFLElBQUksQ0FBQztVQUNuREEsSUFBSSxDQUFDOEQsUUFBUSxDQUFDekQsSUFBSSxDQUFDMkQsU0FBUyxHQUFHQSxTQUFTO1FBQ3pDO01BQ0QsQ0FBQyxDQUFDO01BRUY3SCxFQUFFLENBQUM0RyxFQUFFLENBQUMsOEJBQThCLEVBQUUsTUFBTSxFQUFFLFVBQVVoRCxLQUFLLEVBQUU7UUFDOUQsSUFBSUMsSUFBSSxHQUFHLElBQUk7UUFDZjtRQUNBO1FBQ0E3RCxFQUFFLENBQUMrSCxVQUFVLENBQUMsQ0FBQztRQUNmLElBQUk3QyxJQUFJLEdBQUdyQixJQUFJLENBQUNLLElBQUksQ0FBQyxNQUFNLENBQUM7UUFDNUJnQixJQUFJLENBQUNDLENBQUMsR0FBRyxFQUFFO1FBQ1hELElBQUksQ0FBQ0csQ0FBQyxHQUFHLEVBQUU7UUFDWHhCLElBQUksQ0FBQ0ssSUFBSSxDQUFDLE1BQU0sRUFBRWdCLElBQUksQ0FBQztRQUN2QmxGLEVBQUUsQ0FBQ2dJLFFBQVEsQ0FBQyxDQUFDO01BQ2QsQ0FBQyxDQUFDO01BRUZoSSxFQUFFLENBQUM0RyxFQUFFLENBQUMsNkJBQTZCLEVBQUUsTUFBTSxFQUFFLFVBQVVoRCxLQUFLLEVBQUU7UUFDN0QsSUFBSUMsSUFBSSxHQUFHLElBQUk7UUFDZkEsSUFBSSxDQUFDb0UsVUFBVSxDQUFDLFdBQVcsQ0FBQztNQUM3QixDQUFDLENBQUM7TUFFRmpJLEVBQUUsQ0FBQzRHLEVBQUUsQ0FBQyw0QkFBNEIsRUFBRSxNQUFNLEVBQUUsVUFBVWhELEtBQUssRUFBRTtRQUM1RCxJQUFJQyxJQUFJLEdBQUcsSUFBSTtRQUNmN0QsRUFBRSxDQUFDa0ksS0FBSyxDQUFDLENBQUMsQ0FBQ0Msb0JBQW9CLENBQUMsQ0FBQztRQUVqQyxJQUFJLENBQUNwSSxPQUFPLENBQUNxSSxpQ0FBaUMsRUFBRTtVQUMvQ3BJLEVBQUUsQ0FBQ29HLEtBQUssQ0FBQyxDQUFDLENBQUNzQixNQUFNLENBQUMsQ0FBQztRQUNwQjtRQUNBO1FBQ0EsSUFBSTdELElBQUksQ0FBQzhELFFBQVEsQ0FBQ3pELElBQUksU0FBTSxDQUFDMEQsVUFBVSxDQUFDLFNBQVMsQ0FBQyxFQUFFO1VBQ25EL0QsSUFBSSxDQUFDd0UsV0FBVyxDQUFDLFNBQVMsQ0FBQztRQUM1QjtNQUNELENBQUMsQ0FBQztNQUVGckksRUFBRSxDQUFDNEcsRUFBRSxDQUFDLFVBQVUsRUFBRSxVQUFVWSxDQUFDLEVBQUVjLElBQUksRUFBRUMsSUFBSSxFQUFFO1FBQzFDLElBQUlELElBQUksSUFBSSxRQUFRLElBQUlBLElBQUksSUFBSSxVQUFVLElBQUlBLElBQUksSUFBSSxRQUFRLElBQUlBLElBQUksSUFBSSxxQkFBcUIsSUFBSUEsSUFBSSxJQUFJLG1CQUFtQixJQUN6SEEsSUFBSSxJQUFJLE9BQU8sS0FBTUMsSUFBSSxDQUFDQyxNQUFNLEdBQUcsQ0FBQyxJQUFJRCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksWUFBWSxJQUFNQSxJQUFJLENBQUNDLE1BQU0sR0FBRyxDQUFDLElBQUlELElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxlQUFnQixDQUFFLEVBQUU7VUFDM0ksSUFBSUUsT0FBTyxHQUFHekksRUFBRSxDQUFDMEksUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7VUFDOUMsSUFBSUMsT0FBTyxHQUFHNUksRUFBRSxDQUFDMEksUUFBUSxDQUFDLENBQUMsQ0FBQ0csR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDRixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7VUFDcEQsSUFBSUcsV0FBVyxHQUFHTCxPQUFPLENBQUNNLE1BQU0sQ0FBQ0gsT0FBTyxDQUFDLENBQUMsQ0FBRTtVQUM1Q0wsSUFBSSxDQUFDTyxXQUFXLEdBQUdBLFdBQVc7VUFDOUIsSUFBSUUsS0FBSyxHQUFHLENBQUMsQ0FBQztVQUNkaEosRUFBRSxDQUFDa0ksS0FBSyxDQUFDLENBQUMsQ0FBQ2UsT0FBTyxDQUFDLFVBQVVwRixJQUFJLEVBQUU7WUFDbEMsSUFBSXJFLGdCQUFnQixDQUFDMEosWUFBWSxDQUFDckYsSUFBSSxDQUFDLEVBQUU7Y0FDeENtRixLQUFLLENBQUNuRixJQUFJLENBQUNzRixFQUFFLENBQUMsQ0FBQyxDQUFDLEdBQUdDLElBQUksQ0FBQ0MsS0FBSyxDQUFDRCxJQUFJLENBQUNFLFNBQVMsQ0FBQ3pGLElBQUksQ0FBQ0ssSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7WUFDbEU7VUFDRCxDQUFDLENBQUM7VUFDRnFFLElBQUksQ0FBQ1MsS0FBSyxHQUFHQSxLQUFLO1VBQ2xCVCxJQUFJLENBQUNnQixRQUFRLEdBQUc7WUFBRWhGLEdBQUcsRUFBRTZFLElBQUksQ0FBQ0MsS0FBSyxDQUFDRCxJQUFJLENBQUNFLFNBQVMsQ0FBQ3RKLEVBQUUsQ0FBQ3VFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFFQyxJQUFJLEVBQUV4RSxFQUFFLENBQUN3RSxJQUFJLENBQUM7VUFBRSxDQUFDO1VBQzlFLElBQUk4RCxJQUFJLElBQUksUUFBUSxFQUNuQjVJLGFBQWEsQ0FBQzhKLG1CQUFtQixDQUFDLENBQUM7UUFDckM7TUFDRCxDQUFDLENBQUM7TUFFRnhKLEVBQUUsQ0FBQzRHLEVBQUUsQ0FBQyxZQUFZLEVBQUUsVUFBVVksQ0FBQyxFQUFFYyxJQUFJLEVBQUVDLElBQUksRUFBRTtRQUM1QyxJQUFJRCxJQUFJLElBQUksUUFBUSxJQUFJQSxJQUFJLElBQUksVUFBVSxJQUFJQSxJQUFJLElBQUksUUFBUSxJQUFJQSxJQUFJLElBQUkscUJBQXFCLElBQUlBLElBQUksSUFBSSxtQkFBbUIsSUFDekhBLElBQUksSUFBSSxPQUFPLEtBQU1DLElBQUksQ0FBQ0MsTUFBTSxHQUFHLENBQUMsSUFBSUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLFlBQVksSUFBTUEsSUFBSSxDQUFDQyxNQUFNLEdBQUcsQ0FBQyxJQUFJRCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksZUFBZ0IsQ0FBRSxFQUFFO1VBQzNJLElBQUlFLE9BQU8sR0FBR3pJLEVBQUUsQ0FBQzBJLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQ0MsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1VBQzlDLElBQUlDLE9BQU8sR0FBRzVJLEVBQUUsQ0FBQzBJLFFBQVEsQ0FBQyxDQUFDLENBQUNHLEdBQUcsQ0FBQyxTQUFTLENBQUMsQ0FBQ0YsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDO1VBQ3BELElBQUlHLFdBQVcsR0FBR0wsT0FBTyxDQUFDTSxNQUFNLENBQUNILE9BQU8sQ0FBQyxDQUFDLENBQUU7VUFDNUNMLElBQUksQ0FBQ2tCLFlBQVksR0FBR1gsV0FBVztVQUMvQixJQUFJRSxLQUFLLEdBQUcsQ0FBQyxDQUFDO1VBQ2RoSixFQUFFLENBQUNrSSxLQUFLLENBQUMsQ0FBQyxDQUFDZSxPQUFPLENBQUMsVUFBVXBGLElBQUksRUFBRTtZQUNsQyxJQUFJckUsZ0JBQWdCLENBQUMwSixZQUFZLENBQUNyRixJQUFJLENBQUMsRUFBRTtjQUN4Q21GLEtBQUssQ0FBQ25GLElBQUksQ0FBQ3NGLEVBQUUsQ0FBQyxDQUFDLENBQUMsR0FBR0MsSUFBSSxDQUFDQyxLQUFLLENBQUNELElBQUksQ0FBQ0UsU0FBUyxDQUFDekYsSUFBSSxDQUFDSyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQztZQUNsRTtVQUNELENBQUMsQ0FBQztVQUNGcUUsSUFBSSxDQUFDbUIsTUFBTSxHQUFHVixLQUFLO1VBQ25CVCxJQUFJLENBQUNvQixTQUFTLEdBQUc7WUFBRXBGLEdBQUcsRUFBRTZFLElBQUksQ0FBQ0MsS0FBSyxDQUFDRCxJQUFJLENBQUNFLFNBQVMsQ0FBQ3RKLEVBQUUsQ0FBQ3VFLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUFFQyxJQUFJLEVBQUV4RSxFQUFFLENBQUN3RSxJQUFJLENBQUM7VUFBRSxDQUFDO1FBQ2hGO01BQ0QsQ0FBQyxDQUFDO01BRUZ4RSxFQUFFLENBQUM0RyxFQUFFLENBQUMsU0FBUyxFQUFFLFVBQVVZLENBQUMsRUFBRWMsSUFBSSxFQUFFQyxJQUFJLEVBQUVxQixHQUFHLEVBQUU7UUFDOUMsSUFBSXRCLElBQUksSUFBSSxRQUFRLElBQUlBLElBQUksSUFBSSxVQUFVLElBQUlBLElBQUksSUFBSSxRQUFRLElBQUlBLElBQUksSUFBSSxxQkFBcUIsSUFBSUEsSUFBSSxJQUFJLG1CQUFtQixJQUN6SEEsSUFBSSxJQUFJLE9BQU8sS0FBTUMsSUFBSSxDQUFDQyxNQUFNLEdBQUcsQ0FBQyxJQUFJRCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksWUFBWSxJQUFNQSxJQUFJLENBQUNDLE1BQU0sR0FBRyxDQUFDLElBQUlELElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxlQUFnQixDQUFFLEVBQUU7VUFDM0lxQixHQUFHLENBQUNkLFdBQVcsR0FBR1AsSUFBSSxDQUFDTyxXQUFXO1VBQ2xDYyxHQUFHLENBQUNaLEtBQUssR0FBR1QsSUFBSSxDQUFDUyxLQUFLO1VBQ3RCWSxHQUFHLENBQUNMLFFBQVEsR0FBR2hCLElBQUksQ0FBQ2dCLFFBQVE7UUFDN0I7TUFDRCxDQUFDLENBQUM7TUFFRnZKLEVBQUUsQ0FBQzRHLEVBQUUsQ0FBQyxXQUFXLEVBQUUsVUFBVVksQ0FBQyxFQUFFYyxJQUFJLEVBQUVDLElBQUksRUFBRXFCLEdBQUcsRUFBRTtRQUVoRCxJQUFJdEIsSUFBSSxJQUFJLFFBQVEsSUFBSUEsSUFBSSxJQUFJLFVBQVUsSUFBSUEsSUFBSSxJQUFJLFFBQVEsSUFBSUEsSUFBSSxJQUFJLHFCQUFxQixJQUFJQSxJQUFJLElBQUksbUJBQW1CLElBQ3pIQSxJQUFJLElBQUksT0FBTyxLQUFNQyxJQUFJLENBQUNDLE1BQU0sR0FBRyxDQUFDLElBQUlELElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxZQUFZLElBQU1BLElBQUksQ0FBQ0MsTUFBTSxHQUFHLENBQUMsSUFBSUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLGVBQWdCLENBQUUsRUFBRTtVQUMzSXFCLEdBQUcsQ0FBQ2QsV0FBVyxHQUFHUCxJQUFJLENBQUNrQixZQUFZO1VBQ25DRyxHQUFHLENBQUNaLEtBQUssR0FBR1QsSUFBSSxDQUFDbUIsTUFBTTtVQUN2QkUsR0FBRyxDQUFDTCxRQUFRLEdBQUdoQixJQUFJLENBQUNvQixTQUFTO1VBQzdCM0osRUFBRSxDQUFDNkosSUFBSSxDQUFDO1lBQUVDLFFBQVEsRUFBRSxJQUFJO1lBQUVwQixRQUFRLEVBQUVILElBQUksQ0FBQ087VUFBWSxDQUFDLENBQUM7VUFDdkQ5SSxFQUFFLENBQUMrSixLQUFLLENBQUMsWUFBWTtZQUNwQi9KLEVBQUUsQ0FBQ2tJLEtBQUssQ0FBQyxDQUFDLENBQUNlLE9BQU8sQ0FBQyxVQUFVcEYsSUFBSSxFQUFFO2NBQ2xDLElBQUlyRSxnQkFBZ0IsQ0FBQzBKLFlBQVksQ0FBQ3JGLElBQUksQ0FBQyxFQUFFO2dCQUN4Q0EsSUFBSSxDQUFDSyxJQUFJLENBQUMsT0FBTyxFQUFFcUUsSUFBSSxDQUFDUyxLQUFLLENBQUNuRixJQUFJLENBQUNzRixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Y0FDMUM7WUFDRCxDQUFDLENBQUM7VUFDSCxDQUFDLENBQUM7VUFDRm5KLEVBQUUsQ0FBQ3VFLEdBQUcsQ0FBQ2dFLElBQUksQ0FBQ2dCLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztVQUM1QnZKLEVBQUUsQ0FBQ3dFLElBQUksQ0FBQytELElBQUksQ0FBQ2dCLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQjtNQUNELENBQUMsQ0FBQztNQUVGdkosRUFBRSxDQUFDNEcsRUFBRSxDQUFDLFlBQVksRUFBRSxVQUFVWSxDQUFDLEVBQUVjLElBQUksRUFBRUMsSUFBSSxFQUFFO1FBQzVDLElBQUlELElBQUksSUFBSSxRQUFRLElBQUlBLElBQUksSUFBSSxVQUFVLElBQUlBLElBQUksSUFBSSxRQUFRLElBQUlBLElBQUksSUFBSSxxQkFBcUIsSUFBSUEsSUFBSSxJQUFJLG1CQUFtQixJQUN6SEEsSUFBSSxJQUFJLE9BQU8sS0FBTUMsSUFBSSxDQUFDQyxNQUFNLEdBQUcsQ0FBQyxJQUFJRCxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLElBQUksWUFBWSxJQUFNQSxJQUFJLENBQUNDLE1BQU0sR0FBRyxDQUFDLElBQUlELElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxlQUFnQixDQUFFLEVBQUU7VUFDM0ksSUFBSUUsT0FBTyxHQUFHekksRUFBRSxDQUFDMEksUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7VUFDOUMsSUFBSUMsT0FBTyxHQUFHNUksRUFBRSxDQUFDMEksUUFBUSxDQUFDLENBQUMsQ0FBQ0csR0FBRyxDQUFDLFNBQVMsQ0FBQyxDQUFDRixLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7VUFDcEQsSUFBSUcsV0FBVyxHQUFHTCxPQUFPLENBQUNNLE1BQU0sQ0FBQ0gsT0FBTyxDQUFDLENBQUMsQ0FBRTtVQUM1Q0wsSUFBSSxDQUFDa0IsWUFBWSxHQUFHWCxXQUFXO1VBQy9CLElBQUlFLEtBQUssR0FBRyxDQUFDLENBQUM7VUFDZGhKLEVBQUUsQ0FBQ2tJLEtBQUssQ0FBQyxDQUFDLENBQUNlLE9BQU8sQ0FBQyxVQUFVcEYsSUFBSSxFQUFFO1lBQ2xDLElBQUlyRSxnQkFBZ0IsQ0FBQzBKLFlBQVksQ0FBQ3JGLElBQUksQ0FBQyxFQUFFO2NBQ3hDbUYsS0FBSyxDQUFDbkYsSUFBSSxDQUFDc0YsRUFBRSxDQUFDLENBQUMsQ0FBQyxHQUFHQyxJQUFJLENBQUNDLEtBQUssQ0FBQ0QsSUFBSSxDQUFDRSxTQUFTLENBQUN6RixJQUFJLENBQUNLLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO1lBQ2xFO1VBQ0QsQ0FBQyxDQUFDO1VBQ0ZxRSxJQUFJLENBQUNtQixNQUFNLEdBQUdWLEtBQUs7VUFDbkJULElBQUksQ0FBQ29CLFNBQVMsR0FBRztZQUFFcEYsR0FBRyxFQUFFNkUsSUFBSSxDQUFDQyxLQUFLLENBQUNELElBQUksQ0FBQ0UsU0FBUyxDQUFDdEosRUFBRSxDQUFDdUUsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQUVDLElBQUksRUFBRXhFLEVBQUUsQ0FBQ3dFLElBQUksQ0FBQztVQUFFLENBQUM7UUFDaEY7TUFDRCxDQUFDLENBQUM7TUFFRnhFLEVBQUUsQ0FBQzRHLEVBQUUsQ0FBQyxXQUFXLEVBQUUsVUFBVVksQ0FBQyxFQUFFYyxJQUFJLEVBQUVDLElBQUksRUFBRXFCLEdBQUcsRUFBRTtRQUNoRCxJQUFJdEIsSUFBSSxJQUFJLFFBQVEsSUFBSUEsSUFBSSxJQUFJLFVBQVUsSUFBSUEsSUFBSSxJQUFJLFFBQVEsSUFBSUEsSUFBSSxJQUFJLHFCQUFxQixJQUFJQSxJQUFJLElBQUksbUJBQW1CLElBQ3pIQSxJQUFJLElBQUksT0FBTyxLQUFNQyxJQUFJLENBQUNDLE1BQU0sR0FBRyxDQUFDLElBQUlELElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsSUFBSSxZQUFZLElBQU1BLElBQUksQ0FBQ0MsTUFBTSxHQUFHLENBQUMsSUFBSUQsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLGVBQWdCLENBQUUsRUFBRTtVQUMzSXFCLEdBQUcsQ0FBQ2QsV0FBVyxHQUFHUCxJQUFJLENBQUNrQixZQUFZO1VBQ25DRyxHQUFHLENBQUNaLEtBQUssR0FBR1QsSUFBSSxDQUFDbUIsTUFBTTtVQUN2QkUsR0FBRyxDQUFDTCxRQUFRLEdBQUdoQixJQUFJLENBQUNvQixTQUFTO1VBQzdCM0osRUFBRSxDQUFDNkosSUFBSSxDQUFDO1lBQUVDLFFBQVEsRUFBRSxJQUFJO1lBQUVwQixRQUFRLEVBQUVILElBQUksQ0FBQ087VUFBWSxDQUFDLENBQUM7VUFDdkQ5SSxFQUFFLENBQUMrSixLQUFLLENBQUMsWUFBWTtZQUNwQi9KLEVBQUUsQ0FBQ2tJLEtBQUssQ0FBQyxDQUFDLENBQUNlLE9BQU8sQ0FBQyxVQUFVcEYsSUFBSSxFQUFFO2NBQ2xDLElBQUlyRSxnQkFBZ0IsQ0FBQzBKLFlBQVksQ0FBQ3JGLElBQUksQ0FBQyxFQUFFO2dCQUN4Q0EsSUFBSSxDQUFDSyxJQUFJLENBQUMsT0FBTyxFQUFFcUUsSUFBSSxDQUFDUyxLQUFLLENBQUNuRixJQUFJLENBQUNzRixFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUM7Y0FDMUM7WUFDRCxDQUFDLENBQUM7VUFDSCxDQUFDLENBQUM7VUFDRm5KLEVBQUUsQ0FBQ3VFLEdBQUcsQ0FBQ2dFLElBQUksQ0FBQ2dCLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztVQUM1QnZKLEVBQUUsQ0FBQ3dFLElBQUksQ0FBQytELElBQUksQ0FBQ2dCLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMvQjtNQUNELENBQUMsQ0FBQztNQUVGdkosRUFBRSxDQUFDNEcsRUFBRSxDQUFDLFlBQVksRUFBRSxVQUFVaEQsS0FBSyxFQUFFO1FBQ3BDO0FBQ0o7QUFDQTtBQUNBO0FBQ0E7QUFDQTtRQUNJLElBQUlBLEtBQUssQ0FBQ29HLE1BQU0sQ0FBQ2pLLE9BQU8sQ0FBQ3VJLElBQUksS0FBSyxRQUFRLElBQUkxRSxLQUFLLENBQUNvRyxNQUFNLENBQUNqSyxPQUFPLENBQUN1SSxJQUFJLEtBQUssTUFBTSxFQUFFO1VBQUU7VUFDckYsSUFBSTdJLGNBQWMsQ0FBQ3dLLFlBQVksS0FBSyxJQUFJLElBQUksRUFBRWpLLEVBQUUsQ0FBQ2tJLEtBQUssQ0FBQyxDQUFDLENBQUNNLE1BQU0sR0FBRyxJQUFJLElBQUl4SSxFQUFFLENBQUNrSyxLQUFLLENBQUMsQ0FBQyxDQUFDMUIsTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFO1lBQ3BHaEosZ0JBQWdCLENBQUMySyxpQ0FBaUMsQ0FBQyxDQUFDO1VBQ3JEO1FBQ0Q7TUFDRCxDQUFDLENBQUM7TUFFRmpMLENBQUMsQ0FBQ2dILFFBQVEsQ0FBQyxDQUFDVSxFQUFFLENBQUMsZ0JBQWdCLEVBQUUsVUFBVWhELEtBQUssRUFBRXdHLEdBQUcsRUFBRUMsZ0JBQWdCLEVBQUVDLFFBQVEsRUFBRTtRQUVsRjtRQUNBLElBQUlGLEdBQUcsSUFBSXBLLEVBQUUsRUFBRTtVQUNkO1FBQ0Q7UUFDQSxJQUFJdUssb0JBQW9CLEdBQUcsU0FBdkJBLG9CQUFvQkEsQ0FBYTFHLElBQUksRUFBRXdHLGdCQUFnQixFQUFFRyxVQUFVLEVBQUU7VUFDeEUsSUFBSUEsVUFBVSxJQUFJM0YsU0FBUyxFQUFFO1VBQzdCLElBQUloQixJQUFJLENBQUNLLElBQUksQ0FBQyxDQUFDLENBQUN1RyxpQkFBaUIsRUFBRTtZQUNsQztVQUNELENBQUMsTUFBTSxJQUFJNUcsSUFBSSxDQUFDNkcsUUFBUSxDQUFDLENBQUMsRUFBRTtZQUMzQjdHLElBQUksQ0FBQzhHLFFBQVEsQ0FBQyxDQUFDLENBQUMxQixPQUFPLENBQUMsVUFBVTJCLFNBQVMsRUFBRTtjQUM1Q0wsb0JBQW9CLENBQUNLLFNBQVMsRUFBRVAsZ0JBQWdCLEVBQUVHLFVBQVUsQ0FBQztZQUM5RCxDQUFDLENBQUM7VUFFSDtVQUVBM0csSUFBSSxDQUFDSyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDO1VBQ3BDTCxJQUFJLENBQUNLLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDLENBQUMsQ0FBQztVQUMvQjs7VUFFQSxJQUFJMkcsbUJBQW1CLEdBQUcsSUFBSTtVQUM5QixLQUFLLElBQUlySixDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUdxQyxJQUFJLENBQUNLLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDc0UsTUFBTSxFQUFFaEgsQ0FBQyxFQUFFLEVBQUU7WUFDNUQsSUFBSXNKLGNBQWMsR0FBR2pILElBQUksQ0FBQ0ssSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUMxQyxDQUFDLENBQUM7WUFDbkQsSUFBSTBELElBQUksR0FBRzRGLGNBQWMsQ0FBQzVGLElBQUk7WUFDOUIsSUFBSTZGLGFBQWEsR0FBR2xNLE9BQU8sQ0FBQzZGLGFBQWEsQ0FBQ3NHLGFBQWEsQ0FBQ0YsY0FBYyxFQUFFakgsSUFBSSxDQUFDO1lBQzdFZ0gsbUJBQW1CLEdBQUdBLG1CQUFtQixJQUFJRSxhQUFhO1VBQzNEO1VBQ0EsS0FBSyxJQUFJdkosQ0FBQyxHQUFHLENBQUMsRUFBRUEsQ0FBQyxHQUFHcUMsSUFBSSxDQUFDSyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQ3NFLE1BQU0sRUFBRWhILENBQUMsRUFBRSxFQUFFO1lBQzVELElBQUlzSixjQUFjLEdBQUdqSCxJQUFJLENBQUNLLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDMUMsQ0FBQyxDQUFDO1lBQ25ELElBQUkwRCxJQUFJLEdBQUc0RixjQUFjLENBQUM1RixJQUFJO1lBRzlCLElBQUksQ0FBQ21GLGdCQUFnQixLQUFLeEYsU0FBUyxJQUFJLENBQUN3RixnQkFBZ0IsS0FBS1EsbUJBQW1CLEVBQUU7Y0FDakYsSUFBSUksVUFBVSxHQUFHcE0sT0FBTyxDQUFDNkYsYUFBYSxDQUFDd0csc0JBQXNCLENBQUNKLGNBQWMsRUFBRTVGLElBQUksQ0FBQ3JFLENBQUMsR0FBR3FFLElBQUksQ0FBQ0MsQ0FBQyxHQUFHLENBQUMsRUFBRUQsSUFBSSxDQUFDbkUsQ0FBQyxHQUFHbUUsSUFBSSxDQUFDRyxDQUFDLEdBQUcsQ0FBQyxFQUFFbUYsVUFBVSxFQUFFM0csSUFBSSxDQUFDO2NBQ3pJaUgsY0FBYyxDQUFDNUYsSUFBSSxDQUFDckUsQ0FBQyxHQUFHb0ssVUFBVSxDQUFDcEssQ0FBQztjQUNwQ2lLLGNBQWMsQ0FBQzVGLElBQUksQ0FBQ25FLENBQUMsR0FBR2tLLFVBQVUsQ0FBQ2xLLENBQUM7Y0FDcEMrSixjQUFjLENBQUNLLFdBQVcsR0FBRyxJQUFJO2NBQ2pDLElBQUlDLFFBQVEsR0FBR04sY0FBYyxDQUFDaEYsVUFBVSxDQUFDLENBQUM7Y0FDMUMsSUFBSXVGLE9BQU8sR0FBR3hILElBQUksQ0FBQ0ssSUFBSSxDQUFDLGdCQUFnQixDQUFDO2NBQ3pDLElBQUksQ0FBQ21ILE9BQU8sQ0FBQ0QsUUFBUSxDQUFDLEVBQUU7Z0JBQUU7Z0JBQ3pCQyxPQUFPLENBQUNELFFBQVEsQ0FBQyxHQUFHdk0sT0FBTyxDQUFDeU0sYUFBYSxDQUFDQyxTQUFTLENBQUMxSCxJQUFJLEVBQUV1SCxRQUFRLENBQUM7Y0FDcEU7Y0FDQTtjQUNBdk0sT0FBTyxDQUFDeU0sYUFBYSxDQUFDRSxVQUFVLENBQUNILE9BQU8sQ0FBQ0QsUUFBUSxDQUFDLEVBQUVaLFVBQVUsRUFBRU0sY0FBYyxFQUFFakcsU0FBUyxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDbkcsQ0FBQyxNQUNJO2NBQ0osSUFBSSxDQUFDaEIsSUFBSSxDQUFDSyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsRUFBRTtnQkFBRTtnQkFDbkNMLElBQUksQ0FBQ0ssSUFBSSxDQUFDLGdCQUFnQixFQUFFLENBQUMsQ0FBQyxDQUFDO2NBQ2hDO2NBQ0EsSUFBSWtILFFBQVEsR0FBR3ZNLE9BQU8sQ0FBQ3lNLGFBQWEsQ0FBQ0csbUJBQW1CLENBQUM1SCxJQUFJLEVBQUU3RCxFQUFFLENBQUM7Y0FDbEUsSUFBSSxDQUFDNkQsSUFBSSxDQUFDSyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQ2tILFFBQVEsQ0FBQyxFQUFFO2dCQUMzQ3ZILElBQUksQ0FBQ0ssSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUNrSCxRQUFRLENBQUMsR0FBR3ZNLE9BQU8sQ0FBQ3lNLGFBQWEsQ0FBQ0MsU0FBUyxDQUFDMUgsSUFBSSxFQUFFdUgsUUFBUSxDQUFDO2NBQ3hGO2NBQ0EsSUFBSXBCLE1BQU0sR0FBR25HLElBQUksQ0FBQ0ssSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUNrSCxRQUFRLENBQUM7Y0FDbEROLGNBQWMsQ0FBQ2hGLFVBQVUsR0FBR3NGLFFBQVE7Y0FDcEMsUUFBUUEsUUFBUTtnQkFDZixLQUFLLEtBQUs7a0JBQUVOLGNBQWMsQ0FBQzVGLElBQUksQ0FBQ25FLENBQUMsR0FBRyxDQUFDO2tCQUFFO2dCQUN2QyxLQUFLLFFBQVE7a0JBQUUrSixjQUFjLENBQUM1RixJQUFJLENBQUNuRSxDQUFDLEdBQUcsR0FBRztrQkFBRTtnQkFDNUMsS0FBSyxNQUFNO2tCQUFFK0osY0FBYyxDQUFDNUYsSUFBSSxDQUFDckUsQ0FBQyxHQUFHLENBQUM7a0JBQUU7Z0JBQ3hDLEtBQUssT0FBTztrQkFBRWlLLGNBQWMsQ0FBQzVGLElBQUksQ0FBQ3JFLENBQUMsR0FBRyxHQUFHO2tCQUFFO2NBQzVDO2NBQ0FoQyxPQUFPLENBQUN5TSxhQUFhLENBQUNFLFVBQVUsQ0FBQ3hCLE1BQU0sRUFBRVEsVUFBVSxFQUFFTSxjQUFjLENBQUM7WUFDckU7VUFFRDtVQUVBLElBQUlULGdCQUFnQixLQUFLLElBQUksRUFBRTtZQUM5QixJQUFJcUIsU0FBUyxHQUFHN00sT0FBTyxDQUFDeU0sYUFBYSxDQUFDSyxRQUFRLENBQUM5SCxJQUFJLEVBQUU3RCxFQUFFLENBQUM7WUFDeEQsSUFBSTBMLFNBQVMsS0FBSzdHLFNBQVMsSUFBSTZHLFNBQVMsQ0FBQ2xELE1BQU0sR0FBRyxDQUFDLEVBQUU7Y0FDcEQzSixPQUFPLENBQUN5TSxhQUFhLENBQUNNLFFBQVEsQ0FBQy9ILElBQUksRUFBRTdELEVBQUUsRUFBRTBMLFNBQVMsQ0FBQztZQUNwRDtVQUNEO1FBRUQsQ0FBQztRQUNEO1FBQ0E7O1FBRUE7UUFDQTFMLEVBQUUsQ0FBQ29HLEtBQUssQ0FBQyxDQUFDLENBQUNzQixNQUFNLENBQUMsQ0FBQztRQUNuQjs7UUFFQTtRQUNBLElBQUksRUFBRTFILEVBQUUsQ0FBQ2tJLEtBQUssQ0FBQyxDQUFDLENBQUNNLE1BQU0sR0FBRyxJQUFJLElBQUl4SSxFQUFFLENBQUNrSyxLQUFLLENBQUMsQ0FBQyxDQUFDMUIsTUFBTSxHQUFHLElBQUksQ0FBQyxFQUFFO1VBQzVEeEksRUFBRSxDQUFDa0ksS0FBSyxDQUFDLENBQUMsQ0FBQ2UsT0FBTyxDQUFDLFVBQVVwRixJQUFJLEVBQUU7WUFDbEMwRyxvQkFBb0IsQ0FBQzFHLElBQUksRUFBRXdHLGdCQUFnQixFQUFFckssRUFBRSxDQUFDO1VBQ2pELENBQUMsQ0FBQztRQUNIO1FBRUEsSUFBSXNLLFFBQVEsRUFBRTtVQUNiQSxRQUFRLENBQUMsQ0FBQztRQUNYOztRQUVBO01BQ0QsQ0FBQyxDQUFDO0lBQ0g7SUFFQSxJQUFJdUIsY0FBYyxHQUFHLFNBQVM7SUFDOUIsSUFBSUMsY0FBYyxHQUFHM00sU0FBUyxDQUFDNE0sVUFBVSxDQUFDLENBQUMsQ0FDekNDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FDaEJDLEdBQUcsQ0FBQztNQUNKLGFBQWEsRUFBRSxRQUFRO01BQ3ZCLGFBQWEsRUFBRSxRQUFRO01BQ3ZCLGNBQWMsRUFBRSxDQUFDO01BQ2pCLFNBQVMsRUFBRSxDQUFDO01BQ1osU0FBUyxFQUFFO0lBQ1osQ0FBQyxDQUFDLENBQ0RELFFBQVEsQ0FBQyxhQUFhLENBQUMsQ0FDdkJDLEdBQUcsQ0FBQztNQUNKLE9BQU8sRUFBRSxTQUFBQyxNQUFVQyxHQUFHLEVBQUU7UUFDdkIsT0FBTzNNLGdCQUFnQixDQUFDNE0sVUFBVSxDQUFDRCxHQUFHLENBQUM7TUFDeEMsQ0FBQztNQUNELFNBQVMsRUFBRSxTQUFBbEcsUUFBVWtHLEdBQUcsRUFBRTtRQUN6QixPQUFPM00sZ0JBQWdCLENBQUM2TSxpQkFBaUIsQ0FBQ0YsR0FBRyxDQUFDO01BQy9DLENBQUM7TUFDRCxXQUFXLEVBQUUsU0FBQUcsU0FBVUgsR0FBRyxFQUFFO1FBQzNCO1FBQ0E7UUFDQTtRQUNBLElBQUlJLEdBQUcsR0FBR3hNLE9BQU8sQ0FBQ3lNLG9DQUFvQztRQUN0RCxJQUFJQyxNQUFNLEdBQUcsT0FBT0YsR0FBRyxLQUFLLFVBQVUsR0FBR0EsR0FBRyxDQUFDLENBQUMsR0FBR0EsR0FBRztRQUVwRCxJQUFJLENBQUNFLE1BQU0sSUFBSU4sR0FBRyxDQUFDakksSUFBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJVyxTQUFTLEVBQUU7VUFDbEQsT0FBT3NILEdBQUcsQ0FBQ2pJLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDN0I7UUFFQSxPQUFPMUUsZ0JBQWdCLENBQUNrTixnQkFBZ0IsQ0FBQ1AsR0FBRyxDQUFDO01BQzlDO0lBQ0QsQ0FBQyxDQUFDLENBQ0RILFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxDQUNwQzVGLEtBQUssQ0FBQztNQUNOLGFBQWEsRUFBRSxTQUFBdUcsV0FBVVIsR0FBRyxFQUFFO1FBQzdCLE9BQU9BLEdBQUcsQ0FBQ2pJLElBQUksQ0FBQyxhQUFhLENBQUM7TUFDL0I7SUFDRCxDQUFDLENBQUMsQ0FDRDhILFFBQVEsQ0FBQyx5QkFBeUIsQ0FBQyxDQUNuQzVGLEtBQUssQ0FBQztNQUNOLFlBQVksRUFBRSxTQUFBd0csVUFBVVQsR0FBRyxFQUFFO1FBQzVCLE9BQU9BLEdBQUcsQ0FBQ2pJLElBQUksQ0FBQyxZQUFZLENBQUM7TUFDOUI7SUFDRCxDQUFDLENBQUMsQ0FDRDhILFFBQVEsQ0FBQywwQkFBMEIsQ0FBQyxDQUNwQzVGLEtBQUssQ0FBQztNQUNOLGFBQWEsRUFBRSxTQUFBeUcsV0FBVVYsR0FBRyxFQUFFO1FBQzdCLE9BQU9BLEdBQUcsQ0FBQ2pJLElBQUksQ0FBQyxhQUFhLENBQUM7TUFDL0I7SUFDRCxDQUFDLENBQUMsQ0FDRDhILFFBQVEsQ0FBQyxvQkFBb0IsQ0FBQyxDQUM5QjVGLEtBQUssQ0FBQztNQUNOLE9BQU8sRUFBRSxTQUFBMEcsTUFBVVgsR0FBRyxFQUFFO1FBQ3ZCLE9BQU9BLEdBQUcsQ0FBQ2pJLElBQUksQ0FBQyxPQUFPLENBQUM7TUFDekI7SUFDRCxDQUFDLENBQUMsQ0FDRDhILFFBQVEsQ0FBQywrQkFBK0IsQ0FBQyxDQUN6QzVGLEtBQUssQ0FBQztNQUNOLGtCQUFrQixFQUFFLFNBQUEyRyxnQkFBVVosR0FBRyxFQUFFO1FBQ2xDLE9BQU9BLEdBQUcsQ0FBQ2pJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztNQUNwQztJQUNELENBQUMsQ0FBQyxDQUNEOEgsUUFBUSxDQUFDLGlDQUFpQyxDQUFDLENBQzNDNUYsS0FBSyxDQUFDO01BQ04sb0JBQW9CLEVBQUUsU0FBQTRHLGtCQUFVYixHQUFHLEVBQUU7UUFDcEMsT0FBT0EsR0FBRyxDQUFDakksSUFBSSxDQUFDLG9CQUFvQixDQUFDO01BQ3RDO0lBQ0QsQ0FBQyxDQUFDLENBQ0Q4SCxRQUFRLENBQUMsMkJBQTJCLENBQUMsQ0FDckM1RixLQUFLLENBQUM7TUFDTixjQUFjLEVBQUUsU0FBQTZHLFlBQVVkLEdBQUcsRUFBRTtRQUM5QixPQUFPQSxHQUFHLENBQUNqSSxJQUFJLENBQUMsY0FBYyxDQUFDO01BQ2hDO0lBQ0QsQ0FBQyxDQUFDLENBQ0Q4SCxRQUFRLENBQUMsMkJBQTJCLENBQUMsQ0FDckM1RixLQUFLLENBQUM7TUFDTixjQUFjLEVBQUUsU0FBQThHLFlBQVVmLEdBQUcsRUFBRTtRQUM5QixPQUFPQSxHQUFHLENBQUNqSSxJQUFJLENBQUMsY0FBYyxDQUFDO01BQ2hDO0lBQ0QsQ0FBQyxDQUFDLENBQ0Q4SCxRQUFRLENBQUMsd0JBQXdCLENBQUMsQ0FDbEM1RixLQUFLLENBQUM7TUFDTixXQUFXLEVBQUUsU0FBQStHLFNBQVVoQixHQUFHLEVBQUU7UUFDM0IsSUFBSUksR0FBRyxHQUFHeE0sT0FBTyxDQUFDcU4sZ0JBQWdCO1FBQ2xDLElBQUlDLEtBQUssR0FBRyxPQUFPZCxHQUFHLEtBQUssVUFBVSxHQUFHQSxHQUFHLENBQUMsQ0FBQyxHQUFHQSxHQUFHO1FBQ25ELElBQUljLEtBQUssRUFBRTtVQUNWLE9BQU8sVUFBVTtRQUNsQjtRQUNBLE9BQU9sQixHQUFHLENBQUNqSSxJQUFJLENBQUMsV0FBVyxDQUFDO01BQzdCO0lBQ0QsQ0FBQyxDQUFDLENBQ0Q4SCxRQUFRLENBQUMsTUFBTSxDQUFDLENBQ2hCNUYsS0FBSyxDQUFDO01BQ04sZ0JBQWdCLEVBQUUsU0FBQWtILGFBQVVuQixHQUFHLEVBQUU7UUFDaEMsSUFBSUksR0FBRyxHQUFHeE0sT0FBTyxDQUFDcU4sZ0JBQWdCO1FBQ2xDLElBQUlDLEtBQUssR0FBRyxPQUFPZCxHQUFHLEtBQUssVUFBVSxHQUFHQSxHQUFHLENBQUMsQ0FBQyxHQUFHQSxHQUFHO1FBQ25ELElBQUljLEtBQUssRUFBRTtVQUNWLE9BQU9sQixHQUFHLENBQUNvQixLQUFLLENBQUMsQ0FBQztRQUNuQjtRQUNBLE9BQU8sUUFBUTtNQUNoQjtJQUNELENBQUMsQ0FBQyxDQUNEdkIsUUFBUSxDQUFDLHlCQUF5QixDQUFDLENBQ25DNUYsS0FBSyxDQUFDO01BQ04sWUFBWSxFQUFFLFNBQUFvSCxVQUFVckIsR0FBRyxFQUFFO1FBQzVCLE9BQU9BLEdBQUcsQ0FBQ2pJLElBQUksQ0FBQyxZQUFZLENBQUM7TUFDOUIsQ0FBQztNQUNELG9CQUFvQixFQUFFLFNBQUF1SixpQkFBVXRCLEdBQUcsRUFBRTtRQUNwQyxPQUFPQSxHQUFHLENBQUNqSSxJQUFJLENBQUMsWUFBWSxDQUFDO01BQzlCLENBQUM7TUFDRCxvQkFBb0IsRUFBRSxTQUFBd0osaUJBQVV2QixHQUFHLEVBQUU7UUFDcEMsT0FBT0EsR0FBRyxDQUFDakksSUFBSSxDQUFDLFlBQVksQ0FBQztNQUM5QjtJQUNELENBQUMsQ0FBQyxDQUNEOEgsUUFBUSxDQUFDLG9CQUFvQixDQUFDLENBQzlCNUYsS0FBSyxDQUFDO01BQ04sT0FBTyxFQUFFLFNBQUFtSCxNQUFVcEIsR0FBRyxFQUFFO1FBQ3ZCLE9BQU9BLEdBQUcsQ0FBQ2pJLElBQUksQ0FBQyxPQUFPLENBQUM7TUFDekI7SUFDRCxDQUFDLENBQUMsQ0FDRDhILFFBQVEsQ0FBQyxrT0FBa08sQ0FBQyxDQUM1T0MsR0FBRyxDQUFDO01BQ0osc0JBQXNCLEVBQUUsU0FBQTBCLG1CQUFVeEIsR0FBRyxFQUFFO1FBQ3RDLElBQUkxTSxjQUFjLENBQUN3SyxZQUFZLEtBQUssSUFBSSxJQUFJa0MsR0FBRyxDQUFDakksSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDc0UsTUFBTSxLQUFLLENBQUMsRUFBRTtVQUMzRTtVQUNBLElBQUlvRixJQUFJLEdBQUd6QixHQUFHLENBQUNqSSxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1VBQy9CO1VBQ0EsSUFBSXBDLFdBQVcsR0FBRzhMLElBQUksQ0FBQy9NLENBQUMsS0FBSyxDQUFDLEdBQUcsVUFBVSxHQUFHLFlBQVk7VUFDMUQ7VUFDQSxJQUFJZSxPQUFPLEdBQUdFLFdBQVcsS0FBSyxVQUFVLEdBQUcsRUFBRSxHQUFHbkIsSUFBSSxDQUFDa04sR0FBRyxDQUFDRCxJQUFJLENBQUM3TSxDQUFDLENBQUMsR0FBRyxFQUFFLEdBQUdKLElBQUksQ0FBQ2tOLEdBQUcsQ0FBQ0QsSUFBSSxDQUFDL00sQ0FBQyxDQUFDO1VBQ3hGO1VBQ0EsSUFBSWlOLE1BQU0sR0FBRzNCLEdBQUcsQ0FBQ2pJLElBQUksQ0FBQyxPQUFPLENBQUM7VUFDOUI7VUFDQSxJQUFJckMsSUFBSSxHQUFHaU0sTUFBTSxDQUFDQyxRQUFRLENBQUMsU0FBUyxDQUFDLEdBQUcsV0FBVyxHQUFHLFFBQVE7O1VBRTlEO1VBQ0EsT0FBT3JNLDJCQUEyQixDQUFDLElBQUksRUFBRUUsT0FBTyxFQUFFQyxJQUFJLEVBQUVDLFdBQVcsQ0FBQztRQUNyRTs7UUFFQTtRQUNBLE9BQU8sZUFBZTtNQUN2QjtJQUNELENBQUMsQ0FBQyxDQUNEa0ssUUFBUSxDQUFDLGdDQUFnQyxDQUFDLENBQzFDQyxHQUFHLENBQUM7TUFDSixzQkFBc0IsRUFBRTtJQUN6QixDQUFDLENBQUMsQ0FDREQsUUFBUSxDQUFDLG1CQUFtQixDQUFDLENBQzdCQyxHQUFHLENBQUM7TUFDSixzQkFBc0IsRUFBRTtJQUN6QixDQUFDLENBQUMsQ0FDREQsUUFBUSxDQUFDLCtCQUErQixDQUFDLENBQUM7SUFBQSxDQUMxQ0MsR0FBRyxDQUFDO01BQ0osYUFBYSxFQUFFLFFBQVE7TUFDdkIsYUFBYSxFQUFFLFFBQVE7TUFDdkIsZUFBZSxFQUFFek0sZ0JBQWdCLENBQUN3TyxnQkFBZ0I7TUFDbEQsU0FBUyxFQUFFeE8sZ0JBQWdCLENBQUN5TyxpQkFBaUI7TUFDN0MsNEJBQTRCLEVBQUU7SUFDL0IsQ0FBQyxDQUFDLENBQ0RqQyxRQUFRLENBQUMsMkJBQTJCLENBQUMsQ0FDckNDLEdBQUcsQ0FBQztNQUNKLGFBQWEsRUFBRSxRQUFRO01BQ3ZCLGFBQWEsRUFBRSxRQUFRO01BQ3ZCLGVBQWUsRUFBRSxDQUFDLENBQUMsR0FBR2xNLE9BQU8sQ0FBQ21PLHVCQUF1QjtNQUNyRCw0QkFBNEIsRUFBRTtJQUMvQixDQUFDLENBQUMsQ0FDRGxDLFFBQVEsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUM1Q0MsR0FBRyxDQUFDO01BQ0osU0FBUyxFQUFFLFNBQUFrQyxRQUFBLEVBQVk7UUFDdEIsT0FBTzFPLGNBQWMsQ0FBQzJPLG1CQUFtQixDQUFDLENBQUMsR0FBR3JPLE9BQU8sQ0FBQ21PLHVCQUF1QjtNQUM5RTtJQUNELENBQUMsQ0FBQyxDQUNEbEMsUUFBUSxDQUFDLHNCQUFzQixDQUFDLENBQ2hDQyxHQUFHLENBQUM7TUFDSixhQUFhLEVBQUUsUUFBUTtNQUN2QixhQUFhLEVBQUUsUUFBUTtNQUN2QixlQUFlLEVBQUUsQ0FBQyxDQUFDLEdBQUdsTSxPQUFPLENBQUNtTyx1QkFBdUI7TUFDckQsNEJBQTRCLEVBQUU7SUFDL0IsQ0FBQyxDQUFDLENBQ0RsQyxRQUFRLENBQUMsc0RBQXNELENBQUMsQ0FDaEVDLEdBQUcsQ0FBQztNQUNKLFNBQVMsRUFBRSxTQUFBa0MsUUFBQSxFQUFZO1FBQ3RCLE9BQU8xTyxjQUFjLENBQUMyTyxtQkFBbUIsQ0FBQyxDQUFDLEdBQUdyTyxPQUFPLENBQUNtTyx1QkFBdUI7TUFDOUU7SUFDRCxDQUFDLENBQUMsQ0FDRGxDLFFBQVEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUNoQ0MsR0FBRyxDQUFDO01BQ0osT0FBTyxFQUFFLGNBQWM7TUFDdkIsUUFBUSxFQUFFO0lBQ1gsQ0FBQyxDQUFDLENBQ0RELFFBQVEsQ0FBQyx3QkFBd0IsQ0FBQyxDQUNsQ0MsR0FBRyxDQUFDO01BQ0osWUFBWSxFQUFFLFNBQUFvQyxVQUFVbEMsR0FBRyxFQUFFO1FBQzVCLElBQUkxTSxjQUFjLENBQUM2Tyx1QkFBdUIsRUFBRTtVQUMzQyxPQUFPbkMsR0FBRyxDQUFDakksSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUM3QjtRQUVBLE9BQU8sQ0FBQztNQUNUO0lBQ0QsQ0FBQyxDQUFDLENBQ0Q4SCxRQUFRLENBQUMsK0JBQStCLENBQUMsQ0FDekNDLEdBQUcsQ0FBQztNQUNKLHFCQUFxQixFQUFFLFNBQUFzQyxpQkFBVXBDLEdBQUcsRUFBRTtRQUNyQyxJQUFJcUMsR0FBRyxHQUFHQyxVQUFVLENBQUN0QyxHQUFHLENBQUNqSSxJQUFJLENBQUMsa0JBQWtCLENBQUMsQ0FBQztRQUNsRCxPQUFPLENBQUNzSyxHQUFHLElBQUksQ0FBQyxHQUFHQSxHQUFHLEdBQUcsR0FBRyxJQUFJLEdBQUc7TUFDcEM7SUFDRCxDQUFDLENBQUMsQ0FDRHhDLFFBQVEsQ0FBQyxrQ0FBa0MsQ0FBQyxDQUM1Q0MsR0FBRyxDQUFDO01BQ0osd0JBQXdCLEVBQUUsU0FBQXlDLG9CQUFVdkMsR0FBRyxFQUFFO1FBQ3hDLElBQUlxQyxHQUFHLEdBQUdDLFVBQVUsQ0FBQ3RDLEdBQUcsQ0FBQ2pJLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO1FBQ3JELE9BQU8sQ0FBQ3NLLEdBQUcsSUFBSSxDQUFDLEdBQUdBLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRztNQUNwQztJQUNELENBQUMsQ0FBQyxDQUNEeEMsUUFBUSxDQUFDLHVCQUF1QixDQUFDLENBQ2pDQyxHQUFHLENBQUM7TUFDSixXQUFXLEVBQUUsU0FBQTBDLFNBQVV4QyxHQUFHLEVBQUU7UUFDM0IsSUFBSTFNLGNBQWMsQ0FBQzZPLHVCQUF1QixFQUFFO1VBQzNDLE9BQU9uQyxHQUFHLENBQUNqSSxJQUFJLENBQUMsVUFBVSxDQUFDO1FBQzVCO1FBRUEsT0FBTyxDQUFDO01BQ1Q7SUFDRCxDQUFDLENBQUMsQ0FDRDhILFFBQVEsQ0FBQywrQkFBK0IsQ0FBQyxDQUN6Q0MsR0FBRyxDQUFDO01BQ0oscUJBQXFCLEVBQUUsU0FBQTJDLGlCQUFVekMsR0FBRyxFQUFFO1FBQ3JDLElBQUlxQyxHQUFHLEdBQUdDLFVBQVUsQ0FBQ3RDLEdBQUcsQ0FBQ2pJLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO1FBQ2xELE9BQU8sQ0FBQ3NLLEdBQUcsSUFBSSxDQUFDLEdBQUdBLEdBQUcsR0FBRyxHQUFHLElBQUksR0FBRztNQUNwQztJQUNELENBQUMsQ0FBQyxDQUNEeEMsUUFBUSxDQUFDLGdDQUFnQyxDQUFDLENBQzFDQyxHQUFHLENBQUM7TUFDSixzQkFBc0IsRUFBRSxTQUFBNEMsa0JBQVUxQyxHQUFHLEVBQUU7UUFDdEMsSUFBSXFDLEdBQUcsR0FBR0MsVUFBVSxDQUFDdEMsR0FBRyxDQUFDakksSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUM7UUFDbkQsT0FBTyxDQUFDc0ssR0FBRyxJQUFJLENBQUMsR0FBR0EsR0FBRyxHQUFHLEdBQUcsSUFBSSxHQUFHO01BQ3BDO0lBQ0QsQ0FBQyxDQUFDLENBQ0R4QyxRQUFRLENBQUMsd0NBQXdDLENBQUMsQ0FDbERDLEdBQUcsQ0FBQztNQUNKLGNBQWMsRUFBRTtJQUNqQixDQUFDO0lBQ0Q7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQUEsQ0FDQ0QsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUN2QkMsR0FBRyxDQUFDO01BQ0osb0JBQW9CLEVBQUUsR0FBRztNQUFFLGVBQWUsRUFBRUosY0FBYztNQUMxRCxpQkFBaUIsRUFBRTtJQUNwQixDQUFDLENBQUMsQ0FDREcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUNoQkMsR0FBRyxDQUFDO01BQ0osYUFBYSxFQUFFLFFBQVE7TUFDdkIsbUJBQW1CLEVBQUUsU0FBQTZDLGdCQUFVM0MsR0FBRyxFQUFFO1FBQ25DLE9BQU8zTSxnQkFBZ0IsQ0FBQ3VQLG9CQUFvQixDQUFDNUMsR0FBRyxDQUFDO01BQ2xELENBQUM7TUFDRCxtQkFBbUIsRUFBRSxRQUFRO01BQzdCLG1CQUFtQixFQUFFLFNBQUE2QyxnQkFBVTdDLEdBQUcsRUFBRTtRQUNuQyxJQUFJQSxHQUFHLENBQUM4QyxRQUFRLENBQUMsQ0FBQyxFQUFFO1VBQ25CLE9BQU9wRCxjQUFjO1FBQ3RCO1FBQ0EsT0FBT00sR0FBRyxDQUFDRixHQUFHLENBQUMsWUFBWSxDQUFDO01BQzdCLENBQUM7TUFDRCxPQUFPLEVBQUUsU0FBQWEsTUFBVVgsR0FBRyxFQUFFO1FBQ3ZCLElBQUlBLEdBQUcsQ0FBQzhDLFFBQVEsQ0FBQyxDQUFDLEVBQUU7VUFDbkIsT0FBT3BELGNBQWM7UUFDdEI7UUFDQSxPQUFPTSxHQUFHLENBQUNGLEdBQUcsQ0FBQyxZQUFZLENBQUM7TUFDN0IsQ0FBQztNQUNELGFBQWEsRUFBRTtJQUNoQixDQUFDLENBQUMsQ0FDREQsUUFBUSxDQUFDLG1DQUFtQyxDQUFDLENBQzdDQyxHQUFHLENBQUM7TUFDSixZQUFZLEVBQUUsU0FBUztNQUN2QixvQkFBb0IsRUFBRSxTQUFTO01BQy9CLG9CQUFvQixFQUFFO0lBQ3ZCLENBQUM7SUFDRDtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFDQTtJQUNBO0lBQ0E7SUFBQSxDQUNDRCxRQUFRLENBQUMsYUFBYSxDQUFDLENBQ3ZCQyxHQUFHLENBQUM7TUFDSixvQkFBb0IsRUFBRSxHQUFHO01BQUUsZUFBZSxFQUFFSixjQUFjO01BQzFELGlCQUFpQixFQUFFO0lBQ3BCLENBQUMsQ0FBQyxDQUNERyxRQUFRLENBQUMsdUJBQXVCLENBQUMsQ0FDakNDLEdBQUcsQ0FBQztNQUNKLGVBQWUsRUFBRSxZQUFZO01BQzdCLHVCQUF1QixFQUFFLFdBQVc7TUFDcEMscUJBQXFCLEVBQUUsR0FBRztNQUMxQixtQkFBbUIsRUFBRSxHQUFHO01BQ3hCLHVCQUF1QixFQUFFLE9BQU87TUFDaEMseUJBQXlCLEVBQUU7SUFDNUIsQ0FBQyxDQUFDLENBQ0RELFFBQVEsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUN0REMsR0FBRyxDQUFDO01BQ0osY0FBYyxFQUFFLFNBQUFpRCxZQUFVL0MsR0FBRyxFQUFFO1FBQzlCLE9BQU8sRUFBRSxHQUFHQSxHQUFHLENBQUNqSSxJQUFJLENBQUMsYUFBYSxDQUFDO01BQ3BDLENBQUM7TUFDRCxzQkFBc0IsRUFBRSxLQUFLO01BQzdCLG9CQUFvQixFQUFFLElBQUk7TUFDMUIsV0FBVyxFQUFFO0lBQ2QsQ0FBQyxDQUFDLENBQ0Q4SCxRQUFRLENBQUMsMkNBQTJDLENBQUMsQ0FDckRDLEdBQUcsQ0FBQztNQUNKLGNBQWMsRUFBRSxTQUFBa0QsWUFBVWhELEdBQUcsRUFBRTtRQUM5QixPQUFPLEVBQUUsR0FBR0EsR0FBRyxDQUFDakksSUFBSSxDQUFDLGFBQWEsQ0FBQztNQUNwQyxDQUFDO01BQ0Qsc0JBQXNCLEVBQUUsS0FBSztNQUM3QixvQkFBb0IsRUFBRSxJQUFJO01BQzFCLFdBQVcsRUFBRTtJQUNkLENBQUMsQ0FBQyxDQUNEOEgsUUFBUSxDQUFDLGFBQWEsQ0FBQyxDQUN2QkMsR0FBRyxDQUFDO01BQ0osb0JBQW9CLEVBQUUsU0FBQW1ELGlCQUFVakQsR0FBRyxFQUFFO1FBQ3BDLE9BQU8zTSxnQkFBZ0IsQ0FBQzZQLGVBQWUsQ0FBQ2xELEdBQUcsQ0FBQztNQUM3QyxDQUFDO01BQ0Qsb0JBQW9CLEVBQUUsTUFBTTtNQUM1QixpQkFBaUIsRUFBRSxTQUFBbUQsZUFBVW5ELEdBQUcsRUFBRTtRQUNqQyxPQUFPM00sZ0JBQWdCLENBQUMrUCxXQUFXLENBQUNwRCxHQUFHLEVBQUUsUUFBUSxDQUFDO01BQ25ELENBQUM7TUFDRCxpQkFBaUIsRUFBRSxTQUFBcUQsZUFBVXJELEdBQUcsRUFBRTtRQUNqQyxPQUFPM00sZ0JBQWdCLENBQUMrUCxXQUFXLENBQUNwRCxHQUFHLEVBQUUsUUFBUSxDQUFDO01BQ25ELENBQUM7TUFDRCxZQUFZLEVBQUUsU0FBQXNELFVBQVV0RCxHQUFHLEVBQUU7UUFDNUIsT0FBTzNNLGdCQUFnQixDQUFDa1EsaUJBQWlCLENBQUN2RCxHQUFHLENBQUM7TUFDL0MsQ0FBQztNQUNELG1CQUFtQixFQUFFLFNBQUF3RCxnQkFBVXhELEdBQUcsRUFBRTtRQUNuQyxPQUFPM00sZ0JBQWdCLENBQUNvUSxxQkFBcUIsQ0FBQ3pELEdBQUcsQ0FBQztNQUNuRDtJQUNELENBQUMsQ0FBQyxDQUNESCxRQUFRLENBQUMsTUFBTSxDQUFDLENBQ2hCQyxHQUFHLENBQUM7TUFDSixxQkFBcUIsRUFBRUosY0FBYztNQUNyQyx1QkFBdUIsRUFBRSxLQUFLO01BQUUsNEJBQTRCLEVBQUVBO0lBQy9ELENBQUMsQ0FBQztJQUVILElBQUlnRSxvQkFBb0IsR0FBRzNRLENBQUMsQ0FBQ2EsT0FBTyxDQUFDK1Asd0JBQXdCLENBQUM7O0lBRTlEO0lBQ0EzUSxTQUFTLENBQUM7TUFDVDRRLFNBQVMsRUFBRUYsb0JBQW9CO01BQy9CekosS0FBSyxFQUFFMEYsY0FBYztNQUNyQmtFLFdBQVcsRUFBRSxLQUFLO01BQUVDLE9BQU8sRUFBRSxLQUFLO01BQUVDLE9BQU8sRUFBRSxFQUFFO01BQy9DQyxtQkFBbUIsRUFBRSxJQUFJO01BQ3pCQyxVQUFVLEVBQUUsSUFBSTtNQUNoQkMsZ0JBQWdCLEVBQUUsR0FBRztNQUNyQkMsS0FBSyxFQUFFLFNBQUFBLE1BQUEsRUFBWTtRQUNsQnRRLEVBQUUsR0FBRyxJQUFJO1FBQ1Q7UUFDQSxJQUFJRCxPQUFPLENBQUN3USxRQUFRLEVBQUU7VUFDckJuTyx1QkFBdUIsQ0FBQyxDQUFDO1FBQzFCO1FBQ0EyRSxZQUFZLENBQUMsQ0FBQztNQUNmO0lBQ0QsQ0FBQyxDQUFDO0VBQ0gsQ0FBQztFQUVEOUcsY0FBYyxDQUFDdVEsS0FBSyxHQUFHLFlBQVk7SUFDbEMsT0FBT3hRLEVBQUU7RUFDVixDQUFDO0VBRUQsT0FBT0MsY0FBYztBQUN0QixDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2JnbnZpei8uL3NyYy9zYmduLWV4dGVuc2lvbnMvc2Jnbi1jeS1pbnN0YW5jZS1mYWN0b3J5LmpzPzE0OGEiXSwic291cmNlc0NvbnRlbnQiOlsidmFyIGNsYXNzZXMgPSByZXF1aXJlKCcuLi91dGlsaXRpZXMvY2xhc3NlcycpO1xudmFyIGxpYnMgPSByZXF1aXJlKCcuLi91dGlsaXRpZXMvbGliLXV0aWxpdGllcycpLmdldExpYnMoKTtcbnZhciBqUXVlcnkgPSAkID0gbGlicy5qUXVlcnk7XG52YXIgY3l0b3NjYXBlID0gbGlicy5jeXRvc2NhcGU7XG52YXIgVGlwcHkgPSBsaWJzLnRpcHB5O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuXG5cdHZhciBlbGVtZW50VXRpbGl0aWVzLCBncmFwaFV0aWxpdGllcywgbWFpblV0aWxpdGllcywgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMsIG9wdGlvblV0aWxpdGllcywgZXhwZXJpbWVudGFsRGF0YU92ZXJsYXk7XG5cdHZhciByZWZyZXNoUGFkZGluZ3MsIG9wdGlvbnMsIGN5O1xuXG5cdHZhciBzYmduQ3lJbnN0YW5jZSA9IGZ1bmN0aW9uIChwYXJhbSkge1xuXHRcdGVsZW1lbnRVdGlsaXRpZXMgPSBwYXJhbS5lbGVtZW50VXRpbGl0aWVzO1xuXHRcdGdyYXBoVXRpbGl0aWVzID0gcGFyYW0uZ3JhcGhVdGlsaXRpZXM7XG5cdFx0ZXhwZXJpbWVudGFsRGF0YU92ZXJsYXkgPSBwYXJhbS5leHBlcmltZW50YWxEYXRhT3ZlcmxheTtcblx0XHRtYWluVXRpbGl0aWVzID0gcGFyYW0ubWFpblV0aWxpdGllcztcblx0XHR1bmRvUmVkb0FjdGlvbkZ1bmN0aW9ucyA9IHBhcmFtLnVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zO1xuXHRcdHJlZnJlc2hQYWRkaW5ncyA9IGdyYXBoVXRpbGl0aWVzLnJlZnJlc2hQYWRkaW5ncy5iaW5kKGdyYXBoVXRpbGl0aWVzKTtcblxuXHRcdG9wdGlvblV0aWxpdGllcyA9IHBhcmFtLm9wdGlvblV0aWxpdGllcztcblx0XHRvcHRpb25zID0gb3B0aW9uVXRpbGl0aWVzLmdldE9wdGlvbnMoKTtcblxuXHRcdC8vIGN5ID0gcGFyYW0uc2JnbkN5SW5zdGFuY2UuZ2V0Q3koKTtcblxuXHRcdC8qXG5cdFx0ICogUmV0dXJucyB0aGUgY29vcmRpbmF0ZXMgb2YgdGhlIHBvaW50IGxvY2F0ZWQgb24gdGhlIGdpdmVuIGFuZ2xlIG9uIHRoZSBjaXJjbGUgd2l0aCB0aGUgZ2l2ZW4gY2VudGVyYWwgY29vcmRpbmF0ZXMgYW5kIHJhZGl1cy5cblx0XHQgKi9cblx0XHR2YXIgZ2V0UG9pbnRPbkNpcmNsZSA9IGZ1bmN0aW9uIChjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXMsIGFuZ2xlSW5EZWdyZWUpIHtcblx0XHRcdHZhciBhbmdsZUluUmFkaWFuID0gYW5nbGVJbkRlZ3JlZSAqIChNYXRoLlBJIC8gMTgwKTsgLy8gQ29udmVydCBkZWdyZWUgdG8gcmFkaWFuXG5cdFx0XHRyZXR1cm4ge1xuXHRcdFx0XHR4OiByYWRpdXMgKiBNYXRoLmNvcyhhbmdsZUluUmFkaWFuKSArIGNlbnRlclgsXG5cdFx0XHRcdHk6IC0xICogcmFkaXVzICogTWF0aC5zaW4oYW5nbGVJblJhZGlhbikgKyBjZW50ZXJZIC8vIFdlIG11bHRpcGx5IHdpdGggLTEgaGVyZSBiZWNhdXNlIEpTIHkgY29vcmRpbmF0ZSBzaWduIGlzIHRoZSBvcG9zaXRlIG9mIHRoZSBNYXRoYW1hdGljYWwgY29vcmRpbmF0ZXMgc3lzdGVtXG5cdFx0XHR9O1xuXHRcdH07XG5cblx0XHQvKlxuXHRcdCAqIEdlbmVyYXRlcyBhIHBvbHlnb24gc3RyaW5nIGFwcHJveGltYXRpbmcgYSBjaXJjbGUgd2l0aCBnaXZlbiBjZW50ZXIsIHJhZGl1cywgc3RhcnQsIGVuZCBhbmdsZXMgYW5kIG51bWJlciBvZiBwb2ludHMgdG8gcmVwcmVzZW50IHRoZSBjaXJjbGVcblx0XHQgKi9cblx0XHR2YXIgZ2VuZXJhdGVDaXJjbGVTdHJpbmcgPSBmdW5jdGlvbiAoY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzLCBhbmdsZUZyb20sIGFuZ2xlVG8sIG51bU9mUG9pbnRzKSB7XG5cdFx0XHR2YXIgY2lyY2xlU3RyID0gXCJcIjtcblx0XHRcdHZhciBzdGVwU2l6ZSA9IChhbmdsZVRvIC0gYW5nbGVGcm9tKSAvIG51bU9mUG9pbnRzOyAvLyBXZSB3aWxsIGluY3JlbWVudCB0aGUgY3VycmVudCBhbmdsZSBieSBzdGVwIHNpemUgaW4gZWFjaCBpdGVyYXRpb25cblx0XHRcdHZhciBjdXJyZW50QW5nbGUgPSBhbmdsZUZyb207IC8vIGN1cnJlbnQgYW5nbGUgd2lsbCBiZSB1cGRhdGVkIGluIGVhY2ggaXRlcmF0aW9uXG5cblx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbnVtT2ZQb2ludHM7IGkrKykge1xuXHRcdFx0XHR2YXIgcG9pbnQgPSBnZXRQb2ludE9uQ2lyY2xlKGNlbnRlclgsIGNlbnRlclksIHJhZGl1cywgY3VycmVudEFuZ2xlKTtcblx0XHRcdFx0Y3VycmVudEFuZ2xlICs9IHN0ZXBTaXplO1xuXHRcdFx0XHRjaXJjbGVTdHIgKz0gcG9pbnQueCArIFwiIFwiICsgcG9pbnQueSArIFwiIFwiO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gY2lyY2xlU3RyO1xuXHRcdH07XG5cblx0XHQvKlxuXHRcdCAqICBHZW5lcmF0ZXMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHByb2Nlc3Nlcy9sb2dpY2FsIG9wZXJhdG9ycyB3aXRoIHBvcnRzLlxuXHRcdCAqICBsaW5lSFc6IEhhbGYgd2lkdGggb2YgbGluZSB0aHJvdWdoIHRoZSBjaXJjbGUgdG8gdGhlIGludGVyc2VjdGlvbiBwb2ludFxuXHRcdCAqICBzaGFwZUhXOiBIYWxmIHdpZHRoIG9mIHRoZSBzaGFwZSBkaXNjbHVkaW5nIHRoZSBwb3J0cyAoSXQgaXMgcmFkaXVzIGZvciB0aGUgY2lyY3VsYXIgc2hhcGVzKVxuXHRcdCAqICB0eXBlOiBUeXBlIG9mIHRoZSBzaGFwZSBkaXNjbHVkaW5nIHRoZSBwb3J0cy4gT3B0aW9ucyBhcmUgJ2NpcmNsZScsICdyZWN0YW5nbGUnXG5cdFx0ICogIG9yaWVudGF0aW9uOiBPcmllbnRhdGlvbiBvZiB0aGUgcG9ydHMgT3B0aW9ucyBhcmUgJ2hvcml6b250YWwnLCAndmVydGljYWwnXG5cdFx0ICovXG5cblx0XHR2YXIgZ2VuZXJhdGVTaGFwZVdpdGhQb3J0U3RyaW5nID0gZnVuY3Rpb24gKGxpbmVIVywgc2hhcGVIVywgdHlwZSwgb3JpZW50YXRpb24pIHtcblx0XHRcdHZhciBwb2x5Z29uU3RyO1xuXHRcdFx0dmFyIG51bU9mUG9pbnRzID0gMzA7IC8vIE51bWJlciBvZiBwb2ludHMgdGhhdCBib3RoIGhhbHZlcyBvZiBjaXJjbGUgd2lsbCBoYXZlXG5cdFx0XHRpZiAob3JpZW50YXRpb24gPT09ICdob3Jpem9udGFsJykge1xuXHRcdFx0XHR2YXIgYWJvdmVQb2ludHMsIGJlbG93UG9pbnRzO1xuXG5cdFx0XHRcdGlmICh0eXBlID09PSAnY2lyY2xlJykge1xuXHRcdFx0XHRcdGFib3ZlUG9pbnRzID0gZ2VuZXJhdGVDaXJjbGVTdHJpbmcoMCwgMCwgc2hhcGVIVywgMTgwLCAwLCBudW1PZlBvaW50cyk7XG5cdFx0XHRcdFx0YmVsb3dQb2ludHMgPSBnZW5lcmF0ZUNpcmNsZVN0cmluZygwLCAwLCBzaGFwZUhXLCAzNjAsIDE4MCwgbnVtT2ZQb2ludHMpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgaWYgKHR5cGUgPT09ICdyZWN0YW5nbGUnKSB7XG5cdFx0XHRcdFx0YWJvdmVQb2ludHMgPSAnLScgKyBzaGFwZUhXICsgJyAtJyArIHNoYXBlSFcgKyAnICcgKyBzaGFwZUhXICsgJyAtJyArIHNoYXBlSFcgKyAnICc7XG5cdFx0XHRcdFx0YmVsb3dQb2ludHMgPSBzaGFwZUhXICsgJyAnICsgc2hhcGVIVyArICcgLScgKyBzaGFwZUhXICsgJyAnICsgc2hhcGVIVyArICcgJztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHBvbHlnb25TdHIgPSBcIi0xIC1cIiArIGxpbmVIVyArIFwiIC1cIiArIHNoYXBlSFcgKyBcIiAtXCIgKyBsaW5lSFcgKyBcIiBcIjtcblx0XHRcdFx0cG9seWdvblN0ciArPSBhYm92ZVBvaW50cztcblx0XHRcdFx0cG9seWdvblN0ciArPSBzaGFwZUhXICsgXCIgLVwiICsgbGluZUhXICsgXCIgMSAtXCIgKyBsaW5lSFcgKyBcIiAxIFwiICsgbGluZUhXICsgXCIgXCIgKyBzaGFwZUhXICsgXCIgXCIgKyBsaW5lSFcgKyBcIiBcIjtcblx0XHRcdFx0cG9seWdvblN0ciArPSBiZWxvd1BvaW50cztcblx0XHRcdFx0cG9seWdvblN0ciArPSBcIi1cIiArIHNoYXBlSFcgKyBcIiBcIiArIGxpbmVIVyArIFwiIC0xIFwiICsgbGluZUhXO1xuXHRcdFx0fVxuXHRcdFx0ZWxzZSB7XG5cdFx0XHRcdHZhciBsZWZ0UG9pbnRzLCByaWdodFBvaW50cztcblxuXHRcdFx0XHRpZiAodHlwZSA9PT0gJ2NpcmNsZScpIHtcblx0XHRcdFx0XHRsZWZ0UG9pbnRzID0gZ2VuZXJhdGVDaXJjbGVTdHJpbmcoMCwgMCwgc2hhcGVIVywgOTAsIDI3MCwgbnVtT2ZQb2ludHMpO1xuXHRcdFx0XHRcdHJpZ2h0UG9pbnRzID0gZ2VuZXJhdGVDaXJjbGVTdHJpbmcoMCwgMCwgc2hhcGVIVywgLTkwLCA5MCwgbnVtT2ZQb2ludHMpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGVsc2UgaWYgKHR5cGUgPT09ICdyZWN0YW5nbGUnKSB7XG5cdFx0XHRcdFx0bGVmdFBvaW50cyA9ICctJyArIHNoYXBlSFcgKyAnIC0nICsgc2hhcGVIVyArICcgLScgKyBzaGFwZUhXICsgJyAnICsgc2hhcGVIVyArICcgJztcblx0XHRcdFx0XHRyaWdodFBvaW50cyA9IHNoYXBlSFcgKyAnICcgKyBzaGFwZUhXICsgJyAnICsgc2hhcGVIVyArICcgLScgKyBzaGFwZUhXICsgJyAnO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cG9seWdvblN0ciA9IFwiLVwiICsgbGluZUhXICsgXCIgLVwiICsgMSArIFwiIC1cIiArIGxpbmVIVyArIFwiIC1cIiArIHNoYXBlSFcgKyBcIiBcIjtcblx0XHRcdFx0cG9seWdvblN0ciArPSBsZWZ0UG9pbnRzO1xuXHRcdFx0XHRwb2x5Z29uU3RyICs9IFwiLVwiICsgbGluZUhXICsgXCIgXCIgKyBzaGFwZUhXICsgXCIgLVwiICsgbGluZUhXICsgXCIgMSBcIiArIGxpbmVIVyArIFwiIDEgXCIgKyBsaW5lSFcgKyBcIiBcIiArIHNoYXBlSFcgKyBcIiBcIjtcblx0XHRcdFx0cG9seWdvblN0ciArPSByaWdodFBvaW50cztcblx0XHRcdFx0cG9seWdvblN0ciArPSBsaW5lSFcgKyBcIiAtXCIgKyBzaGFwZUhXICsgXCIgXCIgKyBsaW5lSFcgKyBcIiAtMVwiO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gcG9seWdvblN0cjtcblx0XHR9O1xuXG5cdFx0Ly8gTm90ZSB0aGF0IGluIENoaVNFIHRoaXMgZnVuY3Rpb24gaXMgaW4gYSBzZXBlcmF0ZSBmaWxlIGJ1dCBpbiB0aGUgdmlld2VyIGl0IGhhcyBqdXN0IDIgbWV0aG9kcyBhbmQgc28gaXQgaXMgbG9jYXRlZCBpbiB0aGlzIGZpbGVcblx0XHRmdW5jdGlvbiByZWdpc3RlclVuZG9SZWRvQWN0aW9ucygpIHtcblx0XHRcdC8vIGNyZWF0ZSBvciBnZXQgdGhlIHVuZG8tcmVkbyBpbnN0YW5jZVxuXHRcdFx0dmFyIHVyID0gY3kudW5kb1JlZG8oKTtcblxuXHRcdFx0Ly8gcmVnaXN0ZXIgZ2VuZXJhbCBhY3Rpb25zXG5cdFx0XHQvLyByZWdpc3RlciBhZGQgcmVtb3ZlIGFjdGlvbnNcblx0XHRcdHVyLmFjdGlvbihcImRlbGV0ZUVsZXNTaW1wbGVcIiwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMuZGVsZXRlRWxlc1NpbXBsZSwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMucmVzdG9yZUVsZXMpO1xuXHRcdFx0dXIuYWN0aW9uKFwiZGVsZXRlTm9kZXNTbWFydFwiLCB1bmRvUmVkb0FjdGlvbkZ1bmN0aW9ucy5kZWxldGVOb2Rlc1NtYXJ0LCB1bmRvUmVkb0FjdGlvbkZ1bmN0aW9ucy5yZXN0b3JlRWxlcyk7XG5cdFx0XHR1ci5hY3Rpb24oXCJzZXRQb3J0c09yZGVyaW5nXCIsIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zLnNldFBvcnRzT3JkZXJpbmcsIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zLnNldFBvcnRzT3JkZXJpbmcpO1xuXG5cdFx0XHQvL2V4cGVyaW1lbnRhbCBkYXRhIG92YXJsYXlcblx0XHRcdHVyLmFjdGlvbihcInJlbW92ZUFsbFwiLCB1bmRvUmVkb0FjdGlvbkZ1bmN0aW9ucy5yZW1vdmVBbGwsIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zLnJlc3RvcmVBbGwpO1xuXHRcdFx0dXIuYWN0aW9uKFwiaGlkZUV4cGVyaW1lbnRcIiwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMuaGlkZUV4cCwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMudW5oaWRlRXhwKTtcblx0XHRcdHVyLmFjdGlvbihcInVuaGlkZUV4cGVyaW1lbnRcIiwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMudW5oaWRlRXhwLCB1bmRvUmVkb0FjdGlvbkZ1bmN0aW9ucy5oaWRlRXhwKTtcblx0XHRcdHVyLmFjdGlvbihcImhpZGVGaWxlXCIsIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zLmhpZGVGaWxlLCB1bmRvUmVkb0FjdGlvbkZ1bmN0aW9ucy5oaWRlRmlsZVVuZG8pO1xuXHRcdFx0dXIuYWN0aW9uKFwidW5oaWRlRmlsZVwiLCB1bmRvUmVkb0FjdGlvbkZ1bmN0aW9ucy51bmhpZGVGaWxlLCB1bmRvUmVkb0FjdGlvbkZ1bmN0aW9ucy51bmhpZGVGaWxlVW5kbyk7XG5cdFx0XHR1ci5hY3Rpb24oXCJyZW1vdmVFeHBlcmltZW50XCIsIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zLnJlbW92ZUV4cCwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMuYWRkRXhwKTtcblx0XHRcdHVyLmFjdGlvbihcInJlbW92ZUZpbGVcIiwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMucmVtb3ZlRmlsZSwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMuYWRkRmlsZSk7XG5cdFx0XHR1ci5hY3Rpb24oXCJleHBCdXR0b25DaGFuZ2VcIiwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMuZXhwQnV0dG9uQ2hhbmdlLCB1bmRvUmVkb0FjdGlvbkZ1bmN0aW9ucy5leHBCdXR0b25DaGFuZ2UpO1xuXHRcdFx0dXIuYWN0aW9uKFwiZmlsZUJ1dHRvbkNoYW5nZUhpZGVcIiwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMuZmlsZUJ1dHRvbkNoYW5nZUhpZGUsIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zLmZpbGVCdXR0b25DaGFuZ2VVbkhpZGUpO1xuXHRcdFx0dXIuYWN0aW9uKFwiZmlsZUJ1dHRvbkNoYW5nZVVuSGlkZVwiLCB1bmRvUmVkb0FjdGlvbkZ1bmN0aW9ucy5maWxlQnV0dG9uQ2hhbmdlVW5IaWRlLCB1bmRvUmVkb0FjdGlvbkZ1bmN0aW9ucy5maWxlQnV0dG9uQ2hhbmdlSGlkZSk7XG5cblx0XHRcdC8vdXIuYWN0aW9uKFwiZXhwQnV0dG9uVW5oaWRlXCIsIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zLmNoYW5nZUV4cEJ1dHRvbjIsIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zLmV4cEJ1dHRvbkhpZGUpO1xuXHRcdFx0Ly91ci5hY3Rpb24oXCJwYXJzZURhdGFcIiwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMucGFyc2VEYXRhLCB1bmRvUmVkb0FjdGlvbkZ1bmN0aW9ucy5yZW1vdmVGaWxlKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBzaG93VG9vbHRpcChldmVudCkge1xuXHRcdFx0dmFyIG5vZGUgPSBldmVudC50YXJnZXQgfHwgZXZlbnQuY3lUYXJnZXQ7XG5cblx0XHRcdHZhciBjYW5IYXZlVG9vbHRpcCA9IGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtZW50VXRpbGl0aWVzLmlzU0lGTm9kZShub2RlKSB8fCBub2RlLmRhdGEoXCJ0b29sdGlwXCIpICE9PSBudWxsO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIWNhbkhhdmVUb29sdGlwKG5vZGUpKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dmFyIHJlZjsgLy8gdXNlZCBvbmx5IGZvciBwb3NpdGlvbmluZ1xuXHRcdFx0dmFyIHBvcyA9IGV2ZW50LnBvc2l0aW9uIHx8IGV2ZW50LmN5UG9zaXRpb247XG5cdFx0XHR2YXIgcGFuID0gY3kucGFuKCk7XG5cdFx0XHR2YXIgem9vbSA9IGN5Lnpvb20oKTtcblxuXHRcdFx0dmFyIGluZm9ib3ggPSBjbGFzc2VzLkF1eGlsaWFyeVVuaXQuY2hlY2tQb2ludChwb3MueCwgcG9zLnksIG5vZGUsIDApO1xuXHRcdFx0dmFyIHRvb2x0aXBDb250ZW50O1xuXG5cblx0XHRcdGlmICghaW5mb2JveCkge1xuXHRcdFx0XHR0b29sdGlwQ29udGVudCA9IG5vZGUuZGF0YSgndG9vbHRpcCcpO1xuXHRcdFx0XHRpZiAodG9vbHRpcENvbnRlbnQgPT0gdW5kZWZpbmVkIHx8IHRvb2x0aXBDb250ZW50ID09ICcnKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmVmID0gbm9kZS5wb3BwZXJSZWYoKTtcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHR0b29sdGlwQ29udGVudCA9IGluZm9ib3hbJ3Rvb2x0aXAnXTtcblxuXHRcdFx0XHRpZiAodG9vbHRpcENvbnRlbnQgPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyIG1vZGVsUG9zID0gY2xhc3Nlcy5BdXhpbGlhcnlVbml0LmdldEFic29sdXRlQ29vcmQoaW5mb2JveCwgY3kpO1xuXHRcdFx0XHR2YXIgbW9kZWxXID0gaW5mb2JveC5iYm94Lnc7XG5cdFx0XHRcdHZhciBtb2RlbEggPSBpbmZvYm94LmJib3guaDtcblx0XHRcdFx0dmFyIHJlbmRlcmVkVyA9IG1vZGVsVyAqIHpvb207XG5cdFx0XHRcdHZhciByZW5kZXJlZEggPSBtb2RlbEggKiB6b29tO1xuXHRcdFx0XHRtb2RlbFBvcy54IC09IG1vZGVsVyAvIDI7XG5cdFx0XHRcdG1vZGVsUG9zLnkgLT0gbW9kZWxIIC8gMjtcblx0XHRcdFx0dmFyIHJlbmRlcmVkUG9zID0gZWxlbWVudFV0aWxpdGllcy5jb252ZXJ0VG9SZW5kZXJlZFBvc2l0aW9uKG1vZGVsUG9zLCBwYW4sIHpvb20pO1xuXG5cdFx0XHRcdHZhciByZW5kZXJlZERpbXMgPSB7IHc6IHJlbmRlcmVkVywgaDogcmVuZGVyZWRIIH07XG5cblx0XHRcdFx0cmVmID0gbm9kZS5wb3BwZXJSZWYoe1xuXHRcdFx0XHRcdHJlbmRlcmVkUG9zaXRpb246IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiByZW5kZXJlZFBvcztcblx0XHRcdFx0XHR9LFxuXHRcdFx0XHRcdHJlbmRlcmVkRGltZW5zaW9uczogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlbmRlcmVkRGltcztcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXG5cblx0XHRcdHZhciBwbGFjZW1lbnQgPSBpbmZvYm94ID8gaW5mb2JveC5hbmNob3JTaWRlIDogJ2JvdHRvbSc7XG5cdFx0XHR2YXIgZGVzdHJveVRpcHB5O1xuXG5cdFx0XHR2YXIgdGlwcHkgPSBUaXBweS5vbmUocmVmLCB7XG5cdFx0XHRcdGNvbnRlbnQ6ICgoKSA9PiB7XG5cdFx0XHRcdFx0dmFyIGNvbnRlbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcblxuXHRcdFx0XHRcdGNvbnRlbnQuc3R5bGVbJ2ZvbnQtc2l6ZSddID0gMTIgKiB6b29tICsgJ3B4Jztcblx0XHRcdFx0XHRjb250ZW50LmlubmVySFRNTCA9IHRvb2x0aXBDb250ZW50O1xuXG5cdFx0XHRcdFx0cmV0dXJuIGNvbnRlbnQ7XG5cdFx0XHRcdH0pKCksXG5cdFx0XHRcdHRyaWdnZXI6ICdtYW51YWwnLFxuXHRcdFx0XHRoaWRlT25DbGljazogdHJ1ZSxcblx0XHRcdFx0YXJyb3c6IHRydWUsXG5cdFx0XHRcdHBsYWNlbWVudCxcblx0XHRcdFx0b25IaWRkZW46IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRjeS5vZmYoJ3BhbiB6b29tJywgZGVzdHJveVRpcHB5KTtcblx0XHRcdFx0XHRub2RlLm9mZigncG9zaXRpb24nLCBkZXN0cm95VGlwcHkpO1xuXHRcdFx0XHRcdGN5Lm9mZigndGFwZHJhZycsIGRlc3Ryb3lUaXBweSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRkZXN0cm95VGlwcHkgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdHRpcHB5LmRlc3Ryb3koKTtcblx0XHRcdH07XG5cblx0XHRcdGN5Lm9uKCdwYW4gem9vbScsIGRlc3Ryb3lUaXBweSk7XG5cdFx0XHRub2RlLm9uKCdwb3NpdGlvbicsIGRlc3Ryb3lUaXBweSk7XG5cdFx0XHRjeS5vbigndGFwZHJhZycsIGRlc3Ryb3lUaXBweSk7XG5cblx0XHRcdHNldFRpbWVvdXQoKCkgPT4gdGlwcHkuc2hvdygpLCAyNTApO1xuXHRcdH1cblxuXHRcdGZ1bmN0aW9uIGJpbmRDeUV2ZW50cygpIHtcblxuXHRcdFx0Y3kub24oJ3RhcGRyYWdvdmVyJywgJ25vZGUnLCBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdFx0dmFyIHdhaXREdXJhdGlvbiA9IDIwMDtcblx0XHRcdFx0dmFyIG5vZGVUYXBkcmFnb3V0O1xuXHRcdFx0XHR2YXIgY3VyckV2ZW50ID0gZXZlbnQ7XG5cdFx0XHRcdHZhciBub2RlID0gY3VyckV2ZW50LnRhcmdldCB8fCBjdXJyRXZlbnQuY3lUYXJnZXQ7XG5cdFx0XHRcdHZhciBpblF1ZXVlID0gdHJ1ZTtcblxuXHRcdFx0XHR2YXIgY2xlYXJOb2RlRXZlbnQgPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0aWYgKG5vZGVUYXBkcmFnb3V0KSB7XG5cdFx0XHRcdFx0XHRub2RlLm9mZigndGFwZHJhZ291dCcsIG5vZGVUYXBkcmFnb3V0KTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAobm9kZVRhcGRyYWcpIHtcblx0XHRcdFx0XHRcdG5vZGUub2ZmKCd0YXBkcmFnJywgbm9kZVRhcGRyYWcpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblxuXHRcdFx0XHR2YXIgZ2V0U2hvd1Rvb2x0aXBBc3ljbiA9IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRzaG93VG9vbHRpcChjdXJyRXZlbnQpO1xuXHRcdFx0XHRcdFx0aW5RdWV1ZSA9IGZhbHNlO1xuXHRcdFx0XHRcdH0sIHdhaXREdXJhdGlvbik7XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0dmFyIHNob3dUb29sdGlwQXN5Y24gPSBnZXRTaG93VG9vbHRpcEFzeWNuKCk7XG5cblx0XHRcdFx0bm9kZS5vbigndGFwZHJhZ291dCcsIG5vZGVUYXBkcmFnb3V0ID0gZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0XHRjbGVhclRpbWVvdXQoc2hvd1Rvb2x0aXBBc3ljbik7XG5cdFx0XHRcdFx0Y2xlYXJOb2RlRXZlbnQoKTtcblx0XHRcdFx0fSk7XG5cblx0XHRcdFx0bm9kZS5vbigndGFwZHJhZycsIG5vZGVUYXBkcmFnID0gZnVuY3Rpb24gKGUpIHtcblx0XHRcdFx0XHRjdXJyRXZlbnQgPSBlO1xuXHRcdFx0XHRcdGlmICghaW5RdWV1ZSkge1xuXHRcdFx0XHRcdFx0c2hvd1Rvb2x0aXBBc3ljbiA9IGdldFNob3dUb29sdGlwQXN5Y24oKTtcblx0XHRcdFx0XHRcdGluUXVldWUgPSB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSk7XG5cdFx0XHR9KTtcblxuXHRcdFx0Y3kub24oJ3RhcGVuZCcsICdub2RlJywgZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRcdGN5LnN0eWxlKCkudXBkYXRlKCk7XG5cdFx0XHR9KTtcblxuXHRcdFx0Y3kub24oXCJleHBhbmRjb2xsYXBzZS5iZWZvcmVjb2xsYXBzZVwiLCBcIm5vZGVcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRcdHZhciBub2RlID0gdGhpcztcblx0XHRcdFx0Ly9UaGUgY2hpbGRyZW4gaW5mbyBvZiBjb21wbGV4IG5vZGVzIHNob3VsZCBiZSBzaG93biB3aGVuIHRoZXkgYXJlIGNvbGxhcHNlZFxuXHRcdFx0XHRpZiAobm9kZS5fcHJpdmF0ZS5kYXRhLmNsYXNzLnN0YXJ0c1dpdGgoXCJjb21wbGV4XCIpKSB7XG5cdFx0XHRcdFx0Ly9UaGUgbm9kZSBpcyBiZWluZyBjb2xsYXBzZWQgc3RvcmUgaW5mb2xhYmVsIHRvIHVzZSBpdCBsYXRlclxuXHRcdFx0XHRcdHZhciBpbmZvTGFiZWwgPSBlbGVtZW50VXRpbGl0aWVzLmdldEluZm9MYWJlbChub2RlKTtcblx0XHRcdFx0XHRub2RlLl9wcml2YXRlLmRhdGEuaW5mb0xhYmVsID0gaW5mb0xhYmVsO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0Y3kub24oXCJleHBhbmRjb2xsYXBzZS5hZnRlcmNvbGxhcHNlXCIsIFwibm9kZVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdFx0dmFyIG5vZGUgPSB0aGlzO1xuXHRcdFx0XHQvLyBUaGUgd2lkdGggYW5kIGhlaWdodCBvZiBqdXN0IGNvbGxhcHNlZCBub2RlcyBzaG91bGQgYmUgMzYsIGJ1dCB0aGV5IGFyZSBzdXBwb3NlZCB0byBiZSByZXNpemFibGUuIFRoZXJlZm9yZSwgd2Vcblx0XHRcdFx0Ly8gc2V0IHRoZWlyIGRhdGEoJ2Jib3gnKSBhY2NvcmRpbmdseS4gV2UgZG8gbm90IHN0b3JlIHRoZWlyIGV4aXN0aW5nIGJib3gudyBhbmQgYmJveC5oIGJlY2F1c2UgdGhleSBoYXZlIG5vIHNpZ25pZmljYW5jZSBmb3IgY29tcG91bmRzIChmb3Igbm93KS5cblx0XHRcdFx0Y3kuc3RhcnRCYXRjaCgpO1xuXHRcdFx0XHR2YXIgYmJveCA9IG5vZGUuZGF0YSgnYmJveCcpO1xuXHRcdFx0XHRiYm94LncgPSAzNjtcblx0XHRcdFx0YmJveC5oID0gMzY7XG5cdFx0XHRcdG5vZGUuZGF0YSgnYmJveCcsIGJib3gpO1xuXHRcdFx0XHRjeS5lbmRCYXRjaCgpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGN5Lm9uKFwiZXhwYW5kY29sbGFwc2UuYmVmb3JlZXhwYW5kXCIsIFwibm9kZVwiLCBmdW5jdGlvbiAoZXZlbnQpIHtcblx0XHRcdFx0dmFyIG5vZGUgPSB0aGlzO1xuXHRcdFx0XHRub2RlLnJlbW92ZURhdGEoXCJpbmZvTGFiZWxcIik7XG5cdFx0XHR9KTtcblxuXHRcdFx0Y3kub24oXCJleHBhbmRjb2xsYXBzZS5hZnRlcmV4cGFuZFwiLCBcIm5vZGVcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRcdHZhciBub2RlID0gdGhpcztcblx0XHRcdFx0Y3kubm9kZXMoKS51cGRhdGVDb21wb3VuZEJvdW5kcygpO1xuXG5cdFx0XHRcdGlmICghb3B0aW9ucy5yZWNhbGN1bGF0ZU9uQ29tcGxleGl0eU1hbmFnZW1lbnQpIHtcblx0XHRcdFx0XHRjeS5zdHlsZSgpLnVwZGF0ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdC8vRG9uJ3Qgc2hvdyBjaGlsZHJlbiBpbmZvIHdoZW4gdGhlIGNvbXBsZXggbm9kZSBpcyBleHBhbmRlZFxuXHRcdFx0XHRpZiAobm9kZS5fcHJpdmF0ZS5kYXRhLmNsYXNzLnN0YXJ0c1dpdGgoXCJjb21wbGV4XCIpKSB7XG5cdFx0XHRcdFx0bm9kZS5yZW1vdmVTdHlsZSgnY29udGVudCcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0Y3kub24oXCJiZWZvcmVEb1wiLCBmdW5jdGlvbiAoZSwgbmFtZSwgYXJncykge1xuXHRcdFx0XHRpZiAobmFtZSA9PSBcImxheW91dFwiIHx8IG5hbWUgPT0gXCJjb2xsYXBzZVwiIHx8IG5hbWUgPT0gXCJleHBhbmRcIiB8fCBuYW1lID09IFwiY29sbGFwc2VSZWN1cnNpdmVseVwiIHx8IG5hbWUgPT0gXCJleHBhbmRSZWN1cnNpdmVseVwiXG5cdFx0XHRcdFx0fHwgKG5hbWUgPT0gXCJiYXRjaFwiICYmICgoYXJncy5sZW5ndGggPiAwICYmIGFyZ3NbMF1bJ25hbWUnXSA9PSBcInRoaW5Cb3JkZXJcIikgfHwgKGFyZ3MubGVuZ3RoID4gMCAmJiBhcmdzWzBdWyduYW1lJ10gPT0gXCJ0aGlja2VuQm9yZGVyXCIpKSkpIHtcblx0XHRcdFx0XHR2YXIgcGFyZW50cyA9IGN5LmVsZW1lbnRzKFwiOnBhcmVudFwiKS5qc29ucygpOyAvLyBwYXJlbnQgbm9kZXNcblx0XHRcdFx0XHR2YXIgc2ltcGxlcyA9IGN5LmVsZW1lbnRzKCkubm90KFwiOnBhcmVudFwiKS5qc29ucygpOyAvLyBzaW1wbGUgbm9kZXMgYW5kIGVkZ2VzXG5cdFx0XHRcdFx0dmFyIGFsbEVsZW1lbnRzID0gcGFyZW50cy5jb25jYXQoc2ltcGxlcyk7ICAvLyBhbGwgZWxlbWVudHNcblx0XHRcdFx0XHRhcmdzLmFsbEVsZW1lbnRzID0gYWxsRWxlbWVudHM7XG5cdFx0XHRcdFx0dmFyIHBvcnRzID0ge307XG5cdFx0XHRcdFx0Y3kubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRcdFx0XHRpZiAoZWxlbWVudFV0aWxpdGllcy5jYW5IYXZlUG9ydHMobm9kZSkpIHtcblx0XHRcdFx0XHRcdFx0cG9ydHNbbm9kZS5pZCgpXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobm9kZS5kYXRhKFwicG9ydHNcIikpKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRhcmdzLnBvcnRzID0gcG9ydHM7XG5cdFx0XHRcdFx0YXJncy52aWV3cG9ydCA9IHsgcGFuOiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGN5LnBhbigpKSksIHpvb206IGN5Lnpvb20oKSB9O1xuXHRcdFx0XHRcdGlmIChuYW1lID09IFwibGF5b3V0XCIpXG5cdFx0XHRcdFx0XHRtYWluVXRpbGl0aWVzLmJlZm9yZVBlcmZvcm1MYXlvdXQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGN5Lm9uKFwiYmVmb3JlUmVkb1wiLCBmdW5jdGlvbiAoZSwgbmFtZSwgYXJncykge1xuXHRcdFx0XHRpZiAobmFtZSA9PSBcImxheW91dFwiIHx8IG5hbWUgPT0gXCJjb2xsYXBzZVwiIHx8IG5hbWUgPT0gXCJleHBhbmRcIiB8fCBuYW1lID09IFwiY29sbGFwc2VSZWN1cnNpdmVseVwiIHx8IG5hbWUgPT0gXCJleHBhbmRSZWN1cnNpdmVseVwiXG5cdFx0XHRcdFx0fHwgKG5hbWUgPT0gXCJiYXRjaFwiICYmICgoYXJncy5sZW5ndGggPiAwICYmIGFyZ3NbMF1bJ25hbWUnXSA9PSBcInRoaW5Cb3JkZXJcIikgfHwgKGFyZ3MubGVuZ3RoID4gMCAmJiBhcmdzWzBdWyduYW1lJ10gPT0gXCJ0aGlja2VuQm9yZGVyXCIpKSkpIHtcblx0XHRcdFx0XHR2YXIgcGFyZW50cyA9IGN5LmVsZW1lbnRzKFwiOnBhcmVudFwiKS5qc29ucygpOyAvLyBwYXJlbnQgbm9kZXNcblx0XHRcdFx0XHR2YXIgc2ltcGxlcyA9IGN5LmVsZW1lbnRzKCkubm90KFwiOnBhcmVudFwiKS5qc29ucygpOyAvLyBzaW1wbGUgbm9kZXMgYW5kIGVkZ2VzXG5cdFx0XHRcdFx0dmFyIGFsbEVsZW1lbnRzID0gcGFyZW50cy5jb25jYXQoc2ltcGxlcyk7ICAvLyBhbGwgZWxlbWVudHNcblx0XHRcdFx0XHRhcmdzLmFsbEVsZW1lbnRzMiA9IGFsbEVsZW1lbnRzO1xuXHRcdFx0XHRcdHZhciBwb3J0cyA9IHt9O1xuXHRcdFx0XHRcdGN5Lm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0XHRcdFx0aWYgKGVsZW1lbnRVdGlsaXRpZXMuY2FuSGF2ZVBvcnRzKG5vZGUpKSB7XG5cdFx0XHRcdFx0XHRcdHBvcnRzW25vZGUuaWQoKV0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG5vZGUuZGF0YShcInBvcnRzXCIpKSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YXJncy5wb3J0czIgPSBwb3J0cztcblx0XHRcdFx0XHRhcmdzLnZpZXdwb3J0MiA9IHsgcGFuOiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGN5LnBhbigpKSksIHpvb206IGN5Lnpvb20oKSB9O1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0Y3kub24oXCJhZnRlckRvXCIsIGZ1bmN0aW9uIChlLCBuYW1lLCBhcmdzLCByZXMpIHtcblx0XHRcdFx0aWYgKG5hbWUgPT0gXCJsYXlvdXRcIiB8fCBuYW1lID09IFwiY29sbGFwc2VcIiB8fCBuYW1lID09IFwiZXhwYW5kXCIgfHwgbmFtZSA9PSBcImNvbGxhcHNlUmVjdXJzaXZlbHlcIiB8fCBuYW1lID09IFwiZXhwYW5kUmVjdXJzaXZlbHlcIlxuXHRcdFx0XHRcdHx8IChuYW1lID09IFwiYmF0Y2hcIiAmJiAoKGFyZ3MubGVuZ3RoID4gMCAmJiBhcmdzWzBdWyduYW1lJ10gPT0gXCJ0aGluQm9yZGVyXCIpIHx8IChhcmdzLmxlbmd0aCA+IDAgJiYgYXJnc1swXVsnbmFtZSddID09IFwidGhpY2tlbkJvcmRlclwiKSkpKSB7XG5cdFx0XHRcdFx0cmVzLmFsbEVsZW1lbnRzID0gYXJncy5hbGxFbGVtZW50cztcblx0XHRcdFx0XHRyZXMucG9ydHMgPSBhcmdzLnBvcnRzO1xuXHRcdFx0XHRcdHJlcy52aWV3cG9ydCA9IGFyZ3Mudmlld3BvcnQ7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRjeS5vbihcImFmdGVyUmVkb1wiLCBmdW5jdGlvbiAoZSwgbmFtZSwgYXJncywgcmVzKSB7XG5cblx0XHRcdFx0aWYgKG5hbWUgPT0gXCJsYXlvdXRcIiB8fCBuYW1lID09IFwiY29sbGFwc2VcIiB8fCBuYW1lID09IFwiZXhwYW5kXCIgfHwgbmFtZSA9PSBcImNvbGxhcHNlUmVjdXJzaXZlbHlcIiB8fCBuYW1lID09IFwiZXhwYW5kUmVjdXJzaXZlbHlcIlxuXHRcdFx0XHRcdHx8IChuYW1lID09IFwiYmF0Y2hcIiAmJiAoKGFyZ3MubGVuZ3RoID4gMCAmJiBhcmdzWzBdWyduYW1lJ10gPT0gXCJ0aGluQm9yZGVyXCIpIHx8IChhcmdzLmxlbmd0aCA+IDAgJiYgYXJnc1swXVsnbmFtZSddID09IFwidGhpY2tlbkJvcmRlclwiKSkpKSB7XG5cdFx0XHRcdFx0cmVzLmFsbEVsZW1lbnRzID0gYXJncy5hbGxFbGVtZW50czI7XG5cdFx0XHRcdFx0cmVzLnBvcnRzID0gYXJncy5wb3J0czI7XG5cdFx0XHRcdFx0cmVzLnZpZXdwb3J0ID0gYXJncy52aWV3cG9ydDI7XG5cdFx0XHRcdFx0Y3kuanNvbih7IGZsYXRFbGVzOiB0cnVlLCBlbGVtZW50czogYXJncy5hbGxFbGVtZW50cyB9KTtcblx0XHRcdFx0XHRjeS5iYXRjaChmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRjeS5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdFx0XHRcdFx0aWYgKGVsZW1lbnRVdGlsaXRpZXMuY2FuSGF2ZVBvcnRzKG5vZGUpKSB7XG5cdFx0XHRcdFx0XHRcdFx0bm9kZS5kYXRhKFwicG9ydHNcIiwgYXJncy5wb3J0c1tub2RlLmlkKCldKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0Y3kucGFuKGFyZ3Mudmlld3BvcnRbXCJwYW5cIl0pO1xuXHRcdFx0XHRcdGN5Lnpvb20oYXJncy52aWV3cG9ydFtcInpvb21cIl0pO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0Y3kub24oXCJiZWZvcmVVbmRvXCIsIGZ1bmN0aW9uIChlLCBuYW1lLCBhcmdzKSB7XG5cdFx0XHRcdGlmIChuYW1lID09IFwibGF5b3V0XCIgfHwgbmFtZSA9PSBcImNvbGxhcHNlXCIgfHwgbmFtZSA9PSBcImV4cGFuZFwiIHx8IG5hbWUgPT0gXCJjb2xsYXBzZVJlY3Vyc2l2ZWx5XCIgfHwgbmFtZSA9PSBcImV4cGFuZFJlY3Vyc2l2ZWx5XCJcblx0XHRcdFx0XHR8fCAobmFtZSA9PSBcImJhdGNoXCIgJiYgKChhcmdzLmxlbmd0aCA+IDAgJiYgYXJnc1swXVsnbmFtZSddID09IFwidGhpbkJvcmRlclwiKSB8fCAoYXJncy5sZW5ndGggPiAwICYmIGFyZ3NbMF1bJ25hbWUnXSA9PSBcInRoaWNrZW5Cb3JkZXJcIikpKSkge1xuXHRcdFx0XHRcdHZhciBwYXJlbnRzID0gY3kuZWxlbWVudHMoXCI6cGFyZW50XCIpLmpzb25zKCk7IC8vIHBhcmVudCBub2Rlc1xuXHRcdFx0XHRcdHZhciBzaW1wbGVzID0gY3kuZWxlbWVudHMoKS5ub3QoXCI6cGFyZW50XCIpLmpzb25zKCk7IC8vIHNpbXBsZSBub2RlcyBhbmQgZWRnZXNcblx0XHRcdFx0XHR2YXIgYWxsRWxlbWVudHMgPSBwYXJlbnRzLmNvbmNhdChzaW1wbGVzKTsgIC8vIGFsbCBlbGVtZW50c1xuXHRcdFx0XHRcdGFyZ3MuYWxsRWxlbWVudHMyID0gYWxsRWxlbWVudHM7XG5cdFx0XHRcdFx0dmFyIHBvcnRzID0ge307XG5cdFx0XHRcdFx0Y3kubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRcdFx0XHRpZiAoZWxlbWVudFV0aWxpdGllcy5jYW5IYXZlUG9ydHMobm9kZSkpIHtcblx0XHRcdFx0XHRcdFx0cG9ydHNbbm9kZS5pZCgpXSA9IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkobm9kZS5kYXRhKFwicG9ydHNcIikpKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRhcmdzLnBvcnRzMiA9IHBvcnRzO1xuXHRcdFx0XHRcdGFyZ3Mudmlld3BvcnQyID0geyBwYW46IEpTT04ucGFyc2UoSlNPTi5zdHJpbmdpZnkoY3kucGFuKCkpKSwgem9vbTogY3kuem9vbSgpIH07XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRjeS5vbihcImFmdGVyVW5kb1wiLCBmdW5jdGlvbiAoZSwgbmFtZSwgYXJncywgcmVzKSB7XG5cdFx0XHRcdGlmIChuYW1lID09IFwibGF5b3V0XCIgfHwgbmFtZSA9PSBcImNvbGxhcHNlXCIgfHwgbmFtZSA9PSBcImV4cGFuZFwiIHx8IG5hbWUgPT0gXCJjb2xsYXBzZVJlY3Vyc2l2ZWx5XCIgfHwgbmFtZSA9PSBcImV4cGFuZFJlY3Vyc2l2ZWx5XCJcblx0XHRcdFx0XHR8fCAobmFtZSA9PSBcImJhdGNoXCIgJiYgKChhcmdzLmxlbmd0aCA+IDAgJiYgYXJnc1swXVsnbmFtZSddID09IFwidGhpbkJvcmRlclwiKSB8fCAoYXJncy5sZW5ndGggPiAwICYmIGFyZ3NbMF1bJ25hbWUnXSA9PSBcInRoaWNrZW5Cb3JkZXJcIikpKSkge1xuXHRcdFx0XHRcdHJlcy5hbGxFbGVtZW50cyA9IGFyZ3MuYWxsRWxlbWVudHMyO1xuXHRcdFx0XHRcdHJlcy5wb3J0cyA9IGFyZ3MucG9ydHMyO1xuXHRcdFx0XHRcdHJlcy52aWV3cG9ydCA9IGFyZ3Mudmlld3BvcnQyO1xuXHRcdFx0XHRcdGN5Lmpzb24oeyBmbGF0RWxlczogdHJ1ZSwgZWxlbWVudHM6IGFyZ3MuYWxsRWxlbWVudHMgfSk7XG5cdFx0XHRcdFx0Y3kuYmF0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0Y3kubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChlbGVtZW50VXRpbGl0aWVzLmNhbkhhdmVQb3J0cyhub2RlKSkge1xuXHRcdFx0XHRcdFx0XHRcdG5vZGUuZGF0YShcInBvcnRzXCIsIGFyZ3MucG9ydHNbbm9kZS5pZCgpXSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGN5LnBhbihhcmdzLnZpZXdwb3J0W1wicGFuXCJdKTtcblx0XHRcdFx0XHRjeS56b29tKGFyZ3Mudmlld3BvcnRbXCJ6b29tXCJdKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGN5Lm9uKCdsYXlvdXRzdG9wJywgZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRcdC8qXG5cdFx0XHRcdCogJ3ByZXNldCcgbGF5b3V0IGlzIGNhbGxlZCB0byBnaXZlIHRoZSBpbml0aWFsIHBvc2l0aW9ucyBvZiBub2RlcyBieSBzYmdudml6LlxuXHRcdFx0XHQqIFNlZW1zIGxpa2UgJ2dyaWQnIGxheW91dCBpcyBjYWxsZWQgYnkgQ3l0b3NjYXBlLmpzIGNvcmUgaW4gbG9hZGluZyBncmFwaHMuXG5cdFx0XHRcdCogSWYgdGhlIGxheW91dCBpcyBub3Qgb25lIG9mIHRoZXNlIChub3JtYWxseSBpdCBpcyBzdXBwb3NlZCB0byBiZSAnY29zZS1iaWxrZW50Jylcblx0XHRcdFx0KiBhbmQgcG9ydHMgYXJlIGVuYWJsZWQgY2FsbCAnZWxlbWVudFV0aWxpdGllcy5jaGFuZ2VQb3J0c09yaWVudGF0aW9uQWZ0ZXJMYXlvdXQoKSdcblx0XHRcdFx0Ki9cblx0XHRcdFx0aWYgKGV2ZW50LmxheW91dC5vcHRpb25zLm5hbWUgIT09ICdwcmVzZXQnICYmIGV2ZW50LmxheW91dC5vcHRpb25zLm5hbWUgIT09ICdncmlkJykge1x0Ly8gMzAwMCBub2Rlcy9lZGdlcyBjaGVjayBpcyBmb3IgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRcblx0XHRcdFx0XHRpZiAoZ3JhcGhVdGlsaXRpZXMucG9ydHNFbmFibGVkID09PSB0cnVlICYmICEoY3kubm9kZXMoKS5sZW5ndGggPiAzMDAwIHx8IGN5LmVkZ2VzKCkubGVuZ3RoID4gMzAwMCkpIHtcblx0XHRcdFx0XHRcdGVsZW1lbnRVdGlsaXRpZXMuY2hhbmdlUG9ydHNPcmllbnRhdGlvbkFmdGVyTGF5b3V0KCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0JChkb2N1bWVudCkub24oJ3VwZGF0ZUdyYXBoRW5kJywgZnVuY3Rpb24gKGV2ZW50LCBfY3ksIGlzTGF5b3V0UmVxdWlyZWQsIGNhbGxiYWNrKSB7XG5cblx0XHRcdFx0Ly8gaWYgdGhlIGV2ZW50IGlzIG5vdCB0cmlnZ2VyZWQgZm9yIHRoaXMgY3kgaW5zdGFuY2UgcmV0dXJuIGRpcmVjdGx5XG5cdFx0XHRcdGlmIChfY3kgIT0gY3kpIHtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0dmFyIHNldENvbXBvdW5kSW5mb2JveGVzID0gZnVuY3Rpb24gKG5vZGUsIGlzTGF5b3V0UmVxdWlyZWQsIGN5SW5zdGFuY2UpIHtcblx0XHRcdFx0XHRpZiAoY3lJbnN0YW5jZSA9PSB1bmRlZmluZWQpIHJldHVybjtcblx0XHRcdFx0XHRpZiAobm9kZS5kYXRhKCkuaW5mb2JveENhbGN1bGF0ZWQpIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9IGVsc2UgaWYgKG5vZGUuaXNQYXJlbnQoKSkge1xuXHRcdFx0XHRcdFx0bm9kZS5jaGlsZHJlbigpLmZvckVhY2goZnVuY3Rpb24gKGNoaWxkTm9kZSkge1xuXHRcdFx0XHRcdFx0XHRzZXRDb21wb3VuZEluZm9ib3hlcyhjaGlsZE5vZGUsIGlzTGF5b3V0UmVxdWlyZWQsIGN5SW5zdGFuY2UpO1xuXHRcdFx0XHRcdFx0fSk7XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRub2RlLmRhdGEoXCJpbmZvYm94Q2FsY3VsYXRlZFwiLCB0cnVlKTtcblx0XHRcdFx0XHRub2RlLmRhdGEoJ2F1eHVuaXRsYXlvdXRzJywge30pO1xuXHRcdFx0XHRcdC8vIGZvciBlYWNoIHN0YXRlc2FuZGluZm9zXG5cblx0XHRcdFx0XHR2YXIgY29ycmVjdEluZm9Cb3hDb29yZCA9IHRydWU7XG5cdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmRhdGEoJ3N0YXRlc2FuZGluZm9zJykubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdHZhciBzdGF0ZXNhbmRpbmZvcyA9IG5vZGUuZGF0YSgnc3RhdGVzYW5kaW5mb3MnKVtpXTtcblx0XHRcdFx0XHRcdHZhciBiYm94ID0gc3RhdGVzYW5kaW5mb3MuYmJveDtcblx0XHRcdFx0XHRcdHZhciBpbmZvQm94T25Ob2RlID0gY2xhc3Nlcy5BdXhpbGlhcnlVbml0LnNldEFuY2hvclNpZGUoc3RhdGVzYW5kaW5mb3MsIG5vZGUpO1xuXHRcdFx0XHRcdFx0Y29ycmVjdEluZm9Cb3hDb29yZCA9IGNvcnJlY3RJbmZvQm94Q29vcmQgJiYgaW5mb0JveE9uTm9kZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBub2RlLmRhdGEoJ3N0YXRlc2FuZGluZm9zJykubGVuZ3RoOyBpKyspIHtcblx0XHRcdFx0XHRcdHZhciBzdGF0ZXNhbmRpbmZvcyA9IG5vZGUuZGF0YSgnc3RhdGVzYW5kaW5mb3MnKVtpXTtcblx0XHRcdFx0XHRcdHZhciBiYm94ID0gc3RhdGVzYW5kaW5mb3MuYmJveDtcblxuXG5cdFx0XHRcdFx0XHRpZiAoKGlzTGF5b3V0UmVxdWlyZWQgPT09IHVuZGVmaW5lZCB8fCAhaXNMYXlvdXRSZXF1aXJlZCkgJiYgY29ycmVjdEluZm9Cb3hDb29yZCkge1xuXHRcdFx0XHRcdFx0XHR2YXIgY29yZFJlc3VsdCA9IGNsYXNzZXMuQXV4aWxpYXJ5VW5pdC5jb252ZXJ0VG9SZWxhdGl2ZUNvb3JkKHN0YXRlc2FuZGluZm9zLCBiYm94LnggKyBiYm94LncgLyAyLCBiYm94LnkgKyBiYm94LmggLyAyLCBjeUluc3RhbmNlLCBub2RlKVxuXHRcdFx0XHRcdFx0XHRzdGF0ZXNhbmRpbmZvcy5iYm94LnggPSBjb3JkUmVzdWx0Lng7XG5cdFx0XHRcdFx0XHRcdHN0YXRlc2FuZGluZm9zLmJib3gueSA9IGNvcmRSZXN1bHQueTtcblx0XHRcdFx0XHRcdFx0c3RhdGVzYW5kaW5mb3MuaXNEaXNwbGF5ZWQgPSB0cnVlO1xuXHRcdFx0XHRcdFx0XHR2YXIgbG9jYXRpb24gPSBzdGF0ZXNhbmRpbmZvcy5hbmNob3JTaWRlOyAvLyB0b3AgYm90dG9tIHJpZ2h0IGxlZnRcblx0XHRcdFx0XHRcdFx0dmFyIGxheW91dHMgPSBub2RlLmRhdGEoJ2F1eHVuaXRsYXlvdXRzJyk7XG5cdFx0XHRcdFx0XHRcdGlmICghbGF5b3V0c1tsb2NhdGlvbl0pIHsgLy8gbGF5b3V0IGRvZXNuJ3QgZXhpc3QgeWV0IGZvciB0aGlzIGxvY2F0aW9uXG5cdFx0XHRcdFx0XHRcdFx0bGF5b3V0c1tsb2NhdGlvbl0gPSBjbGFzc2VzLkF1eFVuaXRMYXlvdXQuY29uc3RydWN0KG5vZGUsIGxvY2F0aW9uKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHQvLyBwb3B1bGF0ZSB0aGUgbGF5b3V0IG9mIHRoaXMgc2lkZVxuXHRcdFx0XHRcdFx0XHRjbGFzc2VzLkF1eFVuaXRMYXlvdXQuYWRkQXV4VW5pdChsYXlvdXRzW2xvY2F0aW9uXSwgY3lJbnN0YW5jZSwgc3RhdGVzYW5kaW5mb3MsIHVuZGVmaW5lZCwgdHJ1ZSk7IC8vcG9zaXRpb25zIGFyZSBwcmVjb21wdXRlZFxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0ZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGlmICghbm9kZS5kYXRhKCdhdXh1bml0bGF5b3V0cycpKSB7IC8vIGVuc3VyZSBtaW5pbWFsIGluaXRpYWxpemF0aW9uXG5cdFx0XHRcdFx0XHRcdFx0bm9kZS5kYXRhKCdhdXh1bml0bGF5b3V0cycsIHt9KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR2YXIgbG9jYXRpb24gPSBjbGFzc2VzLkF1eFVuaXRMYXlvdXQuc2VsZWN0TmV4dEF2YWlsYWJsZShub2RlLCBjeSk7XG5cdFx0XHRcdFx0XHRcdGlmICghbm9kZS5kYXRhKCdhdXh1bml0bGF5b3V0cycpW2xvY2F0aW9uXSkge1xuXHRcdFx0XHRcdFx0XHRcdG5vZGUuZGF0YSgnYXV4dW5pdGxheW91dHMnKVtsb2NhdGlvbl0gPSBjbGFzc2VzLkF1eFVuaXRMYXlvdXQuY29uc3RydWN0KG5vZGUsIGxvY2F0aW9uKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR2YXIgbGF5b3V0ID0gbm9kZS5kYXRhKCdhdXh1bml0bGF5b3V0cycpW2xvY2F0aW9uXTtcblx0XHRcdFx0XHRcdFx0c3RhdGVzYW5kaW5mb3MuYW5jaG9yU2lkZSA9IGxvY2F0aW9uO1xuXHRcdFx0XHRcdFx0XHRzd2l0Y2ggKGxvY2F0aW9uKSB7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcInRvcFwiOiBzdGF0ZXNhbmRpbmZvcy5iYm94LnkgPSAwOyBicmVhaztcblx0XHRcdFx0XHRcdFx0XHRjYXNlIFwiYm90dG9tXCI6IHN0YXRlc2FuZGluZm9zLmJib3gueSA9IDEwMDsgYnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcImxlZnRcIjogc3RhdGVzYW5kaW5mb3MuYmJveC54ID0gMDsgYnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcInJpZ2h0XCI6IHN0YXRlc2FuZGluZm9zLmJib3gueCA9IDEwMDsgYnJlYWs7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0Y2xhc3Nlcy5BdXhVbml0TGF5b3V0LmFkZEF1eFVuaXQobGF5b3V0LCBjeUluc3RhbmNlLCBzdGF0ZXNhbmRpbmZvcyk7XG5cdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRpZiAoaXNMYXlvdXRSZXF1aXJlZCA9PT0gdHJ1ZSkge1xuXHRcdFx0XHRcdFx0dmFyIGxvY2F0aW9ucyA9IGNsYXNzZXMuQXV4VW5pdExheW91dC5jaGVja0ZpdChub2RlLCBjeSk7XG5cdFx0XHRcdFx0XHRpZiAobG9jYXRpb25zICE9PSB1bmRlZmluZWQgJiYgbG9jYXRpb25zLmxlbmd0aCA+IDApIHtcblx0XHRcdFx0XHRcdFx0Y2xhc3Nlcy5BdXhVbml0TGF5b3V0LmZpdFVuaXRzKG5vZGUsIGN5LCBsb2NhdGlvbnMpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHR9O1xuXHRcdFx0XHQvLyBsaXN0IGFsbCBlbnRpdHl0eXBlcyBhbmRzdG9yZSB0aGVtIGluIHRoZSBnbG9iYWwgc2NyYXRjaFxuXHRcdFx0XHQvLyBvbmx5IHN0YXRlZnVsIEVQTiAoY29tcGxleCwgbWFjcm9tb2xlY3VsZSBvciBudWNsZWljIGFjaWQpIGFyZSBjb25jZXJuZWRcblxuXHRcdFx0XHQvLyBhc3NpZ24gc3RhdGVzYW5kaW5mb3MgdG8gdGhlaXIgbGF5b3V0XG5cdFx0XHRcdGN5LnN0eWxlKCkudXBkYXRlKCk7XG5cdFx0XHRcdC8vIGN5LnN0YXJ0QmF0Y2goKTtcblxuXHRcdFx0XHQvLyB0aGlzIGNoZWNrIGlzIGZvciBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudFxuXHRcdFx0XHRpZiAoIShjeS5ub2RlcygpLmxlbmd0aCA+IDMwMDAgfHwgY3kuZWRnZXMoKS5sZW5ndGggPiAzMDAwKSkge1xuXHRcdFx0XHRcdGN5Lm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0XHRcdFx0c2V0Q29tcG91bmRJbmZvYm94ZXMobm9kZSwgaXNMYXlvdXRSZXF1aXJlZCwgY3kpO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKGNhbGxiYWNrKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vY3kuZW5kQmF0Y2goKTtcblx0XHRcdH0pO1xuXHRcdH1cblxuXHRcdHZhciBzZWxlY3Rpb25Db2xvciA9ICcjODk4OThhJztcblx0XHR2YXIgc2JnblN0eWxlU2hlZXQgPSBjeXRvc2NhcGUuc3R5bGVzaGVldCgpXG5cdFx0XHQuc2VsZWN0b3IoXCJub2RlXCIpXG5cdFx0XHQuY3NzKHtcblx0XHRcdFx0J3RleHQtdmFsaWduJzogJ2NlbnRlcicsXG5cdFx0XHRcdCd0ZXh0LWhhbGlnbic6ICdjZW50ZXInLFxuXHRcdFx0XHQndGV4dC1vcGFjaXR5JzogMSxcblx0XHRcdFx0J29wYWNpdHknOiAxLFxuXHRcdFx0XHQncGFkZGluZyc6IDBcblx0XHRcdH0pXG5cdFx0XHQuc2VsZWN0b3IoXCJub2RlW2NsYXNzXVwiKVxuXHRcdFx0LmNzcyh7XG5cdFx0XHRcdCdzaGFwZSc6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlbWVudFV0aWxpdGllcy5nZXRDeVNoYXBlKGVsZSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdjb250ZW50JzogZnVuY3Rpb24gKGVsZSkge1xuXHRcdFx0XHRcdHJldHVybiBlbGVtZW50VXRpbGl0aWVzLmdldEVsZW1lbnRDb250ZW50KGVsZSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdmb250LXNpemUnOiBmdW5jdGlvbiAoZWxlKSB7XG5cdFx0XHRcdFx0Ly8gSWYgbm9kZSBsYWJlbHMgYXJlIGV4cGVjdGVkIHRvIGJlIGFkanVzdGVkIGF1dG9tYXRpY2FsbHkgb3IgZWxlbWVudCBjYW5ub3QgaGF2ZSBsYWJlbFxuXHRcdFx0XHRcdC8vIG9yIGVsZS5kYXRhKCdmb250LXNpemUnKSBpcyBub3QgZGVmaW5lZCByZXR1cm4gZWxlbWVudFV0aWxpdGllcy5nZXRMYWJlbFRleHRTaXplKClcblx0XHRcdFx0XHQvLyBlbHNlIHJldHVybiBlbGUuZGF0YSgnZm9udC1zaXplJylcblx0XHRcdFx0XHR2YXIgb3B0ID0gb3B0aW9ucy5hZGp1c3ROb2RlTGFiZWxGb250U2l6ZUF1dG9tYXRpY2FsbHk7XG5cdFx0XHRcdFx0dmFyIGFkanVzdCA9IHR5cGVvZiBvcHQgPT09ICdmdW5jdGlvbicgPyBvcHQoKSA6IG9wdDtcblxuXHRcdFx0XHRcdGlmICghYWRqdXN0ICYmIGVsZS5kYXRhKCdmb250LXNpemUnKSAhPSB1bmRlZmluZWQpIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGUuZGF0YSgnZm9udC1zaXplJyk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIGVsZW1lbnRVdGlsaXRpZXMuZ2V0TGFiZWxUZXh0U2l6ZShlbGUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZVtjbGFzc11bZm9udC1mYW1pbHldXCIpXG5cdFx0XHQuc3R5bGUoe1xuXHRcdFx0XHQnZm9udC1mYW1pbHknOiBmdW5jdGlvbiAoZWxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZS5kYXRhKCdmb250LWZhbWlseScpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZVtjbGFzc11bZm9udC1zdHlsZV1cIilcblx0XHRcdC5zdHlsZSh7XG5cdFx0XHRcdCdmb250LXN0eWxlJzogZnVuY3Rpb24gKGVsZSkge1xuXHRcdFx0XHRcdHJldHVybiBlbGUuZGF0YSgnZm9udC1zdHlsZScpXG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuc2VsZWN0b3IoXCJub2RlW2NsYXNzXVtmb250LXdlaWdodF1cIilcblx0XHRcdC5zdHlsZSh7XG5cdFx0XHRcdCdmb250LXdlaWdodCc6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlLmRhdGEoJ2ZvbnQtd2VpZ2h0Jyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuc2VsZWN0b3IoXCJub2RlW2NsYXNzXVtjb2xvcl1cIilcblx0XHRcdC5zdHlsZSh7XG5cdFx0XHRcdCdjb2xvcic6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlLmRhdGEoJ2NvbG9yJyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuc2VsZWN0b3IoXCJub2RlW2NsYXNzXVtiYWNrZ3JvdW5kLWNvbG9yXVwiKVxuXHRcdFx0LnN0eWxlKHtcblx0XHRcdFx0J2JhY2tncm91bmQtY29sb3InOiBmdW5jdGlvbiAoZWxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZS5kYXRhKCdiYWNrZ3JvdW5kLWNvbG9yJyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuc2VsZWN0b3IoXCJub2RlW2NsYXNzXVtiYWNrZ3JvdW5kLW9wYWNpdHldXCIpXG5cdFx0XHQuc3R5bGUoe1xuXHRcdFx0XHQnYmFja2dyb3VuZC1vcGFjaXR5JzogZnVuY3Rpb24gKGVsZSkge1xuXHRcdFx0XHRcdHJldHVybiBlbGUuZGF0YSgnYmFja2dyb3VuZC1vcGFjaXR5Jyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuc2VsZWN0b3IoXCJub2RlW2NsYXNzXVtib3JkZXItd2lkdGhdXCIpXG5cdFx0XHQuc3R5bGUoe1xuXHRcdFx0XHQnYm9yZGVyLXdpZHRoJzogZnVuY3Rpb24gKGVsZSkge1xuXHRcdFx0XHRcdHJldHVybiBlbGUuZGF0YSgnYm9yZGVyLXdpZHRoJyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuc2VsZWN0b3IoXCJub2RlW2NsYXNzXVtib3JkZXItY29sb3JdXCIpXG5cdFx0XHQuc3R5bGUoe1xuXHRcdFx0XHQnYm9yZGVyLWNvbG9yJzogZnVuY3Rpb24gKGVsZSkge1xuXHRcdFx0XHRcdHJldHVybiBlbGUuZGF0YSgnYm9yZGVyLWNvbG9yJyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuc2VsZWN0b3IoXCJub2RlW2NsYXNzXVt0ZXh0LXdyYXBdXCIpXG5cdFx0XHQuc3R5bGUoe1xuXHRcdFx0XHQndGV4dC13cmFwJzogZnVuY3Rpb24gKGVsZSkge1xuXHRcdFx0XHRcdHZhciBvcHQgPSBvcHRpb25zLmZpdExhYmVsc1RvTm9kZXM7XG5cdFx0XHRcdFx0dmFyIGlzRml0ID0gdHlwZW9mIG9wdCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdCgpIDogb3B0O1xuXHRcdFx0XHRcdGlmIChpc0ZpdCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuICdlbGxpcHNpcyc7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBlbGUuZGF0YSgndGV4dC13cmFwJyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuc2VsZWN0b3IoXCJub2RlXCIpXG5cdFx0XHQuc3R5bGUoe1xuXHRcdFx0XHQndGV4dC1tYXgtd2lkdGgnOiBmdW5jdGlvbiAoZWxlKSB7XG5cdFx0XHRcdFx0dmFyIG9wdCA9IG9wdGlvbnMuZml0TGFiZWxzVG9Ob2Rlcztcblx0XHRcdFx0XHR2YXIgaXNGaXQgPSB0eXBlb2Ygb3B0ID09PSAnZnVuY3Rpb24nID8gb3B0KCkgOiBvcHQ7XG5cdFx0XHRcdFx0aWYgKGlzRml0KSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlLndpZHRoKCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiAnMTAwMHB4Jztcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5zZWxlY3RvcihcImVkZ2VbY2xhc3NdW2xpbmUtY29sb3JdXCIpXG5cdFx0XHQuc3R5bGUoe1xuXHRcdFx0XHQnbGluZS1jb2xvcic6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlLmRhdGEoJ2xpbmUtY29sb3InKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0J3NvdXJjZS1hcnJvdy1jb2xvcic6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlLmRhdGEoJ2xpbmUtY29sb3InKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0J3RhcmdldC1hcnJvdy1jb2xvcic6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlLmRhdGEoJ2xpbmUtY29sb3InKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5zZWxlY3RvcihcImVkZ2VbY2xhc3NdW3dpZHRoXVwiKVxuXHRcdFx0LnN0eWxlKHtcblx0XHRcdFx0J3dpZHRoJzogZnVuY3Rpb24gKGVsZSkge1xuXHRcdFx0XHRcdHJldHVybiBlbGUuZGF0YSgnd2lkdGgnKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5zZWxlY3RvcihcIm5vZGVbY2xhc3M9J2Fzc29jaWF0aW9uJ10sW2NsYXNzPSdkaXNzb2NpYXRpb24nXSxbY2xhc3M9J2FuZCddLFtjbGFzcz0nb3InXSxbY2xhc3M9J25vdCddLFtjbGFzcz0ncHJvY2VzcyddLFtjbGFzcz0nb21pdHRlZCBwcm9jZXNzJ10sW2NsYXNzPSd1bmNlcnRhaW4gcHJvY2VzcyddLFtjbGFzcz0ndHJ1bmNhdGVkIHByb2Nlc3MnXSxbY2xhc3M9J3Vua25vd24gbG9naWNhbCBvcGVyYXRvciddXCIpXG5cdFx0XHQuY3NzKHtcblx0XHRcdFx0J3NoYXBlLXBvbHlnb24tcG9pbnRzJzogZnVuY3Rpb24gKGVsZSkge1xuXHRcdFx0XHRcdGlmIChncmFwaFV0aWxpdGllcy5wb3J0c0VuYWJsZWQgPT09IHRydWUgJiYgZWxlLmRhdGEoJ3BvcnRzJykubGVuZ3RoID09PSAyKSB7XG5cdFx0XHRcdFx0XHQvLyBXZSBhc3N1bWUgdGhhdCB0aGUgcG9ydHMgb2YgdGhlIGVkZ2UgYXJlIHN5bWV0cmljIGFjY29yZGluZyB0byB0aGUgbm9kZSBjZW50ZXIgc28ganVzdCBjaGVja2luZyBvbmUgcG9ydCBpcyBlbm91Z2ggZm9yIHVzXG5cdFx0XHRcdFx0XHR2YXIgcG9ydCA9IGVsZS5kYXRhKCdwb3J0cycpWzBdO1xuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHBvcnRzIGFyZSBsb2NhdGVkIGFib3ZlL2JlbG93IG9mIHRoZSBub2RlIHRoZW4gdGhlIG9yaWVudGF0aW9uIGlzICd2ZXJ0aWNhbCcgZWxzZSBpdCBpcyAnaG9yaXpvbnRhbCdcblx0XHRcdFx0XHRcdHZhciBvcmllbnRhdGlvbiA9IHBvcnQueCA9PT0gMCA/ICd2ZXJ0aWNhbCcgOiAnaG9yaXpvbnRhbCc7XG5cdFx0XHRcdFx0XHQvLyBUaGUgaGFsZiB3aWR0aCBvZiB0aGUgYWN0dWFsIHNoYXBlIGRpc2NsdWRpbmcgdGhlIHBvcnRzXG5cdFx0XHRcdFx0XHR2YXIgc2hhcGVIVyA9IG9yaWVudGF0aW9uID09PSAndmVydGljYWwnID8gNTAgLyBNYXRoLmFicyhwb3J0LnkpIDogNTAgLyBNYXRoLmFicyhwb3J0LngpO1xuXHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBjbGFzcyBvZiB0aGUgbm9kZVxuXHRcdFx0XHRcdFx0dmFyIF9jbGFzcyA9IGVsZS5kYXRhKCdjbGFzcycpO1xuXHRcdFx0XHRcdFx0Ly8gSWYgY2xhc3MgaXMgb25lIG9mIHByb2Nlc3MsIG9taXR0ZWQgcHJvY2VzcyBvciB1bmNlcnRhaW4gcHJvY2VzcyB0aGVuIHRoZSB0eXBlIG9mIGFjdHVhbCBzaGFwZSBpcyAncmVjdGFuZ2xlJyBlbHNlIGl0IGlzICdjaXJjbGUnXG5cdFx0XHRcdFx0XHR2YXIgdHlwZSA9IF9jbGFzcy5lbmRzV2l0aCgncHJvY2VzcycpID8gJ3JlY3RhbmdsZScgOiAnY2lyY2xlJztcblxuXHRcdFx0XHRcdFx0Ly8gR2VuZXJhdGUgYSBwb2x5Z29uIHN0cmluZyB3aXRoIGFib3ZlIHBhcmFtZXRlcnMgYW5kIHJldHVybiBpdFxuXHRcdFx0XHRcdFx0cmV0dXJuIGdlbmVyYXRlU2hhcGVXaXRoUG9ydFN0cmluZygwLjAxLCBzaGFwZUhXLCB0eXBlLCBvcmllbnRhdGlvbik7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gVGhpcyBlbGVtZW50IGlzIG5vdCBleHBlY3RlZCB0byBoYXZlIGEgcG95Z29uaWFsIHNoYXBlIChCZWNhdXNlIGl0IGRvZXMgbm90IGhhdmUgMiBwb3J0cykganVzdCByZXR1cm4gYSB0cml2aWFsIHN0cmluZyBoZXJlIG5vdCB0byBoYXZlIGEgcnVuIHRpbWUgYnVnXG5cdFx0XHRcdFx0cmV0dXJuICctMSAtMSAxIDEgMSAwJztcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5zZWxlY3RvcihcIm5vZGVbY2xhc3M9J3BlcnR1cmJpbmcgYWdlbnQnXVwiKVxuXHRcdFx0LmNzcyh7XG5cdFx0XHRcdCdzaGFwZS1wb2x5Z29uLXBvaW50cyc6ICctMSwgLTEsICAgLTAuNSwgMCwgIC0xLCAxLCAgIDEsIDEsICAgMC41LCAwLCAxLCAtMSdcblx0XHRcdH0pXG5cdFx0XHQuc2VsZWN0b3IoXCJub2RlW2NsYXNzPSd0YWcnXVwiKVxuXHRcdFx0LmNzcyh7XG5cdFx0XHRcdCdzaGFwZS1wb2x5Z29uLXBvaW50cyc6ICctMSwgLTEsICAgMC4yNSwgLTEsICAgMSwgMCwgICAgMC4yNSwgMSwgICAgLTEsIDEnXG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZTpwYXJlbnRbY2xhc3NePSdjb21wbGV4J11cIikgLy8gc3RhcnQgd2l0aCBjb21wbGV4XG5cdFx0XHQuY3NzKHtcblx0XHRcdFx0J3RleHQtdmFsaWduJzogJ2JvdHRvbScsXG5cdFx0XHRcdCd0ZXh0LWhhbGlnbic6ICdjZW50ZXInLFxuXHRcdFx0XHQndGV4dC1tYXJnaW4teSc6IGVsZW1lbnRVdGlsaXRpZXMuZ2V0Q29tcGxleE1hcmdpbixcblx0XHRcdFx0J3BhZGRpbmcnOiBlbGVtZW50VXRpbGl0aWVzLmdldENvbXBsZXhQYWRkaW5nLFxuXHRcdFx0XHQnY29tcG91bmQtc2l6aW5nLXdydC1sYWJlbHMnOiAnZXhjbHVkZScsXG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZVtjbGFzcz0nY29tcGFydG1lbnQnXVwiKVxuXHRcdFx0LmNzcyh7XG5cdFx0XHRcdCd0ZXh0LXZhbGlnbic6ICdib3R0b20nLFxuXHRcdFx0XHQndGV4dC1oYWxpZ24nOiAnY2VudGVyJyxcblx0XHRcdFx0J3RleHQtbWFyZ2luLXknOiAtMSAqIG9wdGlvbnMuZXh0cmFDb21wYXJ0bWVudFBhZGRpbmcsXG5cdFx0XHRcdCdjb21wb3VuZC1zaXppbmctd3J0LWxhYmVscyc6ICdleGNsdWRlJyxcblx0XHRcdH0pXG5cdFx0XHQuc2VsZWN0b3IoXCJub2RlOnBhcmVudFtjbGFzcz0nY29tcGFydG1lbnQnXVwiKVxuXHRcdFx0LmNzcyh7XG5cdFx0XHRcdCdwYWRkaW5nJzogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBncmFwaFV0aWxpdGllcy5nZXRDb21wb3VuZFBhZGRpbmdzKCkgKyBvcHRpb25zLmV4dHJhQ29tcGFydG1lbnRQYWRkaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZVtjbGFzcz0nc3VibWFwJ11cIilcblx0XHRcdC5jc3Moe1xuXHRcdFx0XHQndGV4dC12YWxpZ24nOiAnYm90dG9tJyxcblx0XHRcdFx0J3RleHQtaGFsaWduJzogJ2NlbnRlcicsXG5cdFx0XHRcdCd0ZXh0LW1hcmdpbi15JzogLTEgKiBvcHRpb25zLmV4dHJhQ29tcGFydG1lbnRQYWRkaW5nLFxuXHRcdFx0XHQnY29tcG91bmQtc2l6aW5nLXdydC1sYWJlbHMnOiAnZXhjbHVkZScsXG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZTpwYXJlbnRbY2xhc3M9J3N1Ym1hcCddLFtjbGFzcz0ndG9wb2xvZ3kgZ3JvdXAnXVwiKVxuXHRcdFx0LmNzcyh7XG5cdFx0XHRcdCdwYWRkaW5nJzogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdHJldHVybiBncmFwaFV0aWxpdGllcy5nZXRDb21wb3VuZFBhZGRpbmdzKCkgKyBvcHRpb25zLmV4dHJhQ29tcGFydG1lbnRQYWRkaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZTpjaGlsZGxlc3NbYmJveF1cIilcblx0XHRcdC5jc3Moe1xuXHRcdFx0XHQnd2lkdGgnOiAnZGF0YShiYm94LncpJyxcblx0XHRcdFx0J2hlaWdodCc6ICdkYXRhKGJib3guaCknXG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZTpwYXJlbnRbbWluSGVpZ2h0XVwiKVxuXHRcdFx0LmNzcyh7XG5cdFx0XHRcdCdtaW4taGVpZ2h0JzogZnVuY3Rpb24gKGVsZSkge1xuXHRcdFx0XHRcdGlmIChncmFwaFV0aWxpdGllcy5jb21wb3VuZFNpemVzQ29uc2lkZXJlZCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZS5kYXRhKCdtaW5IZWlnaHQnKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5zZWxlY3RvcihcIm5vZGU6cGFyZW50W21pbkhlaWdodEJpYXNUb3BdXCIpXG5cdFx0XHQuY3NzKHtcblx0XHRcdFx0J21pbi1oZWlnaHQtYmlhcy10b3AnOiBmdW5jdGlvbiAoZWxlKSB7XG5cdFx0XHRcdFx0dmFyIG1pbiA9IHBhcnNlRmxvYXQoZWxlLmRhdGEoJ21pbkhlaWdodEJpYXNUb3AnKSk7XG5cdFx0XHRcdFx0cmV0dXJuIChtaW4gPj0gMCA/IG1pbiA6IDEwMCkgKyAnJSc7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuc2VsZWN0b3IoXCJub2RlOnBhcmVudFttaW5IZWlnaHRCaWFzQm90dG9tXVwiKVxuXHRcdFx0LmNzcyh7XG5cdFx0XHRcdCdtaW4taGVpZ2h0LWJpYXMtYm90dG9tJzogZnVuY3Rpb24gKGVsZSkge1xuXHRcdFx0XHRcdHZhciBtaW4gPSBwYXJzZUZsb2F0KGVsZS5kYXRhKCdtaW5IZWlnaHRCaWFzQm90dG9tJykpO1xuXHRcdFx0XHRcdHJldHVybiAobWluID49IDAgPyBtaW4gOiAxMDApICsgJyUnO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZTpwYXJlbnRbbWluV2lkdGhdXCIpXG5cdFx0XHQuY3NzKHtcblx0XHRcdFx0J21pbi13aWR0aCc6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHRpZiAoZ3JhcGhVdGlsaXRpZXMuY29tcG91bmRTaXplc0NvbnNpZGVyZWQpIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGUuZGF0YSgnbWluV2lkdGgnKTtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gMDtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5zZWxlY3RvcihcIm5vZGU6cGFyZW50W21pbldpZHRoQmlhc0xlZnRdXCIpXG5cdFx0XHQuY3NzKHtcblx0XHRcdFx0J21pbi13aWR0aC1iaWFzLWxlZnQnOiBmdW5jdGlvbiAoZWxlKSB7XG5cdFx0XHRcdFx0dmFyIG1pbiA9IHBhcnNlRmxvYXQoZWxlLmRhdGEoJ21pbldpZHRoQmlhc0xlZnQnKSk7XG5cdFx0XHRcdFx0cmV0dXJuIChtaW4gPj0gMCA/IG1pbiA6IDEwMCkgKyAnJSc7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuc2VsZWN0b3IoXCJub2RlOnBhcmVudFttaW5XaWR0aEJpYXNSaWdodF1cIilcblx0XHRcdC5jc3Moe1xuXHRcdFx0XHQnbWluLXdpZHRoLWJpYXMtcmlnaHQnOiBmdW5jdGlvbiAoZWxlKSB7XG5cdFx0XHRcdFx0dmFyIG1pbiA9IHBhcnNlRmxvYXQoZWxlLmRhdGEoJ21pbldpZHRoQmlhc1JpZ2h0JykpO1xuXHRcdFx0XHRcdHJldHVybiAobWluID49IDAgPyBtaW4gOiAxMDApICsgJyUnO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZS5jeS1leHBhbmQtY29sbGFwc2UtY29sbGFwc2VkLW5vZGVcIilcblx0XHRcdC5jc3Moe1xuXHRcdFx0XHQnYm9yZGVyLXN0eWxlJzogJ2Rhc2hlZCdcblx0XHRcdH0pXG5cdFx0XHQvLyAgIC5zZWxlY3RvcihcIm5vZGU6c2VsZWN0ZWRcIilcblx0XHRcdC8vICAgLmNzcyh7XG5cdFx0XHQvLyAgICAgJ2JvcmRlci1jb2xvcic6IHNlbGVjdGlvbkNvbG9yLFxuXHRcdFx0Ly8gICAgICd0YXJnZXQtYXJyb3ctY29sb3InOiAnIzAwMCcsXG5cdFx0XHQvLyBcdCd0ZXh0LW91dGxpbmUtY29sb3InOiAnIzAwMCcsXG5cdFx0XHQvLyBcdCdib3JkZXItd2lkdGgnOiBmdW5jdGlvbihlbGUpe1xuXHRcdFx0Ly8gXHRcdHJldHVybiBNYXRoLm1heChwYXJzZUZsb2F0KGVsZS5kYXRhKCdib3JkZXItd2lkdGgnKSkgKyAyLCAzKTtcblx0XHRcdC8vIFx0ICB9XG5cdFx0XHQvLyAgIH0pXG5cdFx0XHQuc2VsZWN0b3IoXCJub2RlOmFjdGl2ZVwiKVxuXHRcdFx0LmNzcyh7XG5cdFx0XHRcdCdiYWNrZ3JvdW5kLW9wYWNpdHknOiAwLjcsICdvdmVybGF5LWNvbG9yJzogc2VsZWN0aW9uQ29sb3IsXG5cdFx0XHRcdCdvdmVybGF5LXBhZGRpbmcnOiAnMTQnXG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwiZWRnZVwiKVxuXHRcdFx0LmNzcyh7XG5cdFx0XHRcdCdjdXJ2ZS1zdHlsZSc6ICdiZXppZXInLFxuXHRcdFx0XHQndGFyZ2V0LWFycm93LWZpbGwnOiBmdW5jdGlvbiAoZWxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZW1lbnRVdGlsaXRpZXMuZ2V0Q3lUYXJnZXRBcnJvd0ZpbGwoZWxlKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0J3NvdXJjZS1hcnJvdy1maWxsJzogJ2hvbGxvdycsXG5cdFx0XHRcdCd0ZXh0LWJvcmRlci1jb2xvcic6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHRpZiAoZWxlLnNlbGVjdGVkKCkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBzZWxlY3Rpb25Db2xvcjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIGVsZS5jc3MoJ2xpbmUtY29sb3InKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0J2NvbG9yJzogZnVuY3Rpb24gKGVsZSkge1xuXHRcdFx0XHRcdGlmIChlbGUuc2VsZWN0ZWQoKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHNlbGVjdGlvbkNvbG9yO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gZWxlLmNzcygnbGluZS1jb2xvcicpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnYXJyb3ctc2NhbGUnOiAxLjI1XG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwiZWRnZS5jeS1leHBhbmQtY29sbGFwc2UtbWV0YS1lZGdlXCIpXG5cdFx0XHQuY3NzKHtcblx0XHRcdFx0J2xpbmUtY29sb3InOiAnI0M0QzRDNCcsXG5cdFx0XHRcdCdzb3VyY2UtYXJyb3ctY29sb3InOiAnI0M0QzRDNCcsXG5cdFx0XHRcdCd0YXJnZXQtYXJyb3ctY29sb3InOiAnI0M0QzRDNCdcblx0XHRcdH0pXG5cdFx0XHQvLyAgIC5zZWxlY3RvcihcImVkZ2U6c2VsZWN0ZWRcIilcblx0XHRcdC8vICAgLmNzcyh7XG5cdFx0XHQvLyAgICAgJ2xpbmUtY29sb3InOiBzZWxlY3Rpb25Db2xvcixcblx0XHRcdC8vICAgICAnc291cmNlLWFycm93LWNvbG9yJzogc2VsZWN0aW9uQ29sb3IsXG5cdFx0XHQvLyBcdCd0YXJnZXQtYXJyb3ctY29sb3InOiBzZWxlY3Rpb25Db2xvcixcblx0XHRcdC8vIFx0J3dpZHRoJzogZnVuY3Rpb24oZWxlKXtcblx0XHRcdC8vIFx0XHRyZXR1cm4gTWF0aC5tYXgocGFyc2VGbG9hdChlbGUuZGF0YSgnd2lkdGgnKSkgKyAyLCAzKTtcblx0XHRcdC8vIFx0ICB9XG5cdFx0XHQvLyAgIH0pXG5cdFx0XHQuc2VsZWN0b3IoXCJlZGdlOmFjdGl2ZVwiKVxuXHRcdFx0LmNzcyh7XG5cdFx0XHRcdCdiYWNrZ3JvdW5kLW9wYWNpdHknOiAwLjcsICdvdmVybGF5LWNvbG9yJzogc2VsZWN0aW9uQ29sb3IsXG5cdFx0XHRcdCdvdmVybGF5LXBhZGRpbmcnOiAnOCdcblx0XHRcdH0pXG5cdFx0XHQuc2VsZWN0b3IoXCJlZGdlW2NhcmRpbmFsaXR5ID4gMF1cIilcblx0XHRcdC5jc3Moe1xuXHRcdFx0XHQndGV4dC1yb3RhdGlvbic6ICdhdXRvcm90YXRlJyxcblx0XHRcdFx0J3RleHQtYmFja2dyb3VuZC1zaGFwZSc6ICdyZWN0YW5nbGUnLFxuXHRcdFx0XHQndGV4dC1ib3JkZXItb3BhY2l0eSc6ICcxJyxcblx0XHRcdFx0J3RleHQtYm9yZGVyLXdpZHRoJzogJzEnLFxuXHRcdFx0XHQndGV4dC1iYWNrZ3JvdW5kLWNvbG9yJzogJ3doaXRlJyxcblx0XHRcdFx0J3RleHQtYmFja2dyb3VuZC1vcGFjaXR5JzogJzEnXG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwiZWRnZVtjbGFzcz0nY29uc3VtcHRpb24nXVtjYXJkaW5hbGl0eSA+IDBdXCIpXG5cdFx0XHQuY3NzKHtcblx0XHRcdFx0J3NvdXJjZS1sYWJlbCc6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gJycgKyBlbGUuZGF0YSgnY2FyZGluYWxpdHknKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0J3NvdXJjZS10ZXh0LW1hcmdpbi15JzogJy0xMCcsXG5cdFx0XHRcdCdzb3VyY2UtdGV4dC1vZmZzZXQnOiAnMTgnLFxuXHRcdFx0XHQnZm9udC1zaXplJzogJzEzJ1xuXHRcdFx0fSlcblx0XHRcdC5zZWxlY3RvcihcImVkZ2VbY2xhc3M9J3Byb2R1Y3Rpb24nXVtjYXJkaW5hbGl0eSA+IDBdXCIpXG5cdFx0XHQuY3NzKHtcblx0XHRcdFx0J3RhcmdldC1sYWJlbCc6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gJycgKyBlbGUuZGF0YSgnY2FyZGluYWxpdHknKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0J3RhcmdldC10ZXh0LW1hcmdpbi15JzogJy0xMCcsXG5cdFx0XHRcdCd0YXJnZXQtdGV4dC1vZmZzZXQnOiAnMTgnLFxuXHRcdFx0XHQnZm9udC1zaXplJzogJzEzJ1xuXHRcdFx0fSlcblx0XHRcdC5zZWxlY3RvcihcImVkZ2VbY2xhc3NdXCIpXG5cdFx0XHQuY3NzKHtcblx0XHRcdFx0J3RhcmdldC1hcnJvdy1zaGFwZSc6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlbWVudFV0aWxpdGllcy5nZXRDeUFycm93U2hhcGUoZWxlKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0J3NvdXJjZS1hcnJvdy1zaGFwZSc6ICdub25lJyxcblx0XHRcdFx0J3NvdXJjZS1lbmRwb2ludCc6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlbWVudFV0aWxpdGllcy5nZXRFbmRQb2ludChlbGUsICdzb3VyY2UnKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0J3RhcmdldC1lbmRwb2ludCc6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlbWVudFV0aWxpdGllcy5nZXRFbmRQb2ludChlbGUsICd0YXJnZXQnKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0J2xpbmUtc3R5bGUnOiBmdW5jdGlvbiAoZWxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZW1lbnRVdGlsaXRpZXMuZ2V0QXJyYXlMaW5lU3R5bGUoZWxlKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0J2xpbmUtZGFzaC1wYXR0ZXJuJzogZnVuY3Rpb24gKGVsZSkge1xuXHRcdFx0XHRcdHJldHVybiBlbGVtZW50VXRpbGl0aWVzLmdldEFycmF5TGluZURhc2hTdHlsZShlbGUpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwiY29yZVwiKVxuXHRcdFx0LmNzcyh7XG5cdFx0XHRcdCdzZWxlY3Rpb24tYm94LWNvbG9yJzogc2VsZWN0aW9uQ29sb3IsXG5cdFx0XHRcdCdzZWxlY3Rpb24tYm94LW9wYWNpdHknOiAnMC4yJywgJ3NlbGVjdGlvbi1ib3gtYm9yZGVyLWNvbG9yJzogc2VsZWN0aW9uQ29sb3Jcblx0XHRcdH0pO1xuXG5cdFx0dmFyIHNiZ25OZXR3b3JrQ29udGFpbmVyID0gJChvcHRpb25zLm5ldHdvcmtDb250YWluZXJTZWxlY3Rvcik7XG5cblx0XHQvLyBjcmVhdGUgYW5kIGluaXQgY3l0b3NjYXBlOlxuXHRcdGN5dG9zY2FwZSh7XG5cdFx0XHRjb250YWluZXI6IHNiZ25OZXR3b3JrQ29udGFpbmVyLFxuXHRcdFx0c3R5bGU6IHNiZ25TdHlsZVNoZWV0LFxuXHRcdFx0c2hvd092ZXJsYXk6IGZhbHNlLCBtaW5ab29tOiAwLjEyNSwgbWF4Wm9vbTogMTYsXG5cdFx0XHRib3hTZWxlY3Rpb25FbmFibGVkOiB0cnVlLFxuXHRcdFx0bW90aW9uQmx1cjogdHJ1ZSxcblx0XHRcdHdoZWVsU2Vuc2l0aXZpdHk6IDAuMSxcblx0XHRcdHJlYWR5OiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdGN5ID0gdGhpcztcblx0XHRcdFx0Ly8gSWYgdW5kb2FibGUgcmVnaXN0ZXIgdW5kby9yZWRvIGFjdGlvbnNcblx0XHRcdFx0aWYgKG9wdGlvbnMudW5kb2FibGUpIHtcblx0XHRcdFx0XHRyZWdpc3RlclVuZG9SZWRvQWN0aW9ucygpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGJpbmRDeUV2ZW50cygpO1xuXHRcdFx0fVxuXHRcdH0pO1xuXHR9O1xuXG5cdHNiZ25DeUluc3RhbmNlLmdldEN5ID0gZnVuY3Rpb24gKCkge1xuXHRcdHJldHVybiBjeTtcblx0fTtcblxuXHRyZXR1cm4gc2JnbkN5SW5zdGFuY2U7XG59O1xuIl0sIm5hbWVzIjpbImNsYXNzZXMiLCJyZXF1aXJlIiwibGlicyIsImdldExpYnMiLCJqUXVlcnkiLCIkIiwiY3l0b3NjYXBlIiwiVGlwcHkiLCJ0aXBweSIsIm1vZHVsZSIsImV4cG9ydHMiLCJlbGVtZW50VXRpbGl0aWVzIiwiZ3JhcGhVdGlsaXRpZXMiLCJtYWluVXRpbGl0aWVzIiwidW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMiLCJvcHRpb25VdGlsaXRpZXMiLCJleHBlcmltZW50YWxEYXRhT3ZlcmxheSIsInJlZnJlc2hQYWRkaW5ncyIsIm9wdGlvbnMiLCJjeSIsInNiZ25DeUluc3RhbmNlIiwicGFyYW0iLCJiaW5kIiwiZ2V0T3B0aW9ucyIsImdldFBvaW50T25DaXJjbGUiLCJjZW50ZXJYIiwiY2VudGVyWSIsInJhZGl1cyIsImFuZ2xlSW5EZWdyZWUiLCJhbmdsZUluUmFkaWFuIiwiTWF0aCIsIlBJIiwieCIsImNvcyIsInkiLCJzaW4iLCJnZW5lcmF0ZUNpcmNsZVN0cmluZyIsImFuZ2xlRnJvbSIsImFuZ2xlVG8iLCJudW1PZlBvaW50cyIsImNpcmNsZVN0ciIsInN0ZXBTaXplIiwiY3VycmVudEFuZ2xlIiwiaSIsInBvaW50IiwiZ2VuZXJhdGVTaGFwZVdpdGhQb3J0U3RyaW5nIiwibGluZUhXIiwic2hhcGVIVyIsInR5cGUiLCJvcmllbnRhdGlvbiIsInBvbHlnb25TdHIiLCJhYm92ZVBvaW50cyIsImJlbG93UG9pbnRzIiwibGVmdFBvaW50cyIsInJpZ2h0UG9pbnRzIiwicmVnaXN0ZXJVbmRvUmVkb0FjdGlvbnMiLCJ1ciIsInVuZG9SZWRvIiwiYWN0aW9uIiwiZGVsZXRlRWxlc1NpbXBsZSIsInJlc3RvcmVFbGVzIiwiZGVsZXRlTm9kZXNTbWFydCIsInNldFBvcnRzT3JkZXJpbmciLCJyZW1vdmVBbGwiLCJyZXN0b3JlQWxsIiwiaGlkZUV4cCIsInVuaGlkZUV4cCIsImhpZGVGaWxlIiwiaGlkZUZpbGVVbmRvIiwidW5oaWRlRmlsZSIsInVuaGlkZUZpbGVVbmRvIiwicmVtb3ZlRXhwIiwiYWRkRXhwIiwicmVtb3ZlRmlsZSIsImFkZEZpbGUiLCJleHBCdXR0b25DaGFuZ2UiLCJmaWxlQnV0dG9uQ2hhbmdlSGlkZSIsImZpbGVCdXR0b25DaGFuZ2VVbkhpZGUiLCJzaG93VG9vbHRpcCIsImV2ZW50Iiwibm9kZSIsInRhcmdldCIsImN5VGFyZ2V0IiwiY2FuSGF2ZVRvb2x0aXAiLCJpc1NJRk5vZGUiLCJkYXRhIiwicmVmIiwicG9zIiwicG9zaXRpb24iLCJjeVBvc2l0aW9uIiwicGFuIiwiem9vbSIsImluZm9ib3giLCJBdXhpbGlhcnlVbml0IiwiY2hlY2tQb2ludCIsInRvb2x0aXBDb250ZW50IiwidW5kZWZpbmVkIiwicG9wcGVyUmVmIiwibW9kZWxQb3MiLCJnZXRBYnNvbHV0ZUNvb3JkIiwibW9kZWxXIiwiYmJveCIsInciLCJtb2RlbEgiLCJoIiwicmVuZGVyZWRXIiwicmVuZGVyZWRIIiwicmVuZGVyZWRQb3MiLCJjb252ZXJ0VG9SZW5kZXJlZFBvc2l0aW9uIiwicmVuZGVyZWREaW1zIiwicmVuZGVyZWRQb3NpdGlvbiIsInJlbmRlcmVkRGltZW5zaW9ucyIsInBsYWNlbWVudCIsImFuY2hvclNpZGUiLCJkZXN0cm95VGlwcHkiLCJvbmUiLCJjb250ZW50IiwiZG9jdW1lbnQiLCJjcmVhdGVFbGVtZW50Iiwic3R5bGUiLCJpbm5lckhUTUwiLCJ0cmlnZ2VyIiwiaGlkZU9uQ2xpY2siLCJhcnJvdyIsIm9uSGlkZGVuIiwib2ZmIiwiZGVzdHJveSIsIm9uIiwic2V0VGltZW91dCIsInNob3ciLCJiaW5kQ3lFdmVudHMiLCJ3YWl0RHVyYXRpb24iLCJub2RlVGFwZHJhZ291dCIsImN1cnJFdmVudCIsImluUXVldWUiLCJjbGVhck5vZGVFdmVudCIsIm5vZGVUYXBkcmFnIiwiZ2V0U2hvd1Rvb2x0aXBBc3ljbiIsInNob3dUb29sdGlwQXN5Y24iLCJlIiwiY2xlYXJUaW1lb3V0IiwidXBkYXRlIiwiX3ByaXZhdGUiLCJzdGFydHNXaXRoIiwiaW5mb0xhYmVsIiwiZ2V0SW5mb0xhYmVsIiwic3RhcnRCYXRjaCIsImVuZEJhdGNoIiwicmVtb3ZlRGF0YSIsIm5vZGVzIiwidXBkYXRlQ29tcG91bmRCb3VuZHMiLCJyZWNhbGN1bGF0ZU9uQ29tcGxleGl0eU1hbmFnZW1lbnQiLCJyZW1vdmVTdHlsZSIsIm5hbWUiLCJhcmdzIiwibGVuZ3RoIiwicGFyZW50cyIsImVsZW1lbnRzIiwianNvbnMiLCJzaW1wbGVzIiwibm90IiwiYWxsRWxlbWVudHMiLCJjb25jYXQiLCJwb3J0cyIsImZvckVhY2giLCJjYW5IYXZlUG9ydHMiLCJpZCIsIkpTT04iLCJwYXJzZSIsInN0cmluZ2lmeSIsInZpZXdwb3J0IiwiYmVmb3JlUGVyZm9ybUxheW91dCIsImFsbEVsZW1lbnRzMiIsInBvcnRzMiIsInZpZXdwb3J0MiIsInJlcyIsImpzb24iLCJmbGF0RWxlcyIsImJhdGNoIiwibGF5b3V0IiwicG9ydHNFbmFibGVkIiwiZWRnZXMiLCJjaGFuZ2VQb3J0c09yaWVudGF0aW9uQWZ0ZXJMYXlvdXQiLCJfY3kiLCJpc0xheW91dFJlcXVpcmVkIiwiY2FsbGJhY2siLCJzZXRDb21wb3VuZEluZm9ib3hlcyIsImN5SW5zdGFuY2UiLCJpbmZvYm94Q2FsY3VsYXRlZCIsImlzUGFyZW50IiwiY2hpbGRyZW4iLCJjaGlsZE5vZGUiLCJjb3JyZWN0SW5mb0JveENvb3JkIiwic3RhdGVzYW5kaW5mb3MiLCJpbmZvQm94T25Ob2RlIiwic2V0QW5jaG9yU2lkZSIsImNvcmRSZXN1bHQiLCJjb252ZXJ0VG9SZWxhdGl2ZUNvb3JkIiwiaXNEaXNwbGF5ZWQiLCJsb2NhdGlvbiIsImxheW91dHMiLCJBdXhVbml0TGF5b3V0IiwiY29uc3RydWN0IiwiYWRkQXV4VW5pdCIsInNlbGVjdE5leHRBdmFpbGFibGUiLCJsb2NhdGlvbnMiLCJjaGVja0ZpdCIsImZpdFVuaXRzIiwic2VsZWN0aW9uQ29sb3IiLCJzYmduU3R5bGVTaGVldCIsInN0eWxlc2hlZXQiLCJzZWxlY3RvciIsImNzcyIsInNoYXBlIiwiZWxlIiwiZ2V0Q3lTaGFwZSIsImdldEVsZW1lbnRDb250ZW50IiwiZm9udFNpemUiLCJvcHQiLCJhZGp1c3ROb2RlTGFiZWxGb250U2l6ZUF1dG9tYXRpY2FsbHkiLCJhZGp1c3QiLCJnZXRMYWJlbFRleHRTaXplIiwiZm9udEZhbWlseSIsImZvbnRTdHlsZSIsImZvbnRXZWlnaHQiLCJjb2xvciIsImJhY2tncm91bmRDb2xvciIsImJhY2tncm91bmRPcGFjaXR5IiwiYm9yZGVyV2lkdGgiLCJib3JkZXJDb2xvciIsInRleHRXcmFwIiwiZml0TGFiZWxzVG9Ob2RlcyIsImlzRml0IiwidGV4dE1heFdpZHRoIiwid2lkdGgiLCJsaW5lQ29sb3IiLCJzb3VyY2VBcnJvd0NvbG9yIiwidGFyZ2V0QXJyb3dDb2xvciIsInNoYXBlUG9seWdvblBvaW50cyIsInBvcnQiLCJhYnMiLCJfY2xhc3MiLCJlbmRzV2l0aCIsImdldENvbXBsZXhNYXJnaW4iLCJnZXRDb21wbGV4UGFkZGluZyIsImV4dHJhQ29tcGFydG1lbnRQYWRkaW5nIiwicGFkZGluZyIsImdldENvbXBvdW5kUGFkZGluZ3MiLCJtaW5IZWlnaHQiLCJjb21wb3VuZFNpemVzQ29uc2lkZXJlZCIsIm1pbkhlaWdodEJpYXNUb3AiLCJtaW4iLCJwYXJzZUZsb2F0IiwibWluSGVpZ2h0Qmlhc0JvdHRvbSIsIm1pbldpZHRoIiwibWluV2lkdGhCaWFzTGVmdCIsIm1pbldpZHRoQmlhc1JpZ2h0IiwidGFyZ2V0QXJyb3dGaWxsIiwiZ2V0Q3lUYXJnZXRBcnJvd0ZpbGwiLCJ0ZXh0Qm9yZGVyQ29sb3IiLCJzZWxlY3RlZCIsInNvdXJjZUxhYmVsIiwidGFyZ2V0TGFiZWwiLCJ0YXJnZXRBcnJvd1NoYXBlIiwiZ2V0Q3lBcnJvd1NoYXBlIiwic291cmNlRW5kcG9pbnQiLCJnZXRFbmRQb2ludCIsInRhcmdldEVuZHBvaW50IiwibGluZVN0eWxlIiwiZ2V0QXJyYXlMaW5lU3R5bGUiLCJsaW5lRGFzaFBhdHRlcm4iLCJnZXRBcnJheUxpbmVEYXNoU3R5bGUiLCJzYmduTmV0d29ya0NvbnRhaW5lciIsIm5ldHdvcmtDb250YWluZXJTZWxlY3RvciIsImNvbnRhaW5lciIsInNob3dPdmVybGF5IiwibWluWm9vbSIsIm1heFpvb20iLCJib3hTZWxlY3Rpb25FbmFibGVkIiwibW90aW9uQmx1ciIsIndoZWVsU2Vuc2l0aXZpdHkiLCJyZWFkeSIsInVuZG9hYmxlIiwiZ2V0Q3kiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/sbgn-extensions/sbgn-cy-instance-factory.js\n"); +eval("var classes = __webpack_require__(/*! ../utilities/classes */ \"./src/utilities/classes.js\");\nvar libs = (__webpack_require__(/*! ../utilities/lib-utilities */ \"./src/utilities/lib-utilities.js\").getLibs)();\nvar jQuery = $ = libs.jQuery;\nvar cytoscape = libs.cytoscape;\nvar Tippy = libs.tippy;\nmodule.exports = function () {\n var elementUtilities, graphUtilities, mainUtilities, undoRedoActionFunctions, optionUtilities, experimentalDataOverlay;\n var refreshPaddings, options, cy;\n var sbgnCyInstance = function sbgnCyInstance(param) {\n elementUtilities = param.elementUtilities;\n graphUtilities = param.graphUtilities;\n experimentalDataOverlay = param.experimentalDataOverlay;\n mainUtilities = param.mainUtilities;\n undoRedoActionFunctions = param.undoRedoActionFunctions;\n refreshPaddings = graphUtilities.refreshPaddings.bind(graphUtilities);\n optionUtilities = param.optionUtilities;\n options = optionUtilities.getOptions();\n\n // cy = param.sbgnCyInstance.getCy();\n\n /*\n * Returns the coordinates of the point located on the given angle on the circle with the given centeral coordinates and radius.\n */\n var getPointOnCircle = function getPointOnCircle(centerX, centerY, radius, angleInDegree) {\n var angleInRadian = angleInDegree * (Math.PI / 180); // Convert degree to radian\n return {\n x: radius * Math.cos(angleInRadian) + centerX,\n y: -1 * radius * Math.sin(angleInRadian) + centerY // We multiply with -1 here because JS y coordinate sign is the oposite of the Mathamatical coordinates system\n };\n };\n\n /*\n * Generates a polygon string approximating a circle with given center, radius, start, end angles and number of points to represent the circle\n */\n var generateCircleString = function generateCircleString(centerX, centerY, radius, angleFrom, angleTo, numOfPoints) {\n var circleStr = \"\";\n var stepSize = (angleTo - angleFrom) / numOfPoints; // We will increment the current angle by step size in each iteration\n var currentAngle = angleFrom; // current angle will be updated in each iteration\n\n for (var i = 0; i < numOfPoints; i++) {\n var point = getPointOnCircle(centerX, centerY, radius, currentAngle);\n currentAngle += stepSize;\n circleStr += point.x + \" \" + point.y + \" \";\n }\n return circleStr;\n };\n\n /*\n * Generates a string representing processes/logical operators with ports.\n * lineHW: Half width of line through the circle to the intersection point\n * shapeHW: Half width of the shape discluding the ports (It is radius for the circular shapes)\n * type: Type of the shape discluding the ports. Options are 'circle', 'rectangle'\n * orientation: Orientation of the ports Options are 'horizontal', 'vertical'\n */\n\n var generateShapeWithPortString = function generateShapeWithPortString(lineHW, shapeHW, type, orientation) {\n var polygonStr;\n var numOfPoints = 30; // Number of points that both halves of circle will have\n if (orientation === 'horizontal') {\n var abovePoints, belowPoints;\n if (type === 'circle') {\n abovePoints = generateCircleString(0, 0, shapeHW, 180, 0, numOfPoints);\n belowPoints = generateCircleString(0, 0, shapeHW, 360, 180, numOfPoints);\n } else if (type === 'rectangle') {\n abovePoints = '-' + shapeHW + ' -' + shapeHW + ' ' + shapeHW + ' -' + shapeHW + ' ';\n belowPoints = shapeHW + ' ' + shapeHW + ' -' + shapeHW + ' ' + shapeHW + ' ';\n }\n polygonStr = \"-1 -\" + lineHW + \" -\" + shapeHW + \" -\" + lineHW + \" \";\n polygonStr += abovePoints;\n polygonStr += shapeHW + \" -\" + lineHW + \" 1 -\" + lineHW + \" 1 \" + lineHW + \" \" + shapeHW + \" \" + lineHW + \" \";\n polygonStr += belowPoints;\n polygonStr += \"-\" + shapeHW + \" \" + lineHW + \" -1 \" + lineHW;\n } else {\n var leftPoints, rightPoints;\n if (type === 'circle') {\n leftPoints = generateCircleString(0, 0, shapeHW, 90, 270, numOfPoints);\n rightPoints = generateCircleString(0, 0, shapeHW, -90, 90, numOfPoints);\n } else if (type === 'rectangle') {\n leftPoints = '-' + shapeHW + ' -' + shapeHW + ' -' + shapeHW + ' ' + shapeHW + ' ';\n rightPoints = shapeHW + ' ' + shapeHW + ' ' + shapeHW + ' -' + shapeHW + ' ';\n }\n polygonStr = \"-\" + lineHW + \" -\" + 1 + \" -\" + lineHW + \" -\" + shapeHW + \" \";\n polygonStr += leftPoints;\n polygonStr += \"-\" + lineHW + \" \" + shapeHW + \" -\" + lineHW + \" 1 \" + lineHW + \" 1 \" + lineHW + \" \" + shapeHW + \" \";\n polygonStr += rightPoints;\n polygonStr += lineHW + \" -\" + shapeHW + \" \" + lineHW + \" -1\";\n }\n return polygonStr;\n };\n\n // Note that in ChiSE this function is in a seperate file but in the viewer it has just 2 methods and so it is located in this file\n function registerUndoRedoActions() {\n // create or get the undo-redo instance\n var ur = cy.undoRedo();\n\n // register general actions\n // register add remove actions\n ur.action(\"deleteElesSimple\", undoRedoActionFunctions.deleteElesSimple, undoRedoActionFunctions.restoreEles);\n ur.action(\"deleteNodesSmart\", undoRedoActionFunctions.deleteNodesSmart, undoRedoActionFunctions.restoreEles);\n ur.action(\"setPortsOrdering\", undoRedoActionFunctions.setPortsOrdering, undoRedoActionFunctions.setPortsOrdering);\n\n //experimental data ovarlay\n ur.action(\"removeAll\", undoRedoActionFunctions.removeAll, undoRedoActionFunctions.restoreAll);\n ur.action(\"hideExperiment\", undoRedoActionFunctions.hideExp, undoRedoActionFunctions.unhideExp);\n ur.action(\"unhideExperiment\", undoRedoActionFunctions.unhideExp, undoRedoActionFunctions.hideExp);\n ur.action(\"hideFile\", undoRedoActionFunctions.hideFile, undoRedoActionFunctions.hideFileUndo);\n ur.action(\"unhideFile\", undoRedoActionFunctions.unhideFile, undoRedoActionFunctions.unhideFileUndo);\n ur.action(\"removeExperiment\", undoRedoActionFunctions.removeExp, undoRedoActionFunctions.addExp);\n ur.action(\"removeFile\", undoRedoActionFunctions.removeFile, undoRedoActionFunctions.addFile);\n ur.action(\"expButtonChange\", undoRedoActionFunctions.expButtonChange, undoRedoActionFunctions.expButtonChange);\n ur.action(\"fileButtonChangeHide\", undoRedoActionFunctions.fileButtonChangeHide, undoRedoActionFunctions.fileButtonChangeUnHide);\n ur.action(\"fileButtonChangeUnHide\", undoRedoActionFunctions.fileButtonChangeUnHide, undoRedoActionFunctions.fileButtonChangeHide);\n\n //ur.action(\"expButtonUnhide\", undoRedoActionFunctions.changeExpButton2, undoRedoActionFunctions.expButtonHide);\n //ur.action(\"parseData\", undoRedoActionFunctions.parseData, undoRedoActionFunctions.removeFile);\n }\n function showTooltip(event) {\n var node = event.target || event.cyTarget;\n var canHaveTooltip = function canHaveTooltip(node) {\n return elementUtilities.isSIFNode(node) || node.data(\"tooltip\") !== null;\n };\n if (!canHaveTooltip(node)) {\n return;\n }\n var ref; // used only for positioning\n var pos = event.position || event.cyPosition;\n var pan = cy.pan();\n var zoom = cy.zoom();\n var infobox = classes.AuxiliaryUnit.checkPoint(pos.x, pos.y, node, 0);\n var tooltipContent;\n if (!infobox) {\n tooltipContent = node.data('tooltip');\n if (tooltipContent == undefined || tooltipContent == '') {\n return;\n }\n ref = node.popperRef();\n } else {\n tooltipContent = infobox['tooltip'];\n if (tooltipContent == undefined) {\n return;\n }\n var modelPos = classes.AuxiliaryUnit.getAbsoluteCoord(infobox, cy);\n var modelW = infobox.bbox.w;\n var modelH = infobox.bbox.h;\n var renderedW = modelW * zoom;\n var renderedH = modelH * zoom;\n modelPos.x -= modelW / 2;\n modelPos.y -= modelH / 2;\n var renderedPos = elementUtilities.convertToRenderedPosition(modelPos, pan, zoom);\n var renderedDims = {\n w: renderedW,\n h: renderedH\n };\n ref = node.popperRef({\n renderedPosition: function renderedPosition() {\n return renderedPos;\n },\n renderedDimensions: function renderedDimensions() {\n return renderedDims;\n }\n });\n }\n var placement = infobox ? infobox.anchorSide : 'bottom';\n var destroyTippy;\n var tippy = Tippy.one(ref, {\n content: function () {\n var content = document.createElement('div');\n content.style['font-size'] = 12 * zoom + 'px';\n content.innerHTML = tooltipContent;\n return content;\n }(),\n trigger: 'manual',\n hideOnClick: true,\n arrow: true,\n placement: placement,\n onHidden: function onHidden() {\n cy.off('pan zoom', destroyTippy);\n node.off('position', destroyTippy);\n cy.off('tapdrag', destroyTippy);\n }\n });\n destroyTippy = function destroyTippy() {\n tippy.destroy();\n };\n cy.on('pan zoom', destroyTippy);\n node.on('position', destroyTippy);\n cy.on('tapdrag', destroyTippy);\n setTimeout(function () {\n return tippy.show();\n }, 250);\n }\n function bindCyEvents() {\n cy.on('tapdragover', 'node', function (event) {\n var waitDuration = 200;\n var nodeTapdragout;\n var currEvent = event;\n var node = currEvent.target || currEvent.cyTarget;\n var inQueue = true;\n var clearNodeEvent = function clearNodeEvent() {\n if (nodeTapdragout) {\n node.off('tapdragout', nodeTapdragout);\n }\n if (nodeTapdrag) {\n node.off('tapdrag', nodeTapdrag);\n }\n };\n var getShowTooltipAsycn = function getShowTooltipAsycn() {\n return setTimeout(function () {\n showTooltip(currEvent);\n inQueue = false;\n }, waitDuration);\n };\n var showTooltipAsycn = getShowTooltipAsycn();\n node.on('tapdragout', nodeTapdragout = function nodeTapdragout(e) {\n clearTimeout(showTooltipAsycn);\n clearNodeEvent();\n });\n node.on('tapdrag', nodeTapdrag = function nodeTapdrag(e) {\n currEvent = e;\n if (!inQueue) {\n showTooltipAsycn = getShowTooltipAsycn();\n inQueue = true;\n }\n });\n });\n cy.on('tapend', 'node', function (event) {\n cy.style().update();\n });\n cy.on(\"expandcollapse.beforecollapse\", \"node\", function (event) {\n var node = this;\n //The children info of complex nodes should be shown when they are collapsed\n if (node._private.data[\"class\"].startsWith(\"complex\")) {\n //The node is being collapsed store infolabel to use it later\n var infoLabel = elementUtilities.getInfoLabel(node);\n node._private.data.infoLabel = infoLabel;\n }\n });\n cy.on(\"expandcollapse.aftercollapse\", \"node\", function (event) {\n var node = this;\n // The width and height of just collapsed nodes should be 36, but they are supposed to be resizable. Therefore, we\n // set their data('bbox') accordingly. We do not store their existing bbox.w and bbox.h because they have no significance for compounds (for now).\n cy.startBatch();\n var bbox = node.data('bbox');\n bbox.w = 36;\n bbox.h = 36;\n node.data('bbox', bbox);\n cy.endBatch();\n });\n cy.on(\"expandcollapse.beforeexpand\", \"node\", function (event) {\n var node = this;\n node.removeData(\"infoLabel\");\n });\n cy.on(\"expandcollapse.afterexpand\", \"node\", function (event) {\n var node = this;\n cy.nodes().updateCompoundBounds();\n if (!options.recalculateOnComplexityManagement) {\n cy.style().update();\n }\n //Don't show children info when the complex node is expanded\n if (node._private.data[\"class\"].startsWith(\"complex\")) {\n node.removeStyle('content');\n }\n });\n cy.on(\"beforeDo\", function (e, name, args) {\n if (name == \"layout\" || name == \"collapse\" || name == \"expand\" || name == \"collapseRecursively\" || name == \"expandRecursively\" || name == \"batch\" && (args.length > 0 && args[0]['name'] == \"thinBorder\" || args.length > 0 && args[0]['name'] == \"thickenBorder\")) {\n var parents = cy.elements(\":parent\").jsons(); // parent nodes\n var simples = cy.elements().not(\":parent\").jsons(); // simple nodes and edges\n var allElements = parents.concat(simples); // all elements\n args.allElements = allElements;\n var ports = {};\n cy.nodes().forEach(function (node) {\n if (elementUtilities.canHavePorts(node)) {\n ports[node.id()] = JSON.parse(JSON.stringify(node.data(\"ports\")));\n }\n });\n args.ports = ports;\n args.viewport = {\n pan: JSON.parse(JSON.stringify(cy.pan())),\n zoom: cy.zoom()\n };\n if (name == \"layout\") mainUtilities.beforePerformLayout();\n }\n });\n cy.on(\"beforeRedo\", function (e, name, args) {\n if (name == \"layout\" || name == \"collapse\" || name == \"expand\" || name == \"collapseRecursively\" || name == \"expandRecursively\" || name == \"batch\" && (args.length > 0 && args[0]['name'] == \"thinBorder\" || args.length > 0 && args[0]['name'] == \"thickenBorder\")) {\n var parents = cy.elements(\":parent\").jsons(); // parent nodes\n var simples = cy.elements().not(\":parent\").jsons(); // simple nodes and edges\n var allElements = parents.concat(simples); // all elements\n args.allElements2 = allElements;\n var ports = {};\n cy.nodes().forEach(function (node) {\n if (elementUtilities.canHavePorts(node)) {\n ports[node.id()] = JSON.parse(JSON.stringify(node.data(\"ports\")));\n }\n });\n args.ports2 = ports;\n args.viewport2 = {\n pan: JSON.parse(JSON.stringify(cy.pan())),\n zoom: cy.zoom()\n };\n }\n });\n cy.on(\"afterDo\", function (e, name, args, res) {\n if (name == \"layout\" || name == \"collapse\" || name == \"expand\" || name == \"collapseRecursively\" || name == \"expandRecursively\" || name == \"batch\" && (args.length > 0 && args[0]['name'] == \"thinBorder\" || args.length > 0 && args[0]['name'] == \"thickenBorder\")) {\n res.allElements = args.allElements;\n res.ports = args.ports;\n res.viewport = args.viewport;\n }\n });\n cy.on(\"afterRedo\", function (e, name, args, res) {\n if (name == \"layout\" || name == \"collapse\" || name == \"expand\" || name == \"collapseRecursively\" || name == \"expandRecursively\" || name == \"batch\" && (args.length > 0 && args[0]['name'] == \"thinBorder\" || args.length > 0 && args[0]['name'] == \"thickenBorder\")) {\n res.allElements = args.allElements2;\n res.ports = args.ports2;\n res.viewport = args.viewport2;\n cy.json({\n flatEles: true,\n elements: args.allElements\n });\n cy.batch(function () {\n cy.nodes().forEach(function (node) {\n if (elementUtilities.canHavePorts(node)) {\n node.data(\"ports\", args.ports[node.id()]);\n }\n });\n });\n cy.pan(args.viewport[\"pan\"]);\n cy.zoom(args.viewport[\"zoom\"]);\n }\n });\n cy.on(\"beforeUndo\", function (e, name, args) {\n if (name == \"layout\" || name == \"collapse\" || name == \"expand\" || name == \"collapseRecursively\" || name == \"expandRecursively\" || name == \"batch\" && (args.length > 0 && args[0]['name'] == \"thinBorder\" || args.length > 0 && args[0]['name'] == \"thickenBorder\")) {\n var parents = cy.elements(\":parent\").jsons(); // parent nodes\n var simples = cy.elements().not(\":parent\").jsons(); // simple nodes and edges\n var allElements = parents.concat(simples); // all elements\n args.allElements2 = allElements;\n var ports = {};\n cy.nodes().forEach(function (node) {\n if (elementUtilities.canHavePorts(node)) {\n ports[node.id()] = JSON.parse(JSON.stringify(node.data(\"ports\")));\n }\n });\n args.ports2 = ports;\n args.viewport2 = {\n pan: JSON.parse(JSON.stringify(cy.pan())),\n zoom: cy.zoom()\n };\n }\n });\n cy.on(\"afterUndo\", function (e, name, args, res) {\n if (name == \"layout\" || name == \"collapse\" || name == \"expand\" || name == \"collapseRecursively\" || name == \"expandRecursively\" || name == \"batch\" && (args.length > 0 && args[0]['name'] == \"thinBorder\" || args.length > 0 && args[0]['name'] == \"thickenBorder\")) {\n res.allElements = args.allElements2;\n res.ports = args.ports2;\n res.viewport = args.viewport2;\n cy.json({\n flatEles: true,\n elements: args.allElements\n });\n cy.batch(function () {\n cy.nodes().forEach(function (node) {\n if (elementUtilities.canHavePorts(node)) {\n node.data(\"ports\", args.ports[node.id()]);\n }\n });\n });\n cy.pan(args.viewport[\"pan\"]);\n cy.zoom(args.viewport[\"zoom\"]);\n }\n });\n cy.on('layoutstop', function (event) {\n /*\n * 'preset' layout is called to give the initial positions of nodes by sbgnviz.\n * Seems like 'grid' layout is called by Cytoscape.js core in loading graphs.\n * If the layout is not one of these (normally it is supposed to be 'cose-bilkent')\n * and ports are enabled call 'elementUtilities.changePortsOrientationAfterLayout()'\n */\n if (event.layout.options.name !== 'preset' && event.layout.options.name !== 'grid') {\n // 3000 nodes/edges check is for performance improvement\n if (graphUtilities.portsEnabled === true && !(cy.nodes().length > 3000 || cy.edges().length > 3000)) {\n elementUtilities.changePortsOrientationAfterLayout();\n }\n }\n });\n $(document).on('updateGraphEnd', function (event, _cy, isLayoutRequired, callback) {\n // if the event is not triggered for this cy instance return directly\n if (_cy != cy) {\n return;\n }\n var _setCompoundInfoboxes = function setCompoundInfoboxes(node, isLayoutRequired, cyInstance) {\n if (cyInstance == undefined) return;\n if (node.data().infoboxCalculated) {\n return;\n } else if (node.isParent()) {\n node.children().forEach(function (childNode) {\n _setCompoundInfoboxes(childNode, isLayoutRequired, cyInstance);\n });\n }\n node.data(\"infoboxCalculated\", true);\n node.data('auxunitlayouts', {});\n // for each statesandinfos\n\n var correctInfoBoxCoord = true;\n for (var i = 0; i < node.data('statesandinfos').length; i++) {\n var statesandinfos = node.data('statesandinfos')[i];\n var bbox = statesandinfos.bbox;\n var infoBoxOnNode = classes.AuxiliaryUnit.setAnchorSide(statesandinfos, node);\n correctInfoBoxCoord = correctInfoBoxCoord && infoBoxOnNode;\n }\n for (var i = 0; i < node.data('statesandinfos').length; i++) {\n var statesandinfos = node.data('statesandinfos')[i];\n var bbox = statesandinfos.bbox;\n if ((isLayoutRequired === undefined || !isLayoutRequired) && correctInfoBoxCoord) {\n var cordResult = classes.AuxiliaryUnit.convertToRelativeCoord(statesandinfos, bbox.x + bbox.w / 2, bbox.y + bbox.h / 2, cyInstance, node);\n statesandinfos.bbox.x = cordResult.x;\n statesandinfos.bbox.y = cordResult.y;\n statesandinfos.isDisplayed = true;\n var location = statesandinfos.anchorSide; // top bottom right left\n var layouts = node.data('auxunitlayouts');\n if (!layouts[location]) {\n // layout doesn't exist yet for this location\n layouts[location] = classes.AuxUnitLayout.construct(node, location);\n }\n // populate the layout of this side\n classes.AuxUnitLayout.addAuxUnit(layouts[location], cyInstance, statesandinfos, undefined, true); //positions are precomputed\n } else {\n if (!node.data('auxunitlayouts')) {\n // ensure minimal initialization\n node.data('auxunitlayouts', {});\n }\n var location = classes.AuxUnitLayout.selectNextAvailable(node, cy);\n if (!node.data('auxunitlayouts')[location]) {\n node.data('auxunitlayouts')[location] = classes.AuxUnitLayout.construct(node, location);\n }\n var layout = node.data('auxunitlayouts')[location];\n statesandinfos.anchorSide = location;\n switch (location) {\n case \"top\":\n statesandinfos.bbox.y = 0;\n break;\n case \"bottom\":\n statesandinfos.bbox.y = 100;\n break;\n case \"left\":\n statesandinfos.bbox.x = 0;\n break;\n case \"right\":\n statesandinfos.bbox.x = 100;\n break;\n }\n classes.AuxUnitLayout.addAuxUnit(layout, cyInstance, statesandinfos);\n }\n }\n if (isLayoutRequired === true) {\n var locations = classes.AuxUnitLayout.checkFit(node, cy);\n if (locations !== undefined && locations.length > 0) {\n classes.AuxUnitLayout.fitUnits(node, cy, locations);\n }\n }\n };\n // list all entitytypes andstore them in the global scratch\n // only stateful EPN (complex, macromolecule or nucleic acid) are concerned\n\n // assign statesandinfos to their layout\n cy.style().update();\n // cy.startBatch();\n\n // this check is for performance improvement\n if (!(cy.nodes().length > 3000 || cy.edges().length > 3000)) {\n cy.nodes().forEach(function (node) {\n _setCompoundInfoboxes(node, isLayoutRequired, cy);\n });\n }\n if (callback) {\n callback();\n }\n\n //cy.endBatch();\n });\n }\n var selectionColor = '#89898a';\n var sbgnStyleSheet = cytoscape.stylesheet().selector(\"node\").css({\n 'text-valign': 'center',\n 'text-halign': 'center',\n 'text-opacity': 1,\n 'opacity': 1,\n 'padding': 0\n }).selector(\"node[class]\").css({\n 'shape': function shape(ele) {\n return elementUtilities.getCyShape(ele);\n },\n 'content': function content(ele) {\n return elementUtilities.getElementContent(ele);\n },\n 'font-size': function fontSize(ele) {\n // If node labels are expected to be adjusted automatically or element cannot have label\n // or ele.data('font-size') is not defined return elementUtilities.getLabelTextSize()\n // else return ele.data('font-size')\n var opt = options.adjustNodeLabelFontSizeAutomatically;\n var adjust = typeof opt === 'function' ? opt() : opt;\n if (!adjust && ele.data('font-size') != undefined) {\n return ele.data('font-size');\n }\n return elementUtilities.getLabelTextSize(ele);\n }\n }).selector(\"node[class][font-family]\").style({\n 'font-family': function fontFamily(ele) {\n return ele.data('font-family');\n }\n }).selector(\"node[class][font-style]\").style({\n 'font-style': function fontStyle(ele) {\n return ele.data('font-style');\n }\n }).selector(\"node[class][font-weight]\").style({\n 'font-weight': function fontWeight(ele) {\n return ele.data('font-weight');\n }\n }).selector(\"node[class][color]\").style({\n 'color': function color(ele) {\n return ele.data('color');\n }\n }).selector(\"node[class][background-color]\").style({\n 'background-color': function backgroundColor(ele) {\n return ele.data('background-color');\n }\n }).selector(\"node[class][background-opacity]\").style({\n 'background-opacity': function backgroundOpacity(ele) {\n return ele.data('background-opacity');\n }\n }).selector(\"node[class][border-width]\").style({\n 'border-width': function borderWidth(ele) {\n return ele.data('border-width');\n }\n }).selector(\"node[class][border-color]\").style({\n 'border-color': function borderColor(ele) {\n return ele.data('border-color');\n }\n }).selector(\"node[class][text-wrap]\").style({\n 'text-wrap': function textWrap(ele) {\n var opt = options.fitLabelsToNodes;\n var isFit = typeof opt === 'function' ? opt() : opt;\n if (isFit) {\n return 'ellipsis';\n }\n return ele.data('text-wrap');\n }\n }).selector(\"node\").style({\n 'text-max-width': function textMaxWidth(ele) {\n var opt = options.fitLabelsToNodes;\n var isFit = typeof opt === 'function' ? opt() : opt;\n if (isFit) {\n return ele.width();\n }\n return '1000px';\n }\n }).selector(\"edge[class][line-color]\").style({\n 'line-color': function lineColor(ele) {\n return ele.data('line-color');\n },\n 'source-arrow-color': function sourceArrowColor(ele) {\n return ele.data('line-color');\n },\n 'target-arrow-color': function targetArrowColor(ele) {\n return ele.data('line-color');\n }\n }).selector(\"edge[class][width]\").style({\n 'width': function width(ele) {\n return ele.data('width');\n }\n }).selector(\"node[class='association'],[class='dissociation'],[class='and'],[class='or'],[class='not'],[class='process'],[class='omitted process'],[class='uncertain process'],[class='truncated process'],[class='unknown logical operator']\").css({\n 'shape-polygon-points': function shapePolygonPoints(ele) {\n if (graphUtilities.portsEnabled === true && ele.data('ports').length === 2) {\n // We assume that the ports of the edge are symetric according to the node center so just checking one port is enough for us\n var port = ele.data('ports')[0];\n // If the ports are located above/below of the node then the orientation is 'vertical' else it is 'horizontal'\n var orientation = port.x === 0 ? 'vertical' : 'horizontal';\n // The half width of the actual shape discluding the ports\n var shapeHW = orientation === 'vertical' ? 50 / Math.abs(port.y) : 50 / Math.abs(port.x);\n // Get the class of the node\n var _class = ele.data('class');\n // If class is one of process, omitted process or uncertain process then the type of actual shape is 'rectangle' else it is 'circle'\n var type = _class.endsWith('process') ? 'rectangle' : 'circle';\n\n // Generate a polygon string with above parameters and return it\n return generateShapeWithPortString(0.01, shapeHW, type, orientation);\n }\n\n // This element is not expected to have a poygonial shape (Because it does not have 2 ports) just return a trivial string here not to have a run time bug\n return '-1 -1 1 1 1 0';\n }\n }).selector(\"node[class='perturbing agent']\").css({\n 'shape-polygon-points': '-1, -1, -0.5, 0, -1, 1, 1, 1, 0.5, 0, 1, -1'\n }).selector(\"node[class='tag']\").css({\n 'shape-polygon-points': '-1, -1, 0.25, -1, 1, 0, 0.25, 1, -1, 1'\n }).selector(\"node:parent[class^='complex']\") // start with complex\n .css({\n 'text-valign': 'bottom',\n 'text-halign': 'center',\n 'text-margin-y': elementUtilities.getComplexMargin,\n 'padding': elementUtilities.getComplexPadding,\n 'compound-sizing-wrt-labels': 'exclude'\n }).selector(\"node[class='compartment']\").css({\n 'text-valign': 'bottom',\n 'text-halign': 'center',\n 'text-margin-y': -1 * options.extraCompartmentPadding,\n 'compound-sizing-wrt-labels': 'exclude'\n }).selector(\"node:parent[class='compartment']\").css({\n 'padding': function padding() {\n return graphUtilities.getCompoundPaddings() + options.extraCompartmentPadding;\n }\n }).selector(\"node[class='submap']\").css({\n 'text-valign': 'bottom',\n 'text-halign': 'center',\n 'text-margin-y': -1 * options.extraCompartmentPadding,\n 'compound-sizing-wrt-labels': 'exclude'\n }).selector(\"node:parent[class='submap'],[class='topology group']\").css({\n 'padding': function padding() {\n return graphUtilities.getCompoundPaddings() + options.extraCompartmentPadding;\n }\n }).selector(\"node:childless[bbox]\").css({\n 'width': 'data(bbox.w)',\n 'height': 'data(bbox.h)'\n }).selector(\"node:parent[minHeight]\").css({\n 'min-height': function minHeight(ele) {\n if (graphUtilities.compoundSizesConsidered) {\n return ele.data('minHeight');\n }\n return 0;\n }\n }).selector(\"node:parent[minHeightBiasTop]\").css({\n 'min-height-bias-top': function minHeightBiasTop(ele) {\n var min = parseFloat(ele.data('minHeightBiasTop'));\n return (min >= 0 ? min : 100) + '%';\n }\n }).selector(\"node:parent[minHeightBiasBottom]\").css({\n 'min-height-bias-bottom': function minHeightBiasBottom(ele) {\n var min = parseFloat(ele.data('minHeightBiasBottom'));\n return (min >= 0 ? min : 100) + '%';\n }\n }).selector(\"node:parent[minWidth]\").css({\n 'min-width': function minWidth(ele) {\n if (graphUtilities.compoundSizesConsidered) {\n return ele.data('minWidth');\n }\n return 0;\n }\n }).selector(\"node:parent[minWidthBiasLeft]\").css({\n 'min-width-bias-left': function minWidthBiasLeft(ele) {\n var min = parseFloat(ele.data('minWidthBiasLeft'));\n return (min >= 0 ? min : 100) + '%';\n }\n }).selector(\"node:parent[minWidthBiasRight]\").css({\n 'min-width-bias-right': function minWidthBiasRight(ele) {\n var min = parseFloat(ele.data('minWidthBiasRight'));\n return (min >= 0 ? min : 100) + '%';\n }\n }).selector(\"node.cy-expand-collapse-collapsed-node\").css({\n 'border-style': 'dashed'\n })\n // .selector(\"node:selected\")\n // .css({\n // 'border-color': selectionColor,\n // 'target-arrow-color': '#000',\n // \t'text-outline-color': '#000',\n // \t'border-width': function(ele){\n // \t\treturn Math.max(parseFloat(ele.data('border-width')) + 2, 3);\n // \t }\n // })\n .selector(\"node:active\").css({\n 'background-opacity': 0.7,\n 'overlay-color': selectionColor,\n 'overlay-padding': '14'\n }).selector(\"edge\").css({\n 'curve-style': 'bezier',\n 'target-arrow-fill': function targetArrowFill(ele) {\n return elementUtilities.getCyTargetArrowFill(ele);\n },\n 'source-arrow-fill': 'hollow',\n 'text-border-color': function textBorderColor(ele) {\n if (ele.selected()) {\n return selectionColor;\n }\n return ele.css('line-color');\n },\n 'color': function color(ele) {\n if (ele.selected()) {\n return selectionColor;\n }\n return ele.css('line-color');\n },\n 'arrow-scale': 1.25\n }).selector(\"edge.cy-expand-collapse-meta-edge\").css({\n 'line-color': '#C4C4C4',\n 'source-arrow-color': '#C4C4C4',\n 'target-arrow-color': '#C4C4C4'\n })\n // .selector(\"edge:selected\")\n // .css({\n // 'line-color': selectionColor,\n // 'source-arrow-color': selectionColor,\n // \t'target-arrow-color': selectionColor,\n // \t'width': function(ele){\n // \t\treturn Math.max(parseFloat(ele.data('width')) + 2, 3);\n // \t }\n // })\n .selector(\"edge:active\").css({\n 'background-opacity': 0.7,\n 'overlay-color': selectionColor,\n 'overlay-padding': '8'\n }).selector(\"edge[cardinality > 0]\").css({\n 'text-rotation': 'autorotate',\n 'text-background-shape': 'rectangle',\n 'text-border-opacity': '1',\n 'text-border-width': '1',\n 'text-background-color': 'white',\n 'text-background-opacity': '1'\n }).selector(\"edge[class='consumption'][cardinality > 0]\").css({\n 'source-label': function sourceLabel(ele) {\n return '' + ele.data('cardinality');\n },\n 'source-text-margin-y': '-10',\n 'source-text-offset': '18',\n 'font-size': '13'\n }).selector(\"edge[class='production'][cardinality > 0]\").css({\n 'target-label': function targetLabel(ele) {\n return '' + ele.data('cardinality');\n },\n 'target-text-margin-y': '-10',\n 'target-text-offset': '18',\n 'font-size': '13'\n }).selector(\"edge[class]\").css({\n 'target-arrow-shape': function targetArrowShape(ele) {\n return elementUtilities.getCyArrowShape(ele);\n },\n 'source-arrow-shape': 'none',\n 'source-endpoint': function sourceEndpoint(ele) {\n return elementUtilities.getEndPoint(ele, 'source');\n },\n 'target-endpoint': function targetEndpoint(ele) {\n return elementUtilities.getEndPoint(ele, 'target');\n },\n 'line-style': function lineStyle(ele) {\n return elementUtilities.getArrayLineStyle(ele);\n },\n 'line-dash-pattern': function lineDashPattern(ele) {\n return elementUtilities.getArrayLineDashStyle(ele);\n }\n }).selector(\"core\").css({\n 'selection-box-color': selectionColor,\n 'selection-box-opacity': '0.2',\n 'selection-box-border-color': selectionColor\n });\n var sbgnNetworkContainer = $(options.networkContainerSelector);\n\n // create and init cytoscape:\n cytoscape({\n container: sbgnNetworkContainer,\n style: sbgnStyleSheet,\n showOverlay: false,\n minZoom: 0.125,\n maxZoom: 16,\n boxSelectionEnabled: true,\n motionBlur: true,\n wheelSensitivity: 0.1,\n ready: function ready() {\n cy = this;\n // If undoable register undo/redo actions\n if (options.undoable) {\n registerUndoRedoActions();\n }\n bindCyEvents();\n }\n });\n };\n sbgnCyInstance.getCy = function () {\n return cy;\n };\n return sbgnCyInstance;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2Jnbi1leHRlbnNpb25zL3NiZ24tY3ktaW5zdGFuY2UtZmFjdG9yeS5qcyIsIm1hcHBpbmdzIjoiQUFBQSxJQUFJQSxPQUFPLEdBQUdDLG1CQUFPLENBQUMsd0RBQXNCLENBQUM7QUFDN0MsSUFBSUMsSUFBSSxHQUFHRCxtR0FBNkMsQ0FBQyxDQUFDO0FBQzFELElBQUlHLE1BQU0sR0FBR0MsQ0FBQyxHQUFHSCxJQUFJLENBQUNFLE1BQU07QUFDNUIsSUFBSUUsU0FBUyxHQUFHSixJQUFJLENBQUNJLFNBQVM7QUFDOUIsSUFBSUMsS0FBSyxHQUFHTCxJQUFJLENBQUNNLEtBQUs7QUFHdEJDLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHLFlBQVk7RUFFNUIsSUFBSUMsZ0JBQWdCLEVBQUVDLGNBQWMsRUFBRUMsYUFBYSxFQUFFQyx1QkFBdUIsRUFBRUMsZUFBZSxFQUFFQyx1QkFBdUI7RUFDdEgsSUFBSUMsZUFBZSxFQUFFQyxPQUFPLEVBQUVDLEVBQUU7RUFFaEMsSUFBSUMsY0FBYyxHQUFHLFNBQWpCQSxjQUFjQSxDQUFhQyxLQUFLLEVBQUU7SUFDckNWLGdCQUFnQixHQUFHVSxLQUFLLENBQUNWLGdCQUFnQjtJQUN6Q0MsY0FBYyxHQUFHUyxLQUFLLENBQUNULGNBQWM7SUFDckNJLHVCQUF1QixHQUFHSyxLQUFLLENBQUNMLHVCQUF1QjtJQUN2REgsYUFBYSxHQUFHUSxLQUFLLENBQUNSLGFBQWE7SUFDbkNDLHVCQUF1QixHQUFHTyxLQUFLLENBQUNQLHVCQUF1QjtJQUN2REcsZUFBZSxHQUFHTCxjQUFjLENBQUNLLGVBQWUsQ0FBQ0ssSUFBSSxDQUFDVixjQUFjLENBQUM7SUFFckVHLGVBQWUsR0FBR00sS0FBSyxDQUFDTixlQUFlO0lBQ3ZDRyxPQUFPLEdBQUdILGVBQWUsQ0FBQ1EsVUFBVSxDQUFDLENBQUM7O0lBRXRDOztJQUVBO0FBQ0Y7QUFDQTtJQUNFLElBQUlDLGdCQUFnQixHQUFHLFNBQW5CQSxnQkFBZ0JBLENBQWFDLE9BQU8sRUFBRUMsT0FB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Q0FBQztNQUNELG1CQUFtQixFQUFFLFNBQXJCd0QsZUFBbUJBLENBQVl4RCxHQUFHLEVBQUU7UUFDbkMsT0FBTzNNLGdCQUFnQixDQUFDb1EscUJBQXFCLENBQUN6RCxHQUFHLENBQUM7TUFDbkQ7SUFDRCxDQUFDLENBQUMsQ0FDREgsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUNoQkMsR0FBRyxDQUFDO01BQ0oscUJBQXFCLEVBQUVKLGNBQWM7TUFDckMsdUJBQXVCLEVBQUUsS0FBSztNQUFFLDRCQUE0QixFQUFFQTtJQUMvRCxDQUFDLENBQUM7SUFFSCxJQUFJZ0Usb0JBQW9CLEdBQUczUSxDQUFDLENBQUNhLE9BQU8sQ0FBQytQLHdCQUF3QixDQUFDOztJQUU5RDtJQUNBM1EsU0FBUyxDQUFDO01BQ1Q0USxTQUFTLEVBQUVGLG9CQUFvQjtNQUMvQnpKLEtBQUssRUFBRTBGLGNBQWM7TUFDckJrRSxXQUFXLEVBQUUsS0FBSztNQUFFQyxPQUFPLEVBQUUsS0FBSztNQUFFQyxPQUFPLEVBQUUsRUFBRTtNQUMvQ0MsbUJBQW1CLEVBQUUsSUFBSTtNQUN6QkMsVUFBVSxFQUFFLElBQUk7TUFDaEJDLGdCQUFnQixFQUFFLEdBQUc7TUFDckJDLEtBQUssRUFBRSxTQUFQQSxLQUFLQSxDQUFBLEVBQWM7UUFDbEJ0USxFQUFFLEdBQUcsSUFBSTtRQUNUO1FBQ0EsSUFBSUQsT0FBTyxDQUFDd1EsUUFBUSxFQUFFO1VBQ3JCbk8sdUJBQXVCLENBQUMsQ0FBQztRQUMxQjtRQUNBMkUsWUFBWSxDQUFDLENBQUM7TUFDZjtJQUNELENBQUMsQ0FBQztFQUNILENBQUM7RUFFRDlHLGNBQWMsQ0FBQ3VRLEtBQUssR0FBRyxZQUFZO0lBQ2xDLE9BQU94USxFQUFFO0VBQ1YsQ0FBQztFQUVELE9BQU9DLGNBQWM7QUFDdEIsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL3NiZ252aXovLi9zcmMvc2Jnbi1leHRlbnNpb25zL3NiZ24tY3ktaW5zdGFuY2UtZmFjdG9yeS5qcz8xNDhhIl0sInNvdXJjZXNDb250ZW50IjpbInZhciBjbGFzc2VzID0gcmVxdWlyZSgnLi4vdXRpbGl0aWVzL2NsYXNzZXMnKTtcbnZhciBsaWJzID0gcmVxdWlyZSgnLi4vdXRpbGl0aWVzL2xpYi11dGlsaXRpZXMnKS5nZXRMaWJzKCk7XG52YXIgalF1ZXJ5ID0gJCA9IGxpYnMualF1ZXJ5O1xudmFyIGN5dG9zY2FwZSA9IGxpYnMuY3l0b3NjYXBlO1xudmFyIFRpcHB5ID0gbGlicy50aXBweTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblxuXHR2YXIgZWxlbWVudFV0aWxpdGllcywgZ3JhcGhVdGlsaXRpZXMsIG1haW5VdGlsaXRpZXMsIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zLCBvcHRpb25VdGlsaXRpZXMsIGV4cGVyaW1lbnRhbERhdGFPdmVybGF5O1xuXHR2YXIgcmVmcmVzaFBhZGRpbmdzLCBvcHRpb25zLCBjeTtcblxuXHR2YXIgc2JnbkN5SW5zdGFuY2UgPSBmdW5jdGlvbiAocGFyYW0pIHtcblx0XHRlbGVtZW50VXRpbGl0aWVzID0gcGFyYW0uZWxlbWVudFV0aWxpdGllcztcblx0XHRncmFwaFV0aWxpdGllcyA9IHBhcmFtLmdyYXBoVXRpbGl0aWVzO1xuXHRcdGV4cGVyaW1lbnRhbERhdGFPdmVybGF5ID0gcGFyYW0uZXhwZXJpbWVudGFsRGF0YU92ZXJsYXk7XG5cdFx0bWFpblV0aWxpdGllcyA9IHBhcmFtLm1haW5VdGlsaXRpZXM7XG5cdFx0dW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMgPSBwYXJhbS51bmRvUmVkb0FjdGlvbkZ1bmN0aW9ucztcblx0XHRyZWZyZXNoUGFkZGluZ3MgPSBncmFwaFV0aWxpdGllcy5yZWZyZXNoUGFkZGluZ3MuYmluZChncmFwaFV0aWxpdGllcyk7XG5cblx0XHRvcHRpb25VdGlsaXRpZXMgPSBwYXJhbS5vcHRpb25VdGlsaXRpZXM7XG5cdFx0b3B0aW9ucyA9IG9wdGlvblV0aWxpdGllcy5nZXRPcHRpb25zKCk7XG5cblx0XHQvLyBjeSA9IHBhcmFtLnNiZ25DeUluc3RhbmNlLmdldEN5KCk7XG5cblx0XHQvKlxuXHRcdCAqIFJldHVybnMgdGhlIGNvb3JkaW5hdGVzIG9mIHRoZSBwb2ludCBsb2NhdGVkIG9uIHRoZSBnaXZlbiBhbmdsZSBvbiB0aGUgY2lyY2xlIHdpdGggdGhlIGdpdmVuIGNlbnRlcmFsIGNvb3JkaW5hdGVzIGFuZCByYWRpdXMuXG5cdFx0ICovXG5cdFx0dmFyIGdldFBvaW50T25DaXJjbGUgPSBmdW5jdGlvbiAoY2VudGVyWCwgY2VudGVyWSwgcmFkaXVzLCBhbmdsZUluRGVncmVlKSB7XG5cdFx0XHR2YXIgYW5nbGVJblJhZGlhbiA9IGFuZ2xlSW5EZWdyZWUgKiAoTWF0aC5QSSAvIDE4MCk7IC8vIENvbnZlcnQgZGVncmVlIHRvIHJhZGlhblxuXHRcdFx0cmV0dXJuIHtcblx0XHRcdFx0eDogcmFkaXVzICogTWF0aC5jb3MoYW5nbGVJblJhZGlhbikgKyBjZW50ZXJYLFxuXHRcdFx0XHR5OiAtMSAqIHJhZGl1cyAqIE1hdGguc2luKGFuZ2xlSW5SYWRpYW4pICsgY2VudGVyWSAvLyBXZSBtdWx0aXBseSB3aXRoIC0xIGhlcmUgYmVjYXVzZSBKUyB5IGNvb3JkaW5hdGUgc2lnbiBpcyB0aGUgb3Bvc2l0ZSBvZiB0aGUgTWF0aGFtYXRpY2FsIGNvb3JkaW5hdGVzIHN5c3RlbVxuXHRcdFx0fTtcblx0XHR9O1xuXG5cdFx0Lypcblx0XHQgKiBHZW5lcmF0ZXMgYSBwb2x5Z29uIHN0cmluZyBhcHByb3hpbWF0aW5nIGEgY2lyY2xlIHdpdGggZ2l2ZW4gY2VudGVyLCByYWRpdXMsIHN0YXJ0LCBlbmQgYW5nbGVzIGFuZCBudW1iZXIgb2YgcG9pbnRzIHRvIHJlcHJlc2VudCB0aGUgY2lyY2xlXG5cdFx0ICovXG5cdFx0dmFyIGdlbmVyYXRlQ2lyY2xlU3RyaW5nID0gZnVuY3Rpb24gKGNlbnRlclgsIGNlbnRlclksIHJhZGl1cywgYW5nbGVGcm9tLCBhbmdsZVRvLCBudW1PZlBvaW50cykge1xuXHRcdFx0dmFyIGNpcmNsZVN0ciA9IFwiXCI7XG5cdFx0XHR2YXIgc3RlcFNpemUgPSAoYW5nbGVUbyAtIGFuZ2xlRnJvbSkgLyBudW1PZlBvaW50czsgLy8gV2Ugd2lsbCBpbmNyZW1lbnQgdGhlIGN1cnJlbnQgYW5nbGUgYnkgc3RlcCBzaXplIGluIGVhY2ggaXRlcmF0aW9uXG5cdFx0XHR2YXIgY3VycmVudEFuZ2xlID0gYW5nbGVGcm9tOyAvLyBjdXJyZW50IGFuZ2xlIHdpbGwgYmUgdXBkYXRlZCBpbiBlYWNoIGl0ZXJhdGlvblxuXG5cdFx0XHRmb3IgKHZhciBpID0gMDsgaSA8IG51bU9mUG9pbnRzOyBpKyspIHtcblx0XHRcdFx0dmFyIHBvaW50ID0gZ2V0UG9pbnRPbkNpcmNsZShjZW50ZXJYLCBjZW50ZXJZLCByYWRpdXMsIGN1cnJlbnRBbmdsZSk7XG5cdFx0XHRcdGN1cnJlbnRBbmdsZSArPSBzdGVwU2l6ZTtcblx0XHRcdFx0Y2lyY2xlU3RyICs9IHBvaW50LnggKyBcIiBcIiArIHBvaW50LnkgKyBcIiBcIjtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIGNpcmNsZVN0cjtcblx0XHR9O1xuXG5cdFx0Lypcblx0XHQgKiAgR2VuZXJhdGVzIGEgc3RyaW5nIHJlcHJlc2VudGluZyBwcm9jZXNzZXMvbG9naWNhbCBvcGVyYXRvcnMgd2l0aCBwb3J0cy5cblx0XHQgKiAgbGluZUhXOiBIYWxmIHdpZHRoIG9mIGxpbmUgdGhyb3VnaCB0aGUgY2lyY2xlIHRvIHRoZSBpbnRlcnNlY3Rpb24gcG9pbnRcblx0XHQgKiAgc2hhcGVIVzogSGFsZiB3aWR0aCBvZiB0aGUgc2hhcGUgZGlzY2x1ZGluZyB0aGUgcG9ydHMgKEl0IGlzIHJhZGl1cyBmb3IgdGhlIGNpcmN1bGFyIHNoYXBlcylcblx0XHQgKiAgdHlwZTogVHlwZSBvZiB0aGUgc2hhcGUgZGlzY2x1ZGluZyB0aGUgcG9ydHMuIE9wdGlvbnMgYXJlICdjaXJjbGUnLCAncmVjdGFuZ2xlJ1xuXHRcdCAqICBvcmllbnRhdGlvbjogT3JpZW50YXRpb24gb2YgdGhlIHBvcnRzIE9wdGlvbnMgYXJlICdob3Jpem9udGFsJywgJ3ZlcnRpY2FsJ1xuXHRcdCAqL1xuXG5cdFx0dmFyIGdlbmVyYXRlU2hhcGVXaXRoUG9ydFN0cmluZyA9IGZ1bmN0aW9uIChsaW5lSFcsIHNoYXBlSFcsIHR5cGUsIG9yaWVudGF0aW9uKSB7XG5cdFx0XHR2YXIgcG9seWdvblN0cjtcblx0XHRcdHZhciBudW1PZlBvaW50cyA9IDMwOyAvLyBOdW1iZXIgb2YgcG9pbnRzIHRoYXQgYm90aCBoYWx2ZXMgb2YgY2lyY2xlIHdpbGwgaGF2ZVxuXHRcdFx0aWYgKG9yaWVudGF0aW9uID09PSAnaG9yaXpvbnRhbCcpIHtcblx0XHRcdFx0dmFyIGFib3ZlUG9pbnRzLCBiZWxvd1BvaW50cztcblxuXHRcdFx0XHRpZiAodHlwZSA9PT0gJ2NpcmNsZScpIHtcblx0XHRcdFx0XHRhYm92ZVBvaW50cyA9IGdlbmVyYXRlQ2lyY2xlU3RyaW5nKDAsIDAsIHNoYXBlSFcsIDE4MCwgMCwgbnVtT2ZQb2ludHMpO1xuXHRcdFx0XHRcdGJlbG93UG9pbnRzID0gZ2VuZXJhdGVDaXJjbGVTdHJpbmcoMCwgMCwgc2hhcGVIVywgMzYwLCAxODAsIG51bU9mUG9pbnRzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmICh0eXBlID09PSAncmVjdGFuZ2xlJykge1xuXHRcdFx0XHRcdGFib3ZlUG9pbnRzID0gJy0nICsgc2hhcGVIVyArICcgLScgKyBzaGFwZUhXICsgJyAnICsgc2hhcGVIVyArICcgLScgKyBzaGFwZUhXICsgJyAnO1xuXHRcdFx0XHRcdGJlbG93UG9pbnRzID0gc2hhcGVIVyArICcgJyArIHNoYXBlSFcgKyAnIC0nICsgc2hhcGVIVyArICcgJyArIHNoYXBlSFcgKyAnICc7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRwb2x5Z29uU3RyID0gXCItMSAtXCIgKyBsaW5lSFcgKyBcIiAtXCIgKyBzaGFwZUhXICsgXCIgLVwiICsgbGluZUhXICsgXCIgXCI7XG5cdFx0XHRcdHBvbHlnb25TdHIgKz0gYWJvdmVQb2ludHM7XG5cdFx0XHRcdHBvbHlnb25TdHIgKz0gc2hhcGVIVyArIFwiIC1cIiArIGxpbmVIVyArIFwiIDEgLVwiICsgbGluZUhXICsgXCIgMSBcIiArIGxpbmVIVyArIFwiIFwiICsgc2hhcGVIVyArIFwiIFwiICsgbGluZUhXICsgXCIgXCI7XG5cdFx0XHRcdHBvbHlnb25TdHIgKz0gYmVsb3dQb2ludHM7XG5cdFx0XHRcdHBvbHlnb25TdHIgKz0gXCItXCIgKyBzaGFwZUhXICsgXCIgXCIgKyBsaW5lSFcgKyBcIiAtMSBcIiArIGxpbmVIVztcblx0XHRcdH1cblx0XHRcdGVsc2Uge1xuXHRcdFx0XHR2YXIgbGVmdFBvaW50cywgcmlnaHRQb2ludHM7XG5cblx0XHRcdFx0aWYgKHR5cGUgPT09ICdjaXJjbGUnKSB7XG5cdFx0XHRcdFx0bGVmdFBvaW50cyA9IGdlbmVyYXRlQ2lyY2xlU3RyaW5nKDAsIDAsIHNoYXBlSFcsIDkwLCAyNzAsIG51bU9mUG9pbnRzKTtcblx0XHRcdFx0XHRyaWdodFBvaW50cyA9IGdlbmVyYXRlQ2lyY2xlU3RyaW5nKDAsIDAsIHNoYXBlSFcsIC05MCwgOTAsIG51bU9mUG9pbnRzKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRlbHNlIGlmICh0eXBlID09PSAncmVjdGFuZ2xlJykge1xuXHRcdFx0XHRcdGxlZnRQb2ludHMgPSAnLScgKyBzaGFwZUhXICsgJyAtJyArIHNoYXBlSFcgKyAnIC0nICsgc2hhcGVIVyArICcgJyArIHNoYXBlSFcgKyAnICc7XG5cdFx0XHRcdFx0cmlnaHRQb2ludHMgPSBzaGFwZUhXICsgJyAnICsgc2hhcGVIVyArICcgJyArIHNoYXBlSFcgKyAnIC0nICsgc2hhcGVIVyArICcgJztcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHBvbHlnb25TdHIgPSBcIi1cIiArIGxpbmVIVyArIFwiIC1cIiArIDEgKyBcIiAtXCIgKyBsaW5lSFcgKyBcIiAtXCIgKyBzaGFwZUhXICsgXCIgXCI7XG5cdFx0XHRcdHBvbHlnb25TdHIgKz0gbGVmdFBvaW50cztcblx0XHRcdFx0cG9seWdvblN0ciArPSBcIi1cIiArIGxpbmVIVyArIFwiIFwiICsgc2hhcGVIVyArIFwiIC1cIiArIGxpbmVIVyArIFwiIDEgXCIgKyBsaW5lSFcgKyBcIiAxIFwiICsgbGluZUhXICsgXCIgXCIgKyBzaGFwZUhXICsgXCIgXCI7XG5cdFx0XHRcdHBvbHlnb25TdHIgKz0gcmlnaHRQb2ludHM7XG5cdFx0XHRcdHBvbHlnb25TdHIgKz0gbGluZUhXICsgXCIgLVwiICsgc2hhcGVIVyArIFwiIFwiICsgbGluZUhXICsgXCIgLTFcIjtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHBvbHlnb25TdHI7XG5cdFx0fTtcblxuXHRcdC8vIE5vdGUgdGhhdCBpbiBDaGlTRSB0aGlzIGZ1bmN0aW9uIGlzIGluIGEgc2VwZXJhdGUgZmlsZSBidXQgaW4gdGhlIHZpZXdlciBpdCBoYXMganVzdCAyIG1ldGhvZHMgYW5kIHNvIGl0IGlzIGxvY2F0ZWQgaW4gdGhpcyBmaWxlXG5cdFx0ZnVuY3Rpb24gcmVnaXN0ZXJVbmRvUmVkb0FjdGlvbnMoKSB7XG5cdFx0XHQvLyBjcmVhdGUgb3IgZ2V0IHRoZSB1bmRvLXJlZG8gaW5zdGFuY2Vcblx0XHRcdHZhciB1ciA9IGN5LnVuZG9SZWRvKCk7XG5cblx0XHRcdC8vIHJlZ2lzdGVyIGdlbmVyYWwgYWN0aW9uc1xuXHRcdFx0Ly8gcmVnaXN0ZXIgYWRkIHJlbW92ZSBhY3Rpb25zXG5cdFx0XHR1ci5hY3Rpb24oXCJkZWxldGVFbGVzU2ltcGxlXCIsIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zLmRlbGV0ZUVsZXNTaW1wbGUsIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zLnJlc3RvcmVFbGVzKTtcblx0XHRcdHVyLmFjdGlvbihcImRlbGV0ZU5vZGVzU21hcnRcIiwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMuZGVsZXRlTm9kZXNTbWFydCwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMucmVzdG9yZUVsZXMpO1xuXHRcdFx0dXIuYWN0aW9uKFwic2V0UG9ydHNPcmRlcmluZ1wiLCB1bmRvUmVkb0FjdGlvbkZ1bmN0aW9ucy5zZXRQb3J0c09yZGVyaW5nLCB1bmRvUmVkb0FjdGlvbkZ1bmN0aW9ucy5zZXRQb3J0c09yZGVyaW5nKTtcblxuXHRcdFx0Ly9leHBlcmltZW50YWwgZGF0YSBvdmFybGF5XG5cdFx0XHR1ci5hY3Rpb24oXCJyZW1vdmVBbGxcIiwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMucmVtb3ZlQWxsLCB1bmRvUmVkb0FjdGlvbkZ1bmN0aW9ucy5yZXN0b3JlQWxsKTtcblx0XHRcdHVyLmFjdGlvbihcImhpZGVFeHBlcmltZW50XCIsIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zLmhpZGVFeHAsIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zLnVuaGlkZUV4cCk7XG5cdFx0XHR1ci5hY3Rpb24oXCJ1bmhpZGVFeHBlcmltZW50XCIsIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zLnVuaGlkZUV4cCwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMuaGlkZUV4cCk7XG5cdFx0XHR1ci5hY3Rpb24oXCJoaWRlRmlsZVwiLCB1bmRvUmVkb0FjdGlvbkZ1bmN0aW9ucy5oaWRlRmlsZSwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMuaGlkZUZpbGVVbmRvKTtcblx0XHRcdHVyLmFjdGlvbihcInVuaGlkZUZpbGVcIiwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMudW5oaWRlRmlsZSwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMudW5oaWRlRmlsZVVuZG8pO1xuXHRcdFx0dXIuYWN0aW9uKFwicmVtb3ZlRXhwZXJpbWVudFwiLCB1bmRvUmVkb0FjdGlvbkZ1bmN0aW9ucy5yZW1vdmVFeHAsIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zLmFkZEV4cCk7XG5cdFx0XHR1ci5hY3Rpb24oXCJyZW1vdmVGaWxlXCIsIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zLnJlbW92ZUZpbGUsIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zLmFkZEZpbGUpO1xuXHRcdFx0dXIuYWN0aW9uKFwiZXhwQnV0dG9uQ2hhbmdlXCIsIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zLmV4cEJ1dHRvbkNoYW5nZSwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMuZXhwQnV0dG9uQ2hhbmdlKTtcblx0XHRcdHVyLmFjdGlvbihcImZpbGVCdXR0b25DaGFuZ2VIaWRlXCIsIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zLmZpbGVCdXR0b25DaGFuZ2VIaWRlLCB1bmRvUmVkb0FjdGlvbkZ1bmN0aW9ucy5maWxlQnV0dG9uQ2hhbmdlVW5IaWRlKTtcblx0XHRcdHVyLmFjdGlvbihcImZpbGVCdXR0b25DaGFuZ2VVbkhpZGVcIiwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMuZmlsZUJ1dHRvbkNoYW5nZVVuSGlkZSwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMuZmlsZUJ1dHRvbkNoYW5nZUhpZGUpO1xuXG5cdFx0XHQvL3VyLmFjdGlvbihcImV4cEJ1dHRvblVuaGlkZVwiLCB1bmRvUmVkb0FjdGlvbkZ1bmN0aW9ucy5jaGFuZ2VFeHBCdXR0b24yLCB1bmRvUmVkb0FjdGlvbkZ1bmN0aW9ucy5leHBCdXR0b25IaWRlKTtcblx0XHRcdC8vdXIuYWN0aW9uKFwicGFyc2VEYXRhXCIsIHVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zLnBhcnNlRGF0YSwgdW5kb1JlZG9BY3Rpb25GdW5jdGlvbnMucmVtb3ZlRmlsZSk7XG5cdFx0fVxuXG5cdFx0ZnVuY3Rpb24gc2hvd1Rvb2x0aXAoZXZlbnQpIHtcblx0XHRcdHZhciBub2RlID0gZXZlbnQudGFyZ2V0IHx8IGV2ZW50LmN5VGFyZ2V0O1xuXG5cdFx0XHR2YXIgY2FuSGF2ZVRvb2x0aXAgPSBmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0XHRyZXR1cm4gZWxlbWVudFV0aWxpdGllcy5pc1NJRk5vZGUobm9kZSkgfHwgbm9kZS5kYXRhKFwidG9vbHRpcFwiKSAhPT0gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCFjYW5IYXZlVG9vbHRpcChub2RlKSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdHZhciByZWY7IC8vIHVzZWQgb25seSBmb3IgcG9zaXRpb25pbmdcblx0XHRcdHZhciBwb3MgPSBldmVudC5wb3NpdGlvbiB8fCBldmVudC5jeVBvc2l0aW9uO1xuXHRcdFx0dmFyIHBhbiA9IGN5LnBhbigpO1xuXHRcdFx0dmFyIHpvb20gPSBjeS56b29tKCk7XG5cblx0XHRcdHZhciBpbmZvYm94ID0gY2xhc3Nlcy5BdXhpbGlhcnlVbml0LmNoZWNrUG9pbnQocG9zLngsIHBvcy55LCBub2RlLCAwKTtcblx0XHRcdHZhciB0b29sdGlwQ29udGVudDtcblxuXG5cdFx0XHRpZiAoIWluZm9ib3gpIHtcblx0XHRcdFx0dG9vbHRpcENvbnRlbnQgPSBub2RlLmRhdGEoJ3Rvb2x0aXAnKTtcblx0XHRcdFx0aWYgKHRvb2x0aXBDb250ZW50ID09IHVuZGVmaW5lZCB8fCB0b29sdGlwQ29udGVudCA9PSAnJykge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJlZiA9IG5vZGUucG9wcGVyUmVmKCk7XG5cdFx0XHR9XG5cdFx0XHRlbHNlIHtcblx0XHRcdFx0dG9vbHRpcENvbnRlbnQgPSBpbmZvYm94Wyd0b29sdGlwJ107XG5cblx0XHRcdFx0aWYgKHRvb2x0aXBDb250ZW50ID09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHZhciBtb2RlbFBvcyA9IGNsYXNzZXMuQXV4aWxpYXJ5VW5pdC5nZXRBYnNvbHV0ZUNvb3JkKGluZm9ib3gsIGN5KTtcblx0XHRcdFx0dmFyIG1vZGVsVyA9IGluZm9ib3guYmJveC53O1xuXHRcdFx0XHR2YXIgbW9kZWxIID0gaW5mb2JveC5iYm94Lmg7XG5cdFx0XHRcdHZhciByZW5kZXJlZFcgPSBtb2RlbFcgKiB6b29tO1xuXHRcdFx0XHR2YXIgcmVuZGVyZWRIID0gbW9kZWxIICogem9vbTtcblx0XHRcdFx0bW9kZWxQb3MueCAtPSBtb2RlbFcgLyAyO1xuXHRcdFx0XHRtb2RlbFBvcy55IC09IG1vZGVsSCAvIDI7XG5cdFx0XHRcdHZhciByZW5kZXJlZFBvcyA9IGVsZW1lbnRVdGlsaXRpZXMuY29udmVydFRvUmVuZGVyZWRQb3NpdGlvbihtb2RlbFBvcywgcGFuLCB6b29tKTtcblxuXHRcdFx0XHR2YXIgcmVuZGVyZWREaW1zID0geyB3OiByZW5kZXJlZFcsIGg6IHJlbmRlcmVkSCB9O1xuXG5cdFx0XHRcdHJlZiA9IG5vZGUucG9wcGVyUmVmKHtcblx0XHRcdFx0XHRyZW5kZXJlZFBvc2l0aW9uOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVuZGVyZWRQb3M7XG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0XHRyZW5kZXJlZERpbWVuc2lvbnM6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdHJldHVybiByZW5kZXJlZERpbXM7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9KTtcblx0XHRcdH1cblxuXG5cdFx0XHR2YXIgcGxhY2VtZW50ID0gaW5mb2JveCA/IGluZm9ib3guYW5jaG9yU2lkZSA6ICdib3R0b20nO1xuXHRcdFx0dmFyIGRlc3Ryb3lUaXBweTtcblxuXHRcdFx0dmFyIHRpcHB5ID0gVGlwcHkub25lKHJlZiwge1xuXHRcdFx0XHRjb250ZW50OiAoKCkgPT4ge1xuXHRcdFx0XHRcdHZhciBjb250ZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cblx0XHRcdFx0XHRjb250ZW50LnN0eWxlWydmb250LXNpemUnXSA9IDEyICogem9vbSArICdweCc7XG5cdFx0XHRcdFx0Y29udGVudC5pbm5lckhUTUwgPSB0b29sdGlwQ29udGVudDtcblxuXHRcdFx0XHRcdHJldHVybiBjb250ZW50O1xuXHRcdFx0XHR9KSgpLFxuXHRcdFx0XHR0cmlnZ2VyOiAnbWFudWFsJyxcblx0XHRcdFx0aGlkZU9uQ2xpY2s6IHRydWUsXG5cdFx0XHRcdGFycm93OiB0cnVlLFxuXHRcdFx0XHRwbGFjZW1lbnQsXG5cdFx0XHRcdG9uSGlkZGVuOiBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0Y3kub2ZmKCdwYW4gem9vbScsIGRlc3Ryb3lUaXBweSk7XG5cdFx0XHRcdFx0bm9kZS5vZmYoJ3Bvc2l0aW9uJywgZGVzdHJveVRpcHB5KTtcblx0XHRcdFx0XHRjeS5vZmYoJ3RhcGRyYWcnLCBkZXN0cm95VGlwcHkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0ZGVzdHJveVRpcHB5ID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHR0aXBweS5kZXN0cm95KCk7XG5cdFx0XHR9O1xuXG5cdFx0XHRjeS5vbigncGFuIHpvb20nLCBkZXN0cm95VGlwcHkpO1xuXHRcdFx0bm9kZS5vbigncG9zaXRpb24nLCBkZXN0cm95VGlwcHkpO1xuXHRcdFx0Y3kub24oJ3RhcGRyYWcnLCBkZXN0cm95VGlwcHkpO1xuXG5cdFx0XHRzZXRUaW1lb3V0KCgpID0+IHRpcHB5LnNob3coKSwgMjUwKTtcblx0XHR9XG5cblx0XHRmdW5jdGlvbiBiaW5kQ3lFdmVudHMoKSB7XG5cblx0XHRcdGN5Lm9uKCd0YXBkcmFnb3ZlcicsICdub2RlJywgZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRcdHZhciB3YWl0RHVyYXRpb24gPSAyMDA7XG5cdFx0XHRcdHZhciBub2RlVGFwZHJhZ291dDtcblx0XHRcdFx0dmFyIGN1cnJFdmVudCA9IGV2ZW50O1xuXHRcdFx0XHR2YXIgbm9kZSA9IGN1cnJFdmVudC50YXJnZXQgfHwgY3VyckV2ZW50LmN5VGFyZ2V0O1xuXHRcdFx0XHR2YXIgaW5RdWV1ZSA9IHRydWU7XG5cblx0XHRcdFx0dmFyIGNsZWFyTm9kZUV2ZW50ID0gZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdGlmIChub2RlVGFwZHJhZ291dCkge1xuXHRcdFx0XHRcdFx0bm9kZS5vZmYoJ3RhcGRyYWdvdXQnLCBub2RlVGFwZHJhZ291dCk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKG5vZGVUYXBkcmFnKSB7XG5cdFx0XHRcdFx0XHRub2RlLm9mZigndGFwZHJhZycsIG5vZGVUYXBkcmFnKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0dmFyIGdldFNob3dUb29sdGlwQXN5Y24gPSBmdW5jdGlvbiAoKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0c2hvd1Rvb2x0aXAoY3VyckV2ZW50KTtcblx0XHRcdFx0XHRcdGluUXVldWUgPSBmYWxzZTtcblx0XHRcdFx0XHR9LCB3YWl0RHVyYXRpb24pO1xuXHRcdFx0XHR9O1xuXG5cdFx0XHRcdHZhciBzaG93VG9vbHRpcEFzeWNuID0gZ2V0U2hvd1Rvb2x0aXBBc3ljbigpO1xuXG5cdFx0XHRcdG5vZGUub24oJ3RhcGRyYWdvdXQnLCBub2RlVGFwZHJhZ291dCA9IGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0Y2xlYXJUaW1lb3V0KHNob3dUb29sdGlwQXN5Y24pO1xuXHRcdFx0XHRcdGNsZWFyTm9kZUV2ZW50KCk7XG5cdFx0XHRcdH0pO1xuXG5cdFx0XHRcdG5vZGUub24oJ3RhcGRyYWcnLCBub2RlVGFwZHJhZyA9IGZ1bmN0aW9uIChlKSB7XG5cdFx0XHRcdFx0Y3VyckV2ZW50ID0gZTtcblx0XHRcdFx0XHRpZiAoIWluUXVldWUpIHtcblx0XHRcdFx0XHRcdHNob3dUb29sdGlwQXN5Y24gPSBnZXRTaG93VG9vbHRpcEFzeWNuKCk7XG5cdFx0XHRcdFx0XHRpblF1ZXVlID0gdHJ1ZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pO1xuXHRcdFx0fSk7XG5cblx0XHRcdGN5Lm9uKCd0YXBlbmQnLCAnbm9kZScsIGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0XHRjeS5zdHlsZSgpLnVwZGF0ZSgpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGN5Lm9uKFwiZXhwYW5kY29sbGFwc2UuYmVmb3JlY29sbGFwc2VcIiwgXCJub2RlXCIsIGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0XHR2YXIgbm9kZSA9IHRoaXM7XG5cdFx0XHRcdC8vVGhlIGNoaWxkcmVuIGluZm8gb2YgY29tcGxleCBub2RlcyBzaG91bGQgYmUgc2hvd24gd2hlbiB0aGV5IGFyZSBjb2xsYXBzZWRcblx0XHRcdFx0aWYgKG5vZGUuX3ByaXZhdGUuZGF0YS5jbGFzcy5zdGFydHNXaXRoKFwiY29tcGxleFwiKSkge1xuXHRcdFx0XHRcdC8vVGhlIG5vZGUgaXMgYmVpbmcgY29sbGFwc2VkIHN0b3JlIGluZm9sYWJlbCB0byB1c2UgaXQgbGF0ZXJcblx0XHRcdFx0XHR2YXIgaW5mb0xhYmVsID0gZWxlbWVudFV0aWxpdGllcy5nZXRJbmZvTGFiZWwobm9kZSk7XG5cdFx0XHRcdFx0bm9kZS5fcHJpdmF0ZS5kYXRhLmluZm9MYWJlbCA9IGluZm9MYWJlbDtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGN5Lm9uKFwiZXhwYW5kY29sbGFwc2UuYWZ0ZXJjb2xsYXBzZVwiLCBcIm5vZGVcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRcdHZhciBub2RlID0gdGhpcztcblx0XHRcdFx0Ly8gVGhlIHdpZHRoIGFuZCBoZWlnaHQgb2YganVzdCBjb2xsYXBzZWQgbm9kZXMgc2hvdWxkIGJlIDM2LCBidXQgdGhleSBhcmUgc3VwcG9zZWQgdG8gYmUgcmVzaXphYmxlLiBUaGVyZWZvcmUsIHdlXG5cdFx0XHRcdC8vIHNldCB0aGVpciBkYXRhKCdiYm94JykgYWNjb3JkaW5nbHkuIFdlIGRvIG5vdCBzdG9yZSB0aGVpciBleGlzdGluZyBiYm94LncgYW5kIGJib3guaCBiZWNhdXNlIHRoZXkgaGF2ZSBubyBzaWduaWZpY2FuY2UgZm9yIGNvbXBvdW5kcyAoZm9yIG5vdykuXG5cdFx0XHRcdGN5LnN0YXJ0QmF0Y2goKTtcblx0XHRcdFx0dmFyIGJib3ggPSBub2RlLmRhdGEoJ2Jib3gnKTtcblx0XHRcdFx0YmJveC53ID0gMzY7XG5cdFx0XHRcdGJib3guaCA9IDM2O1xuXHRcdFx0XHRub2RlLmRhdGEoJ2Jib3gnLCBiYm94KTtcblx0XHRcdFx0Y3kuZW5kQmF0Y2goKTtcblx0XHRcdH0pO1xuXG5cdFx0XHRjeS5vbihcImV4cGFuZGNvbGxhcHNlLmJlZm9yZWV4cGFuZFwiLCBcIm5vZGVcIiwgZnVuY3Rpb24gKGV2ZW50KSB7XG5cdFx0XHRcdHZhciBub2RlID0gdGhpcztcblx0XHRcdFx0bm9kZS5yZW1vdmVEYXRhKFwiaW5mb0xhYmVsXCIpO1xuXHRcdFx0fSk7XG5cblx0XHRcdGN5Lm9uKFwiZXhwYW5kY29sbGFwc2UuYWZ0ZXJleHBhbmRcIiwgXCJub2RlXCIsIGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0XHR2YXIgbm9kZSA9IHRoaXM7XG5cdFx0XHRcdGN5Lm5vZGVzKCkudXBkYXRlQ29tcG91bmRCb3VuZHMoKTtcblxuXHRcdFx0XHRpZiAoIW9wdGlvbnMucmVjYWxjdWxhdGVPbkNvbXBsZXhpdHlNYW5hZ2VtZW50KSB7XG5cdFx0XHRcdFx0Y3kuc3R5bGUoKS51cGRhdGUoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHQvL0Rvbid0IHNob3cgY2hpbGRyZW4gaW5mbyB3aGVuIHRoZSBjb21wbGV4IG5vZGUgaXMgZXhwYW5kZWRcblx0XHRcdFx0aWYgKG5vZGUuX3ByaXZhdGUuZGF0YS5jbGFzcy5zdGFydHNXaXRoKFwiY29tcGxleFwiKSkge1xuXHRcdFx0XHRcdG5vZGUucmVtb3ZlU3R5bGUoJ2NvbnRlbnQnKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGN5Lm9uKFwiYmVmb3JlRG9cIiwgZnVuY3Rpb24gKGUsIG5hbWUsIGFyZ3MpIHtcblx0XHRcdFx0aWYgKG5hbWUgPT0gXCJsYXlvdXRcIiB8fCBuYW1lID09IFwiY29sbGFwc2VcIiB8fCBuYW1lID09IFwiZXhwYW5kXCIgfHwgbmFtZSA9PSBcImNvbGxhcHNlUmVjdXJzaXZlbHlcIiB8fCBuYW1lID09IFwiZXhwYW5kUmVjdXJzaXZlbHlcIlxuXHRcdFx0XHRcdHx8IChuYW1lID09IFwiYmF0Y2hcIiAmJiAoKGFyZ3MubGVuZ3RoID4gMCAmJiBhcmdzWzBdWyduYW1lJ10gPT0gXCJ0aGluQm9yZGVyXCIpIHx8IChhcmdzLmxlbmd0aCA+IDAgJiYgYXJnc1swXVsnbmFtZSddID09IFwidGhpY2tlbkJvcmRlclwiKSkpKSB7XG5cdFx0XHRcdFx0dmFyIHBhcmVudHMgPSBjeS5lbGVtZW50cyhcIjpwYXJlbnRcIikuanNvbnMoKTsgLy8gcGFyZW50IG5vZGVzXG5cdFx0XHRcdFx0dmFyIHNpbXBsZXMgPSBjeS5lbGVtZW50cygpLm5vdChcIjpwYXJlbnRcIikuanNvbnMoKTsgLy8gc2ltcGxlIG5vZGVzIGFuZCBlZGdlc1xuXHRcdFx0XHRcdHZhciBhbGxFbGVtZW50cyA9IHBhcmVudHMuY29uY2F0KHNpbXBsZXMpOyAgLy8gYWxsIGVsZW1lbnRzXG5cdFx0XHRcdFx0YXJncy5hbGxFbGVtZW50cyA9IGFsbEVsZW1lbnRzO1xuXHRcdFx0XHRcdHZhciBwb3J0cyA9IHt9O1xuXHRcdFx0XHRcdGN5Lm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0XHRcdFx0aWYgKGVsZW1lbnRVdGlsaXRpZXMuY2FuSGF2ZVBvcnRzKG5vZGUpKSB7XG5cdFx0XHRcdFx0XHRcdHBvcnRzW25vZGUuaWQoKV0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG5vZGUuZGF0YShcInBvcnRzXCIpKSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YXJncy5wb3J0cyA9IHBvcnRzO1xuXHRcdFx0XHRcdGFyZ3Mudmlld3BvcnQgPSB7IHBhbjogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjeS5wYW4oKSkpLCB6b29tOiBjeS56b29tKCkgfTtcblx0XHRcdFx0XHRpZiAobmFtZSA9PSBcImxheW91dFwiKVxuXHRcdFx0XHRcdFx0bWFpblV0aWxpdGllcy5iZWZvcmVQZXJmb3JtTGF5b3V0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRjeS5vbihcImJlZm9yZVJlZG9cIiwgZnVuY3Rpb24gKGUsIG5hbWUsIGFyZ3MpIHtcblx0XHRcdFx0aWYgKG5hbWUgPT0gXCJsYXlvdXRcIiB8fCBuYW1lID09IFwiY29sbGFwc2VcIiB8fCBuYW1lID09IFwiZXhwYW5kXCIgfHwgbmFtZSA9PSBcImNvbGxhcHNlUmVjdXJzaXZlbHlcIiB8fCBuYW1lID09IFwiZXhwYW5kUmVjdXJzaXZlbHlcIlxuXHRcdFx0XHRcdHx8IChuYW1lID09IFwiYmF0Y2hcIiAmJiAoKGFyZ3MubGVuZ3RoID4gMCAmJiBhcmdzWzBdWyduYW1lJ10gPT0gXCJ0aGluQm9yZGVyXCIpIHx8IChhcmdzLmxlbmd0aCA+IDAgJiYgYXJnc1swXVsnbmFtZSddID09IFwidGhpY2tlbkJvcmRlclwiKSkpKSB7XG5cdFx0XHRcdFx0dmFyIHBhcmVudHMgPSBjeS5lbGVtZW50cyhcIjpwYXJlbnRcIikuanNvbnMoKTsgLy8gcGFyZW50IG5vZGVzXG5cdFx0XHRcdFx0dmFyIHNpbXBsZXMgPSBjeS5lbGVtZW50cygpLm5vdChcIjpwYXJlbnRcIikuanNvbnMoKTsgLy8gc2ltcGxlIG5vZGVzIGFuZCBlZGdlc1xuXHRcdFx0XHRcdHZhciBhbGxFbGVtZW50cyA9IHBhcmVudHMuY29uY2F0KHNpbXBsZXMpOyAgLy8gYWxsIGVsZW1lbnRzXG5cdFx0XHRcdFx0YXJncy5hbGxFbGVtZW50czIgPSBhbGxFbGVtZW50cztcblx0XHRcdFx0XHR2YXIgcG9ydHMgPSB7fTtcblx0XHRcdFx0XHRjeS5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdFx0XHRcdGlmIChlbGVtZW50VXRpbGl0aWVzLmNhbkhhdmVQb3J0cyhub2RlKSkge1xuXHRcdFx0XHRcdFx0XHRwb3J0c1tub2RlLmlkKCldID0gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShub2RlLmRhdGEoXCJwb3J0c1wiKSkpO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGFyZ3MucG9ydHMyID0gcG9ydHM7XG5cdFx0XHRcdFx0YXJncy52aWV3cG9ydDIgPSB7IHBhbjogSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShjeS5wYW4oKSkpLCB6b29tOiBjeS56b29tKCkgfTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGN5Lm9uKFwiYWZ0ZXJEb1wiLCBmdW5jdGlvbiAoZSwgbmFtZSwgYXJncywgcmVzKSB7XG5cdFx0XHRcdGlmIChuYW1lID09IFwibGF5b3V0XCIgfHwgbmFtZSA9PSBcImNvbGxhcHNlXCIgfHwgbmFtZSA9PSBcImV4cGFuZFwiIHx8IG5hbWUgPT0gXCJjb2xsYXBzZVJlY3Vyc2l2ZWx5XCIgfHwgbmFtZSA9PSBcImV4cGFuZFJlY3Vyc2l2ZWx5XCJcblx0XHRcdFx0XHR8fCAobmFtZSA9PSBcImJhdGNoXCIgJiYgKChhcmdzLmxlbmd0aCA+IDAgJiYgYXJnc1swXVsnbmFtZSddID09IFwidGhpbkJvcmRlclwiKSB8fCAoYXJncy5sZW5ndGggPiAwICYmIGFyZ3NbMF1bJ25hbWUnXSA9PSBcInRoaWNrZW5Cb3JkZXJcIikpKSkge1xuXHRcdFx0XHRcdHJlcy5hbGxFbGVtZW50cyA9IGFyZ3MuYWxsRWxlbWVudHM7XG5cdFx0XHRcdFx0cmVzLnBvcnRzID0gYXJncy5wb3J0cztcblx0XHRcdFx0XHRyZXMudmlld3BvcnQgPSBhcmdzLnZpZXdwb3J0O1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0Y3kub24oXCJhZnRlclJlZG9cIiwgZnVuY3Rpb24gKGUsIG5hbWUsIGFyZ3MsIHJlcykge1xuXG5cdFx0XHRcdGlmIChuYW1lID09IFwibGF5b3V0XCIgfHwgbmFtZSA9PSBcImNvbGxhcHNlXCIgfHwgbmFtZSA9PSBcImV4cGFuZFwiIHx8IG5hbWUgPT0gXCJjb2xsYXBzZVJlY3Vyc2l2ZWx5XCIgfHwgbmFtZSA9PSBcImV4cGFuZFJlY3Vyc2l2ZWx5XCJcblx0XHRcdFx0XHR8fCAobmFtZSA9PSBcImJhdGNoXCIgJiYgKChhcmdzLmxlbmd0aCA+IDAgJiYgYXJnc1swXVsnbmFtZSddID09IFwidGhpbkJvcmRlclwiKSB8fCAoYXJncy5sZW5ndGggPiAwICYmIGFyZ3NbMF1bJ25hbWUnXSA9PSBcInRoaWNrZW5Cb3JkZXJcIikpKSkge1xuXHRcdFx0XHRcdHJlcy5hbGxFbGVtZW50cyA9IGFyZ3MuYWxsRWxlbWVudHMyO1xuXHRcdFx0XHRcdHJlcy5wb3J0cyA9IGFyZ3MucG9ydHMyO1xuXHRcdFx0XHRcdHJlcy52aWV3cG9ydCA9IGFyZ3Mudmlld3BvcnQyO1xuXHRcdFx0XHRcdGN5Lmpzb24oeyBmbGF0RWxlczogdHJ1ZSwgZWxlbWVudHM6IGFyZ3MuYWxsRWxlbWVudHMgfSk7XG5cdFx0XHRcdFx0Y3kuYmF0Y2goZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRcdFx0Y3kubm9kZXMoKS5mb3JFYWNoKGZ1bmN0aW9uIChub2RlKSB7XG5cdFx0XHRcdFx0XHRcdGlmIChlbGVtZW50VXRpbGl0aWVzLmNhbkhhdmVQb3J0cyhub2RlKSkge1xuXHRcdFx0XHRcdFx0XHRcdG5vZGUuZGF0YShcInBvcnRzXCIsIGFyZ3MucG9ydHNbbm9kZS5pZCgpXSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdH0pO1xuXHRcdFx0XHRcdGN5LnBhbihhcmdzLnZpZXdwb3J0W1wicGFuXCJdKTtcblx0XHRcdFx0XHRjeS56b29tKGFyZ3Mudmlld3BvcnRbXCJ6b29tXCJdKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdGN5Lm9uKFwiYmVmb3JlVW5kb1wiLCBmdW5jdGlvbiAoZSwgbmFtZSwgYXJncykge1xuXHRcdFx0XHRpZiAobmFtZSA9PSBcImxheW91dFwiIHx8IG5hbWUgPT0gXCJjb2xsYXBzZVwiIHx8IG5hbWUgPT0gXCJleHBhbmRcIiB8fCBuYW1lID09IFwiY29sbGFwc2VSZWN1cnNpdmVseVwiIHx8IG5hbWUgPT0gXCJleHBhbmRSZWN1cnNpdmVseVwiXG5cdFx0XHRcdFx0fHwgKG5hbWUgPT0gXCJiYXRjaFwiICYmICgoYXJncy5sZW5ndGggPiAwICYmIGFyZ3NbMF1bJ25hbWUnXSA9PSBcInRoaW5Cb3JkZXJcIikgfHwgKGFyZ3MubGVuZ3RoID4gMCAmJiBhcmdzWzBdWyduYW1lJ10gPT0gXCJ0aGlja2VuQm9yZGVyXCIpKSkpIHtcblx0XHRcdFx0XHR2YXIgcGFyZW50cyA9IGN5LmVsZW1lbnRzKFwiOnBhcmVudFwiKS5qc29ucygpOyAvLyBwYXJlbnQgbm9kZXNcblx0XHRcdFx0XHR2YXIgc2ltcGxlcyA9IGN5LmVsZW1lbnRzKCkubm90KFwiOnBhcmVudFwiKS5qc29ucygpOyAvLyBzaW1wbGUgbm9kZXMgYW5kIGVkZ2VzXG5cdFx0XHRcdFx0dmFyIGFsbEVsZW1lbnRzID0gcGFyZW50cy5jb25jYXQoc2ltcGxlcyk7ICAvLyBhbGwgZWxlbWVudHNcblx0XHRcdFx0XHRhcmdzLmFsbEVsZW1lbnRzMiA9IGFsbEVsZW1lbnRzO1xuXHRcdFx0XHRcdHZhciBwb3J0cyA9IHt9O1xuXHRcdFx0XHRcdGN5Lm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0XHRcdFx0aWYgKGVsZW1lbnRVdGlsaXRpZXMuY2FuSGF2ZVBvcnRzKG5vZGUpKSB7XG5cdFx0XHRcdFx0XHRcdHBvcnRzW25vZGUuaWQoKV0gPSBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KG5vZGUuZGF0YShcInBvcnRzXCIpKSk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0YXJncy5wb3J0czIgPSBwb3J0cztcblx0XHRcdFx0XHRhcmdzLnZpZXdwb3J0MiA9IHsgcGFuOiBKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGN5LnBhbigpKSksIHpvb206IGN5Lnpvb20oKSB9O1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0Y3kub24oXCJhZnRlclVuZG9cIiwgZnVuY3Rpb24gKGUsIG5hbWUsIGFyZ3MsIHJlcykge1xuXHRcdFx0XHRpZiAobmFtZSA9PSBcImxheW91dFwiIHx8IG5hbWUgPT0gXCJjb2xsYXBzZVwiIHx8IG5hbWUgPT0gXCJleHBhbmRcIiB8fCBuYW1lID09IFwiY29sbGFwc2VSZWN1cnNpdmVseVwiIHx8IG5hbWUgPT0gXCJleHBhbmRSZWN1cnNpdmVseVwiXG5cdFx0XHRcdFx0fHwgKG5hbWUgPT0gXCJiYXRjaFwiICYmICgoYXJncy5sZW5ndGggPiAwICYmIGFyZ3NbMF1bJ25hbWUnXSA9PSBcInRoaW5Cb3JkZXJcIikgfHwgKGFyZ3MubGVuZ3RoID4gMCAmJiBhcmdzWzBdWyduYW1lJ10gPT0gXCJ0aGlja2VuQm9yZGVyXCIpKSkpIHtcblx0XHRcdFx0XHRyZXMuYWxsRWxlbWVudHMgPSBhcmdzLmFsbEVsZW1lbnRzMjtcblx0XHRcdFx0XHRyZXMucG9ydHMgPSBhcmdzLnBvcnRzMjtcblx0XHRcdFx0XHRyZXMudmlld3BvcnQgPSBhcmdzLnZpZXdwb3J0Mjtcblx0XHRcdFx0XHRjeS5qc29uKHsgZmxhdEVsZXM6IHRydWUsIGVsZW1lbnRzOiBhcmdzLmFsbEVsZW1lbnRzIH0pO1xuXHRcdFx0XHRcdGN5LmJhdGNoKGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRcdGN5Lm5vZGVzKCkuZm9yRWFjaChmdW5jdGlvbiAobm9kZSkge1xuXHRcdFx0XHRcdFx0XHRpZiAoZWxlbWVudFV0aWxpdGllcy5jYW5IYXZlUG9ydHMobm9kZSkpIHtcblx0XHRcdFx0XHRcdFx0XHRub2RlLmRhdGEoXCJwb3J0c1wiLCBhcmdzLnBvcnRzW25vZGUuaWQoKV0pO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRjeS5wYW4oYXJncy52aWV3cG9ydFtcInBhblwiXSk7XG5cdFx0XHRcdFx0Y3kuem9vbShhcmdzLnZpZXdwb3J0W1wiem9vbVwiXSk7XG5cdFx0XHRcdH1cblx0XHRcdH0pO1xuXG5cdFx0XHRjeS5vbignbGF5b3V0c3RvcCcsIGZ1bmN0aW9uIChldmVudCkge1xuXHRcdFx0XHQvKlxuXHRcdFx0XHQqICdwcmVzZXQnIGxheW91dCBpcyBjYWxsZWQgdG8gZ2l2ZSB0aGUgaW5pdGlhbCBwb3NpdGlvbnMgb2Ygbm9kZXMgYnkgc2JnbnZpei5cblx0XHRcdFx0KiBTZWVtcyBsaWtlICdncmlkJyBsYXlvdXQgaXMgY2FsbGVkIGJ5IEN5dG9zY2FwZS5qcyBjb3JlIGluIGxvYWRpbmcgZ3JhcGhzLlxuXHRcdFx0XHQqIElmIHRoZSBsYXlvdXQgaXMgbm90IG9uZSBvZiB0aGVzZSAobm9ybWFsbHkgaXQgaXMgc3VwcG9zZWQgdG8gYmUgJ2Nvc2UtYmlsa2VudCcpXG5cdFx0XHRcdCogYW5kIHBvcnRzIGFyZSBlbmFibGVkIGNhbGwgJ2VsZW1lbnRVdGlsaXRpZXMuY2hhbmdlUG9ydHNPcmllbnRhdGlvbkFmdGVyTGF5b3V0KCknXG5cdFx0XHRcdCovXG5cdFx0XHRcdGlmIChldmVudC5sYXlvdXQub3B0aW9ucy5uYW1lICE9PSAncHJlc2V0JyAmJiBldmVudC5sYXlvdXQub3B0aW9ucy5uYW1lICE9PSAnZ3JpZCcpIHtcdC8vIDMwMDAgbm9kZXMvZWRnZXMgY2hlY2sgaXMgZm9yIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50XG5cdFx0XHRcdFx0aWYgKGdyYXBoVXRpbGl0aWVzLnBvcnRzRW5hYmxlZCA9PT0gdHJ1ZSAmJiAhKGN5Lm5vZGVzKCkubGVuZ3RoID4gMzAwMCB8fCBjeS5lZGdlcygpLmxlbmd0aCA+IDMwMDApKSB7XG5cdFx0XHRcdFx0XHRlbGVtZW50VXRpbGl0aWVzLmNoYW5nZVBvcnRzT3JpZW50YXRpb25BZnRlckxheW91dCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdCQoZG9jdW1lbnQpLm9uKCd1cGRhdGVHcmFwaEVuZCcsIGZ1bmN0aW9uIChldmVudCwgX2N5LCBpc0xheW91dFJlcXVpcmVkLCBjYWxsYmFjaykge1xuXG5cdFx0XHRcdC8vIGlmIHRoZSBldmVudCBpcyBub3QgdHJpZ2dlcmVkIGZvciB0aGlzIGN5IGluc3RhbmNlIHJldHVybiBkaXJlY3RseVxuXHRcdFx0XHRpZiAoX2N5ICE9IGN5KSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHZhciBzZXRDb21wb3VuZEluZm9ib3hlcyA9IGZ1bmN0aW9uIChub2RlLCBpc0xheW91dFJlcXVpcmVkLCBjeUluc3RhbmNlKSB7XG5cdFx0XHRcdFx0aWYgKGN5SW5zdGFuY2UgPT0gdW5kZWZpbmVkKSByZXR1cm47XG5cdFx0XHRcdFx0aWYgKG5vZGUuZGF0YSgpLmluZm9ib3hDYWxjdWxhdGVkKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdFx0fSBlbHNlIGlmIChub2RlLmlzUGFyZW50KCkpIHtcblx0XHRcdFx0XHRcdG5vZGUuY2hpbGRyZW4oKS5mb3JFYWNoKGZ1bmN0aW9uIChjaGlsZE5vZGUpIHtcblx0XHRcdFx0XHRcdFx0c2V0Q29tcG91bmRJbmZvYm94ZXMoY2hpbGROb2RlLCBpc0xheW91dFJlcXVpcmVkLCBjeUluc3RhbmNlKTtcblx0XHRcdFx0XHRcdH0pO1xuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0bm9kZS5kYXRhKFwiaW5mb2JveENhbGN1bGF0ZWRcIiwgdHJ1ZSk7XG5cdFx0XHRcdFx0bm9kZS5kYXRhKCdhdXh1bml0bGF5b3V0cycsIHt9KTtcblx0XHRcdFx0XHQvLyBmb3IgZWFjaCBzdGF0ZXNhbmRpbmZvc1xuXG5cdFx0XHRcdFx0dmFyIGNvcnJlY3RJbmZvQm94Q29vcmQgPSB0cnVlO1xuXHRcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5kYXRhKCdzdGF0ZXNhbmRpbmZvcycpLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHR2YXIgc3RhdGVzYW5kaW5mb3MgPSBub2RlLmRhdGEoJ3N0YXRlc2FuZGluZm9zJylbaV07XG5cdFx0XHRcdFx0XHR2YXIgYmJveCA9IHN0YXRlc2FuZGluZm9zLmJib3g7XG5cdFx0XHRcdFx0XHR2YXIgaW5mb0JveE9uTm9kZSA9IGNsYXNzZXMuQXV4aWxpYXJ5VW5pdC5zZXRBbmNob3JTaWRlKHN0YXRlc2FuZGluZm9zLCBub2RlKTtcblx0XHRcdFx0XHRcdGNvcnJlY3RJbmZvQm94Q29vcmQgPSBjb3JyZWN0SW5mb0JveENvb3JkICYmIGluZm9Cb3hPbk5vZGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGZvciAodmFyIGkgPSAwOyBpIDwgbm9kZS5kYXRhKCdzdGF0ZXNhbmRpbmZvcycpLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdFx0XHR2YXIgc3RhdGVzYW5kaW5mb3MgPSBub2RlLmRhdGEoJ3N0YXRlc2FuZGluZm9zJylbaV07XG5cdFx0XHRcdFx0XHR2YXIgYmJveCA9IHN0YXRlc2FuZGluZm9zLmJib3g7XG5cblxuXHRcdFx0XHRcdFx0aWYgKChpc0xheW91dFJlcXVpcmVkID09PSB1bmRlZmluZWQgfHwgIWlzTGF5b3V0UmVxdWlyZWQpICYmIGNvcnJlY3RJbmZvQm94Q29vcmQpIHtcblx0XHRcdFx0XHRcdFx0dmFyIGNvcmRSZXN1bHQgPSBjbGFzc2VzLkF1eGlsaWFyeVVuaXQuY29udmVydFRvUmVsYXRpdmVDb29yZChzdGF0ZXNhbmRpbmZvcywgYmJveC54ICsgYmJveC53IC8gMiwgYmJveC55ICsgYmJveC5oIC8gMiwgY3lJbnN0YW5jZSwgbm9kZSlcblx0XHRcdFx0XHRcdFx0c3RhdGVzYW5kaW5mb3MuYmJveC54ID0gY29yZFJlc3VsdC54O1xuXHRcdFx0XHRcdFx0XHRzdGF0ZXNhbmRpbmZvcy5iYm94LnkgPSBjb3JkUmVzdWx0Lnk7XG5cdFx0XHRcdFx0XHRcdHN0YXRlc2FuZGluZm9zLmlzRGlzcGxheWVkID0gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0dmFyIGxvY2F0aW9uID0gc3RhdGVzYW5kaW5mb3MuYW5jaG9yU2lkZTsgLy8gdG9wIGJvdHRvbSByaWdodCBsZWZ0XG5cdFx0XHRcdFx0XHRcdHZhciBsYXlvdXRzID0gbm9kZS5kYXRhKCdhdXh1bml0bGF5b3V0cycpO1xuXHRcdFx0XHRcdFx0XHRpZiAoIWxheW91dHNbbG9jYXRpb25dKSB7IC8vIGxheW91dCBkb2Vzbid0IGV4aXN0IHlldCBmb3IgdGhpcyBsb2NhdGlvblxuXHRcdFx0XHRcdFx0XHRcdGxheW91dHNbbG9jYXRpb25dID0gY2xhc3Nlcy5BdXhVbml0TGF5b3V0LmNvbnN0cnVjdChub2RlLCBsb2NhdGlvbik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0Ly8gcG9wdWxhdGUgdGhlIGxheW91dCBvZiB0aGlzIHNpZGVcblx0XHRcdFx0XHRcdFx0Y2xhc3Nlcy5BdXhVbml0TGF5b3V0LmFkZEF1eFVuaXQobGF5b3V0c1tsb2NhdGlvbl0sIGN5SW5zdGFuY2UsIHN0YXRlc2FuZGluZm9zLCB1bmRlZmluZWQsIHRydWUpOyAvL3Bvc2l0aW9ucyBhcmUgcHJlY29tcHV0ZWRcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRpZiAoIW5vZGUuZGF0YSgnYXV4dW5pdGxheW91dHMnKSkgeyAvLyBlbnN1cmUgbWluaW1hbCBpbml0aWFsaXphdGlvblxuXHRcdFx0XHRcdFx0XHRcdG5vZGUuZGF0YSgnYXV4dW5pdGxheW91dHMnLCB7fSk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dmFyIGxvY2F0aW9uID0gY2xhc3Nlcy5BdXhVbml0TGF5b3V0LnNlbGVjdE5leHRBdmFpbGFibGUobm9kZSwgY3kpO1xuXHRcdFx0XHRcdFx0XHRpZiAoIW5vZGUuZGF0YSgnYXV4dW5pdGxheW91dHMnKVtsb2NhdGlvbl0pIHtcblx0XHRcdFx0XHRcdFx0XHRub2RlLmRhdGEoJ2F1eHVuaXRsYXlvdXRzJylbbG9jYXRpb25dID0gY2xhc3Nlcy5BdXhVbml0TGF5b3V0LmNvbnN0cnVjdChub2RlLCBsb2NhdGlvbik7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0dmFyIGxheW91dCA9IG5vZGUuZGF0YSgnYXV4dW5pdGxheW91dHMnKVtsb2NhdGlvbl07XG5cdFx0XHRcdFx0XHRcdHN0YXRlc2FuZGluZm9zLmFuY2hvclNpZGUgPSBsb2NhdGlvbjtcblx0XHRcdFx0XHRcdFx0c3dpdGNoIChsb2NhdGlvbikge1xuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJ0b3BcIjogc3RhdGVzYW5kaW5mb3MuYmJveC55ID0gMDsgYnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0Y2FzZSBcImJvdHRvbVwiOiBzdGF0ZXNhbmRpbmZvcy5iYm94LnkgPSAxMDA7IGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJsZWZ0XCI6IHN0YXRlc2FuZGluZm9zLmJib3gueCA9IDA7IGJyZWFrO1xuXHRcdFx0XHRcdFx0XHRcdGNhc2UgXCJyaWdodFwiOiBzdGF0ZXNhbmRpbmZvcy5iYm94LnggPSAxMDA7IGJyZWFrO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdGNsYXNzZXMuQXV4VW5pdExheW91dC5hZGRBdXhVbml0KGxheW91dCwgY3lJbnN0YW5jZSwgc3RhdGVzYW5kaW5mb3MpO1xuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0aWYgKGlzTGF5b3V0UmVxdWlyZWQgPT09IHRydWUpIHtcblx0XHRcdFx0XHRcdHZhciBsb2NhdGlvbnMgPSBjbGFzc2VzLkF1eFVuaXRMYXlvdXQuY2hlY2tGaXQobm9kZSwgY3kpO1xuXHRcdFx0XHRcdFx0aWYgKGxvY2F0aW9ucyAhPT0gdW5kZWZpbmVkICYmIGxvY2F0aW9ucy5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdFx0XHRcdGNsYXNzZXMuQXV4VW5pdExheW91dC5maXRVbml0cyhub2RlLCBjeSwgbG9jYXRpb25zKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0fTtcblx0XHRcdFx0Ly8gbGlzdCBhbGwgZW50aXR5dHlwZXMgYW5kc3RvcmUgdGhlbSBpbiB0aGUgZ2xvYmFsIHNjcmF0Y2hcblx0XHRcdFx0Ly8gb25seSBzdGF0ZWZ1bCBFUE4gKGNvbXBsZXgsIG1hY3JvbW9sZWN1bGUgb3IgbnVjbGVpYyBhY2lkKSBhcmUgY29uY2VybmVkXG5cblx0XHRcdFx0Ly8gYXNzaWduIHN0YXRlc2FuZGluZm9zIHRvIHRoZWlyIGxheW91dFxuXHRcdFx0XHRjeS5zdHlsZSgpLnVwZGF0ZSgpO1xuXHRcdFx0XHQvLyBjeS5zdGFydEJhdGNoKCk7XG5cblx0XHRcdFx0Ly8gdGhpcyBjaGVjayBpcyBmb3IgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRcblx0XHRcdFx0aWYgKCEoY3kubm9kZXMoKS5sZW5ndGggPiAzMDAwIHx8IGN5LmVkZ2VzKCkubGVuZ3RoID4gMzAwMCkpIHtcblx0XHRcdFx0XHRjeS5ub2RlcygpLmZvckVhY2goZnVuY3Rpb24gKG5vZGUpIHtcblx0XHRcdFx0XHRcdHNldENvbXBvdW5kSW5mb2JveGVzKG5vZGUsIGlzTGF5b3V0UmVxdWlyZWQsIGN5KTtcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmIChjYWxsYmFjaykge1xuXHRcdFx0XHRcdGNhbGxiYWNrKCk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvL2N5LmVuZEJhdGNoKCk7XG5cdFx0XHR9KTtcblx0XHR9XG5cblx0XHR2YXIgc2VsZWN0aW9uQ29sb3IgPSAnIzg5ODk4YSc7XG5cdFx0dmFyIHNiZ25TdHlsZVNoZWV0ID0gY3l0b3NjYXBlLnN0eWxlc2hlZXQoKVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZVwiKVxuXHRcdFx0LmNzcyh7XG5cdFx0XHRcdCd0ZXh0LXZhbGlnbic6ICdjZW50ZXInLFxuXHRcdFx0XHQndGV4dC1oYWxpZ24nOiAnY2VudGVyJyxcblx0XHRcdFx0J3RleHQtb3BhY2l0eSc6IDEsXG5cdFx0XHRcdCdvcGFjaXR5JzogMSxcblx0XHRcdFx0J3BhZGRpbmcnOiAwXG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZVtjbGFzc11cIilcblx0XHRcdC5jc3Moe1xuXHRcdFx0XHQnc2hhcGUnOiBmdW5jdGlvbiAoZWxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZW1lbnRVdGlsaXRpZXMuZ2V0Q3lTaGFwZShlbGUpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnY29udGVudCc6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlbWVudFV0aWxpdGllcy5nZXRFbGVtZW50Q29udGVudChlbGUpO1xuXHRcdFx0XHR9LFxuXHRcdFx0XHQnZm9udC1zaXplJzogZnVuY3Rpb24gKGVsZSkge1xuXHRcdFx0XHRcdC8vIElmIG5vZGUgbGFiZWxzIGFyZSBleHBlY3RlZCB0byBiZSBhZGp1c3RlZCBhdXRvbWF0aWNhbGx5IG9yIGVsZW1lbnQgY2Fubm90IGhhdmUgbGFiZWxcblx0XHRcdFx0XHQvLyBvciBlbGUuZGF0YSgnZm9udC1zaXplJykgaXMgbm90IGRlZmluZWQgcmV0dXJuIGVsZW1lbnRVdGlsaXRpZXMuZ2V0TGFiZWxUZXh0U2l6ZSgpXG5cdFx0XHRcdFx0Ly8gZWxzZSByZXR1cm4gZWxlLmRhdGEoJ2ZvbnQtc2l6ZScpXG5cdFx0XHRcdFx0dmFyIG9wdCA9IG9wdGlvbnMuYWRqdXN0Tm9kZUxhYmVsRm9udFNpemVBdXRvbWF0aWNhbGx5O1xuXHRcdFx0XHRcdHZhciBhZGp1c3QgPSB0eXBlb2Ygb3B0ID09PSAnZnVuY3Rpb24nID8gb3B0KCkgOiBvcHQ7XG5cblx0XHRcdFx0XHRpZiAoIWFkanVzdCAmJiBlbGUuZGF0YSgnZm9udC1zaXplJykgIT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlLmRhdGEoJ2ZvbnQtc2l6ZScpO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHJldHVybiBlbGVtZW50VXRpbGl0aWVzLmdldExhYmVsVGV4dFNpemUoZWxlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5zZWxlY3RvcihcIm5vZGVbY2xhc3NdW2ZvbnQtZmFtaWx5XVwiKVxuXHRcdFx0LnN0eWxlKHtcblx0XHRcdFx0J2ZvbnQtZmFtaWx5JzogZnVuY3Rpb24gKGVsZSkge1xuXHRcdFx0XHRcdHJldHVybiBlbGUuZGF0YSgnZm9udC1mYW1pbHknKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5zZWxlY3RvcihcIm5vZGVbY2xhc3NdW2ZvbnQtc3R5bGVdXCIpXG5cdFx0XHQuc3R5bGUoe1xuXHRcdFx0XHQnZm9udC1zdHlsZSc6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlLmRhdGEoJ2ZvbnQtc3R5bGUnKVxuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZVtjbGFzc11bZm9udC13ZWlnaHRdXCIpXG5cdFx0XHQuc3R5bGUoe1xuXHRcdFx0XHQnZm9udC13ZWlnaHQnOiBmdW5jdGlvbiAoZWxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZS5kYXRhKCdmb250LXdlaWdodCcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZVtjbGFzc11bY29sb3JdXCIpXG5cdFx0XHQuc3R5bGUoe1xuXHRcdFx0XHQnY29sb3InOiBmdW5jdGlvbiAoZWxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZS5kYXRhKCdjb2xvcicpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZVtjbGFzc11bYmFja2dyb3VuZC1jb2xvcl1cIilcblx0XHRcdC5zdHlsZSh7XG5cdFx0XHRcdCdiYWNrZ3JvdW5kLWNvbG9yJzogZnVuY3Rpb24gKGVsZSkge1xuXHRcdFx0XHRcdHJldHVybiBlbGUuZGF0YSgnYmFja2dyb3VuZC1jb2xvcicpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZVtjbGFzc11bYmFja2dyb3VuZC1vcGFjaXR5XVwiKVxuXHRcdFx0LnN0eWxlKHtcblx0XHRcdFx0J2JhY2tncm91bmQtb3BhY2l0eSc6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlLmRhdGEoJ2JhY2tncm91bmQtb3BhY2l0eScpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZVtjbGFzc11bYm9yZGVyLXdpZHRoXVwiKVxuXHRcdFx0LnN0eWxlKHtcblx0XHRcdFx0J2JvcmRlci13aWR0aCc6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlLmRhdGEoJ2JvcmRlci13aWR0aCcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZVtjbGFzc11bYm9yZGVyLWNvbG9yXVwiKVxuXHRcdFx0LnN0eWxlKHtcblx0XHRcdFx0J2JvcmRlci1jb2xvcic6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlLmRhdGEoJ2JvcmRlci1jb2xvcicpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZVtjbGFzc11bdGV4dC13cmFwXVwiKVxuXHRcdFx0LnN0eWxlKHtcblx0XHRcdFx0J3RleHQtd3JhcCc6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHR2YXIgb3B0ID0gb3B0aW9ucy5maXRMYWJlbHNUb05vZGVzO1xuXHRcdFx0XHRcdHZhciBpc0ZpdCA9IHR5cGVvZiBvcHQgPT09ICdmdW5jdGlvbicgPyBvcHQoKSA6IG9wdDtcblx0XHRcdFx0XHRpZiAoaXNGaXQpIHtcblx0XHRcdFx0XHRcdHJldHVybiAnZWxsaXBzaXMnO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gZWxlLmRhdGEoJ3RleHQtd3JhcCcpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZVwiKVxuXHRcdFx0LnN0eWxlKHtcblx0XHRcdFx0J3RleHQtbWF4LXdpZHRoJzogZnVuY3Rpb24gKGVsZSkge1xuXHRcdFx0XHRcdHZhciBvcHQgPSBvcHRpb25zLmZpdExhYmVsc1RvTm9kZXM7XG5cdFx0XHRcdFx0dmFyIGlzRml0ID0gdHlwZW9mIG9wdCA9PT0gJ2Z1bmN0aW9uJyA/IG9wdCgpIDogb3B0O1xuXHRcdFx0XHRcdGlmIChpc0ZpdCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIGVsZS53aWR0aCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gJzEwMDBweCc7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuc2VsZWN0b3IoXCJlZGdlW2NsYXNzXVtsaW5lLWNvbG9yXVwiKVxuXHRcdFx0LnN0eWxlKHtcblx0XHRcdFx0J2xpbmUtY29sb3InOiBmdW5jdGlvbiAoZWxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZS5kYXRhKCdsaW5lLWNvbG9yJyk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdzb3VyY2UtYXJyb3ctY29sb3InOiBmdW5jdGlvbiAoZWxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZS5kYXRhKCdsaW5lLWNvbG9yJyk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCd0YXJnZXQtYXJyb3ctY29sb3InOiBmdW5jdGlvbiAoZWxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZS5kYXRhKCdsaW5lLWNvbG9yJyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuc2VsZWN0b3IoXCJlZGdlW2NsYXNzXVt3aWR0aF1cIilcblx0XHRcdC5zdHlsZSh7XG5cdFx0XHRcdCd3aWR0aCc6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlLmRhdGEoJ3dpZHRoJyk7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuc2VsZWN0b3IoXCJub2RlW2NsYXNzPSdhc3NvY2lhdGlvbiddLFtjbGFzcz0nZGlzc29jaWF0aW9uJ10sW2NsYXNzPSdhbmQnXSxbY2xhc3M9J29yJ10sW2NsYXNzPSdub3QnXSxbY2xhc3M9J3Byb2Nlc3MnXSxbY2xhc3M9J29taXR0ZWQgcHJvY2VzcyddLFtjbGFzcz0ndW5jZXJ0YWluIHByb2Nlc3MnXSxbY2xhc3M9J3RydW5jYXRlZCBwcm9jZXNzJ10sW2NsYXNzPSd1bmtub3duIGxvZ2ljYWwgb3BlcmF0b3InXVwiKVxuXHRcdFx0LmNzcyh7XG5cdFx0XHRcdCdzaGFwZS1wb2x5Z29uLXBvaW50cyc6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHRpZiAoZ3JhcGhVdGlsaXRpZXMucG9ydHNFbmFibGVkID09PSB0cnVlICYmIGVsZS5kYXRhKCdwb3J0cycpLmxlbmd0aCA9PT0gMikge1xuXHRcdFx0XHRcdFx0Ly8gV2UgYXNzdW1lIHRoYXQgdGhlIHBvcnRzIG9mIHRoZSBlZGdlIGFyZSBzeW1ldHJpYyBhY2NvcmRpbmcgdG8gdGhlIG5vZGUgY2VudGVyIHNvIGp1c3QgY2hlY2tpbmcgb25lIHBvcnQgaXMgZW5vdWdoIGZvciB1c1xuXHRcdFx0XHRcdFx0dmFyIHBvcnQgPSBlbGUuZGF0YSgncG9ydHMnKVswXTtcblx0XHRcdFx0XHRcdC8vIElmIHRoZSBwb3J0cyBhcmUgbG9jYXRlZCBhYm92ZS9iZWxvdyBvZiB0aGUgbm9kZSB0aGVuIHRoZSBvcmllbnRhdGlvbiBpcyAndmVydGljYWwnIGVsc2UgaXQgaXMgJ2hvcml6b250YWwnXG5cdFx0XHRcdFx0XHR2YXIgb3JpZW50YXRpb24gPSBwb3J0LnggPT09IDAgPyAndmVydGljYWwnIDogJ2hvcml6b250YWwnO1xuXHRcdFx0XHRcdFx0Ly8gVGhlIGhhbGYgd2lkdGggb2YgdGhlIGFjdHVhbCBzaGFwZSBkaXNjbHVkaW5nIHRoZSBwb3J0c1xuXHRcdFx0XHRcdFx0dmFyIHNoYXBlSFcgPSBvcmllbnRhdGlvbiA9PT0gJ3ZlcnRpY2FsJyA/IDUwIC8gTWF0aC5hYnMocG9ydC55KSA6IDUwIC8gTWF0aC5hYnMocG9ydC54KTtcblx0XHRcdFx0XHRcdC8vIEdldCB0aGUgY2xhc3Mgb2YgdGhlIG5vZGVcblx0XHRcdFx0XHRcdHZhciBfY2xhc3MgPSBlbGUuZGF0YSgnY2xhc3MnKTtcblx0XHRcdFx0XHRcdC8vIElmIGNsYXNzIGlzIG9uZSBvZiBwcm9jZXNzLCBvbWl0dGVkIHByb2Nlc3Mgb3IgdW5jZXJ0YWluIHByb2Nlc3MgdGhlbiB0aGUgdHlwZSBvZiBhY3R1YWwgc2hhcGUgaXMgJ3JlY3RhbmdsZScgZWxzZSBpdCBpcyAnY2lyY2xlJ1xuXHRcdFx0XHRcdFx0dmFyIHR5cGUgPSBfY2xhc3MuZW5kc1dpdGgoJ3Byb2Nlc3MnKSA/ICdyZWN0YW5nbGUnIDogJ2NpcmNsZSc7XG5cblx0XHRcdFx0XHRcdC8vIEdlbmVyYXRlIGEgcG9seWdvbiBzdHJpbmcgd2l0aCBhYm92ZSBwYXJhbWV0ZXJzIGFuZCByZXR1cm4gaXRcblx0XHRcdFx0XHRcdHJldHVybiBnZW5lcmF0ZVNoYXBlV2l0aFBvcnRTdHJpbmcoMC4wMSwgc2hhcGVIVywgdHlwZSwgb3JpZW50YXRpb24pO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFRoaXMgZWxlbWVudCBpcyBub3QgZXhwZWN0ZWQgdG8gaGF2ZSBhIHBveWdvbmlhbCBzaGFwZSAoQmVjYXVzZSBpdCBkb2VzIG5vdCBoYXZlIDIgcG9ydHMpIGp1c3QgcmV0dXJuIGEgdHJpdmlhbCBzdHJpbmcgaGVyZSBub3QgdG8gaGF2ZSBhIHJ1biB0aW1lIGJ1Z1xuXHRcdFx0XHRcdHJldHVybiAnLTEgLTEgMSAxIDEgMCc7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuc2VsZWN0b3IoXCJub2RlW2NsYXNzPSdwZXJ0dXJiaW5nIGFnZW50J11cIilcblx0XHRcdC5jc3Moe1xuXHRcdFx0XHQnc2hhcGUtcG9seWdvbi1wb2ludHMnOiAnLTEsIC0xLCAgIC0wLjUsIDAsICAtMSwgMSwgICAxLCAxLCAgIDAuNSwgMCwgMSwgLTEnXG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZVtjbGFzcz0ndGFnJ11cIilcblx0XHRcdC5jc3Moe1xuXHRcdFx0XHQnc2hhcGUtcG9seWdvbi1wb2ludHMnOiAnLTEsIC0xLCAgIDAuMjUsIC0xLCAgIDEsIDAsICAgIDAuMjUsIDEsICAgIC0xLCAxJ1xuXHRcdFx0fSlcblx0XHRcdC5zZWxlY3RvcihcIm5vZGU6cGFyZW50W2NsYXNzXj0nY29tcGxleCddXCIpIC8vIHN0YXJ0IHdpdGggY29tcGxleFxuXHRcdFx0LmNzcyh7XG5cdFx0XHRcdCd0ZXh0LXZhbGlnbic6ICdib3R0b20nLFxuXHRcdFx0XHQndGV4dC1oYWxpZ24nOiAnY2VudGVyJyxcblx0XHRcdFx0J3RleHQtbWFyZ2luLXknOiBlbGVtZW50VXRpbGl0aWVzLmdldENvbXBsZXhNYXJnaW4sXG5cdFx0XHRcdCdwYWRkaW5nJzogZWxlbWVudFV0aWxpdGllcy5nZXRDb21wbGV4UGFkZGluZyxcblx0XHRcdFx0J2NvbXBvdW5kLXNpemluZy13cnQtbGFiZWxzJzogJ2V4Y2x1ZGUnLFxuXHRcdFx0fSlcblx0XHRcdC5zZWxlY3RvcihcIm5vZGVbY2xhc3M9J2NvbXBhcnRtZW50J11cIilcblx0XHRcdC5jc3Moe1xuXHRcdFx0XHQndGV4dC12YWxpZ24nOiAnYm90dG9tJyxcblx0XHRcdFx0J3RleHQtaGFsaWduJzogJ2NlbnRlcicsXG5cdFx0XHRcdCd0ZXh0LW1hcmdpbi15JzogLTEgKiBvcHRpb25zLmV4dHJhQ29tcGFydG1lbnRQYWRkaW5nLFxuXHRcdFx0XHQnY29tcG91bmQtc2l6aW5nLXdydC1sYWJlbHMnOiAnZXhjbHVkZScsXG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZTpwYXJlbnRbY2xhc3M9J2NvbXBhcnRtZW50J11cIilcblx0XHRcdC5jc3Moe1xuXHRcdFx0XHQncGFkZGluZyc6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gZ3JhcGhVdGlsaXRpZXMuZ2V0Q29tcG91bmRQYWRkaW5ncygpICsgb3B0aW9ucy5leHRyYUNvbXBhcnRtZW50UGFkZGluZztcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5zZWxlY3RvcihcIm5vZGVbY2xhc3M9J3N1Ym1hcCddXCIpXG5cdFx0XHQuY3NzKHtcblx0XHRcdFx0J3RleHQtdmFsaWduJzogJ2JvdHRvbScsXG5cdFx0XHRcdCd0ZXh0LWhhbGlnbic6ICdjZW50ZXInLFxuXHRcdFx0XHQndGV4dC1tYXJnaW4teSc6IC0xICogb3B0aW9ucy5leHRyYUNvbXBhcnRtZW50UGFkZGluZyxcblx0XHRcdFx0J2NvbXBvdW5kLXNpemluZy13cnQtbGFiZWxzJzogJ2V4Y2x1ZGUnLFxuXHRcdFx0fSlcblx0XHRcdC5zZWxlY3RvcihcIm5vZGU6cGFyZW50W2NsYXNzPSdzdWJtYXAnXSxbY2xhc3M9J3RvcG9sb2d5IGdyb3VwJ11cIilcblx0XHRcdC5jc3Moe1xuXHRcdFx0XHQncGFkZGluZyc6IGZ1bmN0aW9uICgpIHtcblx0XHRcdFx0XHRyZXR1cm4gZ3JhcGhVdGlsaXRpZXMuZ2V0Q29tcG91bmRQYWRkaW5ncygpICsgb3B0aW9ucy5leHRyYUNvbXBhcnRtZW50UGFkZGluZztcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5zZWxlY3RvcihcIm5vZGU6Y2hpbGRsZXNzW2Jib3hdXCIpXG5cdFx0XHQuY3NzKHtcblx0XHRcdFx0J3dpZHRoJzogJ2RhdGEoYmJveC53KScsXG5cdFx0XHRcdCdoZWlnaHQnOiAnZGF0YShiYm94LmgpJ1xuXHRcdFx0fSlcblx0XHRcdC5zZWxlY3RvcihcIm5vZGU6cGFyZW50W21pbkhlaWdodF1cIilcblx0XHRcdC5jc3Moe1xuXHRcdFx0XHQnbWluLWhlaWdodCc6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHRpZiAoZ3JhcGhVdGlsaXRpZXMuY29tcG91bmRTaXplc0NvbnNpZGVyZWQpIHtcblx0XHRcdFx0XHRcdHJldHVybiBlbGUuZGF0YSgnbWluSGVpZ2h0Jyk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIDA7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuc2VsZWN0b3IoXCJub2RlOnBhcmVudFttaW5IZWlnaHRCaWFzVG9wXVwiKVxuXHRcdFx0LmNzcyh7XG5cdFx0XHRcdCdtaW4taGVpZ2h0LWJpYXMtdG9wJzogZnVuY3Rpb24gKGVsZSkge1xuXHRcdFx0XHRcdHZhciBtaW4gPSBwYXJzZUZsb2F0KGVsZS5kYXRhKCdtaW5IZWlnaHRCaWFzVG9wJykpO1xuXHRcdFx0XHRcdHJldHVybiAobWluID49IDAgPyBtaW4gOiAxMDApICsgJyUnO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZTpwYXJlbnRbbWluSGVpZ2h0Qmlhc0JvdHRvbV1cIilcblx0XHRcdC5jc3Moe1xuXHRcdFx0XHQnbWluLWhlaWdodC1iaWFzLWJvdHRvbSc6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHR2YXIgbWluID0gcGFyc2VGbG9hdChlbGUuZGF0YSgnbWluSGVpZ2h0Qmlhc0JvdHRvbScpKTtcblx0XHRcdFx0XHRyZXR1cm4gKG1pbiA+PSAwID8gbWluIDogMTAwKSArICclJztcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5zZWxlY3RvcihcIm5vZGU6cGFyZW50W21pbldpZHRoXVwiKVxuXHRcdFx0LmNzcyh7XG5cdFx0XHRcdCdtaW4td2lkdGgnOiBmdW5jdGlvbiAoZWxlKSB7XG5cdFx0XHRcdFx0aWYgKGdyYXBoVXRpbGl0aWVzLmNvbXBvdW5kU2l6ZXNDb25zaWRlcmVkKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlLmRhdGEoJ21pbldpZHRoJyk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0cmV0dXJuIDA7XG5cdFx0XHRcdH1cblx0XHRcdH0pXG5cdFx0XHQuc2VsZWN0b3IoXCJub2RlOnBhcmVudFttaW5XaWR0aEJpYXNMZWZ0XVwiKVxuXHRcdFx0LmNzcyh7XG5cdFx0XHRcdCdtaW4td2lkdGgtYmlhcy1sZWZ0JzogZnVuY3Rpb24gKGVsZSkge1xuXHRcdFx0XHRcdHZhciBtaW4gPSBwYXJzZUZsb2F0KGVsZS5kYXRhKCdtaW5XaWR0aEJpYXNMZWZ0JykpO1xuXHRcdFx0XHRcdHJldHVybiAobWluID49IDAgPyBtaW4gOiAxMDApICsgJyUnO1xuXHRcdFx0XHR9XG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZTpwYXJlbnRbbWluV2lkdGhCaWFzUmlnaHRdXCIpXG5cdFx0XHQuY3NzKHtcblx0XHRcdFx0J21pbi13aWR0aC1iaWFzLXJpZ2h0JzogZnVuY3Rpb24gKGVsZSkge1xuXHRcdFx0XHRcdHZhciBtaW4gPSBwYXJzZUZsb2F0KGVsZS5kYXRhKCdtaW5XaWR0aEJpYXNSaWdodCcpKTtcblx0XHRcdFx0XHRyZXR1cm4gKG1pbiA+PSAwID8gbWluIDogMTAwKSArICclJztcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5zZWxlY3RvcihcIm5vZGUuY3ktZXhwYW5kLWNvbGxhcHNlLWNvbGxhcHNlZC1ub2RlXCIpXG5cdFx0XHQuY3NzKHtcblx0XHRcdFx0J2JvcmRlci1zdHlsZSc6ICdkYXNoZWQnXG5cdFx0XHR9KVxuXHRcdFx0Ly8gICAuc2VsZWN0b3IoXCJub2RlOnNlbGVjdGVkXCIpXG5cdFx0XHQvLyAgIC5jc3Moe1xuXHRcdFx0Ly8gICAgICdib3JkZXItY29sb3InOiBzZWxlY3Rpb25Db2xvcixcblx0XHRcdC8vICAgICAndGFyZ2V0LWFycm93LWNvbG9yJzogJyMwMDAnLFxuXHRcdFx0Ly8gXHQndGV4dC1vdXRsaW5lLWNvbG9yJzogJyMwMDAnLFxuXHRcdFx0Ly8gXHQnYm9yZGVyLXdpZHRoJzogZnVuY3Rpb24oZWxlKXtcblx0XHRcdC8vIFx0XHRyZXR1cm4gTWF0aC5tYXgocGFyc2VGbG9hdChlbGUuZGF0YSgnYm9yZGVyLXdpZHRoJykpICsgMiwgMyk7XG5cdFx0XHQvLyBcdCAgfVxuXHRcdFx0Ly8gICB9KVxuXHRcdFx0LnNlbGVjdG9yKFwibm9kZTphY3RpdmVcIilcblx0XHRcdC5jc3Moe1xuXHRcdFx0XHQnYmFja2dyb3VuZC1vcGFjaXR5JzogMC43LCAnb3ZlcmxheS1jb2xvcic6IHNlbGVjdGlvbkNvbG9yLFxuXHRcdFx0XHQnb3ZlcmxheS1wYWRkaW5nJzogJzE0J1xuXHRcdFx0fSlcblx0XHRcdC5zZWxlY3RvcihcImVkZ2VcIilcblx0XHRcdC5jc3Moe1xuXHRcdFx0XHQnY3VydmUtc3R5bGUnOiAnYmV6aWVyJyxcblx0XHRcdFx0J3RhcmdldC1hcnJvdy1maWxsJzogZnVuY3Rpb24gKGVsZSkge1xuXHRcdFx0XHRcdHJldHVybiBlbGVtZW50VXRpbGl0aWVzLmdldEN5VGFyZ2V0QXJyb3dGaWxsKGVsZSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdzb3VyY2UtYXJyb3ctZmlsbCc6ICdob2xsb3cnLFxuXHRcdFx0XHQndGV4dC1ib3JkZXItY29sb3InOiBmdW5jdGlvbiAoZWxlKSB7XG5cdFx0XHRcdFx0aWYgKGVsZS5zZWxlY3RlZCgpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gc2VsZWN0aW9uQ29sb3I7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiBlbGUuY3NzKCdsaW5lLWNvbG9yJyk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdjb2xvcic6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHRpZiAoZWxlLnNlbGVjdGVkKCkpIHtcblx0XHRcdFx0XHRcdHJldHVybiBzZWxlY3Rpb25Db2xvcjtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIGVsZS5jc3MoJ2xpbmUtY29sb3InKTtcblx0XHRcdFx0fSxcblx0XHRcdFx0J2Fycm93LXNjYWxlJzogMS4yNVxuXHRcdFx0fSlcblx0XHRcdC5zZWxlY3RvcihcImVkZ2UuY3ktZXhwYW5kLWNvbGxhcHNlLW1ldGEtZWRnZVwiKVxuXHRcdFx0LmNzcyh7XG5cdFx0XHRcdCdsaW5lLWNvbG9yJzogJyNDNEM0QzQnLFxuXHRcdFx0XHQnc291cmNlLWFycm93LWNvbG9yJzogJyNDNEM0QzQnLFxuXHRcdFx0XHQndGFyZ2V0LWFycm93LWNvbG9yJzogJyNDNEM0QzQnXG5cdFx0XHR9KVxuXHRcdFx0Ly8gICAuc2VsZWN0b3IoXCJlZGdlOnNlbGVjdGVkXCIpXG5cdFx0XHQvLyAgIC5jc3Moe1xuXHRcdFx0Ly8gICAgICdsaW5lLWNvbG9yJzogc2VsZWN0aW9uQ29sb3IsXG5cdFx0XHQvLyAgICAgJ3NvdXJjZS1hcnJvdy1jb2xvcic6IHNlbGVjdGlvbkNvbG9yLFxuXHRcdFx0Ly8gXHQndGFyZ2V0LWFycm93LWNvbG9yJzogc2VsZWN0aW9uQ29sb3IsXG5cdFx0XHQvLyBcdCd3aWR0aCc6IGZ1bmN0aW9uKGVsZSl7XG5cdFx0XHQvLyBcdFx0cmV0dXJuIE1hdGgubWF4KHBhcnNlRmxvYXQoZWxlLmRhdGEoJ3dpZHRoJykpICsgMiwgMyk7XG5cdFx0XHQvLyBcdCAgfVxuXHRcdFx0Ly8gICB9KVxuXHRcdFx0LnNlbGVjdG9yKFwiZWRnZTphY3RpdmVcIilcblx0XHRcdC5jc3Moe1xuXHRcdFx0XHQnYmFja2dyb3VuZC1vcGFjaXR5JzogMC43LCAnb3ZlcmxheS1jb2xvcic6IHNlbGVjdGlvbkNvbG9yLFxuXHRcdFx0XHQnb3ZlcmxheS1wYWRkaW5nJzogJzgnXG5cdFx0XHR9KVxuXHRcdFx0LnNlbGVjdG9yKFwiZWRnZVtjYXJkaW5hbGl0eSA+IDBdXCIpXG5cdFx0XHQuY3NzKHtcblx0XHRcdFx0J3RleHQtcm90YXRpb24nOiAnYXV0b3JvdGF0ZScsXG5cdFx0XHRcdCd0ZXh0LWJhY2tncm91bmQtc2hhcGUnOiAncmVjdGFuZ2xlJyxcblx0XHRcdFx0J3RleHQtYm9yZGVyLW9wYWNpdHknOiAnMScsXG5cdFx0XHRcdCd0ZXh0LWJvcmRlci13aWR0aCc6ICcxJyxcblx0XHRcdFx0J3RleHQtYmFja2dyb3VuZC1jb2xvcic6ICd3aGl0ZScsXG5cdFx0XHRcdCd0ZXh0LWJhY2tncm91bmQtb3BhY2l0eSc6ICcxJ1xuXHRcdFx0fSlcblx0XHRcdC5zZWxlY3RvcihcImVkZ2VbY2xhc3M9J2NvbnN1bXB0aW9uJ11bY2FyZGluYWxpdHkgPiAwXVwiKVxuXHRcdFx0LmNzcyh7XG5cdFx0XHRcdCdzb3VyY2UtbGFiZWwnOiBmdW5jdGlvbiAoZWxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuICcnICsgZWxlLmRhdGEoJ2NhcmRpbmFsaXR5Jyk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdzb3VyY2UtdGV4dC1tYXJnaW4teSc6ICctMTAnLFxuXHRcdFx0XHQnc291cmNlLXRleHQtb2Zmc2V0JzogJzE4Jyxcblx0XHRcdFx0J2ZvbnQtc2l6ZSc6ICcxMydcblx0XHRcdH0pXG5cdFx0XHQuc2VsZWN0b3IoXCJlZGdlW2NsYXNzPSdwcm9kdWN0aW9uJ11bY2FyZGluYWxpdHkgPiAwXVwiKVxuXHRcdFx0LmNzcyh7XG5cdFx0XHRcdCd0YXJnZXQtbGFiZWwnOiBmdW5jdGlvbiAoZWxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuICcnICsgZWxlLmRhdGEoJ2NhcmRpbmFsaXR5Jyk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCd0YXJnZXQtdGV4dC1tYXJnaW4teSc6ICctMTAnLFxuXHRcdFx0XHQndGFyZ2V0LXRleHQtb2Zmc2V0JzogJzE4Jyxcblx0XHRcdFx0J2ZvbnQtc2l6ZSc6ICcxMydcblx0XHRcdH0pXG5cdFx0XHQuc2VsZWN0b3IoXCJlZGdlW2NsYXNzXVwiKVxuXHRcdFx0LmNzcyh7XG5cdFx0XHRcdCd0YXJnZXQtYXJyb3ctc2hhcGUnOiBmdW5jdGlvbiAoZWxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZW1lbnRVdGlsaXRpZXMuZ2V0Q3lBcnJvd1NoYXBlKGVsZSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdzb3VyY2UtYXJyb3ctc2hhcGUnOiAnbm9uZScsXG5cdFx0XHRcdCdzb3VyY2UtZW5kcG9pbnQnOiBmdW5jdGlvbiAoZWxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZW1lbnRVdGlsaXRpZXMuZ2V0RW5kUG9pbnQoZWxlLCAnc291cmNlJyk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCd0YXJnZXQtZW5kcG9pbnQnOiBmdW5jdGlvbiAoZWxlKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGVsZW1lbnRVdGlsaXRpZXMuZ2V0RW5kUG9pbnQoZWxlLCAndGFyZ2V0Jyk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdsaW5lLXN0eWxlJzogZnVuY3Rpb24gKGVsZSkge1xuXHRcdFx0XHRcdHJldHVybiBlbGVtZW50VXRpbGl0aWVzLmdldEFycmF5TGluZVN0eWxlKGVsZSk7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdCdsaW5lLWRhc2gtcGF0dGVybic6IGZ1bmN0aW9uIChlbGUpIHtcblx0XHRcdFx0XHRyZXR1cm4gZWxlbWVudFV0aWxpdGllcy5nZXRBcnJheUxpbmVEYXNoU3R5bGUoZWxlKTtcblx0XHRcdFx0fVxuXHRcdFx0fSlcblx0XHRcdC5zZWxlY3RvcihcImNvcmVcIilcblx0XHRcdC5jc3Moe1xuXHRcdFx0XHQnc2VsZWN0aW9uLWJveC1jb2xvcic6IHNlbGVjdGlvbkNvbG9yLFxuXHRcdFx0XHQnc2VsZWN0aW9uLWJveC1vcGFjaXR5JzogJzAuMicsICdzZWxlY3Rpb24tYm94LWJvcmRlci1jb2xvcic6IHNlbGVjdGlvbkNvbG9yXG5cdFx0XHR9KTtcblxuXHRcdHZhciBzYmduTmV0d29ya0NvbnRhaW5lciA9ICQob3B0aW9ucy5uZXR3b3JrQ29udGFpbmVyU2VsZWN0b3IpO1xuXG5cdFx0Ly8gY3JlYXRlIGFuZCBpbml0IGN5dG9zY2FwZTpcblx0XHRjeXRvc2NhcGUoe1xuXHRcdFx0Y29udGFpbmVyOiBzYmduTmV0d29ya0NvbnRhaW5lcixcblx0XHRcdHN0eWxlOiBzYmduU3R5bGVTaGVldCxcblx0XHRcdHNob3dPdmVybGF5OiBmYWxzZSwgbWluWm9vbTogMC4xMjUsIG1heFpvb206IDE2LFxuXHRcdFx0Ym94U2VsZWN0aW9uRW5hYmxlZDogdHJ1ZSxcblx0XHRcdG1vdGlvbkJsdXI6IHRydWUsXG5cdFx0XHR3aGVlbFNlbnNpdGl2aXR5OiAwLjEsXG5cdFx0XHRyZWFkeTogZnVuY3Rpb24gKCkge1xuXHRcdFx0XHRjeSA9IHRoaXM7XG5cdFx0XHRcdC8vIElmIHVuZG9hYmxlIHJlZ2lzdGVyIHVuZG8vcmVkbyBhY3Rpb25zXG5cdFx0XHRcdGlmIChvcHRpb25zLnVuZG9hYmxlKSB7XG5cdFx0XHRcdFx0cmVnaXN0ZXJVbmRvUmVkb0FjdGlvbnMoKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRiaW5kQ3lFdmVudHMoKTtcblx0XHRcdH1cblx0XHR9KTtcblx0fTtcblxuXHRzYmduQ3lJbnN0YW5jZS5nZXRDeSA9IGZ1bmN0aW9uICgpIHtcblx0XHRyZXR1cm4gY3k7XG5cdH07XG5cblx0cmV0dXJuIHNiZ25DeUluc3RhbmNlO1xufTtcbiJdLCJuYW1lcyI6WyJjbGFzc2VzIiwicmVxdWlyZSIsImxpYnMiLCJnZXRMaWJzIiwialF1ZXJ5IiwiJCIsImN5dG9zY2FwZSIsIlRpcHB5IiwidGlwcHkiLCJtb2R1bGUiLCJleHBvcnRzIiwiZWxlbWVudFV0aWxpdGllcyIsImdyYXBoVXRpbGl0aWVzIiwibWFpblV0aWxpdGllcyIsInVuZG9SZWRvQWN0aW9uRnVuY3Rpb25zIiwib3B0aW9uVXRpbGl0aWVzIiwiZXhwZXJpbWVudGFsRGF0YU92ZXJsYXkiLCJyZWZyZXNoUGFkZGluZ3MiLCJvcHRpb25zIiwiY3kiLCJzYmduQ3lJbnN0YW5jZSIsInBhcmFtIiwiYmluZCIsImdldE9wdGlvbnMiLCJnZXRQb2ludE9uQ2lyY2xlIiwiY2VudGVyWCIsImNlbnRlclkiLCJyYWRpdXMiLCJhbmdsZUluRGVncmVlIiwiYW5nbGVJblJhZGlhbiIsIk1hdGgiLCJQSSIsIngiLCJjb3MiLCJ5Iiwic2luIiwiZ2VuZXJhdGVDaXJjbGVTdHJpbmciLCJhbmdsZUZyb20iLCJhbmdsZVRvIiwibnVtT2ZQb2ludHMiLCJjaXJjbGVTdHIiLCJzdGVwU2l6ZSIsImN1cnJlbnRBbmdsZSIsImkiLCJwb2ludCIsImdlbmVyYXRlU2hhcGVXaXRoUG9ydFN0cmluZyIsImxpbmVIVyIsInNoYXBlSFciLCJ0eXBlIiwib3JpZW50YXRpb24iLCJwb2x5Z29uU3RyIiwiYWJvdmVQb2ludHMiLCJiZWxvd1BvaW50cyIsImxlZnRQb2ludHMiLCJyaWdodFBvaW50cyIsInJlZ2lzdGVyVW5kb1JlZG9BY3Rpb25zIiwidXIiLCJ1bmRvUmVkbyIsImFjdGlvbiIsImRlbGV0ZUVsZXNTaW1wbGUiLCJyZXN0b3JlRWxlcyIsImRlbGV0ZU5vZGVzU21hcnQiLCJzZXRQb3J0c09yZGVyaW5nIiwicmVtb3ZlQWxsIiwicmVzdG9yZUFsbCIsImhpZGVFeHAiLCJ1bmhpZGVFeHAiLCJoaWRlRmlsZSIsImhpZGVGaWxlVW5kbyIsInVuaGlkZUZpbGUiLCJ1bmhpZGVGaWxlVW5kbyIsInJlbW92ZUV4cCIsImFkZEV4cCIsInJlbW92ZUZpbGUiLCJhZGRGaWxlIiwiZXhwQnV0dG9uQ2hhbmdlIiwiZmlsZUJ1dHRvbkNoYW5nZUhpZGUiLCJmaWxlQnV0dG9uQ2hhbmdlVW5IaWRlIiwic2hvd1Rvb2x0aXAiLCJldmVudCIsIm5vZGUiLCJ0YXJnZXQiLCJjeVRhcmdldCIsImNhbkhhdmVUb29sdGlwIiwiaXNTSUZOb2RlIiwiZGF0YSIsInJlZiIsInBvcyIsInBvc2l0aW9uIiwiY3lQb3NpdGlvbiIsInBhbiIsInpvb20iLCJpbmZvYm94IiwiQXV4aWxpYXJ5VW5pdCIsImNoZWNrUG9pbnQiLCJ0b29sdGlwQ29udGVudCIsInVuZGVmaW5lZCIsInBvcHBlclJlZiIsIm1vZGVsUG9zIiwiZ2V0QWJzb2x1dGVDb29yZCIsIm1vZGVsVyIsImJib3giLCJ3IiwibW9kZWxIIiwiaCIsInJlbmRlcmVkVyIsInJlbmRlcmVkSCIsInJlbmRlcmVkUG9zIiwiY29udmVydFRvUmVuZGVyZWRQb3NpdGlvbiIsInJlbmRlcmVkRGltcyIsInJlbmRlcmVkUG9zaXRpb24iLCJyZW5kZXJlZERpbWVuc2lvbnMiLCJwbGFjZW1lbnQiLCJhbmNob3JTaWRlIiwiZGVzdHJveVRpcHB5Iiwib25lIiwiY29udGVudCIsImRvY3VtZW50IiwiY3JlYXRlRWxlbWVudCIsInN0eWxlIiwiaW5uZXJIVE1MIiwidHJpZ2dlciIsImhpZGVPbkNsaWNrIiwiYXJyb3ciLCJvbkhpZGRlbiIsIm9mZiIsImRlc3Ryb3kiLCJvbiIsInNldFRpbWVvdXQiLCJzaG93IiwiYmluZEN5RXZlbnRzIiwid2FpdER1cmF0aW9uIiwibm9kZVRhcGRyYWdvdXQiLCJjdXJyRXZlbnQiLCJpblF1ZXVlIiwiY2xlYXJOb2RlRXZlbnQiLCJub2RlVGFwZHJhZyIsImdldFNob3dUb29sdGlwQXN5Y24iLCJzaG93VG9vbHRpcEFzeWNuIiwiZSIsImNsZWFyVGltZW91dCIsInVwZGF0ZSIsIl9wcml2YXRlIiwic3RhcnRzV2l0aCIsImluZm9MYWJlbCIsImdldEluZm9MYWJlbCIsInN0YXJ0QmF0Y2giLCJlbmRCYXRjaCIsInJlbW92ZURhdGEiLCJub2RlcyIsInVwZGF0ZUNvbXBvdW5kQm91bmRzIiwicmVjYWxjdWxhdGVPbkNvbXBsZXhpdHlNYW5hZ2VtZW50IiwicmVtb3ZlU3R5bGUiLCJuYW1lIiwiYXJncyIsImxlbmd0aCIsInBhcmVudHMiLCJlbGVtZW50cyIsImpzb25zIiwic2ltcGxlcyIsIm5vdCIsImFsbEVsZW1lbnRzIiwiY29uY2F0IiwicG9ydHMiLCJmb3JFYWNoIiwiY2FuSGF2ZVBvcnRzIiwiaWQiLCJKU09OIiwicGFyc2UiLCJzdHJpbmdpZnkiLCJ2aWV3cG9ydCIsImJlZm9yZVBlcmZvcm1MYXlvdXQiLCJhbGxFbGVtZW50czIiLCJwb3J0czIiLCJ2aWV3cG9ydDIiLCJyZXMiLCJqc29uIiwiZmxhdEVsZXMiLCJiYXRjaCIsImxheW91dCIsInBvcnRzRW5hYmxlZCIsImVkZ2VzIiwiY2hhbmdlUG9ydHNPcmllbnRhdGlvbkFmdGVyTGF5b3V0IiwiX2N5IiwiaXNMYXlvdXRSZXF1aXJlZCIsImNhbGxiYWNrIiwic2V0Q29tcG91bmRJbmZvYm94ZXMiLCJjeUluc3RhbmNlIiwiaW5mb2JveENhbGN1bGF0ZWQiLCJpc1BhcmVudCIsImNoaWxkcmVuIiwiY2hpbGROb2RlIiwiY29ycmVjdEluZm9Cb3hDb29yZCIsInN0YXRlc2FuZGluZm9zIiwiaW5mb0JveE9uTm9kZSIsInNldEFuY2hvclNpZGUiLCJjb3JkUmVzdWx0IiwiY29udmVydFRvUmVsYXRpdmVDb29yZCIsImlzRGlzcGxheWVkIiwibG9jYXRpb24iLCJsYXlvdXRzIiwiQXV4VW5pdExheW91dCIsImNvbnN0cnVjdCIsImFkZEF1eFVuaXQiLCJzZWxlY3ROZXh0QXZhaWxhYmxlIiwibG9jYXRpb25zIiwiY2hlY2tGaXQiLCJmaXRVbml0cyIsInNlbGVjdGlvbkNvbG9yIiwic2JnblN0eWxlU2hlZXQiLCJzdHlsZXNoZWV0Iiwic2VsZWN0b3IiLCJjc3MiLCJzaGFwZSIsImVsZSIsImdldEN5U2hhcGUiLCJnZXRFbGVtZW50Q29udGVudCIsImZvbnRTaXplIiwib3B0IiwiYWRqdXN0Tm9kZUxhYmVsRm9udFNpemVBdXRvbWF0aWNhbGx5IiwiYWRqdXN0IiwiZ2V0TGFiZWxUZXh0U2l6ZSIsImZvbnRGYW1pbHkiLCJmb250U3R5bGUiLCJmb250V2VpZ2h0IiwiY29sb3IiLCJiYWNrZ3JvdW5kQ29sb3IiLCJiYWNrZ3JvdW5kT3BhY2l0eSIsImJvcmRlcldpZHRoIiwiYm9yZGVyQ29sb3IiLCJ0ZXh0V3JhcCIsImZpdExhYmVsc1RvTm9kZXMiLCJpc0ZpdCIsInRleHRNYXhXaWR0aCIsIndpZHRoIiwibGluZUNvbG9yIiwic291cmNlQXJyb3dDb2xvciIsInRhcmdldEFycm93Q29sb3IiLCJzaGFwZVBvbHlnb25Qb2ludHMiLCJwb3J0IiwiYWJzIiwiX2NsYXNzIiwiZW5kc1dpdGgiLCJnZXRDb21wbGV4TWFyZ2luIiwiZ2V0Q29tcGxleFBhZGRpbmciLCJleHRyYUNvbXBhcnRtZW50UGFkZGluZyIsInBhZGRpbmciLCJnZXRDb21wb3VuZFBhZGRpbmdzIiwibWluSGVpZ2h0IiwiY29tcG91bmRTaXplc0NvbnNpZGVyZWQiLCJtaW5IZWlnaHRCaWFzVG9wIiwibWluIiwicGFyc2VGbG9hdCIsIm1pbkhlaWdodEJpYXNCb3R0b20iLCJtaW5XaWR0aCIsIm1pbldpZHRoQmlhc0xlZnQiLCJtaW5XaWR0aEJpYXNSaWdodCIsInRhcmdldEFycm93RmlsbCIsImdldEN5VGFyZ2V0QXJyb3dGaWxsIiwidGV4dEJvcmRlckNvbG9yIiwic2VsZWN0ZWQiLCJzb3VyY2VMYWJlbCIsInRhcmdldExhYmVsIiwidGFyZ2V0QXJyb3dTaGFwZSIsImdldEN5QXJyb3dTaGFwZSIsInNvdXJjZUVuZHBvaW50IiwiZ2V0RW5kUG9pbnQiLCJ0YXJnZXRFbmRwb2ludCIsImxpbmVTdHlsZSIsImdldEFycmF5TGluZVN0eWxlIiwibGluZURhc2hQYXR0ZXJuIiwiZ2V0QXJyYXlMaW5lRGFzaFN0eWxlIiwic2Jnbk5ldHdvcmtDb250YWluZXIiLCJuZXR3b3JrQ29udGFpbmVyU2VsZWN0b3IiLCJjb250YWluZXIiLCJzaG93T3ZlcmxheSIsIm1pblpvb20iLCJtYXhab29tIiwiYm94U2VsZWN0aW9uRW5hYmxlZCIsIm1vdGlvbkJsdXIiLCJ3aGVlbFNlbnNpdGl2aXR5IiwicmVhZHkiLCJ1bmRvYWJsZSIsImdldEN5Il0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/sbgn-extensions/sbgn-cy-instance-factory.js\n"); /***/ }), @@ -45,7 +45,7 @@ eval("var classes = __webpack_require__(/*! ../utilities/classes */ \"./src/util \*************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { -eval("/*\n * Render sbgn specific shapes which are not supported by cytoscape.js core\n */\n\nvar libs = (__webpack_require__(/*! ../utilities/lib-utilities */ \"./src/utilities/lib-utilities.js\").getLibs)();\nvar jQuery = $ = libs.jQuery;\nvar cytoscape = libs.cytoscape;\nvar cyMath = math = cytoscape.math;\nvar cyBaseNodeShapes = cytoscape.baseNodeShapes;\nvar cyStyleProperties = cytoscape.styleProperties;\nvar classes = __webpack_require__(/*! ../utilities/classes */ \"./src/utilities/classes.js\");\nmodule.exports = function () {\n var $$ = cytoscape;\n\n /*\n * Taken from cytoscape.js and modified so that it can be utilized from sbgnviz\n * in a flexable way. It is needed because the sbgnviz shapes would need to stroke\n * border more than once as they would have infoboxes, multimers etc.\n * Extends the style properties of node with the given ones then strokes the border.\n * Would needed to be slightly updated during cytoscape upgrades if related function in\n * Cytoscape.js is updated. Information about where is the related function is located\n * can be found in the file that list the changes done in ivis cytoscape fork.\n */\n $$.sbgn.drawBorder = function (_ref) {\n var context = _ref.context,\n node = _ref.node,\n borderWidth = _ref.borderWidth,\n borderColor = _ref.borderColor,\n borderStyle = _ref.borderStyle,\n borderOpacity = _ref.borderOpacity;\n borderWidth = borderWidth || node && parseFloat(node.css('border-width'));\n if (borderWidth > 0) {\n var parentOpacity = node && node.effectiveOpacity() || 1;\n borderStyle = borderStyle || node && node.css('border-style');\n borderColor = borderColor || node && node.css('border-color');\n borderOpacity = (borderOpacity || node && node.css('border-opacity')) * parentOpacity;\n var propsToRestore = ['lineWidth', 'lineCap', 'strokeStyle', 'globalAlpha'];\n var initialProps = {};\n propsToRestore.forEach(function (propName) {\n initialProps[propName] = context[propName];\n });\n context.lineWidth = borderWidth;\n context.lineCap = 'butt';\n context.strokeStyle = borderColor;\n context.globalAlpha = borderOpacity;\n if (context.setLineDash) {\n // for very outofdate browsers\n switch (borderStyle) {\n case 'dotted':\n context.setLineDash([1, 1]);\n break;\n case 'dashed':\n context.setLineDash([4, 2]);\n break;\n case 'solid':\n case 'double':\n context.setLineDash([]);\n break;\n }\n }\n context.stroke();\n if (borderStyle === 'double') {\n context.lineWidth = borderWidth / 3;\n var gco = context.globalCompositeOperation;\n context.globalCompositeOperation = 'destination-out';\n context.stroke();\n context.globalCompositeOperation = gco;\n }\n\n // reset in case we changed the border style\n if (context.setLineDash) {\n // for very outofdate browsers\n context.setLineDash([]);\n }\n propsToRestore.forEach(function (propName) {\n context[propName] = initialProps[propName];\n });\n }\n };\n\n // Taken from cytoscape.js and modified\n var drawRoundRectanglePath = $$.sbgn.drawRoundRectanglePath = function (context, x, y, width, height, radius) {\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n var cornerRadius = radius || cyMath.getRoundRectangleRadius(width, height);\n if (context.beginPath) {\n context.beginPath();\n }\n\n // Start at top middle\n context.moveTo(x, y - halfHeight);\n // Arc from middle top to right side\n context.arcTo(x + halfWidth, y - halfHeight, x + halfWidth, y, cornerRadius);\n // Arc from right side to bottom\n context.arcTo(x + halfWidth, y + halfHeight, x, y + halfHeight, cornerRadius);\n // Arc from bottom to left side\n context.arcTo(x - halfWidth, y + halfHeight, x - halfWidth, y, cornerRadius);\n // Arc from left side to topBorder\n context.arcTo(x - halfWidth, y - halfHeight, x, y - halfHeight, cornerRadius);\n // Join line\n context.lineTo(x, y - halfHeight);\n context.closePath();\n\n //context.clearRect(0, 0, width, height);\n //context.beginPath()\n };\n var drawProteinPath = $$.sbgn.drawProtein = function (context, x, y, width, height, activePadding1) {\n var halfWidth = (width + activePadding1) / 2;\n var halfHeight = (height + activePadding1) / 2;\n var cornerRadius = cyMath.getRoundRectangleRadius(width, height);\n if (context.beginPath) {\n context.beginPath();\n }\n\n // Start at top middle\n context.moveTo(x, y - halfHeight);\n // Arc from middle top to right side\n context.arcTo(x + halfWidth, y - halfHeight, x + halfWidth, y, cornerRadius);\n // Arc from right side to bottom\n context.arcTo(x + halfWidth, y + halfHeight, x, y + halfHeight, cornerRadius);\n // Arc from bottom to left side\n context.arcTo(x - halfWidth, y + halfHeight, x - halfWidth, y, cornerRadius);\n // Arc from left side to topBorder\n context.arcTo(x - halfWidth, y - halfHeight, x, y - halfHeight, cornerRadius);\n // Join line\n context.lineTo(x, y - halfHeight);\n context.closePath();\n\n //context.clearRect(0, 0, width, height);\n //context.beginPath()\n };\n var drawReceptorPath = $$.sbgn.drawReceptor = function (context, x, y, width, height, activePadding1) {\n var halfPadding = activePadding1 ? activePadding1 / 2 : 0;\n //var points= [-1, -1, 0, -0.5, 1, -1, 1, 0.5, 0, 1, -1, 0.5 ];\n var halfW = width / 2;\n var halfH = height / 2;\n if (context.beginPath) {\n context.beginPath();\n }\n context.moveTo(x + halfW * -1 - halfPadding, y + halfH * -1 - 3 * halfPadding / 2);\n context.lineTo(x + halfW * 0, y + halfH * -0.5 - 3 * halfPadding / 2);\n context.lineTo(x + halfW * 1 + halfPadding, y + halfH * -1 - 3 * halfPadding / 2);\n context.lineTo(x + halfW * 1 + halfPadding, y + halfH * 0.5 + halfPadding);\n context.lineTo(x + halfW * 0, y + halfH * 1 + 3 * halfPadding / 2);\n context.lineTo(x + halfW * -1 - halfPadding, y + halfH * 0.5 + halfPadding);\n context.closePath();\n };\n var drawRoundedDrugPath = $$.sbgn.drawRoundedDrug = function (context, x, y, width, height, radius) {\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n var cornerRadius = Math.min(halfWidth, halfHeight);\n context.beginPath();\n\n // Start at top middle\n context.moveTo(x, y - halfHeight);\n // Arc from middle top to right side\n context.arcTo(x + halfWidth, y - halfHeight, x + halfWidth, y, cornerRadius);\n // Arc from right side to bottom\n context.arcTo(x + halfWidth, y + halfHeight, x, y + halfHeight, cornerRadius);\n // Arc from bottom to left side\n context.arcTo(x - halfWidth, y + halfHeight, x - halfWidth, y, cornerRadius);\n // Arc from left side to topBorder\n context.arcTo(x - halfWidth, y - halfHeight, x, y - halfHeight, cornerRadius);\n // Join line\n context.lineTo(x, y - halfHeight);\n var halfWidthInner = width / 2 - 5;\n var halfHeightInner = height / 2 - 5;\n var cornerRadius = Math.min(halfWidthInner, halfHeightInner);\n\n // Start at top middle\n context.moveTo(x, y - halfHeightInner);\n // Arc from middle top to right side\n context.arcTo(x + halfWidthInner, y - halfHeightInner, x + halfWidthInner, y, cornerRadius);\n // Arc from right side to bottom\n context.arcTo(x + halfWidthInner, y + halfHeightInner, x, y + halfHeightInner, cornerRadius);\n // Arc from bottom to left side\n context.arcTo(x - halfWidthInner, y + halfHeightInner, x - halfWidthInner, y, cornerRadius);\n // Arc from left side to topBorder\n context.arcTo(x - halfWidthInner, y - halfHeightInner, x, y - halfHeightInner, cornerRadius);\n // Join line\n context.lineTo(x, y - halfHeightInner);\n context.closePath();\n };\n\n // Taken from cytoscape.js\n var drawPolygonPath = function drawPolygonPath(context, x, y, width, height, points) {\n var halfW = width / 2;\n var halfH = height / 2;\n if (context.beginPath) {\n context.beginPath();\n }\n context.moveTo(x + halfW * points[0], y + halfH * points[1]);\n for (var i = 1; i < points.length / 2; i++) {\n context.lineTo(x + halfW * points[i * 2], y + halfH * points[i * 2 + 1]);\n }\n context.closePath();\n };\n var sbgnShapes = $$.sbgn.sbgnShapes = {\n 'empty set': true,\n 'nucleic acid feature': true,\n 'complex': true,\n 'macromolecule': true,\n 'simple chemical': true,\n 'biological activity': true,\n 'compartment': true,\n 'gene': true,\n 'rna': true,\n 'simple molecule': true,\n 'unknown molecule': true,\n 'drug': true,\n 'truncated protein': true,\n 'ion channel': true,\n 'receptor': true,\n 'ion': true,\n 'phenotype sbml': true,\n 'complex sbml': true,\n 'protein': true,\n 'degradation': true\n };\n var totallyOverridenNodeShapes = $$.sbgn.totallyOverridenNodeShapes = {\n 'macromolecule': true,\n 'nucleic acid feature': true,\n 'simple chemical': true,\n 'complex': true,\n 'biological activity': true,\n 'compartment': true,\n 'protein': true,\n 'gene': true,\n 'rna': true,\n 'receptor': true,\n 'ion channel': true,\n 'truncated protein': true,\n 'phenotype sbml': true,\n 'ion': true,\n 'simple molecule': true,\n 'unknown molecule': true,\n 'drug': true,\n 'complex sbml': true\n };\n var canHaveInfoBoxShapes = $$.sbgn.canHaveInfoBoxShapes = {\n 'simple chemical': true,\n 'macromolecule': true,\n 'nucleic acid feature': true,\n 'complex': true,\n 'biological activity': true,\n 'compartment': true,\n 'protein': true,\n 'receptor': true,\n 'truncated protein': true,\n 'ion channel': true,\n 'complex sbml': true,\n 'gene': true,\n 'rna': true,\n 'simple molecule': true,\n 'unknown molecule': true,\n 'phenotype sbml': true,\n 'drug': true,\n 'ion': true,\n 'degradation': true\n };\n var canBeMultimerShapes = $$.sbgn.canBeMultimerShapes = {\n 'macromolecule': true,\n 'complex': true,\n 'nucleic acid feature': true,\n 'simple chemical': true,\n 'receptor': true,\n 'ion channel': true,\n 'truncated protein': true,\n 'gene': true,\n 'rna': true,\n 'phenotype': true,\n 'ion': true,\n 'simple molecule': true,\n 'unknown molecule': true,\n 'drug': true,\n 'phenotype sbml': true,\n 'complex sbml': true,\n 'protein': true\n };\n var canBeActiveShapes = $$.sbgn.canBeActiveShapes = {\n 'protein': true,\n 'complex sbml': true,\n 'receptor': true,\n 'ion channel': true,\n 'truncated protein': true\n };\n var canBeHypotheticalShapes = $$.sbgn.canBeHypotheticalShapes = {\n 'protein': true,\n 'complex sbml': true,\n 'receptor': true,\n 'ion channel': true,\n 'truncated protein': true,\n 'gene': true,\n 'rna': true,\n 'phenotype sbml': true,\n 'ion': true,\n 'simple molecule': true,\n 'unknown molecule': true,\n 'drug': true,\n 'degradation': true\n };\n cyMath.calculateDistance = function (point1, point2) {\n var distance = Math.pow(point1[0] - point2[0], 2) + Math.pow(point1[1] - point2[1], 2);\n return Math.sqrt(distance);\n };\n $$.sbgn.colors = {\n clone: \"#838383\"\n };\n $$.sbgn.getDefaultComplexCornerLength = function () {\n return 24;\n };\n $$.sbgn.getDefaultGeneCornerLength = function () {\n return 24;\n };\n $$.sbgn.drawStateAndInfos = function (node, context, centerX, centerY) {\n var layouts = node.data('auxunitlayouts');\n for (var side in layouts) {\n var layout = layouts[side];\n classes.AuxUnitLayout.draw(layout, node.cy(), context);\n }\n context.beginPath();\n context.closePath();\n };\n $$.sbgn.drawInfoBox = function (context, x, y, width, height, shapeName) {\n switch (shapeName) {\n case 'roundrectangle':\n cyBaseNodeShapes['roundrectangle'].draw(context, x, y, width, height);\n break;\n case 'bottomroundrectangle':\n $$.sbgn.drawBottomRoundRectangle(context, x, y, width, height);\n break;\n case 'ellipse':\n cyBaseNodeShapes['ellipse'].draw(context, x, y, width, height);\n break;\n case 'complex':\n $$.sbgn.drawComplex(context, x, y, width, height, height / 2);\n break;\n case 'perturbing agent':\n var points = $$.sbgn.generatePerturbingAgentPoints();\n drawPolygonPath(context, x, y, width, height, points);\n break;\n case 'rectangle':\n cyBaseNodeShapes['rectangle'].draw(context, x, y, width, height);\n break;\n case 'stadium':\n $$.sbgn.drawRoundRectanglePath(context, x, y, width, height, Math.min(width / 2, height / 2, 15));\n break;\n }\n };\n\n // $$.sbgn.AfShapeArgsFn = function (self){\n // return [self.bbox.w, self.bbox.h, classes.getAuxUnitClass(self).getParent(self).data(\"class\")];\n // }\n\n $$.sbgn.nucleicAcidCheckPoint = function (x, y, padding, width, height, centerX, centerY, points, cornerRadius) {\n //check rectangle at top\n if (cyMath.pointInsidePolygon(x, y, points, centerX, centerY - cornerRadius / 2, width, height - cornerRadius / 3, [0, -1], padding)) {\n return true;\n }\n\n //check rectangle at bottom\n if (cyMath.pointInsidePolygon(x, y, points, centerX, centerY + height / 2 - cornerRadius / 2, width - 2 * cornerRadius, cornerRadius, [0, -1], padding)) {\n return true;\n }\n\n //check ellipses\n var checkInEllipse = function checkInEllipse(x, y, centerX, centerY, width, height, padding) {\n x -= centerX;\n y -= centerY;\n x /= width / 2 + padding;\n y /= height / 2 + padding;\n return Math.pow(x, 2) + Math.pow(y, 2) <= 1;\n };\n\n // Check bottom right quarter circle\n if (checkInEllipse(x, y, centerX + width / 2 - cornerRadius, centerY + height / 2 - cornerRadius, cornerRadius * 2, cornerRadius * 2, padding)) {\n return true;\n }\n\n // Check bottom left quarter circle\n if (checkInEllipse(x, y, centerX - width / 2 + cornerRadius, centerY + height / 2 - cornerRadius, cornerRadius * 2, cornerRadius * 2, padding)) {\n return true;\n }\n return false;\n };\n\n //we need to force opacity to 1 since we might have state and info boxes.\n //having opaque nodes which have state and info boxes gives unpleasent results.\n $$.sbgn.forceOpacityToOne = function (node, context) {\n var parentOpacity = node.effectiveOpacity();\n if (parentOpacity === 0) {\n return;\n }\n context.fillStyle = \"rgba(\" + node._private.style[\"background-color\"].value[0] + \",\" + node._private.style[\"background-color\"].value[1] + \",\" + node._private.style[\"background-color\"].value[2] + \",\" + 1 * node.css('opacity') * parentOpacity + \")\";\n };\n $$.sbgn.drawSimpleChemicalPath = function (context, x, y, width, height) {\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n //var cornerRadius = $$.math.getRoundRectangleRadius(width, height);\n var cornerRadius = Math.min(halfWidth, halfHeight);\n context.beginPath();\n\n // Start at top middle\n context.moveTo(x, y - halfHeight);\n // Arc from middle top to right side\n context.arcTo(x + halfWidth, y - halfHeight, x + halfWidth, y, cornerRadius);\n // Arc from right side to bottom\n context.arcTo(x + halfWidth, y + halfHeight, x, y + halfHeight, cornerRadius);\n // Arc from bottom to left side\n context.arcTo(x - halfWidth, y + halfHeight, x - halfWidth, y, cornerRadius);\n // Arc from left side to topBorder\n context.arcTo(x - halfWidth, y - halfHeight, x, y - halfHeight, cornerRadius);\n // Join line\n context.lineTo(x, y - halfHeight);\n context.closePath();\n };\n $$.sbgn.drawSimpleChemical = function (context, x, y, width, height) {\n $$.sbgn.drawSimpleChemicalPath(context, x, y, width, height);\n context.fill();\n };\n function simpleChemicalLeftClone(context, centerX, centerY, width, height, cloneMarker, opacity) {\n if (cloneMarker != null) {\n var oldGlobalAlpha = context.globalAlpha;\n context.globalAlpha = opacity;\n var oldStyle = context.fillStyle;\n context.fillStyle = $$.sbgn.colors.clone;\n context.beginPath();\n var markerBeginX = centerX - width / 2 * Math.sin(Math.PI / 3);\n var markerBeginY = centerY + height / 2 * Math.cos(Math.PI / 3);\n var markerEndX = centerX;\n var markerEndY = markerBeginY;\n context.moveTo(markerBeginX, markerBeginY);\n context.lineTo(markerEndX, markerEndY);\n context.arc(centerX, centerY, width / 2, 3 * Math.PI / 6, 5 * Math.PI / 6);\n context.closePath();\n context.fill();\n context.fillStyle = oldStyle;\n context.globalAlpha = oldGlobalAlpha;\n }\n }\n ;\n function simpleChemicalRightClone(context, centerX, centerY, width, height, cloneMarker, opacity) {\n if (cloneMarker != null) {\n var oldGlobalAlpha = context.globalAlpha;\n context.globalAlpha = opacity;\n var oldStyle = context.fillStyle;\n context.fillStyle = $$.sbgn.colors.clone;\n context.beginPath();\n var markerBeginX = centerX;\n var markerBeginY = centerY + height / 2 * Math.cos(Math.PI / 3);\n var markerEndX = centerX + width / 2 * Math.sin(Math.PI / 3);\n var markerEndY = markerBeginY;\n context.moveTo(markerBeginX, markerBeginY);\n context.lineTo(markerEndX, markerEndY);\n context.arc(centerX, centerY, width / 2, Math.PI / 6, 3 * Math.PI / 6);\n context.closePath();\n context.fill();\n context.fillStyle = oldStyle;\n context.globalAlpha = oldGlobalAlpha;\n }\n }\n ;\n $$.sbgn.drawEllipsePath = function (context, x, y, width, height) {\n cyBaseNodeShapes['ellipse'].drawPath(context, x, y, width, height);\n };\n $$.sbgn.drawBarrel = function (context, x, y, width, height) {\n cyBaseNodeShapes['barrel'].draw(context, x, y, width, height);\n context.fill();\n };\n $$.sbgn.drawBottomRoundRectangle = function (context, x, y, width, height) {\n cyBaseNodeShapes['bottomroundrectangle'].draw(context, x, y, width, height);\n context.fill();\n };\n\n // The old draw implementation for nucleic acid feature\n // now only used for clone marker drawing of nucleic acid feature\n // and macromolecule shapes because 'bottomroundrectangle' function\n // of cytoscape.js did not fit well for this purpose.\n // Did not change the name yet directly as drawNucAcidFeatureClone etc.\n // because it actually draws a nucleic acid feature in a different way.\n $$.sbgn.drawNucAcidFeature2 = function (context, centerX, centerY, width, height, cornerRadius) {\n cornerRadius = cornerRadius || cyMath.getRoundRectangleRadius(width, height);\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n var left = centerX - halfWidth,\n right = centerX + halfWidth;\n var bottom = centerY - halfHeight,\n top = centerY + halfHeight;\n context.beginPath();\n context.moveTo(left, bottom);\n context.lineTo(right, bottom);\n context.lineTo(right, centerY);\n context.arcTo(right, top, centerX, top, cornerRadius);\n context.arcTo(left, top, left, centerY, cornerRadius);\n context.lineTo(left, bottom);\n context.closePath();\n context.fill();\n };\n\n /*\n * Code taken from https://jsperf.com/string-prototype-endswith\n * Direct implementation seems to work better.\n * Using this improves isMultimer() performance.\n * Makes it take 0.1 or 0.2% less time from the whole\n * loading process, down from ~0.4% initially.\n */\n function endsWith(str, pattern) {\n for (var i = pattern.length, l = str.length; i--;) {\n if (str.charAt(--l) != pattern.charAt(i)) {\n return false;\n }\n }\n return true;\n }\n $$.sbgn.isMultimer = function (node) {\n var sbgnClass = node._private.data[\"class\"];\n if (sbgnClass && endsWith(sbgnClass, \"multimer\")) return true;\n return false;\n };\n $$.sbgn.isActive = function (node) {\n var sbgnClass = node._private.data[\"class\"];\n if (sbgnClass && sbgnClass.startsWith(\"active\")) return true;\n return false;\n };\n $$.sbgn.isHypothetical = function (node) {\n var sbgnClass = node._private.data[\"class\"];\n if (sbgnClass && sbgnClass.includes(\"hypothetical\")) return true;\n return false;\n };\n\n //this function is created to have same corner length when\n //complex's width or height is changed\n $$.sbgn.generateComplexShapePoints = function (cornerLength, width, height) {\n //cp stands for corner proportion\n var cpX = Math.min(cornerLength, 0.5 * width) / width;\n var cpY = Math.min(cornerLength, 0.5 * height) / height;\n var complexPoints = [-1 + cpX, -1, -1, -1 + cpY, -1, 1 - cpY, -1 + cpX, 1, 1 - cpX, 1, 1, 1 - cpY, 1, -1 + cpY, 1 - cpX, -1];\n return complexPoints;\n };\n $$.sbgn.generateGeneShapePoints = function (width, height) {\n return [-1, -1, 1, -1, 1, 1, -1, 1];\n };\n $$.sbgn.generateRNAShapePoints = function (width, height) {\n return [-1, 0.8, 0.5, 0.8, 1, -0.8, -0.5, -0.8];\n };\n $$.sbgn.generateReceptorShapePoints = function (width, height) {\n return [-1, -1, 0, -0.5, 1, -1, 1, 0.5, 0, 1, -1, 0.5];\n };\n $$.sbgn.generatePerturbingAgentPoints = function () {\n return [-1, -1, -0.5, 0, -1, 1, 1, 1, 0.5, 0, 1, -1];\n };\n $$.sbgn.getDefaultMultimerPadding = function () {\n return 5;\n };\n $$.sbgn.getDefaultActivePadding = function () {\n return 5;\n };\n\n // draw background image of nodes\n $$.sbgn.drawImage = function (context, imgObj) {\n if (imgObj) {\n context.clip();\n context.drawImage(imgObj.img, 0, 0, imgObj.imgW, imgObj.imgH, imgObj.x, imgObj.y, imgObj.w, imgObj.h);\n context.restore();\n }\n };\n cyStyleProperties.types.nodeShape.enums.push('empty set', 'nucleic acid feature', 'complex', 'macromolecule', 'simple chemical', 'biological activity', 'compartment', 'gene', 'simple molecule', 'unknown molecule', 'drug', 'truncated protein', 'ion', 'ion channel', 'rna', 'phenotype sbml', 'receptor', 'complex sbml', 'protein', 'degradation');\n $$.sbgn.registerSbgnNodeShapes = function () {\n function generateDrawFcn(_ref2) {\n var plainDrawFcn = _ref2.plainDrawFcn,\n extraDrawFcn = _ref2.extraDrawFcn,\n canBeMultimer = _ref2.canBeMultimer,\n cloneMarkerFcn = _ref2.cloneMarkerFcn,\n canBeActive = _ref2.canBeActive,\n canBeHypothetical = _ref2.canBeHypothetical,\n canHaveInfoBox = _ref2.canHaveInfoBox,\n multimerPadding = _ref2.multimerPadding,\n activePadding = _ref2.activePadding;\n return function (context, node, imgObj) {\n var borderWidth = parseFloat(node.css('border-width'));\n var width = node.outerWidth() - borderWidth;\n var height = node.outerHeight() - borderWidth;\n var centerX = node._private.position.x;\n var centerY = node._private.position.y;\n var bgOpacity = node.css('background-opacity');\n var isCloned = cloneMarkerFcn != null && node._private.data.clonemarker;\n\n //Ion channel is dran differently when it is active\n if (node._private.data[\"class\"].startsWith('active ion channel') || node._private.data[\"class\"].startsWith('active hypothetical ion channel')) {\n plainDrawFcn = $$.sbgn.drawOpenIonChannel;\n }\n if (node._private.data[\"class\"].startsWith('ion channel') || node._private.data[\"class\"].startsWith('hypothetical ion channel')) {\n plainDrawFcn = $$.sbgn.drawIonChannel;\n }\n\n //This is where the multimer is drawn\n if (canBeMultimer && $$.sbgn.isMultimer(node)) {\n plainDrawFcn(context, centerX + multimerPadding, centerY + multimerPadding, width, height);\n\n //If the node is also hypothetical\n if (canBeHypothetical && $$.sbgn.isHypothetical(node)) {\n // $$.sbgn.drawImage( context, imgObj );\n borderStyle = 'dashed';\n $$.sbgn.drawBorder({\n context: context,\n node: node,\n borderStyle: borderStyle\n });\n //$$.sbgn.drawImage( context, imgObj );\n context.beginPath();\n } else {\n $$.sbgn.drawBorder({\n context: context,\n node: node\n });\n }\n if (extraDrawFcn) {\n extraDrawFcn(context, centerX + multimerPadding, centerY + multimerPadding, width, height);\n $$.sbgn.drawBorder({\n context: context,\n node: node\n });\n }\n if (isCloned) {\n cloneMarkerFcn(context, centerX + multimerPadding, centerY + multimerPadding, width - borderWidth, height - borderWidth, isCloned, true, bgOpacity);\n }\n\n //If the node is also active\n if (canBeActive && $$.sbgn.isActive(node) && !node._private.data[\"class\"].startsWith('active ion channel') && !node._private.data[\"class\"].startsWith('active hypothetical ion channel')) {\n //add multimer shape\n plainDrawFcn(context, centerX + multimerPadding, centerY + multimerPadding, width, height, true, activePadding);\n borderStyle = 'dashed';\n context.setLineDash([3, 6]);\n $$.sbgn.drawBorder({\n context: context,\n node: node,\n borderStyle: borderStyle\n });\n if (extraDrawFcn) {\n extraDrawFcn(context, centerX + multimerPadding, centerY + multimerPadding, width + activePadding, height + activePadding);\n $$.sbgn.drawBorder({\n context: context,\n node: node\n });\n }\n }\n }\n\n //This is where the active is drawn\n if (canBeActive && $$.sbgn.isActive(node) && !node._private.data[\"class\"].startsWith('active ion channel') && !node._private.data[\"class\"].startsWith('active hypothetical ion channel')) {\n //add multimer shape\n plainDrawFcn(context, centerX, centerY, width, height, true, activePadding);\n borderStyle = 'dashed';\n context.setLineDash([3, 6]);\n $$.sbgn.drawBorder({\n context: context,\n node: node,\n borderStyle: borderStyle\n });\n if (extraDrawFcn) {\n extraDrawFcn(context, centerX, centerY, width + activePadding, height + activePadding);\n $$.sbgn.drawBorder({\n context: context,\n node: node\n });\n }\n }\n\n //This is where the active is drawn\n if (canBeHypothetical && $$.sbgn.isHypothetical(node)) {\n //add multimer shape\n plainDrawFcn(context, centerX, centerY, width, height);\n borderStyle = 'dashed';\n $$.sbgn.drawBorder({\n context: context,\n node: node,\n borderStyle: borderStyle\n });\n // $$.sbgn.drawImage( context, imgObj );\n context.beginPath();\n if (extraDrawFcn) {\n extraDrawFcn(context, centerX, centerY, width, height);\n $$.sbgn.drawBorder({\n context: context,\n node: node\n });\n }\n }\n if (!(canBeHypothetical && $$.sbgn.isHypothetical(node))) {\n plainDrawFcn(context, centerX, centerY, width, height);\n $$.sbgn.drawImage(context, imgObj);\n }\n $$.sbgn.drawBorder({\n context: context,\n node: node\n });\n if (extraDrawFcn) {\n extraDrawFcn(context, centerX, centerY, width, height);\n $$.sbgn.drawBorder({\n context: context,\n node: node\n });\n }\n if (isCloned) {\n cloneMarkerFcn(context, centerX, centerY, width - borderWidth, height - borderWidth, isCloned, false, bgOpacity);\n }\n if (canHaveInfoBox) {\n var oldStyle = context.fillStyle;\n $$.sbgn.forceOpacityToOne(node, context);\n $$.sbgn.drawStateAndInfos(node, context, centerX, centerY);\n context.fillStyle = oldStyle;\n }\n };\n }\n function generateIntersectLineFcn(_ref3) {\n var plainIntersectLineFcn = _ref3.plainIntersectLineFcn,\n canBeMultimer = _ref3.canBeMultimer,\n cloneMarkerFcn = _ref3.cloneMarkerFcn,\n canBeActive = _ref3.canBeActive,\n canBeHypothetical = _ref3.canBeHypothetical,\n canHaveInfoBox = _ref3.canHaveInfoBox,\n multimerPadding = _ref3.multimerPadding,\n activePadding = _ref3.activePadding;\n return function (node, x, y) {\n var borderWidth = parseFloat(node.css('border-width'));\n var padding = borderWidth / 2;\n var width = node.outerWidth() - borderWidth;\n var height = node.outerHeight() - borderWidth;\n var centerX = node._private.position.x;\n var centerY = node._private.position.y;\n var intersections = [];\n if (canHaveInfoBox) {\n var stateAndInfoIntersectLines = $$.sbgn.intersectLineStateAndInfoBoxes(node, x, y);\n intersections = intersections.concat(stateAndInfoIntersectLines);\n }\n var nodeIntersectLines = plainIntersectLineFcn(centerX, centerY, width, height, x, y, padding);\n intersections = intersections.concat(nodeIntersectLines);\n if (canBeMultimer && $$.sbgn.isMultimer(node)) {\n var multimerIntersectionLines = plainIntersectLineFcn(centerX + multimerPadding, centerY + multimerPadding, width, height, x, y, padding);\n intersections = intersections.concat(multimerIntersectionLines);\n }\n if (canBeActive && $$.sbgn.isActive(node)) {\n var activeIntersectionLines = plainIntersectLineFcn(centerX + activePadding, centerY + activePadding, width, height, x, y, padding);\n intersections = intersections.concat(activeIntersectionLines);\n }\n if (canBeHypothetical && $$.sbgn.isHypothetical(node)) {\n var hypotheticalIntersectionLines = plainIntersectLineFcn(centerX, centerY, width, height, x, y, padding);\n intersections = intersections.concat(hypotheticalIntersectionLines);\n }\n return $$.sbgn.closestIntersectionPoint([x, y], intersections);\n };\n }\n function generateCheckPointFcn(_ref4) {\n var plainCheckPointFcn = _ref4.plainCheckPointFcn,\n canBeMultimer = _ref4.canBeMultimer,\n cloneMarkerFcn = _ref4.cloneMarkerFcn,\n canBeActive = _ref4.canBeActive,\n canBeHypothetical = _ref4.canBeHypothetical,\n canHaveInfoBox = _ref4.canHaveInfoBox,\n multimerPadding = _ref4.multimerPadding,\n activePadding = _ref4.activePadding;\n return function (x, y, node, threshold) {\n threshold = threshold || 0;\n var borderWidth = parseFloat(node.css('border-width'));\n var width = node.outerWidth() - borderWidth + 2 * threshold;\n var height = node.outerHeight() - borderWidth + 2 * threshold;\n var centerX = node._private.position.x;\n var centerY = node._private.position.y;\n var padding = borderWidth / 2;\n var nodeCheck = function nodeCheck() {\n return plainCheckPointFcn(x, y, padding, width, height, centerX, centerY);\n };\n var stateAndInfoCheck = function stateAndInfoCheck() {\n return canHaveInfoBox && $$.sbgn.checkPointStateAndInfoBoxes(x, y, node, threshold);\n };\n var multimerCheck = function multimerCheck() {\n return canBeMultimer && $$.sbgn.isMultimer(node) && plainCheckPointFcn(x, y, padding, width, height, centerX + multimerPadding, centerY + multimerPadding);\n };\n var activeCheck = function activeCheck() {\n return canBeActive && $$.sbgn.isActive(node) && plainCheckPointFcn(x, y, padding, width, height, centerX + activePadding, centerY + activePadding);\n };\n var hypotheticalCheck = function hypotheticalCheck() {\n return canBeHypothetical && $$.sbgn.isHypothetical(node) && plainCheckPointFcn(x, y, padding, width, height, centerX, centerY);\n };\n return nodeCheck() || stateAndInfoCheck() || multimerCheck() || activeCheck() || hypotheticalCheck();\n };\n }\n var shapeNames = [\"simple chemical\", \"macromolecule\", \"complex\", \"nucleic acid feature\", \"empty set\", \"biological activity\", \"compartment\", \"oldCompartment\", \"gene\", \"simple molecule\", 'receptor', 'complex sbml', \"unknown molecule\", \"drug\", \"ion\", \"truncated protein\", \"ion channel\", \"rna\", \"phenotype sbml\", \"protein\", \"degradation\"];\n shapeNames.forEach(function (shapeName) {\n var plainDrawFcn = $$.sbgn.plainDraw[shapeName];\n var plainIntersectLineFcn = $$.sbgn.plainIntersectLine[shapeName];\n var plainCheckPointFcn = $$.sbgn.plainCheckPoint[shapeName];\n var canBeMultimer = $$.sbgn.canBeMultimerShapes[shapeName];\n var canBeActive = $$.sbgn.canBeActiveShapes[shapeName];\n var canBeHypothetical = $$.sbgn.canBeHypotheticalShapes[shapeName];\n var cloneMarkerFcn = $$.sbgn.cloneMarker[shapeName];\n var canHaveInfoBox = $$.sbgn.canHaveInfoBoxShapes[shapeName];\n var multimerPadding = $$.sbgn.getDefaultMultimerPadding();\n var activePadding = $$.sbgn.getDefaultActivePadding();\n var extraDrawFcn = $$.sbgn.extraDraw[shapeName];\n var draw = generateDrawFcn({\n plainDrawFcn: plainDrawFcn,\n canBeMultimer: canBeMultimer,\n cloneMarkerFcn: cloneMarkerFcn,\n canBeActive: canBeActive,\n canBeHypothetical: canBeHypothetical,\n canHaveInfoBox: canHaveInfoBox,\n multimerPadding: multimerPadding,\n activePadding: activePadding,\n extraDrawFcn: extraDrawFcn\n });\n var intersectLine = totallyOverridenNodeShapes[shapeName] ? generateIntersectLineFcn({\n plainIntersectLineFcn: plainIntersectLineFcn,\n canBeMultimer: canBeMultimer,\n cloneMarkerFcn: cloneMarkerFcn,\n canBeActive: canBeActive,\n canBeHypothetical: canBeHypothetical,\n canHaveInfoBox: canHaveInfoBox,\n multimerPadding: multimerPadding,\n activePadding: activePadding\n }) : plainIntersectLineFcn;\n var checkPoint = totallyOverridenNodeShapes[shapeName] ? generateCheckPointFcn({\n plainCheckPointFcn: plainCheckPointFcn,\n canBeMultimer: canBeMultimer,\n cloneMarkerFcn: cloneMarkerFcn,\n canBeActive: canBeActive,\n canBeHypothetical: canBeHypothetical,\n canHaveInfoBox: canHaveInfoBox,\n multimerPadding: multimerPadding,\n activePadding: activePadding\n }) : plainCheckPointFcn;\n var shape = {\n draw: draw,\n intersectLine: intersectLine,\n checkPoint: checkPoint,\n multimerPadding: multimerPadding,\n activePadding: activePadding\n };\n cyBaseNodeShapes[shapeName] = shape;\n });\n };\n $$.sbgn.drawEllipse = function (context, x, y, width, height) {\n //$$.sbgn.drawEllipsePath(context, x, y, width, height);\n //context.fill();\n cyBaseNodeShapes['ellipse'].draw(context, x, y, width, height);\n context.fill();\n };\n $$.sbgn.drawTruncatedProtein = function (context, x, y, width, height, isActive, activePadding) {\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n var cornerRadius = cyMath.getRoundRectangleRadius(width, height);\n var halfPadding = activePadding ? activePadding / 2 : 0;\n if (context.beginPath) {\n context.beginPath();\n }\n\n // Start at top middle\n context.moveTo(x, y - halfHeight - halfPadding);\n //Draw a line till right top\n context.lineTo(x + halfWidth + halfPadding, y - halfHeight - halfPadding);\n //Draw a line to middle right\n context.lineTo(x + halfWidth + halfPadding, y + 2 * halfHeight / 3 + 2 * halfPadding);\n //Draw a line inner\n context.lineTo(x + 2 * halfWidth / 3 + halfPadding, y + halfHeight / 3 + 2 * halfPadding);\n //Draw a line to bottom right\n context.lineTo(x + 2 * halfWidth / 3 + halfPadding, y + halfHeight + halfPadding);\n //Draw a line to bottom middle\n context.lineTo(x, y + halfHeight + halfPadding);\n // Arc from bottom to left side\n context.arcTo(x - halfWidth - halfPadding, y + halfHeight + halfPadding, x - halfWidth - halfPadding, y, cornerRadius);\n // Arc from left side to topBorder\n context.arcTo(x - halfWidth - halfPadding, y - halfHeight - halfPadding, x, y - halfHeight - halfPadding, cornerRadius);\n context.closePath();\n if (!isActive) {\n context.fill();\n }\n };\n $$.sbgn.drawIonChannel = function (context, x, y, width, height, radius) {\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n var cornerRadius = radius || cyMath.getRoundRectangleRadius(width, height);\n if (context.beginPath) {\n context.beginPath();\n }\n\n // Start at top middle\n context.moveTo(x + halfWidth / 4, y - halfHeight);\n // Arc from middle top to right side\n context.arcTo(x + halfWidth / 2, y - halfHeight, x + halfWidth / 2, y, cornerRadius);\n // Arc from right side to bottom\n context.arcTo(x + halfWidth / 2, y + halfHeight, x / 2 + halfWidth / 4, y + halfHeight, cornerRadius);\n // Arc from bottom to left side\n context.arcTo(x - halfWidth, y + halfHeight, x - halfWidth, y, cornerRadius);\n // Arc from left side to topBorder\n context.arcTo(x - halfWidth, y - halfHeight, x + halfWidth / 4, y - halfHeight, cornerRadius);\n // Join line\n context.lineTo(x + halfWidth / 4, y - halfHeight);\n\n // Start at top middle\n context.moveTo(x + 3 * halfWidth / 4, y - halfHeight);\n // Arc from middle top to right side\n context.arcTo(x + halfWidth, y - halfHeight, x + halfWidth, y, cornerRadius);\n // Arc from right side to bottom\n context.arcTo(x + halfWidth, y + halfHeight, x + 3 * halfWidth / 4, y + halfHeight, cornerRadius);\n // Arc from bottom to left side\n context.arcTo(x + halfWidth / 2, y + halfHeight, x + halfWidth / 2, y, cornerRadius);\n // Arc from left side to topBorder\n context.arcTo(x + halfWidth / 2, y - halfHeight, x + 3 * halfWidth / 4, y - halfHeight, cornerRadius);\n // Join line\n //context.lineTo( x, y - halfHeight );\n\n context.closePath();\n context.fill();\n };\n $$.sbgn.drawOpenIonChannel = function (context, x, y, width, height, radius) {\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n var cornerRadius = radius || cyMath.getRoundRectangleRadius(width, height);\n if (context.beginPath) {\n context.beginPath();\n }\n\n // Start at top middle\n context.moveTo(x - halfWidth / 2, y - halfHeight);\n // Arc from middle top to right side\n context.arcTo(x, y - halfHeight, x, y, cornerRadius);\n // Arc from right side to bottom\n context.arcTo(x, y + halfHeight, x - halfWidth / 2, y + halfHeight, cornerRadius);\n // Arc from bottom to left side\n context.arcTo(x - halfWidth, y + halfHeight, x - halfWidth, y, cornerRadius);\n // Arc from left side to topBorder\n context.arcTo(x - halfWidth, y - halfHeight, x + halfWidth / 2, y - halfHeight, cornerRadius);\n // Join line\n context.lineTo(x - halfWidth / 2, y - halfHeight);\n\n // Start at top middle\n context.moveTo(x + 3 * halfWidth / 4, y - halfHeight);\n // Arc from middle top to right side\n context.arcTo(x + halfWidth, y - halfHeight, x + halfWidth, y, cornerRadius);\n // Arc from right side to bottom\n context.arcTo(x + halfWidth, y + halfHeight, x + 3 * halfWidth / 4, y + halfHeight, cornerRadius);\n // Arc from bottom to left side\n context.arcTo(x + halfWidth / 2, y + halfHeight, x + halfWidth / 2, y, cornerRadius);\n // Arc from left side to topBorder\n context.arcTo(x + halfWidth / 2, y - halfHeight, x + 3 * halfWidth / 4, y - halfHeight, cornerRadius);\n // Join line\n //context.lineTo( x, y - halfHeight );\n\n context.closePath();\n context.fill();\n };\n $$.sbgn.drawComplex = function (context, x, y, width, height, isActive, cornerLength) {\n cornerLength = cornerLength || $$.sbgn.getDefaultComplexCornerLength();\n var points = $$.sbgn.generateComplexShapePoints(cornerLength, width, height);\n drawPolygonPath(context, x, y, width, height, points);\n if (!isActive) {\n context.fill();\n }\n };\n $$.sbgn.drawGene = function (context, x, y, width, height, isActive) {\n cyBaseNodeShapes['rectangle'].draw(context, x, y, width, height);\n if (!isActive) {\n context.fill();\n }\n };\n $$.sbgn.drawRNA = function (context, x, y, width, height) {\n var points = $$.sbgn.generateRNAShapePoints(width, height);\n drawPolygonPath(context, x, y, width, height, points);\n context.fill();\n };\n $$.sbgn.drawPhenotype = function (context, x, y, width, height) {\n cyBaseNodeShapes['hexagon'].draw(context, x, y, width, height);\n context.fill();\n };\n $$.sbgn.drawReceptor = function (context, x, y, width, height, isActive, activePadding) {\n drawReceptorPath(context, x, y, width, height, activePadding);\n if (!isActive) {\n context.fill();\n }\n };\n $$.sbgn.drawCrossLine = function (context, x, y, width, height) {\n var points = cyMath.generateUnitNgonPoints(4, 0);\n context.beginPath();\n var scaleX = width * Math.sqrt(2) / 2,\n scaleY = height * Math.sqrt(2) / 2;\n context.moveTo(x + scaleX * points[2], y + scaleY * points[3]);\n context.lineTo(x + scaleX * points[6], y + scaleY * points[7]);\n context.closePath();\n };\n $$.sbgn.drawBiologicalActivity = function (context, x, y, width, height) {\n var points = $$.sbgn.generateBiologicalActivityPoints();\n drawPolygonPath(context, x, y, width, height, points);\n context.fill();\n };\n $$.sbgn.drawRoundRectangle = function (context, x, y, width, height, isActive) {\n drawRoundRectanglePath(context, x, y, width, height);\n if (!isActive) {\n context.fill();\n }\n };\n $$.sbgn.drawProtein = function (context, x, y, width, height, isActive, activePadding) {\n var activePadding1 = activePadding || 0;\n drawProteinPath(context, x, y, width, height, activePadding1);\n if (!isActive) {\n context.fill();\n }\n };\n $$.sbgn.drawRoundedDrug = function (context, x, y, width, height) {\n drawRoundedDrugPath(context, x, y, width, height);\n context.fill();\n };\n $$.sbgn.generateNucleicAcidPoints = function () {\n return cyMath.generateUnitNgonPointsFitToSquare(4, 0);\n };\n $$.sbgn.generateBiologicalActivityPoints = function () {\n return cyMath.generateUnitNgonPointsFitToSquare(4, 0);\n };\n $$.sbgn.generateCompartmentPoints = function () {\n return math.generateUnitNgonPointsFitToSquare(4, 0);\n };\n $$.sbgn.plainDraw = {\n \"simple chemical\": $$.sbgn.drawSimpleChemical,\n \"macromolecule\": $$.sbgn.drawRoundRectangle,\n \"complex\": $$.sbgn.drawComplex,\n \"nucleic acid feature\": $$.sbgn.drawBottomRoundRectangle,\n \"empty set\": $$.sbgn.drawEllipse,\n \"biological activity\": $$.sbgn.drawBiologicalActivity,\n \"compartment\": $$.sbgn.drawBarrel,\n \"oldCompartment\": $$.sbgn.drawRoundRectangle,\n \"gene\": $$.sbgn.drawGene,\n \"rna\": $$.sbgn.drawRNA,\n \"simple molecule\": $$.sbgn.drawEllipse,\n \"unknown molecule\": $$.sbgn.drawEllipse,\n \"drug\": $$.sbgn.drawRoundedDrug,\n \"ion\": $$.sbgn.drawEllipse,\n \"truncated protein\": $$.sbgn.drawTruncatedProtein,\n \"ion channel\": $$.sbgn.drawIonChannel,\n \"phenotype sbml\": $$.sbgn.drawPhenotype,\n \"receptor\": $$.sbgn.drawReceptor,\n \"complex sbml\": $$.sbgn.drawComplex,\n \"protein\": $$.sbgn.drawProtein,\n \"degradation\": $$.sbgn.drawEllipse\n };\n\n // To define an extra drawing for the node that is rendered at the very end,\n // even after the node background image is drawn.\n // E.g. cross lines of \"empty set\" nodes.\n $$.sbgn.extraDraw = {\n \"empty set\": $$.sbgn.drawCrossLine,\n \"degradation\": $$.sbgn.drawCrossLine\n };\n $$.sbgn.plainIntersectLine = {\n \"simple chemical\": function simpleChemical(centerX, centerY, width, height, x, y, padding) {\n return cyBaseNodeShapes[\"ellipse\"].intersectLine(centerX, centerY, width, height, x, y, padding);\n },\n \"macromolecule\": function macromolecule(centerX, centerY, width, height, x, y, padding) {\n return $$.sbgn.roundRectangleIntersectLine(x, y, centerX, centerY, centerX, centerY, width, height, cyMath.getRoundRectangleRadius(width, height), padding);\n },\n \"complex\": function complex(centerX, centerY, width, height, x, y, padding) {\n var points = $$.sbgn.generateComplexShapePoints($$.sbgn.getDefaultComplexCornerLength(), width, height);\n return cyMath.polygonIntersectLine(x, y, points, centerX, centerY, width / 2, height / 2, padding);\n },\n \"nucleic acid feature\": function nucleicAcidFeature(centerX, centerY, width, height, x, y, padding) {\n return cyBaseNodeShapes[\"bottomroundrectangle\"].intersectLine(centerX, centerY, width, height, x, y, padding);\n },\n \"empty set\": function emptySet(centerX, centerY, width, height, x, y, padding) {\n return cyBaseNodeShapes[\"ellipse\"].intersectLine(centerX, centerY, width, height, x, y, padding);\n },\n \"degradation\": function degradation(centerX, centerY, width, height, x, y, padding) {\n return cyBaseNodeShapes[\"ellipse\"].intersectLine(centerX, centerY, width, height, x, y, padding);\n },\n \"biological activity\": function biologicalActivity(centerX, centerY, width, height, x, y, padding) {\n var points = $$.sbgn.generateBiologicalActivityPoints();\n return cyMath.polygonIntersectLine(x, y, points, centerX, centerY, width / 2, height / 2, padding);\n },\n \"compartment\": function compartment(centerX, centerY, width, height, x, y, padding) {\n return cyBaseNodeShapes[\"barrel\"].intersectLine(centerX, centerY, width, height, x, y, padding);\n },\n \"oldCompartment\": function oldCompartment(centerX, centerY, width, height, x, y, padding) {\n return cyMath.roundRectangleIntersectLine(x, y, centerX, centerY, width, height, padding);\n },\n \"protein\": function protein(centerX, centerY, width, height, x, y, padding) {\n return cyMath.roundRectangleIntersectLine(x, y, centerX, centerY, width, height, padding);\n },\n \"gene\": function gene(centerX, centerY, width, height, x, y, padding) {\n return cyBaseNodeShapes[\"rectangle\"].intersectLine(centerX, centerY, width, height, x, y, padding);\n },\n \"rna\": function rna(centerX, centerY, width, height, x, y, padding) {\n var points = $$.sbgn.generateRNAShapePoints(width, height);\n return cyMath.polygonIntersectLine(x, y, points, centerX, centerY, width / 2, height / 2, padding);\n },\n \"receptor\": function receptor(centerX, centerY, width, height, x, y, padding) {\n var points = $$.sbgn.generateReceptorShapePoints(width, height);\n return cyMath.polygonIntersectLine(x, y, points, centerX, centerY, width / 2, height / 2, padding);\n },\n \"ion channel\": function ionChannel(centerX, centerY, width, height, x, y, padding) {\n return cyMath.roundRectangleIntersectLine(x, y, centerX, centerY, width, height, padding);\n },\n \"truncated protein\": function truncatedProtein(centerX, centerY, width, height, x, y, padding) {\n return cyMath.roundRectangleIntersectLine(x, y, centerX, centerY, width, height, padding);\n },\n \"ion\": function ion(centerX, centerY, width, height, x, y, padding) {\n return cyBaseNodeShapes[\"ellipse\"].intersectLine(centerX, centerY, width, height, x, y, padding);\n },\n \"simple molecule\": function simpleMolecule(centerX, centerY, width, height, x, y, padding) {\n return cyBaseNodeShapes[\"ellipse\"].intersectLine(centerX, centerY, width, height, x, y, padding);\n },\n \"unknown molecule\": function unknownMolecule(centerX, centerY, width, height, x, y, padding) {\n return cyBaseNodeShapes[\"ellipse\"].intersectLine(centerX, centerY, width, height, x, y, padding);\n },\n \"drug\": function drug(centerX, centerY, width, height, x, y, padding) {\n return cyBaseNodeShapes[\"ellipse\"].intersectLine(centerX, centerY, width, height, x, y, padding);\n },\n \"phenotype sbml\": function phenotypeSbml(centerX, centerY, width, height, x, y, padding) {\n return cyBaseNodeShapes[\"ellipse\"].intersectLine(centerX, centerY, width, height, x, y, padding);\n },\n \"complex sbml\": function complexSbml(centerX, centerY, width, height, x, y, padding) {\n var points = $$.sbgn.generateComplexShapePoints($$.sbgn.getDefaultComplexCornerLength(), width, height);\n return cyMath.polygonIntersectLine(x, y, points, centerX, centerY, width / 2, height / 2, padding);\n }\n };\n $$.sbgn.plainCheckPoint = {\n \"simple chemical\": function simpleChemical(x, y, padding, width, height, centerX, centerY) {\n var points = cyMath.generateUnitNgonPointsFitToSquare(4, 0);\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n //var cornerRadius = $$.math.getRoundRectangleRadius(width, height);\n var cornerRadius = Math.min(halfWidth, halfHeight);\n //var cornerRadius = math.getRoundRectangleRadius( width, height );\n var diam = cornerRadius * 2;\n\n // Check hBox\n if (cyMath.pointInsidePolygon(x, y, points, centerX, centerY, width, height - diam, [0, -1], padding)) {\n return true;\n }\n\n // Check vBox\n if (cyMath.pointInsidePolygon(x, y, points, centerX, centerY, width - diam, height, [0, -1], padding)) {\n return true;\n }\n\n // Check top left quarter circle\n if (cyMath.checkInEllipse(x, y, diam, diam, centerX - width / 2 + cornerRadius, centerY - height / 2 + cornerRadius, padding)) {\n return true;\n }\n\n // Check top right quarter circle\n if (cyMath.checkInEllipse(x, y, diam, diam, centerX + width / 2 - cornerRadius, centerY - height / 2 + cornerRadius, padding)) {\n return true;\n }\n\n // Check bottom right quarter circle\n if (cyMath.checkInEllipse(x, y, diam, diam, centerX + width / 2 - cornerRadius, centerY + height / 2 - cornerRadius, padding)) {\n return true;\n }\n\n // Check bottom left quarter circle\n if (cyMath.checkInEllipse(x, y, diam, diam, centerX - width / 2 + cornerRadius, centerY + height / 2 - cornerRadius, padding)) {\n return true;\n }\n return false;\n //return cyBaseNodeShapes[\"ellipse\"].checkPoint( x, y, padding, width, height, centerX, centerY );\n },\n \"macromolecule\": function macromolecule(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"complex\": function complex(x, y, padding, width, height, centerX, centerY) {\n var points = $$.sbgn.generateComplexShapePoints($$.sbgn.getDefaultComplexCornerLength(), width, height);\n return cyMath.pointInsidePolygon(x, y, points, centerX, centerY, width, height, [0, -1], padding);\n },\n \"complex sbml\": function complexSbml(x, y, padding, width, height, centerX, centerY) {\n var points = $$.sbgn.generateComplexShapePoints($$.sbgn.getDefaultComplexCornerLength(), width, height);\n return cyMath.pointInsidePolygon(x, y, points, centerX, centerY, width, height, [0, -1], padding);\n },\n \"nucleic acid feature\": function nucleicAcidFeature(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"bottomroundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"empty set\": function emptySet(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"ellipse\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"degradation\": function degradation(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"ellipse\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"biological activity\": function biologicalActivity(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"rectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"compartment\": function compartment(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"barrel\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"oldCompartment\": function oldCompartment(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"gene\": function gene(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"simple molecule\": function simpleMolecule(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"unknown molecule\": function unknownMolecule(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"drug\": function drug(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"ion\": function ion(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"truncated protein\": function truncatedProtein(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"ion channel\": function ionChannel(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"rna\": function rna(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"phenotype sbml\": function phenotypeSbml(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"receptor\": function receptor(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"protein\": function protein(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n }\n };\n $$.sbgn.cloneMarker = {\n \"simple chemical\": function simpleChemical(context, centerX, centerY, width, height, cloneMarker, isMultimer, opacity) {\n if (cloneMarker != null) {\n var cornerRadius = Math.min(width / 2, height / 2);\n var firstCircleCenterX = centerX - width / 2 + cornerRadius;\n var firstCircleCenterY = centerY;\n var secondCircleCenterX = centerX + width / 2 - cornerRadius;\n var secondCircleCenterY = centerY;\n var bottomCircleCenterX = centerX;\n var bottomCircleCenterY = centerY + height / 2 - cornerRadius;\n if (width < height) {\n simpleChemicalLeftClone(context, bottomCircleCenterX, bottomCircleCenterY, 2 * cornerRadius, 2 * cornerRadius, cloneMarker, opacity);\n simpleChemicalRightClone(context, bottomCircleCenterX, bottomCircleCenterY, 2 * cornerRadius, 2 * cornerRadius, cloneMarker, opacity);\n } else {\n simpleChemicalLeftClone(context, firstCircleCenterX, firstCircleCenterY, 2 * cornerRadius, 2 * cornerRadius, cloneMarker, opacity);\n simpleChemicalRightClone(context, secondCircleCenterX, secondCircleCenterY, 2 * cornerRadius, 2 * cornerRadius, cloneMarker, opacity);\n }\n var oldStyle = context.fillStyle;\n context.fillStyle = $$.sbgn.colors.clone;\n var oldGlobalAlpha = context.globalAlpha;\n context.globalAlpha = opacity;\n var recPoints = cyMath.generateUnitNgonPointsFitToSquare(4, 0);\n var cloneX = centerX;\n var cloneY = centerY + 3 / 4 * cornerRadius;\n var cloneWidth = width - 2 * cornerRadius;\n var cloneHeight = cornerRadius / 2;\n drawPolygonPath(context, cloneX, cloneY, cloneWidth, cloneHeight, recPoints);\n context.fill();\n context.fillStyle = oldStyle;\n context.globalAlpha = oldGlobalAlpha;\n }\n },\n \"nucleic acid feature\": function nucleicAcidFeature(context, centerX, centerY, width, height, cloneMarker, isMultimer, opacity) {\n if (cloneMarker != null) {\n var cloneWidth = width;\n var cloneHeight = height / 4;\n var cloneX = centerX;\n var cloneY = centerY + 3 * height / 8;\n var oldStyle = context.fillStyle;\n context.fillStyle = $$.sbgn.colors.clone;\n var oldGlobalAlpha = context.globalAlpha;\n context.globalAlpha = opacity;\n var cornerRadius = cyMath.getRoundRectangleRadius(width, height);\n $$.sbgn.drawNucAcidFeature2(context, cloneX, cloneY, cloneWidth, cloneHeight, cornerRadius);\n context.fillStyle = oldStyle;\n context.globalAlpha = oldGlobalAlpha;\n }\n },\n \"macromolecule\": function macromolecule(context, centerX, centerY, width, height, cloneMarker, isMultimer, opacity) {\n $$.sbgn.cloneMarker[\"nucleic acid feature\"](context, centerX, centerY, width, height, cloneMarker, isMultimer, opacity);\n },\n \"complex\": function complex(context, centerX, centerY, width, height, cloneMarker, isMultimer, opacity) {\n if (cloneMarker != null) {\n var cornerLength = $$.sbgn.getDefaultComplexCornerLength();\n var cpX = width >= 50 ? cornerLength / width : cornerLength / 50;\n var cpY = height >= 50 ? cornerLength / height : cornerLength / 50;\n var cloneWidth = width;\n var cloneHeight = height * cpY / 2;\n var cloneX = centerX;\n var cloneY = centerY + height / 2 - cloneHeight / 2;\n var markerPoints = [-1, -1, 1, -1, 1 - cpX, 1, -1 + cpX, 1];\n var oldStyle = context.fillStyle;\n context.fillStyle = $$.sbgn.colors.clone;\n var oldGlobalAlpha = context.globalAlpha;\n context.globalAlpha = opacity;\n drawPolygonPath(context, cloneX, cloneY, cloneWidth, cloneHeight, markerPoints);\n context.fill();\n context.fillStyle = oldStyle;\n context.globalAlpha = oldGlobalAlpha;\n }\n }\n };\n $$.sbgn.closestIntersectionPoint = function (point, intersections) {\n if (intersections.length <= 0) return [];\n var closestIntersection = [];\n var minDistance = Number.MAX_VALUE;\n for (var i = 0; i < intersections.length; i = i + 2) {\n var checkPoint = [intersections[i], intersections[i + 1]];\n var distance = cyMath.calculateDistance(point, checkPoint);\n if (distance < minDistance) {\n minDistance = distance;\n closestIntersection = checkPoint;\n }\n }\n return closestIntersection;\n };\n $$.sbgn.nucleicAcidIntersectionLine = function (x, y, nodeX, nodeY, width, height, cornerRadius, padding) {\n // var nodeX = node._private.position.x;\n // var nodeY = node._private.position.y;\n // var width = node.width();\n // var height = node.height();\n // var padding = parseInt(node.css('border-width')) / 2;\n\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n var straightLineIntersections;\n\n // Top segment, left to right\n {\n var topStartX = nodeX - halfWidth - padding;\n var topStartY = nodeY - halfHeight - padding;\n var topEndX = nodeX + halfWidth + padding;\n var topEndY = topStartY;\n straightLineIntersections = cyMath.finiteLinesIntersect(x, y, nodeX, nodeY, topStartX, topStartY, topEndX, topEndY, false);\n if (straightLineIntersections.length > 0) {\n return straightLineIntersections;\n }\n }\n\n // Right segment, top to bottom\n {\n var rightStartX = nodeX + halfWidth + padding;\n var rightStartY = nodeY - halfHeight - padding;\n var rightEndX = rightStartX;\n var rightEndY = nodeY + halfHeight - cornerRadius + padding;\n straightLineIntersections = cyMath.finiteLinesIntersect(x, y, nodeX, nodeY, rightStartX, rightStartY, rightEndX, rightEndY, false);\n if (straightLineIntersections.length > 0) {\n return straightLineIntersections;\n }\n }\n\n // Bottom segment, left to right\n {\n var bottomStartX = nodeX - halfWidth + cornerRadius - padding;\n var bottomStartY = nodeY + halfHeight + padding;\n var bottomEndX = nodeX + halfWidth - cornerRadius + padding;\n var bottomEndY = bottomStartY;\n straightLineIntersections = cyMath.finiteLinesIntersect(x, y, nodeX, nodeY, bottomStartX, bottomStartY, bottomEndX, bottomEndY, false);\n if (straightLineIntersections.length > 0) {\n return straightLineIntersections;\n }\n }\n\n // Left segment, top to bottom\n {\n var leftStartX = nodeX - halfWidth - padding;\n var leftStartY = nodeY - halfHeight - padding;\n var leftEndX = leftStartX;\n var leftEndY = nodeY + halfHeight - cornerRadius + padding;\n straightLineIntersections = cyMath.finiteLinesIntersect(x, y, nodeX, nodeY, leftStartX, leftStartY, leftEndX, leftEndY, false);\n if (straightLineIntersections.length > 0) {\n return straightLineIntersections;\n }\n }\n\n // Check intersections with arc segments, we have only two arcs for\n //nucleic acid features\n var arcIntersections;\n\n // Bottom Right\n {\n var bottomRightCenterX = nodeX + halfWidth - cornerRadius;\n var bottomRightCenterY = nodeY + halfHeight - cornerRadius;\n arcIntersections = cyMath.intersectLineCircle(x, y, nodeX, nodeY, bottomRightCenterX, bottomRightCenterY, cornerRadius + padding);\n\n // Ensure the intersection is on the desired quarter of the circle\n if (arcIntersections.length > 0 && arcIntersections[0] >= bottomRightCenterX && arcIntersections[1] >= bottomRightCenterY) {\n return [arcIntersections[0], arcIntersections[1]];\n }\n }\n\n // Bottom Left\n {\n var bottomLeftCenterX = nodeX - halfWidth + cornerRadius;\n var bottomLeftCenterY = nodeY + halfHeight - cornerRadius;\n arcIntersections = cyMath.intersectLineCircle(x, y, nodeX, nodeY, bottomLeftCenterX, bottomLeftCenterY, cornerRadius + padding);\n\n // Ensure the intersection is on the desired quarter of the circle\n if (arcIntersections.length > 0 && arcIntersections[0] <= bottomLeftCenterX && arcIntersections[1] >= bottomLeftCenterY) {\n return [arcIntersections[0], arcIntersections[1]];\n }\n }\n return []; // if nothing\n };\n\n //this function gives the intersections of any line with the upper half of perturbing agent\n $$.sbgn.perturbingAgentIntersectLine = function (x1, y1, x2, y2, nodeX, nodeY, width, height, padding) {\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n\n // Check intersections with straight line segments\n var straightLineIntersections = [];\n\n // Top segment, left to right\n {\n var topStartX = nodeX - halfWidth - padding;\n var topStartY = nodeY - halfHeight - padding;\n var topEndX = nodeX + halfWidth + padding;\n var topEndY = topStartY;\n var intersection = cyMath.finiteLinesIntersect(x1, y1, x2, y2, topStartX, topStartY, topEndX, topEndY, false);\n if (intersection.length > 0) {\n straightLineIntersections = straightLineIntersections.concat(intersection);\n }\n }\n\n // Right segment, top to bottom\n {\n var rightStartX = nodeX + halfWidth + padding;\n var rightStartY = nodeY - halfHeight - padding;\n var rightEndX = rightStartX - halfWidth / 2;\n var rightEndY = nodeY + padding;\n var intersection = cyMath.finiteLinesIntersect(x1, y1, x2, y2, rightStartX, rightStartY, rightEndX, rightEndY, false);\n if (intersection.length > 0) {\n straightLineIntersections = straightLineIntersections.concat(intersection);\n }\n }\n\n // Left segment, top to bottom\n {\n var leftStartX = nodeX - halfWidth - padding;\n var leftStartY = nodeY - halfHeight - padding;\n var leftEndX = leftStartX + halfWidth / 2;\n var leftEndY = nodeY + padding;\n var intersection = cyMath.finiteLinesIntersect(x1, y1, x2, y2, leftStartX, leftStartY, leftEndX, leftEndY, false);\n if (intersection.length > 0) {\n straightLineIntersections = straightLineIntersections.concat(intersection);\n }\n }\n return straightLineIntersections;\n };\n\n //this function gives the intersections of any line with a round rectangle\n $$.sbgn.roundRectangleIntersectLine = function (x1, y1, x2, y2, nodeX, nodeY, width, height, cornerRadius, padding) {\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n\n // Check intersections with straight line segments\n var straightLineIntersections = [];\n // Top segment, left to right\n {\n var topStartX = nodeX - halfWidth + cornerRadius - padding;\n var topStartY = nodeY - halfHeight - padding;\n var topEndX = nodeX + halfWidth - cornerRadius + padding;\n var topEndY = topStartY;\n var intersection = cyMath.finiteLinesIntersect(x1, y1, x2, y2, topStartX, topStartY, topEndX, topEndY, false);\n if (intersection.length > 0) {\n straightLineIntersections = straightLineIntersections.concat(intersection);\n }\n }\n\n // Right segment, top to bottom\n {\n var rightStartX = nodeX + halfWidth + padding;\n var rightStartY = nodeY - halfHeight + cornerRadius - padding;\n var rightEndX = rightStartX;\n var rightEndY = nodeY + halfHeight - cornerRadius + padding;\n var intersection = cyMath.finiteLinesIntersect(x1, y1, x2, y2, rightStartX, rightStartY, rightEndX, rightEndY, false);\n if (intersection.length > 0) {\n straightLineIntersections = straightLineIntersections.concat(intersection);\n }\n }\n\n // Bottom segment, left to right\n {\n var bottomStartX = nodeX - halfWidth + cornerRadius - padding;\n var bottomStartY = nodeY + halfHeight + padding;\n var bottomEndX = nodeX + halfWidth - cornerRadius + padding;\n var bottomEndY = bottomStartY;\n var intersection = cyMath.finiteLinesIntersect(x1, y1, x2, y2, bottomStartX, bottomStartY, bottomEndX, bottomEndY, false);\n if (intersection.length > 0) {\n straightLineIntersections = straightLineIntersections.concat(intersection);\n }\n }\n\n // Left segment, top to bottom\n {\n var leftStartX = nodeX - halfWidth - padding;\n var leftStartY = nodeY - halfHeight + cornerRadius - padding;\n var leftEndX = leftStartX;\n var leftEndY = nodeY + halfHeight - cornerRadius + padding;\n var intersection = cyMath.finiteLinesIntersect(x1, y1, x2, y2, leftStartX, leftStartY, leftEndX, leftEndY, false);\n if (intersection.length > 0) {\n straightLineIntersections = straightLineIntersections.concat(intersection);\n }\n }\n\n // Check intersections with arc segments\n var arcIntersections;\n\n // Top Left\n {\n var topLeftCenterX = nodeX - halfWidth + cornerRadius;\n var topLeftCenterY = nodeY - halfHeight + cornerRadius;\n arcIntersections = cyMath.intersectLineCircle(x1, y1, x2, y2, topLeftCenterX, topLeftCenterY, cornerRadius + padding);\n\n // Ensure the intersection is on the desired quarter of the circle\n if (arcIntersections.length > 0 && arcIntersections[0] <= topLeftCenterX && arcIntersections[1] <= topLeftCenterY) {\n straightLineIntersections = straightLineIntersections.concat(arcIntersections);\n }\n }\n\n // Top Right\n {\n var topRightCenterX = nodeX + halfWidth - cornerRadius;\n var topRightCenterY = nodeY - halfHeight + cornerRadius;\n arcIntersections = cyMath.intersectLineCircle(x1, y1, x2, y2, topRightCenterX, topRightCenterY, cornerRadius + padding);\n\n // Ensure the intersection is on the desired quarter of the circle\n if (arcIntersections.length > 0 && arcIntersections[0] >= topRightCenterX && arcIntersections[1] <= topRightCenterY) {\n straightLineIntersections = straightLineIntersections.concat(arcIntersections);\n }\n }\n\n // Bottom Right\n {\n var bottomRightCenterX = nodeX + halfWidth - cornerRadius;\n var bottomRightCenterY = nodeY + halfHeight - cornerRadius;\n arcIntersections = cyMath.intersectLineCircle(x1, y1, x2, y2, bottomRightCenterX, bottomRightCenterY, cornerRadius + padding);\n\n // Ensure the intersection is on the desired quarter of the circle\n if (arcIntersections.length > 0 && arcIntersections[0] >= bottomRightCenterX && arcIntersections[1] >= bottomRightCenterY) {\n straightLineIntersections = straightLineIntersections.concat(arcIntersections);\n }\n }\n\n // Bottom Left\n {\n var bottomLeftCenterX = nodeX - halfWidth + cornerRadius;\n var bottomLeftCenterY = nodeY + halfHeight - cornerRadius;\n arcIntersections = cyMath.intersectLineCircle(x1, y1, x2, y2, bottomLeftCenterX, bottomLeftCenterY, cornerRadius + padding);\n\n // Ensure the intersection is on the desired quarter of the circle\n if (arcIntersections.length > 0 && arcIntersections[0] <= bottomLeftCenterX && arcIntersections[1] >= bottomLeftCenterY) {\n straightLineIntersections = straightLineIntersections.concat(arcIntersections);\n }\n }\n if (straightLineIntersections.length > 0) return straightLineIntersections;\n return []; // if nothing\n };\n $$.sbgn.intersectLineEllipse = function (x1, y1, x2, y2, centerX, centerY, width, height, padding) {\n var w = width / 2 + padding;\n var h = height / 2 + padding;\n var an = centerX;\n var bn = centerY;\n var d = [x2 - x1, y2 - y1];\n var m = d[1] / d[0];\n var n = -1 * m * x2 + y2;\n var a = h * h + w * w * m * m;\n var b = -2 * an * h * h + 2 * m * n * w * w - 2 * bn * m * w * w;\n var c = an * an * h * h + n * n * w * w - 2 * bn * w * w * n + bn * bn * w * w - h * h * w * w;\n var discriminant = b * b - 4 * a * c;\n if (discriminant < 0) {\n return [];\n }\n var t1 = (-b + Math.sqrt(discriminant)) / (2 * a);\n var t2 = (-b - Math.sqrt(discriminant)) / (2 * a);\n var xMin = Math.min(t1, t2);\n var xMax = Math.max(t1, t2);\n var yMin = m * xMin - m * x2 + y2;\n var yMax = m * xMax - m * x2 + y2;\n return [xMin, yMin, xMax, yMax];\n };\n $$.sbgn.intersectLineStateAndInfoBoxes = function (node, x, y) {\n var centerX = node._private.position.x;\n var centerY = node._private.position.y;\n var padding = parseInt(node.css('border-width')) / 2;\n var stateAndInfos = node._private.data.statesandinfos;\n var intersections = [];\n for (var i = 0; i < stateAndInfos.length; i++) {\n var state = stateAndInfos[i];\n if (!state.isDisplayed) {\n continue;\n }\n var infoBoxWidth = state.bbox.w;\n var infoBoxHeight = state.bbox.h;\n var currIntersections = null;\n if (state.clazz == \"state variable\") {\n var coord = classes.StateVariable.getAbsoluteCoord(state, node.cy());\n currIntersections = $$.sbgn.intersectLineEllipse(x, y, centerX, centerY, coord.x, coord.y, infoBoxWidth, infoBoxHeight, padding);\n } else if (state.clazz == \"residue variable\") {\n var coord = classes.ResidueVariable.getAbsoluteCoord(state, node.cy());\n currIntersections = $$.sbgn.intersectLineEllipse(x, y, centerX, centerY, coord.x, coord.y, infoBoxWidth, infoBoxHeight, padding);\n } else if (state.clazz == \"binding region\") {\n var coord = classes.BindingRegion.getAbsoluteCoord(state, node.cy());\n currIntersections = $$.sbgn.intersectLineEllipse(x, y, centerX, centerY, coord.x, coord.y, infoBoxWidth, infoBoxHeight, padding);\n } else if (state.clazz == \"unit of information\") {\n var coord = classes.UnitOfInformation.getAbsoluteCoord(state, node.cy());\n if (node.data(\"class\") == \"BA macromolecule\" || node.data(\"class\") == \"BA nucleic acid feature\" || node.data(\"class\") == \"BA complex\") {\n currIntersections = $$.sbgn.roundRectangleIntersectLine(x, y, centerX, centerY, coord.x, coord.y, infoBoxWidth, infoBoxHeight, 5, padding);\n } else if (node.data(\"class\") == \"BA unspecified entity\") {\n currIntersections = $$.sbgn.intersectLineEllipse(x, y, centerX, centerY, coord.x, coord.y, infoBoxWidth, infoBoxHeight, padding);\n } else if (node.data(\"class\") == \"BA simple chemical\") {\n currIntersections = cyMath.intersectLineCircle(x, y, centerX, centerY, coord.x, coord.y, infoBoxWidth / 4);\n } else if (node.data(\"class\") == \"BA perturbing agent\") {\n currIntersections = $$.sbgn.perturbingAgentIntersectLine(x, y, centerX, centerY, coord.x, coord.y, infoBoxWidth, infoBoxHeight, padding);\n } else {\n currIntersections = $$.sbgn.roundRectangleIntersectLine(x, y, centerX, centerY, coord.x, coord.y, infoBoxWidth, infoBoxHeight, 0, padding);\n }\n }\n intersections = intersections.concat(currIntersections);\n }\n return intersections;\n };\n $$.sbgn.checkPointStateAndInfoBoxes = function (x, y, node, threshold) {\n return classes.AuxiliaryUnit.checkPoint(x, y, node, threshold);\n };\n $$.sbgn.isNodeShapeTotallyOverriden = function (render, node) {\n if (totallyOverridenNodeShapes[render.getNodeShape(node)]) {\n return true;\n }\n return false;\n };\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2Jnbi1leHRlbnNpb25zL3NiZ24tY3ktcmVuZGVyZXIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOztBQUVBLElBQUlBLElBQUksR0FBR0MsbUdBQTZDLENBQUMsQ0FBQztBQUMxRCxJQUFJRSxNQUFNLEdBQUdDLENBQUMsR0FBR0osSUFBSSxDQUFDRyxNQUFNO0FBQzVCLElBQUlFLFNBQVMsR0FBR0wsSUFBSSxDQUFDSyxTQUFTO0FBRTlCLElBQUlDLE1BQU0sR0FBR0MsSUFBSSxHQUFHRixTQUFTLENBQUNFLElBQUk7QUFDbEMsSUFBSUMsZ0JBQWdCLEdBQUdILFNBQVMsQ0FBQ0ksY0FBYztBQUMvQyxJQUFJQyxpQkFBaUIsR0FBR0wsU0FBUyxDQUFDTSxlQUFlO0FBRWpELElBQUlDLE9BQU8sR0FBR1gsbUJBQU8sQ0FBQyx3REFBc0IsQ0FBQztBQUU3Q1ksTUFBTSxDQUFDQyxPQUFPLEdBQUcsWUFBWTtFQUMzQixJQUFJQyxFQUFFLEdBQUdWLFNBQVM7O0VBRWxCO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFVSxFQUFFLENBQUNDLElBQUksQ0FBQ0MsVUFBVSxHQUFHLFVBQUFDLElBQUEsRUFBa0Y7SUFBQSxJQUF2RUMsT0FBTyxHQUFBRCxJQUFBLENBQVBDLE9BQU87TUFBRUMsSUFBSSxHQUFBRixJQUFBLENBQUpFLElBQUk7TUFBRUMsV0FBVyxHQUFBSCxJQUFBLENBQVhHLFdBQVc7TUFBRUMsV0FBVyxHQUFBSixJQUFBLENBQVhJLFdBQVc7TUFBRUMsV0FBVyxHQUFBTCxJQUFBLENBQVhLLFdBQVc7TUFBRUMsYUFBYSxHQUFBTixJQUFBLENBQWJNLGFBQWE7SUFFakdILFdBQVcsR0FBR0EsV0FBVyxJQUFNRCxJQUFJLElBQUlLLFVBQVUsQ0FBRUwsSUFBSSxDQUFDTSxHQUFHLENBQUUsY0FBZSxDQUFFLENBQUc7SUFFakYsSUFBSUwsV0FBVyxHQUFHLENBQUMsRUFBRTtNQUNuQixJQUFJTSxhQUFh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QUFhLENBQUNHLE1BQU0sQ0FBRThJLGlCQUFrQixDQUFDO0lBRTNEO0lBRUEsT0FBT2pKLGFBQWE7RUFDdEIsQ0FBQztFQUVEckwsRUFBRSxDQUFDQyxJQUFJLENBQUNtTSwyQkFBMkIsR0FBRyxVQUFVekssQ0FBQyxFQUFFQyxDQUFDLEVBQUV2QixJQUFJLEVBQUU0TCxTQUFTLEVBQUU7SUFDckUsT0FBT3BNLE9BQU8sQ0FBQ2lWLGFBQWEsQ0FBQ2hJLFVBQVUsQ0FBQ25MLENBQUMsRUFBRUMsQ0FBQyxFQUFFdkIsSUFBSSxFQUFFNEwsU0FBUyxDQUFDO0VBQ2hFLENBQUM7RUFFRGpNLEVBQUUsQ0FBQ0MsSUFBSSxDQUFDOFUsMkJBQTJCLEdBQUcsVUFBVUMsTUFBTSxFQUFFM1UsSUFBSSxFQUFFO0lBQzVELElBQUl1RCwwQkFBMEIsQ0FBQ29SLE1BQU0sQ0FBQ0MsWUFBWSxDQUFDNVUsSUFBSSxDQUFDLENBQUMsRUFBRTtNQUN6RCxPQUFPLElBQUk7SUFDYjtJQUVBLE9BQU8sS0FBSztFQUNkLENBQUM7QUFDSCxDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2JnbnZpei8uL3NyYy9zYmduLWV4dGVuc2lvbnMvc2Jnbi1jeS1yZW5kZXJlci5qcz9mMmUyIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4gKiBSZW5kZXIgc2JnbiBzcGVjaWZpYyBzaGFwZXMgd2hpY2ggYXJlIG5vdCBzdXBwb3J0ZWQgYnkgY3l0b3NjYXBlLmpzIGNvcmVcbiAqL1xuXG52YXIgbGlicyA9IHJlcXVpcmUoJy4uL3V0aWxpdGllcy9saWItdXRpbGl0aWVzJykuZ2V0TGlicygpO1xudmFyIGpRdWVyeSA9ICQgPSBsaWJzLmpRdWVyeTtcbnZhciBjeXRvc2NhcGUgPSBsaWJzLmN5dG9zY2FwZTtcblxudmFyIGN5TWF0aCA9IG1hdGggPSBjeXRvc2NhcGUubWF0aDtcbnZhciBjeUJhc2VOb2RlU2hhcGVzID0gY3l0b3NjYXBlLmJhc2VOb2RlU2hhcGVzO1xudmFyIGN5U3R5bGVQcm9wZXJ0aWVzID0gY3l0b3NjYXBlLnN0eWxlUHJvcGVydGllcztcblxudmFyIGNsYXNzZXMgPSByZXF1aXJlKCcuLi91dGlsaXRpZXMvY2xhc3NlcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcbiAgdmFyICQkID0gY3l0b3NjYXBlO1xuXG4gIC8qXG4gICogVGFrZW4gZnJvbSBjeXRvc2NhcGUuanMgYW5kIG1vZGlmaWVkIHNvIHRoYXQgaXQgY2FuIGJlIHV0aWxpemVkIGZyb20gc2JnbnZpelxuICAqIGluIGEgZmxleGFibGUgd2F5LiBJdCBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgc2JnbnZpeiBzaGFwZXMgd291bGQgbmVlZCB0byBzdHJva2VcbiAgKiBib3JkZXIgbW9yZSB0aGFuIG9uY2UgYXMgdGhleSB3b3VsZCBoYXZlIGluZm9ib3hlcywgbXVsdGltZXJzIGV0Yy5cbiAgKiBFeHRlbmRzIHRoZSBzdHlsZSBwcm9wZXJ0aWVzIG9mIG5vZGUgd2l0aCB0aGUgZ2l2ZW4gb25lcyB0aGVuIHN0cm9rZXMgdGhlIGJvcmRlci5cbiAgKiBXb3VsZCBuZWVkZWQgdG8gYmUgc2xpZ2h0bHkgdXBkYXRlZCBkdXJpbmcgY3l0b3NjYXBlIHVwZ3JhZGVzIGlmIHJlbGF0ZWQgZnVuY3Rpb24gaW5cbiAgKiBDeXRvc2NhcGUuanMgaXMgdXBkYXRlZC4gSW5mb3JtYXRpb24gYWJvdXQgd2hlcmUgaXMgdGhlIHJlbGF0ZWQgZnVuY3Rpb24gaXMgbG9jYXRlZFxuICAqIGNhbiBiZSBmb3VuZCBpbiB0aGUgZmlsZSB0aGF0IGxpc3QgdGhlIGNoYW5nZXMgZG9uZSBpbiBpdmlzIGN5dG9zY2FwZSBmb3JrLlxuICAqL1xuICAkJC5zYmduLmRyYXdCb3JkZXIgPSBmdW5jdGlvbih7IGNvbnRleHQsIG5vZGUsIGJvcmRlcldpZHRoLCBib3JkZXJDb2xvciwgYm9yZGVyU3R5bGUsIGJvcmRlck9wYWNpdHkgfSkge1xuXG4gICAgYm9yZGVyV2lkdGggPSBib3JkZXJXaWR0aCB8fCAoIG5vZGUgJiYgcGFyc2VGbG9hdCggbm9kZS5jc3MoICdib3JkZXItd2lkdGgnICkgKSApO1xuXG4gICAgaWYoIGJvcmRlcldpZHRoID4gMCApe1xuICAgICAgdmFyIHBhcmVudE9wYWNpdHkgPSAoIG5vZGUgJiYgbm9kZS5lZmZlY3RpdmVPcGFjaXR5KCkgKSB8fCAxO1xuXG4gICAgICBcbiAgICAgIGJvcmRlclN0eWxlID0gYm9yZGVyU3R5bGUgfHwgKCBub2RlICYmIG5vZGUuY3NzKCAnYm9yZGVyLXN0eWxlJyApICk7XG4gICAgICBib3JkZXJDb2xvciA9IGJvcmRlckNvbG9yIHx8ICggbm9kZSAmJiBub2RlLmNzcyggJ2JvcmRlci1jb2xvcicgKSApO1xuICAgICAgYm9yZGVyT3BhY2l0eSA9IChcbiAgICAgICAgICBib3JkZXJPcGFjaXR5IHx8ICggbm9kZSAmJiBub2RlLmNzcyggJ2JvcmRlci1vcGFjaXR5JyApIClcbiAgICAgICAgKSAqIHBhcmVudE9wYWNpdHk7XG5cbiAgICAgIHZhciBwcm9wc1RvUmVzdG9yZSA9IFsgJ2xpbmVXaWR0aCcsICdsaW5lQ2FwJywgJ3N0cm9rZVN0eWxlJywgJ2dsb2JhbEFscGhhJyBdO1xuICAgICAgdmFyIGluaXRpYWxQcm9wcyA9IHt9O1xuXG4gICAgICBwcm9wc1RvUmVzdG9yZS5mb3JFYWNoKCBmdW5jdGlvbiggcHJvcE5hbWUgKSB7XG4gICAgICAgIGluaXRpYWxQcm9wc1sgcHJvcE5hbWUgXSA9IGNvbnRleHRbIHByb3BOYW1lIF07XG4gICAgICB9ICk7XG5cbiAgICAgIGNvbnRleHQubGluZVdpZHRoID0gYm9yZGVyV2lkdGg7XG4gICAgICBjb250ZXh0LmxpbmVDYXAgPSAnYnV0dCc7XG4gICAgICBjb250ZXh0LnN0cm9rZVN0eWxlID0gYm9yZGVyQ29sb3I7XG4gICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gYm9yZGVyT3BhY2l0eTtcblxuICAgICAgXG4gICAgICBpZiggY29udGV4dC5zZXRMaW5lRGFzaCApeyAvLyBmb3IgdmVyeSBvdXRvZmRhdGUgYnJvd3NlcnNcbiAgICAgICAgc3dpdGNoKCBib3JkZXJTdHlsZSApe1xuICAgICAgICAgIGNhc2UgJ2RvdHRlZCc6XG4gICAgICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKCBbIDEsIDEgXSApO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdkYXNoZWQnOlxuICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaCggWyA0LCAyIF0gKTtcbiAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgY2FzZSAnc29saWQnOlxuICAgICAgICAgIGNhc2UgJ2RvdWJsZSc6XG4gICAgICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKCBbIF0gKTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG5cbiAgICAgIGlmKCBib3JkZXJTdHlsZSA9PT0gJ2RvdWJsZScgKXtcbiAgICAgICAgY29udGV4dC5saW5lV2lkdGggPSBib3JkZXJXaWR0aCAvIDM7XG5cbiAgICAgICAgbGV0IGdjbyA9IGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uO1xuICAgICAgICBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9ICdkZXN0aW5hdGlvbi1vdXQnO1xuXG4gICAgICAgIGNvbnRleHQuc3Ryb2tlKCk7XG5cbiAgICAgICAgY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb24gPSBnY287XG4gICAgICB9XG5cbiAgICAgIC8vIHJlc2V0IGluIGNhc2Ugd2UgY2hhbmdlZCB0aGUgYm9yZGVyIHN0eWxlXG4gICAgICBpZiggY29udGV4dC5zZXRMaW5lRGFzaCApeyAvLyBmb3IgdmVyeSBvdXRvZmRhdGUgYnJvd3NlcnNcbiAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaCggWyBdICk7XG4gICAgICB9XG5cbiAgICAgIHByb3BzVG9SZXN0b3JlLmZvckVhY2goIGZ1bmN0aW9uKCBwcm9wTmFtZSApIHtcbiAgICAgICAgY29udGV4dFsgcHJvcE5hbWUgXSA9IGluaXRpYWxQcm9wc1sgcHJvcE5hbWUgXTtcbiAgICAgIH0gKTtcbiAgICB9XG4gIH07XG5cbiAgLy8gVGFrZW4gZnJvbSBjeXRvc2NhcGUuanMgYW5kIG1vZGlmaWVkXG4gIHZhciBkcmF3Um91bmRSZWN0YW5nbGVQYXRoID0gJCQuc2Jnbi5kcmF3Um91bmRSZWN0YW5nbGVQYXRoID0gZnVuY3Rpb24oXG4gICAgY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcmFkaXVzICl7XG4gICAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgICB2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7XG4gICAgdmFyIGNvcm5lclJhZGl1cyA9IHJhZGl1cyB8fCBjeU1hdGguZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMoIHdpZHRoLCBoZWlnaHQgKTtcblxuICAgIGlmKCBjb250ZXh0LmJlZ2luUGF0aCApeyBjb250ZXh0LmJlZ2luUGF0aCgpOyB9XG5cbiAgICAvLyBTdGFydCBhdCB0b3AgbWlkZGxlXG4gICAgY29udGV4dC5tb3ZlVG8oIHgsIHkgLSBoYWxmSGVpZ2h0ICk7XG4gICAgLy8gQXJjIGZyb20gbWlkZGxlIHRvcCB0byByaWdodCBzaWRlXG4gICAgY29udGV4dC5hcmNUbyggeCArIGhhbGZXaWR0aCwgeSAtIGhhbGZIZWlnaHQsIHggKyBoYWxmV2lkdGgsIHksIGNvcm5lclJhZGl1cyApO1xuICAgIC8vIEFyYyBmcm9tIHJpZ2h0IHNpZGUgdG8gYm90dG9tXG4gICAgY29udGV4dC5hcmNUbyggeCArIGhhbGZXaWR0aCwgeSArIGhhbGZIZWlnaHQsIHgsIHkgKyBoYWxmSGVpZ2h0LCBjb3JuZXJSYWRpdXMgKTtcbiAgICAvLyBBcmMgZnJvbSBib3R0b20gdG8gbGVmdCBzaWRlXG4gICAgY29udGV4dC5hcmNUbyggeCAtIGhhbGZXaWR0aCwgeSArIGhhbGZIZWlnaHQsIHggLSBoYWxmV2lkdGgsIHksIGNvcm5lclJhZGl1cyApO1xuICAgIC8vIEFyYyBmcm9tIGxlZnQgc2lkZSB0byB0b3BCb3JkZXJcbiAgICBjb250ZXh0LmFyY1RvKCB4IC0gaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCwgeCwgeSAtIGhhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyApO1xuICAgIC8vIEpvaW4gbGluZVxuICAgIGNvbnRleHQubGluZVRvKCB4LCB5IC0gaGFsZkhlaWdodCApO1xuXG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcblxuXG4gICAgLy9jb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAvL2NvbnRleHQuYmVnaW5QYXRoKClcblxuICB9O1xuXG5cbiAgdmFyIGRyYXdQcm90ZWluUGF0aCA9ICQkLnNiZ24uZHJhd1Byb3RlaW4gPSBmdW5jdGlvbihcbiAgICBjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBhY3RpdmVQYWRkaW5nMSAgKXtcbiAgICB2YXIgaGFsZldpZHRoID0gKHdpZHRoKyBhY3RpdmVQYWRkaW5nMSkgLyAyO1xuICAgIHZhciBoYWxmSGVpZ2h0ID0gKGhlaWdodCArIGFjdGl2ZVBhZGRpbmcxKSAvIDI7XG4gICAgdmFyIGNvcm5lclJhZGl1cyA9ICBjeU1hdGguZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMoIHdpZHRoLCBoZWlnaHQgKTtcblxuICAgIGlmKCBjb250ZXh0LmJlZ2luUGF0aCApeyBjb250ZXh0LmJlZ2luUGF0aCgpOyB9XG5cbiAgICAvLyBTdGFydCBhdCB0b3AgbWlkZGxlXG4gICAgY29udGV4dC5tb3ZlVG8oIHgsIHkgLSBoYWxmSGVpZ2h0ICk7XG4gICAgLy8gQXJjIGZyb20gbWlkZGxlIHRvcCB0byByaWdodCBzaWRlXG4gICAgY29udGV4dC5hcmNUbyggeCArIGhhbGZXaWR0aCwgeSAtIGhhbGZIZWlnaHQsIHggKyBoYWxmV2lkdGgsIHksIGNvcm5lclJhZGl1cyApO1xuICAgIC8vIEFyYyBmcm9tIHJpZ2h0IHNpZGUgdG8gYm90dG9tXG4gICAgY29udGV4dC5hcmNUbyggeCArIGhhbGZXaWR0aCwgeSArIGhhbGZIZWlnaHQsIHgsIHkgKyBoYWxmSGVpZ2h0LCBjb3JuZXJSYWRpdXMgKTtcbiAgICAvLyBBcmMgZnJvbSBib3R0b20gdG8gbGVmdCBzaWRlXG4gICAgY29udGV4dC5hcmNUbyggeCAtIGhhbGZXaWR0aCwgeSArIGhhbGZIZWlnaHQsIHggLSBoYWxmV2lkdGgsIHksIGNvcm5lclJhZGl1cyApO1xuICAgIC8vIEFyYyBmcm9tIGxlZnQgc2lkZSB0byB0b3BCb3JkZXJcbiAgICBjb250ZXh0LmFyY1RvKCB4IC0gaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCwgeCwgeSAtIGhhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyApO1xuICAgIC8vIEpvaW4gbGluZVxuICAgIGNvbnRleHQubGluZVRvKCB4LCB5IC0gaGFsZkhlaWdodCApO1xuXG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcblxuXG4gICAgLy9jb250ZXh0LmNsZWFyUmVjdCgwLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAvL2NvbnRleHQuYmVnaW5QYXRoKClcblxuICB9O1xuXG5cbiAgdmFyIGRyYXdSZWNlcHRvclBhdGggPSAkJC5zYmduLmRyYXdSZWNlcHRvciA9IGZ1bmN0aW9uKFxuICAgIGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGFjdGl2ZVBhZGRpbmcxICApe1xuICAgIHZhciBoYWxmUGFkZGluZyAgPSBhY3RpdmVQYWRkaW5nMT8gYWN0aXZlUGFkZGluZzEvMjogMDtcbiAgICAvL3ZhciBwb2ludHM9IFstMSwgLTEsICAgMCwgLTAuNSwgICAxLCAtMSwgICAxLCAwLjUsICAgMCwgMSwgICAtMSwgIDAuNSBdO1xuICAgIHZhciBoYWxmVyA9IHdpZHRoIC8gMjtcbiAgICB2YXIgaGFsZkggPSBoZWlnaHQgLyAyO1xuICAgIFxuXG4gICAgaWYoIGNvbnRleHQuYmVnaW5QYXRoICl7IGNvbnRleHQuYmVnaW5QYXRoKCk7IH1cblxuICAgIGNvbnRleHQubW92ZVRvKCB4ICsgaGFsZlcgKiAoLTEpIC0gaGFsZlBhZGRpbmcsIHkgKyBoYWxmSCAqICgtMSkgLSAzKmhhbGZQYWRkaW5nLzIpXG4gICAgY29udGV4dC5saW5lVG8oIHggKyBoYWxmVyAqICgwKSwgeSArIGhhbGZIICogKC0wLjUpIC0gMypoYWxmUGFkZGluZy8yKVxuICAgIGNvbnRleHQubGluZVRvKCB4ICsgaGFsZlcgKiAoMSkgKyBoYWxmUGFkZGluZywgeSArIGhhbGZIICogKC0xKSAtIDMqaGFsZlBhZGRpbmcvMilcbiAgICBjb250ZXh0LmxpbmVUbyggeCArIGhhbGZXICogKDEpICsgaGFsZlBhZGRpbmcsIHkgKyBoYWxmSCAqICgwLjUpICsgaGFsZlBhZGRpbmcpXG4gICAgY29udGV4dC5saW5lVG8oIHggKyBoYWxmVyAqICgwKSwgeSArIGhhbGZIICogKDEpICsgMypoYWxmUGFkZGluZy8yKVxuICAgIGNvbnRleHQubGluZVRvKCB4ICsgaGFsZlcgKiAoLTEpIC0gaGFsZlBhZGRpbmcsIHkgKyBoYWxmSCAqICgwLjUpICsgaGFsZlBhZGRpbmcpXG5cbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuXG4gIH07XG5cbiAgdmFyIGRyYXdSb3VuZGVkRHJ1Z1BhdGg9ICQkLnNiZ24uZHJhd1JvdW5kZWREcnVnID0gZnVuY3Rpb24oXG4gICAgY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcmFkaXVzIClcbiAgICB7XG4gICAgICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICAgICAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuICAgICAgdmFyIGNvcm5lclJhZGl1cyA9IE1hdGgubWluKGhhbGZXaWR0aCwgaGFsZkhlaWdodCk7XG5cbiAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG5cbiAgICAgIC8vIFN0YXJ0IGF0IHRvcCBtaWRkbGVcbiAgICAgIGNvbnRleHQubW92ZVRvKHgsIHktaGFsZkhlaWdodCk7XG4gICAgICAvLyBBcmMgZnJvbSBtaWRkbGUgdG9wIHRvIHJpZ2h0IHNpZGVcbiAgICAgIGNvbnRleHQuYXJjVG8oeCtoYWxmV2lkdGgsIHktaGFsZkhlaWdodCwgeCtoYWxmV2lkdGgsIHksIGNvcm5lclJhZGl1cyk7XG4gICAgICAvLyBBcmMgZnJvbSByaWdodCBzaWRlIHRvIGJvdHRvbVxuICAgICAgY29udGV4dC5hcmNUbyh4K2hhbGZXaWR0aCwgeStoYWxmSGVpZ2h0LCB4LCB5K2hhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyk7XG4gICAgICAvLyBBcmMgZnJvbSBib3R0b20gdG8gbGVmdCBzaWRlXG4gICAgICBjb250ZXh0LmFyY1RvKHgtaGFsZldpZHRoLCB5K2hhbGZIZWlnaHQsIHgtaGFsZldpZHRoLCB5LCBjb3JuZXJSYWRpdXMpO1xuICAgICAgLy8gQXJjIGZyb20gbGVmdCBzaWRlIHRvIHRvcEJvcmRlclxuICAgICAgY29udGV4dC5hcmNUbyh4LWhhbGZXaWR0aCwgeS1oYWxmSGVpZ2h0LCB4LCB5LWhhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyk7XG4gICAgICAvLyBKb2luIGxpbmVcbiAgICAgIGNvbnRleHQubGluZVRvKHgsIHktaGFsZkhlaWdodCk7XG5cbiAgICAgIHZhciBoYWxmV2lkdGhJbm5lciA9IHdpZHRoIC8gMiAtIDU7XG4gICAgICB2YXIgaGFsZkhlaWdodElubmVyID0gaGVpZ2h0IC8gMiAtIDU7XG4gICAgICB2YXIgY29ybmVyUmFkaXVzID0gTWF0aC5taW4oIGhhbGZXaWR0aElubmVyLCBoYWxmSGVpZ2h0SW5uZXIgKTtcblxuICAgICAgLy8gU3RhcnQgYXQgdG9wIG1pZGRsZVxuICAgICAgY29udGV4dC5tb3ZlVG8oeCwgeS1oYWxmSGVpZ2h0SW5uZXIpO1xuICAgICAgLy8gQXJjIGZyb20gbWlkZGxlIHRvcCB0byByaWdodCBzaWRlXG4gICAgICBjb250ZXh0LmFyY1RvKHgraGFsZldpZHRoSW5uZXIsIHktaGFsZkhlaWdodElubmVyLCB4K2hhbGZXaWR0aElubmVyLCB5LCBjb3JuZXJSYWRpdXMpO1xuICAgICAgLy8gQXJjIGZyb20gcmlnaHQgc2lkZSB0byBib3R0b21cbiAgICAgIGNvbnRleHQuYXJjVG8oeCtoYWxmV2lkdGhJbm5lciwgeStoYWxmSGVpZ2h0SW5uZXIsIHgsIHkraGFsZkhlaWdodElubmVyLCBjb3JuZXJSYWRpdXMpO1xuICAgICAgLy8gQXJjIGZyb20gYm90dG9tIHRvIGxlZnQgc2lkZVxuICAgICAgY29udGV4dC5hcmNUbyh4LWhhbGZXaWR0aElubmVyLCB5K2hhbGZIZWlnaHRJbm5lciwgeC1oYWxmV2lkdGhJbm5lciwgeSwgY29ybmVyUmFkaXVzKTtcbiAgICAgIC8vIEFyYyBmcm9tIGxlZnQgc2lkZSB0byB0b3BCb3JkZXJcbiAgICAgIGNvbnRleHQuYXJjVG8oeC1oYWxmV2lkdGhJbm5lciwgeS1oYWxmSGVpZ2h0SW5uZXIsIHgsIHktaGFsZkhlaWdodElubmVyLCBjb3JuZXJSYWRpdXMpO1xuICAgICAgLy8gSm9pbiBsaW5lXG4gICAgICBjb250ZXh0LmxpbmVUbyh4LCB5LWhhbGZIZWlnaHRJbm5lcik7XG5cbiAgICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIH07XG4gIFxuICAvLyBUYWtlbiBmcm9tIGN5dG9zY2FwZS5qc1xuICB2YXIgZHJhd1BvbHlnb25QYXRoID0gZnVuY3Rpb24oXG4gICAgY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcG9pbnRzICl7XG5cbiAgICB2YXIgaGFsZlcgPSB3aWR0aCAvIDI7XG4gICAgdmFyIGhhbGZIID0gaGVpZ2h0IC8gMjtcblxuICAgIGlmKCBjb250ZXh0LmJlZ2luUGF0aCApeyBjb250ZXh0LmJlZ2luUGF0aCgpOyB9XG5cbiAgICBjb250ZXh0Lm1vdmVUbyggeCArIGhhbGZXICogcG9pbnRzWzBdLCB5ICsgaGFsZkggKiBwb2ludHNbMV0gKTtcblxuICAgIGZvciggdmFyIGkgPSAxOyBpIDwgcG9pbnRzLmxlbmd0aCAvIDI7IGkrKyApe1xuICAgICAgY29udGV4dC5saW5lVG8oIHggKyBoYWxmVyAqIHBvaW50c1sgaSAqIDJdLCB5ICsgaGFsZkggKiBwb2ludHNbIGkgKiAyICsgMV0gKTtcbiAgICB9XG5cbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICB9O1xuICBcbiAgdmFyIHNiZ25TaGFwZXMgPSAkJC5zYmduLnNiZ25TaGFwZXMgPSB7XG4gICAgJ2VtcHR5IHNldCc6IHRydWUsXG4gICAgJ251Y2xlaWMgYWNpZCBmZWF0dXJlJzogdHJ1ZSxcbiAgICAnY29tcGxleCc6IHRydWUsXG4gICAgJ21hY3JvbW9sZWN1bGUnOiB0cnVlLFxuICAgICdzaW1wbGUgY2hlbWljYWwnOiB0cnVlLFxuICAgICdiaW9sb2dpY2FsIGFjdGl2aXR5JzogdHJ1ZSxcbiAgICAnY29tcGFydG1lbnQnOiB0cnVlLFxuICAgICdnZW5lJzogdHJ1ZSxcbiAgICAncm5hJzogdHJ1ZSxcbiAgICAnc2ltcGxlIG1vbGVjdWxlJzogdHJ1ZSxcbiAgICAndW5rbm93biBtb2xlY3VsZSc6IHRydWUsXG4gICAgJ2RydWcnOiB0cnVlLFxuICAgICd0cnVuY2F0ZWQgcHJvdGVpbic6IHRydWUsXG4gICAgJ2lvbiBjaGFubmVsJzogdHJ1ZSxcbiAgICAncmVjZXB0b3InOiB0cnVlLFxuICAgICdpb24nOiB0cnVlLFxuICAgICdwaGVub3R5cGUgc2JtbCc6IHRydWUsXG4gICAgJ2NvbXBsZXggc2JtbCc6IHRydWUsXG4gICAgJ3Byb3RlaW4nOiB0cnVlLFxuICAgICdkZWdyYWRhdGlvbic6IHRydWVcbiAgfTtcblxuICB2YXIgdG90YWxseU92ZXJyaWRlbk5vZGVTaGFwZXMgPSAkJC5zYmduLnRvdGFsbHlPdmVycmlkZW5Ob2RlU2hhcGVzID0ge1xuICAgICdtYWNyb21vbGVjdWxlJzogdHJ1ZSxcbiAgICAnbnVjbGVpYyBhY2lkIGZlYXR1cmUnOiB0cnVlLFxuICAgICdzaW1wbGUgY2hlbWljYWwnOiB0cnVlLFxuICAgICdjb21wbGV4JzogdHJ1ZSxcbiAgICAnYmlvbG9naWNhbCBhY3Rpdml0eSc6IHRydWUsXG4gICAgJ2NvbXBhcnRtZW50JzogdHJ1ZSxcbiAgICAncHJvdGVpbic6dHJ1ZSxcbiAgICAnZ2VuZSc6dHJ1ZSxcbiAgICAncm5hJzp0cnVlLFxuICAgICdyZWNlcHRvcic6IHRydWUsXG4gICAgJ2lvbiBjaGFubmVsJzogdHJ1ZSxcbiAgICAndHJ1bmNhdGVkIHByb3RlaW4nOiB0cnVlLFxuICAgICdwaGVub3R5cGUgc2JtbCc6IHRydWUsXG4gICAgJ2lvbic6IHRydWUsXG4gICAgJ3NpbXBsZSBtb2xlY3VsZSc6IHRydWUsXG4gICAgJ3Vua25vd24gbW9sZWN1bGUnOiB0cnVlLFxuICAgICdkcnVnJzogdHJ1ZSxcbiAgICAnY29tcGxleCBzYm1sJzogdHJ1ZVxuICB9O1xuXG4gIHZhciBjYW5IYXZlSW5mb0JveFNoYXBlcyA9ICQkLnNiZ24uY2FuSGF2ZUluZm9Cb3hTaGFwZXMgPSB7XG4gICAgJ3NpbXBsZSBjaGVtaWNhbCc6IHRydWUsXG4gICAgJ21hY3JvbW9sZWN1bGUnOiB0cnVlLFxuICAgICdudWNsZWljIGFjaWQgZmVhdHVyZSc6IHRydWUsXG4gICAgJ2NvbXBsZXgnOiB0cnVlLFxuICAgICdiaW9sb2dpY2FsIGFjdGl2aXR5JzogdHJ1ZSxcbiAgICAnY29tcGFydG1lbnQnOiB0cnVlLFxuICAgICdwcm90ZWluJzogdHJ1ZSxcbiAgICAncmVjZXB0b3InOiB0cnVlLFxuICAgICd0cnVuY2F0ZWQgcHJvdGVpbic6IHRydWUsXG4gICAgJ2lvbiBjaGFubmVsJzogdHJ1ZSxcbiAgICAnY29tcGxleCBzYm1sJzogdHJ1ZSxcbiAgICAnZ2VuZSc6IHRydWUsXG4gICAgJ3JuYSc6IHRydWUsXG4gICAgJ3NpbXBsZSBtb2xlY3VsZSc6IHRydWUsXG4gICAgJ3Vua25vd24gbW9sZWN1bGUnOiB0cnVlLFxuICAgICdwaGVub3R5cGUgc2JtbCc6IHRydWUsXG4gICAgJ2RydWcnOiB0cnVlLFxuICAgICdpb24nOiB0cnVlLFxuICAgICdkZWdyYWRhdGlvbic6IHRydWVcbiAgfTtcblxuICB2YXIgY2FuQmVNdWx0aW1lclNoYXBlcyA9ICQkLnNiZ24uY2FuQmVNdWx0aW1lclNoYXBlcyA9IHtcbiAgICAnbWFjcm9tb2xlY3VsZSc6IHRydWUsXG4gICAgJ2NvbXBsZXgnOiB0cnVlLFxuICAgICdudWNsZWljIGFjaWQgZmVhdHVyZSc6IHRydWUsXG4gICAgJ3NpbXBsZSBjaGVtaWNhbCc6IHRydWUsXG4gICAgJ3JlY2VwdG9yJzogdHJ1ZSxcbiAgICAnaW9uIGNoYW5uZWwnOiB0cnVlLFxuICAgICd0cnVuY2F0ZWQgcHJvdGVpbic6IHRydWUsXG4gICAgJ2dlbmUnOiB0cnVlLFxuICAgICdybmEnOiB0cnVlLFxuICAgICdwaGVub3R5cGUnOiB0cnVlLFxuICAgICdpb24nOiB0cnVlLFxuICAgICdzaW1wbGUgbW9sZWN1bGUnOiB0cnVlLFxuICAgICd1bmtub3duIG1vbGVjdWxlJzogdHJ1ZSxcbiAgICAnZHJ1Zyc6IHRydWUsXG4gICAgJ3BoZW5vdHlwZSBzYm1sJzogdHJ1ZSxcbiAgICAnY29tcGxleCBzYm1sJzogdHJ1ZSxcbiAgICAncHJvdGVpbic6IHRydWVcbiAgfTtcblxuICB2YXIgY2FuQmVBY3RpdmVTaGFwZXMgPSAkJC5zYmduLmNhbkJlQWN0aXZlU2hhcGVzID0ge1xuICAgICAgJ3Byb3RlaW4nOiB0cnVlLFxuICAgICAgJ2NvbXBsZXggc2JtbCc6IHRydWUsXG4gICAgICAncmVjZXB0b3InOiB0cnVlLFxuICAgICAgJ2lvbiBjaGFubmVsJzogdHJ1ZSxcbiAgICAgICd0cnVuY2F0ZWQgcHJvdGVpbic6IHRydWVcbiAgfTtcblxuICB2YXIgY2FuQmVIeXBvdGhldGljYWxTaGFwZXMgPSAkJC5zYmduLmNhbkJlSHlwb3RoZXRpY2FsU2hhcGVzID0ge1xuICAgICdwcm90ZWluJzogdHJ1ZSxcbiAgICAnY29tcGxleCBzYm1sJzogdHJ1ZSxcbiAgICAncmVjZXB0b3InOiB0cnVlLFxuICAgICdpb24gY2hhbm5lbCc6IHRydWUsXG4gICAgJ3RydW5jYXRlZCBwcm90ZWluJzogdHJ1ZSxcbiAgICAnZ2VuZSc6IHRydWUsXG4gICAgJ3JuYSc6IHRydWUsXG4gICAgJ3BoZW5vdHlwZSBzYm1sJzogdHJ1ZSxcbiAgICAnaW9uJzogdHJ1ZSxcbiAgICAnc2ltcGxlIG1vbGVjdWxlJzogdHJ1ZSxcbiAgICAndW5rbm93biBtb2xlY3VsZSc6IHRydWUsXG4gICAgJ2RydWcnOiB0cnVlLFxuICAgICdkZWdyYWRhdGlvbic6IHRydWVcbn07XG5cbiAgY3lNYXRoLmNhbGN1bGF0ZURpc3RhbmNlID0gZnVuY3Rpb24gKHBvaW50MSwgcG9pbnQyKSB7XG4gICAgdmFyIGRpc3RhbmNlID0gTWF0aC5wb3cocG9pbnQxWzBdIC0gcG9pbnQyWzBdLCAyKSArIE1hdGgucG93KHBvaW50MVsxXSAtIHBvaW50MlsxXSwgMik7XG4gICAgcmV0dXJuIE1hdGguc3FydChkaXN0YW5jZSk7XG4gIH07XG5cbiAgJCQuc2Jnbi5jb2xvcnMgPSB7XG4gICAgY2xvbmU6IFwiIzgzODM4M1wiXG4gIH07XG4gIFxuXG4gICQkLnNiZ24uZ2V0RGVmYXVsdENvbXBsZXhDb3JuZXJMZW5ndGggPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gMjQ7XG4gIH07XG5cbiAgJCQuc2Jnbi5nZXREZWZhdWx0R2VuZUNvcm5lckxlbmd0aCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAyNDtcbiAgfTtcblxuICAkJC5zYmduLmRyYXdTdGF0ZUFuZEluZm9zID0gZnVuY3Rpb24gKG5vZGUsIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclkpIHtcbiAgICB2YXIgbGF5b3V0cyA9IG5vZGUuZGF0YSgnYXV4dW5pdGxheW91dHMnKTtcblxuICAgIGZvciAodmFyIHNpZGUgaW4gbGF5b3V0cykge1xuICAgICAgdmFyIGxheW91dCA9IGxheW91dHNbc2lkZV07XG4gICAgICBjbGFzc2VzLkF1eFVuaXRMYXlvdXQuZHJhdyhsYXlvdXQsIG5vZGUuY3koKSwgY29udGV4dCk7XG4gICAgfVxuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgfTtcblxuICAkJC5zYmduLmRyYXdJbmZvQm94ID0gZnVuY3Rpb24oY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgc2hhcGVOYW1lKSB7XG4gICAgc3dpdGNoIChzaGFwZU5hbWUpIHtcbiAgICAgIGNhc2UgJ3JvdW5kcmVjdGFuZ2xlJzpcbiAgICAgICAgY3lCYXNlTm9kZVNoYXBlc1sncm91bmRyZWN0YW5nbGUnXS5kcmF3KGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2JvdHRvbXJvdW5kcmVjdGFuZ2xlJzpcbiAgICAgICAgJCQuc2Jnbi5kcmF3Qm90dG9tUm91bmRSZWN0YW5nbGUoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZWxsaXBzZSc6XG4gICAgICAgIGN5QmFzZU5vZGVTaGFwZXNbJ2VsbGlwc2UnXS5kcmF3KGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ2NvbXBsZXgnOlxuICAgICAgICAkJC5zYmduLmRyYXdDb21wbGV4KCBjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBoZWlnaHQgLyAyICk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncGVydHVyYmluZyBhZ2VudCc6XG4gICAgICAgIHZhciBwb2ludHMgPSAkJC5zYmduLmdlbmVyYXRlUGVydHVyYmluZ0FnZW50UG9pbnRzKCk7XG4gICAgICAgIGRyYXdQb2x5Z29uUGF0aChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBwb2ludHMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ3JlY3RhbmdsZSc6XG4gICAgICAgIGN5QmFzZU5vZGVTaGFwZXNbJ3JlY3RhbmdsZSddLmRyYXcoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnc3RhZGl1bSc6XG4gICAgICAgICQkLnNiZ24uZHJhd1JvdW5kUmVjdGFuZ2xlUGF0aChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBNYXRoLm1pbih3aWR0aCAvIDIsIGhlaWdodCAvIDIsIDE1KSk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfTtcblxuICAvLyAkJC5zYmduLkFmU2hhcGVBcmdzRm4gPSBmdW5jdGlvbiAoc2VsZil7XG5cdC8vICAgcmV0dXJuIFtzZWxmLmJib3gudywgc2VsZi5iYm94LmgsIGNsYXNzZXMuZ2V0QXV4VW5pdENsYXNzKHNlbGYpLmdldFBhcmVudChzZWxmKS5kYXRhKFwiY2xhc3NcIildO1xuICAvLyB9XG5cblxuICAkJC5zYmduLm51Y2xlaWNBY2lkQ2hlY2tQb2ludCA9IGZ1bmN0aW9uICh4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZLCBwb2ludHMsIGNvcm5lclJhZGl1cykge1xuXG4gICAgLy9jaGVjayByZWN0YW5nbGUgYXQgdG9wXG4gICAgaWYgKGN5TWF0aC5wb2ludEluc2lkZVBvbHlnb24oeCwgeSwgcG9pbnRzLFxuICAgICAgICAgICAgY2VudGVyWCwgY2VudGVyWSAtIGNvcm5lclJhZGl1cyAvIDIsIHdpZHRoLCBoZWlnaHQgLSBjb3JuZXJSYWRpdXMgLyAzLCBbMCwgLTFdLFxuICAgICAgICAgICAgcGFkZGluZykpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vY2hlY2sgcmVjdGFuZ2xlIGF0IGJvdHRvbVxuICAgIGlmIChjeU1hdGgucG9pbnRJbnNpZGVQb2x5Z29uKHgsIHksIHBvaW50cyxcbiAgICAgICAgICAgIGNlbnRlclgsIGNlbnRlclkgKyBoZWlnaHQgLyAyIC0gY29ybmVyUmFkaXVzIC8gMiwgd2lkdGggLSAyICogY29ybmVyUmFkaXVzLCBjb3JuZXJSYWRpdXMsIFswLCAtMV0sXG4gICAgICAgICAgICBwYWRkaW5nKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy9jaGVjayBlbGxpcHNlc1xuICAgIHZhciBjaGVja0luRWxsaXBzZSA9IGZ1bmN0aW9uICh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nKSB7XG4gICAgICB4IC09IGNlbnRlclg7XG4gICAgICB5IC09IGNlbnRlclk7XG5cbiAgICAgIHggLz0gKHdpZHRoIC8gMiArIHBhZGRpbmcpO1xuICAgICAgeSAvPSAoaGVpZ2h0IC8gMiArIHBhZGRpbmcpO1xuXG4gICAgICByZXR1cm4gKE1hdGgucG93KHgsIDIpICsgTWF0aC5wb3coeSwgMikgPD0gMSk7XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgYm90dG9tIHJpZ2h0IHF1YXJ0ZXIgY2lyY2xlXG4gICAgaWYgKGNoZWNrSW5FbGxpcHNlKHgsIHksXG4gICAgICAgICAgICBjZW50ZXJYICsgd2lkdGggLyAyIC0gY29ybmVyUmFkaXVzLFxuICAgICAgICAgICAgY2VudGVyWSArIGhlaWdodCAvIDIgLSBjb3JuZXJSYWRpdXMsXG4gICAgICAgICAgICBjb3JuZXJSYWRpdXMgKiAyLCBjb3JuZXJSYWRpdXMgKiAyLCBwYWRkaW5nKSkge1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBib3R0b20gbGVmdCBxdWFydGVyIGNpcmNsZVxuICAgIGlmIChjaGVja0luRWxsaXBzZSh4LCB5LFxuICAgICAgICAgICAgY2VudGVyWCAtIHdpZHRoIC8gMiArIGNvcm5lclJhZGl1cyxcbiAgICAgICAgICAgIGNlbnRlclkgKyBoZWlnaHQgLyAyIC0gY29ybmVyUmFkaXVzLFxuICAgICAgICAgICAgY29ybmVyUmFkaXVzICogMiwgY29ybmVyUmFkaXVzICogMiwgcGFkZGluZykpIHtcblxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gIC8vd2UgbmVlZCB0byBmb3JjZSBvcGFjaXR5IHRvIDEgc2luY2Ugd2UgbWlnaHQgaGF2ZSBzdGF0ZSBhbmQgaW5mbyBib3hlcy5cbiAgLy9oYXZpbmcgb3BhcXVlIG5vZGVzIHdoaWNoIGhhdmUgc3RhdGUgYW5kIGluZm8gYm94ZXMgZ2l2ZXMgdW5wbGVhc2VudCByZXN1bHRzLlxuICAkJC5zYmduLmZvcmNlT3BhY2l0eVRvT25lID0gZnVuY3Rpb24gKG5vZGUsIGNvbnRleHQpIHtcbiAgICB2YXIgcGFyZW50T3BhY2l0eSA9IG5vZGUuZWZmZWN0aXZlT3BhY2l0eSgpO1xuICAgIGlmIChwYXJlbnRPcGFjaXR5ID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29udGV4dC5maWxsU3R5bGUgPSBcInJnYmEoXCJcbiAgICAgICAgICAgICsgbm9kZS5fcHJpdmF0ZS5zdHlsZVtcImJhY2tncm91bmQtY29sb3JcIl0udmFsdWVbMF0gKyBcIixcIlxuICAgICAgICAgICAgKyBub2RlLl9wcml2YXRlLnN0eWxlW1wiYmFja2dyb3VuZC1jb2xvclwiXS52YWx1ZVsxXSArIFwiLFwiXG4gICAgICAgICAgICArIG5vZGUuX3ByaXZhdGUuc3R5bGVbXCJiYWNrZ3JvdW5kLWNvbG9yXCJdLnZhbHVlWzJdICsgXCIsXCJcbiAgICAgICAgICAgICsgKDEgKiBub2RlLmNzcygnb3BhY2l0eScpICogcGFyZW50T3BhY2l0eSkgKyBcIilcIjtcbiAgfTtcblxuICAkJC5zYmduLmRyYXdTaW1wbGVDaGVtaWNhbFBhdGggPSBmdW5jdGlvbiAoXG4gICAgICAgICAgY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuXG4gICAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgICB2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7XG4gICAgLy92YXIgY29ybmVyUmFkaXVzID0gJCQubWF0aC5nZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyh3aWR0aCwgaGVpZ2h0KTtcbiAgICB2YXIgY29ybmVyUmFkaXVzID0gTWF0aC5taW4oaGFsZldpZHRoLCBoYWxmSGVpZ2h0KTtcblxuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG5cbiAgICAvLyBTdGFydCBhdCB0b3AgbWlkZGxlXG4gICAgY29udGV4dC5tb3ZlVG8oeCwgeS1oYWxmSGVpZ2h0KTtcbiAgICAvLyBBcmMgZnJvbSBtaWRkbGUgdG9wIHRvIHJpZ2h0IHNpZGVcbiAgICBjb250ZXh0LmFyY1RvKHgraGFsZldpZHRoLCB5LWhhbGZIZWlnaHQsIHgraGFsZldpZHRoLCB5LCBjb3JuZXJSYWRpdXMpO1xuICAgIC8vIEFyYyBmcm9tIHJpZ2h0IHNpZGUgdG8gYm90dG9tXG4gICAgY29udGV4dC5hcmNUbyh4K2hhbGZXaWR0aCwgeStoYWxmSGVpZ2h0LCB4LCB5K2hhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyk7XG4gICAgLy8gQXJjIGZyb20gYm90dG9tIHRvIGxlZnQgc2lkZVxuICAgIGNvbnRleHQuYXJjVG8oeC1oYWxmV2lkdGgsIHkraGFsZkhlaWdodCwgeC1oYWxmV2lkdGgsIHksIGNvcm5lclJhZGl1cyk7XG4gICAgLy8gQXJjIGZyb20gbGVmdCBzaWRlIHRvIHRvcEJvcmRlclxuICAgIGNvbnRleHQuYXJjVG8oeC1oYWxmV2lkdGgsIHktaGFsZkhlaWdodCwgeCwgeS1oYWxmSGVpZ2h0LCBjb3JuZXJSYWRpdXMpO1xuICAgIC8vIEpvaW4gbGluZVxuICAgIGNvbnRleHQubGluZVRvKHgsIHktaGFsZkhlaWdodCk7XG5cbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuXG4gIH07XG5cbiAgJCQuc2Jnbi5kcmF3U2ltcGxlQ2hlbWljYWwgPSBmdW5jdGlvbiAoXG4gICAgICAgICAgY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICAgICQkLnNiZ24uZHJhd1NpbXBsZUNoZW1pY2FsUGF0aChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgfTtcblxuICBmdW5jdGlvbiBzaW1wbGVDaGVtaWNhbExlZnRDbG9uZShjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNsb25lTWFya2VyLCBvcGFjaXR5KSB7XG4gICAgaWYgKGNsb25lTWFya2VyICE9IG51bGwpIHtcbiAgICAgIHZhciBvbGRHbG9iYWxBbHBoYSA9IGNvbnRleHQuZ2xvYmFsQWxwaGE7XG4gICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb3BhY2l0eTtcbiAgICAgIHZhciBvbGRTdHlsZSA9IGNvbnRleHQuZmlsbFN0eWxlO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAkJC5zYmduLmNvbG9ycy5jbG9uZTtcblxuICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcblxuICAgICAgdmFyIG1hcmtlckJlZ2luWCA9IGNlbnRlclggLSB3aWR0aC8yICogTWF0aC5zaW4oTWF0aC5QSSAvIDMpO1xuICAgICAgdmFyIG1hcmtlckJlZ2luWSA9IGNlbnRlclkgKyBoZWlnaHQvMiAqIE1hdGguY29zKE1hdGguUEkgLyAzKTtcbiAgICAgIHZhciBtYXJrZXJFbmRYID0gY2VudGVyWDtcbiAgICAgIHZhciBtYXJrZXJFbmRZID0gbWFya2VyQmVnaW5ZO1xuXG4gICAgICBjb250ZXh0Lm1vdmVUbyhtYXJrZXJCZWdpblgsIG1hcmtlckJlZ2luWSk7XG4gICAgICBjb250ZXh0LmxpbmVUbyhtYXJrZXJFbmRYLCBtYXJrZXJFbmRZKTtcbiAgICAgIGNvbnRleHQuYXJjKGNlbnRlclgsIGNlbnRlclksIHdpZHRoLzIsIDMgKiBNYXRoLlBJIC8gNiwgNSAqIE1hdGguUEkgLyA2KTtcblxuICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcblxuICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IG9sZFN0eWxlO1xuICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IG9sZEdsb2JhbEFscGhhO1xuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBzaW1wbGVDaGVtaWNhbFJpZ2h0Q2xvbmUoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBjbG9uZU1hcmtlciwgb3BhY2l0eSkge1xuICAgIGlmIChjbG9uZU1hcmtlciAhPSBudWxsKSB7XG4gICAgICB2YXIgb2xkR2xvYmFsQWxwaGEgPSBjb250ZXh0Lmdsb2JhbEFscGhhO1xuICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IG9wYWNpdHk7XG4gICAgICB2YXIgb2xkU3R5bGUgPSBjb250ZXh0LmZpbGxTdHlsZTtcbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJCQuc2Jnbi5jb2xvcnMuY2xvbmU7XG5cbiAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG5cbiAgICAgIHZhciBtYXJrZXJCZWdpblggPSBjZW50ZXJYO1xuICAgICAgdmFyIG1hcmtlckJlZ2luWSA9IGNlbnRlclkgKyBoZWlnaHQvMiAqIE1hdGguY29zKE1hdGguUEkgLyAzKTtcbiAgICAgIHZhciBtYXJrZXJFbmRYID0gY2VudGVyWCArIHdpZHRoLzIgKiBNYXRoLnNpbihNYXRoLlBJIC8gMyk7XG4gICAgICB2YXIgbWFya2VyRW5kWSA9IG1hcmtlckJlZ2luWTtcblxuICAgICAgY29udGV4dC5tb3ZlVG8obWFya2VyQmVnaW5YLCBtYXJrZXJCZWdpblkpO1xuICAgICAgY29udGV4dC5saW5lVG8obWFya2VyRW5kWCwgbWFya2VyRW5kWSk7XG4gICAgICBjb250ZXh0LmFyYyhjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aC8yLCBNYXRoLlBJIC8gNiwgMyAqIE1hdGguUEkgLyA2KTtcblxuICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcblxuICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IG9sZFN0eWxlO1xuICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IG9sZEdsb2JhbEFscGhhO1xuICAgIH1cbiAgfTtcblxuICAkJC5zYmduLmRyYXdFbGxpcHNlUGF0aCA9IGZ1bmN0aW9uIChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgY3lCYXNlTm9kZVNoYXBlc1snZWxsaXBzZSddLmRyYXdQYXRoKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuXG4gIH07XG5cblxuICAkJC5zYmduLmRyYXdCYXJyZWwgPSBmdW5jdGlvbiAoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICAgIGN5QmFzZU5vZGVTaGFwZXNbJ2JhcnJlbCddLmRyYXcoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gICAgY29udGV4dC5maWxsKCk7XG4gIH07XG5cbiAgJCQuc2Jnbi5kcmF3Qm90dG9tUm91bmRSZWN0YW5nbGUgPSBmdW5jdGlvbiAoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCkge1xuICAgIGN5QmFzZU5vZGVTaGFwZXNbJ2JvdHRvbXJvdW5kcmVjdGFuZ2xlJ10uZHJhdyhjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgfTtcblxuICAvLyBUaGUgb2xkIGRyYXcgaW1wbGVtZW50YXRpb24gZm9yIG51Y2xlaWMgYWNpZCBmZWF0dXJlXG4gIC8vIG5vdyBvbmx5IHVzZWQgZm9yIGNsb25lIG1hcmtlciBkcmF3aW5nIG9mIG51Y2xlaWMgYWNpZCBmZWF0dXJlXG4gIC8vIGFuZCBtYWNyb21vbGVjdWxlIHNoYXBlcyBiZWNhdXNlICdib3R0b21yb3VuZHJlY3RhbmdsZScgZnVuY3Rpb25cbiAgLy8gb2YgY3l0b3NjYXBlLmpzIGRpZCBub3QgZml0IHdlbGwgZm9yIHRoaXMgcHVycG9zZS5cbiAgLy8gRGlkIG5vdCBjaGFuZ2UgdGhlIG5hbWUgeWV0IGRpcmVjdGx5IGFzIGRyYXdOdWNBY2lkRmVhdHVyZUNsb25lIGV0Yy5cbiAgLy8gYmVjYXVzZSBpdCBhY3R1YWxseSBkcmF3cyBhIG51Y2xlaWMgYWNpZCBmZWF0dXJlIGluIGEgZGlmZmVyZW50IHdheS5cbiAgJCQuc2Jnbi5kcmF3TnVjQWNpZEZlYXR1cmUyID0gZnVuY3Rpb24gKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgd2lkdGgsIGhlaWdodCwgY29ybmVyUmFkaXVzKSB7XG4gICAgY29ybmVyUmFkaXVzID0gY29ybmVyUmFkaXVzIHx8IGN5TWF0aC5nZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyh3aWR0aCwgaGVpZ2h0KTtcbiAgICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICAgIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgICB2YXIgbGVmdCA9IGNlbnRlclggLSBoYWxmV2lkdGgsIHJpZ2h0ID0gY2VudGVyWCArIGhhbGZXaWR0aDtcbiAgICB2YXIgYm90dG9tID0gY2VudGVyWSAtIGhhbGZIZWlnaHQsIHRvcCA9IGNlbnRlclkgKyBoYWxmSGVpZ2h0O1xuICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG5cbiAgICBjb250ZXh0Lm1vdmVUbyhsZWZ0LCBib3R0b20pO1xuICAgIGNvbnRleHQubGluZVRvKHJpZ2h0LCBib3R0b20pO1xuICAgIGNvbnRleHQubGluZVRvKHJpZ2h0LCBjZW50ZXJZKTtcbiAgICBjb250ZXh0LmFyY1RvKHJpZ2h0LCB0b3AsIGNlbnRlclgsIHRvcCwgY29ybmVyUmFkaXVzKTtcbiAgICBjb250ZXh0LmFyY1RvKGxlZnQsIHRvcCwgbGVmdCwgY2VudGVyWSwgY29ybmVyUmFkaXVzKTtcbiAgICBjb250ZXh0LmxpbmVUbyhsZWZ0LCBib3R0b20pO1xuXG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgfTtcblxuICAvKlxuICAgKiBDb2RlIHRha2VuIGZyb20gaHR0cHM6Ly9qc3BlcmYuY29tL3N0cmluZy1wcm90b3R5cGUtZW5kc3dpdGhcbiAgICogRGlyZWN0IGltcGxlbWVudGF0aW9uIHNlZW1zIHRvIHdvcmsgYmV0dGVyLlxuICAgKiBVc2luZyB0aGlzIGltcHJvdmVzIGlzTXVsdGltZXIoKSBwZXJmb3JtYW5jZS5cbiAgICogTWFrZXMgaXQgdGFrZSAwLjEgb3IgMC4yJSBsZXNzIHRpbWUgZnJvbSB0aGUgd2hvbGVcbiAgICogbG9hZGluZyBwcm9jZXNzLCBkb3duIGZyb20gfjAuNCUgaW5pdGlhbGx5LlxuICAgKi9cbiAgZnVuY3Rpb24gZW5kc1dpdGgoc3RyLCBwYXR0ZXJuKSB7XG4gICAgZm9yICh2YXIgaSA9IHBhdHRlcm4ubGVuZ3RoLCBsID0gc3RyLmxlbmd0aDsgaS0tOykge1xuICAgICAgaWYgKHN0ci5jaGFyQXQoLS1sKSAhPSBwYXR0ZXJuLmNoYXJBdChpKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgJCQuc2Jnbi5pc011bHRpbWVyID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICB2YXIgc2JnbkNsYXNzID0gbm9kZS5fcHJpdmF0ZS5kYXRhLmNsYXNzO1xuICAgIGlmIChzYmduQ2xhc3MgJiYgZW5kc1dpdGgoc2JnbkNsYXNzLCBcIm11bHRpbWVyXCIpKVxuICAgICAgcmV0dXJuIHRydWU7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9O1xuXG4gICQkLnNiZ24uaXNBY3RpdmUgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIHZhciBzYmduQ2xhc3MgPSBub2RlLl9wcml2YXRlLmRhdGEuY2xhc3M7XG4gICAgaWYgKHNiZ25DbGFzcyAmJiBzYmduQ2xhc3Muc3RhcnRzV2l0aCggXCJhY3RpdmVcIikpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgJCQuc2Jnbi5pc0h5cG90aGV0aWNhbCA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgdmFyIHNiZ25DbGFzcyA9IG5vZGUuX3ByaXZhdGUuZGF0YS5jbGFzcztcbiAgICBpZiAoc2JnbkNsYXNzICYmIHNiZ25DbGFzcy5pbmNsdWRlcyggXCJoeXBvdGhldGljYWxcIikpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLy90aGlzIGZ1bmN0aW9uIGlzIGNyZWF0ZWQgdG8gaGF2ZSBzYW1lIGNvcm5lciBsZW5ndGggd2hlblxuICAvL2NvbXBsZXgncyB3aWR0aCBvciBoZWlnaHQgaXMgY2hhbmdlZFxuICAkJC5zYmduLmdlbmVyYXRlQ29tcGxleFNoYXBlUG9pbnRzID0gZnVuY3Rpb24gKGNvcm5lckxlbmd0aCwgd2lkdGgsIGhlaWdodCkge1xuICAgIC8vY3Agc3RhbmRzIGZvciBjb3JuZXIgcHJvcG9ydGlvblxuICAgIHZhciBjcFggPSBNYXRoLm1pbihjb3JuZXJMZW5ndGgsIDAuNSAqIHdpZHRoKSAvIHdpZHRoO1xuICAgIHZhciBjcFkgPSBNYXRoLm1pbihjb3JuZXJMZW5ndGgsIDAuNSAqIGhlaWdodCkgLyBoZWlnaHQ7XG5cbiAgICB2YXIgY29tcGxleFBvaW50cyA9IFstMSArIGNwWCwgLTEsIC0xLCAtMSArIGNwWSwgLTEsIDEgLSBjcFksIC0xICsgY3BYLFxuICAgICAgMSwgMSAtIGNwWCwgMSwgMSwgMSAtIGNwWSwgMSwgLTEgKyBjcFksIDEgLSBjcFgsIC0xXTtcblxuICAgIHJldHVybiBjb21wbGV4UG9pbnRzO1xuICB9O1xuXG4gICQkLnNiZ24uZ2VuZXJhdGVHZW5lU2hhcGVQb2ludHMgPSBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkge1xuXG4gICAgcmV0dXJuIFstMSwgLTEsICAgMSwgLTEgLCAgIDEsIDEsICAgLTEgLCAxIF07XG4gIH07XG5cblxuICAkJC5zYmduLmdlbmVyYXRlUk5BU2hhcGVQb2ludHMgPSBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkge1xuXG4gICAgcmV0dXJuIFstMSwgMC44LCAgIDAuNSwgMC44ICwgICAxLCAtMC44LCAgIC0wLjUgLCAtMC44IF07XG4gIH07XG5cbiAgJCQuc2Jnbi5nZW5lcmF0ZVJlY2VwdG9yU2hhcGVQb2ludHMgPSBmdW5jdGlvbiAod2lkdGgsIGhlaWdodCkge1xuXG4gICAgcmV0dXJuIFstMSwgLTEsICAgMCwgLTAuNSwgICAxLCAtMSwgICAxLCAwLjUsICAgMCwgMSwgICAtMSwgIDAuNSBdO1xuICB9O1xuXG4gICQkLnNiZ24uZ2VuZXJhdGVQZXJ0dXJiaW5nQWdlbnRQb2ludHMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gWy0xLCAtMSwgICAtMC41LCAwLCAgLTEsIDEsICAgMSwgMSwgICAwLjUsIDAsIDEsIC0xXTtcbiAgfTtcblxuICAkJC5zYmduLmdldERlZmF1bHRNdWx0aW1lclBhZGRpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gNTtcbiAgfTtcblxuICAkJC5zYmduLmdldERlZmF1bHRBY3RpdmVQYWRkaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIDU7XG4gIH07XG5cbiAgLy8gZHJhdyBiYWNrZ3JvdW5kIGltYWdlIG9mIG5vZGVzXG4gICQkLnNiZ24uZHJhd0ltYWdlID0gZnVuY3Rpb24oIGNvbnRleHQsIGltZ09iaiApIHtcbiAgICBpZihpbWdPYmope1xuICAgICAgY29udGV4dC5jbGlwKCk7XG4gICAgICBjb250ZXh0LmRyYXdJbWFnZShpbWdPYmouaW1nLCAwLCAwLCBpbWdPYmouaW1nVywgaW1nT2JqLmltZ0gsIGltZ09iai54LCBpbWdPYmoueSwgaW1nT2JqLncsIGltZ09iai5oICk7XG4gICAgICBjb250ZXh0LnJlc3RvcmUoKTtcbiAgICB9XG4gIH07XG5cbiAgY3lTdHlsZVByb3BlcnRpZXMudHlwZXMubm9kZVNoYXBlLmVudW1zLnB1c2goXG4gICAgJ2VtcHR5IHNldCcsICdudWNsZWljIGFjaWQgZmVhdHVyZScsICdjb21wbGV4JywgJ21hY3JvbW9sZWN1bGUnLFxuICAgICdzaW1wbGUgY2hlbWljYWwnLCAnYmlvbG9naWNhbCBhY3Rpdml0eScsICdjb21wYXJ0bWVudCcsICdnZW5lJywgJ3NpbXBsZSBtb2xlY3VsZScsICd1bmtub3duIG1vbGVjdWxlJywgJ2RydWcnLCBcbiAgICAndHJ1bmNhdGVkIHByb3RlaW4nLCAnaW9uJywgJ2lvbiBjaGFubmVsJywgJ3JuYScsICdwaGVub3R5cGUgc2JtbCcsICdyZWNlcHRvcicsICdjb21wbGV4IHNibWwnLCAncHJvdGVpbicsICdkZWdyYWRhdGlvbidcbiAgKTtcblxuICAkJC5zYmduLnJlZ2lzdGVyU2Jnbk5vZGVTaGFwZXMgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICBmdW5jdGlvbiBnZW5lcmF0ZURyYXdGY24oIHsgcGxhaW5EcmF3RmNuLCBleHRyYURyYXdGY24sIGNhbkJlTXVsdGltZXIsIGNsb25lTWFya2VyRmNuLCBjYW5CZUFjdGl2ZSwgY2FuQmVIeXBvdGhldGljYWwsXG4gICAgICBjYW5IYXZlSW5mb0JveCwgbXVsdGltZXJQYWRkaW5nLCBhY3RpdmVQYWRkaW5nfSApIHtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCBjb250ZXh0LCBub2RlLCBpbWdPYmogKSB7XG4gICAgICAgIHZhciBib3JkZXJXaWR0aCA9IHBhcnNlRmxvYXQobm9kZS5jc3MoJ2JvcmRlci13aWR0aCcpKTtcbiAgICAgICAgdmFyIHdpZHRoID0gbm9kZS5vdXRlcldpZHRoKCkgLSBib3JkZXJXaWR0aDtcbiAgICAgICAgdmFyIGhlaWdodCA9IG5vZGUub3V0ZXJIZWlnaHQoKSAtIGJvcmRlcldpZHRoO1xuICAgICAgICB2YXIgY2VudGVyWCA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueDtcbiAgICAgICAgdmFyIGNlbnRlclkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnk7XG4gICAgICAgIHZhciBiZ09wYWNpdHkgPSBub2RlLmNzcygnYmFja2dyb3VuZC1vcGFjaXR5Jyk7XG4gICAgICAgIHZhciBpc0Nsb25lZCA9IGNsb25lTWFya2VyRmNuICE9IG51bGwgJiYgbm9kZS5fcHJpdmF0ZS5kYXRhLmNsb25lbWFya2VyO1xuXG4gICAgICAgIC8vSW9uIGNoYW5uZWwgaXMgZHJhbiBkaWZmZXJlbnRseSB3aGVuIGl0IGlzIGFjdGl2ZVxuICAgICAgICBpZiAobm9kZS5fcHJpdmF0ZS5kYXRhLmNsYXNzLnN0YXJ0c1dpdGgoJ2FjdGl2ZSBpb24gY2hhbm5lbCcpIHx8ICBub2RlLl9wcml2YXRlLmRhdGEuY2xhc3Muc3RhcnRzV2l0aCgnYWN0aXZlIGh5cG90aGV0aWNhbCBpb24gY2hhbm5lbCcpIClcbiAgICAgICAge1xuICAgICAgICAgIHBsYWluRHJhd0ZjbiA9ICQkLnNiZ24uZHJhd09wZW5Jb25DaGFubmVsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKG5vZGUuX3ByaXZhdGUuZGF0YS5jbGFzcy5zdGFydHNXaXRoKCdpb24gY2hhbm5lbCcpIHx8ICBub2RlLl9wcml2YXRlLmRhdGEuY2xhc3Muc3RhcnRzV2l0aCgnaHlwb3RoZXRpY2FsIGlvbiBjaGFubmVsJykgKVxuICAgICAgICB7XG4gICAgICAgICAgcGxhaW5EcmF3RmNuID0gJCQuc2Jnbi5kcmF3SW9uQ2hhbm5lbDtcbiAgICAgICAgfVxuXG4gICAgXG4gICAgICAgIC8vVGhpcyBpcyB3aGVyZSB0aGUgbXVsdGltZXIgaXMgZHJhd25cbiAgICAgICBpZiAoIGNhbkJlTXVsdGltZXIgJiYgJCQuc2Jnbi5pc011bHRpbWVyKCBub2RlICkgKSB7XG5cbiAgICAgICAgICBwbGFpbkRyYXdGY24oIGNvbnRleHQsIGNlbnRlclggKyBtdWx0aW1lclBhZGRpbmcsXG4gICAgICAgICAgICBjZW50ZXJZICsgbXVsdGltZXJQYWRkaW5nLCB3aWR0aCwgaGVpZ2h0ICk7XG4gICAgXG4gICAgICAgICAgLy9JZiB0aGUgbm9kZSBpcyBhbHNvIGh5cG90aGV0aWNhbFxuICAgICAgICAgIGlmIChjYW5CZUh5cG90aGV0aWNhbCAmJiAkJC5zYmduLmlzSHlwb3RoZXRpY2FsKCBub2RlICkpXG4gICAgICAgICAge1xuICAgICAgICAgICAgIC8vICQkLnNiZ24uZHJhd0ltYWdlKCBjb250ZXh0LCBpbWdPYmogKTtcbiAgICAgICAgICAgICAgYm9yZGVyU3R5bGUgPSAnZGFzaGVkJ1xuICAgICAgICAgICAgICAkJC5zYmduLmRyYXdCb3JkZXIoIHsgY29udGV4dCwgbm9kZSwgYm9yZGVyU3R5bGUgfSApO1xuICAgICAgICAgICAgICAvLyQkLnNiZ24uZHJhd0ltYWdlKCBjb250ZXh0LCBpbWdPYmogKTtcbiAgICAgICAgICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcblxuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNle1xuICAgICAgICAgICAgJCQuc2Jnbi5kcmF3Qm9yZGVyKCB7IGNvbnRleHQsIG5vZGUgfSApO1xuXG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaWYgKCBleHRyYURyYXdGY24gKSB7XG4gICAgICAgICAgICBleHRyYURyYXdGY24oIGNvbnRleHQsIGNlbnRlclggKyBtdWx0aW1lclBhZGRpbmcsXG4gICAgICAgICAgICAgIGNlbnRlclkgKyBtdWx0aW1lclBhZGRpbmcsIHdpZHRoLCBoZWlnaHQgKTtcblxuXG4gICAgICAgICAgICAkJC5zYmduLmRyYXdCb3JkZXIoIHsgY29udGV4dCwgbm9kZSB9ICk7XG4gICAgICAgICAgfVxuICAgICAgXG4gICAgICAgICAgaWYgKCBpc0Nsb25lZCApIHtcbiAgICAgICAgICAgIGNsb25lTWFya2VyRmNuKGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgIGNlbnRlclggKyBtdWx0aW1lclBhZGRpbmcsIGNlbnRlclkgKyBtdWx0aW1lclBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoIC0gYm9yZGVyV2lkdGgsIGhlaWdodCAtIGJvcmRlcldpZHRoLCBpc0Nsb25lZCwgdHJ1ZSwgYmdPcGFjaXR5KTtcbiAgICAgICAgICB9XG5cblxuICAgICAgICAgIC8vSWYgdGhlIG5vZGUgaXMgYWxzbyBhY3RpdmVcbiAgICAgICAgICBpZiggY2FuQmVBY3RpdmUgJiYgJCQuc2Jnbi5pc0FjdGl2ZSggbm9kZSApICYmICFub2RlLl9wcml2YXRlLmRhdGEuY2xhc3Muc3RhcnRzV2l0aCgnYWN0aXZlIGlvbiBjaGFubmVsJykgJiYgIW5vZGUuX3ByaXZhdGUuZGF0YS5jbGFzcy5zdGFydHNXaXRoKCdhY3RpdmUgaHlwb3RoZXRpY2FsIGlvbiBjaGFubmVsJykgICl7XG4gICAgICAgICAgICAgIC8vYWRkIG11bHRpbWVyIHNoYXBlXG4gICAgICAgICAgICAgIHBsYWluRHJhd0ZjbiggY29udGV4dCwgY2VudGVyWCArIG11bHRpbWVyUGFkZGluZyAsXG4gICAgICAgICAgICAgIGNlbnRlclkgKyBtdWx0aW1lclBhZGRpbmcsIHdpZHRoICwgaGVpZ2h0LCB0cnVlLCBhY3RpdmVQYWRkaW5nKTtcblxuICAgICAgICAgICAgICBib3JkZXJTdHlsZSA9ICdkYXNoZWQnXG4gICAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goWzMsIDZdKTtcbiAgICAgICAgICAgICAgJCQuc2Jnbi5kcmF3Qm9yZGVyKCB7IGNvbnRleHQsIG5vZGUsIGJvcmRlclN0eWxlIH0gKTtcblxuICAgICAgICAgICAgICBpZiAoIGV4dHJhRHJhd0ZjbiApIHtcbiAgICAgICAgICAgICAgICAgIGV4dHJhRHJhd0ZjbiggY29udGV4dCwgY2VudGVyWCArIG11bHRpbWVyUGFkZGluZyxcbiAgICAgICAgICAgICAgICAgICAgY2VudGVyWSsgbXVsdGltZXJQYWRkaW5nLCB3aWR0aCArIGFjdGl2ZVBhZGRpbmcsIGhlaWdodCArIGFjdGl2ZVBhZGRpbmcpO1xuXG5cbiAgICAgICAgICAgICAgJCQuc2Jnbi5kcmF3Qm9yZGVyKCB7IGNvbnRleHQsIG5vZGUgfSApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgfVxuICAgICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgIC8vVGhpcyBpcyB3aGVyZSB0aGUgYWN0aXZlIGlzIGRyYXduXG4gICAgICAgIGlmICggY2FuQmVBY3RpdmUgJiYgJCQuc2Jnbi5pc0FjdGl2ZSggbm9kZSApICYmICFub2RlLl9wcml2YXRlLmRhdGEuY2xhc3Muc3RhcnRzV2l0aCgnYWN0aXZlIGlvbiBjaGFubmVsJykgJiYgIW5vZGUuX3ByaXZhdGUuZGF0YS5jbGFzcy5zdGFydHNXaXRoKCdhY3RpdmUgaHlwb3RoZXRpY2FsIGlvbiBjaGFubmVsJykgKSB7XG4gICAgICAgICAgICAgIC8vYWRkIG11bHRpbWVyIHNoYXBlXG4gICAgICAgICAgICAgIHBsYWluRHJhd0ZjbiggY29udGV4dCwgY2VudGVyWCAsXG4gICAgICAgICAgICAgIGNlbnRlclkgLCB3aWR0aCwgaGVpZ2h0LHRydWUgLCBhY3RpdmVQYWRkaW5nKTtcbiAgICAgIFxuICAgICAgICAgICAgICBib3JkZXJTdHlsZSA9ICdkYXNoZWQnXG4gICAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goWzMsIDZdKTtcbiAgICAgICAgICAgICAgJCQuc2Jnbi5kcmF3Qm9yZGVyKCB7IGNvbnRleHQsIG5vZGUsIGJvcmRlclN0eWxlIH0gKTtcblxuICAgICAgICAgICAgICBpZiAoIGV4dHJhRHJhd0ZjbiApIHtcbiAgICAgICAgICAgICAgICAgIGV4dHJhRHJhd0ZjbiggY29udGV4dCwgY2VudGVyWCxcbiAgICAgICAgICAgICAgICAgICAgY2VudGVyWSwgd2lkdGggKyBhY3RpdmVQYWRkaW5nLCBoZWlnaHQgKyBhY3RpdmVQYWRkaW5nKTtcblxuXG4gICAgICAgICAgICAgICQkLnNiZ24uZHJhd0JvcmRlciggeyBjb250ZXh0LCBub2RlIH0gKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9XG5cbiAgICAgICAgICAvL1RoaXMgaXMgd2hlcmUgdGhlIGFjdGl2ZSBpcyBkcmF3blxuICAgICAgICBpZiAoIGNhbkJlSHlwb3RoZXRpY2FsICYmICQkLnNiZ24uaXNIeXBvdGhldGljYWwoIG5vZGUgKSApIHtcblxuXG4gICAgICAgICAgICAvL2FkZCBtdWx0aW1lciBzaGFwZVxuICAgICAgICAgICAgcGxhaW5EcmF3RmNuKCBjb250ZXh0LCBjZW50ZXJYICxcbiAgICAgICAgICAgICAgY2VudGVyWSAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIFxuICAgICAgICAgICAgICBib3JkZXJTdHlsZSA9ICdkYXNoZWQnXG4gICAgICAgICAgICAgICQkLnNiZ24uZHJhd0JvcmRlciggeyBjb250ZXh0LCBub2RlLCBib3JkZXJTdHlsZSB9ICk7XG4gICAgICAgICAgICAgLy8gJCQuc2Jnbi5kcmF3SW1hZ2UoIGNvbnRleHQsIGltZ09iaiApO1xuICAgICAgICAgICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuXG4gICAgICAgICAgICBpZiAoIGV4dHJhRHJhd0ZjbiApIHtcbiAgICAgICAgICAgICAgICAgIGV4dHJhRHJhd0ZjbiggY29udGV4dCwgY2VudGVyWCxcbiAgICAgICAgICAgICAgICAgICAgY2VudGVyWSwgd2lkdGgsIGhlaWdodCk7XG5cblxuICAgICAgICAgICAgICAkJC5zYmduLmRyYXdCb3JkZXIoIHsgY29udGV4dCwgbm9kZSB9ICk7XG4gICAgICAgICAgICB9XG4gICAgICBcbiAgICAgICAgfVxuXG4gICAgICAgXG4gICAgICAgIGlmICggIShjYW5CZUh5cG90aGV0aWNhbCAmJiAkJC5zYmduLmlzSHlwb3RoZXRpY2FsKCBub2RlICkpIClcbiAgICAgICAge1xuICAgICAgICAgIHBsYWluRHJhd0ZjbiggY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCApO1xuICAgICAgICAgICQkLnNiZ24uZHJhd0ltYWdlKCBjb250ZXh0LCBpbWdPYmogKTtcblxuICAgICAgICB9XG4gICAgICAgXG4gICAgICAgICQkLnNiZ24uZHJhd0JvcmRlciggeyBjb250ZXh0LCBub2RlIH0gKTtcbiAgICAgICAgXG5cbiAgICAgICAgaWYgKCBleHRyYURyYXdGY24gKSB7XG4gICAgICAgICAgICBleHRyYURyYXdGY24oIGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQgKTtcblxuICAgICAgICAgICAgJCQuc2Jnbi5kcmF3Qm9yZGVyKCB7IGNvbnRleHQsIG5vZGUgfSApO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCBpc0Nsb25lZCApIHtcbiAgICAgICAgICBjbG9uZU1hcmtlckZjbihjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCAtIGJvcmRlcldpZHRoLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQgLSBib3JkZXJXaWR0aCwgaXNDbG9uZWQsIGZhbHNlLCBiZ09wYWNpdHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCBjYW5IYXZlSW5mb0JveCApIHtcbiAgICAgICAgICB2YXIgb2xkU3R5bGUgPSBjb250ZXh0LmZpbGxTdHlsZTtcbiAgICAgICAgICAkJC5zYmduLmZvcmNlT3BhY2l0eVRvT25lKG5vZGUsIGNvbnRleHQpO1xuICAgICAgICAgICQkLnNiZ24uZHJhd1N0YXRlQW5kSW5mb3Mobm9kZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSk7XG4gICAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvbGRTdHlsZTtcbiAgICAgICAgfVxuICAgICAgfTtcbiAgICAgIFxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlSW50ZXJzZWN0TGluZUZjbiggeyBwbGFpbkludGVyc2VjdExpbmVGY24sIGNhbkJlTXVsdGltZXIsIGNsb25lTWFya2VyRmNuLCBjYW5CZUFjdGl2ZSwgY2FuQmVIeXBvdGhldGljYWwsXG4gICAgICBjYW5IYXZlSW5mb0JveCwgbXVsdGltZXJQYWRkaW5nLCBhY3RpdmVQYWRkaW5nIH0gKSB7XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbiggbm9kZSwgeCwgeSApIHtcbiAgICAgICAgdmFyIGJvcmRlcldpZHRoID0gcGFyc2VGbG9hdChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpO1xuICAgICAgICB2YXIgcGFkZGluZyA9IGJvcmRlcldpZHRoIC8gMjtcbiAgICAgICAgdmFyIHdpZHRoID0gbm9kZS5vdXRlcldpZHRoKCkgLSBib3JkZXJXaWR0aDtcbiAgICAgICAgdmFyIGhlaWdodCA9IG5vZGUub3V0ZXJIZWlnaHQoKSAtIGJvcmRlcldpZHRoO1xuICAgICAgICB2YXIgY2VudGVyWCA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueDtcbiAgICAgICAgdmFyIGNlbnRlclkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnk7XG5cbiAgICAgICAgdmFyIGludGVyc2VjdGlvbnMgPSBbXTtcblxuICAgICAgICBpZiAoIGNhbkhhdmVJbmZvQm94ICkge1xuICAgICAgICAgIHZhciBzdGF0ZUFuZEluZm9JbnRlcnNlY3RMaW5lcyA9ICQkLnNiZ24uaW50ZXJzZWN0TGluZVN0YXRlQW5kSW5mb0JveGVzKFxuICAgICAgICAgICAgICAgICAgbm9kZSwgeCwgeSk7XG5cbiAgICAgICAgICBpbnRlcnNlY3Rpb25zID0gaW50ZXJzZWN0aW9ucy5jb25jYXQoIHN0YXRlQW5kSW5mb0ludGVyc2VjdExpbmVzICk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgbm9kZUludGVyc2VjdExpbmVzID0gcGxhaW5JbnRlcnNlY3RMaW5lRmNuKGNlbnRlclgsIGNlbnRlclksIHdpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodCwgeCwgeSwgcGFkZGluZyk7XG5cbiAgICAgICAgaW50ZXJzZWN0aW9ucyA9IGludGVyc2VjdGlvbnMuY29uY2F0KCBub2RlSW50ZXJzZWN0TGluZXMgKTtcblxuICAgICAgICBpZiAoIGNhbkJlTXVsdGltZXIgJiYgJCQuc2Jnbi5pc011bHRpbWVyKG5vZGUpICkge1xuICAgICAgICAgIHZhciBtdWx0aW1lckludGVyc2VjdGlvbkxpbmVzID0gcGxhaW5JbnRlcnNlY3RMaW5lRmNuKFxuICAgICAgICAgICAgICAgICAgY2VudGVyWCArIG11bHRpbWVyUGFkZGluZywgY2VudGVyWSArIG11bHRpbWVyUGFkZGluZywgd2lkdGgsXG4gICAgICAgICAgICAgICAgICBoZWlnaHQsIHgsIHksIHBhZGRpbmcpO1xuXG4gICAgICAgICAgaW50ZXJzZWN0aW9ucyA9IGludGVyc2VjdGlvbnMuY29uY2F0KCBtdWx0aW1lckludGVyc2VjdGlvbkxpbmVzICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIGNhbkJlQWN0aXZlICYmICQkLnNiZ24uaXNBY3RpdmUobm9kZSkgKSB7XG4gICAgICAgICAgdmFyIGFjdGl2ZUludGVyc2VjdGlvbkxpbmVzID0gcGxhaW5JbnRlcnNlY3RMaW5lRmNuKFxuICAgICAgICAgICAgICAgICAgY2VudGVyWCArIGFjdGl2ZVBhZGRpbmcsIGNlbnRlclkgKyBhY3RpdmVQYWRkaW5nLCB3aWR0aCxcbiAgICAgICAgICAgICAgICAgIGhlaWdodCwgeCwgeSwgcGFkZGluZyk7XG5cbiAgICAgICAgICBpbnRlcnNlY3Rpb25zID0gaW50ZXJzZWN0aW9ucy5jb25jYXQoIGFjdGl2ZUludGVyc2VjdGlvbkxpbmVzICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIGNhbkJlSHlwb3RoZXRpY2FsICYmICQkLnNiZ24uaXNIeXBvdGhldGljYWwobm9kZSkgKSB7XG4gICAgICAgICAgdmFyIGh5cG90aGV0aWNhbEludGVyc2VjdGlvbkxpbmVzID0gcGxhaW5JbnRlcnNlY3RMaW5lRmNuKFxuICAgICAgICAgICAgICAgICAgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsXG4gICAgICAgICAgICAgICAgICBoZWlnaHQsIHgsIHksIHBhZGRpbmcpO1xuXG4gICAgICAgICAgaW50ZXJzZWN0aW9ucyA9IGludGVyc2VjdGlvbnMuY29uY2F0KCBoeXBvdGhldGljYWxJbnRlcnNlY3Rpb25MaW5lcyApO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICQkLnNiZ24uY2xvc2VzdEludGVyc2VjdGlvblBvaW50KFt4LCB5XSwgaW50ZXJzZWN0aW9ucyk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlQ2hlY2tQb2ludEZjbiggeyBwbGFpbkNoZWNrUG9pbnRGY24sIGNhbkJlTXVsdGltZXIsIGNsb25lTWFya2VyRmNuLCBjYW5CZUFjdGl2ZSwgY2FuQmVIeXBvdGhldGljYWwsXG4gICAgICBjYW5IYXZlSW5mb0JveCwgbXVsdGltZXJQYWRkaW5nLCBhY3RpdmVQYWRkaW5nIH0gKSB7XG5cbiAgICAgIHJldHVybiBmdW5jdGlvbiggeCwgeSwgbm9kZSwgdGhyZXNob2xkICkge1xuXG4gICAgICAgIHRocmVzaG9sZCA9IHRocmVzaG9sZCB8fCAwO1xuICAgICAgICB2YXIgYm9yZGVyV2lkdGggPSBwYXJzZUZsb2F0KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSk7XG4gICAgICAgIHZhciB3aWR0aCA9IG5vZGUub3V0ZXJXaWR0aCgpIC0gYm9yZGVyV2lkdGggKyAyICogdGhyZXNob2xkO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gbm9kZS5vdXRlckhlaWdodCgpIC0gYm9yZGVyV2lkdGggKyAyICogdGhyZXNob2xkO1xuICAgICAgICB2YXIgY2VudGVyWCA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueDtcbiAgICAgICAgdmFyIGNlbnRlclkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnk7XG4gICAgICAgIHZhciBwYWRkaW5nID0gYm9yZGVyV2lkdGggLyAyO1xuXG4gICAgICAgIHZhciBub2RlQ2hlY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gcGxhaW5DaGVja1BvaW50RmNuKCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIHN0YXRlQW5kSW5mb0NoZWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbkhhdmVJbmZvQm94ICYmICQkLnNiZ24uY2hlY2tQb2ludFN0YXRlQW5kSW5mb0JveGVzKHgsIHksIG5vZGUsIHRocmVzaG9sZCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIG11bHRpbWVyQ2hlY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gY2FuQmVNdWx0aW1lciAmJiAkJC5zYmduLmlzTXVsdGltZXIobm9kZSlcbiAgICAgICAgICAgICAgICAgICYmIHBsYWluQ2hlY2tQb2ludEZjbiggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlclggKyBtdWx0aW1lclBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXJZICsgbXVsdGltZXJQYWRkaW5nICk7XG4gICAgICAgIH07XG5cbiAgICAgICAgdmFyIGFjdGl2ZUNoZWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgcmV0dXJuIGNhbkJlQWN0aXZlICYmICQkLnNiZ24uaXNBY3RpdmUobm9kZSlcbiAgICAgICAgICAgICAgICAgICYmIHBsYWluQ2hlY2tQb2ludEZjbiggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlclggKyBhY3RpdmVQYWRkaW5nLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyWSArIGFjdGl2ZVBhZGRpbmcgKTtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgaHlwb3RoZXRpY2FsQ2hlY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gY2FuQmVIeXBvdGhldGljYWwgJiYgJCQuc2Jnbi5pc0h5cG90aGV0aWNhbChub2RlKVxuICAgICAgICAgICAgICAgICAgJiYgcGxhaW5DaGVja1BvaW50RmNuKCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyWCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlclkgKTtcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gbm9kZUNoZWNrKCkgfHwgc3RhdGVBbmRJbmZvQ2hlY2soKSB8fCBtdWx0aW1lckNoZWNrKCkgfHwgYWN0aXZlQ2hlY2soKSB8fCBoeXBvdGhldGljYWxDaGVjaygpO1xuICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgc2hhcGVOYW1lcyA9IFsgXCJzaW1wbGUgY2hlbWljYWxcIiwgXCJtYWNyb21vbGVjdWxlXCIsIFwiY29tcGxleFwiLFxuICAgICAgXCJudWNsZWljIGFjaWQgZmVhdHVyZVwiLCBcImVtcHR5IHNldFwiLCBcImJpb2xvZ2ljYWwgYWN0aXZpdHlcIixcbiAgICAgIFwiY29tcGFydG1lbnRcIiwgXCJvbGRDb21wYXJ0bWVudFwiLCBcImdlbmVcIiwgXCJzaW1wbGUgbW9sZWN1bGVcIiwgJ3JlY2VwdG9yJywgJ2NvbXBsZXggc2JtbCcsXG4gICAgICBcInVua25vd24gbW9sZWN1bGVcIiwgXCJkcnVnXCIsIFwiaW9uXCIsIFwidHJ1bmNhdGVkIHByb3RlaW5cIiwgXCJpb24gY2hhbm5lbFwiLCBcInJuYVwiLCBcInBoZW5vdHlwZSBzYm1sXCIsIFwicHJvdGVpblwiLCBcImRlZ3JhZGF0aW9uXCJcbiAgICBdO1xuXG4gICAgc2hhcGVOYW1lcy5mb3JFYWNoKCBmdW5jdGlvbiggc2hhcGVOYW1lICkge1xuICAgICAgdmFyIHBsYWluRHJhd0ZjbiA9ICQkLnNiZ24ucGxhaW5EcmF3WyBzaGFwZU5hbWUgXTtcbiAgICAgIHZhciBwbGFpbkludGVyc2VjdExpbmVGY24gPSAkJC5zYmduLnBsYWluSW50ZXJzZWN0TGluZVsgc2hhcGVOYW1lIF07XG4gICAgICB2YXIgcGxhaW5DaGVja1BvaW50RmNuID0gJCQuc2Jnbi5wbGFpbkNoZWNrUG9pbnRbIHNoYXBlTmFtZSBdO1xuICAgICAgdmFyIGNhbkJlTXVsdGltZXIgPSAkJC5zYmduLmNhbkJlTXVsdGltZXJTaGFwZXNbIHNoYXBlTmFtZSBdO1xuICAgICAgdmFyIGNhbkJlQWN0aXZlID0gJCQuc2Jnbi5jYW5CZUFjdGl2ZVNoYXBlc1sgc2hhcGVOYW1lIF07XG4gICAgICB2YXIgY2FuQmVIeXBvdGhldGljYWwgPSAkJC5zYmduLmNhbkJlSHlwb3RoZXRpY2FsU2hhcGVzWyBzaGFwZU5hbWUgXTtcbiAgICAgIHZhciBjbG9uZU1hcmtlckZjbiA9ICQkLnNiZ24uY2xvbmVNYXJrZXJbIHNoYXBlTmFtZSBdO1xuICAgICAgdmFyIGNhbkhhdmVJbmZvQm94ID0gJCQuc2Jnbi5jYW5IYXZlSW5mb0JveFNoYXBlc1sgc2hhcGVOYW1lIF07XG4gICAgICB2YXIgbXVsdGltZXJQYWRkaW5nID0gJCQuc2Jnbi5nZXREZWZhdWx0TXVsdGltZXJQYWRkaW5nKCk7XG4gICAgICB2YXIgYWN0aXZlUGFkZGluZyA9ICQkLnNiZ24uZ2V0RGVmYXVsdEFjdGl2ZVBhZGRpbmcoKTtcbiAgICAgIHZhciBleHRyYURyYXdGY24gPSAkJC5zYmduLmV4dHJhRHJhd1sgc2hhcGVOYW1lIF07XG5cbiAgICAgIHZhciBkcmF3ID0gZ2VuZXJhdGVEcmF3RmNuKCB7IHBsYWluRHJhd0ZjbiwgY2FuQmVNdWx0aW1lciwgY2xvbmVNYXJrZXJGY24sIGNhbkJlQWN0aXZlLCBjYW5CZUh5cG90aGV0aWNhbCxcbiAgICAgICAgY2FuSGF2ZUluZm9Cb3gsIG11bHRpbWVyUGFkZGluZywgYWN0aXZlUGFkZGluZywgZXh0cmFEcmF3RmNuXG4gICAgICB9ICk7XG5cbiAgICAgIHZhciBpbnRlcnNlY3RMaW5lID0gdG90YWxseU92ZXJyaWRlbk5vZGVTaGFwZXNbIHNoYXBlTmFtZSBdID9cbiAgICAgICAgZ2VuZXJhdGVJbnRlcnNlY3RMaW5lRmNuKCB7IHBsYWluSW50ZXJzZWN0TGluZUZjbiwgY2FuQmVNdWx0aW1lciwgY2xvbmVNYXJrZXJGY24sIGNhbkJlQWN0aXZlLCBjYW5CZUh5cG90aGV0aWNhbCxcbiAgICAgICAgICBjYW5IYXZlSW5mb0JveCwgbXVsdGltZXJQYWRkaW5nLCBhY3RpdmVQYWRkaW5nXG4gICAgICAgIH0gKSA6IHBsYWluSW50ZXJzZWN0TGluZUZjbjtcblxuICAgICAgdmFyIGNoZWNrUG9pbnQgPSB0b3RhbGx5T3ZlcnJpZGVuTm9kZVNoYXBlc1sgc2hhcGVOYW1lIF0gP1xuICAgICAgICBnZW5lcmF0ZUNoZWNrUG9pbnRGY24oIHsgcGxhaW5DaGVja1BvaW50RmNuLCBjYW5CZU11bHRpbWVyLCBjbG9uZU1hcmtlckZjbiwgY2FuQmVBY3RpdmUsIGNhbkJlSHlwb3RoZXRpY2FsLFxuICAgICAgICAgIGNhbkhhdmVJbmZvQm94LCBtdWx0aW1lclBhZGRpbmcsIGFjdGl2ZVBhZGRpbmdcbiAgICAgICAgfSApIDogcGxhaW5DaGVja1BvaW50RmNuO1xuICAgICAgdmFyIHNoYXBlID0geyBkcmF3LCBpbnRlcnNlY3RMaW5lLCBjaGVja1BvaW50LCBtdWx0aW1lclBhZGRpbmcsIGFjdGl2ZVBhZGRpbmcgfTtcblxuICAgICAgY3lCYXNlTm9kZVNoYXBlc1sgc2hhcGVOYW1lIF0gPSBzaGFwZTtcbiAgICB9ICk7XG4gIH07XG5cbiAgJCQuc2Jnbi5kcmF3RWxsaXBzZSA9IGZ1bmN0aW9uIChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgLy8kJC5zYmduLmRyYXdFbGxpcHNlUGF0aChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAvL2NvbnRleHQuZmlsbCgpO1xuICAgIGN5QmFzZU5vZGVTaGFwZXNbJ2VsbGlwc2UnXS5kcmF3KGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICB9O1xuXG4gICAgJCQuc2Jnbi5kcmF3VHJ1bmNhdGVkUHJvdGVpbiA9IGZ1bmN0aW9uIChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBpc0FjdGl2ZSwgYWN0aXZlUGFkZGluZyApIHtcbiAgIFxuICAgIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gICAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuICAgIHZhciBjb3JuZXJSYWRpdXMgPSBjeU1hdGguZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMoIHdpZHRoLCBoZWlnaHQgKTtcbiAgICB2YXIgaGFsZlBhZGRpbmcgPSBhY3RpdmVQYWRkaW5nPyBhY3RpdmVQYWRkaW5nIC8yOiAwO1xuXG4gICAgaWYoIGNvbnRleHQuYmVnaW5QYXRoICl7IGNvbnRleHQuYmVnaW5QYXRoKCk7IH1cblxuICAgIC8vIFN0YXJ0IGF0IHRvcCBtaWRkbGVcbiAgICBjb250ZXh0Lm1vdmVUbyggeCwgeSAtIGhhbGZIZWlnaHQgLSBoYWxmUGFkZGluZyApO1xuICAgIC8vRHJhdyBhIGxpbmUgdGlsbCByaWdodCB0b3BcbiAgICBjb250ZXh0LmxpbmVUbyggeCArIGhhbGZXaWR0aCArIGhhbGZQYWRkaW5nLCB5IC0gaGFsZkhlaWdodCAtIGhhbGZQYWRkaW5nKTtcbiAgICAvL0RyYXcgYSBsaW5lIHRvIG1pZGRsZSByaWdodFxuICAgIGNvbnRleHQubGluZVRvKCB4ICsgaGFsZldpZHRoICsgaGFsZlBhZGRpbmcsIHkgKyAyKmhhbGZIZWlnaHQvMyArIDIqaGFsZlBhZGRpbmcpO1xuICAgIC8vRHJhdyBhIGxpbmUgaW5uZXJcbiAgICBjb250ZXh0LmxpbmVUbyggeCArIDIqaGFsZldpZHRoLzMgKyBoYWxmUGFkZGluZywgeSArIGhhbGZIZWlnaHQvMyArIDIqaGFsZlBhZGRpbmcgKTtcbiAgICAvL0RyYXcgYSBsaW5lIHRvIGJvdHRvbSByaWdodFxuICAgIGNvbnRleHQubGluZVRvKCB4ICsgMipoYWxmV2lkdGgvMyArIGhhbGZQYWRkaW5nLCB5ICsgaGFsZkhlaWdodCArIGhhbGZQYWRkaW5nICk7XG4gICAgLy9EcmF3IGEgbGluZSB0byBib3R0b20gbWlkZGxlXG4gICAgY29udGV4dC5saW5lVG8oIHgsIHkgKyBoYWxmSGVpZ2h0ICsgaGFsZlBhZGRpbmcgKTtcbiAgICAvLyBBcmMgZnJvbSBib3R0b20gdG8gbGVmdCBzaWRlXG4gICAgY29udGV4dC5hcmNUbyggeCAtIGhhbGZXaWR0aCAtaGFsZlBhZGRpbmcsIHkgKyBoYWxmSGVpZ2h0KyBoYWxmUGFkZGluZywgeCAtIGhhbGZXaWR0aCAtaGFsZlBhZGRpbmcgLCB5LCBjb3JuZXJSYWRpdXMgKTtcbiAgICAvLyBBcmMgZnJvbSBsZWZ0IHNpZGUgdG8gdG9wQm9yZGVyXG4gICAgY29udGV4dC5hcmNUbyggeCAtIGhhbGZXaWR0aCAtIGhhbGZQYWRkaW5nLCB5IC0gaGFsZkhlaWdodCAtIGhhbGZQYWRkaW5nLCB4LCB5IC0gaGFsZkhlaWdodCAtaGFsZlBhZGRpbmcsIGNvcm5lclJhZGl1cyApO1xuXG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICBpZighaXNBY3RpdmUpXG4gICAge1xuICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgfVxuICB9O1xuXG4gICQkLnNiZ24uZHJhd0lvbkNoYW5uZWwgPSBmdW5jdGlvbiAoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcmFkaXVzKSB7XG5cbiAgICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICAgIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgICB2YXIgY29ybmVyUmFkaXVzID0gcmFkaXVzIHx8IGN5TWF0aC5nZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyggd2lkdGgsIGhlaWdodCApO1xuXG4gICAgaWYoIGNvbnRleHQuYmVnaW5QYXRoICl7IGNvbnRleHQuYmVnaW5QYXRoKCk7IH1cblxuICAgIC8vIFN0YXJ0IGF0IHRvcCBtaWRkbGVcbiAgICBjb250ZXh0Lm1vdmVUbyggeCArIGhhbGZXaWR0aC80LCB5IC0gaGFsZkhlaWdodCApO1xuICAgIC8vIEFyYyBmcm9tIG1pZGRsZSB0b3AgdG8gcmlnaHQgc2lkZVxuICAgIGNvbnRleHQuYXJjVG8oIHggKyBoYWxmV2lkdGgvMiwgeSAtIGhhbGZIZWlnaHQsIHggKyBoYWxmV2lkdGgvMiwgeSwgY29ybmVyUmFkaXVzICk7XG4gICAgLy8gQXJjIGZyb20gcmlnaHQgc2lkZSB0byBib3R0b21cbiAgICBjb250ZXh0LmFyY1RvKCB4ICsgaGFsZldpZHRoLzIsIHkgKyBoYWxmSGVpZ2h0LCB4LzIgKyBoYWxmV2lkdGgvNCwgeSArIGhhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyApO1xuICAgIC8vIEFyYyBmcm9tIGJvdHRvbSB0byBsZWZ0IHNpZGVcbiAgICBjb250ZXh0LmFyY1RvKCB4IC0gaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCwgeCAtIGhhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzICk7XG4gICAgLy8gQXJjIGZyb20gbGVmdCBzaWRlIHRvIHRvcEJvcmRlclxuICAgIGNvbnRleHQuYXJjVG8oIHggLSBoYWxmV2lkdGgsIHkgLSBoYWxmSGVpZ2h0LCB4ICsgaGFsZldpZHRoLzQsIHkgLSBoYWxmSGVpZ2h0LCBjb3JuZXJSYWRpdXMgKTtcbiAgICAvLyBKb2luIGxpbmVcbiAgICBjb250ZXh0LmxpbmVUbyggeCArIGhhbGZXaWR0aC80LCB5IC0gaGFsZkhlaWdodCApO1xuXG4gICAgLy8gU3RhcnQgYXQgdG9wIG1pZGRsZVxuICAgIGNvbnRleHQubW92ZVRvKCB4ICsgMyAqaGFsZldpZHRoLzQsIHkgLSBoYWxmSGVpZ2h0ICk7XG4gICAgLy8gQXJjIGZyb20gbWlkZGxlIHRvcCB0byByaWdodCBzaWRlXG4gICAgY29udGV4dC5hcmNUbyggeCArIGhhbGZXaWR0aCwgeSAtIGhhbGZIZWlnaHQsIHggKyBoYWxmV2lkdGgsIHksIGNvcm5lclJhZGl1cyApO1xuICAgIC8vIEFyYyBmcm9tIHJpZ2h0IHNpZGUgdG8gYm90dG9tXG4gICAgY29udGV4dC5hcmNUbyggeCArIGhhbGZXaWR0aCwgeSArIGhhbGZIZWlnaHQsIHggKyAzICogaGFsZldpZHRoLzQsIHkgKyBoYWxmSGVpZ2h0LCBjb3JuZXJSYWRpdXMgKTtcbiAgICAvLyBBcmMgZnJvbSBib3R0b20gdG8gbGVmdCBzaWRlXG4gICAgY29udGV4dC5hcmNUbyggeCArIGhhbGZXaWR0aC8yLCB5ICsgaGFsZkhlaWdodCwgeCArICBoYWxmV2lkdGgvMiwgeSwgY29ybmVyUmFkaXVzICk7XG4gICAgLy8gQXJjIGZyb20gbGVmdCBzaWRlIHRvIHRvcEJvcmRlclxuICAgIGNvbnRleHQuYXJjVG8oIHggKyBoYWxmV2lkdGgvMiwgeSAtIGhhbGZIZWlnaHQsIHggKyAzICogaGFsZldpZHRoLzQgLCB5IC0gaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzICk7XG4gICAgLy8gSm9pbiBsaW5lXG4gICAgLy9jb250ZXh0LmxpbmVUbyggeCwgeSAtIGhhbGZIZWlnaHQgKTtcblxuXG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgfVxuXG4gICQkLnNiZ24uZHJhd09wZW5Jb25DaGFubmVsID0gZnVuY3Rpb24gKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHJhZGl1cykge1xuICAgXG4gICAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgICB2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7XG4gICAgdmFyIGNvcm5lclJhZGl1cyA9IHJhZGl1cyB8fCBjeU1hdGguZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMoIHdpZHRoLCBoZWlnaHQgKTtcblxuICAgIGlmKCBjb250ZXh0LmJlZ2luUGF0aCApeyBjb250ZXh0LmJlZ2luUGF0aCgpOyB9XG5cbiAgICAvLyBTdGFydCBhdCB0b3AgbWlkZGxlXG4gICAgY29udGV4dC5tb3ZlVG8oIHggLSBoYWxmV2lkdGgvMiwgeSAtIGhhbGZIZWlnaHQgKTtcbiAgICAvLyBBcmMgZnJvbSBtaWRkbGUgdG9wIHRvIHJpZ2h0IHNpZGVcbiAgICBjb250ZXh0LmFyY1RvKCB4ICwgeSAtIGhhbGZIZWlnaHQsIHgsIHksIGNvcm5lclJhZGl1cyApO1xuICAgIC8vIEFyYyBmcm9tIHJpZ2h0IHNpZGUgdG8gYm90dG9tXG4gICAgY29udGV4dC5hcmNUbyggeCwgeSArIGhhbGZIZWlnaHQsIHgtIGhhbGZXaWR0aC8yLCB5ICsgaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzICk7XG4gICAgLy8gQXJjIGZyb20gYm90dG9tIHRvIGxlZnQgc2lkZVxuICAgIGNvbnRleHQuYXJjVG8oIHggLSBoYWxmV2lkdGgsIHkgKyBoYWxmSGVpZ2h0LCB4IC0gaGFsZldpZHRoLCB5LCBjb3JuZXJSYWRpdXMgKTtcbiAgICAvLyBBcmMgZnJvbSBsZWZ0IHNpZGUgdG8gdG9wQm9yZGVyXG4gICAgY29udGV4dC5hcmNUbyggeCAtIGhhbGZXaWR0aCwgeSAtIGhhbGZIZWlnaHQsIHggKyBoYWxmV2lkdGgvMiwgeSAtIGhhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyApO1xuICAgIC8vIEpvaW4gbGluZVxuICAgIGNvbnRleHQubGluZVRvKCB4LWhhbGZXaWR0aC8yLCB5IC0gaGFsZkhlaWdodCApO1xuXG4gICAgLy8gU3RhcnQgYXQgdG9wIG1pZGRsZVxuICAgIGNvbnRleHQubW92ZVRvKCB4ICsgMyAqaGFsZldpZHRoLzQsIHkgLSBoYWxmSGVpZ2h0ICk7XG4gICAgLy8gQXJjIGZyb20gbWlkZGxlIHRvcCB0byByaWdodCBzaWRlXG4gICAgY29udGV4dC5hcmNUbyggeCArIGhhbGZXaWR0aCwgeSAtIGhhbGZIZWlnaHQsIHggKyBoYWxmV2lkdGgsIHksIGNvcm5lclJhZGl1cyApO1xuICAgIC8vIEFyYyBmcm9tIHJpZ2h0IHNpZGUgdG8gYm90dG9tXG4gICAgY29udGV4dC5hcmNUbyggeCArIGhhbGZXaWR0aCwgeSArIGhhbGZIZWlnaHQsIHggKyAzICogaGFsZldpZHRoLzQsIHkgKyBoYWxmSGVpZ2h0LCBjb3JuZXJSYWRpdXMgKTtcbiAgICAvLyBBcmMgZnJvbSBib3R0b20gdG8gbGVmdCBzaWRlXG4gICAgY29udGV4dC5hcmNUbyggeCArIGhhbGZXaWR0aC8yLCB5ICsgaGFsZkhlaWdodCwgeCArICBoYWxmV2lkdGgvMiwgeSwgY29ybmVyUmFkaXVzICk7XG4gICAgLy8gQXJjIGZyb20gbGVmdCBzaWRlIHRvIHRvcEJvcmRlclxuICAgIGNvbnRleHQuYXJjVG8oIHggKyBoYWxmV2lkdGgvMiwgeSAtIGhhbGZIZWlnaHQsIHggKyAzICogaGFsZldpZHRoLzQgLCB5IC0gaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzICk7XG4gICAgLy8gSm9pbiBsaW5lXG4gICAgLy9jb250ZXh0LmxpbmVUbyggeCwgeSAtIGhhbGZIZWlnaHQgKTtcblxuXG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgfTtcblxuICAkJC5zYmduLmRyYXdDb21wbGV4ID0gZnVuY3Rpb24oIGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGlzQWN0aXZlLCBjb3JuZXJMZW5ndGggKSB7XG4gICAgY29ybmVyTGVuZ3RoID0gY29ybmVyTGVuZ3RoIHx8ICQkLnNiZ24uZ2V0RGVmYXVsdENvbXBsZXhDb3JuZXJMZW5ndGgoKTtcbiAgICB2YXIgcG9pbnRzID0gJCQuc2Jnbi5nZW5lcmF0ZUNvbXBsZXhTaGFwZVBvaW50cyhjb3JuZXJMZW5ndGgsIHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgZHJhd1BvbHlnb25QYXRoKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBvaW50cyk7XG5cbiAgICBpZighaXNBY3RpdmUpXG4gICAge1xuICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgfVxuICB9O1xuXG4gICQkLnNiZ24uZHJhd0dlbmUgPSBmdW5jdGlvbiggY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgaXNBY3RpdmUgKSB7XG4gICAgY3lCYXNlTm9kZVNoYXBlc1sncmVjdGFuZ2xlJ10uZHJhdyhjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBpZiAoIWlzQWN0aXZlKVxuICAgIHtcbiAgICAgIGNvbnRleHQuZmlsbCgpO1xuICAgIH1cbiAgfTtcblxuICAkJC5zYmduLmRyYXdSTkEgPSBmdW5jdGlvbiggY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcbiAgICB2YXIgcG9pbnRzID0gJCQuc2Jnbi5nZW5lcmF0ZVJOQVNoYXBlUG9pbnRzKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgZHJhd1BvbHlnb25QYXRoKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBvaW50cyk7XG5cbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgfTtcblxuICAkJC5zYmduLmRyYXdQaGVub3R5cGUgPSBmdW5jdGlvbiggY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcbiAgICBjeUJhc2VOb2RlU2hhcGVzWydoZXhhZ29uJ10uZHJhdyhjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb250ZXh0LmZpbGwoKTtcblxuICB9O1xuICAkJC5zYmduLmRyYXdSZWNlcHRvcj0gZnVuY3Rpb24oIGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGlzQWN0aXZlLCBhY3RpdmVQYWRkaW5nICkge1xuICAgICBkcmF3UmVjZXB0b3JQYXRoKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsYWN0aXZlUGFkZGluZylcbiAgICBpZighaXNBY3RpdmUpXG4gICAge1xuICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgfVxuXG4gIH07XG5cbiAgJCQuc2Jnbi5kcmF3Q3Jvc3NMaW5lID0gZnVuY3Rpb24oIGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG4gICAgdmFyIHBvaW50cyA9IGN5TWF0aC5nZW5lcmF0ZVVuaXROZ29uUG9pbnRzKDQsIDApO1xuXG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICB2YXIgc2NhbGVYID0gd2lkdGggKiBNYXRoLnNxcnQoMikgLyAyLCBzY2FsZVkgPSAgaGVpZ2h0ICogTWF0aC5zcXJ0KDIpIC8gMjtcblxuICAgIGNvbnRleHQubW92ZVRvKHggKyBzY2FsZVggKiBwb2ludHNbMl0sIHkgKyBzY2FsZVkgKiBwb2ludHNbM10pO1xuICAgIGNvbnRleHQubGluZVRvKHggKyBzY2FsZVggKiBwb2ludHNbNl0sIHkgKyBzY2FsZVkgKiBwb2ludHNbN10pO1xuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIH07XG5cbiAgJCQuc2Jnbi5kcmF3QmlvbG9naWNhbEFjdGl2aXR5ID0gZnVuY3Rpb24oIGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQgKSB7XG4gICAgdmFyIHBvaW50cyA9ICQkLnNiZ24uZ2VuZXJhdGVCaW9sb2dpY2FsQWN0aXZpdHlQb2ludHMoKTtcbiAgICBkcmF3UG9seWdvblBhdGgoY29udGV4dCxcbiAgICAgICAgICAgIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBvaW50cyk7XG4gICAgY29udGV4dC5maWxsKCk7XG4gIH07XG5cbiAgJCQuc2Jnbi5kcmF3Um91bmRSZWN0YW5nbGUgPSBmdW5jdGlvbiggY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgaXNBY3RpdmUgKSB7XG4gICAgZHJhd1JvdW5kUmVjdGFuZ2xlUGF0aCggY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCApO1xuICAgIGlmKCFpc0FjdGl2ZSlcbiAgICB7XG4gICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICB9XG4gIFxuICB9O1xuXG4gICQkLnNiZ24uZHJhd1Byb3RlaW4gPSBmdW5jdGlvbiggY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgaXNBY3RpdmUsIGFjdGl2ZVBhZGRpbmcgKSB7XG4gICAgbGV0IGFjdGl2ZVBhZGRpbmcxID0gYWN0aXZlUGFkZGluZyB8fCAwO1xuICAgIGRyYXdQcm90ZWluUGF0aCggY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgYWN0aXZlUGFkZGluZzEgKTtcbiAgICBpZighaXNBY3RpdmUpXG4gICAge1xuICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgfVxuICBcbiAgfTtcbiAgJCQuc2Jnbi5kcmF3Um91bmRlZERydWcgPSBmdW5jdGlvbiggY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcbiAgICBkcmF3Um91bmRlZERydWdQYXRoKCBjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICk7XG4gICAgY29udGV4dC5maWxsKCk7XG4gIFxuICB9O1xuXG4gICQkLnNiZ24uZ2VuZXJhdGVOdWNsZWljQWNpZFBvaW50cyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBjeU1hdGguZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDQsIDApO1xuICB9O1xuXG4gICQkLnNiZ24uZ2VuZXJhdGVCaW9sb2dpY2FsQWN0aXZpdHlQb2ludHMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gY3lNYXRoLmdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg0LCAwKTtcbiAgfTtcblxuICAkJC5zYmduLmdlbmVyYXRlQ29tcGFydG1lbnRQb2ludHMgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gbWF0aC5nZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCk7XG4gIH07XG5cbiAgJCQuc2Jnbi5wbGFpbkRyYXcgPSB7XG4gICAgXCJzaW1wbGUgY2hlbWljYWxcIjogJCQuc2Jnbi5kcmF3U2ltcGxlQ2hlbWljYWwsXG4gICAgXCJtYWNyb21vbGVjdWxlXCI6ICQkLnNiZ24uZHJhd1JvdW5kUmVjdGFuZ2xlLFxuICAgIFwiY29tcGxleFwiOiAkJC5zYmduLmRyYXdDb21wbGV4LFxuICAgIFwibnVjbGVpYyBhY2lkIGZlYXR1cmVcIjogJCQuc2Jnbi5kcmF3Qm90dG9tUm91bmRSZWN0YW5nbGUsXG4gICAgXCJlbXB0eSBzZXRcIjogJCQuc2Jnbi5kcmF3RWxsaXBzZSxcbiAgICBcImJpb2xvZ2ljYWwgYWN0aXZpdHlcIjogJCQuc2Jnbi5kcmF3QmlvbG9naWNhbEFjdGl2aXR5LFxuICAgIFwiY29tcGFydG1lbnRcIjogJCQuc2Jnbi5kcmF3QmFycmVsLFxuICAgIFwib2xkQ29tcGFydG1lbnRcIjogJCQuc2Jnbi5kcmF3Um91bmRSZWN0YW5nbGUsXG4gICAgXCJnZW5lXCI6ICAkJC5zYmduLmRyYXdHZW5lLFxuICAgIFwicm5hXCI6ICQkLnNiZ24uZHJhd1JOQSxcbiAgICBcInNpbXBsZSBtb2xlY3VsZVwiOiAkJC5zYmduLmRyYXdFbGxpcHNlLFxuICAgIFwidW5rbm93biBtb2xlY3VsZVwiOiAkJC5zYmduLmRyYXdFbGxpcHNlLFxuICAgIFwiZHJ1Z1wiOiAkJC5zYmduLmRyYXdSb3VuZGVkRHJ1ZyxcbiAgICBcImlvblwiOiAkJC5zYmduLmRyYXdFbGxpcHNlLFxuICAgIFwidHJ1bmNhdGVkIHByb3RlaW5cIjogJCQuc2Jnbi5kcmF3VHJ1bmNhdGVkUHJvdGVpbixcbiAgICBcImlvbiBjaGFubmVsXCIgOiAkJC5zYmduLmRyYXdJb25DaGFubmVsLFxuICAgIFwicGhlbm90eXBlIHNibWxcIjogJCQuc2Jnbi5kcmF3UGhlbm90eXBlLFxuICAgIFwicmVjZXB0b3JcIjogJCQuc2Jnbi5kcmF3UmVjZXB0b3IsXG4gICAgXCJjb21wbGV4IHNibWxcIjogJCQuc2Jnbi5kcmF3Q29tcGxleCxcbiAgICBcInByb3RlaW5cIjogJCQuc2Jnbi5kcmF3UHJvdGVpbixcbiAgICBcImRlZ3JhZGF0aW9uXCI6ICQkLnNiZ24uZHJhd0VsbGlwc2UsXG4gIH07XG5cbiAgLy8gVG8gZGVmaW5lIGFuIGV4dHJhIGRyYXdpbmcgZm9yIHRoZSBub2RlIHRoYXQgaXMgcmVuZGVyZWQgYXQgdGhlIHZlcnkgZW5kLFxuICAvLyBldmVuIGFmdGVyIHRoZSBub2RlIGJhY2tncm91bmQgaW1hZ2UgaXMgZHJhd24uXG4gIC8vIEUuZy4gY3Jvc3MgbGluZXMgb2YgXCJlbXB0eSBzZXRcIiBub2Rlcy5cbiAgJCQuc2Jnbi5leHRyYURyYXcgPSB7XG4gICAgXCJlbXB0eSBzZXRcIjogJCQuc2Jnbi5kcmF3Q3Jvc3NMaW5lLFxuICAgIFwiZGVncmFkYXRpb25cIjogJCQuc2Jnbi5kcmF3Q3Jvc3NMaW5lXG4gIH07XG5cbiAgJCQuc2Jnbi5wbGFpbkludGVyc2VjdExpbmUgPSB7XG4gICAgXCJzaW1wbGUgY2hlbWljYWxcIjogZnVuY3Rpb24oIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKSB7XG4gICAgICByZXR1cm4gY3lCYXNlTm9kZVNoYXBlc1tcImVsbGlwc2VcIl0uaW50ZXJzZWN0TGluZSggY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZyApO1xuICAgIH0sXG4gICAgXCJtYWNyb21vbGVjdWxlXCI6IGZ1bmN0aW9uKCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nICkge1xuICAgICAgcmV0dXJuICQkLnNiZ24ucm91bmRSZWN0YW5nbGVJbnRlcnNlY3RMaW5lKCB4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICB3aWR0aCwgaGVpZ2h0LFxuICAgICAgICBjeU1hdGguZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMod2lkdGgsIGhlaWdodCksIHBhZGRpbmdcbiAgICAgICk7XG4gICAgfSxcbiAgICBcImNvbXBsZXhcIjogZnVuY3Rpb24oIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKSB7XG4gICAgICB2YXIgcG9pbnRzID0gJCQuc2Jnbi5nZW5lcmF0ZUNvbXBsZXhTaGFwZVBvaW50cyggJCQuc2Jnbi5nZXREZWZhdWx0Q29tcGxleENvcm5lckxlbmd0aCgpLCB3aWR0aCwgaGVpZ2h0ICk7XG4gICAgICByZXR1cm4gY3lNYXRoLnBvbHlnb25JbnRlcnNlY3RMaW5lKFxuICAgICAgICB4LCB5LCBwb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgcGFkZGluZ1xuICAgICAgKTtcbiAgICB9LFxuICAgIFwibnVjbGVpYyBhY2lkIGZlYXR1cmVcIjogZnVuY3Rpb24oIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKSB7XG4gICAgICByZXR1cm4gY3lCYXNlTm9kZVNoYXBlc1tcImJvdHRvbXJvdW5kcmVjdGFuZ2xlXCJdLmludGVyc2VjdExpbmUoIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKTtcbiAgICB9LFxuICAgIFwiZW1wdHkgc2V0XCI6IGZ1bmN0aW9uKCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nICkge1xuICAgICAgcmV0dXJuIGN5QmFzZU5vZGVTaGFwZXNbXCJlbGxpcHNlXCJdLmludGVyc2VjdExpbmUoIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKTtcbiAgICB9LFxuICAgIFwiZGVncmFkYXRpb25cIjogZnVuY3Rpb24oIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKSB7XG4gICAgICByZXR1cm4gY3lCYXNlTm9kZVNoYXBlc1tcImVsbGlwc2VcIl0uaW50ZXJzZWN0TGluZSggY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZyApO1xuICAgIH0sXG4gICAgXCJiaW9sb2dpY2FsIGFjdGl2aXR5XCI6IGZ1bmN0aW9uKCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nICkge1xuICAgICAgdmFyIHBvaW50cyA9ICQkLnNiZ24uZ2VuZXJhdGVCaW9sb2dpY2FsQWN0aXZpdHlQb2ludHMoKTtcbiAgICAgIHJldHVybiBjeU1hdGgucG9seWdvbkludGVyc2VjdExpbmUoXG4gICAgICAgIHgsIHksIHBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGggLyAyLCBoZWlnaHQgLyAyLCBwYWRkaW5nXG4gICAgICApO1xuICAgIH0sXG4gICAgXCJjb21wYXJ0bWVudFwiOiBmdW5jdGlvbiggY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZyApIHtcbiAgICAgIHJldHVybiBjeUJhc2VOb2RlU2hhcGVzW1wiYmFycmVsXCJdLmludGVyc2VjdExpbmUoIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKTtcbiAgICB9LFxuICAgIFwib2xkQ29tcGFydG1lbnRcIjogZnVuY3Rpb24oIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKSB7XG4gICAgICByZXR1cm4gY3lNYXRoLnJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZShcbiAgICAgICAgeCwgeSwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgcGFkZGluZ1xuICAgICAgKTtcbiAgICB9LFxuICAgIFwicHJvdGVpblwiOiBmdW5jdGlvbiggY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZyApIHtcbiAgICAgIHJldHVybiBjeU1hdGgucm91bmRSZWN0YW5nbGVJbnRlcnNlY3RMaW5lKFxuICAgICAgICB4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nXG4gICAgICApO1xuICAgIH0sXG4gICAgXCJnZW5lXCI6IGZ1bmN0aW9uKCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nICkge1xuICAgICAgcmV0dXJuIGN5QmFzZU5vZGVTaGFwZXNbXCJyZWN0YW5nbGVcIl0uaW50ZXJzZWN0TGluZSggY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZyApO1xuICAgIH0sXG4gICAgXCJybmFcIjogZnVuY3Rpb24oIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKSB7XG4gICAgICB2YXIgcG9pbnRzID0gJCQuc2Jnbi5nZW5lcmF0ZVJOQVNoYXBlUG9pbnRzKCAgd2lkdGgsIGhlaWdodCApO1xuICAgICAgcmV0dXJuIGN5TWF0aC5wb2x5Z29uSW50ZXJzZWN0TGluZShcbiAgICAgICAgeCwgeSwgcG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIsIHBhZGRpbmdcbiAgICAgICk7XG4gICAgfSxcbiAgICBcInJlY2VwdG9yXCI6IGZ1bmN0aW9uKCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nICkge1xuICAgICAgdmFyIHBvaW50cyA9ICQkLnNiZ24uZ2VuZXJhdGVSZWNlcHRvclNoYXBlUG9pbnRzKCAgd2lkdGgsIGhlaWdodCApO1xuICAgICAgcmV0dXJuIGN5TWF0aC5wb2x5Z29uSW50ZXJzZWN0TGluZShcbiAgICAgICAgeCwgeSwgcG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIsIHBhZGRpbmdcbiAgICAgICk7XG4gICAgfSxcbiAgICBcImlvbiBjaGFubmVsXCI6IGZ1bmN0aW9uKCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nICkge1xuICAgICAgcmV0dXJuIGN5TWF0aC5yb3VuZFJlY3RhbmdsZUludGVyc2VjdExpbmUoXG4gICAgICAgIHgsIHksIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHBhZGRpbmdcbiAgICAgICk7XG4gICAgfSxcbiAgICBcInRydW5jYXRlZCBwcm90ZWluXCI6IGZ1bmN0aW9uKCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nICkge1xuICAgICAgcmV0dXJuIGN5TWF0aC5yb3VuZFJlY3RhbmdsZUludGVyc2VjdExpbmUoXG4gICAgICAgIHgsIHksIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHBhZGRpbmdcbiAgICAgICk7XG4gICAgfSxcbiAgICBcImlvblwiOiBmdW5jdGlvbiggY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZyApIHtcbiAgICAgIHJldHVybiBjeUJhc2VOb2RlU2hhcGVzW1wiZWxsaXBzZVwiXS5pbnRlcnNlY3RMaW5lKCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nICk7XG5cbiAgICB9LFxuICAgIFwic2ltcGxlIG1vbGVjdWxlXCI6IGZ1bmN0aW9uKCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nICkge1xuICAgICAgcmV0dXJuIGN5QmFzZU5vZGVTaGFwZXNbXCJlbGxpcHNlXCJdLmludGVyc2VjdExpbmUoIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKTtcblxuICAgIH0sXG4gICAgXCJ1bmtub3duIG1vbGVjdWxlXCI6IGZ1bmN0aW9uKCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nICkge1xuICAgIHJldHVybiBjeUJhc2VOb2RlU2hhcGVzW1wiZWxsaXBzZVwiXS5pbnRlcnNlY3RMaW5lKCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nICk7XG5cbiAgICB9LFxuICAgIFwiZHJ1Z1wiOiBmdW5jdGlvbiggY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZyApIHtcbiAgICAgIHJldHVybiBjeUJhc2VOb2RlU2hhcGVzW1wiZWxsaXBzZVwiXS5pbnRlcnNlY3RMaW5lKCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nICk7XG4gICAgfSxcbiAgICBcInBoZW5vdHlwZSBzYm1sXCI6IGZ1bmN0aW9uKCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nICkge1xuICAgICAgcmV0dXJuIGN5QmFzZU5vZGVTaGFwZXNbXCJlbGxpcHNlXCJdLmludGVyc2VjdExpbmUoIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKTtcblxuICAgIH0sXG4gICAgXCJjb21wbGV4IHNibWxcIjogZnVuY3Rpb24oIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKSB7XG4gICAgICB2YXIgcG9pbnRzID0gJCQuc2Jnbi5nZW5lcmF0ZUNvbXBsZXhTaGFwZVBvaW50cyggJCQuc2Jnbi5nZXREZWZhdWx0Q29tcGxleENvcm5lckxlbmd0aCgpLCB3aWR0aCwgaGVpZ2h0ICk7XG4gICAgICByZXR1cm4gY3lNYXRoLnBvbHlnb25JbnRlcnNlY3RMaW5lKFxuICAgICAgICB4LCB5LCBwb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgcGFkZGluZ1xuICAgICAgKTtcbiAgICB9LFxuICB9O1xuXG4gICQkLnNiZ24ucGxhaW5DaGVja1BvaW50ID0ge1xuICAgIFwic2ltcGxlIGNoZW1pY2FsXCI6IGZ1bmN0aW9uKCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICkge1xuXG4gICAgICB2YXIgcG9pbnRzID0gY3lNYXRoLmdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSggNCwgMCApO1xuICAgICAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgICAgIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgICAvL3ZhciBjb3JuZXJSYWRpdXMgPSAkJC5tYXRoLmdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xuICAgICAgdmFyIGNvcm5lclJhZGl1cyA9IE1hdGgubWluKGhhbGZXaWR0aCwgaGFsZkhlaWdodCk7XG4gICAgICAvL3ZhciBjb3JuZXJSYWRpdXMgPSBtYXRoLmdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKCB3aWR0aCwgaGVpZ2h0ICk7XG4gICAgICB2YXIgZGlhbSA9IGNvcm5lclJhZGl1cyAqIDI7XG5cbiAgICAgIC8vIENoZWNrIGhCb3hcbiAgICAgIGlmKCBjeU1hdGgucG9pbnRJbnNpZGVQb2x5Z29uKCB4LCB5LCBwb2ludHMsXG4gICAgICAgIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQgLSBkaWFtLCBbMCwgLTFdLCBwYWRkaW5nICkgKXtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIHZCb3hcbiAgICAgIGlmKCBjeU1hdGgucG9pbnRJbnNpZGVQb2x5Z29uKCB4LCB5LCBwb2ludHMsXG4gICAgICAgIGNlbnRlclgsIGNlbnRlclksIHdpZHRoIC0gZGlhbSwgaGVpZ2h0LCBbMCwgLTFdLCBwYWRkaW5nICkgKXtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIHRvcCBsZWZ0IHF1YXJ0ZXIgY2lyY2xlXG4gICAgICBpZiggY3lNYXRoLmNoZWNrSW5FbGxpcHNlKCB4LCB5LFxuICAgICAgICBkaWFtLCBkaWFtLFxuICAgICAgICBjZW50ZXJYIC0gd2lkdGggLyAyICsgY29ybmVyUmFkaXVzLFxuICAgICAgICBjZW50ZXJZIC0gaGVpZ2h0IC8gMiArIGNvcm5lclJhZGl1cyxcbiAgICAgICAgcGFkZGluZyApICl7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIHRvcCByaWdodCBxdWFydGVyIGNpcmNsZVxuICAgICAgaWYoIGN5TWF0aC5jaGVja0luRWxsaXBzZSggeCwgeSxcbiAgICAgICAgZGlhbSwgZGlhbSxcbiAgICAgICAgY2VudGVyWCArIHdpZHRoIC8gMiAtIGNvcm5lclJhZGl1cyxcbiAgICAgICAgY2VudGVyWSAtIGhlaWdodCAvIDIgKyBjb3JuZXJSYWRpdXMsXG4gICAgICAgIHBhZGRpbmcgKSApe1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBib3R0b20gcmlnaHQgcXVhcnRlciBjaXJjbGVcbiAgICAgIGlmKCBjeU1hdGguY2hlY2tJbkVsbGlwc2UoIHgsIHksXG4gICAgICAgIGRpYW0sIGRpYW0sXG4gICAgICAgIGNlbnRlclggKyB3aWR0aCAvIDIgLSBjb3JuZXJSYWRpdXMsXG4gICAgICAgIGNlbnRlclkgKyBoZWlnaHQgLyAyIC0gY29ybmVyUmFkaXVzLFxuICAgICAgICBwYWRkaW5nICkgKXtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgYm90dG9tIGxlZnQgcXVhcnRlciBjaXJjbGVcbiAgICAgIGlmKCBjeU1hdGguY2hlY2tJbkVsbGlwc2UoIHgsIHksXG4gICAgICAgIGRpYW0sIGRpYW0sXG4gICAgICAgIGNlbnRlclggLSB3aWR0aCAvIDIgKyBjb3JuZXJSYWRpdXMsXG4gICAgICAgIGNlbnRlclkgKyBoZWlnaHQgLyAyIC0gY29ybmVyUmFkaXVzLFxuICAgICAgICBwYWRkaW5nICkgKXtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIC8vcmV0dXJuIGN5QmFzZU5vZGVTaGFwZXNbXCJlbGxpcHNlXCJdLmNoZWNrUG9pbnQoIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKTtcbiAgICB9LFxuICAgIFwibWFjcm9tb2xlY3VsZVwiOiBmdW5jdGlvbiggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApIHtcbiAgICAgIHJldHVybiBjeUJhc2VOb2RlU2hhcGVzW1wicm91bmRyZWN0YW5nbGVcIl0uY2hlY2tQb2ludCggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApO1xuICAgIH0sXG4gICAgXCJjb21wbGV4XCI6IGZ1bmN0aW9uKCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICkge1xuICAgICAgdmFyIHBvaW50cyA9ICQkLnNiZ24uZ2VuZXJhdGVDb21wbGV4U2hhcGVQb2ludHMoICQkLnNiZ24uZ2V0RGVmYXVsdENvbXBsZXhDb3JuZXJMZW5ndGgoKSwgd2lkdGgsIGhlaWdodCApO1xuICAgICAgcmV0dXJuIGN5TWF0aC5wb2ludEluc2lkZVBvbHlnb24oXG4gICAgICAgIHgsIHksIHBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgWzAsIC0xXSwgcGFkZGluZyk7XG4gICAgfSxcbiAgICBcImNvbXBsZXggc2JtbFwiIDogZnVuY3Rpb24oIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKSB7XG4gICAgICB2YXIgcG9pbnRzID0gJCQuc2Jnbi5nZW5lcmF0ZUNvbXBsZXhTaGFwZVBvaW50cyggJCQuc2Jnbi5nZXREZWZhdWx0Q29tcGxleENvcm5lckxlbmd0aCgpLCB3aWR0aCwgaGVpZ2h0ICk7XG4gICAgICByZXR1cm4gY3lNYXRoLnBvaW50SW5zaWRlUG9seWdvbihcbiAgICAgICAgeCwgeSwgcG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBbMCwgLTFdLCBwYWRkaW5nKTtcbiAgICB9LFxuICAgIFwibnVjbGVpYyBhY2lkIGZlYXR1cmVcIjogZnVuY3Rpb24oIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKSB7XG4gICAgICByZXR1cm4gY3lCYXNlTm9kZVNoYXBlc1tcImJvdHRvbXJvdW5kcmVjdGFuZ2xlXCJdLmNoZWNrUG9pbnQoIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKTtcbiAgICB9LFxuICAgIFwiZW1wdHkgc2V0XCI6IGZ1bmN0aW9uKCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICkge1xuICAgICAgcmV0dXJuIGN5QmFzZU5vZGVTaGFwZXNbXCJlbGxpcHNlXCJdLmNoZWNrUG9pbnQoIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKTtcbiAgICB9LFxuICAgIFwiZGVncmFkYXRpb25cIjogZnVuY3Rpb24oIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKSB7XG4gICAgICByZXR1cm4gY3lCYXNlTm9kZVNoYXBlc1tcImVsbGlwc2VcIl0uY2hlY2tQb2ludCggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApO1xuICAgIH0sXG4gICAgXCJiaW9sb2dpY2FsIGFjdGl2aXR5XCI6IGZ1bmN0aW9uKCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICkge1xuICAgICAgcmV0dXJuIGN5QmFzZU5vZGVTaGFwZXNbXCJyZWN0YW5nbGVcIl0uY2hlY2tQb2ludCggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApO1xuICAgIH0sXG4gICAgXCJjb21wYXJ0bWVudFwiOiBmdW5jdGlvbiggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApIHtcbiAgICAgIHJldHVybiBjeUJhc2VOb2RlU2hhcGVzW1wiYmFycmVsXCJdLmNoZWNrUG9pbnQoIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKTtcbiAgICB9LFxuICAgIFwib2xkQ29tcGFydG1lbnRcIjogZnVuY3Rpb24oIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKSB7XG4gICAgICByZXR1cm4gY3lCYXNlTm9kZVNoYXBlc1tcInJvdW5kcmVjdGFuZ2xlXCJdLmNoZWNrUG9pbnQoIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKTtcbiAgICB9LFxuICAgIFwiZ2VuZVwiOiBmdW5jdGlvbiggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApIHtcbiAgICAgIHJldHVybiBjeUJhc2VOb2RlU2hhcGVzW1wicm91bmRyZWN0YW5nbGVcIl0uY2hlY2tQb2ludCggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApO1xuICAgfSxcbiAgIFwic2ltcGxlIG1vbGVjdWxlXCI6IGZ1bmN0aW9uKCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICkge1xuICAgIHJldHVybiBjeUJhc2VOb2RlU2hhcGVzW1wicm91bmRyZWN0YW5nbGVcIl0uY2hlY2tQb2ludCggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApO1xuICAgfSxcbiAgIFwidW5rbm93biBtb2xlY3VsZVwiOiBmdW5jdGlvbiggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApIHtcbiAgICByZXR1cm4gY3lCYXNlTm9kZVNoYXBlc1tcInJvdW5kcmVjdGFuZ2xlXCJdLmNoZWNrUG9pbnQoIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKTtcbiAgIH0sXG4gICBcImRydWdcIjogZnVuY3Rpb24oIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKSB7XG4gICAgcmV0dXJuIGN5QmFzZU5vZGVTaGFwZXNbXCJyb3VuZHJlY3RhbmdsZVwiXS5jaGVja1BvaW50KCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICk7XG4gICB9LFxuICAgXCJpb25cIjogZnVuY3Rpb24oIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKSB7XG4gICAgcmV0dXJuIGN5QmFzZU5vZGVTaGFwZXNbXCJyb3VuZHJlY3RhbmdsZVwiXS5jaGVja1BvaW50KCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICk7XG4gICB9LFxuICAgXCJ0cnVuY2F0ZWQgcHJvdGVpblwiOiBmdW5jdGlvbiggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApIHtcbiAgICByZXR1cm4gY3lCYXNlTm9kZVNoYXBlc1tcInJvdW5kcmVjdGFuZ2xlXCJdLmNoZWNrUG9pbnQoIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKTtcbiAgIH0sXG4gICBcImlvbiBjaGFubmVsXCI6IGZ1bmN0aW9uKCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICkge1xuICAgIHJldHVybiBjeUJhc2VOb2RlU2hhcGVzW1wicm91bmRyZWN0YW5nbGVcIl0uY2hlY2tQb2ludCggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApO1xuICAgfSxcbiAgIFwicm5hXCI6IGZ1bmN0aW9uKCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICkge1xuICAgIHJldHVybiBjeUJhc2VOb2RlU2hhcGVzW1wicm91bmRyZWN0YW5nbGVcIl0uY2hlY2tQb2ludCggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApO1xuICAgfSxcbiAgIFwicGhlbm90eXBlIHNibWxcIjogZnVuY3Rpb24oIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKSB7XG4gICAgcmV0dXJuIGN5QmFzZU5vZGVTaGFwZXNbXCJyb3VuZHJlY3RhbmdsZVwiXS5jaGVja1BvaW50KCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICk7XG4gICB9LFxuICAgXCJyZWNlcHRvclwiOiBmdW5jdGlvbiggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApIHtcbiAgICByZXR1cm4gY3lCYXNlTm9kZVNoYXBlc1tcInJvdW5kcmVjdGFuZ2xlXCJdLmNoZWNrUG9pbnQoIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKTtcbiAgIH0sXG4gICBcInByb3RlaW5cIjogZnVuY3Rpb24oIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKSB7XG4gICAgcmV0dXJuIGN5QmFzZU5vZGVTaGFwZXNbXCJyb3VuZHJlY3RhbmdsZVwiXS5jaGVja1BvaW50KCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICk7XG4gICB9XG4gIH07XG5cbiAgJCQuc2Jnbi5jbG9uZU1hcmtlciA9IHtcbiAgICBcInNpbXBsZSBjaGVtaWNhbFwiOiBmdW5jdGlvbiAoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNsb25lTWFya2VyLCBpc011bHRpbWVyLCBvcGFjaXR5KSB7XG4gICAgICBpZiAoY2xvbmVNYXJrZXIgIT0gbnVsbCkge1xuICAgICAgICB2YXIgY29ybmVyUmFkaXVzID0gTWF0aC5taW4od2lkdGggLyAyLCBoZWlnaHQgLyAyKTtcblxuICAgICAgICB2YXIgZmlyc3RDaXJjbGVDZW50ZXJYID0gY2VudGVyWCAtIHdpZHRoIC8gMiArIGNvcm5lclJhZGl1cztcbiAgICAgICAgdmFyIGZpcnN0Q2lyY2xlQ2VudGVyWSA9IGNlbnRlclk7XG4gICAgICAgIHZhciBzZWNvbmRDaXJjbGVDZW50ZXJYID0gY2VudGVyWCArIHdpZHRoIC8gMiAtIGNvcm5lclJhZGl1cztcbiAgICAgICAgdmFyIHNlY29uZENpcmNsZUNlbnRlclkgPSBjZW50ZXJZO1xuICAgICAgICB2YXIgYm90dG9tQ2lyY2xlQ2VudGVyWCA9IGNlbnRlclg7XG4gICAgICAgIHZhciBib3R0b21DaXJjbGVDZW50ZXJZID0gY2VudGVyWSArIGhlaWdodC8yIC0gY29ybmVyUmFkaXVzO1xuXG4gICAgICAgIGlmICh3aWR0aCA8IGhlaWdodCkge1xuICAgICAgICAgIHNpbXBsZUNoZW1pY2FsTGVmdENsb25lKGNvbnRleHQsIGJvdHRvbUNpcmNsZUNlbnRlclgsIGJvdHRvbUNpcmNsZUNlbnRlclksXG4gICAgICAgICAgICAgIDIgKiBjb3JuZXJSYWRpdXMsIDIgKiBjb3JuZXJSYWRpdXMsIGNsb25lTWFya2VyLCBvcGFjaXR5KTtcbiAgICAgICAgICBzaW1wbGVDaGVtaWNhbFJpZ2h0Q2xvbmUoY29udGV4dCwgYm90dG9tQ2lyY2xlQ2VudGVyWCwgYm90dG9tQ2lyY2xlQ2VudGVyWSxcbiAgICAgICAgICAgICAgMiAqIGNvcm5lclJhZGl1cywgMiAqIGNvcm5lclJhZGl1cywgY2xvbmVNYXJrZXIsIG9wYWNpdHkpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIHNpbXBsZUNoZW1pY2FsTGVmdENsb25lKGNvbnRleHQsIGZpcnN0Q2lyY2xlQ2VudGVyWCwgZmlyc3RDaXJjbGVDZW50ZXJZLFxuICAgICAgICAgICAgICAyICogY29ybmVyUmFkaXVzLCAyICogY29ybmVyUmFkaXVzLCBjbG9uZU1hcmtlciwgb3BhY2l0eSk7XG4gICAgICAgICAgc2ltcGxlQ2hlbWljYWxSaWdodENsb25lKGNvbnRleHQsIHNlY29uZENpcmNsZUNlbnRlclgsIHNlY29uZENpcmNsZUNlbnRlclksXG4gICAgICAgICAgICAgIDIgKiBjb3JuZXJSYWRpdXMsIDIgKiBjb3JuZXJSYWRpdXMsIGNsb25lTWFya2VyLCBvcGFjaXR5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBvbGRTdHlsZSA9IGNvbnRleHQuZmlsbFN0eWxlO1xuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICQkLnNiZ24uY29sb3JzLmNsb25lO1xuICAgICAgICB2YXIgb2xkR2xvYmFsQWxwaGEgPSBjb250ZXh0Lmdsb2JhbEFscGhhO1xuICAgICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb3BhY2l0eTtcblxuICAgICAgICB2YXIgcmVjUG9pbnRzID0gY3lNYXRoLmdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg0LCAwKTtcbiAgICAgICAgdmFyIGNsb25lWCA9IGNlbnRlclg7XG4gICAgICAgIHZhciBjbG9uZVkgPSBjZW50ZXJZICsgMyAvIDQgKiBjb3JuZXJSYWRpdXM7XG4gICAgICAgIHZhciBjbG9uZVdpZHRoID0gd2lkdGggLSAyICogY29ybmVyUmFkaXVzO1xuICAgICAgICB2YXIgY2xvbmVIZWlnaHQgPSBjb3JuZXJSYWRpdXMgLyAyO1xuXG4gICAgICAgIGRyYXdQb2x5Z29uUGF0aChjb250ZXh0LCBjbG9uZVgsIGNsb25lWSwgY2xvbmVXaWR0aCwgY2xvbmVIZWlnaHQsIHJlY1BvaW50cyk7XG4gICAgICAgIGNvbnRleHQuZmlsbCgpO1xuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IG9sZFN0eWxlO1xuICAgICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb2xkR2xvYmFsQWxwaGE7XG4gICAgICB9XG4gICAgfSxcbiAgICBcIm51Y2xlaWMgYWNpZCBmZWF0dXJlXCI6IGZ1bmN0aW9uIChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY2xvbmVNYXJrZXIsIGlzTXVsdGltZXIsIG9wYWNpdHkpIHtcbiAgICAgIGlmIChjbG9uZU1hcmtlciAhPSBudWxsKSB7XG4gICAgICAgIHZhciBjbG9uZVdpZHRoID0gd2lkdGg7XG4gICAgICAgIHZhciBjbG9uZUhlaWdodCA9IGhlaWdodCAvIDQ7XG4gICAgICAgIHZhciBjbG9uZVggPSBjZW50ZXJYO1xuICAgICAgICB2YXIgY2xvbmVZID0gY2VudGVyWSArIDMgKiBoZWlnaHQgLyA4O1xuXG4gICAgICAgIHZhciBvbGRTdHlsZSA9IGNvbnRleHQuZmlsbFN0eWxlO1xuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICQkLnNiZ24uY29sb3JzLmNsb25lO1xuICAgICAgICB2YXIgb2xkR2xvYmFsQWxwaGEgPSBjb250ZXh0Lmdsb2JhbEFscGhhO1xuICAgICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb3BhY2l0eTtcblxuICAgICAgICB2YXIgY29ybmVyUmFkaXVzID0gY3lNYXRoLmdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xuXG4gICAgICAgICQkLnNiZ24uZHJhd051Y0FjaWRGZWF0dXJlMihjb250ZXh0LCBjbG9uZVgsIGNsb25lWSxcbiAgICAgICAgICAgICAgICBjbG9uZVdpZHRoLCBjbG9uZUhlaWdodCwgY29ybmVyUmFkaXVzKTtcblxuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IG9sZFN0eWxlO1xuICAgICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb2xkR2xvYmFsQWxwaGE7XG4gICAgICB9XG4gICAgfSxcbiAgICBcIm1hY3JvbW9sZWN1bGVcIjogZnVuY3Rpb24gKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBjbG9uZU1hcmtlciwgaXNNdWx0aW1lciwgb3BhY2l0eSkge1xuICAgICAgJCQuc2Jnbi5jbG9uZU1hcmtlcltcIm51Y2xlaWMgYWNpZCBmZWF0dXJlXCJdKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNsb25lTWFya2VyLCBpc011bHRpbWVyLCBvcGFjaXR5KTtcbiAgICB9LFxuICAgIFwiY29tcGxleFwiOiBmdW5jdGlvbiAoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNsb25lTWFya2VyLCBpc011bHRpbWVyLCBvcGFjaXR5KSB7XG4gICAgICBpZiAoY2xvbmVNYXJrZXIgIT0gbnVsbCkge1xuICAgICAgICB2YXIgY29ybmVyTGVuZ3RoID0gJCQuc2Jnbi5nZXREZWZhdWx0Q29tcGxleENvcm5lckxlbmd0aCgpO1xuICAgICAgICB2YXIgY3BYID0gKHdpZHRoID49IDUwKSA/IGNvcm5lckxlbmd0aCAvIHdpZHRoIDogY29ybmVyTGVuZ3RoIC8gNTA7XG4gICAgICAgIHZhciBjcFkgPSAoaGVpZ2h0ID49IDUwKSA/IGNvcm5lckxlbmd0aCAvIGhlaWdodCA6IGNvcm5lckxlbmd0aCAvIDUwO1xuICAgICAgICB2YXIgY2xvbmVXaWR0aCA9IHdpZHRoO1xuICAgICAgICB2YXIgY2xvbmVIZWlnaHQgPSBoZWlnaHQgKiBjcFkgLyAyO1xuICAgICAgICB2YXIgY2xvbmVYID0gY2VudGVyWDtcbiAgICAgICAgdmFyIGNsb25lWSA9IGNlbnRlclkgKyBoZWlnaHQgLyAyIC0gY2xvbmVIZWlnaHQgLyAyO1xuXG4gICAgICAgIHZhciBtYXJrZXJQb2ludHMgPSBbLTEsIC0xLCAxLCAtMSwgMSAtIGNwWCwgMSwgLTEgKyBjcFgsIDFdO1xuXG4gICAgICAgIHZhciBvbGRTdHlsZSA9IGNvbnRleHQuZmlsbFN0eWxlO1xuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICQkLnNiZ24uY29sb3JzLmNsb25lO1xuICAgICAgICB2YXIgb2xkR2xvYmFsQWxwaGEgPSBjb250ZXh0Lmdsb2JhbEFscGhhO1xuICAgICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb3BhY2l0eTtcblxuICAgICAgICBkcmF3UG9seWdvblBhdGgoY29udGV4dCxcbiAgICAgICAgICAgICAgICBjbG9uZVgsIGNsb25lWSxcbiAgICAgICAgICAgICAgICBjbG9uZVdpZHRoLCBjbG9uZUhlaWdodCwgbWFya2VyUG9pbnRzKTtcbiAgICAgICAgY29udGV4dC5maWxsKCk7XG5cbiAgICAgICAgY29udGV4dC5maWxsU3R5bGUgPSBvbGRTdHlsZTtcbiAgICAgICAgY29udGV4dC5nbG9iYWxBbHBoYSA9IG9sZEdsb2JhbEFscGhhO1xuXG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gICQkLnNiZ24uY2xvc2VzdEludGVyc2VjdGlvblBvaW50ID0gZnVuY3Rpb24gKHBvaW50LCBpbnRlcnNlY3Rpb25zKSB7XG4gICAgaWYgKGludGVyc2VjdGlvbnMubGVuZ3RoIDw9IDApXG4gICAgICByZXR1cm4gW107XG5cbiAgICB2YXIgY2xvc2VzdEludGVyc2VjdGlvbiA9IFtdO1xuICAgIHZhciBtaW5EaXN0YW5jZSA9IE51bWJlci5NQVhfVkFMVUU7XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGludGVyc2VjdGlvbnMubGVuZ3RoOyBpID0gaSArIDIpIHtcbiAgICAgIHZhciBjaGVja1BvaW50ID0gW2ludGVyc2VjdGlvbnNbaV0sIGludGVyc2VjdGlvbnNbaSArIDFdXTtcbiAgICAgIHZhciBkaXN0YW5jZSA9IGN5TWF0aC5jYWxjdWxhdGVEaXN0YW5jZShwb2ludCwgY2hlY2tQb2ludCk7XG5cbiAgICAgIGlmIChkaXN0YW5jZSA8IG1pbkRpc3RhbmNlKSB7XG4gICAgICAgIG1pbkRpc3RhbmNlID0gZGlzdGFuY2U7XG4gICAgICAgIGNsb3Nlc3RJbnRlcnNlY3Rpb24gPSBjaGVja1BvaW50O1xuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBjbG9zZXN0SW50ZXJzZWN0aW9uO1xuICB9O1xuXG4gICQkLnNiZ24ubnVjbGVpY0FjaWRJbnRlcnNlY3Rpb25MaW5lID0gZnVuY3Rpb24gKHgsIHksIG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgY29ybmVyUmFkaXVzLCBwYWRkaW5nKSB7XG4gICAgLy8gdmFyIG5vZGVYID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi54O1xuICAgIC8vIHZhciBub2RlWSA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueTtcbiAgICAvLyB2YXIgd2lkdGggPSBub2RlLndpZHRoKCk7XG4gICAgLy8gdmFyIGhlaWdodCA9IG5vZGUuaGVpZ2h0KCk7XG4gICAgLy8gdmFyIHBhZGRpbmcgPSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpIC8gMjtcblxuICAgIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gICAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuXG4gICAgdmFyIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnM7XG5cbiAgICAvLyBUb3Agc2VnbWVudCwgbGVmdCB0byByaWdodFxuICAgIHtcbiAgICAgIHZhciB0b3BTdGFydFggPSBub2RlWCAtIGhhbGZXaWR0aCAtIHBhZGRpbmc7XG4gICAgICB2YXIgdG9wU3RhcnRZID0gbm9kZVkgLSBoYWxmSGVpZ2h0IC0gcGFkZGluZztcbiAgICAgIHZhciB0b3BFbmRYID0gbm9kZVggKyBoYWxmV2lkdGggKyBwYWRkaW5nO1xuICAgICAgdmFyIHRvcEVuZFkgPSB0b3BTdGFydFk7XG5cbiAgICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBjeU1hdGguZmluaXRlTGluZXNJbnRlcnNlY3QoXG4gICAgICAgICAgICAgIHgsIHksIG5vZGVYLCBub2RlWSwgdG9wU3RhcnRYLCB0b3BTdGFydFksIHRvcEVuZFgsIHRvcEVuZFksIGZhbHNlKTtcblxuICAgICAgaWYgKHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSaWdodCBzZWdtZW50LCB0b3AgdG8gYm90dG9tXG4gICAge1xuICAgICAgdmFyIHJpZ2h0U3RhcnRYID0gbm9kZVggKyBoYWxmV2lkdGggKyBwYWRkaW5nO1xuICAgICAgdmFyIHJpZ2h0U3RhcnRZID0gbm9kZVkgLSBoYWxmSGVpZ2h0IC0gcGFkZGluZztcbiAgICAgIHZhciByaWdodEVuZFggPSByaWdodFN0YXJ0WDtcbiAgICAgIHZhciByaWdodEVuZFkgPSBub2RlWSArIGhhbGZIZWlnaHQgLSBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nO1xuXG4gICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gY3lNYXRoLmZpbml0ZUxpbmVzSW50ZXJzZWN0KFxuICAgICAgICAgICAgICB4LCB5LCBub2RlWCwgbm9kZVksIHJpZ2h0U3RhcnRYLCByaWdodFN0YXJ0WSwgcmlnaHRFbmRYLCByaWdodEVuZFksIGZhbHNlKTtcblxuICAgICAgaWYgKHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCb3R0b20gc2VnbWVudCwgbGVmdCB0byByaWdodFxuICAgIHtcbiAgICAgIHZhciBib3R0b21TdGFydFggPSBub2RlWCAtIGhhbGZXaWR0aCArIGNvcm5lclJhZGl1cyAtIHBhZGRpbmc7XG4gICAgICB2YXIgYm90dG9tU3RhcnRZID0gbm9kZVkgKyBoYWxmSGVpZ2h0ICsgcGFkZGluZztcbiAgICAgIHZhciBib3R0b21FbmRYID0gbm9kZVggKyBoYWxmV2lkdGggLSBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nO1xuICAgICAgdmFyIGJvdHRvbUVuZFkgPSBib3R0b21TdGFydFk7XG5cbiAgICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBjeU1hdGguZmluaXRlTGluZXNJbnRlcnNlY3QoXG4gICAgICAgICAgICAgIHgsIHksIG5vZGVYLCBub2RlWSwgYm90dG9tU3RhcnRYLCBib3R0b21TdGFydFksIGJvdHRvbUVuZFgsIGJvdHRvbUVuZFksIGZhbHNlKTtcblxuICAgICAgaWYgKHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucztcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMZWZ0IHNlZ21lbnQsIHRvcCB0byBib3R0b21cbiAgICB7XG4gICAgICB2YXIgbGVmdFN0YXJ0WCA9IG5vZGVYIC0gaGFsZldpZHRoIC0gcGFkZGluZztcbiAgICAgIHZhciBsZWZ0U3RhcnRZID0gbm9kZVkgLSBoYWxmSGVpZ2h0IC0gcGFkZGluZztcbiAgICAgIHZhciBsZWZ0RW5kWCA9IGxlZnRTdGFydFg7XG4gICAgICB2YXIgbGVmdEVuZFkgPSBub2RlWSArIGhhbGZIZWlnaHQgLSBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nO1xuXG4gICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gY3lNYXRoLmZpbml0ZUxpbmVzSW50ZXJzZWN0KFxuICAgICAgICAgICAgICB4LCB5LCBub2RlWCwgbm9kZVksIGxlZnRTdGFydFgsIGxlZnRTdGFydFksIGxlZnRFbmRYLCBsZWZ0RW5kWSwgZmFsc2UpO1xuXG4gICAgICBpZiAoc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGludGVyc2VjdGlvbnMgd2l0aCBhcmMgc2VnbWVudHMsIHdlIGhhdmUgb25seSB0d28gYXJjcyBmb3JcbiAgICAvL251Y2xlaWMgYWNpZCBmZWF0dXJlc1xuICAgIHZhciBhcmNJbnRlcnNlY3Rpb25zO1xuXG4gICAgLy8gQm90dG9tIFJpZ2h0XG4gICAge1xuICAgICAgdmFyIGJvdHRvbVJpZ2h0Q2VudGVyWCA9IG5vZGVYICsgaGFsZldpZHRoIC0gY29ybmVyUmFkaXVzO1xuICAgICAgdmFyIGJvdHRvbVJpZ2h0Q2VudGVyWSA9IG5vZGVZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1c1xuICAgICAgYXJjSW50ZXJzZWN0aW9ucyA9IGN5TWF0aC5pbnRlcnNlY3RMaW5lQ2lyY2xlKFxuICAgICAgICAgICAgICB4LCB5LCBub2RlWCwgbm9kZVksXG4gICAgICAgICAgICAgIGJvdHRvbVJpZ2h0Q2VudGVyWCwgYm90dG9tUmlnaHRDZW50ZXJZLCBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nKTtcblxuICAgICAgLy8gRW5zdXJlIHRoZSBpbnRlcnNlY3Rpb24gaXMgb24gdGhlIGRlc2lyZWQgcXVhcnRlciBvZiB0aGUgY2lyY2xlXG4gICAgICBpZiAoYXJjSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICYmIGFyY0ludGVyc2VjdGlvbnNbMF0gPj0gYm90dG9tUmlnaHRDZW50ZXJYXG4gICAgICAgICAgICAgICYmIGFyY0ludGVyc2VjdGlvbnNbMV0gPj0gYm90dG9tUmlnaHRDZW50ZXJZKSB7XG4gICAgICAgIHJldHVybiBbYXJjSW50ZXJzZWN0aW9uc1swXSwgYXJjSW50ZXJzZWN0aW9uc1sxXV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQm90dG9tIExlZnRcbiAgICB7XG4gICAgICB2YXIgYm90dG9tTGVmdENlbnRlclggPSBub2RlWCAtIGhhbGZXaWR0aCArIGNvcm5lclJhZGl1cztcbiAgICAgIHZhciBib3R0b21MZWZ0Q2VudGVyWSA9IG5vZGVZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1c1xuICAgICAgYXJjSW50ZXJzZWN0aW9ucyA9IGN5TWF0aC5pbnRlcnNlY3RMaW5lQ2lyY2xlKFxuICAgICAgICAgICAgICB4LCB5LCBub2RlWCwgbm9kZVksXG4gICAgICAgICAgICAgIGJvdHRvbUxlZnRDZW50ZXJYLCBib3R0b21MZWZ0Q2VudGVyWSwgY29ybmVyUmFkaXVzICsgcGFkZGluZyk7XG5cbiAgICAgIC8vIEVuc3VyZSB0aGUgaW50ZXJzZWN0aW9uIGlzIG9uIHRoZSBkZXNpcmVkIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuICAgICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdIDw9IGJvdHRvbUxlZnRDZW50ZXJYXG4gICAgICAgICAgICAgICYmIGFyY0ludGVyc2VjdGlvbnNbMV0gPj0gYm90dG9tTGVmdENlbnRlclkpIHtcbiAgICAgICAgcmV0dXJuIFthcmNJbnRlcnNlY3Rpb25zWzBdLCBhcmNJbnRlcnNlY3Rpb25zWzFdXTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIFtdOyAvLyBpZiBub3RoaW5nXG4gIH07XG5cbiAgLy90aGlzIGZ1bmN0aW9uIGdpdmVzIHRoZSBpbnRlcnNlY3Rpb25zIG9mIGFueSBsaW5lIHdpdGggdGhlIHVwcGVyIGhhbGYgb2YgcGVydHVyYmluZyBhZ2VudFxuICAkJC5zYmduLnBlcnR1cmJpbmdBZ2VudEludGVyc2VjdExpbmUgPSBmdW5jdGlvbiAoXG4gICAgICAgICAgeDEsIHkxLCB4MiwgeTIsIG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgcGFkZGluZykge1xuXG4gICAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgICB2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7XG5cbiAgICAvLyBDaGVjayBpbnRlcnNlY3Rpb25zIHdpdGggc3RyYWlnaHQgbGluZSBzZWdtZW50c1xuICAgIHZhciBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gW107XG5cbiAgICAvLyBUb3Agc2VnbWVudCwgbGVmdCB0byByaWdodFxuICAgIHtcbiAgICAgIHZhciB0b3BTdGFydFggPSBub2RlWCAtIGhhbGZXaWR0aCAtIHBhZGRpbmc7XG4gICAgICB2YXIgdG9wU3RhcnRZID0gbm9kZVkgLSBoYWxmSGVpZ2h0IC0gcGFkZGluZztcbiAgICAgIHZhciB0b3BFbmRYID0gbm9kZVggKyBoYWxmV2lkdGggKyBwYWRkaW5nO1xuICAgICAgdmFyIHRvcEVuZFkgPSB0b3BTdGFydFk7XG5cbiAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSBjeU1hdGguZmluaXRlTGluZXNJbnRlcnNlY3QoXG4gICAgICAgICAgICAgIHgxLCB5MSwgeDIsIHkyLCB0b3BTdGFydFgsIHRvcFN0YXJ0WSwgdG9wRW5kWCwgdG9wRW5kWSwgZmFsc2UpO1xuXG4gICAgICBpZiAoaW50ZXJzZWN0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMuY29uY2F0KGludGVyc2VjdGlvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmlnaHQgc2VnbWVudCwgdG9wIHRvIGJvdHRvbVxuICAgIHtcbiAgICAgIHZhciByaWdodFN0YXJ0WCA9IG5vZGVYICsgaGFsZldpZHRoICsgcGFkZGluZztcbiAgICAgIHZhciByaWdodFN0YXJ0WSA9IG5vZGVZIC0gaGFsZkhlaWdodCAtIHBhZGRpbmc7XG4gICAgICB2YXIgcmlnaHRFbmRYID0gcmlnaHRTdGFydFggLSBoYWxmV2lkdGgvMjtcbiAgICAgIHZhciByaWdodEVuZFkgPSBub2RlWSArIHBhZGRpbmc7XG5cbiAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSBjeU1hdGguZmluaXRlTGluZXNJbnRlcnNlY3QoXG4gICAgICAgICAgICAgIHgxLCB5MSwgeDIsIHkyLCByaWdodFN0YXJ0WCwgcmlnaHRTdGFydFksIHJpZ2h0RW5kWCwgcmlnaHRFbmRZLCBmYWxzZSk7XG5cbiAgICAgIGlmIChpbnRlcnNlY3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5jb25jYXQoaW50ZXJzZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMZWZ0IHNlZ21lbnQsIHRvcCB0byBib3R0b21cbiAgICB7XG4gICAgICB2YXIgbGVmdFN0YXJ0WCA9IG5vZGVYIC0gaGFsZldpZHRoIC0gcGFkZGluZztcbiAgICAgIHZhciBsZWZ0U3RhcnRZID0gbm9kZVkgLSBoYWxmSGVpZ2h0IC0gcGFkZGluZztcbiAgICAgIHZhciBsZWZ0RW5kWCA9IGxlZnRTdGFydFggKyBoYWxmV2lkdGgvMjtcbiAgICAgIHZhciBsZWZ0RW5kWSA9IG5vZGVZICsgcGFkZGluZztcblxuICAgICAgdmFyIGludGVyc2VjdGlvbiA9IGN5TWF0aC5maW5pdGVMaW5lc0ludGVyc2VjdChcbiAgICAgICAgICAgICAgeDEsIHkxLCB4MiwgeTIsIGxlZnRTdGFydFgsIGxlZnRTdGFydFksIGxlZnRFbmRYLCBsZWZ0RW5kWSwgZmFsc2UpO1xuXG4gICAgICBpZiAoaW50ZXJzZWN0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMuY29uY2F0KGludGVyc2VjdGlvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnM7XG4gIH07XG5cbiAgLy90aGlzIGZ1bmN0aW9uIGdpdmVzIHRoZSBpbnRlcnNlY3Rpb25zIG9mIGFueSBsaW5lIHdpdGggYSByb3VuZCByZWN0YW5nbGVcbiAgJCQuc2Jnbi5yb3VuZFJlY3RhbmdsZUludGVyc2VjdExpbmUgPSBmdW5jdGlvbiAoXG4gICAgICAgICAgeDEsIHkxLCB4MiwgeTIsIG5vZGVYLCBub2RlWSwgd2lkdGgsIGhlaWdodCwgY29ybmVyUmFkaXVzLCBwYWRkaW5nKSB7XG5cbiAgICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICAgIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcblxuICAgIC8vIENoZWNrIGludGVyc2VjdGlvbnMgd2l0aCBzdHJhaWdodCBsaW5lIHNlZ21lbnRzXG4gICAgdmFyIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBbXTtcbiAgICAvLyBUb3Agc2VnbWVudCwgbGVmdCB0byByaWdodFxuICAgIHtcbiAgICAgIHZhciB0b3BTdGFydFggPSBub2RlWCAtIGhhbGZXaWR0aCArIGNvcm5lclJhZGl1cyAtIHBhZGRpbmc7XG4gICAgICB2YXIgdG9wU3RhcnRZID0gbm9kZVkgLSBoYWxmSGVpZ2h0IC0gcGFkZGluZztcbiAgICAgIHZhciB0b3BFbmRYID0gbm9kZVggKyBoYWxmV2lkdGggLSBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nO1xuICAgICAgdmFyIHRvcEVuZFkgPSB0b3BTdGFydFk7XG5cbiAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSBjeU1hdGguZmluaXRlTGluZXNJbnRlcnNlY3QoXG4gICAgICAgICAgICAgIHgxLCB5MSwgeDIsIHkyLCB0b3BTdGFydFgsIHRvcFN0YXJ0WSwgdG9wRW5kWCwgdG9wRW5kWSwgZmFsc2UpO1xuXG4gICAgICBpZiAoaW50ZXJzZWN0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMuY29uY2F0KGludGVyc2VjdGlvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmlnaHQgc2VnbWVudCwgdG9wIHRvIGJvdHRvbVxuICAgIHtcbiAgICAgIHZhciByaWdodFN0YXJ0WCA9IG5vZGVYICsgaGFsZldpZHRoICsgcGFkZGluZztcbiAgICAgIHZhciByaWdodFN0YXJ0WSA9IG5vZGVZIC0gaGFsZkhlaWdodCArIGNvcm5lclJhZGl1cyAtIHBhZGRpbmc7XG4gICAgICB2YXIgcmlnaHRFbmRYID0gcmlnaHRTdGFydFg7XG4gICAgICB2YXIgcmlnaHRFbmRZID0gbm9kZVkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyUmFkaXVzICsgcGFkZGluZztcblxuICAgICAgdmFyIGludGVyc2VjdGlvbiA9IGN5TWF0aC5maW5pdGVMaW5lc0ludGVyc2VjdChcbiAgICAgICAgICAgICAgeDEsIHkxLCB4MiwgeTIsIHJpZ2h0U3RhcnRYLCByaWdodFN0YXJ0WSwgcmlnaHRFbmRYLCByaWdodEVuZFksIGZhbHNlKTtcblxuICAgICAgaWYgKGludGVyc2VjdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmNvbmNhdChpbnRlcnNlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJvdHRvbSBzZWdtZW50LCBsZWZ0IHRvIHJpZ2h0XG4gICAge1xuICAgICAgdmFyIGJvdHRvbVN0YXJ0WCA9IG5vZGVYIC0gaGFsZldpZHRoICsgY29ybmVyUmFkaXVzIC0gcGFkZGluZztcbiAgICAgIHZhciBib3R0b21TdGFydFkgPSBub2RlWSArIGhhbGZIZWlnaHQgKyBwYWRkaW5nO1xuICAgICAgdmFyIGJvdHRvbUVuZFggPSBub2RlWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cyArIHBhZGRpbmc7XG4gICAgICB2YXIgYm90dG9tRW5kWSA9IGJvdHRvbVN0YXJ0WTtcblxuICAgICAgdmFyIGludGVyc2VjdGlvbiA9IGN5TWF0aC5maW5pdGVMaW5lc0ludGVyc2VjdChcbiAgICAgICAgICAgICAgeDEsIHkxLCB4MiwgeTIsIGJvdHRvbVN0YXJ0WCwgYm90dG9tU3RhcnRZLCBib3R0b21FbmRYLCBib3R0b21FbmRZLCBmYWxzZSk7XG5cbiAgICAgIGlmIChpbnRlcnNlY3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5jb25jYXQoaW50ZXJzZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBMZWZ0IHNlZ21lbnQsIHRvcCB0byBib3R0b21cbiAgICB7XG4gICAgICB2YXIgbGVmdFN0YXJ0WCA9IG5vZGVYIC0gaGFsZldpZHRoIC0gcGFkZGluZztcbiAgICAgIHZhciBsZWZ0U3RhcnRZID0gbm9kZVkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyUmFkaXVzIC0gcGFkZGluZztcbiAgICAgIHZhciBsZWZ0RW5kWCA9IGxlZnRTdGFydFg7XG4gICAgICB2YXIgbGVmdEVuZFkgPSBub2RlWSArIGhhbGZIZWlnaHQgLSBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nO1xuXG4gICAgICB2YXIgaW50ZXJzZWN0aW9uID0gY3lNYXRoLmZpbml0ZUxpbmVzSW50ZXJzZWN0KFxuICAgICAgICAgICAgICB4MSwgeTEsIHgyLCB5MiwgbGVmdFN0YXJ0WCwgbGVmdFN0YXJ0WSwgbGVmdEVuZFgsIGxlZnRFbmRZLCBmYWxzZSk7XG5cbiAgICAgIGlmIChpbnRlcnNlY3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5jb25jYXQoaW50ZXJzZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBpbnRlcnNlY3Rpb25zIHdpdGggYXJjIHNlZ21lbnRzXG4gICAgdmFyIGFyY0ludGVyc2VjdGlvbnM7XG5cbiAgICAvLyBUb3AgTGVmdFxuICAgIHtcbiAgICAgIHZhciB0b3BMZWZ0Q2VudGVyWCA9IG5vZGVYIC0gaGFsZldpZHRoICsgY29ybmVyUmFkaXVzO1xuICAgICAgdmFyIHRvcExlZnRDZW50ZXJZID0gbm9kZVkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyUmFkaXVzXG4gICAgICBhcmNJbnRlcnNlY3Rpb25zID0gY3lNYXRoLmludGVyc2VjdExpbmVDaXJjbGUoXG4gICAgICAgICAgICAgIHgxLCB5MSwgeDIsIHkyLFxuICAgICAgICAgICAgICB0b3BMZWZ0Q2VudGVyWCwgdG9wTGVmdENlbnRlclksIGNvcm5lclJhZGl1cyArIHBhZGRpbmcpO1xuXG4gICAgICAvLyBFbnN1cmUgdGhlIGludGVyc2VjdGlvbiBpcyBvbiB0aGUgZGVzaXJlZCBxdWFydGVyIG9mIHRoZSBjaXJjbGVcbiAgICAgIGlmIChhcmNJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgJiYgYXJjSW50ZXJzZWN0aW9uc1swXSA8PSB0b3BMZWZ0Q2VudGVyWFxuICAgICAgICAgICAgICAmJiBhcmNJbnRlcnNlY3Rpb25zWzFdIDw9IHRvcExlZnRDZW50ZXJZKSB7XG4gICAgICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmNvbmNhdChhcmNJbnRlcnNlY3Rpb25zKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBUb3AgUmlnaHRcbiAgICB7XG4gICAgICB2YXIgdG9wUmlnaHRDZW50ZXJYID0gbm9kZVggKyBoYWxmV2lkdGggLSBjb3JuZXJSYWRpdXM7XG4gICAgICB2YXIgdG9wUmlnaHRDZW50ZXJZID0gbm9kZVkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyUmFkaXVzXG4gICAgICBhcmNJbnRlcnNlY3Rpb25zID0gY3lNYXRoLmludGVyc2VjdExpbmVDaXJjbGUoXG4gICAgICAgICAgICAgIHgxLCB5MSwgeDIsIHkyLFxuICAgICAgICAgICAgICB0b3BSaWdodENlbnRlclgsIHRvcFJpZ2h0Q2VudGVyWSwgY29ybmVyUmFkaXVzICsgcGFkZGluZyk7XG5cbiAgICAgIC8vIEVuc3VyZSB0aGUgaW50ZXJzZWN0aW9uIGlzIG9uIHRoZSBkZXNpcmVkIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuICAgICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdID49IHRvcFJpZ2h0Q2VudGVyWFxuICAgICAgICAgICAgICAmJiBhcmNJbnRlcnNlY3Rpb25zWzFdIDw9IHRvcFJpZ2h0Q2VudGVyWSkge1xuICAgICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5jb25jYXQoYXJjSW50ZXJzZWN0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQm90dG9tIFJpZ2h0XG4gICAge1xuICAgICAgdmFyIGJvdHRvbVJpZ2h0Q2VudGVyWCA9IG5vZGVYICsgaGFsZldpZHRoIC0gY29ybmVyUmFkaXVzO1xuICAgICAgdmFyIGJvdHRvbVJpZ2h0Q2VudGVyWSA9IG5vZGVZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1c1xuICAgICAgYXJjSW50ZXJzZWN0aW9ucyA9IGN5TWF0aC5pbnRlcnNlY3RMaW5lQ2lyY2xlKFxuICAgICAgICAgICAgICB4MSwgeTEsIHgyLCB5MixcbiAgICAgICAgICAgICAgYm90dG9tUmlnaHRDZW50ZXJYLCBib3R0b21SaWdodENlbnRlclksIGNvcm5lclJhZGl1cyArIHBhZGRpbmcpO1xuXG4gICAgICAvLyBFbnN1cmUgdGhlIGludGVyc2VjdGlvbiBpcyBvbiB0aGUgZGVzaXJlZCBxdWFydGVyIG9mIHRoZSBjaXJjbGVcbiAgICAgIGlmIChhcmNJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgJiYgYXJjSW50ZXJzZWN0aW9uc1swXSA+PSBib3R0b21SaWdodENlbnRlclhcbiAgICAgICAgICAgICAgJiYgYXJjSW50ZXJzZWN0aW9uc1sxXSA+PSBib3R0b21SaWdodENlbnRlclkpIHtcbiAgICAgICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMuY29uY2F0KGFyY0ludGVyc2VjdGlvbnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJvdHRvbSBMZWZ0XG4gICAge1xuICAgICAgdmFyIGJvdHRvbUxlZnRDZW50ZXJYID0gbm9kZVggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXM7XG4gICAgICB2YXIgYm90dG9tTGVmdENlbnRlclkgPSBub2RlWSArIGhhbGZIZWlnaHQgLSBjb3JuZXJSYWRpdXNcbiAgICAgIGFyY0ludGVyc2VjdGlvbnMgPSBjeU1hdGguaW50ZXJzZWN0TGluZUNpcmNsZShcbiAgICAgICAgICAgICAgeDEsIHkxLCB4MiwgeTIsXG4gICAgICAgICAgICAgIGJvdHRvbUxlZnRDZW50ZXJYLCBib3R0b21MZWZ0Q2VudGVyWSwgY29ybmVyUmFkaXVzICsgcGFkZGluZyk7XG5cbiAgICAgIC8vIEVuc3VyZSB0aGUgaW50ZXJzZWN0aW9uIGlzIG9uIHRoZSBkZXNpcmVkIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuICAgICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdIDw9IGJvdHRvbUxlZnRDZW50ZXJYXG4gICAgICAgICAgICAgICYmIGFyY0ludGVyc2VjdGlvbnNbMV0gPj0gYm90dG9tTGVmdENlbnRlclkpIHtcbiAgICAgICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMuY29uY2F0KGFyY0ludGVyc2VjdGlvbnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApXG4gICAgICByZXR1cm4gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucztcbiAgICByZXR1cm4gW107IC8vIGlmIG5vdGhpbmdcbiAgfTtcblxuICAkJC5zYmduLmludGVyc2VjdExpbmVFbGxpcHNlID0gZnVuY3Rpb24gKFxuICAgICAgICAgIHgxLCB5MSwgeDIsIHkyLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nKSB7XG5cbiAgICB2YXIgdyA9IHdpZHRoIC8gMiArIHBhZGRpbmc7XG4gICAgdmFyIGggPSBoZWlnaHQgLyAyICsgcGFkZGluZztcbiAgICB2YXIgYW4gPSBjZW50ZXJYO1xuICAgIHZhciBibiA9IGNlbnRlclk7XG5cbiAgICB2YXIgZCA9IFt4MiAtIHgxLCB5MiAtIHkxXTtcblxuICAgIHZhciBtID0gZFsxXSAvIGRbMF07XG4gICAgdmFyIG4gPSAtMSAqIG0gKiB4MiArIHkyO1xuICAgIHZhciBhID0gaCAqIGggKyB3ICogdyAqIG0gKiBtO1xuICAgIHZhciBiID0gLTIgKiBhbiAqIGggKiBoICsgMiAqIG0gKiBuICogdyAqIHcgLSAyICogYm4gKiBtICogdyAqIHc7XG4gICAgdmFyIGMgPSBhbiAqIGFuICogaCAqIGggKyBuICogbiAqIHcgKiB3IC0gMiAqIGJuICogdyAqIHcgKiBuICtcbiAgICAgICAgICAgIGJuICogYm4gKiB3ICogdyAtIGggKiBoICogdyAqIHc7XG5cbiAgICB2YXIgZGlzY3JpbWluYW50ID0gYiAqIGIgLSA0ICogYSAqIGM7XG5cbiAgICBpZiAoZGlzY3JpbWluYW50IDwgMCkge1xuICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIHZhciB0MSA9ICgtYiArIE1hdGguc3FydChkaXNjcmltaW5hbnQpKSAvICgyICogYSk7XG4gICAgdmFyIHQyID0gKC1iIC0gTWF0aC5zcXJ0KGRpc2NyaW1pbmFudCkpIC8gKDIgKiBhKTtcblxuICAgIHZhciB4TWluID0gTWF0aC5taW4odDEsIHQyKTtcbiAgICB2YXIgeE1heCA9IE1hdGgubWF4KHQxLCB0Mik7XG5cbiAgICB2YXIgeU1pbiA9IG0gKiB4TWluIC0gbSAqIHgyICsgeTI7XG4gICAgdmFyIHlNYXggPSBtICogeE1heCAtIG0gKiB4MiArIHkyO1xuXG4gICAgcmV0dXJuIFt4TWluLCB5TWluLCB4TWF4LCB5TWF4XTtcbiAgfTtcblxuICAkJC5zYmduLmludGVyc2VjdExpbmVTdGF0ZUFuZEluZm9Cb3hlcyA9IGZ1bmN0aW9uIChub2RlLCB4LCB5KSB7XG4gICAgdmFyIGNlbnRlclggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLng7XG4gICAgdmFyIGNlbnRlclkgPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLnk7XG4gICAgdmFyIHBhZGRpbmcgPSBwYXJzZUludChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpIC8gMjtcblxuICAgIHZhciBzdGF0ZUFuZEluZm9zID0gbm9kZS5fcHJpdmF0ZS5kYXRhLnN0YXRlc2FuZGluZm9zO1xuXG4gICAgdmFyIGludGVyc2VjdGlvbnMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RhdGVBbmRJbmZvcy5sZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHN0YXRlID0gc3RhdGVBbmRJbmZvc1tpXTtcblxuICAgICAgaWYgKCAhc3RhdGUuaXNEaXNwbGF5ZWQgKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICB2YXIgaW5mb0JveFdpZHRoID0gc3RhdGUuYmJveC53O1xuICAgICAgdmFyIGluZm9Cb3hIZWlnaHQgPSBzdGF0ZS5iYm94Lmg7XG5cbiAgICAgIHZhciBjdXJySW50ZXJzZWN0aW9ucyA9IG51bGw7XG4gICAgICBpZiAoIHN0YXRlLmNsYXp6ID09IFwic3RhdGUgdmFyaWFibGVcIiApIHtcbiAgICAgICAgdmFyIGNvb3JkID0gY2xhc3Nlcy5TdGF0ZVZhcmlhYmxlLmdldEFic29sdXRlQ29vcmQoc3RhdGUsIG5vZGUuY3koKSk7XG4gICAgICAgIGN1cnJJbnRlcnNlY3Rpb25zID0gJCQuc2Jnbi5pbnRlcnNlY3RMaW5lRWxsaXBzZSh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgICAgIGNvb3JkLngsIGNvb3JkLnksIGluZm9Cb3hXaWR0aCwgaW5mb0JveEhlaWdodCwgcGFkZGluZyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmICggc3RhdGUuY2xhenogPT0gXCJyZXNpZHVlIHZhcmlhYmxlXCIgKSB7XG4gICAgICAgIHZhciBjb29yZCA9IGNsYXNzZXMuUmVzaWR1ZVZhcmlhYmxlLmdldEFic29sdXRlQ29vcmQoc3RhdGUsIG5vZGUuY3koKSk7XG4gICAgICAgIGN1cnJJbnRlcnNlY3Rpb25zID0gJCQuc2Jnbi5pbnRlcnNlY3RMaW5lRWxsaXBzZSh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgICAgIGNvb3JkLngsIGNvb3JkLnksIGluZm9Cb3hXaWR0aCwgaW5mb0JveEhlaWdodCwgcGFkZGluZyk7XG4gICAgICB9XG4gICAgICBlbHNlIGlmICggc3RhdGUuY2xhenogPT0gXCJiaW5kaW5nIHJlZ2lvblwiICkge1xuICAgICAgICB2YXIgY29vcmQgPSBjbGFzc2VzLkJpbmRpbmdSZWdpb24uZ2V0QWJzb2x1dGVDb29yZChzdGF0ZSwgbm9kZS5jeSgpKTtcbiAgICAgICAgY3VyckludGVyc2VjdGlvbnMgPSAkJC5zYmduLmludGVyc2VjdExpbmVFbGxpcHNlKHgsIHksIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgICAgY29vcmQueCwgY29vcmQueSwgaW5mb0JveFdpZHRoLCBpbmZvQm94SGVpZ2h0LCBwYWRkaW5nKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKCBzdGF0ZS5jbGF6eiA9PSBcInVuaXQgb2YgaW5mb3JtYXRpb25cIiApIHtcbiAgICAgICAgdmFyIGNvb3JkID0gY2xhc3Nlcy5Vbml0T2ZJbmZvcm1hdGlvbi5nZXRBYnNvbHV0ZUNvb3JkKHN0YXRlLCBub2RlLmN5KCkpO1xuICAgICAgICBpZiAobm9kZS5kYXRhKFwiY2xhc3NcIikgPT0gXCJCQSBtYWNyb21vbGVjdWxlXCIgfHwgbm9kZS5kYXRhKFwiY2xhc3NcIikgPT0gXCJCQSBudWNsZWljIGFjaWQgZmVhdHVyZVwiXG4gICAgICAgICAgICAgICAgfHwgbm9kZS5kYXRhKFwiY2xhc3NcIikgPT0gXCJCQSBjb21wbGV4XCIpe1xuICAgICAgICAgIGN1cnJJbnRlcnNlY3Rpb25zID0gJCQuc2Jnbi5yb3VuZFJlY3RhbmdsZUludGVyc2VjdExpbmUoeCwgeSwgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICAgICAgICBjb29yZC54LCBjb29yZC55LCBpbmZvQm94V2lkdGgsIGluZm9Cb3hIZWlnaHQsIDUsIHBhZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUuZGF0YShcImNsYXNzXCIpID09IFwiQkEgdW5zcGVjaWZpZWQgZW50aXR5XCIpe1xuICAgICAgICAgIGN1cnJJbnRlcnNlY3Rpb25zID0gJCQuc2Jnbi5pbnRlcnNlY3RMaW5lRWxsaXBzZSh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgICBjb29yZC54LCBjb29yZC55LCBpbmZvQm94V2lkdGgsIGluZm9Cb3hIZWlnaHQsIHBhZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUuZGF0YShcImNsYXNzXCIpID09IFwiQkEgc2ltcGxlIGNoZW1pY2FsXCIpe1xuICAgICAgICAgIGN1cnJJbnRlcnNlY3Rpb25zID0gY3lNYXRoLmludGVyc2VjdExpbmVDaXJjbGUoXG4gICAgICAgICAgICAgIHgsIHksXG4gICAgICAgICAgICAgIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgIGNvb3JkLngsXG4gICAgICAgICAgICAgIGNvb3JkLnksXG4gICAgICAgICAgICAgIGluZm9Cb3hXaWR0aCAvIDQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG5vZGUuZGF0YShcImNsYXNzXCIpID09IFwiQkEgcGVydHVyYmluZyBhZ2VudFwiKXtcbiAgICAgICAgICBjdXJySW50ZXJzZWN0aW9ucyA9ICQkLnNiZ24ucGVydHVyYmluZ0FnZW50SW50ZXJzZWN0TGluZSh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgICBjb29yZC54LCBjb29yZC55LCBpbmZvQm94V2lkdGgsIGluZm9Cb3hIZWlnaHQsIHBhZGRpbmcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgIGN1cnJJbnRlcnNlY3Rpb25zID0gJCQuc2Jnbi5yb3VuZFJlY3RhbmdsZUludGVyc2VjdExpbmUoeCwgeSwgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICAgICAgICAgIGNvb3JkLngsIGNvb3JkLnksIGluZm9Cb3hXaWR0aCwgaW5mb0JveEhlaWdodCwgMCwgcGFkZGluZyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgaW50ZXJzZWN0aW9ucyA9IGludGVyc2VjdGlvbnMuY29uY2F0KCBjdXJySW50ZXJzZWN0aW9ucyApO1xuXG4gICAgfVxuXG4gICAgcmV0dXJuIGludGVyc2VjdGlvbnM7XG4gIH07XG5cbiAgJCQuc2Jnbi5jaGVja1BvaW50U3RhdGVBbmRJbmZvQm94ZXMgPSBmdW5jdGlvbiAoeCwgeSwgbm9kZSwgdGhyZXNob2xkKSB7XG4gICAgcmV0dXJuIGNsYXNzZXMuQXV4aWxpYXJ5VW5pdC5jaGVja1BvaW50KHgsIHksIG5vZGUsIHRocmVzaG9sZCk7XG4gIH07XG5cbiAgJCQuc2Jnbi5pc05vZGVTaGFwZVRvdGFsbHlPdmVycmlkZW4gPSBmdW5jdGlvbiAocmVuZGVyLCBub2RlKSB7XG4gICAgaWYgKHRvdGFsbHlPdmVycmlkZW5Ob2RlU2hhcGVzW3JlbmRlci5nZXROb2RlU2hhcGUobm9kZSldKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG59O1xuIl0sIm5hbWVzIjpbImxpYnMiLCJyZXF1aXJlIiwiZ2V0TGlicyIsImpRdWVyeSIsIiQiLCJjeXRvc2NhcGUiLCJjeU1hdGgiLCJtYXRoIiwiY3lCYXNlTm9kZVNoYXBlcyIsImJhc2VOb2RlU2hhcGVzIiwiY3lTdHlsZVByb3BlcnRpZXMiLCJzdHlsZVByb3BlcnRpZXMiLCJjbGFzc2VzIiwibW9kdWxlIiwiZXhwb3J0cyIsIiQkIiwic2JnbiIsImRyYXdCb3JkZXIiLCJfcmVmIiwiY29udGV4dCIsIm5vZGUiLCJib3JkZXJXaWR0aCIsImJvcmRlckNvbG9yIiwiYm9yZGVyU3R5bGUiLCJib3JkZXJPcGFjaXR5IiwicGFyc2VGbG9hdCIsImNzcyIsInBhcmVudE9wYWNpdHkiLCJlZmZlY3RpdmVPcGFjaXR5IiwicHJvcHNUb1Jlc3RvcmUiLCJpbml0aWFsUHJvcHMiLCJmb3JFYWNoIiwicHJvcE5hbWUiLCJsaW5lV2lkdGgiLCJsaW5lQ2FwIiwic3Ryb2tlU3R5bGUiLCJnbG9iYWxBbHBoYSIsInNldExpbmVEYXNoIiwic3Ryb2tlIiwiZ2NvIiwiZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uIiwiZHJhd1JvdW5kUmVjdGFuZ2xlUGF0aCIsIngiLCJ5Iiwid2lkdGgiLCJoZWlnaHQiLCJyYWRpdXMiLCJoYWxmV2lkdGgiLCJoYWxmSGVpZ2h0IiwiY29ybmVyUmFkaXVzIiwiZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMiLCJiZWdpblBhdGgiLCJtb3ZlVG8iLCJhcmNUbyIsImxpbmVUbyIsImNsb3NlUGF0aCIsImRyYXdQcm90ZWluUGF0aCIsImRyYXdQcm90ZWluIiwiYWN0aXZlUGFkZGluZzEiLCJkcmF3UmVjZXB0b3JQYXRoIiwiZHJhd1JlY2VwdG9yIiwiaGFsZlBhZGRpbmciLCJoYWxmVyIsImhhbGZIIiwiZHJhd1JvdW5kZWREcnVnUGF0aCIsImRyYXdSb3VuZGVkRHJ1ZyIsIk1hdGgiLCJtaW4iLCJoYWxmV2lkdGhJbm5lciIsImhhbGZIZWlnaHRJbm5lciIsImRyYXdQb2x5Z29uUGF0aCIsInBvaW50cyIsImkiLCJsZW5ndGgiLCJzYmduU2hhcGVzIiwidG90YWxseU92ZXJyaWRlbk5vZGVTaGFwZXMiLCJjYW5IYXZlSW5mb0JveFNoYXBlcyIsImNhbkJlTXVsdGltZXJTaGFwZXMiLCJjYW5CZUFjdGl2ZVNoYXBlcyIsImNhbkJlSHlwb3RoZXRpY2FsU2hhcGVzIiwiY2FsY3VsYXRlRGlzdGFuY2UiLCJwb2ludDEiLCJwb2ludDIiLCJkaXN0YW5jZSIsInBvdyIsInNxcnQiLCJjb2xvcnMiLCJjbG9uZSIsImdldERlZmF1bHRDb21wbGV4Q29ybmVyTGVuZ3RoIiwiZ2V0RGVmYXVsdEdlbmVDb3JuZXJMZW5ndGgiLCJkcmF3U3RhdGVBbmRJbmZvcyIsImNlbnRlclgiLCJjZW50ZXJZIiwibGF5b3V0cyIsImRhdGEiLCJzaWRlIiwibGF5b3V0IiwiQXV4VW5pdExheW91dCIsImRyYXciLCJjeSIsImRyYXdJbmZvQm94Iiwic2hhcGVOYW1lIiwiZHJhd0JvdHRvbVJvdW5kUmVjdGFuZ2xlIiwiZHJhd0NvbXBsZXgiLCJnZW5lcmF0ZVBlcnR1cmJpbmdBZ2VudFBvaW50cyIsIm51Y2xlaWNBY2lkQ2hlY2tQb2ludCIsInBhZGRpbmciLCJwb2ludEluc2lkZVBvbHlnb24iLCJjaGVja0luRWxsaXBzZSIsImZvcmNlT3BhY2l0eVRvT25lIiwiZmlsbFN0eWxlIiwiX3ByaXZhdGUiLCJzdHlsZSIsInZhbHVlIiwiZHJhd1NpbXBsZUNoZW1pY2FsUGF0aCIsImRyYXdTaW1wbGVDaGVtaWNhbCIsImZpbGwiLCJzaW1wbGVDaGVtaWNhbExlZnRDbG9uZSIsImNsb25lTWFya2VyIiwib3BhY2l0eSIsIm9sZEdsb2JhbEFscGhhIiwib2xkU3R5bGUiLCJtYXJrZXJCZWdpblgiLCJzaW4iLCJQSSIsIm1hcmtlckJlZ2luWSIsImNvcyIsIm1hcmtlckVuZFgiLCJtYXJrZXJFbmRZIiwiYXJjIiwic2ltcGxlQ2hlbWljYWxSaWdodENsb25lIiwiZHJhd0VsbGlwc2VQYXRoIiwiZHJhd1BhdGgiLCJkcmF3QmFycmVsIiwiZHJhd051Y0FjaWRGZWF0dXJlMiIsImxlZnQiLCJyaWdodCIsImJvdHRvbSIsInRvcCIsImVuZHNXaXRoIiwic3RyIiwicGF0dGVybiIsImwiLCJjaGFyQXQiLCJpc011bHRpbWVyIiwic2JnbkNsYXNzIiwiaXNBY3RpdmUiLCJzdGFydHNXaXRoIiwiaXNIeXBvdGhldGljYWwiLCJpbmNsdWRlcyIsImdlbmVyYXRlQ29tcGxleFNoYXBlUG9pbnRzIiwiY29ybmVyTGVuZ3RoIiwiY3BYIiwiY3BZIiwiY29tcGxleFBvaW50cyIsImdlbmVyYXRlR2VuZVNoYXBlUG9pbnRzIiwiZ2VuZXJhdGVSTkFTaGFwZVBvaW50cyIsImdlbmVyYXRlUmVjZXB0b3JTaGFwZVBvaW50cyIsImdldERlZmF1bHRNdWx0aW1lclBhZGRpbmciLCJnZXREZWZhdWx0QWN0aXZlUGFkZGluZyIsImRyYXdJbWFnZSIsImltZ09iaiIsImNsaXAiLCJpbWciLCJpbWdXIiwiaW1nSCIsInciLCJoIiwicmVzdG9yZSIsInR5cGVzIiwibm9kZVNoYXBlIiwiZW51bXMiLCJwdXNoIiwicmVnaXN0ZXJTYmduTm9kZVNoYXBlcyIsImdlbmVyYXRlRHJhd0ZjbiIsIl9yZWYyIiwicGxhaW5EcmF3RmNuIiwiZXh0cmFEcmF3RmNuIiwiY2FuQmVNdWx0aW1lciIsImNsb25lTWFya2VyRmNuIiwiY2FuQmVBY3RpdmUiLCJjYW5CZUh5cG90aGV0aWNhbCIsImNhbkhhdmVJbmZvQm94IiwibXVsdGltZXJQYWRkaW5nIiwiYWN0aXZlUGFkZGluZyIsIm91dGVyV2lkdGgiLCJvdXRlckhlaWdodCIsInBvc2l0aW9uIiwiYmdPcGFjaXR5IiwiaXNDbG9uZWQiLCJjbG9uZW1hcmtlciIsImRyYXdPcGVuSW9uQ2hhbm5lbCIsImRyYXdJb25DaGFubmVsIiwiZ2VuZXJhdGVJbnRlcnNlY3RMaW5lRmNuIiwiX3JlZjMiLCJwbGFpbkludGVyc2VjdExpbmVGY24iLCJpbnRlcnNlY3Rpb25zIiwic3RhdGVBbmRJbmZvSW50ZXJzZWN0TGluZXMiLCJpbnRlcnNlY3RMaW5lU3RhdGVBbmRJbmZvQm94ZXMiLCJjb25jYXQiLCJub2RlSW50ZXJzZWN0TGluZXMiLCJtdWx0aW1lckludGVyc2VjdGlvbkxpbmVzIiwiYWN0aXZlSW50ZXJzZWN0aW9uTGluZXMiLCJoeXBvdGhldGljYWxJbnRlcnNlY3Rpb25MaW5lcyIsImNsb3Nlc3RJbnRlcnNlY3Rpb25Qb2ludCIsImdlbmVyYXRlQ2hlY2tQb2ludEZjbiIsIl9yZWY0IiwicGxhaW5DaGVja1BvaW50RmNuIiwidGhyZXNob2xkIiwibm9kZUNoZWNrIiwic3RhdGVBbmRJbmZvQ2hlY2siLCJjaGVja1BvaW50U3RhdGVBbmRJbmZvQm94ZXMiLCJtdWx0aW1lckNoZWNrIiwiYWN0aXZlQ2hlY2siLCJoeXBvdGhldGljYWxDaGVjayIsInNoYXBlTmFtZXMiLCJwbGFpbkRyYXciLCJwbGFpbkludGVyc2VjdExpbmUiLCJwbGFpbkNoZWNrUG9pbnQiLCJleHRyYURyYXciLCJpbnRlcnNlY3RMaW5lIiwiY2hlY2tQb2ludCIsInNoYXBlIiwiZHJhd0VsbGlwc2UiLCJkcmF3VHJ1bmNhdGVkUHJvdGVpbiIsImRyYXdHZW5lIiwiZHJhd1JOQSIsImRyYXdQaGVub3R5cGUiLCJkcmF3Q3Jvc3NMaW5lIiwiZ2VuZXJhdGVVbml0TmdvblBvaW50cyIsInNjYWxlWCIsInNjYWxlWSIsImRyYXdCaW9sb2dpY2FsQWN0aXZpdHkiLCJnZW5lcmF0ZUJpb2xvZ2ljYWxBY3Rpdml0eVBvaW50cyIsImRyYXdSb3VuZFJlY3RhbmdsZSIsImdlbmVyYXRlTnVjbGVpY0FjaWRQb2ludHMiLCJnZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUiLCJnZW5lcmF0ZUNvbXBhcnRtZW50UG9pbnRzIiwic2ltcGxlQ2hlbWljYWwiLCJtYWNyb21vbGVjdWxlIiwicm91bmRSZWN0YW5nbGVJbnRlcnNlY3RMaW5lIiwiY29tcGxleCIsInBvbHlnb25JbnRlcnNlY3RMaW5lIiwibnVjbGVpY0FjaWRGZWF0dXJlIiwiZW1wdHlTZXQiLCJkZWdyYWRhdGlvbiIsImJpb2xvZ2ljYWxBY3Rpdml0eSIsImNvbXBhcnRtZW50Iiwib2xkQ29tcGFydG1lbnQiLCJwcm90ZWluIiwiZ2VuZSIsInJuYSIsInJlY2VwdG9yIiwiaW9uQ2hhbm5lbCIsInRydW5jYXRlZFByb3RlaW4iLCJpb24iLCJzaW1wbGVNb2xlY3VsZSIsInVua25vd25Nb2xlY3VsZSIsImRydWciLCJwaGVub3R5cGVTYm1sIiwiY29tcGxleFNibWwiLCJkaWFtIiwiZmlyc3RDaXJjbGVDZW50ZXJYIiwiZmlyc3RDaXJjbGVDZW50ZXJZIiwic2Vjb25kQ2lyY2xlQ2VudGVyWCIsInNlY29uZENpcmNsZUNlbnRlclkiLCJib3R0b21DaXJjbGVDZW50ZXJYIiwiYm90dG9tQ2lyY2xlQ2VudGVyWSIsInJlY1BvaW50cyIsImNsb25lWCIsImNsb25lWSIsImNsb25lV2lkdGgiLCJjbG9uZUhlaWdodCIsIm1hcmtlclBvaW50cyIsInBvaW50IiwiY2xvc2VzdEludGVyc2VjdGlvbiIsIm1pbkRpc3RhbmNlIiwiTnVtYmVyIiwiTUFYX1ZBTFVFIiwibnVjbGVpY0FjaWRJbnRlcnNlY3Rpb25MaW5lIiwibm9kZVgiLCJub2RlWSIsInN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMiLCJ0b3BTdGFydFgiLCJ0b3BTdGFydFkiLCJ0b3BFbmRYIiwidG9wRW5kWSIsImZpbml0ZUxpbmVzSW50ZXJzZWN0IiwicmlnaHRTdGFydFgiLCJyaWdodFN0YXJ0WSIsInJpZ2h0RW5kWCIsInJpZ2h0RW5kWSIsImJvdHRvbVN0YXJ0WCIsImJvdHRvbVN0YXJ0WSIsImJvdHRvbUVuZFgiLCJib3R0b21FbmRZIiwibGVmdFN0YXJ0WCIsImxlZnRTdGFydFkiLCJsZWZ0RW5kWCIsImxlZnRFbmRZIiwiYXJjSW50ZXJzZWN0aW9ucyIsImJvdHRvbVJpZ2h0Q2VudGVyWCIsImJvdHRvbVJpZ2h0Q2VudGVyWSIsImludGVyc2VjdExpbmVDaXJjbGUiLCJib3R0b21MZWZ0Q2VudGVyWCIsImJvdHRvbUxlZnRDZW50ZXJZIiwicGVydHVyYmluZ0FnZW50SW50ZXJzZWN0TGluZSIsIngxIiwieTEiLCJ4MiIsInkyIiwiaW50ZXJzZWN0aW9uIiwidG9wTGVmdENlbnRlclgiLCJ0b3BMZWZ0Q2VudGVyWSIsInRvcFJpZ2h0Q2VudGVyWCIsInRvcFJpZ2h0Q2VudGVyWSIsImludGVyc2VjdExpbmVFbGxpcHNlIiwiYW4iLCJibiIsImQiLCJtIiwibiIsImEiLCJiIiwiYyIsImRpc2NyaW1pbmFudCIsInQxIiwidDIiLCJ4TWluIiwieE1heCIsIm1heCIsInlNaW4iLCJ5TWF4IiwicGFyc2VJbnQiLCJzdGF0ZUFuZEluZm9zIiwic3RhdGVzYW5kaW5mb3MiLCJzdGF0ZSIsImlzRGlzcGxheWVkIiwiaW5mb0JveFdpZHRoIiwiYmJveCIsImluZm9Cb3hIZWlnaHQiLCJjdXJySW50ZXJzZWN0aW9ucyIsImNsYXp6IiwiY29vcmQiLCJTdGF0ZVZhcmlhYmxlIiwiZ2V0QWJzb2x1dGVDb29yZCIsIlJlc2lkdWVWYXJpYWJsZSIsIkJpbmRpbmdSZWdpb24iLCJVbml0T2ZJbmZvcm1hdGlvbiIsIkF1eGlsaWFyeVVuaXQiLCJpc05vZGVTaGFwZVRvdGFsbHlPdmVycmlkZW4iLCJyZW5kZXIiLCJnZXROb2RlU2hhcGUiXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/sbgn-extensions/sbgn-cy-renderer.js\n"); +eval("/*\n * Render sbgn specific shapes which are not supported by cytoscape.js core\n */\n\nvar libs = (__webpack_require__(/*! ../utilities/lib-utilities */ \"./src/utilities/lib-utilities.js\").getLibs)();\nvar jQuery = $ = libs.jQuery;\nvar cytoscape = libs.cytoscape;\nvar cyMath = math = cytoscape.math;\nvar cyBaseNodeShapes = cytoscape.baseNodeShapes;\nvar cyStyleProperties = cytoscape.styleProperties;\nvar classes = __webpack_require__(/*! ../utilities/classes */ \"./src/utilities/classes.js\");\nmodule.exports = function () {\n var $$ = cytoscape;\n\n /*\n * Taken from cytoscape.js and modified so that it can be utilized from sbgnviz\n * in a flexable way. It is needed because the sbgnviz shapes would need to stroke\n * border more than once as they would have infoboxes, multimers etc.\n * Extends the style properties of node with the given ones then strokes the border.\n * Would needed to be slightly updated during cytoscape upgrades if related function in\n * Cytoscape.js is updated. Information about where is the related function is located\n * can be found in the file that list the changes done in ivis cytoscape fork.\n */\n $$.sbgn.drawBorder = function (_ref) {\n var context = _ref.context,\n node = _ref.node,\n borderWidth = _ref.borderWidth,\n borderColor = _ref.borderColor,\n borderStyle = _ref.borderStyle,\n borderOpacity = _ref.borderOpacity;\n borderWidth = borderWidth || node && parseFloat(node.css('border-width'));\n if (borderWidth > 0) {\n var parentOpacity = node && node.effectiveOpacity() || 1;\n borderStyle = borderStyle || node && node.css('border-style');\n borderColor = borderColor || node && node.css('border-color');\n borderOpacity = (borderOpacity || node && node.css('border-opacity')) * parentOpacity;\n var propsToRestore = ['lineWidth', 'lineCap', 'strokeStyle', 'globalAlpha'];\n var initialProps = {};\n propsToRestore.forEach(function (propName) {\n initialProps[propName] = context[propName];\n });\n context.lineWidth = borderWidth;\n context.lineCap = 'butt';\n context.strokeStyle = borderColor;\n context.globalAlpha = borderOpacity;\n if (context.setLineDash) {\n // for very outofdate browsers\n switch (borderStyle) {\n case 'dotted':\n context.setLineDash([1, 1]);\n break;\n case 'dashed':\n context.setLineDash([4, 2]);\n break;\n case 'solid':\n case 'double':\n context.setLineDash([]);\n break;\n }\n }\n context.stroke();\n if (borderStyle === 'double') {\n context.lineWidth = borderWidth / 3;\n var gco = context.globalCompositeOperation;\n context.globalCompositeOperation = 'destination-out';\n context.stroke();\n context.globalCompositeOperation = gco;\n }\n\n // reset in case we changed the border style\n if (context.setLineDash) {\n // for very outofdate browsers\n context.setLineDash([]);\n }\n propsToRestore.forEach(function (propName) {\n context[propName] = initialProps[propName];\n });\n }\n };\n\n // Taken from cytoscape.js and modified\n var drawRoundRectanglePath = $$.sbgn.drawRoundRectanglePath = function (context, x, y, width, height, radius) {\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n var cornerRadius = radius || cyMath.getRoundRectangleRadius(width, height);\n if (context.beginPath) {\n context.beginPath();\n }\n\n // Start at top middle\n context.moveTo(x, y - halfHeight);\n // Arc from middle top to right side\n context.arcTo(x + halfWidth, y - halfHeight, x + halfWidth, y, cornerRadius);\n // Arc from right side to bottom\n context.arcTo(x + halfWidth, y + halfHeight, x, y + halfHeight, cornerRadius);\n // Arc from bottom to left side\n context.arcTo(x - halfWidth, y + halfHeight, x - halfWidth, y, cornerRadius);\n // Arc from left side to topBorder\n context.arcTo(x - halfWidth, y - halfHeight, x, y - halfHeight, cornerRadius);\n // Join line\n context.lineTo(x, y - halfHeight);\n context.closePath();\n\n //context.clearRect(0, 0, width, height);\n //context.beginPath()\n };\n var drawProteinPath = $$.sbgn.drawProtein = function (context, x, y, width, height, activePadding1) {\n var halfWidth = (width + activePadding1) / 2;\n var halfHeight = (height + activePadding1) / 2;\n var cornerRadius = cyMath.getRoundRectangleRadius(width, height);\n if (context.beginPath) {\n context.beginPath();\n }\n\n // Start at top middle\n context.moveTo(x, y - halfHeight);\n // Arc from middle top to right side\n context.arcTo(x + halfWidth, y - halfHeight, x + halfWidth, y, cornerRadius);\n // Arc from right side to bottom\n context.arcTo(x + halfWidth, y + halfHeight, x, y + halfHeight, cornerRadius);\n // Arc from bottom to left side\n context.arcTo(x - halfWidth, y + halfHeight, x - halfWidth, y, cornerRadius);\n // Arc from left side to topBorder\n context.arcTo(x - halfWidth, y - halfHeight, x, y - halfHeight, cornerRadius);\n // Join line\n context.lineTo(x, y - halfHeight);\n context.closePath();\n\n //context.clearRect(0, 0, width, height);\n //context.beginPath()\n };\n var drawReceptorPath = $$.sbgn.drawReceptor = function (context, x, y, width, height, activePadding1) {\n var halfPadding = activePadding1 ? activePadding1 / 2 : 0;\n //var points= [-1, -1, 0, -0.5, 1, -1, 1, 0.5, 0, 1, -1, 0.5 ];\n var halfW = width / 2;\n var halfH = height / 2;\n if (context.beginPath) {\n context.beginPath();\n }\n context.moveTo(x + halfW * -1 - halfPadding, y + halfH * -1 - 3 * halfPadding / 2);\n context.lineTo(x + halfW * 0, y + halfH * -0.5 - 3 * halfPadding / 2);\n context.lineTo(x + halfW * 1 + halfPadding, y + halfH * -1 - 3 * halfPadding / 2);\n context.lineTo(x + halfW * 1 + halfPadding, y + halfH * 0.5 + halfPadding);\n context.lineTo(x + halfW * 0, y + halfH * 1 + 3 * halfPadding / 2);\n context.lineTo(x + halfW * -1 - halfPadding, y + halfH * 0.5 + halfPadding);\n context.closePath();\n };\n var drawRoundedDrugPath = $$.sbgn.drawRoundedDrug = function (context, x, y, width, height, radius) {\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n var cornerRadius = Math.min(halfWidth, halfHeight);\n context.beginPath();\n\n // Start at top middle\n context.moveTo(x, y - halfHeight);\n // Arc from middle top to right side\n context.arcTo(x + halfWidth, y - halfHeight, x + halfWidth, y, cornerRadius);\n // Arc from right side to bottom\n context.arcTo(x + halfWidth, y + halfHeight, x, y + halfHeight, cornerRadius);\n // Arc from bottom to left side\n context.arcTo(x - halfWidth, y + halfHeight, x - halfWidth, y, cornerRadius);\n // Arc from left side to topBorder\n context.arcTo(x - halfWidth, y - halfHeight, x, y - halfHeight, cornerRadius);\n // Join line\n context.lineTo(x, y - halfHeight);\n var halfWidthInner = width / 2 - 5;\n var halfHeightInner = height / 2 - 5;\n var cornerRadius = Math.min(halfWidthInner, halfHeightInner);\n\n // Start at top middle\n context.moveTo(x, y - halfHeightInner);\n // Arc from middle top to right side\n context.arcTo(x + halfWidthInner, y - halfHeightInner, x + halfWidthInner, y, cornerRadius);\n // Arc from right side to bottom\n context.arcTo(x + halfWidthInner, y + halfHeightInner, x, y + halfHeightInner, cornerRadius);\n // Arc from bottom to left side\n context.arcTo(x - halfWidthInner, y + halfHeightInner, x - halfWidthInner, y, cornerRadius);\n // Arc from left side to topBorder\n context.arcTo(x - halfWidthInner, y - halfHeightInner, x, y - halfHeightInner, cornerRadius);\n // Join line\n context.lineTo(x, y - halfHeightInner);\n context.closePath();\n };\n\n // Taken from cytoscape.js\n var drawPolygonPath = function drawPolygonPath(context, x, y, width, height, points) {\n var halfW = width / 2;\n var halfH = height / 2;\n if (context.beginPath) {\n context.beginPath();\n }\n context.moveTo(x + halfW * points[0], y + halfH * points[1]);\n for (var i = 1; i < points.length / 2; i++) {\n context.lineTo(x + halfW * points[i * 2], y + halfH * points[i * 2 + 1]);\n }\n context.closePath();\n };\n var sbgnShapes = $$.sbgn.sbgnShapes = {\n 'empty set': true,\n 'nucleic acid feature': true,\n 'complex': true,\n 'macromolecule': true,\n 'simple chemical': true,\n 'biological activity': true,\n 'compartment': true,\n 'gene': true,\n 'rna': true,\n 'simple molecule': true,\n 'unknown molecule': true,\n 'drug': true,\n 'truncated protein': true,\n 'ion channel': true,\n 'receptor': true,\n 'ion': true,\n 'phenotype sbml': true,\n 'complex sbml': true,\n 'protein': true,\n 'degradation': true\n };\n var totallyOverridenNodeShapes = $$.sbgn.totallyOverridenNodeShapes = {\n 'macromolecule': true,\n 'nucleic acid feature': true,\n 'simple chemical': true,\n 'complex': true,\n 'biological activity': true,\n 'compartment': true,\n 'protein': true,\n 'gene': true,\n 'rna': true,\n 'receptor': true,\n 'ion channel': true,\n 'truncated protein': true,\n 'phenotype sbml': true,\n 'ion': true,\n 'simple molecule': true,\n 'unknown molecule': true,\n 'drug': true,\n 'complex sbml': true\n };\n var canHaveInfoBoxShapes = $$.sbgn.canHaveInfoBoxShapes = {\n 'simple chemical': true,\n 'macromolecule': true,\n 'nucleic acid feature': true,\n 'complex': true,\n 'biological activity': true,\n 'compartment': true,\n 'protein': true,\n 'receptor': true,\n 'truncated protein': true,\n 'ion channel': true,\n 'complex sbml': true,\n 'gene': true,\n 'rna': true,\n 'simple molecule': true,\n 'unknown molecule': true,\n 'phenotype sbml': true,\n 'drug': true,\n 'ion': true,\n 'degradation': true\n };\n var canBeMultimerShapes = $$.sbgn.canBeMultimerShapes = {\n 'macromolecule': true,\n 'complex': true,\n 'nucleic acid feature': true,\n 'simple chemical': true,\n 'receptor': true,\n 'ion channel': true,\n 'truncated protein': true,\n 'gene': true,\n 'rna': true,\n 'phenotype': true,\n 'ion': true,\n 'simple molecule': true,\n 'unknown molecule': true,\n 'drug': true,\n 'phenotype sbml': true,\n 'complex sbml': true,\n 'protein': true\n };\n var canBeActiveShapes = $$.sbgn.canBeActiveShapes = {\n 'protein': true,\n 'complex sbml': true,\n 'receptor': true,\n 'ion channel': true,\n 'truncated protein': true\n };\n var canBeHypotheticalShapes = $$.sbgn.canBeHypotheticalShapes = {\n 'protein': true,\n 'complex sbml': true,\n 'receptor': true,\n 'ion channel': true,\n 'truncated protein': true,\n 'gene': true,\n 'rna': true,\n 'phenotype sbml': true,\n 'ion': true,\n 'simple molecule': true,\n 'unknown molecule': true,\n 'drug': true,\n 'degradation': true\n };\n cyMath.calculateDistance = function (point1, point2) {\n var distance = Math.pow(point1[0] - point2[0], 2) + Math.pow(point1[1] - point2[1], 2);\n return Math.sqrt(distance);\n };\n $$.sbgn.colors = {\n clone: \"#838383\"\n };\n $$.sbgn.getDefaultComplexCornerLength = function () {\n return 24;\n };\n $$.sbgn.getDefaultGeneCornerLength = function () {\n return 24;\n };\n $$.sbgn.drawStateAndInfos = function (node, context, centerX, centerY) {\n var layouts = node.data('auxunitlayouts');\n for (var side in layouts) {\n var layout = layouts[side];\n classes.AuxUnitLayout.draw(layout, node.cy(), context);\n }\n context.beginPath();\n context.closePath();\n };\n $$.sbgn.drawInfoBox = function (context, x, y, width, height, shapeName) {\n switch (shapeName) {\n case 'roundrectangle':\n cyBaseNodeShapes['roundrectangle'].draw(context, x, y, width, height);\n break;\n case 'bottomroundrectangle':\n $$.sbgn.drawBottomRoundRectangle(context, x, y, width, height);\n break;\n case 'ellipse':\n cyBaseNodeShapes['ellipse'].draw(context, x, y, width, height);\n break;\n case 'complex':\n $$.sbgn.drawComplex(context, x, y, width, height, height / 2);\n break;\n case 'perturbing agent':\n var points = $$.sbgn.generatePerturbingAgentPoints();\n drawPolygonPath(context, x, y, width, height, points);\n break;\n case 'rectangle':\n cyBaseNodeShapes['rectangle'].draw(context, x, y, width, height);\n break;\n case 'stadium':\n $$.sbgn.drawRoundRectanglePath(context, x, y, width, height, Math.min(width / 2, height / 2, 15));\n break;\n }\n };\n\n // $$.sbgn.AfShapeArgsFn = function (self){\n // return [self.bbox.w, self.bbox.h, classes.getAuxUnitClass(self).getParent(self).data(\"class\")];\n // }\n\n $$.sbgn.nucleicAcidCheckPoint = function (x, y, padding, width, height, centerX, centerY, points, cornerRadius) {\n //check rectangle at top\n if (cyMath.pointInsidePolygon(x, y, points, centerX, centerY - cornerRadius / 2, width, height - cornerRadius / 3, [0, -1], padding)) {\n return true;\n }\n\n //check rectangle at bottom\n if (cyMath.pointInsidePolygon(x, y, points, centerX, centerY + height / 2 - cornerRadius / 2, width - 2 * cornerRadius, cornerRadius, [0, -1], padding)) {\n return true;\n }\n\n //check ellipses\n var checkInEllipse = function checkInEllipse(x, y, centerX, centerY, width, height, padding) {\n x -= centerX;\n y -= centerY;\n x /= width / 2 + padding;\n y /= height / 2 + padding;\n return Math.pow(x, 2) + Math.pow(y, 2) <= 1;\n };\n\n // Check bottom right quarter circle\n if (checkInEllipse(x, y, centerX + width / 2 - cornerRadius, centerY + height / 2 - cornerRadius, cornerRadius * 2, cornerRadius * 2, padding)) {\n return true;\n }\n\n // Check bottom left quarter circle\n if (checkInEllipse(x, y, centerX - width / 2 + cornerRadius, centerY + height / 2 - cornerRadius, cornerRadius * 2, cornerRadius * 2, padding)) {\n return true;\n }\n return false;\n };\n\n //we need to force opacity to 1 since we might have state and info boxes.\n //having opaque nodes which have state and info boxes gives unpleasent results.\n $$.sbgn.forceOpacityToOne = function (node, context) {\n var parentOpacity = node.effectiveOpacity();\n if (parentOpacity === 0) {\n return;\n }\n context.fillStyle = \"rgba(\" + node._private.style[\"background-color\"].value[0] + \",\" + node._private.style[\"background-color\"].value[1] + \",\" + node._private.style[\"background-color\"].value[2] + \",\" + 1 * node.css('opacity') * parentOpacity + \")\";\n };\n $$.sbgn.drawSimpleChemicalPath = function (context, x, y, width, height) {\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n //var cornerRadius = $$.math.getRoundRectangleRadius(width, height);\n var cornerRadius = Math.min(halfWidth, halfHeight);\n context.beginPath();\n\n // Start at top middle\n context.moveTo(x, y - halfHeight);\n // Arc from middle top to right side\n context.arcTo(x + halfWidth, y - halfHeight, x + halfWidth, y, cornerRadius);\n // Arc from right side to bottom\n context.arcTo(x + halfWidth, y + halfHeight, x, y + halfHeight, cornerRadius);\n // Arc from bottom to left side\n context.arcTo(x - halfWidth, y + halfHeight, x - halfWidth, y, cornerRadius);\n // Arc from left side to topBorder\n context.arcTo(x - halfWidth, y - halfHeight, x, y - halfHeight, cornerRadius);\n // Join line\n context.lineTo(x, y - halfHeight);\n context.closePath();\n };\n $$.sbgn.drawSimpleChemical = function (context, x, y, width, height) {\n $$.sbgn.drawSimpleChemicalPath(context, x, y, width, height);\n context.fill();\n };\n function simpleChemicalLeftClone(context, centerX, centerY, width, height, cloneMarker, opacity) {\n if (cloneMarker != null) {\n var oldGlobalAlpha = context.globalAlpha;\n context.globalAlpha = opacity;\n var oldStyle = context.fillStyle;\n context.fillStyle = $$.sbgn.colors.clone;\n context.beginPath();\n var markerBeginX = centerX - width / 2 * Math.sin(Math.PI / 3);\n var markerBeginY = centerY + height / 2 * Math.cos(Math.PI / 3);\n var markerEndX = centerX;\n var markerEndY = markerBeginY;\n context.moveTo(markerBeginX, markerBeginY);\n context.lineTo(markerEndX, markerEndY);\n context.arc(centerX, centerY, width / 2, 3 * Math.PI / 6, 5 * Math.PI / 6);\n context.closePath();\n context.fill();\n context.fillStyle = oldStyle;\n context.globalAlpha = oldGlobalAlpha;\n }\n }\n ;\n function simpleChemicalRightClone(context, centerX, centerY, width, height, cloneMarker, opacity) {\n if (cloneMarker != null) {\n var oldGlobalAlpha = context.globalAlpha;\n context.globalAlpha = opacity;\n var oldStyle = context.fillStyle;\n context.fillStyle = $$.sbgn.colors.clone;\n context.beginPath();\n var markerBeginX = centerX;\n var markerBeginY = centerY + height / 2 * Math.cos(Math.PI / 3);\n var markerEndX = centerX + width / 2 * Math.sin(Math.PI / 3);\n var markerEndY = markerBeginY;\n context.moveTo(markerBeginX, markerBeginY);\n context.lineTo(markerEndX, markerEndY);\n context.arc(centerX, centerY, width / 2, Math.PI / 6, 3 * Math.PI / 6);\n context.closePath();\n context.fill();\n context.fillStyle = oldStyle;\n context.globalAlpha = oldGlobalAlpha;\n }\n }\n ;\n $$.sbgn.drawEllipsePath = function (context, x, y, width, height) {\n cyBaseNodeShapes['ellipse'].drawPath(context, x, y, width, height);\n };\n $$.sbgn.drawBarrel = function (context, x, y, width, height) {\n cyBaseNodeShapes['barrel'].draw(context, x, y, width, height);\n context.fill();\n };\n $$.sbgn.drawBottomRoundRectangle = function (context, x, y, width, height) {\n cyBaseNodeShapes['bottomroundrectangle'].draw(context, x, y, width, height);\n context.fill();\n };\n\n // The old draw implementation for nucleic acid feature\n // now only used for clone marker drawing of nucleic acid feature\n // and macromolecule shapes because 'bottomroundrectangle' function\n // of cytoscape.js did not fit well for this purpose.\n // Did not change the name yet directly as drawNucAcidFeatureClone etc.\n // because it actually draws a nucleic acid feature in a different way.\n $$.sbgn.drawNucAcidFeature2 = function (context, centerX, centerY, width, height, cornerRadius) {\n cornerRadius = cornerRadius || cyMath.getRoundRectangleRadius(width, height);\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n var left = centerX - halfWidth,\n right = centerX + halfWidth;\n var bottom = centerY - halfHeight,\n top = centerY + halfHeight;\n context.beginPath();\n context.moveTo(left, bottom);\n context.lineTo(right, bottom);\n context.lineTo(right, centerY);\n context.arcTo(right, top, centerX, top, cornerRadius);\n context.arcTo(left, top, left, centerY, cornerRadius);\n context.lineTo(left, bottom);\n context.closePath();\n context.fill();\n };\n\n /*\n * Code taken from https://jsperf.com/string-prototype-endswith\n * Direct implementation seems to work better.\n * Using this improves isMultimer() performance.\n * Makes it take 0.1 or 0.2% less time from the whole\n * loading process, down from ~0.4% initially.\n */\n function endsWith(str, pattern) {\n for (var i = pattern.length, l = str.length; i--;) {\n if (str.charAt(--l) != pattern.charAt(i)) {\n return false;\n }\n }\n return true;\n }\n $$.sbgn.isMultimer = function (node) {\n var sbgnClass = node._private.data[\"class\"];\n if (sbgnClass && endsWith(sbgnClass, \"multimer\")) return true;\n return false;\n };\n $$.sbgn.isActive = function (node) {\n var sbgnClass = node._private.data[\"class\"];\n if (sbgnClass && sbgnClass.startsWith(\"active\")) return true;\n return false;\n };\n $$.sbgn.isHypothetical = function (node) {\n var sbgnClass = node._private.data[\"class\"];\n if (sbgnClass && sbgnClass.includes(\"hypothetical\")) return true;\n return false;\n };\n\n //this function is created to have same corner length when\n //complex's width or height is changed\n $$.sbgn.generateComplexShapePoints = function (cornerLength, width, height) {\n //cp stands for corner proportion\n var cpX = Math.min(cornerLength, 0.5 * width) / width;\n var cpY = Math.min(cornerLength, 0.5 * height) / height;\n var complexPoints = [-1 + cpX, -1, -1, -1 + cpY, -1, 1 - cpY, -1 + cpX, 1, 1 - cpX, 1, 1, 1 - cpY, 1, -1 + cpY, 1 - cpX, -1];\n return complexPoints;\n };\n $$.sbgn.generateGeneShapePoints = function (width, height) {\n return [-1, -1, 1, -1, 1, 1, -1, 1];\n };\n $$.sbgn.generateRNAShapePoints = function (width, height) {\n return [-1, 0.8, 0.5, 0.8, 1, -0.8, -0.5, -0.8];\n };\n $$.sbgn.generateReceptorShapePoints = function (width, height) {\n return [-1, -1, 0, -0.5, 1, -1, 1, 0.5, 0, 1, -1, 0.5];\n };\n $$.sbgn.generatePerturbingAgentPoints = function () {\n return [-1, -1, -0.5, 0, -1, 1, 1, 1, 0.5, 0, 1, -1];\n };\n $$.sbgn.getDefaultMultimerPadding = function () {\n return 5;\n };\n $$.sbgn.getDefaultActivePadding = function () {\n return 5;\n };\n\n // draw background image of nodes\n $$.sbgn.drawImage = function (context, imgObj) {\n if (imgObj) {\n context.clip();\n context.drawImage(imgObj.img, 0, 0, imgObj.imgW, imgObj.imgH, imgObj.x, imgObj.y, imgObj.w, imgObj.h);\n context.restore();\n }\n };\n cyStyleProperties.types.nodeShape.enums.push('empty set', 'nucleic acid feature', 'complex', 'macromolecule', 'simple chemical', 'biological activity', 'compartment', 'gene', 'simple molecule', 'unknown molecule', 'drug', 'truncated protein', 'ion', 'ion channel', 'rna', 'phenotype sbml', 'receptor', 'complex sbml', 'protein', 'degradation');\n $$.sbgn.registerSbgnNodeShapes = function () {\n function generateDrawFcn(_ref2) {\n var plainDrawFcn = _ref2.plainDrawFcn,\n extraDrawFcn = _ref2.extraDrawFcn,\n canBeMultimer = _ref2.canBeMultimer,\n cloneMarkerFcn = _ref2.cloneMarkerFcn,\n canBeActive = _ref2.canBeActive,\n canBeHypothetical = _ref2.canBeHypothetical,\n canHaveInfoBox = _ref2.canHaveInfoBox,\n multimerPadding = _ref2.multimerPadding,\n activePadding = _ref2.activePadding;\n return function (context, node, imgObj) {\n var borderWidth = parseFloat(node.css('border-width'));\n var width = node.outerWidth() - borderWidth;\n var height = node.outerHeight() - borderWidth;\n var centerX = node._private.position.x;\n var centerY = node._private.position.y;\n var bgOpacity = node.css('background-opacity');\n var isCloned = cloneMarkerFcn != null && node._private.data.clonemarker;\n\n //Ion channel is dran differently when it is active\n if (node._private.data[\"class\"].startsWith('active ion channel') || node._private.data[\"class\"].startsWith('active hypothetical ion channel')) {\n plainDrawFcn = $$.sbgn.drawOpenIonChannel;\n }\n if (node._private.data[\"class\"].startsWith('ion channel') || node._private.data[\"class\"].startsWith('hypothetical ion channel')) {\n plainDrawFcn = $$.sbgn.drawIonChannel;\n }\n\n //This is where the multimer is drawn\n if (canBeMultimer && $$.sbgn.isMultimer(node)) {\n plainDrawFcn(context, centerX + multimerPadding, centerY + multimerPadding, width, height);\n\n //If the node is also hypothetical\n if (canBeHypothetical && $$.sbgn.isHypothetical(node)) {\n // $$.sbgn.drawImage( context, imgObj );\n borderStyle = 'dashed';\n $$.sbgn.drawBorder({\n context: context,\n node: node,\n borderStyle: borderStyle\n });\n //$$.sbgn.drawImage( context, imgObj );\n context.beginPath();\n } else {\n $$.sbgn.drawBorder({\n context: context,\n node: node\n });\n }\n if (extraDrawFcn) {\n extraDrawFcn(context, centerX + multimerPadding, centerY + multimerPadding, width, height);\n $$.sbgn.drawBorder({\n context: context,\n node: node\n });\n }\n if (isCloned) {\n cloneMarkerFcn(context, centerX + multimerPadding, centerY + multimerPadding, width - borderWidth, height - borderWidth, isCloned, true, bgOpacity);\n }\n\n //If the node is also active\n if (canBeActive && $$.sbgn.isActive(node) && !node._private.data[\"class\"].startsWith('active ion channel') && !node._private.data[\"class\"].startsWith('active hypothetical ion channel')) {\n //add multimer shape\n plainDrawFcn(context, centerX + multimerPadding, centerY + multimerPadding, width, height, true, activePadding);\n borderStyle = 'dashed';\n context.setLineDash([3, 6]);\n $$.sbgn.drawBorder({\n context: context,\n node: node,\n borderStyle: borderStyle\n });\n if (extraDrawFcn) {\n extraDrawFcn(context, centerX + multimerPadding, centerY + multimerPadding, width + activePadding, height + activePadding);\n $$.sbgn.drawBorder({\n context: context,\n node: node\n });\n }\n }\n }\n\n //This is where the active is drawn\n if (canBeActive && $$.sbgn.isActive(node) && !node._private.data[\"class\"].startsWith('active ion channel') && !node._private.data[\"class\"].startsWith('active hypothetical ion channel')) {\n //add multimer shape\n plainDrawFcn(context, centerX, centerY, width, height, true, activePadding);\n borderStyle = 'dashed';\n context.setLineDash([3, 6]);\n $$.sbgn.drawBorder({\n context: context,\n node: node,\n borderStyle: borderStyle\n });\n if (extraDrawFcn) {\n extraDrawFcn(context, centerX, centerY, width + activePadding, height + activePadding);\n $$.sbgn.drawBorder({\n context: context,\n node: node\n });\n }\n }\n\n //This is where the active is drawn\n if (canBeHypothetical && $$.sbgn.isHypothetical(node)) {\n //add multimer shape\n plainDrawFcn(context, centerX, centerY, width, height);\n borderStyle = 'dashed';\n $$.sbgn.drawBorder({\n context: context,\n node: node,\n borderStyle: borderStyle\n });\n // $$.sbgn.drawImage( context, imgObj );\n context.beginPath();\n if (extraDrawFcn) {\n extraDrawFcn(context, centerX, centerY, width, height);\n $$.sbgn.drawBorder({\n context: context,\n node: node\n });\n }\n }\n if (!(canBeHypothetical && $$.sbgn.isHypothetical(node))) {\n plainDrawFcn(context, centerX, centerY, width, height);\n $$.sbgn.drawImage(context, imgObj);\n }\n $$.sbgn.drawBorder({\n context: context,\n node: node\n });\n if (extraDrawFcn) {\n extraDrawFcn(context, centerX, centerY, width, height);\n $$.sbgn.drawBorder({\n context: context,\n node: node\n });\n }\n if (isCloned) {\n cloneMarkerFcn(context, centerX, centerY, width - borderWidth, height - borderWidth, isCloned, false, bgOpacity);\n }\n if (canHaveInfoBox) {\n var oldStyle = context.fillStyle;\n $$.sbgn.forceOpacityToOne(node, context);\n $$.sbgn.drawStateAndInfos(node, context, centerX, centerY);\n context.fillStyle = oldStyle;\n }\n };\n }\n function generateIntersectLineFcn(_ref3) {\n var plainIntersectLineFcn = _ref3.plainIntersectLineFcn,\n canBeMultimer = _ref3.canBeMultimer,\n cloneMarkerFcn = _ref3.cloneMarkerFcn,\n canBeActive = _ref3.canBeActive,\n canBeHypothetical = _ref3.canBeHypothetical,\n canHaveInfoBox = _ref3.canHaveInfoBox,\n multimerPadding = _ref3.multimerPadding,\n activePadding = _ref3.activePadding;\n return function (node, x, y) {\n var borderWidth = parseFloat(node.css('border-width'));\n var padding = borderWidth / 2;\n var width = node.outerWidth() - borderWidth;\n var height = node.outerHeight() - borderWidth;\n var centerX = node._private.position.x;\n var centerY = node._private.position.y;\n var intersections = [];\n if (canHaveInfoBox) {\n var stateAndInfoIntersectLines = $$.sbgn.intersectLineStateAndInfoBoxes(node, x, y);\n intersections = intersections.concat(stateAndInfoIntersectLines);\n }\n var nodeIntersectLines = plainIntersectLineFcn(centerX, centerY, width, height, x, y, padding);\n intersections = intersections.concat(nodeIntersectLines);\n if (canBeMultimer && $$.sbgn.isMultimer(node)) {\n var multimerIntersectionLines = plainIntersectLineFcn(centerX + multimerPadding, centerY + multimerPadding, width, height, x, y, padding);\n intersections = intersections.concat(multimerIntersectionLines);\n }\n if (canBeActive && $$.sbgn.isActive(node)) {\n var activeIntersectionLines = plainIntersectLineFcn(centerX + activePadding, centerY + activePadding, width, height, x, y, padding);\n intersections = intersections.concat(activeIntersectionLines);\n }\n if (canBeHypothetical && $$.sbgn.isHypothetical(node)) {\n var hypotheticalIntersectionLines = plainIntersectLineFcn(centerX, centerY, width, height, x, y, padding);\n intersections = intersections.concat(hypotheticalIntersectionLines);\n }\n return $$.sbgn.closestIntersectionPoint([x, y], intersections);\n };\n }\n function generateCheckPointFcn(_ref4) {\n var plainCheckPointFcn = _ref4.plainCheckPointFcn,\n canBeMultimer = _ref4.canBeMultimer,\n cloneMarkerFcn = _ref4.cloneMarkerFcn,\n canBeActive = _ref4.canBeActive,\n canBeHypothetical = _ref4.canBeHypothetical,\n canHaveInfoBox = _ref4.canHaveInfoBox,\n multimerPadding = _ref4.multimerPadding,\n activePadding = _ref4.activePadding;\n return function (x, y, node, threshold) {\n threshold = threshold || 0;\n var borderWidth = parseFloat(node.css('border-width'));\n var width = node.outerWidth() - borderWidth + 2 * threshold;\n var height = node.outerHeight() - borderWidth + 2 * threshold;\n var centerX = node._private.position.x;\n var centerY = node._private.position.y;\n var padding = borderWidth / 2;\n var nodeCheck = function nodeCheck() {\n return plainCheckPointFcn(x, y, padding, width, height, centerX, centerY);\n };\n var stateAndInfoCheck = function stateAndInfoCheck() {\n return canHaveInfoBox && $$.sbgn.checkPointStateAndInfoBoxes(x, y, node, threshold);\n };\n var multimerCheck = function multimerCheck() {\n return canBeMultimer && $$.sbgn.isMultimer(node) && plainCheckPointFcn(x, y, padding, width, height, centerX + multimerPadding, centerY + multimerPadding);\n };\n var activeCheck = function activeCheck() {\n return canBeActive && $$.sbgn.isActive(node) && plainCheckPointFcn(x, y, padding, width, height, centerX + activePadding, centerY + activePadding);\n };\n var hypotheticalCheck = function hypotheticalCheck() {\n return canBeHypothetical && $$.sbgn.isHypothetical(node) && plainCheckPointFcn(x, y, padding, width, height, centerX, centerY);\n };\n return nodeCheck() || stateAndInfoCheck() || multimerCheck() || activeCheck() || hypotheticalCheck();\n };\n }\n var shapeNames = [\"simple chemical\", \"macromolecule\", \"complex\", \"nucleic acid feature\", \"empty set\", \"biological activity\", \"compartment\", \"oldCompartment\", \"gene\", \"simple molecule\", 'receptor', 'complex sbml', \"unknown molecule\", \"drug\", \"ion\", \"truncated protein\", \"ion channel\", \"rna\", \"phenotype sbml\", \"protein\", \"degradation\"];\n shapeNames.forEach(function (shapeName) {\n var plainDrawFcn = $$.sbgn.plainDraw[shapeName];\n var plainIntersectLineFcn = $$.sbgn.plainIntersectLine[shapeName];\n var plainCheckPointFcn = $$.sbgn.plainCheckPoint[shapeName];\n var canBeMultimer = $$.sbgn.canBeMultimerShapes[shapeName];\n var canBeActive = $$.sbgn.canBeActiveShapes[shapeName];\n var canBeHypothetical = $$.sbgn.canBeHypotheticalShapes[shapeName];\n var cloneMarkerFcn = $$.sbgn.cloneMarker[shapeName];\n var canHaveInfoBox = $$.sbgn.canHaveInfoBoxShapes[shapeName];\n var multimerPadding = $$.sbgn.getDefaultMultimerPadding();\n var activePadding = $$.sbgn.getDefaultActivePadding();\n var extraDrawFcn = $$.sbgn.extraDraw[shapeName];\n var draw = generateDrawFcn({\n plainDrawFcn: plainDrawFcn,\n canBeMultimer: canBeMultimer,\n cloneMarkerFcn: cloneMarkerFcn,\n canBeActive: canBeActive,\n canBeHypothetical: canBeHypothetical,\n canHaveInfoBox: canHaveInfoBox,\n multimerPadding: multimerPadding,\n activePadding: activePadding,\n extraDrawFcn: extraDrawFcn\n });\n var intersectLine = totallyOverridenNodeShapes[shapeName] ? generateIntersectLineFcn({\n plainIntersectLineFcn: plainIntersectLineFcn,\n canBeMultimer: canBeMultimer,\n cloneMarkerFcn: cloneMarkerFcn,\n canBeActive: canBeActive,\n canBeHypothetical: canBeHypothetical,\n canHaveInfoBox: canHaveInfoBox,\n multimerPadding: multimerPadding,\n activePadding: activePadding\n }) : plainIntersectLineFcn;\n var checkPoint = totallyOverridenNodeShapes[shapeName] ? generateCheckPointFcn({\n plainCheckPointFcn: plainCheckPointFcn,\n canBeMultimer: canBeMultimer,\n cloneMarkerFcn: cloneMarkerFcn,\n canBeActive: canBeActive,\n canBeHypothetical: canBeHypothetical,\n canHaveInfoBox: canHaveInfoBox,\n multimerPadding: multimerPadding,\n activePadding: activePadding\n }) : plainCheckPointFcn;\n var shape = {\n draw: draw,\n intersectLine: intersectLine,\n checkPoint: checkPoint,\n multimerPadding: multimerPadding,\n activePadding: activePadding\n };\n cyBaseNodeShapes[shapeName] = shape;\n });\n };\n $$.sbgn.drawEllipse = function (context, x, y, width, height) {\n //$$.sbgn.drawEllipsePath(context, x, y, width, height);\n //context.fill();\n cyBaseNodeShapes['ellipse'].draw(context, x, y, width, height);\n context.fill();\n };\n $$.sbgn.drawTruncatedProtein = function (context, x, y, width, height, isActive, activePadding) {\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n var cornerRadius = cyMath.getRoundRectangleRadius(width, height);\n var halfPadding = activePadding ? activePadding / 2 : 0;\n if (context.beginPath) {\n context.beginPath();\n }\n\n // Start at top middle\n context.moveTo(x, y - halfHeight - halfPadding);\n //Draw a line till right top\n context.lineTo(x + halfWidth + halfPadding, y - halfHeight - halfPadding);\n //Draw a line to middle right\n context.lineTo(x + halfWidth + halfPadding, y + 2 * halfHeight / 3 + 2 * halfPadding);\n //Draw a line inner\n context.lineTo(x + 2 * halfWidth / 3 + halfPadding, y + halfHeight / 3 + 2 * halfPadding);\n //Draw a line to bottom right\n context.lineTo(x + 2 * halfWidth / 3 + halfPadding, y + halfHeight + halfPadding);\n //Draw a line to bottom middle\n context.lineTo(x, y + halfHeight + halfPadding);\n // Arc from bottom to left side\n context.arcTo(x - halfWidth - halfPadding, y + halfHeight + halfPadding, x - halfWidth - halfPadding, y, cornerRadius);\n // Arc from left side to topBorder\n context.arcTo(x - halfWidth - halfPadding, y - halfHeight - halfPadding, x, y - halfHeight - halfPadding, cornerRadius);\n context.closePath();\n if (!isActive) {\n context.fill();\n }\n };\n $$.sbgn.drawIonChannel = function (context, x, y, width, height, radius) {\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n var cornerRadius = radius || cyMath.getRoundRectangleRadius(width, height);\n if (context.beginPath) {\n context.beginPath();\n }\n\n // Start at top middle\n context.moveTo(x + halfWidth / 4, y - halfHeight);\n // Arc from middle top to right side\n context.arcTo(x + halfWidth / 2, y - halfHeight, x + halfWidth / 2, y, cornerRadius);\n // Arc from right side to bottom\n context.arcTo(x + halfWidth / 2, y + halfHeight, x / 2 + halfWidth / 4, y + halfHeight, cornerRadius);\n // Arc from bottom to left side\n context.arcTo(x - halfWidth, y + halfHeight, x - halfWidth, y, cornerRadius);\n // Arc from left side to topBorder\n context.arcTo(x - halfWidth, y - halfHeight, x + halfWidth / 4, y - halfHeight, cornerRadius);\n // Join line\n context.lineTo(x + halfWidth / 4, y - halfHeight);\n\n // Start at top middle\n context.moveTo(x + 3 * halfWidth / 4, y - halfHeight);\n // Arc from middle top to right side\n context.arcTo(x + halfWidth, y - halfHeight, x + halfWidth, y, cornerRadius);\n // Arc from right side to bottom\n context.arcTo(x + halfWidth, y + halfHeight, x + 3 * halfWidth / 4, y + halfHeight, cornerRadius);\n // Arc from bottom to left side\n context.arcTo(x + halfWidth / 2, y + halfHeight, x + halfWidth / 2, y, cornerRadius);\n // Arc from left side to topBorder\n context.arcTo(x + halfWidth / 2, y - halfHeight, x + 3 * halfWidth / 4, y - halfHeight, cornerRadius);\n // Join line\n //context.lineTo( x, y - halfHeight );\n\n context.closePath();\n context.fill();\n };\n $$.sbgn.drawOpenIonChannel = function (context, x, y, width, height, radius) {\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n var cornerRadius = radius || cyMath.getRoundRectangleRadius(width, height);\n if (context.beginPath) {\n context.beginPath();\n }\n\n // Start at top middle\n context.moveTo(x - halfWidth / 2, y - halfHeight);\n // Arc from middle top to right side\n context.arcTo(x, y - halfHeight, x, y, cornerRadius);\n // Arc from right side to bottom\n context.arcTo(x, y + halfHeight, x - halfWidth / 2, y + halfHeight, cornerRadius);\n // Arc from bottom to left side\n context.arcTo(x - halfWidth, y + halfHeight, x - halfWidth, y, cornerRadius);\n // Arc from left side to topBorder\n context.arcTo(x - halfWidth, y - halfHeight, x + halfWidth / 2, y - halfHeight, cornerRadius);\n // Join line\n context.lineTo(x - halfWidth / 2, y - halfHeight);\n\n // Start at top middle\n context.moveTo(x + 3 * halfWidth / 4, y - halfHeight);\n // Arc from middle top to right side\n context.arcTo(x + halfWidth, y - halfHeight, x + halfWidth, y, cornerRadius);\n // Arc from right side to bottom\n context.arcTo(x + halfWidth, y + halfHeight, x + 3 * halfWidth / 4, y + halfHeight, cornerRadius);\n // Arc from bottom to left side\n context.arcTo(x + halfWidth / 2, y + halfHeight, x + halfWidth / 2, y, cornerRadius);\n // Arc from left side to topBorder\n context.arcTo(x + halfWidth / 2, y - halfHeight, x + 3 * halfWidth / 4, y - halfHeight, cornerRadius);\n // Join line\n //context.lineTo( x, y - halfHeight );\n\n context.closePath();\n context.fill();\n };\n $$.sbgn.drawComplex = function (context, x, y, width, height, isActive, cornerLength) {\n cornerLength = cornerLength || $$.sbgn.getDefaultComplexCornerLength();\n var points = $$.sbgn.generateComplexShapePoints(cornerLength, width, height);\n drawPolygonPath(context, x, y, width, height, points);\n if (!isActive) {\n context.fill();\n }\n };\n $$.sbgn.drawGene = function (context, x, y, width, height, isActive) {\n cyBaseNodeShapes['rectangle'].draw(context, x, y, width, height);\n if (!isActive) {\n context.fill();\n }\n };\n $$.sbgn.drawRNA = function (context, x, y, width, height) {\n var points = $$.sbgn.generateRNAShapePoints(width, height);\n drawPolygonPath(context, x, y, width, height, points);\n context.fill();\n };\n $$.sbgn.drawPhenotype = function (context, x, y, width, height) {\n cyBaseNodeShapes['hexagon'].draw(context, x, y, width, height);\n context.fill();\n };\n $$.sbgn.drawReceptor = function (context, x, y, width, height, isActive, activePadding) {\n drawReceptorPath(context, x, y, width, height, activePadding);\n if (!isActive) {\n context.fill();\n }\n };\n $$.sbgn.drawCrossLine = function (context, x, y, width, height) {\n var points = cyMath.generateUnitNgonPoints(4, 0);\n context.beginPath();\n var scaleX = width * Math.sqrt(2) / 2,\n scaleY = height * Math.sqrt(2) / 2;\n context.moveTo(x + scaleX * points[2], y + scaleY * points[3]);\n context.lineTo(x + scaleX * points[6], y + scaleY * points[7]);\n context.closePath();\n };\n $$.sbgn.drawBiologicalActivity = function (context, x, y, width, height) {\n var points = $$.sbgn.generateBiologicalActivityPoints();\n drawPolygonPath(context, x, y, width, height, points);\n context.fill();\n };\n $$.sbgn.drawRoundRectangle = function (context, x, y, width, height, isActive) {\n drawRoundRectanglePath(context, x, y, width, height);\n if (!isActive) {\n context.fill();\n }\n };\n $$.sbgn.drawProtein = function (context, x, y, width, height, isActive, activePadding) {\n var activePadding1 = activePadding || 0;\n drawProteinPath(context, x, y, width, height, activePadding1);\n if (!isActive) {\n context.fill();\n }\n };\n $$.sbgn.drawRoundedDrug = function (context, x, y, width, height) {\n drawRoundedDrugPath(context, x, y, width, height);\n context.fill();\n };\n $$.sbgn.generateNucleicAcidPoints = function () {\n return cyMath.generateUnitNgonPointsFitToSquare(4, 0);\n };\n $$.sbgn.generateBiologicalActivityPoints = function () {\n return cyMath.generateUnitNgonPointsFitToSquare(4, 0);\n };\n $$.sbgn.generateCompartmentPoints = function () {\n return math.generateUnitNgonPointsFitToSquare(4, 0);\n };\n $$.sbgn.plainDraw = {\n \"simple chemical\": $$.sbgn.drawSimpleChemical,\n \"macromolecule\": $$.sbgn.drawRoundRectangle,\n \"complex\": $$.sbgn.drawComplex,\n \"nucleic acid feature\": $$.sbgn.drawBottomRoundRectangle,\n \"empty set\": $$.sbgn.drawEllipse,\n \"biological activity\": $$.sbgn.drawBiologicalActivity,\n \"compartment\": $$.sbgn.drawBarrel,\n \"oldCompartment\": $$.sbgn.drawRoundRectangle,\n \"gene\": $$.sbgn.drawGene,\n \"rna\": $$.sbgn.drawRNA,\n \"simple molecule\": $$.sbgn.drawEllipse,\n \"unknown molecule\": $$.sbgn.drawEllipse,\n \"drug\": $$.sbgn.drawRoundedDrug,\n \"ion\": $$.sbgn.drawEllipse,\n \"truncated protein\": $$.sbgn.drawTruncatedProtein,\n \"ion channel\": $$.sbgn.drawIonChannel,\n \"phenotype sbml\": $$.sbgn.drawPhenotype,\n \"receptor\": $$.sbgn.drawReceptor,\n \"complex sbml\": $$.sbgn.drawComplex,\n \"protein\": $$.sbgn.drawProtein,\n \"degradation\": $$.sbgn.drawEllipse\n };\n\n // To define an extra drawing for the node that is rendered at the very end,\n // even after the node background image is drawn.\n // E.g. cross lines of \"empty set\" nodes.\n $$.sbgn.extraDraw = {\n \"empty set\": $$.sbgn.drawCrossLine,\n \"degradation\": $$.sbgn.drawCrossLine\n };\n $$.sbgn.plainIntersectLine = {\n \"simple chemical\": function simple_chemical(centerX, centerY, width, height, x, y, padding) {\n return cyBaseNodeShapes[\"ellipse\"].intersectLine(centerX, centerY, width, height, x, y, padding);\n },\n \"macromolecule\": function macromolecule(centerX, centerY, width, height, x, y, padding) {\n return $$.sbgn.roundRectangleIntersectLine(x, y, centerX, centerY, centerX, centerY, width, height, cyMath.getRoundRectangleRadius(width, height), padding);\n },\n \"complex\": function complex(centerX, centerY, width, height, x, y, padding) {\n var points = $$.sbgn.generateComplexShapePoints($$.sbgn.getDefaultComplexCornerLength(), width, height);\n return cyMath.polygonIntersectLine(x, y, points, centerX, centerY, width / 2, height / 2, padding);\n },\n \"nucleic acid feature\": function nucleic_acid_feature(centerX, centerY, width, height, x, y, padding) {\n return cyBaseNodeShapes[\"bottomroundrectangle\"].intersectLine(centerX, centerY, width, height, x, y, padding);\n },\n \"empty set\": function empty_set(centerX, centerY, width, height, x, y, padding) {\n return cyBaseNodeShapes[\"ellipse\"].intersectLine(centerX, centerY, width, height, x, y, padding);\n },\n \"degradation\": function degradation(centerX, centerY, width, height, x, y, padding) {\n return cyBaseNodeShapes[\"ellipse\"].intersectLine(centerX, centerY, width, height, x, y, padding);\n },\n \"biological activity\": function biological_activity(centerX, centerY, width, height, x, y, padding) {\n var points = $$.sbgn.generateBiologicalActivityPoints();\n return cyMath.polygonIntersectLine(x, y, points, centerX, centerY, width / 2, height / 2, padding);\n },\n \"compartment\": function compartment(centerX, centerY, width, height, x, y, padding) {\n return cyBaseNodeShapes[\"barrel\"].intersectLine(centerX, centerY, width, height, x, y, padding);\n },\n \"oldCompartment\": function oldCompartment(centerX, centerY, width, height, x, y, padding) {\n return cyMath.roundRectangleIntersectLine(x, y, centerX, centerY, width, height, padding);\n },\n \"protein\": function protein(centerX, centerY, width, height, x, y, padding) {\n return cyMath.roundRectangleIntersectLine(x, y, centerX, centerY, width, height, padding);\n },\n \"gene\": function gene(centerX, centerY, width, height, x, y, padding) {\n return cyBaseNodeShapes[\"rectangle\"].intersectLine(centerX, centerY, width, height, x, y, padding);\n },\n \"rna\": function rna(centerX, centerY, width, height, x, y, padding) {\n var points = $$.sbgn.generateRNAShapePoints(width, height);\n return cyMath.polygonIntersectLine(x, y, points, centerX, centerY, width / 2, height / 2, padding);\n },\n \"receptor\": function receptor(centerX, centerY, width, height, x, y, padding) {\n var points = $$.sbgn.generateReceptorShapePoints(width, height);\n return cyMath.polygonIntersectLine(x, y, points, centerX, centerY, width / 2, height / 2, padding);\n },\n \"ion channel\": function ion_channel(centerX, centerY, width, height, x, y, padding) {\n return cyMath.roundRectangleIntersectLine(x, y, centerX, centerY, width, height, padding);\n },\n \"truncated protein\": function truncated_protein(centerX, centerY, width, height, x, y, padding) {\n return cyMath.roundRectangleIntersectLine(x, y, centerX, centerY, width, height, padding);\n },\n \"ion\": function ion(centerX, centerY, width, height, x, y, padding) {\n return cyBaseNodeShapes[\"ellipse\"].intersectLine(centerX, centerY, width, height, x, y, padding);\n },\n \"simple molecule\": function simple_molecule(centerX, centerY, width, height, x, y, padding) {\n return cyBaseNodeShapes[\"ellipse\"].intersectLine(centerX, centerY, width, height, x, y, padding);\n },\n \"unknown molecule\": function unknown_molecule(centerX, centerY, width, height, x, y, padding) {\n return cyBaseNodeShapes[\"ellipse\"].intersectLine(centerX, centerY, width, height, x, y, padding);\n },\n \"drug\": function drug(centerX, centerY, width, height, x, y, padding) {\n return cyBaseNodeShapes[\"ellipse\"].intersectLine(centerX, centerY, width, height, x, y, padding);\n },\n \"phenotype sbml\": function phenotype_sbml(centerX, centerY, width, height, x, y, padding) {\n return cyBaseNodeShapes[\"ellipse\"].intersectLine(centerX, centerY, width, height, x, y, padding);\n },\n \"complex sbml\": function complex_sbml(centerX, centerY, width, height, x, y, padding) {\n var points = $$.sbgn.generateComplexShapePoints($$.sbgn.getDefaultComplexCornerLength(), width, height);\n return cyMath.polygonIntersectLine(x, y, points, centerX, centerY, width / 2, height / 2, padding);\n }\n };\n $$.sbgn.plainCheckPoint = {\n \"simple chemical\": function simple_chemical(x, y, padding, width, height, centerX, centerY) {\n var points = cyMath.generateUnitNgonPointsFitToSquare(4, 0);\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n //var cornerRadius = $$.math.getRoundRectangleRadius(width, height);\n var cornerRadius = Math.min(halfWidth, halfHeight);\n //var cornerRadius = math.getRoundRectangleRadius( width, height );\n var diam = cornerRadius * 2;\n\n // Check hBox\n if (cyMath.pointInsidePolygon(x, y, points, centerX, centerY, width, height - diam, [0, -1], padding)) {\n return true;\n }\n\n // Check vBox\n if (cyMath.pointInsidePolygon(x, y, points, centerX, centerY, width - diam, height, [0, -1], padding)) {\n return true;\n }\n\n // Check top left quarter circle\n if (cyMath.checkInEllipse(x, y, diam, diam, centerX - width / 2 + cornerRadius, centerY - height / 2 + cornerRadius, padding)) {\n return true;\n }\n\n // Check top right quarter circle\n if (cyMath.checkInEllipse(x, y, diam, diam, centerX + width / 2 - cornerRadius, centerY - height / 2 + cornerRadius, padding)) {\n return true;\n }\n\n // Check bottom right quarter circle\n if (cyMath.checkInEllipse(x, y, diam, diam, centerX + width / 2 - cornerRadius, centerY + height / 2 - cornerRadius, padding)) {\n return true;\n }\n\n // Check bottom left quarter circle\n if (cyMath.checkInEllipse(x, y, diam, diam, centerX - width / 2 + cornerRadius, centerY + height / 2 - cornerRadius, padding)) {\n return true;\n }\n return false;\n //return cyBaseNodeShapes[\"ellipse\"].checkPoint( x, y, padding, width, height, centerX, centerY );\n },\n \"macromolecule\": function macromolecule(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"complex\": function complex(x, y, padding, width, height, centerX, centerY) {\n var points = $$.sbgn.generateComplexShapePoints($$.sbgn.getDefaultComplexCornerLength(), width, height);\n return cyMath.pointInsidePolygon(x, y, points, centerX, centerY, width, height, [0, -1], padding);\n },\n \"complex sbml\": function complex_sbml(x, y, padding, width, height, centerX, centerY) {\n var points = $$.sbgn.generateComplexShapePoints($$.sbgn.getDefaultComplexCornerLength(), width, height);\n return cyMath.pointInsidePolygon(x, y, points, centerX, centerY, width, height, [0, -1], padding);\n },\n \"nucleic acid feature\": function nucleic_acid_feature(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"bottomroundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"empty set\": function empty_set(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"ellipse\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"degradation\": function degradation(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"ellipse\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"biological activity\": function biological_activity(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"rectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"compartment\": function compartment(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"barrel\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"oldCompartment\": function oldCompartment(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"gene\": function gene(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"simple molecule\": function simple_molecule(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"unknown molecule\": function unknown_molecule(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"drug\": function drug(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"ion\": function ion(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"truncated protein\": function truncated_protein(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"ion channel\": function ion_channel(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"rna\": function rna(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"phenotype sbml\": function phenotype_sbml(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"receptor\": function receptor(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n },\n \"protein\": function protein(x, y, padding, width, height, centerX, centerY) {\n return cyBaseNodeShapes[\"roundrectangle\"].checkPoint(x, y, padding, width, height, centerX, centerY);\n }\n };\n $$.sbgn.cloneMarker = {\n \"simple chemical\": function simple_chemical(context, centerX, centerY, width, height, cloneMarker, isMultimer, opacity) {\n if (cloneMarker != null) {\n var cornerRadius = Math.min(width / 2, height / 2);\n var firstCircleCenterX = centerX - width / 2 + cornerRadius;\n var firstCircleCenterY = centerY;\n var secondCircleCenterX = centerX + width / 2 - cornerRadius;\n var secondCircleCenterY = centerY;\n var bottomCircleCenterX = centerX;\n var bottomCircleCenterY = centerY + height / 2 - cornerRadius;\n if (width < height) {\n simpleChemicalLeftClone(context, bottomCircleCenterX, bottomCircleCenterY, 2 * cornerRadius, 2 * cornerRadius, cloneMarker, opacity);\n simpleChemicalRightClone(context, bottomCircleCenterX, bottomCircleCenterY, 2 * cornerRadius, 2 * cornerRadius, cloneMarker, opacity);\n } else {\n simpleChemicalLeftClone(context, firstCircleCenterX, firstCircleCenterY, 2 * cornerRadius, 2 * cornerRadius, cloneMarker, opacity);\n simpleChemicalRightClone(context, secondCircleCenterX, secondCircleCenterY, 2 * cornerRadius, 2 * cornerRadius, cloneMarker, opacity);\n }\n var oldStyle = context.fillStyle;\n context.fillStyle = $$.sbgn.colors.clone;\n var oldGlobalAlpha = context.globalAlpha;\n context.globalAlpha = opacity;\n var recPoints = cyMath.generateUnitNgonPointsFitToSquare(4, 0);\n var cloneX = centerX;\n var cloneY = centerY + 3 / 4 * cornerRadius;\n var cloneWidth = width - 2 * cornerRadius;\n var cloneHeight = cornerRadius / 2;\n drawPolygonPath(context, cloneX, cloneY, cloneWidth, cloneHeight, recPoints);\n context.fill();\n context.fillStyle = oldStyle;\n context.globalAlpha = oldGlobalAlpha;\n }\n },\n \"nucleic acid feature\": function nucleic_acid_feature(context, centerX, centerY, width, height, cloneMarker, isMultimer, opacity) {\n if (cloneMarker != null) {\n var cloneWidth = width;\n var cloneHeight = height / 4;\n var cloneX = centerX;\n var cloneY = centerY + 3 * height / 8;\n var oldStyle = context.fillStyle;\n context.fillStyle = $$.sbgn.colors.clone;\n var oldGlobalAlpha = context.globalAlpha;\n context.globalAlpha = opacity;\n var cornerRadius = cyMath.getRoundRectangleRadius(width, height);\n $$.sbgn.drawNucAcidFeature2(context, cloneX, cloneY, cloneWidth, cloneHeight, cornerRadius);\n context.fillStyle = oldStyle;\n context.globalAlpha = oldGlobalAlpha;\n }\n },\n \"macromolecule\": function macromolecule(context, centerX, centerY, width, height, cloneMarker, isMultimer, opacity) {\n $$.sbgn.cloneMarker[\"nucleic acid feature\"](context, centerX, centerY, width, height, cloneMarker, isMultimer, opacity);\n },\n \"complex\": function complex(context, centerX, centerY, width, height, cloneMarker, isMultimer, opacity) {\n if (cloneMarker != null) {\n var cornerLength = $$.sbgn.getDefaultComplexCornerLength();\n var cpX = width >= 50 ? cornerLength / width : cornerLength / 50;\n var cpY = height >= 50 ? cornerLength / height : cornerLength / 50;\n var cloneWidth = width;\n var cloneHeight = height * cpY / 2;\n var cloneX = centerX;\n var cloneY = centerY + height / 2 - cloneHeight / 2;\n var markerPoints = [-1, -1, 1, -1, 1 - cpX, 1, -1 + cpX, 1];\n var oldStyle = context.fillStyle;\n context.fillStyle = $$.sbgn.colors.clone;\n var oldGlobalAlpha = context.globalAlpha;\n context.globalAlpha = opacity;\n drawPolygonPath(context, cloneX, cloneY, cloneWidth, cloneHeight, markerPoints);\n context.fill();\n context.fillStyle = oldStyle;\n context.globalAlpha = oldGlobalAlpha;\n }\n }\n };\n $$.sbgn.closestIntersectionPoint = function (point, intersections) {\n if (intersections.length <= 0) return [];\n var closestIntersection = [];\n var minDistance = Number.MAX_VALUE;\n for (var i = 0; i < intersections.length; i = i + 2) {\n var checkPoint = [intersections[i], intersections[i + 1]];\n var distance = cyMath.calculateDistance(point, checkPoint);\n if (distance < minDistance) {\n minDistance = distance;\n closestIntersection = checkPoint;\n }\n }\n return closestIntersection;\n };\n $$.sbgn.nucleicAcidIntersectionLine = function (x, y, nodeX, nodeY, width, height, cornerRadius, padding) {\n // var nodeX = node._private.position.x;\n // var nodeY = node._private.position.y;\n // var width = node.width();\n // var height = node.height();\n // var padding = parseInt(node.css('border-width')) / 2;\n\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n var straightLineIntersections;\n\n // Top segment, left to right\n {\n var topStartX = nodeX - halfWidth - padding;\n var topStartY = nodeY - halfHeight - padding;\n var topEndX = nodeX + halfWidth + padding;\n var topEndY = topStartY;\n straightLineIntersections = cyMath.finiteLinesIntersect(x, y, nodeX, nodeY, topStartX, topStartY, topEndX, topEndY, false);\n if (straightLineIntersections.length > 0) {\n return straightLineIntersections;\n }\n }\n\n // Right segment, top to bottom\n {\n var rightStartX = nodeX + halfWidth + padding;\n var rightStartY = nodeY - halfHeight - padding;\n var rightEndX = rightStartX;\n var rightEndY = nodeY + halfHeight - cornerRadius + padding;\n straightLineIntersections = cyMath.finiteLinesIntersect(x, y, nodeX, nodeY, rightStartX, rightStartY, rightEndX, rightEndY, false);\n if (straightLineIntersections.length > 0) {\n return straightLineIntersections;\n }\n }\n\n // Bottom segment, left to right\n {\n var bottomStartX = nodeX - halfWidth + cornerRadius - padding;\n var bottomStartY = nodeY + halfHeight + padding;\n var bottomEndX = nodeX + halfWidth - cornerRadius + padding;\n var bottomEndY = bottomStartY;\n straightLineIntersections = cyMath.finiteLinesIntersect(x, y, nodeX, nodeY, bottomStartX, bottomStartY, bottomEndX, bottomEndY, false);\n if (straightLineIntersections.length > 0) {\n return straightLineIntersections;\n }\n }\n\n // Left segment, top to bottom\n {\n var leftStartX = nodeX - halfWidth - padding;\n var leftStartY = nodeY - halfHeight - padding;\n var leftEndX = leftStartX;\n var leftEndY = nodeY + halfHeight - cornerRadius + padding;\n straightLineIntersections = cyMath.finiteLinesIntersect(x, y, nodeX, nodeY, leftStartX, leftStartY, leftEndX, leftEndY, false);\n if (straightLineIntersections.length > 0) {\n return straightLineIntersections;\n }\n }\n\n // Check intersections with arc segments, we have only two arcs for\n //nucleic acid features\n var arcIntersections;\n\n // Bottom Right\n {\n var bottomRightCenterX = nodeX + halfWidth - cornerRadius;\n var bottomRightCenterY = nodeY + halfHeight - cornerRadius;\n arcIntersections = cyMath.intersectLineCircle(x, y, nodeX, nodeY, bottomRightCenterX, bottomRightCenterY, cornerRadius + padding);\n\n // Ensure the intersection is on the desired quarter of the circle\n if (arcIntersections.length > 0 && arcIntersections[0] >= bottomRightCenterX && arcIntersections[1] >= bottomRightCenterY) {\n return [arcIntersections[0], arcIntersections[1]];\n }\n }\n\n // Bottom Left\n {\n var bottomLeftCenterX = nodeX - halfWidth + cornerRadius;\n var bottomLeftCenterY = nodeY + halfHeight - cornerRadius;\n arcIntersections = cyMath.intersectLineCircle(x, y, nodeX, nodeY, bottomLeftCenterX, bottomLeftCenterY, cornerRadius + padding);\n\n // Ensure the intersection is on the desired quarter of the circle\n if (arcIntersections.length > 0 && arcIntersections[0] <= bottomLeftCenterX && arcIntersections[1] >= bottomLeftCenterY) {\n return [arcIntersections[0], arcIntersections[1]];\n }\n }\n return []; // if nothing\n };\n\n //this function gives the intersections of any line with the upper half of perturbing agent\n $$.sbgn.perturbingAgentIntersectLine = function (x1, y1, x2, y2, nodeX, nodeY, width, height, padding) {\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n\n // Check intersections with straight line segments\n var straightLineIntersections = [];\n\n // Top segment, left to right\n {\n var topStartX = nodeX - halfWidth - padding;\n var topStartY = nodeY - halfHeight - padding;\n var topEndX = nodeX + halfWidth + padding;\n var topEndY = topStartY;\n var intersection = cyMath.finiteLinesIntersect(x1, y1, x2, y2, topStartX, topStartY, topEndX, topEndY, false);\n if (intersection.length > 0) {\n straightLineIntersections = straightLineIntersections.concat(intersection);\n }\n }\n\n // Right segment, top to bottom\n {\n var rightStartX = nodeX + halfWidth + padding;\n var rightStartY = nodeY - halfHeight - padding;\n var rightEndX = rightStartX - halfWidth / 2;\n var rightEndY = nodeY + padding;\n var intersection = cyMath.finiteLinesIntersect(x1, y1, x2, y2, rightStartX, rightStartY, rightEndX, rightEndY, false);\n if (intersection.length > 0) {\n straightLineIntersections = straightLineIntersections.concat(intersection);\n }\n }\n\n // Left segment, top to bottom\n {\n var leftStartX = nodeX - halfWidth - padding;\n var leftStartY = nodeY - halfHeight - padding;\n var leftEndX = leftStartX + halfWidth / 2;\n var leftEndY = nodeY + padding;\n var intersection = cyMath.finiteLinesIntersect(x1, y1, x2, y2, leftStartX, leftStartY, leftEndX, leftEndY, false);\n if (intersection.length > 0) {\n straightLineIntersections = straightLineIntersections.concat(intersection);\n }\n }\n return straightLineIntersections;\n };\n\n //this function gives the intersections of any line with a round rectangle\n $$.sbgn.roundRectangleIntersectLine = function (x1, y1, x2, y2, nodeX, nodeY, width, height, cornerRadius, padding) {\n var halfWidth = width / 2;\n var halfHeight = height / 2;\n\n // Check intersections with straight line segments\n var straightLineIntersections = [];\n // Top segment, left to right\n {\n var topStartX = nodeX - halfWidth + cornerRadius - padding;\n var topStartY = nodeY - halfHeight - padding;\n var topEndX = nodeX + halfWidth - cornerRadius + padding;\n var topEndY = topStartY;\n var intersection = cyMath.finiteLinesIntersect(x1, y1, x2, y2, topStartX, topStartY, topEndX, topEndY, false);\n if (intersection.length > 0) {\n straightLineIntersections = straightLineIntersections.concat(intersection);\n }\n }\n\n // Right segment, top to bottom\n {\n var rightStartX = nodeX + halfWidth + padding;\n var rightStartY = nodeY - halfHeight + cornerRadius - padding;\n var rightEndX = rightStartX;\n var rightEndY = nodeY + halfHeight - cornerRadius + padding;\n var intersection = cyMath.finiteLinesIntersect(x1, y1, x2, y2, rightStartX, rightStartY, rightEndX, rightEndY, false);\n if (intersection.length > 0) {\n straightLineIntersections = straightLineIntersections.concat(intersection);\n }\n }\n\n // Bottom segment, left to right\n {\n var bottomStartX = nodeX - halfWidth + cornerRadius - padding;\n var bottomStartY = nodeY + halfHeight + padding;\n var bottomEndX = nodeX + halfWidth - cornerRadius + padding;\n var bottomEndY = bottomStartY;\n var intersection = cyMath.finiteLinesIntersect(x1, y1, x2, y2, bottomStartX, bottomStartY, bottomEndX, bottomEndY, false);\n if (intersection.length > 0) {\n straightLineIntersections = straightLineIntersections.concat(intersection);\n }\n }\n\n // Left segment, top to bottom\n {\n var leftStartX = nodeX - halfWidth - padding;\n var leftStartY = nodeY - halfHeight + cornerRadius - padding;\n var leftEndX = leftStartX;\n var leftEndY = nodeY + halfHeight - cornerRadius + padding;\n var intersection = cyMath.finiteLinesIntersect(x1, y1, x2, y2, leftStartX, leftStartY, leftEndX, leftEndY, false);\n if (intersection.length > 0) {\n straightLineIntersections = straightLineIntersections.concat(intersection);\n }\n }\n\n // Check intersections with arc segments\n var arcIntersections;\n\n // Top Left\n {\n var topLeftCenterX = nodeX - halfWidth + cornerRadius;\n var topLeftCenterY = nodeY - halfHeight + cornerRadius;\n arcIntersections = cyMath.intersectLineCircle(x1, y1, x2, y2, topLeftCenterX, topLeftCenterY, cornerRadius + padding);\n\n // Ensure the intersection is on the desired quarter of the circle\n if (arcIntersections.length > 0 && arcIntersections[0] <= topLeftCenterX && arcIntersections[1] <= topLeftCenterY) {\n straightLineIntersections = straightLineIntersections.concat(arcIntersections);\n }\n }\n\n // Top Right\n {\n var topRightCenterX = nodeX + halfWidth - cornerRadius;\n var topRightCenterY = nodeY - halfHeight + cornerRadius;\n arcIntersections = cyMath.intersectLineCircle(x1, y1, x2, y2, topRightCenterX, topRightCenterY, cornerRadius + padding);\n\n // Ensure the intersection is on the desired quarter of the circle\n if (arcIntersections.length > 0 && arcIntersections[0] >= topRightCenterX && arcIntersections[1] <= topRightCenterY) {\n straightLineIntersections = straightLineIntersections.concat(arcIntersections);\n }\n }\n\n // Bottom Right\n {\n var bottomRightCenterX = nodeX + halfWidth - cornerRadius;\n var bottomRightCenterY = nodeY + halfHeight - cornerRadius;\n arcIntersections = cyMath.intersectLineCircle(x1, y1, x2, y2, bottomRightCenterX, bottomRightCenterY, cornerRadius + padding);\n\n // Ensure the intersection is on the desired quarter of the circle\n if (arcIntersections.length > 0 && arcIntersections[0] >= bottomRightCenterX && arcIntersections[1] >= bottomRightCenterY) {\n straightLineIntersections = straightLineIntersections.concat(arcIntersections);\n }\n }\n\n // Bottom Left\n {\n var bottomLeftCenterX = nodeX - halfWidth + cornerRadius;\n var bottomLeftCenterY = nodeY + halfHeight - cornerRadius;\n arcIntersections = cyMath.intersectLineCircle(x1, y1, x2, y2, bottomLeftCenterX, bottomLeftCenterY, cornerRadius + padding);\n\n // Ensure the intersection is on the desired quarter of the circle\n if (arcIntersections.length > 0 && arcIntersections[0] <= bottomLeftCenterX && arcIntersections[1] >= bottomLeftCenterY) {\n straightLineIntersections = straightLineIntersections.concat(arcIntersections);\n }\n }\n if (straightLineIntersections.length > 0) return straightLineIntersections;\n return []; // if nothing\n };\n $$.sbgn.intersectLineEllipse = function (x1, y1, x2, y2, centerX, centerY, width, height, padding) {\n var w = width / 2 + padding;\n var h = height / 2 + padding;\n var an = centerX;\n var bn = centerY;\n var d = [x2 - x1, y2 - y1];\n var m = d[1] / d[0];\n var n = -1 * m * x2 + y2;\n var a = h * h + w * w * m * m;\n var b = -2 * an * h * h + 2 * m * n * w * w - 2 * bn * m * w * w;\n var c = an * an * h * h + n * n * w * w - 2 * bn * w * w * n + bn * bn * w * w - h * h * w * w;\n var discriminant = b * b - 4 * a * c;\n if (discriminant < 0) {\n return [];\n }\n var t1 = (-b + Math.sqrt(discriminant)) / (2 * a);\n var t2 = (-b - Math.sqrt(discriminant)) / (2 * a);\n var xMin = Math.min(t1, t2);\n var xMax = Math.max(t1, t2);\n var yMin = m * xMin - m * x2 + y2;\n var yMax = m * xMax - m * x2 + y2;\n return [xMin, yMin, xMax, yMax];\n };\n $$.sbgn.intersectLineStateAndInfoBoxes = function (node, x, y) {\n var centerX = node._private.position.x;\n var centerY = node._private.position.y;\n var padding = parseInt(node.css('border-width')) / 2;\n var stateAndInfos = node._private.data.statesandinfos;\n var intersections = [];\n for (var i = 0; i < stateAndInfos.length; i++) {\n var state = stateAndInfos[i];\n if (!state.isDisplayed) {\n continue;\n }\n var infoBoxWidth = state.bbox.w;\n var infoBoxHeight = state.bbox.h;\n var currIntersections = null;\n if (state.clazz == \"state variable\") {\n var coord = classes.StateVariable.getAbsoluteCoord(state, node.cy());\n currIntersections = $$.sbgn.intersectLineEllipse(x, y, centerX, centerY, coord.x, coord.y, infoBoxWidth, infoBoxHeight, padding);\n } else if (state.clazz == \"residue variable\") {\n var coord = classes.ResidueVariable.getAbsoluteCoord(state, node.cy());\n currIntersections = $$.sbgn.intersectLineEllipse(x, y, centerX, centerY, coord.x, coord.y, infoBoxWidth, infoBoxHeight, padding);\n } else if (state.clazz == \"binding region\") {\n var coord = classes.BindingRegion.getAbsoluteCoord(state, node.cy());\n currIntersections = $$.sbgn.intersectLineEllipse(x, y, centerX, centerY, coord.x, coord.y, infoBoxWidth, infoBoxHeight, padding);\n } else if (state.clazz == \"unit of information\") {\n var coord = classes.UnitOfInformation.getAbsoluteCoord(state, node.cy());\n if (node.data(\"class\") == \"BA macromolecule\" || node.data(\"class\") == \"BA nucleic acid feature\" || node.data(\"class\") == \"BA complex\") {\n currIntersections = $$.sbgn.roundRectangleIntersectLine(x, y, centerX, centerY, coord.x, coord.y, infoBoxWidth, infoBoxHeight, 5, padding);\n } else if (node.data(\"class\") == \"BA unspecified entity\") {\n currIntersections = $$.sbgn.intersectLineEllipse(x, y, centerX, centerY, coord.x, coord.y, infoBoxWidth, infoBoxHeight, padding);\n } else if (node.data(\"class\") == \"BA simple chemical\") {\n currIntersections = cyMath.intersectLineCircle(x, y, centerX, centerY, coord.x, coord.y, infoBoxWidth / 4);\n } else if (node.data(\"class\") == \"BA perturbing agent\") {\n currIntersections = $$.sbgn.perturbingAgentIntersectLine(x, y, centerX, centerY, coord.x, coord.y, infoBoxWidth, infoBoxHeight, padding);\n } else {\n currIntersections = $$.sbgn.roundRectangleIntersectLine(x, y, centerX, centerY, coord.x, coord.y, infoBoxWidth, infoBoxHeight, 0, padding);\n }\n }\n intersections = intersections.concat(currIntersections);\n }\n return intersections;\n };\n $$.sbgn.checkPointStateAndInfoBoxes = function (x, y, node, threshold) {\n return classes.AuxiliaryUnit.checkPoint(x, y, node, threshold);\n };\n $$.sbgn.isNodeShapeTotallyOverriden = function (render, node) {\n if (totallyOverridenNodeShapes[render.getNodeShape(node)]) {\n return true;\n }\n return false;\n };\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvc2Jnbi1leHRlbnNpb25zL3NiZ24tY3ktcmVuZGVyZXIuanMiLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOztBQUVBLElBQUlBLElBQUksR0FBR0MsbUdBQTZDLENBQUMsQ0FBQztBQUMxRCxJQUFJRSxNQUFNLEdBQUdDLENBQUMsR0FBR0osSUFBSSxDQUFDRyxNQUFNO0FBQzVCLElBQUlFLFNBQVMsR0FBR0wsSUFBSSxDQUFDSyxTQUFTO0FBRTlCLElBQUlDLE1BQU0sR0FBR0MsSUFBSSxHQUFHRixTQUFTLENBQUNFLElBQUk7QUFDbEMsSUFBSUMsZ0JBQWdCLEdBQUdILFNBQVMsQ0FBQ0ksY0FBYztBQUMvQyxJQUFJQyxpQkFBaUIsR0FBR0wsU0FBUyxDQUFDTSxlQUFlO0FBRWpELElBQUlDLE9BQU8sR0FBR1gsbUJBQU8sQ0FBQyx3REFBc0IsQ0FBQztBQUU3Q1ksTUFBTSxDQUFDQyxPQUFPLEdBQUcsWUFBWTtFQUMzQixJQUFJQyxFQUFFLEdBQUdWLFNBQVM7O0VBRWxCO0FBQ0Y7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtFQUNFVSxFQUFFLENBQUNDLElBQUksQ0FBQ0MsVUFBVSxHQUFHLFVBQUFDLElBQUEsRUFBa0Y7SUFBQSxJQUF2RUMsT0FBTyxHQUFBRCxJQUFBLENBQVBDLE9BQU87TUFBRUMsSUFBSSxHQUFBRixJQUFBLENBQUpFLElBQUk7TUFBRUMsV0FBVyxHQUFBSCxJQUFBLENBQVhHLFdBQVc7TUFBRUMsV0FBVyxHQUFBSixJQUFBLENBQVhJLFdBQVc7TUFBRUMsV0FBVyxHQUFBTCxJQUFBLENBQVhLLFdBQVc7TUFBRUMsYUFBYSxHQUFBTixJQUFBLENBQWJNLGFBQWE7SUFFakdILFdBQVcsR0FBR0EsV0FBVyxJQUFNRCxJQUFJLElBQUlLLFVBQVUsQ0FBRUwsSUFBSSxDQUFDTSxHQUFHLENBQUUsY0FBZSxDQUFFLENBQUc7SUFFakYsSUFBSUwsV0FBVyxHQUFHLENBQUMsRUFBRTtNQUNuQixJQUFJTSxhQUFh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QUFDN1MsQ0FBQyxFQUFFNlMsS0FBSyxDQUFDNVMsQ0FBQyxFQUFFdVMsWUFBWSxFQUFFRSxhQUFhLEVBQUUxTyxPQUFPLENBQUM7UUFDN0QsQ0FBQyxNQUNJO1VBQ0gyTyxpQkFBaUIsR0FBR3RVLEVBQUUsQ0FBQ0MsSUFBSSxDQUFDZ08sMkJBQTJCLENBQUN0TSxDQUFDLEVBQUVDLENBQUMsRUFBRWdELE9BQU8sRUFBRUMsT0FBTyxFQUN0RTJQLEtBQUssQ0FBQzdTLENBQUMsRUFBRTZTLEtBQUssQ0FBQzVTLENBQUMsRUFBRXVTLFlBQVksRUFBRUUsYUFBYSxFQUFFLENBQUMsRUFBRTFPLE9BQU8sQ0FBQztRQUNwRTtNQUNGO01BRUEwRixhQUFhLEdBQUdBLGFBQWEsQ0FBQ0csTUFBTSxDQUFFOEksaUJBQWtCLENBQUM7SUFFM0Q7SUFFQSxPQUFPakosYUFBYTtFQUN0QixDQUFDO0VBRURyTCxFQUFFLENBQUNDLElBQUksQ0FBQ21NLDJCQUEyQixHQUFHLFVBQVV6SyxDQUFDLEVBQUVDLENBQUMsRUFBRXZCLElBQUksRUFBRTRMLFNBQVMsRUFBRTtJQUNyRSxPQUFPcE0sT0FBTyxDQUFDaVYsYUFBYSxDQUFDaEksVUFBVSxDQUFDbkwsQ0FBQyxFQUFFQyxDQUFDLEVBQUV2QixJQUFJLEVBQUU0TCxTQUFTLENBQUM7RUFDaEUsQ0FBQztFQUVEak0sRUFBRSxDQUFDQyxJQUFJLENBQUM4VSwyQkFBMkIsR0FBRyxVQUFVQyxNQUFNLEVBQUUzVSxJQUFJLEVBQUU7SUFDNUQsSUFBSXVELDBCQUEwQixDQUFDb1IsTUFBTSxDQUFDQyxZQUFZLENBQUM1VSxJQUFJLENBQUMsQ0FBQyxFQUFFO01BQ3pELE9BQU8sSUFBSTtJQUNiO0lBRUEsT0FBTyxLQUFLO0VBQ2QsQ0FBQztBQUNILENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zYmdudml6Ly4vc3JjL3NiZ24tZXh0ZW5zaW9ucy9zYmduLWN5LXJlbmRlcmVyLmpzP2YyZTIiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFJlbmRlciBzYmduIHNwZWNpZmljIHNoYXBlcyB3aGljaCBhcmUgbm90IHN1cHBvcnRlZCBieSBjeXRvc2NhcGUuanMgY29yZVxuICovXG5cbnZhciBsaWJzID0gcmVxdWlyZSgnLi4vdXRpbGl0aWVzL2xpYi11dGlsaXRpZXMnKS5nZXRMaWJzKCk7XG52YXIgalF1ZXJ5ID0gJCA9IGxpYnMualF1ZXJ5O1xudmFyIGN5dG9zY2FwZSA9IGxpYnMuY3l0b3NjYXBlO1xuXG52YXIgY3lNYXRoID0gbWF0aCA9IGN5dG9zY2FwZS5tYXRoO1xudmFyIGN5QmFzZU5vZGVTaGFwZXMgPSBjeXRvc2NhcGUuYmFzZU5vZGVTaGFwZXM7XG52YXIgY3lTdHlsZVByb3BlcnRpZXMgPSBjeXRvc2NhcGUuc3R5bGVQcm9wZXJ0aWVzO1xuXG52YXIgY2xhc3NlcyA9IHJlcXVpcmUoJy4uL3V0aWxpdGllcy9jbGFzc2VzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgJCQgPSBjeXRvc2NhcGU7XG5cbiAgLypcbiAgKiBUYWtlbiBmcm9tIGN5dG9zY2FwZS5qcyBhbmQgbW9kaWZpZWQgc28gdGhhdCBpdCBjYW4gYmUgdXRpbGl6ZWQgZnJvbSBzYmdudml6XG4gICogaW4gYSBmbGV4YWJsZSB3YXkuIEl0IGlzIG5lZWRlZCBiZWNhdXNlIHRoZSBzYmdudml6IHNoYXBlcyB3b3VsZCBuZWVkIHRvIHN0cm9rZVxuICAqIGJvcmRlciBtb3JlIHRoYW4gb25jZSBhcyB0aGV5IHdvdWxkIGhhdmUgaW5mb2JveGVzLCBtdWx0aW1lcnMgZXRjLlxuICAqIEV4dGVuZHMgdGhlIHN0eWxlIHByb3BlcnRpZXMgb2Ygbm9kZSB3aXRoIHRoZSBnaXZlbiBvbmVzIHRoZW4gc3Ryb2tlcyB0aGUgYm9yZGVyLlxuICAqIFdvdWxkIG5lZWRlZCB0byBiZSBzbGlnaHRseSB1cGRhdGVkIGR1cmluZyBjeXRvc2NhcGUgdXBncmFkZXMgaWYgcmVsYXRlZCBmdW5jdGlvbiBpblxuICAqIEN5dG9zY2FwZS5qcyBpcyB1cGRhdGVkLiBJbmZvcm1hdGlvbiBhYm91dCB3aGVyZSBpcyB0aGUgcmVsYXRlZCBmdW5jdGlvbiBpcyBsb2NhdGVkXG4gICogY2FuIGJlIGZvdW5kIGluIHRoZSBmaWxlIHRoYXQgbGlzdCB0aGUgY2hhbmdlcyBkb25lIGluIGl2aXMgY3l0b3NjYXBlIGZvcmsuXG4gICovXG4gICQkLnNiZ24uZHJhd0JvcmRlciA9IGZ1bmN0aW9uKHsgY29udGV4dCwgbm9kZSwgYm9yZGVyV2lkdGgsIGJvcmRlckNvbG9yLCBib3JkZXJTdHlsZSwgYm9yZGVyT3BhY2l0eSB9KSB7XG5cbiAgICBib3JkZXJXaWR0aCA9IGJvcmRlcldpZHRoIHx8ICggbm9kZSAmJiBwYXJzZUZsb2F0KCBub2RlLmNzcyggJ2JvcmRlci13aWR0aCcgKSApICk7XG5cbiAgICBpZiggYm9yZGVyV2lkdGggPiAwICl7XG4gICAgICB2YXIgcGFyZW50T3BhY2l0eSA9ICggbm9kZSAmJiBub2RlLmVmZmVjdGl2ZU9wYWNpdHkoKSApIHx8IDE7XG5cbiAgICAgIFxuICAgICAgYm9yZGVyU3R5bGUgPSBib3JkZXJTdHlsZSB8fCAoIG5vZGUgJiYgbm9kZS5jc3MoICdib3JkZXItc3R5bGUnICkgKTtcbiAgICAgIGJvcmRlckNvbG9yID0gYm9yZGVyQ29sb3IgfHwgKCBub2RlICYmIG5vZGUuY3NzKCAnYm9yZGVyLWNvbG9yJyApICk7XG4gICAgICBib3JkZXJPcGFjaXR5ID0gKFxuICAgICAgICAgIGJvcmRlck9wYWNpdHkgfHwgKCBub2RlICYmIG5vZGUuY3NzKCAnYm9yZGVyLW9wYWNpdHknICkgKVxuICAgICAgICApICogcGFyZW50T3BhY2l0eTtcblxuICAgICAgdmFyIHByb3BzVG9SZXN0b3JlID0gWyAnbGluZVdpZHRoJywgJ2xpbmVDYXAnLCAnc3Ryb2tlU3R5bGUnLCAnZ2xvYmFsQWxwaGEnIF07XG4gICAgICB2YXIgaW5pdGlhbFByb3BzID0ge307XG5cbiAgICAgIHByb3BzVG9SZXN0b3JlLmZvckVhY2goIGZ1bmN0aW9uKCBwcm9wTmFtZSApIHtcbiAgICAgICAgaW5pdGlhbFByb3BzWyBwcm9wTmFtZSBdID0gY29udGV4dFsgcHJvcE5hbWUgXTtcbiAgICAgIH0gKTtcblxuICAgICAgY29udGV4dC5saW5lV2lkdGggPSBib3JkZXJXaWR0aDtcbiAgICAgIGNvbnRleHQubGluZUNhcCA9ICdidXR0JztcbiAgICAgIGNvbnRleHQuc3Ryb2tlU3R5bGUgPSBib3JkZXJDb2xvcjtcbiAgICAgIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSBib3JkZXJPcGFjaXR5O1xuXG4gICAgICBcbiAgICAgIGlmKCBjb250ZXh0LnNldExpbmVEYXNoICl7IC8vIGZvciB2ZXJ5IG91dG9mZGF0ZSBicm93c2Vyc1xuICAgICAgICBzd2l0Y2goIGJvcmRlclN0eWxlICl7XG4gICAgICAgICAgY2FzZSAnZG90dGVkJzpcbiAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goIFsgMSwgMSBdICk7XG4gICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgIGNhc2UgJ2Rhc2hlZCc6XG4gICAgICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKCBbIDQsIDIgXSApO1xuICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICBjYXNlICdzb2xpZCc6XG4gICAgICAgICAgY2FzZSAnZG91YmxlJzpcbiAgICAgICAgICAgIGNvbnRleHQuc2V0TGluZURhc2goIFsgXSApO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY29udGV4dC5zdHJva2UoKTtcblxuICAgICAgaWYoIGJvcmRlclN0eWxlID09PSAnZG91YmxlJyApe1xuICAgICAgICBjb250ZXh0LmxpbmVXaWR0aCA9IGJvcmRlcldpZHRoIC8gMztcblxuICAgICAgICBsZXQgZ2NvID0gY29udGV4dC5nbG9iYWxDb21wb3NpdGVPcGVyYXRpb247XG4gICAgICAgIGNvbnRleHQuZ2xvYmFsQ29tcG9zaXRlT3BlcmF0aW9uID0gJ2Rlc3RpbmF0aW9uLW91dCc7XG5cbiAgICAgICAgY29udGV4dC5zdHJva2UoKTtcblxuICAgICAgICBjb250ZXh0Lmdsb2JhbENvbXBvc2l0ZU9wZXJhdGlvbiA9IGdjbztcbiAgICAgIH1cblxuICAgICAgLy8gcmVzZXQgaW4gY2FzZSB3ZSBjaGFuZ2VkIHRoZSBib3JkZXIgc3R5bGVcbiAgICAgIGlmKCBjb250ZXh0LnNldExpbmVEYXNoICl7IC8vIGZvciB2ZXJ5IG91dG9mZGF0ZSBicm93c2Vyc1xuICAgICAgICBjb250ZXh0LnNldExpbmVEYXNoKCBbIF0gKTtcbiAgICAgIH1cblxuICAgICAgcHJvcHNUb1Jlc3RvcmUuZm9yRWFjaCggZnVuY3Rpb24oIHByb3BOYW1lICkge1xuICAgICAgICBjb250ZXh0WyBwcm9wTmFtZSBdID0gaW5pdGlhbFByb3BzWyBwcm9wTmFtZSBdO1xuICAgICAgfSApO1xuICAgIH1cbiAgfTtcblxuICAvLyBUYWtlbiBmcm9tIGN5dG9zY2FwZS5qcyBhbmQgbW9kaWZpZWRcbiAgdmFyIGRyYXdSb3VuZFJlY3RhbmdsZVBhdGggPSAkJC5zYmduLmRyYXdSb3VuZFJlY3RhbmdsZVBhdGggPSBmdW5jdGlvbihcbiAgICBjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCByYWRpdXMgKXtcbiAgICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICAgIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgICB2YXIgY29ybmVyUmFkaXVzID0gcmFkaXVzIHx8IGN5TWF0aC5nZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyggd2lkdGgsIGhlaWdodCApO1xuXG4gICAgaWYoIGNvbnRleHQuYmVnaW5QYXRoICl7IGNvbnRleHQuYmVnaW5QYXRoKCk7IH1cblxuICAgIC8vIFN0YXJ0IGF0IHRvcCBtaWRkbGVcbiAgICBjb250ZXh0Lm1vdmVUbyggeCwgeSAtIGhhbGZIZWlnaHQgKTtcbiAgICAvLyBBcmMgZnJvbSBtaWRkbGUgdG9wIHRvIHJpZ2h0IHNpZGVcbiAgICBjb250ZXh0LmFyY1RvKCB4ICsgaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCwgeCArIGhhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzICk7XG4gICAgLy8gQXJjIGZyb20gcmlnaHQgc2lkZSB0byBib3R0b21cbiAgICBjb250ZXh0LmFyY1RvKCB4ICsgaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCwgeCwgeSArIGhhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyApO1xuICAgIC8vIEFyYyBmcm9tIGJvdHRvbSB0byBsZWZ0IHNpZGVcbiAgICBjb250ZXh0LmFyY1RvKCB4IC0gaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCwgeCAtIGhhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzICk7XG4gICAgLy8gQXJjIGZyb20gbGVmdCBzaWRlIHRvIHRvcEJvcmRlclxuICAgIGNvbnRleHQuYXJjVG8oIHggLSBoYWxmV2lkdGgsIHkgLSBoYWxmSGVpZ2h0LCB4LCB5IC0gaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzICk7XG4gICAgLy8gSm9pbiBsaW5lXG4gICAgY29udGV4dC5saW5lVG8oIHgsIHkgLSBoYWxmSGVpZ2h0ICk7XG5cbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuXG5cbiAgICAvL2NvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIC8vY29udGV4dC5iZWdpblBhdGgoKVxuXG4gIH07XG5cblxuICB2YXIgZHJhd1Byb3RlaW5QYXRoID0gJCQuc2Jnbi5kcmF3UHJvdGVpbiA9IGZ1bmN0aW9uKFxuICAgIGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGFjdGl2ZVBhZGRpbmcxICApe1xuICAgIHZhciBoYWxmV2lkdGggPSAod2lkdGgrIGFjdGl2ZVBhZGRpbmcxKSAvIDI7XG4gICAgdmFyIGhhbGZIZWlnaHQgPSAoaGVpZ2h0ICsgYWN0aXZlUGFkZGluZzEpIC8gMjtcbiAgICB2YXIgY29ybmVyUmFkaXVzID0gIGN5TWF0aC5nZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyggd2lkdGgsIGhlaWdodCApO1xuXG4gICAgaWYoIGNvbnRleHQuYmVnaW5QYXRoICl7IGNvbnRleHQuYmVnaW5QYXRoKCk7IH1cblxuICAgIC8vIFN0YXJ0IGF0IHRvcCBtaWRkbGVcbiAgICBjb250ZXh0Lm1vdmVUbyggeCwgeSAtIGhhbGZIZWlnaHQgKTtcbiAgICAvLyBBcmMgZnJvbSBtaWRkbGUgdG9wIHRvIHJpZ2h0IHNpZGVcbiAgICBjb250ZXh0LmFyY1RvKCB4ICsgaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCwgeCArIGhhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzICk7XG4gICAgLy8gQXJjIGZyb20gcmlnaHQgc2lkZSB0byBib3R0b21cbiAgICBjb250ZXh0LmFyY1RvKCB4ICsgaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCwgeCwgeSArIGhhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyApO1xuICAgIC8vIEFyYyBmcm9tIGJvdHRvbSB0byBsZWZ0IHNpZGVcbiAgICBjb250ZXh0LmFyY1RvKCB4IC0gaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCwgeCAtIGhhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzICk7XG4gICAgLy8gQXJjIGZyb20gbGVmdCBzaWRlIHRvIHRvcEJvcmRlclxuICAgIGNvbnRleHQuYXJjVG8oIHggLSBoYWxmV2lkdGgsIHkgLSBoYWxmSGVpZ2h0LCB4LCB5IC0gaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzICk7XG4gICAgLy8gSm9pbiBsaW5lXG4gICAgY29udGV4dC5saW5lVG8oIHgsIHkgLSBoYWxmSGVpZ2h0ICk7XG5cbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuXG5cbiAgICAvL2NvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIC8vY29udGV4dC5iZWdpblBhdGgoKVxuXG4gIH07XG5cblxuICB2YXIgZHJhd1JlY2VwdG9yUGF0aCA9ICQkLnNiZ24uZHJhd1JlY2VwdG9yID0gZnVuY3Rpb24oXG4gICAgY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgYWN0aXZlUGFkZGluZzEgICl7XG4gICAgdmFyIGhhbGZQYWRkaW5nICA9IGFjdGl2ZVBhZGRpbmcxPyBhY3RpdmVQYWRkaW5nMS8yOiAwO1xuICAgIC8vdmFyIHBvaW50cz0gWy0xLCAtMSwgICAwLCAtMC41LCAgIDEsIC0xLCAgIDEsIDAuNSwgICAwLCAxLCAgIC0xLCAgMC41IF07XG4gICAgdmFyIGhhbGZXID0gd2lkdGggLyAyO1xuICAgIHZhciBoYWxmSCA9IGhlaWdodCAvIDI7XG4gICAgXG5cbiAgICBpZiggY29udGV4dC5iZWdpblBhdGggKXsgY29udGV4dC5iZWdpblBhdGgoKTsgfVxuXG4gICAgY29udGV4dC5tb3ZlVG8oIHggKyBoYWxmVyAqICgtMSkgLSBoYWxmUGFkZGluZywgeSArIGhhbGZIICogKC0xKSAtIDMqaGFsZlBhZGRpbmcvMilcbiAgICBjb250ZXh0LmxpbmVUbyggeCArIGhhbGZXICogKDApLCB5ICsgaGFsZkggKiAoLTAuNSkgLSAzKmhhbGZQYWRkaW5nLzIpXG4gICAgY29udGV4dC5saW5lVG8oIHggKyBoYWxmVyAqICgxKSArIGhhbGZQYWRkaW5nLCB5ICsgaGFsZkggKiAoLTEpIC0gMypoYWxmUGFkZGluZy8yKVxuICAgIGNvbnRleHQubGluZVRvKCB4ICsgaGFsZlcgKiAoMSkgKyBoYWxmUGFkZGluZywgeSArIGhhbGZIICogKDAuNSkgKyBoYWxmUGFkZGluZylcbiAgICBjb250ZXh0LmxpbmVUbyggeCArIGhhbGZXICogKDApLCB5ICsgaGFsZkggKiAoMSkgKyAzKmhhbGZQYWRkaW5nLzIpXG4gICAgY29udGV4dC5saW5lVG8oIHggKyBoYWxmVyAqICgtMSkgLSBoYWxmUGFkZGluZywgeSArIGhhbGZIICogKDAuNSkgKyBoYWxmUGFkZGluZylcblxuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG5cbiAgfTtcblxuICB2YXIgZHJhd1JvdW5kZWREcnVnUGF0aD0gJCQuc2Jnbi5kcmF3Um91bmRlZERydWcgPSBmdW5jdGlvbihcbiAgICBjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCByYWRpdXMgKVxuICAgIHtcbiAgICAgIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gICAgICB2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7XG4gICAgICB2YXIgY29ybmVyUmFkaXVzID0gTWF0aC5taW4oaGFsZldpZHRoLCBoYWxmSGVpZ2h0KTtcblxuICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcblxuICAgICAgLy8gU3RhcnQgYXQgdG9wIG1pZGRsZVxuICAgICAgY29udGV4dC5tb3ZlVG8oeCwgeS1oYWxmSGVpZ2h0KTtcbiAgICAgIC8vIEFyYyBmcm9tIG1pZGRsZSB0b3AgdG8gcmlnaHQgc2lkZVxuICAgICAgY29udGV4dC5hcmNUbyh4K2hhbGZXaWR0aCwgeS1oYWxmSGVpZ2h0LCB4K2hhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzKTtcbiAgICAgIC8vIEFyYyBmcm9tIHJpZ2h0IHNpZGUgdG8gYm90dG9tXG4gICAgICBjb250ZXh0LmFyY1RvKHgraGFsZldpZHRoLCB5K2hhbGZIZWlnaHQsIHgsIHkraGFsZkhlaWdodCwgY29ybmVyUmFkaXVzKTtcbiAgICAgIC8vIEFyYyBmcm9tIGJvdHRvbSB0byBsZWZ0IHNpZGVcbiAgICAgIGNvbnRleHQuYXJjVG8oeC1oYWxmV2lkdGgsIHkraGFsZkhlaWdodCwgeC1oYWxmV2lkdGgsIHksIGNvcm5lclJhZGl1cyk7XG4gICAgICAvLyBBcmMgZnJvbSBsZWZ0IHNpZGUgdG8gdG9wQm9yZGVyXG4gICAgICBjb250ZXh0LmFyY1RvKHgtaGFsZldpZHRoLCB5LWhhbGZIZWlnaHQsIHgsIHktaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzKTtcbiAgICAgIC8vIEpvaW4gbGluZVxuICAgICAgY29udGV4dC5saW5lVG8oeCwgeS1oYWxmSGVpZ2h0KTtcblxuICAgICAgdmFyIGhhbGZXaWR0aElubmVyID0gd2lkdGggLyAyIC0gNTtcbiAgICAgIHZhciBoYWxmSGVpZ2h0SW5uZXIgPSBoZWlnaHQgLyAyIC0gNTtcbiAgICAgIHZhciBjb3JuZXJSYWRpdXMgPSBNYXRoLm1pbiggaGFsZldpZHRoSW5uZXIsIGhhbGZIZWlnaHRJbm5lciApO1xuXG4gICAgICAvLyBTdGFydCBhdCB0b3AgbWlkZGxlXG4gICAgICBjb250ZXh0Lm1vdmVUbyh4LCB5LWhhbGZIZWlnaHRJbm5lcik7XG4gICAgICAvLyBBcmMgZnJvbSBtaWRkbGUgdG9wIHRvIHJpZ2h0IHNpZGVcbiAgICAgIGNvbnRleHQuYXJjVG8oeCtoYWxmV2lkdGhJbm5lciwgeS1oYWxmSGVpZ2h0SW5uZXIsIHgraGFsZldpZHRoSW5uZXIsIHksIGNvcm5lclJhZGl1cyk7XG4gICAgICAvLyBBcmMgZnJvbSByaWdodCBzaWRlIHRvIGJvdHRvbVxuICAgICAgY29udGV4dC5hcmNUbyh4K2hhbGZXaWR0aElubmVyLCB5K2hhbGZIZWlnaHRJbm5lciwgeCwgeStoYWxmSGVpZ2h0SW5uZXIsIGNvcm5lclJhZGl1cyk7XG4gICAgICAvLyBBcmMgZnJvbSBib3R0b20gdG8gbGVmdCBzaWRlXG4gICAgICBjb250ZXh0LmFyY1RvKHgtaGFsZldpZHRoSW5uZXIsIHkraGFsZkhlaWdodElubmVyLCB4LWhhbGZXaWR0aElubmVyLCB5LCBjb3JuZXJSYWRpdXMpO1xuICAgICAgLy8gQXJjIGZyb20gbGVmdCBzaWRlIHRvIHRvcEJvcmRlclxuICAgICAgY29udGV4dC5hcmNUbyh4LWhhbGZXaWR0aElubmVyLCB5LWhhbGZIZWlnaHRJbm5lciwgeCwgeS1oYWxmSGVpZ2h0SW5uZXIsIGNvcm5lclJhZGl1cyk7XG4gICAgICAvLyBKb2luIGxpbmVcbiAgICAgIGNvbnRleHQubGluZVRvKHgsIHktaGFsZkhlaWdodElubmVyKTtcblxuICAgICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgfTtcbiAgXG4gIC8vIFRha2VuIGZyb20gY3l0b3NjYXBlLmpzXG4gIHZhciBkcmF3UG9seWdvblBhdGggPSBmdW5jdGlvbihcbiAgICBjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBwb2ludHMgKXtcblxuICAgIHZhciBoYWxmVyA9IHdpZHRoIC8gMjtcbiAgICB2YXIgaGFsZkggPSBoZWlnaHQgLyAyO1xuXG4gICAgaWYoIGNvbnRleHQuYmVnaW5QYXRoICl7IGNvbnRleHQuYmVnaW5QYXRoKCk7IH1cblxuICAgIGNvbnRleHQubW92ZVRvKCB4ICsgaGFsZlcgKiBwb2ludHNbMF0sIHkgKyBoYWxmSCAqIHBvaW50c1sxXSApO1xuXG4gICAgZm9yKCB2YXIgaSA9IDE7IGkgPCBwb2ludHMubGVuZ3RoIC8gMjsgaSsrICl7XG4gICAgICBjb250ZXh0LmxpbmVUbyggeCArIGhhbGZXICogcG9pbnRzWyBpICogMl0sIHkgKyBoYWxmSCAqIHBvaW50c1sgaSAqIDIgKyAxXSApO1xuICAgIH1cblxuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG4gIH07XG4gIFxuICB2YXIgc2JnblNoYXBlcyA9ICQkLnNiZ24uc2JnblNoYXBlcyA9IHtcbiAgICAnZW1wdHkgc2V0JzogdHJ1ZSxcbiAgICAnbnVjbGVpYyBhY2lkIGZlYXR1cmUnOiB0cnVlLFxuICAgICdjb21wbGV4JzogdHJ1ZSxcbiAgICAnbWFjcm9tb2xlY3VsZSc6IHRydWUsXG4gICAgJ3NpbXBsZSBjaGVtaWNhbCc6IHRydWUsXG4gICAgJ2Jpb2xvZ2ljYWwgYWN0aXZpdHknOiB0cnVlLFxuICAgICdjb21wYXJ0bWVudCc6IHRydWUsXG4gICAgJ2dlbmUnOiB0cnVlLFxuICAgICdybmEnOiB0cnVlLFxuICAgICdzaW1wbGUgbW9sZWN1bGUnOiB0cnVlLFxuICAgICd1bmtub3duIG1vbGVjdWxlJzogdHJ1ZSxcbiAgICAnZHJ1Zyc6IHRydWUsXG4gICAgJ3RydW5jYXRlZCBwcm90ZWluJzogdHJ1ZSxcbiAgICAnaW9uIGNoYW5uZWwnOiB0cnVlLFxuICAgICdyZWNlcHRvcic6IHRydWUsXG4gICAgJ2lvbic6IHRydWUsXG4gICAgJ3BoZW5vdHlwZSBzYm1sJzogdHJ1ZSxcbiAgICAnY29tcGxleCBzYm1sJzogdHJ1ZSxcbiAgICAncHJvdGVpbic6IHRydWUsXG4gICAgJ2RlZ3JhZGF0aW9uJzogdHJ1ZVxuICB9O1xuXG4gIHZhciB0b3RhbGx5T3ZlcnJpZGVuTm9kZVNoYXBlcyA9ICQkLnNiZ24udG90YWxseU92ZXJyaWRlbk5vZGVTaGFwZXMgPSB7XG4gICAgJ21hY3JvbW9sZWN1bGUnOiB0cnVlLFxuICAgICdudWNsZWljIGFjaWQgZmVhdHVyZSc6IHRydWUsXG4gICAgJ3NpbXBsZSBjaGVtaWNhbCc6IHRydWUsXG4gICAgJ2NvbXBsZXgnOiB0cnVlLFxuICAgICdiaW9sb2dpY2FsIGFjdGl2aXR5JzogdHJ1ZSxcbiAgICAnY29tcGFydG1lbnQnOiB0cnVlLFxuICAgICdwcm90ZWluJzp0cnVlLFxuICAgICdnZW5lJzp0cnVlLFxuICAgICdybmEnOnRydWUsXG4gICAgJ3JlY2VwdG9yJzogdHJ1ZSxcbiAgICAnaW9uIGNoYW5uZWwnOiB0cnVlLFxuICAgICd0cnVuY2F0ZWQgcHJvdGVpbic6IHRydWUsXG4gICAgJ3BoZW5vdHlwZSBzYm1sJzogdHJ1ZSxcbiAgICAnaW9uJzogdHJ1ZSxcbiAgICAnc2ltcGxlIG1vbGVjdWxlJzogdHJ1ZSxcbiAgICAndW5rbm93biBtb2xlY3VsZSc6IHRydWUsXG4gICAgJ2RydWcnOiB0cnVlLFxuICAgICdjb21wbGV4IHNibWwnOiB0cnVlXG4gIH07XG5cbiAgdmFyIGNhbkhhdmVJbmZvQm94U2hhcGVzID0gJCQuc2Jnbi5jYW5IYXZlSW5mb0JveFNoYXBlcyA9IHtcbiAgICAnc2ltcGxlIGNoZW1pY2FsJzogdHJ1ZSxcbiAgICAnbWFjcm9tb2xlY3VsZSc6IHRydWUsXG4gICAgJ251Y2xlaWMgYWNpZCBmZWF0dXJlJzogdHJ1ZSxcbiAgICAnY29tcGxleCc6IHRydWUsXG4gICAgJ2Jpb2xvZ2ljYWwgYWN0aXZpdHknOiB0cnVlLFxuICAgICdjb21wYXJ0bWVudCc6IHRydWUsXG4gICAgJ3Byb3RlaW4nOiB0cnVlLFxuICAgICdyZWNlcHRvcic6IHRydWUsXG4gICAgJ3RydW5jYXRlZCBwcm90ZWluJzogdHJ1ZSxcbiAgICAnaW9uIGNoYW5uZWwnOiB0cnVlLFxuICAgICdjb21wbGV4IHNibWwnOiB0cnVlLFxuICAgICdnZW5lJzogdHJ1ZSxcbiAgICAncm5hJzogdHJ1ZSxcbiAgICAnc2ltcGxlIG1vbGVjdWxlJzogdHJ1ZSxcbiAgICAndW5rbm93biBtb2xlY3VsZSc6IHRydWUsXG4gICAgJ3BoZW5vdHlwZSBzYm1sJzogdHJ1ZSxcbiAgICAnZHJ1Zyc6IHRydWUsXG4gICAgJ2lvbic6IHRydWUsXG4gICAgJ2RlZ3JhZGF0aW9uJzogdHJ1ZVxuICB9O1xuXG4gIHZhciBjYW5CZU11bHRpbWVyU2hhcGVzID0gJCQuc2Jnbi5jYW5CZU11bHRpbWVyU2hhcGVzID0ge1xuICAgICdtYWNyb21vbGVjdWxlJzogdHJ1ZSxcbiAgICAnY29tcGxleCc6IHRydWUsXG4gICAgJ251Y2xlaWMgYWNpZCBmZWF0dXJlJzogdHJ1ZSxcbiAgICAnc2ltcGxlIGNoZW1pY2FsJzogdHJ1ZSxcbiAgICAncmVjZXB0b3InOiB0cnVlLFxuICAgICdpb24gY2hhbm5lbCc6IHRydWUsXG4gICAgJ3RydW5jYXRlZCBwcm90ZWluJzogdHJ1ZSxcbiAgICAnZ2VuZSc6IHRydWUsXG4gICAgJ3JuYSc6IHRydWUsXG4gICAgJ3BoZW5vdHlwZSc6IHRydWUsXG4gICAgJ2lvbic6IHRydWUsXG4gICAgJ3NpbXBsZSBtb2xlY3VsZSc6IHRydWUsXG4gICAgJ3Vua25vd24gbW9sZWN1bGUnOiB0cnVlLFxuICAgICdkcnVnJzogdHJ1ZSxcbiAgICAncGhlbm90eXBlIHNibWwnOiB0cnVlLFxuICAgICdjb21wbGV4IHNibWwnOiB0cnVlLFxuICAgICdwcm90ZWluJzogdHJ1ZVxuICB9O1xuXG4gIHZhciBjYW5CZUFjdGl2ZVNoYXBlcyA9ICQkLnNiZ24uY2FuQmVBY3RpdmVTaGFwZXMgPSB7XG4gICAgICAncHJvdGVpbic6IHRydWUsXG4gICAgICAnY29tcGxleCBzYm1sJzogdHJ1ZSxcbiAgICAgICdyZWNlcHRvcic6IHRydWUsXG4gICAgICAnaW9uIGNoYW5uZWwnOiB0cnVlLFxuICAgICAgJ3RydW5jYXRlZCBwcm90ZWluJzogdHJ1ZVxuICB9O1xuXG4gIHZhciBjYW5CZUh5cG90aGV0aWNhbFNoYXBlcyA9ICQkLnNiZ24uY2FuQmVIeXBvdGhldGljYWxTaGFwZXMgPSB7XG4gICAgJ3Byb3RlaW4nOiB0cnVlLFxuICAgICdjb21wbGV4IHNibWwnOiB0cnVlLFxuICAgICdyZWNlcHRvcic6IHRydWUsXG4gICAgJ2lvbiBjaGFubmVsJzogdHJ1ZSxcbiAgICAndHJ1bmNhdGVkIHByb3RlaW4nOiB0cnVlLFxuICAgICdnZW5lJzogdHJ1ZSxcbiAgICAncm5hJzogdHJ1ZSxcbiAgICAncGhlbm90eXBlIHNibWwnOiB0cnVlLFxuICAgICdpb24nOiB0cnVlLFxuICAgICdzaW1wbGUgbW9sZWN1bGUnOiB0cnVlLFxuICAgICd1bmtub3duIG1vbGVjdWxlJzogdHJ1ZSxcbiAgICAnZHJ1Zyc6IHRydWUsXG4gICAgJ2RlZ3JhZGF0aW9uJzogdHJ1ZVxufTtcblxuICBjeU1hdGguY2FsY3VsYXRlRGlzdGFuY2UgPSBmdW5jdGlvbiAocG9pbnQxLCBwb2ludDIpIHtcbiAgICB2YXIgZGlzdGFuY2UgPSBNYXRoLnBvdyhwb2ludDFbMF0gLSBwb2ludDJbMF0sIDIpICsgTWF0aC5wb3cocG9pbnQxWzFdIC0gcG9pbnQyWzFdLCAyKTtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KGRpc3RhbmNlKTtcbiAgfTtcblxuICAkJC5zYmduLmNvbG9ycyA9IHtcbiAgICBjbG9uZTogXCIjODM4MzgzXCJcbiAgfTtcbiAgXG5cbiAgJCQuc2Jnbi5nZXREZWZhdWx0Q29tcGxleENvcm5lckxlbmd0aCA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiAyNDtcbiAgfTtcblxuICAkJC5zYmduLmdldERlZmF1bHRHZW5lQ29ybmVyTGVuZ3RoID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIDI0O1xuICB9O1xuXG4gICQkLnNiZ24uZHJhd1N0YXRlQW5kSW5mb3MgPSBmdW5jdGlvbiAobm9kZSwgY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSkge1xuICAgIHZhciBsYXlvdXRzID0gbm9kZS5kYXRhKCdhdXh1bml0bGF5b3V0cycpO1xuXG4gICAgZm9yICh2YXIgc2lkZSBpbiBsYXlvdXRzKSB7XG4gICAgICB2YXIgbGF5b3V0ID0gbGF5b3V0c1tzaWRlXTtcbiAgICAgIGNsYXNzZXMuQXV4VW5pdExheW91dC5kcmF3KGxheW91dCwgbm9kZS5jeSgpLCBjb250ZXh0KTtcbiAgICB9XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICB9O1xuXG4gICQkLnNiZ24uZHJhd0luZm9Cb3ggPSBmdW5jdGlvbihjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBzaGFwZU5hbWUpIHtcbiAgICBzd2l0Y2ggKHNoYXBlTmFtZSkge1xuICAgICAgY2FzZSAncm91bmRyZWN0YW5nbGUnOlxuICAgICAgICBjeUJhc2VOb2RlU2hhcGVzWydyb3VuZHJlY3RhbmdsZSddLmRyYXcoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnYm90dG9tcm91bmRyZWN0YW5nbGUnOlxuICAgICAgICAkJC5zYmduLmRyYXdCb3R0b21Sb3VuZFJlY3RhbmdsZShjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdlbGxpcHNlJzpcbiAgICAgICAgY3lCYXNlTm9kZVNoYXBlc1snZWxsaXBzZSddLmRyYXcoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnY29tcGxleCc6XG4gICAgICAgICQkLnNiZ24uZHJhd0NvbXBsZXgoIGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGhlaWdodCAvIDIgKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdwZXJ0dXJiaW5nIGFnZW50JzpcbiAgICAgICAgdmFyIHBvaW50cyA9ICQkLnNiZ24uZ2VuZXJhdGVQZXJ0dXJiaW5nQWdlbnRQb2ludHMoKTtcbiAgICAgICAgZHJhd1BvbHlnb25QYXRoKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIHBvaW50cyk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAncmVjdGFuZ2xlJzpcbiAgICAgICAgY3lCYXNlTm9kZVNoYXBlc1sncmVjdGFuZ2xlJ10uZHJhdyhjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlICdzdGFkaXVtJzpcbiAgICAgICAgJCQuc2Jnbi5kcmF3Um91bmRSZWN0YW5nbGVQYXRoKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIE1hdGgubWluKHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgMTUpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgfVxuICB9O1xuXG4gIC8vICQkLnNiZ24uQWZTaGFwZUFyZ3NGbiA9IGZ1bmN0aW9uIChzZWxmKXtcblx0Ly8gICByZXR1cm4gW3NlbGYuYmJveC53LCBzZWxmLmJib3guaCwgY2xhc3Nlcy5nZXRBdXhVbml0Q2xhc3Moc2VsZikuZ2V0UGFyZW50KHNlbGYpLmRhdGEoXCJjbGFzc1wiKV07XG4gIC8vIH1cblxuXG4gICQkLnNiZ24ubnVjbGVpY0FjaWRDaGVja1BvaW50ID0gZnVuY3Rpb24gKHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclksIHBvaW50cywgY29ybmVyUmFkaXVzKSB7XG5cbiAgICAvL2NoZWNrIHJlY3RhbmdsZSBhdCB0b3BcbiAgICBpZiAoY3lNYXRoLnBvaW50SW5zaWRlUG9seWdvbih4LCB5LCBwb2ludHMsXG4gICAgICAgICAgICBjZW50ZXJYLCBjZW50ZXJZIC0gY29ybmVyUmFkaXVzIC8gMiwgd2lkdGgsIGhlaWdodCAtIGNvcm5lclJhZGl1cyAvIDMsIFswLCAtMV0sXG4gICAgICAgICAgICBwYWRkaW5nKSkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy9jaGVjayByZWN0YW5nbGUgYXQgYm90dG9tXG4gICAgaWYgKGN5TWF0aC5wb2ludEluc2lkZVBvbHlnb24oeCwgeSwgcG9pbnRzLFxuICAgICAgICAgICAgY2VudGVyWCwgY2VudGVyWSArIGhlaWdodCAvIDIgLSBjb3JuZXJSYWRpdXMgLyAyLCB3aWR0aCAtIDIgKiBjb3JuZXJSYWRpdXMsIGNvcm5lclJhZGl1cywgWzAsIC0xXSxcbiAgICAgICAgICAgIHBhZGRpbmcpKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvL2NoZWNrIGVsbGlwc2VzXG4gICAgdmFyIGNoZWNrSW5FbGxpcHNlID0gZnVuY3Rpb24gKHgsIHksIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHBhZGRpbmcpIHtcbiAgICAgIHggLT0gY2VudGVyWDtcbiAgICAgIHkgLT0gY2VudGVyWTtcblxuICAgICAgeCAvPSAod2lkdGggLyAyICsgcGFkZGluZyk7XG4gICAgICB5IC89IChoZWlnaHQgLyAyICsgcGFkZGluZyk7XG5cbiAgICAgIHJldHVybiAoTWF0aC5wb3coeCwgMikgKyBNYXRoLnBvdyh5LCAyKSA8PSAxKTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBib3R0b20gcmlnaHQgcXVhcnRlciBjaXJjbGVcbiAgICBpZiAoY2hlY2tJbkVsbGlwc2UoeCwgeSxcbiAgICAgICAgICAgIGNlbnRlclggKyB3aWR0aCAvIDIgLSBjb3JuZXJSYWRpdXMsXG4gICAgICAgICAgICBjZW50ZXJZICsgaGVpZ2h0IC8gMiAtIGNvcm5lclJhZGl1cyxcbiAgICAgICAgICAgIGNvcm5lclJhZGl1cyAqIDIsIGNvcm5lclJhZGl1cyAqIDIsIHBhZGRpbmcpKSB7XG5cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGJvdHRvbSBsZWZ0IHF1YXJ0ZXIgY2lyY2xlXG4gICAgaWYgKGNoZWNrSW5FbGxpcHNlKHgsIHksXG4gICAgICAgICAgICBjZW50ZXJYIC0gd2lkdGggLyAyICsgY29ybmVyUmFkaXVzLFxuICAgICAgICAgICAgY2VudGVyWSArIGhlaWdodCAvIDIgLSBjb3JuZXJSYWRpdXMsXG4gICAgICAgICAgICBjb3JuZXJSYWRpdXMgKiAyLCBjb3JuZXJSYWRpdXMgKiAyLCBwYWRkaW5nKSkge1xuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgLy93ZSBuZWVkIHRvIGZvcmNlIG9wYWNpdHkgdG8gMSBzaW5jZSB3ZSBtaWdodCBoYXZlIHN0YXRlIGFuZCBpbmZvIGJveGVzLlxuICAvL2hhdmluZyBvcGFxdWUgbm9kZXMgd2hpY2ggaGF2ZSBzdGF0ZSBhbmQgaW5mbyBib3hlcyBnaXZlcyB1bnBsZWFzZW50IHJlc3VsdHMuXG4gICQkLnNiZ24uZm9yY2VPcGFjaXR5VG9PbmUgPSBmdW5jdGlvbiAobm9kZSwgY29udGV4dCkge1xuICAgIHZhciBwYXJlbnRPcGFjaXR5ID0gbm9kZS5lZmZlY3RpdmVPcGFjaXR5KCk7XG4gICAgaWYgKHBhcmVudE9wYWNpdHkgPT09IDApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBjb250ZXh0LmZpbGxTdHlsZSA9IFwicmdiYShcIlxuICAgICAgICAgICAgKyBub2RlLl9wcml2YXRlLnN0eWxlW1wiYmFja2dyb3VuZC1jb2xvclwiXS52YWx1ZVswXSArIFwiLFwiXG4gICAgICAgICAgICArIG5vZGUuX3ByaXZhdGUuc3R5bGVbXCJiYWNrZ3JvdW5kLWNvbG9yXCJdLnZhbHVlWzFdICsgXCIsXCJcbiAgICAgICAgICAgICsgbm9kZS5fcHJpdmF0ZS5zdHlsZVtcImJhY2tncm91bmQtY29sb3JcIl0udmFsdWVbMl0gKyBcIixcIlxuICAgICAgICAgICAgKyAoMSAqIG5vZGUuY3NzKCdvcGFjaXR5JykgKiBwYXJlbnRPcGFjaXR5KSArIFwiKVwiO1xuICB9O1xuXG4gICQkLnNiZ24uZHJhd1NpbXBsZUNoZW1pY2FsUGF0aCA9IGZ1bmN0aW9uIChcbiAgICAgICAgICBjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG5cbiAgICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICAgIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgICAvL3ZhciBjb3JuZXJSYWRpdXMgPSAkJC5tYXRoLmdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xuICAgIHZhciBjb3JuZXJSYWRpdXMgPSBNYXRoLm1pbihoYWxmV2lkdGgsIGhhbGZIZWlnaHQpO1xuXG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcblxuICAgIC8vIFN0YXJ0IGF0IHRvcCBtaWRkbGVcbiAgICBjb250ZXh0Lm1vdmVUbyh4LCB5LWhhbGZIZWlnaHQpO1xuICAgIC8vIEFyYyBmcm9tIG1pZGRsZSB0b3AgdG8gcmlnaHQgc2lkZVxuICAgIGNvbnRleHQuYXJjVG8oeCtoYWxmV2lkdGgsIHktaGFsZkhlaWdodCwgeCtoYWxmV2lkdGgsIHksIGNvcm5lclJhZGl1cyk7XG4gICAgLy8gQXJjIGZyb20gcmlnaHQgc2lkZSB0byBib3R0b21cbiAgICBjb250ZXh0LmFyY1RvKHgraGFsZldpZHRoLCB5K2hhbGZIZWlnaHQsIHgsIHkraGFsZkhlaWdodCwgY29ybmVyUmFkaXVzKTtcbiAgICAvLyBBcmMgZnJvbSBib3R0b20gdG8gbGVmdCBzaWRlXG4gICAgY29udGV4dC5hcmNUbyh4LWhhbGZXaWR0aCwgeStoYWxmSGVpZ2h0LCB4LWhhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzKTtcbiAgICAvLyBBcmMgZnJvbSBsZWZ0IHNpZGUgdG8gdG9wQm9yZGVyXG4gICAgY29udGV4dC5hcmNUbyh4LWhhbGZXaWR0aCwgeS1oYWxmSGVpZ2h0LCB4LCB5LWhhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyk7XG4gICAgLy8gSm9pbiBsaW5lXG4gICAgY29udGV4dC5saW5lVG8oeCwgeS1oYWxmSGVpZ2h0KTtcblxuICAgIGNvbnRleHQuY2xvc2VQYXRoKCk7XG5cbiAgfTtcblxuICAkJC5zYmduLmRyYXdTaW1wbGVDaGVtaWNhbCA9IGZ1bmN0aW9uIChcbiAgICAgICAgICBjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgJCQuc2Jnbi5kcmF3U2ltcGxlQ2hlbWljYWxQYXRoKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICB9O1xuXG4gIGZ1bmN0aW9uIHNpbXBsZUNoZW1pY2FsTGVmdENsb25lKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgd2lkdGgsIGhlaWdodCwgY2xvbmVNYXJrZXIsIG9wYWNpdHkpIHtcbiAgICBpZiAoY2xvbmVNYXJrZXIgIT0gbnVsbCkge1xuICAgICAgdmFyIG9sZEdsb2JhbEFscGhhID0gY29udGV4dC5nbG9iYWxBbHBoYTtcbiAgICAgIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSBvcGFjaXR5O1xuICAgICAgdmFyIG9sZFN0eWxlID0gY29udGV4dC5maWxsU3R5bGU7XG4gICAgICBjb250ZXh0LmZpbGxTdHlsZSA9ICQkLnNiZ24uY29sb3JzLmNsb25lO1xuXG4gICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuXG4gICAgICB2YXIgbWFya2VyQmVnaW5YID0gY2VudGVyWCAtIHdpZHRoLzIgKiBNYXRoLnNpbihNYXRoLlBJIC8gMyk7XG4gICAgICB2YXIgbWFya2VyQmVnaW5ZID0gY2VudGVyWSArIGhlaWdodC8yICogTWF0aC5jb3MoTWF0aC5QSSAvIDMpO1xuICAgICAgdmFyIG1hcmtlckVuZFggPSBjZW50ZXJYO1xuICAgICAgdmFyIG1hcmtlckVuZFkgPSBtYXJrZXJCZWdpblk7XG5cbiAgICAgIGNvbnRleHQubW92ZVRvKG1hcmtlckJlZ2luWCwgbWFya2VyQmVnaW5ZKTtcbiAgICAgIGNvbnRleHQubGluZVRvKG1hcmtlckVuZFgsIG1hcmtlckVuZFkpO1xuICAgICAgY29udGV4dC5hcmMoY2VudGVyWCwgY2VudGVyWSwgd2lkdGgvMiwgMyAqIE1hdGguUEkgLyA2LCA1ICogTWF0aC5QSSAvIDYpO1xuXG4gICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuXG4gICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gb2xkU3R5bGU7XG4gICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb2xkR2xvYmFsQWxwaGE7XG4gICAgfVxuICB9O1xuXG4gIGZ1bmN0aW9uIHNpbXBsZUNoZW1pY2FsUmlnaHRDbG9uZShjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNsb25lTWFya2VyLCBvcGFjaXR5KSB7XG4gICAgaWYgKGNsb25lTWFya2VyICE9IG51bGwpIHtcbiAgICAgIHZhciBvbGRHbG9iYWxBbHBoYSA9IGNvbnRleHQuZ2xvYmFsQWxwaGE7XG4gICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb3BhY2l0eTtcbiAgICAgIHZhciBvbGRTdHlsZSA9IGNvbnRleHQuZmlsbFN0eWxlO1xuICAgICAgY29udGV4dC5maWxsU3R5bGUgPSAkJC5zYmduLmNvbG9ycy5jbG9uZTtcblxuICAgICAgY29udGV4dC5iZWdpblBhdGgoKTtcblxuICAgICAgdmFyIG1hcmtlckJlZ2luWCA9IGNlbnRlclg7XG4gICAgICB2YXIgbWFya2VyQmVnaW5ZID0gY2VudGVyWSArIGhlaWdodC8yICogTWF0aC5jb3MoTWF0aC5QSSAvIDMpO1xuICAgICAgdmFyIG1hcmtlckVuZFggPSBjZW50ZXJYICsgd2lkdGgvMiAqIE1hdGguc2luKE1hdGguUEkgLyAzKTtcbiAgICAgIHZhciBtYXJrZXJFbmRZID0gbWFya2VyQmVnaW5ZO1xuXG4gICAgICBjb250ZXh0Lm1vdmVUbyhtYXJrZXJCZWdpblgsIG1hcmtlckJlZ2luWSk7XG4gICAgICBjb250ZXh0LmxpbmVUbyhtYXJrZXJFbmRYLCBtYXJrZXJFbmRZKTtcbiAgICAgIGNvbnRleHQuYXJjKGNlbnRlclgsIGNlbnRlclksIHdpZHRoLzIsIE1hdGguUEkgLyA2LCAzICogTWF0aC5QSSAvIDYpO1xuXG4gICAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuXG4gICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gb2xkU3R5bGU7XG4gICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb2xkR2xvYmFsQWxwaGE7XG4gICAgfVxuICB9O1xuXG4gICQkLnNiZ24uZHJhd0VsbGlwc2VQYXRoID0gZnVuY3Rpb24gKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICBjeUJhc2VOb2RlU2hhcGVzWydlbGxpcHNlJ10uZHJhd1BhdGgoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7XG5cbiAgfTtcblxuXG4gICQkLnNiZ24uZHJhd0JhcnJlbCA9IGZ1bmN0aW9uIChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgY3lCYXNlTm9kZVNoYXBlc1snYmFycmVsJ10uZHJhdyhjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgfTtcblxuICAkJC5zYmduLmRyYXdCb3R0b21Sb3VuZFJlY3RhbmdsZSA9IGZ1bmN0aW9uIChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgY3lCYXNlTm9kZVNoYXBlc1snYm90dG9tcm91bmRyZWN0YW5nbGUnXS5kcmF3KGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICB9O1xuXG4gIC8vIFRoZSBvbGQgZHJhdyBpbXBsZW1lbnRhdGlvbiBmb3IgbnVjbGVpYyBhY2lkIGZlYXR1cmVcbiAgLy8gbm93IG9ubHkgdXNlZCBmb3IgY2xvbmUgbWFya2VyIGRyYXdpbmcgb2YgbnVjbGVpYyBhY2lkIGZlYXR1cmVcbiAgLy8gYW5kIG1hY3JvbW9sZWN1bGUgc2hhcGVzIGJlY2F1c2UgJ2JvdHRvbXJvdW5kcmVjdGFuZ2xlJyBmdW5jdGlvblxuICAvLyBvZiBjeXRvc2NhcGUuanMgZGlkIG5vdCBmaXQgd2VsbCBmb3IgdGhpcyBwdXJwb3NlLlxuICAvLyBEaWQgbm90IGNoYW5nZSB0aGUgbmFtZSB5ZXQgZGlyZWN0bHkgYXMgZHJhd051Y0FjaWRGZWF0dXJlQ2xvbmUgZXRjLlxuICAvLyBiZWNhdXNlIGl0IGFjdHVhbGx5IGRyYXdzIGEgbnVjbGVpYyBhY2lkIGZlYXR1cmUgaW4gYSBkaWZmZXJlbnQgd2F5LlxuICAkJC5zYmduLmRyYXdOdWNBY2lkRmVhdHVyZTIgPSBmdW5jdGlvbiAoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMpIHtcbiAgICBjb3JuZXJSYWRpdXMgPSBjb3JuZXJSYWRpdXMgfHwgY3lNYXRoLmdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKHdpZHRoLCBoZWlnaHQpO1xuICAgIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gICAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuICAgIHZhciBsZWZ0ID0gY2VudGVyWCAtIGhhbGZXaWR0aCwgcmlnaHQgPSBjZW50ZXJYICsgaGFsZldpZHRoO1xuICAgIHZhciBib3R0b20gPSBjZW50ZXJZIC0gaGFsZkhlaWdodCwgdG9wID0gY2VudGVyWSArIGhhbGZIZWlnaHQ7XG4gICAgY29udGV4dC5iZWdpblBhdGgoKTtcblxuICAgIGNvbnRleHQubW92ZVRvKGxlZnQsIGJvdHRvbSk7XG4gICAgY29udGV4dC5saW5lVG8ocmlnaHQsIGJvdHRvbSk7XG4gICAgY29udGV4dC5saW5lVG8ocmlnaHQsIGNlbnRlclkpO1xuICAgIGNvbnRleHQuYXJjVG8ocmlnaHQsIHRvcCwgY2VudGVyWCwgdG9wLCBjb3JuZXJSYWRpdXMpO1xuICAgIGNvbnRleHQuYXJjVG8obGVmdCwgdG9wLCBsZWZ0LCBjZW50ZXJZLCBjb3JuZXJSYWRpdXMpO1xuICAgIGNvbnRleHQubGluZVRvKGxlZnQsIGJvdHRvbSk7XG5cbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICB9O1xuXG4gIC8qXG4gICAqIENvZGUgdGFrZW4gZnJvbSBodHRwczovL2pzcGVyZi5jb20vc3RyaW5nLXByb3RvdHlwZS1lbmRzd2l0aFxuICAgKiBEaXJlY3QgaW1wbGVtZW50YXRpb24gc2VlbXMgdG8gd29yayBiZXR0ZXIuXG4gICAqIFVzaW5nIHRoaXMgaW1wcm92ZXMgaXNNdWx0aW1lcigpIHBlcmZvcm1hbmNlLlxuICAgKiBNYWtlcyBpdCB0YWtlIDAuMSBvciAwLjIlIGxlc3MgdGltZSBmcm9tIHRoZSB3aG9sZVxuICAgKiBsb2FkaW5nIHByb2Nlc3MsIGRvd24gZnJvbSB+MC40JSBpbml0aWFsbHkuXG4gICAqL1xuICBmdW5jdGlvbiBlbmRzV2l0aChzdHIsIHBhdHRlcm4pIHtcbiAgICBmb3IgKHZhciBpID0gcGF0dGVybi5sZW5ndGgsIGwgPSBzdHIubGVuZ3RoOyBpLS07KSB7XG4gICAgICBpZiAoc3RyLmNoYXJBdCgtLWwpICE9IHBhdHRlcm4uY2hhckF0KGkpKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAkJC5zYmduLmlzTXVsdGltZXIgPSBmdW5jdGlvbiAobm9kZSkge1xuICAgIHZhciBzYmduQ2xhc3MgPSBub2RlLl9wcml2YXRlLmRhdGEuY2xhc3M7XG4gICAgaWYgKHNiZ25DbGFzcyAmJiBlbmRzV2l0aChzYmduQ2xhc3MsIFwibXVsdGltZXJcIikpXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH07XG5cbiAgJCQuc2Jnbi5pc0FjdGl2ZSA9IGZ1bmN0aW9uIChub2RlKSB7XG4gICAgdmFyIHNiZ25DbGFzcyA9IG5vZGUuX3ByaXZhdGUuZGF0YS5jbGFzcztcbiAgICBpZiAoc2JnbkNsYXNzICYmIHNiZ25DbGFzcy5zdGFydHNXaXRoKCBcImFjdGl2ZVwiKSlcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAkJC5zYmduLmlzSHlwb3RoZXRpY2FsID0gZnVuY3Rpb24gKG5vZGUpIHtcbiAgICB2YXIgc2JnbkNsYXNzID0gbm9kZS5fcHJpdmF0ZS5kYXRhLmNsYXNzO1xuICAgIGlmIChzYmduQ2xhc3MgJiYgc2JnbkNsYXNzLmluY2x1ZGVzKCBcImh5cG90aGV0aWNhbFwiKSlcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcblxuICAvL3RoaXMgZnVuY3Rpb24gaXMgY3JlYXRlZCB0byBoYXZlIHNhbWUgY29ybmVyIGxlbmd0aCB3aGVuXG4gIC8vY29tcGxleCdzIHdpZHRoIG9yIGhlaWdodCBpcyBjaGFuZ2VkXG4gICQkLnNiZ24uZ2VuZXJhdGVDb21wbGV4U2hhcGVQb2ludHMgPSBmdW5jdGlvbiAoY29ybmVyTGVuZ3RoLCB3aWR0aCwgaGVpZ2h0KSB7XG4gICAgLy9jcCBzdGFuZHMgZm9yIGNvcm5lciBwcm9wb3J0aW9uXG4gICAgdmFyIGNwWCA9IE1hdGgubWluKGNvcm5lckxlbmd0aCwgMC41ICogd2lkdGgpIC8gd2lkdGg7XG4gICAgdmFyIGNwWSA9IE1hdGgubWluKGNvcm5lckxlbmd0aCwgMC41ICogaGVpZ2h0KSAvIGhlaWdodDtcblxuICAgIHZhciBjb21wbGV4UG9pbnRzID0gWy0xICsgY3BYLCAtMSwgLTEsIC0xICsgY3BZLCAtMSwgMSAtIGNwWSwgLTEgKyBjcFgsXG4gICAgICAxLCAxIC0gY3BYLCAxLCAxLCAxIC0gY3BZLCAxLCAtMSArIGNwWSwgMSAtIGNwWCwgLTFdO1xuXG4gICAgcmV0dXJuIGNvbXBsZXhQb2ludHM7XG4gIH07XG5cbiAgJCQuc2Jnbi5nZW5lcmF0ZUdlbmVTaGFwZVBvaW50cyA9IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7XG5cbiAgICByZXR1cm4gWy0xLCAtMSwgICAxLCAtMSAsICAgMSwgMSwgICAtMSAsIDEgXTtcbiAgfTtcblxuXG4gICQkLnNiZ24uZ2VuZXJhdGVSTkFTaGFwZVBvaW50cyA9IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7XG5cbiAgICByZXR1cm4gWy0xLCAwLjgsICAgMC41LCAwLjggLCAgIDEsIC0wLjgsICAgLTAuNSAsIC0wLjggXTtcbiAgfTtcblxuICAkJC5zYmduLmdlbmVyYXRlUmVjZXB0b3JTaGFwZVBvaW50cyA9IGZ1bmN0aW9uICh3aWR0aCwgaGVpZ2h0KSB7XG5cbiAgICByZXR1cm4gWy0xLCAtMSwgICAwLCAtMC41LCAgIDEsIC0xLCAgIDEsIDAuNSwgICAwLCAxLCAgIC0xLCAgMC41IF07XG4gIH07XG5cbiAgJCQuc2Jnbi5nZW5lcmF0ZVBlcnR1cmJpbmdBZ2VudFBvaW50cyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBbLTEsIC0xLCAgIC0wLjUsIDAsICAtMSwgMSwgICAxLCAxLCAgIDAuNSwgMCwgMSwgLTFdO1xuICB9O1xuXG4gICQkLnNiZ24uZ2V0RGVmYXVsdE11bHRpbWVyUGFkZGluZyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiA1O1xuICB9O1xuXG4gICQkLnNiZ24uZ2V0RGVmYXVsdEFjdGl2ZVBhZGRpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gNTtcbiAgfTtcblxuICAvLyBkcmF3IGJhY2tncm91bmQgaW1hZ2Ugb2Ygbm9kZXNcbiAgJCQuc2Jnbi5kcmF3SW1hZ2UgPSBmdW5jdGlvbiggY29udGV4dCwgaW1nT2JqICkge1xuICAgIGlmKGltZ09iail7XG4gICAgICBjb250ZXh0LmNsaXAoKTtcbiAgICAgIGNvbnRleHQuZHJhd0ltYWdlKGltZ09iai5pbWcsIDAsIDAsIGltZ09iai5pbWdXLCBpbWdPYmouaW1nSCwgaW1nT2JqLngsIGltZ09iai55LCBpbWdPYmoudywgaW1nT2JqLmggKTtcbiAgICAgIGNvbnRleHQucmVzdG9yZSgpO1xuICAgIH1cbiAgfTtcblxuICBjeVN0eWxlUHJvcGVydGllcy50eXBlcy5ub2RlU2hhcGUuZW51bXMucHVzaChcbiAgICAnZW1wdHkgc2V0JywgJ251Y2xlaWMgYWNpZCBmZWF0dXJlJywgJ2NvbXBsZXgnLCAnbWFjcm9tb2xlY3VsZScsXG4gICAgJ3NpbXBsZSBjaGVtaWNhbCcsICdiaW9sb2dpY2FsIGFjdGl2aXR5JywgJ2NvbXBhcnRtZW50JywgJ2dlbmUnLCAnc2ltcGxlIG1vbGVjdWxlJywgJ3Vua25vd24gbW9sZWN1bGUnLCAnZHJ1ZycsIFxuICAgICd0cnVuY2F0ZWQgcHJvdGVpbicsICdpb24nLCAnaW9uIGNoYW5uZWwnLCAncm5hJywgJ3BoZW5vdHlwZSBzYm1sJywgJ3JlY2VwdG9yJywgJ2NvbXBsZXggc2JtbCcsICdwcm90ZWluJywgJ2RlZ3JhZGF0aW9uJ1xuICApO1xuXG4gICQkLnNiZ24ucmVnaXN0ZXJTYmduTm9kZVNoYXBlcyA9IGZ1bmN0aW9uICgpIHtcblxuICAgIGZ1bmN0aW9uIGdlbmVyYXRlRHJhd0ZjbiggeyBwbGFpbkRyYXdGY24sIGV4dHJhRHJhd0ZjbiwgY2FuQmVNdWx0aW1lciwgY2xvbmVNYXJrZXJGY24sIGNhbkJlQWN0aXZlLCBjYW5CZUh5cG90aGV0aWNhbCxcbiAgICAgIGNhbkhhdmVJbmZvQm94LCBtdWx0aW1lclBhZGRpbmcsIGFjdGl2ZVBhZGRpbmd9ICkge1xuXG4gICAgICByZXR1cm4gZnVuY3Rpb24oIGNvbnRleHQsIG5vZGUsIGltZ09iaiApIHtcbiAgICAgICAgdmFyIGJvcmRlcldpZHRoID0gcGFyc2VGbG9hdChub2RlLmNzcygnYm9yZGVyLXdpZHRoJykpO1xuICAgICAgICB2YXIgd2lkdGggPSBub2RlLm91dGVyV2lkdGgoKSAtIGJvcmRlcldpZHRoO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gbm9kZS5vdXRlckhlaWdodCgpIC0gYm9yZGVyV2lkdGg7XG4gICAgICAgIHZhciBjZW50ZXJYID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi54O1xuICAgICAgICB2YXIgY2VudGVyWSA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueTtcbiAgICAgICAgdmFyIGJnT3BhY2l0eSA9IG5vZGUuY3NzKCdiYWNrZ3JvdW5kLW9wYWNpdHknKTtcbiAgICAgICAgdmFyIGlzQ2xvbmVkID0gY2xvbmVNYXJrZXJGY24gIT0gbnVsbCAmJiBub2RlLl9wcml2YXRlLmRhdGEuY2xvbmVtYXJrZXI7XG5cbiAgICAgICAgLy9Jb24gY2hhbm5lbCBpcyBkcmFuIGRpZmZlcmVudGx5IHdoZW4gaXQgaXMgYWN0aXZlXG4gICAgICAgIGlmIChub2RlLl9wcml2YXRlLmRhdGEuY2xhc3Muc3RhcnRzV2l0aCgnYWN0aXZlIGlvbiBjaGFubmVsJykgfHwgIG5vZGUuX3ByaXZhdGUuZGF0YS5jbGFzcy5zdGFydHNXaXRoKCdhY3RpdmUgaHlwb3RoZXRpY2FsIGlvbiBjaGFubmVsJykgKVxuICAgICAgICB7XG4gICAgICAgICAgcGxhaW5EcmF3RmNuID0gJCQuc2Jnbi5kcmF3T3BlbklvbkNoYW5uZWw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobm9kZS5fcHJpdmF0ZS5kYXRhLmNsYXNzLnN0YXJ0c1dpdGgoJ2lvbiBjaGFubmVsJykgfHwgIG5vZGUuX3ByaXZhdGUuZGF0YS5jbGFzcy5zdGFydHNXaXRoKCdoeXBvdGhldGljYWwgaW9uIGNoYW5uZWwnKSApXG4gICAgICAgIHtcbiAgICAgICAgICBwbGFpbkRyYXdGY24gPSAkJC5zYmduLmRyYXdJb25DaGFubmVsO1xuICAgICAgICB9XG5cbiAgICBcbiAgICAgICAgLy9UaGlzIGlzIHdoZXJlIHRoZSBtdWx0aW1lciBpcyBkcmF3blxuICAgICAgIGlmICggY2FuQmVNdWx0aW1lciAmJiAkJC5zYmduLmlzTXVsdGltZXIoIG5vZGUgKSApIHtcblxuICAgICAgICAgIHBsYWluRHJhd0ZjbiggY29udGV4dCwgY2VudGVyWCArIG11bHRpbWVyUGFkZGluZyxcbiAgICAgICAgICAgIGNlbnRlclkgKyBtdWx0aW1lclBhZGRpbmcsIHdpZHRoLCBoZWlnaHQgKTtcbiAgICBcbiAgICAgICAgICAvL0lmIHRoZSBub2RlIGlzIGFsc28gaHlwb3RoZXRpY2FsXG4gICAgICAgICAgaWYgKGNhbkJlSHlwb3RoZXRpY2FsICYmICQkLnNiZ24uaXNIeXBvdGhldGljYWwoIG5vZGUgKSlcbiAgICAgICAgICB7XG4gICAgICAgICAgICAgLy8gJCQuc2Jnbi5kcmF3SW1hZ2UoIGNvbnRleHQsIGltZ09iaiApO1xuICAgICAgICAgICAgICBib3JkZXJTdHlsZSA9ICdkYXNoZWQnXG4gICAgICAgICAgICAgICQkLnNiZ24uZHJhd0JvcmRlciggeyBjb250ZXh0LCBub2RlLCBib3JkZXJTdHlsZSB9ICk7XG4gICAgICAgICAgICAgIC8vJCQuc2Jnbi5kcmF3SW1hZ2UoIGNvbnRleHQsIGltZ09iaiApO1xuICAgICAgICAgICAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuXG4gICAgICAgICAgfVxuICAgICAgICAgIGVsc2V7XG4gICAgICAgICAgICAkJC5zYmduLmRyYXdCb3JkZXIoIHsgY29udGV4dCwgbm9kZSB9ICk7XG5cbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIGV4dHJhRHJhd0ZjbiApIHtcbiAgICAgICAgICAgIGV4dHJhRHJhd0ZjbiggY29udGV4dCwgY2VudGVyWCArIG11bHRpbWVyUGFkZGluZyxcbiAgICAgICAgICAgICAgY2VudGVyWSArIG11bHRpbWVyUGFkZGluZywgd2lkdGgsIGhlaWdodCApO1xuXG5cbiAgICAgICAgICAgICQkLnNiZ24uZHJhd0JvcmRlciggeyBjb250ZXh0LCBub2RlIH0gKTtcbiAgICAgICAgICB9XG4gICAgICBcbiAgICAgICAgICBpZiAoIGlzQ2xvbmVkICkge1xuICAgICAgICAgICAgY2xvbmVNYXJrZXJGY24oY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgY2VudGVyWCArIG11bHRpbWVyUGFkZGluZywgY2VudGVyWSArIG11bHRpbWVyUGFkZGluZyxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGggLSBib3JkZXJXaWR0aCwgaGVpZ2h0IC0gYm9yZGVyV2lkdGgsIGlzQ2xvbmVkLCB0cnVlLCBiZ09wYWNpdHkpO1xuICAgICAgICAgIH1cblxuXG4gICAgICAgICAgLy9JZiB0aGUgbm9kZSBpcyBhbHNvIGFjdGl2ZVxuICAgICAgICAgIGlmKCBjYW5CZUFjdGl2ZSAmJiAkJC5zYmduLmlzQWN0aXZlKCBub2RlICkgJiYgIW5vZGUuX3ByaXZhdGUuZGF0YS5jbGFzcy5zdGFydHNXaXRoKCdhY3RpdmUgaW9uIGNoYW5uZWwnKSAmJiAhbm9kZS5fcHJpdmF0ZS5kYXRhLmNsYXNzLnN0YXJ0c1dpdGgoJ2FjdGl2ZSBoeXBvdGhldGljYWwgaW9uIGNoYW5uZWwnKSAgKXtcbiAgICAgICAgICAgICAgLy9hZGQgbXVsdGltZXIgc2hhcGVcbiAgICAgICAgICAgICAgcGxhaW5EcmF3RmNuKCBjb250ZXh0LCBjZW50ZXJYICsgbXVsdGltZXJQYWRkaW5nICxcbiAgICAgICAgICAgICAgY2VudGVyWSArIG11bHRpbWVyUGFkZGluZywgd2lkdGggLCBoZWlnaHQsIHRydWUsIGFjdGl2ZVBhZGRpbmcpO1xuXG4gICAgICAgICAgICAgIGJvcmRlclN0eWxlID0gJ2Rhc2hlZCdcbiAgICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbMywgNl0pO1xuICAgICAgICAgICAgICAkJC5zYmduLmRyYXdCb3JkZXIoIHsgY29udGV4dCwgbm9kZSwgYm9yZGVyU3R5bGUgfSApO1xuXG4gICAgICAgICAgICAgIGlmICggZXh0cmFEcmF3RmNuICkge1xuICAgICAgICAgICAgICAgICAgZXh0cmFEcmF3RmNuKCBjb250ZXh0LCBjZW50ZXJYICsgbXVsdGltZXJQYWRkaW5nLFxuICAgICAgICAgICAgICAgICAgICBjZW50ZXJZKyBtdWx0aW1lclBhZGRpbmcsIHdpZHRoICsgYWN0aXZlUGFkZGluZywgaGVpZ2h0ICsgYWN0aXZlUGFkZGluZyk7XG5cblxuICAgICAgICAgICAgICAkJC5zYmduLmRyYXdCb3JkZXIoIHsgY29udGV4dCwgbm9kZSB9ICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICB9XG4gICAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICAgLy9UaGlzIGlzIHdoZXJlIHRoZSBhY3RpdmUgaXMgZHJhd25cbiAgICAgICAgaWYgKCBjYW5CZUFjdGl2ZSAmJiAkJC5zYmduLmlzQWN0aXZlKCBub2RlICkgJiYgIW5vZGUuX3ByaXZhdGUuZGF0YS5jbGFzcy5zdGFydHNXaXRoKCdhY3RpdmUgaW9uIGNoYW5uZWwnKSAmJiAhbm9kZS5fcHJpdmF0ZS5kYXRhLmNsYXNzLnN0YXJ0c1dpdGgoJ2FjdGl2ZSBoeXBvdGhldGljYWwgaW9uIGNoYW5uZWwnKSApIHtcbiAgICAgICAgICAgICAgLy9hZGQgbXVsdGltZXIgc2hhcGVcbiAgICAgICAgICAgICAgcGxhaW5EcmF3RmNuKCBjb250ZXh0LCBjZW50ZXJYICxcbiAgICAgICAgICAgICAgY2VudGVyWSAsIHdpZHRoLCBoZWlnaHQsdHJ1ZSAsIGFjdGl2ZVBhZGRpbmcpO1xuICAgICAgXG4gICAgICAgICAgICAgIGJvcmRlclN0eWxlID0gJ2Rhc2hlZCdcbiAgICAgICAgICAgICAgY29udGV4dC5zZXRMaW5lRGFzaChbMywgNl0pO1xuICAgICAgICAgICAgICAkJC5zYmduLmRyYXdCb3JkZXIoIHsgY29udGV4dCwgbm9kZSwgYm9yZGVyU3R5bGUgfSApO1xuXG4gICAgICAgICAgICAgIGlmICggZXh0cmFEcmF3RmNuICkge1xuICAgICAgICAgICAgICAgICAgZXh0cmFEcmF3RmNuKCBjb250ZXh0LCBjZW50ZXJYLFxuICAgICAgICAgICAgICAgICAgICBjZW50ZXJZLCB3aWR0aCArIGFjdGl2ZVBhZGRpbmcsIGhlaWdodCArIGFjdGl2ZVBhZGRpbmcpO1xuXG5cbiAgICAgICAgICAgICAgJCQuc2Jnbi5kcmF3Qm9yZGVyKCB7IGNvbnRleHQsIG5vZGUgfSApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH1cblxuICAgICAgICAgIC8vVGhpcyBpcyB3aGVyZSB0aGUgYWN0aXZlIGlzIGRyYXduXG4gICAgICAgIGlmICggY2FuQmVIeXBvdGhldGljYWwgJiYgJCQuc2Jnbi5pc0h5cG90aGV0aWNhbCggbm9kZSApICkge1xuXG5cbiAgICAgICAgICAgIC8vYWRkIG11bHRpbWVyIHNoYXBlXG4gICAgICAgICAgICBwbGFpbkRyYXdGY24oIGNvbnRleHQsIGNlbnRlclggLFxuICAgICAgICAgICAgICBjZW50ZXJZICwgd2lkdGgsIGhlaWdodCk7XG4gICAgXG4gICAgICAgICAgICAgIGJvcmRlclN0eWxlID0gJ2Rhc2hlZCdcbiAgICAgICAgICAgICAgJCQuc2Jnbi5kcmF3Qm9yZGVyKCB7IGNvbnRleHQsIG5vZGUsIGJvcmRlclN0eWxlIH0gKTtcbiAgICAgICAgICAgICAvLyAkJC5zYmduLmRyYXdJbWFnZSggY29udGV4dCwgaW1nT2JqICk7XG4gICAgICAgICAgICAgIGNvbnRleHQuYmVnaW5QYXRoKCk7XG5cbiAgICAgICAgICAgIGlmICggZXh0cmFEcmF3RmNuICkge1xuICAgICAgICAgICAgICAgICAgZXh0cmFEcmF3RmNuKCBjb250ZXh0LCBjZW50ZXJYLFxuICAgICAgICAgICAgICAgICAgICBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0KTtcblxuXG4gICAgICAgICAgICAgICQkLnNiZ24uZHJhd0JvcmRlciggeyBjb250ZXh0LCBub2RlIH0gKTtcbiAgICAgICAgICAgIH1cbiAgICAgIFxuICAgICAgICB9XG5cbiAgICAgICBcbiAgICAgICAgaWYgKCAhKGNhbkJlSHlwb3RoZXRpY2FsICYmICQkLnNiZ24uaXNIeXBvdGhldGljYWwoIG5vZGUgKSkgKVxuICAgICAgICB7XG4gICAgICAgICAgcGxhaW5EcmF3RmNuKCBjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0ICk7XG4gICAgICAgICAgJCQuc2Jnbi5kcmF3SW1hZ2UoIGNvbnRleHQsIGltZ09iaiApO1xuXG4gICAgICAgIH1cbiAgICAgICBcbiAgICAgICAgJCQuc2Jnbi5kcmF3Qm9yZGVyKCB7IGNvbnRleHQsIG5vZGUgfSApO1xuICAgICAgICBcblxuICAgICAgICBpZiAoIGV4dHJhRHJhd0ZjbiApIHtcbiAgICAgICAgICAgIGV4dHJhRHJhd0ZjbiggY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCApO1xuXG4gICAgICAgICAgICAkJC5zYmduLmRyYXdCb3JkZXIoIHsgY29udGV4dCwgbm9kZSB9ICk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIGlzQ2xvbmVkICkge1xuICAgICAgICAgIGNsb25lTWFya2VyRmNuKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoIC0gYm9yZGVyV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodCAtIGJvcmRlcldpZHRoLCBpc0Nsb25lZCwgZmFsc2UsIGJnT3BhY2l0eSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIGNhbkhhdmVJbmZvQm94ICkge1xuICAgICAgICAgIHZhciBvbGRTdHlsZSA9IGNvbnRleHQuZmlsbFN0eWxlO1xuICAgICAgICAgICQkLnNiZ24uZm9yY2VPcGFjaXR5VG9PbmUobm9kZSwgY29udGV4dCk7XG4gICAgICAgICAgJCQuc2Jnbi5kcmF3U3RhdGVBbmRJbmZvcyhub2RlLCBjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZKTtcbiAgICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IG9sZFN0eWxlO1xuICAgICAgICB9XG4gICAgICB9O1xuICAgICAgXG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVJbnRlcnNlY3RMaW5lRmNuKCB7IHBsYWluSW50ZXJzZWN0TGluZUZjbiwgY2FuQmVNdWx0aW1lciwgY2xvbmVNYXJrZXJGY24sIGNhbkJlQWN0aXZlLCBjYW5CZUh5cG90aGV0aWNhbCxcbiAgICAgIGNhbkhhdmVJbmZvQm94LCBtdWx0aW1lclBhZGRpbmcsIGFjdGl2ZVBhZGRpbmcgfSApIHtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCBub2RlLCB4LCB5ICkge1xuICAgICAgICB2YXIgYm9yZGVyV2lkdGggPSBwYXJzZUZsb2F0KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSk7XG4gICAgICAgIHZhciBwYWRkaW5nID0gYm9yZGVyV2lkdGggLyAyO1xuICAgICAgICB2YXIgd2lkdGggPSBub2RlLm91dGVyV2lkdGgoKSAtIGJvcmRlcldpZHRoO1xuICAgICAgICB2YXIgaGVpZ2h0ID0gbm9kZS5vdXRlckhlaWdodCgpIC0gYm9yZGVyV2lkdGg7XG4gICAgICAgIHZhciBjZW50ZXJYID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi54O1xuICAgICAgICB2YXIgY2VudGVyWSA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueTtcblxuICAgICAgICB2YXIgaW50ZXJzZWN0aW9ucyA9IFtdO1xuXG4gICAgICAgIGlmICggY2FuSGF2ZUluZm9Cb3ggKSB7XG4gICAgICAgICAgdmFyIHN0YXRlQW5kSW5mb0ludGVyc2VjdExpbmVzID0gJCQuc2Jnbi5pbnRlcnNlY3RMaW5lU3RhdGVBbmRJbmZvQm94ZXMoXG4gICAgICAgICAgICAgICAgICBub2RlLCB4LCB5KTtcblxuICAgICAgICAgIGludGVyc2VjdGlvbnMgPSBpbnRlcnNlY3Rpb25zLmNvbmNhdCggc3RhdGVBbmRJbmZvSW50ZXJzZWN0TGluZXMgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBub2RlSW50ZXJzZWN0TGluZXMgPSBwbGFpbkludGVyc2VjdExpbmVGY24oY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsXG4gICAgICAgICAgICAgICAgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nKTtcblxuICAgICAgICBpbnRlcnNlY3Rpb25zID0gaW50ZXJzZWN0aW9ucy5jb25jYXQoIG5vZGVJbnRlcnNlY3RMaW5lcyApO1xuXG4gICAgICAgIGlmICggY2FuQmVNdWx0aW1lciAmJiAkJC5zYmduLmlzTXVsdGltZXIobm9kZSkgKSB7XG4gICAgICAgICAgdmFyIG11bHRpbWVySW50ZXJzZWN0aW9uTGluZXMgPSBwbGFpbkludGVyc2VjdExpbmVGY24oXG4gICAgICAgICAgICAgICAgICBjZW50ZXJYICsgbXVsdGltZXJQYWRkaW5nLCBjZW50ZXJZICsgbXVsdGltZXJQYWRkaW5nLCB3aWR0aCxcbiAgICAgICAgICAgICAgICAgIGhlaWdodCwgeCwgeSwgcGFkZGluZyk7XG5cbiAgICAgICAgICBpbnRlcnNlY3Rpb25zID0gaW50ZXJzZWN0aW9ucy5jb25jYXQoIG11bHRpbWVySW50ZXJzZWN0aW9uTGluZXMgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICggY2FuQmVBY3RpdmUgJiYgJCQuc2Jnbi5pc0FjdGl2ZShub2RlKSApIHtcbiAgICAgICAgICB2YXIgYWN0aXZlSW50ZXJzZWN0aW9uTGluZXMgPSBwbGFpbkludGVyc2VjdExpbmVGY24oXG4gICAgICAgICAgICAgICAgICBjZW50ZXJYICsgYWN0aXZlUGFkZGluZywgY2VudGVyWSArIGFjdGl2ZVBhZGRpbmcsIHdpZHRoLFxuICAgICAgICAgICAgICAgICAgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nKTtcblxuICAgICAgICAgIGludGVyc2VjdGlvbnMgPSBpbnRlcnNlY3Rpb25zLmNvbmNhdCggYWN0aXZlSW50ZXJzZWN0aW9uTGluZXMgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICggY2FuQmVIeXBvdGhldGljYWwgJiYgJCQuc2Jnbi5pc0h5cG90aGV0aWNhbChub2RlKSApIHtcbiAgICAgICAgICB2YXIgaHlwb3RoZXRpY2FsSW50ZXJzZWN0aW9uTGluZXMgPSBwbGFpbkludGVyc2VjdExpbmVGY24oXG4gICAgICAgICAgICAgICAgICBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCxcbiAgICAgICAgICAgICAgICAgIGhlaWdodCwgeCwgeSwgcGFkZGluZyk7XG5cbiAgICAgICAgICBpbnRlcnNlY3Rpb25zID0gaW50ZXJzZWN0aW9ucy5jb25jYXQoIGh5cG90aGV0aWNhbEludGVyc2VjdGlvbkxpbmVzICk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gJCQuc2Jnbi5jbG9zZXN0SW50ZXJzZWN0aW9uUG9pbnQoW3gsIHldLCBpbnRlcnNlY3Rpb25zKTtcbiAgICAgIH07XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2VuZXJhdGVDaGVja1BvaW50RmNuKCB7IHBsYWluQ2hlY2tQb2ludEZjbiwgY2FuQmVNdWx0aW1lciwgY2xvbmVNYXJrZXJGY24sIGNhbkJlQWN0aXZlLCBjYW5CZUh5cG90aGV0aWNhbCxcbiAgICAgIGNhbkhhdmVJbmZvQm94LCBtdWx0aW1lclBhZGRpbmcsIGFjdGl2ZVBhZGRpbmcgfSApIHtcblxuICAgICAgcmV0dXJuIGZ1bmN0aW9uKCB4LCB5LCBub2RlLCB0aHJlc2hvbGQgKSB7XG5cbiAgICAgICAgdGhyZXNob2xkID0gdGhyZXNob2xkIHx8IDA7XG4gICAgICAgIHZhciBib3JkZXJXaWR0aCA9IHBhcnNlRmxvYXQobm9kZS5jc3MoJ2JvcmRlci13aWR0aCcpKTtcbiAgICAgICAgdmFyIHdpZHRoID0gbm9kZS5vdXRlcldpZHRoKCkgLSBib3JkZXJXaWR0aCArIDIgKiB0aHJlc2hvbGQ7XG4gICAgICAgIHZhciBoZWlnaHQgPSBub2RlLm91dGVySGVpZ2h0KCkgLSBib3JkZXJXaWR0aCArIDIgKiB0aHJlc2hvbGQ7XG4gICAgICAgIHZhciBjZW50ZXJYID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi54O1xuICAgICAgICB2YXIgY2VudGVyWSA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueTtcbiAgICAgICAgdmFyIHBhZGRpbmcgPSBib3JkZXJXaWR0aCAvIDI7XG5cbiAgICAgICAgdmFyIG5vZGVDaGVjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBwbGFpbkNoZWNrUG9pbnRGY24oIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKTtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgc3RhdGVBbmRJbmZvQ2hlY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gY2FuSGF2ZUluZm9Cb3ggJiYgJCQuc2Jnbi5jaGVja1BvaW50U3RhdGVBbmRJbmZvQm94ZXMoeCwgeSwgbm9kZSwgdGhyZXNob2xkKTtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgbXVsdGltZXJDaGVjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBjYW5CZU11bHRpbWVyICYmICQkLnNiZ24uaXNNdWx0aW1lcihub2RlKVxuICAgICAgICAgICAgICAgICAgJiYgcGxhaW5DaGVja1BvaW50RmNuKCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyWCArIG11bHRpbWVyUGFkZGluZyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlclkgKyBtdWx0aW1lclBhZGRpbmcgKTtcbiAgICAgICAgfTtcblxuICAgICAgICB2YXIgYWN0aXZlQ2hlY2sgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICByZXR1cm4gY2FuQmVBY3RpdmUgJiYgJCQuc2Jnbi5pc0FjdGl2ZShub2RlKVxuICAgICAgICAgICAgICAgICAgJiYgcGxhaW5DaGVja1BvaW50RmNuKCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyWCArIGFjdGl2ZVBhZGRpbmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXJZICsgYWN0aXZlUGFkZGluZyApO1xuICAgICAgICB9O1xuXG4gICAgICAgIHZhciBoeXBvdGhldGljYWxDaGVjayA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgIHJldHVybiBjYW5CZUh5cG90aGV0aWNhbCAmJiAkJC5zYmduLmlzSHlwb3RoZXRpY2FsKG5vZGUpXG4gICAgICAgICAgICAgICAgICAmJiBwbGFpbkNoZWNrUG9pbnRGY24oIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZW50ZXJYLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyWSApO1xuICAgICAgICB9O1xuXG4gICAgICAgIHJldHVybiBub2RlQ2hlY2soKSB8fCBzdGF0ZUFuZEluZm9DaGVjaygpIHx8IG11bHRpbWVyQ2hlY2soKSB8fCBhY3RpdmVDaGVjaygpIHx8IGh5cG90aGV0aWNhbENoZWNrKCk7XG4gICAgICB9O1xuICAgIH1cblxuICAgIHZhciBzaGFwZU5hbWVzID0gWyBcInNpbXBsZSBjaGVtaWNhbFwiLCBcIm1hY3JvbW9sZWN1bGVcIiwgXCJjb21wbGV4XCIsXG4gICAgICBcIm51Y2xlaWMgYWNpZCBmZWF0dXJlXCIsIFwiZW1wdHkgc2V0XCIsIFwiYmlvbG9naWNhbCBhY3Rpdml0eVwiLFxuICAgICAgXCJjb21wYXJ0bWVudFwiLCBcIm9sZENvbXBhcnRtZW50XCIsIFwiZ2VuZVwiLCBcInNpbXBsZSBtb2xlY3VsZVwiLCAncmVjZXB0b3InLCAnY29tcGxleCBzYm1sJyxcbiAgICAgIFwidW5rbm93biBtb2xlY3VsZVwiLCBcImRydWdcIiwgXCJpb25cIiwgXCJ0cnVuY2F0ZWQgcHJvdGVpblwiLCBcImlvbiBjaGFubmVsXCIsIFwicm5hXCIsIFwicGhlbm90eXBlIHNibWxcIiwgXCJwcm90ZWluXCIsIFwiZGVncmFkYXRpb25cIlxuICAgIF07XG5cbiAgICBzaGFwZU5hbWVzLmZvckVhY2goIGZ1bmN0aW9uKCBzaGFwZU5hbWUgKSB7XG4gICAgICB2YXIgcGxhaW5EcmF3RmNuID0gJCQuc2Jnbi5wbGFpbkRyYXdbIHNoYXBlTmFtZSBdO1xuICAgICAgdmFyIHBsYWluSW50ZXJzZWN0TGluZUZjbiA9ICQkLnNiZ24ucGxhaW5JbnRlcnNlY3RMaW5lWyBzaGFwZU5hbWUgXTtcbiAgICAgIHZhciBwbGFpbkNoZWNrUG9pbnRGY24gPSAkJC5zYmduLnBsYWluQ2hlY2tQb2ludFsgc2hhcGVOYW1lIF07XG4gICAgICB2YXIgY2FuQmVNdWx0aW1lciA9ICQkLnNiZ24uY2FuQmVNdWx0aW1lclNoYXBlc1sgc2hhcGVOYW1lIF07XG4gICAgICB2YXIgY2FuQmVBY3RpdmUgPSAkJC5zYmduLmNhbkJlQWN0aXZlU2hhcGVzWyBzaGFwZU5hbWUgXTtcbiAgICAgIHZhciBjYW5CZUh5cG90aGV0aWNhbCA9ICQkLnNiZ24uY2FuQmVIeXBvdGhldGljYWxTaGFwZXNbIHNoYXBlTmFtZSBdO1xuICAgICAgdmFyIGNsb25lTWFya2VyRmNuID0gJCQuc2Jnbi5jbG9uZU1hcmtlclsgc2hhcGVOYW1lIF07XG4gICAgICB2YXIgY2FuSGF2ZUluZm9Cb3ggPSAkJC5zYmduLmNhbkhhdmVJbmZvQm94U2hhcGVzWyBzaGFwZU5hbWUgXTtcbiAgICAgIHZhciBtdWx0aW1lclBhZGRpbmcgPSAkJC5zYmduLmdldERlZmF1bHRNdWx0aW1lclBhZGRpbmcoKTtcbiAgICAgIHZhciBhY3RpdmVQYWRkaW5nID0gJCQuc2Jnbi5nZXREZWZhdWx0QWN0aXZlUGFkZGluZygpO1xuICAgICAgdmFyIGV4dHJhRHJhd0ZjbiA9ICQkLnNiZ24uZXh0cmFEcmF3WyBzaGFwZU5hbWUgXTtcblxuICAgICAgdmFyIGRyYXcgPSBnZW5lcmF0ZURyYXdGY24oIHsgcGxhaW5EcmF3RmNuLCBjYW5CZU11bHRpbWVyLCBjbG9uZU1hcmtlckZjbiwgY2FuQmVBY3RpdmUsIGNhbkJlSHlwb3RoZXRpY2FsLFxuICAgICAgICBjYW5IYXZlSW5mb0JveCwgbXVsdGltZXJQYWRkaW5nLCBhY3RpdmVQYWRkaW5nLCBleHRyYURyYXdGY25cbiAgICAgIH0gKTtcblxuICAgICAgdmFyIGludGVyc2VjdExpbmUgPSB0b3RhbGx5T3ZlcnJpZGVuTm9kZVNoYXBlc1sgc2hhcGVOYW1lIF0gP1xuICAgICAgICBnZW5lcmF0ZUludGVyc2VjdExpbmVGY24oIHsgcGxhaW5JbnRlcnNlY3RMaW5lRmNuLCBjYW5CZU11bHRpbWVyLCBjbG9uZU1hcmtlckZjbiwgY2FuQmVBY3RpdmUsIGNhbkJlSHlwb3RoZXRpY2FsLFxuICAgICAgICAgIGNhbkhhdmVJbmZvQm94LCBtdWx0aW1lclBhZGRpbmcsIGFjdGl2ZVBhZGRpbmdcbiAgICAgICAgfSApIDogcGxhaW5JbnRlcnNlY3RMaW5lRmNuO1xuXG4gICAgICB2YXIgY2hlY2tQb2ludCA9IHRvdGFsbHlPdmVycmlkZW5Ob2RlU2hhcGVzWyBzaGFwZU5hbWUgXSA/XG4gICAgICAgIGdlbmVyYXRlQ2hlY2tQb2ludEZjbiggeyBwbGFpbkNoZWNrUG9pbnRGY24sIGNhbkJlTXVsdGltZXIsIGNsb25lTWFya2VyRmNuLCBjYW5CZUFjdGl2ZSwgY2FuQmVIeXBvdGhldGljYWwsXG4gICAgICAgICAgY2FuSGF2ZUluZm9Cb3gsIG11bHRpbWVyUGFkZGluZywgYWN0aXZlUGFkZGluZ1xuICAgICAgICB9ICkgOiBwbGFpbkNoZWNrUG9pbnRGY247XG4gICAgICB2YXIgc2hhcGUgPSB7IGRyYXcsIGludGVyc2VjdExpbmUsIGNoZWNrUG9pbnQsIG11bHRpbWVyUGFkZGluZywgYWN0aXZlUGFkZGluZyB9O1xuXG4gICAgICBjeUJhc2VOb2RlU2hhcGVzWyBzaGFwZU5hbWUgXSA9IHNoYXBlO1xuICAgIH0gKTtcbiAgfTtcblxuICAkJC5zYmduLmRyYXdFbGxpcHNlID0gZnVuY3Rpb24gKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICAvLyQkLnNiZ24uZHJhd0VsbGlwc2VQYXRoKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICAgIC8vY29udGV4dC5maWxsKCk7XG4gICAgY3lCYXNlTm9kZVNoYXBlc1snZWxsaXBzZSddLmRyYXcoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCk7XG4gICAgY29udGV4dC5maWxsKCk7XG4gIH07XG5cbiAgICAkJC5zYmduLmRyYXdUcnVuY2F0ZWRQcm90ZWluID0gZnVuY3Rpb24gKGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQsIGlzQWN0aXZlLCBhY3RpdmVQYWRkaW5nICkge1xuICAgXG4gICAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgICB2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7XG4gICAgdmFyIGNvcm5lclJhZGl1cyA9IGN5TWF0aC5nZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyggd2lkdGgsIGhlaWdodCApO1xuICAgIHZhciBoYWxmUGFkZGluZyA9IGFjdGl2ZVBhZGRpbmc/IGFjdGl2ZVBhZGRpbmcgLzI6IDA7XG5cbiAgICBpZiggY29udGV4dC5iZWdpblBhdGggKXsgY29udGV4dC5iZWdpblBhdGgoKTsgfVxuXG4gICAgLy8gU3RhcnQgYXQgdG9wIG1pZGRsZVxuICAgIGNvbnRleHQubW92ZVRvKCB4LCB5IC0gaGFsZkhlaWdodCAtIGhhbGZQYWRkaW5nICk7XG4gICAgLy9EcmF3IGEgbGluZSB0aWxsIHJpZ2h0IHRvcFxuICAgIGNvbnRleHQubGluZVRvKCB4ICsgaGFsZldpZHRoICsgaGFsZlBhZGRpbmcsIHkgLSBoYWxmSGVpZ2h0IC0gaGFsZlBhZGRpbmcpO1xuICAgIC8vRHJhdyBhIGxpbmUgdG8gbWlkZGxlIHJpZ2h0XG4gICAgY29udGV4dC5saW5lVG8oIHggKyBoYWxmV2lkdGggKyBoYWxmUGFkZGluZywgeSArIDIqaGFsZkhlaWdodC8zICsgMipoYWxmUGFkZGluZyk7XG4gICAgLy9EcmF3IGEgbGluZSBpbm5lclxuICAgIGNvbnRleHQubGluZVRvKCB4ICsgMipoYWxmV2lkdGgvMyArIGhhbGZQYWRkaW5nLCB5ICsgaGFsZkhlaWdodC8zICsgMipoYWxmUGFkZGluZyApO1xuICAgIC8vRHJhdyBhIGxpbmUgdG8gYm90dG9tIHJpZ2h0XG4gICAgY29udGV4dC5saW5lVG8oIHggKyAyKmhhbGZXaWR0aC8zICsgaGFsZlBhZGRpbmcsIHkgKyBoYWxmSGVpZ2h0ICsgaGFsZlBhZGRpbmcgKTtcbiAgICAvL0RyYXcgYSBsaW5lIHRvIGJvdHRvbSBtaWRkbGVcbiAgICBjb250ZXh0LmxpbmVUbyggeCwgeSArIGhhbGZIZWlnaHQgKyBoYWxmUGFkZGluZyApO1xuICAgIC8vIEFyYyBmcm9tIGJvdHRvbSB0byBsZWZ0IHNpZGVcbiAgICBjb250ZXh0LmFyY1RvKCB4IC0gaGFsZldpZHRoIC1oYWxmUGFkZGluZywgeSArIGhhbGZIZWlnaHQrIGhhbGZQYWRkaW5nLCB4IC0gaGFsZldpZHRoIC1oYWxmUGFkZGluZyAsIHksIGNvcm5lclJhZGl1cyApO1xuICAgIC8vIEFyYyBmcm9tIGxlZnQgc2lkZSB0byB0b3BCb3JkZXJcbiAgICBjb250ZXh0LmFyY1RvKCB4IC0gaGFsZldpZHRoIC0gaGFsZlBhZGRpbmcsIHkgLSBoYWxmSGVpZ2h0IC0gaGFsZlBhZGRpbmcsIHgsIHkgLSBoYWxmSGVpZ2h0IC1oYWxmUGFkZGluZywgY29ybmVyUmFkaXVzICk7XG5cbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIGlmKCFpc0FjdGl2ZSlcbiAgICB7XG4gICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICB9XG4gIH07XG5cbiAgJCQuc2Jnbi5kcmF3SW9uQ2hhbm5lbCA9IGZ1bmN0aW9uIChjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCByYWRpdXMpIHtcblxuICAgIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gICAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuICAgIHZhciBjb3JuZXJSYWRpdXMgPSByYWRpdXMgfHwgY3lNYXRoLmdldFJvdW5kUmVjdGFuZ2xlUmFkaXVzKCB3aWR0aCwgaGVpZ2h0ICk7XG5cbiAgICBpZiggY29udGV4dC5iZWdpblBhdGggKXsgY29udGV4dC5iZWdpblBhdGgoKTsgfVxuXG4gICAgLy8gU3RhcnQgYXQgdG9wIG1pZGRsZVxuICAgIGNvbnRleHQubW92ZVRvKCB4ICsgaGFsZldpZHRoLzQsIHkgLSBoYWxmSGVpZ2h0ICk7XG4gICAgLy8gQXJjIGZyb20gbWlkZGxlIHRvcCB0byByaWdodCBzaWRlXG4gICAgY29udGV4dC5hcmNUbyggeCArIGhhbGZXaWR0aC8yLCB5IC0gaGFsZkhlaWdodCwgeCArIGhhbGZXaWR0aC8yLCB5LCBjb3JuZXJSYWRpdXMgKTtcbiAgICAvLyBBcmMgZnJvbSByaWdodCBzaWRlIHRvIGJvdHRvbVxuICAgIGNvbnRleHQuYXJjVG8oIHggKyBoYWxmV2lkdGgvMiwgeSArIGhhbGZIZWlnaHQsIHgvMiArIGhhbGZXaWR0aC80LCB5ICsgaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzICk7XG4gICAgLy8gQXJjIGZyb20gYm90dG9tIHRvIGxlZnQgc2lkZVxuICAgIGNvbnRleHQuYXJjVG8oIHggLSBoYWxmV2lkdGgsIHkgKyBoYWxmSGVpZ2h0LCB4IC0gaGFsZldpZHRoLCB5LCBjb3JuZXJSYWRpdXMgKTtcbiAgICAvLyBBcmMgZnJvbSBsZWZ0IHNpZGUgdG8gdG9wQm9yZGVyXG4gICAgY29udGV4dC5hcmNUbyggeCAtIGhhbGZXaWR0aCwgeSAtIGhhbGZIZWlnaHQsIHggKyBoYWxmV2lkdGgvNCwgeSAtIGhhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyApO1xuICAgIC8vIEpvaW4gbGluZVxuICAgIGNvbnRleHQubGluZVRvKCB4ICsgaGFsZldpZHRoLzQsIHkgLSBoYWxmSGVpZ2h0ICk7XG5cbiAgICAvLyBTdGFydCBhdCB0b3AgbWlkZGxlXG4gICAgY29udGV4dC5tb3ZlVG8oIHggKyAzICpoYWxmV2lkdGgvNCwgeSAtIGhhbGZIZWlnaHQgKTtcbiAgICAvLyBBcmMgZnJvbSBtaWRkbGUgdG9wIHRvIHJpZ2h0IHNpZGVcbiAgICBjb250ZXh0LmFyY1RvKCB4ICsgaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCwgeCArIGhhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzICk7XG4gICAgLy8gQXJjIGZyb20gcmlnaHQgc2lkZSB0byBib3R0b21cbiAgICBjb250ZXh0LmFyY1RvKCB4ICsgaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCwgeCArIDMgKiBoYWxmV2lkdGgvNCwgeSArIGhhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyApO1xuICAgIC8vIEFyYyBmcm9tIGJvdHRvbSB0byBsZWZ0IHNpZGVcbiAgICBjb250ZXh0LmFyY1RvKCB4ICsgaGFsZldpZHRoLzIsIHkgKyBoYWxmSGVpZ2h0LCB4ICsgIGhhbGZXaWR0aC8yLCB5LCBjb3JuZXJSYWRpdXMgKTtcbiAgICAvLyBBcmMgZnJvbSBsZWZ0IHNpZGUgdG8gdG9wQm9yZGVyXG4gICAgY29udGV4dC5hcmNUbyggeCArIGhhbGZXaWR0aC8yLCB5IC0gaGFsZkhlaWdodCwgeCArIDMgKiBoYWxmV2lkdGgvNCAsIHkgLSBoYWxmSGVpZ2h0LCBjb3JuZXJSYWRpdXMgKTtcbiAgICAvLyBKb2luIGxpbmVcbiAgICAvL2NvbnRleHQubGluZVRvKCB4LCB5IC0gaGFsZkhlaWdodCApO1xuXG5cbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICB9XG5cbiAgJCQuc2Jnbi5kcmF3T3BlbklvbkNoYW5uZWwgPSBmdW5jdGlvbiAoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcmFkaXVzKSB7XG4gICBcbiAgICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICAgIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcbiAgICB2YXIgY29ybmVyUmFkaXVzID0gcmFkaXVzIHx8IGN5TWF0aC5nZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyggd2lkdGgsIGhlaWdodCApO1xuXG4gICAgaWYoIGNvbnRleHQuYmVnaW5QYXRoICl7IGNvbnRleHQuYmVnaW5QYXRoKCk7IH1cblxuICAgIC8vIFN0YXJ0IGF0IHRvcCBtaWRkbGVcbiAgICBjb250ZXh0Lm1vdmVUbyggeCAtIGhhbGZXaWR0aC8yLCB5IC0gaGFsZkhlaWdodCApO1xuICAgIC8vIEFyYyBmcm9tIG1pZGRsZSB0b3AgdG8gcmlnaHQgc2lkZVxuICAgIGNvbnRleHQuYXJjVG8oIHggLCB5IC0gaGFsZkhlaWdodCwgeCwgeSwgY29ybmVyUmFkaXVzICk7XG4gICAgLy8gQXJjIGZyb20gcmlnaHQgc2lkZSB0byBib3R0b21cbiAgICBjb250ZXh0LmFyY1RvKCB4LCB5ICsgaGFsZkhlaWdodCwgeC0gaGFsZldpZHRoLzIsIHkgKyBoYWxmSGVpZ2h0LCBjb3JuZXJSYWRpdXMgKTtcbiAgICAvLyBBcmMgZnJvbSBib3R0b20gdG8gbGVmdCBzaWRlXG4gICAgY29udGV4dC5hcmNUbyggeCAtIGhhbGZXaWR0aCwgeSArIGhhbGZIZWlnaHQsIHggLSBoYWxmV2lkdGgsIHksIGNvcm5lclJhZGl1cyApO1xuICAgIC8vIEFyYyBmcm9tIGxlZnQgc2lkZSB0byB0b3BCb3JkZXJcbiAgICBjb250ZXh0LmFyY1RvKCB4IC0gaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCwgeCArIGhhbGZXaWR0aC8yLCB5IC0gaGFsZkhlaWdodCwgY29ybmVyUmFkaXVzICk7XG4gICAgLy8gSm9pbiBsaW5lXG4gICAgY29udGV4dC5saW5lVG8oIHgtaGFsZldpZHRoLzIsIHkgLSBoYWxmSGVpZ2h0ICk7XG5cbiAgICAvLyBTdGFydCBhdCB0b3AgbWlkZGxlXG4gICAgY29udGV4dC5tb3ZlVG8oIHggKyAzICpoYWxmV2lkdGgvNCwgeSAtIGhhbGZIZWlnaHQgKTtcbiAgICAvLyBBcmMgZnJvbSBtaWRkbGUgdG9wIHRvIHJpZ2h0IHNpZGVcbiAgICBjb250ZXh0LmFyY1RvKCB4ICsgaGFsZldpZHRoLCB5IC0gaGFsZkhlaWdodCwgeCArIGhhbGZXaWR0aCwgeSwgY29ybmVyUmFkaXVzICk7XG4gICAgLy8gQXJjIGZyb20gcmlnaHQgc2lkZSB0byBib3R0b21cbiAgICBjb250ZXh0LmFyY1RvKCB4ICsgaGFsZldpZHRoLCB5ICsgaGFsZkhlaWdodCwgeCArIDMgKiBoYWxmV2lkdGgvNCwgeSArIGhhbGZIZWlnaHQsIGNvcm5lclJhZGl1cyApO1xuICAgIC8vIEFyYyBmcm9tIGJvdHRvbSB0byBsZWZ0IHNpZGVcbiAgICBjb250ZXh0LmFyY1RvKCB4ICsgaGFsZldpZHRoLzIsIHkgKyBoYWxmSGVpZ2h0LCB4ICsgIGhhbGZXaWR0aC8yLCB5LCBjb3JuZXJSYWRpdXMgKTtcbiAgICAvLyBBcmMgZnJvbSBsZWZ0IHNpZGUgdG8gdG9wQm9yZGVyXG4gICAgY29udGV4dC5hcmNUbyggeCArIGhhbGZXaWR0aC8yLCB5IC0gaGFsZkhlaWdodCwgeCArIDMgKiBoYWxmV2lkdGgvNCAsIHkgLSBoYWxmSGVpZ2h0LCBjb3JuZXJSYWRpdXMgKTtcbiAgICAvLyBKb2luIGxpbmVcbiAgICAvL2NvbnRleHQubGluZVRvKCB4LCB5IC0gaGFsZkhlaWdodCApO1xuXG5cbiAgICBjb250ZXh0LmNsb3NlUGF0aCgpO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuICB9O1xuXG4gICQkLnNiZ24uZHJhd0NvbXBsZXggPSBmdW5jdGlvbiggY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgaXNBY3RpdmUsIGNvcm5lckxlbmd0aCApIHtcbiAgICBjb3JuZXJMZW5ndGggPSBjb3JuZXJMZW5ndGggfHwgJCQuc2Jnbi5nZXREZWZhdWx0Q29tcGxleENvcm5lckxlbmd0aCgpO1xuICAgIHZhciBwb2ludHMgPSAkJC5zYmduLmdlbmVyYXRlQ29tcGxleFNoYXBlUG9pbnRzKGNvcm5lckxlbmd0aCwgd2lkdGgsIGhlaWdodCk7XG5cbiAgICBkcmF3UG9seWdvblBhdGgoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcG9pbnRzKTtcblxuICAgIGlmKCFpc0FjdGl2ZSlcbiAgICB7XG4gICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICB9XG4gIH07XG5cbiAgJCQuc2Jnbi5kcmF3R2VuZSA9IGZ1bmN0aW9uKCBjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBpc0FjdGl2ZSApIHtcbiAgICBjeUJhc2VOb2RlU2hhcGVzWydyZWN0YW5nbGUnXS5kcmF3KGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICAgIGlmICghaXNBY3RpdmUpXG4gICAge1xuICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgfVxuICB9O1xuXG4gICQkLnNiZ24uZHJhd1JOQSA9IGZ1bmN0aW9uKCBjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xuICAgIHZhciBwb2ludHMgPSAkJC5zYmduLmdlbmVyYXRlUk5BU2hhcGVQb2ludHMod2lkdGgsIGhlaWdodCk7XG5cbiAgICBkcmF3UG9seWdvblBhdGgoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgcG9pbnRzKTtcblxuICAgIGNvbnRleHQuZmlsbCgpO1xuICB9O1xuXG4gICQkLnNiZ24uZHJhd1BoZW5vdHlwZSA9IGZ1bmN0aW9uKCBjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xuICAgIGN5QmFzZU5vZGVTaGFwZXNbJ2hleGFnb24nXS5kcmF3KGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQpO1xuICAgIGNvbnRleHQuZmlsbCgpO1xuXG4gIH07XG4gICQkLnNiZ24uZHJhd1JlY2VwdG9yPSBmdW5jdGlvbiggY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCwgaXNBY3RpdmUsIGFjdGl2ZVBhZGRpbmcgKSB7XG4gICAgIGRyYXdSZWNlcHRvclBhdGgoY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCxhY3RpdmVQYWRkaW5nKVxuICAgIGlmKCFpc0FjdGl2ZSlcbiAgICB7XG4gICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICB9XG5cbiAgfTtcblxuICAkJC5zYmduLmRyYXdDcm9zc0xpbmUgPSBmdW5jdGlvbiggY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcbiAgICB2YXIgcG9pbnRzID0gY3lNYXRoLmdlbmVyYXRlVW5pdE5nb25Qb2ludHMoNCwgMCk7XG5cbiAgICBjb250ZXh0LmJlZ2luUGF0aCgpO1xuICAgIHZhciBzY2FsZVggPSB3aWR0aCAqIE1hdGguc3FydCgyKSAvIDIsIHNjYWxlWSA9ICBoZWlnaHQgKiBNYXRoLnNxcnQoMikgLyAyO1xuXG4gICAgY29udGV4dC5tb3ZlVG8oeCArIHNjYWxlWCAqIHBvaW50c1syXSwgeSArIHNjYWxlWSAqIHBvaW50c1szXSk7XG4gICAgY29udGV4dC5saW5lVG8oeCArIHNjYWxlWCAqIHBvaW50c1s2XSwgeSArIHNjYWxlWSAqIHBvaW50c1s3XSk7XG4gICAgY29udGV4dC5jbG9zZVBhdGgoKTtcbiAgfTtcblxuICAkJC5zYmduLmRyYXdCaW9sb2dpY2FsQWN0aXZpdHkgPSBmdW5jdGlvbiggY29udGV4dCwgeCwgeSwgd2lkdGgsIGhlaWdodCApIHtcbiAgICB2YXIgcG9pbnRzID0gJCQuc2Jnbi5nZW5lcmF0ZUJpb2xvZ2ljYWxBY3Rpdml0eVBvaW50cygpO1xuICAgIGRyYXdQb2x5Z29uUGF0aChjb250ZXh0LFxuICAgICAgICAgICAgeCwgeSwgd2lkdGgsIGhlaWdodCwgcG9pbnRzKTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgfTtcblxuICAkJC5zYmduLmRyYXdSb3VuZFJlY3RhbmdsZSA9IGZ1bmN0aW9uKCBjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBpc0FjdGl2ZSApIHtcbiAgICBkcmF3Um91bmRSZWN0YW5nbGVQYXRoKCBjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICk7XG4gICAgaWYoIWlzQWN0aXZlKVxuICAgIHtcbiAgICAgIGNvbnRleHQuZmlsbCgpO1xuICAgIH1cbiAgXG4gIH07XG5cbiAgJCQuc2Jnbi5kcmF3UHJvdGVpbiA9IGZ1bmN0aW9uKCBjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBpc0FjdGl2ZSwgYWN0aXZlUGFkZGluZyApIHtcbiAgICBsZXQgYWN0aXZlUGFkZGluZzEgPSBhY3RpdmVQYWRkaW5nIHx8IDA7XG4gICAgZHJhd1Byb3RlaW5QYXRoKCBjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0LCBhY3RpdmVQYWRkaW5nMSApO1xuICAgIGlmKCFpc0FjdGl2ZSlcbiAgICB7XG4gICAgICBjb250ZXh0LmZpbGwoKTtcbiAgICB9XG4gIFxuICB9O1xuICAkJC5zYmduLmRyYXdSb3VuZGVkRHJ1ZyA9IGZ1bmN0aW9uKCBjb250ZXh0LCB4LCB5LCB3aWR0aCwgaGVpZ2h0ICkge1xuICAgIGRyYXdSb3VuZGVkRHJ1Z1BhdGgoIGNvbnRleHQsIHgsIHksIHdpZHRoLCBoZWlnaHQgKTtcbiAgICBjb250ZXh0LmZpbGwoKTtcbiAgXG4gIH07XG5cbiAgJCQuc2Jnbi5nZW5lcmF0ZU51Y2xlaWNBY2lkUG9pbnRzID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIGN5TWF0aC5nZW5lcmF0ZVVuaXROZ29uUG9pbnRzRml0VG9TcXVhcmUoNCwgMCk7XG4gIH07XG5cbiAgJCQuc2Jnbi5nZW5lcmF0ZUJpb2xvZ2ljYWxBY3Rpdml0eVBvaW50cyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBjeU1hdGguZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDQsIDApO1xuICB9O1xuXG4gICQkLnNiZ24uZ2VuZXJhdGVDb21wYXJ0bWVudFBvaW50cyA9IGZ1bmN0aW9uKCkge1xuICAgIHJldHVybiBtYXRoLmdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSg0LCAwKTtcbiAgfTtcblxuICAkJC5zYmduLnBsYWluRHJhdyA9IHtcbiAgICBcInNpbXBsZSBjaGVtaWNhbFwiOiAkJC5zYmduLmRyYXdTaW1wbGVDaGVtaWNhbCxcbiAgICBcIm1hY3JvbW9sZWN1bGVcIjogJCQuc2Jnbi5kcmF3Um91bmRSZWN0YW5nbGUsXG4gICAgXCJjb21wbGV4XCI6ICQkLnNiZ24uZHJhd0NvbXBsZXgsXG4gICAgXCJudWNsZWljIGFjaWQgZmVhdHVyZVwiOiAkJC5zYmduLmRyYXdCb3R0b21Sb3VuZFJlY3RhbmdsZSxcbiAgICBcImVtcHR5IHNldFwiOiAkJC5zYmduLmRyYXdFbGxpcHNlLFxuICAgIFwiYmlvbG9naWNhbCBhY3Rpdml0eVwiOiAkJC5zYmduLmRyYXdCaW9sb2dpY2FsQWN0aXZpdHksXG4gICAgXCJjb21wYXJ0bWVudFwiOiAkJC5zYmduLmRyYXdCYXJyZWwsXG4gICAgXCJvbGRDb21wYXJ0bWVudFwiOiAkJC5zYmduLmRyYXdSb3VuZFJlY3RhbmdsZSxcbiAgICBcImdlbmVcIjogICQkLnNiZ24uZHJhd0dlbmUsXG4gICAgXCJybmFcIjogJCQuc2Jnbi5kcmF3Uk5BLFxuICAgIFwic2ltcGxlIG1vbGVjdWxlXCI6ICQkLnNiZ24uZHJhd0VsbGlwc2UsXG4gICAgXCJ1bmtub3duIG1vbGVjdWxlXCI6ICQkLnNiZ24uZHJhd0VsbGlwc2UsXG4gICAgXCJkcnVnXCI6ICQkLnNiZ24uZHJhd1JvdW5kZWREcnVnLFxuICAgIFwiaW9uXCI6ICQkLnNiZ24uZHJhd0VsbGlwc2UsXG4gICAgXCJ0cnVuY2F0ZWQgcHJvdGVpblwiOiAkJC5zYmduLmRyYXdUcnVuY2F0ZWRQcm90ZWluLFxuICAgIFwiaW9uIGNoYW5uZWxcIiA6ICQkLnNiZ24uZHJhd0lvbkNoYW5uZWwsXG4gICAgXCJwaGVub3R5cGUgc2JtbFwiOiAkJC5zYmduLmRyYXdQaGVub3R5cGUsXG4gICAgXCJyZWNlcHRvclwiOiAkJC5zYmduLmRyYXdSZWNlcHRvcixcbiAgICBcImNvbXBsZXggc2JtbFwiOiAkJC5zYmduLmRyYXdDb21wbGV4LFxuICAgIFwicHJvdGVpblwiOiAkJC5zYmduLmRyYXdQcm90ZWluLFxuICAgIFwiZGVncmFkYXRpb25cIjogJCQuc2Jnbi5kcmF3RWxsaXBzZSxcbiAgfTtcblxuICAvLyBUbyBkZWZpbmUgYW4gZXh0cmEgZHJhd2luZyBmb3IgdGhlIG5vZGUgdGhhdCBpcyByZW5kZXJlZCBhdCB0aGUgdmVyeSBlbmQsXG4gIC8vIGV2ZW4gYWZ0ZXIgdGhlIG5vZGUgYmFja2dyb3VuZCBpbWFnZSBpcyBkcmF3bi5cbiAgLy8gRS5nLiBjcm9zcyBsaW5lcyBvZiBcImVtcHR5IHNldFwiIG5vZGVzLlxuICAkJC5zYmduLmV4dHJhRHJhdyA9IHtcbiAgICBcImVtcHR5IHNldFwiOiAkJC5zYmduLmRyYXdDcm9zc0xpbmUsXG4gICAgXCJkZWdyYWRhdGlvblwiOiAkJC5zYmduLmRyYXdDcm9zc0xpbmVcbiAgfTtcblxuICAkJC5zYmduLnBsYWluSW50ZXJzZWN0TGluZSA9IHtcbiAgICBcInNpbXBsZSBjaGVtaWNhbFwiOiBmdW5jdGlvbiggY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZyApIHtcbiAgICAgIHJldHVybiBjeUJhc2VOb2RlU2hhcGVzW1wiZWxsaXBzZVwiXS5pbnRlcnNlY3RMaW5lKCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nICk7XG4gICAgfSxcbiAgICBcIm1hY3JvbW9sZWN1bGVcIjogZnVuY3Rpb24oIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKSB7XG4gICAgICByZXR1cm4gJCQuc2Jnbi5yb3VuZFJlY3RhbmdsZUludGVyc2VjdExpbmUoIHgsIHksIGNlbnRlclgsIGNlbnRlclksIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgIHdpZHRoLCBoZWlnaHQsXG4gICAgICAgIGN5TWF0aC5nZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyh3aWR0aCwgaGVpZ2h0KSwgcGFkZGluZ1xuICAgICAgKTtcbiAgICB9LFxuICAgIFwiY29tcGxleFwiOiBmdW5jdGlvbiggY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZyApIHtcbiAgICAgIHZhciBwb2ludHMgPSAkJC5zYmduLmdlbmVyYXRlQ29tcGxleFNoYXBlUG9pbnRzKCAkJC5zYmduLmdldERlZmF1bHRDb21wbGV4Q29ybmVyTGVuZ3RoKCksIHdpZHRoLCBoZWlnaHQgKTtcbiAgICAgIHJldHVybiBjeU1hdGgucG9seWdvbkludGVyc2VjdExpbmUoXG4gICAgICAgIHgsIHksIHBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGggLyAyLCBoZWlnaHQgLyAyLCBwYWRkaW5nXG4gICAgICApO1xuICAgIH0sXG4gICAgXCJudWNsZWljIGFjaWQgZmVhdHVyZVwiOiBmdW5jdGlvbiggY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZyApIHtcbiAgICAgIHJldHVybiBjeUJhc2VOb2RlU2hhcGVzW1wiYm90dG9tcm91bmRyZWN0YW5nbGVcIl0uaW50ZXJzZWN0TGluZSggY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZyApO1xuICAgIH0sXG4gICAgXCJlbXB0eSBzZXRcIjogZnVuY3Rpb24oIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKSB7XG4gICAgICByZXR1cm4gY3lCYXNlTm9kZVNoYXBlc1tcImVsbGlwc2VcIl0uaW50ZXJzZWN0TGluZSggY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZyApO1xuICAgIH0sXG4gICAgXCJkZWdyYWRhdGlvblwiOiBmdW5jdGlvbiggY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZyApIHtcbiAgICAgIHJldHVybiBjeUJhc2VOb2RlU2hhcGVzW1wiZWxsaXBzZVwiXS5pbnRlcnNlY3RMaW5lKCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nICk7XG4gICAgfSxcbiAgICBcImJpb2xvZ2ljYWwgYWN0aXZpdHlcIjogZnVuY3Rpb24oIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKSB7XG4gICAgICB2YXIgcG9pbnRzID0gJCQuc2Jnbi5nZW5lcmF0ZUJpb2xvZ2ljYWxBY3Rpdml0eVBvaW50cygpO1xuICAgICAgcmV0dXJuIGN5TWF0aC5wb2x5Z29uSW50ZXJzZWN0TGluZShcbiAgICAgICAgeCwgeSwgcG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCAvIDIsIGhlaWdodCAvIDIsIHBhZGRpbmdcbiAgICAgICk7XG4gICAgfSxcbiAgICBcImNvbXBhcnRtZW50XCI6IGZ1bmN0aW9uKCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nICkge1xuICAgICAgcmV0dXJuIGN5QmFzZU5vZGVTaGFwZXNbXCJiYXJyZWxcIl0uaW50ZXJzZWN0TGluZSggY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZyApO1xuICAgIH0sXG4gICAgXCJvbGRDb21wYXJ0bWVudFwiOiBmdW5jdGlvbiggY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZyApIHtcbiAgICAgIHJldHVybiBjeU1hdGgucm91bmRSZWN0YW5nbGVJbnRlcnNlY3RMaW5lKFxuICAgICAgICB4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nXG4gICAgICApO1xuICAgIH0sXG4gICAgXCJwcm90ZWluXCI6IGZ1bmN0aW9uKCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nICkge1xuICAgICAgcmV0dXJuIGN5TWF0aC5yb3VuZFJlY3RhbmdsZUludGVyc2VjdExpbmUoXG4gICAgICAgIHgsIHksIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHBhZGRpbmdcbiAgICAgICk7XG4gICAgfSxcbiAgICBcImdlbmVcIjogZnVuY3Rpb24oIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKSB7XG4gICAgICByZXR1cm4gY3lCYXNlTm9kZVNoYXBlc1tcInJlY3RhbmdsZVwiXS5pbnRlcnNlY3RMaW5lKCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nICk7XG4gICAgfSxcbiAgICBcInJuYVwiOiBmdW5jdGlvbiggY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZyApIHtcbiAgICAgIHZhciBwb2ludHMgPSAkJC5zYmduLmdlbmVyYXRlUk5BU2hhcGVQb2ludHMoICB3aWR0aCwgaGVpZ2h0ICk7XG4gICAgICByZXR1cm4gY3lNYXRoLnBvbHlnb25JbnRlcnNlY3RMaW5lKFxuICAgICAgICB4LCB5LCBwb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgcGFkZGluZ1xuICAgICAgKTtcbiAgICB9LFxuICAgIFwicmVjZXB0b3JcIjogZnVuY3Rpb24oIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKSB7XG4gICAgICB2YXIgcG9pbnRzID0gJCQuc2Jnbi5nZW5lcmF0ZVJlY2VwdG9yU2hhcGVQb2ludHMoICB3aWR0aCwgaGVpZ2h0ICk7XG4gICAgICByZXR1cm4gY3lNYXRoLnBvbHlnb25JbnRlcnNlY3RMaW5lKFxuICAgICAgICB4LCB5LCBwb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoIC8gMiwgaGVpZ2h0IC8gMiwgcGFkZGluZ1xuICAgICAgKTtcbiAgICB9LFxuICAgIFwiaW9uIGNoYW5uZWxcIjogZnVuY3Rpb24oIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKSB7XG4gICAgICByZXR1cm4gY3lNYXRoLnJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZShcbiAgICAgICAgeCwgeSwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgcGFkZGluZ1xuICAgICAgKTtcbiAgICB9LFxuICAgIFwidHJ1bmNhdGVkIHByb3RlaW5cIjogZnVuY3Rpb24oIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKSB7XG4gICAgICByZXR1cm4gY3lNYXRoLnJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZShcbiAgICAgICAgeCwgeSwgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgcGFkZGluZ1xuICAgICAgKTtcbiAgICB9LFxuICAgIFwiaW9uXCI6IGZ1bmN0aW9uKCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nICkge1xuICAgICAgcmV0dXJuIGN5QmFzZU5vZGVTaGFwZXNbXCJlbGxpcHNlXCJdLmludGVyc2VjdExpbmUoIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKTtcblxuICAgIH0sXG4gICAgXCJzaW1wbGUgbW9sZWN1bGVcIjogZnVuY3Rpb24oIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKSB7XG4gICAgICByZXR1cm4gY3lCYXNlTm9kZVNoYXBlc1tcImVsbGlwc2VcIl0uaW50ZXJzZWN0TGluZSggY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZyApO1xuXG4gICAgfSxcbiAgICBcInVua25vd24gbW9sZWN1bGVcIjogZnVuY3Rpb24oIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKSB7XG4gICAgcmV0dXJuIGN5QmFzZU5vZGVTaGFwZXNbXCJlbGxpcHNlXCJdLmludGVyc2VjdExpbmUoIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKTtcblxuICAgIH0sXG4gICAgXCJkcnVnXCI6IGZ1bmN0aW9uKCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCB4LCB5LCBwYWRkaW5nICkge1xuICAgICAgcmV0dXJuIGN5QmFzZU5vZGVTaGFwZXNbXCJlbGxpcHNlXCJdLmludGVyc2VjdExpbmUoIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKTtcbiAgICB9LFxuICAgIFwicGhlbm90eXBlIHNibWxcIjogZnVuY3Rpb24oIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHgsIHksIHBhZGRpbmcgKSB7XG4gICAgICByZXR1cm4gY3lCYXNlTm9kZVNoYXBlc1tcImVsbGlwc2VcIl0uaW50ZXJzZWN0TGluZSggY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZyApO1xuXG4gICAgfSxcbiAgICBcImNvbXBsZXggc2JtbFwiOiBmdW5jdGlvbiggY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCwgeCwgeSwgcGFkZGluZyApIHtcbiAgICAgIHZhciBwb2ludHMgPSAkJC5zYmduLmdlbmVyYXRlQ29tcGxleFNoYXBlUG9pbnRzKCAkJC5zYmduLmdldERlZmF1bHRDb21wbGV4Q29ybmVyTGVuZ3RoKCksIHdpZHRoLCBoZWlnaHQgKTtcbiAgICAgIHJldHVybiBjeU1hdGgucG9seWdvbkludGVyc2VjdExpbmUoXG4gICAgICAgIHgsIHksIHBvaW50cywgY2VudGVyWCwgY2VudGVyWSwgd2lkdGggLyAyLCBoZWlnaHQgLyAyLCBwYWRkaW5nXG4gICAgICApO1xuICAgIH0sXG4gIH07XG5cbiAgJCQuc2Jnbi5wbGFpbkNoZWNrUG9pbnQgPSB7XG4gICAgXCJzaW1wbGUgY2hlbWljYWxcIjogZnVuY3Rpb24oIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKSB7XG5cbiAgICAgIHZhciBwb2ludHMgPSBjeU1hdGguZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKCA0LCAwICk7XG4gICAgICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICAgICAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuICAgIC8vdmFyIGNvcm5lclJhZGl1cyA9ICQkLm1hdGguZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMod2lkdGgsIGhlaWdodCk7XG4gICAgICB2YXIgY29ybmVyUmFkaXVzID0gTWF0aC5taW4oaGFsZldpZHRoLCBoYWxmSGVpZ2h0KTtcbiAgICAgIC8vdmFyIGNvcm5lclJhZGl1cyA9IG1hdGguZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMoIHdpZHRoLCBoZWlnaHQgKTtcbiAgICAgIHZhciBkaWFtID0gY29ybmVyUmFkaXVzICogMjtcblxuICAgICAgLy8gQ2hlY2sgaEJveFxuICAgICAgaWYoIGN5TWF0aC5wb2ludEluc2lkZVBvbHlnb24oIHgsIHksIHBvaW50cyxcbiAgICAgICAgY2VudGVyWCwgY2VudGVyWSwgd2lkdGgsIGhlaWdodCAtIGRpYW0sIFswLCAtMV0sIHBhZGRpbmcgKSApe1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdkJveFxuICAgICAgaWYoIGN5TWF0aC5wb2ludEluc2lkZVBvbHlnb24oIHgsIHksIHBvaW50cyxcbiAgICAgICAgY2VudGVyWCwgY2VudGVyWSwgd2lkdGggLSBkaWFtLCBoZWlnaHQsIFswLCAtMV0sIHBhZGRpbmcgKSApe1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdG9wIGxlZnQgcXVhcnRlciBjaXJjbGVcbiAgICAgIGlmKCBjeU1hdGguY2hlY2tJbkVsbGlwc2UoIHgsIHksXG4gICAgICAgIGRpYW0sIGRpYW0sXG4gICAgICAgIGNlbnRlclggLSB3aWR0aCAvIDIgKyBjb3JuZXJSYWRpdXMsXG4gICAgICAgIGNlbnRlclkgLSBoZWlnaHQgLyAyICsgY29ybmVyUmFkaXVzLFxuICAgICAgICBwYWRkaW5nICkgKXtcblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gQ2hlY2sgdG9wIHJpZ2h0IHF1YXJ0ZXIgY2lyY2xlXG4gICAgICBpZiggY3lNYXRoLmNoZWNrSW5FbGxpcHNlKCB4LCB5LFxuICAgICAgICBkaWFtLCBkaWFtLFxuICAgICAgICBjZW50ZXJYICsgd2lkdGggLyAyIC0gY29ybmVyUmFkaXVzLFxuICAgICAgICBjZW50ZXJZIC0gaGVpZ2h0IC8gMiArIGNvcm5lclJhZGl1cyxcbiAgICAgICAgcGFkZGluZyApICl7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICAgIC8vIENoZWNrIGJvdHRvbSByaWdodCBxdWFydGVyIGNpcmNsZVxuICAgICAgaWYoIGN5TWF0aC5jaGVja0luRWxsaXBzZSggeCwgeSxcbiAgICAgICAgZGlhbSwgZGlhbSxcbiAgICAgICAgY2VudGVyWCArIHdpZHRoIC8gMiAtIGNvcm5lclJhZGl1cyxcbiAgICAgICAgY2VudGVyWSArIGhlaWdodCAvIDIgLSBjb3JuZXJSYWRpdXMsXG4gICAgICAgIHBhZGRpbmcgKSApe1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuXG4gICAgICAvLyBDaGVjayBib3R0b20gbGVmdCBxdWFydGVyIGNpcmNsZVxuICAgICAgaWYoIGN5TWF0aC5jaGVja0luRWxsaXBzZSggeCwgeSxcbiAgICAgICAgZGlhbSwgZGlhbSxcbiAgICAgICAgY2VudGVyWCAtIHdpZHRoIC8gMiArIGNvcm5lclJhZGl1cyxcbiAgICAgICAgY2VudGVyWSArIGhlaWdodCAvIDIgLSBjb3JuZXJSYWRpdXMsXG4gICAgICAgIHBhZGRpbmcgKSApe1xuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgLy9yZXR1cm4gY3lCYXNlTm9kZVNoYXBlc1tcImVsbGlwc2VcIl0uY2hlY2tQb2ludCggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApO1xuICAgIH0sXG4gICAgXCJtYWNyb21vbGVjdWxlXCI6IGZ1bmN0aW9uKCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICkge1xuICAgICAgcmV0dXJuIGN5QmFzZU5vZGVTaGFwZXNbXCJyb3VuZHJlY3RhbmdsZVwiXS5jaGVja1BvaW50KCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICk7XG4gICAgfSxcbiAgICBcImNvbXBsZXhcIjogZnVuY3Rpb24oIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKSB7XG4gICAgICB2YXIgcG9pbnRzID0gJCQuc2Jnbi5nZW5lcmF0ZUNvbXBsZXhTaGFwZVBvaW50cyggJCQuc2Jnbi5nZXREZWZhdWx0Q29tcGxleENvcm5lckxlbmd0aCgpLCB3aWR0aCwgaGVpZ2h0ICk7XG4gICAgICByZXR1cm4gY3lNYXRoLnBvaW50SW5zaWRlUG9seWdvbihcbiAgICAgICAgeCwgeSwgcG9pbnRzLCBjZW50ZXJYLCBjZW50ZXJZLCB3aWR0aCwgaGVpZ2h0LCBbMCwgLTFdLCBwYWRkaW5nKTtcbiAgICB9LFxuICAgIFwiY29tcGxleCBzYm1sXCIgOiBmdW5jdGlvbiggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApIHtcbiAgICAgIHZhciBwb2ludHMgPSAkJC5zYmduLmdlbmVyYXRlQ29tcGxleFNoYXBlUG9pbnRzKCAkJC5zYmduLmdldERlZmF1bHRDb21wbGV4Q29ybmVyTGVuZ3RoKCksIHdpZHRoLCBoZWlnaHQgKTtcbiAgICAgIHJldHVybiBjeU1hdGgucG9pbnRJbnNpZGVQb2x5Z29uKFxuICAgICAgICB4LCB5LCBwb2ludHMsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIFswLCAtMV0sIHBhZGRpbmcpO1xuICAgIH0sXG4gICAgXCJudWNsZWljIGFjaWQgZmVhdHVyZVwiOiBmdW5jdGlvbiggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApIHtcbiAgICAgIHJldHVybiBjeUJhc2VOb2RlU2hhcGVzW1wiYm90dG9tcm91bmRyZWN0YW5nbGVcIl0uY2hlY2tQb2ludCggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApO1xuICAgIH0sXG4gICAgXCJlbXB0eSBzZXRcIjogZnVuY3Rpb24oIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKSB7XG4gICAgICByZXR1cm4gY3lCYXNlTm9kZVNoYXBlc1tcImVsbGlwc2VcIl0uY2hlY2tQb2ludCggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApO1xuICAgIH0sXG4gICAgXCJkZWdyYWRhdGlvblwiOiBmdW5jdGlvbiggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApIHtcbiAgICAgIHJldHVybiBjeUJhc2VOb2RlU2hhcGVzW1wiZWxsaXBzZVwiXS5jaGVja1BvaW50KCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICk7XG4gICAgfSxcbiAgICBcImJpb2xvZ2ljYWwgYWN0aXZpdHlcIjogZnVuY3Rpb24oIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKSB7XG4gICAgICByZXR1cm4gY3lCYXNlTm9kZVNoYXBlc1tcInJlY3RhbmdsZVwiXS5jaGVja1BvaW50KCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICk7XG4gICAgfSxcbiAgICBcImNvbXBhcnRtZW50XCI6IGZ1bmN0aW9uKCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICkge1xuICAgICAgcmV0dXJuIGN5QmFzZU5vZGVTaGFwZXNbXCJiYXJyZWxcIl0uY2hlY2tQb2ludCggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApO1xuICAgIH0sXG4gICAgXCJvbGRDb21wYXJ0bWVudFwiOiBmdW5jdGlvbiggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApIHtcbiAgICAgIHJldHVybiBjeUJhc2VOb2RlU2hhcGVzW1wicm91bmRyZWN0YW5nbGVcIl0uY2hlY2tQb2ludCggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApO1xuICAgIH0sXG4gICAgXCJnZW5lXCI6IGZ1bmN0aW9uKCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICkge1xuICAgICAgcmV0dXJuIGN5QmFzZU5vZGVTaGFwZXNbXCJyb3VuZHJlY3RhbmdsZVwiXS5jaGVja1BvaW50KCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICk7XG4gICB9LFxuICAgXCJzaW1wbGUgbW9sZWN1bGVcIjogZnVuY3Rpb24oIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKSB7XG4gICAgcmV0dXJuIGN5QmFzZU5vZGVTaGFwZXNbXCJyb3VuZHJlY3RhbmdsZVwiXS5jaGVja1BvaW50KCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICk7XG4gICB9LFxuICAgXCJ1bmtub3duIG1vbGVjdWxlXCI6IGZ1bmN0aW9uKCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICkge1xuICAgIHJldHVybiBjeUJhc2VOb2RlU2hhcGVzW1wicm91bmRyZWN0YW5nbGVcIl0uY2hlY2tQb2ludCggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApO1xuICAgfSxcbiAgIFwiZHJ1Z1wiOiBmdW5jdGlvbiggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApIHtcbiAgICByZXR1cm4gY3lCYXNlTm9kZVNoYXBlc1tcInJvdW5kcmVjdGFuZ2xlXCJdLmNoZWNrUG9pbnQoIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKTtcbiAgIH0sXG4gICBcImlvblwiOiBmdW5jdGlvbiggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApIHtcbiAgICByZXR1cm4gY3lCYXNlTm9kZVNoYXBlc1tcInJvdW5kcmVjdGFuZ2xlXCJdLmNoZWNrUG9pbnQoIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKTtcbiAgIH0sXG4gICBcInRydW5jYXRlZCBwcm90ZWluXCI6IGZ1bmN0aW9uKCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICkge1xuICAgIHJldHVybiBjeUJhc2VOb2RlU2hhcGVzW1wicm91bmRyZWN0YW5nbGVcIl0uY2hlY2tQb2ludCggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApO1xuICAgfSxcbiAgIFwiaW9uIGNoYW5uZWxcIjogZnVuY3Rpb24oIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKSB7XG4gICAgcmV0dXJuIGN5QmFzZU5vZGVTaGFwZXNbXCJyb3VuZHJlY3RhbmdsZVwiXS5jaGVja1BvaW50KCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICk7XG4gICB9LFxuICAgXCJybmFcIjogZnVuY3Rpb24oIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKSB7XG4gICAgcmV0dXJuIGN5QmFzZU5vZGVTaGFwZXNbXCJyb3VuZHJlY3RhbmdsZVwiXS5jaGVja1BvaW50KCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICk7XG4gICB9LFxuICAgXCJwaGVub3R5cGUgc2JtbFwiOiBmdW5jdGlvbiggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApIHtcbiAgICByZXR1cm4gY3lCYXNlTm9kZVNoYXBlc1tcInJvdW5kcmVjdGFuZ2xlXCJdLmNoZWNrUG9pbnQoIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKTtcbiAgIH0sXG4gICBcInJlY2VwdG9yXCI6IGZ1bmN0aW9uKCB4LCB5LCBwYWRkaW5nLCB3aWR0aCwgaGVpZ2h0LCBjZW50ZXJYLCBjZW50ZXJZICkge1xuICAgIHJldHVybiBjeUJhc2VOb2RlU2hhcGVzW1wicm91bmRyZWN0YW5nbGVcIl0uY2hlY2tQb2ludCggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApO1xuICAgfSxcbiAgIFwicHJvdGVpblwiOiBmdW5jdGlvbiggeCwgeSwgcGFkZGluZywgd2lkdGgsIGhlaWdodCwgY2VudGVyWCwgY2VudGVyWSApIHtcbiAgICByZXR1cm4gY3lCYXNlTm9kZVNoYXBlc1tcInJvdW5kcmVjdGFuZ2xlXCJdLmNoZWNrUG9pbnQoIHgsIHksIHBhZGRpbmcsIHdpZHRoLCBoZWlnaHQsIGNlbnRlclgsIGNlbnRlclkgKTtcbiAgIH1cbiAgfTtcblxuICAkJC5zYmduLmNsb25lTWFya2VyID0ge1xuICAgIFwic2ltcGxlIGNoZW1pY2FsXCI6IGZ1bmN0aW9uIChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY2xvbmVNYXJrZXIsIGlzTXVsdGltZXIsIG9wYWNpdHkpIHtcbiAgICAgIGlmIChjbG9uZU1hcmtlciAhPSBudWxsKSB7XG4gICAgICAgIHZhciBjb3JuZXJSYWRpdXMgPSBNYXRoLm1pbih3aWR0aCAvIDIsIGhlaWdodCAvIDIpO1xuXG4gICAgICAgIHZhciBmaXJzdENpcmNsZUNlbnRlclggPSBjZW50ZXJYIC0gd2lkdGggLyAyICsgY29ybmVyUmFkaXVzO1xuICAgICAgICB2YXIgZmlyc3RDaXJjbGVDZW50ZXJZID0gY2VudGVyWTtcbiAgICAgICAgdmFyIHNlY29uZENpcmNsZUNlbnRlclggPSBjZW50ZXJYICsgd2lkdGggLyAyIC0gY29ybmVyUmFkaXVzO1xuICAgICAgICB2YXIgc2Vjb25kQ2lyY2xlQ2VudGVyWSA9IGNlbnRlclk7XG4gICAgICAgIHZhciBib3R0b21DaXJjbGVDZW50ZXJYID0gY2VudGVyWDtcbiAgICAgICAgdmFyIGJvdHRvbUNpcmNsZUNlbnRlclkgPSBjZW50ZXJZICsgaGVpZ2h0LzIgLSBjb3JuZXJSYWRpdXM7XG5cbiAgICAgICAgaWYgKHdpZHRoIDwgaGVpZ2h0KSB7XG4gICAgICAgICAgc2ltcGxlQ2hlbWljYWxMZWZ0Q2xvbmUoY29udGV4dCwgYm90dG9tQ2lyY2xlQ2VudGVyWCwgYm90dG9tQ2lyY2xlQ2VudGVyWSxcbiAgICAgICAgICAgICAgMiAqIGNvcm5lclJhZGl1cywgMiAqIGNvcm5lclJhZGl1cywgY2xvbmVNYXJrZXIsIG9wYWNpdHkpO1xuICAgICAgICAgIHNpbXBsZUNoZW1pY2FsUmlnaHRDbG9uZShjb250ZXh0LCBib3R0b21DaXJjbGVDZW50ZXJYLCBib3R0b21DaXJjbGVDZW50ZXJZLFxuICAgICAgICAgICAgICAyICogY29ybmVyUmFkaXVzLCAyICogY29ybmVyUmFkaXVzLCBjbG9uZU1hcmtlciwgb3BhY2l0eSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgc2ltcGxlQ2hlbWljYWxMZWZ0Q2xvbmUoY29udGV4dCwgZmlyc3RDaXJjbGVDZW50ZXJYLCBmaXJzdENpcmNsZUNlbnRlclksXG4gICAgICAgICAgICAgIDIgKiBjb3JuZXJSYWRpdXMsIDIgKiBjb3JuZXJSYWRpdXMsIGNsb25lTWFya2VyLCBvcGFjaXR5KTtcbiAgICAgICAgICBzaW1wbGVDaGVtaWNhbFJpZ2h0Q2xvbmUoY29udGV4dCwgc2Vjb25kQ2lyY2xlQ2VudGVyWCwgc2Vjb25kQ2lyY2xlQ2VudGVyWSxcbiAgICAgICAgICAgICAgMiAqIGNvcm5lclJhZGl1cywgMiAqIGNvcm5lclJhZGl1cywgY2xvbmVNYXJrZXIsIG9wYWNpdHkpO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIG9sZFN0eWxlID0gY29udGV4dC5maWxsU3R5bGU7XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJCQuc2Jnbi5jb2xvcnMuY2xvbmU7XG4gICAgICAgIHZhciBvbGRHbG9iYWxBbHBoYSA9IGNvbnRleHQuZ2xvYmFsQWxwaGE7XG4gICAgICAgIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSBvcGFjaXR5O1xuXG4gICAgICAgIHZhciByZWNQb2ludHMgPSBjeU1hdGguZ2VuZXJhdGVVbml0TmdvblBvaW50c0ZpdFRvU3F1YXJlKDQsIDApO1xuICAgICAgICB2YXIgY2xvbmVYID0gY2VudGVyWDtcbiAgICAgICAgdmFyIGNsb25lWSA9IGNlbnRlclkgKyAzIC8gNCAqIGNvcm5lclJhZGl1cztcbiAgICAgICAgdmFyIGNsb25lV2lkdGggPSB3aWR0aCAtIDIgKiBjb3JuZXJSYWRpdXM7XG4gICAgICAgIHZhciBjbG9uZUhlaWdodCA9IGNvcm5lclJhZGl1cyAvIDI7XG5cbiAgICAgICAgZHJhd1BvbHlnb25QYXRoKGNvbnRleHQsIGNsb25lWCwgY2xvbmVZLCBjbG9uZVdpZHRoLCBjbG9uZUhlaWdodCwgcmVjUG9pbnRzKTtcbiAgICAgICAgY29udGV4dC5maWxsKCk7XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gb2xkU3R5bGU7XG4gICAgICAgIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSBvbGRHbG9iYWxBbHBoYTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFwibnVjbGVpYyBhY2lkIGZlYXR1cmVcIjogZnVuY3Rpb24gKGNvbnRleHQsIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBjbG9uZU1hcmtlciwgaXNNdWx0aW1lciwgb3BhY2l0eSkge1xuICAgICAgaWYgKGNsb25lTWFya2VyICE9IG51bGwpIHtcbiAgICAgICAgdmFyIGNsb25lV2lkdGggPSB3aWR0aDtcbiAgICAgICAgdmFyIGNsb25lSGVpZ2h0ID0gaGVpZ2h0IC8gNDtcbiAgICAgICAgdmFyIGNsb25lWCA9IGNlbnRlclg7XG4gICAgICAgIHZhciBjbG9uZVkgPSBjZW50ZXJZICsgMyAqIGhlaWdodCAvIDg7XG5cbiAgICAgICAgdmFyIG9sZFN0eWxlID0gY29udGV4dC5maWxsU3R5bGU7XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJCQuc2Jnbi5jb2xvcnMuY2xvbmU7XG4gICAgICAgIHZhciBvbGRHbG9iYWxBbHBoYSA9IGNvbnRleHQuZ2xvYmFsQWxwaGE7XG4gICAgICAgIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSBvcGFjaXR5O1xuXG4gICAgICAgIHZhciBjb3JuZXJSYWRpdXMgPSBjeU1hdGguZ2V0Um91bmRSZWN0YW5nbGVSYWRpdXMod2lkdGgsIGhlaWdodCk7XG5cbiAgICAgICAgJCQuc2Jnbi5kcmF3TnVjQWNpZEZlYXR1cmUyKGNvbnRleHQsIGNsb25lWCwgY2xvbmVZLFxuICAgICAgICAgICAgICAgIGNsb25lV2lkdGgsIGNsb25lSGVpZ2h0LCBjb3JuZXJSYWRpdXMpO1xuXG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gb2xkU3R5bGU7XG4gICAgICAgIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSBvbGRHbG9iYWxBbHBoYTtcbiAgICAgIH1cbiAgICB9LFxuICAgIFwibWFjcm9tb2xlY3VsZVwiOiBmdW5jdGlvbiAoY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGNsb25lTWFya2VyLCBpc011bHRpbWVyLCBvcGFjaXR5KSB7XG4gICAgICAkJC5zYmduLmNsb25lTWFya2VyW1wibnVjbGVpYyBhY2lkIGZlYXR1cmVcIl0oY29udGV4dCwgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY2xvbmVNYXJrZXIsIGlzTXVsdGltZXIsIG9wYWNpdHkpO1xuICAgIH0sXG4gICAgXCJjb21wbGV4XCI6IGZ1bmN0aW9uIChjb250ZXh0LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgY2xvbmVNYXJrZXIsIGlzTXVsdGltZXIsIG9wYWNpdHkpIHtcbiAgICAgIGlmIChjbG9uZU1hcmtlciAhPSBudWxsKSB7XG4gICAgICAgIHZhciBjb3JuZXJMZW5ndGggPSAkJC5zYmduLmdldERlZmF1bHRDb21wbGV4Q29ybmVyTGVuZ3RoKCk7XG4gICAgICAgIHZhciBjcFggPSAod2lkdGggPj0gNTApID8gY29ybmVyTGVuZ3RoIC8gd2lkdGggOiBjb3JuZXJMZW5ndGggLyA1MDtcbiAgICAgICAgdmFyIGNwWSA9IChoZWlnaHQgPj0gNTApID8gY29ybmVyTGVuZ3RoIC8gaGVpZ2h0IDogY29ybmVyTGVuZ3RoIC8gNTA7XG4gICAgICAgIHZhciBjbG9uZVdpZHRoID0gd2lkdGg7XG4gICAgICAgIHZhciBjbG9uZUhlaWdodCA9IGhlaWdodCAqIGNwWSAvIDI7XG4gICAgICAgIHZhciBjbG9uZVggPSBjZW50ZXJYO1xuICAgICAgICB2YXIgY2xvbmVZID0gY2VudGVyWSArIGhlaWdodCAvIDIgLSBjbG9uZUhlaWdodCAvIDI7XG5cbiAgICAgICAgdmFyIG1hcmtlclBvaW50cyA9IFstMSwgLTEsIDEsIC0xLCAxIC0gY3BYLCAxLCAtMSArIGNwWCwgMV07XG5cbiAgICAgICAgdmFyIG9sZFN0eWxlID0gY29udGV4dC5maWxsU3R5bGU7XG4gICAgICAgIGNvbnRleHQuZmlsbFN0eWxlID0gJCQuc2Jnbi5jb2xvcnMuY2xvbmU7XG4gICAgICAgIHZhciBvbGRHbG9iYWxBbHBoYSA9IGNvbnRleHQuZ2xvYmFsQWxwaGE7XG4gICAgICAgIGNvbnRleHQuZ2xvYmFsQWxwaGEgPSBvcGFjaXR5O1xuXG4gICAgICAgIGRyYXdQb2x5Z29uUGF0aChjb250ZXh0LFxuICAgICAgICAgICAgICAgIGNsb25lWCwgY2xvbmVZLFxuICAgICAgICAgICAgICAgIGNsb25lV2lkdGgsIGNsb25lSGVpZ2h0LCBtYXJrZXJQb2ludHMpO1xuICAgICAgICBjb250ZXh0LmZpbGwoKTtcblxuICAgICAgICBjb250ZXh0LmZpbGxTdHlsZSA9IG9sZFN0eWxlO1xuICAgICAgICBjb250ZXh0Lmdsb2JhbEFscGhhID0gb2xkR2xvYmFsQWxwaGE7XG5cbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgJCQuc2Jnbi5jbG9zZXN0SW50ZXJzZWN0aW9uUG9pbnQgPSBmdW5jdGlvbiAocG9pbnQsIGludGVyc2VjdGlvbnMpIHtcbiAgICBpZiAoaW50ZXJzZWN0aW9ucy5sZW5ndGggPD0gMClcbiAgICAgIHJldHVybiBbXTtcblxuICAgIHZhciBjbG9zZXN0SW50ZXJzZWN0aW9uID0gW107XG4gICAgdmFyIG1pbkRpc3RhbmNlID0gTnVtYmVyLk1BWF9WQUxVRTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaW50ZXJzZWN0aW9ucy5sZW5ndGg7IGkgPSBpICsgMikge1xuICAgICAgdmFyIGNoZWNrUG9pbnQgPSBbaW50ZXJzZWN0aW9uc1tpXSwgaW50ZXJzZWN0aW9uc1tpICsgMV1dO1xuICAgICAgdmFyIGRpc3RhbmNlID0gY3lNYXRoLmNhbGN1bGF0ZURpc3RhbmNlKHBvaW50LCBjaGVja1BvaW50KTtcblxuICAgICAgaWYgKGRpc3RhbmNlIDwgbWluRGlzdGFuY2UpIHtcbiAgICAgICAgbWluRGlzdGFuY2UgPSBkaXN0YW5jZTtcbiAgICAgICAgY2xvc2VzdEludGVyc2VjdGlvbiA9IGNoZWNrUG9pbnQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsb3Nlc3RJbnRlcnNlY3Rpb247XG4gIH07XG5cbiAgJCQuc2Jnbi5udWNsZWljQWNpZEludGVyc2VjdGlvbkxpbmUgPSBmdW5jdGlvbiAoeCwgeSwgbm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpIHtcbiAgICAvLyB2YXIgbm9kZVggPSBub2RlLl9wcml2YXRlLnBvc2l0aW9uLng7XG4gICAgLy8gdmFyIG5vZGVZID0gbm9kZS5fcHJpdmF0ZS5wb3NpdGlvbi55O1xuICAgIC8vIHZhciB3aWR0aCA9IG5vZGUud2lkdGgoKTtcbiAgICAvLyB2YXIgaGVpZ2h0ID0gbm9kZS5oZWlnaHQoKTtcbiAgICAvLyB2YXIgcGFkZGluZyA9IHBhcnNlSW50KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSkgLyAyO1xuXG4gICAgdmFyIGhhbGZXaWR0aCA9IHdpZHRoIC8gMjtcbiAgICB2YXIgaGFsZkhlaWdodCA9IGhlaWdodCAvIDI7XG5cbiAgICB2YXIgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucztcblxuICAgIC8vIFRvcCBzZWdtZW50LCBsZWZ0IHRvIHJpZ2h0XG4gICAge1xuICAgICAgdmFyIHRvcFN0YXJ0WCA9IG5vZGVYIC0gaGFsZldpZHRoIC0gcGFkZGluZztcbiAgICAgIHZhciB0b3BTdGFydFkgPSBub2RlWSAtIGhhbGZIZWlnaHQgLSBwYWRkaW5nO1xuICAgICAgdmFyIHRvcEVuZFggPSBub2RlWCArIGhhbGZXaWR0aCArIHBhZGRpbmc7XG4gICAgICB2YXIgdG9wRW5kWSA9IHRvcFN0YXJ0WTtcblxuICAgICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IGN5TWF0aC5maW5pdGVMaW5lc0ludGVyc2VjdChcbiAgICAgICAgICAgICAgeCwgeSwgbm9kZVgsIG5vZGVZLCB0b3BTdGFydFgsIHRvcFN0YXJ0WSwgdG9wRW5kWCwgdG9wRW5kWSwgZmFsc2UpO1xuXG4gICAgICBpZiAoc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJpZ2h0IHNlZ21lbnQsIHRvcCB0byBib3R0b21cbiAgICB7XG4gICAgICB2YXIgcmlnaHRTdGFydFggPSBub2RlWCArIGhhbGZXaWR0aCArIHBhZGRpbmc7XG4gICAgICB2YXIgcmlnaHRTdGFydFkgPSBub2RlWSAtIGhhbGZIZWlnaHQgLSBwYWRkaW5nO1xuICAgICAgdmFyIHJpZ2h0RW5kWCA9IHJpZ2h0U3RhcnRYO1xuICAgICAgdmFyIHJpZ2h0RW5kWSA9IG5vZGVZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1cyArIHBhZGRpbmc7XG5cbiAgICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBjeU1hdGguZmluaXRlTGluZXNJbnRlcnNlY3QoXG4gICAgICAgICAgICAgIHgsIHksIG5vZGVYLCBub2RlWSwgcmlnaHRTdGFydFgsIHJpZ2h0U3RhcnRZLCByaWdodEVuZFgsIHJpZ2h0RW5kWSwgZmFsc2UpO1xuXG4gICAgICBpZiAoc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIEJvdHRvbSBzZWdtZW50LCBsZWZ0IHRvIHJpZ2h0XG4gICAge1xuICAgICAgdmFyIGJvdHRvbVN0YXJ0WCA9IG5vZGVYIC0gaGFsZldpZHRoICsgY29ybmVyUmFkaXVzIC0gcGFkZGluZztcbiAgICAgIHZhciBib3R0b21TdGFydFkgPSBub2RlWSArIGhhbGZIZWlnaHQgKyBwYWRkaW5nO1xuICAgICAgdmFyIGJvdHRvbUVuZFggPSBub2RlWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cyArIHBhZGRpbmc7XG4gICAgICB2YXIgYm90dG9tRW5kWSA9IGJvdHRvbVN0YXJ0WTtcblxuICAgICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IGN5TWF0aC5maW5pdGVMaW5lc0ludGVyc2VjdChcbiAgICAgICAgICAgICAgeCwgeSwgbm9kZVgsIG5vZGVZLCBib3R0b21TdGFydFgsIGJvdHRvbVN0YXJ0WSwgYm90dG9tRW5kWCwgYm90dG9tRW5kWSwgZmFsc2UpO1xuXG4gICAgICBpZiAoc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExlZnQgc2VnbWVudCwgdG9wIHRvIGJvdHRvbVxuICAgIHtcbiAgICAgIHZhciBsZWZ0U3RhcnRYID0gbm9kZVggLSBoYWxmV2lkdGggLSBwYWRkaW5nO1xuICAgICAgdmFyIGxlZnRTdGFydFkgPSBub2RlWSAtIGhhbGZIZWlnaHQgLSBwYWRkaW5nO1xuICAgICAgdmFyIGxlZnRFbmRYID0gbGVmdFN0YXJ0WDtcbiAgICAgIHZhciBsZWZ0RW5kWSA9IG5vZGVZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1cyArIHBhZGRpbmc7XG5cbiAgICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBjeU1hdGguZmluaXRlTGluZXNJbnRlcnNlY3QoXG4gICAgICAgICAgICAgIHgsIHksIG5vZGVYLCBub2RlWSwgbGVmdFN0YXJ0WCwgbGVmdFN0YXJ0WSwgbGVmdEVuZFgsIGxlZnRFbmRZLCBmYWxzZSk7XG5cbiAgICAgIGlmIChzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgcmV0dXJuIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnM7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaW50ZXJzZWN0aW9ucyB3aXRoIGFyYyBzZWdtZW50cywgd2UgaGF2ZSBvbmx5IHR3byBhcmNzIGZvclxuICAgIC8vbnVjbGVpYyBhY2lkIGZlYXR1cmVzXG4gICAgdmFyIGFyY0ludGVyc2VjdGlvbnM7XG5cbiAgICAvLyBCb3R0b20gUmlnaHRcbiAgICB7XG4gICAgICB2YXIgYm90dG9tUmlnaHRDZW50ZXJYID0gbm9kZVggKyBoYWxmV2lkdGggLSBjb3JuZXJSYWRpdXM7XG4gICAgICB2YXIgYm90dG9tUmlnaHRDZW50ZXJZID0gbm9kZVkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyUmFkaXVzXG4gICAgICBhcmNJbnRlcnNlY3Rpb25zID0gY3lNYXRoLmludGVyc2VjdExpbmVDaXJjbGUoXG4gICAgICAgICAgICAgIHgsIHksIG5vZGVYLCBub2RlWSxcbiAgICAgICAgICAgICAgYm90dG9tUmlnaHRDZW50ZXJYLCBib3R0b21SaWdodENlbnRlclksIGNvcm5lclJhZGl1cyArIHBhZGRpbmcpO1xuXG4gICAgICAvLyBFbnN1cmUgdGhlIGludGVyc2VjdGlvbiBpcyBvbiB0aGUgZGVzaXJlZCBxdWFydGVyIG9mIHRoZSBjaXJjbGVcbiAgICAgIGlmIChhcmNJbnRlcnNlY3Rpb25zLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgJiYgYXJjSW50ZXJzZWN0aW9uc1swXSA+PSBib3R0b21SaWdodENlbnRlclhcbiAgICAgICAgICAgICAgJiYgYXJjSW50ZXJzZWN0aW9uc1sxXSA+PSBib3R0b21SaWdodENlbnRlclkpIHtcbiAgICAgICAgcmV0dXJuIFthcmNJbnRlcnNlY3Rpb25zWzBdLCBhcmNJbnRlcnNlY3Rpb25zWzFdXTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCb3R0b20gTGVmdFxuICAgIHtcbiAgICAgIHZhciBib3R0b21MZWZ0Q2VudGVyWCA9IG5vZGVYIC0gaGFsZldpZHRoICsgY29ybmVyUmFkaXVzO1xuICAgICAgdmFyIGJvdHRvbUxlZnRDZW50ZXJZID0gbm9kZVkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyUmFkaXVzXG4gICAgICBhcmNJbnRlcnNlY3Rpb25zID0gY3lNYXRoLmludGVyc2VjdExpbmVDaXJjbGUoXG4gICAgICAgICAgICAgIHgsIHksIG5vZGVYLCBub2RlWSxcbiAgICAgICAgICAgICAgYm90dG9tTGVmdENlbnRlclgsIGJvdHRvbUxlZnRDZW50ZXJZLCBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nKTtcblxuICAgICAgLy8gRW5zdXJlIHRoZSBpbnRlcnNlY3Rpb24gaXMgb24gdGhlIGRlc2lyZWQgcXVhcnRlciBvZiB0aGUgY2lyY2xlXG4gICAgICBpZiAoYXJjSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICYmIGFyY0ludGVyc2VjdGlvbnNbMF0gPD0gYm90dG9tTGVmdENlbnRlclhcbiAgICAgICAgICAgICAgJiYgYXJjSW50ZXJzZWN0aW9uc1sxXSA+PSBib3R0b21MZWZ0Q2VudGVyWSkge1xuICAgICAgICByZXR1cm4gW2FyY0ludGVyc2VjdGlvbnNbMF0sIGFyY0ludGVyc2VjdGlvbnNbMV1dO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gW107IC8vIGlmIG5vdGhpbmdcbiAgfTtcblxuICAvL3RoaXMgZnVuY3Rpb24gZ2l2ZXMgdGhlIGludGVyc2VjdGlvbnMgb2YgYW55IGxpbmUgd2l0aCB0aGUgdXBwZXIgaGFsZiBvZiBwZXJ0dXJiaW5nIGFnZW50XG4gICQkLnNiZ24ucGVydHVyYmluZ0FnZW50SW50ZXJzZWN0TGluZSA9IGZ1bmN0aW9uIChcbiAgICAgICAgICB4MSwgeTEsIHgyLCB5Miwgbm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCBwYWRkaW5nKSB7XG5cbiAgICB2YXIgaGFsZldpZHRoID0gd2lkdGggLyAyO1xuICAgIHZhciBoYWxmSGVpZ2h0ID0gaGVpZ2h0IC8gMjtcblxuICAgIC8vIENoZWNrIGludGVyc2VjdGlvbnMgd2l0aCBzdHJhaWdodCBsaW5lIHNlZ21lbnRzXG4gICAgdmFyIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBbXTtcblxuICAgIC8vIFRvcCBzZWdtZW50LCBsZWZ0IHRvIHJpZ2h0XG4gICAge1xuICAgICAgdmFyIHRvcFN0YXJ0WCA9IG5vZGVYIC0gaGFsZldpZHRoIC0gcGFkZGluZztcbiAgICAgIHZhciB0b3BTdGFydFkgPSBub2RlWSAtIGhhbGZIZWlnaHQgLSBwYWRkaW5nO1xuICAgICAgdmFyIHRvcEVuZFggPSBub2RlWCArIGhhbGZXaWR0aCArIHBhZGRpbmc7XG4gICAgICB2YXIgdG9wRW5kWSA9IHRvcFN0YXJ0WTtcblxuICAgICAgdmFyIGludGVyc2VjdGlvbiA9IGN5TWF0aC5maW5pdGVMaW5lc0ludGVyc2VjdChcbiAgICAgICAgICAgICAgeDEsIHkxLCB4MiwgeTIsIHRvcFN0YXJ0WCwgdG9wU3RhcnRZLCB0b3BFbmRYLCB0b3BFbmRZLCBmYWxzZSk7XG5cbiAgICAgIGlmIChpbnRlcnNlY3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5jb25jYXQoaW50ZXJzZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSaWdodCBzZWdtZW50LCB0b3AgdG8gYm90dG9tXG4gICAge1xuICAgICAgdmFyIHJpZ2h0U3RhcnRYID0gbm9kZVggKyBoYWxmV2lkdGggKyBwYWRkaW5nO1xuICAgICAgdmFyIHJpZ2h0U3RhcnRZID0gbm9kZVkgLSBoYWxmSGVpZ2h0IC0gcGFkZGluZztcbiAgICAgIHZhciByaWdodEVuZFggPSByaWdodFN0YXJ0WCAtIGhhbGZXaWR0aC8yO1xuICAgICAgdmFyIHJpZ2h0RW5kWSA9IG5vZGVZICsgcGFkZGluZztcblxuICAgICAgdmFyIGludGVyc2VjdGlvbiA9IGN5TWF0aC5maW5pdGVMaW5lc0ludGVyc2VjdChcbiAgICAgICAgICAgICAgeDEsIHkxLCB4MiwgeTIsIHJpZ2h0U3RhcnRYLCByaWdodFN0YXJ0WSwgcmlnaHRFbmRYLCByaWdodEVuZFksIGZhbHNlKTtcblxuICAgICAgaWYgKGludGVyc2VjdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmNvbmNhdChpbnRlcnNlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExlZnQgc2VnbWVudCwgdG9wIHRvIGJvdHRvbVxuICAgIHtcbiAgICAgIHZhciBsZWZ0U3RhcnRYID0gbm9kZVggLSBoYWxmV2lkdGggLSBwYWRkaW5nO1xuICAgICAgdmFyIGxlZnRTdGFydFkgPSBub2RlWSAtIGhhbGZIZWlnaHQgLSBwYWRkaW5nO1xuICAgICAgdmFyIGxlZnRFbmRYID0gbGVmdFN0YXJ0WCArIGhhbGZXaWR0aC8yO1xuICAgICAgdmFyIGxlZnRFbmRZID0gbm9kZVkgKyBwYWRkaW5nO1xuXG4gICAgICB2YXIgaW50ZXJzZWN0aW9uID0gY3lNYXRoLmZpbml0ZUxpbmVzSW50ZXJzZWN0KFxuICAgICAgICAgICAgICB4MSwgeTEsIHgyLCB5MiwgbGVmdFN0YXJ0WCwgbGVmdFN0YXJ0WSwgbGVmdEVuZFgsIGxlZnRFbmRZLCBmYWxzZSk7XG5cbiAgICAgIGlmIChpbnRlcnNlY3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5jb25jYXQoaW50ZXJzZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucztcbiAgfTtcblxuICAvL3RoaXMgZnVuY3Rpb24gZ2l2ZXMgdGhlIGludGVyc2VjdGlvbnMgb2YgYW55IGxpbmUgd2l0aCBhIHJvdW5kIHJlY3RhbmdsZVxuICAkJC5zYmduLnJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZSA9IGZ1bmN0aW9uIChcbiAgICAgICAgICB4MSwgeTEsIHgyLCB5Miwgbm9kZVgsIG5vZGVZLCB3aWR0aCwgaGVpZ2h0LCBjb3JuZXJSYWRpdXMsIHBhZGRpbmcpIHtcblxuICAgIHZhciBoYWxmV2lkdGggPSB3aWR0aCAvIDI7XG4gICAgdmFyIGhhbGZIZWlnaHQgPSBoZWlnaHQgLyAyO1xuXG4gICAgLy8gQ2hlY2sgaW50ZXJzZWN0aW9ucyB3aXRoIHN0cmFpZ2h0IGxpbmUgc2VnbWVudHNcbiAgICB2YXIgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IFtdO1xuICAgIC8vIFRvcCBzZWdtZW50LCBsZWZ0IHRvIHJpZ2h0XG4gICAge1xuICAgICAgdmFyIHRvcFN0YXJ0WCA9IG5vZGVYIC0gaGFsZldpZHRoICsgY29ybmVyUmFkaXVzIC0gcGFkZGluZztcbiAgICAgIHZhciB0b3BTdGFydFkgPSBub2RlWSAtIGhhbGZIZWlnaHQgLSBwYWRkaW5nO1xuICAgICAgdmFyIHRvcEVuZFggPSBub2RlWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cyArIHBhZGRpbmc7XG4gICAgICB2YXIgdG9wRW5kWSA9IHRvcFN0YXJ0WTtcblxuICAgICAgdmFyIGludGVyc2VjdGlvbiA9IGN5TWF0aC5maW5pdGVMaW5lc0ludGVyc2VjdChcbiAgICAgICAgICAgICAgeDEsIHkxLCB4MiwgeTIsIHRvcFN0YXJ0WCwgdG9wU3RhcnRZLCB0b3BFbmRYLCB0b3BFbmRZLCBmYWxzZSk7XG5cbiAgICAgIGlmIChpbnRlcnNlY3Rpb24ubGVuZ3RoID4gMCkge1xuICAgICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5jb25jYXQoaW50ZXJzZWN0aW9uKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSaWdodCBzZWdtZW50LCB0b3AgdG8gYm90dG9tXG4gICAge1xuICAgICAgdmFyIHJpZ2h0U3RhcnRYID0gbm9kZVggKyBoYWxmV2lkdGggKyBwYWRkaW5nO1xuICAgICAgdmFyIHJpZ2h0U3RhcnRZID0gbm9kZVkgLSBoYWxmSGVpZ2h0ICsgY29ybmVyUmFkaXVzIC0gcGFkZGluZztcbiAgICAgIHZhciByaWdodEVuZFggPSByaWdodFN0YXJ0WDtcbiAgICAgIHZhciByaWdodEVuZFkgPSBub2RlWSArIGhhbGZIZWlnaHQgLSBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nO1xuXG4gICAgICB2YXIgaW50ZXJzZWN0aW9uID0gY3lNYXRoLmZpbml0ZUxpbmVzSW50ZXJzZWN0KFxuICAgICAgICAgICAgICB4MSwgeTEsIHgyLCB5MiwgcmlnaHRTdGFydFgsIHJpZ2h0U3RhcnRZLCByaWdodEVuZFgsIHJpZ2h0RW5kWSwgZmFsc2UpO1xuXG4gICAgICBpZiAoaW50ZXJzZWN0aW9uLmxlbmd0aCA+IDApIHtcbiAgICAgICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMuY29uY2F0KGludGVyc2VjdGlvbik7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQm90dG9tIHNlZ21lbnQsIGxlZnQgdG8gcmlnaHRcbiAgICB7XG4gICAgICB2YXIgYm90dG9tU3RhcnRYID0gbm9kZVggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXMgLSBwYWRkaW5nO1xuICAgICAgdmFyIGJvdHRvbVN0YXJ0WSA9IG5vZGVZICsgaGFsZkhlaWdodCArIHBhZGRpbmc7XG4gICAgICB2YXIgYm90dG9tRW5kWCA9IG5vZGVYICsgaGFsZldpZHRoIC0gY29ybmVyUmFkaXVzICsgcGFkZGluZztcbiAgICAgIHZhciBib3R0b21FbmRZID0gYm90dG9tU3RhcnRZO1xuXG4gICAgICB2YXIgaW50ZXJzZWN0aW9uID0gY3lNYXRoLmZpbml0ZUxpbmVzSW50ZXJzZWN0KFxuICAgICAgICAgICAgICB4MSwgeTEsIHgyLCB5MiwgYm90dG9tU3RhcnRYLCBib3R0b21TdGFydFksIGJvdHRvbUVuZFgsIGJvdHRvbUVuZFksIGZhbHNlKTtcblxuICAgICAgaWYgKGludGVyc2VjdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmNvbmNhdChpbnRlcnNlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExlZnQgc2VnbWVudCwgdG9wIHRvIGJvdHRvbVxuICAgIHtcbiAgICAgIHZhciBsZWZ0U3RhcnRYID0gbm9kZVggLSBoYWxmV2lkdGggLSBwYWRkaW5nO1xuICAgICAgdmFyIGxlZnRTdGFydFkgPSBub2RlWSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJSYWRpdXMgLSBwYWRkaW5nO1xuICAgICAgdmFyIGxlZnRFbmRYID0gbGVmdFN0YXJ0WDtcbiAgICAgIHZhciBsZWZ0RW5kWSA9IG5vZGVZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1cyArIHBhZGRpbmc7XG5cbiAgICAgIHZhciBpbnRlcnNlY3Rpb24gPSBjeU1hdGguZmluaXRlTGluZXNJbnRlcnNlY3QoXG4gICAgICAgICAgICAgIHgxLCB5MSwgeDIsIHkyLCBsZWZ0U3RhcnRYLCBsZWZ0U3RhcnRZLCBsZWZ0RW5kWCwgbGVmdEVuZFksIGZhbHNlKTtcblxuICAgICAgaWYgKGludGVyc2VjdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmNvbmNhdChpbnRlcnNlY3Rpb24pO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGludGVyc2VjdGlvbnMgd2l0aCBhcmMgc2VnbWVudHNcbiAgICB2YXIgYXJjSW50ZXJzZWN0aW9ucztcblxuICAgIC8vIFRvcCBMZWZ0XG4gICAge1xuICAgICAgdmFyIHRvcExlZnRDZW50ZXJYID0gbm9kZVggLSBoYWxmV2lkdGggKyBjb3JuZXJSYWRpdXM7XG4gICAgICB2YXIgdG9wTGVmdENlbnRlclkgPSBub2RlWSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJSYWRpdXNcbiAgICAgIGFyY0ludGVyc2VjdGlvbnMgPSBjeU1hdGguaW50ZXJzZWN0TGluZUNpcmNsZShcbiAgICAgICAgICAgICAgeDEsIHkxLCB4MiwgeTIsXG4gICAgICAgICAgICAgIHRvcExlZnRDZW50ZXJYLCB0b3BMZWZ0Q2VudGVyWSwgY29ybmVyUmFkaXVzICsgcGFkZGluZyk7XG5cbiAgICAgIC8vIEVuc3VyZSB0aGUgaW50ZXJzZWN0aW9uIGlzIG9uIHRoZSBkZXNpcmVkIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuICAgICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdIDw9IHRvcExlZnRDZW50ZXJYXG4gICAgICAgICAgICAgICYmIGFyY0ludGVyc2VjdGlvbnNbMV0gPD0gdG9wTGVmdENlbnRlclkpIHtcbiAgICAgICAgc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucyA9IHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMuY29uY2F0KGFyY0ludGVyc2VjdGlvbnMpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFRvcCBSaWdodFxuICAgIHtcbiAgICAgIHZhciB0b3BSaWdodENlbnRlclggPSBub2RlWCArIGhhbGZXaWR0aCAtIGNvcm5lclJhZGl1cztcbiAgICAgIHZhciB0b3BSaWdodENlbnRlclkgPSBub2RlWSAtIGhhbGZIZWlnaHQgKyBjb3JuZXJSYWRpdXNcbiAgICAgIGFyY0ludGVyc2VjdGlvbnMgPSBjeU1hdGguaW50ZXJzZWN0TGluZUNpcmNsZShcbiAgICAgICAgICAgICAgeDEsIHkxLCB4MiwgeTIsXG4gICAgICAgICAgICAgIHRvcFJpZ2h0Q2VudGVyWCwgdG9wUmlnaHRDZW50ZXJZLCBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nKTtcblxuICAgICAgLy8gRW5zdXJlIHRoZSBpbnRlcnNlY3Rpb24gaXMgb24gdGhlIGRlc2lyZWQgcXVhcnRlciBvZiB0aGUgY2lyY2xlXG4gICAgICBpZiAoYXJjSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICYmIGFyY0ludGVyc2VjdGlvbnNbMF0gPj0gdG9wUmlnaHRDZW50ZXJYXG4gICAgICAgICAgICAgICYmIGFyY0ludGVyc2VjdGlvbnNbMV0gPD0gdG9wUmlnaHRDZW50ZXJZKSB7XG4gICAgICAgIHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMgPSBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zLmNvbmNhdChhcmNJbnRlcnNlY3Rpb25zKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBCb3R0b20gUmlnaHRcbiAgICB7XG4gICAgICB2YXIgYm90dG9tUmlnaHRDZW50ZXJYID0gbm9kZVggKyBoYWxmV2lkdGggLSBjb3JuZXJSYWRpdXM7XG4gICAgICB2YXIgYm90dG9tUmlnaHRDZW50ZXJZID0gbm9kZVkgKyBoYWxmSGVpZ2h0IC0gY29ybmVyUmFkaXVzXG4gICAgICBhcmNJbnRlcnNlY3Rpb25zID0gY3lNYXRoLmludGVyc2VjdExpbmVDaXJjbGUoXG4gICAgICAgICAgICAgIHgxLCB5MSwgeDIsIHkyLFxuICAgICAgICAgICAgICBib3R0b21SaWdodENlbnRlclgsIGJvdHRvbVJpZ2h0Q2VudGVyWSwgY29ybmVyUmFkaXVzICsgcGFkZGluZyk7XG5cbiAgICAgIC8vIEVuc3VyZSB0aGUgaW50ZXJzZWN0aW9uIGlzIG9uIHRoZSBkZXNpcmVkIHF1YXJ0ZXIgb2YgdGhlIGNpcmNsZVxuICAgICAgaWYgKGFyY0ludGVyc2VjdGlvbnMubGVuZ3RoID4gMFxuICAgICAgICAgICAgICAmJiBhcmNJbnRlcnNlY3Rpb25zWzBdID49IGJvdHRvbVJpZ2h0Q2VudGVyWFxuICAgICAgICAgICAgICAmJiBhcmNJbnRlcnNlY3Rpb25zWzFdID49IGJvdHRvbVJpZ2h0Q2VudGVyWSkge1xuICAgICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5jb25jYXQoYXJjSW50ZXJzZWN0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gQm90dG9tIExlZnRcbiAgICB7XG4gICAgICB2YXIgYm90dG9tTGVmdENlbnRlclggPSBub2RlWCAtIGhhbGZXaWR0aCArIGNvcm5lclJhZGl1cztcbiAgICAgIHZhciBib3R0b21MZWZ0Q2VudGVyWSA9IG5vZGVZICsgaGFsZkhlaWdodCAtIGNvcm5lclJhZGl1c1xuICAgICAgYXJjSW50ZXJzZWN0aW9ucyA9IGN5TWF0aC5pbnRlcnNlY3RMaW5lQ2lyY2xlKFxuICAgICAgICAgICAgICB4MSwgeTEsIHgyLCB5MixcbiAgICAgICAgICAgICAgYm90dG9tTGVmdENlbnRlclgsIGJvdHRvbUxlZnRDZW50ZXJZLCBjb3JuZXJSYWRpdXMgKyBwYWRkaW5nKTtcblxuICAgICAgLy8gRW5zdXJlIHRoZSBpbnRlcnNlY3Rpb24gaXMgb24gdGhlIGRlc2lyZWQgcXVhcnRlciBvZiB0aGUgY2lyY2xlXG4gICAgICBpZiAoYXJjSW50ZXJzZWN0aW9ucy5sZW5ndGggPiAwXG4gICAgICAgICAgICAgICYmIGFyY0ludGVyc2VjdGlvbnNbMF0gPD0gYm90dG9tTGVmdENlbnRlclhcbiAgICAgICAgICAgICAgJiYgYXJjSW50ZXJzZWN0aW9uc1sxXSA+PSBib3R0b21MZWZ0Q2VudGVyWSkge1xuICAgICAgICBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zID0gc3RyYWlnaHRMaW5lSW50ZXJzZWN0aW9ucy5jb25jYXQoYXJjSW50ZXJzZWN0aW9ucyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0cmFpZ2h0TGluZUludGVyc2VjdGlvbnMubGVuZ3RoID4gMClcbiAgICAgIHJldHVybiBzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zO1xuICAgIHJldHVybiBbXTsgLy8gaWYgbm90aGluZ1xuICB9O1xuXG4gICQkLnNiZ24uaW50ZXJzZWN0TGluZUVsbGlwc2UgPSBmdW5jdGlvbiAoXG4gICAgICAgICAgeDEsIHkxLCB4MiwgeTIsIGNlbnRlclgsIGNlbnRlclksIHdpZHRoLCBoZWlnaHQsIHBhZGRpbmcpIHtcblxuICAgIHZhciB3ID0gd2lkdGggLyAyICsgcGFkZGluZztcbiAgICB2YXIgaCA9IGhlaWdodCAvIDIgKyBwYWRkaW5nO1xuICAgIHZhciBhbiA9IGNlbnRlclg7XG4gICAgdmFyIGJuID0gY2VudGVyWTtcblxuICAgIHZhciBkID0gW3gyIC0geDEsIHkyIC0geTFdO1xuXG4gICAgdmFyIG0gPSBkWzFdIC8gZFswXTtcbiAgICB2YXIgbiA9IC0xICogbSAqIHgyICsgeTI7XG4gICAgdmFyIGEgPSBoICogaCArIHcgKiB3ICogbSAqIG07XG4gICAgdmFyIGIgPSAtMiAqIGFuICogaCAqIGggKyAyICogbSAqIG4gKiB3ICogdyAtIDIgKiBibiAqIG0gKiB3ICogdztcbiAgICB2YXIgYyA9IGFuICogYW4gKiBoICogaCArIG4gKiBuICogdyAqIHcgLSAyICogYm4gKiB3ICogdyAqIG4gK1xuICAgICAgICAgICAgYm4gKiBibiAqIHcgKiB3IC0gaCAqIGggKiB3ICogdztcblxuICAgIHZhciBkaXNjcmltaW5hbnQgPSBiICogYiAtIDQgKiBhICogYztcblxuICAgIGlmIChkaXNjcmltaW5hbnQgPCAwKSB7XG4gICAgICByZXR1cm4gW107XG4gICAgfVxuXG4gICAgdmFyIHQxID0gKC1iICsgTWF0aC5zcXJ0KGRpc2NyaW1pbmFudCkpIC8gKDIgKiBhKTtcbiAgICB2YXIgdDIgPSAoLWIgLSBNYXRoLnNxcnQoZGlzY3JpbWluYW50KSkgLyAoMiAqIGEpO1xuXG4gICAgdmFyIHhNaW4gPSBNYXRoLm1pbih0MSwgdDIpO1xuICAgIHZhciB4TWF4ID0gTWF0aC5tYXgodDEsIHQyKTtcblxuICAgIHZhciB5TWluID0gbSAqIHhNaW4gLSBtICogeDIgKyB5MjtcbiAgICB2YXIgeU1heCA9IG0gKiB4TWF4IC0gbSAqIHgyICsgeTI7XG5cbiAgICByZXR1cm4gW3hNaW4sIHlNaW4sIHhNYXgsIHlNYXhdO1xuICB9O1xuXG4gICQkLnNiZ24uaW50ZXJzZWN0TGluZVN0YXRlQW5kSW5mb0JveGVzID0gZnVuY3Rpb24gKG5vZGUsIHgsIHkpIHtcbiAgICB2YXIgY2VudGVyWCA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueDtcbiAgICB2YXIgY2VudGVyWSA9IG5vZGUuX3ByaXZhdGUucG9zaXRpb24ueTtcbiAgICB2YXIgcGFkZGluZyA9IHBhcnNlSW50KG5vZGUuY3NzKCdib3JkZXItd2lkdGgnKSkgLyAyO1xuXG4gICAgdmFyIHN0YXRlQW5kSW5mb3MgPSBub2RlLl9wcml2YXRlLmRhdGEuc3RhdGVzYW5kaW5mb3M7XG5cbiAgICB2YXIgaW50ZXJzZWN0aW9ucyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdGF0ZUFuZEluZm9zLmxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgc3RhdGUgPSBzdGF0ZUFuZEluZm9zW2ldO1xuXG4gICAgICBpZiAoICFzdGF0ZS5pc0Rpc3BsYXllZCApIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG5cbiAgICAgIHZhciBpbmZvQm94V2lkdGggPSBzdGF0ZS5iYm94Lnc7XG4gICAgICB2YXIgaW5mb0JveEhlaWdodCA9IHN0YXRlLmJib3guaDtcblxuICAgICAgdmFyIGN1cnJJbnRlcnNlY3Rpb25zID0gbnVsbDtcbiAgICAgIGlmICggc3RhdGUuY2xhenogPT0gXCJzdGF0ZSB2YXJpYWJsZVwiICkge1xuICAgICAgICB2YXIgY29vcmQgPSBjbGFzc2VzLlN0YXRlVmFyaWFibGUuZ2V0QWJzb2x1dGVDb29yZChzdGF0ZSwgbm9kZS5jeSgpKTtcbiAgICAgICAgY3VyckludGVyc2VjdGlvbnMgPSAkJC5zYmduLmludGVyc2VjdExpbmVFbGxpcHNlKHgsIHksIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgICAgY29vcmQueCwgY29vcmQueSwgaW5mb0JveFdpZHRoLCBpbmZvQm94SGVpZ2h0LCBwYWRkaW5nKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKCBzdGF0ZS5jbGF6eiA9PSBcInJlc2lkdWUgdmFyaWFibGVcIiApIHtcbiAgICAgICAgdmFyIGNvb3JkID0gY2xhc3Nlcy5SZXNpZHVlVmFyaWFibGUuZ2V0QWJzb2x1dGVDb29yZChzdGF0ZSwgbm9kZS5jeSgpKTtcbiAgICAgICAgY3VyckludGVyc2VjdGlvbnMgPSAkJC5zYmduLmludGVyc2VjdExpbmVFbGxpcHNlKHgsIHksIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgICAgY29vcmQueCwgY29vcmQueSwgaW5mb0JveFdpZHRoLCBpbmZvQm94SGVpZ2h0LCBwYWRkaW5nKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKCBzdGF0ZS5jbGF6eiA9PSBcImJpbmRpbmcgcmVnaW9uXCIgKSB7XG4gICAgICAgIHZhciBjb29yZCA9IGNsYXNzZXMuQmluZGluZ1JlZ2lvbi5nZXRBYnNvbHV0ZUNvb3JkKHN0YXRlLCBub2RlLmN5KCkpO1xuICAgICAgICBjdXJySW50ZXJzZWN0aW9ucyA9ICQkLnNiZ24uaW50ZXJzZWN0TGluZUVsbGlwc2UoeCwgeSwgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICAgICAgICBjb29yZC54LCBjb29yZC55LCBpbmZvQm94V2lkdGgsIGluZm9Cb3hIZWlnaHQsIHBhZGRpbmcpO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAoIHN0YXRlLmNsYXp6ID09IFwidW5pdCBvZiBpbmZvcm1hdGlvblwiICkge1xuICAgICAgICB2YXIgY29vcmQgPSBjbGFzc2VzLlVuaXRPZkluZm9ybWF0aW9uLmdldEFic29sdXRlQ29vcmQoc3RhdGUsIG5vZGUuY3koKSk7XG4gICAgICAgIGlmIChub2RlLmRhdGEoXCJjbGFzc1wiKSA9PSBcIkJBIG1hY3JvbW9sZWN1bGVcIiB8fCBub2RlLmRhdGEoXCJjbGFzc1wiKSA9PSBcIkJBIG51Y2xlaWMgYWNpZCBmZWF0dXJlXCJcbiAgICAgICAgICAgICAgICB8fCBub2RlLmRhdGEoXCJjbGFzc1wiKSA9PSBcIkJBIGNvbXBsZXhcIil7XG4gICAgICAgICAgY3VyckludGVyc2VjdGlvbnMgPSAkJC5zYmduLnJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZSh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgICAgIGNvb3JkLngsIGNvb3JkLnksIGluZm9Cb3hXaWR0aCwgaW5mb0JveEhlaWdodCwgNSwgcGFkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5kYXRhKFwiY2xhc3NcIikgPT0gXCJCQSB1bnNwZWNpZmllZCBlbnRpdHlcIil7XG4gICAgICAgICAgY3VyckludGVyc2VjdGlvbnMgPSAkJC5zYmduLmludGVyc2VjdExpbmVFbGxpcHNlKHgsIHksIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgIGNvb3JkLngsIGNvb3JkLnksIGluZm9Cb3hXaWR0aCwgaW5mb0JveEhlaWdodCwgcGFkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5kYXRhKFwiY2xhc3NcIikgPT0gXCJCQSBzaW1wbGUgY2hlbWljYWxcIil7XG4gICAgICAgICAgY3VyckludGVyc2VjdGlvbnMgPSBjeU1hdGguaW50ZXJzZWN0TGluZUNpcmNsZShcbiAgICAgICAgICAgICAgeCwgeSxcbiAgICAgICAgICAgICAgY2VudGVyWCwgY2VudGVyWSxcbiAgICAgICAgICAgICAgY29vcmQueCxcbiAgICAgICAgICAgICAgY29vcmQueSxcbiAgICAgICAgICAgICAgaW5mb0JveFdpZHRoIC8gNCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobm9kZS5kYXRhKFwiY2xhc3NcIikgPT0gXCJCQSBwZXJ0dXJiaW5nIGFnZW50XCIpe1xuICAgICAgICAgIGN1cnJJbnRlcnNlY3Rpb25zID0gJCQuc2Jnbi5wZXJ0dXJiaW5nQWdlbnRJbnRlcnNlY3RMaW5lKHgsIHksIGNlbnRlclgsIGNlbnRlclksXG4gICAgICAgICAgICAgIGNvb3JkLngsIGNvb3JkLnksIGluZm9Cb3hXaWR0aCwgaW5mb0JveEhlaWdodCwgcGFkZGluZyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgY3VyckludGVyc2VjdGlvbnMgPSAkJC5zYmduLnJvdW5kUmVjdGFuZ2xlSW50ZXJzZWN0TGluZSh4LCB5LCBjZW50ZXJYLCBjZW50ZXJZLFxuICAgICAgICAgICAgICAgICAgY29vcmQueCwgY29vcmQueSwgaW5mb0JveFdpZHRoLCBpbmZvQm94SGVpZ2h0LCAwLCBwYWRkaW5nKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpbnRlcnNlY3Rpb25zID0gaW50ZXJzZWN0aW9ucy5jb25jYXQoIGN1cnJJbnRlcnNlY3Rpb25zICk7XG5cbiAgICB9XG5cbiAgICByZXR1cm4gaW50ZXJzZWN0aW9ucztcbiAgfTtcblxuICAkJC5zYmduLmNoZWNrUG9pbnRTdGF0ZUFuZEluZm9Cb3hlcyA9IGZ1bmN0aW9uICh4LCB5LCBub2RlLCB0aHJlc2hvbGQpIHtcbiAgICByZXR1cm4gY2xhc3Nlcy5BdXhpbGlhcnlVbml0LmNoZWNrUG9pbnQoeCwgeSwgbm9kZSwgdGhyZXNob2xkKTtcbiAgfTtcblxuICAkJC5zYmduLmlzTm9kZVNoYXBlVG90YWxseU92ZXJyaWRlbiA9IGZ1bmN0aW9uIChyZW5kZXIsIG5vZGUpIHtcbiAgICBpZiAodG90YWxseU92ZXJyaWRlbk5vZGVTaGFwZXNbcmVuZGVyLmdldE5vZGVTaGFwZShub2RlKV0pIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHJldHVybiBmYWxzZTtcbiAgfTtcbn07XG4iXSwibmFtZXMiOlsibGlicyIsInJlcXVpcmUiLCJnZXRMaWJzIiwialF1ZXJ5IiwiJCIsImN5dG9zY2FwZSIsImN5TWF0aCIsIm1hdGgiLCJjeUJhc2VOb2RlU2hhcGVzIiwiYmFzZU5vZGVTaGFwZXMiLCJjeVN0eWxlUHJvcGVydGllcyIsInN0eWxlUHJvcGVydGllcyIsImNsYXNzZXMiLCJtb2R1bGUiLCJleHBvcnRzIiwiJCQiLCJzYmduIiwiZHJhd0JvcmRlciIsIl9yZWYiLCJjb250ZXh0Iiwibm9kZSIsImJvcmRlcldpZHRoIiwiYm9yZGVyQ29sb3IiLCJib3JkZXJTdHlsZSIsImJvcmRlck9wYWNpdHkiLCJwYXJzZUZsb2F0IiwiY3NzIiwicGFyZW50T3BhY2l0eSIsImVmZmVjdGl2ZU9wYWNpdHkiLCJwcm9wc1RvUmVzdG9yZSIsImluaXRpYWxQcm9wcyIsImZvckVhY2giLCJwcm9wTmFtZSIsImxpbmVXaWR0aCIsImxpbmVDYXAiLCJzdHJva2VTdHlsZSIsImdsb2JhbEFscGhhIiwic2V0TGluZURhc2giLCJzdHJva2UiLCJnY28iLCJnbG9iYWxDb21wb3NpdGVPcGVyYXRpb24iLCJkcmF3Um91bmRSZWN0YW5nbGVQYXRoIiwieCIsInkiLCJ3aWR0aCIsImhlaWdodCIsInJhZGl1cyIsImhhbGZXaWR0aCIsImhhbGZIZWlnaHQiLCJjb3JuZXJSYWRpdXMiLCJnZXRSb3VuZFJlY3RhbmdsZVJhZGl1cyIsImJlZ2luUGF0aCIsIm1vdmVUbyIsImFyY1RvIiwibGluZVRvIiwiY2xvc2VQYXRoIiwiZHJhd1Byb3RlaW5QYXRoIiwiZHJhd1Byb3RlaW4iLCJhY3RpdmVQYWRkaW5nMSIsImRyYXdSZWNlcHRvclBhdGgiLCJkcmF3UmVjZXB0b3IiLCJoYWxmUGFkZGluZyIsImhhbGZXIiwiaGFsZkgiLCJkcmF3Um91bmRlZERydWdQYXRoIiwiZHJhd1JvdW5kZWREcnVnIiwiTWF0aCIsIm1pbiIsImhhbGZXaWR0aElubmVyIiwiaGFsZkhlaWdodElubmVyIiwiZHJhd1BvbHlnb25QYXRoIiwicG9pbnRzIiwiaSIsImxlbmd0aCIsInNiZ25TaGFwZXMiLCJ0b3RhbGx5T3ZlcnJpZGVuTm9kZVNoYXBlcyIsImNhbkhhdmVJbmZvQm94U2hhcGVzIiwiY2FuQmVNdWx0aW1lclNoYXBlcyIsImNhbkJlQWN0aXZlU2hhcGVzIiwiY2FuQmVIeXBvdGhldGljYWxTaGFwZXMiLCJjYWxjdWxhdGVEaXN0YW5jZSIsInBvaW50MSIsInBvaW50MiIsImRpc3RhbmNlIiwicG93Iiwic3FydCIsImNvbG9ycyIsImNsb25lIiwiZ2V0RGVmYXVsdENvbXBsZXhDb3JuZXJMZW5ndGgiLCJnZXREZWZhdWx0R2VuZUNvcm5lckxlbmd0aCIsImRyYXdTdGF0ZUFuZEluZm9zIiwiY2VudGVyWCIsImNlbnRlclkiLCJsYXlvdXRzIiwiZGF0YSIsInNpZGUiLCJsYXlvdXQiLCJBdXhVbml0TGF5b3V0IiwiZHJhdyIsImN5IiwiZHJhd0luZm9Cb3giLCJzaGFwZU5hbWUiLCJkcmF3Qm90dG9tUm91bmRSZWN0YW5nbGUiLCJkcmF3Q29tcGxleCIsImdlbmVyYXRlUGVydHVyYmluZ0FnZW50UG9pbnRzIiwibnVjbGVpY0FjaWRDaGVja1BvaW50IiwicGFkZGluZyIsInBvaW50SW5zaWRlUG9seWdvbiIsImNoZWNrSW5FbGxpcHNlIiwiZm9yY2VPcGFjaXR5VG9PbmUiLCJmaWxsU3R5bGUiLCJfcHJpdmF0ZSIsInN0eWxlIiwidmFsdWUiLCJkcmF3U2ltcGxlQ2hlbWljYWxQYXRoIiwiZHJhd1NpbXBsZUNoZW1pY2FsIiwiZmlsbCIsInNpbXBsZUNoZW1pY2FsTGVmdENsb25lIiwiY2xvbmVNYXJrZXIiLCJvcGFjaXR5Iiwib2xkR2xvYmFsQWxwaGEiLCJvbGRTdHlsZSIsIm1hcmtlckJlZ2luWCIsInNpbiIsIlBJIiwibWFya2VyQmVnaW5ZIiwiY29zIiwibWFya2VyRW5kWCIsIm1hcmtlckVuZFkiLCJhcmMiLCJzaW1wbGVDaGVtaWNhbFJpZ2h0Q2xvbmUiLCJkcmF3RWxsaXBzZVBhdGgiLCJkcmF3UGF0aCIsImRyYXdCYXJyZWwiLCJkcmF3TnVjQWNpZEZlYXR1cmUyIiwibGVmdCIsInJpZ2h0IiwiYm90dG9tIiwidG9wIiwiZW5kc1dpdGgiLCJzdHIiLCJwYXR0ZXJuIiwibCIsImNoYXJBdCIsImlzTXVsdGltZXIiLCJzYmduQ2xhc3MiLCJpc0FjdGl2ZSIsInN0YXJ0c1dpdGgiLCJpc0h5cG90aGV0aWNhbCIsImluY2x1ZGVzIiwiZ2VuZXJhdGVDb21wbGV4U2hhcGVQb2ludHMiLCJjb3JuZXJMZW5ndGgiLCJjcFgiLCJjcFkiLCJjb21wbGV4UG9pbnRzIiwiZ2VuZXJhdGVHZW5lU2hhcGVQb2ludHMiLCJnZW5lcmF0ZVJOQVNoYXBlUG9pbnRzIiwiZ2VuZXJhdGVSZWNlcHRvclNoYXBlUG9pbnRzIiwiZ2V0RGVmYXVsdE11bHRpbWVyUGFkZGluZyIsImdldERlZmF1bHRBY3RpdmVQYWRkaW5nIiwiZHJhd0ltYWdlIiwiaW1nT2JqIiwiY2xpcCIsImltZyIsImltZ1ciLCJpbWdIIiwidyIsImgiLCJyZXN0b3JlIiwidHlwZXMiLCJub2RlU2hhcGUiLCJlbnVtcyIsInB1c2giLCJyZWdpc3RlclNiZ25Ob2RlU2hhcGVzIiwiZ2VuZXJhdGVEcmF3RmNuIiwiX3JlZjIiLCJwbGFpbkRyYXdGY24iLCJleHRyYURyYXdGY24iLCJjYW5CZU11bHRpbWVyIiwiY2xvbmVNYXJrZXJGY24iLCJjYW5CZUFjdGl2ZSIsImNhbkJlSHlwb3RoZXRpY2FsIiwiY2FuSGF2ZUluZm9Cb3giLCJtdWx0aW1lclBhZGRpbmciLCJhY3RpdmVQYWRkaW5nIiwib3V0ZXJXaWR0aCIsIm91dGVySGVpZ2h0IiwicG9zaXRpb24iLCJiZ09wYWNpdHkiLCJpc0Nsb25lZCIsImNsb25lbWFya2VyIiwiZHJhd09wZW5Jb25DaGFubmVsIiwiZHJhd0lvbkNoYW5uZWwiLCJnZW5lcmF0ZUludGVyc2VjdExpbmVGY24iLCJfcmVmMyIsInBsYWluSW50ZXJzZWN0TGluZUZjbiIsImludGVyc2VjdGlvbnMiLCJzdGF0ZUFuZEluZm9JbnRlcnNlY3RMaW5lcyIsImludGVyc2VjdExpbmVTdGF0ZUFuZEluZm9Cb3hlcyIsImNvbmNhdCIsIm5vZGVJbnRlcnNlY3RMaW5lcyIsIm11bHRpbWVySW50ZXJzZWN0aW9uTGluZXMiLCJhY3RpdmVJbnRlcnNlY3Rpb25MaW5lcyIsImh5cG90aGV0aWNhbEludGVyc2VjdGlvbkxpbmVzIiwiY2xvc2VzdEludGVyc2VjdGlvblBvaW50IiwiZ2VuZXJhdGVDaGVja1BvaW50RmNuIiwiX3JlZjQiLCJwbGFpbkNoZWNrUG9pbnRGY24iLCJ0aHJlc2hvbGQiLCJub2RlQ2hlY2siLCJzdGF0ZUFuZEluZm9DaGVjayIsImNoZWNrUG9pbnRTdGF0ZUFuZEluZm9Cb3hlcyIsIm11bHRpbWVyQ2hlY2siLCJhY3RpdmVDaGVjayIsImh5cG90aGV0aWNhbENoZWNrIiwic2hhcGVOYW1lcyIsInBsYWluRHJhdyIsInBsYWluSW50ZXJzZWN0TGluZSIsInBsYWluQ2hlY2tQb2ludCIsImV4dHJhRHJhdyIsImludGVyc2VjdExpbmUiLCJjaGVja1BvaW50Iiwic2hhcGUiLCJkcmF3RWxsaXBzZSIsImRyYXdUcnVuY2F0ZWRQcm90ZWluIiwiZHJhd0dlbmUiLCJkcmF3Uk5BIiwiZHJhd1BoZW5vdHlwZSIsImRyYXdDcm9zc0xpbmUiLCJnZW5lcmF0ZVVuaXROZ29uUG9pbnRzIiwic2NhbGVYIiwic2NhbGVZIiwiZHJhd0Jpb2xvZ2ljYWxBY3Rpdml0eSIsImdlbmVyYXRlQmlvbG9naWNhbEFjdGl2aXR5UG9pbnRzIiwiZHJhd1JvdW5kUmVjdGFuZ2xlIiwiZ2VuZXJhdGVOdWNsZWljQWNpZFBvaW50cyIsImdlbmVyYXRlVW5pdE5nb25Qb2ludHNGaXRUb1NxdWFyZSIsImdlbmVyYXRlQ29tcGFydG1lbnRQb2ludHMiLCJzaW1wbGVfY2hlbWljYWwiLCJtYWNyb21vbGVjdWxlIiwicm91bmRSZWN0YW5nbGVJbnRlcnNlY3RMaW5lIiwiY29tcGxleCIsInBvbHlnb25JbnRlcnNlY3RMaW5lIiwibnVjbGVpY19hY2lkX2ZlYXR1cmUiLCJlbXB0eV9zZXQiLCJkZWdyYWRhdGlvbiIsImJpb2xvZ2ljYWxfYWN0aXZpdHkiLCJjb21wYXJ0bWVudCIsIm9sZENvbXBhcnRtZW50IiwicHJvdGVpbiIsImdlbmUiLCJybmEiLCJyZWNlcHRvciIsImlvbl9jaGFubmVsIiwidHJ1bmNhdGVkX3Byb3RlaW4iLCJpb24iLCJzaW1wbGVfbW9sZWN1bGUiLCJ1bmtub3duX21vbGVjdWxlIiwiZHJ1ZyIsInBoZW5vdHlwZV9zYm1sIiwiY29tcGxleF9zYm1sIiwiZGlhbSIsImZpcnN0Q2lyY2xlQ2VudGVyWCIsImZpcnN0Q2lyY2xlQ2VudGVyWSIsInNlY29uZENpcmNsZUNlbnRlclgiLCJzZWNvbmRDaXJjbGVDZW50ZXJZIiwiYm90dG9tQ2lyY2xlQ2VudGVyWCIsImJvdHRvbUNpcmNsZUNlbnRlclkiLCJyZWNQb2ludHMiLCJjbG9uZVgiLCJjbG9uZVkiLCJjbG9uZVdpZHRoIiwiY2xvbmVIZWlnaHQiLCJtYXJrZXJQb2ludHMiLCJwb2ludCIsImNsb3Nlc3RJbnRlcnNlY3Rpb24iLCJtaW5EaXN0YW5jZSIsIk51bWJlciIsIk1BWF9WQUxVRSIsIm51Y2xlaWNBY2lkSW50ZXJzZWN0aW9uTGluZSIsIm5vZGVYIiwibm9kZVkiLCJzdHJhaWdodExpbmVJbnRlcnNlY3Rpb25zIiwidG9wU3RhcnRYIiwidG9wU3RhcnRZIiwidG9wRW5kWCIsInRvcEVuZFkiLCJmaW5pdGVMaW5lc0ludGVyc2VjdCIsInJpZ2h0U3RhcnRYIiwicmlnaHRTdGFydFkiLCJyaWdodEVuZFgiLCJyaWdodEVuZFkiLCJib3R0b21TdGFydFgiLCJib3R0b21TdGFydFkiLCJib3R0b21FbmRYIiwiYm90dG9tRW5kWSIsImxlZnRTdGFydFgiLCJsZWZ0U3RhcnRZIiwibGVmdEVuZFgiLCJsZWZ0RW5kWSIsImFyY0ludGVyc2VjdGlvbnMiLCJib3R0b21SaWdodENlbnRlclgiLCJib3R0b21SaWdodENlbnRlclkiLCJpbnRlcnNlY3RMaW5lQ2lyY2xlIiwiYm90dG9tTGVmdENlbnRlclgiLCJib3R0b21MZWZ0Q2VudGVyWSIsInBlcnR1cmJpbmdBZ2VudEludGVyc2VjdExpbmUiLCJ4MSIsInkxIiwieDIiLCJ5MiIsImludGVyc2VjdGlvbiIsInRvcExlZnRDZW50ZXJYIiwidG9wTGVmdENlbnRlclkiLCJ0b3BSaWdodENlbnRlclgiLCJ0b3BSaWdodENlbnRlclkiLCJpbnRlcnNlY3RMaW5lRWxsaXBzZSIsImFuIiwiYm4iLCJkIiwibSIsIm4iLCJhIiwiYiIsImMiLCJkaXNjcmltaW5hbnQiLCJ0MSIsInQyIiwieE1pbiIsInhNYXgiLCJtYXgiLCJ5TWluIiwieU1heCIsInBhcnNlSW50Iiwic3RhdGVBbmRJbmZvcyIsInN0YXRlc2FuZGluZm9zIiwic3RhdGUiLCJpc0Rpc3BsYXllZCIsImluZm9Cb3hXaWR0aCIsImJib3giLCJpbmZvQm94SGVpZ2h0IiwiY3VyckludGVyc2VjdGlvbnMiLCJjbGF6eiIsImNvb3JkIiwiU3RhdGVWYXJpYWJsZSIsImdldEFic29sdXRlQ29vcmQiLCJSZXNpZHVlVmFyaWFibGUiLCJCaW5kaW5nUmVnaW9uIiwiVW5pdE9mSW5mb3JtYXRpb24iLCJBdXhpbGlhcnlVbml0IiwiaXNOb2RlU2hhcGVUb3RhbGx5T3ZlcnJpZGVuIiwicmVuZGVyIiwiZ2V0Tm9kZVNoYXBlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/sbgn-extensions/sbgn-cy-renderer.js\n"); /***/ }), @@ -55,7 +55,7 @@ eval("/*\n * Render sbgn specific shapes which are not supported by cytoscape.js \*********************************************************/ /***/ ((module) => { -eval("module.exports = function () {\n var jsonToSbgnml, elementUtilities, cy;\n function cdToSbgnml(param) {\n jsonToSbgnml = param.jsonToSbgnmlConverter;\n elementUtilities = param.elementUtilities;\n cy = param.sbgnCyInstance.getCy();\n }\n cdToSbgnml.convert = function (xml, callback) {\n $.ajax({\n type: 'post',\n url: \"http://web.newteditor.org:8080/cd2sbgnml\",\n data: xml,\n success: function success(data) {\n callback(data);\n },\n error: function error(_error) {\n callback(null);\n }\n });\n };\n return cdToSbgnml;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbGl0aWVzL2NkLXRvLXNiZ25tbC1jb252ZXJ0ZXItZmFjdG9yeS5qcyIsIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJqc29uVG9TYmdubWwiLCJlbGVtZW50VXRpbGl0aWVzIiwiY3kiLCJjZFRvU2Jnbm1sIiwicGFyYW0iLCJqc29uVG9TYmdubWxDb252ZXJ0ZXIiLCJzYmduQ3lJbnN0YW5jZSIsImdldEN5IiwiY29udmVydCIsInhtbCIsImNhbGxiYWNrIiwiJCIsImFqYXgiLCJ0eXBlIiwidXJsIiwiZGF0YSIsInN1Y2Nlc3MiLCJlcnJvciJdLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2JnbnZpei8uL3NyYy91dGlsaXRpZXMvY2QtdG8tc2Jnbm1sLWNvbnZlcnRlci1mYWN0b3J5LmpzPzU2ODMiXSwic291cmNlc0NvbnRlbnQiOlsiXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG5cbiAgICB2YXIganNvblRvU2Jnbm1sLCBlbGVtZW50VXRpbGl0aWVzLCBjeTtcbiAgXG4gICAgZnVuY3Rpb24gY2RUb1NiZ25tbChwYXJhbSkge1xuICAgICAganNvblRvU2Jnbm1sID0gcGFyYW0uanNvblRvU2Jnbm1sQ29udmVydGVyO1xuICAgICAgZWxlbWVudFV0aWxpdGllcyA9IHBhcmFtLmVsZW1lbnRVdGlsaXRpZXM7XG4gICAgICBjeSA9IHBhcmFtLnNiZ25DeUluc3RhbmNlLmdldEN5KCk7XG4gICAgfVxuICBcbiBcbiAgICBjZFRvU2Jnbm1sLmNvbnZlcnQgPSBmdW5jdGlvbiAoeG1sLGNhbGxiYWNrKSB7XG5cbiAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgIHR5cGU6ICdwb3N0JyxcbiAgICAgICAgICAgIHVybDogXCJodHRwOi8vd2ViLm5ld3RlZGl0b3Iub3JnOjgwODAvY2Qyc2Jnbm1sXCIsXG4gICAgICAgICAgICBkYXRhOiB4bWwsXG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGRhdGEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gY2RUb1NiZ25tbDtcbiAgXG4gIH1cbiAgXG5cbiJdLCJtYXBwaW5ncyI6IkFBRUFBLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHLFlBQVc7RUFFeEIsSUFBSUMsWUFBWSxFQUFFQyxnQkFBZ0IsRUFBRUMsRUFBRTtFQUV0QyxTQUFTQyxVQUFVQSxDQUFDQyxLQUFLLEVBQUU7SUFDekJKLFlBQVksR0FBR0ksS0FBSyxDQUFDQyxxQkFBcUI7SUFDMUNKLGdCQUFnQixHQUFHRyxLQUFLLENBQUNILGdCQUFnQjtJQUN6Q0MsRUFBRSxHQUFHRSxLQUFLLENBQUNFLGNBQWMsQ0FBQ0MsS0FBSyxDQUFDLENBQUM7RUFDbkM7RUFHQUosVUFBVSxDQUFDSyxPQUFPLEdBQUcsVUFBVUMsR0FBRyxFQUFDQyxRQUFRLEVBQUU7SUFFekNDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDO01BQ0hDLElBQUksRUFBRSxNQUFNO01BQ1pDLEdBQUcsRUFBRSwwQ0FBMEM7TUFDL0NDLElBQUksRUFBRU4sR0FBRztNQUNUTyxPQUFPLEVBQUUsU0FBQUEsUUFBVUQsSUFBSSxFQUFFO1FBQ3JCTCxRQUFRLENBQUNLLElBQUksQ0FBQztNQUNsQixDQUFDO01BQ0RFLEtBQUssRUFBRSxTQUFBQSxNQUFVQSxNQUFLLEVBQUU7UUFDdkJQLFFBQVEsQ0FBQyxJQUFJLENBQUM7TUFDZjtJQUNKLENBQUMsQ0FBQztFQUNOLENBQUM7RUFFRCxPQUFPUCxVQUFVO0FBRW5CLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=\n//# sourceURL=webpack-internal:///./src/utilities/cd-to-sbgnml-converter-factory.js\n"); +eval("module.exports = function () {\n var jsonToSbgnml, elementUtilities, cy;\n function cdToSbgnml(param) {\n jsonToSbgnml = param.jsonToSbgnmlConverter;\n elementUtilities = param.elementUtilities;\n cy = param.sbgnCyInstance.getCy();\n }\n cdToSbgnml.convert = function (xml, callback) {\n $.ajax({\n type: 'post',\n url: \"http://web.newteditor.org:8080/cd2sbgnml\",\n data: xml,\n success: function success(data) {\n callback(data);\n },\n error: function error(_error) {\n callback(null);\n }\n });\n };\n return cdToSbgnml;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbGl0aWVzL2NkLXRvLXNiZ25tbC1jb252ZXJ0ZXItZmFjdG9yeS5qcyIsIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJqc29uVG9TYmdubWwiLCJlbGVtZW50VXRpbGl0aWVzIiwiY3kiLCJjZFRvU2Jnbm1sIiwicGFyYW0iLCJqc29uVG9TYmdubWxDb252ZXJ0ZXIiLCJzYmduQ3lJbnN0YW5jZSIsImdldEN5IiwiY29udmVydCIsInhtbCIsImNhbGxiYWNrIiwiJCIsImFqYXgiLCJ0eXBlIiwidXJsIiwiZGF0YSIsInN1Y2Nlc3MiLCJlcnJvciJdLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2JnbnZpei8uL3NyYy91dGlsaXRpZXMvY2QtdG8tc2Jnbm1sLWNvbnZlcnRlci1mYWN0b3J5LmpzPzU2ODMiXSwic291cmNlc0NvbnRlbnQiOlsiXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG5cbiAgICB2YXIganNvblRvU2Jnbm1sLCBlbGVtZW50VXRpbGl0aWVzLCBjeTtcbiAgXG4gICAgZnVuY3Rpb24gY2RUb1NiZ25tbChwYXJhbSkge1xuICAgICAganNvblRvU2Jnbm1sID0gcGFyYW0uanNvblRvU2Jnbm1sQ29udmVydGVyO1xuICAgICAgZWxlbWVudFV0aWxpdGllcyA9IHBhcmFtLmVsZW1lbnRVdGlsaXRpZXM7XG4gICAgICBjeSA9IHBhcmFtLnNiZ25DeUluc3RhbmNlLmdldEN5KCk7XG4gICAgfVxuICBcbiBcbiAgICBjZFRvU2Jnbm1sLmNvbnZlcnQgPSBmdW5jdGlvbiAoeG1sLGNhbGxiYWNrKSB7XG5cbiAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgIHR5cGU6ICdwb3N0JyxcbiAgICAgICAgICAgIHVybDogXCJodHRwOi8vd2ViLm5ld3RlZGl0b3Iub3JnOjgwODAvY2Qyc2Jnbm1sXCIsXG4gICAgICAgICAgICBkYXRhOiB4bWwsXG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKGRhdGEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICBjYWxsYmFjayhudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gY2RUb1NiZ25tbDtcbiAgXG4gIH1cbiAgXG5cbiJdLCJtYXBwaW5ncyI6IkFBRUFBLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHLFlBQVc7RUFFeEIsSUFBSUMsWUFBWSxFQUFFQyxnQkFBZ0IsRUFBRUMsRUFBRTtFQUV0QyxTQUFTQyxVQUFVQSxDQUFDQyxLQUFLLEVBQUU7SUFDekJKLFlBQVksR0FBR0ksS0FBSyxDQUFDQyxxQkFBcUI7SUFDMUNKLGdCQUFnQixHQUFHRyxLQUFLLENBQUNILGdCQUFnQjtJQUN6Q0MsRUFBRSxHQUFHRSxLQUFLLENBQUNFLGNBQWMsQ0FBQ0MsS0FBSyxDQUFDLENBQUM7RUFDbkM7RUFHQUosVUFBVSxDQUFDSyxPQUFPLEdBQUcsVUFBVUMsR0FBRyxFQUFDQyxRQUFRLEVBQUU7SUFFekNDLENBQUMsQ0FBQ0MsSUFBSSxDQUFDO01BQ0hDLElBQUksRUFBRSxNQUFNO01BQ1pDLEdBQUcsRUFBRSwwQ0FBMEM7TUFDL0NDLElBQUksRUFBRU4sR0FBRztNQUNUTyxPQUFPLEVBQUUsU0FBVEEsT0FBT0EsQ0FBWUQsSUFBSSxFQUFFO1FBQ3JCTCxRQUFRLENBQUNLLElBQUksQ0FBQztNQUNsQixDQUFDO01BQ0RFLEtBQUssRUFBRSxTQUFQQSxLQUFLQSxDQUFZQSxNQUFLLEVBQUU7UUFDdkJQLFFBQVEsQ0FBQyxJQUFJLENBQUM7TUFDZjtJQUNKLENBQUMsQ0FBQztFQUNOLENBQUM7RUFFRCxPQUFPUCxVQUFVO0FBRW5CLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=\n//# sourceURL=webpack-internal:///./src/utilities/cd-to-sbgnml-converter-factory.js\n"); /***/ }), @@ -95,7 +95,7 @@ eval("module.exports = function () {\n var cy;\n var parsedDataMap;\n var vis \*************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { -eval("/* provided dependency */ var console = __webpack_require__(/*! ./node_modules/console-browserify/index.js */ \"./node_modules/console-browserify/index.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = \"function\" == typeof Symbol ? Symbol : {}, a = i.iterator || \"@@iterator\", c = i.asyncIterator || \"@@asyncIterator\", u = i.toStringTag || \"@@toStringTag\"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, \"\"); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, \"_invoke\", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: \"normal\", arg: t.call(e, r) }; } catch (t) { return { type: \"throw\", arg: t }; } } e.wrap = wrap; var h = \"suspendedStart\", l = \"suspendedYield\", f = \"executing\", s = \"completed\", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { [\"next\", \"throw\", \"return\"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if (\"throw\" !== c.type) { var u = c.arg, h = u.value; return h && \"object\" == _typeof(h) && n.call(h, \"__await\") ? e.resolve(h.__await).then(function (t) { invoke(\"next\", t, i, a); }, function (t) { invoke(\"throw\", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke(\"throw\", t, i, a); }); } a(c.arg); } var r; o(this, \"_invoke\", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error(\"Generator is already running\"); if (o === s) { if (\"throw\" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if (\"next\" === n.method) n.sent = n._sent = n.arg;else if (\"throw\" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else \"return\" === n.method && n.abrupt(\"return\", n.arg); o = f; var p = tryCatch(e, r, n); if (\"normal\" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } \"throw\" === p.type && (o = s, n.method = \"throw\", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, \"throw\" === n && e.iterator[\"return\"] && (r.method = \"return\", r.arg = t, maybeInvokeDelegate(e, r), \"throw\" === r.method) || \"return\" !== n && (r.method = \"throw\", r.arg = new TypeError(\"The iterator does not provide a '\" + n + \"' method\")), y; var i = tryCatch(o, e.iterator, r.arg); if (\"throw\" === i.type) return r.method = \"throw\", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, \"return\" !== r.method && (r.method = \"next\", r.arg = t), r.delegate = null, y) : a : (r.method = \"throw\", r.arg = new TypeError(\"iterator result is not an object\"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = \"normal\", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: \"root\" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || \"\" === e) { var r = e[a]; if (r) return r.call(e); if (\"function\" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + \" is not iterable\"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, \"GeneratorFunction\"), e.isGeneratorFunction = function (t) { var e = \"function\" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || \"GeneratorFunction\" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, \"GeneratorFunction\")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, \"Generator\"), define(g, a, function () { return this; }), define(g, \"toString\", function () { return \"[object Generator]\"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) \"t\" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if (\"throw\" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = \"throw\", a.arg = e, r.next = n, o && (r.method = \"next\", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if (\"root\" === i.tryLoc) return handle(\"end\"); if (i.tryLoc <= this.prev) { var c = n.call(i, \"catchLoc\"), u = n.call(i, \"finallyLoc\"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error(\"try statement without catch or finally\"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, \"finallyLoc\") && this.prev < o.finallyLoc) { var i = o; break; } } i && (\"break\" === t || \"continue\" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = \"next\", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if (\"throw\" === t.type) throw t.arg; return \"break\" === t.type || \"continue\" === t.type ? this.next = t.arg : \"return\" === t.type ? (this.rval = this.arg = t.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, \"catch\": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if (\"throw\" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, \"next\" === this.method && (this.arg = t), y; } }, e; }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\n/*\n* File Utilities: To be used on read/write file operation\n*/\n\nvar libUtilities = __webpack_require__(/*! ./lib-utilities */ \"./src/utilities/lib-utilities.js\");\nvar libs = libUtilities.getLibs();\nvar jQuery = $ = libs.jQuery;\nvar saveAs = libs.saveAs;\nvar textUtilities = __webpack_require__(/*! ./text-utilities */ \"./src/utilities/text-utilities.js\");\nmodule.exports = function () {\n // Helper functions Start\n // see http://stackoverflow.com/questions/16245767/creating-a-blob-from-a-base64-string-in-javascript\n function b64toBlob(b64Data, contentType, sliceSize) {\n contentType = contentType || '';\n sliceSize = sliceSize || 512;\n var byteCharacters = atob(b64Data);\n var byteArrays = [];\n for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {\n var slice = byteCharacters.slice(offset, offset + sliceSize);\n var byteNumbers = new Array(slice.length);\n for (var i = 0; i < slice.length; i++) {\n byteNumbers[i] = slice.charCodeAt(i);\n }\n var byteArray = new Uint8Array(byteNumbers);\n byteArrays.push(byteArray);\n }\n var blob = new Blob(byteArrays, {\n type: contentType\n });\n return blob;\n }\n function loadTextDoc(fullFilePath) {\n if (window.XMLHttpRequest) {\n xhttp = new XMLHttpRequest();\n } else {\n xhttp = new ActiveXObject(\"Microsoft.XMLHTTP\");\n }\n xhttp.overrideMimeType('application/text');\n xhttp.open(\"GET\", fullFilePath, false);\n xhttp.send();\n return xhttp.responseText;\n }\n function loadXMLDoc(fullFilePath) {\n if (window.XMLHttpRequest) {\n xhttp = new XMLHttpRequest();\n } else {\n xhttp = new ActiveXObject(\"Microsoft.XMLHTTP\");\n }\n xhttp.overrideMimeType('application/xml');\n xhttp.open(\"GET\", fullFilePath, false);\n xhttp.send();\n return xhttp.responseXML;\n }\n\n // Should this be exposed or should this be moved to the helper functions section?\n function textToXmlObject(text) {\n if (window.ActiveXObject) {\n var doc = new ActiveXObject('Microsoft.XMLDOM');\n doc.async = 'false';\n doc.loadXML(text);\n } else {\n var parser = new DOMParser();\n var doc = parser.parseFromString(text, 'text/xml');\n }\n return doc;\n }\n // Helper functions End\n\n var sbgnmlToJson, sbmlToJson, jsonToSbgnml, jsonToSbml, jsonToNwt, uiUtilities, tdToJson, sifToJson, graphUtilities, layoutToText, nwtToJson, jsonToSif, sbgnmlToCd, cdToSbgnml, sbgnmlToSbml, sbmlToSbgnml;\n var updateGraph;\n var options, cy;\n function fileUtilities(param) {\n sbgnmlToJson = param.sbgnmlToJsonConverter;\n sbmlToJson = param.sbmlToJsonConverter;\n nwtToJson = param.nwtToJsonConverter;\n jsonToSbgnml = param.jsonToSbgnmlConverter;\n jsonToSbml = param.jsonToSbmlConverter;\n jsonToNwt = param.jsonToNwtConverter;\n jsonToSif = param.jsonToSifConverter;\n uiUtilities = param.uiUtilities;\n tdToJson = param.tdToJsonConverter;\n sifToJson = param.sifToJsonConverter;\n layoutToText = param.layoutToText;\n graphUtilities = param.graphUtilities;\n updateGraph = graphUtilities.updateGraph.bind(graphUtilities);\n options = param.optionUtilities.getOptions();\n cy = param.sbgnCyInstance.getCy();\n sbgnmlToCd = param.sbgnmlToCdConverter;\n cdToSbgnml = param.cdToSbgnmlConverter;\n sbgnmlToSbml = param.sbgnmlToSbmlConverter;\n sbmlToSbgnml = param.sbmlToSbgnmlConverter;\n gpmlToSbgnml = param.gpmlToSbgnmlConverter;\n sbgnmlToGpml = param.sbgnmlToGpmlConverter;\n }\n fileUtilities.loadXMLDoc = loadXMLDoc;\n fileUtilities.textToXmlObject = textToXmlObject;\n fileUtilities.saveAsPng = function (filename, scale, bg, maxWidth, maxHeight) {\n if (maxWidth || maxHeight) {\n var pngContent = cy.png({\n full: true,\n bg: bg,\n maxWidth: maxWidth,\n maxHeight: maxHeight\n });\n } else {\n var pngContent = cy.png({\n scale: scale || 3,\n full: true,\n bg: bg\n });\n }\n\n // this is to remove the beginning of the pngContent: data:img/png;base64,\n var b64data = pngContent.substr(pngContent.indexOf(\",\") + 1);\n\n // lower quality when response is empty\n if (!b64data || b64data === \"\") {\n pngContent = cy.png({\n maxWidth: 15000,\n maxHeight: 15000,\n full: true,\n bg: bg\n });\n b64data = pngContent.substr(pngContent.indexOf(\",\") + 1);\n }\n saveAs(b64toBlob(b64data, \"image/png\"), filename || \"network.png\");\n };\n fileUtilities.saveAsJpg = function (filename, scale, bg, maxWidth, maxHeight, quality) {\n if (maxWidth || maxHeight) {\n var jpgContent = cy.jpg({\n full: true,\n bg: bg,\n maxWidth: maxWidth,\n maxHeight: maxHeight,\n quality: quality\n });\n } else {\n var jpgContent = cy.jpg({\n scale: scale || 3,\n full: true,\n bg: bg,\n quality: quality\n });\n }\n\n // this is to remove the beginning of the pngContent: data:img/png;base64,\n var b64data = jpgContent.substr(jpgContent.indexOf(\",\") + 1);\n\n // lower quality when response is empty\n if (!b64data || b64data === \"\") {\n jpgContent = cy.jpg({\n maxWidth: 15000,\n maxHeight: 15000,\n full: true,\n bg: bg\n });\n b64data = jpgContent.substr(jpgContent.indexOf(\",\") + 1);\n }\n saveAs(b64toBlob(b64data, \"image/jpg\"), filename || \"network.jpg\");\n };\n fileUtilities.saveAsSvg = function (filename, scale, bg, maxWidth, maxHeight) {\n if (maxWidth || maxHeight) {\n var svgContent = cy.svg({\n full: true,\n bg: bg,\n maxWidth: maxWidth,\n maxHeight: maxHeight\n });\n } else {\n var svgContent = cy.svg({\n scale: scale || 1,\n full: true,\n bg: bg\n });\n }\n saveAs(new Blob([svgContent], {\n type: \"image/svg+xml;charset=utf-8\"\n }), filename || \"network.svg\");\n };\n fileUtilities.loadSample = function (filename, folderpath, callback) {\n var file = (folderpath || 'sample-app/samples/') + filename;\n uiUtilities.startSpinner(\"load-spinner\");\n // Users may want to do customized things while a sample is being loaded\n // Trigger an event for this purpose and specify the 'filename' as an event parameter\n $(document).trigger(\"sbgnvizLoadSample\", [filename, cy]); // Aliases for sbgnvizLoadSampleStart\n $(document).trigger(\"sbgnvizLoadSampleStart\", [filename, cy]);\n var text = loadTextDoc(file);\n var matchResult = text.match(\"\");\n if (matchResult != null) {\n var renderInfoString = matchResult[0];\n var renderInfoStringCopy = (' ' + renderInfoString).slice(1);\n var regex = /\\s([\\S]+)([\\s]*)=/g;\n var result;\n var matches = [];\n while (result = regex.exec(renderInfoString)) {\n matches.push(result[0]);\n }\n ;\n matches.forEach(function (match) {\n renderInfoString = renderInfoString.replace(match, textUtilities.FromKebabToCamelCase(match));\n });\n text = text.replace(renderInfoStringCopy, renderInfoString);\n }\n var xmlObject = textToXmlObject(text);\n setTimeout(function () {\n updateGraph(nwtToJson.convert(xmlObject));\n fileUtilities.collapseMarkedNodes();\n uiUtilities.endSpinner(\"load-spinner\");\n $(document).trigger(\"sbgnvizLoadSampleEnd\", [filename, cy]); // Trigger an event signaling that a sample is loaded\n if (typeof callback !== 'undefined') {\n callback();\n }\n }, 0);\n };\n fileUtilities.loadSIFFile = function (file, layoutBy, callback) {\n var convert = function convert(text) {\n return sifToJson.convert(text);\n };\n var runLayout = function runLayout() {\n if (layoutBy) {\n if (typeof layoutBy === 'function') {\n layoutBy();\n } else {\n var layout = cy.layout(layoutBy);\n\n // for backward compatibility need to make this if check\n if (layout && layout.run) {\n layout.run();\n }\n }\n }\n cy.fit(cy.elements(\":visible\"), 20);\n };\n fileUtilities.loadFile(file, convert, undefined, callback, undefined, runLayout);\n };\n fileUtilities.loadTDFile = function functionName(file, callback) {\n var convert = function convert(text) {\n return tdToJson.convert(text);\n };\n fileUtilities.loadFile(file, convert, undefined, callback);\n };\n fileUtilities.loadSBGNMLFile = function (file, callback1, callback2) {\n var convert = function convert(text) {\n return sbgnmlToJson.convert(textToXmlObject(text));\n };\n fileUtilities.loadFile(file, convert, callback1, callback2, fileUtilities.collapseMarkedNodes);\n };\n fileUtilities.loadNwtFile = function (file, callback1, callback2, urlParams) {\n var convert = function convert(text) {\n return nwtToJson.convert(textToXmlObject(text), urlParams);\n };\n fileUtilities.loadFile(file, convert, callback1, callback2, fileUtilities.collapseMarkedNodes);\n };\n\n // collapse the nodes whose collapse data field is set\n fileUtilities.collapseMarkedNodes = function () {\n // collapse nodes\n var nodesToCollapse = cy.nodes(\"[collapse]\");\n if (nodesToCollapse.length > 0) {\n cy.expandCollapse('get').collapse(nodesToCollapse, {\n layoutBy: null\n });\n nodesToCollapse.forEach(function (ele, i, eles) {\n ele.position(ele.data(\"positionBeforeSaving\"));\n });\n nodesToCollapse.removeData(\"positionBeforeSaving\");\n }\n };\n\n /*\n callback is a function remotely defined to add specific behavior that isn't implemented here.\n it is completely optional.\n signature: callback(textXml)\n */\n fileUtilities.loadFile = function (file, convertFcn, callback1, callback2, callback3, callback4) {\n var self = this;\n uiUtilities.startSpinner(\"load-file-spinner\");\n var textType = /text.*/;\n var reader = new FileReader();\n reader.onload = function (e) {\n var text = this.result;\n var matchResult = text.match(\"\");\n if (matchResult != null) {\n var imagesElementMatch = text.match(\"\");\n var imagesElement;\n if (imagesElementMatch != null) {\n imagesElement = imagesElementMatch[0];\n }\n var renderInfoString = matchResult[0];\n var renderInfoStringCopy = (' ' + renderInfoString).slice(1);\n var regex = /\\s([\\S]+)([\\s]*)=/g;\n var result;\n var matches = [];\n while (result = regex.exec(renderInfoString)) {\n matches.push(result[0]);\n }\n ;\n matches.forEach(function (match) {\n renderInfoString = renderInfoString.replace(match, textUtilities.FromKebabToCamelCase(match));\n });\n text = text.replace(renderInfoStringCopy, renderInfoString);\n var imagesElementMatchDirty = text.match(\"\");\n if (imagesElementMatchDirty != null) {\n text = text.replace(imagesElementMatchDirty[0], imagesElement);\n }\n }\n setTimeout(function () {\n if (typeof callback1 !== 'undefined') callback1(text);\n var cyGraph;\n try {\n cyGraph = convertFcn(text);\n // Users may want to do customized things while an external file is being loaded\n // Trigger an event for this purpose and specify the 'filename' as an event parameter\n $(document).trigger(\"sbgnvizLoadFile\", [file.name, cy]); // Aliases for sbgnvizLoadFileStart\n $(document).trigger(\"sbgnvizLoadFileStart\", [file.name, cy]);\n } catch (err) {\n uiUtilities.endSpinner(\"load-file-spinner\");\n console.log(err);\n if (typeof callback2 !== 'undefined') callback2();\n return;\n }\n updateGraph(cyGraph);\n if (typeof callback3 !== 'undefined') {\n callback3();\n }\n uiUtilities.endSpinner(\"load-file-spinner\");\n $(document).trigger(\"sbgnvizLoadFileEnd\", [file.name, cy]); // Trigger an event signaling that a file is loaded\n\n if (typeof callback4 !== 'undefined') {\n callback4();\n }\n }, 0);\n };\n reader.readAsText(file);\n };\n fileUtilities.loadSBGNMLText = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee(textData, tileInfoBoxes, filename, cy, urlParams) {\n return _regeneratorRuntime().wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n _context.next = 2;\n return updateGraph(sbgnmlToJson.convert(textToXmlObject(textData), urlParams), undefined, undefined, tileInfoBoxes);\n case 2:\n _context.next = 4;\n return $(document).trigger(\"sbgnvizLoadFileEnd\", [filename, cy]);\n case 4:\n uiUtilities.endSpinner(\"load-file-spinner\");\n case 5:\n case \"end\":\n return _context.stop();\n }\n }, _callee);\n }));\n return function (_x, _x2, _x3, _x4, _x5) {\n return _ref.apply(this, arguments);\n };\n }();\n fileUtilities.loadSBMLText = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee2(textData, tileInfoBoxes, filename, cy, urlParams) {\n return _regeneratorRuntime().wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return updateGraph(sbmlToJson.convert(textToXmlObject(textData), urlParams), undefined, undefined, tileInfoBoxes);\n case 2:\n _context2.next = 4;\n return $(document).trigger(\"sbgnvizLoadFileEnd\", [filename, cy]);\n case 4:\n uiUtilities.endSpinner(\"load-file-spinner\");\n case 5:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2);\n }));\n return function (_x6, _x7, _x8, _x9, _x10) {\n return _ref2.apply(this, arguments);\n };\n }();\n\n // supported versions are either 0.2 or 0.3\n fileUtilities.saveAsSbgnml = function (filename, version, renderInfo, mapProperties, nodes, edges) {\n var sbgnmlText = jsonToSbgnml.createSbgnml(filename, version, renderInfo, mapProperties, nodes, edges);\n var blob = new Blob([sbgnmlText], {\n type: \"text/plain;charset=utf-8;\"\n });\n saveAs(blob, filename);\n };\n fileUtilities.saveAsSbgnmlForSBML = function (filename, errorCallback) {\n // We have sbml map typed nodes and edges in the cytoscape graph and we want to export to sbgnml\n // Create sbml file first, then get the sbgnml from the Minerva conversion service\n uiUtilities.startSpinner(\"load-file-spinner\");\n var sbgnText = jsonToSbml.createSbml(filename);\n //convert sbml to sbgnml\n this.convertSbmlToSbgnml(sbgnText, function (data) {\n if (!data.result) {\n errorCallback();\n } else {\n var blob = new Blob([data.message], {\n type: \"text/plain;charset=utf-8;\"\n });\n saveAs(blob, filename);\n }\n uiUtilities.endSpinner(\"load-file-spinner\");\n }.bind(this));\n };\n\n // supported versions are either 0.2 or 0.3\n fileUtilities.saveAsNwt = function (filename, version, renderInfo, mapProperties, nodes, edges) {\n var sbgnmlText = jsonToNwt.createNwt(filename, version, renderInfo, mapProperties, nodes, edges);\n var blob = new Blob([sbgnmlText], {\n type: \"text/plain;charset=utf-8;\"\n });\n saveAs(blob, filename);\n };\n fileUtilities.saveAsCellDesigner = function (filename, errorCallback) {\n uiUtilities.startSpinner(\"load-spinner\");\n var sbgnml = jsonToSbgnml.createSbgnml();\n this.convertSbgnmlToCD(sbgnml, function (data) {\n if (data == null) {\n errorCallback();\n } else {\n var blob = new Blob([data], {\n type: \"text/plain;charset=utf-8;\"\n });\n saveAs(blob, filename);\n }\n uiUtilities.endSpinner(\"load-spinner\");\n });\n };\n fileUtilities.loadCellDesigner = function (file, successCallback, errorCallback) {\n var reader = new FileReader();\n reader.onload = function (e) {\n // this.convertCDToSbgnml(e.target.result, function(data){\n cdToSbgnml.convert(e.target.result, function (data) {\n uiUtilities.endSpinner(\"load-spinner\");\n if (data == null) {\n errorCallback();\n } else {\n successCallback(data);\n }\n });\n }.bind(this);\n uiUtilities.startSpinner(\"load-spinner\");\n reader.readAsText(file);\n };\n fileUtilities.saveAsSbml = function (filename, errorCallback) {\n uiUtilities.startSpinner(\"load-spinner\");\n var sbgnml = this.convertSbgn();\n this.convertSbgnmlToSbml(sbgnml, function (data) {\n if (!data.result) {\n errorCallback(sbgnml, data.error);\n } else if (data.message.indexOf(\"Internal server error\") !== -1) {\n errorCallback(sbgnml, data.message);\n } else {\n var blob = new Blob([data.message], {\n type: \"text/plain;charset=utf-8;\"\n });\n saveAs(blob, filename);\n }\n uiUtilities.endSpinner(\"load-spinner\");\n });\n };\n fileUtilities.saveSbmlForSBML = function (filename, errorCallback) {\n uiUtilities.startSpinner(\"load-spinner\");\n try {\n var sbgnText = jsonToSbml.createSbml(filename);\n var blob = new Blob([sbgnText], {\n type: \"text/plain;charset=utf-8;\"\n });\n saveAs(blob, filename);\n } catch (err) {\n errorCallback();\n }\n uiUtilities.endSpinner(\"load-spinner\");\n };\n fileUtilities.hasLayoutSBML = function (file) {\n return new Promise(function (resolve, reject) {\n var reader = new FileReader();\n var layoutFound = false;\n reader.onload = function (e) {\n var text = this.result;\n var matchResult = text.match(/<[^>]*listOfLayouts[^>]*>[\\s\\S]*<\\/[^>]*listOfLayouts[^>]*>/);\n if (matchResult != null) {\n layoutFound = true;\n }\n resolve(layoutFound);\n };\n reader.onerror = function () {\n reject(new Error(\"Failed to read the file\"));\n };\n reader.readAsText(file);\n });\n };\n fileUtilities.loadSbmlForSBML = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime().mark(function _callee3(file, callback1, callback2, layoutBy) {\n var convert, runLayout, layoutFound;\n return _regeneratorRuntime().wrap(function _callee3$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n convert = function convert(text) {\n var converted = sbmlToJson.convert(text);\n return converted;\n };\n runLayout = function runLayout() {\n if (layoutBy) {\n if (typeof layoutBy === 'function') {\n layoutBy();\n } else {\n var layout = cy.layout(layoutBy);\n\n // for backward compatibility need to make this if check\n if (layout && layout.run) {\n layout.run();\n }\n }\n }\n cy.fit(cy.elements(\":visible\"), 20);\n };\n _context3.next = 4;\n return fileUtilities.hasLayoutSBML(file);\n case 4:\n layoutFound = _context3.sent;\n if (layoutFound) {\n fileUtilities.loadFile(file, convert, callback1, callback2, fileUtilities.collapseMarkedNodes, undefined);\n } else {\n fileUtilities.loadFile(file, convert, callback1, callback2, fileUtilities.collapseMarkedNodes, runLayout);\n }\n case 6:\n case \"end\":\n return _context3.stop();\n }\n }, _callee3);\n }));\n return function (_x11, _x12, _x13, _x14) {\n return _ref3.apply(this, arguments);\n };\n }();\n fileUtilities.loadSbml = function (file, successCallback, errorCallback) {\n var reader = new FileReader();\n reader.onload = function (e) {\n this.convertSbmlToSbgnml(e.target.result, function (data) {\n if (data == null) {\n errorCallback();\n } else {\n successCallback(data);\n }\n });\n }.bind(this);\n reader.readAsText(file);\n };\n fileUtilities.saveAsGpml = function (filename, errorCallback) {\n uiUtilities.startSpinner(\"load-spinner\");\n var sbgnml = this.convertSbgn();\n this.convertSbgnmlToGpml(sbgnml, function (data) {\n if (!data.result) {\n errorCallback(sbgnml, data.error);\n } else if (data.message.indexOf(\"Internal server error\") !== -1) {\n errorCallback(sbgnml, data.message);\n } else {\n var blob = new Blob([data.message], {\n type: \"text/plain;charset=utf-8;\"\n });\n saveAs(blob, filename);\n }\n uiUtilities.endSpinner(\"load-spinner\");\n });\n };\n fileUtilities.loadGpml = function (file, successCallback, errorCallback) {\n var reader = new FileReader();\n reader.onload = function (e) {\n gpmlToSbgnml.convert(e.target.result, function (data) {\n if (data == null) {\n errorCallback();\n } else {\n successCallback(data);\n }\n });\n }.bind(this);\n reader.readAsText(file);\n };\n fileUtilities.convertSbgn = function (filename, version, renderInfo, mapProperties, nodes, edges) {\n var hidden = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : false;\n var sbgnmlText = jsonToSbgnml.createSbgnml(filename, version, renderInfo, mapProperties, nodes, edges, hidden);\n return sbgnmlText;\n };\n fileUtilities.exportLayoutData = function (filename, byName) {\n var layoutText = layoutToText.convert(byName);\n var blob = new Blob([layoutText], {\n type: \"text/plain;charset=utf-8;\"\n });\n saveAs(blob, filename);\n };\n fileUtilities.saveAsPlainSif = function (filename) {\n var text = jsonToSif.convert();\n var blob = new Blob([text], {\n type: \"text/plain;charset=utf-8;\"\n });\n saveAs(blob, filename);\n };\n fileUtilities.convertSbgnmlTextToJson = function (sbgnmlText) {\n return sbgnmlToJson.convert(textToXmlObject(sbgnmlText));\n };\n fileUtilities.convertSbmlTextToJson = function (sbgnmlText) {\n return sbmlToJson.convert(textToXmlObject(sbgnmlText));\n };\n fileUtilities.convertSifTextToJson = function (sifText) {\n return sifToJson.convert(sifText);\n };\n fileUtilities.createJsonFromSBGN = function () {\n var sbgnmlText = jsonToSbgnml.createSbgnml();\n return sbgnmlToJson.convert(textToXmlObject(sbgnmlText));\n };\n fileUtilities.createJsonFromSBML = function () {\n var sbgnmlText = jsonToSbgnml.createSbgnml(); //SBML\n var converted_ = sbmlToJson.convert(textToXmlObject(sbgnmlText));\n return converted_;\n };\n fileUtilities.createJsonFromSif = function () {\n var sifText = jsonToSif.convert();\n return sifToJson.convert(sifText);\n };\n fileUtilities.convertSbgnmlToCD = function (sbgnml, callback) {\n return sbgnmlToCd.convert(sbgnml, callback);\n };\n fileUtilities.convertCDToSbgnml = function (xml, callback) {\n return cdToSbgnml.convert(xml, callback);\n };\n fileUtilities.convertSbgnmlToSbml = function (sbgnml, callback) {\n return sbgnmlToSbml.convert(sbgnml, callback);\n };\n fileUtilities.convertSbmlToSbgnml = function (sbml, callback) {\n return sbmlToSbgnml.convert(sbml, callback);\n };\n fileUtilities.convertGpmlToSbgnml = function (gpml, callback) {\n return gpmlToSbgnml.convert(gpml, callback);\n };\n fileUtilities.convertSbgnmlToGpml = function (sbgnml, callback) {\n return sbgnmlToGpml.convert(sbgnml, callback);\n };\n return fileUtilities;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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YSxDQUFDMkksbUJBQW1CLEdBQUcsVUFBU2dELElBQUksRUFBRTlJLFFBQVEsRUFBQztJQUMxRCxPQUFPakQsWUFBWSxDQUFDa0UsT0FBTyxDQUFDNkgsSUFBSSxFQUFDOUksUUFBUSxDQUFDO0VBQzVDLENBQUM7RUFFRDdDLGFBQWEsQ0FBQzRMLG1CQUFtQixHQUFHLFVBQVNDLElBQUksRUFBRWhKLFFBQVEsRUFBQztJQUMxRCxPQUFPekIsWUFBWSxDQUFDMEMsT0FBTyxDQUFDK0gsSUFBSSxFQUFDaEosUUFBUSxDQUFDO0VBQzVDLENBQUM7RUFFRDdDLGFBQWEsQ0FBQzBLLG1CQUFtQixHQUFHLFVBQVMxQixNQUFNLEVBQUVuRyxRQUFRLEVBQUM7SUFFNUQsT0FBT3ZCLFlBQVksQ0FBQ3dDLE9BQU8sQ0FBQ2tGLE1BQU0sRUFBQ25HLFFBQVEsQ0FBQztFQUM5QyxDQUFDO0VBRUEsT0FBTzdDLGFBQWE7QUFDckIsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL3NiZ252aXovLi9zcmMvdXRpbGl0aWVzL2ZpbGUtdXRpbGl0aWVzLWZhY3RvcnkuanM/M2UwMCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuKiBGaWxlIFV0aWxpdGllczogVG8gYmUgdXNlZCBvbiByZWFkL3dyaXRlIGZpbGUgb3BlcmF0aW9uXG4qL1xuXG52YXIgbGliVXRpbGl0aWVzID0gcmVxdWlyZSgnLi9saWItdXRpbGl0aWVzJyk7XG52YXIgbGlicyA9IGxpYlV0aWxpdGllcy5nZXRMaWJzKCk7XG52YXIgalF1ZXJ5ID0gJCA9IGxpYnMualF1ZXJ5O1xudmFyIHNhdmVBcyA9IGxpYnMuc2F2ZUFzO1xudmFyIHRleHRVdGlsaXRpZXMgPSByZXF1aXJlKCcuL3RleHQtdXRpbGl0aWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuIC8vIEhlbHBlciBmdW5jdGlvbnMgU3RhcnRcbiAvLyBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNjI0NTc2Ny9jcmVhdGluZy1hLWJsb2ItZnJvbS1hLWJhc2U2NC1zdHJpbmctaW4tamF2YXNjcmlwdFxuIGZ1bmN0aW9uIGI2NHRvQmxvYihiNjREYXRhLCBjb250ZW50VHlwZSwgc2xpY2VTaXplKSB7XG4gICBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlIHx8ICcnO1xuICAgc2xpY2VTaXplID0gc2xpY2VTaXplIHx8IDUxMjtcblxuICAgdmFyIGJ5dGVDaGFyYWN0ZXJzID0gYXRvYihiNjREYXRhKTtcbiAgIHZhciBieXRlQXJyYXlzID0gW107XG5cbiAgIGZvciAodmFyIG9mZnNldCA9IDA7IG9mZnNldCA8IGJ5dGVDaGFyYWN0ZXJzLmxlbmd0aDsgb2Zmc2V0ICs9IHNsaWNlU2l6ZSkge1xuICAgICB2YXIgc2xpY2UgPSBieXRlQ2hhcmFjdGVycy5zbGljZShvZmZzZXQsIG9mZnNldCArIHNsaWNlU2l6ZSk7XG5cbiAgICAgdmFyIGJ5dGVOdW1iZXJzID0gbmV3IEFycmF5KHNsaWNlLmxlbmd0aCk7XG4gICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgICBieXRlTnVtYmVyc1tpXSA9IHNsaWNlLmNoYXJDb2RlQXQoaSk7XG4gICAgIH1cblxuICAgICB2YXIgYnl0ZUFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZU51bWJlcnMpO1xuXG4gICAgIGJ5dGVBcnJheXMucHVzaChieXRlQXJyYXkpO1xuICAgfVxuXG4gICB2YXIgYmxvYiA9IG5ldyBCbG9iKGJ5dGVBcnJheXMsIHt0eXBlOiBjb250ZW50VHlwZX0pO1xuICAgcmV0dXJuIGJsb2I7XG4gfVxuXG4gZnVuY3Rpb24gbG9hZFRleHREb2MoZnVsbEZpbGVQYXRoKSB7XG4gICBpZiAod2luZG93LlhNTEh0dHBSZXF1ZXN0KSB7XG4gICAgIHhodHRwID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICB9XG4gICBlbHNlIHtcbiAgICAgeGh0dHAgPSBuZXcgQWN0aXZlWE9iamVjdChcIk1pY3Jvc29mdC5YTUxIVFRQXCIpO1xuICAgfVxuICAgeGh0dHAub3ZlcnJpZGVNaW1lVHlwZSgnYXBwbGljYXRpb24vdGV4dCcpO1xuICAgeGh0dHAub3BlbihcIkdFVFwiLCBmdWxsRmlsZVBhdGgsIGZhbHNlKTtcbiAgIHhodHRwLnNlbmQoKTtcbiAgIHJldHVybiB4aHR0cC5yZXNwb25zZVRleHQ7XG4gfVxuXG4gZnVuY3Rpb24gbG9hZFhNTERvYyhmdWxsRmlsZVBhdGgpIHtcbiAgaWYgKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCkge1xuICAgIHhodHRwID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gIH1cbiAgZWxzZSB7XG4gICAgeGh0dHAgPSBuZXcgQWN0aXZlWE9iamVjdChcIk1pY3Jvc29mdC5YTUxIVFRQXCIpO1xuICB9XG4gIHhodHRwLm92ZXJyaWRlTWltZVR5cGUoJ2FwcGxpY2F0aW9uL3htbCcpO1xuICB4aHR0cC5vcGVuKFwiR0VUXCIsIGZ1bGxGaWxlUGF0aCwgZmFsc2UpO1xuICB4aHR0cC5zZW5kKCk7XG4gIHJldHVybiB4aHR0cC5yZXNwb25zZVhNTDtcbn1cblxuIC8vIFNob3VsZCB0aGlzIGJlIGV4cG9zZWQgb3Igc2hvdWxkIHRoaXMgYmUgbW92ZWQgdG8gdGhlIGhlbHBlciBmdW5jdGlvbnMgc2VjdGlvbj9cbiBmdW5jdGlvbiB0ZXh0VG9YbWxPYmplY3QodGV4dCkge1xuICAgaWYgKHdpbmRvdy5BY3RpdmVYT2JqZWN0KSB7XG4gICAgIHZhciBkb2MgPSBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTERPTScpO1xuICAgICBkb2MuYXN5bmMgPSAnZmFsc2UnO1xuICAgICBkb2MubG9hZFhNTCh0ZXh0KTtcbiAgIH0gZWxzZSB7XG4gICAgIHZhciBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgIHZhciBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHRleHQsICd0ZXh0L3htbCcpO1xuICAgfVxuICAgcmV0dXJuIGRvYztcbiB9XG4gLy8gSGVscGVyIGZ1bmN0aW9ucyBFbmRcblxuIHZhciBzYmdubWxUb0pzb24sIHNibWxUb0pzb24sIGpzb25Ub1NiZ25tbCwganNvblRvU2JtbCwganNvblRvTnd0LCB1aVV0aWxpdGllcywgdGRUb0pzb24sXG4gICAgIHNpZlRvSnNvbiwgZ3JhcGhVdGlsaXRpZXMsIGxheW91dFRvVGV4dCwgbnd0VG9Kc29uLCBqc29uVG9TaWYsc2Jnbm1sVG9DZCxjZFRvU2Jnbm1sLHNiZ25tbFRvU2JtbCxzYm1sVG9TYmdubWw7XG4gdmFyIHVwZGF0ZUdyYXBoO1xuIHZhciBvcHRpb25zLCBjeTtcblxuIGZ1bmN0aW9uIGZpbGVVdGlsaXRpZXMgKHBhcmFtKSB7XG4gICBzYmdubWxUb0pzb24gPSBwYXJhbS5zYmdubWxUb0pzb25Db252ZXJ0ZXI7XG4gICBzYm1sVG9Kc29uID0gcGFyYW0uc2JtbFRvSnNvbkNvbnZlcnRlcjtcbiAgIG53dFRvSnNvbiA9IHBhcmFtLm53dFRvSnNvbkNvbnZlcnRlcjtcbiAgIGpzb25Ub1NiZ25tbCA9IHBhcmFtLmpzb25Ub1NiZ25tbENvbnZlcnRlcjtcbiAgIGpzb25Ub1NibWwgPSBwYXJhbS5qc29uVG9TYm1sQ29udmVydGVyO1xuICAganNvblRvTnd0ID0gcGFyYW0uanNvblRvTnd0Q29udmVydGVyO1xuICAganNvblRvU2lmID0gcGFyYW0uanNvblRvU2lmQ29udmVydGVyO1xuICAgdWlVdGlsaXRpZXMgPSBwYXJhbS51aVV0aWxpdGllcztcbiAgIHRkVG9Kc29uID0gcGFyYW0udGRUb0pzb25Db252ZXJ0ZXI7XG4gICBzaWZUb0pzb24gPSBwYXJhbS5zaWZUb0pzb25Db252ZXJ0ZXI7XG4gICBsYXlvdXRUb1RleHQgPSBwYXJhbS5sYXlvdXRUb1RleHQ7XG4gICBncmFwaFV0aWxpdGllcyA9IHBhcmFtLmdyYXBoVXRpbGl0aWVzO1xuICAgdXBkYXRlR3JhcGggPSBncmFwaFV0aWxpdGllcy51cGRhdGVHcmFwaC5iaW5kKGdyYXBoVXRpbGl0aWVzKTtcbiAgIG9wdGlvbnMgPSBwYXJhbS5vcHRpb25VdGlsaXRpZXMuZ2V0T3B0aW9ucygpO1xuICAgY3kgPSBwYXJhbS5zYmduQ3lJbnN0YW5jZS5nZXRDeSgpO1xuICAgc2Jnbm1sVG9DZCA9IHBhcmFtLnNiZ25tbFRvQ2RDb252ZXJ0ZXI7XG4gICBjZFRvU2Jnbm1sID0gcGFyYW0uY2RUb1NiZ25tbENvbnZlcnRlcjtcbiAgIHNiZ25tbFRvU2JtbCA9IHBhcmFtLnNiZ25tbFRvU2JtbENvbnZlcnRlcjtcbiAgIHNibWxUb1NiZ25tbCA9IHBhcmFtLnNibWxUb1NiZ25tbENvbnZlcnRlcjtcbiAgIGdwbWxUb1NiZ25tbCA9IHBhcmFtLmdwbWxUb1NiZ25tbENvbnZlcnRlcjtcbiAgIHNiZ25tbFRvR3BtbCA9IHBhcmFtLnNiZ25tbFRvR3BtbENvbnZlcnRlcjtcbiB9XG5cbiBmaWxlVXRpbGl0aWVzLmxvYWRYTUxEb2MgPSBsb2FkWE1MRG9jO1xuXG4gZmlsZVV0aWxpdGllcy50ZXh0VG9YbWxPYmplY3QgPSB0ZXh0VG9YbWxPYmplY3Q7XG5cbiBmaWxlVXRpbGl0aWVzLnNhdmVBc1BuZyA9IGZ1bmN0aW9uKGZpbGVuYW1lLCBzY2FsZSwgYmcsIG1heFdpZHRoLCBtYXhIZWlnaHQpIHtcbiAgIGlmKG1heFdpZHRoIHx8IG1heEhlaWdodCkge1xuICAgICB2YXIgcG5nQ29udGVudCA9IGN5LnBuZyh7XG4gICAgICAgZnVsbDogdHJ1ZSwgYmc6IGJnLCBcbiAgICAgICBtYXhXaWR0aDogbWF4V2lkdGgsIG1heEhlaWdodDogbWF4SGVpZ2h0XG4gICAgIH0pO1xuICAgfVxuICAgZWxzZSB7XG4gICAgIHZhciBwbmdDb250ZW50ID0gY3kucG5nKHtcbiAgICAgICBzY2FsZTogc2NhbGUgfHwgMywgZnVsbDogdHJ1ZSwgYmc6IGJnXG4gICAgIH0pO1xuICAgfVxuXG4gICAvLyB0aGlzIGlzIHRvIHJlbW92ZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwbmdDb250ZW50OiBkYXRhOmltZy9wbmc7YmFzZTY0LFxuICAgdmFyIGI2NGRhdGEgPSBwbmdDb250ZW50LnN1YnN0cihwbmdDb250ZW50LmluZGV4T2YoXCIsXCIpICsgMSk7XG5cbiAgIC8vIGxvd2VyIHF1YWxpdHkgd2hlbiByZXNwb25zZSBpcyBlbXB0eVxuICAgaWYoIWI2NGRhdGEgfHwgYjY0ZGF0YSA9PT0gXCJcIil7XG4gICAgIHBuZ0NvbnRlbnQgPSBjeS5wbmcoe21heFdpZHRoOiAxNTAwMCwgbWF4SGVpZ2h0OiAxNTAwMCwgZnVsbDogdHJ1ZSwgYmc6IGJnfSk7XG4gICAgIGI2NGRhdGEgPSBwbmdDb250ZW50LnN1YnN0cihwbmdDb250ZW50LmluZGV4T2YoXCIsXCIpICsgMSk7XG4gICB9XG5cbiAgIHNhdmVBcyhiNjR0b0Jsb2IoYjY0ZGF0YSwgXCJpbWFnZS9wbmdcIiksIGZpbGVuYW1lIHx8IFwibmV0d29yay5wbmdcIik7XG4gfTtcblxuIGZpbGVVdGlsaXRpZXMuc2F2ZUFzSnBnID0gZnVuY3Rpb24oZmlsZW5hbWUsIHNjYWxlLCBiZywgbWF4V2lkdGgsIG1heEhlaWdodCwgcXVhbGl0eSkge1xuICAgaWYobWF4V2lkdGggfHwgbWF4SGVpZ2h0KSB7XG4gICAgIHZhciBqcGdDb250ZW50ID0gY3kuanBnKHtcbiAgICAgICBmdWxsOiB0cnVlLCBiZzogYmcsIFxuICAgICAgIG1heFdpZHRoOiBtYXhXaWR0aCwgbWF4SGVpZ2h0OiBtYXhIZWlnaHQsIFxuICAgICAgIHF1YWxpdHk6IHF1YWxpdHlcbiAgICAgfSk7XG4gICB9XG4gICBlbHNlIHtcbiAgICAgdmFyIGpwZ0NvbnRlbnQgPSBjeS5qcGcoe1xuICAgICAgIHNjYWxlOiBzY2FsZSB8fCAzLCBmdWxsOiB0cnVlLCBiZzogYmcsIFxuICAgICAgIHF1YWxpdHk6IHF1YWxpdHlcbiAgICAgfSk7XG4gICB9XG4gICBcbiAgIC8vIHRoaXMgaXMgdG8gcmVtb3ZlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBuZ0NvbnRlbnQ6IGRhdGE6aW1nL3BuZztiYXNlNjQsXG4gICB2YXIgYjY0ZGF0YSA9IGpwZ0NvbnRlbnQuc3Vic3RyKGpwZ0NvbnRlbnQuaW5kZXhPZihcIixcIikgKyAxKTtcblxuICAgLy8gbG93ZXIgcXVhbGl0eSB3aGVuIHJlc3BvbnNlIGlzIGVtcHR5XG4gICBpZighYjY0ZGF0YSB8fCBiNjRkYXRhID09PSBcIlwiKXtcbiAgICAganBnQ29udGVudCA9IGN5LmpwZyh7bWF4V2lkdGg6IDE1MDAwLCBtYXhIZWlnaHQ6IDE1MDAwLCBmdWxsOiB0cnVlLCBiZzogYmd9KTtcbiAgICAgYjY0ZGF0YSA9IGpwZ0NvbnRlbnQuc3Vic3RyKGpwZ0NvbnRlbnQuaW5kZXhPZihcIixcIikgKyAxKTtcbiAgIH1cblxuICAgc2F2ZUFzKGI2NHRvQmxvYihiNjRkYXRhLCBcImltYWdlL2pwZ1wiKSwgZmlsZW5hbWUgfHwgXCJuZXR3b3JrLmpwZ1wiKTtcbiB9O1xuXG4gZmlsZVV0aWxpdGllcy5zYXZlQXNTdmcgPSBmdW5jdGlvbihmaWxlbmFtZSwgc2NhbGUsIGJnLCBtYXhXaWR0aCwgbWF4SGVpZ2h0KSB7XG4gICBpZiAobWF4V2lkdGggfHwgbWF4SGVpZ2h0KSB7XG4gICAgIHZhciBzdmdDb250ZW50ID0gY3kuc3ZnKHtcbiAgICAgICBmdWxsOiB0cnVlLCBiZzogYmcsIFxuICAgICAgIG1heFdpZHRoOiBtYXhXaWR0aCwgbWF4SGVpZ2h0OiBtYXhIZWlnaHRcbiAgICAgfSk7XG4gICB9XG4gICBlbHNlIHtcbiAgICAgdmFyIHN2Z0NvbnRlbnQgPSBjeS5zdmcoe3NjYWxlOiBzY2FsZSB8fCAxLCBmdWxsOiB0cnVlLCBiZzogYmd9KTtcbiAgIH1cbiAgIHNhdmVBcyhuZXcgQmxvYihbc3ZnQ29udGVudF0sIHt0eXBlOlwiaW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04XCJ9KSwgZmlsZW5hbWUgfHwgXCJuZXR3b3JrLnN2Z1wiKTtcbiB9O1xuXG4gZmlsZVV0aWxpdGllcy5sb2FkU2FtcGxlID0gZnVuY3Rpb24oZmlsZW5hbWUsIGZvbGRlcnBhdGgsIGNhbGxiYWNrKSB7XG4gICB2YXIgZmlsZSA9IChmb2xkZXJwYXRoIHx8ICdzYW1wbGUtYXBwL3NhbXBsZXMvJykgKyBmaWxlbmFtZTtcblxuICAgdWlVdGlsaXRpZXMuc3RhcnRTcGlubmVyKFwibG9hZC1zcGlubmVyXCIpO1xuICAgLy8gVXNlcnMgbWF5IHdhbnQgdG8gZG8gY3VzdG9taXplZCB0aGluZ3Mgd2hpbGUgYSBzYW1wbGUgaXMgYmVpbmcgbG9hZGVkXG4gICAvLyBUcmlnZ2VyIGFuIGV2ZW50IGZvciB0aGlzIHB1cnBvc2UgYW5kIHNwZWNpZnkgdGhlICdmaWxlbmFtZScgYXMgYW4gZXZlbnQgcGFyYW1ldGVyXG4gICAkKGRvY3VtZW50KS50cmlnZ2VyKCBcInNiZ252aXpMb2FkU2FtcGxlXCIsIFsgZmlsZW5hbWUsIGN5IF0gKTsgLy8gQWxpYXNlcyBmb3Igc2JnbnZpekxvYWRTYW1wbGVTdGFydFxuICAgJChkb2N1bWVudCkudHJpZ2dlciggXCJzYmdudml6TG9hZFNhbXBsZVN0YXJ0XCIsIFsgZmlsZW5hbWUsIGN5IF0gKTtcbiAgIHZhciB0ZXh0ID0gbG9hZFRleHREb2MoZmlsZSk7XG4gICB2YXIgbWF0Y2hSZXN1bHQgPSB0ZXh0Lm1hdGNoKFwiPHJlbmRlckluZm9ybWF0aW9uW15dKjwvcmVuZGVySW5mb3JtYXRpb24+XCIpO1xuICAgaWYobWF0Y2hSZXN1bHQgIT0gbnVsbCl7XG4gICAgIHZhciByZW5kZXJJbmZvU3RyaW5nID0gbWF0Y2hSZXN1bHRbMF07XG4gICAgIHZhciByZW5kZXJJbmZvU3RyaW5nQ29weSA9ICgnICcgKyByZW5kZXJJbmZvU3RyaW5nKS5zbGljZSgxKTtcbiAgICAgY29uc3QgcmVnZXggPSAvXFxzKFtcXFNdKykoW1xcc10qKT0vZztcbiAgICAgdmFyIHJlc3VsdDtcbiAgICAgdmFyIG1hdGNoZXMgPSBbXTsgXG4gICAgIHdoaWxlKHJlc3VsdCA9IHJlZ2V4LmV4ZWMocmVuZGVySW5mb1N0cmluZykpIHtcbiAgICAgICBtYXRjaGVzLnB1c2gocmVzdWx0WzBdKTtcbiAgICAgfTtcbiAgICAgbWF0Y2hlcy5mb3JFYWNoKGZ1bmN0aW9uKG1hdGNoKXtcbiAgICAgICByZW5kZXJJbmZvU3RyaW5nID0gcmVuZGVySW5mb1N0cmluZy5yZXBsYWNlKG1hdGNoICwgdGV4dFV0aWxpdGllcy5Gcm9tS2ViYWJUb0NhbWVsQ2FzZShtYXRjaCkpO1xuICAgICB9KTsgICAgICBcbiAgICAgdGV4dCA9IHRleHQucmVwbGFjZShyZW5kZXJJbmZvU3RyaW5nQ29weSwgcmVuZGVySW5mb1N0cmluZyk7XG4gICAgfVxuICAgICAgdmFyIHhtbE9iamVjdCA9IHRleHRUb1htbE9iamVjdCh0ZXh0KTtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICB1cGRhdGVHcmFwaChud3RUb0pzb24uY29udmVydCh4bWxPYmplY3QpKTtcbiAgICAgICAgZmlsZVV0aWxpdGllcy5jb2xsYXBzZU1hcmtlZE5vZGVzKCk7XG4gICAgICAgIHVpVXRpbGl0aWVzLmVuZFNwaW5uZXIoXCJsb2FkLXNwaW5uZXJcIik7XG4gICAgICAgICQoZG9jdW1lbnQpLnRyaWdnZXIoIFwic2JnbnZpekxvYWRTYW1wbGVFbmRcIiwgWyBmaWxlbmFtZSwgY3kgXSApOyAvLyBUcmlnZ2VyIGFuIGV2ZW50IHNpZ25hbGluZyB0aGF0IGEgc2FtcGxlIGlzIGxvYWRlZFxuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgY2FsbGJhY2soKTsgfVxuICAgICAgfSwwKTtcbiB9O1xuXG4gZmlsZVV0aWxpdGllcy5sb2FkU0lGRmlsZSA9IGZ1bmN0aW9uKGZpbGUsIGxheW91dEJ5LCBjYWxsYmFjaykge1xuICAgdmFyIGNvbnZlcnQgPSBmdW5jdGlvbiggdGV4dCApIHtcbiAgICAgcmV0dXJuIHNpZlRvSnNvbi5jb252ZXJ0KHRleHQpO1xuICAgfTtcblxuICAgdmFyIHJ1bkxheW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICBpZiAoIGxheW91dEJ5ICkge1xuICAgICAgIGlmICggdHlwZW9mIGxheW91dEJ5ID09PSAnZnVuY3Rpb24nICkge1xuICAgICAgICAgbGF5b3V0QnkoKTtcbiAgICAgICB9XG4gICAgICAgZWxzZSB7XG4gICAgICAgICB2YXIgbGF5b3V0ID0gY3kubGF5b3V0KCBsYXlvdXRCeSApO1xuXG4gICAgICAgICAvLyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBuZWVkIHRvIG1ha2UgdGhpcyBpZiBjaGVja1xuICAgICAgICAgaWYgKCBsYXlvdXQgJiYgbGF5b3V0LnJ1biApIHtcbiAgICAgICAgICAgbGF5b3V0LnJ1bigpO1xuICAgICAgICAgfVxuICAgICAgIH1cbiAgICAgfVxuXG4gICAgIGN5LmZpdCggY3kuZWxlbWVudHMoXCI6dmlzaWJsZVwiKSwgMjAgKTtcblxuICAgfTtcblxuICAgZmlsZVV0aWxpdGllcy5sb2FkRmlsZSggZmlsZSwgY29udmVydCwgdW5kZWZpbmVkLCBjYWxsYmFjaywgdW5kZWZpbmVkLCBydW5MYXlvdXQgKTtcbiB9O1xuXG4gZmlsZVV0aWxpdGllcy5sb2FkVERGaWxlID0gZnVuY3Rpb24gZnVuY3Rpb25OYW1lKGZpbGUsIGNhbGxiYWNrKSB7XG4gICB2YXIgY29udmVydCA9IGZ1bmN0aW9uKCB0ZXh0ICkge1xuICAgICByZXR1cm4gdGRUb0pzb24uY29udmVydCh0ZXh0KTtcbiAgIH07XG5cbiAgIGZpbGVVdGlsaXRpZXMubG9hZEZpbGUoIGZpbGUsIGNvbnZlcnQsIHVuZGVmaW5lZCwgY2FsbGJhY2sgKTtcbiB9O1xuXG4gZmlsZVV0aWxpdGllcy5sb2FkU0JHTk1MRmlsZSA9IGZ1bmN0aW9uKGZpbGUsIGNhbGxiYWNrMSwgY2FsbGJhY2syKSB7XG4gICB2YXIgY29udmVydCA9IGZ1bmN0aW9uKCB0ZXh0ICkge1xuICAgICByZXR1cm4gc2Jnbm1sVG9Kc29uLmNvbnZlcnQodGV4dFRvWG1sT2JqZWN0KHRleHQpKTtcbiAgIH07XG5cbiAgIGZpbGVVdGlsaXRpZXMubG9hZEZpbGUoIGZpbGUsIGNvbnZlcnQsIGNhbGxiYWNrMSwgY2FsbGJhY2syLCBmaWxlVXRpbGl0aWVzLmNvbGxhcHNlTWFya2VkTm9kZXMgKTtcbiB9O1xuXG4gZmlsZVV0aWxpdGllcy5sb2FkTnd0RmlsZSA9IGZ1bmN0aW9uKGZpbGUsIGNhbGxiYWNrMSwgY2FsbGJhY2syLCB1cmxQYXJhbXMpIHtcbiAgIHZhciBjb252ZXJ0ID0gZnVuY3Rpb24oIHRleHQgKSB7XG4gICAgIHJldHVybiBud3RUb0pzb24uY29udmVydCh0ZXh0VG9YbWxPYmplY3QodGV4dCksIHVybFBhcmFtcyk7XG4gICB9O1xuXG4gICBmaWxlVXRpbGl0aWVzLmxvYWRGaWxlKCBmaWxlLCBjb252ZXJ0LCBjYWxsYmFjazEsIGNhbGxiYWNrMiwgZmlsZVV0aWxpdGllcy5jb2xsYXBzZU1hcmtlZE5vZGVzICk7XG4gfTtcblxuIC8vIGNvbGxhcHNlIHRoZSBub2RlcyB3aG9zZSBjb2xsYXBzZSBkYXRhIGZpZWxkIGlzIHNldFxuIGZpbGVVdGlsaXRpZXMuY29sbGFwc2VNYXJrZWROb2RlcyA9IGZ1bmN0aW9uKCkge1xuICAgLy8gY29sbGFwc2Ugbm9kZXNcbiAgIHZhciBub2Rlc1RvQ29sbGFwc2UgPSBjeS5ub2RlcyhcIltjb2xsYXBzZV1cIik7XG4gICBpZiAobm9kZXNUb0NvbGxhcHNlLmxlbmd0aCA+IDAgKXtcbiAgICAgY3kuZXhwYW5kQ29sbGFwc2UoJ2dldCcpLmNvbGxhcHNlKG5vZGVzVG9Db2xsYXBzZSwge2xheW91dEJ5OiBudWxsfSk7XG5cbiAgICAgbm9kZXNUb0NvbGxhcHNlLmZvckVhY2goZnVuY3Rpb24oZWxlLCBpLCBlbGVzKXtcbiAgICAgICBlbGUucG9zaXRpb24oZWxlLmRhdGEoXCJwb3NpdGlvbkJlZm9yZVNhdmluZ1wiKSk7XG4gICAgIH0pO1xuICAgICBub2Rlc1RvQ29sbGFwc2UucmVtb3ZlRGF0YShcInBvc2l0aW9uQmVmb3JlU2F2aW5nXCIpO1xuICAgfVxuIH07XG5cbiAvKlxuICAgY2FsbGJhY2sgaXMgYSBmdW5jdGlvbiByZW1vdGVseSBkZWZpbmVkIHRvIGFkZCBzcGVjaWZpYyBiZWhhdmlvciB0aGF0IGlzbid0IGltcGxlbWVudGVkIGhlcmUuXG4gICBpdCBpcyBjb21wbGV0ZWx5IG9wdGlvbmFsLlxuICAgc2lnbmF0dXJlOiBjYWxsYmFjayh0ZXh0WG1sKVxuICovXG4gZmlsZVV0aWxpdGllcy5sb2FkRmlsZSA9IGZ1bmN0aW9uKGZpbGUsIGNvbnZlcnRGY24sIGNhbGxiYWNrMSwgY2FsbGJhY2syLCBjYWxsYmFjazMsIGNhbGxiYWNrNCkge1xuICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgdWlVdGlsaXRpZXMuc3RhcnRTcGlubmVyKFwibG9hZC1maWxlLXNwaW5uZXJcIik7XG5cbiAgIHZhciB0ZXh0VHlwZSA9IC90ZXh0LiovO1xuXG4gICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcblxuICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgIHZhciB0ZXh0ID0gdGhpcy5yZXN1bHQ7XG4gICAgdmFyIG1hdGNoUmVzdWx0ID0gdGV4dC5tYXRjaChcIjxyZW5kZXJJbmZvcm1hdGlvblteXSo8L3JlbmRlckluZm9ybWF0aW9uPlwiKTtcbiAgICBpZihtYXRjaFJlc3VsdCAhPSBudWxsKXtcbiAgICB2YXIgaW1hZ2VzRWxlbWVudE1hdGNoID0gdGV4dC5tYXRjaChcIjxsaXN0T2ZCYWNrZ3JvdW5kSW1hZ2VzW15dKjwvbGlzdE9mQmFja2dyb3VuZEltYWdlcz5cIik7XG4gICAgdmFyIGltYWdlc0VsZW1lbnQ7XG4gICAgaWYoaW1hZ2VzRWxlbWVudE1hdGNoICE9IG51bGwpe1xuICAgICAgaW1hZ2VzRWxlbWVudCA9IGltYWdlc0VsZW1lbnRNYXRjaFswXTtcbiAgICB9XG4gICAgdmFyIHJlbmRlckluZm9TdHJpbmcgPSBtYXRjaFJlc3VsdFswXTtcbiAgICB2YXIgcmVuZGVySW5mb1N0cmluZ0NvcHkgPSAoJyAnICsgcmVuZGVySW5mb1N0cmluZykuc2xpY2UoMSk7XG4gICAgICBjb25zdCByZWdleCA9IC9cXHMoW1xcU10rKShbXFxzXSopPS9nO1xuICAgICAgdmFyIHJlc3VsdDtcbiAgICAgIHZhciBtYXRjaGVzID0gW107IFxuICAgICAgd2hpbGUocmVzdWx0ID0gcmVnZXguZXhlYyhyZW5kZXJJbmZvU3RyaW5nKSkge1xuICAgICAgICBtYXRjaGVzLnB1c2gocmVzdWx0WzBdKTtcbiAgICAgIH07XG4gICAgICBtYXRjaGVzLmZvckVhY2goZnVuY3Rpb24obWF0Y2gpe1xuICAgICAgICByZW5kZXJJbmZvU3RyaW5nID0gcmVuZGVySW5mb1N0cmluZy5yZXBsYWNlKG1hdGNoICwgdGV4dFV0aWxpdGllcy5Gcm9tS2ViYWJUb0NhbWVsQ2FzZShtYXRjaCkpO1xuICAgICAgfSk7ICAgICAgXG4gICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKHJlbmRlckluZm9TdHJpbmdDb3B5LCByZW5kZXJJbmZvU3RyaW5nKTtcbiAgICAgIHZhciBpbWFnZXNFbGVtZW50TWF0Y2hEaXJ0eSA9IHRleHQubWF0Y2goXCI8bGlzdE9mQmFja2dyb3VuZEltYWdlc1teXSo8L2xpc3RPZkJhY2tncm91bmRJbWFnZXM+XCIpO1xuICAgICAgaWYoaW1hZ2VzRWxlbWVudE1hdGNoRGlydHkgIT0gbnVsbCl7XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoaW1hZ2VzRWxlbWVudE1hdGNoRGlydHlbMF0saW1hZ2VzRWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXG4gICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjazEgIT09ICd1bmRlZmluZWQnKSBjYWxsYmFjazEodGV4dCk7XG5cbiAgICAgICB2YXIgY3lHcmFwaDtcbiAgICAgICB0cnkge1xuICAgICAgICAgY3lHcmFwaCA9IGNvbnZlcnRGY24oIHRleHQgKTtcbiAgICAgICAgIC8vIFVzZXJzIG1heSB3YW50IHRvIGRvIGN1c3RvbWl6ZWQgdGhpbmdzIHdoaWxlIGFuIGV4dGVybmFsIGZpbGUgaXMgYmVpbmcgbG9hZGVkXG4gICAgICAgICAvLyBUcmlnZ2VyIGFuIGV2ZW50IGZvciB0aGlzIHB1cnBvc2UgYW5kIHNwZWNpZnkgdGhlICdmaWxlbmFtZScgYXMgYW4gZXZlbnQgcGFyYW1ldGVyXG4gICAgICAgICAkKGRvY3VtZW50KS50cmlnZ2VyKCBcInNiZ252aXpMb2FkRmlsZVwiLCBbIGZpbGUubmFtZSwgY3kgXSApOyAvLyBBbGlhc2VzIGZvciBzYmdudml6TG9hZEZpbGVTdGFydFxuICAgICAgICAgJChkb2N1bWVudCkudHJpZ2dlciggXCJzYmdudml6TG9hZEZpbGVTdGFydFwiLCBbIGZpbGUubmFtZSwgY3kgXSApO1xuICAgICAgIH1cbiAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICB1aVV0aWxpdGllcy5lbmRTcGlubmVyKFwibG9hZC1maWxlLXNwaW5uZXJcIik7XG4gICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjazIgIT09ICd1bmRlZmluZWQnKSBjYWxsYmFjazIoKTtcbiAgICAgICAgIHJldHVybjtcbiAgICAgICB9XG5cbiAgICAgICB1cGRhdGVHcmFwaChjeUdyYXBoKTtcblxuICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2szICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgY2FsbGJhY2szKCk7XG4gICAgICAgfVxuXG4gICAgICAgdWlVdGlsaXRpZXMuZW5kU3Bpbm5lcihcImxvYWQtZmlsZS1zcGlubmVyXCIpO1xuICAgICAgICQoZG9jdW1lbnQpLnRyaWdnZXIoIFwic2JnbnZpekxvYWRGaWxlRW5kXCIsIFsgZmlsZS5uYW1lLCBjeSBdICk7IC8vIFRyaWdnZXIgYW4gZXZlbnQgc2lnbmFsaW5nIHRoYXQgYSBmaWxlIGlzIGxvYWRlZFxuXG4gICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjazQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICBjYWxsYmFjazQoKTtcbiAgICAgICB9XG4gICAgIH0sIDApO1xuICAgfTtcblxuICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7XG4gfTtcblxuIGZpbGVVdGlsaXRpZXMubG9hZFNCR05NTFRleHQgPSBhc3luYyBmdW5jdGlvbih0ZXh0RGF0YSwgdGlsZUluZm9Cb3hlcywgZmlsZW5hbWUsIGN5LCB1cmxQYXJhbXMpe1xuICBhd2FpdCB1cGRhdGVHcmFwaChzYmdubWxUb0pzb24uY29udmVydCh0ZXh0VG9YbWxPYmplY3QodGV4dERhdGEpLCB1cmxQYXJhbXMpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdGlsZUluZm9Cb3hlcyk7XG4gIGF3YWl0ICQoZG9jdW1lbnQpLnRyaWdnZXIoXCJzYmdudml6TG9hZEZpbGVFbmRcIiwgIFtmaWxlbmFtZSwgY3ldKTtcbiAgICAgICAgdWlVdGlsaXRpZXMuZW5kU3Bpbm5lcihcImxvYWQtZmlsZS1zcGlubmVyXCIpO1xuXG5cbiB9O1xuXG4gZmlsZVV0aWxpdGllcy5sb2FkU0JNTFRleHQgPSBhc3luYyBmdW5jdGlvbih0ZXh0RGF0YSwgdGlsZUluZm9Cb3hlcywgZmlsZW5hbWUsIGN5LCB1cmxQYXJhbXMpe1xuICBhd2FpdCB1cGRhdGVHcmFwaChzYm1sVG9Kc29uLmNvbnZlcnQodGV4dFRvWG1sT2JqZWN0KHRleHREYXRhKSwgdXJsUGFyYW1zKSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRpbGVJbmZvQm94ZXMpO1xuICAgYXdhaXQgJChkb2N1bWVudCkudHJpZ2dlcihcInNiZ252aXpMb2FkRmlsZUVuZFwiLCAgW2ZpbGVuYW1lLCBjeV0pO1xuICAgdWlVdGlsaXRpZXMuZW5kU3Bpbm5lcihcImxvYWQtZmlsZS1zcGlubmVyXCIpO1xuXG59O1xuXG4gLy8gc3VwcG9ydGVkIHZlcnNpb25zIGFyZSBlaXRoZXIgMC4yIG9yIDAuM1xuIGZpbGVVdGlsaXRpZXMuc2F2ZUFzU2Jnbm1sID0gZnVuY3Rpb24oZmlsZW5hbWUsIHZlcnNpb24sIHJlbmRlckluZm8sIG1hcFByb3BlcnRpZXMsIG5vZGVzLCBlZGdlcykge1xuICAgdmFyIHNiZ25tbFRleHQgPSBqc29uVG9TYmdubWwuY3JlYXRlU2Jnbm1sKGZpbGVuYW1lLCB2ZXJzaW9uLCByZW5kZXJJbmZvLCBtYXBQcm9wZXJ0aWVzLCBub2RlcywgZWRnZXMpO1xuICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbc2Jnbm1sVGV4dF0sIHtcbiAgICAgdHlwZTogXCJ0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTg7XCIsXG4gICB9KTtcbiAgIHNhdmVBcyhibG9iLCBmaWxlbmFtZSk7XG4gfTtcblxuIGZpbGVVdGlsaXRpZXMuc2F2ZUFzU2Jnbm1sRm9yU0JNTCA9IGZ1bmN0aW9uKGZpbGVuYW1lLCBlcnJvckNhbGxiYWNrKXtcbiAgLy8gV2UgaGF2ZSBzYm1sIG1hcCB0eXBlZCBub2RlcyBhbmQgZWRnZXMgaW4gdGhlIGN5dG9zY2FwZSBncmFwaCBhbmQgd2Ugd2FudCB0byBleHBvcnQgdG8gc2Jnbm1sXG4gIC8vIENyZWF0ZSBzYm1sIGZpbGUgZmlyc3QsIHRoZW4gZ2V0IHRoZSBzYmdubWwgZnJvbSB0aGUgTWluZXJ2YSBjb252ZXJzaW9uIHNlcnZpY2VcbiAgdWlVdGlsaXRpZXMuc3RhcnRTcGlubmVyKFwibG9hZC1maWxlLXNwaW5uZXJcIik7XG4gIHZhciBzYmduVGV4dCA9IGpzb25Ub1NibWwuY3JlYXRlU2JtbChmaWxlbmFtZSk7XG4gIC8vY29udmVydCBzYm1sIHRvIHNiZ25tbFxuICB0aGlzLmNvbnZlcnRTYm1sVG9TYmdubWwoc2JnblRleHQsIGZ1bmN0aW9uKGRhdGEpe1xuICAgIGlmKCFkYXRhLnJlc3VsdCl7XG4gICAgICBlcnJvckNhbGxiYWNrKCk7XG4gICAgfWVsc2V7XG4gICAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtkYXRhLm1lc3NhZ2VdLCB7XG4gICAgICAgIHR5cGU6IFwidGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04O1wiLFxuICAgICAgfSk7XG4gICAgICBzYXZlQXMoYmxvYiwgZmlsZW5hbWUpO1xuICAgIH1cbiAgICB1aVV0aWxpdGllcy5lbmRTcGlubmVyKFwibG9hZC1maWxlLXNwaW5uZXJcIik7XG4gIH0uYmluZCh0aGlzKSk7XG59XG5cbiAvLyBzdXBwb3J0ZWQgdmVyc2lvbnMgYXJlIGVpdGhlciAwLjIgb3IgMC4zXG4gZmlsZVV0aWxpdGllcy5zYXZlQXNOd3QgPSBmdW5jdGlvbihmaWxlbmFtZSwgdmVyc2lvbiwgcmVuZGVySW5mbywgbWFwUHJvcGVydGllcywgbm9kZXMsIGVkZ2VzKSB7XG4gICB2YXIgc2Jnbm1sVGV4dCA9IGpzb25Ub053dC5jcmVhdGVOd3QoZmlsZW5hbWUsIHZlcnNpb24sIHJlbmRlckluZm8sIG1hcFByb3BlcnRpZXMsIG5vZGVzLCBlZGdlcyk7XG4gICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtzYmdubWxUZXh0XSwge1xuICAgICB0eXBlOiBcInRleHQvcGxhaW47Y2hhcnNldD11dGYtODtcIixcbiAgIH0pO1xuICAgc2F2ZUFzKGJsb2IsIGZpbGVuYW1lKTtcbiB9O1xuXG4gZmlsZVV0aWxpdGllcy5zYXZlQXNDZWxsRGVzaWduZXIgPSBmdW5jdGlvbihmaWxlbmFtZSwgZXJyb3JDYWxsYmFjayl7XG4gIHVpVXRpbGl0aWVzLnN0YXJ0U3Bpbm5lcihcImxvYWQtc3Bpbm5lclwiKTtcbiAgdmFyIHNiZ25tbCA9IGpzb25Ub1NiZ25tbC5jcmVhdGVTYmdubWwoKTsgXG4gIHRoaXMuY29udmVydFNiZ25tbFRvQ0Qoc2Jnbm1sLCBmdW5jdGlvbihkYXRhKXtcbiAgICBpZihkYXRhID09IG51bGwpe1xuICAgICAgZXJyb3JDYWxsYmFjaygpO1xuICAgIH1lbHNle1xuICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbZGF0YV0sIHtcbiAgICAgICAgdHlwZTogXCJ0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTg7XCIsXG4gICAgICB9KTtcbiAgICAgIHNhdmVBcyhibG9iLCBmaWxlbmFtZSk7IFxuICAgIH1cbiAgICB1aVV0aWxpdGllcy5lbmRTcGlubmVyKFwibG9hZC1zcGlubmVyXCIpO1xuICAgIFxuICB9KTtcbiB9O1xuXG4gZmlsZVV0aWxpdGllcy5sb2FkQ2VsbERlc2lnbmVyID0gZnVuY3Rpb24oZmlsZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKXtcbiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uIChlKSB7IFxuICBcbiAgICAvLyB0aGlzLmNvbnZlcnRDRFRvU2Jnbm1sKGUudGFyZ2V0LnJlc3VsdCwgZnVuY3Rpb24oZGF0YSl7XG4gICAgY2RUb1NiZ25tbC5jb252ZXJ0KGUudGFyZ2V0LnJlc3VsdCwgZnVuY3Rpb24oZGF0YSl7XG4gICAgICB1aVV0aWxpdGllcy5lbmRTcGlubmVyKFwibG9hZC1zcGlubmVyXCIpO1xuICAgICAgaWYoZGF0YSA9PSBudWxsKXtcbiAgICAgICAgZXJyb3JDYWxsYmFjaygpO1xuICAgICAgfWVsc2V7XG4gICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhkYXRhKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfS5iaW5kKHRoaXMpO1xuICB1aVV0aWxpdGllcy5zdGFydFNwaW5uZXIoXCJsb2FkLXNwaW5uZXJcIik7XG4gIHJlYWRlci5yZWFkQXNUZXh0KGZpbGUpO1xuIH07XG5cbiBmaWxlVXRpbGl0aWVzLnNhdmVBc1NibWwgPSBmdW5jdGlvbihmaWxlbmFtZSwgZXJyb3JDYWxsYmFjayl7XG4gIHVpVXRpbGl0aWVzLnN0YXJ0U3Bpbm5lcihcImxvYWQtc3Bpbm5lclwiKTtcbiAgdmFyIHNiZ25tbCA9IHRoaXMuY29udmVydFNiZ24oKTtcbiAgdGhpcy5jb252ZXJ0U2Jnbm1sVG9TYm1sKHNiZ25tbCwgZnVuY3Rpb24oZGF0YSl7XG4gICAgaWYgKCFkYXRhLnJlc3VsdCkge1xuICAgICAgZXJyb3JDYWxsYmFjayhzYmdubWwsIGRhdGEuZXJyb3IpO1xuICAgIH0gZWxzZSBpZiAoZGF0YS5tZXNzYWdlLmluZGV4T2YoXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIikgIT09IC0xKSB7XG4gICAgICBlcnJvckNhbGxiYWNrKHNiZ25tbCwgZGF0YS5tZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbZGF0YS5tZXNzYWdlXSwge1xuICAgICAgICB0eXBlOiBcInRleHQvcGxhaW47Y2hhcnNldD11dGYtODtcIixcbiAgICAgIH0pO1xuICAgICAgc2F2ZUFzKGJsb2IsIGZpbGVuYW1lKTtcbiAgICB9XG4gICAgdWlVdGlsaXRpZXMuZW5kU3Bpbm5lcihcImxvYWQtc3Bpbm5lclwiKTtcbiAgfSk7XG4gfVxuXG4gIGZpbGVVdGlsaXRpZXMuc2F2ZVNibWxGb3JTQk1MID0gZnVuY3Rpb24oZmlsZW5hbWUsIGVycm9yQ2FsbGJhY2spe1xuICAgIHVpVXRpbGl0aWVzLnN0YXJ0U3Bpbm5lcihcImxvYWQtc3Bpbm5lclwiKTtcbiAgICB0cnkge1xuICAgICAgdmFyIHNiZ25UZXh0ID0ganNvblRvU2JtbC5jcmVhdGVTYm1sKGZpbGVuYW1lKTtcbiAgICAgIHZhciBibG9iID0gbmV3IEJsb2IoW3NiZ25UZXh0XSwge1xuICAgICAgICB0eXBlOiBcInRleHQvcGxhaW47Y2hhcnNldD11dGYtODtcIixcbiAgICAgIH0pO1xuICAgICAgc2F2ZUFzKGJsb2IsIGZpbGVuYW1lKTtcbiAgICB9XG4gICAgY2F0Y2goZXJyKSB7XG4gICAgICBlcnJvckNhbGxiYWNrKCk7XG4gICAgfVxuICAgIHVpVXRpbGl0aWVzLmVuZFNwaW5uZXIoXCJsb2FkLXNwaW5uZXJcIik7XG59XG5maWxlVXRpbGl0aWVzLmhhc0xheW91dFNCTUwgPSBmdW5jdGlvbihmaWxlKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgdmFyIGxheW91dEZvdW5kID0gZmFsc2U7XG5cbiAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oZSkge1xuICAgICAgdmFyIHRleHQgPSB0aGlzLnJlc3VsdDtcbiAgICAgIHZhciBtYXRjaFJlc3VsdCA9IHRleHQubWF0Y2goLzxbXj5dKmxpc3RPZkxheW91dHNbXj5dKj5bXFxzXFxTXSo8XFwvW14+XSpsaXN0T2ZMYXlvdXRzW14+XSo+Lyk7XG4gICAgICBpZiAobWF0Y2hSZXN1bHQgIT0gbnVsbCkge1xuICAgICAgICBsYXlvdXRGb3VuZCA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXNvbHZlKGxheW91dEZvdW5kKTtcbiAgICB9O1xuXG4gICAgcmVhZGVyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcmVhZCB0aGUgZmlsZVwiKSk7XG4gICAgfTtcblxuICAgIHJlYWRlci5yZWFkQXNUZXh0KGZpbGUpO1xuICB9KTtcbn07XG5cbiBmaWxlVXRpbGl0aWVzLmxvYWRTYm1sRm9yU0JNTCA9IGFzeW5jIGZ1bmN0aW9uKGZpbGUsIGNhbGxiYWNrMSwgY2FsbGJhY2syLCBsYXlvdXRCeSlcbiB7XG4gIHZhciBjb252ZXJ0ID0gZnVuY3Rpb24oIHRleHQgKSB7XG4gICAgdmFyIGNvbnZlcnRlZCA9IHNibWxUb0pzb24uY29udmVydCh0ZXh0KVxuICAgIHJldHVybiBjb252ZXJ0ZWQ7XG4gIH07XG5cbiAgdmFyIHJ1bkxheW91dCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICggbGF5b3V0QnkgKSB7XG4gICAgICBpZiAoIHR5cGVvZiBsYXlvdXRCeSA9PT0gJ2Z1bmN0aW9uJyApIHtcbiAgICAgICAgbGF5b3V0QnkoKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB2YXIgbGF5b3V0ID0gY3kubGF5b3V0KCBsYXlvdXRCeSApO1xuXG4gICAgICAgIC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG5lZWQgdG8gbWFrZSB0aGlzIGlmIGNoZWNrXG4gICAgICAgIGlmICggbGF5b3V0ICYmIGxheW91dC5ydW4gKSB7XG4gICAgICAgICAgbGF5b3V0LnJ1bigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY3kuZml0KCBjeS5lbGVtZW50cyhcIjp2aXNpYmxlXCIpLCAyMCApO1xuICB9O1xuICBsZXQgbGF5b3V0Rm91bmQgPSBhd2FpdCBmaWxlVXRpbGl0aWVzLmhhc0xheW91dFNCTUwoZmlsZSk7XG4gIGlmIChsYXlvdXRGb3VuZCl7XG4gICAgZmlsZVV0aWxpdGllcy5sb2FkRmlsZSggZmlsZSwgY29udmVydCwgY2FsbGJhY2sxLCBjYWxsYmFjazIsIGZpbGVVdGlsaXRpZXMuY29sbGFwc2VNYXJrZWROb2RlcywgdW5kZWZpbmVkKTtcbiAgfVxuICBlbHNle1xuICAgIGZpbGVVdGlsaXRpZXMubG9hZEZpbGUoIGZpbGUsIGNvbnZlcnQsIGNhbGxiYWNrMSwgY2FsbGJhY2syLCBmaWxlVXRpbGl0aWVzLmNvbGxhcHNlTWFya2VkTm9kZXMsIHJ1bkxheW91dCk7XG4gIH1cbiB9XG4gZmlsZVV0aWxpdGllcy5sb2FkU2JtbCA9IGZ1bmN0aW9uKGZpbGUsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayl7XG4gIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24gKGUpIHsgXG4gICAgXG4gICAgICB0aGlzLmNvbnZlcnRTYm1sVG9TYmdubWwoZS50YXJnZXQucmVzdWx0LCBmdW5jdGlvbihkYXRhKXtcbiAgICAgIGlmKGRhdGEgPT0gbnVsbCl7XG4gICAgICAgIGVycm9yQ2FsbGJhY2soKTtcbiAgICAgIH1lbHNle1xuICAgICAgICBzdWNjZXNzQ2FsbGJhY2soZGF0YSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0uYmluZCh0aGlzKTtcbiAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7XG5cbiB9O1xuXG4gZmlsZVV0aWxpdGllcy5zYXZlQXNHcG1sID0gZnVuY3Rpb24oZmlsZW5hbWUsZXJyb3JDYWxsYmFjayl7XG4gIHVpVXRpbGl0aWVzLnN0YXJ0U3Bpbm5lcihcImxvYWQtc3Bpbm5lclwiKTtcbiAgdmFyIHNiZ25tbCA9IHRoaXMuY29udmVydFNiZ24oKTtcbiAgXG4gIHRoaXMuY29udmVydFNiZ25tbFRvR3BtbChzYmdubWwsIGZ1bmN0aW9uKGRhdGEpe1xuICAgIFxuICAgIGlmKCFkYXRhLnJlc3VsdCl7XG4gICAgICBlcnJvckNhbGxiYWNrKHNiZ25tbCxkYXRhLmVycm9yKTtcbiAgICB9ZWxzZSBpZiggZGF0YS5tZXNzYWdlLmluZGV4T2YoXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIikgIT09IC0xKVxuICAgIHtcbiAgICAgIGVycm9yQ2FsbGJhY2soc2Jnbm1sLGRhdGEubWVzc2FnZSk7XG4gICAgfWVsc2V7ICAgIFxuICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbZGF0YS5tZXNzYWdlXSwge1xuICAgICAgICB0eXBlOiBcInRleHQvcGxhaW47Y2hhcnNldD11dGYtODtcIixcbiAgICAgIH0pO1xuICAgICAgc2F2ZUFzKGJsb2IsIGZpbGVuYW1lKTsgXG4gICAgfVxuICAgIHVpVXRpbGl0aWVzLmVuZFNwaW5uZXIoXCJsb2FkLXNwaW5uZXJcIik7XG4gIH0pO1xuIH07XG5cbiBmaWxlVXRpbGl0aWVzLmxvYWRHcG1sID0gZnVuY3Rpb24oZmlsZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKXtcbiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoZSkgeyBcbiAgICBcbiAgICBncG1sVG9TYmdubWwuY29udmVydChlLnRhcmdldC5yZXN1bHQsIGZ1bmN0aW9uKGRhdGEpe1xuICAgICAgaWYoZGF0YSA9PSBudWxsKXtcbiAgICAgICAgZXJyb3JDYWxsYmFjaygpO1xuICAgICAgfWVsc2V7XG4gICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhkYXRhKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfS5iaW5kKHRoaXMpO1xuICByZWFkZXIucmVhZEFzVGV4dChmaWxlKTtcblxuIH07IFxuXG4gZmlsZVV0aWxpdGllcy5jb252ZXJ0U2Jnbj0gZnVuY3Rpb24oZmlsZW5hbWUsIHZlcnNpb24sIHJlbmRlckluZm8sIG1hcFByb3BlcnRpZXMsIG5vZGVzLCBlZGdlcywgaGlkZGVuID0gZmFsc2UpIHtcbiAgdmFyIHNiZ25tbFRleHQgPSBqc29uVG9TYmdubWwuY3JlYXRlU2Jnbm1sKGZpbGVuYW1lLCB2ZXJzaW9uLCByZW5kZXJJbmZvLCBtYXBQcm9wZXJ0aWVzLCBub2RlcywgZWRnZXMsIGhpZGRlbik7XG4gIHJldHVybiBzYmdubWxUZXh0O1xufTtcblxuIGZpbGVVdGlsaXRpZXMuZXhwb3J0TGF5b3V0RGF0YSA9IGZ1bmN0aW9uKGZpbGVuYW1lLCBieU5hbWUpIHtcbiAgIHZhciBsYXlvdXRUZXh0ID0gbGF5b3V0VG9UZXh0LmNvbnZlcnQoIGJ5TmFtZSApO1xuXG4gICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtsYXlvdXRUZXh0XSwge1xuICAgICB0eXBlOiBcInRleHQvcGxhaW47Y2hhcnNldD11dGYtODtcIixcbiAgIH0pO1xuICAgc2F2ZUFzKGJsb2IsIGZpbGVuYW1lKTtcbiB9O1xuXG4gZmlsZVV0aWxpdGllcy5zYXZlQXNQbGFpblNpZiA9IGZ1bmN0aW9uKGZpbGVuYW1lKSB7XG4gICB2YXIgdGV4dCA9IGpzb25Ub1NpZi5jb252ZXJ0KCk7XG5cbiAgIHZhciBibG9iID0gbmV3IEJsb2IoW3RleHRdLCB7XG4gICAgIHR5cGU6IFwidGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04O1wiLFxuICAgfSk7XG4gICBzYXZlQXMoYmxvYiwgZmlsZW5hbWUpO1xuIH07XG5cbiBmaWxlVXRpbGl0aWVzLmNvbnZlcnRTYmdubWxUZXh0VG9Kc29uID0gZnVuY3Rpb24oc2Jnbm1sVGV4dCl7XG4gICAgIHJldHVybiBzYmdubWxUb0pzb24uY29udmVydCh0ZXh0VG9YbWxPYmplY3Qoc2Jnbm1sVGV4dCkpO1xuIH07XG4gZmlsZVV0aWxpdGllcy5jb252ZXJ0U2JtbFRleHRUb0pzb24gPSBmdW5jdGlvbihzYmdubWxUZXh0KXtcbiAgcmV0dXJuIHNibWxUb0pzb24uY29udmVydCh0ZXh0VG9YbWxPYmplY3Qoc2Jnbm1sVGV4dCkpO1xufTtcblxuIGZpbGVVdGlsaXRpZXMuY29udmVydFNpZlRleHRUb0pzb24gPSBmdW5jdGlvbihzaWZUZXh0KXtcbiAgICAgICAgcmV0dXJuIHNpZlRvSnNvbi5jb252ZXJ0KHNpZlRleHQpO1xuIH07XG4gXG5maWxlVXRpbGl0aWVzLmNyZWF0ZUpzb25Gcm9tU0JHTiA9IGZ1bmN0aW9uKCl7XG5cblxuICAgIHZhciBzYmdubWxUZXh0ID0ganNvblRvU2Jnbm1sLmNyZWF0ZVNiZ25tbCgpO1xuICAgIHJldHVybiBzYmdubWxUb0pzb24uY29udmVydCh0ZXh0VG9YbWxPYmplY3Qoc2Jnbm1sVGV4dCkpO1xufTtcblxuZmlsZVV0aWxpdGllcy5jcmVhdGVKc29uRnJvbVNCTUwgPSBmdW5jdGlvbigpe1xuXG4gIHZhciBzYmdubWxUZXh0ID0ganNvblRvU2Jnbm1sLmNyZWF0ZVNiZ25tbCgpOyAvL1NCTUxcbiAgdmFyIGNvbnZlcnRlZF8gPSBzYm1sVG9Kc29uLmNvbnZlcnQodGV4dFRvWG1sT2JqZWN0KHNiZ25tbFRleHQpKTtcbiAgcmV0dXJuIGNvbnZlcnRlZF87XG59O1xuXG5maWxlVXRpbGl0aWVzLmNyZWF0ZUpzb25Gcm9tU2lmID0gZnVuY3Rpb24oKXtcblxuICAgIHZhciBzaWZUZXh0ID0ganNvblRvU2lmLmNvbnZlcnQoKTtcbiAgICByZXR1cm4gc2lmVG9Kc29uLmNvbnZlcnQoc2lmVGV4dCk7XG4gICAgXG59O1xuXG5maWxlVXRpbGl0aWVzLmNvbnZlcnRTYmdubWxUb0NEID0gZnVuY3Rpb24oc2Jnbm1sLCBjYWxsYmFjayl7XG4gICBcbiAgcmV0dXJuIHNiZ25tbFRvQ2QuY29udmVydChzYmdubWwsY2FsbGJhY2spO1xufTtcblxuZmlsZVV0aWxpdGllcy5jb252ZXJ0Q0RUb1NiZ25tbCA9IGZ1bmN0aW9uKHhtbCxjYWxsYmFjayl7XG5cbiAgcmV0dXJuIGNkVG9TYmdubWwuY29udmVydCh4bWwsY2FsbGJhY2spO1xufTtcblxuZmlsZVV0aWxpdGllcy5jb252ZXJ0U2Jnbm1sVG9TYm1sID0gZnVuY3Rpb24oc2Jnbm1sLCBjYWxsYmFjayl7XG4gICBcbiAgcmV0dXJuIHNiZ25tbFRvU2JtbC5jb252ZXJ0KHNiZ25tbCxjYWxsYmFjayk7XG59O1xuXG5maWxlVXRpbGl0aWVzLmNvbnZlcnRTYm1sVG9TYmdubWwgPSBmdW5jdGlvbihzYm1sLCBjYWxsYmFjayl7XG4gIHJldHVybiBzYm1sVG9TYmdubWwuY29udmVydChzYm1sLGNhbGxiYWNrKTtcbn07XG5cbmZpbGVVdGlsaXRpZXMuY29udmVydEdwbWxUb1NiZ25tbCA9IGZ1bmN0aW9uKGdwbWwsIGNhbGxiYWNrKXtcbiAgcmV0dXJuIGdwbWxUb1NiZ25tbC5jb252ZXJ0KGdwbWwsY2FsbGJhY2spO1xufTtcblxuZmlsZVV0aWxpdGllcy5jb252ZXJ0U2Jnbm1sVG9HcG1sID0gZnVuY3Rpb24oc2Jnbm1sLCBjYWxsYmFjayl7XG4gICBcbiAgcmV0dXJuIHNiZ25tbFRvR3BtbC5jb252ZXJ0KHNiZ25tbCxjYWxsYmFjayk7XG59O1xuXG4gcmV0dXJuIGZpbGVVdGlsaXRpZXM7XG59O1xuIl0sIm5hbWVzIjpbIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJlIiwidCIsInIiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJuIiwiaGFzT3duUHJvcGVydHkiLCJvIiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsImkiLCJTeW1ib2wiLCJhIiwiaXRlcmF0b3IiLCJjIiwiYXN5bmNJdGVyYXRvciIsInUiLCJ0b1N0cmluZ1RhZyIsImRlZmluZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIndyYXAiLCJHZW5lcmF0b3IiLCJjcmVhdGUiLCJDb250ZXh0IiwibWFrZUludm9rZU1ldGhvZCIsInRyeUNhdGNoIiwidHlwZSIsImFyZyIsImNhbGwiLCJoIiwibCIsImYiLCJzIiwieSIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJwIiwiZCIsImdldFByb3RvdHlwZU9mIiwidiIsInZhbHVlcyIsImciLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJmb3JFYWNoIiwiX2ludm9rZSIsIkFzeW5jSXRlcmF0b3IiLCJpbnZva2UiLCJfdHlwZW9mIiwicmVzb2x2ZSIsIl9fYXdhaXQiLCJ0aGVuIiwiY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmciLCJFcnJvciIsImRvbmUiLCJtZXRob2QiLCJkZWxlZ2F0ZSIsIm1heWJlSW52b2tlRGVsZWdhdGUiLCJzZW50IiwiX3NlbnQiLCJkaXNwYXRjaEV4Y2VwdGlvbiIsImFicnVwdCIsIlR5cGVFcnJvciIsInJlc3VsdE5hbWUiLCJuZXh0IiwibmV4dExvYyIsInB1c2hUcnlFbnRyeSIsInRyeUxvYyIsImNhdGNoTG9jIiwiZmluYWxseUxvYyIsImFmdGVyTG9jIiwidHJ5RW50cmllcyIsInB1c2giLCJyZXNldFRyeUVudHJ5IiwiY29tcGxldGlvbiIsInJlc2V0IiwiaXNOYU4iLCJsZW5ndGgiLCJkaXNwbGF5TmFtZSIsImlzR2VuZXJhdG9yRnVuY3Rpb24iLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJtYXJrIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJhd3JhcCIsImFzeW5jIiwiUHJvbWlzZSIsImtleXMiLCJyZXZlcnNlIiwicG9wIiwicHJldiIsImNoYXJBdCIsInNsaWNlIiwic3RvcCIsInJ2YWwiLCJoYW5kbGUiLCJjb21wbGV0ZSIsImZpbmlzaCIsIl9jYXRjaCIsImRlbGVnYXRlWWllbGQiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJfYXN5bmNUb0dlbmVyYXRvciIsImFyZ3VtZW50cyIsImFwcGx5IiwiX25leHQiLCJfdGhyb3ciLCJsaWJVdGlsaXRpZXMiLCJyZXF1aXJlIiwibGlicyIsImdldExpYnMiLCJqUXVlcnkiLCIkIiwic2F2ZUFzIiwidGV4dFV0aWxpdGllcyIsIm1vZHVsZSIsImV4cG9ydHMiLCJiNjR0b0Jsb2IiLCJiNjREYXRhIiwiY29udGVudFR5cGUiLCJzbGljZVNpemUiLCJieXRlQ2hhcmFjdGVycyIsImF0b2IiLCJieXRlQXJyYXlzIiwib2Zmc2V0IiwiYnl0ZU51bWJlcnMiLCJBcnJheSIsImNoYXJDb2RlQXQiLCJieXRlQXJyYXkiLCJVaW50OEFycmF5IiwiYmxvYiIsIkJsb2IiLCJsb2FkVGV4dERvYyIsImZ1bGxGaWxlUGF0aCIsIndpbmRvdyIsIlhNTEh0dHBSZXF1ZXN0IiwieGh0dHAiLCJBY3RpdmVYT2JqZWN0Iiwib3ZlcnJpZGVNaW1lVHlwZSIsIm9wZW4iLCJzZW5kIiwicmVzcG9uc2VUZXh0IiwibG9hZFhNTERvYyIsInJlc3BvbnNlWE1MIiwidGV4dFRvWG1sT2JqZWN0IiwidGV4dCIsImRvYyIsImxvYWRYTUwiLCJwYXJzZXIiLCJET01QYXJzZXIiLCJwYXJzZUZyb21TdHJpbmciLCJzYmdubWxUb0pzb24iLCJzYm1sVG9Kc29uIiwianNvblRvU2Jnbm1sIiwianNvblRvU2JtbCIsImpzb25Ub053dCIsInVpVXRpbGl0aWVzIiwidGRUb0pzb24iLCJzaWZUb0pzb24iLCJncmFwaFV0aWxpdGllcyIsImxheW91dFRvVGV4dCIsIm53dFRvSnNvbiIsImpzb25Ub1NpZiIsInNiZ25tbFRvQ2QiLCJjZFRvU2Jnbm1sIiwic2Jnbm1sVG9TYm1sIiwic2JtbFRvU2Jnbm1sIiwidXBkYXRlR3JhcGgiLCJvcHRpb25zIiwiY3kiLCJmaWxlVXRpbGl0aWVzIiwicGFyYW0iLCJzYmdubWxUb0pzb25Db252ZXJ0ZXIiLCJzYm1sVG9Kc29uQ29udmVydGVyIiwibnd0VG9Kc29uQ29udmVydGVyIiwianNvblRvU2Jnbm1sQ29udmVydGVyIiwianNvblRvU2JtbENvbnZlcnRlciIsImpzb25Ub053dENvbnZlcnRlciIsImpzb25Ub1NpZkNvbnZlcnRlciIsInRkVG9Kc29uQ29udmVydGVyIiwic2lmVG9Kc29uQ29udmVydGVyIiwiYmluZCIsIm9wdGlvblV0aWxpdGllcyIsImdldE9wdGlvbnMiLCJzYmduQ3lJbnN0YW5jZSIsImdldEN5Iiwic2Jnbm1sVG9DZENvbnZlcnRlciIsImNkVG9TYmdubWxDb252ZXJ0ZXIiLCJzYmdubWxUb1NibWxDb252ZXJ0ZXIiLCJzYm1sVG9TYmdubWxDb252ZXJ0ZXIiLCJncG1sVG9TYmdubWwiLCJncG1sVG9TYmdubWxDb252ZXJ0ZXIiLCJzYmdubWxUb0dwbWwiLCJzYmdubWxUb0dwbWxDb252ZXJ0ZXIiLCJzYXZlQXNQbmciLCJmaWxlbmFtZSIsInNjYWxlIiwiYmciLCJtYXhXaWR0aCIsIm1heEhlaWdodCIsInBuZ0NvbnRlbnQiLCJwbmciLCJmdWxsIiwiYjY0ZGF0YSIsInN1YnN0ciIsImluZGV4T2YiLCJzYXZlQXNKcGciLCJxdWFsaXR5IiwianBnQ29udGVudCIsImpwZyIsInNhdmVBc1N2ZyIsInN2Z0NvbnRlbnQiLCJzdmciLCJsb2FkU2FtcGxlIiwiZm9sZGVycGF0aCIsImNhbGxiYWNrIiwiZmlsZSIsInN0YXJ0U3Bpbm5lciIsImRvY3VtZW50IiwidHJpZ2dlciIsIm1hdGNoUmVzdWx0IiwibWF0Y2giLCJyZW5kZXJJbmZvU3RyaW5nIiwicmVuZGVySW5mb1N0cmluZ0NvcHkiLCJyZWdleCIsInJlc3VsdCIsIm1hdGNoZXMiLCJleGVjIiwicmVwbGFjZSIsIkZyb21LZWJhYlRvQ2FtZWxDYXNlIiwieG1sT2JqZWN0Iiwic2V0VGltZW91dCIsImNvbnZlcnQiLCJjb2xsYXBzZU1hcmtlZE5vZGVzIiwiZW5kU3Bpbm5lciIsImxvYWRTSUZGaWxlIiwibGF5b3V0QnkiLCJydW5MYXlvdXQiLCJsYXlvdXQiLCJydW4iLCJmaXQiLCJlbGVtZW50cyIsImxvYWRGaWxlIiwidW5kZWZpbmVkIiwibG9hZFRERmlsZSIsImZ1bmN0aW9uTmFtZSIsImxvYWRTQkdOTUxGaWxlIiwiY2FsbGJhY2sxIiwiY2FsbGJhY2syIiwibG9hZE53dEZpbGUiLCJ1cmxQYXJhbXMiLCJub2Rlc1RvQ29sbGFwc2UiLCJub2RlcyIsImV4cGFuZENvbGxhcHNlIiwiY29sbGFwc2UiLCJlbGUiLCJlbGVzIiwicG9zaXRpb24iLCJkYXRhIiwicmVtb3ZlRGF0YSIsImNvbnZlcnRGY24iLCJjYWxsYmFjazMiLCJjYWxsYmFjazQiLCJzZWxmIiwidGV4dFR5cGUiLCJyZWFkZXIiLCJGaWxlUmVhZGVyIiwib25sb2FkIiwiaW1hZ2VzRWxlbWVudE1hdGNoIiwiaW1hZ2VzRWxlbWVudCIsImltYWdlc0VsZW1lbnRNYXRjaERpcnR5IiwiY3lHcmFwaCIsImVyciIsImNvbnNvbGUiLCJsb2ciLCJyZWFkQXNUZXh0IiwibG9hZFNCR05NTFRleHQiLCJfcmVmIiwiX2NhbGxlZSIsInRleHREYXRhIiwidGlsZUluZm9Cb3hlcyIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJfeCIsIl94MiIsIl94MyIsIl94NCIsIl94NSIsImxvYWRTQk1MVGV4dCIsIl9yZWYyIiwiX2NhbGxlZTIiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJfeDYiLCJfeDciLCJfeDgiLCJfeDkiLCJfeDEwIiwic2F2ZUFzU2Jnbm1sIiwidmVyc2lvbiIsInJlbmRlckluZm8iLCJtYXBQcm9wZXJ0aWVzIiwiZWRnZXMiLCJzYmdubWxUZXh0IiwiY3JlYXRlU2Jnbm1sIiwic2F2ZUFzU2Jnbm1sRm9yU0JNTCIsImVycm9yQ2FsbGJhY2siLCJzYmduVGV4dCIsImNyZWF0ZVNibWwiLCJjb252ZXJ0U2JtbFRvU2Jnbm1sIiwibWVzc2FnZSIsInNhdmVBc053dCIsImNyZWF0ZU53dCIsInNhdmVBc0NlbGxEZXNpZ25lciIsInNiZ25tbCIsImNvbnZlcnRTYmdubWxUb0NEIiwibG9hZENlbGxEZXNpZ25lciIsInN1Y2Nlc3NDYWxsYmFjayIsInRhcmdldCIsInNhdmVBc1NibWwiLCJjb252ZXJ0U2JnbiIsImNvbnZlcnRTYmdubWxUb1NibWwiLCJlcnJvciIsInNhdmVTYm1sRm9yU0JNTCIsImhhc0xheW91dFNCTUwiLCJyZWplY3QiLCJsYXlvdXRGb3VuZCIsIm9uZXJyb3IiLCJsb2FkU2JtbEZvclNCTUwiLCJfcmVmMyIsIl9jYWxsZWUzIiwiX2NhbGxlZTMkIiwiX2NvbnRleHQzIiwiY29udmVydGVkIiwiX3gxMSIsIl94MTIiLCJfeDEzIiwiX3gxNCIsImxvYWRTYm1sIiwic2F2ZUFzR3BtbCIsImNvbnZlcnRTYmdubWxUb0dwbWwiLCJsb2FkR3BtbCIsImhpZGRlbiIsImV4cG9ydExheW91dERhdGEiLCJieU5hbWUiLCJsYXlvdXRUZXh0Iiwic2F2ZUFzUGxhaW5TaWYiLCJjb252ZXJ0U2Jnbm1sVGV4dFRvSnNvbiIsImNvbnZlcnRTYm1sVGV4dFRvSnNvbiIsImNvbnZlcnRTaWZUZXh0VG9Kc29uIiwic2lmVGV4dCIsImNyZWF0ZUpzb25Gcm9tU0JHTiIsImNyZWF0ZUpzb25Gcm9tU0JNTCIsImNvbnZlcnRlZF8iLCJjcmVhdGVKc29uRnJvbVNpZiIsImNvbnZlcnRDRFRvU2Jnbm1sIiwieG1sIiwic2JtbCIsImNvbnZlcnRHcG1sVG9TYmdubWwiLCJncG1sIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/utilities/file-utilities-factory.js\n"); +eval("/* provided dependency */ var console = __webpack_require__(/*! ./node_modules/console-browserify/index.js */ \"./node_modules/console-browserify/index.js\");\nfunction _typeof(o) { \"@babel/helpers - typeof\"; return _typeof = \"function\" == typeof Symbol && \"symbol\" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && \"function\" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? \"symbol\" : typeof o; }, _typeof(o); }\nfunction _regeneratorRuntime() { \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */ _regeneratorRuntime = function _regeneratorRuntime() { return e; }; var t, e = {}, r = Object.prototype, n = r.hasOwnProperty, o = Object.defineProperty || function (t, e, r) { t[e] = r.value; }, i = \"function\" == typeof Symbol ? Symbol : {}, a = i.iterator || \"@@iterator\", c = i.asyncIterator || \"@@asyncIterator\", u = i.toStringTag || \"@@toStringTag\"; function define(t, e, r) { return Object.defineProperty(t, e, { value: r, enumerable: !0, configurable: !0, writable: !0 }), t[e]; } try { define({}, \"\"); } catch (t) { define = function define(t, e, r) { return t[e] = r; }; } function wrap(t, e, r, n) { var i = e && e.prototype instanceof Generator ? e : Generator, a = Object.create(i.prototype), c = new Context(n || []); return o(a, \"_invoke\", { value: makeInvokeMethod(t, r, c) }), a; } function tryCatch(t, e, r) { try { return { type: \"normal\", arg: t.call(e, r) }; } catch (t) { return { type: \"throw\", arg: t }; } } e.wrap = wrap; var h = \"suspendedStart\", l = \"suspendedYield\", f = \"executing\", s = \"completed\", y = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} var p = {}; define(p, a, function () { return this; }); var d = Object.getPrototypeOf, v = d && d(d(values([]))); v && v !== r && n.call(v, a) && (p = v); var g = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(p); function defineIteratorMethods(t) { [\"next\", \"throw\", \"return\"].forEach(function (e) { define(t, e, function (t) { return this._invoke(e, t); }); }); } function AsyncIterator(t, e) { function invoke(r, o, i, a) { var c = tryCatch(t[r], t, o); if (\"throw\" !== c.type) { var u = c.arg, h = u.value; return h && \"object\" == _typeof(h) && n.call(h, \"__await\") ? e.resolve(h.__await).then(function (t) { invoke(\"next\", t, i, a); }, function (t) { invoke(\"throw\", t, i, a); }) : e.resolve(h).then(function (t) { u.value = t, i(u); }, function (t) { return invoke(\"throw\", t, i, a); }); } a(c.arg); } var r; o(this, \"_invoke\", { value: function value(t, n) { function callInvokeWithMethodAndArg() { return new e(function (e, r) { invoke(t, n, e, r); }); } return r = r ? r.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg(); } }); } function makeInvokeMethod(e, r, n) { var o = h; return function (i, a) { if (o === f) throw Error(\"Generator is already running\"); if (o === s) { if (\"throw\" === i) throw a; return { value: t, done: !0 }; } for (n.method = i, n.arg = a;;) { var c = n.delegate; if (c) { var u = maybeInvokeDelegate(c, n); if (u) { if (u === y) continue; return u; } } if (\"next\" === n.method) n.sent = n._sent = n.arg;else if (\"throw\" === n.method) { if (o === h) throw o = s, n.arg; n.dispatchException(n.arg); } else \"return\" === n.method && n.abrupt(\"return\", n.arg); o = f; var p = tryCatch(e, r, n); if (\"normal\" === p.type) { if (o = n.done ? s : l, p.arg === y) continue; return { value: p.arg, done: n.done }; } \"throw\" === p.type && (o = s, n.method = \"throw\", n.arg = p.arg); } }; } function maybeInvokeDelegate(e, r) { var n = r.method, o = e.iterator[n]; if (o === t) return r.delegate = null, \"throw\" === n && e.iterator[\"return\"] && (r.method = \"return\", r.arg = t, maybeInvokeDelegate(e, r), \"throw\" === r.method) || \"return\" !== n && (r.method = \"throw\", r.arg = new TypeError(\"The iterator does not provide a '\" + n + \"' method\")), y; var i = tryCatch(o, e.iterator, r.arg); if (\"throw\" === i.type) return r.method = \"throw\", r.arg = i.arg, r.delegate = null, y; var a = i.arg; return a ? a.done ? (r[e.resultName] = a.value, r.next = e.nextLoc, \"return\" !== r.method && (r.method = \"next\", r.arg = t), r.delegate = null, y) : a : (r.method = \"throw\", r.arg = new TypeError(\"iterator result is not an object\"), r.delegate = null, y); } function pushTryEntry(t) { var e = { tryLoc: t[0] }; 1 in t && (e.catchLoc = t[1]), 2 in t && (e.finallyLoc = t[2], e.afterLoc = t[3]), this.tryEntries.push(e); } function resetTryEntry(t) { var e = t.completion || {}; e.type = \"normal\", delete e.arg, t.completion = e; } function Context(t) { this.tryEntries = [{ tryLoc: \"root\" }], t.forEach(pushTryEntry, this), this.reset(!0); } function values(e) { if (e || \"\" === e) { var r = e[a]; if (r) return r.call(e); if (\"function\" == typeof e.next) return e; if (!isNaN(e.length)) { var o = -1, i = function next() { for (; ++o < e.length;) if (n.call(e, o)) return next.value = e[o], next.done = !1, next; return next.value = t, next.done = !0, next; }; return i.next = i; } } throw new TypeError(_typeof(e) + \" is not iterable\"); } return GeneratorFunction.prototype = GeneratorFunctionPrototype, o(g, \"constructor\", { value: GeneratorFunctionPrototype, configurable: !0 }), o(GeneratorFunctionPrototype, \"constructor\", { value: GeneratorFunction, configurable: !0 }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, u, \"GeneratorFunction\"), e.isGeneratorFunction = function (t) { var e = \"function\" == typeof t && t.constructor; return !!e && (e === GeneratorFunction || \"GeneratorFunction\" === (e.displayName || e.name)); }, e.mark = function (t) { return Object.setPrototypeOf ? Object.setPrototypeOf(t, GeneratorFunctionPrototype) : (t.__proto__ = GeneratorFunctionPrototype, define(t, u, \"GeneratorFunction\")), t.prototype = Object.create(g), t; }, e.awrap = function (t) { return { __await: t }; }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, c, function () { return this; }), e.AsyncIterator = AsyncIterator, e.async = function (t, r, n, o, i) { void 0 === i && (i = Promise); var a = new AsyncIterator(wrap(t, r, n, o), i); return e.isGeneratorFunction(r) ? a : a.next().then(function (t) { return t.done ? t.value : a.next(); }); }, defineIteratorMethods(g), define(g, u, \"Generator\"), define(g, a, function () { return this; }), define(g, \"toString\", function () { return \"[object Generator]\"; }), e.keys = function (t) { var e = Object(t), r = []; for (var n in e) r.push(n); return r.reverse(), function next() { for (; r.length;) { var t = r.pop(); if (t in e) return next.value = t, next.done = !1, next; } return next.done = !0, next; }; }, e.values = values, Context.prototype = { constructor: Context, reset: function reset(e) { if (this.prev = 0, this.next = 0, this.sent = this._sent = t, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = t, this.tryEntries.forEach(resetTryEntry), !e) for (var r in this) \"t\" === r.charAt(0) && n.call(this, r) && !isNaN(+r.slice(1)) && (this[r] = t); }, stop: function stop() { this.done = !0; var t = this.tryEntries[0].completion; if (\"throw\" === t.type) throw t.arg; return this.rval; }, dispatchException: function dispatchException(e) { if (this.done) throw e; var r = this; function handle(n, o) { return a.type = \"throw\", a.arg = e, r.next = n, o && (r.method = \"next\", r.arg = t), !!o; } for (var o = this.tryEntries.length - 1; o >= 0; --o) { var i = this.tryEntries[o], a = i.completion; if (\"root\" === i.tryLoc) return handle(\"end\"); if (i.tryLoc <= this.prev) { var c = n.call(i, \"catchLoc\"), u = n.call(i, \"finallyLoc\"); if (c && u) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } else if (c) { if (this.prev < i.catchLoc) return handle(i.catchLoc, !0); } else { if (!u) throw Error(\"try statement without catch or finally\"); if (this.prev < i.finallyLoc) return handle(i.finallyLoc); } } } }, abrupt: function abrupt(t, e) { for (var r = this.tryEntries.length - 1; r >= 0; --r) { var o = this.tryEntries[r]; if (o.tryLoc <= this.prev && n.call(o, \"finallyLoc\") && this.prev < o.finallyLoc) { var i = o; break; } } i && (\"break\" === t || \"continue\" === t) && i.tryLoc <= e && e <= i.finallyLoc && (i = null); var a = i ? i.completion : {}; return a.type = t, a.arg = e, i ? (this.method = \"next\", this.next = i.finallyLoc, y) : this.complete(a); }, complete: function complete(t, e) { if (\"throw\" === t.type) throw t.arg; return \"break\" === t.type || \"continue\" === t.type ? this.next = t.arg : \"return\" === t.type ? (this.rval = this.arg = t.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === t.type && e && (this.next = e), y; }, finish: function finish(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.finallyLoc === t) return this.complete(r.completion, r.afterLoc), resetTryEntry(r), y; } }, \"catch\": function _catch(t) { for (var e = this.tryEntries.length - 1; e >= 0; --e) { var r = this.tryEntries[e]; if (r.tryLoc === t) { var n = r.completion; if (\"throw\" === n.type) { var o = n.arg; resetTryEntry(r); } return o; } } throw Error(\"illegal catch attempt\"); }, delegateYield: function delegateYield(e, r, n) { return this.delegate = { iterator: values(e), resultName: r, nextLoc: n }, \"next\" === this.method && (this.arg = t), y; } }, e; }\nfunction asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }\nfunction _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"next\", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, \"throw\", n); } _next(void 0); }); }; }\n/*\n* File Utilities: To be used on read/write file operation\n*/\n\nvar libUtilities = __webpack_require__(/*! ./lib-utilities */ \"./src/utilities/lib-utilities.js\");\nvar libs = libUtilities.getLibs();\nvar jQuery = $ = libs.jQuery;\nvar saveAs = libs.saveAs;\nvar textUtilities = __webpack_require__(/*! ./text-utilities */ \"./src/utilities/text-utilities.js\");\nmodule.exports = function () {\n // Helper functions Start\n // see http://stackoverflow.com/questions/16245767/creating-a-blob-from-a-base64-string-in-javascript\n function b64toBlob(b64Data, contentType, sliceSize) {\n contentType = contentType || '';\n sliceSize = sliceSize || 512;\n var byteCharacters = atob(b64Data);\n var byteArrays = [];\n for (var offset = 0; offset < byteCharacters.length; offset += sliceSize) {\n var slice = byteCharacters.slice(offset, offset + sliceSize);\n var byteNumbers = new Array(slice.length);\n for (var i = 0; i < slice.length; i++) {\n byteNumbers[i] = slice.charCodeAt(i);\n }\n var byteArray = new Uint8Array(byteNumbers);\n byteArrays.push(byteArray);\n }\n var blob = new Blob(byteArrays, {\n type: contentType\n });\n return blob;\n }\n function loadTextDoc(fullFilePath) {\n if (window.XMLHttpRequest) {\n xhttp = new XMLHttpRequest();\n } else {\n xhttp = new ActiveXObject(\"Microsoft.XMLHTTP\");\n }\n xhttp.overrideMimeType('application/text');\n xhttp.open(\"GET\", fullFilePath, false);\n xhttp.send();\n return xhttp.responseText;\n }\n function loadXMLDoc(fullFilePath) {\n if (window.XMLHttpRequest) {\n xhttp = new XMLHttpRequest();\n } else {\n xhttp = new ActiveXObject(\"Microsoft.XMLHTTP\");\n }\n xhttp.overrideMimeType('application/xml');\n xhttp.open(\"GET\", fullFilePath, false);\n xhttp.send();\n return xhttp.responseXML;\n }\n\n // Should this be exposed or should this be moved to the helper functions section?\n function textToXmlObject(text) {\n if (window.ActiveXObject) {\n var doc = new ActiveXObject('Microsoft.XMLDOM');\n doc.async = 'false';\n doc.loadXML(text);\n } else {\n var parser = new DOMParser();\n var doc = parser.parseFromString(text, 'text/xml');\n }\n return doc;\n }\n // Helper functions End\n\n var sbgnmlToJson, sbmlToJson, jsonToSbgnml, jsonToSbml, jsonToNwt, uiUtilities, tdToJson, sifToJson, graphUtilities, layoutToText, nwtToJson, jsonToSif, sbgnmlToCd, cdToSbgnml, sbgnmlToSbml, sbmlToSbgnml;\n var updateGraph;\n var options, cy;\n function fileUtilities(param) {\n sbgnmlToJson = param.sbgnmlToJsonConverter;\n sbmlToJson = param.sbmlToJsonConverter;\n nwtToJson = param.nwtToJsonConverter;\n jsonToSbgnml = param.jsonToSbgnmlConverter;\n jsonToSbml = param.jsonToSbmlConverter;\n jsonToNwt = param.jsonToNwtConverter;\n jsonToSif = param.jsonToSifConverter;\n uiUtilities = param.uiUtilities;\n tdToJson = param.tdToJsonConverter;\n sifToJson = param.sifToJsonConverter;\n layoutToText = param.layoutToText;\n graphUtilities = param.graphUtilities;\n updateGraph = graphUtilities.updateGraph.bind(graphUtilities);\n options = param.optionUtilities.getOptions();\n cy = param.sbgnCyInstance.getCy();\n sbgnmlToCd = param.sbgnmlToCdConverter;\n cdToSbgnml = param.cdToSbgnmlConverter;\n sbgnmlToSbml = param.sbgnmlToSbmlConverter;\n sbmlToSbgnml = param.sbmlToSbgnmlConverter;\n gpmlToSbgnml = param.gpmlToSbgnmlConverter;\n sbgnmlToGpml = param.sbgnmlToGpmlConverter;\n }\n fileUtilities.loadXMLDoc = loadXMLDoc;\n fileUtilities.textToXmlObject = textToXmlObject;\n fileUtilities.saveAsPng = function (filename, scale, bg, maxWidth, maxHeight) {\n if (maxWidth || maxHeight) {\n var pngContent = cy.png({\n full: true,\n bg: bg,\n maxWidth: maxWidth,\n maxHeight: maxHeight\n });\n } else {\n var pngContent = cy.png({\n scale: scale || 3,\n full: true,\n bg: bg\n });\n }\n\n // this is to remove the beginning of the pngContent: data:img/png;base64,\n var b64data = pngContent.substr(pngContent.indexOf(\",\") + 1);\n\n // lower quality when response is empty\n if (!b64data || b64data === \"\") {\n pngContent = cy.png({\n maxWidth: 15000,\n maxHeight: 15000,\n full: true,\n bg: bg\n });\n b64data = pngContent.substr(pngContent.indexOf(\",\") + 1);\n }\n saveAs(b64toBlob(b64data, \"image/png\"), filename || \"network.png\");\n };\n fileUtilities.saveAsJpg = function (filename, scale, bg, maxWidth, maxHeight, quality) {\n if (maxWidth || maxHeight) {\n var jpgContent = cy.jpg({\n full: true,\n bg: bg,\n maxWidth: maxWidth,\n maxHeight: maxHeight,\n quality: quality\n });\n } else {\n var jpgContent = cy.jpg({\n scale: scale || 3,\n full: true,\n bg: bg,\n quality: quality\n });\n }\n\n // this is to remove the beginning of the pngContent: data:img/png;base64,\n var b64data = jpgContent.substr(jpgContent.indexOf(\",\") + 1);\n\n // lower quality when response is empty\n if (!b64data || b64data === \"\") {\n jpgContent = cy.jpg({\n maxWidth: 15000,\n maxHeight: 15000,\n full: true,\n bg: bg\n });\n b64data = jpgContent.substr(jpgContent.indexOf(\",\") + 1);\n }\n saveAs(b64toBlob(b64data, \"image/jpg\"), filename || \"network.jpg\");\n };\n fileUtilities.saveAsSvg = function (filename, scale, bg, maxWidth, maxHeight) {\n if (maxWidth || maxHeight) {\n var svgContent = cy.svg({\n full: true,\n bg: bg,\n maxWidth: maxWidth,\n maxHeight: maxHeight\n });\n } else {\n var svgContent = cy.svg({\n scale: scale || 1,\n full: true,\n bg: bg\n });\n }\n saveAs(new Blob([svgContent], {\n type: \"image/svg+xml;charset=utf-8\"\n }), filename || \"network.svg\");\n };\n fileUtilities.loadSample = function (filename, folderpath, callback) {\n var file = (folderpath || 'sample-app/samples/') + filename;\n uiUtilities.startSpinner(\"load-spinner\");\n // Users may want to do customized things while a sample is being loaded\n // Trigger an event for this purpose and specify the 'filename' as an event parameter\n $(document).trigger(\"sbgnvizLoadSample\", [filename, cy]); // Aliases for sbgnvizLoadSampleStart\n $(document).trigger(\"sbgnvizLoadSampleStart\", [filename, cy]);\n var text = loadTextDoc(file);\n var matchResult = text.match(\"\");\n if (matchResult != null) {\n var renderInfoString = matchResult[0];\n var renderInfoStringCopy = (' ' + renderInfoString).slice(1);\n var regex = /\\s([\\S]+)([\\s]*)=/g;\n var result;\n var matches = [];\n while (result = regex.exec(renderInfoString)) {\n matches.push(result[0]);\n }\n ;\n matches.forEach(function (match) {\n renderInfoString = renderInfoString.replace(match, textUtilities.FromKebabToCamelCase(match));\n });\n text = text.replace(renderInfoStringCopy, renderInfoString);\n }\n var xmlObject = textToXmlObject(text);\n setTimeout(function () {\n updateGraph(nwtToJson.convert(xmlObject));\n fileUtilities.collapseMarkedNodes();\n uiUtilities.endSpinner(\"load-spinner\");\n $(document).trigger(\"sbgnvizLoadSampleEnd\", [filename, cy]); // Trigger an event signaling that a sample is loaded\n if (typeof callback !== 'undefined') {\n callback();\n }\n }, 0);\n };\n fileUtilities.loadSIFFile = function (file, layoutBy, callback) {\n var convert = function convert(text) {\n return sifToJson.convert(text);\n };\n var runLayout = function runLayout() {\n if (layoutBy) {\n if (typeof layoutBy === 'function') {\n layoutBy();\n } else {\n var layout = cy.layout(layoutBy);\n\n // for backward compatibility need to make this if check\n if (layout && layout.run) {\n layout.run();\n }\n }\n }\n cy.fit(cy.elements(\":visible\"), 20);\n };\n fileUtilities.loadFile(file, convert, undefined, callback, undefined, runLayout);\n };\n fileUtilities.loadTDFile = function functionName(file, callback) {\n var convert = function convert(text) {\n return tdToJson.convert(text);\n };\n fileUtilities.loadFile(file, convert, undefined, callback);\n };\n fileUtilities.loadSBGNMLFile = function (file, callback1, callback2) {\n var convert = function convert(text) {\n return sbgnmlToJson.convert(textToXmlObject(text));\n };\n fileUtilities.loadFile(file, convert, callback1, callback2, fileUtilities.collapseMarkedNodes);\n };\n fileUtilities.loadNwtFile = function (file, callback1, callback2, urlParams) {\n var convert = function convert(text) {\n return nwtToJson.convert(textToXmlObject(text), urlParams);\n };\n fileUtilities.loadFile(file, convert, callback1, callback2, fileUtilities.collapseMarkedNodes);\n };\n\n // collapse the nodes whose collapse data field is set\n fileUtilities.collapseMarkedNodes = function () {\n // collapse nodes\n var nodesToCollapse = cy.nodes(\"[collapse]\");\n if (nodesToCollapse.length > 0) {\n cy.expandCollapse('get').collapse(nodesToCollapse, {\n layoutBy: null\n });\n nodesToCollapse.forEach(function (ele, i, eles) {\n ele.position(ele.data(\"positionBeforeSaving\"));\n });\n nodesToCollapse.removeData(\"positionBeforeSaving\");\n }\n };\n\n /*\n callback is a function remotely defined to add specific behavior that isn't implemented here.\n it is completely optional.\n signature: callback(textXml)\n */\n fileUtilities.loadFile = function (file, convertFcn, callback1, callback2, callback3, callback4) {\n var self = this;\n uiUtilities.startSpinner(\"load-file-spinner\");\n var textType = /text.*/;\n var reader = new FileReader();\n reader.onload = function (e) {\n var text = this.result;\n var matchResult = text.match(\"\");\n if (matchResult != null) {\n var imagesElementMatch = text.match(\"\");\n var imagesElement;\n if (imagesElementMatch != null) {\n imagesElement = imagesElementMatch[0];\n }\n var renderInfoString = matchResult[0];\n var renderInfoStringCopy = (' ' + renderInfoString).slice(1);\n var regex = /\\s([\\S]+)([\\s]*)=/g;\n var result;\n var matches = [];\n while (result = regex.exec(renderInfoString)) {\n matches.push(result[0]);\n }\n ;\n matches.forEach(function (match) {\n renderInfoString = renderInfoString.replace(match, textUtilities.FromKebabToCamelCase(match));\n });\n text = text.replace(renderInfoStringCopy, renderInfoString);\n var imagesElementMatchDirty = text.match(\"\");\n if (imagesElementMatchDirty != null) {\n text = text.replace(imagesElementMatchDirty[0], imagesElement);\n }\n }\n setTimeout(function () {\n if (typeof callback1 !== 'undefined') callback1(text);\n var cyGraph;\n try {\n cyGraph = convertFcn(text);\n // Users may want to do customized things while an external file is being loaded\n // Trigger an event for this purpose and specify the 'filename' as an event parameter\n $(document).trigger(\"sbgnvizLoadFile\", [file.name, cy]); // Aliases for sbgnvizLoadFileStart\n $(document).trigger(\"sbgnvizLoadFileStart\", [file.name, cy]);\n } catch (err) {\n uiUtilities.endSpinner(\"load-file-spinner\");\n console.log(err);\n if (typeof callback2 !== 'undefined') callback2();\n return;\n }\n updateGraph(cyGraph);\n if (typeof callback3 !== 'undefined') {\n callback3();\n }\n uiUtilities.endSpinner(\"load-file-spinner\");\n $(document).trigger(\"sbgnvizLoadFileEnd\", [file.name, cy]); // Trigger an event signaling that a file is loaded\n\n if (typeof callback4 !== 'undefined') {\n callback4();\n }\n }, 0);\n };\n reader.readAsText(file);\n };\n fileUtilities.loadSBGNMLText = /*#__PURE__*/function () {\n var _ref = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee(textData, tileInfoBoxes, filename, cy, urlParams) {\n return _regeneratorRuntime().wrap(function _callee$(_context) {\n while (1) switch (_context.prev = _context.next) {\n case 0:\n _context.next = 2;\n return updateGraph(sbgnmlToJson.convert(textToXmlObject(textData), urlParams), undefined, undefined, tileInfoBoxes);\n case 2:\n _context.next = 4;\n return $(document).trigger(\"sbgnvizLoadFileEnd\", [filename, cy]);\n case 4:\n uiUtilities.endSpinner(\"load-file-spinner\");\n case 5:\n case \"end\":\n return _context.stop();\n }\n }, _callee);\n }));\n return function (_x, _x2, _x3, _x4, _x5) {\n return _ref.apply(this, arguments);\n };\n }();\n fileUtilities.loadSBMLText = /*#__PURE__*/function () {\n var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2(textData, tileInfoBoxes, filename, cy, urlParams) {\n return _regeneratorRuntime().wrap(function _callee2$(_context2) {\n while (1) switch (_context2.prev = _context2.next) {\n case 0:\n _context2.next = 2;\n return updateGraph(sbmlToJson.convert(textToXmlObject(textData), urlParams), undefined, undefined, tileInfoBoxes);\n case 2:\n _context2.next = 4;\n return $(document).trigger(\"sbgnvizLoadFileEnd\", [filename, cy]);\n case 4:\n uiUtilities.endSpinner(\"load-file-spinner\");\n case 5:\n case \"end\":\n return _context2.stop();\n }\n }, _callee2);\n }));\n return function (_x6, _x7, _x8, _x9, _x10) {\n return _ref2.apply(this, arguments);\n };\n }();\n\n // supported versions are either 0.2 or 0.3\n fileUtilities.saveAsSbgnml = function (filename, version, renderInfo, mapProperties, nodes, edges) {\n var sbgnmlText = jsonToSbgnml.createSbgnml(filename, version, renderInfo, mapProperties, nodes, edges);\n var blob = new Blob([sbgnmlText], {\n type: \"text/plain;charset=utf-8;\"\n });\n saveAs(blob, filename);\n };\n fileUtilities.saveAsSbgnmlForSBML = function (filename, errorCallback) {\n // We have sbml map typed nodes and edges in the cytoscape graph and we want to export to sbgnml\n // Create sbml file first, then get the sbgnml from the Minerva conversion service\n uiUtilities.startSpinner(\"load-file-spinner\");\n var sbgnText = jsonToSbml.createSbml(filename);\n //convert sbml to sbgnml\n this.convertSbmlToSbgnml(sbgnText, function (data) {\n if (!data.result) {\n errorCallback();\n } else {\n var blob = new Blob([data.message], {\n type: \"text/plain;charset=utf-8;\"\n });\n saveAs(blob, filename);\n }\n uiUtilities.endSpinner(\"load-file-spinner\");\n }.bind(this));\n };\n\n // supported versions are either 0.2 or 0.3\n fileUtilities.saveAsNwt = function (filename, version, renderInfo, mapProperties, nodes, edges) {\n var sbgnmlText = jsonToNwt.createNwt(filename, version, renderInfo, mapProperties, nodes, edges);\n var blob = new Blob([sbgnmlText], {\n type: \"text/plain;charset=utf-8;\"\n });\n saveAs(blob, filename);\n };\n fileUtilities.saveAsCellDesigner = function (filename, errorCallback) {\n uiUtilities.startSpinner(\"load-spinner\");\n var sbgnml = jsonToSbgnml.createSbgnml();\n this.convertSbgnmlToCD(sbgnml, function (data) {\n if (data == null) {\n errorCallback();\n } else {\n var blob = new Blob([data], {\n type: \"text/plain;charset=utf-8;\"\n });\n saveAs(blob, filename);\n }\n uiUtilities.endSpinner(\"load-spinner\");\n });\n };\n fileUtilities.loadCellDesigner = function (file, successCallback, errorCallback) {\n var reader = new FileReader();\n reader.onload = function (e) {\n // this.convertCDToSbgnml(e.target.result, function(data){\n cdToSbgnml.convert(e.target.result, function (data) {\n uiUtilities.endSpinner(\"load-spinner\");\n if (data == null) {\n errorCallback();\n } else {\n successCallback(data);\n }\n });\n }.bind(this);\n uiUtilities.startSpinner(\"load-spinner\");\n reader.readAsText(file);\n };\n fileUtilities.saveAsSbml = function (filename, errorCallback) {\n uiUtilities.startSpinner(\"load-spinner\");\n var sbgnml = this.convertSbgn();\n this.convertSbgnmlToSbml(sbgnml, function (data) {\n if (!data.result) {\n errorCallback(sbgnml, data.error);\n } else if (data.message.indexOf(\"Internal server error\") !== -1) {\n errorCallback(sbgnml, data.message);\n } else {\n var blob = new Blob([data.message], {\n type: \"text/plain;charset=utf-8;\"\n });\n saveAs(blob, filename);\n }\n uiUtilities.endSpinner(\"load-spinner\");\n });\n };\n fileUtilities.saveSbmlForSBML = function (filename, errorCallback) {\n uiUtilities.startSpinner(\"load-spinner\");\n try {\n var sbgnText = jsonToSbml.createSbml(filename);\n var blob = new Blob([sbgnText], {\n type: \"text/plain;charset=utf-8;\"\n });\n saveAs(blob, filename);\n } catch (err) {\n errorCallback();\n }\n uiUtilities.endSpinner(\"load-spinner\");\n };\n fileUtilities.hasLayoutSBML = function (file) {\n return new Promise(function (resolve, reject) {\n var reader = new FileReader();\n var layoutFound = false;\n reader.onload = function (e) {\n var text = this.result;\n var matchResult = text.match(/<[^>]*listOfLayouts[^>]*>[\\s\\S]*<\\/[^>]*listOfLayouts[^>]*>/);\n if (matchResult != null) {\n layoutFound = true;\n }\n resolve(layoutFound);\n };\n reader.onerror = function () {\n reject(new Error(\"Failed to read the file\"));\n };\n reader.readAsText(file);\n });\n };\n fileUtilities.loadSbmlForSBML = /*#__PURE__*/function () {\n var _ref3 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(file, callback1, callback2, layoutBy) {\n var convert, runLayout, layoutFound;\n return _regeneratorRuntime().wrap(function _callee3$(_context3) {\n while (1) switch (_context3.prev = _context3.next) {\n case 0:\n convert = function convert(text) {\n var converted = sbmlToJson.convert(text);\n return converted;\n };\n runLayout = function runLayout() {\n if (layoutBy) {\n if (typeof layoutBy === 'function') {\n layoutBy();\n } else {\n var layout = cy.layout(layoutBy);\n\n // for backward compatibility need to make this if check\n if (layout && layout.run) {\n layout.run();\n }\n }\n }\n cy.fit(cy.elements(\":visible\"), 20);\n };\n _context3.next = 4;\n return fileUtilities.hasLayoutSBML(file);\n case 4:\n layoutFound = _context3.sent;\n if (layoutFound) {\n fileUtilities.loadFile(file, convert, callback1, callback2, fileUtilities.collapseMarkedNodes, undefined);\n } else {\n fileUtilities.loadFile(file, convert, callback1, callback2, fileUtilities.collapseMarkedNodes, runLayout);\n }\n case 6:\n case \"end\":\n return _context3.stop();\n }\n }, _callee3);\n }));\n return function (_x11, _x12, _x13, _x14) {\n return _ref3.apply(this, arguments);\n };\n }();\n fileUtilities.loadSbml = function (file, successCallback, errorCallback) {\n var reader = new FileReader();\n reader.onload = function (e) {\n this.convertSbmlToSbgnml(e.target.result, function (data) {\n if (data == null) {\n errorCallback();\n } else {\n successCallback(data);\n }\n });\n }.bind(this);\n reader.readAsText(file);\n };\n fileUtilities.saveAsGpml = function (filename, errorCallback) {\n uiUtilities.startSpinner(\"load-spinner\");\n var sbgnml = this.convertSbgn();\n this.convertSbgnmlToGpml(sbgnml, function (data) {\n if (!data.result) {\n errorCallback(sbgnml, data.error);\n } else if (data.message.indexOf(\"Internal server error\") !== -1) {\n errorCallback(sbgnml, data.message);\n } else {\n var blob = new Blob([data.message], {\n type: \"text/plain;charset=utf-8;\"\n });\n saveAs(blob, filename);\n }\n uiUtilities.endSpinner(\"load-spinner\");\n });\n };\n fileUtilities.loadGpml = function (file, successCallback, errorCallback) {\n var reader = new FileReader();\n reader.onload = function (e) {\n gpmlToSbgnml.convert(e.target.result, function (data) {\n if (data == null) {\n errorCallback();\n } else {\n successCallback(data);\n }\n });\n }.bind(this);\n reader.readAsText(file);\n };\n fileUtilities.convertSbgn = function (filename, version, renderInfo, mapProperties, nodes, edges) {\n var hidden = arguments.length > 6 && arguments[6] !== undefined ? arguments[6] : false;\n var sbgnmlText = jsonToSbgnml.createSbgnml(filename, version, renderInfo, mapProperties, nodes, edges, hidden);\n return sbgnmlText;\n };\n fileUtilities.exportLayoutData = function (filename, byName) {\n var layoutText = layoutToText.convert(byName);\n var blob = new Blob([layoutText], {\n type: \"text/plain;charset=utf-8;\"\n });\n saveAs(blob, filename);\n };\n fileUtilities.saveAsPlainSif = function (filename) {\n var text = jsonToSif.convert();\n var blob = new Blob([text], {\n type: \"text/plain;charset=utf-8;\"\n });\n saveAs(blob, filename);\n };\n fileUtilities.convertSbgnmlTextToJson = function (sbgnmlText) {\n return sbgnmlToJson.convert(textToXmlObject(sbgnmlText));\n };\n fileUtilities.convertSbmlTextToJson = function (sbgnmlText) {\n return sbmlToJson.convert(textToXmlObject(sbgnmlText));\n };\n fileUtilities.convertSifTextToJson = function (sifText) {\n return sifToJson.convert(sifText);\n };\n fileUtilities.createJsonFromSBGN = function () {\n var sbgnmlText = jsonToSbgnml.createSbgnml();\n return sbgnmlToJson.convert(textToXmlObject(sbgnmlText));\n };\n fileUtilities.createJsonFromSBML = function () {\n var sbgnmlText = jsonToSbgnml.createSbgnml(); //SBML\n var converted_ = sbmlToJson.convert(textToXmlObject(sbgnmlText));\n return converted_;\n };\n fileUtilities.createJsonFromSif = function () {\n var sifText = jsonToSif.convert();\n return sifToJson.convert(sifText);\n };\n fileUtilities.convertSbgnmlToCD = function (sbgnml, callback) {\n return sbgnmlToCd.convert(sbgnml, callback);\n };\n fileUtilities.convertCDToSbgnml = function (xml, callback) {\n return cdToSbgnml.convert(xml, callback);\n };\n fileUtilities.convertSbgnmlToSbml = function (sbgnml, callback) {\n return sbgnmlToSbml.convert(sbgnml, callback);\n };\n fileUtilities.convertSbmlToSbgnml = function (sbml, callback) {\n return sbmlToSbgnml.convert(sbml, callback);\n };\n fileUtilities.convertGpmlToSbgnml = function (gpml, callback) {\n return gpmlToSbgnml.convert(gpml, callback);\n };\n fileUtilities.convertSbgnmlToGpml = function (sbgnml, callback) {\n return sbgnmlToGpml.convert(sbgnml, callback);\n };\n return fileUtilities;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,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YSxDQUFDMkksbUJBQW1CLEdBQUcsVUFBU2dELElBQUksRUFBRTlJLFFBQVEsRUFBQztJQUMxRCxPQUFPakQsWUFBWSxDQUFDa0UsT0FBTyxDQUFDNkgsSUFBSSxFQUFDOUksUUFBUSxDQUFDO0VBQzVDLENBQUM7RUFFRDdDLGFBQWEsQ0FBQzRMLG1CQUFtQixHQUFHLFVBQVNDLElBQUksRUFBRWhKLFFBQVEsRUFBQztJQUMxRCxPQUFPekIsWUFBWSxDQUFDMEMsT0FBTyxDQUFDK0gsSUFBSSxFQUFDaEosUUFBUSxDQUFDO0VBQzVDLENBQUM7RUFFRDdDLGFBQWEsQ0FBQzBLLG1CQUFtQixHQUFHLFVBQVMxQixNQUFNLEVBQUVuRyxRQUFRLEVBQUM7SUFFNUQsT0FBT3ZCLFlBQVksQ0FBQ3dDLE9BQU8sQ0FBQ2tGLE1BQU0sRUFBQ25HLFFBQVEsQ0FBQztFQUM5QyxDQUFDO0VBRUEsT0FBTzdDLGFBQWE7QUFDckIsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL3NiZ252aXovLi9zcmMvdXRpbGl0aWVzL2ZpbGUtdXRpbGl0aWVzLWZhY3RvcnkuanM/M2UwMCJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuKiBGaWxlIFV0aWxpdGllczogVG8gYmUgdXNlZCBvbiByZWFkL3dyaXRlIGZpbGUgb3BlcmF0aW9uXG4qL1xuXG52YXIgbGliVXRpbGl0aWVzID0gcmVxdWlyZSgnLi9saWItdXRpbGl0aWVzJyk7XG52YXIgbGlicyA9IGxpYlV0aWxpdGllcy5nZXRMaWJzKCk7XG52YXIgalF1ZXJ5ID0gJCA9IGxpYnMualF1ZXJ5O1xudmFyIHNhdmVBcyA9IGxpYnMuc2F2ZUFzO1xudmFyIHRleHRVdGlsaXRpZXMgPSByZXF1aXJlKCcuL3RleHQtdXRpbGl0aWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuIC8vIEhlbHBlciBmdW5jdGlvbnMgU3RhcnRcbiAvLyBzZWUgaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xNjI0NTc2Ny9jcmVhdGluZy1hLWJsb2ItZnJvbS1hLWJhc2U2NC1zdHJpbmctaW4tamF2YXNjcmlwdFxuIGZ1bmN0aW9uIGI2NHRvQmxvYihiNjREYXRhLCBjb250ZW50VHlwZSwgc2xpY2VTaXplKSB7XG4gICBjb250ZW50VHlwZSA9IGNvbnRlbnRUeXBlIHx8ICcnO1xuICAgc2xpY2VTaXplID0gc2xpY2VTaXplIHx8IDUxMjtcblxuICAgdmFyIGJ5dGVDaGFyYWN0ZXJzID0gYXRvYihiNjREYXRhKTtcbiAgIHZhciBieXRlQXJyYXlzID0gW107XG5cbiAgIGZvciAodmFyIG9mZnNldCA9IDA7IG9mZnNldCA8IGJ5dGVDaGFyYWN0ZXJzLmxlbmd0aDsgb2Zmc2V0ICs9IHNsaWNlU2l6ZSkge1xuICAgICB2YXIgc2xpY2UgPSBieXRlQ2hhcmFjdGVycy5zbGljZShvZmZzZXQsIG9mZnNldCArIHNsaWNlU2l6ZSk7XG5cbiAgICAgdmFyIGJ5dGVOdW1iZXJzID0gbmV3IEFycmF5KHNsaWNlLmxlbmd0aCk7XG4gICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpY2UubGVuZ3RoOyBpKyspIHtcbiAgICAgICBieXRlTnVtYmVyc1tpXSA9IHNsaWNlLmNoYXJDb2RlQXQoaSk7XG4gICAgIH1cblxuICAgICB2YXIgYnl0ZUFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYnl0ZU51bWJlcnMpO1xuXG4gICAgIGJ5dGVBcnJheXMucHVzaChieXRlQXJyYXkpO1xuICAgfVxuXG4gICB2YXIgYmxvYiA9IG5ldyBCbG9iKGJ5dGVBcnJheXMsIHt0eXBlOiBjb250ZW50VHlwZX0pO1xuICAgcmV0dXJuIGJsb2I7XG4gfVxuXG4gZnVuY3Rpb24gbG9hZFRleHREb2MoZnVsbEZpbGVQYXRoKSB7XG4gICBpZiAod2luZG93LlhNTEh0dHBSZXF1ZXN0KSB7XG4gICAgIHhodHRwID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICB9XG4gICBlbHNlIHtcbiAgICAgeGh0dHAgPSBuZXcgQWN0aXZlWE9iamVjdChcIk1pY3Jvc29mdC5YTUxIVFRQXCIpO1xuICAgfVxuICAgeGh0dHAub3ZlcnJpZGVNaW1lVHlwZSgnYXBwbGljYXRpb24vdGV4dCcpO1xuICAgeGh0dHAub3BlbihcIkdFVFwiLCBmdWxsRmlsZVBhdGgsIGZhbHNlKTtcbiAgIHhodHRwLnNlbmQoKTtcbiAgIHJldHVybiB4aHR0cC5yZXNwb25zZVRleHQ7XG4gfVxuXG4gZnVuY3Rpb24gbG9hZFhNTERvYyhmdWxsRmlsZVBhdGgpIHtcbiAgaWYgKHdpbmRvdy5YTUxIdHRwUmVxdWVzdCkge1xuICAgIHhodHRwID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gIH1cbiAgZWxzZSB7XG4gICAgeGh0dHAgPSBuZXcgQWN0aXZlWE9iamVjdChcIk1pY3Jvc29mdC5YTUxIVFRQXCIpO1xuICB9XG4gIHhodHRwLm92ZXJyaWRlTWltZVR5cGUoJ2FwcGxpY2F0aW9uL3htbCcpO1xuICB4aHR0cC5vcGVuKFwiR0VUXCIsIGZ1bGxGaWxlUGF0aCwgZmFsc2UpO1xuICB4aHR0cC5zZW5kKCk7XG4gIHJldHVybiB4aHR0cC5yZXNwb25zZVhNTDtcbn1cblxuIC8vIFNob3VsZCB0aGlzIGJlIGV4cG9zZWQgb3Igc2hvdWxkIHRoaXMgYmUgbW92ZWQgdG8gdGhlIGhlbHBlciBmdW5jdGlvbnMgc2VjdGlvbj9cbiBmdW5jdGlvbiB0ZXh0VG9YbWxPYmplY3QodGV4dCkge1xuICAgaWYgKHdpbmRvdy5BY3RpdmVYT2JqZWN0KSB7XG4gICAgIHZhciBkb2MgPSBuZXcgQWN0aXZlWE9iamVjdCgnTWljcm9zb2Z0LlhNTERPTScpO1xuICAgICBkb2MuYXN5bmMgPSAnZmFsc2UnO1xuICAgICBkb2MubG9hZFhNTCh0ZXh0KTtcbiAgIH0gZWxzZSB7XG4gICAgIHZhciBwYXJzZXIgPSBuZXcgRE9NUGFyc2VyKCk7XG4gICAgIHZhciBkb2MgPSBwYXJzZXIucGFyc2VGcm9tU3RyaW5nKHRleHQsICd0ZXh0L3htbCcpO1xuICAgfVxuICAgcmV0dXJuIGRvYztcbiB9XG4gLy8gSGVscGVyIGZ1bmN0aW9ucyBFbmRcblxuIHZhciBzYmdubWxUb0pzb24sIHNibWxUb0pzb24sIGpzb25Ub1NiZ25tbCwganNvblRvU2JtbCwganNvblRvTnd0LCB1aVV0aWxpdGllcywgdGRUb0pzb24sXG4gICAgIHNpZlRvSnNvbiwgZ3JhcGhVdGlsaXRpZXMsIGxheW91dFRvVGV4dCwgbnd0VG9Kc29uLCBqc29uVG9TaWYsc2Jnbm1sVG9DZCxjZFRvU2Jnbm1sLHNiZ25tbFRvU2JtbCxzYm1sVG9TYmdubWw7XG4gdmFyIHVwZGF0ZUdyYXBoO1xuIHZhciBvcHRpb25zLCBjeTtcblxuIGZ1bmN0aW9uIGZpbGVVdGlsaXRpZXMgKHBhcmFtKSB7XG4gICBzYmdubWxUb0pzb24gPSBwYXJhbS5zYmdubWxUb0pzb25Db252ZXJ0ZXI7XG4gICBzYm1sVG9Kc29uID0gcGFyYW0uc2JtbFRvSnNvbkNvbnZlcnRlcjtcbiAgIG53dFRvSnNvbiA9IHBhcmFtLm53dFRvSnNvbkNvbnZlcnRlcjtcbiAgIGpzb25Ub1NiZ25tbCA9IHBhcmFtLmpzb25Ub1NiZ25tbENvbnZlcnRlcjtcbiAgIGpzb25Ub1NibWwgPSBwYXJhbS5qc29uVG9TYm1sQ29udmVydGVyO1xuICAganNvblRvTnd0ID0gcGFyYW0uanNvblRvTnd0Q29udmVydGVyO1xuICAganNvblRvU2lmID0gcGFyYW0uanNvblRvU2lmQ29udmVydGVyO1xuICAgdWlVdGlsaXRpZXMgPSBwYXJhbS51aVV0aWxpdGllcztcbiAgIHRkVG9Kc29uID0gcGFyYW0udGRUb0pzb25Db252ZXJ0ZXI7XG4gICBzaWZUb0pzb24gPSBwYXJhbS5zaWZUb0pzb25Db252ZXJ0ZXI7XG4gICBsYXlvdXRUb1RleHQgPSBwYXJhbS5sYXlvdXRUb1RleHQ7XG4gICBncmFwaFV0aWxpdGllcyA9IHBhcmFtLmdyYXBoVXRpbGl0aWVzO1xuICAgdXBkYXRlR3JhcGggPSBncmFwaFV0aWxpdGllcy51cGRhdGVHcmFwaC5iaW5kKGdyYXBoVXRpbGl0aWVzKTtcbiAgIG9wdGlvbnMgPSBwYXJhbS5vcHRpb25VdGlsaXRpZXMuZ2V0T3B0aW9ucygpO1xuICAgY3kgPSBwYXJhbS5zYmduQ3lJbnN0YW5jZS5nZXRDeSgpO1xuICAgc2Jnbm1sVG9DZCA9IHBhcmFtLnNiZ25tbFRvQ2RDb252ZXJ0ZXI7XG4gICBjZFRvU2Jnbm1sID0gcGFyYW0uY2RUb1NiZ25tbENvbnZlcnRlcjtcbiAgIHNiZ25tbFRvU2JtbCA9IHBhcmFtLnNiZ25tbFRvU2JtbENvbnZlcnRlcjtcbiAgIHNibWxUb1NiZ25tbCA9IHBhcmFtLnNibWxUb1NiZ25tbENvbnZlcnRlcjtcbiAgIGdwbWxUb1NiZ25tbCA9IHBhcmFtLmdwbWxUb1NiZ25tbENvbnZlcnRlcjtcbiAgIHNiZ25tbFRvR3BtbCA9IHBhcmFtLnNiZ25tbFRvR3BtbENvbnZlcnRlcjtcbiB9XG5cbiBmaWxlVXRpbGl0aWVzLmxvYWRYTUxEb2MgPSBsb2FkWE1MRG9jO1xuXG4gZmlsZVV0aWxpdGllcy50ZXh0VG9YbWxPYmplY3QgPSB0ZXh0VG9YbWxPYmplY3Q7XG5cbiBmaWxlVXRpbGl0aWVzLnNhdmVBc1BuZyA9IGZ1bmN0aW9uKGZpbGVuYW1lLCBzY2FsZSwgYmcsIG1heFdpZHRoLCBtYXhIZWlnaHQpIHtcbiAgIGlmKG1heFdpZHRoIHx8IG1heEhlaWdodCkge1xuICAgICB2YXIgcG5nQ29udGVudCA9IGN5LnBuZyh7XG4gICAgICAgZnVsbDogdHJ1ZSwgYmc6IGJnLCBcbiAgICAgICBtYXhXaWR0aDogbWF4V2lkdGgsIG1heEhlaWdodDogbWF4SGVpZ2h0XG4gICAgIH0pO1xuICAgfVxuICAgZWxzZSB7XG4gICAgIHZhciBwbmdDb250ZW50ID0gY3kucG5nKHtcbiAgICAgICBzY2FsZTogc2NhbGUgfHwgMywgZnVsbDogdHJ1ZSwgYmc6IGJnXG4gICAgIH0pO1xuICAgfVxuXG4gICAvLyB0aGlzIGlzIHRvIHJlbW92ZSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwbmdDb250ZW50OiBkYXRhOmltZy9wbmc7YmFzZTY0LFxuICAgdmFyIGI2NGRhdGEgPSBwbmdDb250ZW50LnN1YnN0cihwbmdDb250ZW50LmluZGV4T2YoXCIsXCIpICsgMSk7XG5cbiAgIC8vIGxvd2VyIHF1YWxpdHkgd2hlbiByZXNwb25zZSBpcyBlbXB0eVxuICAgaWYoIWI2NGRhdGEgfHwgYjY0ZGF0YSA9PT0gXCJcIil7XG4gICAgIHBuZ0NvbnRlbnQgPSBjeS5wbmcoe21heFdpZHRoOiAxNTAwMCwgbWF4SGVpZ2h0OiAxNTAwMCwgZnVsbDogdHJ1ZSwgYmc6IGJnfSk7XG4gICAgIGI2NGRhdGEgPSBwbmdDb250ZW50LnN1YnN0cihwbmdDb250ZW50LmluZGV4T2YoXCIsXCIpICsgMSk7XG4gICB9XG5cbiAgIHNhdmVBcyhiNjR0b0Jsb2IoYjY0ZGF0YSwgXCJpbWFnZS9wbmdcIiksIGZpbGVuYW1lIHx8IFwibmV0d29yay5wbmdcIik7XG4gfTtcblxuIGZpbGVVdGlsaXRpZXMuc2F2ZUFzSnBnID0gZnVuY3Rpb24oZmlsZW5hbWUsIHNjYWxlLCBiZywgbWF4V2lkdGgsIG1heEhlaWdodCwgcXVhbGl0eSkge1xuICAgaWYobWF4V2lkdGggfHwgbWF4SGVpZ2h0KSB7XG4gICAgIHZhciBqcGdDb250ZW50ID0gY3kuanBnKHtcbiAgICAgICBmdWxsOiB0cnVlLCBiZzogYmcsIFxuICAgICAgIG1heFdpZHRoOiBtYXhXaWR0aCwgbWF4SGVpZ2h0OiBtYXhIZWlnaHQsIFxuICAgICAgIHF1YWxpdHk6IHF1YWxpdHlcbiAgICAgfSk7XG4gICB9XG4gICBlbHNlIHtcbiAgICAgdmFyIGpwZ0NvbnRlbnQgPSBjeS5qcGcoe1xuICAgICAgIHNjYWxlOiBzY2FsZSB8fCAzLCBmdWxsOiB0cnVlLCBiZzogYmcsIFxuICAgICAgIHF1YWxpdHk6IHF1YWxpdHlcbiAgICAgfSk7XG4gICB9XG4gICBcbiAgIC8vIHRoaXMgaXMgdG8gcmVtb3ZlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHBuZ0NvbnRlbnQ6IGRhdGE6aW1nL3BuZztiYXNlNjQsXG4gICB2YXIgYjY0ZGF0YSA9IGpwZ0NvbnRlbnQuc3Vic3RyKGpwZ0NvbnRlbnQuaW5kZXhPZihcIixcIikgKyAxKTtcblxuICAgLy8gbG93ZXIgcXVhbGl0eSB3aGVuIHJlc3BvbnNlIGlzIGVtcHR5XG4gICBpZighYjY0ZGF0YSB8fCBiNjRkYXRhID09PSBcIlwiKXtcbiAgICAganBnQ29udGVudCA9IGN5LmpwZyh7bWF4V2lkdGg6IDE1MDAwLCBtYXhIZWlnaHQ6IDE1MDAwLCBmdWxsOiB0cnVlLCBiZzogYmd9KTtcbiAgICAgYjY0ZGF0YSA9IGpwZ0NvbnRlbnQuc3Vic3RyKGpwZ0NvbnRlbnQuaW5kZXhPZihcIixcIikgKyAxKTtcbiAgIH1cblxuICAgc2F2ZUFzKGI2NHRvQmxvYihiNjRkYXRhLCBcImltYWdlL2pwZ1wiKSwgZmlsZW5hbWUgfHwgXCJuZXR3b3JrLmpwZ1wiKTtcbiB9O1xuXG4gZmlsZVV0aWxpdGllcy5zYXZlQXNTdmcgPSBmdW5jdGlvbihmaWxlbmFtZSwgc2NhbGUsIGJnLCBtYXhXaWR0aCwgbWF4SGVpZ2h0KSB7XG4gICBpZiAobWF4V2lkdGggfHwgbWF4SGVpZ2h0KSB7XG4gICAgIHZhciBzdmdDb250ZW50ID0gY3kuc3ZnKHtcbiAgICAgICBmdWxsOiB0cnVlLCBiZzogYmcsIFxuICAgICAgIG1heFdpZHRoOiBtYXhXaWR0aCwgbWF4SGVpZ2h0OiBtYXhIZWlnaHRcbiAgICAgfSk7XG4gICB9XG4gICBlbHNlIHtcbiAgICAgdmFyIHN2Z0NvbnRlbnQgPSBjeS5zdmcoe3NjYWxlOiBzY2FsZSB8fCAxLCBmdWxsOiB0cnVlLCBiZzogYmd9KTtcbiAgIH1cbiAgIHNhdmVBcyhuZXcgQmxvYihbc3ZnQ29udGVudF0sIHt0eXBlOlwiaW1hZ2Uvc3ZnK3htbDtjaGFyc2V0PXV0Zi04XCJ9KSwgZmlsZW5hbWUgfHwgXCJuZXR3b3JrLnN2Z1wiKTtcbiB9O1xuXG4gZmlsZVV0aWxpdGllcy5sb2FkU2FtcGxlID0gZnVuY3Rpb24oZmlsZW5hbWUsIGZvbGRlcnBhdGgsIGNhbGxiYWNrKSB7XG4gICB2YXIgZmlsZSA9IChmb2xkZXJwYXRoIHx8ICdzYW1wbGUtYXBwL3NhbXBsZXMvJykgKyBmaWxlbmFtZTtcblxuICAgdWlVdGlsaXRpZXMuc3RhcnRTcGlubmVyKFwibG9hZC1zcGlubmVyXCIpO1xuICAgLy8gVXNlcnMgbWF5IHdhbnQgdG8gZG8gY3VzdG9taXplZCB0aGluZ3Mgd2hpbGUgYSBzYW1wbGUgaXMgYmVpbmcgbG9hZGVkXG4gICAvLyBUcmlnZ2VyIGFuIGV2ZW50IGZvciB0aGlzIHB1cnBvc2UgYW5kIHNwZWNpZnkgdGhlICdmaWxlbmFtZScgYXMgYW4gZXZlbnQgcGFyYW1ldGVyXG4gICAkKGRvY3VtZW50KS50cmlnZ2VyKCBcInNiZ252aXpMb2FkU2FtcGxlXCIsIFsgZmlsZW5hbWUsIGN5IF0gKTsgLy8gQWxpYXNlcyBmb3Igc2JnbnZpekxvYWRTYW1wbGVTdGFydFxuICAgJChkb2N1bWVudCkudHJpZ2dlciggXCJzYmdudml6TG9hZFNhbXBsZVN0YXJ0XCIsIFsgZmlsZW5hbWUsIGN5IF0gKTtcbiAgIHZhciB0ZXh0ID0gbG9hZFRleHREb2MoZmlsZSk7XG4gICB2YXIgbWF0Y2hSZXN1bHQgPSB0ZXh0Lm1hdGNoKFwiPHJlbmRlckluZm9ybWF0aW9uW15dKjwvcmVuZGVySW5mb3JtYXRpb24+XCIpO1xuICAgaWYobWF0Y2hSZXN1bHQgIT0gbnVsbCl7XG4gICAgIHZhciByZW5kZXJJbmZvU3RyaW5nID0gbWF0Y2hSZXN1bHRbMF07XG4gICAgIHZhciByZW5kZXJJbmZvU3RyaW5nQ29weSA9ICgnICcgKyByZW5kZXJJbmZvU3RyaW5nKS5zbGljZSgxKTtcbiAgICAgY29uc3QgcmVnZXggPSAvXFxzKFtcXFNdKykoW1xcc10qKT0vZztcbiAgICAgdmFyIHJlc3VsdDtcbiAgICAgdmFyIG1hdGNoZXMgPSBbXTsgXG4gICAgIHdoaWxlKHJlc3VsdCA9IHJlZ2V4LmV4ZWMocmVuZGVySW5mb1N0cmluZykpIHtcbiAgICAgICBtYXRjaGVzLnB1c2gocmVzdWx0WzBdKTtcbiAgICAgfTtcbiAgICAgbWF0Y2hlcy5mb3JFYWNoKGZ1bmN0aW9uKG1hdGNoKXtcbiAgICAgICByZW5kZXJJbmZvU3RyaW5nID0gcmVuZGVySW5mb1N0cmluZy5yZXBsYWNlKG1hdGNoICwgdGV4dFV0aWxpdGllcy5Gcm9tS2ViYWJUb0NhbWVsQ2FzZShtYXRjaCkpO1xuICAgICB9KTsgICAgICBcbiAgICAgdGV4dCA9IHRleHQucmVwbGFjZShyZW5kZXJJbmZvU3RyaW5nQ29weSwgcmVuZGVySW5mb1N0cmluZyk7XG4gICAgfVxuICAgICAgdmFyIHhtbE9iamVjdCA9IHRleHRUb1htbE9iamVjdCh0ZXh0KTtcbiAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICB1cGRhdGVHcmFwaChud3RUb0pzb24uY29udmVydCh4bWxPYmplY3QpKTtcbiAgICAgICAgZmlsZVV0aWxpdGllcy5jb2xsYXBzZU1hcmtlZE5vZGVzKCk7XG4gICAgICAgIHVpVXRpbGl0aWVzLmVuZFNwaW5uZXIoXCJsb2FkLXNwaW5uZXJcIik7XG4gICAgICAgICQoZG9jdW1lbnQpLnRyaWdnZXIoIFwic2JnbnZpekxvYWRTYW1wbGVFbmRcIiwgWyBmaWxlbmFtZSwgY3kgXSApOyAvLyBUcmlnZ2VyIGFuIGV2ZW50IHNpZ25hbGluZyB0aGF0IGEgc2FtcGxlIGlzIGxvYWRlZFxuICAgICAgICBpZiAodHlwZW9mIGNhbGxiYWNrICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgY2FsbGJhY2soKTsgfVxuICAgICAgfSwwKTtcbiB9O1xuXG4gZmlsZVV0aWxpdGllcy5sb2FkU0lGRmlsZSA9IGZ1bmN0aW9uKGZpbGUsIGxheW91dEJ5LCBjYWxsYmFjaykge1xuICAgdmFyIGNvbnZlcnQgPSBmdW5jdGlvbiggdGV4dCApIHtcbiAgICAgcmV0dXJuIHNpZlRvSnNvbi5jb252ZXJ0KHRleHQpO1xuICAgfTtcblxuICAgdmFyIHJ1bkxheW91dCA9IGZ1bmN0aW9uKCkge1xuICAgICBpZiAoIGxheW91dEJ5ICkge1xuICAgICAgIGlmICggdHlwZW9mIGxheW91dEJ5ID09PSAnZnVuY3Rpb24nICkge1xuICAgICAgICAgbGF5b3V0QnkoKTtcbiAgICAgICB9XG4gICAgICAgZWxzZSB7XG4gICAgICAgICB2YXIgbGF5b3V0ID0gY3kubGF5b3V0KCBsYXlvdXRCeSApO1xuXG4gICAgICAgICAvLyBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSBuZWVkIHRvIG1ha2UgdGhpcyBpZiBjaGVja1xuICAgICAgICAgaWYgKCBsYXlvdXQgJiYgbGF5b3V0LnJ1biApIHtcbiAgICAgICAgICAgbGF5b3V0LnJ1bigpO1xuICAgICAgICAgfVxuICAgICAgIH1cbiAgICAgfVxuXG4gICAgIGN5LmZpdCggY3kuZWxlbWVudHMoXCI6dmlzaWJsZVwiKSwgMjAgKTtcblxuICAgfTtcblxuICAgZmlsZVV0aWxpdGllcy5sb2FkRmlsZSggZmlsZSwgY29udmVydCwgdW5kZWZpbmVkLCBjYWxsYmFjaywgdW5kZWZpbmVkLCBydW5MYXlvdXQgKTtcbiB9O1xuXG4gZmlsZVV0aWxpdGllcy5sb2FkVERGaWxlID0gZnVuY3Rpb24gZnVuY3Rpb25OYW1lKGZpbGUsIGNhbGxiYWNrKSB7XG4gICB2YXIgY29udmVydCA9IGZ1bmN0aW9uKCB0ZXh0ICkge1xuICAgICByZXR1cm4gdGRUb0pzb24uY29udmVydCh0ZXh0KTtcbiAgIH07XG5cbiAgIGZpbGVVdGlsaXRpZXMubG9hZEZpbGUoIGZpbGUsIGNvbnZlcnQsIHVuZGVmaW5lZCwgY2FsbGJhY2sgKTtcbiB9O1xuXG4gZmlsZVV0aWxpdGllcy5sb2FkU0JHTk1MRmlsZSA9IGZ1bmN0aW9uKGZpbGUsIGNhbGxiYWNrMSwgY2FsbGJhY2syKSB7XG4gICB2YXIgY29udmVydCA9IGZ1bmN0aW9uKCB0ZXh0ICkge1xuICAgICByZXR1cm4gc2Jnbm1sVG9Kc29uLmNvbnZlcnQodGV4dFRvWG1sT2JqZWN0KHRleHQpKTtcbiAgIH07XG5cbiAgIGZpbGVVdGlsaXRpZXMubG9hZEZpbGUoIGZpbGUsIGNvbnZlcnQsIGNhbGxiYWNrMSwgY2FsbGJhY2syLCBmaWxlVXRpbGl0aWVzLmNvbGxhcHNlTWFya2VkTm9kZXMgKTtcbiB9O1xuXG4gZmlsZVV0aWxpdGllcy5sb2FkTnd0RmlsZSA9IGZ1bmN0aW9uKGZpbGUsIGNhbGxiYWNrMSwgY2FsbGJhY2syLCB1cmxQYXJhbXMpIHtcbiAgIHZhciBjb252ZXJ0ID0gZnVuY3Rpb24oIHRleHQgKSB7XG4gICAgIHJldHVybiBud3RUb0pzb24uY29udmVydCh0ZXh0VG9YbWxPYmplY3QodGV4dCksIHVybFBhcmFtcyk7XG4gICB9O1xuXG4gICBmaWxlVXRpbGl0aWVzLmxvYWRGaWxlKCBmaWxlLCBjb252ZXJ0LCBjYWxsYmFjazEsIGNhbGxiYWNrMiwgZmlsZVV0aWxpdGllcy5jb2xsYXBzZU1hcmtlZE5vZGVzICk7XG4gfTtcblxuIC8vIGNvbGxhcHNlIHRoZSBub2RlcyB3aG9zZSBjb2xsYXBzZSBkYXRhIGZpZWxkIGlzIHNldFxuIGZpbGVVdGlsaXRpZXMuY29sbGFwc2VNYXJrZWROb2RlcyA9IGZ1bmN0aW9uKCkge1xuICAgLy8gY29sbGFwc2Ugbm9kZXNcbiAgIHZhciBub2Rlc1RvQ29sbGFwc2UgPSBjeS5ub2RlcyhcIltjb2xsYXBzZV1cIik7XG4gICBpZiAobm9kZXNUb0NvbGxhcHNlLmxlbmd0aCA+IDAgKXtcbiAgICAgY3kuZXhwYW5kQ29sbGFwc2UoJ2dldCcpLmNvbGxhcHNlKG5vZGVzVG9Db2xsYXBzZSwge2xheW91dEJ5OiBudWxsfSk7XG5cbiAgICAgbm9kZXNUb0NvbGxhcHNlLmZvckVhY2goZnVuY3Rpb24oZWxlLCBpLCBlbGVzKXtcbiAgICAgICBlbGUucG9zaXRpb24oZWxlLmRhdGEoXCJwb3NpdGlvbkJlZm9yZVNhdmluZ1wiKSk7XG4gICAgIH0pO1xuICAgICBub2Rlc1RvQ29sbGFwc2UucmVtb3ZlRGF0YShcInBvc2l0aW9uQmVmb3JlU2F2aW5nXCIpO1xuICAgfVxuIH07XG5cbiAvKlxuICAgY2FsbGJhY2sgaXMgYSBmdW5jdGlvbiByZW1vdGVseSBkZWZpbmVkIHRvIGFkZCBzcGVjaWZpYyBiZWhhdmlvciB0aGF0IGlzbid0IGltcGxlbWVudGVkIGhlcmUuXG4gICBpdCBpcyBjb21wbGV0ZWx5IG9wdGlvbmFsLlxuICAgc2lnbmF0dXJlOiBjYWxsYmFjayh0ZXh0WG1sKVxuICovXG4gZmlsZVV0aWxpdGllcy5sb2FkRmlsZSA9IGZ1bmN0aW9uKGZpbGUsIGNvbnZlcnRGY24sIGNhbGxiYWNrMSwgY2FsbGJhY2syLCBjYWxsYmFjazMsIGNhbGxiYWNrNCkge1xuICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgdWlVdGlsaXRpZXMuc3RhcnRTcGlubmVyKFwibG9hZC1maWxlLXNwaW5uZXJcIik7XG5cbiAgIHZhciB0ZXh0VHlwZSA9IC90ZXh0LiovO1xuXG4gICB2YXIgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoKTtcblxuICAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uIChlKSB7XG4gICAgIHZhciB0ZXh0ID0gdGhpcy5yZXN1bHQ7XG4gICAgdmFyIG1hdGNoUmVzdWx0ID0gdGV4dC5tYXRjaChcIjxyZW5kZXJJbmZvcm1hdGlvblteXSo8L3JlbmRlckluZm9ybWF0aW9uPlwiKTtcbiAgICBpZihtYXRjaFJlc3VsdCAhPSBudWxsKXtcbiAgICB2YXIgaW1hZ2VzRWxlbWVudE1hdGNoID0gdGV4dC5tYXRjaChcIjxsaXN0T2ZCYWNrZ3JvdW5kSW1hZ2VzW15dKjwvbGlzdE9mQmFja2dyb3VuZEltYWdlcz5cIik7XG4gICAgdmFyIGltYWdlc0VsZW1lbnQ7XG4gICAgaWYoaW1hZ2VzRWxlbWVudE1hdGNoICE9IG51bGwpe1xuICAgICAgaW1hZ2VzRWxlbWVudCA9IGltYWdlc0VsZW1lbnRNYXRjaFswXTtcbiAgICB9XG4gICAgdmFyIHJlbmRlckluZm9TdHJpbmcgPSBtYXRjaFJlc3VsdFswXTtcbiAgICB2YXIgcmVuZGVySW5mb1N0cmluZ0NvcHkgPSAoJyAnICsgcmVuZGVySW5mb1N0cmluZykuc2xpY2UoMSk7XG4gICAgICBjb25zdCByZWdleCA9IC9cXHMoW1xcU10rKShbXFxzXSopPS9nO1xuICAgICAgdmFyIHJlc3VsdDtcbiAgICAgIHZhciBtYXRjaGVzID0gW107IFxuICAgICAgd2hpbGUocmVzdWx0ID0gcmVnZXguZXhlYyhyZW5kZXJJbmZvU3RyaW5nKSkge1xuICAgICAgICBtYXRjaGVzLnB1c2gocmVzdWx0WzBdKTtcbiAgICAgIH07XG4gICAgICBtYXRjaGVzLmZvckVhY2goZnVuY3Rpb24obWF0Y2gpe1xuICAgICAgICByZW5kZXJJbmZvU3RyaW5nID0gcmVuZGVySW5mb1N0cmluZy5yZXBsYWNlKG1hdGNoICwgdGV4dFV0aWxpdGllcy5Gcm9tS2ViYWJUb0NhbWVsQ2FzZShtYXRjaCkpO1xuICAgICAgfSk7ICAgICAgXG4gICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKHJlbmRlckluZm9TdHJpbmdDb3B5LCByZW5kZXJJbmZvU3RyaW5nKTtcbiAgICAgIHZhciBpbWFnZXNFbGVtZW50TWF0Y2hEaXJ0eSA9IHRleHQubWF0Y2goXCI8bGlzdE9mQmFja2dyb3VuZEltYWdlc1teXSo8L2xpc3RPZkJhY2tncm91bmRJbWFnZXM+XCIpO1xuICAgICAgaWYoaW1hZ2VzRWxlbWVudE1hdGNoRGlydHkgIT0gbnVsbCl7XG4gICAgICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoaW1hZ2VzRWxlbWVudE1hdGNoRGlydHlbMF0saW1hZ2VzRWxlbWVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuXG4gICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjazEgIT09ICd1bmRlZmluZWQnKSBjYWxsYmFjazEodGV4dCk7XG5cbiAgICAgICB2YXIgY3lHcmFwaDtcbiAgICAgICB0cnkge1xuICAgICAgICAgY3lHcmFwaCA9IGNvbnZlcnRGY24oIHRleHQgKTtcbiAgICAgICAgIC8vIFVzZXJzIG1heSB3YW50IHRvIGRvIGN1c3RvbWl6ZWQgdGhpbmdzIHdoaWxlIGFuIGV4dGVybmFsIGZpbGUgaXMgYmVpbmcgbG9hZGVkXG4gICAgICAgICAvLyBUcmlnZ2VyIGFuIGV2ZW50IGZvciB0aGlzIHB1cnBvc2UgYW5kIHNwZWNpZnkgdGhlICdmaWxlbmFtZScgYXMgYW4gZXZlbnQgcGFyYW1ldGVyXG4gICAgICAgICAkKGRvY3VtZW50KS50cmlnZ2VyKCBcInNiZ252aXpMb2FkRmlsZVwiLCBbIGZpbGUubmFtZSwgY3kgXSApOyAvLyBBbGlhc2VzIGZvciBzYmdudml6TG9hZEZpbGVTdGFydFxuICAgICAgICAgJChkb2N1bWVudCkudHJpZ2dlciggXCJzYmdudml6TG9hZEZpbGVTdGFydFwiLCBbIGZpbGUubmFtZSwgY3kgXSApO1xuICAgICAgIH1cbiAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICB1aVV0aWxpdGllcy5lbmRTcGlubmVyKFwibG9hZC1maWxlLXNwaW5uZXJcIik7XG4gICAgICAgICBjb25zb2xlLmxvZyhlcnIpO1xuICAgICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjazIgIT09ICd1bmRlZmluZWQnKSBjYWxsYmFjazIoKTtcbiAgICAgICAgIHJldHVybjtcbiAgICAgICB9XG5cbiAgICAgICB1cGRhdGVHcmFwaChjeUdyYXBoKTtcblxuICAgICAgIGlmICh0eXBlb2YgY2FsbGJhY2szICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgY2FsbGJhY2szKCk7XG4gICAgICAgfVxuXG4gICAgICAgdWlVdGlsaXRpZXMuZW5kU3Bpbm5lcihcImxvYWQtZmlsZS1zcGlubmVyXCIpO1xuICAgICAgICQoZG9jdW1lbnQpLnRyaWdnZXIoIFwic2JnbnZpekxvYWRGaWxlRW5kXCIsIFsgZmlsZS5uYW1lLCBjeSBdICk7IC8vIFRyaWdnZXIgYW4gZXZlbnQgc2lnbmFsaW5nIHRoYXQgYSBmaWxlIGlzIGxvYWRlZFxuXG4gICAgICAgaWYgKHR5cGVvZiBjYWxsYmFjazQgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICBjYWxsYmFjazQoKTtcbiAgICAgICB9XG4gICAgIH0sIDApO1xuICAgfTtcblxuICAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7XG4gfTtcblxuIGZpbGVVdGlsaXRpZXMubG9hZFNCR05NTFRleHQgPSBhc3luYyBmdW5jdGlvbih0ZXh0RGF0YSwgdGlsZUluZm9Cb3hlcywgZmlsZW5hbWUsIGN5LCB1cmxQYXJhbXMpe1xuICBhd2FpdCB1cGRhdGVHcmFwaChzYmdubWxUb0pzb24uY29udmVydCh0ZXh0VG9YbWxPYmplY3QodGV4dERhdGEpLCB1cmxQYXJhbXMpLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdGlsZUluZm9Cb3hlcyk7XG4gIGF3YWl0ICQoZG9jdW1lbnQpLnRyaWdnZXIoXCJzYmdudml6TG9hZEZpbGVFbmRcIiwgIFtmaWxlbmFtZSwgY3ldKTtcbiAgICAgICAgdWlVdGlsaXRpZXMuZW5kU3Bpbm5lcihcImxvYWQtZmlsZS1zcGlubmVyXCIpO1xuXG5cbiB9O1xuXG4gZmlsZVV0aWxpdGllcy5sb2FkU0JNTFRleHQgPSBhc3luYyBmdW5jdGlvbih0ZXh0RGF0YSwgdGlsZUluZm9Cb3hlcywgZmlsZW5hbWUsIGN5LCB1cmxQYXJhbXMpe1xuICBhd2FpdCB1cGRhdGVHcmFwaChzYm1sVG9Kc29uLmNvbnZlcnQodGV4dFRvWG1sT2JqZWN0KHRleHREYXRhKSwgdXJsUGFyYW1zKSwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHRpbGVJbmZvQm94ZXMpO1xuICAgYXdhaXQgJChkb2N1bWVudCkudHJpZ2dlcihcInNiZ252aXpMb2FkRmlsZUVuZFwiLCAgW2ZpbGVuYW1lLCBjeV0pO1xuICAgdWlVdGlsaXRpZXMuZW5kU3Bpbm5lcihcImxvYWQtZmlsZS1zcGlubmVyXCIpO1xuXG59O1xuXG4gLy8gc3VwcG9ydGVkIHZlcnNpb25zIGFyZSBlaXRoZXIgMC4yIG9yIDAuM1xuIGZpbGVVdGlsaXRpZXMuc2F2ZUFzU2Jnbm1sID0gZnVuY3Rpb24oZmlsZW5hbWUsIHZlcnNpb24sIHJlbmRlckluZm8sIG1hcFByb3BlcnRpZXMsIG5vZGVzLCBlZGdlcykge1xuICAgdmFyIHNiZ25tbFRleHQgPSBqc29uVG9TYmdubWwuY3JlYXRlU2Jnbm1sKGZpbGVuYW1lLCB2ZXJzaW9uLCByZW5kZXJJbmZvLCBtYXBQcm9wZXJ0aWVzLCBub2RlcywgZWRnZXMpO1xuICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbc2Jnbm1sVGV4dF0sIHtcbiAgICAgdHlwZTogXCJ0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTg7XCIsXG4gICB9KTtcbiAgIHNhdmVBcyhibG9iLCBmaWxlbmFtZSk7XG4gfTtcblxuIGZpbGVVdGlsaXRpZXMuc2F2ZUFzU2Jnbm1sRm9yU0JNTCA9IGZ1bmN0aW9uKGZpbGVuYW1lLCBlcnJvckNhbGxiYWNrKXtcbiAgLy8gV2UgaGF2ZSBzYm1sIG1hcCB0eXBlZCBub2RlcyBhbmQgZWRnZXMgaW4gdGhlIGN5dG9zY2FwZSBncmFwaCBhbmQgd2Ugd2FudCB0byBleHBvcnQgdG8gc2Jnbm1sXG4gIC8vIENyZWF0ZSBzYm1sIGZpbGUgZmlyc3QsIHRoZW4gZ2V0IHRoZSBzYmdubWwgZnJvbSB0aGUgTWluZXJ2YSBjb252ZXJzaW9uIHNlcnZpY2VcbiAgdWlVdGlsaXRpZXMuc3RhcnRTcGlubmVyKFwibG9hZC1maWxlLXNwaW5uZXJcIik7XG4gIHZhciBzYmduVGV4dCA9IGpzb25Ub1NibWwuY3JlYXRlU2JtbChmaWxlbmFtZSk7XG4gIC8vY29udmVydCBzYm1sIHRvIHNiZ25tbFxuICB0aGlzLmNvbnZlcnRTYm1sVG9TYmdubWwoc2JnblRleHQsIGZ1bmN0aW9uKGRhdGEpe1xuICAgIGlmKCFkYXRhLnJlc3VsdCl7XG4gICAgICBlcnJvckNhbGxiYWNrKCk7XG4gICAgfWVsc2V7XG4gICAgICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtkYXRhLm1lc3NhZ2VdLCB7XG4gICAgICAgIHR5cGU6IFwidGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04O1wiLFxuICAgICAgfSk7XG4gICAgICBzYXZlQXMoYmxvYiwgZmlsZW5hbWUpO1xuICAgIH1cbiAgICB1aVV0aWxpdGllcy5lbmRTcGlubmVyKFwibG9hZC1maWxlLXNwaW5uZXJcIik7XG4gIH0uYmluZCh0aGlzKSk7XG59XG5cbiAvLyBzdXBwb3J0ZWQgdmVyc2lvbnMgYXJlIGVpdGhlciAwLjIgb3IgMC4zXG4gZmlsZVV0aWxpdGllcy5zYXZlQXNOd3QgPSBmdW5jdGlvbihmaWxlbmFtZSwgdmVyc2lvbiwgcmVuZGVySW5mbywgbWFwUHJvcGVydGllcywgbm9kZXMsIGVkZ2VzKSB7XG4gICB2YXIgc2Jnbm1sVGV4dCA9IGpzb25Ub053dC5jcmVhdGVOd3QoZmlsZW5hbWUsIHZlcnNpb24sIHJlbmRlckluZm8sIG1hcFByb3BlcnRpZXMsIG5vZGVzLCBlZGdlcyk7XG4gICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtzYmdubWxUZXh0XSwge1xuICAgICB0eXBlOiBcInRleHQvcGxhaW47Y2hhcnNldD11dGYtODtcIixcbiAgIH0pO1xuICAgc2F2ZUFzKGJsb2IsIGZpbGVuYW1lKTtcbiB9O1xuXG4gZmlsZVV0aWxpdGllcy5zYXZlQXNDZWxsRGVzaWduZXIgPSBmdW5jdGlvbihmaWxlbmFtZSwgZXJyb3JDYWxsYmFjayl7XG4gIHVpVXRpbGl0aWVzLnN0YXJ0U3Bpbm5lcihcImxvYWQtc3Bpbm5lclwiKTtcbiAgdmFyIHNiZ25tbCA9IGpzb25Ub1NiZ25tbC5jcmVhdGVTYmdubWwoKTsgXG4gIHRoaXMuY29udmVydFNiZ25tbFRvQ0Qoc2Jnbm1sLCBmdW5jdGlvbihkYXRhKXtcbiAgICBpZihkYXRhID09IG51bGwpe1xuICAgICAgZXJyb3JDYWxsYmFjaygpO1xuICAgIH1lbHNle1xuICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbZGF0YV0sIHtcbiAgICAgICAgdHlwZTogXCJ0ZXh0L3BsYWluO2NoYXJzZXQ9dXRmLTg7XCIsXG4gICAgICB9KTtcbiAgICAgIHNhdmVBcyhibG9iLCBmaWxlbmFtZSk7IFxuICAgIH1cbiAgICB1aVV0aWxpdGllcy5lbmRTcGlubmVyKFwibG9hZC1zcGlubmVyXCIpO1xuICAgIFxuICB9KTtcbiB9O1xuXG4gZmlsZVV0aWxpdGllcy5sb2FkQ2VsbERlc2lnbmVyID0gZnVuY3Rpb24oZmlsZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKXtcbiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgcmVhZGVyLm9ubG9hZCA9IGZ1bmN0aW9uIChlKSB7IFxuICBcbiAgICAvLyB0aGlzLmNvbnZlcnRDRFRvU2Jnbm1sKGUudGFyZ2V0LnJlc3VsdCwgZnVuY3Rpb24oZGF0YSl7XG4gICAgY2RUb1NiZ25tbC5jb252ZXJ0KGUudGFyZ2V0LnJlc3VsdCwgZnVuY3Rpb24oZGF0YSl7XG4gICAgICB1aVV0aWxpdGllcy5lbmRTcGlubmVyKFwibG9hZC1zcGlubmVyXCIpO1xuICAgICAgaWYoZGF0YSA9PSBudWxsKXtcbiAgICAgICAgZXJyb3JDYWxsYmFjaygpO1xuICAgICAgfWVsc2V7XG4gICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhkYXRhKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfS5iaW5kKHRoaXMpO1xuICB1aVV0aWxpdGllcy5zdGFydFNwaW5uZXIoXCJsb2FkLXNwaW5uZXJcIik7XG4gIHJlYWRlci5yZWFkQXNUZXh0KGZpbGUpO1xuIH07XG5cbiBmaWxlVXRpbGl0aWVzLnNhdmVBc1NibWwgPSBmdW5jdGlvbihmaWxlbmFtZSwgZXJyb3JDYWxsYmFjayl7XG4gIHVpVXRpbGl0aWVzLnN0YXJ0U3Bpbm5lcihcImxvYWQtc3Bpbm5lclwiKTtcbiAgdmFyIHNiZ25tbCA9IHRoaXMuY29udmVydFNiZ24oKTtcbiAgdGhpcy5jb252ZXJ0U2Jnbm1sVG9TYm1sKHNiZ25tbCwgZnVuY3Rpb24oZGF0YSl7XG4gICAgaWYgKCFkYXRhLnJlc3VsdCkge1xuICAgICAgZXJyb3JDYWxsYmFjayhzYmdubWwsIGRhdGEuZXJyb3IpO1xuICAgIH0gZWxzZSBpZiAoZGF0YS5tZXNzYWdlLmluZGV4T2YoXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIikgIT09IC0xKSB7XG4gICAgICBlcnJvckNhbGxiYWNrKHNiZ25tbCwgZGF0YS5tZXNzYWdlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbZGF0YS5tZXNzYWdlXSwge1xuICAgICAgICB0eXBlOiBcInRleHQvcGxhaW47Y2hhcnNldD11dGYtODtcIixcbiAgICAgIH0pO1xuICAgICAgc2F2ZUFzKGJsb2IsIGZpbGVuYW1lKTtcbiAgICB9XG4gICAgdWlVdGlsaXRpZXMuZW5kU3Bpbm5lcihcImxvYWQtc3Bpbm5lclwiKTtcbiAgfSk7XG4gfVxuXG4gIGZpbGVVdGlsaXRpZXMuc2F2ZVNibWxGb3JTQk1MID0gZnVuY3Rpb24oZmlsZW5hbWUsIGVycm9yQ2FsbGJhY2spe1xuICAgIHVpVXRpbGl0aWVzLnN0YXJ0U3Bpbm5lcihcImxvYWQtc3Bpbm5lclwiKTtcbiAgICB0cnkge1xuICAgICAgdmFyIHNiZ25UZXh0ID0ganNvblRvU2JtbC5jcmVhdGVTYm1sKGZpbGVuYW1lKTtcbiAgICAgIHZhciBibG9iID0gbmV3IEJsb2IoW3NiZ25UZXh0XSwge1xuICAgICAgICB0eXBlOiBcInRleHQvcGxhaW47Y2hhcnNldD11dGYtODtcIixcbiAgICAgIH0pO1xuICAgICAgc2F2ZUFzKGJsb2IsIGZpbGVuYW1lKTtcbiAgICB9XG4gICAgY2F0Y2goZXJyKSB7XG4gICAgICBlcnJvckNhbGxiYWNrKCk7XG4gICAgfVxuICAgIHVpVXRpbGl0aWVzLmVuZFNwaW5uZXIoXCJsb2FkLXNwaW5uZXJcIik7XG59XG5maWxlVXRpbGl0aWVzLmhhc0xheW91dFNCTUwgPSBmdW5jdGlvbihmaWxlKSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gICAgdmFyIGxheW91dEZvdW5kID0gZmFsc2U7XG5cbiAgICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24oZSkge1xuICAgICAgdmFyIHRleHQgPSB0aGlzLnJlc3VsdDtcbiAgICAgIHZhciBtYXRjaFJlc3VsdCA9IHRleHQubWF0Y2goLzxbXj5dKmxpc3RPZkxheW91dHNbXj5dKj5bXFxzXFxTXSo8XFwvW14+XSpsaXN0T2ZMYXlvdXRzW14+XSo+Lyk7XG4gICAgICBpZiAobWF0Y2hSZXN1bHQgIT0gbnVsbCkge1xuICAgICAgICBsYXlvdXRGb3VuZCA9IHRydWU7XG4gICAgICB9XG4gICAgICByZXNvbHZlKGxheW91dEZvdW5kKTtcbiAgICB9O1xuXG4gICAgcmVhZGVyLm9uZXJyb3IgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJlamVjdChuZXcgRXJyb3IoXCJGYWlsZWQgdG8gcmVhZCB0aGUgZmlsZVwiKSk7XG4gICAgfTtcblxuICAgIHJlYWRlci5yZWFkQXNUZXh0KGZpbGUpO1xuICB9KTtcbn07XG5cbiBmaWxlVXRpbGl0aWVzLmxvYWRTYm1sRm9yU0JNTCA9IGFzeW5jIGZ1bmN0aW9uKGZpbGUsIGNhbGxiYWNrMSwgY2FsbGJhY2syLCBsYXlvdXRCeSlcbiB7XG4gIHZhciBjb252ZXJ0ID0gZnVuY3Rpb24oIHRleHQgKSB7XG4gICAgdmFyIGNvbnZlcnRlZCA9IHNibWxUb0pzb24uY29udmVydCh0ZXh0KVxuICAgIHJldHVybiBjb252ZXJ0ZWQ7XG4gIH07XG5cbiAgdmFyIHJ1bkxheW91dCA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICggbGF5b3V0QnkgKSB7XG4gICAgICBpZiAoIHR5cGVvZiBsYXlvdXRCeSA9PT0gJ2Z1bmN0aW9uJyApIHtcbiAgICAgICAgbGF5b3V0QnkoKTtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICB2YXIgbGF5b3V0ID0gY3kubGF5b3V0KCBsYXlvdXRCeSApO1xuXG4gICAgICAgIC8vIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG5lZWQgdG8gbWFrZSB0aGlzIGlmIGNoZWNrXG4gICAgICAgIGlmICggbGF5b3V0ICYmIGxheW91dC5ydW4gKSB7XG4gICAgICAgICAgbGF5b3V0LnJ1bigpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgY3kuZml0KCBjeS5lbGVtZW50cyhcIjp2aXNpYmxlXCIpLCAyMCApO1xuICB9O1xuICBsZXQgbGF5b3V0Rm91bmQgPSBhd2FpdCBmaWxlVXRpbGl0aWVzLmhhc0xheW91dFNCTUwoZmlsZSk7XG4gIGlmIChsYXlvdXRGb3VuZCl7XG4gICAgZmlsZVV0aWxpdGllcy5sb2FkRmlsZSggZmlsZSwgY29udmVydCwgY2FsbGJhY2sxLCBjYWxsYmFjazIsIGZpbGVVdGlsaXRpZXMuY29sbGFwc2VNYXJrZWROb2RlcywgdW5kZWZpbmVkKTtcbiAgfVxuICBlbHNle1xuICAgIGZpbGVVdGlsaXRpZXMubG9hZEZpbGUoIGZpbGUsIGNvbnZlcnQsIGNhbGxiYWNrMSwgY2FsbGJhY2syLCBmaWxlVXRpbGl0aWVzLmNvbGxhcHNlTWFya2VkTm9kZXMsIHJ1bkxheW91dCk7XG4gIH1cbiB9XG4gZmlsZVV0aWxpdGllcy5sb2FkU2JtbCA9IGZ1bmN0aW9uKGZpbGUsIHN1Y2Nlc3NDYWxsYmFjaywgZXJyb3JDYWxsYmFjayl7XG4gIHZhciByZWFkZXIgPSBuZXcgRmlsZVJlYWRlcigpO1xuICByZWFkZXIub25sb2FkID0gZnVuY3Rpb24gKGUpIHsgXG4gICAgXG4gICAgICB0aGlzLmNvbnZlcnRTYm1sVG9TYmdubWwoZS50YXJnZXQucmVzdWx0LCBmdW5jdGlvbihkYXRhKXtcbiAgICAgIGlmKGRhdGEgPT0gbnVsbCl7XG4gICAgICAgIGVycm9yQ2FsbGJhY2soKTtcbiAgICAgIH1lbHNle1xuICAgICAgICBzdWNjZXNzQ2FsbGJhY2soZGF0YSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH0uYmluZCh0aGlzKTtcbiAgcmVhZGVyLnJlYWRBc1RleHQoZmlsZSk7XG5cbiB9O1xuXG4gZmlsZVV0aWxpdGllcy5zYXZlQXNHcG1sID0gZnVuY3Rpb24oZmlsZW5hbWUsZXJyb3JDYWxsYmFjayl7XG4gIHVpVXRpbGl0aWVzLnN0YXJ0U3Bpbm5lcihcImxvYWQtc3Bpbm5lclwiKTtcbiAgdmFyIHNiZ25tbCA9IHRoaXMuY29udmVydFNiZ24oKTtcbiAgXG4gIHRoaXMuY29udmVydFNiZ25tbFRvR3BtbChzYmdubWwsIGZ1bmN0aW9uKGRhdGEpe1xuICAgIFxuICAgIGlmKCFkYXRhLnJlc3VsdCl7XG4gICAgICBlcnJvckNhbGxiYWNrKHNiZ25tbCxkYXRhLmVycm9yKTtcbiAgICB9ZWxzZSBpZiggZGF0YS5tZXNzYWdlLmluZGV4T2YoXCJJbnRlcm5hbCBzZXJ2ZXIgZXJyb3JcIikgIT09IC0xKVxuICAgIHtcbiAgICAgIGVycm9yQ2FsbGJhY2soc2Jnbm1sLGRhdGEubWVzc2FnZSk7XG4gICAgfWVsc2V7ICAgIFxuICAgICAgdmFyIGJsb2IgPSBuZXcgQmxvYihbZGF0YS5tZXNzYWdlXSwge1xuICAgICAgICB0eXBlOiBcInRleHQvcGxhaW47Y2hhcnNldD11dGYtODtcIixcbiAgICAgIH0pO1xuICAgICAgc2F2ZUFzKGJsb2IsIGZpbGVuYW1lKTsgXG4gICAgfVxuICAgIHVpVXRpbGl0aWVzLmVuZFNwaW5uZXIoXCJsb2FkLXNwaW5uZXJcIik7XG4gIH0pO1xuIH07XG5cbiBmaWxlVXRpbGl0aWVzLmxvYWRHcG1sID0gZnVuY3Rpb24oZmlsZSwgc3VjY2Vzc0NhbGxiYWNrLCBlcnJvckNhbGxiYWNrKXtcbiAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG4gIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbiAoZSkgeyBcbiAgICBcbiAgICBncG1sVG9TYmdubWwuY29udmVydChlLnRhcmdldC5yZXN1bHQsIGZ1bmN0aW9uKGRhdGEpe1xuICAgICAgaWYoZGF0YSA9PSBudWxsKXtcbiAgICAgICAgZXJyb3JDYWxsYmFjaygpO1xuICAgICAgfWVsc2V7XG4gICAgICAgIHN1Y2Nlc3NDYWxsYmFjayhkYXRhKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfS5iaW5kKHRoaXMpO1xuICByZWFkZXIucmVhZEFzVGV4dChmaWxlKTtcblxuIH07IFxuXG4gZmlsZVV0aWxpdGllcy5jb252ZXJ0U2Jnbj0gZnVuY3Rpb24oZmlsZW5hbWUsIHZlcnNpb24sIHJlbmRlckluZm8sIG1hcFByb3BlcnRpZXMsIG5vZGVzLCBlZGdlcywgaGlkZGVuID0gZmFsc2UpIHtcbiAgdmFyIHNiZ25tbFRleHQgPSBqc29uVG9TYmdubWwuY3JlYXRlU2Jnbm1sKGZpbGVuYW1lLCB2ZXJzaW9uLCByZW5kZXJJbmZvLCBtYXBQcm9wZXJ0aWVzLCBub2RlcywgZWRnZXMsIGhpZGRlbik7XG4gIHJldHVybiBzYmdubWxUZXh0O1xufTtcblxuIGZpbGVVdGlsaXRpZXMuZXhwb3J0TGF5b3V0RGF0YSA9IGZ1bmN0aW9uKGZpbGVuYW1lLCBieU5hbWUpIHtcbiAgIHZhciBsYXlvdXRUZXh0ID0gbGF5b3V0VG9UZXh0LmNvbnZlcnQoIGJ5TmFtZSApO1xuXG4gICB2YXIgYmxvYiA9IG5ldyBCbG9iKFtsYXlvdXRUZXh0XSwge1xuICAgICB0eXBlOiBcInRleHQvcGxhaW47Y2hhcnNldD11dGYtODtcIixcbiAgIH0pO1xuICAgc2F2ZUFzKGJsb2IsIGZpbGVuYW1lKTtcbiB9O1xuXG4gZmlsZVV0aWxpdGllcy5zYXZlQXNQbGFpblNpZiA9IGZ1bmN0aW9uKGZpbGVuYW1lKSB7XG4gICB2YXIgdGV4dCA9IGpzb25Ub1NpZi5jb252ZXJ0KCk7XG5cbiAgIHZhciBibG9iID0gbmV3IEJsb2IoW3RleHRdLCB7XG4gICAgIHR5cGU6IFwidGV4dC9wbGFpbjtjaGFyc2V0PXV0Zi04O1wiLFxuICAgfSk7XG4gICBzYXZlQXMoYmxvYiwgZmlsZW5hbWUpO1xuIH07XG5cbiBmaWxlVXRpbGl0aWVzLmNvbnZlcnRTYmdubWxUZXh0VG9Kc29uID0gZnVuY3Rpb24oc2Jnbm1sVGV4dCl7XG4gICAgIHJldHVybiBzYmdubWxUb0pzb24uY29udmVydCh0ZXh0VG9YbWxPYmplY3Qoc2Jnbm1sVGV4dCkpO1xuIH07XG4gZmlsZVV0aWxpdGllcy5jb252ZXJ0U2JtbFRleHRUb0pzb24gPSBmdW5jdGlvbihzYmdubWxUZXh0KXtcbiAgcmV0dXJuIHNibWxUb0pzb24uY29udmVydCh0ZXh0VG9YbWxPYmplY3Qoc2Jnbm1sVGV4dCkpO1xufTtcblxuIGZpbGVVdGlsaXRpZXMuY29udmVydFNpZlRleHRUb0pzb24gPSBmdW5jdGlvbihzaWZUZXh0KXtcbiAgICAgICAgcmV0dXJuIHNpZlRvSnNvbi5jb252ZXJ0KHNpZlRleHQpO1xuIH07XG4gXG5maWxlVXRpbGl0aWVzLmNyZWF0ZUpzb25Gcm9tU0JHTiA9IGZ1bmN0aW9uKCl7XG5cblxuICAgIHZhciBzYmdubWxUZXh0ID0ganNvblRvU2Jnbm1sLmNyZWF0ZVNiZ25tbCgpO1xuICAgIHJldHVybiBzYmdubWxUb0pzb24uY29udmVydCh0ZXh0VG9YbWxPYmplY3Qoc2Jnbm1sVGV4dCkpO1xufTtcblxuZmlsZVV0aWxpdGllcy5jcmVhdGVKc29uRnJvbVNCTUwgPSBmdW5jdGlvbigpe1xuXG4gIHZhciBzYmdubWxUZXh0ID0ganNvblRvU2Jnbm1sLmNyZWF0ZVNiZ25tbCgpOyAvL1NCTUxcbiAgdmFyIGNvbnZlcnRlZF8gPSBzYm1sVG9Kc29uLmNvbnZlcnQodGV4dFRvWG1sT2JqZWN0KHNiZ25tbFRleHQpKTtcbiAgcmV0dXJuIGNvbnZlcnRlZF87XG59O1xuXG5maWxlVXRpbGl0aWVzLmNyZWF0ZUpzb25Gcm9tU2lmID0gZnVuY3Rpb24oKXtcblxuICAgIHZhciBzaWZUZXh0ID0ganNvblRvU2lmLmNvbnZlcnQoKTtcbiAgICByZXR1cm4gc2lmVG9Kc29uLmNvbnZlcnQoc2lmVGV4dCk7XG4gICAgXG59O1xuXG5maWxlVXRpbGl0aWVzLmNvbnZlcnRTYmdubWxUb0NEID0gZnVuY3Rpb24oc2Jnbm1sLCBjYWxsYmFjayl7XG4gICBcbiAgcmV0dXJuIHNiZ25tbFRvQ2QuY29udmVydChzYmdubWwsY2FsbGJhY2spO1xufTtcblxuZmlsZVV0aWxpdGllcy5jb252ZXJ0Q0RUb1NiZ25tbCA9IGZ1bmN0aW9uKHhtbCxjYWxsYmFjayl7XG5cbiAgcmV0dXJuIGNkVG9TYmdubWwuY29udmVydCh4bWwsY2FsbGJhY2spO1xufTtcblxuZmlsZVV0aWxpdGllcy5jb252ZXJ0U2Jnbm1sVG9TYm1sID0gZnVuY3Rpb24oc2Jnbm1sLCBjYWxsYmFjayl7XG4gICBcbiAgcmV0dXJuIHNiZ25tbFRvU2JtbC5jb252ZXJ0KHNiZ25tbCxjYWxsYmFjayk7XG59O1xuXG5maWxlVXRpbGl0aWVzLmNvbnZlcnRTYm1sVG9TYmdubWwgPSBmdW5jdGlvbihzYm1sLCBjYWxsYmFjayl7XG4gIHJldHVybiBzYm1sVG9TYmdubWwuY29udmVydChzYm1sLGNhbGxiYWNrKTtcbn07XG5cbmZpbGVVdGlsaXRpZXMuY29udmVydEdwbWxUb1NiZ25tbCA9IGZ1bmN0aW9uKGdwbWwsIGNhbGxiYWNrKXtcbiAgcmV0dXJuIGdwbWxUb1NiZ25tbC5jb252ZXJ0KGdwbWwsY2FsbGJhY2spO1xufTtcblxuZmlsZVV0aWxpdGllcy5jb252ZXJ0U2Jnbm1sVG9HcG1sID0gZnVuY3Rpb24oc2Jnbm1sLCBjYWxsYmFjayl7XG4gICBcbiAgcmV0dXJuIHNiZ25tbFRvR3BtbC5jb252ZXJ0KHNiZ25tbCxjYWxsYmFjayk7XG59O1xuXG4gcmV0dXJuIGZpbGVVdGlsaXRpZXM7XG59O1xuIl0sIm5hbWVzIjpbIl9yZWdlbmVyYXRvclJ1bnRpbWUiLCJlIiwidCIsInIiLCJPYmplY3QiLCJwcm90b3R5cGUiLCJuIiwiaGFzT3duUHJvcGVydHkiLCJvIiwiZGVmaW5lUHJvcGVydHkiLCJ2YWx1ZSIsImkiLCJTeW1ib2wiLCJhIiwiaXRlcmF0b3IiLCJjIiwiYXN5bmNJdGVyYXRvciIsInUiLCJ0b1N0cmluZ1RhZyIsImRlZmluZSIsImVudW1lcmFibGUiLCJjb25maWd1cmFibGUiLCJ3cml0YWJsZSIsIndyYXAiLCJHZW5lcmF0b3IiLCJjcmVhdGUiLCJDb250ZXh0IiwibWFrZUludm9rZU1ldGhvZCIsInRyeUNhdGNoIiwidHlwZSIsImFyZyIsImNhbGwiLCJoIiwibCIsImYiLCJzIiwieSIsIkdlbmVyYXRvckZ1bmN0aW9uIiwiR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUiLCJwIiwiZCIsImdldFByb3RvdHlwZU9mIiwidiIsInZhbHVlcyIsImciLCJkZWZpbmVJdGVyYXRvck1ldGhvZHMiLCJmb3JFYWNoIiwiX2ludm9rZSIsIkFzeW5jSXRlcmF0b3IiLCJpbnZva2UiLCJfdHlwZW9mIiwicmVzb2x2ZSIsIl9fYXdhaXQiLCJ0aGVuIiwiY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmciLCJFcnJvciIsImRvbmUiLCJtZXRob2QiLCJkZWxlZ2F0ZSIsIm1heWJlSW52b2tlRGVsZWdhdGUiLCJzZW50IiwiX3NlbnQiLCJkaXNwYXRjaEV4Y2VwdGlvbiIsImFicnVwdCIsIlR5cGVFcnJvciIsInJlc3VsdE5hbWUiLCJuZXh0IiwibmV4dExvYyIsInB1c2hUcnlFbnRyeSIsInRyeUxvYyIsImNhdGNoTG9jIiwiZmluYWxseUxvYyIsImFmdGVyTG9jIiwidHJ5RW50cmllcyIsInB1c2giLCJyZXNldFRyeUVudHJ5IiwiY29tcGxldGlvbiIsInJlc2V0IiwiaXNOYU4iLCJsZW5ndGgiLCJkaXNwbGF5TmFtZSIsImlzR2VuZXJhdG9yRnVuY3Rpb24iLCJjb25zdHJ1Y3RvciIsIm5hbWUiLCJtYXJrIiwic2V0UHJvdG90eXBlT2YiLCJfX3Byb3RvX18iLCJhd3JhcCIsImFzeW5jIiwiUHJvbWlzZSIsImtleXMiLCJyZXZlcnNlIiwicG9wIiwicHJldiIsImNoYXJBdCIsInNsaWNlIiwic3RvcCIsInJ2YWwiLCJoYW5kbGUiLCJjb21wbGV0ZSIsImZpbmlzaCIsIl9jYXRjaCIsImRlbGVnYXRlWWllbGQiLCJhc3luY0dlbmVyYXRvclN0ZXAiLCJfYXN5bmNUb0dlbmVyYXRvciIsImFyZ3VtZW50cyIsImFwcGx5IiwiX25leHQiLCJfdGhyb3ciLCJsaWJVdGlsaXRpZXMiLCJyZXF1aXJlIiwibGlicyIsImdldExpYnMiLCJqUXVlcnkiLCIkIiwic2F2ZUFzIiwidGV4dFV0aWxpdGllcyIsIm1vZHVsZSIsImV4cG9ydHMiLCJiNjR0b0Jsb2IiLCJiNjREYXRhIiwiY29udGVudFR5cGUiLCJzbGljZVNpemUiLCJieXRlQ2hhcmFjdGVycyIsImF0b2IiLCJieXRlQXJyYXlzIiwib2Zmc2V0IiwiYnl0ZU51bWJlcnMiLCJBcnJheSIsImNoYXJDb2RlQXQiLCJieXRlQXJyYXkiLCJVaW50OEFycmF5IiwiYmxvYiIsIkJsb2IiLCJsb2FkVGV4dERvYyIsImZ1bGxGaWxlUGF0aCIsIndpbmRvdyIsIlhNTEh0dHBSZXF1ZXN0IiwieGh0dHAiLCJBY3RpdmVYT2JqZWN0Iiwib3ZlcnJpZGVNaW1lVHlwZSIsIm9wZW4iLCJzZW5kIiwicmVzcG9uc2VUZXh0IiwibG9hZFhNTERvYyIsInJlc3BvbnNlWE1MIiwidGV4dFRvWG1sT2JqZWN0IiwidGV4dCIsImRvYyIsImxvYWRYTUwiLCJwYXJzZXIiLCJET01QYXJzZXIiLCJwYXJzZUZyb21TdHJpbmciLCJzYmdubWxUb0pzb24iLCJzYm1sVG9Kc29uIiwianNvblRvU2Jnbm1sIiwianNvblRvU2JtbCIsImpzb25Ub053dCIsInVpVXRpbGl0aWVzIiwidGRUb0pzb24iLCJzaWZUb0pzb24iLCJncmFwaFV0aWxpdGllcyIsImxheW91dFRvVGV4dCIsIm53dFRvSnNvbiIsImpzb25Ub1NpZiIsInNiZ25tbFRvQ2QiLCJjZFRvU2Jnbm1sIiwic2Jnbm1sVG9TYm1sIiwic2JtbFRvU2Jnbm1sIiwidXBkYXRlR3JhcGgiLCJvcHRpb25zIiwiY3kiLCJmaWxlVXRpbGl0aWVzIiwicGFyYW0iLCJzYmdubWxUb0pzb25Db252ZXJ0ZXIiLCJzYm1sVG9Kc29uQ29udmVydGVyIiwibnd0VG9Kc29uQ29udmVydGVyIiwianNvblRvU2Jnbm1sQ29udmVydGVyIiwianNvblRvU2JtbENvbnZlcnRlciIsImpzb25Ub053dENvbnZlcnRlciIsImpzb25Ub1NpZkNvbnZlcnRlciIsInRkVG9Kc29uQ29udmVydGVyIiwic2lmVG9Kc29uQ29udmVydGVyIiwiYmluZCIsIm9wdGlvblV0aWxpdGllcyIsImdldE9wdGlvbnMiLCJzYmduQ3lJbnN0YW5jZSIsImdldEN5Iiwic2Jnbm1sVG9DZENvbnZlcnRlciIsImNkVG9TYmdubWxDb252ZXJ0ZXIiLCJzYmdubWxUb1NibWxDb252ZXJ0ZXIiLCJzYm1sVG9TYmdubWxDb252ZXJ0ZXIiLCJncG1sVG9TYmdubWwiLCJncG1sVG9TYmdubWxDb252ZXJ0ZXIiLCJzYmdubWxUb0dwbWwiLCJzYmdubWxUb0dwbWxDb252ZXJ0ZXIiLCJzYXZlQXNQbmciLCJmaWxlbmFtZSIsInNjYWxlIiwiYmciLCJtYXhXaWR0aCIsIm1heEhlaWdodCIsInBuZ0NvbnRlbnQiLCJwbmciLCJmdWxsIiwiYjY0ZGF0YSIsInN1YnN0ciIsImluZGV4T2YiLCJzYXZlQXNKcGciLCJxdWFsaXR5IiwianBnQ29udGVudCIsImpwZyIsInNhdmVBc1N2ZyIsInN2Z0NvbnRlbnQiLCJzdmciLCJsb2FkU2FtcGxlIiwiZm9sZGVycGF0aCIsImNhbGxiYWNrIiwiZmlsZSIsInN0YXJ0U3Bpbm5lciIsImRvY3VtZW50IiwidHJpZ2dlciIsIm1hdGNoUmVzdWx0IiwibWF0Y2giLCJyZW5kZXJJbmZvU3RyaW5nIiwicmVuZGVySW5mb1N0cmluZ0NvcHkiLCJyZWdleCIsInJlc3VsdCIsIm1hdGNoZXMiLCJleGVjIiwicmVwbGFjZSIsIkZyb21LZWJhYlRvQ2FtZWxDYXNlIiwieG1sT2JqZWN0Iiwic2V0VGltZW91dCIsImNvbnZlcnQiLCJjb2xsYXBzZU1hcmtlZE5vZGVzIiwiZW5kU3Bpbm5lciIsImxvYWRTSUZGaWxlIiwibGF5b3V0QnkiLCJydW5MYXlvdXQiLCJsYXlvdXQiLCJydW4iLCJmaXQiLCJlbGVtZW50cyIsImxvYWRGaWxlIiwidW5kZWZpbmVkIiwibG9hZFRERmlsZSIsImZ1bmN0aW9uTmFtZSIsImxvYWRTQkdOTUxGaWxlIiwiY2FsbGJhY2sxIiwiY2FsbGJhY2syIiwibG9hZE53dEZpbGUiLCJ1cmxQYXJhbXMiLCJub2Rlc1RvQ29sbGFwc2UiLCJub2RlcyIsImV4cGFuZENvbGxhcHNlIiwiY29sbGFwc2UiLCJlbGUiLCJlbGVzIiwicG9zaXRpb24iLCJkYXRhIiwicmVtb3ZlRGF0YSIsImNvbnZlcnRGY24iLCJjYWxsYmFjazMiLCJjYWxsYmFjazQiLCJzZWxmIiwidGV4dFR5cGUiLCJyZWFkZXIiLCJGaWxlUmVhZGVyIiwib25sb2FkIiwiaW1hZ2VzRWxlbWVudE1hdGNoIiwiaW1hZ2VzRWxlbWVudCIsImltYWdlc0VsZW1lbnRNYXRjaERpcnR5IiwiY3lHcmFwaCIsImVyciIsImNvbnNvbGUiLCJsb2ciLCJyZWFkQXNUZXh0IiwibG9hZFNCR05NTFRleHQiLCJfcmVmIiwiX2NhbGxlZSIsInRleHREYXRhIiwidGlsZUluZm9Cb3hlcyIsIl9jYWxsZWUkIiwiX2NvbnRleHQiLCJfeCIsIl94MiIsIl94MyIsIl94NCIsIl94NSIsImxvYWRTQk1MVGV4dCIsIl9yZWYyIiwiX2NhbGxlZTIiLCJfY2FsbGVlMiQiLCJfY29udGV4dDIiLCJfeDYiLCJfeDciLCJfeDgiLCJfeDkiLCJfeDEwIiwic2F2ZUFzU2Jnbm1sIiwidmVyc2lvbiIsInJlbmRlckluZm8iLCJtYXBQcm9wZXJ0aWVzIiwiZWRnZXMiLCJzYmdubWxUZXh0IiwiY3JlYXRlU2Jnbm1sIiwic2F2ZUFzU2Jnbm1sRm9yU0JNTCIsImVycm9yQ2FsbGJhY2siLCJzYmduVGV4dCIsImNyZWF0ZVNibWwiLCJjb252ZXJ0U2JtbFRvU2Jnbm1sIiwibWVzc2FnZSIsInNhdmVBc053dCIsImNyZWF0ZU53dCIsInNhdmVBc0NlbGxEZXNpZ25lciIsInNiZ25tbCIsImNvbnZlcnRTYmdubWxUb0NEIiwibG9hZENlbGxEZXNpZ25lciIsInN1Y2Nlc3NDYWxsYmFjayIsInRhcmdldCIsInNhdmVBc1NibWwiLCJjb252ZXJ0U2JnbiIsImNvbnZlcnRTYmdubWxUb1NibWwiLCJlcnJvciIsInNhdmVTYm1sRm9yU0JNTCIsImhhc0xheW91dFNCTUwiLCJyZWplY3QiLCJsYXlvdXRGb3VuZCIsIm9uZXJyb3IiLCJsb2FkU2JtbEZvclNCTUwiLCJfcmVmMyIsIl9jYWxsZWUzIiwiX2NhbGxlZTMkIiwiX2NvbnRleHQzIiwiY29udmVydGVkIiwiX3gxMSIsIl94MTIiLCJfeDEzIiwiX3gxNCIsImxvYWRTYm1sIiwic2F2ZUFzR3BtbCIsImNvbnZlcnRTYmdubWxUb0dwbWwiLCJsb2FkR3BtbCIsImhpZGRlbiIsImV4cG9ydExheW91dERhdGEiLCJieU5hbWUiLCJsYXlvdXRUZXh0Iiwic2F2ZUFzUGxhaW5TaWYiLCJjb252ZXJ0U2Jnbm1sVGV4dFRvSnNvbiIsImNvbnZlcnRTYm1sVGV4dFRvSnNvbiIsImNvbnZlcnRTaWZUZXh0VG9Kc29uIiwic2lmVGV4dCIsImNyZWF0ZUpzb25Gcm9tU0JHTiIsImNyZWF0ZUpzb25Gcm9tU0JNTCIsImNvbnZlcnRlZF8iLCJjcmVhdGVKc29uRnJvbVNpZiIsImNvbnZlcnRDRFRvU2Jnbm1sIiwieG1sIiwic2JtbCIsImNvbnZlcnRHcG1sVG9TYmdubWwiLCJncG1sIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/utilities/file-utilities-factory.js\n"); /***/ }), @@ -105,7 +105,7 @@ eval("/* provided dependency */ var console = __webpack_require__(/*! ./node_mod \***********************************************************/ /***/ ((module) => { -eval("module.exports = function () {\n var jsonToSbgnml, elementUtilities, cy;\n function gpmlToSbgnml(param) {\n jsonToSbgnml = param.jsonToSbgnmlConverter;\n elementUtilities = param.elementUtilities;\n cy = param.sbgnCyInstance.getCy();\n }\n gpmlToSbgnml.convert = function (xml, callback) {\n var conversionApiUrl = \"https://minerva-dev.lcsb.uni.lu/minerva/api/convert/GPML:SBGN-ML\";\n return $.ajax({\n type: 'post',\n url: conversionApiUrl,\n contentType: \"application/xml\",\n data: xml,\n dataType: \"text\",\n success: function success(data, textStatus, xhr) {\n if (xhr.status !== 200) {\n callback({\n result: false,\n error: data,\n message: \"Invalid response code: \" + xhr.status\n });\n } else {\n callback({\n result: true,\n message: data,\n error: \"\"\n });\n }\n },\n error: function error(_error) {\n callback({\n result: false,\n error: _error,\n message: \"\"\n });\n },\n fail: function fail(error) {\n callback({\n result: false,\n error: error,\n message: \"\"\n });\n }\n });\n };\n return gpmlToSbgnml;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbGl0aWVzL2dwbWwtdG8tc2Jnbm1sLWNvbnZlcnRlci1mYWN0b3J5LmpzIiwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsImpzb25Ub1NiZ25tbCIsImVsZW1lbnRVdGlsaXRpZXMiLCJjeSIsImdwbWxUb1NiZ25tbCIsInBhcmFtIiwianNvblRvU2Jnbm1sQ29udmVydGVyIiwic2JnbkN5SW5zdGFuY2UiLCJnZXRDeSIsImNvbnZlcnQiLCJ4bWwiLCJjYWxsYmFjayIsImNvbnZlcnNpb25BcGlVcmwiLCIkIiwiYWpheCIsInR5cGUiLCJ1cmwiLCJjb250ZW50VHlwZSIsImRhdGEiLCJkYXRhVHlwZSIsInN1Y2Nlc3MiLCJ0ZXh0U3RhdHVzIiwieGhyIiwic3RhdHVzIiwicmVzdWx0IiwiZXJyb3IiLCJtZXNzYWdlIiwiZmFpbCJdLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2JnbnZpei8uL3NyYy91dGlsaXRpZXMvZ3BtbC10by1zYmdubWwtY29udmVydGVyLWZhY3RvcnkuanM/YmEwNSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuXG4gIHZhciBqc29uVG9TYmdubWwsIGVsZW1lbnRVdGlsaXRpZXMsIGN5O1xuXG4gIGZ1bmN0aW9uIGdwbWxUb1NiZ25tbChwYXJhbSkge1xuICAgIGpzb25Ub1NiZ25tbCA9IHBhcmFtLmpzb25Ub1NiZ25tbENvbnZlcnRlcjtcbiAgICBlbGVtZW50VXRpbGl0aWVzID0gcGFyYW0uZWxlbWVudFV0aWxpdGllcztcbiAgICBjeSA9IHBhcmFtLnNiZ25DeUluc3RhbmNlLmdldEN5KCk7XG4gIH1cblxuXG4gIGdwbWxUb1NiZ25tbC5jb252ZXJ0ID0gZnVuY3Rpb24gKHhtbCwgY2FsbGJhY2spIHtcbiAgICAgIHZhciBjb252ZXJzaW9uQXBpVXJsID0gXCJodHRwczovL21pbmVydmEtZGV2Lmxjc2IudW5pLmx1L21pbmVydmEvYXBpL2NvbnZlcnQvR1BNTDpTQkdOLU1MXCI7XG5cbiAgICAgIHJldHVybiAkLmFqYXgoe1xuICAgICAgICAgIHR5cGU6ICdwb3N0JyxcbiAgICAgICAgICB1cmw6IGNvbnZlcnNpb25BcGlVcmwsXG4gICAgICAgICAgY29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veG1sXCIsXG4gICAgICAgICAgZGF0YTogeG1sLFxuICAgICAgICAgIGRhdGFUeXBlOiBcInRleHRcIixcbiAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSwgdGV4dFN0YXR1cywgeGhyKSB7XG4gICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzICE9PSAyMDApIHtcbiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHtyZXN1bHQ6IGZhbHNlLCBlcnJvcjogZGF0YSwgbWVzc2FnZTogXCJJbnZhbGlkIHJlc3BvbnNlIGNvZGU6IFwiICsgeGhyLnN0YXR1c30pO1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgY2FsbGJhY2soe3Jlc3VsdDogdHJ1ZSwgbWVzc2FnZTogZGF0YSwgZXJyb3I6IFwiXCJ9KTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICBjYWxsYmFjayh7cmVzdWx0OiBmYWxzZSwgZXJyb3I6IGVycm9yLCBtZXNzYWdlOiBcIlwifSk7XG4gICAgICAgICAgfSxcbiAgICAgICAgICBmYWlsOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soe3Jlc3VsdDogZmFsc2UsIGVycm9yOiBlcnJvciwgbWVzc2FnZTogXCJcIn0pO1xuICAgICAgICAgIH0sXG4gICAgICB9KVxuICAgICAgXG4gIH1cblxuICByZXR1cm4gZ3BtbFRvU2Jnbm1sO1xuXG59XG4iXSwibWFwcGluZ3MiOiJBQUFBQSxNQUFNLENBQUNDLE9BQU8sR0FBRyxZQUFXO0VBRTFCLElBQUlDLFlBQVksRUFBRUMsZ0JBQWdCLEVBQUVDLEVBQUU7RUFFdEMsU0FBU0MsWUFBWUEsQ0FBQ0MsS0FBSyxFQUFFO0lBQzNCSixZQUFZLEdBQUdJLEtBQUssQ0FBQ0MscUJBQXFCO0lBQzFDSixnQkFBZ0IsR0FBR0csS0FBSyxDQUFDSCxnQkFBZ0I7SUFDekNDLEVBQUUsR0FBR0UsS0FBSyxDQUFDRSxjQUFjLENBQUNDLEtBQUssQ0FBQyxDQUFDO0VBQ25DO0VBR0FKLFlBQVksQ0FBQ0ssT0FBTyxHQUFHLFVBQVVDLEdBQUcsRUFBRUMsUUFBUSxFQUFFO0lBQzVDLElBQUlDLGdCQUFnQixHQUFHLGtFQUFrRTtJQUV6RixPQUFPQyxDQUFDLENBQUNDLElBQUksQ0FBQztNQUNWQyxJQUFJLEVBQUUsTUFBTTtNQUNaQyxHQUFHLEVBQUVKLGdCQUFnQjtNQUNyQkssV0FBVyxFQUFFLGlCQUFpQjtNQUM5QkMsSUFBSSxFQUFFUixHQUFHO01BQ1RTLFFBQVEsRUFBRSxNQUFNO01BQ2hCQyxPQUFPLEVBQUUsU0FBQUEsUUFBVUYsSUFBSSxFQUFFRyxVQUFVLEVBQUVDLEdBQUcsRUFBRTtRQUN0QyxJQUFJQSxHQUFHLENBQUNDLE1BQU0sS0FBSyxHQUFHLEVBQUU7VUFDcEJaLFFBQVEsQ0FBQztZQUFDYSxNQUFNLEVBQUUsS0FBSztZQUFFQyxLQUFLLEVBQUVQLElBQUk7WUFBRVEsT0FBTyxFQUFFLHlCQUF5QixHQUFHSixHQUFHLENBQUNDO1VBQU0sQ0FBQyxDQUFDO1FBQzNGLENBQUMsTUFBTTtVQUNIWixRQUFRLENBQUM7WUFBQ2EsTUFBTSxFQUFFLElBQUk7WUFBRUUsT0FBTyxFQUFFUixJQUFJO1lBQUVPLEtBQUssRUFBRTtVQUFFLENBQUMsQ0FBQztRQUN0RDtNQUNKLENBQUM7TUFDREEsS0FBSyxFQUFFLFNBQUFBLE1BQVVBLE1BQUssRUFBRTtRQUNwQmQsUUFBUSxDQUFDO1VBQUNhLE1BQU0sRUFBRSxLQUFLO1VBQUVDLEtBQUssRUFBRUEsTUFBSztVQUFFQyxPQUFPLEVBQUU7UUFBRSxDQUFDLENBQUM7TUFDeEQsQ0FBQztNQUNEQyxJQUFJLEVBQUUsU0FBQUEsS0FBVUYsS0FBSyxFQUFFO1FBQ25CZCxRQUFRLENBQUM7VUFBQ2EsTUFBTSxFQUFFLEtBQUs7VUFBRUMsS0FBSyxFQUFFQSxLQUFLO1VBQUVDLE9BQU8sRUFBRTtRQUFFLENBQUMsQ0FBQztNQUN4RDtJQUNKLENBQUMsQ0FBQztFQUVOLENBQUM7RUFFRCxPQUFPdEIsWUFBWTtBQUVyQixDQUFDIiwiaWdub3JlTGlzdCI6W119\n//# sourceURL=webpack-internal:///./src/utilities/gpml-to-sbgnml-converter-factory.js\n"); +eval("module.exports = function () {\n var jsonToSbgnml, elementUtilities, cy;\n function gpmlToSbgnml(param) {\n jsonToSbgnml = param.jsonToSbgnmlConverter;\n elementUtilities = param.elementUtilities;\n cy = param.sbgnCyInstance.getCy();\n }\n gpmlToSbgnml.convert = function (xml, callback) {\n var conversionApiUrl = \"https://minerva-service.lcsb.uni.lu/minerva/api/convert/GPML:SBGN-ML\";\n return $.ajax({\n type: 'post',\n url: conversionApiUrl,\n contentType: \"application/xml\",\n data: xml,\n dataType: \"text\",\n success: function success(data, textStatus, xhr) {\n if (xhr.status !== 200) {\n callback({\n result: false,\n error: data,\n message: \"Invalid response code: \" + xhr.status\n });\n } else {\n callback({\n result: true,\n message: data,\n error: \"\"\n });\n }\n },\n error: function error(_error) {\n callback({\n result: false,\n error: _error,\n message: \"\"\n });\n },\n fail: function fail(error) {\n callback({\n result: false,\n error: error,\n message: \"\"\n });\n }\n });\n };\n return gpmlToSbgnml;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbGl0aWVzL2dwbWwtdG8tc2Jnbm1sLWNvbnZlcnRlci1mYWN0b3J5LmpzIiwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsImpzb25Ub1NiZ25tbCIsImVsZW1lbnRVdGlsaXRpZXMiLCJjeSIsImdwbWxUb1NiZ25tbCIsInBhcmFtIiwianNvblRvU2Jnbm1sQ29udmVydGVyIiwic2JnbkN5SW5zdGFuY2UiLCJnZXRDeSIsImNvbnZlcnQiLCJ4bWwiLCJjYWxsYmFjayIsImNvbnZlcnNpb25BcGlVcmwiLCIkIiwiYWpheCIsInR5cGUiLCJ1cmwiLCJjb250ZW50VHlwZSIsImRhdGEiLCJkYXRhVHlwZSIsInN1Y2Nlc3MiLCJ0ZXh0U3RhdHVzIiwieGhyIiwic3RhdHVzIiwicmVzdWx0IiwiZXJyb3IiLCJtZXNzYWdlIiwiZmFpbCJdLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2JnbnZpei8uL3NyYy91dGlsaXRpZXMvZ3BtbC10by1zYmdubWwtY29udmVydGVyLWZhY3RvcnkuanM/YmEwNSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuXG4gIHZhciBqc29uVG9TYmdubWwsIGVsZW1lbnRVdGlsaXRpZXMsIGN5O1xuXG4gIGZ1bmN0aW9uIGdwbWxUb1NiZ25tbChwYXJhbSkge1xuICAgIGpzb25Ub1NiZ25tbCA9IHBhcmFtLmpzb25Ub1NiZ25tbENvbnZlcnRlcjtcbiAgICBlbGVtZW50VXRpbGl0aWVzID0gcGFyYW0uZWxlbWVudFV0aWxpdGllcztcbiAgICBjeSA9IHBhcmFtLnNiZ25DeUluc3RhbmNlLmdldEN5KCk7XG4gIH1cblxuXG4gIGdwbWxUb1NiZ25tbC5jb252ZXJ0ID0gZnVuY3Rpb24gKHhtbCwgY2FsbGJhY2spIHtcbiAgICAgIHZhciBjb252ZXJzaW9uQXBpVXJsID0gXCJodHRwczovL21pbmVydmEtc2VydmljZS5sY3NiLnVuaS5sdS9taW5lcnZhL2FwaS9jb252ZXJ0L0dQTUw6U0JHTi1NTFwiO1xuXG4gICAgICByZXR1cm4gJC5hamF4KHtcbiAgICAgICAgICB0eXBlOiAncG9zdCcsXG4gICAgICAgICAgdXJsOiBjb252ZXJzaW9uQXBpVXJsLFxuICAgICAgICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3htbFwiLFxuICAgICAgICAgIGRhdGE6IHhtbCxcbiAgICAgICAgICBkYXRhVHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEsIHRleHRTdGF0dXMsIHhocikge1xuICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgICBjYWxsYmFjayh7cmVzdWx0OiBmYWxzZSwgZXJyb3I6IGRhdGEsIG1lc3NhZ2U6IFwiSW52YWxpZCByZXNwb25zZSBjb2RlOiBcIiArIHhoci5zdGF0dXN9KTtcbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHtyZXN1bHQ6IHRydWUsIG1lc3NhZ2U6IGRhdGEsIGVycm9yOiBcIlwifSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICB9LFxuICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgY2FsbGJhY2soe3Jlc3VsdDogZmFsc2UsIGVycm9yOiBlcnJvciwgbWVzc2FnZTogXCJcIn0pO1xuICAgICAgICAgIH0sXG4gICAgICAgICAgZmFpbDogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgIGNhbGxiYWNrKHtyZXN1bHQ6IGZhbHNlLCBlcnJvcjogZXJyb3IsIG1lc3NhZ2U6IFwiXCJ9KTtcbiAgICAgICAgICB9LFxuICAgICAgfSlcbiAgICAgIFxuICB9XG5cbiAgcmV0dXJuIGdwbWxUb1NiZ25tbDtcblxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQUEsTUFBTSxDQUFDQyxPQUFPLEdBQUcsWUFBVztFQUUxQixJQUFJQyxZQUFZLEVBQUVDLGdCQUFnQixFQUFFQyxFQUFFO0VBRXRDLFNBQVNDLFlBQVlBLENBQUNDLEtBQUssRUFBRTtJQUMzQkosWUFBWSxHQUFHSSxLQUFLLENBQUNDLHFCQUFxQjtJQUMxQ0osZ0JBQWdCLEdBQUdHLEtBQUssQ0FBQ0gsZ0JBQWdCO0lBQ3pDQyxFQUFFLEdBQUdFLEtBQUssQ0FBQ0UsY0FBYyxDQUFDQyxLQUFLLENBQUMsQ0FBQztFQUNuQztFQUdBSixZQUFZLENBQUNLLE9BQU8sR0FBRyxVQUFVQyxHQUFHLEVBQUVDLFFBQVEsRUFBRTtJQUM1QyxJQUFJQyxnQkFBZ0IsR0FBRyxzRUFBc0U7SUFFN0YsT0FBT0MsQ0FBQyxDQUFDQyxJQUFJLENBQUM7TUFDVkMsSUFBSSxFQUFFLE1BQU07TUFDWkMsR0FBRyxFQUFFSixnQkFBZ0I7TUFDckJLLFdBQVcsRUFBRSxpQkFBaUI7TUFDOUJDLElBQUksRUFBRVIsR0FBRztNQUNUUyxRQUFRLEVBQUUsTUFBTTtNQUNoQkMsT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQVlGLElBQUksRUFBRUcsVUFBVSxFQUFFQyxHQUFHLEVBQUU7UUFDdEMsSUFBSUEsR0FBRyxDQUFDQyxNQUFNLEtBQUssR0FBRyxFQUFFO1VBQ3BCWixRQUFRLENBQUM7WUFBQ2EsTUFBTSxFQUFFLEtBQUs7WUFBRUMsS0FBSyxFQUFFUCxJQUFJO1lBQUVRLE9BQU8sRUFBRSx5QkFBeUIsR0FBR0osR0FBRyxDQUFDQztVQUFNLENBQUMsQ0FBQztRQUMzRixDQUFDLE1BQU07VUFDSFosUUFBUSxDQUFDO1lBQUNhLE1BQU0sRUFBRSxJQUFJO1lBQUVFLE9BQU8sRUFBRVIsSUFBSTtZQUFFTyxLQUFLLEVBQUU7VUFBRSxDQUFDLENBQUM7UUFDdEQ7TUFDSixDQUFDO01BQ0RBLEtBQUssRUFBRSxTQUFQQSxLQUFLQSxDQUFZQSxNQUFLLEVBQUU7UUFDcEJkLFFBQVEsQ0FBQztVQUFDYSxNQUFNLEVBQUUsS0FBSztVQUFFQyxLQUFLLEVBQUVBLE1BQUs7VUFBRUMsT0FBTyxFQUFFO1FBQUUsQ0FBQyxDQUFDO01BQ3hELENBQUM7TUFDREMsSUFBSSxFQUFFLFNBQU5BLElBQUlBLENBQVlGLEtBQUssRUFBRTtRQUNuQmQsUUFBUSxDQUFDO1VBQUNhLE1BQU0sRUFBRSxLQUFLO1VBQUVDLEtBQUssRUFBRUEsS0FBSztVQUFFQyxPQUFPLEVBQUU7UUFBRSxDQUFDLENBQUM7TUFDeEQ7SUFDSixDQUFDLENBQUM7RUFFTixDQUFDO0VBRUQsT0FBT3RCLFlBQVk7QUFFckIsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==\n//# sourceURL=webpack-internal:///./src/utilities/gpml-to-sbgnml-converter-factory.js\n"); /***/ }), @@ -125,7 +125,7 @@ eval("/*\n * Common utilities for sbgnviz graphs\n */\n\nvar classes = __webpack \********************************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { -eval("/* provided dependency */ var console = __webpack_require__(/*! ./node_modules/console-browserify/index.js */ \"./node_modules/console-browserify/index.js\");\nmodule.exports = function () {\n var jsonToSbgnml, elementUtilities, cy;\n function jsonToNwt(param) {\n jsonToSbgnml = param.jsonToSbgnmlConverter;\n elementUtilities = param.elementUtilities;\n cy = param.sbgnCyInstance.getCy();\n }\n function setToStr(set) {\n if (set) {\n return Object.keys(set).join(';');\n }\n return null;\n }\n var sifEdgePropHandlerMap = {\n 'pcIDs': function pcIDs(edge) {\n return setToStr(edge.data('pcIDSet'));\n },\n 'siteLocations': function siteLocations(edge) {\n return setToStr(edge.data('siteLocSet'));\n }\n };\n var sifNodePropHandlerMap = {\n 'tooltip': function tooltip(node) {\n return node.data('tooltip');\n },\n 'infoboxes': function infoboxes(node, obj) {\n var sifInfoboxPropHandlerMap = {\n 'tooltip': function tooltip(infobox) {\n return infobox.tooltip;\n }\n };\n var infoboxes = node.data('statesandinfos');\n var glyphs = obj.glyph;\n infoboxes.forEach(function (infobox, i) {\n Object.keys(sifInfoboxPropHandlerMap).forEach(function (propName) {\n var val = sifInfoboxPropHandlerMap[propName](infobox);\n if (val) {\n glyphs[i][propName] = val;\n }\n });\n });\n }\n };\n\n // objects consist of arcs or gylphs\n function extendObjectsData(objs, filterFcn, propHandlerMap) {\n if (!objs) {\n return;\n }\n objs.forEach(function (obj) {\n if (filterFcn(obj.$[\"class\"])) {\n var ele = cy.getElementById(obj.$.id);\n Object.keys(propHandlerMap).forEach(function (propName) {\n // does not have to return a value, maybe a void function as well\n var val = propHandlerMap[propName](ele, obj);\n if (val) {\n obj[propName] = val;\n }\n });\n }\n });\n }\n function extendStylesData(toExtend, extendFrom) {\n if (!toExtend || !extendFrom) {\n return;\n }\n var styleNames = ['shapeName'];\n var styleMap = {};\n Object.keys(extendFrom).forEach(function (key) {\n styleNames.forEach(function (name) {\n var el = extendFrom[key];\n var props = el && el.properties;\n if (props && props[name]) {\n var val = props[name];\n var idList = el.idList;\n idList.forEach(function (id) {\n styleMap[id] = styleMap[id] || {};\n styleMap[id][name] = val;\n });\n }\n });\n });\n toExtend.forEach(function (style) {\n var idList = style.$.idList.split(' ');\n styleNames.forEach(function (name) {\n var val = null;\n idList.forEach(function (id) {\n var currVal = styleMap[id] && styleMap[id][name];\n if (currVal === undefined) {\n return;\n }\n if (val == null) {\n val = currVal;\n } else if (val !== currVal) {\n console.warn('Shape name of some glyphs defined multiple times in render information!');\n }\n });\n if (val !== null) {\n style.g.$[name] = val;\n }\n });\n });\n }\n jsonToNwt.buildJsObj = function (filename, version, renderInfo, mapProperties, nodes, edges) {\n var jsObj = jsonToSbgnml.buildJsObj(filename, version, renderInfo, mapProperties, nodes, edges);\n if (elementUtilities.mapType !== 'PD' && elementUtilities.mapType !== 'AF' && elementUtilities.mapType !== 'HybridSbgn' && elementUtilities.mapType !== 'SBML') {\n var map = jsObj.map[0];\n var arcs = map.arc;\n var glyphs = map.glyph;\n extendObjectsData(arcs, elementUtilities.isSIFEdge, sifEdgePropHandlerMap);\n extendObjectsData(glyphs, elementUtilities.isSIFNode, sifNodePropHandlerMap);\n var jsObjStyles = (map && map.extension && map.extension.renderInformation && map.extension.renderInformation.listOfStyles).style;\n var appStyles = renderInfo && renderInfo.styles;\n extendStylesData(jsObjStyles, appStyles);\n }\n return jsObj;\n };\n jsonToNwt.createNwt = function (filename, version, renderInfo, mapProperties, nodes, edges) {\n var jsObj = jsonToNwt.buildJsObj(filename, version, renderInfo, mapProperties, nodes, edges);\n return jsonToSbgnml.buildString({\n sbgn: jsObj\n });\n };\n return jsonToNwt;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbGl0aWVzL2pzb24tdG8tbnd0LWNvbnZlcnRlci1mYWN0b3J5LmpzIiwibWFwcGluZ3MiOiI7QUFBQUEsTUFBTSxDQUFDQyxPQUFPLEdBQUcsWUFBVztFQUUxQixJQUFJQyxZQUFZLEVBQUVDLGdCQUFnQixFQUFFQyxFQUFFO0VBRXRDLFNBQVNDLFNBQVNBLENBQUNDLEtBQUssRUFBRTtJQUN4QkosWUFBWSxHQUFHSSxLQUFLLENBQUNDLHFCQUFxQjtJQUMxQ0osZ0JBQWdCLEdBQUdHLEtBQUssQ0FBQ0gsZ0JBQWdCO0lBQ3pDQyxFQUFFLEdBQUdFLEtBQUssQ0FBQ0UsY0FBYyxDQUFDQyxLQUFLLENBQUMsQ0FBQztFQUNuQztFQUVBLFNBQVNDLFFBQVFBLENBQUNDLEdBQUcsRUFBRTtJQUNyQixJQUFJQSxHQUFHLEVBQUU7TUFDUCxPQUFPQyxNQUFNLENBQUNDLElBQUksQ0FBQ0YsR0FBRyxDQUFDLENBQUNHLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbkM7SUFFQSxPQUFPLElBQUk7RUFDYjtFQUVBLElBQUlDLHFCQUFxQixHQUFHO0lBQzFCLE9BQU8sRUFBRSxTQUFBQyxNQUFTQyxJQUFJLEVBQUU7TUFDdEIsT0FBT1AsUUFBUSxDQUFFTyxJQUFJLENBQUNDLElBQUksQ0FBQyxTQUFTLENBQUUsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsZUFBZSxFQUFFLFNBQUFDLGNBQVNGLElBQUksRUFBRTtNQUM5QixPQUFPUCxRQUFRLENBQUVPLElBQUksQ0FBQ0MsSUFBSSxDQUFDLFlBQVksQ0FBRSxDQUFDO0lBQzVDO0VBQ0YsQ0FBQztFQUVELElBQUlFLHFCQUFxQixHQUFHO0lBQzFCLFNBQVMsRUFBRSxTQUFBQyxRQUFTQyxJQUFJLEVBQUU7TUFDeEIsT0FBT0EsSUFBSSxDQUFDSixJQUFJLENBQUMsU0FBUyxDQUFDO0lBQzdCLENBQUM7SUFDRCxXQUFXLEVBQUUsU0FBQUssVUFBU0QsSUFBSSxFQUFFRSxHQUFHLEVBQUU7TUFDL0IsSUFBSUMsd0JBQXdC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TUFBQ0MsSUFBSSxFQUFFZjtJQUFLLENBQUMsQ0FBQztFQUNoRCxDQUFDO0VBRUQsT0FBTzdELFNBQVM7QUFDbEIsQ0FBQyIsInNvdXJjZXMiOlsid2VicGFjazovL3NiZ252aXovLi9zcmMvdXRpbGl0aWVzL2pzb24tdG8tbnd0LWNvbnZlcnRlci1mYWN0b3J5LmpzPzA5MGUiXSwic291cmNlc0NvbnRlbnQiOlsibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbigpIHtcblxuICB2YXIganNvblRvU2Jnbm1sLCBlbGVtZW50VXRpbGl0aWVzLCBjeTtcblxuICBmdW5jdGlvbiBqc29uVG9Od3QocGFyYW0pIHtcbiAgICBqc29uVG9TYmdubWwgPSBwYXJhbS5qc29uVG9TYmdubWxDb252ZXJ0ZXI7XG4gICAgZWxlbWVudFV0aWxpdGllcyA9IHBhcmFtLmVsZW1lbnRVdGlsaXRpZXM7XG4gICAgY3kgPSBwYXJhbS5zYmduQ3lJbnN0YW5jZS5nZXRDeSgpO1xuICB9XG5cbiAgZnVuY3Rpb24gc2V0VG9TdHIoc2V0KSB7XG4gICAgaWYgKHNldCkge1xuICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHNldCkuam9pbignOycpO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIHNpZkVkZ2VQcm9wSGFuZGxlck1hcCA9IHtcbiAgICAncGNJRHMnOiBmdW5jdGlvbihlZGdlKSB7XG4gICAgICByZXR1cm4gc2V0VG9TdHIoIGVkZ2UuZGF0YSgncGNJRFNldCcpICk7XG4gICAgfSxcbiAgICAnc2l0ZUxvY2F0aW9ucyc6IGZ1bmN0aW9uKGVkZ2UpIHtcbiAgICAgIHJldHVybiBzZXRUb1N0ciggZWRnZS5kYXRhKCdzaXRlTG9jU2V0JykgKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHNpZk5vZGVQcm9wSGFuZGxlck1hcCA9IHtcbiAgICAndG9vbHRpcCc6IGZ1bmN0aW9uKG5vZGUpIHtcbiAgICAgIHJldHVybiBub2RlLmRhdGEoJ3Rvb2x0aXAnKTtcbiAgICB9LFxuICAgICdpbmZvYm94ZXMnOiBmdW5jdGlvbihub2RlLCBvYmopIHtcbiAgICAgIHZhciBzaWZJbmZvYm94UHJvcEhhbmRsZXJNYXAgPSB7XG4gICAgICAgICd0b29sdGlwJzogZnVuY3Rpb24oaW5mb2JveCkge1xuICAgICAgICAgIHJldHVybiBpbmZvYm94LnRvb2x0aXA7XG4gICAgICAgIH1cbiAgICAgIH07XG5cbiAgICAgIHZhciBpbmZvYm94ZXMgPSBub2RlLmRhdGEoJ3N0YXRlc2FuZGluZm9zJyk7XG4gICAgICB2YXIgZ2x5cGhzID0gb2JqLmdseXBoO1xuICAgICAgaW5mb2JveGVzLmZvckVhY2goIGZ1bmN0aW9uKGluZm9ib3gsIGkpIHtcbiAgICAgICAgT2JqZWN0LmtleXMoc2lmSW5mb2JveFByb3BIYW5kbGVyTWFwKS5mb3JFYWNoKCBmdW5jdGlvbihwcm9wTmFtZSkge1xuICAgICAgICAgIHZhciB2YWwgPSBzaWZJbmZvYm94UHJvcEhhbmRsZXJNYXBbcHJvcE5hbWVdKGluZm9ib3gpO1xuICAgICAgICAgIGlmICh2YWwpIHtcbiAgICAgICAgICAgIGdseXBoc1tpXVtwcm9wTmFtZV0gPSB2YWw7XG4gICAgICAgICAgfVxuICAgICAgICB9ICk7XG4gICAgICB9ICk7XG4gICAgfVxuICB9O1xuXG4gIC8vIG9iamVjdHMgY29uc2lzdCBvZiBhcmNzIG9yIGd5bHBoc1xuICBmdW5jdGlvbiBleHRlbmRPYmplY3RzRGF0YShvYmpzLCBmaWx0ZXJGY24sIHByb3BIYW5kbGVyTWFwKSB7XG4gICAgaWYgKCAhb2JqcyApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBvYmpzLmZvckVhY2goIGZ1bmN0aW9uKCBvYmogKSB7XG4gICAgICBpZiAoIGZpbHRlckZjbiggb2JqLiQuY2xhc3MgKSApIHtcbiAgICAgICAgdmFyIGVsZSA9IGN5LmdldEVsZW1lbnRCeUlkKCBvYmouJC5pZCApO1xuICAgICAgICBPYmplY3Qua2V5cyggcHJvcEhhbmRsZXJNYXAgKS5mb3JFYWNoKCBmdW5jdGlvbiggcHJvcE5hbWUgKSB7XG4gICAgICAgICAgLy8gZG9lcyBub3QgaGF2ZSB0byByZXR1cm4gYSB2YWx1ZSwgbWF5YmUgYSB2b2lkIGZ1bmN0aW9uIGFzIHdlbGxcbiAgICAgICAgICB2YXIgdmFsID0gcHJvcEhhbmRsZXJNYXBbIHByb3BOYW1lIF0oIGVsZSwgb2JqICk7XG4gICAgICAgICAgaWYgKCB2YWwgKSB7XG4gICAgICAgICAgICBvYmpbIHByb3BOYW1lIF0gPSB2YWw7XG4gICAgICAgICAgfVxuICAgICAgICB9ICk7XG4gICAgICB9XG4gICAgfSApO1xuICB9XG5cbiAgZnVuY3Rpb24gZXh0ZW5kU3R5bGVzRGF0YSh0b0V4dGVuZCwgZXh0ZW5kRnJvbSkge1xuICAgIGlmICggIXRvRXh0ZW5kIHx8ICFleHRlbmRGcm9tICkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciBzdHlsZU5hbWVzID0gWyAnc2hhcGVOYW1lJyBdO1xuICAgIHZhciBzdHlsZU1hcCA9IHt9O1xuXG4gICAgT2JqZWN0LmtleXMoIGV4dGVuZEZyb20gKS5mb3JFYWNoKCBmdW5jdGlvbigga2V5ICkge1xuICAgICAgc3R5bGVOYW1lcy5mb3JFYWNoKCBmdW5jdGlvbiggbmFtZSApIHtcbiAgICAgICAgdmFyIGVsID0gZXh0ZW5kRnJvbVsga2V5IF07XG4gICAgICAgIHZhciBwcm9wcyA9IGVsICYmIGVsLnByb3BlcnRpZXM7XG5cbiAgICAgICAgaWYgKCBwcm9wcyAmJiBwcm9wc1sgbmFtZSBdICkge1xuICAgICAgICAgIHZhciB2YWwgPSBwcm9wc1sgbmFtZSBdO1xuICAgICAgICAgIHZhciBpZExpc3QgPSBlbC5pZExpc3Q7XG5cbiAgICAgICAgICBpZExpc3QuZm9yRWFjaCggZnVuY3Rpb24oIGlkICkge1xuICAgICAgICAgICAgc3R5bGVNYXBbIGlkIF0gPSBzdHlsZU1hcFsgaWQgXSB8fCB7fTtcbiAgICAgICAgICAgIHN0eWxlTWFwWyBpZCBdWyBuYW1lIF0gPSB2YWw7XG4gICAgICAgICAgfSApO1xuICAgICAgICB9XG4gICAgICB9ICk7XG4gICAgfSApO1xuXG4gICAgdG9FeHRlbmQuZm9yRWFjaCggZnVuY3Rpb24oIHN0eWxlICkge1xuICAgICAgdmFyIGlkTGlzdCA9IHN0eWxlLiQuaWRMaXN0LnNwbGl0KCcgJyk7XG5cbiAgICAgIHN0eWxlTmFtZXMuZm9yRWFjaCggZnVuY3Rpb24oIG5hbWUgKSB7XG4gICAgICAgIHZhciB2YWwgPSBudWxsO1xuXG4gICAgICAgIGlkTGlzdC5mb3JFYWNoKCBmdW5jdGlvbiggaWQgKSB7XG4gICAgICAgICAgdmFyIGN1cnJWYWwgPSBzdHlsZU1hcFsgaWQgXSAmJiBzdHlsZU1hcFsgaWQgXVsgbmFtZSBdO1xuICAgICAgICAgIGlmICggY3VyclZhbCA9PT0gdW5kZWZpbmVkICkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmICggdmFsID09IG51bGwgKSB7XG4gICAgICAgICAgICB2YWwgPSBjdXJyVmFsO1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmICggdmFsICE9PSBjdXJyVmFsICkge1xuICAgICAgICAgICAgY29uc29sZS53YXJuKCAnU2hhcGUgbmFtZSBvZiBzb21lIGdseXBocyBkZWZpbmVkIG11bHRpcGxlIHRpbWVzIGluIHJlbmRlciBpbmZvcm1hdGlvbiEnICk7XG4gICAgICAgICAgfVxuICAgICAgICB9ICk7XG5cbiAgICAgICAgaWYgKCB2YWwgIT09IG51bGwgKSB7XG4gICAgICAgICAgc3R5bGUuZy4kWyBuYW1lIF0gPSB2YWw7XG4gICAgICAgIH1cbiAgICAgIH0gKTtcbiAgICB9ICk7XG4gIH1cblxuICBqc29uVG9Od3QuYnVpbGRKc09iaiA9IGZ1bmN0aW9uKGZpbGVuYW1lLCB2ZXJzaW9uLCByZW5kZXJJbmZvLCBtYXBQcm9wZXJ0aWVzLCBub2RlcywgZWRnZXMpIHtcbiAgICB2YXIganNPYmogPSBqc29uVG9TYmdubWwuYnVpbGRKc09iaihmaWxlbmFtZSwgdmVyc2lvbiwgcmVuZGVySW5mbywgbWFwUHJvcGVydGllcywgbm9kZXMsIGVkZ2VzKTtcblxuICAgIGlmICggZWxlbWVudFV0aWxpdGllcy5tYXBUeXBlICE9PSAnUEQnICYmIGVsZW1lbnRVdGlsaXRpZXMubWFwVHlwZSAhPT0gJ0FGJyAgJiYgZWxlbWVudFV0aWxpdGllcy5tYXBUeXBlICE9PSAnSHlicmlkU2JnbicgJiYgZWxlbWVudFV0aWxpdGllcy5tYXBUeXBlICE9PSAnU0JNTCcpIHtcbiAgICAgIHZhciBtYXAgPSBqc09iai5tYXBbMF07XG5cbiAgICAgIHZhciBhcmNzID0gbWFwLmFyYztcbiAgICAgIHZhciBnbHlwaHMgPSBtYXAuZ2x5cGg7XG4gICAgICBleHRlbmRPYmplY3RzRGF0YShhcmNzLCBlbGVtZW50VXRpbGl0aWVzLmlzU0lGRWRnZSwgc2lmRWRnZVByb3BIYW5kbGVyTWFwKTtcbiAgICAgIGV4dGVuZE9iamVjdHNEYXRhKGdseXBocywgZWxlbWVudFV0aWxpdGllcy5pc1NJRk5vZGUsIHNpZk5vZGVQcm9wSGFuZGxlck1hcCk7XG5cbiAgICAgIHZhciBqc09ialN0eWxlcyA9ICggbWFwICYmIG1hcC5leHRlbnNpb24gJiYgbWFwLmV4dGVuc2lvbi5yZW5kZXJJbmZvcm1hdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1hcC5leHRlbnNpb24ucmVuZGVySW5mb3JtYXRpb24ubGlzdE9mU3R5bGVzICkuc3R5bGU7XG4gICAgICB2YXIgYXBwU3R5bGVzID0gcmVuZGVySW5mbyAmJiByZW5kZXJJbmZvLnN0eWxlcztcblxuICAgICAgZXh0ZW5kU3R5bGVzRGF0YShqc09ialN0eWxlcywgYXBwU3R5bGVzKTtcbiAgICB9XG5cbiAgICByZXR1cm4ganNPYmo7XG4gIH07XG5cbiAganNvblRvTnd0LmNyZWF0ZU53dCA9IGZ1bmN0aW9uKGZpbGVuYW1lLCB2ZXJzaW9uLCByZW5kZXJJbmZvLCBtYXBQcm9wZXJ0aWVzLCBub2RlcywgZWRnZXMpIHtcbiAgICB2YXIganNPYmogPSBqc29uVG9Od3QuYnVpbGRKc09iaihmaWxlbmFtZSwgdmVyc2lvbiwgcmVuZGVySW5mbywgbWFwUHJvcGVydGllcywgbm9kZXMsIGVkZ2VzKTtcbiAgICByZXR1cm4ganNvblRvU2Jnbm1sLmJ1aWxkU3RyaW5nKHtzYmduOiBqc09ian0pO1xuICB9O1xuXG4gIHJldHVybiBqc29uVG9Od3Q7XG59XG4iXSwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsImpzb25Ub1NiZ25tbCIsImVsZW1lbnRVdGlsaXRpZXMiLCJjeSIsImpzb25Ub053dCIsInBhcmFtIiwianNvblRvU2Jnbm1sQ29udmVydGVyIiwic2JnbkN5SW5zdGFuY2UiLCJnZXRDeSIsInNldFRvU3RyIiwic2V0IiwiT2JqZWN0Iiwia2V5cyIsImpvaW4iLCJzaWZFZGdlUHJvcEhhbmRsZXJNYXAiLCJwY0lEcyIsImVkZ2UiLCJkYXRhIiwic2l0ZUxvY2F0aW9ucyIsInNpZk5vZGVQcm9wSGFuZGxlck1hcCIsInRvb2x0aXAiLCJub2RlIiwiaW5mb2JveGVzIiwib2JqIiwic2lmSW5mb2JveFByb3BIYW5kbGVyTWFwIiwiaW5mb2JveCIsImdseXBocyIsImdseXBoIiwiZm9yRWFjaCIsImkiLCJwcm9wTmFtZSIsInZhbCIsImV4dGVuZE9iamVjdHNEYXRhIiwib2JqcyIsImZpbHRlckZjbiIsInByb3BIYW5kbGVyTWFwIiwiJCIsImVsZSIsImdldEVsZW1lbnRCeUlkIiwiaWQiLCJleHRlbmRTdHlsZXNEYXRhIiwidG9FeHRlbmQiLCJleHRlbmRGcm9tIiwic3R5bGVOYW1lcyIsInN0eWxlTWFwIiwia2V5IiwibmFtZSIsImVsIiwicHJvcHMiLCJwcm9wZXJ0aWVzIiwiaWRMaXN0Iiwic3R5bGUiLCJzcGxpdCIsImN1cnJWYWwiLCJ1bmRlZmluZWQiLCJjb25zb2xlIiwid2FybiIsImciLCJidWlsZEpzT2JqIiwiZmlsZW5hbWUiLCJ2ZXJzaW9uIiwicmVuZGVySW5mbyIsIm1hcFByb3BlcnRpZXMiLCJub2RlcyIsImVkZ2VzIiwianNPYmoiLCJtYXBUeXBlIiwibWFwIiwiYXJjcyIsImFyYyIsImlzU0lGRWRnZSIsImlzU0lGTm9kZSIsImpzT2JqU3R5bGVzIiwiZXh0ZW5zaW9uIiwicmVuZGVySW5mb3JtYXRpb24iLCJsaXN0T2ZTdHlsZXMiLCJhcHBTdHlsZXMiLCJzdHlsZXMiLCJjcmVhdGVOd3QiLCJidWlsZFN0cmluZyIsInNiZ24iXSwic291cmNlUm9vdCI6IiJ9\n//# sourceURL=webpack-internal:///./src/utilities/json-to-nwt-converter-factory.js\n"); +eval("/* provided dependency */ var console = __webpack_require__(/*! ./node_modules/console-browserify/index.js */ \"./node_modules/console-browserify/index.js\");\nmodule.exports = function () {\n var jsonToSbgnml, elementUtilities, cy;\n function jsonToNwt(param) {\n jsonToSbgnml = param.jsonToSbgnmlConverter;\n elementUtilities = param.elementUtilities;\n cy = param.sbgnCyInstance.getCy();\n }\n function setToStr(set) {\n if (set) {\n return Object.keys(set).join(';');\n }\n return null;\n }\n var sifEdgePropHandlerMap = {\n 'pcIDs': function pcIDs(edge) {\n return setToStr(edge.data('pcIDSet'));\n },\n 'siteLocations': function siteLocations(edge) {\n return setToStr(edge.data('siteLocSet'));\n }\n };\n var sifNodePropHandlerMap = {\n 'tooltip': function tooltip(node) {\n return node.data('tooltip');\n },\n 'infoboxes': function infoboxes(node, obj) {\n var sifInfoboxPropHandlerMap = {\n 'tooltip': function tooltip(infobox) {\n return infobox.tooltip;\n }\n };\n var infoboxes = node.data('statesandinfos');\n var glyphs = obj.glyph;\n infoboxes.forEach(function (infobox, i) {\n Object.keys(sifInfoboxPropHandlerMap).forEach(function (propName) {\n var val = sifInfoboxPropHandlerMap[propName](infobox);\n if (val) {\n glyphs[i][propName] = val;\n }\n });\n });\n }\n };\n\n // objects consist of arcs or gylphs\n function extendObjectsData(objs, filterFcn, propHandlerMap) {\n if (!objs) {\n return;\n }\n objs.forEach(function (obj) {\n if (filterFcn(obj.$[\"class\"])) {\n var ele = cy.getElementById(obj.$.id);\n Object.keys(propHandlerMap).forEach(function (propName) {\n // does not have to return a value, maybe a void function as well\n var val = propHandlerMap[propName](ele, obj);\n if (val) {\n obj[propName] = val;\n }\n });\n }\n });\n }\n function extendStylesData(toExtend, extendFrom) {\n if (!toExtend || !extendFrom) {\n return;\n }\n var styleNames = ['shapeName'];\n var styleMap = {};\n Object.keys(extendFrom).forEach(function (key) {\n styleNames.forEach(function (name) {\n var el = extendFrom[key];\n var props = el && el.properties;\n if (props && props[name]) {\n var val = props[name];\n var idList = el.idList;\n idList.forEach(function (id) {\n styleMap[id] = styleMap[id] || {};\n styleMap[id][name] = val;\n });\n }\n });\n });\n toExtend.forEach(function (style) {\n var idList = style.$.idList.split(' ');\n styleNames.forEach(function (name) {\n var val = null;\n idList.forEach(function (id) {\n var currVal = styleMap[id] && styleMap[id][name];\n if (currVal === undefined) {\n return;\n }\n if (val == null) {\n val = currVal;\n } else if (val !== currVal) {\n console.warn('Shape name of some glyphs defined multiple times in render information!');\n }\n });\n if (val !== null) {\n style.g.$[name] = val;\n }\n });\n });\n }\n jsonToNwt.buildJsObj = function (filename, version, renderInfo, mapProperties, nodes, edges) {\n var jsObj = jsonToSbgnml.buildJsObj(filename, version, renderInfo, mapProperties, nodes, edges);\n if (elementUtilities.mapType !== 'PD' && elementUtilities.mapType !== 'AF' && elementUtilities.mapType !== 'HybridSbgn' && elementUtilities.mapType !== 'SBML') {\n var map = jsObj.map[0];\n var arcs = map.arc;\n var glyphs = map.glyph;\n extendObjectsData(arcs, elementUtilities.isSIFEdge, sifEdgePropHandlerMap);\n extendObjectsData(glyphs, elementUtilities.isSIFNode, sifNodePropHandlerMap);\n var jsObjStyles = (map && map.extension && map.extension.renderInformation && map.extension.renderInformation.listOfStyles).style;\n var appStyles = renderInfo && renderInfo.styles;\n extendStylesData(jsObjStyles, appStyles);\n }\n return jsObj;\n };\n jsonToNwt.createNwt = function (filename, version, renderInfo, mapProperties, nodes, edges) {\n var jsObj = jsonToNwt.buildJsObj(filename, version, renderInfo, mapProperties, nodes, edges);\n return jsonToSbgnml.buildString({\n sbgn: jsObj\n });\n };\n return jsonToNwt;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbGl0aWVzL2pzb24tdG8tbnd0LWNvbnZlcnRlci1mYWN0b3J5LmpzIiwibWFwcGluZ3MiOiI7QUFBQUEsTUFBTSxDQUFDQyxPQUFPLEdBQUcsWUFBVztFQUUxQixJQUFJQyxZQUFZLEVBQUVDLGdCQUFnQixFQUFFQyxFQUFFO0VBRXRDLFNBQVNDLFNBQVNBLENBQUNDLEtBQUssRUFBRTtJQUN4QkosWUFBWSxHQUFHSSxLQUFLLENBQUNDLHFCQUFxQjtJQUMxQ0osZ0JBQWdCLEdBQUdHLEtBQUssQ0FBQ0gsZ0JBQWdCO0lBQ3pDQyxFQUFFLEdBQUdFLEtBQUssQ0FBQ0UsY0FBYyxDQUFDQyxLQUFLLENBQUMsQ0FBQztFQUNuQztFQUVBLFNBQVNDLFFBQVFBLENBQUNDLEdBQUcsRUFBRTtJQUNyQixJQUFJQSxHQUFHLEVBQUU7TUFDUCxPQUFPQyxNQUFNLENBQUNDLElBQUksQ0FBQ0YsR0FBRyxDQUFDLENBQUNHLElBQUksQ0FBQyxHQUFHLENBQUM7SUFDbkM7SUFFQSxPQUFPLElBQUk7RUFDYjtFQUVBLElBQUlDLHFCQUFxQixHQUFHO0lBQzFCLE9BQU8sRUFBRSxTQUFUQyxLQUFPQSxDQUFXQyxJQUFJLEVBQUU7TUFDdEIsT0FBT1AsUUFBUSxDQUFFTyxJQUFJLENBQUNDLElBQUksQ0FBQyxTQUFTLENBQUUsQ0FBQztJQUN6QyxDQUFDO0lBQ0QsZUFBZSxFQUFFLFNBQWpCQyxhQUFlQSxDQUFXRixJQUFJLEVBQUU7TUFDOUIsT0FBT1AsUUFBUSxDQUFFTyxJQUFJLENBQUNDLElBQUksQ0FBQyxZQUFZLENBQUUsQ0FBQztJQUM1QztFQUNGLENBQUM7RUFFRCxJQUFJRSxxQkFBcUIsR0FBRztJQUMxQixTQUFTLEVBQUUsU0FBWEMsT0FBU0EsQ0FBV0MsSUFBSSxFQUFFO01BQ3hCLE9BQU9BLElBQUksQ0FBQ0osSUFBSSxDQUFDLFNBQVMsQ0FBQztJQUM3QixDQUFDO0lBQ0QsV0FBVyxFQUFFLFNBQWJLLFNBQVdBLENBQVdELElBQUksRUFBRUUsR0FB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RixPQUFPL0QsWUFBWSxDQUFDOEUsV0FBVyxDQUFDO01BQUNDLElBQUksRUFBRWY7SUFBSyxDQUFDLENBQUM7RUFDaEQsQ0FBQztFQUVELE9BQU83RCxTQUFTO0FBQ2xCLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zYmdudml6Ly4vc3JjL3V0aWxpdGllcy9qc29uLXRvLW53dC1jb252ZXJ0ZXItZmFjdG9yeS5qcz8wOTBlIl0sInNvdXJjZXNDb250ZW50IjpbIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKSB7XG5cbiAgdmFyIGpzb25Ub1NiZ25tbCwgZWxlbWVudFV0aWxpdGllcywgY3k7XG5cbiAgZnVuY3Rpb24ganNvblRvTnd0KHBhcmFtKSB7XG4gICAganNvblRvU2Jnbm1sID0gcGFyYW0uanNvblRvU2Jnbm1sQ29udmVydGVyO1xuICAgIGVsZW1lbnRVdGlsaXRpZXMgPSBwYXJhbS5lbGVtZW50VXRpbGl0aWVzO1xuICAgIGN5ID0gcGFyYW0uc2JnbkN5SW5zdGFuY2UuZ2V0Q3koKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHNldFRvU3RyKHNldCkge1xuICAgIGlmIChzZXQpIHtcbiAgICAgIHJldHVybiBPYmplY3Qua2V5cyhzZXQpLmpvaW4oJzsnKTtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIHZhciBzaWZFZGdlUHJvcEhhbmRsZXJNYXAgPSB7XG4gICAgJ3BjSURzJzogZnVuY3Rpb24oZWRnZSkge1xuICAgICAgcmV0dXJuIHNldFRvU3RyKCBlZGdlLmRhdGEoJ3BjSURTZXQnKSApO1xuICAgIH0sXG4gICAgJ3NpdGVMb2NhdGlvbnMnOiBmdW5jdGlvbihlZGdlKSB7XG4gICAgICByZXR1cm4gc2V0VG9TdHIoIGVkZ2UuZGF0YSgnc2l0ZUxvY1NldCcpICk7XG4gICAgfVxuICB9O1xuXG4gIHZhciBzaWZOb2RlUHJvcEhhbmRsZXJNYXAgPSB7XG4gICAgJ3Rvb2x0aXAnOiBmdW5jdGlvbihub2RlKSB7XG4gICAgICByZXR1cm4gbm9kZS5kYXRhKCd0b29sdGlwJyk7XG4gICAgfSxcbiAgICAnaW5mb2JveGVzJzogZnVuY3Rpb24obm9kZSwgb2JqKSB7XG4gICAgICB2YXIgc2lmSW5mb2JveFByb3BIYW5kbGVyTWFwID0ge1xuICAgICAgICAndG9vbHRpcCc6IGZ1bmN0aW9uKGluZm9ib3gpIHtcbiAgICAgICAgICByZXR1cm4gaW5mb2JveC50b29sdGlwO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB2YXIgaW5mb2JveGVzID0gbm9kZS5kYXRhKCdzdGF0ZXNhbmRpbmZvcycpO1xuICAgICAgdmFyIGdseXBocyA9IG9iai5nbHlwaDtcbiAgICAgIGluZm9ib3hlcy5mb3JFYWNoKCBmdW5jdGlvbihpbmZvYm94LCBpKSB7XG4gICAgICAgIE9iamVjdC5rZXlzKHNpZkluZm9ib3hQcm9wSGFuZGxlck1hcCkuZm9yRWFjaCggZnVuY3Rpb24ocHJvcE5hbWUpIHtcbiAgICAgICAgICB2YXIgdmFsID0gc2lmSW5mb2JveFByb3BIYW5kbGVyTWFwW3Byb3BOYW1lXShpbmZvYm94KTtcbiAgICAgICAgICBpZiAodmFsKSB7XG4gICAgICAgICAgICBnbHlwaHNbaV1bcHJvcE5hbWVdID0gdmFsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSApO1xuICAgICAgfSApO1xuICAgIH1cbiAgfTtcblxuICAvLyBvYmplY3RzIGNvbnNpc3Qgb2YgYXJjcyBvciBneWxwaHNcbiAgZnVuY3Rpb24gZXh0ZW5kT2JqZWN0c0RhdGEob2JqcywgZmlsdGVyRmNuLCBwcm9wSGFuZGxlck1hcCkge1xuICAgIGlmICggIW9ianMgKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb2Jqcy5mb3JFYWNoKCBmdW5jdGlvbiggb2JqICkge1xuICAgICAgaWYgKCBmaWx0ZXJGY24oIG9iai4kLmNsYXNzICkgKSB7XG4gICAgICAgIHZhciBlbGUgPSBjeS5nZXRFbGVtZW50QnlJZCggb2JqLiQuaWQgKTtcbiAgICAgICAgT2JqZWN0LmtleXMoIHByb3BIYW5kbGVyTWFwICkuZm9yRWFjaCggZnVuY3Rpb24oIHByb3BOYW1lICkge1xuICAgICAgICAgIC8vIGRvZXMgbm90IGhhdmUgdG8gcmV0dXJuIGEgdmFsdWUsIG1heWJlIGEgdm9pZCBmdW5jdGlvbiBhcyB3ZWxsXG4gICAgICAgICAgdmFyIHZhbCA9IHByb3BIYW5kbGVyTWFwWyBwcm9wTmFtZSBdKCBlbGUsIG9iaiApO1xuICAgICAgICAgIGlmICggdmFsICkge1xuICAgICAgICAgICAgb2JqWyBwcm9wTmFtZSBdID0gdmFsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSApO1xuICAgICAgfVxuICAgIH0gKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGV4dGVuZFN0eWxlc0RhdGEodG9FeHRlbmQsIGV4dGVuZEZyb20pIHtcbiAgICBpZiAoICF0b0V4dGVuZCB8fCAhZXh0ZW5kRnJvbSApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgc3R5bGVOYW1lcyA9IFsgJ3NoYXBlTmFtZScgXTtcbiAgICB2YXIgc3R5bGVNYXAgPSB7fTtcblxuICAgIE9iamVjdC5rZXlzKCBleHRlbmRGcm9tICkuZm9yRWFjaCggZnVuY3Rpb24oIGtleSApIHtcbiAgICAgIHN0eWxlTmFtZXMuZm9yRWFjaCggZnVuY3Rpb24oIG5hbWUgKSB7XG4gICAgICAgIHZhciBlbCA9IGV4dGVuZEZyb21bIGtleSBdO1xuICAgICAgICB2YXIgcHJvcHMgPSBlbCAmJiBlbC5wcm9wZXJ0aWVzO1xuXG4gICAgICAgIGlmICggcHJvcHMgJiYgcHJvcHNbIG5hbWUgXSApIHtcbiAgICAgICAgICB2YXIgdmFsID0gcHJvcHNbIG5hbWUgXTtcbiAgICAgICAgICB2YXIgaWRMaXN0ID0gZWwuaWRMaXN0O1xuXG4gICAgICAgICAgaWRMaXN0LmZvckVhY2goIGZ1bmN0aW9uKCBpZCApIHtcbiAgICAgICAgICAgIHN0eWxlTWFwWyBpZCBdID0gc3R5bGVNYXBbIGlkIF0gfHwge307XG4gICAgICAgICAgICBzdHlsZU1hcFsgaWQgXVsgbmFtZSBdID0gdmFsO1xuICAgICAgICAgIH0gKTtcbiAgICAgICAgfVxuICAgICAgfSApO1xuICAgIH0gKTtcblxuICAgIHRvRXh0ZW5kLmZvckVhY2goIGZ1bmN0aW9uKCBzdHlsZSApIHtcbiAgICAgIHZhciBpZExpc3QgPSBzdHlsZS4kLmlkTGlzdC5zcGxpdCgnICcpO1xuXG4gICAgICBzdHlsZU5hbWVzLmZvckVhY2goIGZ1bmN0aW9uKCBuYW1lICkge1xuICAgICAgICB2YXIgdmFsID0gbnVsbDtcblxuICAgICAgICBpZExpc3QuZm9yRWFjaCggZnVuY3Rpb24oIGlkICkge1xuICAgICAgICAgIHZhciBjdXJyVmFsID0gc3R5bGVNYXBbIGlkIF0gJiYgc3R5bGVNYXBbIGlkIF1bIG5hbWUgXTtcbiAgICAgICAgICBpZiAoIGN1cnJWYWwgPT09IHVuZGVmaW5lZCApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoIHZhbCA9PSBudWxsICkge1xuICAgICAgICAgICAgdmFsID0gY3VyclZhbDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoIHZhbCAhPT0gY3VyclZhbCApIHtcbiAgICAgICAgICAgIGNvbnNvbGUud2FybiggJ1NoYXBlIG5hbWUgb2Ygc29tZSBnbHlwaHMgZGVmaW5lZCBtdWx0aXBsZSB0aW1lcyBpbiByZW5kZXIgaW5mb3JtYXRpb24hJyApO1xuICAgICAgICAgIH1cbiAgICAgICAgfSApO1xuXG4gICAgICAgIGlmICggdmFsICE9PSBudWxsICkge1xuICAgICAgICAgIHN0eWxlLmcuJFsgbmFtZSBdID0gdmFsO1xuICAgICAgICB9XG4gICAgICB9ICk7XG4gICAgfSApO1xuICB9XG5cbiAganNvblRvTnd0LmJ1aWxkSnNPYmogPSBmdW5jdGlvbihmaWxlbmFtZSwgdmVyc2lvbiwgcmVuZGVySW5mbywgbWFwUHJvcGVydGllcywgbm9kZXMsIGVkZ2VzKSB7XG4gICAgdmFyIGpzT2JqID0ganNvblRvU2Jnbm1sLmJ1aWxkSnNPYmooZmlsZW5hbWUsIHZlcnNpb24sIHJlbmRlckluZm8sIG1hcFByb3BlcnRpZXMsIG5vZGVzLCBlZGdlcyk7XG5cbiAgICBpZiAoIGVsZW1lbnRVdGlsaXRpZXMubWFwVHlwZSAhPT0gJ1BEJyAmJiBlbGVtZW50VXRpbGl0aWVzLm1hcFR5cGUgIT09ICdBRicgICYmIGVsZW1lbnRVdGlsaXRpZXMubWFwVHlwZSAhPT0gJ0h5YnJpZFNiZ24nICYmIGVsZW1lbnRVdGlsaXRpZXMubWFwVHlwZSAhPT0gJ1NCTUwnKSB7XG4gICAgICB2YXIgbWFwID0ganNPYmoubWFwWzBdO1xuXG4gICAgICB2YXIgYXJjcyA9IG1hcC5hcmM7XG4gICAgICB2YXIgZ2x5cGhzID0gbWFwLmdseXBoO1xuICAgICAgZXh0ZW5kT2JqZWN0c0RhdGEoYXJjcywgZWxlbWVudFV0aWxpdGllcy5pc1NJRkVkZ2UsIHNpZkVkZ2VQcm9wSGFuZGxlck1hcCk7XG4gICAgICBleHRlbmRPYmplY3RzRGF0YShnbHlwaHMsIGVsZW1lbnRVdGlsaXRpZXMuaXNTSUZOb2RlLCBzaWZOb2RlUHJvcEhhbmRsZXJNYXApO1xuXG4gICAgICB2YXIganNPYmpTdHlsZXMgPSAoIG1hcCAmJiBtYXAuZXh0ZW5zaW9uICYmIG1hcC5leHRlbnNpb24ucmVuZGVySW5mb3JtYXRpb25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtYXAuZXh0ZW5zaW9uLnJlbmRlckluZm9ybWF0aW9uLmxpc3RPZlN0eWxlcyApLnN0eWxlO1xuICAgICAgdmFyIGFwcFN0eWxlcyA9IHJlbmRlckluZm8gJiYgcmVuZGVySW5mby5zdHlsZXM7XG5cbiAgICAgIGV4dGVuZFN0eWxlc0RhdGEoanNPYmpTdHlsZXMsIGFwcFN0eWxlcyk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGpzT2JqO1xuICB9O1xuXG4gIGpzb25Ub053dC5jcmVhdGVOd3QgPSBmdW5jdGlvbihmaWxlbmFtZSwgdmVyc2lvbiwgcmVuZGVySW5mbywgbWFwUHJvcGVydGllcywgbm9kZXMsIGVkZ2VzKSB7XG4gICAgdmFyIGpzT2JqID0ganNvblRvTnd0LmJ1aWxkSnNPYmooZmlsZW5hbWUsIHZlcnNpb24sIHJlbmRlckluZm8sIG1hcFByb3BlcnRpZXMsIG5vZGVzLCBlZGdlcyk7XG4gICAgcmV0dXJuIGpzb25Ub1NiZ25tbC5idWlsZFN0cmluZyh7c2JnbjoganNPYmp9KTtcbiAgfTtcblxuICByZXR1cm4ganNvblRvTnd0O1xufVxuIl0sIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJqc29uVG9TYmdubWwiLCJlbGVtZW50VXRpbGl0aWVzIiwiY3kiLCJqc29uVG9Od3QiLCJwYXJhbSIsImpzb25Ub1NiZ25tbENvbnZlcnRlciIsInNiZ25DeUluc3RhbmNlIiwiZ2V0Q3kiLCJzZXRUb1N0ciIsInNldCIsIk9iamVjdCIsImtleXMiLCJqb2luIiwic2lmRWRnZVByb3BIYW5kbGVyTWFwIiwicGNJRHMiLCJlZGdlIiwiZGF0YSIsInNpdGVMb2NhdGlvbnMiLCJzaWZOb2RlUHJvcEhhbmRsZXJNYXAiLCJ0b29sdGlwIiwibm9kZSIsImluZm9ib3hlcyIsIm9iaiIsInNpZkluZm9ib3hQcm9wSGFuZGxlck1hcCIsImluZm9ib3giLCJnbHlwaHMiLCJnbHlwaCIsImZvckVhY2giLCJpIiwicHJvcE5hbWUiLCJ2YWwiLCJleHRlbmRPYmplY3RzRGF0YSIsIm9ianMiLCJmaWx0ZXJGY24iLCJwcm9wSGFuZGxlck1hcCIsIiQiLCJlbGUiLCJnZXRFbGVtZW50QnlJZCIsImlkIiwiZXh0ZW5kU3R5bGVzRGF0YSIsInRvRXh0ZW5kIiwiZXh0ZW5kRnJvbSIsInN0eWxlTmFtZXMiLCJzdHlsZU1hcCIsImtleSIsIm5hbWUiLCJlbCIsInByb3BzIiwicHJvcGVydGllcyIsImlkTGlzdCIsInN0eWxlIiwic3BsaXQiLCJjdXJyVmFsIiwidW5kZWZpbmVkIiwiY29uc29sZSIsIndhcm4iLCJnIiwiYnVpbGRKc09iaiIsImZpbGVuYW1lIiwidmVyc2lvbiIsInJlbmRlckluZm8iLCJtYXBQcm9wZXJ0aWVzIiwibm9kZXMiLCJlZGdlcyIsImpzT2JqIiwibWFwVHlwZSIsIm1hcCIsImFyY3MiLCJhcmMiLCJpc1NJRkVkZ2UiLCJpc1NJRk5vZGUiLCJqc09ialN0eWxlcyIsImV4dGVuc2lvbiIsInJlbmRlckluZm9ybWF0aW9uIiwibGlzdE9mU3R5bGVzIiwiYXBwU3R5bGVzIiwic3R5bGVzIiwiY3JlYXRlTnd0IiwiYnVpbGRTdHJpbmciLCJzYmduIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/utilities/json-to-nwt-converter-factory.js\n"); /***/ }), @@ -215,7 +215,7 @@ eval("/*\n * These are the main utilities to be directly utilized by the user in \********************************************************/ /***/ ((module) => { -eval("module.exports = function () {\n var sbgnmlToJson, elementUtilities;\n function nwtToJson(param) {\n sbgnmlToJson = param.sbgnmlToJsonConverter;\n elementUtilities = param.elementUtilities;\n }\n function strToSet(str, splitBy) {\n var set = {};\n var list = str ? str.split(splitBy) : [];\n list.forEach(function (member) {\n set[member] = true;\n });\n return set;\n }\n function getFirstByTagName(arc, tagName) {\n var els = arc.getElementsByTagName(tagName);\n var val = els.length > 0 ? els[0].innerHTML : null;\n return val;\n }\n var sifEdgePropHandlerMap = {\n 'pcIDSet': function pcIDSet(arc) {\n var val = getFirstByTagName(arc, 'pcIDs');\n return strToSet(val, /;| /);\n },\n 'siteLocSet': function siteLocSet(arc) {\n var val = getFirstByTagName(arc, 'siteLocations');\n return strToSet(val, ';');\n }\n };\n var sifNodePropHandlerMap = {\n 'tooltip': function tooltip(glyph) {\n var val = getFirstByTagName(glyph, 'tooltip');\n return val;\n },\n 'infoboxes': function infoboxes(glyph, data) {\n var sifInfoboxPropHandlerMap = {\n 'tooltip': function tooltip(glyph) {\n var val = getFirstByTagName(glyph, 'tooltip');\n return val;\n }\n };\n var infoboxGlyphs = glyph.getElementsByTagName('glyph');\n for (var i = 0; i < infoboxGlyphs.length; i++) {\n var infoboxGlyph = infoboxGlyphs[i];\n Object.keys(sifInfoboxPropHandlerMap).forEach(function (propName) {\n var val = sifInfoboxPropHandlerMap[propName](infoboxGlyph);\n if (val) {\n data.statesandinfos[i][propName] = val;\n }\n });\n }\n }\n };\n function extendElementsData(elesData, filterFcn, getXMLEleById, propHandlerMap, xmlObject) {\n elesData.forEach(function (obj) {\n var data = obj.data;\n if (filterFcn(data[\"class\"])) {\n var xmlEle = getXMLEleById(xmlObject, data.id);\n Object.keys(propHandlerMap).forEach(function (propName) {\n // does not have to return a value, maybe a void function as well\n var val = propHandlerMap[propName](xmlEle, data);\n if (val) {\n data[propName] = val;\n }\n });\n }\n });\n }\n function getElMap(graphData) {\n var map = {\n nodes: {},\n edges: {},\n infoboxes: {}\n };\n graphData.edges.forEach(function (edge) {\n map.edges[edge.data.id] = edge;\n });\n graphData.nodes.forEach(function (node) {\n map.nodes[node.data.id] = node;\n var infoboxes = node.data.statesandinfos;\n infoboxes.forEach(function (infobox) {\n map.infoboxes[infobox.id] = infobox;\n });\n });\n return map;\n }\n function applyExtraStylesData(graphData, xmlObject) {\n var listOfStyles = xmlObject.querySelector('listOfStyles');\n var styles = listOfStyles && listOfStyles.querySelectorAll('style');\n if (!styles || styles.length === 0) {\n return;\n }\n var attrToProp = {\n 'shapeName': 'shape-name'\n };\n var elMap = getElMap(graphData);\n styles.forEach(function (style) {\n var idList = style.getAttribute('idList').split(' ');\n Object.keys(attrToProp).forEach(function (attrName) {\n var g = style.querySelector('g');\n var val = g.getAttribute(attrName);\n if (val) {\n var propName = attrToProp[attrName];\n idList.forEach(function (id) {\n if (elMap.nodes[id] || elMap.edges[id]) {\n var el = elMap.nodes[id] || elMap.edges[id];\n el.data[propName] = val;\n } else if (elMap.infoboxes[id]) {\n var el = elMap.infoboxes[id];\n el.style[propName] = val;\n }\n });\n }\n });\n });\n }\n nwtToJson.convert = function (xmlObject, urlParams) {\n var graphData = sbgnmlToJson.convert(xmlObject, urlParams);\n var mapType = elementUtilities.mapType;\n if (mapType !== 'PD' && mapType !== 'AF' && elementUtilities.mapType !== 'HybridSbgn') {\n elementUtilities.fileFormat = 'nwt';\n // extend edges data with sif specific features\n extendElementsData(graphData.edges, elementUtilities.isSIFEdge, sbgnmlToJson.getArcById.bind(sbgnmlToJson), sifEdgePropHandlerMap, xmlObject);\n extendElementsData(graphData.nodes, elementUtilities.isSIFNode, sbgnmlToJson.getGlyphById.bind(sbgnmlToJson), sifNodePropHandlerMap, xmlObject);\n\n // apply the style data that is not applied because of restrictions of libsbgn\n applyExtraStylesData(graphData, xmlObject);\n }\n return graphData;\n };\n nwtToJson.mapPropertiesToObj = function () {\n return sbgnmlToJson.mapPropertiesToObj();\n };\n return nwtToJson;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbGl0aWVzL253dC10by1qc29uLWNvbnZlcnRlci1mYWN0b3J5LmpzIiwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsInNiZ25tbFRvSnNvbiIsImVsZW1lbnRVdGlsaXRpZXMiLCJud3RUb0pzb24iLCJwYXJhbSIsInNiZ25tbFRvSnNvbkNvbnZlcnRlciIsInN0clRvU2V0Iiwic3RyIiwic3BsaXRCeSIsInNldCIsImxpc3QiLCJzcGxpdCIsImZvckVhY2giLCJtZW1iZXIiLCJnZXRGaXJzdEJ5VGFnTmFtZSIsImFyYyIsInRhZ05hbWUiLCJlbHMiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsInZhbCIsImxlbmd0aCIsImlubmVySFRNTCIsInNpZkVkZ2VQcm9wSGFuZGxlck1hcCIsInBjSURTZXQiLCJzaXRlTG9jU2V0Iiwic2lmTm9kZVByb3BIYW5kbGVyTWFwIiwidG9vbHRpcCIsImdseXBoIiwiaW5mb2JveGVzIiwiZGF0YSIsInNpZkluZm9ib3hQcm9wSGFuZGxlck1hcCIsImluZm9ib3hHbHlwaHMiLCJpIiwiaW5mb2JveEdseXBoIiwiT2JqZWN0Iiwia2V5cyIsInByb3BOYW1lIiwic3RhdGVzYW5kaW5mb3MiLCJleHRlbmRFbGVtZW50c0RhdGEiLCJlbGVzRGF0YSIsImZpbHRlckZjbiIsImdldFhNTEVsZUJ5SWQiLCJwcm9wSGFuZGxlck1hcCIsInhtbE9iamVjdCIsIm9iaiIsInhtbEVsZSIsImlkIiwiZ2V0RWxNYXAiLCJncmFwaERhdGEiLCJtYXAiLCJub2RlcyIsImVkZ2VzIiwiZWRnZSIsIm5vZGUiLCJpbmZvYm94IiwiYXBwbHlFeHRyYVN0eWxlc0RhdGEiLCJsaXN0T2ZTdHlsZXMiLCJxdWVyeVNlbGVjdG9yIiwic3R5bGVzIiwicXVlcnlTZWxlY3RvckFsbCIsImF0dHJUb1Byb3AiLCJlbE1hcCIsInN0eWxlIiwiaWRMaXN0IiwiZ2V0QXR0cmlidXRlIiwiYXR0ck5hbWUiLCJnIiwiZWwiLCJjb252ZXJ0IiwidXJsUGFyYW1zIiwibWFwVHlwZSIsImZpbGVGb3JtYXQiLCJpc1NJRkVkZ2UiLCJnZXRBcmNCeUlkIiwiYmluZCIsImlzU0lGTm9kZSIsImdldEdseXBoQnlJZCIsIm1hcFByb3BlcnRpZXNUb09iaiJdLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2JnbnZpei8uL3NyYy91dGlsaXRpZXMvbnd0LXRvLWpzb24tY29udmVydGVyLWZhY3RvcnkuanM/NTE5MyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuXG4gIHZhciBzYmdubWxUb0pzb24sIGVsZW1lbnRVdGlsaXRpZXM7XG5cbiAgZnVuY3Rpb24gbnd0VG9Kc29uKHBhcmFtKSB7XG4gICAgc2Jnbm1sVG9Kc29uID0gcGFyYW0uc2Jnbm1sVG9Kc29uQ29udmVydGVyO1xuICAgIGVsZW1lbnRVdGlsaXRpZXMgPSBwYXJhbS5lbGVtZW50VXRpbGl0aWVzO1xuICB9XG5cbiAgZnVuY3Rpb24gc3RyVG9TZXQoIHN0ciwgc3BsaXRCeSApIHtcbiAgICB2YXIgc2V0ID0ge307XG4gICAgdmFyIGxpc3QgPSBzdHIgPyBzdHIuc3BsaXQoIHNwbGl0QnkgKSA6IFtdO1xuXG4gICAgbGlzdC5mb3JFYWNoKCBmdW5jdGlvbiggbWVtYmVyICkge1xuICAgICAgc2V0WyBtZW1iZXIgXSA9IHRydWU7XG4gICAgfSApO1xuXG4gICAgcmV0dXJuIHNldDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEZpcnN0QnlUYWdOYW1lKGFyYywgdGFnTmFtZSkge1xuICAgIHZhciBlbHMgPSBhcmMuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7XG4gICAgdmFyIHZhbCA9IGVscy5sZW5ndGggPiAwID8gZWxzWzBdLmlubmVySFRNTCA6IG51bGw7XG5cbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgdmFyIHNpZkVkZ2VQcm9wSGFuZGxlck1hcCA9IHtcbiAgICAncGNJRFNldCc6IGZ1bmN0aW9uKGFyYykge1xuICAgICAgdmFyIHZhbCA9IGdldEZpcnN0QnlUYWdOYW1lKCBhcmMsICdwY0lEcycgKTtcbiAgICAgIHJldHVybiBzdHJUb1NldCggdmFsLCAvO3wgLyApO1xuICAgIH0sXG4gICAgJ3NpdGVMb2NTZXQnOiBmdW5jdGlvbihhcmMpIHtcbiAgICAgIHZhciB2YWwgPSBnZXRGaXJzdEJ5VGFnTmFtZSggYXJjLCAnc2l0ZUxvY2F0aW9ucycgKTtcbiAgICAgIHJldHVybiBzdHJUb1NldCggdmFsLCAnOycgKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHNpZk5vZGVQcm9wSGFuZGxlck1hcCA9IHtcbiAgICAndG9vbHRpcCc6IGZ1bmN0aW9uKGdseXBoKSB7XG4gICAgICB2YXIgdmFsID0gZ2V0Rmlyc3RCeVRhZ05hbWUoIGdseXBoLCAndG9vbHRpcCcgKTtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcbiAgICAnaW5mb2JveGVzJzogZnVuY3Rpb24oZ2x5cGgsIGRhdGEpIHtcbiAgICAgIHZhciBzaWZJbmZvYm94UHJvcEhhbmRsZXJNYXAgPSB7XG4gICAgICAgICd0b29sdGlwJzogZnVuY3Rpb24oZ2x5cGgpIHtcbiAgICAgICAgICB2YXIgdmFsID0gZ2V0Rmlyc3RCeVRhZ05hbWUoIGdseXBoLCAndG9vbHRpcCcgKTtcbiAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB2YXIgaW5mb2JveEdseXBocyA9IGdseXBoLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdnbHlwaCcpO1xuICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgIGluZm9ib3hHbHlwaHMubGVuZ3RoOyBpKysgKSB7XG4gICAgICAgIHZhciBpbmZvYm94R2x5cGggPSBpbmZvYm94R2x5cGhzWyBpIF07XG4gICAgICAgIE9iamVjdC5rZXlzKHNpZkluZm9ib3hQcm9wSGFuZGxlck1hcCkuZm9yRWFjaCggZnVuY3Rpb24oIHByb3BOYW1lICkge1xuICAgICAgICAgIHZhciB2YWwgPSBzaWZJbmZvYm94UHJvcEhhbmRsZXJNYXBbIHByb3BOYW1lIF0oaW5mb2JveEdseXBoKTtcbiAgICAgICAgICBpZiAoIHZhbCApIHtcbiAgICAgICAgICAgIGRhdGEuc3RhdGVzYW5kaW5mb3NbaV1bcHJvcE5hbWVdID0gdmFsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBleHRlbmRFbGVtZW50c0RhdGEoIGVsZXNEYXRhLCBmaWx0ZXJGY24sIGdldFhNTEVsZUJ5SWQsIHByb3BIYW5kbGVyTWFwLCB4bWxPYmplY3QgKSB7XG4gICAgZWxlc0RhdGEuZm9yRWFjaCggZnVuY3Rpb24oIG9iaiApIHtcbiAgICAgIHZhciBkYXRhID0gb2JqLmRhdGE7XG4gICAgICBpZiAoIGZpbHRlckZjbiggZGF0YS5jbGFzcyApICkge1xuICAgICAgICB2YXIgeG1sRWxlID0gZ2V0WE1MRWxlQnlJZCggeG1sT2JqZWN0LCBkYXRhLmlkICk7XG4gICAgICAgIE9iamVjdC5rZXlzKHByb3BIYW5kbGVyTWFwKS5mb3JFYWNoKCBmdW5jdGlvbiggcHJvcE5hbWUgKSB7XG4gICAgICAgICAgLy8gZG9lcyBub3QgaGF2ZSB0byByZXR1cm4gYSB2YWx1ZSwgbWF5YmUgYSB2b2lkIGZ1bmN0aW9uIGFzIHdlbGxcbiAgICAgICAgICB2YXIgdmFsID0gcHJvcEhhbmRsZXJNYXBbIHByb3BOYW1lIF0oeG1sRWxlLCBkYXRhKTtcbiAgICAgICAgICBpZiAoIHZhbCApIHtcbiAgICAgICAgICAgIGRhdGFbIHByb3BOYW1lIF0gPSB2YWw7XG4gICAgICAgICAgfVxuICAgICAgICB9ICk7XG4gICAgICB9XG4gICAgfSApO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RWxNYXAoIGdyYXBoRGF0YSApIHtcbiAgICB2YXIgbWFwID0ge1xuICAgICAgbm9kZXM6IHt9LFxuICAgICAgZWRnZXM6IHt9LFxuICAgICAgaW5mb2JveGVzOiB7fVxuICAgIH07XG5cbiAgICBncmFwaERhdGEuZWRnZXMuZm9yRWFjaCggZnVuY3Rpb24oIGVkZ2UgKSB7XG4gICAgICBtYXAuZWRnZXNbIGVkZ2UuZGF0YS5pZCBdID0gZWRnZTtcbiAgICB9ICk7XG5cbiAgICBncmFwaERhdGEubm9kZXMuZm9yRWFjaCggZnVuY3Rpb24oIG5vZGUgKSB7XG4gICAgICBtYXAubm9kZXNbIG5vZGUuZGF0YS5pZCBdID0gbm9kZTtcblxuICAgICAgdmFyIGluZm9ib3hlcyA9IG5vZGUuZGF0YS5zdGF0ZXNhbmRpbmZvcztcblxuICAgICAgaW5mb2JveGVzLmZvckVhY2goIGZ1bmN0aW9uKCBpbmZvYm94ICkge1xuICAgICAgICBtYXAuaW5mb2JveGVzWyBpbmZvYm94LmlkIF0gPSBpbmZvYm94O1xuICAgICAgfSApO1xuICAgIH0gKTtcblxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseUV4dHJhU3R5bGVzRGF0YSggZ3JhcGhEYXRhLCB4bWxPYmplY3QgKSB7XG4gICAgdmFyIGxpc3RPZlN0eWxlcyA9IHhtbE9iamVjdC5xdWVyeVNlbGVjdG9yKCdsaXN0T2ZTdHlsZXMnKVxuICAgIHZhciBzdHlsZXMgPSBsaXN0T2ZTdHlsZXMgJiYgbGlzdE9mU3R5bGVzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3N0eWxlJyk7XG5cbiAgICBpZiAoIXN0eWxlcyB8fCBzdHlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGF0dHJUb1Byb3AgPSB7XG4gICAgICAnc2hhcGVOYW1lJzogJ3NoYXBlLW5hbWUnXG4gICAgfTtcbiAgICB2YXIgZWxNYXAgPSBnZXRFbE1hcCggZ3JhcGhEYXRhICk7XG5cbiAgICBzdHlsZXMuZm9yRWFjaCggZnVuY3Rpb24oIHN0eWxlICkge1xuICAgICAgdmFyIGlkTGlzdCA9IHN0eWxlLmdldEF0dHJpYnV0ZSgnaWRMaXN0Jykuc3BsaXQoJyAnKTtcblxuICAgICAgT2JqZWN0LmtleXMoIGF0dHJUb1Byb3AgKS5mb3JFYWNoKCBmdW5jdGlvbiggYXR0ck5hbWUgKSB7XG4gICAgICAgIHZhciBnID0gc3R5bGUucXVlcnlTZWxlY3RvcignZycpO1xuICAgICAgICB2YXIgdmFsID0gZy5nZXRBdHRyaWJ1dGUoIGF0dHJOYW1lICk7XG5cbiAgICAgICAgaWYgKCB2YWwgKSB7XG4gICAgICAgICAgdmFyIHByb3BOYW1lID0gYXR0clRvUHJvcFsgYXR0ck5hbWUgXTtcblxuICAgICAgICAgIGlkTGlzdC5mb3JFYWNoKCBmdW5jdGlvbiggaWQgKSB7XG4gICAgICAgICAgICBpZiAoIGVsTWFwLm5vZGVzWyBpZCBdIHx8IGVsTWFwLmVkZ2VzWyBpZCBdICkge1xuICAgICAgICAgICAgICB2YXIgZWwgPSBlbE1hcC5ub2Rlc1sgaWQgXSB8fCBlbE1hcC5lZGdlc1sgaWQgXTtcbiAgICAgICAgICAgICAgZWwuZGF0YVsgcHJvcE5hbWUgXSA9IHZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCBlbE1hcC5pbmZvYm94ZXNbIGlkIF0gKSB7XG4gICAgICAgICAgICAgIHZhciBlbCA9IGVsTWFwLmluZm9ib3hlc1sgaWQgXTtcbiAgICAgICAgICAgICAgZWwuc3R5bGVbIHByb3BOYW1lIF0gPSB2YWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSApO1xuICAgICAgICB9XG4gICAgICB9ICk7XG4gICAgfSApO1xuICB9XG5cbiAgbnd0VG9Kc29uLmNvbnZlcnQgPSBmdW5jdGlvbih4bWxPYmplY3QsIHVybFBhcmFtcykge1xuICAgIHZhciBncmFwaERhdGEgPSBzYmdubWxUb0pzb24uY29udmVydCh4bWxPYmplY3QsIHVybFBhcmFtcyk7XG4gICAgdmFyIG1hcFR5cGUgPSBlbGVtZW50VXRpbGl0aWVzLm1hcFR5cGU7XG5cbiAgICBpZiAobWFwVHlwZSAhPT0gJ1BEJyAmJiBtYXBUeXBlICE9PSAnQUYnICYmIGVsZW1lbnRVdGlsaXRpZXMubWFwVHlwZSAhPT0gJ0h5YnJpZFNiZ24nKSB7XG4gICAgICBlbGVtZW50VXRpbGl0aWVzLmZpbGVGb3JtYXQgPSAnbnd0JztcbiAgICAgIC8vIGV4dGVuZCBlZGdlcyBkYXRhIHdpdGggc2lmIHNwZWNpZmljIGZlYXR1cmVzXG4gICAgICBleHRlbmRFbGVtZW50c0RhdGEoIGdyYXBoRGF0YS5lZGdlcywgZWxlbWVudFV0aWxpdGllcy5pc1NJRkVkZ2UsIHNiZ25tbFRvSnNvbi5nZXRBcmNCeUlkLmJpbmQoc2Jnbm1sVG9Kc29uKSwgc2lmRWRnZVByb3BIYW5kbGVyTWFwLCB4bWxPYmplY3QgKTtcbiAgICAgIGV4dGVuZEVsZW1lbnRzRGF0YSggZ3JhcGhEYXRhLm5vZGVzLCBlbGVtZW50VXRpbGl0aWVzLmlzU0lGTm9kZSwgc2Jnbm1sVG9Kc29uLmdldEdseXBoQnlJZC5iaW5kKHNiZ25tbFRvSnNvbiksIHNpZk5vZGVQcm9wSGFuZGxlck1hcCwgeG1sT2JqZWN0ICk7XG5cbiAgICAgIC8vIGFwcGx5IHRoZSBzdHlsZSBkYXRhIHRoYXQgaXMgbm90IGFwcGxpZWQgYmVjYXVzZSBvZiByZXN0cmljdGlvbnMgb2YgbGlic2JnblxuICAgICAgYXBwbHlFeHRyYVN0eWxlc0RhdGEoIGdyYXBoRGF0YSwgeG1sT2JqZWN0ICk7ICAgICAgXG4gICAgfVxuXG4gICAgcmV0dXJuIGdyYXBoRGF0YTtcbiAgfTtcblxuICBud3RUb0pzb24ubWFwUHJvcGVydGllc1RvT2JqID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHNiZ25tbFRvSnNvbi5tYXBQcm9wZXJ0aWVzVG9PYmooKTtcbiAgfTtcblxuICByZXR1cm4gbnd0VG9Kc29uO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUFBLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHLFlBQVc7RUFFMUIsSUFBSUMsWUFBWSxFQUFFQyxnQkFBZ0I7RUFFbEMsU0FBU0MsU0FBU0EsQ0FBQ0MsS0FBSyxFQUFFO0lBQ3hCSCxZQUFZLEdBQUdHLEtBQUssQ0FBQ0MscUJBQXFCO0lBQzFDSCxnQkFBZ0IsR0FBR0UsS0FBSyxDQUFDRixnQkFBZ0I7RUFDM0M7RUFFQSxTQUFTSSxRQUFRQSxD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\n//# sourceURL=webpack-internal:///./src/utilities/nwt-to-json-converter-factory.js\n"); +eval("module.exports = function () {\n var sbgnmlToJson, elementUtilities;\n function nwtToJson(param) {\n sbgnmlToJson = param.sbgnmlToJsonConverter;\n elementUtilities = param.elementUtilities;\n }\n function strToSet(str, splitBy) {\n var set = {};\n var list = str ? str.split(splitBy) : [];\n list.forEach(function (member) {\n set[member] = true;\n });\n return set;\n }\n function getFirstByTagName(arc, tagName) {\n var els = arc.getElementsByTagName(tagName);\n var val = els.length > 0 ? els[0].innerHTML : null;\n return val;\n }\n var sifEdgePropHandlerMap = {\n 'pcIDSet': function pcIDSet(arc) {\n var val = getFirstByTagName(arc, 'pcIDs');\n return strToSet(val, /;| /);\n },\n 'siteLocSet': function siteLocSet(arc) {\n var val = getFirstByTagName(arc, 'siteLocations');\n return strToSet(val, ';');\n }\n };\n var sifNodePropHandlerMap = {\n 'tooltip': function tooltip(glyph) {\n var val = getFirstByTagName(glyph, 'tooltip');\n return val;\n },\n 'infoboxes': function infoboxes(glyph, data) {\n var sifInfoboxPropHandlerMap = {\n 'tooltip': function tooltip(glyph) {\n var val = getFirstByTagName(glyph, 'tooltip');\n return val;\n }\n };\n var infoboxGlyphs = glyph.getElementsByTagName('glyph');\n for (var i = 0; i < infoboxGlyphs.length; i++) {\n var infoboxGlyph = infoboxGlyphs[i];\n Object.keys(sifInfoboxPropHandlerMap).forEach(function (propName) {\n var val = sifInfoboxPropHandlerMap[propName](infoboxGlyph);\n if (val) {\n data.statesandinfos[i][propName] = val;\n }\n });\n }\n }\n };\n function extendElementsData(elesData, filterFcn, getXMLEleById, propHandlerMap, xmlObject) {\n elesData.forEach(function (obj) {\n var data = obj.data;\n if (filterFcn(data[\"class\"])) {\n var xmlEle = getXMLEleById(xmlObject, data.id);\n Object.keys(propHandlerMap).forEach(function (propName) {\n // does not have to return a value, maybe a void function as well\n var val = propHandlerMap[propName](xmlEle, data);\n if (val) {\n data[propName] = val;\n }\n });\n }\n });\n }\n function getElMap(graphData) {\n var map = {\n nodes: {},\n edges: {},\n infoboxes: {}\n };\n graphData.edges.forEach(function (edge) {\n map.edges[edge.data.id] = edge;\n });\n graphData.nodes.forEach(function (node) {\n map.nodes[node.data.id] = node;\n var infoboxes = node.data.statesandinfos;\n infoboxes.forEach(function (infobox) {\n map.infoboxes[infobox.id] = infobox;\n });\n });\n return map;\n }\n function applyExtraStylesData(graphData, xmlObject) {\n var listOfStyles = xmlObject.querySelector('listOfStyles');\n var styles = listOfStyles && listOfStyles.querySelectorAll('style');\n if (!styles || styles.length === 0) {\n return;\n }\n var attrToProp = {\n 'shapeName': 'shape-name'\n };\n var elMap = getElMap(graphData);\n styles.forEach(function (style) {\n var idList = style.getAttribute('idList').split(' ');\n Object.keys(attrToProp).forEach(function (attrName) {\n var g = style.querySelector('g');\n var val = g.getAttribute(attrName);\n if (val) {\n var propName = attrToProp[attrName];\n idList.forEach(function (id) {\n if (elMap.nodes[id] || elMap.edges[id]) {\n var el = elMap.nodes[id] || elMap.edges[id];\n el.data[propName] = val;\n } else if (elMap.infoboxes[id]) {\n var el = elMap.infoboxes[id];\n el.style[propName] = val;\n }\n });\n }\n });\n });\n }\n nwtToJson.convert = function (xmlObject, urlParams) {\n var graphData = sbgnmlToJson.convert(xmlObject, urlParams);\n var mapType = elementUtilities.mapType;\n if (mapType !== 'PD' && mapType !== 'AF' && elementUtilities.mapType !== 'HybridSbgn') {\n elementUtilities.fileFormat = 'nwt';\n // extend edges data with sif specific features\n extendElementsData(graphData.edges, elementUtilities.isSIFEdge, sbgnmlToJson.getArcById.bind(sbgnmlToJson), sifEdgePropHandlerMap, xmlObject);\n extendElementsData(graphData.nodes, elementUtilities.isSIFNode, sbgnmlToJson.getGlyphById.bind(sbgnmlToJson), sifNodePropHandlerMap, xmlObject);\n\n // apply the style data that is not applied because of restrictions of libsbgn\n applyExtraStylesData(graphData, xmlObject);\n }\n return graphData;\n };\n nwtToJson.mapPropertiesToObj = function () {\n return sbgnmlToJson.mapPropertiesToObj();\n };\n return nwtToJson;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbGl0aWVzL253dC10by1qc29uLWNvbnZlcnRlci1mYWN0b3J5LmpzIiwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsInNiZ25tbFRvSnNvbiIsImVsZW1lbnRVdGlsaXRpZXMiLCJud3RUb0pzb24iLCJwYXJhbSIsInNiZ25tbFRvSnNvbkNvbnZlcnRlciIsInN0clRvU2V0Iiwic3RyIiwic3BsaXRCeSIsInNldCIsImxpc3QiLCJzcGxpdCIsImZvckVhY2giLCJtZW1iZXIiLCJnZXRGaXJzdEJ5VGFnTmFtZSIsImFyYyIsInRhZ05hbWUiLCJlbHMiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsInZhbCIsImxlbmd0aCIsImlubmVySFRNTCIsInNpZkVkZ2VQcm9wSGFuZGxlck1hcCIsInBjSURTZXQiLCJzaXRlTG9jU2V0Iiwic2lmTm9kZVByb3BIYW5kbGVyTWFwIiwidG9vbHRpcCIsImdseXBoIiwiaW5mb2JveGVzIiwiZGF0YSIsInNpZkluZm9ib3hQcm9wSGFuZGxlck1hcCIsImluZm9ib3hHbHlwaHMiLCJpIiwiaW5mb2JveEdseXBoIiwiT2JqZWN0Iiwia2V5cyIsInByb3BOYW1lIiwic3RhdGVzYW5kaW5mb3MiLCJleHRlbmRFbGVtZW50c0RhdGEiLCJlbGVzRGF0YSIsImZpbHRlckZjbiIsImdldFhNTEVsZUJ5SWQiLCJwcm9wSGFuZGxlck1hcCIsInhtbE9iamVjdCIsIm9iaiIsInhtbEVsZSIsImlkIiwiZ2V0RWxNYXAiLCJncmFwaERhdGEiLCJtYXAiLCJub2RlcyIsImVkZ2VzIiwiZWRnZSIsIm5vZGUiLCJpbmZvYm94IiwiYXBwbHlFeHRyYVN0eWxlc0RhdGEiLCJsaXN0T2ZTdHlsZXMiLCJxdWVyeVNlbGVjdG9yIiwic3R5bGVzIiwicXVlcnlTZWxlY3RvckFsbCIsImF0dHJUb1Byb3AiLCJlbE1hcCIsInN0eWxlIiwiaWRMaXN0IiwiZ2V0QXR0cmlidXRlIiwiYXR0ck5hbWUiLCJnIiwiZWwiLCJjb252ZXJ0IiwidXJsUGFyYW1zIiwibWFwVHlwZSIsImZpbGVGb3JtYXQiLCJpc1NJRkVkZ2UiLCJnZXRBcmNCeUlkIiwiYmluZCIsImlzU0lGTm9kZSIsImdldEdseXBoQnlJZCIsIm1hcFByb3BlcnRpZXNUb09iaiJdLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2JnbnZpei8uL3NyYy91dGlsaXRpZXMvbnd0LXRvLWpzb24tY29udmVydGVyLWZhY3RvcnkuanM/NTE5MyJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuXG4gIHZhciBzYmdubWxUb0pzb24sIGVsZW1lbnRVdGlsaXRpZXM7XG5cbiAgZnVuY3Rpb24gbnd0VG9Kc29uKHBhcmFtKSB7XG4gICAgc2Jnbm1sVG9Kc29uID0gcGFyYW0uc2Jnbm1sVG9Kc29uQ29udmVydGVyO1xuICAgIGVsZW1lbnRVdGlsaXRpZXMgPSBwYXJhbS5lbGVtZW50VXRpbGl0aWVzO1xuICB9XG5cbiAgZnVuY3Rpb24gc3RyVG9TZXQoIHN0ciwgc3BsaXRCeSApIHtcbiAgICB2YXIgc2V0ID0ge307XG4gICAgdmFyIGxpc3QgPSBzdHIgPyBzdHIuc3BsaXQoIHNwbGl0QnkgKSA6IFtdO1xuXG4gICAgbGlzdC5mb3JFYWNoKCBmdW5jdGlvbiggbWVtYmVyICkge1xuICAgICAgc2V0WyBtZW1iZXIgXSA9IHRydWU7XG4gICAgfSApO1xuXG4gICAgcmV0dXJuIHNldDtcbiAgfVxuXG4gIGZ1bmN0aW9uIGdldEZpcnN0QnlUYWdOYW1lKGFyYywgdGFnTmFtZSkge1xuICAgIHZhciBlbHMgPSBhcmMuZ2V0RWxlbWVudHNCeVRhZ05hbWUodGFnTmFtZSk7XG4gICAgdmFyIHZhbCA9IGVscy5sZW5ndGggPiAwID8gZWxzWzBdLmlubmVySFRNTCA6IG51bGw7XG5cbiAgICByZXR1cm4gdmFsO1xuICB9XG5cbiAgdmFyIHNpZkVkZ2VQcm9wSGFuZGxlck1hcCA9IHtcbiAgICAncGNJRFNldCc6IGZ1bmN0aW9uKGFyYykge1xuICAgICAgdmFyIHZhbCA9IGdldEZpcnN0QnlUYWdOYW1lKCBhcmMsICdwY0lEcycgKTtcbiAgICAgIHJldHVybiBzdHJUb1NldCggdmFsLCAvO3wgLyApO1xuICAgIH0sXG4gICAgJ3NpdGVMb2NTZXQnOiBmdW5jdGlvbihhcmMpIHtcbiAgICAgIHZhciB2YWwgPSBnZXRGaXJzdEJ5VGFnTmFtZSggYXJjLCAnc2l0ZUxvY2F0aW9ucycgKTtcbiAgICAgIHJldHVybiBzdHJUb1NldCggdmFsLCAnOycgKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIHNpZk5vZGVQcm9wSGFuZGxlck1hcCA9IHtcbiAgICAndG9vbHRpcCc6IGZ1bmN0aW9uKGdseXBoKSB7XG4gICAgICB2YXIgdmFsID0gZ2V0Rmlyc3RCeVRhZ05hbWUoIGdseXBoLCAndG9vbHRpcCcgKTtcbiAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcbiAgICAnaW5mb2JveGVzJzogZnVuY3Rpb24oZ2x5cGgsIGRhdGEpIHtcbiAgICAgIHZhciBzaWZJbmZvYm94UHJvcEhhbmRsZXJNYXAgPSB7XG4gICAgICAgICd0b29sdGlwJzogZnVuY3Rpb24oZ2x5cGgpIHtcbiAgICAgICAgICB2YXIgdmFsID0gZ2V0Rmlyc3RCeVRhZ05hbWUoIGdseXBoLCAndG9vbHRpcCcgKTtcbiAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICB9XG4gICAgICB9O1xuXG4gICAgICB2YXIgaW5mb2JveEdseXBocyA9IGdseXBoLmdldEVsZW1lbnRzQnlUYWdOYW1lKCdnbHlwaCcpO1xuICAgICAgZm9yICggdmFyIGkgPSAwOyBpIDwgIGluZm9ib3hHbHlwaHMubGVuZ3RoOyBpKysgKSB7XG4gICAgICAgIHZhciBpbmZvYm94R2x5cGggPSBpbmZvYm94R2x5cGhzWyBpIF07XG4gICAgICAgIE9iamVjdC5rZXlzKHNpZkluZm9ib3hQcm9wSGFuZGxlck1hcCkuZm9yRWFjaCggZnVuY3Rpb24oIHByb3BOYW1lICkge1xuICAgICAgICAgIHZhciB2YWwgPSBzaWZJbmZvYm94UHJvcEhhbmRsZXJNYXBbIHByb3BOYW1lIF0oaW5mb2JveEdseXBoKTtcbiAgICAgICAgICBpZiAoIHZhbCApIHtcbiAgICAgICAgICAgIGRhdGEuc3RhdGVzYW5kaW5mb3NbaV1bcHJvcE5hbWVdID0gdmFsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSApO1xuICAgICAgfVxuICAgIH1cbiAgfTtcblxuICBmdW5jdGlvbiBleHRlbmRFbGVtZW50c0RhdGEoIGVsZXNEYXRhLCBmaWx0ZXJGY24sIGdldFhNTEVsZUJ5SWQsIHByb3BIYW5kbGVyTWFwLCB4bWxPYmplY3QgKSB7XG4gICAgZWxlc0RhdGEuZm9yRWFjaCggZnVuY3Rpb24oIG9iaiApIHtcbiAgICAgIHZhciBkYXRhID0gb2JqLmRhdGE7XG4gICAgICBpZiAoIGZpbHRlckZjbiggZGF0YS5jbGFzcyApICkge1xuICAgICAgICB2YXIgeG1sRWxlID0gZ2V0WE1MRWxlQnlJZCggeG1sT2JqZWN0LCBkYXRhLmlkICk7XG4gICAgICAgIE9iamVjdC5rZXlzKHByb3BIYW5kbGVyTWFwKS5mb3JFYWNoKCBmdW5jdGlvbiggcHJvcE5hbWUgKSB7XG4gICAgICAgICAgLy8gZG9lcyBub3QgaGF2ZSB0byByZXR1cm4gYSB2YWx1ZSwgbWF5YmUgYSB2b2lkIGZ1bmN0aW9uIGFzIHdlbGxcbiAgICAgICAgICB2YXIgdmFsID0gcHJvcEhhbmRsZXJNYXBbIHByb3BOYW1lIF0oeG1sRWxlLCBkYXRhKTtcbiAgICAgICAgICBpZiAoIHZhbCApIHtcbiAgICAgICAgICAgIGRhdGFbIHByb3BOYW1lIF0gPSB2YWw7XG4gICAgICAgICAgfVxuICAgICAgICB9ICk7XG4gICAgICB9XG4gICAgfSApO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2V0RWxNYXAoIGdyYXBoRGF0YSApIHtcbiAgICB2YXIgbWFwID0ge1xuICAgICAgbm9kZXM6IHt9LFxuICAgICAgZWRnZXM6IHt9LFxuICAgICAgaW5mb2JveGVzOiB7fVxuICAgIH07XG5cbiAgICBncmFwaERhdGEuZWRnZXMuZm9yRWFjaCggZnVuY3Rpb24oIGVkZ2UgKSB7XG4gICAgICBtYXAuZWRnZXNbIGVkZ2UuZGF0YS5pZCBdID0gZWRnZTtcbiAgICB9ICk7XG5cbiAgICBncmFwaERhdGEubm9kZXMuZm9yRWFjaCggZnVuY3Rpb24oIG5vZGUgKSB7XG4gICAgICBtYXAubm9kZXNbIG5vZGUuZGF0YS5pZCBdID0gbm9kZTtcblxuICAgICAgdmFyIGluZm9ib3hlcyA9IG5vZGUuZGF0YS5zdGF0ZXNhbmRpbmZvcztcblxuICAgICAgaW5mb2JveGVzLmZvckVhY2goIGZ1bmN0aW9uKCBpbmZvYm94ICkge1xuICAgICAgICBtYXAuaW5mb2JveGVzWyBpbmZvYm94LmlkIF0gPSBpbmZvYm94O1xuICAgICAgfSApO1xuICAgIH0gKTtcblxuICAgIHJldHVybiBtYXA7XG4gIH1cblxuICBmdW5jdGlvbiBhcHBseUV4dHJhU3R5bGVzRGF0YSggZ3JhcGhEYXRhLCB4bWxPYmplY3QgKSB7XG4gICAgdmFyIGxpc3RPZlN0eWxlcyA9IHhtbE9iamVjdC5xdWVyeVNlbGVjdG9yKCdsaXN0T2ZTdHlsZXMnKVxuICAgIHZhciBzdHlsZXMgPSBsaXN0T2ZTdHlsZXMgJiYgbGlzdE9mU3R5bGVzLnF1ZXJ5U2VsZWN0b3JBbGwoJ3N0eWxlJyk7XG5cbiAgICBpZiAoIXN0eWxlcyB8fCBzdHlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgdmFyIGF0dHJUb1Byb3AgPSB7XG4gICAgICAnc2hhcGVOYW1lJzogJ3NoYXBlLW5hbWUnXG4gICAgfTtcbiAgICB2YXIgZWxNYXAgPSBnZXRFbE1hcCggZ3JhcGhEYXRhICk7XG5cbiAgICBzdHlsZXMuZm9yRWFjaCggZnVuY3Rpb24oIHN0eWxlICkge1xuICAgICAgdmFyIGlkTGlzdCA9IHN0eWxlLmdldEF0dHJpYnV0ZSgnaWRMaXN0Jykuc3BsaXQoJyAnKTtcblxuICAgICAgT2JqZWN0LmtleXMoIGF0dHJUb1Byb3AgKS5mb3JFYWNoKCBmdW5jdGlvbiggYXR0ck5hbWUgKSB7XG4gICAgICAgIHZhciBnID0gc3R5bGUucXVlcnlTZWxlY3RvcignZycpO1xuICAgICAgICB2YXIgdmFsID0gZy5nZXRBdHRyaWJ1dGUoIGF0dHJOYW1lICk7XG5cbiAgICAgICAgaWYgKCB2YWwgKSB7XG4gICAgICAgICAgdmFyIHByb3BOYW1lID0gYXR0clRvUHJvcFsgYXR0ck5hbWUgXTtcblxuICAgICAgICAgIGlkTGlzdC5mb3JFYWNoKCBmdW5jdGlvbiggaWQgKSB7XG4gICAgICAgICAgICBpZiAoIGVsTWFwLm5vZGVzWyBpZCBdIHx8IGVsTWFwLmVkZ2VzWyBpZCBdICkge1xuICAgICAgICAgICAgICB2YXIgZWwgPSBlbE1hcC5ub2Rlc1sgaWQgXSB8fCBlbE1hcC5lZGdlc1sgaWQgXTtcbiAgICAgICAgICAgICAgZWwuZGF0YVsgcHJvcE5hbWUgXSA9IHZhbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCBlbE1hcC5pbmZvYm94ZXNbIGlkIF0gKSB7XG4gICAgICAgICAgICAgIHZhciBlbCA9IGVsTWFwLmluZm9ib3hlc1sgaWQgXTtcbiAgICAgICAgICAgICAgZWwuc3R5bGVbIHByb3BOYW1lIF0gPSB2YWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSApO1xuICAgICAgICB9XG4gICAgICB9ICk7XG4gICAgfSApO1xuICB9XG5cbiAgbnd0VG9Kc29uLmNvbnZlcnQgPSBmdW5jdGlvbih4bWxPYmplY3QsIHVybFBhcmFtcykge1xuICAgIHZhciBncmFwaERhdGEgPSBzYmdubWxUb0pzb24uY29udmVydCh4bWxPYmplY3QsIHVybFBhcmFtcyk7XG4gICAgdmFyIG1hcFR5cGUgPSBlbGVtZW50VXRpbGl0aWVzLm1hcFR5cGU7XG5cbiAgICBpZiAobWFwVHlwZSAhPT0gJ1BEJyAmJiBtYXBUeXBlICE9PSAnQUYnICYmIGVsZW1lbnRVdGlsaXRpZXMubWFwVHlwZSAhPT0gJ0h5YnJpZFNiZ24nKSB7XG4gICAgICBlbGVtZW50VXRpbGl0aWVzLmZpbGVGb3JtYXQgPSAnbnd0JztcbiAgICAgIC8vIGV4dGVuZCBlZGdlcyBkYXRhIHdpdGggc2lmIHNwZWNpZmljIGZlYXR1cmVzXG4gICAgICBleHRlbmRFbGVtZW50c0RhdGEoIGdyYXBoRGF0YS5lZGdlcywgZWxlbWVudFV0aWxpdGllcy5pc1NJRkVkZ2UsIHNiZ25tbFRvSnNvbi5nZXRBcmNCeUlkLmJpbmQoc2Jnbm1sVG9Kc29uKSwgc2lmRWRnZVByb3BIYW5kbGVyTWFwLCB4bWxPYmplY3QgKTtcbiAgICAgIGV4dGVuZEVsZW1lbnRzRGF0YSggZ3JhcGhEYXRhLm5vZGVzLCBlbGVtZW50VXRpbGl0aWVzLmlzU0lGTm9kZSwgc2Jnbm1sVG9Kc29uLmdldEdseXBoQnlJZC5iaW5kKHNiZ25tbFRvSnNvbiksIHNpZk5vZGVQcm9wSGFuZGxlck1hcCwgeG1sT2JqZWN0ICk7XG5cbiAgICAgIC8vIGFwcGx5IHRoZSBzdHlsZSBkYXRhIHRoYXQgaXMgbm90IGFwcGxpZWQgYmVjYXVzZSBvZiByZXN0cmljdGlvbnMgb2YgbGlic2JnblxuICAgICAgYXBwbHlFeHRyYVN0eWxlc0RhdGEoIGdyYXBoRGF0YSwgeG1sT2JqZWN0ICk7ICAgICAgXG4gICAgfVxuXG4gICAgcmV0dXJuIGdyYXBoRGF0YTtcbiAgfTtcblxuICBud3RUb0pzb24ubWFwUHJvcGVydGllc1RvT2JqID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHNiZ25tbFRvSnNvbi5tYXBQcm9wZXJ0aWVzVG9PYmooKTtcbiAgfTtcblxuICByZXR1cm4gbnd0VG9Kc29uO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUFBLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHLFlBQVc7RUFFMUIsSUFBSUMsWUFBWSxFQUFFQyxnQkFBZ0I7RUFFbEMsU0FBU0MsU0FBU0EsQ0FBQ0MsS0FBSyxFQUFFO0lBQ3hCSCxZQUFZLEdBQUdHLEtBQUssQ0FBQ0MscUJBQXFCO0lBQzFDSCxnQkFBZ0IsR0FBR0UsS0FBSyxDQUFDRixnQkFBZ0I7RUFDM0M7RUFFQSxTQUFTSSxRQUFRQSxDQUFFQyxHQUFHLEVBQUVDLE9BQU8sRUFBRztJQUNoQyxJQUFJQyxHQUFHLEdBQUcsQ0FBQyxDQUFDO0lBQ1osSUFBSUMsSUFBSSxHQUFHSCxHQUFHLEdBQUdBLEdBQUcsQ0FBQ0ksS0FBSyxDQUFFSCxPQUFRLENBQUMsR0FBRyxFQUFFO0lBRTFDRSxJQUFJLENBQUNFLE9BQU8sQ0FBRSxVQUFVQyxNQUFNLEVBQUc7TUFDL0JKLEdBQUcsQ0FBRUksTUFBTSxDQUFFLEdBQUcsSUFBSTtJQUN0QixDQUFFLENBQUM7SUFFSCxPQUFPSixHQUFHO0VBQ1o7RUFFQSxTQUFTSyxpQkFBaUJBLENBQUNDLEdBQUcsRUFBRUMsT0FBTyxFQUFFO0lBQ3ZDLElBQUlDLEdBQUcsR0FBR0YsR0FBRyxDQUFDRyxvQkFBb0IsQ0FBQ0YsT0FBTyxDQUFDO0lBQzNDLElBQUlHLEdBQUcsR0FBR0YsR0FBRyxDQUFDRyxNQUFNLEdBQUcsQ0FBQyxHQUFHSCxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUNJLFNBQVMsR0FBRyxJQUFJO0lBRWxELE9BQU9GLEdBQUc7RUFDWjtFQUVBLElBQUlHLHFCQUFxQixHQUFHO0lBQzFCLFNBQVMsRUFBRSxTQUFYQyxPQUFTQSxDQUFXUixHQUFHLEVBQUU7TUFDdkIsSUFBSUksR0FBRyxHQUFHTCxpQkFBaUIsQ0FBRUMsR0FBRyxFQUFFLE9BQVEsQ0FBQztNQUMzQyxPQUFPVCxRQUFRLENBQUVhLEdBQUcsRUFBRSxLQUFNLENBQUM7SUFDL0IsQ0FBQztJQUNELFlBQVksRUFBRSxTQUFkSyxVQUFZQSxDQUFXVCxHQUFHLEVBQUU7TUFDMUIsSUFBSUksR0FBRyxHQUFHTCxpQkFBaUIsQ0FBRUMsR0FBRyxFQUFFLGVBQWdCLENBQUM7TUFDbkQsT0FBT1QsUUFBUSxDQUFFYSxHQUFHLEVBQUUsR0FBSSxDQUFDO0lBQzdCO0VBQ0YsQ0FBQztFQUVELElBQUlNLHFCQUFxQixHQUFHO0lBQzFCLFNBQVMsRUFBRSxTQUFYQyxPQUFTQSxDQUFXQyxLQUFLLEVBQUU7TUFDekIsSUFBSVIsR0FBRyxHQUFHTCxpQkFBaUIsQ0FBRWEsS0FBSyxFQUFFLFNBQVUsQ0FBQztNQUMvQyxPQUFPUixHQUFHO0lBQ1osQ0FBQztJQUNELFdBQVcsRUFBRSxTQUFiUyxTQUFXQSxDQUFXRCxLQUFLLEVBQUVFLElBQUksRUFBRTtNQUNqQyxJQUFJQyx3QkFBd0IsR0FBRztRQUM3QixTQUFTLEVBQUUsU0FBWEosT0FBU0EsQ0FBV0MsS0FBSyxFQUFFO1VBQ3pCLElBQUlSLEdBQUcsR0FBR0wsaUJBQWlCLENBQUVhLEtBQUssRUFBRSxTQUFVLENBQUM7VUFDL0MsT0FBT1IsR0FBRztRQUNaO01BQ0YsQ0FBQztNQUVELElBQUlZLGFBQWEsR0FBR0osS0FBSyxDQUFDVCxvQkFBb0IsQ0FBQyxPQUFPLENBQUM7TUFDdkQsS0FBTSxJQUFJYyxDQUFDLEdBQUcsQ0FBQyxFQUFFQSxDQUFDLEdBQUlELGFBQWEsQ0FBQ1gsTUFBTSxFQUFFWSxDQUFDLEVBQUUsRUFBRztRQUNoRCxJQUFJQyxZQUFZLEdBQUdGLGFBQWEsQ0FBRUMsQ0FBQyxDQUFFO1FBQ3JDRSxNQUFNLENBQUNDLElBQUksQ0FBQ0wsd0JBQXdCLENBQUMsQ0FBQ2xCLE9BQU8sQ0FBRSxVQUFVd0IsUUFBUSxFQUFHO1VBQ2xFLElBQUlqQixHQUFHLEdBQUdXLHdCQUF3QixDQUFFTSxRQUFRLENBQUUsQ0FBQ0gsWUFBWSxDQUFDO1VBQzVELElBQUtkLEdBQUcsRUFBRztZQUNUVSxJQUFJLENBQUNRLGNBQWMsQ0FBQ0wsQ0FBQyxDQUFDLENBQUNJLFFBQVEsQ0FBQyxHQUFHakIsR0FBRztVQUN4QztRQUNGLENBQUUsQ0FBQztNQUNMO0lBQ0Y7RUFDRixDQUFDO0VBRUQsU0FBU21CLGtCQUFrQkEsQ0FBRUMsUUFBUSxFQUFFQyxTQUFTLEVBQUVDLGFBQWEsRUFBRUMsY0FBYyxFQUFFQyxTQUFTLEVBQUc7SUFDM0ZKLFFBQVEsQ0FBQzNCLE9BQU8sQ0FBRSxVQUFVZ0MsR0FBRyxFQUFHO01BQ2hDLElBQUlmLElBQUksR0FBR2UsR0FBRyxDQUFDZixJQUFJO01BQ25CLElBQUtXLFNBQVMsQ0FBRVgsSUFBSSxTQUFPLENBQUMsRUFBRztRQUM3QixJQUFJZ0IsTUFBTSxHQUFHSixhQUFhLENBQUVFLFNBQVMsRUFBRWQsSUFBSSxDQUFDaUIsRUFBRyxDQUFDO1FBQ2hEWixNQUFNLENBQUNDLElBQUksQ0FBQ08sY0FBYyxDQUFDLENBQUM5QixPQUFPLENBQUUsVUFBVXdCLFFBQVEsRUFBRztVQUN4RDtVQUNBLElBQUlqQixHQUFHLEdBQUd1QixjQUFjLENBQUVOLFFBQVEsQ0FBRSxDQUFDUyxNQUFNLEVBQUVoQixJQUFJLENBQUM7VUFDbEQsSUFBS1YsR0FBRyxFQUFHO1lBQ1RVLElBQUksQ0FBRU8sUUFBUSxDQUFFLEdBQUdqQixHQUFHO1VBQ3hCO1FBQ0YsQ0FBRSxDQUFDO01BQ0w7SUFDRixDQUFFLENBQUM7RUFDTDtFQUVBLFNBQVM0QixRQUFRQSxDQUFFQyxTQUFTLEVBQUc7SUFDN0IsSUFBSUMsR0FBRyxHQUFHO01BQ1JDLEtBQUssRUFBRSxDQUFDLENBQUM7TUFDVEMsS0FBSyxFQUFFLENBQUMsQ0FBQztNQUNUdkIsU0FBUyxFQUFFLENBQUM7SUFDZCxDQUFDO0lBRURvQixTQUFTLENBQUNHLEtBQUssQ0FBQ3ZDLE9BQU8sQ0FBRSxVQUFVd0MsSUFBSSxFQUFHO01BQ3hDSCxHQUFHLENBQUNFLEtBQUssQ0FBRUMsSUFBSSxDQUFDdkIsSUFBSSxDQUFDaUIsRUFBRSxDQUFFLEdBQUdNLElBQUk7SUFDbEMsQ0FBRSxDQUFDO0lBRUhKLFNBQVMsQ0FBQ0UsS0FBSyxDQUFDdEMsT0FBTyxDQUFFLFVBQVV5QyxJQUFJLEVBQUc7TUFDeENKLEdBQUcsQ0FBQ0MsS0FBSyxDQUFFRyxJQUFJLENBQUN4QixJQUFJLENBQUNpQixFQUFFLENBQUUsR0FBR08sSUFBSTtNQUVoQyxJQUFJekIsU0FBUyxHQUFHeUIsSUFBSSxDQUFDeEIsSUFBSSxDQUFDUSxjQUFjO01BRXhDVCxTQUFTLENBQUNoQixPQUFPLENBQUUsVUFBVTBDLE9BQU8sRUFBRztRQUNyQ0wsR0FBRyxDQUFDckIsU0FBUyxDQUFFMEIsT0FBTyxDQUFDUixFQUFFLENBQUUsR0FBR1EsT0FBTztNQUN2QyxDQUFFLENBQUM7SUFDTCxDQUFFLENBQUM7SUFFSCxPQUFPTCxHQUFHO0VBQ1o7RUFFQSxTQUFTTSxvQkFBb0JBLENBQUVQLFNBQVMsRUFBRUwsU0FBUyxFQUFHO0lBQ3BELElBQUlhLFlBQVksR0FBR2IsU0FBUyxDQUFDYyxhQUFhLENBQUMsY0FBYyxDQUFDO0lBQzFELElBQUlDLE1BQU0sR0FBR0YsWUFBWSxJQUFJQSxZQUFZLENBQUNHLGdCQUFnQixDQUFDLE9BQU8sQ0FBQztJQUVuRSxJQUFJLENBQUNELE1BQU0sSUFBSUEsTUFBTSxDQUFDdEMsTUFBTSxLQUFLLENBQUMsRUFBRTtNQUNsQztJQUNGO0lBRUEsSUFBSXdDLFVBQVUsR0FBRztNQUNmLFdBQVcsRUFBRTtJQUNmLENBQUM7SUFDRCxJQUFJQyxLQUFLLEdBQUdkLFFBQVEsQ0FBRUMsU0FBVSxDQUFDO0lBRWpDVSxNQUFNLENBQUM5QyxPQUFPLENBQUUsVUFBVWtELEtBQUssRUFBRztNQUNoQyxJQUFJQyxNQUFNLEdBQUdELEtBQUssQ0FBQ0UsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDckQsS0FBSyxDQUFDLEdBQUcsQ0FBQztNQUVwRHVCLE1BQU0sQ0FBQ0MsSUFBSSxDQUFFeUIsVUFBVyxDQUFDLENBQUNoRCxPQUFPLENBQUUsVUFBVXFELFFBQVEsRUFBRztRQUN0RCxJQUFJQyxDQUFDLEdBQUdKLEtBQUssQ0FBQ0wsYUFBYSxDQUFDLEdBQUcsQ0FBQztRQUNoQyxJQUFJdEMsR0FBRyxHQUFHK0MsQ0FBQyxDQUFDRixZQUFZLENBQUVDLFFBQVMsQ0FBQztRQUVwQyxJQUFLOUMsR0FBRyxFQUFHO1VBQ1QsSUFBSWlCLFFBQVEsR0FBR3dCLFVBQVUsQ0FBRUssUUFBUSxDQUFFO1VBRXJDRixNQUFNLENBQUNuRCxPQUFPLENBQUUsVUFBVWtDLEVBQUUsRUFBRztZQUM3QixJQUFLZSxLQUFLLENBQUNYLEtBQUssQ0FBRUosRUFBRSxDQUFFLElBQUllLEtBQUssQ0FBQ1YsS0FBSyxDQUFFTCxFQUFFLENBQUUsRUFBRztjQUM1QyxJQUFJcUIsRUFBRSxHQUFHTixLQUFLLENBQUNYLEtBQUssQ0FBRUosRUFBRSxDQUFFLElBQUllLEtBQUssQ0FBQ1YsS0FBSyxDQUFFTCxFQUFFLENBQUU7Y0FDL0NxQixFQUFFLENBQUN0QyxJQUFJLENBQUVPLFFBQVEsQ0FBRSxHQUFHakIsR0FBRztZQUMzQixDQUFDLE1BQ0ksSUFBSzBDLEtBQUssQ0FBQ2pDLFNBQVMsQ0FBRWtCLEVBQUUsQ0FBRSxFQUFHO2NBQ2hDLElBQUlxQixFQUFFLEdBQUdOLEtBQUssQ0FBQ2pDLFNBQVMsQ0FBRWtCLEVBQUUsQ0FBRTtjQUM5QnFCLEVBQUUsQ0FBQ0wsS0FBSyxDQUFFMUIsUUFBUSxDQUFFLEdBQUdqQixHQUFHO1lBQzVCO1VBQ0YsQ0FBRSxDQUFDO1FBQ0w7TUFDRixDQUFFLENBQUM7SUFDTCxDQUFFLENBQUM7RUFDTDtFQUVBaEIsU0FBUyxDQUFDaUUsT0FBTyxHQUFHLFVBQVN6QixTQUFTLEVBQUUwQixTQUFTLEVBQUU7SUFDakQsSUFBSXJCLFNBQVMsR0FBRy9DLFlBQVksQ0FBQ21FLE9BQU8sQ0FBQ3pCLFNBQVMsRUFBRTBCLFNBQVMsQ0FBQztJQUMxRCxJQUFJQyxPQUFPLEdBQUdwRSxnQkFBZ0IsQ0FBQ29FLE9BQU87SUFFdEMsSUFBSUEsT0FBTyxLQUFLLElBQUksSUFBSUEsT0FBTyxLQUFLLElBQUksSUFBSXBFLGdCQUFnQixDQUFDb0UsT0FBTyxLQUFLLFlBQVksRUFBRTtNQUNyRnBFLGdCQUFnQixDQUFDcUUsVUFBVSxHQUFHLEtBQUs7TUFDbkM7TUFDQWpDLGtCQUFrQixDQUFFVSxTQUFTLENBQUNHLEtBQUssRUFBRWpELGdCQUFnQixDQUFDc0UsU0FBUyxFQUFFdkUsWUFBWSxDQUFDd0UsVUFBVSxDQUFDQyxJQUFJLENBQUN6RSxZQUFZLENBQUMsRUFBRXFCLHFCQUFxQixFQUFFcUIsU0FBVSxDQUFDO01BQy9JTCxrQkFBa0IsQ0FBRVUsU0FBUyxDQUFDRSxLQUFLLEVBQUVoRCxnQkFBZ0IsQ0FBQ3lFLFNBQVMsRUFBRTFFLFlBQVksQ0FBQzJFLFlBQVksQ0FBQ0YsSUFBSSxDQUFDekUsWUFBWSxDQUFDLEVBQUV3QixxQkFBcUIsRUFBRWtCLFNBQVUsQ0FBQzs7TUFFako7TUFDQVksb0JBQW9CLENBQUVQLFNBQVMsRUFBRUwsU0FBVSxDQUFDO0lBQzlDO0lBRUEsT0FBT0ssU0FBUztFQUNsQixDQUFDO0VBRUQ3QyxTQUFTLENBQUMwRSxrQkFBa0IsR0FBRyxZQUFXO0lBQ3hDLE9BQU81RSxZQUFZLENBQUM0RSxrQkFBa0IsQ0FBQyxDQUFDO0VBQzFDLENBQUM7RUFFRCxPQUFPMUUsU0FBUztBQUNsQixDQUFDIiwiaWdub3JlTGlzdCI6W119\n//# sourceURL=webpack-internal:///./src/utilities/nwt-to-json-converter-factory.js\n"); /***/ }), @@ -225,7 +225,7 @@ eval("module.exports = function () {\n var sbgnmlToJson, elementUtilities;\n f \***************************************************/ /***/ ((module) => { -eval("/*\n * Extend default options and get current options by using this file\n */\n\nmodule.exports = function () {\n // default options\n var defaults = {\n // The path of core library images when sbgnviz is required from npm and the index html\n // file and node_modules are under the same folder then using the default value is fine\n imgPath: 'node_modules/sbgnviz/src/img',\n // Whether to fit labels to nodes\n fitLabelsToNodes: function fitLabelsToNodes() {\n return false;\n },\n fitLabelsToInfoboxes: function fitLabelsToInfoboxes() {\n return false;\n },\n // dynamic label size it may be 'small', 'regular', 'large'\n dynamicLabelSize: function dynamicLabelSize() {\n return 'regular';\n },\n // Whether to infer parent node on load \n inferNestingOnLoad: function inferNestingOnLoad() {\n return false;\n },\n // intial compound padding for all compound nodes \n compoundPadding: function compoundPadding() {\n return 0;\n },\n improveFlow: function improveFlow() {\n return true;\n },\n // Whether to adjust node label font size automatically.\n // If this option return false do not adjust label sizes according to node height uses node.data('font-size')\n // instead of doing it.\n adjustNodeLabelFontSizeAutomatically: function adjustNodeLabelFontSizeAutomatically() {\n return true;\n },\n // extra padding for compound nodes except for complexes\n extraCompartmentPadding: 14,\n //extra padding for complex compound nodes, refer to elementUtilities.getComplexPadding function to see details\n extraComplexPadding: 10,\n // Wether to display the complex's labels, like compartments.\n // Will also increase the paddings by extraCompoundPadding to make room for the name.\n showComplexName: true,\n // The selector of the component containing the sbgn network\n networkContainerSelector: '#sbgn-network-container',\n // Whether the actions are undoable, requires cytoscape-undo-redo extension\n undoable: true\n };\n var optionUtilities = function optionUtilities(param) {};\n\n // Extend the defaults options with the user options\n optionUtilities.extendOptions = function (options) {\n var result = {};\n for (var prop in defaults) {\n result[prop] = defaults[prop];\n }\n for (var prop in options) {\n result[prop] = options[prop];\n }\n optionUtilities.options = result;\n return options;\n };\n optionUtilities.getOptions = function () {\n return optionUtilities.options;\n };\n return optionUtilities;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbGl0aWVzL29wdGlvbi11dGlsaXRpZXMtZmFjdG9yeS5qcyIsIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJkZWZhdWx0cyIsImltZ1BhdGgiLCJmaXRMYWJlbHNUb05vZGVzIiwiZml0TGFiZWxzVG9JbmZvYm94ZXMiLCJkeW5hbWljTGFiZWxTaXplIiwiaW5mZXJOZXN0aW5nT25Mb2FkIiwiY29tcG91bmRQYWRkaW5nIiwiaW1wcm92ZUZsb3ciLCJhZGp1c3ROb2RlTGFiZWxGb250U2l6ZUF1dG9tYXRpY2FsbHkiLCJleHRyYUNvbXBhcnRtZW50UGFkZGluZyIsImV4dHJhQ29tcGxleFBhZGRpbmciLCJzaG93Q29tcGxleE5hbWUiLCJuZXR3b3JrQ29udGFpbmVyU2VsZWN0b3IiLCJ1bmRvYWJsZSIsIm9wdGlvblV0aWxpdGllcyIsInBhcmFtIiwiZXh0ZW5kT3B0aW9ucyIsIm9wdGlvbnMiLCJyZXN1bHQiLCJwcm9wIiwiZ2V0T3B0aW9ucyJdLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2JnbnZpei8uL3NyYy91dGlsaXRpZXMvb3B0aW9uLXV0aWxpdGllcy1mYWN0b3J5LmpzPzllNDciXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqICBFeHRlbmQgZGVmYXVsdCBvcHRpb25zIGFuZCBnZXQgY3VycmVudCBvcHRpb25zIGJ5IHVzaW5nIHRoaXMgZmlsZVxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGRlZmF1bHRzID0ge1xuICAgIC8vIFRoZSBwYXRoIG9mIGNvcmUgbGlicmFyeSBpbWFnZXMgd2hlbiBzYmdudml6IGlzIHJlcXVpcmVkIGZyb20gbnBtIGFuZCB0aGUgaW5kZXggaHRtbFxuICAgIC8vIGZpbGUgYW5kIG5vZGVfbW9kdWxlcyBhcmUgdW5kZXIgdGhlIHNhbWUgZm9sZGVyIHRoZW4gdXNpbmcgdGhlIGRlZmF1bHQgdmFsdWUgaXMgZmluZVxuICAgIGltZ1BhdGg6ICdub2RlX21vZHVsZXMvc2JnbnZpei9zcmMvaW1nJyxcbiAgICAvLyBXaGV0aGVyIHRvIGZpdCBsYWJlbHMgdG8gbm9kZXNcbiAgICBmaXRMYWJlbHNUb05vZGVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBmaXRMYWJlbHNUb0luZm9ib3hlczogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgLy8gZHluYW1pYyBsYWJlbCBzaXplIGl0IG1heSBiZSAnc21hbGwnLCAncmVndWxhcicsICdsYXJnZSdcbiAgICBkeW5hbWljTGFiZWxTaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gJ3JlZ3VsYXInO1xuICAgIH0sXG4gICAgLy8gV2hldGhlciB0byBpbmZlciBwYXJlbnQgbm9kZSBvbiBsb2FkIFxuICAgIGluZmVyTmVzdGluZ09uTG9hZDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgLy8gaW50aWFsIGNvbXBvdW5kIHBhZGRpbmcgZm9yIGFsbCBjb21wb3VuZCBub2RlcyBcbiAgICBjb21wb3VuZFBhZGRpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0sXG4gICAgaW1wcm92ZUZsb3c6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICAvLyBXaGV0aGVyIHRvIGFkanVzdCBub2RlIGxhYmVsIGZvbnQgc2l6ZSBhdXRvbWF0aWNhbGx5LlxuICAgIC8vIElmIHRoaXMgb3B0aW9uIHJldHVybiBmYWxzZSBkbyBub3QgYWRqdXN0IGxhYmVsIHNpemVzIGFjY29yZGluZyB0byBub2RlIGhlaWdodCB1c2VzIG5vZGUuZGF0YSgnZm9udC1zaXplJylcbiAgICAvLyBpbnN0ZWFkIG9mIGRvaW5nIGl0LlxuICAgIGFkanVzdE5vZGVMYWJlbEZvbnRTaXplQXV0b21hdGljYWxseTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIC8vIGV4dHJhIHBhZGRpbmcgZm9yIGNvbXBvdW5kIG5vZGVzIGV4Y2VwdCBmb3IgY29tcGxleGVzXG4gICAgZXh0cmFDb21wYXJ0bWVudFBhZGRpbmc6IDE0LFxuXG4gICAgLy9leHRyYSBwYWRkaW5nIGZvciBjb21wbGV4IGNvbXBvdW5kIG5vZGVzLCByZWZlciB0byBlbGVtZW50VXRpbGl0aWVzLmdldENvbXBsZXhQYWRkaW5nIGZ1bmN0aW9uIHRvIHNlZSBkZXRhaWxzXG4gICAgZXh0cmFDb21wbGV4UGFkZGluZzogMTAsXG4gICAgLy8gV2V0aGVyIHRvIGRpc3BsYXkgdGhlIGNvbXBsZXgncyBsYWJlbHMsIGxpa2UgY29tcGFydG1lbnRzLlxuICAgIC8vIFdpbGwgYWxzbyBpbmNyZWFzZSB0aGUgcGFkZGluZ3MgYnkgZXh0cmFDb21wb3VuZFBhZGRpbmcgdG8gbWFrZSByb29tIGZvciB0aGUgbmFtZS5cbiAgICBzaG93Q29tcGxleE5hbWU6IHRydWUsXG4gICAgLy8gVGhlIHNlbGVjdG9yIG9mIHRoZSBjb21wb25lbnQgY29udGFpbmluZyB0aGUgc2JnbiBuZXR3b3JrXG4gICAgbmV0d29ya0NvbnRhaW5lclNlbGVjdG9yOiAnI3NiZ24tbmV0d29yay1jb250YWluZXInLFxuICAgIC8vIFdoZXRoZXIgdGhlIGFjdGlvbnMgYXJlIHVuZG9hYmxlLCByZXF1aXJlcyBjeXRvc2NhcGUtdW5kby1yZWRvIGV4dGVuc2lvblxuICAgIHVuZG9hYmxlOiB0cnVlXG4gIH07XG5cbiAgdmFyIG9wdGlvblV0aWxpdGllcyA9IGZ1bmN0aW9uIChwYXJhbSkge1xuICB9O1xuXG4gIC8vIEV4dGVuZCB0aGUgZGVmYXVsdHMgb3B0aW9ucyB3aXRoIHRoZSB1c2VyIG9wdGlvbnNcbiAgb3B0aW9uVXRpbGl0aWVzLmV4dGVuZE9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHZhciByZXN1bHQgPSB7fTtcblxuICAgIGZvciAodmFyIHByb3AgaW4gZGVmYXVsdHMpIHtcbiAgICAgIHJlc3VsdFtwcm9wXSA9IGRlZmF1bHRzW3Byb3BdO1xuICAgIH1cblxuICAgIGZvciAodmFyIHByb3AgaW4gb3B0aW9ucykge1xuICAgICAgcmVzdWx0W3Byb3BdID0gb3B0aW9uc1twcm9wXTtcbiAgICB9XG5cbiAgICBvcHRpb25VdGlsaXRpZXMub3B0aW9ucyA9IHJlc3VsdDtcblxuICAgIHJldHVybiBvcHRpb25zO1xuICB9O1xuXG4gIG9wdGlvblV0aWxpdGllcy5nZXRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBvcHRpb25VdGlsaXRpZXMub3B0aW9ucztcbiAgfTtcblxuICByZXR1cm4gb3B0aW9uVXRpbGl0aWVzO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOztBQUVBQSxNQUFNLENBQUNDLE9BQU8sR0FBRyxZQUFZO0VBQzNCO0VBQ0EsSUFBSUMsUUFBUSxHQUFHO0lBQ2I7SUFDQTtJQUNBQyxPQUFPLEVBQUUsOEJBQThCO0lBQ3ZDO0lBQ0FDLGdCQUFnQixFQUFFLFNBQUFBLGlCQUFBLEVBQVk7TUFDNUIsT0FBTyxLQUFLO0lBQ2QsQ0FBQztJQUNEQyxvQkFBb0IsRUFBRSxTQUFBQSxxQkFBQSxFQUFZO01BQ2hDLE9BQU8sS0FBSztJQUNkLENBQUM7SUFDRDtJQUNBQyxnQkFBZ0IsRUFBRSxTQUFBQSxpQkFBQSxFQUFZO01BQzVCLE9BQU8sU0FBUztJQUNsQixDQUFDO0lBQ0Q7SUFDQUMsa0JBQWtCLEVBQUUsU0FBQUEsbUJBQUEsRUFBWTtNQUM5QixPQUFPLEtBQUs7SUFDZCxDQUFDO0lBQ0Q7SUFDQUMsZUFBZSxFQUFFLFNBQUFBLGdCQUFBLEVBQVk7TUFDM0IsT0FBTyxDQUFDO0lBQ1YsQ0FBQztJQUNEQyxXQUFXLEVBQUUsU0FBQUEsWUFBQSxFQUFZO01BQ3JCLE9BQU8sSUFBSTtJQUNmLENBQUM7SUFDRDtJQUNBO0lBQ0E7SUFDQUMsb0NBQW9DLEVBQUUsU0FBQUEscUNBQUEsRUFBVztNQUMvQyxPQUFPLElBQUk7SUFDYixDQUFDO0lBQ0Q7SUFDQUMsdUJBQXVCLEVBQUUsRUFBRTtJQUUzQjtJQUNBQyxtQkFBbUIsRUFBRSxFQUFFO0lBQ3ZCO0lBQ0E7SUFDQUMsZUFBZSxFQUFFLElBQUk7SUFDckI7SUFDQUMsd0JBQXdCLEVBQUUseUJBQXlCO0lBQ25EO0lBQ0FDLFFBQVEsRUFBRTtFQUNaLENBQUM7RUFFRCxJQUFJQyxlQUFlLEdBQUcsU0FBbEJBLGVBQWVBLENBQWFDLEtBQUssRUFBRSxDQUN2QyxDQUFDOztFQUVEO0VBQ0FELGVBQWUsQ0FBQ0UsYUFBYSxHQUFHLFVBQVVDLE9BQU8sRUFBRTtJQUNqRCxJQUFJQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO0lBRWYsS0FBSyxJQUFJQyxJQUFJLElBQUluQixRQUFRLEVBQUU7TUFDekJrQixNQUFNLENBQUNDLElBQUksQ0FBQyxHQUFHbkIsUUFBUSxDQUFDbUIsSUFBSSxDQUFDO0lBQy9CO0lBRUEsS0FBSyxJQUFJQSxJQUFJLElBQUlGLE9BQU8sRUFBRTtNQUN4QkMsTUFBTSxDQUFDQyxJQUFJLENBQUMsR0FBR0YsT0FBTyxDQUFDRSxJQUFJLENBQUM7SUFDOUI7SUFFQUwsZUFBZSxDQUFDRyxPQUFPLEdBQUdDLE1BQU07SUFFaEMsT0FBT0QsT0FBTztFQUNoQixDQUFDO0VBRURILGVBQWUsQ0FBQ00sVUFBVSxHQUFHLFlBQVk7SUFDdkMsT0FBT04sZUFBZSxDQUFDRyxPQUFPO0VBQ2hDLENBQUM7RUFFRCxPQUFPSCxlQUFlO0FBQ3hCLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=\n//# sourceURL=webpack-internal:///./src/utilities/option-utilities-factory.js\n"); +eval("/*\n * Extend default options and get current options by using this file\n */\n\nmodule.exports = function () {\n // default options\n var defaults = {\n // The path of core library images when sbgnviz is required from npm and the index html\n // file and node_modules are under the same folder then using the default value is fine\n imgPath: 'node_modules/sbgnviz/src/img',\n // Whether to fit labels to nodes\n fitLabelsToNodes: function fitLabelsToNodes() {\n return false;\n },\n fitLabelsToInfoboxes: function fitLabelsToInfoboxes() {\n return false;\n },\n // dynamic label size it may be 'small', 'regular', 'large'\n dynamicLabelSize: function dynamicLabelSize() {\n return 'regular';\n },\n // Whether to infer parent node on load \n inferNestingOnLoad: function inferNestingOnLoad() {\n return false;\n },\n // intial compound padding for all compound nodes \n compoundPadding: function compoundPadding() {\n return 0;\n },\n improveFlow: function improveFlow() {\n return true;\n },\n // Whether to adjust node label font size automatically.\n // If this option return false do not adjust label sizes according to node height uses node.data('font-size')\n // instead of doing it.\n adjustNodeLabelFontSizeAutomatically: function adjustNodeLabelFontSizeAutomatically() {\n return true;\n },\n // extra padding for compound nodes except for complexes\n extraCompartmentPadding: 14,\n //extra padding for complex compound nodes, refer to elementUtilities.getComplexPadding function to see details\n extraComplexPadding: 10,\n // Wether to display the complex's labels, like compartments.\n // Will also increase the paddings by extraCompoundPadding to make room for the name.\n showComplexName: true,\n // The selector of the component containing the sbgn network\n networkContainerSelector: '#sbgn-network-container',\n // Whether the actions are undoable, requires cytoscape-undo-redo extension\n undoable: true\n };\n var optionUtilities = function optionUtilities(param) {};\n\n // Extend the defaults options with the user options\n optionUtilities.extendOptions = function (options) {\n var result = {};\n for (var prop in defaults) {\n result[prop] = defaults[prop];\n }\n for (var prop in options) {\n result[prop] = options[prop];\n }\n optionUtilities.options = result;\n return options;\n };\n optionUtilities.getOptions = function () {\n return optionUtilities.options;\n };\n return optionUtilities;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbGl0aWVzL29wdGlvbi11dGlsaXRpZXMtZmFjdG9yeS5qcyIsIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJkZWZhdWx0cyIsImltZ1BhdGgiLCJmaXRMYWJlbHNUb05vZGVzIiwiZml0TGFiZWxzVG9JbmZvYm94ZXMiLCJkeW5hbWljTGFiZWxTaXplIiwiaW5mZXJOZXN0aW5nT25Mb2FkIiwiY29tcG91bmRQYWRkaW5nIiwiaW1wcm92ZUZsb3ciLCJhZGp1c3ROb2RlTGFiZWxGb250U2l6ZUF1dG9tYXRpY2FsbHkiLCJleHRyYUNvbXBhcnRtZW50UGFkZGluZyIsImV4dHJhQ29tcGxleFBhZGRpbmciLCJzaG93Q29tcGxleE5hbWUiLCJuZXR3b3JrQ29udGFpbmVyU2VsZWN0b3IiLCJ1bmRvYWJsZSIsIm9wdGlvblV0aWxpdGllcyIsInBhcmFtIiwiZXh0ZW5kT3B0aW9ucyIsIm9wdGlvbnMiLCJyZXN1bHQiLCJwcm9wIiwiZ2V0T3B0aW9ucyJdLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2JnbnZpei8uL3NyYy91dGlsaXRpZXMvb3B0aW9uLXV0aWxpdGllcy1mYWN0b3J5LmpzPzllNDciXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqICBFeHRlbmQgZGVmYXVsdCBvcHRpb25zIGFuZCBnZXQgY3VycmVudCBvcHRpb25zIGJ5IHVzaW5nIHRoaXMgZmlsZVxuICovXG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGRlZmF1bHRzID0ge1xuICAgIC8vIFRoZSBwYXRoIG9mIGNvcmUgbGlicmFyeSBpbWFnZXMgd2hlbiBzYmdudml6IGlzIHJlcXVpcmVkIGZyb20gbnBtIGFuZCB0aGUgaW5kZXggaHRtbFxuICAgIC8vIGZpbGUgYW5kIG5vZGVfbW9kdWxlcyBhcmUgdW5kZXIgdGhlIHNhbWUgZm9sZGVyIHRoZW4gdXNpbmcgdGhlIGRlZmF1bHQgdmFsdWUgaXMgZmluZVxuICAgIGltZ1BhdGg6ICdub2RlX21vZHVsZXMvc2JnbnZpei9zcmMvaW1nJyxcbiAgICAvLyBXaGV0aGVyIHRvIGZpdCBsYWJlbHMgdG8gbm9kZXNcbiAgICBmaXRMYWJlbHNUb05vZGVzOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcbiAgICBmaXRMYWJlbHNUb0luZm9ib3hlczogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgLy8gZHluYW1pYyBsYWJlbCBzaXplIGl0IG1heSBiZSAnc21hbGwnLCAncmVndWxhcicsICdsYXJnZSdcbiAgICBkeW5hbWljTGFiZWxTaXplOiBmdW5jdGlvbiAoKSB7XG4gICAgICByZXR1cm4gJ3JlZ3VsYXInO1xuICAgIH0sXG4gICAgLy8gV2hldGhlciB0byBpbmZlciBwYXJlbnQgbm9kZSBvbiBsb2FkIFxuICAgIGluZmVyTmVzdGluZ09uTG9hZDogZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0sXG4gICAgLy8gaW50aWFsIGNvbXBvdW5kIHBhZGRpbmcgZm9yIGFsbCBjb21wb3VuZCBub2RlcyBcbiAgICBjb21wb3VuZFBhZGRpbmc6IGZ1bmN0aW9uICgpIHtcbiAgICAgIHJldHVybiAwO1xuICAgIH0sXG4gICAgaW1wcm92ZUZsb3c6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSxcbiAgICAvLyBXaGV0aGVyIHRvIGFkanVzdCBub2RlIGxhYmVsIGZvbnQgc2l6ZSBhdXRvbWF0aWNhbGx5LlxuICAgIC8vIElmIHRoaXMgb3B0aW9uIHJldHVybiBmYWxzZSBkbyBub3QgYWRqdXN0IGxhYmVsIHNpemVzIGFjY29yZGluZyB0byBub2RlIGhlaWdodCB1c2VzIG5vZGUuZGF0YSgnZm9udC1zaXplJylcbiAgICAvLyBpbnN0ZWFkIG9mIGRvaW5nIGl0LlxuICAgIGFkanVzdE5vZGVMYWJlbEZvbnRTaXplQXV0b21hdGljYWxseTogZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9LFxuICAgIC8vIGV4dHJhIHBhZGRpbmcgZm9yIGNvbXBvdW5kIG5vZGVzIGV4Y2VwdCBmb3IgY29tcGxleGVzXG4gICAgZXh0cmFDb21wYXJ0bWVudFBhZGRpbmc6IDE0LFxuXG4gICAgLy9leHRyYSBwYWRkaW5nIGZvciBjb21wbGV4IGNvbXBvdW5kIG5vZGVzLCByZWZlciB0byBlbGVtZW50VXRpbGl0aWVzLmdldENvbXBsZXhQYWRkaW5nIGZ1bmN0aW9uIHRvIHNlZSBkZXRhaWxzXG4gICAgZXh0cmFDb21wbGV4UGFkZGluZzogMTAsXG4gICAgLy8gV2V0aGVyIHRvIGRpc3BsYXkgdGhlIGNvbXBsZXgncyBsYWJlbHMsIGxpa2UgY29tcGFydG1lbnRzLlxuICAgIC8vIFdpbGwgYWxzbyBpbmNyZWFzZSB0aGUgcGFkZGluZ3MgYnkgZXh0cmFDb21wb3VuZFBhZGRpbmcgdG8gbWFrZSByb29tIGZvciB0aGUgbmFtZS5cbiAgICBzaG93Q29tcGxleE5hbWU6IHRydWUsXG4gICAgLy8gVGhlIHNlbGVjdG9yIG9mIHRoZSBjb21wb25lbnQgY29udGFpbmluZyB0aGUgc2JnbiBuZXR3b3JrXG4gICAgbmV0d29ya0NvbnRhaW5lclNlbGVjdG9yOiAnI3NiZ24tbmV0d29yay1jb250YWluZXInLFxuICAgIC8vIFdoZXRoZXIgdGhlIGFjdGlvbnMgYXJlIHVuZG9hYmxlLCByZXF1aXJlcyBjeXRvc2NhcGUtdW5kby1yZWRvIGV4dGVuc2lvblxuICAgIHVuZG9hYmxlOiB0cnVlXG4gIH07XG5cbiAgdmFyIG9wdGlvblV0aWxpdGllcyA9IGZ1bmN0aW9uIChwYXJhbSkge1xuICB9O1xuXG4gIC8vIEV4dGVuZCB0aGUgZGVmYXVsdHMgb3B0aW9ucyB3aXRoIHRoZSB1c2VyIG9wdGlvbnNcbiAgb3B0aW9uVXRpbGl0aWVzLmV4dGVuZE9wdGlvbnMgPSBmdW5jdGlvbiAob3B0aW9ucykge1xuICAgIHZhciByZXN1bHQgPSB7fTtcblxuICAgIGZvciAodmFyIHByb3AgaW4gZGVmYXVsdHMpIHtcbiAgICAgIHJlc3VsdFtwcm9wXSA9IGRlZmF1bHRzW3Byb3BdO1xuICAgIH1cblxuICAgIGZvciAodmFyIHByb3AgaW4gb3B0aW9ucykge1xuICAgICAgcmVzdWx0W3Byb3BdID0gb3B0aW9uc1twcm9wXTtcbiAgICB9XG5cbiAgICBvcHRpb25VdGlsaXRpZXMub3B0aW9ucyA9IHJlc3VsdDtcblxuICAgIHJldHVybiBvcHRpb25zO1xuICB9O1xuXG4gIG9wdGlvblV0aWxpdGllcy5nZXRPcHRpb25zID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiBvcHRpb25VdGlsaXRpZXMub3B0aW9ucztcbiAgfTtcblxuICByZXR1cm4gb3B0aW9uVXRpbGl0aWVzO1xufTtcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOztBQUVBQSxNQUFNLENBQUNDLE9BQU8sR0FBRyxZQUFZO0VBQzNCO0VBQ0EsSUFBSUMsUUFBUSxHQUFHO0lBQ2I7SUFDQTtJQUNBQyxPQUFPLEVBQUUsOEJBQThCO0lBQ3ZDO0lBQ0FDLGdCQUFnQixFQUFFLFNBQWxCQSxnQkFBZ0JBLENBQUEsRUFBYztNQUM1QixPQUFPLEtBQUs7SUFDZCxDQUFDO0lBQ0RDLG9CQUFvQixFQUFFLFNBQXRCQSxvQkFBb0JBLENBQUEsRUFBYztNQUNoQyxPQUFPLEtBQUs7SUFDZCxDQUFDO0lBQ0Q7SUFDQUMsZ0JBQWdCLEVBQUUsU0FBbEJBLGdCQUFnQkEsQ0FBQSxFQUFjO01BQzVCLE9BQU8sU0FBUztJQUNsQixDQUFDO0lBQ0Q7SUFDQUMsa0JBQWtCLEVBQUUsU0FBcEJBLGtCQUFrQkEsQ0FBQSxFQUFjO01BQzlCLE9BQU8sS0FBSztJQUNkLENBQUM7SUFDRDtJQUNBQyxlQUFlLEVBQUUsU0FBakJBLGVBQWVBLENBQUEsRUFBYztNQUMzQixPQUFPLENBQUM7SUFDVixDQUFDO0lBQ0RDLFdBQVcsRUFBRSxTQUFiQSxXQUFXQSxDQUFBLEVBQWM7TUFDckIsT0FBTyxJQUFJO0lBQ2YsQ0FBQztJQUNEO0lBQ0E7SUFDQTtJQUNBQyxvQ0FBb0MsRUFBRSxTQUF0Q0Esb0NBQW9DQSxDQUFBLEVBQWE7TUFDL0MsT0FBTyxJQUFJO0lBQ2IsQ0FBQztJQUNEO0lBQ0FDLHVCQUF1QixFQUFFLEVBQUU7SUFFM0I7SUFDQUMsbUJBQW1CLEVBQUUsRUFBRTtJQUN2QjtJQUNBO0lBQ0FDLGVBQWUsRUFBRSxJQUFJO0lBQ3JCO0lBQ0FDLHdCQUF3QixFQUFFLHlCQUF5QjtJQUNuRDtJQUNBQyxRQUFRLEVBQUU7RUFDWixDQUFDO0VBRUQsSUFBSUMsZUFBZSxHQUFHLFNBQWxCQSxlQUFlQSxDQUFhQyxLQUFLLEVBQUUsQ0FDdkMsQ0FBQzs7RUFFRDtFQUNBRCxlQUFlLENBQUNFLGFBQWEsR0FBRyxVQUFVQyxPQUFPLEVBQUU7SUFDakQsSUFBSUMsTUFBTSxHQUFHLENBQUMsQ0FBQztJQUVmLEtBQUssSUFBSUMsSUFBSSxJQUFJbkIsUUFBUSxFQUFFO01BQ3pCa0IsTUFBTSxDQUFDQyxJQUFJLENBQUMsR0FBR25CLFFBQVEsQ0FBQ21CLElBQUksQ0FBQztJQUMvQjtJQUVBLEtBQUssSUFBSUEsSUFBSSxJQUFJRixPQUFPLEVBQUU7TUFDeEJDLE1BQU0sQ0FBQ0MsSUFBSSxDQUFDLEdBQUdGLE9BQU8sQ0FBQ0UsSUFBSSxDQUFDO0lBQzlCO0lBRUFMLGVBQWUsQ0FBQ0csT0FBTyxHQUFHQyxNQUFNO0lBRWhDLE9BQU9ELE9BQU87RUFDaEIsQ0FBQztFQUVESCxlQUFlLENBQUNNLFVBQVUsR0FBRyxZQUFZO0lBQ3ZDLE9BQU9OLGVBQWUsQ0FBQ0csT0FBTztFQUNoQyxDQUFDO0VBRUQsT0FBT0gsZUFBZTtBQUN4QixDQUFDIiwiaWdub3JlTGlzdCI6W119\n//# sourceURL=webpack-internal:///./src/utilities/option-utilities-factory.js\n"); /***/ }), @@ -235,7 +235,7 @@ eval("/*\n * Extend default options and get current options by using this file\ \*********************************************************/ /***/ ((module) => { -eval("module.exports = function () {\n var jsonToSbgnml, elementUtilities, cy;\n function sbgnmlToCd(param) {\n jsonToSbgnml = param.jsonToSbgnmlConverter;\n elementUtilities = param.elementUtilities;\n cy = param.sbgnCyInstance.getCy();\n }\n sbgnmlToCd.convert = function (xml, callback) {\n $.ajax({\n type: 'post',\n url: \"http://web.newteditor.org:8080/sbgnml2cd\",\n data: xml,\n success: function success(data) {\n callback(data);\n },\n error: function error(XMLHttpRequest) {\n callback(null);\n }\n });\n };\n return sbgnmlToCd;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbGl0aWVzL3NiZ25tbC10by1jZC1jb252ZXJ0ZXItZmFjdG9yeS5qcyIsIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJqc29uVG9TYmdubWwiLCJlbGVtZW50VXRpbGl0aWVzIiwiY3kiLCJzYmdubWxUb0NkIiwicGFyYW0iLCJqc29uVG9TYmdubWxDb252ZXJ0ZXIiLCJzYmduQ3lJbnN0YW5jZSIsImdldEN5IiwiY29udmVydCIsInhtbCIsImNhbGxiYWNrIiwiJCIsImFqYXgiLCJ0eXBlIiwidXJsIiwiZGF0YSIsInN1Y2Nlc3MiLCJlcnJvciIsIlhNTEh0dHBSZXF1ZXN0Il0sInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zYmdudml6Ly4vc3JjL3V0aWxpdGllcy9zYmdubWwtdG8tY2QtY29udmVydGVyLWZhY3RvcnkuanM/ODNhNiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuXG4gICAgdmFyIGpzb25Ub1NiZ25tbCwgZWxlbWVudFV0aWxpdGllcywgY3k7XG4gIFxuICAgIGZ1bmN0aW9uIHNiZ25tbFRvQ2QocGFyYW0pIHtcbiAgICAgIGpzb25Ub1NiZ25tbCA9IHBhcmFtLmpzb25Ub1NiZ25tbENvbnZlcnRlcjtcbiAgICAgIGVsZW1lbnRVdGlsaXRpZXMgPSBwYXJhbS5lbGVtZW50VXRpbGl0aWVzO1xuICAgICAgY3kgPSBwYXJhbS5zYmduQ3lJbnN0YW5jZS5nZXRDeSgpO1xuICAgIH1cbiAgXG4gXG4gICAgc2Jnbm1sVG9DZC5jb252ZXJ0ID0gZnVuY3Rpb24gKHhtbCwgY2FsbGJhY2spIHtcblxuICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICB0eXBlOiAncG9zdCcsICAgICAgICAgICAgIFxuICAgICAgICAgICAgdXJsOiBcImh0dHA6Ly93ZWIubmV3dGVkaXRvci5vcmc6ODA4MC9zYmdubWwyY2RcIixcbiAgICAgICAgICAgIGRhdGE6IHhtbCxcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZGF0YSk7ICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKFhNTEh0dHBSZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICBcbiAgICAgICAgXG4gICAgfVxuXG4gICAgcmV0dXJuIHNiZ25tbFRvQ2Q7XG4gIFxuICB9XG4gIFxuXG4iXSwibWFwcGluZ3MiOiJBQUFBQSxNQUFNLENBQUNDLE9BQU8sR0FBRyxZQUFXO0VBRXhCLElBQUlDLFlBQVksRUFBRUMsZ0JBQWdCLEVBQUVDLEVBQUU7RUFFdEMsU0FBU0MsVUFBVUEsQ0FBQ0MsS0FBSyxFQUFFO0lBQ3pCSixZQUFZLEdBQUdJLEtBQUssQ0FBQ0MscUJBQXFCO0lBQzFDSixnQkFBZ0IsR0FBR0csS0FBSyxDQUFDSCxnQkFBZ0I7SUFDekNDLEVBQUUsR0FBR0UsS0FBSyxDQUFDRSxjQUFjLENBQUNDLEtBQUssQ0FBQyxDQUFDO0VBQ25DO0VBR0FKLFVBQVUsQ0FBQ0ssT0FBTyxHQUFHLFVBQVVDLEdBQUcsRUFBRUMsUUFBUSxFQUFFO0lBRTNDQyxDQUFDLENBQUNDLElBQUksQ0FBQztNQUNGQyxJQUFJLEVBQUUsTUFBTTtNQUNaQyxHQUFHLEVBQUUsMENBQTBDO01BQy9DQyxJQUFJLEVBQUVOLEdBQUc7TUFDVE8sT0FBTyxFQUFFLFNBQUFBLFFBQVVELElBQUksRUFBRTtRQUNyQkwsUUFBUSxDQUFDSyxJQUFJLENBQUM7TUFDbEIsQ0FBQztNQUNERSxLQUFLLEVBQUUsU0FBQUEsTUFBVUMsY0FBYyxFQUFFO1FBQzdCUixRQUFRLENBQUMsSUFBSSxDQUFDO01BQ2xCO0lBQ0osQ0FBQyxDQUFDO0VBR04sQ0FBQztFQUVELE9BQU9QLFVBQVU7QUFFbkIsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==\n//# sourceURL=webpack-internal:///./src/utilities/sbgnml-to-cd-converter-factory.js\n"); +eval("module.exports = function () {\n var jsonToSbgnml, elementUtilities, cy;\n function sbgnmlToCd(param) {\n jsonToSbgnml = param.jsonToSbgnmlConverter;\n elementUtilities = param.elementUtilities;\n cy = param.sbgnCyInstance.getCy();\n }\n sbgnmlToCd.convert = function (xml, callback) {\n $.ajax({\n type: 'post',\n url: \"http://web.newteditor.org:8080/sbgnml2cd\",\n data: xml,\n success: function success(data) {\n callback(data);\n },\n error: function error(XMLHttpRequest) {\n callback(null);\n }\n });\n };\n return sbgnmlToCd;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbGl0aWVzL3NiZ25tbC10by1jZC1jb252ZXJ0ZXItZmFjdG9yeS5qcyIsIm5hbWVzIjpbIm1vZHVsZSIsImV4cG9ydHMiLCJqc29uVG9TYmdubWwiLCJlbGVtZW50VXRpbGl0aWVzIiwiY3kiLCJzYmdubWxUb0NkIiwicGFyYW0iLCJqc29uVG9TYmdubWxDb252ZXJ0ZXIiLCJzYmduQ3lJbnN0YW5jZSIsImdldEN5IiwiY29udmVydCIsInhtbCIsImNhbGxiYWNrIiwiJCIsImFqYXgiLCJ0eXBlIiwidXJsIiwiZGF0YSIsInN1Y2Nlc3MiLCJlcnJvciIsIlhNTEh0dHBSZXF1ZXN0Il0sInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zYmdudml6Ly4vc3JjL3V0aWxpdGllcy9zYmdubWwtdG8tY2QtY29udmVydGVyLWZhY3RvcnkuanM/ODNhNiJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuXG4gICAgdmFyIGpzb25Ub1NiZ25tbCwgZWxlbWVudFV0aWxpdGllcywgY3k7XG4gIFxuICAgIGZ1bmN0aW9uIHNiZ25tbFRvQ2QocGFyYW0pIHtcbiAgICAgIGpzb25Ub1NiZ25tbCA9IHBhcmFtLmpzb25Ub1NiZ25tbENvbnZlcnRlcjtcbiAgICAgIGVsZW1lbnRVdGlsaXRpZXMgPSBwYXJhbS5lbGVtZW50VXRpbGl0aWVzO1xuICAgICAgY3kgPSBwYXJhbS5zYmduQ3lJbnN0YW5jZS5nZXRDeSgpO1xuICAgIH1cbiAgXG4gXG4gICAgc2Jnbm1sVG9DZC5jb252ZXJ0ID0gZnVuY3Rpb24gKHhtbCwgY2FsbGJhY2spIHtcblxuICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICB0eXBlOiAncG9zdCcsICAgICAgICAgICAgIFxuICAgICAgICAgICAgdXJsOiBcImh0dHA6Ly93ZWIubmV3dGVkaXRvci5vcmc6ODA4MC9zYmdubWwyY2RcIixcbiAgICAgICAgICAgIGRhdGE6IHhtbCxcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soZGF0YSk7ICAgICAgICAgICAgICBcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKFhNTEh0dHBSZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2sobnVsbCk7ICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICBcbiAgICAgICAgXG4gICAgfVxuXG4gICAgcmV0dXJuIHNiZ25tbFRvQ2Q7XG4gIFxuICB9XG4gIFxuXG4iXSwibWFwcGluZ3MiOiJBQUFBQSxNQUFNLENBQUNDLE9BQU8sR0FBRyxZQUFXO0VBRXhCLElBQUlDLFlBQVksRUFBRUMsZ0JBQWdCLEVBQUVDLEVBQUU7RUFFdEMsU0FBU0MsVUFBVUEsQ0FBQ0MsS0FBSyxFQUFFO0lBQ3pCSixZQUFZLEdBQUdJLEtBQUssQ0FBQ0MscUJBQXFCO0lBQzFDSixnQkFBZ0IsR0FBR0csS0FBSyxDQUFDSCxnQkFBZ0I7SUFDekNDLEVBQUUsR0FBR0UsS0FBSyxDQUFDRSxjQUFjLENBQUNDLEtBQUssQ0FBQyxDQUFDO0VBQ25DO0VBR0FKLFVBQVUsQ0FBQ0ssT0FBTyxHQUFHLFVBQVVDLEdBQUcsRUFBRUMsUUFBUSxFQUFFO0lBRTNDQyxDQUFDLENBQUNDLElBQUksQ0FBQztNQUNGQyxJQUFJLEVBQUUsTUFBTTtNQUNaQyxHQUFHLEVBQUUsMENBQTBDO01BQy9DQyxJQUFJLEVBQUVOLEdBQUc7TUFDVE8sT0FBTyxFQUFFLFNBQVRBLE9BQU9BLENBQVlELElBQUksRUFBRTtRQUNyQkwsUUFBUSxDQUFDSyxJQUFJLENBQUM7TUFDbEIsQ0FBQztNQUNERSxLQUFLLEVBQUUsU0FBUEEsS0FBS0EsQ0FBWUMsY0FBYyxFQUFFO1FBQzdCUixRQUFRLENBQUMsSUFBSSxDQUFDO01BQ2xCO0lBQ0osQ0FBQyxDQUFDO0VBR04sQ0FBQztFQUVELE9BQU9QLFVBQVU7QUFFbkIsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==\n//# sourceURL=webpack-internal:///./src/utilities/sbgnml-to-cd-converter-factory.js\n"); /***/ }), @@ -245,7 +245,7 @@ eval("module.exports = function () {\n var jsonToSbgnml, elementUtilities, cy;\ \***********************************************************/ /***/ ((module) => { -eval("module.exports = function () {\n var jsonToSbgnml, elementUtilities, cy;\n function sbgnmlToGpml(param) {\n jsonToSbgnml = param.jsonToSbgnmlConverter;\n elementUtilities = param.elementUtilities;\n cy = param.sbgnCyInstance.getCy();\n }\n sbgnmlToGpml.convert = function (xml, callback) {\n var conversionApiUrl = \"https://minerva-dev.lcsb.uni.lu/minerva/api/convert/SBGN-ML:GPML\";\n return $.ajax({\n type: 'post',\n url: conversionApiUrl,\n contentType: \"application/xml\",\n data: xml,\n dataType: \"text\",\n success: function success(data, textStatus, xhr) {\n if (xhr.status !== 200) {\n callback({\n result: false,\n error: data,\n message: \"Invalid response code: \" + xhr.status\n });\n } else {\n callback({\n result: true,\n message: data,\n error: \"\"\n });\n }\n },\n error: function error(_error) {\n callback({\n result: false,\n error: _error,\n message: \"\"\n });\n },\n fail: function fail(error) {\n callback({\n result: false,\n error: error,\n message: \"\"\n });\n }\n });\n };\n return sbgnmlToGpml;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbGl0aWVzL3NiZ25tbC10by1ncG1sLWNvbnZlcnRlci1mYWN0b3J5LmpzIiwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsImpzb25Ub1NiZ25tbCIsImVsZW1lbnRVdGlsaXRpZXMiLCJjeSIsInNiZ25tbFRvR3BtbCIsInBhcmFtIiwianNvblRvU2Jnbm1sQ29udmVydGVyIiwic2JnbkN5SW5zdGFuY2UiLCJnZXRDeSIsImNvbnZlcnQiLCJ4bWwiLCJjYWxsYmFjayIsImNvbnZlcnNpb25BcGlVcmwiLCIkIiwiYWpheCIsInR5cGUiLCJ1cmwiLCJjb250ZW50VHlwZSIsImRhdGEiLCJkYXRhVHlwZSIsInN1Y2Nlc3MiLCJ0ZXh0U3RhdHVzIiwieGhyIiwic3RhdHVzIiwicmVzdWx0IiwiZXJyb3IiLCJtZXNzYWdlIiwiZmFpbCJdLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2JnbnZpei8uL3NyYy91dGlsaXRpZXMvc2Jnbm1sLXRvLWdwbWwtY29udmVydGVyLWZhY3RvcnkuanM/MDY3YSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblxuICAgIHZhciBqc29uVG9TYmdubWwsIGVsZW1lbnRVdGlsaXRpZXMsIGN5O1xuXG4gICAgZnVuY3Rpb24gc2Jnbm1sVG9HcG1sKHBhcmFtKSB7XG4gICAgICAgIGpzb25Ub1NiZ25tbCA9IHBhcmFtLmpzb25Ub1NiZ25tbENvbnZlcnRlcjtcbiAgICAgICAgZWxlbWVudFV0aWxpdGllcyA9IHBhcmFtLmVsZW1lbnRVdGlsaXRpZXM7XG4gICAgICAgIGN5ID0gcGFyYW0uc2JnbkN5SW5zdGFuY2UuZ2V0Q3koKTtcbiAgICB9XG5cblxuICAgIHNiZ25tbFRvR3BtbC5jb252ZXJ0ID0gZnVuY3Rpb24gKHhtbCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGNvbnZlcnNpb25BcGlVcmwgPSBcImh0dHBzOi8vbWluZXJ2YS1kZXYubGNzYi51bmkubHUvbWluZXJ2YS9hcGkvY29udmVydC9TQkdOLU1MOkdQTUxcIjtcblxuICAgICAgICByZXR1cm4gJC5hamF4KHtcbiAgICAgICAgICAgIHR5cGU6ICdwb3N0JyxcbiAgICAgICAgICAgIHVybDogY29udmVyc2lvbkFwaVVybCxcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBcImFwcGxpY2F0aW9uL3htbFwiLFxuICAgICAgICAgICAgZGF0YTogeG1sLFxuICAgICAgICAgICAgZGF0YVR5cGU6IFwidGV4dFwiLFxuICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEsIHRleHRTdGF0dXMsIHhocikge1xuICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzICE9PSAyMDApIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soe3Jlc3VsdDogZmFsc2UsIGVycm9yOiBkYXRhLCBtZXNzYWdlOiBcIkludmFsaWQgcmVzcG9uc2UgY29kZTogXCIgKyB4aHIuc3RhdHVzfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2soe3Jlc3VsdDogdHJ1ZSwgbWVzc2FnZTogZGF0YSwgZXJyb3I6IFwiXCJ9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHtyZXN1bHQ6IGZhbHNlLCBlcnJvcjogZXJyb3IsIG1lc3NhZ2U6IFwiXCJ9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBmYWlsOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh7cmVzdWx0OiBmYWxzZSwgZXJyb3I6IGVycm9yLCBtZXNzYWdlOiBcIlwifSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KVxuICAgIH1cblxuICAgIHJldHVybiBzYmdubWxUb0dwbWw7XG5cbn1cbiAgIl0sIm1hcHBpbmdzIjoiQUFBQUEsTUFBTSxDQUFDQyxPQUFPLEdBQUcsWUFBWTtFQUV6QixJQUFJQyxZQUFZLEVBQUVDLGdCQUFnQixFQUFFQyxFQUFFO0VBRXRDLFNBQVNDLFlBQVlBLENBQUNDLEtBQUssRUFBRTtJQUN6QkosWUFBWSxHQUFHSSxLQUFLLENBQUNDLHFCQUFxQjtJQUMxQ0osZ0JBQWdCLEdBQUdHLEtBQUssQ0FBQ0gsZ0JBQWdCO0lBQ3pDQyxFQUFFLEdBQUdFLEtBQUssQ0FBQ0UsY0FBYyxDQUFDQyxLQUFLLENBQUMsQ0FBQztFQUNyQztFQUdBSixZQUFZLENBQUNLLE9BQU8sR0FBRyxVQUFVQyxHQUFHLEVBQUVDLFFBQVEsRUFBRTtJQUM1QyxJQUFJQyxnQkFBZ0IsR0FBRyxrRUFBa0U7SUFFekYsT0FBT0MsQ0FBQyxDQUFDQyxJQUFJLENBQUM7TUFDVkMsSUFBSSxFQUFFLE1BQU07TUFDWkMsR0FBRyxFQUFFSixnQkFBZ0I7TUFDckJLLFdBQVcsRUFBRSxpQkFBaUI7TUFDOUJDLElBQUksRUFBRVIsR0FBRztNQUNUUyxRQUFRLEVBQUUsTUFBTTtNQUNoQkMsT0FBTyxFQUFFLFNBQUFBLFFBQVVGLElBQUksRUFBRUcsVUFBVSxFQUFFQyxHQUFHLEVBQUU7UUFDdEMsSUFBSUEsR0FBRyxDQUFDQyxNQUFNLEtBQUssR0FBRyxFQUFFO1VBQ3BCWixRQUFRLENBQUM7WUFBQ2EsTUFBTSxFQUFFLEtBQUs7WUFBRUMsS0FBSyxFQUFFUCxJQUFJO1lBQUVRLE9BQU8sRUFBRSx5QkFBeUIsR0FBR0osR0FBRyxDQUFDQztVQUFNLENBQUMsQ0FBQztRQUMzRixDQUFDLE1BQU07VUFDSFosUUFBUSxDQUFDO1lBQUNhLE1BQU0sRUFBRSxJQUFJO1lBQUVFLE9BQU8sRUFBRVIsSUFBSTtZQUFFTyxLQUFLLEVBQUU7VUFBRSxDQUFDLENBQUM7UUFDdEQ7TUFDSixDQUFDO01BQ0RBLEtBQUssRUFBRSxTQUFBQSxNQUFVQSxNQUFLLEVBQUU7UUFDcEJkLFFBQVEsQ0FBQztVQUFDYSxNQUFNLEVBQUUsS0FBSztVQUFFQyxLQUFLLEVBQUVBLE1BQUs7VUFBRUMsT0FBTyxFQUFFO1FBQUUsQ0FBQyxDQUFDO01BQ3hELENBQUM7TUFDREMsSUFBSSxFQUFFLFNBQUFBLEtBQVVGLEtBQUssRUFBRTtRQUNuQmQsUUFBUSxDQUFDO1VBQUNhLE1BQU0sRUFBRSxLQUFLO1VBQUVDLEtBQUssRUFBRUEsS0FBSztVQUFFQyxPQUFPLEVBQUU7UUFBRSxDQUFDLENBQUM7TUFDeEQ7SUFDSixDQUFDLENBQUM7RUFDTixDQUFDO0VBRUQsT0FBT3RCLFlBQVk7QUFFdkIsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==\n//# sourceURL=webpack-internal:///./src/utilities/sbgnml-to-gpml-converter-factory.js\n"); +eval("module.exports = function () {\n var jsonToSbgnml, elementUtilities, cy;\n function sbgnmlToGpml(param) {\n jsonToSbgnml = param.jsonToSbgnmlConverter;\n elementUtilities = param.elementUtilities;\n cy = param.sbgnCyInstance.getCy();\n }\n sbgnmlToGpml.convert = function (xml, callback) {\n var conversionApiUrl = \"https://minerva-service.lcsb.uni.lu/minerva/api/convert/SBGN-ML:GPML\";\n return $.ajax({\n type: 'post',\n url: conversionApiUrl,\n contentType: \"application/xml\",\n data: xml,\n dataType: \"text\",\n success: function success(data, textStatus, xhr) {\n if (xhr.status !== 200) {\n callback({\n result: false,\n error: data,\n message: \"Invalid response code: \" + xhr.status\n });\n } else {\n callback({\n result: true,\n message: data,\n error: \"\"\n });\n }\n },\n error: function error(_error) {\n callback({\n result: false,\n error: _error,\n message: \"\"\n });\n },\n fail: function fail(error) {\n callback({\n result: false,\n error: error,\n message: \"\"\n });\n }\n });\n };\n return sbgnmlToGpml;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbGl0aWVzL3NiZ25tbC10by1ncG1sLWNvbnZlcnRlci1mYWN0b3J5LmpzIiwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsImpzb25Ub1NiZ25tbCIsImVsZW1lbnRVdGlsaXRpZXMiLCJjeSIsInNiZ25tbFRvR3BtbCIsInBhcmFtIiwianNvblRvU2Jnbm1sQ29udmVydGVyIiwic2JnbkN5SW5zdGFuY2UiLCJnZXRDeSIsImNvbnZlcnQiLCJ4bWwiLCJjYWxsYmFjayIsImNvbnZlcnNpb25BcGlVcmwiLCIkIiwiYWpheCIsInR5cGUiLCJ1cmwiLCJjb250ZW50VHlwZSIsImRhdGEiLCJkYXRhVHlwZSIsInN1Y2Nlc3MiLCJ0ZXh0U3RhdHVzIiwieGhyIiwic3RhdHVzIiwicmVzdWx0IiwiZXJyb3IiLCJtZXNzYWdlIiwiZmFpbCJdLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2JnbnZpei8uL3NyYy91dGlsaXRpZXMvc2Jnbm1sLXRvLWdwbWwtY29udmVydGVyLWZhY3RvcnkuanM/MDY3YSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblxuICAgIHZhciBqc29uVG9TYmdubWwsIGVsZW1lbnRVdGlsaXRpZXMsIGN5O1xuXG4gICAgZnVuY3Rpb24gc2Jnbm1sVG9HcG1sKHBhcmFtKSB7XG4gICAgICAgIGpzb25Ub1NiZ25tbCA9IHBhcmFtLmpzb25Ub1NiZ25tbENvbnZlcnRlcjtcbiAgICAgICAgZWxlbWVudFV0aWxpdGllcyA9IHBhcmFtLmVsZW1lbnRVdGlsaXRpZXM7XG4gICAgICAgIGN5ID0gcGFyYW0uc2JnbkN5SW5zdGFuY2UuZ2V0Q3koKTtcbiAgICB9XG5cblxuICAgIHNiZ25tbFRvR3BtbC5jb252ZXJ0ID0gZnVuY3Rpb24gKHhtbCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGNvbnZlcnNpb25BcGlVcmwgPSBcImh0dHBzOi8vbWluZXJ2YS1zZXJ2aWNlLmxjc2IudW5pLmx1L21pbmVydmEvYXBpL2NvbnZlcnQvU0JHTi1NTDpHUE1MXCI7XG5cbiAgICAgICAgcmV0dXJuICQuYWpheCh7XG4gICAgICAgICAgICB0eXBlOiAncG9zdCcsXG4gICAgICAgICAgICB1cmw6IGNvbnZlcnNpb25BcGlVcmwsXG4gICAgICAgICAgICBjb250ZW50VHlwZTogXCJhcHBsaWNhdGlvbi94bWxcIixcbiAgICAgICAgICAgIGRhdGE6IHhtbCxcbiAgICAgICAgICAgIGRhdGFUeXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhLCB0ZXh0U3RhdHVzLCB4aHIpIHtcbiAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHtyZXN1bHQ6IGZhbHNlLCBlcnJvcjogZGF0YSwgbWVzc2FnZTogXCJJbnZhbGlkIHJlc3BvbnNlIGNvZGU6IFwiICsgeGhyLnN0YXR1c30pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHtyZXN1bHQ6IHRydWUsIG1lc3NhZ2U6IGRhdGEsIGVycm9yOiBcIlwifSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh7cmVzdWx0OiBmYWxzZSwgZXJyb3I6IGVycm9yLCBtZXNzYWdlOiBcIlwifSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmFpbDogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soe3Jlc3VsdDogZmFsc2UsIGVycm9yOiBlcnJvciwgbWVzc2FnZTogXCJcIn0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gc2Jnbm1sVG9HcG1sO1xuXG59XG4gICJdLCJtYXBwaW5ncyI6IkFBQUFBLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHLFlBQVk7RUFFekIsSUFBSUMsWUFBWSxFQUFFQyxnQkFBZ0IsRUFBRUMsRUFBRTtFQUV0QyxTQUFTQyxZQUFZQSxDQUFDQyxLQUFLLEVBQUU7SUFDekJKLFlBQVksR0FBR0ksS0FBSyxDQUFDQyxxQkFBcUI7SUFDMUNKLGdCQUFnQixHQUFHRyxLQUFLLENBQUNILGdCQUFnQjtJQUN6Q0MsRUFBRSxHQUFHRSxLQUFLLENBQUNFLGNBQWMsQ0FBQ0MsS0FBSyxDQUFDLENBQUM7RUFDckM7RUFHQUosWUFBWSxDQUFDSyxPQUFPLEdBQUcsVUFBVUMsR0FBRyxFQUFFQyxRQUFRLEVBQUU7SUFDNUMsSUFBSUMsZ0JBQWdCLEdBQUcsc0VBQXNFO0lBRTdGLE9BQU9DLENBQUMsQ0FBQ0MsSUFBSSxDQUFDO01BQ1ZDLElBQUksRUFBRSxNQUFNO01BQ1pDLEdBQUcsRUFBRUosZ0JBQWdCO01BQ3JCSyxXQUFXLEVBQUUsaUJBQWlCO01BQzlCQyxJQUFJLEVBQUVSLEdBQUc7TUFDVFMsUUFBUSxFQUFFLE1BQU07TUFDaEJDLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFZRixJQUFJLEVBQUVHLFVBQVUsRUFBRUMsR0FBRyxFQUFFO1FBQ3RDLElBQUlBLEdBQUcsQ0FBQ0MsTUFBTSxLQUFLLEdBQUcsRUFBRTtVQUNwQlosUUFBUSxDQUFDO1lBQUNhLE1BQU0sRUFBRSxLQUFLO1lBQUVDLEtBQUssRUFBRVAsSUFBSTtZQUFFUSxPQUFPLEVBQUUseUJBQXlCLEdBQUdKLEdBQUcsQ0FBQ0M7VUFBTSxDQUFDLENBQUM7UUFDM0YsQ0FBQyxNQUFNO1VBQ0haLFFBQVEsQ0FBQztZQUFDYSxNQUFNLEVBQUUsSUFBSTtZQUFFRSxPQUFPLEVBQUVSLElBQUk7WUFBRU8sS0FBSyxFQUFFO1VBQUUsQ0FBQyxDQUFDO1FBQ3REO01BQ0osQ0FBQztNQUNEQSxLQUFLLEVBQUUsU0FBUEEsS0FBS0EsQ0FBWUEsTUFBSyxFQUFFO1FBQ3BCZCxRQUFRLENBQUM7VUFBQ2EsTUFBTSxFQUFFLEtBQUs7VUFBRUMsS0FBSyxFQUFFQSxNQUFLO1VBQUVDLE9BQU8sRUFBRTtRQUFFLENBQUMsQ0FBQztNQUN4RCxDQUFDO01BQ0RDLElBQUksRUFBRSxTQUFOQSxJQUFJQSxDQUFZRixLQUFLLEVBQUU7UUFDbkJkLFFBQVEsQ0FBQztVQUFDYSxNQUFNLEVBQUUsS0FBSztVQUFFQyxLQUFLLEVBQUVBLEtBQUs7VUFBRUMsT0FBTyxFQUFFO1FBQUUsQ0FBQyxDQUFDO01BQ3hEO0lBQ0osQ0FBQyxDQUFDO0VBQ04sQ0FBQztFQUVELE9BQU90QixZQUFZO0FBRXZCLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=\n//# sourceURL=webpack-internal:///./src/utilities/sbgnml-to-gpml-converter-factory.js\n"); /***/ }), @@ -265,7 +265,7 @@ eval("var libsbgnjs = __webpack_require__(/*! libsbgn.js */ \"libsbgn.js\");\nva \***********************************************************/ /***/ ((module) => { -eval("module.exports = function () {\n var jsonToSbgnml, elementUtilities, cy;\n function sbgnmlToSbml(param) {\n jsonToSbgnml = param.jsonToSbgnmlConverter;\n elementUtilities = param.elementUtilities;\n cy = param.sbgnCyInstance.getCy();\n }\n sbgnmlToSbml.convert = function (xml, callback) {\n var conversionApiUrl = \"https://minerva-dev.lcsb.uni.lu/minerva/api/convert/SBGN-ML:SBML\";\n return $.ajax({\n type: 'post',\n url: conversionApiUrl,\n contentType: \"text/plain; charset=UTF-8\",\n data: xml,\n dataType: \"text\",\n success: function success(data, textStatus, xhr) {\n if (xhr.status !== 200) {\n callback({\n result: false,\n error: data,\n message: \"Invalid response code: \" + xhr.status\n });\n } else {\n callback({\n result: true,\n message: data,\n error: \"\"\n });\n }\n },\n error: function error(_error) {\n callback({\n result: false,\n error: _error,\n message: \"\"\n });\n },\n fail: function fail(error) {\n callback({\n result: false,\n error: error,\n message: \"\"\n });\n }\n });\n };\n return sbgnmlToSbml;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbGl0aWVzL3NiZ25tbC10by1zYm1sLWNvbnZlcnRlci1mYWN0b3J5LmpzIiwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsImpzb25Ub1NiZ25tbCIsImVsZW1lbnRVdGlsaXRpZXMiLCJjeSIsInNiZ25tbFRvU2JtbCIsInBhcmFtIiwianNvblRvU2Jnbm1sQ29udmVydGVyIiwic2JnbkN5SW5zdGFuY2UiLCJnZXRDeSIsImNvbnZlcnQiLCJ4bWwiLCJjYWxsYmFjayIsImNvbnZlcnNpb25BcGlVcmwiLCIkIiwiYWpheCIsInR5cGUiLCJ1cmwiLCJjb250ZW50VHlwZSIsImRhdGEiLCJkYXRhVHlwZSIsInN1Y2Nlc3MiLCJ0ZXh0U3RhdHVzIiwieGhyIiwic3RhdHVzIiwicmVzdWx0IiwiZXJyb3IiLCJtZXNzYWdlIiwiZmFpbCJdLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2JnbnZpei8uL3NyYy91dGlsaXRpZXMvc2Jnbm1sLXRvLXNibWwtY29udmVydGVyLWZhY3RvcnkuanM/NGVjMCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblxuICAgIHZhciBqc29uVG9TYmdubWwsIGVsZW1lbnRVdGlsaXRpZXMsIGN5O1xuXG4gICAgZnVuY3Rpb24gc2Jnbm1sVG9TYm1sKHBhcmFtKSB7XG4gICAgICAgIGpzb25Ub1NiZ25tbCA9IHBhcmFtLmpzb25Ub1NiZ25tbENvbnZlcnRlcjtcbiAgICAgICAgZWxlbWVudFV0aWxpdGllcyA9IHBhcmFtLmVsZW1lbnRVdGlsaXRpZXM7XG4gICAgICAgIGN5ID0gcGFyYW0uc2JnbkN5SW5zdGFuY2UuZ2V0Q3koKTtcbiAgICB9XG5cblxuICAgIHNiZ25tbFRvU2JtbC5jb252ZXJ0ID0gZnVuY3Rpb24gKHhtbCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGNvbnZlcnNpb25BcGlVcmwgPSBcImh0dHBzOi8vbWluZXJ2YS1kZXYubGNzYi51bmkubHUvbWluZXJ2YS9hcGkvY29udmVydC9TQkdOLU1MOlNCTUxcIjtcblxuICAgICAgICByZXR1cm4gJC5hamF4KHtcbiAgICAgICAgICAgIHR5cGU6ICdwb3N0JyxcbiAgICAgICAgICAgIHVybDogY29udmVyc2lvbkFwaVVybCxcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiBcInRleHQvcGxhaW47IGNoYXJzZXQ9VVRGLThcIixcbiAgICAgICAgICAgIGRhdGE6IHhtbCxcbiAgICAgICAgICAgIGRhdGFUeXBlOiBcInRleHRcIixcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhLCB0ZXh0U3RhdHVzLCB4aHIpIHtcbiAgICAgICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHtyZXN1bHQ6IGZhbHNlLCBlcnJvcjogZGF0YSwgbWVzc2FnZTogXCJJbnZhbGlkIHJlc3BvbnNlIGNvZGU6IFwiICsgeGhyLnN0YXR1c30pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKHtyZXN1bHQ6IHRydWUsIG1lc3NhZ2U6IGRhdGEsIGVycm9yOiBcIlwifSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh7cmVzdWx0OiBmYWxzZSwgZXJyb3I6IGVycm9yLCBtZXNzYWdlOiBcIlwifSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmFpbDogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soe3Jlc3VsdDogZmFsc2UsIGVycm9yOiBlcnJvciwgbWVzc2FnZTogXCJcIn0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gc2Jnbm1sVG9TYm1sO1xuXG59XG4gICJdLCJtYXBwaW5ncyI6IkFBQUFBLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHLFlBQVk7RUFFekIsSUFBSUMsWUFBWSxFQUFFQyxnQkFBZ0IsRUFBRUMsRUFBRTtFQUV0QyxTQUFTQyxZQUFZQSxDQUFDQyxLQUFLLEVBQUU7SUFDekJKLFlBQVksR0FBR0ksS0FBSyxDQUFDQyxxQkFBcUI7SUFDMUNKLGdCQUFnQixHQUFHRyxLQUFLLENBQUNILGdCQUFnQjtJQUN6Q0MsRUFBRSxHQUFHRSxLQUFLLENBQUNFLGNBQWMsQ0FBQ0MsS0FBSyxDQUFDLENBQUM7RUFDckM7RUFHQUosWUFBWSxDQUFDSyxPQUFPLEdBQUcsVUFBVUMsR0FBRyxFQUFFQyxRQUFRLEVBQUU7SUFDNUMsSUFBSUMsZ0JBQWdCLEdBQUcsa0VBQWtFO0lBRXpGLE9BQU9DLENBQUMsQ0FBQ0MsSUFBSSxDQUFDO01BQ1ZDLElBQUksRUFBRSxNQUFNO01BQ1pDLEdBQUcsRUFBRUosZ0JBQWdCO01BQ3JCSyxXQUFXLEVBQUUsMkJBQTJCO01BQ3hDQyxJQUFJLEVBQUVSLEdBQUc7TUFDVFMsUUFBUSxFQUFFLE1BQU07TUFDaEJDLE9BQU8sRUFBRSxTQUFBQSxRQUFVRixJQUFJLEVBQUVHLFVBQVUsRUFBRUMsR0FBRyxFQUFFO1FBQ3RDLElBQUlBLEdBQUcsQ0FBQ0MsTUFBTSxLQUFLLEdBQUcsRUFBRTtVQUNwQlosUUFBUSxDQUFDO1lBQUNhLE1BQU0sRUFBRSxLQUFLO1lBQUVDLEtBQUssRUFBRVAsSUFBSTtZQUFFUSxPQUFPLEVBQUUseUJBQXlCLEdBQUdKLEdBQUcsQ0FBQ0M7VUFBTSxDQUFDLENBQUM7UUFDM0YsQ0FBQyxNQUFNO1VBQ0haLFFBQVEsQ0FBQztZQUFDYSxNQUFNLEVBQUUsSUFBSTtZQUFFRSxPQUFPLEVBQUVSLElBQUk7WUFBRU8sS0FBSyxFQUFFO1VBQUUsQ0FBQyxDQUFDO1FBQ3REO01BQ0osQ0FBQztNQUNEQSxLQUFLLEVBQUUsU0FBQUEsTUFBVUEsTUFBSyxFQUFFO1FBQ3BCZCxRQUFRLENBQUM7VUFBQ2EsTUFBTSxFQUFFLEtBQUs7VUFBRUMsS0FBSyxFQUFFQSxNQUFLO1VBQUVDLE9BQU8sRUFBRTtRQUFFLENBQUMsQ0FBQztNQUN4RCxDQUFDO01BQ0RDLElBQUksRUFBRSxTQUFBQSxLQUFVRixLQUFLLEVBQUU7UUFDbkJkLFFBQVEsQ0FBQztVQUFDYSxNQUFNLEVBQUUsS0FBSztVQUFFQyxLQUFLLEVBQUVBLEtBQUs7VUFBRUMsT0FBTyxFQUFFO1FBQUUsQ0FBQyxDQUFDO01BQ3hEO0lBQ0osQ0FBQyxDQUFDO0VBQ04sQ0FBQztFQUVELE9BQU90QixZQUFZO0FBRXZCLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=\n//# sourceURL=webpack-internal:///./src/utilities/sbgnml-to-sbml-converter-factory.js\n"); +eval("module.exports = function () {\n var jsonToSbgnml, elementUtilities, cy;\n function sbgnmlToSbml(param) {\n jsonToSbgnml = param.jsonToSbgnmlConverter;\n elementUtilities = param.elementUtilities;\n cy = param.sbgnCyInstance.getCy();\n }\n sbgnmlToSbml.convert = function (xml, callback) {\n var conversionApiUrl = \"https://minerva-service.lcsb.uni.lu/minerva/api/convert/SBGN-ML:SBML\";\n return $.ajax({\n type: 'post',\n url: conversionApiUrl,\n contentType: \"text/plain; charset=UTF-8\",\n data: xml,\n dataType: \"text\",\n success: function success(data, textStatus, xhr) {\n if (xhr.status !== 200) {\n callback({\n result: false,\n error: data,\n message: \"Invalid response code: \" + xhr.status\n });\n } else {\n callback({\n result: true,\n message: data,\n error: \"\"\n });\n }\n },\n error: function error(_error) {\n callback({\n result: false,\n error: _error,\n message: \"\"\n });\n },\n fail: function fail(error) {\n callback({\n result: false,\n error: error,\n message: \"\"\n });\n }\n });\n };\n return sbgnmlToSbml;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbGl0aWVzL3NiZ25tbC10by1zYm1sLWNvbnZlcnRlci1mYWN0b3J5LmpzIiwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsImpzb25Ub1NiZ25tbCIsImVsZW1lbnRVdGlsaXRpZXMiLCJjeSIsInNiZ25tbFRvU2JtbCIsInBhcmFtIiwianNvblRvU2Jnbm1sQ29udmVydGVyIiwic2JnbkN5SW5zdGFuY2UiLCJnZXRDeSIsImNvbnZlcnQiLCJ4bWwiLCJjYWxsYmFjayIsImNvbnZlcnNpb25BcGlVcmwiLCIkIiwiYWpheCIsInR5cGUiLCJ1cmwiLCJjb250ZW50VHlwZSIsImRhdGEiLCJkYXRhVHlwZSIsInN1Y2Nlc3MiLCJ0ZXh0U3RhdHVzIiwieGhyIiwic3RhdHVzIiwicmVzdWx0IiwiZXJyb3IiLCJtZXNzYWdlIiwiZmFpbCJdLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2JnbnZpei8uL3NyYy91dGlsaXRpZXMvc2Jnbm1sLXRvLXNibWwtY29udmVydGVyLWZhY3RvcnkuanM/NGVjMCJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblxuICAgIHZhciBqc29uVG9TYmdubWwsIGVsZW1lbnRVdGlsaXRpZXMsIGN5O1xuXG4gICAgZnVuY3Rpb24gc2Jnbm1sVG9TYm1sKHBhcmFtKSB7XG4gICAgICAgIGpzb25Ub1NiZ25tbCA9IHBhcmFtLmpzb25Ub1NiZ25tbENvbnZlcnRlcjtcbiAgICAgICAgZWxlbWVudFV0aWxpdGllcyA9IHBhcmFtLmVsZW1lbnRVdGlsaXRpZXM7XG4gICAgICAgIGN5ID0gcGFyYW0uc2JnbkN5SW5zdGFuY2UuZ2V0Q3koKTtcbiAgICB9XG5cblxuICAgIHNiZ25tbFRvU2JtbC5jb252ZXJ0ID0gZnVuY3Rpb24gKHhtbCwgY2FsbGJhY2spIHtcbiAgICAgICAgdmFyIGNvbnZlcnNpb25BcGlVcmwgPSBcImh0dHBzOi8vbWluZXJ2YS1zZXJ2aWNlLmxjc2IudW5pLmx1L21pbmVydmEvYXBpL2NvbnZlcnQvU0JHTi1NTDpTQk1MXCI7XG5cbiAgICAgICAgcmV0dXJuICQuYWpheCh7XG4gICAgICAgICAgICB0eXBlOiAncG9zdCcsXG4gICAgICAgICAgICB1cmw6IGNvbnZlcnNpb25BcGlVcmwsXG4gICAgICAgICAgICBjb250ZW50VHlwZTogXCJ0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XCIsXG4gICAgICAgICAgICBkYXRhOiB4bWwsXG4gICAgICAgICAgICBkYXRhVHlwZTogXCJ0ZXh0XCIsXG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSwgdGV4dFN0YXR1cywgeGhyKSB7XG4gICAgICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7cmVzdWx0OiBmYWxzZSwgZXJyb3I6IGRhdGEsIG1lc3NhZ2U6IFwiSW52YWxpZCByZXNwb25zZSBjb2RlOiBcIiArIHhoci5zdGF0dXN9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjYWxsYmFjayh7cmVzdWx0OiB0cnVlLCBtZXNzYWdlOiBkYXRhLCBlcnJvcjogXCJcIn0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soe3Jlc3VsdDogZmFsc2UsIGVycm9yOiBlcnJvciwgbWVzc2FnZTogXCJcIn0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGZhaWw6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHtyZXN1bHQ6IGZhbHNlLCBlcnJvcjogZXJyb3IsIG1lc3NhZ2U6IFwiXCJ9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgfVxuXG4gICAgcmV0dXJuIHNiZ25tbFRvU2JtbDtcblxufVxuICBcbiJdLCJtYXBwaW5ncyI6IkFBQUFBLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHLFlBQVk7RUFFekIsSUFBSUMsWUFBWSxFQUFFQyxnQkFBZ0IsRUFBRUMsRUFBRTtFQUV0QyxTQUFTQyxZQUFZQSxDQUFDQyxLQUFLLEVBQUU7SUFDekJKLFlBQVksR0FBR0ksS0FBSyxDQUFDQyxxQkFBcUI7SUFDMUNKLGdCQUFnQixHQUFHRyxLQUFLLENBQUNILGdCQUFnQjtJQUN6Q0MsRUFBRSxHQUFHRSxLQUFLLENBQUNFLGNBQWMsQ0FBQ0MsS0FBSyxDQUFDLENBQUM7RUFDckM7RUFHQUosWUFBWSxDQUFDSyxPQUFPLEdBQUcsVUFBVUMsR0FBRyxFQUFFQyxRQUFRLEVBQUU7SUFDNUMsSUFBSUMsZ0JBQWdCLEdBQUcsc0VBQXNFO0lBRTdGLE9BQU9DLENBQUMsQ0FBQ0MsSUFBSSxDQUFDO01BQ1ZDLElBQUksRUFBRSxNQUFNO01BQ1pDLEdBQUcsRUFBRUosZ0JBQWdCO01BQ3JCSyxXQUFXLEVBQUUsMkJBQTJCO01BQ3hDQyxJQUFJLEVBQUVSLEdBQUc7TUFDVFMsUUFBUSxFQUFFLE1BQU07TUFDaEJDLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFZRixJQUFJLEVBQUVHLFVBQVUsRUFBRUMsR0FBRyxFQUFFO1FBQ3RDLElBQUlBLEdBQUcsQ0FBQ0MsTUFBTSxLQUFLLEdBQUcsRUFBRTtVQUNwQlosUUFBUSxDQUFDO1lBQUNhLE1BQU0sRUFBRSxLQUFLO1lBQUVDLEtBQUssRUFBRVAsSUFBSTtZQUFFUSxPQUFPLEVBQUUseUJBQXlCLEdBQUdKLEdBQUcsQ0FBQ0M7VUFBTSxDQUFDLENBQUM7UUFDM0YsQ0FBQyxNQUFNO1VBQ0haLFFBQVEsQ0FBQztZQUFDYSxNQUFNLEVBQUUsSUFBSTtZQUFFRSxPQUFPLEVBQUVSLElBQUk7WUFBRU8sS0FBSyxFQUFFO1VBQUUsQ0FBQyxDQUFDO1FBQ3REO01BQ0osQ0FBQztNQUNEQSxLQUFLLEVBQUUsU0FBUEEsS0FBS0EsQ0FBWUEsTUFBSyxFQUFFO1FBQ3BCZCxRQUFRLENBQUM7VUFBQ2EsTUFBTSxFQUFFLEtBQUs7VUFBRUMsS0FBSyxFQUFFQSxNQUFLO1VBQUVDLE9BQU8sRUFBRTtRQUFFLENBQUMsQ0FBQztNQUN4RCxDQUFDO01BQ0RDLElBQUksRUFBRSxTQUFOQSxJQUFJQSxDQUFZRixLQUFLLEVBQUU7UUFDbkJkLFFBQVEsQ0FBQztVQUFDYSxNQUFNLEVBQUUsS0FBSztVQUFFQyxLQUFLLEVBQUVBLEtBQUs7VUFBRUMsT0FBTyxFQUFFO1FBQUUsQ0FBQyxDQUFDO01BQ3hEO0lBQ0osQ0FBQyxDQUFDO0VBQ04sQ0FBQztFQUVELE9BQU90QixZQUFZO0FBRXZCLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=\n//# sourceURL=webpack-internal:///./src/utilities/sbgnml-to-sbml-converter-factory.js\n"); /***/ }), @@ -285,7 +285,7 @@ eval("function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterable \***********************************************************/ /***/ ((module) => { -eval("module.exports = function () {\n var jsonToSbgnml, elementUtilities, cy;\n function sbmlToSbgnml(param) {\n jsonToSbgnml = param.jsonToSbgnmlConverter;\n elementUtilities = param.elementUtilities;\n cy = param.sbgnCyInstance.getCy();\n }\n sbmlToSbgnml.convert = function (xml, callback) {\n var conversionApiUrl = \"https://minerva-dev.lcsb.uni.lu/minerva/api/convert/SBML:SBGN-ML\";\n return $.ajax({\n type: 'post',\n url: conversionApiUrl,\n contentType: \"text/plain; charset=UTF-8\",\n data: xml,\n dataType: \"text\",\n success: function success(data, textStatus, xhr) {\n if (xhr.status !== 200) {\n callback({\n result: false,\n error: data,\n message: \"Invalid response code: \" + xhr.status\n });\n } else {\n callback({\n result: true,\n message: data,\n error: \"\"\n });\n }\n },\n error: function error(_error) {\n callback({\n result: false,\n error: _error,\n message: \"\"\n });\n },\n fail: function fail(error) {\n callback({\n result: false,\n error: error,\n message: \"\"\n });\n }\n });\n };\n return sbmlToSbgnml;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbGl0aWVzL3NibWwtdG8tc2Jnbm1sLWNvbnZlcnRlci1mYWN0b3J5LmpzIiwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsImpzb25Ub1NiZ25tbCIsImVsZW1lbnRVdGlsaXRpZXMiLCJjeSIsInNibWxUb1NiZ25tbCIsInBhcmFtIiwianNvblRvU2Jnbm1sQ29udmVydGVyIiwic2JnbkN5SW5zdGFuY2UiLCJnZXRDeSIsImNvbnZlcnQiLCJ4bWwiLCJjYWxsYmFjayIsImNvbnZlcnNpb25BcGlVcmwiLCIkIiwiYWpheCIsInR5cGUiLCJ1cmwiLCJjb250ZW50VHlwZSIsImRhdGEiLCJkYXRhVHlwZSIsInN1Y2Nlc3MiLCJ0ZXh0U3RhdHVzIiwieGhyIiwic3RhdHVzIiwicmVzdWx0IiwiZXJyb3IiLCJtZXNzYWdlIiwiZmFpbCJdLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2JnbnZpei8uL3NyYy91dGlsaXRpZXMvc2JtbC10by1zYmdubWwtY29udmVydGVyLWZhY3RvcnkuanM/NGYyYSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuXG4gIHZhciBqc29uVG9TYmdubWwsIGVsZW1lbnRVdGlsaXRpZXMsIGN5O1xuXG4gIGZ1bmN0aW9uIHNibWxUb1NiZ25tbChwYXJhbSkge1xuICAgIGpzb25Ub1NiZ25tbCA9IHBhcmFtLmpzb25Ub1NiZ25tbENvbnZlcnRlcjtcbiAgICBlbGVtZW50VXRpbGl0aWVzID0gcGFyYW0uZWxlbWVudFV0aWxpdGllcztcbiAgICBjeSA9IHBhcmFtLnNiZ25DeUluc3RhbmNlLmdldEN5KCk7XG4gIH1cblxuXG4gIHNibWxUb1NiZ25tbC5jb252ZXJ0ID0gZnVuY3Rpb24gKHhtbCwgY2FsbGJhY2spIHtcbiAgICB2YXIgY29udmVyc2lvbkFwaVVybCA9IFwiaHR0cHM6Ly9taW5lcnZhLWRldi5sY3NiLnVuaS5sdS9taW5lcnZhL2FwaS9jb252ZXJ0L1NCTUw6U0JHTi1NTFwiO1xuXG4gICAgcmV0dXJuICQuYWpheCh7XG4gICAgICAgIHR5cGU6ICdwb3N0JyxcbiAgICAgICAgdXJsOiBjb252ZXJzaW9uQXBpVXJsLFxuICAgICAgICBjb250ZW50VHlwZTogXCJ0ZXh0L3BsYWluOyBjaGFyc2V0PVVURi04XCIsXG4gICAgICAgIGRhdGE6IHhtbCxcbiAgICAgICAgZGF0YVR5cGU6IFwidGV4dFwiLFxuICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSwgdGV4dFN0YXR1cywgeGhyKSB7XG4gICAgICAgICAgICBpZiAoeGhyLnN0YXR1cyAhPT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgY2FsbGJhY2soe3Jlc3VsdDogZmFsc2UsIGVycm9yOiBkYXRhLCBtZXNzYWdlOiBcIkludmFsaWQgcmVzcG9uc2UgY29kZTogXCIgKyB4aHIuc3RhdHVzfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHtyZXN1bHQ6IHRydWUsIG1lc3NhZ2U6IGRhdGEsIGVycm9yOiBcIlwifSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZXJyb3IpIHtcbiAgICAgICAgICAgIGNhbGxiYWNrKHtyZXN1bHQ6IGZhbHNlLCBlcnJvcjogZXJyb3IsIG1lc3NhZ2U6IFwiXCJ9KTtcbiAgICAgICAgfSxcbiAgICAgICAgZmFpbDogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBjYWxsYmFjayh7cmVzdWx0OiBmYWxzZSwgZXJyb3I6IGVycm9yLCBtZXNzYWdlOiBcIlwifSk7XG4gICAgICAgIH0sXG4gICAgfSlcbiAgICAgIFxuICB9XG5cbiAgcmV0dXJuIHNibWxUb1NiZ25tbDtcblxufVxuIl0sIm1hcHBpbmdzIjoiQUFBQUEsTUFBTSxDQUFDQyxPQUFPLEdBQUcsWUFBVztFQUUxQixJQUFJQyxZQUFZLEVBQUVDLGdCQUFnQixFQUFFQyxFQUFFO0VBRXRDLFNBQVNDLFlBQVlBLENBQUNDLEtBQUssRUFBRTtJQUMzQkosWUFBWSxHQUFHSSxLQUFLLENBQUNDLHFCQUFxQjtJQUMxQ0osZ0JBQWdCLEdBQUdHLEtBQUssQ0FBQ0gsZ0JBQWdCO0lBQ3pDQyxFQUFFLEdBQUdFLEtBQUssQ0FBQ0UsY0FBYyxDQUFDQyxLQUFLLENBQUMsQ0FBQztFQUNuQztFQUdBSixZQUFZLENBQUNLLE9BQU8sR0FBRyxVQUFVQyxHQUFHLEVBQUVDLFFBQVEsRUFBRTtJQUM5QyxJQUFJQyxnQkFBZ0IsR0FBRyxrRUFBa0U7SUFFekYsT0FBT0MsQ0FBQyxDQUFDQyxJQUFJLENBQUM7TUFDVkMsSUFBSSxFQUFFLE1BQU07TUFDWkMsR0FBRyxFQUFFSixnQkFBZ0I7TUFDckJLLFdBQVcsRUFBRSwyQkFBMkI7TUFDeENDLElBQUksRUFBRVIsR0FBRztNQUNUUyxRQUFRLEVBQUUsTUFBTTtNQUNoQkMsT0FBTyxFQUFFLFNBQUFBLFFBQVVGLElBQUksRUFBRUcsVUFBVSxFQUFFQyxHQUFHLEVBQUU7UUFDdEMsSUFBSUEsR0FBRyxDQUFDQyxNQUFNLEtBQUssR0FBRyxFQUFFO1VBQ3BCWixRQUFRLENBQUM7WUFBQ2EsTUFBTSxFQUFFLEtBQUs7WUFBRUMsS0FBSyxFQUFFUCxJQUFJO1lBQUVRLE9BQU8sRUFBRSx5QkFBeUIsR0FBR0osR0FBRyxDQUFDQztVQUFNLENBQUMsQ0FBQztRQUMzRixDQUFDLE1BQU07VUFDSFosUUFBUSxDQUFDO1lBQUNhLE1BQU0sRUFBRSxJQUFJO1lBQUVFLE9BQU8sRUFBRVIsSUFBSTtZQUFFTyxLQUFLLEVBQUU7VUFBRSxDQUFDLENBQUM7UUFDdEQ7TUFDSixDQUFDO01BQ0RBLEtBQUssRUFBRSxTQUFBQSxNQUFVQSxNQUFLLEVBQUU7UUFDcEJkLFFBQVEsQ0FBQztVQUFDYSxNQUFNLEVBQUUsS0FBSztVQUFFQyxLQUFLLEVBQUVBLE1BQUs7VUFBRUMsT0FBTyxFQUFFO1FBQUUsQ0FBQyxDQUFDO01BQ3hELENBQUM7TUFDREMsSUFBSSxFQUFFLFNBQUFBLEtBQVVGLEtBQUssRUFBRTtRQUNuQmQsUUFBUSxDQUFDO1VBQUNhLE1BQU0sRUFBRSxLQUFLO1VBQUVDLEtBQUssRUFBRUEsS0FBSztVQUFFQyxPQUFPLEVBQUU7UUFBRSxDQUFDLENBQUM7TUFDeEQ7SUFDSixDQUFDLENBQUM7RUFFSixDQUFDO0VBRUQsT0FBT3RCLFlBQVk7QUFFckIsQ0FBQyIsImlnbm9yZUxpc3QiOltdfQ==\n//# sourceURL=webpack-internal:///./src/utilities/sbml-to-sbgnml-converter-factory.js\n"); +eval("module.exports = function () {\n var jsonToSbgnml, elementUtilities, cy;\n function sbmlToSbgnml(param) {\n jsonToSbgnml = param.jsonToSbgnmlConverter;\n elementUtilities = param.elementUtilities;\n cy = param.sbgnCyInstance.getCy();\n }\n sbmlToSbgnml.convert = function (xml, callback) {\n var conversionApiUrl = \"https://minerva-service.lcsb.uni.lu/minerva/api/convert/SBML:SBGN-ML\";\n return $.ajax({\n type: 'post',\n url: conversionApiUrl,\n contentType: \"text/plain; charset=UTF-8\",\n data: xml,\n dataType: \"text\",\n success: function success(data, textStatus, xhr) {\n if (xhr.status !== 200) {\n callback({\n result: false,\n error: data,\n message: \"Invalid response code: \" + xhr.status\n });\n } else {\n callback({\n result: true,\n message: data,\n error: \"\"\n });\n }\n },\n error: function error(_error) {\n callback({\n result: false,\n error: _error,\n message: \"\"\n });\n },\n fail: function fail(error) {\n callback({\n result: false,\n error: error,\n message: \"\"\n });\n }\n });\n };\n return sbmlToSbgnml;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbGl0aWVzL3NibWwtdG8tc2Jnbm1sLWNvbnZlcnRlci1mYWN0b3J5LmpzIiwibmFtZXMiOlsibW9kdWxlIiwiZXhwb3J0cyIsImpzb25Ub1NiZ25tbCIsImVsZW1lbnRVdGlsaXRpZXMiLCJjeSIsInNibWxUb1NiZ25tbCIsInBhcmFtIiwianNvblRvU2Jnbm1sQ29udmVydGVyIiwic2JnbkN5SW5zdGFuY2UiLCJnZXRDeSIsImNvbnZlcnQiLCJ4bWwiLCJjYWxsYmFjayIsImNvbnZlcnNpb25BcGlVcmwiLCIkIiwiYWpheCIsInR5cGUiLCJ1cmwiLCJjb250ZW50VHlwZSIsImRhdGEiLCJkYXRhVHlwZSIsInN1Y2Nlc3MiLCJ0ZXh0U3RhdHVzIiwieGhyIiwic3RhdHVzIiwicmVzdWx0IiwiZXJyb3IiLCJtZXNzYWdlIiwiZmFpbCJdLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2JnbnZpei8uL3NyYy91dGlsaXRpZXMvc2JtbC10by1zYmdubWwtY29udmVydGVyLWZhY3RvcnkuanM/NGYyYSJdLCJzb3VyY2VzQ29udGVudCI6WyJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKCkge1xuXG4gIHZhciBqc29uVG9TYmdubWwsIGVsZW1lbnRVdGlsaXRpZXMsIGN5O1xuXG4gIGZ1bmN0aW9uIHNibWxUb1NiZ25tbChwYXJhbSkge1xuICAgIGpzb25Ub1NiZ25tbCA9IHBhcmFtLmpzb25Ub1NiZ25tbENvbnZlcnRlcjtcbiAgICBlbGVtZW50VXRpbGl0aWVzID0gcGFyYW0uZWxlbWVudFV0aWxpdGllcztcbiAgICBjeSA9IHBhcmFtLnNiZ25DeUluc3RhbmNlLmdldEN5KCk7XG4gIH1cblxuXG4gIHNibWxUb1NiZ25tbC5jb252ZXJ0ID0gZnVuY3Rpb24gKHhtbCwgY2FsbGJhY2spIHtcbiAgICB2YXIgY29udmVyc2lvbkFwaVVybCA9IFwiaHR0cHM6Ly9taW5lcnZhLXNlcnZpY2UubGNzYi51bmkubHUvbWluZXJ2YS9hcGkvY29udmVydC9TQk1MOlNCR04tTUxcIjtcblxuICAgIHJldHVybiAkLmFqYXgoe1xuICAgICAgICB0eXBlOiAncG9zdCcsXG4gICAgICAgIHVybDogY29udmVyc2lvbkFwaVVybCxcbiAgICAgICAgY29udGVudFR5cGU6IFwidGV4dC9wbGFpbjsgY2hhcnNldD1VVEYtOFwiLFxuICAgICAgICBkYXRhOiB4bWwsXG4gICAgICAgIGRhdGFUeXBlOiBcInRleHRcIixcbiAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEsIHRleHRTdGF0dXMsIHhocikge1xuICAgICAgICAgICAgaWYgKHhoci5zdGF0dXMgIT09IDIwMCkge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrKHtyZXN1bHQ6IGZhbHNlLCBlcnJvcjogZGF0YSwgbWVzc2FnZTogXCJJbnZhbGlkIHJlc3BvbnNlIGNvZGU6IFwiICsgeGhyLnN0YXR1c30pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFjayh7cmVzdWx0OiB0cnVlLCBtZXNzYWdlOiBkYXRhLCBlcnJvcjogXCJcIn0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGVycm9yKSB7XG4gICAgICAgICAgICBjYWxsYmFjayh7cmVzdWx0OiBmYWxzZSwgZXJyb3I6IGVycm9yLCBtZXNzYWdlOiBcIlwifSk7XG4gICAgICAgIH0sXG4gICAgICAgIGZhaWw6IGZ1bmN0aW9uIChlcnJvcikge1xuICAgICAgICAgICAgY2FsbGJhY2soe3Jlc3VsdDogZmFsc2UsIGVycm9yOiBlcnJvciwgbWVzc2FnZTogXCJcIn0pO1xuICAgICAgICB9LFxuICAgIH0pXG4gICAgICBcbiAgfVxuXG4gIHJldHVybiBzYm1sVG9TYmdubWw7XG5cbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUFBLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHLFlBQVc7RUFFMUIsSUFBSUMsWUFBWSxFQUFFQyxnQkFBZ0IsRUFBRUMsRUFBRTtFQUV0QyxTQUFTQyxZQUFZQSxDQUFDQyxLQUFLLEVBQUU7SUFDM0JKLFlBQVksR0FBR0ksS0FBSyxDQUFDQyxxQkFBcUI7SUFDMUNKLGdCQUFnQixHQUFHRyxLQUFLLENBQUNILGdCQUFnQjtJQUN6Q0MsRUFBRSxHQUFHRSxLQUFLLENBQUNFLGNBQWMsQ0FBQ0MsS0FBSyxDQUFDLENBQUM7RUFDbkM7RUFHQUosWUFBWSxDQUFDSyxPQUFPLEdBQUcsVUFBVUMsR0FBRyxFQUFFQyxRQUFRLEVBQUU7SUFDOUMsSUFBSUMsZ0JBQWdCLEdBQUcsc0VBQXNFO0lBRTdGLE9BQU9DLENBQUMsQ0FBQ0MsSUFBSSxDQUFDO01BQ1ZDLElBQUksRUFBRSxNQUFNO01BQ1pDLEdBQUcsRUFBRUosZ0JBQWdCO01BQ3JCSyxXQUFXLEVBQUUsMkJBQTJCO01BQ3hDQyxJQUFJLEVBQUVSLEdBQUc7TUFDVFMsUUFBUSxFQUFFLE1BQU07TUFDaEJDLE9BQU8sRUFBRSxTQUFUQSxPQUFPQSxDQUFZRixJQUFJLEVBQUVHLFVBQVUsRUFBRUMsR0FBRyxFQUFFO1FBQ3RDLElBQUlBLEdBQUcsQ0FBQ0MsTUFBTSxLQUFLLEdBQUcsRUFBRTtVQUNwQlosUUFBUSxDQUFDO1lBQUNhLE1BQU0sRUFBRSxLQUFLO1lBQUVDLEtBQUssRUFBRVAsSUFBSTtZQUFFUSxPQUFPLEVBQUUseUJBQXlCLEdBQUdKLEdBQUcsQ0FBQ0M7VUFBTSxDQUFDLENBQUM7UUFDM0YsQ0FBQyxNQUFNO1VBQ0haLFFBQVEsQ0FBQztZQUFDYSxNQUFNLEVBQUUsSUFBSTtZQUFFRSxPQUFPLEVBQUVSLElBQUk7WUFBRU8sS0FBSyxFQUFFO1VBQUUsQ0FBQyxDQUFDO1FBQ3REO01BQ0osQ0FBQztNQUNEQSxLQUFLLEVBQUUsU0FBUEEsS0FBS0EsQ0FBWUEsTUFBSyxFQUFFO1FBQ3BCZCxRQUFRLENBQUM7VUFBQ2EsTUFBTSxFQUFFLEtBQUs7VUFBRUMsS0FBSyxFQUFFQSxNQUFLO1VBQUVDLE9BQU8sRUFBRTtRQUFFLENBQUMsQ0FBQztNQUN4RCxDQUFDO01BQ0RDLElBQUksRUFBRSxTQUFOQSxJQUFJQSxDQUFZRixLQUFLLEVBQUU7UUFDbkJkLFFBQVEsQ0FBQztVQUFDYSxNQUFNLEVBQUUsS0FBSztVQUFFQyxLQUFLLEVBQUVBLEtBQUs7VUFBRUMsT0FBTyxFQUFFO1FBQUUsQ0FBQyxDQUFDO01BQ3hEO0lBQ0osQ0FBQyxDQUFDO0VBRUosQ0FBQztFQUVELE9BQU90QixZQUFZO0FBRXJCLENBQUMiLCJpZ25vcmVMaXN0IjpbXX0=\n//# sourceURL=webpack-internal:///./src/utilities/sbml-to-sbgnml-converter-factory.js\n"); /***/ }), @@ -325,7 +325,7 @@ eval("var libsbgnjs = __webpack_require__(/*! libsbgn.js */ \"libsbgn.js\");\nva \*****************************************/ /***/ ((module) => { -eval("/*\n * Text utilities for common usage\n */\n\nvar textUtilities = {\n // same purpose as previous one, but with clearer responsibility\n truncate: function truncate(text, font, width) {\n text = text + \"\";\n var context = document.createElement('canvas').getContext(\"2d\");\n context.font = font;\n // check trivial case first, when entire text is already small enough\n if (context.measureText(text).width < width) {\n return text;\n } else {\n var ellipsis = \"..\";\n // if ellipsis alone is already too large\n if (context.measureText(ellipsis).width > width) {\n return \"\";\n }\n var finalLength; // this should always have a value after the loop\n for (var i = 0; i < text.length; i++) {\n var subtext = text.substring(0, i) + ellipsis;\n if (context.measureText(subtext).width > width) {\n // we're too far, take the previous index\n finalLength = i > 0 ? i - 1 : 0;\n break;\n }\n }\n return text.substring(0, finalLength) + ellipsis;\n }\n },\n // ensure that returned string follows xsd:ID standard\n // should follow r'^[a-zA-Z_][\\w.-]*$'\n getXMLValidId: function getXMLValidId(originalId) {\n var newId = \"\";\n var xmlValidRegex = /^[a-zA-Z_][\\w.-]*$/;\n if (!xmlValidRegex.test(originalId)) {\n // doesn't comply\n newId = originalId;\n newId = newId.replace(/[^\\w.-]/g, \"\");\n if (!xmlValidRegex.test(newId)) {\n // still doesn't comply\n newId = \"_\" + newId;\n if (!xmlValidRegex.test(newId)) {\n // normally we should never enter this\n // if for some obscure reason we still don't comply, throw error.\n throw new Error(\"Can't make identifer comply to xsd:ID requirements: \" + newId);\n }\n }\n return newId;\n } else {\n return originalId;\n }\n },\n getWidthByContent: function getWidthByContent(content, fontFamily, fontSize, options) {\n var DEFAULT_MARGIN = 5;\n var lines = content.split(\"\\n\");\n var context = document.createElement('canvas').getContext('2d');\n // should not make type check so '===' should not be used here\n var shouldAppend = parseFloat(fontSize) == fontSize;\n var validFontSize = shouldAppend ? fontSize + 'px' : fontSize;\n context.font = validFontSize + ' ' + fontFamily;\n var width = 0;\n lines.forEach(function (line) {\n var w = context.measureText(line).width;\n if (w > width) {\n width = w;\n }\n });\n var margin = options && options.margin;\n if (margin == null) {\n margin = DEFAULT_MARGIN;\n }\n width += 2 * margin;\n var min = options && options.min;\n var max = options && options.max;\n if (min != null && width < min) {\n width = min;\n } else if (max != null && width > max) {\n width = max;\n }\n return width;\n },\n FromKebabToCamelCase: function FromKebabToCamelCase(input) {\n return input.replace(/(-\\w)/g, function (m) {\n return m[1].toUpperCase();\n });\n },\n FromCamelToKebabCase: function FromCamelToKebabCase(input) {\n return input.replace(/[\\w]([A-Z])/g, function (m) {\n return m[0] + \"-\" + m[1];\n }).toLowerCase();\n }\n};\nmodule.exports = textUtilities;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbGl0aWVzL3RleHQtdXRpbGl0aWVzLmpzIiwibmFtZXMiOlsidGV4dFV0aWxpdGllcyIsInRydW5jYXRlIiwidGV4dCIsImZvbnQiLCJ3aWR0aCIsImNvbnRleHQiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJnZXRDb250ZXh0IiwibWVhc3VyZVRleHQiLCJlbGxpcHNpcyIsImZpbmFsTGVuZ3RoIiwiaSIsImxlbmd0aCIsInN1YnRleHQiLCJzdWJzdHJpbmciLCJnZXRYTUxWYWxpZElkIiwib3JpZ2luYWxJZCIsIm5ld0lkIiwieG1sVmFsaWRSZWdleCIsInRlc3QiLCJyZXBsYWNlIiwiRXJyb3IiLCJnZXRXaWR0aEJ5Q29udGVudCIsImNvbnRlbnQiLCJmb250RmFtaWx5IiwiZm9udFNpemUiLCJvcHRpb25zIiwiREVGQVVMVF9NQVJHSU4iLCJsaW5lcyIsInNwbGl0Iiwic2hvdWxkQXBwZW5kIiwicGFyc2VGbG9hdCIsInZhbGlkRm9udFNpemUiLCJmb3JFYWNoIiwibGluZSIsInciLCJtYXJnaW4iLCJtaW4iLCJtYXgiLCJGcm9tS2ViYWJUb0NhbWVsQ2FzZSIsImlucHV0IiwibSIsInRvVXBwZXJDYXNlIiwiRnJvbUNhbWVsVG9LZWJhYkNhc2UiLCJ0b0xvd2VyQ2FzZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid2VicGFjazovL3NiZ252aXovLi9zcmMvdXRpbGl0aWVzL3RleHQtdXRpbGl0aWVzLmpzP2U2NDUiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFRleHQgdXRpbGl0aWVzIGZvciBjb21tb24gdXNhZ2VcbiAqL1xuXG52YXIgdGV4dFV0aWxpdGllcyA9IHtcbiAgLy8gc2FtZSBwdXJwb3NlIGFzIHByZXZpb3VzIG9uZSwgYnV0IHdpdGggY2xlYXJlciByZXNwb25zaWJpbGl0eVxuICB0cnVuY2F0ZTogZnVuY3Rpb24odGV4dCwgZm9udCwgd2lkdGgpIHtcbiAgICB0ZXh0ID0gdGV4dCArIFwiXCI7XG4gICAgdmFyIGNvbnRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKS5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgY29udGV4dC5mb250ID0gZm9udDtcbiAgICAvLyBjaGVjayB0cml2aWFsIGNhc2UgZmlyc3QsIHdoZW4gZW50aXJlIHRleHQgaXMgYWxyZWFkeSBzbWFsbCBlbm91Z2hcbiAgICBpZihjb250ZXh0Lm1lYXN1cmVUZXh0KHRleHQpLndpZHRoIDwgd2lkdGgpIHtcbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHZhciBlbGxpcHNpcyA9IFwiLi5cIjtcbiAgICAgIC8vIGlmIGVsbGlwc2lzIGFsb25lIGlzIGFscmVhZHkgdG9vIGxhcmdlXG4gICAgICBpZihjb250ZXh0Lm1lYXN1cmVUZXh0KGVsbGlwc2lzKS53aWR0aCA+IHdpZHRoKSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuXG4gICAgICB2YXIgZmluYWxMZW5ndGg7IC8vIHRoaXMgc2hvdWxkIGFsd2F5cyBoYXZlIGEgdmFsdWUgYWZ0ZXIgdGhlIGxvb3BcbiAgICAgIGZvcih2YXIgaT0wOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc3VidGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIGkpICsgZWxsaXBzaXM7XG4gICAgICAgIGlmIChjb250ZXh0Lm1lYXN1cmVUZXh0KHN1YnRleHQpLndpZHRoID4gd2lkdGgpIHsgLy8gd2UncmUgdG9vIGZhciwgdGFrZSB0aGUgcHJldmlvdXMgaW5kZXhcbiAgICAgICAgICBmaW5hbExlbmd0aCA9IGkgPiAwID8gaS0xIDogMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKDAsIGZpbmFsTGVuZ3RoKSArIGVsbGlwc2lzO1xuICAgIH1cbiAgfSxcblxuICAvLyBlbnN1cmUgdGhhdCByZXR1cm5lZCBzdHJpbmcgZm9sbG93cyB4c2Q6SUQgc3RhbmRhcmRcbiAgLy8gc2hvdWxkIGZvbGxvdyByJ15bYS16QS1aX11bXFx3Li1dKiQnXG4gIGdldFhNTFZhbGlkSWQ6IGZ1bmN0aW9uKG9yaWdpbmFsSWQpIHtcbiAgICB2YXIgbmV3SWQgPSBcIlwiO1xuICAgIHZhciB4bWxWYWxpZFJlZ2V4ID0gL15bYS16QS1aX11bXFx3Li1dKiQvO1xuICAgIGlmICghIHhtbFZhbGlkUmVnZXgudGVzdChvcmlnaW5hbElkKSkgeyAvLyBkb2Vzbid0IGNvbXBseVxuICAgICAgbmV3SWQgPSBvcmlnaW5hbElkO1xuICAgICAgbmV3SWQgPSBuZXdJZC5yZXBsYWNlKC9bXlxcdy4tXS9nLCBcIlwiKTtcbiAgICAgIGlmICghIHhtbFZhbGlkUmVnZXgudGVzdChuZXdJZCkpIHsgLy8gc3RpbGwgZG9lc24ndCBjb21wbHlcbiAgICAgICAgbmV3SWQgPSBcIl9cIiArIG5ld0lkO1xuICAgICAgICBpZiAoISB4bWxWYWxpZFJlZ2V4LnRlc3QobmV3SWQpKSB7IC8vIG5vcm1hbGx5IHdlIHNob3VsZCBuZXZlciBlbnRlciB0aGlzXG4gICAgICAgICAgLy8gaWYgZm9yIHNvbWUgb2JzY3VyZSByZWFzb24gd2Ugc3RpbGwgZG9uJ3QgY29tcGx5LCB0aHJvdyBlcnJvci5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBtYWtlIGlkZW50aWZlciBjb21wbHkgdG8geHNkOklEIHJlcXVpcmVtZW50czogXCIrbmV3SWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3SWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsSWQ7XG4gICAgfVxuICB9LFxuXG4gIGdldFdpZHRoQnlDb250ZW50KCBjb250ZW50LCBmb250RmFtaWx5LCBmb250U2l6ZSwgb3B0aW9ucyApIHtcbiAgICB2YXIgREVGQVVMVF9NQVJHSU4gPSA1O1xuICAgIHZhciBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIik7XG4gICAgdmFyIGNvbnRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKS5nZXRDb250ZXh0KCcyZCcpO1xuICAgIC8vIHNob3VsZCBub3QgbWFrZSB0eXBlIGNoZWNrIHNvICc9PT0nIHNob3VsZCBub3QgYmUgdXNlZCBoZXJlXG4gICAgdmFyIHNob3VsZEFwcGVuZCA9IHBhcnNlRmxvYXQoIGZvbnRTaXplICkgPT0gZm9udFNpemU7XG4gICAgdmFyIHZhbGlkRm9udFNpemUgPSBzaG91bGRBcHBlbmQgPyBmb250U2l6ZSArICdweCcgOiBmb250U2l6ZTtcbiAgICBjb250ZXh0LmZvbnQgPSB2YWxpZEZvbnRTaXplICsgJyAnICsgZm9udEZhbWlseTtcblxuICAgIHZhciB3aWR0aCA9IDA7XG5cbiAgICBsaW5lcy5mb3JFYWNoKCBmdW5jdGlvbiggbGluZSApIHtcbiAgICAgIHZhciB3ID0gY29udGV4dC5tZWFzdXJlVGV4dChsaW5lKS53aWR0aDtcbiAgICAgIGlmICggdyA+IHdpZHRoICkge1xuICAgICAgICB3aWR0aCA9IHc7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB2YXIgbWFyZ2luID0gb3B0aW9ucyAmJiBvcHRpb25zLm1hcmdpbjtcbiAgICBpZiAoIG1hcmdpbiA9PSBudWxsICkge1xuICAgICAgbWFyZ2luID0gREVGQVVMVF9NQVJHSU47XG4gICAgfVxuXG4gICAgd2lkdGggKz0gMiAqIG1hcmdpbjtcblxuICAgIHZhciBtaW4gPSBvcHRpb25zICYmIG9wdGlvbnMubWluO1xuICAgIHZhciBtYXggPSBvcHRpb25zICYmIG9wdGlvbnMubWF4O1xuXG4gICAgaWYgKCBtaW4gIT0gbnVsbCAmJiB3aWR0aCA8IG1pbiApIHtcbiAgICAgIHdpZHRoID0gbWluO1xuICAgIH1cbiAgICBlbHNlIGlmICggbWF4ICE9IG51bGwgJiYgd2lkdGggPiBtYXggKSB7XG4gICAgICB3aWR0aCA9IG1heDtcbiAgICB9XG5cbiAgICByZXR1cm4gd2lkdGg7XG4gIH0sXG5cbiAgRnJvbUtlYmFiVG9DYW1lbENhc2UgOiBmdW5jdGlvbihpbnB1dCl7XG4gICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoLygtXFx3KS9nLCBmdW5jdGlvbihtKXtcbiAgICAgIHJldHVybiBtWzFdLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG4gIH0sXG5cbiAgRnJvbUNhbWVsVG9LZWJhYkNhc2UgOiBmdW5jdGlvbihpbnB1dCl7XG4gICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoL1tcXHddKFtBLVpdKS9nLCBmdW5jdGlvbihtKSB7XG4gICAgICByZXR1cm4gbVswXSArIFwiLVwiICsgbVsxXTtcbiAgICB9KS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gdGV4dFV0aWxpdGllcztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOztBQUVBLElBQUlBLGFBQWEsR0FBRztFQUNsQjtFQUNBQyxRQUFRLEVBQUUsU0FBQUEsU0FBU0MsSUFBSSxFQUFFQyxJQUFJLEVBQUVDLEtBQUssRUFBRTtJQUNwQ0YsSUFBSSxHQUFHQSxJQUFJLEdBQUcsRUFBRTtJQUNoQixJQUFJRyxPQUFPLEdBQUdDLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDQyxVQUFVLENBQUMsSUFBSSxDQUFDO0lBQy9ESCxPQUFPLENBQUNGLElBQUksR0FBR0EsSUFBSTtJQUNuQjtJQUNBLElBQUdFLE9BQU8sQ0FBQ0ksV0FBVyxDQUFDUCxJQUFJLENBQUMsQ0FBQ0UsS0FBSyxHQUFHQSxLQUFLLEVBQUU7TUFDMUMsT0FBT0YsSUFBSTtJQUNiLENBQUMsTUFDSTtNQUNILElBQUlRLFFBQVEsR0FBRyxJQUFJO01BQ25CO01BQ0EsSUFBR0wsT0FBTyxDQUFDSSxXQUFXLENBQUNDLFFBQVEsQ0FBQyxDQUFDTixLQUFLLEdBQUdBLEtBQUssRUFBRTtRQUM5QyxPQUFPLEVBQUU7TUFDWDtNQUVBLElBQUlPLFdBQVcsQ0FBQyxDQUFDO01BQ2pCLEtBQUksSUFBSUMsQ0FBQyxHQUFD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\n//# sourceURL=webpack-internal:///./src/utilities/text-utilities.js\n"); +eval("/*\n * Text utilities for common usage\n */\n\nvar textUtilities = {\n // same purpose as previous one, but with clearer responsibility\n truncate: function truncate(text, font, width) {\n text = text + \"\";\n var context = document.createElement('canvas').getContext(\"2d\");\n context.font = font;\n // check trivial case first, when entire text is already small enough\n if (context.measureText(text).width < width) {\n return text;\n } else {\n var ellipsis = \"..\";\n // if ellipsis alone is already too large\n if (context.measureText(ellipsis).width > width) {\n return \"\";\n }\n var finalLength; // this should always have a value after the loop\n for (var i = 0; i < text.length; i++) {\n var subtext = text.substring(0, i) + ellipsis;\n if (context.measureText(subtext).width > width) {\n // we're too far, take the previous index\n finalLength = i > 0 ? i - 1 : 0;\n break;\n }\n }\n return text.substring(0, finalLength) + ellipsis;\n }\n },\n // ensure that returned string follows xsd:ID standard\n // should follow r'^[a-zA-Z_][\\w.-]*$'\n getXMLValidId: function getXMLValidId(originalId) {\n var newId = \"\";\n var xmlValidRegex = /^[a-zA-Z_][\\w.-]*$/;\n if (!xmlValidRegex.test(originalId)) {\n // doesn't comply\n newId = originalId;\n newId = newId.replace(/[^\\w.-]/g, \"\");\n if (!xmlValidRegex.test(newId)) {\n // still doesn't comply\n newId = \"_\" + newId;\n if (!xmlValidRegex.test(newId)) {\n // normally we should never enter this\n // if for some obscure reason we still don't comply, throw error.\n throw new Error(\"Can't make identifer comply to xsd:ID requirements: \" + newId);\n }\n }\n return newId;\n } else {\n return originalId;\n }\n },\n getWidthByContent: function getWidthByContent(content, fontFamily, fontSize, options) {\n var DEFAULT_MARGIN = 5;\n var lines = content.split(\"\\n\");\n var context = document.createElement('canvas').getContext('2d');\n // should not make type check so '===' should not be used here\n var shouldAppend = parseFloat(fontSize) == fontSize;\n var validFontSize = shouldAppend ? fontSize + 'px' : fontSize;\n context.font = validFontSize + ' ' + fontFamily;\n var width = 0;\n lines.forEach(function (line) {\n var w = context.measureText(line).width;\n if (w > width) {\n width = w;\n }\n });\n var margin = options && options.margin;\n if (margin == null) {\n margin = DEFAULT_MARGIN;\n }\n width += 2 * margin;\n var min = options && options.min;\n var max = options && options.max;\n if (min != null && width < min) {\n width = min;\n } else if (max != null && width > max) {\n width = max;\n }\n return width;\n },\n FromKebabToCamelCase: function FromKebabToCamelCase(input) {\n return input.replace(/(-\\w)/g, function (m) {\n return m[1].toUpperCase();\n });\n },\n FromCamelToKebabCase: function FromCamelToKebabCase(input) {\n return input.replace(/[\\w]([A-Z])/g, function (m) {\n return m[0] + \"-\" + m[1];\n }).toLowerCase();\n }\n};\nmodule.exports = textUtilities;//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbGl0aWVzL3RleHQtdXRpbGl0aWVzLmpzIiwibmFtZXMiOlsidGV4dFV0aWxpdGllcyIsInRydW5jYXRlIiwidGV4dCIsImZvbnQiLCJ3aWR0aCIsImNvbnRleHQiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJnZXRDb250ZXh0IiwibWVhc3VyZVRleHQiLCJlbGxpcHNpcyIsImZpbmFsTGVuZ3RoIiwiaSIsImxlbmd0aCIsInN1YnRleHQiLCJzdWJzdHJpbmciLCJnZXRYTUxWYWxpZElkIiwib3JpZ2luYWxJZCIsIm5ld0lkIiwieG1sVmFsaWRSZWdleCIsInRlc3QiLCJyZXBsYWNlIiwiRXJyb3IiLCJnZXRXaWR0aEJ5Q29udGVudCIsImNvbnRlbnQiLCJmb250RmFtaWx5IiwiZm9udFNpemUiLCJvcHRpb25zIiwiREVGQVVMVF9NQVJHSU4iLCJsaW5lcyIsInNwbGl0Iiwic2hvdWxkQXBwZW5kIiwicGFyc2VGbG9hdCIsInZhbGlkRm9udFNpemUiLCJmb3JFYWNoIiwibGluZSIsInciLCJtYXJnaW4iLCJtaW4iLCJtYXgiLCJGcm9tS2ViYWJUb0NhbWVsQ2FzZSIsImlucHV0IiwibSIsInRvVXBwZXJDYXNlIiwiRnJvbUNhbWVsVG9LZWJhYkNhc2UiLCJ0b0xvd2VyQ2FzZSIsIm1vZHVsZSIsImV4cG9ydHMiXSwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsid2VicGFjazovL3NiZ252aXovLi9zcmMvdXRpbGl0aWVzL3RleHQtdXRpbGl0aWVzLmpzP2U2NDUiXSwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIFRleHQgdXRpbGl0aWVzIGZvciBjb21tb24gdXNhZ2VcbiAqL1xuXG52YXIgdGV4dFV0aWxpdGllcyA9IHtcbiAgLy8gc2FtZSBwdXJwb3NlIGFzIHByZXZpb3VzIG9uZSwgYnV0IHdpdGggY2xlYXJlciByZXNwb25zaWJpbGl0eVxuICB0cnVuY2F0ZTogZnVuY3Rpb24odGV4dCwgZm9udCwgd2lkdGgpIHtcbiAgICB0ZXh0ID0gdGV4dCArIFwiXCI7XG4gICAgdmFyIGNvbnRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKS5nZXRDb250ZXh0KFwiMmRcIik7XG4gICAgY29udGV4dC5mb250ID0gZm9udDtcbiAgICAvLyBjaGVjayB0cml2aWFsIGNhc2UgZmlyc3QsIHdoZW4gZW50aXJlIHRleHQgaXMgYWxyZWFkeSBzbWFsbCBlbm91Z2hcbiAgICBpZihjb250ZXh0Lm1lYXN1cmVUZXh0KHRleHQpLndpZHRoIDwgd2lkdGgpIHtcbiAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHZhciBlbGxpcHNpcyA9IFwiLi5cIjtcbiAgICAgIC8vIGlmIGVsbGlwc2lzIGFsb25lIGlzIGFscmVhZHkgdG9vIGxhcmdlXG4gICAgICBpZihjb250ZXh0Lm1lYXN1cmVUZXh0KGVsbGlwc2lzKS53aWR0aCA+IHdpZHRoKSB7XG4gICAgICAgIHJldHVybiBcIlwiO1xuICAgICAgfVxuXG4gICAgICB2YXIgZmluYWxMZW5ndGg7IC8vIHRoaXMgc2hvdWxkIGFsd2F5cyBoYXZlIGEgdmFsdWUgYWZ0ZXIgdGhlIGxvb3BcbiAgICAgIGZvcih2YXIgaT0wOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgc3VidGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIGkpICsgZWxsaXBzaXM7XG4gICAgICAgIGlmIChjb250ZXh0Lm1lYXN1cmVUZXh0KHN1YnRleHQpLndpZHRoID4gd2lkdGgpIHsgLy8gd2UncmUgdG9vIGZhciwgdGFrZSB0aGUgcHJldmlvdXMgaW5kZXhcbiAgICAgICAgICBmaW5hbExlbmd0aCA9IGkgPiAwID8gaS0xIDogMDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIHRleHQuc3Vic3RyaW5nKDAsIGZpbmFsTGVuZ3RoKSArIGVsbGlwc2lzO1xuICAgIH1cbiAgfSxcblxuICAvLyBlbnN1cmUgdGhhdCByZXR1cm5lZCBzdHJpbmcgZm9sbG93cyB4c2Q6SUQgc3RhbmRhcmRcbiAgLy8gc2hvdWxkIGZvbGxvdyByJ15bYS16QS1aX11bXFx3Li1dKiQnXG4gIGdldFhNTFZhbGlkSWQ6IGZ1bmN0aW9uKG9yaWdpbmFsSWQpIHtcbiAgICB2YXIgbmV3SWQgPSBcIlwiO1xuICAgIHZhciB4bWxWYWxpZFJlZ2V4ID0gL15bYS16QS1aX11bXFx3Li1dKiQvO1xuICAgIGlmICghIHhtbFZhbGlkUmVnZXgudGVzdChvcmlnaW5hbElkKSkgeyAvLyBkb2Vzbid0IGNvbXBseVxuICAgICAgbmV3SWQgPSBvcmlnaW5hbElkO1xuICAgICAgbmV3SWQgPSBuZXdJZC5yZXBsYWNlKC9bXlxcdy4tXS9nLCBcIlwiKTtcbiAgICAgIGlmICghIHhtbFZhbGlkUmVnZXgudGVzdChuZXdJZCkpIHsgLy8gc3RpbGwgZG9lc24ndCBjb21wbHlcbiAgICAgICAgbmV3SWQgPSBcIl9cIiArIG5ld0lkO1xuICAgICAgICBpZiAoISB4bWxWYWxpZFJlZ2V4LnRlc3QobmV3SWQpKSB7IC8vIG5vcm1hbGx5IHdlIHNob3VsZCBuZXZlciBlbnRlciB0aGlzXG4gICAgICAgICAgLy8gaWYgZm9yIHNvbWUgb2JzY3VyZSByZWFzb24gd2Ugc3RpbGwgZG9uJ3QgY29tcGx5LCB0aHJvdyBlcnJvci5cbiAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBtYWtlIGlkZW50aWZlciBjb21wbHkgdG8geHNkOklEIHJlcXVpcmVtZW50czogXCIrbmV3SWQpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbmV3SWQ7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcmV0dXJuIG9yaWdpbmFsSWQ7XG4gICAgfVxuICB9LFxuXG4gIGdldFdpZHRoQnlDb250ZW50KCBjb250ZW50LCBmb250RmFtaWx5LCBmb250U2l6ZSwgb3B0aW9ucyApIHtcbiAgICB2YXIgREVGQVVMVF9NQVJHSU4gPSA1O1xuICAgIHZhciBsaW5lcyA9IGNvbnRlbnQuc3BsaXQoXCJcXG5cIik7XG4gICAgdmFyIGNvbnRleHQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKS5nZXRDb250ZXh0KCcyZCcpO1xuICAgIC8vIHNob3VsZCBub3QgbWFrZSB0eXBlIGNoZWNrIHNvICc9PT0nIHNob3VsZCBub3QgYmUgdXNlZCBoZXJlXG4gICAgdmFyIHNob3VsZEFwcGVuZCA9IHBhcnNlRmxvYXQoIGZvbnRTaXplICkgPT0gZm9udFNpemU7XG4gICAgdmFyIHZhbGlkRm9udFNpemUgPSBzaG91bGRBcHBlbmQgPyBmb250U2l6ZSArICdweCcgOiBmb250U2l6ZTtcbiAgICBjb250ZXh0LmZvbnQgPSB2YWxpZEZvbnRTaXplICsgJyAnICsgZm9udEZhbWlseTtcblxuICAgIHZhciB3aWR0aCA9IDA7XG5cbiAgICBsaW5lcy5mb3JFYWNoKCBmdW5jdGlvbiggbGluZSApIHtcbiAgICAgIHZhciB3ID0gY29udGV4dC5tZWFzdXJlVGV4dChsaW5lKS53aWR0aDtcbiAgICAgIGlmICggdyA+IHdpZHRoICkge1xuICAgICAgICB3aWR0aCA9IHc7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICB2YXIgbWFyZ2luID0gb3B0aW9ucyAmJiBvcHRpb25zLm1hcmdpbjtcbiAgICBpZiAoIG1hcmdpbiA9PSBudWxsICkge1xuICAgICAgbWFyZ2luID0gREVGQVVMVF9NQVJHSU47XG4gICAgfVxuXG4gICAgd2lkdGggKz0gMiAqIG1hcmdpbjtcblxuICAgIHZhciBtaW4gPSBvcHRpb25zICYmIG9wdGlvbnMubWluO1xuICAgIHZhciBtYXggPSBvcHRpb25zICYmIG9wdGlvbnMubWF4O1xuXG4gICAgaWYgKCBtaW4gIT0gbnVsbCAmJiB3aWR0aCA8IG1pbiApIHtcbiAgICAgIHdpZHRoID0gbWluO1xuICAgIH1cbiAgICBlbHNlIGlmICggbWF4ICE9IG51bGwgJiYgd2lkdGggPiBtYXggKSB7XG4gICAgICB3aWR0aCA9IG1heDtcbiAgICB9XG5cbiAgICByZXR1cm4gd2lkdGg7XG4gIH0sXG5cbiAgRnJvbUtlYmFiVG9DYW1lbENhc2UgOiBmdW5jdGlvbihpbnB1dCl7XG4gICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoLygtXFx3KS9nLCBmdW5jdGlvbihtKXtcbiAgICAgIHJldHVybiBtWzFdLnRvVXBwZXJDYXNlKCk7XG4gICAgfSk7XG4gIH0sXG5cbiAgRnJvbUNhbWVsVG9LZWJhYkNhc2UgOiBmdW5jdGlvbihpbnB1dCl7XG4gICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoL1tcXHddKFtBLVpdKS9nLCBmdW5jdGlvbihtKSB7XG4gICAgICByZXR1cm4gbVswXSArIFwiLVwiICsgbVsxXTtcbiAgICB9KS50b0xvd2VyQ2FzZSgpO1xuICB9XG5cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gdGV4dFV0aWxpdGllcztcbiJdLCJtYXBwaW5ncyI6IkFBQUE7QUFDQTtBQUNBOztBQUVBLElBQUlBLGFBQWEsR0FBRztFQUNsQjtFQUNBQyxRQUFRLEVBQUUsU0FBVkEsUUFBUUEsQ0FBV0MsSUFBSSxFQUFFQyxJQUFJLEVBQUVDLEtBQUssRUFBRTtJQUNwQ0YsSUFBSSxHQUFHQSxJQUFJLEdBQUcsRUFBRTtJQUNoQixJQUFJRyxPQUFPLEdBQUdDLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLFFBQVEsQ0FBQyxDQUFDQyxVQUFVLENBQUMsSUFBSSxDQUFDO0lBQy9ESCxPQUFPLENBQUNGLElBQUksR0FBR0EsSUFBSTtJQUNuQjtJQUNBLElBQUdFLE9BQU8sQ0FBQ0ksV0FBVyxDQUFDUCxJQUFJLENBQUMsQ0FBQ0UsS0FBSyxHQUFHQSxLQUFLLEVBQUU7TUFDMUMsT0FBT0YsSUFBSTtJQUNiLENBQUMsTUFDSTtNQUNILElBQUlRLFFBQVEsR0FBRyxJQUFJO01BQ25CO01BQ0EsSUFBR0wsT0FBTyxDQUFDSSxXQUFXLENBQUNDLFFBQVEsQ0FBQyxDQUFDTixLQUFLLEdBQUdBLEtBQUssRUFBRTtRQUM5QyxPQUFPLEVBQUU7TUFDWDtNQUVBLElBQUlPLFdBQVcsQ0FBQyxDQUFDO01BQ2pCLEtBQUksSUFBSUMsQ0FB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\n//# sourceURL=webpack-internal:///./src/utilities/text-utilities.js\n"); /***/ }), @@ -335,7 +335,7 @@ eval("/*\n * Text utilities for common usage\n */\n\nvar textUtilities = {\n // \***********************************************/ /***/ ((module, __unused_webpack_exports, __webpack_require__) => { -eval("/*\n* Commonly needed UI Utilities\n*/\n\nvar libUtilities = __webpack_require__(/*! ./lib-utilities */ \"./src/utilities/lib-utilities.js\");\nvar libs = libUtilities.getLibs();\nvar jQuery = $ = libs.jQuery;\nmodule.exports = function () {\n var optionUtilities;\n var options;\n function uiUtilities(param) {\n optionUtilities = param.optionUtilities;\n options = optionUtilities.getOptions();\n }\n uiUtilities.startSpinner = function (className) {\n if (!className) {\n className = 'default-class';\n }\n if ($('.' + className).length === 0) {\n var containerWidth = $(options.networkContainerSelector).width();\n var containerHeight = $(options.networkContainerSelector).height();\n $(options.networkContainerSelector + ':parent').prepend('
' + '
' + '
Take a sip of your coffee while you wait...
' + '
');\n $(\".\" + className + '-text').fadeOut(0);\n }\n };\n uiUtilities.showSpinnerText = function (className) {\n $(\".\" + className + '-text').fadeIn(0);\n };\n uiUtilities.endSpinner = function (className) {\n if (!className) {\n className = 'default-class';\n }\n if ($('.' + className + '-wrapper').length > 0) {\n $('.' + className + '-wrapper').remove();\n }\n };\n return uiUtilities;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbGl0aWVzL3VpLXV0aWxpdGllcy1mYWN0b3J5LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJQSxZQUFZLEdBQUdDLG1CQUFPLENBQUMseURBQWlCLENBQUM7QUFDN0MsSUFBSUMsSUFBSSxHQUFHRixZQUFZLENBQUNHLE9BQU8sQ0FBQyxDQUFDO0FBQ2pDLElBQUlDLE1BQU0sR0FBR0MsQ0FBQyxHQUFHSCxJQUFJLENBQUNFLE1BQU07QUFFNUJFLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHLFlBQVk7RUFFNUIsSUFBSUMsZUFBZTtFQUNuQixJQUFJQyxPQUFPO0VBRVgsU0FBU0MsV0FBV0EsQ0FBRUMsS0FBSyxFQUFFO0lBQzNCSCxlQUFlLEdBQUdHLEtBQUssQ0FBQ0gsZUFBZTtJQUN2Q0MsT0FBTyxHQUFHRCxlQUFlLENBQUNJLFVBQVUsQ0FBQyxDQUFDO0VBQ3hDO0VBRUFGLFdBQVcsQ0FBQ0csWUFBWSxHQUFHLFVBQVVDLFNBQVMsRUFBRTtJQUM5QyxJQUFJLENBQUNBLFNBQVMsRUFBRTtNQUNkQSxTQUFTLEdBQUcsZUFBZTtJQUM3QjtJQUVBLElBQUlULENBQUMsQ0FBQyxHQUFHLEdBQUdTLFNBQVMsQ0FBQyxDQUFDQyxNQUFNLEtBQUssQ0FBQyxFQUFFO01BQ3BDLElBQUlDLGNBQWMsR0FBR1gsQ0FBQyxDQUFDSSxPQUFPLENBQUNRLHdCQUF3QixDQUFDLENBQUNDLEtBQUssQ0FBQyxDQUFDO01BQ2hFLElBQUlDLGVBQWUsR0FBR2QsQ0FBQyxDQUFDSSxPQUFPLENBQUNRLHdCQUF3QixDQUFDLENBQUNHLE1BQU0sQ0FBQyxDQUFDO01BQ2xFZixDQUFDLENBQUNJLE9BQU8sQ0FBQ1Esd0JBQXdCLEdBQUcsU0FBUyxDQUFDLENBQUNJLE9BQU8sQ0FBQyxvRUFBb0UsR0FBR0YsZUFBZSxHQUFHLENBQUMsR0FBRyxjQUFjLEdBQUNMLFNBQVMsR0FBQyxZQUFZLEdBQzFMLDBHQUEwRyxHQUFHQSxTQUFTLEdBQUcsY0FBYyxHQUN2SSxrREFBa0QsR0FBR0EsU0FBUyxHQUFHLDhEQUE4RCxHQUMvSCxRQUFRLENBQUM7TUFDVFQsQ0FBQyxDQUFDLEdBQUcsR0FBQ1MsU0FBUyxHQUFDLE9BQU8sQ0FBQyxDQUFDUSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3BDO0VBQ0YsQ0FBQztFQUNEWixXQUFXLENBQUNhLGVBQWUsR0FBRyxVQUFTVCxTQUFTLEVBQ2hEO0lBQ0VULENBQUMsQ0FBQyxHQUFHLEdBQUNTLFNBQVMsR0FBQyxPQUFPLENBQUMsQ0FBQ1UsTUFBTSxDQUFDLENBQUMsQ0FBQztFQUNwQyxDQUFDO0VBRURkLFdBQVcsQ0FBQ2UsVUFBVSxHQUFHLFVBQVVYLFNBQVMsRUFBRTtJQUM1QyxJQUFJLENBQUNBLFNBQVMsRUFBRTtNQUNkQSxTQUFTLEdBQUcsZUFBZTtJQUM3QjtJQUVBLElBQUlULENBQUMsQ0FBQyxHQUFHLEdBQUdTLFNBQVMsR0FBRyxVQUFVLENBQUMsQ0FBQ0MsTUFBTSxHQUFHLENBQUMsRUFBRTtNQUMvQ1YsQ0FBQyxDQUFDLEdBQUcsR0FBR1MsU0FBUyxHQUFHLFVBQVUsQ0FBQyxDQUFDWSxNQUFNLENBQUMsQ0FBQztJQUMxQztFQUNELENBQUM7RUFHRCxPQUFPaEIsV0FBVztBQUNuQixDQUFDIiwic291cmNlcyI6WyJ3ZWJwYWNrOi8vc2JnbnZpei8uL3NyYy91dGlsaXRpZXMvdWktdXRpbGl0aWVzLWZhY3RvcnkuanM/N2YzMiJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuKiBDb21tb25seSBuZWVkZWQgVUkgVXRpbGl0aWVzXG4qL1xuXG52YXIgbGliVXRpbGl0aWVzID0gcmVxdWlyZSgnLi9saWItdXRpbGl0aWVzJyk7XG52YXIgbGlicyA9IGxpYlV0aWxpdGllcy5nZXRMaWJzKCk7XG52YXIgalF1ZXJ5ID0gJCA9IGxpYnMualF1ZXJ5O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICgpIHtcblxuIHZhciBvcHRpb25VdGlsaXRpZXM7XG4gdmFyIG9wdGlvbnM7XG5cbiBmdW5jdGlvbiB1aVV0aWxpdGllcyAocGFyYW0pIHtcbiAgIG9wdGlvblV0aWxpdGllcyA9IHBhcmFtLm9wdGlvblV0aWxpdGllcztcbiAgIG9wdGlvbnMgPSBvcHRpb25VdGlsaXRpZXMuZ2V0T3B0aW9ucygpO1xuIH1cblxuIHVpVXRpbGl0aWVzLnN0YXJ0U3Bpbm5lciA9IGZ1bmN0aW9uIChjbGFzc05hbWUpIHtcbiAgIGlmICghY2xhc3NOYW1lKSB7XG4gICAgIGNsYXNzTmFtZSA9ICdkZWZhdWx0LWNsYXNzJztcbiAgIH1cblxuICAgaWYgKCQoJy4nICsgY2xhc3NOYW1lKS5sZW5ndGggPT09IDApIHtcbiAgICB2YXIgY29udGFpbmVyV2lkdGggPSAkKG9wdGlvbnMubmV0d29ya0NvbnRhaW5lclNlbGVjdG9yKS53aWR0aCgpO1xuICAgIHZhciBjb250YWluZXJIZWlnaHQgPSAkKG9wdGlvbnMubmV0d29ya0NvbnRhaW5lclNlbGVjdG9yKS5oZWlnaHQoKTtcbiAgICAkKG9wdGlvbnMubmV0d29ya0NvbnRhaW5lclNlbGVjdG9yICsgJzpwYXJlbnQnKS5wcmVwZW5kKCc8ZGl2IHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyB6LWluZGV4OiA5OTk5OTk5OyBsZWZ0OiA0NSU7IHRvcDogJyArIGNvbnRhaW5lckhlaWdodCAvIDIgKyAncHg7XCIgY2xhc3M9XCInK2NsYXNzTmFtZSsnLXdyYXBwZXJcIj4nK1xuICAgICc8ZGl2IHN0eWxlPVwibWFyZ2luOiAwIGF1dG87IG1hcmdpbi1ib3R0b206IDVweDsgd2lkdGg6NTBweFwiPjxpIGNsYXNzPVwiZmEgZmEtc3Bpbm5lciBmYS1zcGluIGZhLTN4IGZhLWZ3ICcgKyBjbGFzc05hbWUgKyAnXCI+PC9pPjwvZGl2PicrXG4gICAgJzxkaXYgc3R5bGU9XCJ3aWR0aDogMjIwcHg7IGhlaWdodCAyMCVcIj48aSBjbGFzcz1cIicgKyBjbGFzc05hbWUgKyAnLXRleHRcIj5UYWtlIGEgc2lwIG9mIHlvdXIgY29mZmVlIHdoaWxlIHlvdSB3YWl0Li4uPC9pPjwvZGl2PicrXG4gICAgJzwvZGl2PicpO1xuICAgICQoXCIuXCIrY2xhc3NOYW1lKyctdGV4dCcpLmZhZGVPdXQoMClcbiAgIH1cbiB9O1xuIHVpVXRpbGl0aWVzLnNob3dTcGlubmVyVGV4dCA9IGZ1bmN0aW9uKGNsYXNzTmFtZSlcbiB7XG4gICAkKFwiLlwiK2NsYXNzTmFtZSsnLXRleHQnKS5mYWRlSW4oMClcbiB9XG5cbiB1aVV0aWxpdGllcy5lbmRTcGlubmVyID0gZnVuY3Rpb24gKGNsYXNzTmFtZSkge1xuICAgaWYgKCFjbGFzc05hbWUpIHtcbiAgICAgY2xhc3NOYW1lID0gJ2RlZmF1bHQtY2xhc3MnO1xuICAgfVxuXG4gICBpZiAoJCgnLicgKyBjbGFzc05hbWUgKyAnLXdyYXBwZXInKS5sZW5ndGggPiAwKSB7XG4gICAgJCgnLicgKyBjbGFzc05hbWUgKyAnLXdyYXBwZXInKS5yZW1vdmUoKTtcbiAgfVxuIH07XG5cblxuIHJldHVybiB1aVV0aWxpdGllcztcbn07XG4iXSwibmFtZXMiOlsibGliVXRpbGl0aWVzIiwicmVxdWlyZSIsImxpYnMiLCJnZXRMaWJzIiwialF1ZXJ5IiwiJCIsIm1vZHVsZSIsImV4cG9ydHMiLCJvcHRpb25VdGlsaXRpZXMiLCJvcHRpb25zIiwidWlVdGlsaXRpZXMiLCJwYXJhbSIsImdldE9wdGlvbnMiLCJzdGFydFNwaW5uZXIiLCJjbGFzc05hbWUiLCJsZW5ndGgiLCJjb250YWluZXJXaWR0aCIsIm5ldHdvcmtDb250YWluZXJTZWxlY3RvciIsIndpZHRoIiwiY29udGFpbmVySGVpZ2h0IiwiaGVpZ2h0IiwicHJlcGVuZCIsImZhZGVPdXQiLCJzaG93U3Bpbm5lclRleHQiLCJmYWRlSW4iLCJlbmRTcGlubmVyIiwicmVtb3ZlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/utilities/ui-utilities-factory.js\n"); +eval("/*\n* Commonly needed UI Utilities\n*/\n\nvar libUtilities = __webpack_require__(/*! ./lib-utilities */ \"./src/utilities/lib-utilities.js\");\nvar libs = libUtilities.getLibs();\nvar jQuery = $ = libs.jQuery;\nmodule.exports = function () {\n var optionUtilities;\n var options;\n function uiUtilities(param) {\n optionUtilities = param.optionUtilities;\n options = optionUtilities.getOptions();\n }\n uiUtilities.startSpinner = function (className) {\n if (!className) {\n className = 'default-class';\n }\n if ($('.' + className).length === 0) {\n var containerWidth = $(options.networkContainerSelector).width();\n var containerHeight = $(options.networkContainerSelector).height();\n $(options.networkContainerSelector + ':parent').prepend('
' + '
' + '
Take a sip of your coffee while you wait...
' + '
');\n $(\".\" + className + '-text').fadeOut(0);\n }\n };\n uiUtilities.showSpinnerText = function (className) {\n $(\".\" + className + '-text').fadeIn(0);\n };\n uiUtilities.showSpinnerText = function (className) {\n $(\".\" + className + '-text').fadeIn(0);\n };\n uiUtilities.endSpinner = function (className) {\n if (!className) {\n className = 'default-class';\n }\n if ($('.' + className + '-wrapper').length > 0) {\n $('.' + className + '-wrapper').remove();\n }\n };\n return uiUtilities;\n};//# sourceURL=[module]\n//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiLi9zcmMvdXRpbGl0aWVzL3VpLXV0aWxpdGllcy1mYWN0b3J5LmpzIiwibWFwcGluZ3MiOiJBQUFBO0FBQ0E7QUFDQTs7QUFFQSxJQUFJQSxZQUFZLEdBQUdDLG1CQUFPLENBQUMseURBQWlCLENBQUM7QUFDN0MsSUFBSUMsSUFBSSxHQUFHRixZQUFZLENBQUNHLE9BQU8sQ0FBQyxDQUFDO0FBQ2pDLElBQUlDLE1BQU0sR0FBR0MsQ0FBQyxHQUFHSCxJQUFJLENBQUNFLE1BQU07QUFFNUJFLE1BQU0sQ0FBQ0MsT0FBTyxHQUFHLFlBQVk7RUFFNUIsSUFBSUMsZUFBZTtFQUNuQixJQUFJQyxPQUFPO0VBRVgsU0FBU0MsV0FBV0EsQ0FBRUMsS0FBSyxFQUFFO0lBQzNCSCxlQUFlLEdBQUdHLEtBQUssQ0FBQ0gsZUFBZTtJQUN2Q0MsT0FBTyxHQUFHRCxlQUFlLENBQUNJLFVBQVUsQ0FBQyxDQUFDO0VBQ3hDO0VBRUFGLFdBQVcsQ0FBQ0csWUFBWSxHQUFHLFVBQVVDLFNBQVMsRUFBRTtJQUM3QyxJQUFJLENBQUNBLFNBQVMsRUFBRTtNQUNmQSxTQUFTLEdBQUcsZUFBZTtJQUM3QjtJQUVBLElBQUlULENBQUMsQ0FBQyxHQUFHLEdBQUdTLFNBQVMsQ0FBQyxDQUFDQyxNQUFNLEtBQUssQ0FBQyxFQUFFO01BQ3BDLElBQUlDLGNBQWMsR0FBR1gsQ0FBQyxDQUFDSSxPQUFPLENBQUNRLHdCQUF3QixDQUFDLENBQUNDLEtBQUssQ0FBQyxDQUFDO01BQ2hFLElBQUlDLGVBQWUsR0FBR2QsQ0FBQyxDQUFDSSxPQUFPLENBQUNRLHdCQUF3QixDQUFDLENBQUNHLE1BQU0sQ0FBQyxDQUFDO01BQ2xFZixDQUFDLENBQUNJLE9BQU8sQ0FBQ1Esd0JBQXdCLEdBQUcsU0FBUyxDQUFDLENBQUNJLE9BQU8sQ0FBQyxvRUFBb0UsR0FBR0YsZUFBZSxHQUFHLENBQUMsR0FBRyxjQUFjLEdBQUNMLFNBQVMsR0FBQyxZQUFZLEdBQzFMLDBHQUEwRyxHQUFHQSxTQUFTLEdBQUcsY0FBYyxHQUN2SSxrREFBa0QsR0FBR0EsU0FBUyxHQUFHLDhEQUE4RCxHQUMvSCxRQUFRLENBQUM7TUFDVFQsQ0FBQyxDQUFDLEdBQUcsR0FBQ1MsU0FBUyxHQUFDLE9BQU8sQ0FBQyxDQUFDUSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3BDO0VBQ0YsQ0FBQztFQUNEWixXQUFXLENBQUNhLGVBQWUsR0FBRyxVQUFTVCxTQUFTLEVBQ2hEO0lBQ0VULENBQUMsQ0FBQyxHQUFHLEdBQUNTLFNBQVMsR0FBQyxPQUFPLENBQUMsQ0FBQ1UsTUFBTSxDQUFDLENBQUMsQ0FBQztFQUNwQyxDQUFDO0VBRURkLFdBQVcsQ0FBQ2EsZUFBZSxHQUFHLFVBQVNULFNBQVMsRUFDaEQ7SUFDRVQsQ0FBQyxDQUFDLEdBQUcsR0FBQ1MsU0FBUyxHQUFDLE9BQU8sQ0FBQyxDQUFDVSxNQUFNLENBQUMsQ0FBQyxDQUFDO0VBQ3BDLENBQUM7RUFFRGQsV0FBVyxDQUFDZSxVQUFVLEdBQUcsVUFBVVgsU0FBUyxFQUFFO0lBQzdDLElBQUksQ0FBQ0EsU0FBUyxFQUFFO01BQ2RBLFNBQVMsR0FBRyxlQUFlO0lBQzdCO0lBRUEsSUFBSVQsQ0FBQyxDQUFDLEdBQUcsR0FBR1MsU0FBUyxHQUFHLFVBQVUsQ0FBQyxDQUFDQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO01BQzlDVixDQUFDLENBQUMsR0FBRyxHQUFHUyxTQUFTLEdBQUcsVUFBVSxDQUFDLENBQUNZLE1BQU0sQ0FBQyxDQUFDO0lBQzFDO0VBQ0QsQ0FBQztFQUdELE9BQU9oQixXQUFXO0FBQ25CLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9zYmdudml6Ly4vc3JjL3V0aWxpdGllcy91aS11dGlsaXRpZXMtZmFjdG9yeS5qcz83ZjMyIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG4qIENvbW1vbmx5IG5lZWRlZCBVSSBVdGlsaXRpZXNcbiovXG5cbnZhciBsaWJVdGlsaXRpZXMgPSByZXF1aXJlKCcuL2xpYi11dGlsaXRpZXMnKTtcbnZhciBsaWJzID0gbGliVXRpbGl0aWVzLmdldExpYnMoKTtcbnZhciBqUXVlcnkgPSAkID0gbGlicy5qUXVlcnk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuXG4gdmFyIG9wdGlvblV0aWxpdGllcztcbiB2YXIgb3B0aW9ucztcblxuIGZ1bmN0aW9uIHVpVXRpbGl0aWVzIChwYXJhbSkge1xuICAgb3B0aW9uVXRpbGl0aWVzID0gcGFyYW0ub3B0aW9uVXRpbGl0aWVzO1xuICAgb3B0aW9ucyA9IG9wdGlvblV0aWxpdGllcy5nZXRPcHRpb25zKCk7XG4gfVxuXG4gdWlVdGlsaXRpZXMuc3RhcnRTcGlubmVyID0gZnVuY3Rpb24gKGNsYXNzTmFtZSkge1xuICAgIGlmICghY2xhc3NOYW1lKSB7XG4gICAgIGNsYXNzTmFtZSA9ICdkZWZhdWx0LWNsYXNzJztcbiAgIH1cblxuICAgaWYgKCQoJy4nICsgY2xhc3NOYW1lKS5sZW5ndGggPT09IDApIHtcbiAgICB2YXIgY29udGFpbmVyV2lkdGggPSAkKG9wdGlvbnMubmV0d29ya0NvbnRhaW5lclNlbGVjdG9yKS53aWR0aCgpO1xuICAgIHZhciBjb250YWluZXJIZWlnaHQgPSAkKG9wdGlvbnMubmV0d29ya0NvbnRhaW5lclNlbGVjdG9yKS5oZWlnaHQoKTtcbiAgICAkKG9wdGlvbnMubmV0d29ya0NvbnRhaW5lclNlbGVjdG9yICsgJzpwYXJlbnQnKS5wcmVwZW5kKCc8ZGl2IHN0eWxlPVwicG9zaXRpb246IGFic29sdXRlOyB6LWluZGV4OiA5OTk5OTk5OyBsZWZ0OiA0NSU7IHRvcDogJyArIGNvbnRhaW5lckhlaWdodCAvIDIgKyAncHg7XCIgY2xhc3M9XCInK2NsYXNzTmFtZSsnLXdyYXBwZXJcIj4nK1xuICAgICc8ZGl2IHN0eWxlPVwibWFyZ2luOiAwIGF1dG87IG1hcmdpbi1ib3R0b206IDVweDsgd2lkdGg6NTBweFwiPjxpIGNsYXNzPVwiZmEgZmEtc3Bpbm5lciBmYS1zcGluIGZhLTN4IGZhLWZ3ICcgKyBjbGFzc05hbWUgKyAnXCI+PC9pPjwvZGl2PicrXG4gICAgJzxkaXYgc3R5bGU9XCJ3aWR0aDogMjIwcHg7IGhlaWdodCAyMCVcIj48aSBjbGFzcz1cIicgKyBjbGFzc05hbWUgKyAnLXRleHRcIj5UYWtlIGEgc2lwIG9mIHlvdXIgY29mZmVlIHdoaWxlIHlvdSB3YWl0Li4uPC9pPjwvZGl2PicrXG4gICAgJzwvZGl2PicpO1xuICAgICQoXCIuXCIrY2xhc3NOYW1lKyctdGV4dCcpLmZhZGVPdXQoMClcbiAgIH1cbiB9O1xuIHVpVXRpbGl0aWVzLnNob3dTcGlubmVyVGV4dCA9IGZ1bmN0aW9uKGNsYXNzTmFtZSlcbiB7XG4gICAkKFwiLlwiK2NsYXNzTmFtZSsnLXRleHQnKS5mYWRlSW4oMClcbiB9XG5cbiB1aVV0aWxpdGllcy5zaG93U3Bpbm5lclRleHQgPSBmdW5jdGlvbihjbGFzc05hbWUpXG4ge1xuICAgJChcIi5cIitjbGFzc05hbWUrJy10ZXh0JykuZmFkZUluKDApXG4gfVxuXG4gdWlVdGlsaXRpZXMuZW5kU3Bpbm5lciA9IGZ1bmN0aW9uIChjbGFzc05hbWUpIHtcbiAgaWYgKCFjbGFzc05hbWUpIHtcbiAgICBjbGFzc05hbWUgPSAnZGVmYXVsdC1jbGFzcyc7XG4gIH1cblxuICBpZiAoJCgnLicgKyBjbGFzc05hbWUgKyAnLXdyYXBwZXInKS5sZW5ndGggPiAwKSB7XG4gICAgJCgnLicgKyBjbGFzc05hbWUgKyAnLXdyYXBwZXInKS5yZW1vdmUoKTtcbiAgfVxuIH07XG5cblxuIHJldHVybiB1aVV0aWxpdGllcztcbn07XG4iXSwibmFtZXMiOlsibGliVXRpbGl0aWVzIiwicmVxdWlyZSIsImxpYnMiLCJnZXRMaWJzIiwialF1ZXJ5IiwiJCIsIm1vZHVsZSIsImV4cG9ydHMiLCJvcHRpb25VdGlsaXRpZXMiLCJvcHRpb25zIiwidWlVdGlsaXRpZXMiLCJwYXJhbSIsImdldE9wdGlvbnMiLCJzdGFydFNwaW5uZXIiLCJjbGFzc05hbWUiLCJsZW5ndGgiLCJjb250YWluZXJXaWR0aCIsIm5ldHdvcmtDb250YWluZXJTZWxlY3RvciIsIndpZHRoIiwiY29udGFpbmVySGVpZ2h0IiwiaGVpZ2h0IiwicHJlcGVuZCIsImZhZGVPdXQiLCJzaG93U3Bpbm5lclRleHQiLCJmYWRlSW4iLCJlbmRTcGlubmVyIiwicmVtb3ZlIl0sInNvdXJjZVJvb3QiOiIifQ==\n//# sourceURL=webpack-internal:///./src/utilities/ui-utilities-factory.js\n"); /***/ }), @@ -442,7 +442,7 @@ module.exports = require("xml2js"); /***/ ((module) => { "use strict"; -module.exports = /*#__PURE__*/JSON.parse('{"name":"sbgnviz","version":"6.0.1","description":"SBGNPD visualization library","main":"sbgnviz.js","licence":"LGPL-3.0","scripts":{"test":"karma start --single-run --browsers ChromeHeadless karma.conf.js","build":"webpack","debug-js":"nodemon -e js --watch src -x \\"npm run build-sbgnviz-js\\""},"repository":{"type":"git","url":"https://github.com/iVis-at-Bilkent/sbgnviz.js.git"},"bugs":{"url":"https://github.com/iVis-at-Bilkent/sbgnviz.js/issues"},"homepage":"https://github.com/iVis-at-Bilkent/sbgnviz.js/","peerDependencies":{"cytoscape":"iVis-at-Bilkent/cytoscape.js#unstable","file-saver":"^2.0.2","jquery":"^3.3.1","tippy.js":"^3.4.0"},"dependencies":{"@babel/helpers":"^7.22.6","libsbgn.js":"github:sbgn/libsbgn.js#develop","libsbmljs_stable":"^5.18.0-beta1","mime-types":"^2.1.35","pretty-data":"^0.40.0","xml2js":"^0.4.17"},"devDependencies":{"@babel/core":"^7.14.3","@babel/preset-env":"^7.14.2","babel-loader":"^8.2.2","chai":"^4.3.4","jquery":"^3.3.1","karma":"^6.3.2","karma-browserify":"^8.0.0","karma-chai":"^0.1.0","karma-chrome-launcher":"^3.1.0","karma-mocha":"^2.0.1","mocha":"^8.3.2","node-polyfill-webpack-plugin":"^1.1.2","webpack":"^5.38.1","webpack-cli":"^4.10.0","webpack-node-externals":"^3.0.0"}}'); +module.exports = /*#__PURE__*/JSON.parse('{"name":"sbgnviz","version":"6.1.0","description":"SBGNPD visualization library","main":"sbgnviz.js","licence":"LGPL-3.0","scripts":{"test":"karma start --single-run --browsers ChromeHeadless karma.conf.js","build":"webpack","debug-js":"nodemon -e js --watch src -x \\"npm run build-sbgnviz-js\\""},"repository":{"type":"git","url":"https://github.com/iVis-at-Bilkent/sbgnviz.js.git"},"bugs":{"url":"https://github.com/iVis-at-Bilkent/sbgnviz.js/issues"},"homepage":"https://github.com/iVis-at-Bilkent/sbgnviz.js/","peerDependencies":{"cytoscape":"iVis-at-Bilkent/cytoscape.js#master","file-saver":"^2.0.2","jquery":"^3.3.1","tippy.js":"^3.4.0"},"dependencies":{"@babel/helpers":"^7.22.6","libsbgn.js":"github:sbgn/libsbgn.js#master","libsbmljs_stable":"^5.18.0-beta1","mime-types":"^2.1.35","pretty-data":"^0.40.0","xml2js":"^0.4.17"},"devDependencies":{"@babel/core":"^7.14.3","@babel/preset-env":"^7.14.2","babel-loader":"^8.2.2","chai":"^4.3.4","jquery":"^3.3.1","karma":"^6.3.2","karma-browserify":"^8.0.0","karma-chai":"^0.1.0","karma-chrome-launcher":"^3.1.0","karma-mocha":"^2.0.1","mocha":"^8.3.2","node-polyfill-webpack-plugin":"^1.1.2","webpack":"^5.38.1","webpack-cli":"^4.10.0","webpack-node-externals":"^3.0.0"}}'); /***/ }) @@ -495,4 +495,4 @@ module.exports = /*#__PURE__*/JSON.parse('{"name":"sbgnviz","version":"6.0.1","d /******/ return __webpack_exports__; /******/ })() ; -}); +}); \ No newline at end of file diff --git a/src/utilities/gpml-to-sbgnml-converter-factory.js b/src/utilities/gpml-to-sbgnml-converter-factory.js index a2f17d5..d29bc79 100644 --- a/src/utilities/gpml-to-sbgnml-converter-factory.js +++ b/src/utilities/gpml-to-sbgnml-converter-factory.js @@ -10,7 +10,7 @@ module.exports = function() { gpmlToSbgnml.convert = function (xml, callback) { - var conversionApiUrl = "https://minerva-dev.lcsb.uni.lu/minerva/api/convert/GPML:SBGN-ML"; + var conversionApiUrl = "https://minerva-service.lcsb.uni.lu/minerva/api/convert/GPML:SBGN-ML"; return $.ajax({ type: 'post',