{"version":3,"sources":["../../.yarn/cache/browser-pack-npm-6.1.0-67557e011b-9e5993d3ee.zip/node_modules/browser-pack/_prelude.js","../../.yarn/cache/assert-npm-1.5.0-3303b97e04-9be48435f7.zip/node_modules/assert/assert.js","../../.yarn/cache/babel-polyfill-npm-6.26.0-4fd88717c9-6fb1a3c0bf.zip/node_modules/babel-polyfill/lib/index.js","../../.yarn/cache/es5-shim-npm-4.6.7-cfbc820543-f2f60cf3d9.zip/node_modules/es5-shim/es5-shim.js","../../.yarn/cache/escape-html-npm-1.0.3-376c22ee74-6213ca9ae0.zip/node_modules/escape-html/index.js","../../.yarn/cache/he-npm-1.2.0-3b73a2ff07-3d4d6babcc.zip/node_modules/he/he.js","../../.yarn/cache/inherits-npm-2.0.1-0011554c03-6536b93772.zip/node_modules/inherits/inherits_browser.js","../../.yarn/cache/locale-npm-0.1.0-6c7fdc5891-42af4432bc.zip/node_modules/locale/lib/index.js","../../.yarn/cache/make-plural-npm-4.3.0-a012b68a9f-1702556e98.zip/node_modules/make-plural/umd/pluralCategories.js","../../.yarn/cache/make-plural-npm-4.3.0-a012b68a9f-1702556e98.zip/node_modules/make-plural/umd/plurals.js","../../.yarn/cache/messageformat-npm-1.1.1-3560e9b2ff-0a7dd20656.zip/node_modules/messageformat/lib/compiler.js","../../.yarn/cache/messageformat-npm-1.1.1-3560e9b2ff-0a7dd20656.zip/node_modules/messageformat/lib/index.js","../../.yarn/cache/messageformat-npm-1.1.1-3560e9b2ff-0a7dd20656.zip/node_modules/messageformat/lib/runtime.js","../../.yarn/cache/messageformat-parser-npm-1.1.0-4697f01975-3af08e6421.zip/node_modules/messageformat-parser/parser.js","../../.yarn/cache/object-assign-npm-4.1.1-1004ad6dec-fcc6e4ea8c.zip/node_modules/object-assign/index.js","../../.yarn/cache/path-browserify-npm-1.0.1-f975d99a99-c6d7fa3764.zip/node_modules/path-browserify/index.js","../../.yarn/cache/process-npm-0.11.10-aeb3b641ae-bfcce49814.zip/node_modules/process/browser.js","../../.yarn/cache/querystring-es3-npm-0.2.1-f4632f2760-691e8d6b8b.zip/node_modules/querystring-es3/decode.js","../../.yarn/cache/querystring-es3-npm-0.2.1-f4632f2760-691e8d6b8b.zip/node_modules/querystring-es3/encode.js","../../.yarn/cache/querystring-es3-npm-0.2.1-f4632f2760-691e8d6b8b.zip/node_modules/querystring-es3/index.js","../../.yarn/cache/regenerator-runtime-npm-0.10.5-83f627af0c-35b33dbe53.zip/node_modules/regenerator-runtime/runtime.js","../../.yarn/cache/reserved-words-npm-0.1.2-eed4b16ca9-72e80f71dc.zip/node_modules/reserved-words/lib/index.js","../../.yarn/cache/reserved-words-npm-0.1.2-eed4b16ca9-72e80f71dc.zip/node_modules/reserved-words/lib/reserved-words.js","../../.yarn/cache/semver-npm-6.3.0-b3eace8bfd-1b26ecf6db.zip/node_modules/semver/semver.js","../../.yarn/cache/underscore-npm-1.13.6-3ebe9d92fb-d5cedd14a9.zip/node_modules/underscore/underscore-umd.js","../../.yarn/cache/url-join-npm-3.0.0-51bfd963c9-3bbabeb3be.zip/node_modules/url-join/lib/url-join.js","../../.yarn/cache/util-npm-0.10.3-f43de5ccbb-bd800f5d23.zip/node_modules/util/support/isBufferBrowser.js","../../.yarn/cache/util-npm-0.10.3-f43de5ccbb-bd800f5d23.zip/node_modules/util/util.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/fn/regexp/escape.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_a-function.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_a-number-value.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_add-to-unscopables.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_advance-string-index.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_an-instance.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_an-object.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_array-copy-within.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_array-fill.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_array-from-iterable.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_array-includes.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_array-methods.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_array-reduce.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_array-species-constructor.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_array-species-create.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_bind.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_classof.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_cof.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_collection-strong.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_collection-to-json.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_collection-weak.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_collection.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_core.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_create-property.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_ctx.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_date-to-iso-string.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_date-to-primitive.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_defined.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_descriptors.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_dom-create.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_enum-bug-keys.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_enum-keys.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_export.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_fails-is-regexp.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_fails.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_fix-re-wks.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_flags.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_flatten-into-array.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_for-of.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_function-to-string.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_global.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_has.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_hide.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_html.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_ie8-dom-define.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_inherit-if-required.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_invoke.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_iobject.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_is-array-iter.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_is-array.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_is-integer.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_is-object.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_is-regexp.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_iter-call.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_iter-create.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_iter-define.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_iter-detect.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_iter-step.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_iterators.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_library.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_math-expm1.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_math-fround.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_math-log1p.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_math-scale.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_math-sign.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_meta.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_metadata.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_microtask.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_new-promise-capability.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_object-assign.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_object-create.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_object-dp.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_object-dps.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_object-forced-pam.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_object-gopd.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_object-gopn-ext.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_object-gopn.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_object-gops.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_object-gpo.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_object-keys-internal.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_object-keys.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_object-pie.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_object-sap.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_object-to-array.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_own-keys.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_parse-float.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_parse-int.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_perform.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_promise-resolve.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_property-desc.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_redefine-all.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_redefine.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_regexp-exec-abstract.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_regexp-exec.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_replacer.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_same-value.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_set-collection-from.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_set-collection-of.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_set-proto.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_set-species.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_set-to-string-tag.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_shared-key.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_shared.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_species-constructor.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_strict-method.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_string-at.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_string-context.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_string-html.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_string-pad.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_string-repeat.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_string-trim.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_string-ws.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_task.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_to-absolute-index.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_to-index.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_to-integer.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_to-iobject.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_to-length.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_to-object.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_to-primitive.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_typed-array.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_typed-buffer.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_typed.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_uid.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_user-agent.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_validate-collection.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_wks-define.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_wks-ext.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/_wks.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/core.get-iterator-method.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/core.regexp.escape.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.array.copy-within.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.array.every.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.array.fill.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.array.filter.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.array.find-index.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.array.find.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.array.for-each.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.array.from.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.array.index-of.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.array.is-array.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.array.iterator.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.array.join.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.array.last-index-of.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.array.map.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.array.of.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.array.reduce-right.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.array.reduce.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.array.slice.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.array.some.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.array.sort.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.array.species.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.date.now.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.date.to-iso-string.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.date.to-json.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.date.to-primitive.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.date.to-string.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.function.bind.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.function.has-instance.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.function.name.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.map.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.math.acosh.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.math.asinh.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.math.atanh.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.math.cbrt.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.math.clz32.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.math.cosh.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.math.expm1.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.math.fround.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.math.hypot.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.math.imul.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.math.log10.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.math.log1p.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.math.log2.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.math.sign.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.math.sinh.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.math.tanh.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.math.trunc.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.number.constructor.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.number.epsilon.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.number.is-finite.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.number.is-integer.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.number.is-nan.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.number.is-safe-integer.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.number.max-safe-integer.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.number.min-safe-integer.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.number.parse-float.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.number.parse-int.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.number.to-fixed.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.number.to-precision.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.object.assign.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.object.create.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.object.define-properties.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.object.define-property.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.object.freeze.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.object.get-own-property-descriptor.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.object.get-own-property-names.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.object.get-prototype-of.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.object.is-extensible.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.object.is-frozen.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.object.is-sealed.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.object.is.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.object.keys.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.object.prevent-extensions.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.object.seal.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.object.set-prototype-of.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.object.to-string.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.parse-float.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.parse-int.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.promise.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.reflect.apply.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.reflect.construct.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.reflect.define-property.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.reflect.delete-property.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.reflect.enumerate.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.reflect.get-own-property-descriptor.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.reflect.get-prototype-of.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.reflect.get.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.reflect.has.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.reflect.is-extensible.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.reflect.own-keys.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.reflect.prevent-extensions.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.reflect.set-prototype-of.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.reflect.set.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.regexp.constructor.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.regexp.exec.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.regexp.flags.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.regexp.match.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.regexp.replace.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.regexp.search.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.regexp.split.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.regexp.to-string.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.set.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.string.anchor.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.string.big.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.string.blink.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.string.bold.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.string.code-point-at.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.string.ends-with.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.string.fixed.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.string.fontcolor.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.string.fontsize.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.string.from-code-point.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.string.includes.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.string.italics.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.string.iterator.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.string.link.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.string.raw.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.string.repeat.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.string.small.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.string.starts-with.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.string.strike.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.string.sub.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.string.sup.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.string.trim.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.symbol.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.typed.array-buffer.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.typed.data-view.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.typed.float32-array.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.typed.float64-array.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.typed.int16-array.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.typed.int32-array.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.typed.int8-array.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.typed.uint16-array.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.typed.uint32-array.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.typed.uint8-array.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.typed.uint8-clamped-array.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.weak-map.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es6.weak-set.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.array.flat-map.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.array.flatten.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.array.includes.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.asap.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.error.is-error.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.global.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.map.from.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.map.of.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.map.to-json.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.math.clamp.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.math.deg-per-rad.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.math.degrees.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.math.fscale.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.math.iaddh.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.math.imulh.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.math.isubh.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.math.rad-per-deg.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.math.radians.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.math.scale.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.math.signbit.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.math.umulh.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.object.define-getter.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.object.define-setter.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.object.entries.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.object.get-own-property-descriptors.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.object.lookup-getter.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.object.lookup-setter.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.object.values.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.observable.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.promise.finally.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.promise.try.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.reflect.define-metadata.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.reflect.delete-metadata.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.reflect.get-metadata-keys.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.reflect.get-metadata.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.reflect.get-own-metadata-keys.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.reflect.get-own-metadata.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.reflect.has-metadata.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.reflect.has-own-metadata.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.reflect.metadata.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.set.from.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.set.of.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.set.to-json.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.string.at.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.string.match-all.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.string.pad-end.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.string.pad-start.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.string.trim-left.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.string.trim-right.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.symbol.async-iterator.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.symbol.observable.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.system.global.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.weak-map.from.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.weak-map.of.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.weak-set.from.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/es7.weak-set.of.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/web.dom.iterable.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/web.immediate.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/modules/web.timers.js","../../.yarn/unplugged/core-js-npm-2.6.12-0b93d77d31/node_modules/core-js/shim.js","../common/lib/configuration/dyslexicBlacklist.json","../common/lib/configuration/features.json","../common/lib/configuration/meCountryCodes.json","../common/lib/configuration/reversePreviewSites.json","../common/lib/configuration/supportedLanguages.json","business-objects/account-limits.js","business-objects/loan-title.js","lib/appPromoManager.js","lib/cookieConfig.js","lib/featureManager-ts.js","lib/featureManager.js","lib/featureManagerBuilder.js","lib/fulfillment-ts.js","lib/getOptimizedCover-ts.js","lib/i18n/browser/index.js","lib/i18n/messageformat.js","lib/i18n/translater.js","lib/i18n/utility.js","lib/internal/routing.js","lib/numbers.js","lib/simpleHash.js","lib/supportUrl.js","lib/utility/bitFlag.js","lib/utility/clone-ts.js","lib/utility/macmillanMessage.js","models/HighlightedFeatureState.js","models/OdTrack.js","models/dao/MediaParameters.js","public/ecmascript/collections/base.js","public/ecmascript/components/HoldCancelModal/HoldCancelModal.js","public/ecmascript/components/MacOSAudiobookSupportPopover/MacOSAudiobookSupportPopover.js","public/ecmascript/components/RemoveSuspendedHoldModal/RemoveSuspendHoldModal.js","public/ecmascript/components/RemoveSuspendedHoldModal/RemoveSuspendHoldModalTemplate.html.js","public/ecmascript/components/SuspendHoldModal/SuspendHoldModal.js","public/ecmascript/components/SuspendHoldModal/SuspendHoldModalTemplate.html.js","public/ecmascript/components/SuspendHoldSuccessModal/SuspendHoldSuccessModal.js","public/ecmascript/components/SuspendHoldSuccessModal/SuspendHoldSuccessModalTemplate.html.js","public/ecmascript/components/TitleFulfillmentModal/TitleFulfillmentModal.js","public/ecmascript/components/account_history/views/ImportFromRatedCompleteModal.js","public/ecmascript/components/app-badge/app-badge.html.js","public/ecmascript/components/auto_scroll/autoScroll.js","public/ecmascript/components/back_button_redirect/BackButtonRedirect.js","public/ecmascript/components/common/Checkbox.js","public/ecmascript/components/common/HashManager.js","public/ecmascript/components/common/RadioButton.js","public/ecmascript/components/common/confirmDialog.js","public/ecmascript/components/common/modal.js","public/ecmascript/components/common/templates/modal.html.js","public/ecmascript/components/cookie_settings_modal/cookieSettingsModal.html.js","public/ecmascript/components/cookie_settings_modal/cookieSettingsModal.js","public/ecmascript/components/history_event_tracker/HistoryEventListener.js","public/ecmascript/components/history_event_tracker/HistoryEventTracker.js","public/ecmascript/components/holdInformation/main.js","public/ecmascript/components/holdInformation/templates/HoldInformation.html.js","public/ecmascript/components/holdInformation/views/HoldInformation.js","public/ecmascript/components/holdInformation/views/HoldInformationModal.js","public/ecmascript/components/holdInformationV2/HoldInformationModalV2.js","public/ecmascript/components/holdInformationV2/HoldInformationV2.html.js","public/ecmascript/components/holdInformationV2/HoldInformationV2.js","public/ecmascript/components/kanopy-menu-ad/kanopy-menu-ad-view.html.js","public/ecmascript/components/kanopy-menu-ad/kanopy-menu-ad-view.js","public/ecmascript/components/kindle_preference_modal/KindlePreference.js","public/ecmascript/components/kindle_preference_modal/templates/KindlePreferenceModal.html.js","public/ecmascript/components/kindle_preference_modal/templates/KindlePreferenceResultModal.html.js","public/ecmascript/components/kindle_preference_modal/views/KindlePreferenceModal.js","public/ecmascript/components/kindle_preference_modal/views/KindlePreferenceResultModal.js","public/ecmascript/components/language_selection/main.js","public/ecmascript/components/language_selection/views/language_selection.js","public/ecmascript/components/lending_period_modal/LendingPeriodCollection.js","public/ecmascript/components/lending_period_modal/LendingPeriodModal.html.js","public/ecmascript/components/lending_period_modal/LendingPeriodModal.js","public/ecmascript/components/lending_period_modal/PatronTitleLendingPeriods.js","public/ecmascript/components/libby-app-group/app-store-awards.html.js","public/ecmascript/components/libby-app-group/libby-app-group.html.js","public/ecmascript/components/media/ContextMenu.js","public/ecmascript/components/media/Cover.js","public/ecmascript/components/media/MediaInterface.js","public/ecmascript/components/media/TitleActionButton.js","public/ecmascript/components/media/TitleCard.js","public/ecmascript/components/media/TitleCollectionView.js","public/ecmascript/components/media/TitleHeaderBar.js","public/ecmascript/components/media/WishListButton.js","public/ecmascript/components/media/models/LendingPeriod.js","public/ecmascript/components/media/models/Title.js","public/ecmascript/components/media/models/TitleCollection.js","public/ecmascript/components/media/templates/ContextMenu.html.js","public/ecmascript/components/media/templates/Cover.html.js","public/ecmascript/components/media/templates/DownloadWarningModal.html.js","public/ecmascript/components/media/templates/HoldConflictPanel.html.js","public/ecmascript/components/media/templates/HoldSuccessRelatedTitles.html.js","public/ecmascript/components/media/templates/HoldSuccessTemplate.html.js","public/ecmascript/components/media/templates/NoCover.html.js","public/ecmascript/components/media/templates/PlaceHoldPanel.html.js","public/ecmascript/components/media/templates/RemoveHistory.html.js","public/ecmascript/components/media/templates/TitleCard.html.js","public/ecmascript/components/media/templates/TitleFormatBadge.html.js","public/ecmascript/components/media/templates/TitleName.html.js","public/ecmascript/components/media/templates/WishListButton.html.js","public/ecmascript/components/media/views/DownloadWarningModal.js","public/ecmascript/components/media/views/HoldConflictModal.js","public/ecmascript/components/media/views/HoldModal.js","public/ecmascript/components/media/views/HoldSuccessModal.js","public/ecmascript/components/media/views/NookEulaModal.js","public/ecmascript/components/media/views/PlaceHoldPanel.js","public/ecmascript/components/media/views/RemoveHistoryModal.js","public/ecmascript/components/media/views/TitleInfo.js","public/ecmascript/components/media/views/TitleInfo/TitleAuthor.js","public/ecmascript/components/media/views/TitleInfo/TitleEdition.js","public/ecmascript/components/media/views/TitleInfo/TitleFormatBadge.js","public/ecmascript/components/media/views/TitleInfo/TitleName.js","public/ecmascript/components/mobile_account_menu/main.js","public/ecmascript/components/mobile_account_menu/views/account_menu_mobile.js","public/ecmascript/components/non_hold_conflict_modal/NonHoldConflictModal.js","public/ecmascript/components/non_hold_conflict_modal/NonHoldConlictModal.html.js","public/ecmascript/components/notifications_drawer/NotificationsDrawer.js","public/ecmascript/components/notifications_drawer/NotificationsItem.js","public/ecmascript/components/notifications_event_tracker/NotificationsEventTracker.js","public/ecmascript/components/popover/popover.js","public/ecmascript/components/quick_search/collections/autocompletions.js","public/ecmascript/components/quick_search/main.js","public/ecmascript/components/quick_search/models/autocompletion.js","public/ecmascript/components/quick_search/models/quick_search.js","public/ecmascript/components/quick_search/views/autocompletion.js","public/ecmascript/components/quick_search/views/autocompletions.js","public/ecmascript/components/quick_search/views/search_bar.js","public/ecmascript/components/quick_search/views/search_bar_autocomplete.js","public/ecmascript/components/session_expired_modal/SessionExpiredModal.html.js","public/ecmascript/components/session_expired_modal/SessionExpiredModal.js","public/ecmascript/components/site/EventBridge.js","public/ecmascript/components/site/ga/TrackingCirculation.js","public/ecmascript/components/site/ga/TrackingKindleFulfillment.js","public/ecmascript/components/site/ga/TrackingPublicAPIFulfillment.js","public/ecmascript/components/site/ga/TrackingSignInForms.js","public/ecmascript/components/tls-warning-modal/tlsWarningModal.html.js","public/ecmascript/components/tls-warning-modal/tlsWarningModal.js","public/ecmascript/components/toaster/app.js","public/ecmascript/components/toaster/toaster.html.js","public/ecmascript/components/visitor_action_disallowed_modal/VisitorActionDisallowedModal.js","public/ecmascript/document_ready.js","public/ecmascript/global_bindings.js","public/ecmascript/global_bootstrapping.js","public/ecmascript/models/Card.js","public/ecmascript/models/GlobalPreferences.js","public/ecmascript/models/base.js","public/ecmascript/models/preferences.js","public/ecmascript/pages/all.js","public/ecmascript/polyfills/custom-event.js","public/ecmascript/title-actions/Preview.js","public/ecmascript/title-actions/TitleActionHandler.js","public/ecmascript/title-actions/TitleActions.js","public/ecmascript/title-actions/TitleState.js","public/ecmascript/title-actions/borrow/Borrow.js","public/ecmascript/title-actions/borrow/BorrowActions.js","public/ecmascript/title-actions/checks/LanguageMismatch/LanguageMismatch.js","public/ecmascript/title-actions/checks/LanguageMismatch/LanguageMismatchModal.html.js","public/ecmascript/title-actions/checks/LanguageMismatch/LanguageMismatchModal.js","public/ecmascript/title-actions/history/ReadingHistory.js","public/ecmascript/title-actions/history/ReadingHistoryActions.js","public/ecmascript/title-actions/holds/Hold.js","public/ecmascript/title-actions/holds/HoldActions.js","public/ecmascript/title-actions/nook/Nook.js","public/ecmascript/title-actions/nook/NookActions.js","public/ecmascript/title-actions/ratings/StarRating.js","public/ecmascript/title-actions/ratings/StarRatingActions.js","public/ecmascript/title-actions/shared/SharedActions.js","public/ecmascript/title-actions/wishlist/Wishlist.js","public/ecmascript/util/FeatureHighlightManager.js","public/ecmascript/util/Promise.js","public/ecmascript/util/account/arrowTabAccountMenu.js","public/ecmascript/util/carousel/hideArrowsOnEndOfScroll.js","public/ecmascript/util/carousel/hideCarouselArrows.js","public/ecmascript/util/carousel/roundScroll.js","public/ecmascript/util/carousel/scrollCarousel.js","public/ecmascript/util/colors/componentToHex.js","public/ecmascript/util/colors/rgbToHex.js","public/ecmascript/util/compatibility/arrowTabMenu.js","public/ecmascript/util/compatibility/force_real_page_reload.js","public/ecmascript/util/compatibility/onunload.js","public/ecmascript/util/compatibility/removeCarouselFunctionality.js","public/ecmascript/util/dates/addDays.js","public/ecmascript/util/dyslexic/expensiveDomTraversalForDyslexicIfCookiePleaseDoNotUse.js","public/ecmascript/util/dyslexic/expensiveDomTraversalForDyslexicPleaseDoNotUse.js","public/ecmascript/util/encoding/rfc3986EncodeURIComponent.js","public/ecmascript/util/findFormatId.js","public/ecmascript/util/keycodes.js","public/ecmascript/util/logging/logger.js","public/ecmascript/util/noCard.js","public/ecmascript/util/parameters.js","public/ecmascript/util/query.js","public/ecmascript/util/requests/ensureSimpleRequest.js","public/ecmascript/util/routes.js","public/ecmascript/util/svgLoader.js","public/ecmascript/util/text.js","public/ecmascript/util/title-actions/fillStars.js","public/ecmascript/util/title-actions/handleForwardActionHold.js","public/ecmascript/util/title-actions/openHoldConflictModal.js","public/ecmascript/util/title-actions/processForwardedAction.js","public/ecmascript/util/title-actions/processInstantForwardActions.js","public/ecmascript/util/title-actions/selectStarRating.js","public/ecmascript/util/title-actions/setUserStarRating.js","public/ecmascript/util/toast/getCookieExplanation.js","public/ecmascript/util/url/addQueryParam.js","public/ecmascript/util/url/getQueryParams.js","public/ecmascript/util/url/replaceQueryParam.js","public/ecmascript/util/url/stripNoLinkedCardQuery.js","public/ecmascript/views/base.js","public/ecmascript/views/collection.js","public/ecmascript/window_pageshow.js","public/js/app.js","public/js/app/actions.js","public/js/app/modal.js","public/js/app/nav.js","public/js/app/sample.js","public/js/app/title-actions.js","public/js/placeholder.js","routes/routing-configuration/index.js","routes/routing-configuration/index_.js"],"names":[],"mappings":"AAAA;;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AC1fA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AC3BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClyEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC9EA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACzVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACjKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzlDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/fA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7yDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;AC1FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;ACjhBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrFA;AACA;AACA;AACA;AACA;;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AChuBA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;ACjLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;AC5jDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AC1/DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7EA;AACA;AACA;AACA;AACA;AACA;;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;AC1kBA;AACA;AACA;;ACFA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrFA;AACA;AACA;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;;ACFA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;;ACHA;AACA;;ACDA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACheA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;;ACDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;;ACDA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACbA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrEA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;;ACHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9RA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9CA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;;ACFA;AACA;AACA;;ACFA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACXA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACRA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;;ACFA;AACA;AACA;;ACFA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACfA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACPA;AACA;;ACDA;AACA;;ACDA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;;ACFA;AACA;AACA;;ACFA;AACA;AACA;;ACFA;AACA;AACA;;ACFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1DA;AACA;AACA;AACA;AACA;AACA;AACA;;ACNA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC3BA;AACA;AACA;AACA;AACA;;ACJA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpNA;;;;;;AACA,IAAM,IAAI,QAAQ,YAAR,CAAV;;IAEM,a;AACF,2BAAY,KAAZ,EAAmB;AAAA;;AACf,aAAK,UAAL,GAAkB,CAAlB;AACA,aAAK,UAAL,GAAkB,CAAlB;AACA,aAAK,UAAL,GAAkB,CAAlB;AACA,aAAK,UAAL,GAAkB,CAAlB;AACA,aAAK,eAAL,GAAuB,CAAvB;AACA;AACA,aAAK,aAAL,GAAqB,IAArB;AACA,aAAK,aAAL,GAAqB,CAArB;AACA,aAAK,qCAAL,GAA6C,CAA7C;;AAEA,UAAE,MAAF,CAAS,IAAT,EAAe,KAAf;AACH;;;;4BAEoB;AACjB,mBAAO,KAAK,UAAL,GAAkB,KAAK,qCAA9B;AACH;;;4BAEoB;AACjB,mBAAO,KAAK,UAAL,GAAkB,KAAK,UAA9B;AACH;;;4BAEuB;AACpB,mBAAO,KAAK,aAAL,GAAqB,KAAK,aAAjC;AACH;;;yCAEuB,I,EAAM,K,EAAO,K,EAAO,Q,EAAU;AAClD,gBAAI,gBAAgB,IAAI,aAAJ,EAApB;;AAEA,0BAAc,UAAd,GAA2B,MAAM,UAAjC;AACA,0BAAc,UAAd,GAA2B,KAAK,SAAhC;;AAEA,0BAAc,UAAd,GAA2B,MAAM,UAAjC;AACA,0BAAc,qCAAd,GACI,MAAM,qCADV;;AAGA,gBAAI,KAAK,yBAAT,EAAoC;AAChC,oBAAI,IAAI,KAAK,yBAAb;AACA,8BAAc,UAAd,GACI,EAAE,KAAF,IAAW,EAAE,SAAb,IAA0B,EAAE,KAA5B,IAAqC,cAAc,UADvD;AAEH;;AAED,0BAAc,aAAd,GAA8B,SAAS,UAAvC;AACA,mBAAO,aAAP;AACH;;;;;;AAGL,OAAO,OAAP,GAAiB,aAAjB;;;;;;;;;ACnDA,IAAI,IAAI,QAAQ,YAAR,CAAR;AACA,IAAM,SAAS,QAAQ,QAAR,CAAf;;AAEA;AACA;AACA;;;IAGM,S;AACF,uBAAY,KAAZ,EAAmB,mBAAnB,EAAwC,YAAxC,EAAsD,SAAtD,EAAiE,KAAjE,EAAwE,2BAAxE,EAAqG,sCAArG,EACI,gBADJ,EACsB,aADtB,EACqC,mBADrC,EAC0D,WAD1D,EACuE,kBADvE,EAC2F,sBAD3F,EACmH;AAAA;;AAC/G,aAAK,mBAAL,GAA2B,mBAA3B;AACA,aAAK,YAAL,GAAoB,YAApB;AACA,aAAK,SAAL,GAAiB,SAAjB;AACA,aAAK,KAAL,GAAa,KAAb;AACA,aAAK,2BAAL,GAAmC,2BAAnC,CAL+G,CAK/C;AAChE,aAAK,sCAAL,GAA8C,sCAA9C,CAN+G,CAMxB;AACvF,aAAK,gBAAL,GAAwB,gBAAxB;AACA,aAAK,aAAL,GAAqB,aAArB,CAR+G,CAQ3E;AACpC,aAAK,mBAAL,GAA2B,mBAA3B,CAT+G,CAS/D;AAChD,aAAK,WAAL,GAAmB,WAAnB,CAV+G,CAU/E;AAChC,aAAK,kBAAL,GAA0B,kBAA1B,CAX+G,CAWjE;AAC9C,aAAK,sBAAL,GAA8B,sBAA9B,CAZ+G,CAYzD;AACtD,eAAO,MAAP,CAAc,IAAd,EAAoB,KAApB;AACH;;;;4BAEyB;AACtB,gBAAI,oBAAoB,EAAxB;AACA,gBAAI,KAAK,kBAAT,EAA6B;AACzB,oCAAoB,QAApB;AACH,aAFD,MAGK,IAAI,KAAK,yBAAT,EAAoC;AACrC,oCAAoB,KAAK,uBAAL,CAA6B,CAA7B,EAAgC,EAApD;AACH;AACD,mBAAO,iBAAP;AACH;;;4BAEgC;AAC7B,mBAAO,CAAC,KAAK,2BAAN,IAAqC,CAAC,KAAK,kBAA3C,IAAiE,EAAE,KAAK,iBAAL,IAA0B,KAAK,iBAAL,CAAuB,MAAvB,GAAgC,CAA5D,CAAxE;AACH;;;4BAEsB;AACnB,mBAAO,KAAK,gBAAL,IAAyB,KAAK,YAAL,IAAqB,IAA9C,IAAsD,KAAK,YAAL,CAAkB,MAAlB,GAA2B,CAAjF,IAAsF,KAAK,YAAL,CAAkB,CAAlB,EAAqB,EAArB,KAA4B,cAAzH;AACH;;;4BAEa;AACV,mBAAO,KAAK,IAAL,CAAU,EAAV,KAAiB,OAAxB;AACH;;;4BAEiB;AACd,mBAAO,KAAK,IAAL,CAAU,EAAV,KAAiB,WAAxB;AACH;;;4BAEa;AACV,mBAAO,KAAK,IAAL,CAAU,EAAV,KAAiB,OAAxB;AACH;;;4BAEgB;AACb,mBAAO,KAAK,IAAL,CAAU,EAAV,KAAiB,UAAxB;AACH;;;4BAEkB;AACf,mBAAO,CAAC,EAAE,KAAK,eAAL,IAAwB,KAAK,eAAL,CAAqB,wBAA/C,CAAR;AACH;;;4BAEqB;AAClB,mBAAO,KAAK,mBAAL,GACD,KAAK,OAAL,CAAa,SAAb,CAAuB,UAAC,MAAD;AAAA,uBAAY,OAAO,EAAP,KAAc,cAA1B;AAAA,aAAvB,MAAqE,CAAC,CADrE,GAED,KAAK,YAAL,CAAkB,SAAlB,CAA4B,UAAC,MAAD;AAAA,uBAAY,OAAO,EAAP,KAAc,cAA1B;AAAA,aAA5B,MAA0E,CAAC,CAFjF;AAGH;;;4BAEkB;AACf,mBAAQ,KAAK,OAAL,CAAa,SAAb,CAAuB,UAAC,MAAD;AAAA,uBAAY,OAAO,EAAP,KAAc,eAA1B;AAAA,aAAvB,MAAsE,CAAC,CAAvE,IAA4E,KAAK,YAAL,CAAkB,SAAlB,CAA4B,UAAC,MAAD;AAAA,uBAAY,OAAO,EAAP,KAAc,eAA1B;AAAA,aAA5B,MAA2E,CAAC,CAAhK;AACH;;;4BAEsB;AACnB,mBAAQ,KAAK,OAAL,CAAa,SAAb,CAAuB,UAAC,MAAD;AAAA,uBAAY,OAAO,EAAP,KAAc,gBAA1B;AAAA,aAAvB,MAAuE,CAAC,CAAxE,IAA6E,KAAK,YAAL,CAAkB,SAAlB,CAA4B,UAAC,MAAD;AAAA,uBAAY,OAAO,EAAP,KAAc,gBAA1B;AAAA,aAA5B,MAA4E,CAAC,CAAlK;AACH;;;4BAE8B;AAC3B,mBAAO,KAAK,uBAAL,CAA6B,MAA7B,GAAsC,CAA7C;AACH;;;4BAEkB;AACf,mBAAO,KAAK,YAAL,CAAkB,IAAlB,CAAuB,UAAC,MAAD;AAAA,uBAAY,OAAO,EAAP,KAAc,cAA1B;AAAA,aAAvB,CAAP;AACH;;;4BAEqC;AAClC,mBAAO,KAAK,2BAAL,IACA,CAAC,KAAK,eADN,KAEE,KAAK,sBAAL,IAA+B,CAAC,KAAK,kBAAtC,IAA8D,CAAC,KAAK,sBAAN,IAAgC,KAAK,kBAFpG,KAGA,CAAC,KAAK,mBAHN,IAIA,CAAC,KAAK,uBAJb;AAKH;;;4BAEoC;AACjC,mBAAO,KAAK,2BAAL,IAAoC,CAAC,KAAK,+BAA1C,IAA6E,CAAC,KAAK,uBAA1F;AACH;;;4BAEiC;AAC9B,mBAAO,KAAK,2BAAL,IACA,KAAK,uBAAL,CAA6B,MAA7B,KAAwC,CAD/C;AAEH;;;4BAE0B;AACvB,mBAAO,KAAK,OAAL,IACA,KAAK,2BADL,IAEA,KAAK,uBAAL,CAA6B,MAA7B,GAAsC,CAF7C;AAGH;;;4BAEiC;AAC9B,mBAAO,CAAC,KAAK,OAAL,IAAiB,KAAK,WAAL,IAAoB,KAAK,sBAA3C,KAAuE,CAAC,KAAK,gBAA7E,IACA,KAAK,uBADL,IAEA,KAAK,uBAAL,CAA6B,MAA7B,GAAsC,CAFtC,KAGC,CAAC,KAAK,YAAN,IAAsB,CAAC,KAAK,mBAA5B,IAAmD,CAAC,KAAK,eAH1D,CAAP;AAIH;;;4BAEyB;AACtB,mBAAO,CAAC,KAAK,gBAAN,IAA0B,CAAC,KAAK,eAAhC,IAAmD,KAAK,YAAxD,IAAwE,KAAK,OAApF;AACH;;;4BAEsB;AACnB,mBAAO,KAAK,OAAL,CAAa,MAAb,CAAoB,UAAC,MAAD;AAAA,uBAAY,OAAO,EAAP,KAAc,cAAd,IAAgC,OAAO,EAAP,KAAc,YAA1D;AAAA,aAApB,CAAP;AACH;;;4BAE6B;AAAA;;AAC1B,mBAAO,KAAK,mBAAL,GACD,KAAK,OAAL,CAAa,MAAb,CAAoB,UAAC,MAAD;AAAA,uBAAY,OAAO,EAAP,KAAc,cAAd,IAC7B,OAAO,EAAP,KAAc,YADe,IAE7B,OAAO,EAAP,KAAc,iBAFe,IAG7B,OAAO,EAAP,KAAc,qBAHe,IAI7B,OAAO,EAAP,KAAc,iBAJe,IAK7B,EAAE,MAAK,kBAAL,IAA2B,OAAO,EAAP,KAAc,oBAA3C,CALiB;AAAA,aAApB,CADC,GAQD,KAAK,YAAL,CAAkB,MAAlB,CAAyB,UAAC,MAAD;AAAA,uBAAY,OAAO,EAAP,KAAc,cAAd,IAAgC,OAAO,EAAP,KAAc,YAA1D;AAAA,aAAzB,CARN;AASH;;;4BAEoC;AACjC,mBAAO,KAAK,uBAAL,CAA6B,MAA7B,CAAoC,UAAC,MAAD;AAAA,uBAAY,OAAO,EAAP,KAAc,eAA1B;AAAA,aAApC,CAAP;AACH;;;4BAEwB;AACrB,mBAAO,CAAC,EAAE,KAAK,eAAL,IAAwB,KAAK,eAAL,CAAqB,EAArB,IAA2B,IAArD,CAAR;AACH;;;4BAE6B;AAC1B,mBAAO,KAAK,mBAAL,KACD,KAAK,gBAAL,KAA0B,CAAC,KAAK,sBAAN,IAAgC,CAAC,KAAK,gBAAhE,KAAqF,KAAK,uBAAL,CAA6B,MAA7B,KAAwC,CAA9H,IACC,KAAK,OAAL,IAAgB,CAAC,KAAK,eAAtB,IAAyC,KAAK,gBAAL,CAAsB,MAAtB,KAAiC,CAA1E,IAA+E,KAAK,gBAAL,CAAsB,CAAtB,EAAyB,EAAzB,KAAgC,iBAAhH,IACG,KAAK,WAAL,IAAoB,KAAK,OAAL,CAAa,MAAb,KAAwB,CAA5C,IAAiD,KAAK,OAAL,CAAa,CAAb,EAAgB,EAAhB,KAAuB,qBAHzE,CAAP;AAIH;;;4BAEwB;AACrB,mBAAO,KAAK,kBAAL,IAA2B,KAAK,sBAAhC,IAA0D,CAAC,KAAK,iBAAhE,KACF,CAAC,KAAK,eAAN,IAAyB,CAAC,KAAK,YAA/B,IAA+C,KAAK,eAAL,CAAqB,wBADlE,CAAP;AAEH;;;4BAEqC;AAClC;AACA;AACA;AACA;AACA,mBAAO,KAAK,WAAL,IAAoB,KAAK,KAAzB,IAAkC,KAAK,YAAvC,IAAuD,KAAK,kBAA5D,IAAmF,KAAK,sBAAxF,IAAkH,KAAK,2BAAvH,KACK,CAAC,KAAK,sCAAN,IAAgD,CAAC,KAAK,gBAD3D,CAAP;AAEH;;;4BAE2B;AACxB;AACA,gBAAI,KAAK,YAAL,IAAqB,KAAK,YAAL,CAAkB,MAAlB,KAA6B,CAAlD,IAAuD,KAAK,SAA5D,KACC,KAAK,YAAL,CAAkB,CAAlB,EAAqB,EAArB,KAA4B,iBAA5B,IAAiD,KAAK,YAAL,CAAkB,CAAlB,EAAqB,EAArB,KAA4B,gBAA7E,IAAiG,KAAK,YAAL,CAAkB,CAAlB,EAAqB,EAArB,KAA4B,cAD9H,CAAJ,EACmJ;AAC/I,uBAAO,IAAP;AACH,aAHD,MAGO,IAAI,KAAK,eAAL,IAAwB,KAAK,eAAL,CAAqB,wBAAjD,EAA2E;AAC9E,uBAAQ,IAAR;AACH,aAFM,MAEA;AACH,uBAAO,EAAE,KAAK,SAAL,IAAkB,KAAK,YAAvB,IAAuC,KAAK,YAAL,CAAkB,MAAlB,GAA2B,CAApE,KAA2E,KAAK,SAAL,IAAkB,KAAK,uBAAzG;AACH;AACJ;;;4BAE6B;AAC1B,mBAAQ,KAAK,OAAL,KAAkB,KAAK,gBAAL,IAAyB,CAAC,KAAK,uBAAhC,IACd,KAAK,eADS,IAEd,KAAK,mBAFS,IAGb,KAAK,sBAAL,IAA+B,CAAC,KAAK,eAArC,IAAwD,KAAK,kBAHhD,IAId,KAAK,+BAJR,CAAD,IAKC,CAAC,KAAK,OAAN,IAAiB,KAAK,yBAAtB,IAAmD,CAAC,KAAK,+BALjE;AAMH;;;4BAE8B;AAC3B,mBAAQ,KAAK,kBAAL,IAA2B,CAAC,KAAK,sBAAlC,IACC,KAAK,sBAAL,IAA+B,KAAK,kBAApC,IAA0D,CAAC,KAAK,uBADjE,IAEC,KAAK,2BAAL,IAAoC,CAAC,KAAK,+BAFlD;AAGH;;;4BAEiB;AACd,mBAAQ,KAAK,uBAAL,IAAgC,KAAK,wBAAtC,IAAoE,KAAK,WAAL,IAAoB,CAAC,KAAK,SAA1B,IAAuC,KAAK,WAA5C,IAA2D,KAAK,kBAAhE,IAAsF,KAAK,mBAAtK;AACH;;;4BAEsB;AACnB,mBAAO,KAAK,WAAL,IAAoB,KAAK,WAAL,CAAiB,oBAA5C;AACH;;;4BAEuB;AACpB,mBAAO,KAAK,OAAL,IAAgB,KAAK,aAA5B;AACH;;;4BAEe;AACZ,gBAAI,gBAAgB,KAAK,OAAL,CAAa,MAAb,CAAoB;AAAA,uBAAU,CAAC,OAAO,EAAP,CAAU,QAAV,CAAmB,KAAnB,CAAD,IAA8B,CAAC,OAAO,EAAP,CAAU,QAAV,CAAmB,MAAnB,CAAzC;AAAA,aAApB,CAApB;AACA,mBAAO,cAAc,MAAd,KAAyB,CAAhC;AACH;;;;;;AAGL,OAAO,OAAP,GAAiB,SAAjB;;;;;;;;;ICnNM,e;AACF,+BAAc;AAAA;;AACV,aAAK,YAAL,GAAoB;AAChB,mBAAO,OADS;AAEhB,kBAAM,MAFU;AAGhB,oBAAQ,QAHQ;AAIhB,wBAAY;AAJI,SAApB;AAMH;;AAED;;;;;;;;;sCAKc,G,EAAK;AACf,gBAAI,YAAY,IAAI,OAAJ,CAAY,YAAZ,CAAhB;AACA,gBAAI,uBAAuB,IAAI,OAAJ,CAAY,kBAAZ,KAAmC,CAA9D;AACA,gBAAI,yBACA,IAAI,OAAJ,IACA,IAAI,OAAJ,CAAY,SADZ,IAEA,IAAI,cAFJ,IAGA,IAAI,cAAJ,CAAmB,QAAnB,CAA4B,OAAO,IAAI,OAAJ,CAAY,SAAnB,CAA5B,CAJJ;AAKA,mBACI,KAAK,cAAL,KACC,KAAK,cAAL,CAAoB,SAApB,CAA8B,QAA9B,KACG,sBAFJ,MAGC,wBACG,UAAU,IAAV,CAAe,SAAf,CADH,IAEG,WAAW,IAAX,CAAgB,SAAhB,CALJ,CADJ;AAQH;;AAED;;;;;;;;;;;AA2BA;;;;;;0CAMkB,W,EAAa;AAC3B,oBAAQ,WAAR;AACI,qBAAK,KAAK,YAAL,CAAkB,KAAvB;AACI,2BACI,CAAC,KAAK,QAAL,CAAc,cAAf,IACA,KAAK,cAAL,CAAoB,SAApB,CAA8B,cAA9B,CADA,IAEA,KAAK,QAAL,CAAc,gBAAd,CAA+B,QAA/B,CAAwC,OAAxC,CAHJ;AAKJ,qBAAK,KAAK,YAAL,CAAkB,IAAvB;AACI,2BACI,CAAC,KAAK,QAAL,CAAc,cAAf,IACA,KAAK,QAAL,CAAc,gBAAd,CAA+B,QAA/B,CAAwC,MAAxC,CAFJ;AAIJ,qBAAK,KAAK,YAAL,CAAkB,MAAvB;AACI,2BACI,KAAK,QAAL,CAAc,cAAd,IACA,KAAK,QAAL,CAAc,eADd,IAEA,CAAC,KAAK,QAAL,CAAc,cAHnB;AAKJ,qBAAK,KAAK,UAAV;AACI,2BACI,CAAC,KAAK,QAAL,CAAc,cAAf,IACA,KAAK,cAAL,CAAoB,SAApB,CAA8B,iBAA9B,CAFJ;AAnBR;AAwBH;;;qCApDmB,G,EAAK,G,EAAK,c,EAAgB;AAC1C,gBAAI,WAAW,IAAI,IAAJ,EAAf;AACA,qBAAS,cAAT,GAA0B,cAA1B;AACA,qBAAS,QAAT,GAAoB,IAAI,MAAxB;AACA,qBAAS,QAAT,CAAkB,cAAlB,GAAmC,SAAS,aAAT,CAAuB,GAAvB,CAAnC;AACA,mBAAO,QAAP;AACH;;AAED;;;;;;;;;qCAMoB,M,EAAQ;AACxB,gBAAI,WAAW,IAAI,IAAJ,EAAf;AACA,qBAAS,cAAT,GAA0B,OAAO,cAAjC;AACA,qBAAS,QAAT,GAAoB,OAAO,SAA3B;AACA,mBAAO,QAAP;AACH;;;;;;AAoCL,OAAO,OAAP,GAAiB,eAAjB;;;;;AC9FA,IAAM,UAAU,QAAQ,WAAR,CAAhB;;AAEA,OAAO,OAAP,GAAiB;AACb,wBAAoB;AAChB,cAAM,oBADU;AAEhB,oBAAY,QAAQ,iBAAR,GAA4B,EAFxB;AAGhB,iBAAS;AAHO,KADP;AAMb,4BAAwB;AACpB,cAAM,wBADc;AAEpB,oBAAY,QAAQ,kBAFA;AAGpB,iBAAS;AAHW,KANX;AAWb,6BAAyB;AACrB,cAAM,yBADe;AAErB,oBAAY,QAAQ,iBAAR,GAA4B,EAFnB;AAGrB,iBAAS;AAHY,KAXZ;AAgBb,aAAS;AACL,cAAM,UADD;AAEL,oBAAY,QAAQ,kBAAR,GAA6B,EAFpC;AAGL,iBAAS,IAHJ;AAIL,gBAAQ,eAJH;AAKL,kBAAU;AALL,KAhBI;AAuBb,qBAAiB;AACb,cAAM,iBADO;AAEb,oBAAY,QAAQ,kBAAR,GAA6B,EAF5B;AAGb,iBAAS;AAHI;AAvBJ,CAAjB;;;ACFA;;AACA,OAAO,cAAP,CAAsB,OAAtB,EAA+B,YAA/B,EAA6C,EAAE,OAAO,IAAT,EAA7C;AACA,QAAQ,cAAR,GAAyB,KAAK,CAA9B;AACA,IAAI,aAAa,QAAQ,oBAAR,CAAjB;AACA;;;AAGA,IAAI,iBAAiB,aAAe,YAAY;AAC5C;;;;;;;;AAQA,aAAS,cAAT,CAAwB,KAAxB,EAA+B,qBAA/B,EAAsD,MAAtD,EAA8D,WAA9D,EAA2E,6BAA3E,EAA0G;AACtG,aAAK,qBAAL,GAA6B,qBAA7B;AACA,aAAK,WAAL,GAAmB,KAAK,iBAAL,CAAuB,MAAvB,EAA+B,WAA/B,CAAnB;AACA,YAAI,WAAW,CAAC,GAAG,WAAW,UAAf,EAA2B,KAA3B,CAAf;AACA,yCACI,8BAA8B,OAA9B,CAAsC,UAAU,IAAV,EAAgB;AAClD,uBAAW,KAAK,uBAAL,CAA6B,QAA7B,EAAuC,qBAAvC,EAA8D,MAA9D,EAAsE,WAAtE,CAAX;AACH,SAFD,CADJ;AAIA,aAAK,QAAL,GAAgB,QAAhB;AACH;AACD;;;;;;;AAOA,mBAAe,SAAf,CAAyB,SAAzB,GAAqC,UAAU,OAAV,EAAmB;AACpD,eAAO,CAAC,EAAE,KAAK,cAAL,CAAoB,OAApB,MACL,KAAK,WAAL,GACK,KAAK,kBAAL,CAAwB,OAAxB,CADL,GAEK,KAAK,iBAAL,CAAuB,OAAvB,CAHA,CAAF,CAAR;AAIH,KALD;AAMA;;;;;;;AAOA,mBAAe,SAAf,CAAyB,iBAAzB,GAA6C,UAAU,OAAV,EAAmB;AAC5D,eAAO,KAAK,QAAL,CAAc,OAAd,KAA0B,KAAK,QAAL,CAAc,OAAd,EAAuB,OAAxD;AACH,KAFD;AAGA;;;;;;;AAOA,mBAAe,SAAf,CAAyB,kBAAzB,GAA8C,UAAU,OAAV,EAAmB;AAC7D,eAAO,KAAK,QAAL,CAAc,OAAd,KAA0B,KAAK,QAAL,CAAc,OAAd,EAAuB,QAAxD;AACH,KAFD;AAGA;;;;;AAKA,mBAAe,SAAf,CAAyB,cAAzB,GAA0C,UAAU,OAAV,EAAmB;AACzD,YAAI,UAAU,KAAK,qBAAL,CAA2B,OAA3B,CAAd;AACA,eAAO,CAAC,OAAD,IAAY,QAAQ,OAApB,IAA+B,KAAtC;AACH,KAHD;AAIA;;;;;;;AAOA,mBAAe,SAAf,CAAyB,iBAAzB,GAA6C,UAAU,MAAV,EAAkB,WAAlB,EAA+B;AACxE,eAAQ,WAAW,MAAX,IACJ,WAAW,MADP,IAEH,UAAU,MAAV,IAAoB,SAAS,MAF1B,IAGJ,gBAAgB,GAHpB;AAIH,KALD;AAMA,WAAO,cAAP;AACH,CA3EmC,EAApC;AA4EA,QAAQ,cAAR,GAAyB,cAAzB;;AAEA;;AAEA;;;;;ACvFA,IAAM,iBAAiB,QAAQ,wBAAR,EAAkC,cAAzD;;AAEA,OAAO,OAAP,GAAiB,cAAjB;;;;;ACFA,IAAI,IAAI,QAAQ,YAAR,CAAR;AACA,IAAI,WAAW,QAAQ,kDAAR,CAAf;AACA,IAAI,sBAAsB,QAAQ,6DAAR,CAA1B;AACA,IAAI,iBAAiB,QAAQ,kBAAR,CAArB;;AAEA;;;;;;AAMA,IAAI,yCAAyC,SAAzC,sCAAyC,CAAS,KAAT,EAAgB,oBAAhB,EAAsC,MAAtC,EAA8C;AACvF,QAAI,iBAAiB,EAAE,MAAF,CAAS,EAAT,EAAa,KAAb,CAArB;AACA,QAAI,qBAAqB,uBAAuB,oBAAoB,MAApB,CAAhD;AACA,QAAI,0BAA2B,sBAAsB,mBAAmB,GAAxE;;AAEA,mBAAe,iBAAf,IAAoC,EAAC,SAAS,uBAAV,EAAmC,UAAU,uBAA7C,EAApC;AACA,WAAO,cAAP;AACH,CAPD;;AASA,IAAI,sBAAsB,SAAtB,mBAAsB,CAAS,qBAAT,EAAgC,MAAhC,EAAwC,WAAxC,EAAqD,WAArD,EAAkE;AACxF,QAAI,CAAC,CAAC,WAAN,EAAmB;AACf,mBAAW,WAAX;AACH;AACD,WAAO,IAAI,cAAJ,CAAmB,QAAnB,EAA6B,qBAA7B,EAAoD,MAApD,EAA4D,WAA5D,EAAyE,CAC5E,EAAC,yBAAyB,EAAE,OAAF,CAAU,sCAAV,CAA1B,EAD4E,CAAzE,CAAP;AAGH,CAPD;;AASA,OAAO,OAAP,GAAiB,mBAAjB;;;AC7BA;;AACA,IAAI,WAAY,aAAQ,UAAK,QAAd,IAA2B,YAAY;AAClD,eAAW,OAAO,MAAP,IAAiB,UAAS,CAAT,EAAY;AACpC,aAAK,IAAI,CAAJ,EAAO,IAAI,CAAX,EAAc,IAAI,UAAU,MAAjC,EAAyC,IAAI,CAA7C,EAAgD,GAAhD,EAAqD;AACjD,gBAAI,UAAU,CAAV,CAAJ;AACA,iBAAK,IAAI,CAAT,IAAc,CAAd;AAAiB,oBAAI,OAAO,SAAP,CAAiB,cAAjB,CAAgC,IAAhC,CAAqC,CAArC,EAAwC,CAAxC,CAAJ,EACb,EAAE,CAAF,IAAO,EAAE,CAAF,CAAP;AADJ;AAEH;AACD,eAAO,CAAP;AACH,KAPD;AAQA,WAAO,SAAS,KAAT,CAAe,IAAf,EAAqB,SAArB,CAAP;AACH,CAVD;AAWA,IAAI,kBAAmB,aAAQ,UAAK,eAAd,IAAkC,UAAU,GAAV,EAAe;AACnE,WAAQ,OAAO,IAAI,UAAZ,GAA0B,GAA1B,GAAgC,EAAE,WAAW,GAAb,EAAvC;AACH,CAFD;AAGA,OAAO,cAAP,CAAsB,OAAtB,EAA+B,YAA/B,EAA6C,EAAE,OAAO,IAAT,EAA7C;AACA,QAAQ,+BAAR,GAA0C,QAAQ,6BAAR,GAAwC,QAAQ,0BAAR,GAAqC,KAAK,CAA5H;AACA,IAAI,wBAAwB,gBAAgB,QAAQ,wDAAR,CAAhB,CAA5B;AACA,IAAI,qBAAqB,SAArB,kBAAqB,CAAU,KAAV,EAAiB;AACtC,QAAI,MAAM,gBAAN,IACA,MAAM,YADN,IAEA,MAAM,YAAN,CAAmB,MAAnB,GAA4B,CAFhC,EAEmC;AAC/B,eAAO,MAAM,YAAN,CAAmB,CAAnB,EAAsB,EAA7B;AACH,KAJD,MAKK,IAAI,MAAM,yBAAN,IACL,MAAM,uBAAN,IAAiC,SAD5B,IAEL,MAAM,uBAAN,CAA8B,MAA9B,GAAuC,CAFtC,EAEyC;AAC1C,eAAO,MAAM,uBAAN,CAA8B,CAA9B,EAAiC,EAAxC;AACH,KAJI,MAKA,IAAI,MAAM,OAAN,IAAiB,SAAjB,IAA8B,MAAM,OAAN,CAAc,MAAd,GAAuB,CAAzD,EAA4D;AAC7D,eAAO,MAAM,OAAN,CAAc,CAAd,EAAiB,EAAxB;AACH;AACD,WAAO,SAAP;AACH,CAfD;AAgBA,IAAI,sBAAsB,SAAtB,mBAAsB,CAAU,YAAV,EAAwB,KAAxB,EAA+B,cAA/B,EAA+C;AACrE,QAAI,eAAe,SAAf,CAAyB,0BAAzB,CAAJ,EAA0D;AACtD,YAAI,aAAa,UAAb,IAA2B,OAA3B,IACA,aAAa,UAAb,IAA2B,aAD3B,IAEA,aAAa,UAAb,IAA2B,UAF3B,IAGA,aAAa,UAAb,IAA2B,WAH3B,IAIA,aAAa,2BAJb,IAKA,aAAa,SAAb,IAA0B,WAL9B,EAK2C;AACvC,yBAAa,QAAb,GAAwB,mBAAmB,KAAnB,CAAxB;AACH;AACJ,KATD,MAUK,IAAI,aAAa,UAAb,IAA2B,OAA3B,IACL,aAAa,UAAb,IAA2B,aADtB,IAEL,aAAa,2BAFR,IAGL,aAAa,SAAb,IAA0B,WAHzB,EAGsC;AACvC,qBAAa,QAAb,GAAwB,mBAAmB,KAAnB,CAAxB;AACH;AACD,WAAO,YAAP;AACH,CAlBD;AAmBA,IAAI,+BAA+B,SAA/B,4BAA+B,CAAU,aAAV,EAAyB,kBAAzB,EAA6C,sBAA7C,EAAqE;AACpG,QAAI,kBAAJ,EAAwB;AACpB,sBAAc,UAAd,GAA2B,QAA3B;AACH,KAFD,MAGK,IAAI,sBAAJ,EAA4B;AAC7B,sBAAc,UAAd,GAA2B,WAA3B;AACH,KAFI,MAGA;AACD,sBAAc,UAAd,GAA2B,UAA3B;AACH;AACD,WAAO,aAAP;AACH,CAXD;AAYA,IAAI,8BAA8B,SAA9B,2BAA8B,CAAU,aAAV,EAAyB,KAAzB,EAAgC,sBAAhC,EAAwD,WAAxD,EAAqE;AACnG,QAAI,0BAA0B,cAAc,UAAd,IAA4B,WAA1D,EAAuE;AACnE,eAAO,CAAC,WAAD,EAAc,IAAd,EAAoB,KAApB,CAAP;AACH,KAFD,MAGK,IAAI,MAAM,WAAN,IACL,MAAM,gBADD,IAEL,cAAc,UAAd,IAA4B,WAFvB,IAGL,cAAc,UAAd,IAA4B,UAHvB,IAIL,MAAM,YAJL,EAImB;AACpB,eAAO,CACH,yBAAyB,WAAzB,GAAuC,UADpC,EAEH,IAFG,EAGH,yBAAyB,KAAzB,GAAiC,IAH9B,CAAP;AAKH,KAVI,MAWA;AACD,eAAO,CAAC,SAAD,EAAY,WAAZ,EAAyB,KAAzB,CAAP;AACH;AACJ,CAlBD;AAmBA,IAAI,4BAA4B,SAA5B,yBAA4B,CAAU,cAAV,EAA0B,KAA1B,EAAiC,cAAjC,EAAiD;AAC7E,QAAI,MAAM,WAAV,EAAuB;AACnB,uBAAe,QAAf,GAA0B,eAA1B;AACH;AACD,QAAI,eAAe,kCAAf,IAAqD,MAArD,IACA,eAAe,SAAf,IAA4B,SADhC,EAC2C;AACvC,uBAAe,UAAf,GAA4B,UAA5B;AACA,uBAAe,SAAf,GAA2B,SAA3B;AACA,eAAO,oBAAoB,cAApB,EAAoC,KAApC,EAA2C,cAA3C,CAAP;AACH,KALD,MAMK,IAAI,eAAe,kCAAf,IAAqD,SAArD,IACL,eAAe,kCAAf,IAAqD,MADpD,EAC4D;AAC7D,eAAO,oBAAoB,cAApB,EAAoC,KAApC,EAA2C,cAA3C,CAAP;AACH;AACD,QAAI,UAAJ;AACA,QAAI,eAAe,UAAf,IAA6B,QAA7B,IACA,eAAe,SAAf,IAA4B,QADhC,EAC0C;AACtC,qBAAa,QAAb;AACH,KAHD,MAIK,IAAI,eAAe,SAAf,IAA4B,SAA5B,IACJ,MAAM,YAAN,IAAsB,CAAC,MAAM,kBAD7B,EACkD;AACnD,qBAAa,aAAb;AACH;AACD,QAAI,YAAY;AACZ,oBAAY,UADA;AAEZ,+BAAuB,EAFX;AAGZ,qBAAa,KAHD;AAIZ,0CAAkC,KAJtB;AAKZ,4CAAoC,eAAe,kCALvC;AAMZ,6BAAqB,KANT;AAOZ,qCAA6B,KAPjB;AAQZ,mBAAW,SARC;AASZ,8BAAsB,SATV;AAUZ,iCAAyB,MAAM;AAVnB,KAAhB;AAYA,QAAI,MAAM,WAAV,EAAuB;AACnB,kBAAU,QAAV,GAAqB,eAArB;AACH;AACD,WAAO,oBAAoB,SAApB,EAA+B,KAA/B,EAAsC,cAAtC,CAAP;AACH,CAvCD;AAwCA,IAAI,6BAA6B,SAA7B,0BAA6B,CAAU,KAAV,EAAiB,MAAjB,EAAyB,cAAzB,EAAyC,gBAAzC,EAA2D;AACxF,QAAI,eAAe,SAAf,CAAyB,YAAzB,CAAJ,EAA4C;AACxC;AACA,YAAI,CAAC,qBAAqB,IAArB,IAA6B,qBAAqB,KAAK,CAAvD,GAA2D,KAAK,CAAhE,GAAoE,iBAAiB,QAAjB,CAA0B,OAA1B,CAArE,MACC,qBAAqB,IAArB,IAA6B,qBAAqB,KAAK,CAAvD,GAA2D,KAAK,CAAhE,GAAoE,iBAAiB,QAAjB,CAA0B,MAA1B,CADrE,MAEC,qBAAqB,IAArB,IAA6B,qBAAqB,KAAK,CAAvD,GAA2D,KAAK,CAAhE,GAAoE,iBAAiB,QAAjB,CAA0B,QAA1B,CAFrE,CAAJ,EAE+G;AAC3G,gBAAI,MAAM,WAAN,IAAqB,OAAO,UAAP,KAAsB,UAA/C,EAA2D;AACvD,uBAAO,UAAP,GAAoB,aAApB;AACH;AACD,gBAAI,OAAO,SAAP,KAAqB,WAAzB,EAAsC;AAClC,uBAAO,SAAP,GAAmB,SAAnB;AACH;AACD,gBAAI,OAAO,2BAAX,EAAwC;AACpC,uBAAO,2BAAP,GAAqC,KAArC;AACA,uBAAO,0BAAP,GAAoC,IAApC;AACH;AACJ;AACJ;AACD,WAAO,MAAP;AACH,CAnBD;AAoBA,IAAI,iCAAiC,SAAjC,8BAAiC,CAAU,cAAV,EAA0B,KAA1B,EAAiC,GAAjC,EAAsC,sBAAtC,EAA8D;AAC/F,QAAI,SAAS;AACT,oBAAY,SADH;AAET,+BAAuB,EAFd;AAGT,6BAAqB;AAHZ,KAAb;AAKA,QAAI,MAAM,gBAAV,EAA4B;AACxB,YAAI,MAAM,YAAN,IAAsB,IAA1B,EAAgC;AAC5B,mBAAO,MAAP;AACH;AACD,YAAI,MAAM,eAAN,IAAyB,MAAM,gBAAnC,EAAqD;AACjD,mBAAO,UAAP,GAAoB,QAApB;AACH,SAFD,MAGK,IAAI,eAAe,SAAf,CAAyB,0BAAzB,KACL,MAAM,WADL,EACkB;AACnB,mBAAO,6BAA6B,MAA7B,EAAqC,MAAM,kBAA3C,EAA+D,sBAA/D,CAAP;AACH,SAHI,MAIA,IAAI,MAAM,WAAN,IACL,CAAC,GADI,IAEL,eAAe,SAAf,CAAyB,cAAzB,CAFC,EAEyC;AAC1C,gBAAI,MAAM,kBAAV,EAA8B;AAC1B,uBAAO,UAAP,GAAoB,QAApB;AACH;AACJ,SANI,MAOA,IAAI,CAAC,MAAM,+BAAP,IACL,CAAC,MAAM,uBADN,EAC+B;AAChC,mBAAO,UAAP,GAAoB,OAApB;AACH;AACD,eAAO,MAAP;AACH;AACD,QAAI,MAAM,OAAV,EAAmB;AACf,YAAI,MAAM,eAAV,EAA2B;AACvB,mBAAO,UAAP,GAAoB,QAApB;AACH,SAFD,MAGK,IAAI,MAAM,mBAAV,EAA+B;AAChC,mBAAO,mBAAP,GAA6B,IAA7B;AACH,SAFI,MAGA,IAAI,MAAM,kBAAN,IACL,eAAe,SAAf,CAAyB,0BAAzB,CADC,EACqD;AACtD,mBAAO,UAAP,GAAoB,QAApB;AACH,SAHI,MAIA,IAAI,MAAM,+BAAV,EAA2C;AAC5C,mBAAO,UAAP,GAAoB,OAApB;AACH;AACD,eAAO,MAAP;AACH;AACD,QAAI,eAAe,SAAf,CAAyB,0BAAzB,KACA,MAAM,WADV,EACuB;AACnB,eAAO,6BAA6B,MAA7B,EAAqC,MAAM,kBAA3C,EAA+D,sBAA/D,CAAP;AACH,KAHD,MAIK,IAAI,MAAM,WAAN,IACL,CAAC,GADI,IAEL,eAAe,SAAf,CAAyB,cAAzB,CAFC,EAEyC;AAC1C,YAAI,MAAM,kBAAV,EAA8B;AAC1B,mBAAO,UAAP,GAAoB,QAApB;AACH;AACD,eAAO,MAAP;AACH;AACD,QAAI,CAAC,MAAM,UAAP,IAAqB,CAAC,MAAM,uBAAhC,EAAyD;AACrD,YAAI,MAAM,kBAAN,IACA,eAAe,SAAf,CAAyB,0BAAzB,CADJ,EAC0D;AACtD,mBAAO,UAAP,GAAoB,QAApB;AACH,SAHD,MAIK,IAAI,CAAC,CAAC,MAAM,YAAR,IACL,MAAM,YAAN,CAAmB,MAAnB,KAA8B,CADzB,IAEL,MAAM,yBAFD,IAGL,CAAC,MAAM,+BAHN,EAGuC;AACxC,mBAAO,UAAP,GAAoB,OAApB;AACH,SALI,MAMA,IAAI,CAAC,CAAC,MAAM,YAAR,IAAwB,MAAM,YAAN,CAAmB,MAAnB,GAA4B,CAAxD,EAA2D;AAC5D,mBAAO,UAAP,GAAoB,UAApB;AACA,mBAAO,qBAAP,GAA+B,MAAM,uBAAN,IAAiC,EAAhE;AACH;AACJ;AACD,WAAO,MAAP;AACH,CA3ED;AA4EA,IAAI,oCAAoC,SAApC,iCAAoC,CAAU,cAAV,EAA0B,KAA1B,EAAiC,sBAAjC,EAAyD;AAC7F,QAAI,SAAS;AACT,oBAAY,SADH;AAET,+BAAuB,EAFd;AAGT,6BAAqB;AAHZ,KAAb;AAKA,QAAI,MAAM,gBAAV,EAA4B;AACxB;AACA,YAAI,MAAM,YAAN,IAAsB,IAA1B,EAAgC;AAC5B,gBAAI,MAAM,eAAN,IAAyB,MAAM,gBAAnC,EAAqD;AACjD,uBAAO,UAAP,GAAoB,QAApB;AACH,aAFD,MAGK,IAAI,eAAe,SAAf,CAAyB,0BAAzB,KACL,MAAM,WADL,EACkB;AACnB,uBAAO,6BAA6B,MAA7B,EAAqC,MAAM,kBAA3C,EAA+D,sBAA/D,CAAP;AACH,aAHI,MAIA,IAAI,MAAM,WAAV,EAAuB;AACxB,oBAAI,MAAM,kBAAV,EAA8B;AAC1B,2BAAO,UAAP,GAAoB,QAApB;AACH;AACJ,aAJI,MAKA,IAAI,CAAC,MAAM,+BAAP,IACL,CAAC,MAAM,uBADN,EAC+B;AAChC,uBAAO,UAAP,GAAoB,UAApB;AACA,uBAAO,qBAAP,GAA+B,MAAM,YAAN,IAAsB,EAArD;AACH;AACJ;AACD,eAAO,MAAP;AACH;AACD,QAAI,MAAM,OAAV,EAAmB;AACf,YAAI,MAAM,eAAV,EAA2B;AACvB,mBAAO,UAAP,GAAoB,QAApB;AACH,SAFD,MAGK,IAAI,MAAM,kBAAN,IACL,eAAe,SAAf,CAAyB,0BAAzB,CADC,EACqD;AACtD,mBAAO,UAAP,GAAoB,QAApB;AACH,SAHI,MAIA,IAAI,MAAM,+BAAV,EAA2C;AAC5C,mBAAO,UAAP,GAAoB,UAApB;AACH;AACD,eAAO,MAAP;AACH;AACD,QAAI,eAAe,SAAf,CAAyB,0BAAzB,KACA,MAAM,WADV,EACuB;AACnB,eAAO,6BAA6B,MAA7B,EAAqC,MAAM,kBAA3C,EAA+D,sBAA/D,CAAP;AACH,KAHD,MAIK,IAAI,MAAM,WAAN,IAAqB,MAAM,kBAA/B,EAAmD;AACpD,YAAI,MAAM,kBAAV,EAA8B;AAC1B,mBAAO,UAAP,GAAoB,QAApB;AACH;AACD,eAAO,MAAP;AACH;AACD,QAAI,EAAE,MAAM,YAAN,IAAsB,CAAC,MAAM,kBAA/B,KACA,CAAC,MAAM,UADP,IAEA,CAAC,MAAM,uBAFX,EAEoC;AAChC,YAAI,CAAC,CAAC,MAAM,YAAR,IACA,MAAM,YAAN,CAAmB,MAAnB,KAA8B,CAD9B,IAEA,MAAM,yBAFN,IAGA,CAAC,MAAM,+BAHX,EAG4C;AACxC,mBAAO,UAAP,GAAoB,UAApB;AACH,SALD,MAMK,IAAI,CAAC,CAAC,MAAM,YAAR,IAAwB,MAAM,YAAN,CAAmB,MAAnB,GAA4B,CAAxD,EAA2D;AAC5D,mBAAO,UAAP,GAAoB,UAApB;AACA,mBAAO,qBAAP,GAA+B,MAAM,uBAAN,IAAiC,EAAhE;AACH;AACJ;AACD,WAAO,MAAP;AACH,CAnED;AAoEA,IAAI,sCAAsC,SAAtC,mCAAsC,CAAU,cAAV,EAA0B,KAA1B,EAAiC,MAAjC,EAAyC,sBAAzC,EAAiE,KAAjE,EAAwE,uBAAxE,EAAiG;AACvI,QAAI,SAAS;AACT,oBAAY,SADH;AAET,+BAAuB,EAFd;AAGT,0BAAkB,KAHT;AAIT,6BAAqB;AAJZ,KAAb;AAMA;AACA,QAAI,MAAM,gBAAN,IACA,CAAC,eAAe,SAAf,CAAyB,0BAAzB,CADL,EAC2D;AACvD,YAAI,MAAM,YAAN,IACA,MAAM,YAAN,CAAmB,CAAnB,EAAsB,EAAtB,KAA6B,kBADjC,EACqD;AACjD,mBAAO,UAAP,GAAoB,QAApB;AACH,SAHD,MAIK,IAAI,sBAAJ,EAA4B;AAC7B,gBAAI,MAAM,kBAAV,EAA8B;AAC1B,uBAAO,UAAP,GAAoB,QAApB;AACH;AACJ,SAJI,MAKA,IAAI,CAAC,eAAe,SAAf,CAAyB,uBAAzB,CAAD,IACL,MAAM,yBADL,EACgC;AACjC,mBAAO,UAAP,GAAoB,OAApB;AACH;AACD,eAAO,MAAP;AACH;AACD,QAAI,MAAM,OAAV,EAAmB;AACf,YAAI,MAAM,eAAV,EAA2B;AACvB,mBAAO,UAAP,GAAoB,QAApB;AACH,SAFD,MAGK,IAAI,MAAM,mBAAV,EAA+B;AAChC,mBAAO,mBAAP,GAA6B,IAA7B;AACH,SAFI,MAGA,IAAI,MAAM,kBAAN,IACL,eAAe,SAAf,CAAyB,0BAAzB,CADC,EACqD;AACtD,mBAAO,UAAP,GAAoB,QAApB;AACH,SAHI,MAIA,IAAI,MAAM,+BAAV,EAA2C;AAC5C,mBAAO,UAAP,GAAoB,UAApB;AACH;AACD,eAAO,MAAP;AACH;AACD,QAAI,MAAM,WAAV,EAAuB;AACnB,YAAI,UAAU,MAAM,YAApB,EAAkC;AAC9B;AACA,gBAAI,CAAC,CAAC,MAAM,YAAZ,EAA0B;AACtB,sBAAM,YAAN,CAAmB,IAAnB,CAAwB;AACpB,0BAAM,eADc;AAEpB,wBAAI;AAFgB,iBAAxB;AAIH;AACJ;AACD,YAAI,eAAe,SAAf,CAAyB,0BAAzB,CAAJ,EAA0D;AACtD,mBAAO,6BAA6B,MAA7B,EAAqC,MAAM,kBAA3C,EAA+D,sBAA/D,CAAP;AACH,SAFD,MAGK,IAAI,sBAAJ,EAA4B;AAC7B,gBAAI,MAAM,kBAAV,EAA8B;AAC1B,uBAAO,UAAP,GAAoB,QAApB;AACH;AACJ,SAJI,MAKA,IAAI,MAAM,kBAAN,IACL,eAAe,SAAf,CAAyB,0BAAzB,CADC,EACqD;AACtD,mBAAO,UAAP,GAAoB,QAApB;AACH,SAHI,MAIA,IAAI,CAAC,MAAM,uBAAX,EAAoC;AACrC,mBAAO,UAAP,GAAoB,UAApB;AACH;AACD,eAAO,MAAP;AACH;AACD,QAAI,CAAC,MAAM,UAAX,EAAuB;AACnB,YAAI,CAAC,CAAC,MAAM,YAAR,KACC,MAAM,YAAN,CAAmB,MAAnB,KAA8B,CAA9B,IACI,MAAM,YAAN,CAAmB,MAAnB,KAA8B,CAA9B,IAAmC,KAFxC,KAGA,CAAC,uBAHL,EAG8B;AAC1B,mBAAO,UAAP,GAAoB,UAApB;AACH,SALD,MAMK,IAAI,CAAC,CAAC,MAAM,YAAR,IAAwB,MAAM,YAAN,CAAmB,MAAnB,GAA4B,CAAxD,EAA2D;AAC5D,mBAAO,gBAAP,GAA0B,IAA1B;AACA,mBAAO,qBAAP,GAA+B,MAAM,uBAAN,IAAiC,EAAhE;AACH;AACJ;AACD,WAAO,MAAP;AACH,CAjFD;AAkFA,IAAI,gCAAgC,SAAhC,6BAAgC,CAAU,MAAV,EAAkB;AAClD,WAAQ,WAAW,WAAX,IAA0B,WAAW,QAArC,IAAiD,WAAW,SAApE;AACH,CAFD;AAGA,IAAI,4BAA4B,SAA5B,yBAA4B,CAAU,MAAV,EAAkB;AAC9C,QAAI,WAAW,SAAf,EACI,OAAO,IAAP;AACJ,QAAI,cAAc,OAAO,KAAP,CAAa,GAAb,CAAlB;AACA,WAAO,OAAO,OAAP,CAAe,OAAf,IAA0B,CAAC,CAA3B,IAAgC,YAAY,MAAZ,IAAsB,CAAtD,GACD,CAAC,MAAD,EAAS,OAAT,EAAkB,QAAlB,EAA4B,QAA5B,CAAqC,YAAY,CAAZ,CAArC,CADC,GAED,IAFN;AAGH,CAPD;AAQA,IAAI,yBAAyB,SAAzB,sBAAyB,CAAU,KAAV,EAAiB,cAAjB,EAAiC,aAAjC,EAAgD;AACzE,QAAI,cAAc,gBAAlB,EAAoC;AAChC,sBAAc,qBAAd,GACI,MAAM,8BAAN,IAAwC,EAD5C;AAEA,sBAAc,gBAAd,GACI,cAAc,qBAAd,CAAoC,MAApC,GAA6C,CADjD;AAEH;AACD,QAAI,cAAc,gCAAlB,EAAoD;AAChD,sBAAc,oBAAd,GACI,MAAM,8BAAN,IAAwC,EAD5C;AAEA,sBAAc,gCAAd,GACI,cAAc,oBAAd,CAAmC,MAAnC,GAA4C,CADhD;AAEH;AACD,kBAAc,2BAAd,GACI,cAAc,2BAAd,GACM,CAAC,0BAA0B,mBAAmB,KAAnB,CAA1B,CADP,GAEM,KAHV;AAIA,QAAI,8BAA8B,cAAc,UAA5C,KACA,cAAc,UAAd,KAA6B,SAD7B,IAEC,cAAc,UAAd,KAA6B,QAA7B,IAAyC,MAAM,WAFhD,IAGC,CAAC,cAAc,UAAd,KAA6B,OAA7B,IACE,cAAc,UAAd,KAA6B,UADhC,KAEG,0BAA0B,mBAAmB,KAAnB,CAA1B,CALR,EAK+D;AAC3D,YAAI,cAAc,SAAd,KAA4B,QAAhC,EAA0C;AACtC,0BAAc,UAAd,GAA2B,QAA3B;AACA,0BAAc,SAAd,GAA0B,SAA1B;AACH,SAHD,MAIK,IAAI,cAAc,2BAAlB,EAA+C;AAChD,0BAAc,UAAd,IAA4B,UAA5B;AACA,0BAAc,SAAd,GAA0B,SAA1B;AACA,0BAAc,2BAAd,GAA4C,KAA5C;AACH,SAJI,MAKA,IAAI,cAAc,gCAAlB,EAAoD;AACrD,0BAAc,UAAd,GAA2B,cAAc,SAAd,GAA0B,SAArD;AACA,0BAAc,WAAd,GAA4B,KAA5B;AACH,SAHI,MAIA;AACD,0BAAc,UAAd,GAA2B,aAA3B;AACH;AACJ,KAtBD,MAuBK,IAAI,cAAc,SAAd,IAA2B,SAA3B,IACL,8BAA8B,cAAc,SAA5C,CADC,EACuD;AACxD,sBAAc,SAAd,GAA0B,SAA1B;AACH;AACD,kBAAc,WAAd,GACI,cAAc,2BAAd,IACI,cAAc,gCAFtB;AAGA,WAAO,aAAP;AACH,CAhDD;AAiDA;;;;;;;AAOA,IAAI,6BAA6B,SAA7B,0BAA6B,CAAU,cAAV,EAA0B,KAA1B,EAAiC,OAAjC,EAA0C;AACvE,QAAI,EAAJ;AACA,QAAI,yBAAyB,CAAC,QAAQ,GAAT,IACzB,MAAM,WADmB,KAExB,eAAe,SAAf,CAAyB,oBAAzB,KACG,eAAe,SAAf,CAAyB,cAAzB,CAHqB,CAA7B;AAIA,QAAI,mBAAmB,+BAA+B,cAA/B,EAA+C,KAA/C,EAAsD,QAAQ,GAA9D,EAAmE,sBAAnE,CAAvB;AACA,QAAI,SAAJ;AACA,QAAI,cAAc,MAAM,WAAxB;AACA,QAAI,8BAA8B,KAAlC;AACA,QAAI,eAAe,SAAf,CAAyB,0BAAzB,CAAJ,EAA0D;AACtD,YAAI,MAAM,kBAAN,IACA,iBAAiB,UAAjB,IAA+B,QADnC,EAC6C;AACzC,wBAAY,QAAZ;AACH,SAHD,MAIK,IAAI,MAAM,WAAV,EAAuB;AACxB,iBAAK,4BAA4B,gBAA5B,EAA8C,KAA9C,EAAqD,sBAArD,EAA6E,WAA7E,CAAL,EAAgG,YAAY,GAAG,CAAH,CAA5G,EAAmH,cAAc,GAAG,CAAH,CAAjI,EAAwI,8BAA8B,GAAG,CAAH,CAAtK;AACH;AACJ,KARD,MASK;AACD,YAAI,MAAM,WAAN,IACA,CAAC,QAAQ,GADT,IAEA,eAAe,SAAf,CAAyB,cAAzB,CAFJ,EAE8C;AAC1C,wBAAY,WAAZ;AACH,SAJD,MAKK,IAAI,MAAM,kBAAN,IACL,iBAAiB,UAAjB,IAA+B,QAD9B,EACwC;AACzC,wBAAY,QAAZ;AACH;AACJ;AACD,QAAI,mCAAmC,KAAvC;AACA,QAAI,uBAAuB,EAA3B;AACA,QAAI,MAAM,+BAAN,IAAyC,aAAa,WAA1D,EAAuE;AACnE,sCAA8B,IAA9B;AACH,KAFD,MAGK,IAAI,MAAM,oBAAV,EAAgC;AACjC,2CAAmC,IAAnC;AACA,+BAAuB,MAAM,uBAAN,IAAiC,EAAxD;AACH;AACD,QAAI,QAAQ,cAAZ,EAA4B;AACxB,YAAI,YAAY,uBAAuB,KAAvB,EAA8B,cAA9B,EAA8C;AAC1D,wBAAY,iBAAiB,UAD6B;AAE1D,8BAAkB,iBAAiB,gBAFuB;AAG1D,mCAAuB,iBAAiB,qBAHkB;AAI1D,yBAAa,WAJ6C;AAK1D,8CAAkC,gCALwB;AAM1D,yCAA6B,2BAN6B;AAO1D,uBAAW,SAP+C;AAQ1D,kCAAsB;AARoC,SAA9C,CAAhB;AAUA,yBAAiB,UAAjB,GAA8B,UAAU,UAAxC;AACA,oBAAY,UAAU,SAAtB;AACA,sBAAc,UAAU,WAAxB;AACA,2CACI,UAAU,gCADd;AAEA,+BAAuB,UAAU,oBAAV,IAAkC,EAAzD;AACA,sCAA8B,UAAU,2BAAxC;AACA,yBAAiB,qBAAjB,GACI,UAAU,qBAAV,IAAmC,EADvC;AAEA,yBAAiB,gBAAjB,GAAoC,UAAU,gBAA9C;AACH;AACD,QAAI,kCAAJ;AACA,QAAI,MAAM,KAAN,IACA,MAAM,WADN,IAEA,eAAe,SAAf,CAAyB,yBAAzB,CAFA,IAGA,CAAC,QAAQ,KAHb,EAGoB;AAChB,6CAAqC,CAAC,MAAM,gBAAP,GAC/B,UAD+B,GAE/B,MAFN;AAGH;AACD,QAAI,iBAAiB,0BAA0B;AAC3C,oBAAY,iBAAiB,UADc;AAE3C,+BAAuB,iBAAiB,qBAFG;AAG3C,qBAAa,WAH8B;AAI3C,0CAAkC,gCAJS;AAK3C,4CAAoC,kCALO;AAM3C,6BAAqB,iBAAiB,mBANK;AAO3C,qCAA6B,2BAPc;AAQ3C,mBAAW,SARgC;AAS3C,8BAAsB,oBATqB;AAU3C,iCAAyB,uCAAuC;AAVrB,KAA1B,EAWlB,KAXkB,EAWX,cAXW,CAArB;AAYA,QAAI,MAAM,WAAN,IACA,eAAe,UAAf,KAA8B,QAD9B,IAEA,eAAe,SAAf,KAA6B,WAF7B,IAGA,MAAM,yBAHN,IAIA,CAAC,eAAe,SAAf,CAAyB,cAAzB,CAJL,EAI+C;AAC3C,uBAAe,WAAf,GAA6B,KAA7B;AACA,uBAAe,2BAAf,GAA6C,KAA7C;AACH;AACD,QAAI,uBAAuB,MAAM,WAAN,IACvB,eAAe,SAAf,CAAyB,iBAAzB,CADuB,IAEvB,CAAC,QAAQ,KAFb;AAGA,QAAI,wBAAwB,eAAe,SAAf,CAAyB,oBAAzB,KACxB,eAAe,SAAf,CAAyB,yBAAzB,CADJ;AAEA,QAAI,yBACC,yBAAyB,eAAe,SAAf,KAA6B,SADvD,CAAJ,EACuE;AACnE,uBAAe,WAAf,GAA6B,KAA7B;AACA,uBAAe,2BAAf,GAA6C,KAA7C;AACH;AACD,QAAI,MAAM,WAAN,IACA,eAAe,SAAf,KAA6B,SAD7B,IAEA,CAAC,QAAQ,KAFb,EAEoB;AAChB,uBAAe,2BAAf,GAA6C,KAA7C;AACH;AACD,mBAAe,uBAAf,GACI,MAAM,+BADV;AAEA,WAAO,cAAP;AACH,CA5GD;AA6GA,QAAQ,0BAAR,GAAqC,0BAArC;AACA,IAAI,gCAAgC,SAAhC,6BAAgC,CAAU,cAAV,EAA0B,KAA1B,EAAiC,OAAjC,EAA0C;AAC1E,QAAI,EAAJ;AACA,QAAI,yBAAyB,CAAC,QAAQ,KAAT,IACzB,MAAM,WADmB,KAExB,eAAe,SAAf,CAAyB,oBAAzB,KACG,eAAe,SAAf,CAAyB,cAAzB,CAHqB,CAA7B;AAIA,QAAI,mBAAmB,kCAAkC,cAAlC,EAAkD,KAAlD,EAAyD,sBAAzD,CAAvB;AACA,QAAI,SAAJ;AACA,QAAI,cAAc,MAAM,WAAxB;AACA,QAAI,8BAA8B,KAAlC;AACA,QAAI,eAAe,SAAf,CAAyB,0BAAzB,CAAJ,EAA0D;AACtD,YAAI,MAAM,kBAAN,IACA,iBAAiB,UAAjB,IAA+B,QADnC,EAC6C;AACzC,wBAAY,QAAZ;AACH,SAHD,MAIK,IAAI,iBAAiB,UAAjB,IAA+B,WAA/B,IACL,QAAQ,OAAR,KAAoB,WADf,IAEL,CAAC,QAAQ,KAFR,EAEe;AAChB,6BAAiB,UAAjB,GAA8B,SAA9B;AACA,wBAAY,SAAZ;AACH,SALI,MAMA,IAAI,MAAM,WAAV,EAAuB;AACxB,iBAAK,4BAA4B,gBAA5B,EAA8C,KAA9C,EAAqD,sBAArD,EAA6E,WAA7E,CAAL,EAAgG,YAAY,GAAG,CAAH,CAA5G,EAAmH,cAAc,GAAG,CAAH,CAAjI,EAAwI,8BAA8B,GAAG,CAAH,CAAtK;AACH;AACJ,KAdD,MAeK;AACD,YAAI,MAAM,WAAV,EAAuB;AACnB,gBAAI,QAAQ,WAAR,KACC,iCAA8B,KAA9B,CAAoC,OAApC,CAA4C,QAAQ,WAApD,IAAmE,CAAC,CAApE,IACG,QAAQ,WAAR,KAAwB,IAF5B,CAAJ,EAEuC;AACnC,4BAAY,UAAZ;AACH,aAJD,MAKK;AACD,oBAAI,MAAM,YAAN,IACA,CAAC,MAAM,kBADP,IAEA,QAAQ,OAAR,KAAoB,WAFxB,EAEqC;AACjC,gCAAY,SAAZ;AACH,iBAJD,MAKK,IAAI,QAAQ,OAAR,KAAoB,WAApB,IACL,QAAQ,OAAR,KAAoB,MADnB,EAC2B;AAC5B,gCAAY,WAAZ;AACH,iBAHI,MAIA,IAAI,QAAQ,OAAR,KAAoB,MAAxB,EAAgC;AACjC,gCAAY,UAAZ;AACH;AACJ;AACJ,SApBD,MAqBK,IAAI,MAAM,kBAAN,IACL,iBAAiB,UAAjB,IAA+B,QAD9B,EACwC;AACzC,wBAAY,QAAZ;AACH;AACJ;AACD,QAAI,kCAAJ;AACA,QAAI,MAAM,KAAN,IACA,MAAM,WADN,IAEA,eAAe,SAAf,CAAyB,yBAAzB,CAFA,IAGA,CAAC,QAAQ,KAHb,EAGoB;AAChB,6CAAqC,CAAC,MAAM,gBAAP,GAC/B,UAD+B,GAE/B,MAFN;AAGH;AACD,QAAI,mCAAmC,KAAvC;AACA,QAAI,uBAAuB,EAA3B;AACA,QAAI,MAAM,+BAAN,IAAyC,aAAa,WAA1D,EAAuE;AACnE,sCAA8B,IAA9B;AACH,KAFD,MAGK,IAAI,MAAM,oBAAV,EAAgC;AACjC,2CAAmC,IAAnC;AACA,+BAAuB,MAAM,uBAAN,IAAiC,EAAxD;AACH;AACD,QAAI,QAAQ,cAAZ,EAA4B;AACxB,YAAI,YAAY,uBAAuB,KAAvB,EAA8B,cAA9B,EAA8C;AAC1D,wBAAY,iBAAiB,UAD6B;AAE1D,8BAAkB,iBAAiB,gBAFuB;AAG1D,mCAAuB,iBAAiB,qBAHkB;AAI1D,yBAAa,WAJ6C;AAK1D,8CAAkC,gCALwB;AAM1D,yCAA6B,2BAN6B;AAO1D,uBAAW,SAP+C;AAQ1D,kCAAsB;AARoC,SAA9C,CAAhB;AAUA,yBAAiB,UAAjB,GAA8B,UAAU,UAAxC;AACA,oBAAY,UAAU,SAAtB;AACA,sBAAc,UAAU,WAAxB;AACA,2CACI,UAAU,gCADd;AAEA,+BAAuB,UAAU,oBAAV,IAAkC,EAAzD;AACA,sCAA8B,UAAU,2BAAxC;AACA,yBAAiB,qBAAjB,GACI,UAAU,qBAAV,IAAmC,EADvC;AAEA,yBAAiB,gBAAjB,GAAoC,UAAU,gBAA9C;AACH;AACD,QAAI,iBAAiB,0BAA0B;AAC3C,oBAAY,iBAAiB,UADc;AAE3C,+BAAuB,iBAAiB,qBAFG;AAG3C,qBAAa,WAH8B;AAI3C,0CAAkC,gCAJS;AAK3C,4CAAoC,kCALO;AAM3C,6BAAqB,iBAAiB,mBANK;AAO3C,qCAA6B,2BAPc;AAQ3C,mBAAW,SARgC;AAS3C,8BAAsB,oBATqB;AAU3C,iCAAyB,uCAAuC;AAVrB,KAA1B,EAWlB,KAXkB,EAWX,cAXW,CAArB;AAYA,QAAI,sBAAsB,2BAA2B,KAA3B,EAAkC,cAAlC,EAAkD,cAAlD,EAAkE,QAAQ,gBAA1E,CAA1B;AACA,WAAO,mBAAP;AACH,CA1GD;AA2GA,QAAQ,6BAAR,GAAwC,6BAAxC;AACA,IAAI,kCAAkC,SAAlC,+BAAkC,CAAU,cAAV,EAA0B,KAA1B,EAAiC,OAAjC,EAA0C;AAC5E,QAAI,EAAJ;AACA,QAAI,EAAJ;AACA,QAAI,SAAS,eAAe,SAAf,CAAyB,6BAAzB,KACT,QAAQ,eADZ;AAEA,QAAI,8BAA8B,UAC9B,CAAC,CAAC,MAAM,iBADsB,IAE9B,MAAM,iBAAN,CAAwB,MAAxB,KAAmC,CAFL,IAG9B,MAAM,iBAAN,CAAwB,CAAxB,EAA2B,EAA3B,KAAkC,eAHtC;AAIA,QAAI,oBAAoB,UAAU,MAAM,YAAxC;AACA,QAAI,yBAAyB,CAAC,QAAQ,KAAT,IACzB,MAAM,WADmB,KAExB,eAAe,SAAf,CAAyB,oBAAzB,KACG,eAAe,SAAf,CAAyB,cAAzB,CAHqB,CAA7B;AAIA,QAAI,mBAAmB,oCAAoC,cAApC,EAAoD,KAApD,EAA2D,MAA3D,EAAmE,sBAAnE,EAA2F,QAAQ,KAAnG,EAA0G,QAAQ,uBAAlH,CAAvB;AACA,QAAI,cAAc,CAAC,QAAQ,uBAAT,IACd,MAAM,WADQ,IAEd,CAAC,QAAQ,UAFb;AAGA,QAAI,SAAJ;AACA,QAAI,8BAA8B,KAAlC;AACA,QAAI,eAAe,SAAf,CAAyB,0BAAzB,CAAJ,EAA0D;AACtD,YAAI,MAAM,kBAAN,IACA,CAAC,QAAQ,UADT,IAEA,CAAC,iBAFD,IAGA,CAAC,sBAHD,IAIA,iBAAiB,UAAjB,IAA+B,QAJnC,EAI6C;AACzC,wBAAY,QAAZ;AACH,SAND,MAOK,IAAI,MAAM,WAAV,EAAuB;AACxB,iBAAK,4BAA4B,gBAA5B,EAA8C,KAA9C,EAAqD,sBAArD,EAA6E,WAA7E,CAAL,EAAgG,YAAY,GAAG,CAAH,CAA5G,EAAmH,cAAc,GAAG,CAAH,CAAjI,EAAwI,8BAA8B,GAAG,CAAH,CAAtK;AACH;AACJ,KAXD,MAYK;AACD,YAAI,MAAM,kBAAN,IACA,CAAC,QAAQ,UADT,IAEA,CAAC,iBAFD,IAGA,CAAC,sBAHD,IAIA,iBAAiB,UAAjB,IAA+B,QAJnC,EAI6C;AACzC,wBAAY,QAAZ;AACH,SAND,MAOK,IAAI,sBAAJ,EAA4B;AAC7B,wBAAY,WAAZ;AACH;AACJ;AACD,QAAI,MAAM,+BAAN,IAAyC,aAAa,WAA1D,EAAuE;AACnE,sCAA8B,IAA9B;AACH;AACD,QAAI,mCAAmC,CAAC,MAAM,+BAAP,IAA0C,MAAM,oBAAvF;AACA,QAAI,QAAQ,cAAZ,EAA4B;AACxB,YAAI,YAAY,uBAAuB,KAAvB,EAA8B,cAA9B,EAA8C;AAC1D,wBAAY,iBAAiB,UAD6B;AAE1D,8BAAkB,iBAAiB,gBAFuB;AAG1D,mCAAuB,iBAAiB,qBAHkB;AAI1D,yBAAa,WAJ6C;AAK1D,8CAAkC,gCALwB;AAM1D,yCAA6B,2BAN6B;AAO1D,uBAAW;AAP+C,SAA9C,CAAhB;AASA,yBAAiB,UAAjB,GAA8B,UAAU,UAAxC;AACA,oBAAY,UAAU,SAAtB;AACA,sBAAc,UAAU,WAAxB;AACA,2CACI,UAAU,gCADd;AAEA,sCAA8B,UAAU,2BAAxC;AACA,yBAAiB,qBAAjB,GACI,UAAU,qBAAV,IAAmC,EADvC;AAEA,yBAAiB,gBAAjB,GAAoC,UAAU,gBAA9C;AACH;AACD,QAAI,6BAA6B,MAAM,iBAAvC;AACA,QAAI,8BAA8B,CAAC,2BAAD,IAC9B,CAAC,CAAC,MAAM,iBADsB,IAE9B,MAAM,iBAAN,CAAwB,MAAxB,GAAiC,CAFH,IAG9B,CAAC,MAAM,yBAHuB,IAI9B,CAAC,MAAM,YAJX;AAKA,QAAI,kCAAJ;AACA,QAAI,MAAM,KAAN,IACA,MAAM,WADN,IAEA,eAAe,SAAf,CAAyB,yBAAzB,CAFA,IAGA,CAAC,QAAQ,KAHb,EAGoB;AAChB,6CAAqC,CAAC,MAAM,gBAAP,GAC/B,UAD+B,GAE/B,MAFN;AAGH;AACD,QAAI,SAAS,SAAS,SAAS,EAAT,EAAa,0BAA0B;AACzD,oBAAY,iBAAiB,UAD4B;AAEzD,+BAAuB,iBAAiB,qBAFiB;AAGzD,qBAAa,WAH4C;AAIzD,mBAAW,SAJ8C;AAKzD,4CAAoC,kCALqB;AAMzD,0CAAkC,gCANuB;AAOzD,6BAAqB,iBAAiB,mBAPmB;AAQzD,qCAA6B;AAR4B,KAA1B,EAShC,KATgC,EASzB,cATyB,CAAb,CAAT,EASe,EAAE,kBAAkB,sCAAsC,UAAtC,GACtC,KADsC,GAEtC,CAAC,KAAK,iBAAiB,gBAAvB,MAA6C,IAA7C,IAAqD,OAAO,KAAK,CAAjE,GAAqE,EAArE,GAA0E,KAFxD,EAE+D,4BAA4B,sCAAsC,UAAtC,GAC7G,KAD6G,GAE7G,0BAJkB,EAIU,6BAA6B,sCAAsC,UAAtC,GACzD,KADyD,GAEzD,2BANkB,EATf,CAAb;AAgBA,QAAI,uBAAuB,MAAM,WAAN,IACvB,eAAe,SAAf,CAAyB,iBAAzB,CADuB,IAEvB,CAAC,QAAQ,KAFc,IAGvB,MAAM,yBAHV;AAIA,QAAI,wBAAwB,OAAO,UAAP,KAAsB,QAAtB,IAAkC,OAAO,SAAP,KAAqB,WAAnF;AACA,QAAI,yBACC,yBAAyB,OAAO,SAAP,KAAqB,SAD/C,CAAJ,EAC+D;AAC3D,eAAO,2BAAP,GAAqC,KAArC;AACA,eAAO,WAAP,GAAqB,KAArB;AACH;AACD,QAAI,MAAM,WAAN,IAAqB,OAAO,SAAP,KAAqB,SAA1C,IAAuD,CAAC,QAAQ,KAApE,EAA2E;AACvE,eAAO,2BAAP,GAAqC,KAArC;AACH;AACD,WAAO,MAAP;AACH,CAjHD;AAkHA,QAAQ,+BAAR,GAA0C,+BAA1C;;AAEA;;AAEA;;;ACrwBA;;AACA,IAAI,kBAAmB,aAAQ,UAAK,eAAd,KAAmC,OAAO,MAAP,GAAiB,UAAS,CAAT,EAAY,CAAZ,EAAe,CAAf,EAAkB,EAAlB,EAAsB;AAC5F,QAAI,OAAO,SAAX,EAAsB,KAAK,CAAL;AACtB,QAAI,OAAO,OAAO,wBAAP,CAAgC,CAAhC,EAAmC,CAAnC,CAAX;AACA,QAAI,CAAC,IAAD,KAAU,SAAS,IAAT,GAAgB,CAAC,EAAE,UAAnB,GAAgC,KAAK,QAAL,IAAiB,KAAK,YAAhE,CAAJ,EAAmF;AACjF,eAAO,EAAE,YAAY,IAAd,EAAoB,KAAK,eAAW;AAAE,uBAAO,EAAE,CAAF,CAAP;AAAc,aAApD,EAAP;AACD;AACD,WAAO,cAAP,CAAsB,CAAtB,EAAyB,EAAzB,EAA6B,IAA7B;AACH,CAPwD,GAOnD,UAAS,CAAT,EAAY,CAAZ,EAAe,CAAf,EAAkB,EAAlB,EAAsB;AACxB,QAAI,OAAO,SAAX,EAAsB,KAAK,CAAL;AACtB,MAAE,EAAF,IAAQ,EAAE,CAAF,CAAR;AACH,CAVqB,CAAtB;AAWA,IAAI,qBAAsB,aAAQ,UAAK,kBAAd,KAAsC,OAAO,MAAP,GAAiB,UAAS,CAAT,EAAY,CAAZ,EAAe;AAC3F,WAAO,cAAP,CAAsB,CAAtB,EAAyB,SAAzB,EAAoC,EAAE,YAAY,IAAd,EAAoB,OAAO,CAA3B,EAApC;AACH,CAF8D,GAE1D,UAAS,CAAT,EAAY,CAAZ,EAAe;AAChB,MAAE,SAAF,IAAe,CAAf;AACH,CAJwB,CAAzB;AAKA,IAAI,eAAgB,aAAQ,UAAK,YAAd,IAA+B,UAAU,GAAV,EAAe;AAC7D,QAAI,OAAO,IAAI,UAAf,EAA2B,OAAO,GAAP;AAC3B,QAAI,SAAS,EAAb;AACA,QAAI,OAAO,IAAX,EAAiB,KAAK,IAAI,CAAT,IAAc,GAAd;AAAmB,YAAI,MAAM,SAAN,IAAmB,OAAO,SAAP,CAAiB,cAAjB,CAAgC,IAAhC,CAAqC,GAArC,EAA0C,CAA1C,CAAvB,EAAqE,gBAAgB,MAAhB,EAAwB,GAAxB,EAA6B,CAA7B;AAAxF,KACjB,mBAAmB,MAAnB,EAA2B,GAA3B;AACA,WAAO,MAAP;AACH,CAND;AAOA,OAAO,cAAP,CAAsB,OAAtB,EAA+B,YAA/B,EAA6C,EAAE,OAAO,IAAT,EAA7C;AACA,QAAQ,kBAAR,GAA6B,KAAK,CAAlC;AACA,IAAI,IAAI,aAAa,QAAQ,YAAR,CAAb,CAAR;AACA,SAAS,kBAAT,CAA4B,MAA5B,EAAoC,WAApC,EAAiD;AAC7C;AACA,QAAI,eAAe,EAAE,MAAF,CAAS,MAAT,EAAiB,OAAjB,CAAnB;AACA;AACA;AACA,QAAI,iBAAiB,OAAO,MAAP,CAAc,EAAd,EAAkB,EAAE,IAAF,CAAO,YAAP,CAAlB,CAArB;AACA,QAAI,kBAAkB,eAAe,IAArC,EAA2C;AACvC,YAAI,iCAAiC;AACjC,wCAA4B,8BADK;AAEjC,iDAAqC;AAFJ,SAArC;AAIA,YAAI,aAAa,EAAE,IAAF,CAAO,OAAO,IAAP,CAAY,8BAAZ,CAAP,EAAoD,UAAU,MAAV,EAAkB;AAAE,mBAAO,eAAe,IAAf,CAAoB,UAApB,CAA+B,MAA/B,CAAP;AAAgD,SAAxH,CAAjB;AACA,YAAI,UAAJ,EAAgB;AACZ;AACA,gBAAI,qBAAqB,+BAA+B,UAA/B,CAAzB;AACA,gBAAI,gBAAgB,WAApB,CAHY,CAGqB;AACjC,gBAAI,OAAO,EAAX;AACA,gBAAI,OAAO,QAAP,KAAoB,WAAxB,EAAqC;AACjC;AACA,oBAAI,MAAM,IAAI,GAAJ,CAAQ,eAAe,IAAvB,CAAV;AACA,uBAAO,IAAI,QAAX;AACH,aAJD,MAKK;AACD;AACA,oBAAI,IAAI,SAAS,aAAT,CAAuB,GAAvB,CAAR;AACA,kBAAE,IAAF,GAAS,eAAe,IAAxB;AACA,uBAAO,EAAE,QAAT;AACA,oBAAI,CAAC,KAAK,UAAL,CAAgB,GAAhB,CAAL,EAA2B;AAAE;AACzB,2BAAO,IAAI,MAAJ,CAAW,IAAX,CAAP;AACH;AACJ;AACD,gBAAI,gBAAgB,mBAAmB,IAAnB,CAApB;AACA,gBAAI,uBAAuB,GAAG,MAAH,CAAU,kBAAV,EAA8B,GAA9B,EAAmC,MAAnC,CAA0C,aAA1C,EAAyD,OAAzD,EAAkE,MAAlE,CAAyE,aAAzE,EAAwF,iBAAxF,CAA3B;AACA,2BAAe,IAAf,GAAsB,GAAG,MAAH,CAAU,oBAAV,EAAgC,SAAhC,EAA2C,MAA3C,CAAkD,WAAlD,CAAtB;AACA,2BAAe,MAAf,GAAwB,GAAG,MAAH,CAAU,oBAAV,EAAgC,SAAhC,EAA2C,MAA3C,CAAkD,KAAK,KAAL,CAAW,cAAc,CAAzB,CAAlD,EAA+E,OAA/E,IACpB,GAAG,MAAH,CAAU,oBAAV,EAAgC,SAAhC,EAA2C,MAA3C,CAAkD,KAAK,KAAL,CAAW,cAAc,GAAzB,CAAlD,EAAiF,SAAjF,CADoB,GAEpB,GAAG,MAAH,CAAU,oBAAV,EAAgC,SAAhC,EAA2C,MAA3C,CAAkD,WAAlD,EAA+D,KAA/D,CAFJ;AAGA,mBAAO,cAAP;AACH;AACJ;AACD,WAAO,EAAE,IAAF,CAAO,YAAP,EAAqB,UAAU,KAAV,EAAiB;AAAE,eAAO,MAAM,KAAN,IAAe,WAAtB;AAAoC,KAA5E,KACH,EAAE,IAAF,CAAO,YAAP,CADJ,CAxC6C,CAyCnB;AAC7B;AACD,QAAQ,kBAAR,GAA6B,kBAA7B;;AAEA;;AAEA;;;;;ACzEA;;AAEA,IAAI,aAAa,QAAQ,eAAR,CAAjB;AACA,IAAI,UAAU,QAAQ,YAAR,CAAd;;AAEA,IAAI,UAAU,SAAV,OAAU,CAAS,KAAT,EAAgB,OAAhB,EAAyB,IAAzB,EAA+B;AACzC,QAAI;AACA,YAAI,QAAQ,SAAS,MAAM,WAAN,OAAwB,OAA7C;;AAEA,YAAI,SAAS,OAAO,KAApB,EAA2B;AACvB,gBAAI,eAAe,UAAU,GAAV,GAAgB,OAAO,IAAP,CAAY,SAAZ,CAAsB,IAAtB,CAAnC;AACA,mBAAO,KAAP,CAAa,WAAb,CAAyB,YAAzB;AACH;;AAED,YAAI,UAAU,OAAO,OAArB,EAA8B;AAC1B,gBAAI,SAAS,OAAO,OAAP,CAAe,KAA5B,EAAmC;AAC/B,uBAAO,OAAP,CAAe,KAAf,CAAqB,OAArB,EAA8B,IAA9B;AACH,aAFD,MAEO;AACH,uBAAO,OAAP,CAAe,GAAf,CAAmB,OAAnB,EAA4B,IAA5B;AACH;AACJ;AACJ,KAfD,CAeE,OAAO,CAAP,EAAU;AACR;AACH;AACJ,CAnBD;;AAqBA,IAAI,aAAa,SAAb,UAAa,GAAW;AACxB,QAAI,OAAO,SAAP,IAAoB,OAAO,SAAP,CAAiB,OAAzC,EAAkD;AAC9C,eAAO,OAAO,SAAP,CAAiB,OAAxB;AACH,KAFD,MAEO;AACH,eAAO,IAAP;AACH;AACJ,CAND;;AAQA,IAAI,uBAAuB,IAAI,UAAJ,CAAe,OAAO,SAAP,CAAiB,YAAhC,EAA8C,OAA9C,EAAuD,OAAO,SAAP,CAAiB,MAAxE,CAA3B;;AAEA,IAAI,QAAQ,SAAR,KAAQ,CAAS,UAAT,EAAqB,GAArB,EAA0B,IAA1B,EAAgC;AACxC,QAAI,SAAS,YAAb;AACA,QAAI,UAAU,QAAQ,qBAAR,CAA8B,MAA9B,EAAsC,UAAtC,CAAd;;AAEA,WAAO,qBAAqB,SAArB,CAA+B,GAA/B,EAAoC,MAApC,EAA4C,IAA5C,EAAkD,OAAlD,CAAP;AACH,CALD;;AAOA;;;;AAIA,IAAI,OAAO,MAAM,IAAN,CAAW,IAAX,EAAiB,IAAjB,CAAX;;AAEA;;;;AAIA,IAAI,OAAO,MAAM,IAAN,CAAW,IAAX,EAAiB,KAAjB,CAAX;;AAEA,OAAO,OAAP,GAAiB;AACb,cADa;AAEb;AAFa,CAAjB;;;;;ACvDA,IAAI,gBAAgB,QAAQ,eAAR,CAApB;;AAEA,IAAI,kBAAkB,SAAlB,eAAkB,CAAS,QAAT,EAAmB,MAAnB,EAA2B;AAC7C,aAAS,UAAU,IAAnB;;AAEA,WAAO,IAAI,aAAJ,CAAkB,MAAlB,EAA0B,cAA1B,CAAyC,IAAzC,EAA+C,OAA/C,CAAuD,QAAvD,CAAP;AACH,CAJD;;AAMA,OAAO,OAAP,GAAiB;AACb;AADa,CAAjB;;;;;ACRA,IAAI,gBAAgB,QAAQ,iBAAR,CAApB;AACA,IAAI,UAAU,QAAQ,WAAR,CAAd;;AAEA;;;;AAIA,SAAS,UAAT,CAAoB,YAApB,EAAkC,MAAlC,EAAuD;AAAA,QAAb,SAAa,uEAAH,CAAG;;AACnD;AACA;AACA;AACA;AACA,SAAK,kBAAL,GAA0B,EAA1B;;AAEA;AACA,SAAK,aAAL,GAAqB,YAArB;;AAEA;AACA,SAAK,OAAL,GAAe,MAAf;;AAEA,SAAK,SAAL,GAAiB,SAAjB;AACH;;AAED,WAAW,SAAX,CAAqB,SAArB,GAAiC,UAAS,GAAT,EAAc,MAAd,EAAsB,IAAtB,EAA4B,OAA5B,EAAqC,UAArC,EAAiD;AAC9E,aAAS,UAAU,IAAnB;AACA,WAAO,QAAQ,EAAf;AACA,cAAU,WAAW,EAArB;;AAEA;AACA;AACA,QAAI,CAAC,GAAL,EAAU;AACN,YAAI,iBAAiB,QAAQ,EAAR,GAAa,gBAAb,GAAgC,QAAQ,IAAR,GAAe,QAAf,GAA0B,aAA/E;AACA,aAAK,IAAL,CAAU,OAAV,EAAmB,0BAAnB,EAA+C,EAAC,8BAAD,EAAiB,sBAAjB,EAA/C;;AAEA,eAAO,IAAP;AACH;;AAED,QAAI,SAAS,IAAb;;AAEA,QAAI;AACA,iBAAS,KAAK,UAAL,CAAgB,GAAhB,EAAqB,MAArB,EAA6B,IAA7B,EAAmC,OAAnC,EAA4C,UAA5C,CAAT;AACH,KAFD,CAEE,OAAO,CAAP,EAAU;AACR;AACH;;AAED,QAAI,MAAJ,EAAY;AACR;AACA,eAAO,MAAP;AACH,KAHD,MAGO;AACH;AACA,eAAO,QAAQ,mBAAR,CAA4B,GAA5B,EAAiC,MAAjC,EAAyC,OAAzC,CAAP;AACH;AACJ,CA7BD;;AA+BA,WAAW,SAAX,CAAqB,UAArB,GAAkC,UAAS,UAAT,EAAqB,MAArB,EAA6B,IAA7B,EAAmC,OAAnC,EAA4C,UAA5C,EAAwD;AACtF,QAAI,YAAY,KAAK,aAAL,CAAmB,UAAnB,CAAhB;;AADsF;AAAA;AAAA;;AAAA;AAGtF,6BAAgB,SAAhB,8HAA2B;AAAA,gBAAlB,GAAkB;;AACvB,gBAAI,cAAc,KAAK,kBAAL,CAAwB,GAAxB,CAAlB;;AAEA,gBAAI,eAAe,IAAnB,EAAyB;AACrB,oBAAI,mBAAmB,KAAK,gBAAL,CAAsB,GAAtB,EAA2B,MAA3B,EAAmC,WAAnC,EAAgD,UAAhD,CAAvB;;AAEA,oBAAI,oBAAoB,IAAxB,EAA8B;AAC1B,wBAAI,aAAa,iBAAiB,IAAjB,CAAjB;AACA,wBAAI,SAAS,QAAQ,mBAAR,CAA4B,GAA5B,EAAiC,UAAjC,EAA6C,OAA7C,CAAb;;AAEA,2BAAO,MAAP;AACH;AACJ;AACJ;;AAED;AAlBsF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAmBtF,SAAK,IAAL,CAAU,OAAV,EAAmB,4DAAnB,EAAiF,EAAC,WAAW,KAAK,SAAjB,EAA4B,oBAA5B,EAAuC,KAAK,UAA5C,EAAwD,cAAxD,EAAgE,UAAhE,EAAsE,sBAAtE,EAAjF;;AAEA,WAAO,IAAP;AACH,CAtBD;;AAwBA,WAAW,SAAX,CAAqB,gBAArB,GAAwC,UAAS,GAAT,EAAc,SAAd,EAAyB,WAAzB,EAAsC,UAAtC,EAAkD;AACtF,QAAI,eAAe,KAAK,gBAAL,CAAsB,SAAtB,CAAnB;;AADsF;AAAA;AAAA;;AAAA;AAGtF,8BAAmB,YAAnB,mIAAiC;AAAA,gBAAxB,MAAwB;;AAC7B,gBAAI,WAAW,YAAY,MAAZ,CAAf;;AAEA,gBAAI,YAAY,IAAhB,EAAsB;AAClB,oBAAI,KAAK,kBAAL,CAAwB,QAAxB,KAAqC,IAAzC,EAA+C;AAC3C,yBAAK,kBAAL,CAAwB,QAAxB,IAAoC,EAApC;AACH;;AAED,oBAAI,KAAK,kBAAL,CAAwB,QAAxB,EAAkC,MAAlC,KAA6C,IAAjD,EAAuD;AACnD,yBAAK,kBAAL,CAAwB,QAAxB,EAAkC,MAAlC,IAA4C,cAAc,eAAd,CAA8B,QAA9B,EAAwC,MAAxC,CAA5C;AACH;;AAED,uBAAO,KAAK,kBAAL,CAAwB,QAAxB,EAAkC,MAAlC,CAAP;AACH;AACJ;AAjBqF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAmBtF,SAAK,IAAL,CAAU,OAAV,EAAmB,sEAAnB,EAA2F,EAAC,wBAAD,EAAc,0BAAd,EAA4B,oBAA5B,EAAuC,QAAvC,EAA4C,sBAA5C,EAA3F;;AAEA,WAAO,IAAP;AACH,CAtBD;;AAwBA,WAAW,SAAX,CAAqB,kBAArB,GAA0C,UAAS,GAAT,EAAc;AACpD,QAAI,QAAQ,IAAI,KAAJ,CAAU,GAAV,CAAZ;AACA,QAAI,SAAS,KAAK,aAAlB;AAFoD;AAAA;AAAA;;AAAA;AAGpD,8BAAiB,KAAjB,mIAAwB;AAAA,gBAAf,IAAe;;AACpB,qBAAS,OAAO,IAAP,CAAT;;AAEA,gBAAI,UAAU,IAAd,EAAoB;AAChB,uBAAO,IAAP;AACH;AACJ;AATmD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AAWpD,QAAI,cAAc,MAAlB;;AAEA;AACA;AACA,QAAI,OAAO,WAAP,KAAuB,QAA3B,EAAqC;AACjC,sBAAc,EAAC,IAAI,WAAL,EAAd;AACH;;AAED,WAAO,WAAP;AACH,CApBD;;AAsBA,WAAW,SAAX,CAAqB,gBAArB,GAAwC,UAAS,MAAT,EAAiB;AACrD,QAAI,UAAU,WAAW,IAAzB,EAA+B;AAC3B,YAAI,YAAY,OAAO,OAAP,CAAe,GAAf,CAAhB;;AAEA,YAAI,cAAc,CAAC,CAAnB,EAAsB;AAClB,mBAAO,CAAC,MAAD,EAAS,IAAT,CAAP;AACH,SAFD,MAEO;AACH,gBAAI,WAAW,OAAO,MAAP,CAAc,CAAd,EAAiB,SAAjB,CAAf;;AAEA,gBAAI,SAAS,WAAT,OAA2B,IAA/B,EAAqC;AACjC,uBAAO,CAAC,MAAD,EAAS,IAAT,CAAP;AACH,aAFD,MAEO;AACH,uBAAO,CAAC,MAAD,EAAS,QAAT,EAAmB,IAAnB,CAAP;AACH;AACJ;AACJ,KAdD,MAcO;AACH,eAAO,CAAC,IAAD,CAAP;AACH;AACJ,CAlBD;;AAoBA,WAAW,SAAX,CAAqB,aAArB,GAAqC,UAAS,GAAT,EAAc;AAC/C,WAAO,CAAC,MAAM,MAAP,EAAe,GAAf,CAAP;AACH,CAFD;;AAIA,WAAW,SAAX,CAAqB,IAArB,GAA4B,UAAS,KAAT,EAAgB,OAAhB,EAAyB,IAAzB,EAA+B;AACvD,QAAI,KAAK,OAAT,EAAkB;AACd,aAAK,OAAL,CAAa,KAAb,EAAoB,OAApB,EAA6B,IAA7B;AACH;AACJ,CAJD;;AAMA,OAAO,OAAP,GAAiB,UAAjB;;;;;AC3JA,IAAI,aAAa,QAAQ,aAAR,CAAjB;AACA,IAAI,IAAI,QAAQ,YAAR,CAAR;AACA,IAAI,SAAS,QAAQ,QAAR,CAAb;AACA,IAAM,kBAAkB,QAAQ,oBAAR,CAAxB;;AAEA,IAAI,aACA,QAAQ,4DAAR,EAAsE,kBAD1E;;AAGA,IAAI,cAAc,SAAd,WAAc,CAAU,IAAV,EAAgB,gBAAhB,EAAkC;AAChD,QAAI,oBAAoB,IAAxB,EAA8B;AAC1B,eAAO,WAAW,IAAX,CAAP;AACH,KAFD,MAEO;AACH,eAAO,IAAP;AACH;AACJ,CAND;;AAQA,IAAI,QAAQ,SAAR,KAAQ,CAAU,IAAV,EAAgB,UAAhB,EAA4B;AACpC,QAAI,UAAJ,EAAgB;AACZ,YAAI,QAAQ,IAAZ,EAAkB;AACd,mBAAO,wBAAP;AACH,SAFD,MAEO;AACH,mBAAO,OAAO,IAAP,GAAc,IAArB;AACH;AACJ,KAND,MAMO;AACH,eAAO,IAAP;AACH;AACJ,CAVD;;AAYA,IAAI,qBAAqB,SAArB,kBAAqB,CAAU,GAAV,EAAe;AACpC,WAAO,OAAO,IAAI,WAAJ,GAAkB,QAAlB,CAA2B,MAA3B,CAAd;AACH,CAFD;;AAIA,IAAI,sBAAsB,SAAtB,mBAAsB,CAAU,GAAV,EAAe,IAAf,EAAqB,OAArB,EAA8B;AACpD,cAAU,WAAW,EAArB;;AAEA,QAAI,mBAAmB,QAAQ,UAAR,IAAsB,CAAC,mBAAmB,GAAnB,CAA9C;AACA,QAAI,aAAa,CAAC,CAAC,QAAQ,IAA3B;;AAEA,QAAI,sBAAsB,YAAY,IAAZ,EAAkB,gBAAlB,CAA1B;AACA,QAAI,kBAAkB,MAAM,mBAAN,EAA2B,UAA3B,CAAtB;;AAEA,WAAO,mBAAmB,EAA1B;AACH,CAVD;;AAYA,IAAI,0BAA0B,SAA1B,uBAA0B,CAAU,GAAV,EAAe,oBAAf,EAAqC;AAC/D;AACA,QAAI,qBAAqB,IAAI,OAAO,OAAX,CACrB,EAAE,OAAF,CAAU,EAAE,KAAF,CAAQ,UAAR,EAAoB,qBAApB,CAAV,CADqB,EAErB,oBAFqB,CAAzB;AAIA,QAAM,uBAAuB,IAAI,OAAJ,CAAY,iBAAZ,CAA7B;AACA,QAAI,UAAU,IAAI,OAAO,OAAX,CAAmB,oBAAnB,CAAd;AACA,QAAI,eAAe,QAAQ,IAAR,CAAa,kBAAb,EAAiC,QAAjC,EAAnB;;AAEA,QAAI,iBAAiB,SAArB,EAAgC;AAC5B;AACA,YAAI,kBACA,QAAQ,MAAR,GAAiB,CAAjB,KACC,QAAQ,CAAR,EAAW,IAAX,IAAmB,OAAnB,IACG,QAAQ,CAAR,EAAW,IAAX,IAAmB,OADtB,IAEG,QAAQ,CAAR,EAAW,IAAX,IAAmB,OAFtB,IAGG,QAAQ,CAAR,EAAW,IAAX,IAAmB,SAJvB,CADJ;;AAOA,YAAI,mBAAmB,IAAI,OAAvB,IAAkC,IAAI,OAAJ,CAAY,kBAAlD,EAAsE;AAClE,gBAAI,eAAe,KAAnB;;AAEA,gBAAI,OAAJ,CAAY,kBAAZ,CAA+B,OAA/B,CAAuC,UAAC,QAAD,EAAc;AACjD,oBAAI,SAAS,mBAAT,IAAgC,SAApC,EAA+C;AAC3C,mCAAe,IAAf;AACH;AACJ,aAJD;;AAMA,gBAAI,CAAC,YAAL,EAAmB;AACf,uBAAO,SAAP;AACH;AACJ;;AAED,YACI,wBACA,qBAAqB,WAArB,GAAmC,QAAnC,CAA4C,IAA5C,CADA,KAEC,yBAAyB,SAAzB,IACG,yBAAyB,SAH7B,CADJ,EAKE;AACE,2BAAe,oBAAf;AACH;AACJ;;AAED,WAAO,YAAP;AACH,CA5CD;;AA8CA,IAAM,kCAAkC,SAAlC,+BAAkC,CAAU,SAAV,EAAqB;AACzD,QAAM,iBAAiB,UAAU,OAAV,CAAkB,GAAlB,CAAvB;AACA,QAAM,kBAAkB,UAAU,OAAV,CAAkB,GAAlB,CAAxB;AACA,QAAI,mBAAmB,CAAC,CAApB,IAAyB,oBAAoB,CAAC,CAAlD,EAAqD;AACjD,eAAO,EAAP;AACH;AACD,QAAM,aAAa,UAAU,SAAV,CACf,iBAAiB,CADF,EAEf,kBAAkB,CAFH,CAAnB;AAIA,WAAO,WAAW,KAAX,CAAiB,GAAjB,EAAsB,GAAtB,CAA0B,UAAC,IAAD;AAAA,eAAU,KAAK,IAAL,EAAV;AAAA,KAA1B,CAAP;AACH,CAXD;;AAaA,IAAM,kBAAkB,SAAlB,eAAkB,CAAU,GAAV,EAAe;AACnC;AACA;AACA,QAAM,YAAY,IAAI,OAAJ,CAAY,YAAZ,CAAlB;AACA,QAAM,aAAa,gCAAgC,SAAhC,CAAnB;AACA,QAAM,OAAO,WACR,MADQ,CACD,UAAC,CAAD;AAAA,eAAO,EAAE,QAAF,CAAW,GAAX,CAAP;AAAA,KADC,EAER,GAFQ,CAEJ,UAAC,CAAD;AAAA,eAAO,EAAE,MAAF,CAAS,CAAT,EAAY,EAAE,MAAF,GAAW,CAAvB,CAAP;AAAA,KAFI,EAE8B,CAF9B,CAAb;AAGA,WAAO,QAAQ,IAAf;AACH,CATD;;AAWA,IAAI,YAAY,SAAZ,SAAY,CAAU,GAAV,EAAe,GAAf,EAAoB,oBAApB,EAA0C;AACtD,QAAM,kBAAkB,gBAAgB,YAAhB,CACpB,GADoB,EAEpB,GAFoB,EAGpB,IAAI,cAHgB,CAAxB;;AAMA,QAAI,IAAI,KAAJ,IAAa,IAAI,KAAJ,CAAU,OAA3B,EAAoC;AAChC,eAAO,IAAI,KAAJ,CAAU,OAAjB;AACH,KAFD,MAEO,IACH,IAAI,OAAJ,IACA,IAAI,OAAJ,CAAY,QADZ,IAEA,IAAI,OAAJ,CAAY,QAAZ,CAAqB,oBAArB,CAHG,EAIL;AACE,eAAO,IAAI,OAAJ,CAAY,QAAZ,CAAqB,oBAArB,CAAP;AACH,KANM,MAMA,IAAI,IAAI,OAAJ,IAAe,IAAI,OAAJ,CAAY,oBAAZ,CAAnB,EAAsD;AACzD,eAAO,IAAI,OAAJ,CAAY,oBAAZ,CAAP;AACH,KAFM,MAEA,IAAI,gBAAgB,QAAhB,CAAyB,cAA7B,EAA6C;AAChD,eAAO,gBAAgB,GAAhB,CAAP;AACH,KAFM,MAEA,IAAI,IAAI,OAAJ,CAAY,iBAAZ,CAAJ,EAAoC;AACvC,eAAO,wBAAwB,GAAxB,EAA6B,oBAA7B,CAAP;AACH,KAFM,MAEA,IAAI,oBAAJ,EAA0B;AAC7B,eAAO,oBAAP;AACH,KAFM,MAEA;AACH,eAAO,IAAP;AACH;AACJ,CA1BD;;AA4BA;AACA,IAAI,wBAAwB,SAAxB,qBAAwB,CAAU,MAAV,EAAkB,UAAlB,EAA8B;AACtD,WAAO;AACH,oBAAY,UADT;AAEH,cAAM,UAAU,OAAO,WAAP,OAAyB;AAFtC,KAAP;AAIH,CALD;;AAOA;AACA,IAAI,QAAQ,SAAR,KAAQ,CAAU,MAAV,EAAkB;AAC1B,YAAQ,OAAO,WAAP,EAAR;AACI,aAAK,QAAL;AACI,mBAAO,IAAP;AACJ;AACI,mBAAO,KAAP;AAJR;AAMH,CAPD;;AASA,OAAO,OAAP,GAAiB;AACb,4CADa;AAEb,wBAFa;AAGb,gDAHa;AAIb,oDAJa;AAKb;AALa,CAAjB;;;;;AChKA,IAAI,IAAI,QAAQ,YAAR,CAAR;;AAEA,IAAI,UAAU,QAAQ,UAAR,CAAd;AACA,IAAI,SAAS,QAAQ,oCAAR,EAA8C,MAA3D;;AAEA;AACA,IAAI,gBAAgB,SAAhB,aAAgB,CAAS,QAAT,EAAmB;AACnC,QAAI,WAAW,EAAf;;AAEA,QAAI,YAAY,SAAZ,SAAY,CAAS,eAAT,EAA0B,YAA1B,EAAwC;AACpD,UAAE,IAAF,CAAO,eAAP,EAAwB,UAAS,KAAT,EAAgB;AACpC,gBAAI,EAAE,QAAF,CAAW,KAAX,CAAJ,EAAuB;AACnB,0BAAU,KAAV,EAAiB,YAAjB;AACH,aAFD,MAGK;AACD,6BAAa,KAAb,IAAsB,IAAtB;AACH;AACJ,SAPD;AAQH,KATD;;AAWA,cAAU,QAAV,EAAoB,QAApB;;AAEA,WAAO,QAAP;AACH,CAjBD;;AAoBA;AACA,IAAI,oBAAoB,CAAC,OAAO,aAAR,EAAuB,OAAO,8BAA9B,EAA8D,OAAO,MAAP,CAAc,GAAd,CAAkB,MAAhF,EAAwF,OAAO,MAAP,CAAc,GAAd,CAAkB,eAA1G,EAA2H,OAAO,qBAAlI,EAAyJ,OAAO,KAAP,CAAa,sBAAtK,CAAxB;;AAEA,IAAI,yBAAyB,SAAzB,sBAAyB,CAAU,GAAV,EAAe,SAAf,EAA0B;AACnD,QAAI,OAAO,IAAP,IAAe,aAAa,IAAhC,EAAsC;AAClC,aAAK,IAAI,IAAT,IAAiB,GAAjB,EAAsB;AAClB,gBAAI,UAAU,WAAV,MAA2B,KAAK,WAAL,EAA/B,EAAmD;AAC/C,uBAAO,EAAC,KAAK,IAAN,EAAY,OAAO,IAAI,IAAJ,CAAnB,EAAP;AACH;AACJ;AACJ;;AAED,WAAO,IAAP;AACH,CAVD;;AAYA,IAAI,sBAAsB,cAAc,MAAd,CAA1B;;AAEA,IAAI,6BAA6B,SAA7B,0BAA6B,CAAU,YAAV,EAAwB,2BAAxB,EAAqD;AAClF,QAAI,gBAAgB,IAApB,EAA0B;AACtB,eAAO,IAAP;AACH;;AAED;AACA,QAAI,CAAC,oBAAoB,YAApB,CAAL,EAAwC;AACpC,eAAO,IAAP;AACH;;AAED;AACA,QAAI,sBAAsB,EAA1B;AACA,SAAK,IAAI,WAAT,IAAwB,2BAAxB,EAAqD;AACjD,YAAI,GAAG,cAAH,CAAkB,IAAlB,CAAuB,2BAAvB,EAAoD,WAApD,CAAJ,EAAsE;AAClE,gCAAoB,WAApB,IAAmC,4BAA4B,WAA5B,CAAnC;AACH;AACJ;;AAED,QAAI,yBAAyB,IAA7B;AACA,QAAI,OAAO,aAAa,OAAb,CAAqB,UAArB,EAAiC,UAAU,KAAV,EAAiB;AACzD,YAAI,aAAa,MAAM,MAAM,MAAN,GAAe,CAArB,MAA4B,GAA7C;;AAEA;AACA,YAAI,YAAY,MAAM,MAAN,GAAe,CAA/B;AACA,YAAI,UAAJ,EAAgB;AACZ;AACA,cAAE,SAAF;AACH;;AAED;AACA,YAAI,MAAM,MAAM,MAAN,CAAa,CAAb,EAAgB,SAAhB,CAAV;;AAEA,YAAI,QAAQ,uBAAuB,mBAAvB,EAA4C,GAA5C,CAAZ;;AAEA,YAAI,SAAS,IAAT,IAAiB,MAAM,KAAN,IAAe,IAApC,EAA0C;AACtC,gBAAI,UAAJ,EAAgB;AACZ,uBAAO,oBAAoB,GAApB,CAAP,CADY,CACsB;;AAElC,uBAAO,EAAP;AACH,aAJD,MAIO;AACH,yCAAyB,KAAzB;;AAEA,uBAAO,IAAP;AACH;AACJ,SAVD,MAUO;AACH,mBAAO,oBAAoB,MAAM,GAA1B,CAAP,CADG,CACqC;;AAExC,mBAAO,MAAM,KAAb;AACH;AACJ,KA9BU,CAAX;;AAgCA;AACA,QAAI,CAAC,sBAAL,EAA6B;AACzB,eAAO,IAAP;AACH;;AAED;AACA;AACA;AACA,QAAI,eAAe,KAAK,KAAK,MAAL,GAAc,CAAnB,CAAnB;AACA,QAAI,iBAAiB,GAAjB,IAAwB,SAAS,GAArC,EAA0C;AACtC,eAAO,KAAK,MAAL,CAAY,CAAZ,EAAe,KAAK,MAAL,GAAc,CAA7B,CAAP;AACH;;AAED;AACA;AACA,QAAI,aAAa,EAAjB;AACA,SAAK,IAAI,GAAT,IAAgB,mBAAhB,EAAqC;AACjC,YAAI,GAAG,cAAH,CAAkB,IAAlB,CAAuB,mBAAvB,EAA4C,GAA5C,CAAJ,EAAsD;AAClD,uBAAW,IAAX,CAAgB,MAAM,GAAN,GAAY,mBAAmB,oBAAoB,GAApB,CAAnB,CAA5B;AACH;AACJ;AACD,QAAI,QAAQ,WAAW,MAAX,KAAsB,CAAtB,GAA0B,EAA1B,GAA+B,MAAM,WAAW,IAAX,CAAgB,GAAhB,CAAjD;;AAEA,WAAO,OAAO,KAAd;AACH,CA3ED;;AA6EA,IAAI,eAAe,SAAf,YAAe,CAAU,GAAV,EAAe,KAAf,EAAsB;AACrC,QAAI,UAAU,IAAI,OAAJ,IAAe,GAA7B;AACA,QAAI,YAAY,GAAhB,EAAqB;AACjB,eAAO,KAAP;AACH,KAFD,MAEO,IAAI,UAAU,GAAd,EAAmB;AACtB,eAAO,OAAP;AACH,KAFM,MAEA;AACH,eAAO,QAAQ,OAAR,EAAiB,KAAjB,CAAP;AACH;AACJ,CATD;;AAWA,IAAI,cAAc,SAAd,WAAc,CAAU,GAAV,EAAe,KAAf,EAAsB,UAAtB,EAAkC;AAChD,QAAI,YAAY,2BAA2B,KAA3B,EAAkC,cAAc,EAAhD,CAAhB;AACA,QAAI,aAAa,IAAjB,EAAuB;AACnB,YAAI,aAAa,kBAAkB,OAAlB,CAA0B,KAA1B,MAAqC,CAAC,CAAvD;AACA,YAAI,UAAJ,EAAgB;AACZ,mBAAO,aAAa,GAAb,EAAkB,SAAlB,CAAP;AACH,SAFD,MAEO;AACH,mBAAO,SAAP;AACH;AACJ,KAPD,MAOO;AACH;AACA,eAAO,IAAP;AACH;AACJ,CAbD;;AAeA,OAAO,OAAP,GAAiB;AACb,YAAQ,MADK;AAEb,iBAAa,WAFA;;AAIb,4BAAwB;AAJX,CAAjB;;;;;AClJA,OAAO,OAAP,GAAiB;AACb,mBAAe,MAAM,EAAN,GAAW,EAAX,GAAgB,EADlB;AAEb,wBAAoB,MAAM,EAAN,GAAW,EAAX,GAAgB,EAAhB,GAAqB,IAF5B;AAGb,0BAAsB,KAAK,IAHd;AAIb,uBAAmB,KAAK,EAAL,GAAU,EAAV,GAAe;AAJrB,CAAjB;;;;;ACAA,IAAI,aAAa;AACb,UAAM,cAAS,MAAT,EAAiB;AACnB,YAAI,OAAO,CAAX;AAAA,YAAc,CAAd;AAAA,YAAiB,GAAjB;AAAA,YAAsB,MAAM,OAAO,MAAnC;AACA,YAAI,OAAO,MAAP,KAAkB,CAAtB,EAAyB;AACrB,mBAAO,IAAP;AACH;AACD,aAAK,IAAI,CAAT,EAAY,IAAI,GAAhB,EAAqB,GAArB,EAA0B;AACtB,kBAAQ,OAAO,UAAP,CAAkB,CAAlB,CAAR;AACA,mBAAS,CAAC,QAAQ,CAAT,IAAc,IAAf,GAAuB,GAA/B;AACA,oBAAQ,CAAR,CAHsB,CAGX;AACd;AACD,eAAO,IAAP;AAEH;AAbY,CAAjB;;AAgBA,OAAO,OAAP,GAAiB,UAAjB;;;;;AChBA,IAAI,cAAc,QAAQ,aAAR,CAAlB;;AAEA,IAAI,aAAa,SAAb,UAAa,CAAS,aAAT,EAAwB,OAAxB,EAAiC,MAAjC,EAAyC;AACtD,QAAI,WAAW,iBAAiB,IAAhC;AACA,QAAI,MAAM,4BAAV;AACA,QAAI,aAAa,IAAb,IAAqB,aAAa,OAAtC,EAA+C;AAC3C,eAAO,+BAAP;AACA,YAAI,CAAC,CAAC,OAAN,EAAe;AACX,mBAAO,OAAP;AACH;AACJ,KALD,MAKO,IAAI,CAAC,CAAC,OAAN,EAAe;AAClB,eAAO,+BAA+B,OAAtC;AACH;AACD,QAAI,CAAC,CAAC,MAAN,EAAc;AACV,YAAI,cAAc,YAAY,SAAZ,CAAsB,MAAtB,CAAlB;AACA,YAAI,WAAJ,EAAiB;AACb,mBAAO,MAAM,WAAb;AACH;AACJ;AACD,WAAO,GAAP;AACH,CAlBD;;AAoBA,OAAO,OAAP,GAAiB,UAAjB;;;;;ACtBA;;;;;;AAMA,IAAI,UAAU,SAAV,OAAU,CAAS,KAAT,EAAgB,UAAhB,EAA4B;AACtC,QAAI,MAAM,KAAK,GAAL,CAAS,CAAT,EAAY,KAAZ,CAAV;AACA,WAAO,CAAC,SAAS,UAAT,EAAqB,EAArB,IAA2B,GAA5B,EAAiC,QAAjC,EAAP;AACH,CAHD;;AAKA;;;;;;AAMA,IAAI,YAAY,SAAZ,SAAY,CAAS,KAAT,EAAgB,UAAhB,EAA4B;AACxC,QAAI,MAAM,KAAK,GAAL,CAAS,CAAT,EAAY,KAAZ,CAAV;AACA,WAAO,CAAC,SAAS,UAAT,EAAoB,EAApB,IAA0B,GAA3B,MAAoC,GAA3C;AACH,CAHD;;AAKA;;;;;;;AAOA,IAAI,YAAY,SAAZ,SAAY,CAAS,KAAT,EAAgB,KAAhB,EAAyC;AAAA,QAAlB,UAAkB,uEAAL,GAAK;;AACrD,WAAO,UAAU,KAAV,EAAiB,UAAjB,MAAiC,KAAjC,GAAyC,UAAzC,GAAsD,QAAQ,KAAR,EAAe,UAAf,CAA7D;AACH,CAFD;;AAIA,OAAO,OAAP,GAAiB;AACb,aAAS,OADI;AAEb,eAAW,SAFE;AAGb,eAAW;AAHE,CAAjB;;;ACjCA;;AACA,OAAO,cAAP,CAAsB,OAAtB,EAA+B,YAA/B,EAA6C,EAAE,OAAO,IAAT,EAA7C;AACA,QAAQ,UAAR,GAAqB,QAAQ,SAAR,GAAoB,KAAK,CAA9C;AACA;;;;;;;AAOA,IAAI,YAAY,SAAZ,SAAY,CAAU,GAAV,EAAe;AAC3B,SAAO,KAAK,KAAL,CAAW,KAAK,SAAL,CAAe,GAAf,CAAX,CAAP;AACH,CAFD;AAGA,QAAQ,SAAR,GAAoB,SAApB;AACA;;;;;;;AAOA,IAAI,aAAa,SAAb,UAAa,CAAU,GAAV,EAAe;AAC5B,SAAO,QAAQ,KAAK,CAAb,GAAiB,GAAjB,GAAuB,CAAC,GAAG,QAAQ,SAAZ,EAAuB,GAAvB,CAA9B;AACH,CAFD;AAGA,QAAQ,UAAR,GAAqB,UAArB;;AAEA;;AAEA;;;;;;;;AC5BA;;AAEA,IAAM,mBAAmB,SAAnB,gBAAmB,CAAS,KAAT,EAAgB;AACrC,QAAI,eAAe,SAAS,MAAM,GAAN,CAAU,kBAAV,EAA8B,EAAvC,EAA2C,EAA3C,MAAmD,IAAtE;AACA,QAAI,QAAQ,IAAI,IAAJ,EAAZ;AACA,QAAI,cAAc,IAAI,IAAJ,CAAS,MAAM,GAAN,CAAU,sBAAV,CAAT,CAAlB;AACA,QAAI,mCAAmC,eAAe,IAAI,IAAJ,CAAS,IAAT,EAAe,EAAf,EAAmB,CAAnB,CAAtD;AACA,QAAI,wBAAwB,IAAI,IAAJ,CAAS,WAAT,CAA5B;AACA,0BAAsB,OAAtB,CAA8B,YAAY,OAAZ,KAAyB,IAAI,CAA3D;AACA,QAAI,8BAA+B,cAAc,KAAf,IAA0B,QAAQ,qBAApE;;AAEA,WAAO,OAAO,cAAP,CAAsB,SAAtB,CAAgC,oBAAhC,KACI,gCADJ,IAEI,YAFJ,KAGK,+BAAgC,oCAAoC,MAAM,GAAN,CAAU,mBAAV,CAHzE,IAID,KAAK,kBAAL,EAAyB,EAAC,MAAO,qBAAR,EAAzB,CAJC,GAKD,EALN;AAMH,CAfD;;qBAiBe,gB;;;;;;;;;AClBf,IAAI,UAAU,QAAQ,2BAAR,CAAd;;AAEA,OAAO,OAAP;AAEI,qCAAY,KAAZ,EAAmB,cAAnB,EAAmC,mBAAnC,EAAwD;AAAA;;AACpD,aAAK,cAAL,GAAsB,cAAtB;AACA,aAAK,mBAAL,GAA2B,mBAA3B;;AAEA,YAAI,KAAJ,EAAU;AACN,iBAAK,KAAL,GAAa,KAAb;AACH,SAFD,MAGK;AACD,iBAAK,KAAL,GAAa,CAAb;AACH;AACJ;;AAZL;AAAA;AAAA,mCAoBe,WApBf,EAoB2B;AACnB,gBAAI,CAAC,KAAK,QAAL,CAAc,cAAd,CAA6B,WAA7B,CAAL,EAA+C;AAC3C,sBAAM,IAAI,KAAJ,QAAc,WAAd,gCAAN;AACH;;AAED,mBAAO,QAAQ,SAAR,CAAkB,KAAK,QAAL,CAAc,WAAd,EAA2B,OAA7C,EAAsD,KAAK,KAA3D,CAAP;AACH;AA1BL;AAAA;AAAA,8BA4BU,WA5BV,EA4BsB;AACd,gBAAI,CAAC,KAAK,QAAL,CAAc,cAAd,CAA6B,WAA7B,CAAL,EAA+C;AAC3C,sBAAM,IAAI,KAAJ,QAAc,WAAd,gCAAN;AACH;AACD,iBAAK,KAAL,GAAa,QAAQ,SAAR,CAAkB,IAAlB,EAAwB,KAAK,QAAL,CAAc,WAAd,EAA2B,OAAnD,EAA4D,KAAK,KAAjE,CAAb;AACH;AAjCL;AAAA;AAAA,iDAmC4B;AAAA;;AACpB,gBAAI,qBAAqB,OAAO,mBAAP,CAA2B,KAAK,QAAhC,EAA0C,MAA1C,CAAkD;AAAA,uBAAe,MAAK,QAAL,CAAc,WAAd,EAA2B,MAA1C;AAAA,aAAlD,CAAzB;AACA,+BAAmB,OAAnB,CAA2B,UAAC,WAAD;AAAA,uBAAiB,MAAK,KAAL,CAAW,WAAX,CAAjB;AAAA,aAA3B;AACH;AAtCL;AAAA;AAAA,4BAcmB;AACX,mBAAO;AACH,sCAAsB,EAAC,SAAS,CAAV,EAAa,QAAQ,KAAK,cAAL,CAAoB,SAApB,CAA8B,mBAA9B,KAAsD,KAAK,mBAAhF;AADnB,aAAP;AAGH;AAlBL;AAAA;AAAA,4BAwCkC;AAAA;;AAC1B,gBAAI,qBAAqB,OAAO,mBAAP,CAA2B,KAAK,QAAhC,EAA0C,MAA1C,CAAkD;AAAA,uBAAe,OAAK,QAAL,CAAc,WAAd,EAA2B,MAA1C;AAAA,aAAlD,CAAzB;AACA,mBAAO,mBAAmB,MAAnB,KAA8B,CAA9B,IAAmC,mBAAmB,IAAnB,CAAwB,UAAC,WAAD;AAAA,uBAAiB,CAAC,OAAK,UAAL,CAAgB,WAAhB,CAAlB;AAAA,aAAxB,CAA1C;AACH;AA3CL;;AAAA;AAAA;;;;;;;;;ACFA,IAAI,UAAU,QAAQ,2BAAR,CAAd;;AAEA,OAAO,OAAP;AAEI,qBAAY,KAAZ,EAAmB,aAAnB,EAAkC;AAAA;;AAC9B,YAAI,KAAJ,EAAU;AACN,iBAAK,KAAL,GAAa,KAAb;AACH,SAFD,MAGK;AACD;AACA,iBAAK,KAAL,GAAa,CAAb;AACA,gBAAI,CAAC,aAAL,EAAmB;AACf,qBAAK,mBAAL,GAA2B,IAA3B;AACA,qBAAK,wBAAL,GAAgC,IAAhC;AACH,aAHD,MAIK;AACD,qBAAK,mBAAL,GAA2B,KAA3B;AACA,qBAAK,wBAAL,GAAgC,KAAhC;AACH;AACJ;AACJ;;AAlBL;AAAA;AAAA,4BAoB6B;AACrB,mBAAO,QAAQ,SAAR,CAAkB,CAAlB,EAAqB,KAAK,KAA1B,CAAP;AACH,SAtBL;AAAA,0BAwB4B,OAxB5B,EAwBoC;AAC5B,iBAAK,KAAL,GAAa,QAAQ,SAAR,CAAkB,OAAlB,EAA2B,CAA3B,EAA8B,KAAK,KAAnC,CAAb;AACH;AA1BL;AAAA;AAAA,4BA4BkC;AAC1B,mBAAO,QAAQ,SAAR,CAAkB,CAAlB,EAAqB,KAAK,KAA1B,CAAP;AACH,SA9BL;AAAA,0BAgCiC,OAhCjC,EAgCyC;AACjC,iBAAK,KAAL,GAAa,QAAQ,SAAR,CAAkB,OAAlB,EAA2B,CAA3B,EAA8B,KAAK,KAAnC,CAAb;AACH;AAlCL;;AAAA;AAAA;;;;;;;;;ACHA,IAAM,CAAA,GAAI,OAAA,CAAQ,YAAR,CAAV,CAAA;;;;;;;AAOA,MAAA,CAAO,OAAP,GAAA,YAAA;IAEI,SAAA,eAAA,GAAc;QAAA,eAAA,CAAA,IAAA,EAAA,eAAA,CAAA,CAAA;;QACV,IAAA,CAAK,KAAL,GAAkC,EAAlC,CAAA;QACA,IAAA,CAAK,SAAL,GAAkC,EAAlC,CAAA;QACA,IAAA,CAAK,UAAL,GAAkC,EAAlC,CAAA;QACA,IAAA,CAAK,KAAL,GAAkC,EAAlC,CAAA;QACA,IAAA,CAAK,MAAL,GAAkC,EAAlC,CAAA;QACA,IAAA,CAAK,WAAL,GAAkC,EAAlC,CAAA;QACA,IAAA,CAAK,iBAAL,GAAkC,IAAlC,CAAA;QACA,IAAA,CAAK,SAAL,GAAkC,EAAlC,CAAA;QACA,IAAA,CAAK,UAAL,GAAkC,EAAlC,CAAA;QACA,IAAA,CAAK,OAAL,GAAkC,EAAlC,CAAA;QACA,IAAA,CAAK,SAAL,GAAkC,IAAlC,CAAA;QACA,IAAA,CAAK,SAAL,GAAkC,EAAlC,CAAA;QACA,IAAA,CAAK,cAAL,GAAkC,IAAlC,CAAA;QACA,IAAA,CAAK,iBAAL,GAAkC,KAAlC,CAAA;QACA,IAAA,CAAK,kBAAL,GAAkC,KAAlC,CAAA;QACA,IAAA,CAAK,yBAAL,GAAkC,KAAlC,CAAA;QACA,IAAA,CAAK,wBAAL,GAAkC,IAAlC,CAAA;QACA,IAAA,CAAK,YAAL,GAAkC,CAAlC,CAAA;;;QAGA,IAAA,CAAK,MAAL,GAAkC,EAAlC,CAAA;QACA,IAAA,CAAK,OAAL,GAAkC,EAAlC,CAAA;QACA,IAAA,CAAK,SAAL,GAAkC,EAAlC,CAAA;QACA,IAAA,CAAK,aAAL,GAAkC,EAAlC,CAAA;QACA,IAAA,CAAK,QAAL,GAAkC,EAAlC,CAAA;QACA,IAAA,CAAK,SAAL,GAAkC,EAAlC,CAAA;QACA,IAAA,CAAK,WAAL,GAAkC,EAAlC,CAAA;QACA,IAAA,CAAK,aAAL,GAAkC,EAAlC,CAAA;QACA,IAAA,CAAK,UAAL,GAAkC,EAAlC,CAAA;QACA,IAAA,CAAK,cAAL,GAAkC,EAAlC,CAAA;;QAEA,IAAA,CAAK,MAAL,GAAkC,WAAlC,CAAA;QACA,IAAA,CAAK,IAAL,GAAkC,OAAlC,CAAA;QACA,IAAA,CAAK,IAAL,GAAkC,CAAlC,CAAA;QACA,IAAA,CAAK,OAAL,GAAkC,EAAlC,CAAA;QACA,IAAA,CAAK,aAAL,GAAkC,IAAlC,CAAA;QACA,IAAA,CAAK,qBAAL,GAAkC,KAAlC,CAAA;QACA,IAAA,CAAK,eAAL,GAAkC,KAAlC,CAAA;QACA,IAAA,CAAK,QAAL,GAAkC,CAAlC,CAAA;;QAEA,MAAA,CAAO,MAAP,CAAA,KAAA,CAAA,MAAA,EAAA,CAAc,IAAd,CAAA,CAAA,MAAA,CAAA,KAAA,CAAA,SAAA,CAAA,KAAA,CAAA,IAAA,CAAuB,SAAvB,CAAA,CAAA,CAAA,CAAA;KACH;;IA5CL,YAAA,CAAA,eAAA,EAAA,CAAA;QAAA,GAAA,EAAA,8BAAA;QAAA,KAAA,EAAA,SAAA,4BAAA,CA8CiC,WA9CjC,EA8C8C,eA9C9C,EA8C+D;YACvD,IAAI,WAAJ,EAAiB;;gBAEb,IAAI,WAAA,CAAY,cAAhB,EAAgC;oBAC5B,IAAA,CAAK,aAAL,GAAqB,WAAA,CAAY,cAAjC,CAAA;iBACH;gBACD,IAAI,WAAA,CAAY,QAAhB,EAA0B;oBACtB,IAAA,CAAK,OAAL,GAAe,WAAA,CAAY,QAA3B,CAAA;iBACH;gBACD,IAAI,WAAA,CAAY,QAAhB,EAA0B;oBACtB,IAAA,CAAK,QAAL,GAAgB,WAAA,CAAY,QAA5B,CAAA;iBACH;gBACD,IAAI,WAAA,CAAY,SAAhB,EAA2B;oBACvB,IAAA,CAAK,SAAL,GAAiB,WAAA,CAAY,SAA7B,CAAA;oBACA,IAAA,CAAK,UAAL,GAAkB,WAAA,CAAY,SAA9B,CAAA;iBACH;aACJ;;YAED,IAAI,eAAJ,EAAqB;;;gBAGjB,IAAI,eAAA,CAAgB,kBAAhB,CAAA,IAAuC,IAAA,CAAK,aAAL,CAAmB,MAAnB,KAA8B,CAAzE,EAA4E;oBACxE,IAAI,QAAA,GAAW,eAAA,CAAgB,kBAAhB,CAAf,CAAA;oBACA,IAAI,cAAA,GAAiB,EAArB,CAAA;oBACA,CAAA,CAAE,IAAF,CAAO,CAAA,CAAE,IAAF,CAAO,QAAP,CAAP,EAAyB,UAAS,GAAT,EAAc;wBACnC,IAAI,QAAA,CAAS,GAAT,CAAA,IAAiB,GAAA,KAAQ,KAA7B,EAAoC;4BAChC,cAAA,CAAe,IAAf,CAAoB,GAApB,CAAA,CAAA;yBACH;qBAHL,CAAA,CAAA;oBAKA,IAAI,cAAA,CAAe,MAAf,GAAwB,CAA5B,EAA+B;wBAC3B,IAAA,CAAK,aAAL,GAAqB,cAArB,CAAA;qBACH;iBACJ;aACJ;SACJ;KAhFL,EAAA;QAAA,GAAA,EAAA,WAAA;QAAA,KAAA,EAAA,SAAA,SAAA,GAkFgB;YAAA,IAAA,KAAA,GAAA,IAAA,CAAA;;YACR,IAAI,QAAA,GAAW,CAAA,CAAE,MAAF,CAAS,EAAT,EAAa,IAAb,CAAf,CAAA;;;YAGA,MAAA,CAAO,IAAP,CAAY,QAAZ,CAAA,CAAsB,OAAtB,CAA8B,UAAC,GAAD,EAAS;gBACnC,CAAC,KAAA,CAAK,SAAL,CAAe,QAAA,CAAS,GAAT,CAAf,CAAD,IAAkC,OAAO,QAAA,CAAS,GAAT,CAAzC,CAAA;aADJ,CAAA,CAAA;;YAIA,OAAO,QAAP,CAAA;SACH;KA3FL,EAAA;QAAA,GAAA,EAAA,WAAA;QAAA,KAAA,EAAA,SAAA,SAAA,CA6Fc,KA7Fd,EA6FqB;YACb,OAAO,EAAG,CAAA,CAAE,KAAF,CAAA,CAAS,QAAT,EAAA,IAAuB,CAAA,CAAE,KAAF,CAAA,CAAS,OAAT,EAAxB,IAA+C,CAAC,KAAlD,CAAA,IAA4D,KAAA,KAAU,KAA7E,CAAA;SACH;KA/FL,CAAA,CAAA,CAAA;;IAAA,OAAA,eAAA,CAAA;CAAA,EAAA,CAAA;;;;;;;;;ACPA;qBACe,OAAO,QAAP,CAAgB,U;;;;;;;;;ACD/B;;;;;;;;cAEiB,M;IAAT,I,WAAA,I;;IAEa,e;;;AAEjB,+BAAc;AAAA;;AAAA,sIACJ;AACF,mBAAU,KAAK,4BAAL,CADR;AAEF,+CACU,KAAK,+BAAL,CADV;AAFE,SADI;;AAQV,cAAK,cAAL,GAAsB,yCACK,KAAK,kCAAL,CADL,mFAEX,KAAK,4BAAL,CAFW,8BAIjB,EAJiB,CAId,eAJc,EAIG,UAAC,CAAD,EAAO;AAAE,kBAAK,aAAL,CAAmB,CAAnB,KAAyB,MAAK,OAAL,CAAa,SAAb,QAAzB;AAAyD,SAJrE,CAAtB;;AAMA,cAAK,aAAL,GAAsB,8FAC0D,KAAK,QAAL,CAD1D,gBAGjB,EAHiB,CAGd,eAHc,EAGG,UAAC,CAAD,EAAO;AAAE,kBAAK,aAAL,CAAmB,CAAnB,KAAyB,MAAK,OAAL,CAAa,QAAb,QAAzB;AAAwD,SAHpE,CAAtB;;AAKA,cAAK,QAAL,CAAc,IAAd,CAAmB,mBAAnB,EAAwC,MAAxC,CAA+C,CAC3C,MAAK,cADsC,EAE3C,MAAK,aAFsC,CAA/C;AAnBU;AAuBb;;;EAzBwC,Y;;qBAAxB,e;;;;;;;;;;;ACJrB;;;;;;;;IAEqB,4B;AAEjB,0CAAY,EAAZ,EAAgB;AAAA;;AACZ,aAAK,QAAL,WAAsB,KAAK,6CAAL,CAAtB;;AAEA,aAAK,EAAL,GAAU,EAAV;AACH;;;;iCAEO;AACJ,mBAAO,IAAI,oBAAJ,CAAY;AACf,wBAAQ,KAAK,EADE;AAEf,0BAAU,KAAK,QAFA;AAGf,uBAAO;AAHQ,aAAZ,CAAP;AAKH;;;;;;qBAdgB,4B;;;;;;;;;;;ACFrB;;;;AACA;;;;;;;;;;cACiB,M;IAAT,I,WAAA,I;;IAEa,gB;;;AACjB,8BAAY,KAAZ,EAA0C;AAAA,YAAvB,cAAuB,uEAAN,KAAM;;AAAA;;AAAA,yIAC7B,SAD6B;;AAEtC,cAAK,KAAL,GAAa,KAAb;AACA,cAAK,cAAL,GAAsB,cAAtB;AACA,cAAK,MAAL;AAJsC;AAKzC;;;;iCAEO;AACJ,gBAAI,gBAAgB;AAChB,uBAAO,KAAK,+BAAL,CADS;AAEhB,0BAAU,KAFM;AAGhB,yBAAS,CAAC,OAAD,EAAU,yBAAV,CAHO;AAIhB,yBAAS,iDAAS,KAAK,KAAL,CAAW,GAAX,CAAe,OAAf,CAAT,EAAkC,KAAK,KAAL,CAAW,GAAX,CAAe,aAAf,MAAkC,CAAlC,GAAsC,KAAK,yCAAL,CAAtC,GAAwF,KAAK,iCAAL,CAA1H;AAJO,aAApB;;AAOA,iBAAK,KAAL,GAAa,IAAI,YAAJ,CAAU,aAAV,CAAb;AACA,iBAAK,YAAL,CAAkB,KAAK,KAAL,CAAW,GAA7B;AACA,iBAAK,KAAL,CAAW,IAAX;AACH;;;qCAEY,K,EAAM;AAAA;;AACf,kBAAM,IAAN,CAAW,iBAAX,EAA8B,EAA9B,CAAiC,OAAjC,EAA0C,YAAM;AAC5C,+BAAe,SAAf,CAAyB,gBAAzB,IAA6C,OAAO,gBAAP,CAAwB,OAAK,KAAL,CAAW,GAAX,CAAe,IAAf,CAAxB,CAA7C,GAA6F,OAAO,mBAAP,CAA2B,OAAK,KAAL,CAAW,GAAX,CAAe,IAAf,CAA3B,CAA7F;AACA,uBAAO,YAAP,CAAoB,OAApB,CAA4B,yBAA5B,EAAuD,EAAE,YAAY,OAAK,KAAnB,EAA0B,SAAS,EAAE,gBAAgB,OAAK,cAAvB,EAAnC,EAAvD;AACH,aAHD;;AAKA,kBAAM,IAAN,CAAW,SAAX,EAAsB,EAAtB,CAAyB,OAAzB,EAAkC,YAAM;AACpC,sBAAM,IAAN,CAAW,qBAAX,EAAkC,KAAlC;AACH,aAFD;AAGH;;;;EA9ByC,SAAS,I;;qBAAlC,gB;;;;;;;;cCJJ,M;IAAT,I,WAAA,I;;qBACO,UAAC,KAAD,EAAQ,IAAR;AAAA,6LAGgC,KAHhC,2DAI+B,IAJ/B,uEAMD,KAAK,2BAAL,CANC,6NAW+H,KAAK,8BAAL,CAX/H,8BAYM,KAAK,8BAAL,CAZN,mLAcmI,KAAK,QAAL,CAdnI;AAAA,C;;;;;;;;;;;ACDf;;;;AACA;;AACA;;;;AACA;;;;AACA;;;;;;;;;;;;cACiB,M;IAAT,I,WAAA,I;;AAER;AACA;AACA;AACA;;IAEqB,gB;;;AACjB,8BAAY,KAAZ,EAAmB,UAAnB,EAAuD;AAAA,YAAxB,cAAwB,uEAAP,KAAO;;AAAA;;AAAA,yIAC1C,SAD0C;;AAAA,cAoIvD,iBApIuD,GAoInC,UAAU,OAAV,EAAmB;AAAA;;AACnC,gBAAI,UAAU,OAAO,sBAAP,CAA8B,OAA9B,CAAd;;AAEA,oBACK,IADL,CACU,YAAM;AACR,uBAAO,YAAP,CAAoB,OAApB,CAA4B,yBAA5B,EAAuD;AACnD,gCAAY,OAAK,KADkC;AAEnD,6BAAS,EAAE,gBAAgB,OAAK,cAAvB;AAF0C,iBAAvD;AAIA,oBAAI,oCAAJ,CAA4B,OAAK,KAAjC,EAAwC,OAAxC;AACH,aAPL,WAQW,UAAC,GAAD,EAAS;AACZ,uBAAO,MAAP,CAAc,GAAd,CAAkB,OAAlB,EAA2B,gCAA3B,EAA6D;AACzD,6BAAS,IAAI,UAAJ,IAAkB;AAD8B,iBAA7D;AAGA,oBAAI,OAAJ,EAAa;AACT,4BAAQ,IAAR,CAAa,OAAO,IAAP,CAAY,eAAZ,CAAb,EAA2C,OAA3C;AACH;AACD,uBAAK,KAAL,CAAW,GAAX,CAAe,IAAf,CAAoB,qBAApB,EAA2C,KAA3C;AACH,aAhBL;AAiBH,SAxJsD;;AAEnD,cAAK,KAAL,GAAa,KAAb;AACA,cAAK,UAAL,GAAkB,UAAlB;AACA,cAAK,WAAL,GAAmB,MAAM,GAAN,CAAU,aAAV,CAAnB;AACA;AACA,cAAK,mBAAL,GACI,MAAM,GAAN,CAAU,gBAAV,MACC,MAAM,GAAN,CAAU,aAAV,KACG,MAAM,GAAN,CAAU,4BAAV,IAA0C,CAD7C,IAEG,MAAM,GAAN,CAAU,4BAAV,IAA0C,CAH9C,CADJ;AAKA,cAAK,cAAL,GAAsB,cAAtB;AACA,cAAK,MAAL;AAZmD;AAatD;;;;iCAEQ;AACL,gBAAI,gBAAgB;AAChB,uBAAO,KAAK,SAAL,EADS;AAEhB,0BAAU,KAFM;AAGhB,yBAAS,CAAC,OAAD,EAAU,kBAAV,EAA8B,aAA9B,CAHO;AAIhB,yBAAS,2CACL,KAAK,KAAL,CAAW,UADN,EAEL,EAFK,EAGL,EAHK,EAIL,EAJK,EAKL,KAAK,WALA,EAML,KAAK,mBANA,EAOL,KAAK,KAAL,CAAW,GAAX,CAAe,gBAAf,CAPK;AAJO,aAApB;;AAeA,gBAAI,OAAO,cAAP,CAAsB,SAAtB,CAAgC,+BAAhC,CAAJ,EAAsE;AAClE,oBAAI,QAAQ,KAAK,KAAL,CAAW,QAAX,CAAoB,GAApB,CAAZ;AACA,8BAAc,OAAd,GAAwB,2CACpB,IADoB,EAEpB,SAAS,MAAM,IAFK,EAGpB,KAAK,KAAL,CAAW,GAAX,CAAe,OAAf,CAHoB,EAIpB,KAAK,KAAL,CAAW,GAAX,CAAe,kBAAf,CAJoB,EAKpB,KAAK,WALe,EAMpB,KAAK,mBANe,EAOpB,KAAK,KAAL,CAAW,GAAX,CAAe,gBAAf,CAPoB,CAAxB;AASH;;AAED,iBAAK,KAAL,GAAa,IAAI,YAAJ,CAAU,aAAV,CAAb;AACA,iBAAK,WAAL,CAAiB,KAAK,KAAL,CAAW,GAA5B;AACA,iBAAK,YAAL,CAAkB,KAAK,KAAL,CAAW,GAA7B;AACA,iBAAK,KAAL,CAAW,IAAX;AACH;;;qCAEY,K,EAAO;AAAA;;AAChB,kBAAM,IAAN,CAAW,eAAX,EAA4B,EAA5B,CAA+B,OAA/B,EAAwC,YAAM;AAC1C,oBAAI,OAAO,MAAM,IAAN,CAAW,oBAAX,EAAiC,GAAjC,EAAX;;AAEA,oBAAI,OAAO,CAAX,EAAc;AACV,2BAAK,YAAL,CAAkB,IAAlB;AACH,iBAFD,MAEO;AACH,2BAAK,iBAAL,CAAuB,OAAK,KAAL,CAAW,GAAX,CAAe,IAAf,CAAvB;AACH;AACJ,aARD;;AAUA,kBAAM,IAAN,CAAW,2BAAX,EAAwC,EAAxC,CAA2C,OAA3C,EAAoD,YAAM;AACtD,oBAAI,mCAAJ,CAA6B,OAAK,KAAlC,EAAyC,OAAK,cAA9C;AACH,aAFD;;AAIA,kBAAM,IAAN,CAAW,SAAX,EAAsB,EAAtB,CAAyB,OAAzB,EAAkC,YAAM;AACpC,sBAAM,IAAN,CAAW,qBAAX,EAAkC,KAAlC;AACH,aAFD;;AAIA,kBAAM,IAAN,CAAW,oBAAX,EAAiC,EAAjC,CAAoC,QAApC,EAA8C,YAAM;AAChD,uBAAK,WAAL,CAAiB,KAAjB;AACH,aAFD;AAGH;;;oCAEW;AACR,gBAAI,KAAK,WAAT,EAAsB;AAClB,uBAAO,KAAK,iCAAL,CAAP;AACH,aAFD,MAEO,IAAI,KAAK,mBAAT,EAA8B;AACjC,uBAAO,KAAK,2CAAL,CAAP;AACH,aAFM,MAEA;AACH,uBAAO,KAAK,0BAAL,CAAP;AACH;AACJ;;;oCAEW,K,EAAO;AACf,gBAAM,cAAc,MAAM,IAAN,CAAW,sBAAX,CAApB;AACA,wBAAY,KAAZ;;AAEA,gBAAI,OAAO,MAAM,IAAN,CAAW,oBAAX,EAAiC,GAAjC,EAAX;AACA,gBAAI,OAAO,EAAX;;AAEA,gBAAI,OAAO,CAAX,EAAc;AACV,oBAAI,OAAO,0BAAQ,IAAR,CAAX;AACA,qBAAK,WAAL,IAAoB,KAAK,mBAAzB,GACO,OAAO,KAAK,gCAAL,EAAuC;AAC3C,oCAAgB,KAAK,WAAL,EAAkB,EAAE,GAAG,IAAL,EAAlB;AAD2B,iBAAvC,CADd,GAIO,OAAO,KAAK,qCAAL,EAA4C;AAChD,oCAAgB,KAAK,WAAL,EAAkB,EAAE,GAAG,IAAL,EAAlB;AADgC,iBAA5C,CAJd;AAOH,aATD,MASO;AACH,uBAAO,KAAK,sCAAL,CAAP;AACH;;AAED,wBAAY,MAAZ,CAAmB,IAAnB;AACH;;;qCAEY,I,EAAM;AACf,mBAAO,WAAP,CAAmB,KAAK,KAAL,CAAW,GAAX,CAAe,IAAf,CAAnB,EAAyC,IAAzC;;AAEA,gBAAI,QAAQ,KAAK,KAAjB;AACA,gBAAI,eAAe,IAAnB;AACA,gBAAI,eAAe,KAAK,WAAxB;AACA,gBAAI,cAAc,KAAK,KAAL,CAAW,GAAX,CAAe,gBAAf,CAAlB;AACA,gBAAI,UAAU;AACV,2BAAW,YADD;AAEV,8BAAc,YAFJ;AAGV,6BAAa,WAHH;AAIV,gCAAgB,KAAK;AAJX,aAAd;AAMA,mBAAO,YAAP,CAAoB,OAApB,CAA4B,eAA5B,EAA6C;AACzC,4BAAY,KAD6B;AAEzC;AAFyC,aAA7C;;AAKA,gBAAI,KAAK,WAAL,IAAoB,KAAK,mBAA7B,EAAkD;AAC9C,oBAAI,oCAAJ,CAA4B,KAAK,KAAjC,EAAwC,0BAAQ,IAAR,CAAxC;AACH,aAFD,MAEO;AACH,qBAAK,KAAL,CAAW,GAAX,CAAe,IAAf,CAAoB,qBAApB,EAA2C,KAA3C;AACH;AACJ;;;;EAnIyC,SAAS,I;;qBAAlC,gB;;;;;;;;cCZJ,M;IAAT,I,WAAA,I;;qBACO,UAAC,IAAD,EAAO,KAAP,EAAc,KAAd,EAAqB,MAArB,EAA6B,WAA7B,EAA0C,mBAA1C,EAA+D,WAA/D;AAAA,qGAGR,OAAO,cAAP,CAAsB,SAAtB,CAAgC,+BAAhC,mBACc,KADd,mEAE6B,KAF7B,uDAG0B,MAH1B,2BAKc,KAAK,MAAL,CAAY,YAAZ,CAAyB,IALvC,mEAM6B,KAAK,KANlC,uDAO0B,KAAK,gBAP/B,SAHQ,6GAgBL,eAAe,mBAAf,4CACyC,KAAK,4CAAL,CADzC,gBAEI,EAlBC,mFAqBD,sDACgC,KAAK,oCAAL,CADhC,iBAEI,EAvBH,0CAyBiB,sBAAsB,EAAtB,GAA2B,UAzB5C,WAyB0D,eAAe,mBAAf,GAAqC,KAAK,mCAAL,EAA0C,EAAC,KAAK,CAAN,EAA1C,CAArC,GAA2F,KAAK,iCAAL,EAAwC,EAAC,KAAK,CAAN,EAAxC,CAzBrJ,oDA0BkB,eAAe,mBAAf,GAAqC,KAAK,mCAAL,EAA0C,EAAC,KAAK,EAAN,EAA1C,CAArC,GAA4F,KAAK,iCAAL,EAAwC,EAAC,KAAK,EAAN,EAAxC,CA1B9G,oDA2BkB,eAAe,mBAAf,GAAqC,KAAK,mCAAL,EAA0C,EAAC,KAAK,EAAN,EAA1C,CAArC,GAA4F,KAAK,iCAAL,EAAwC,EAAC,KAAK,EAAN,EAAxC,CA3B9G,oDA4BkB,eAAe,mBAAf,GAAqC,KAAK,mCAAL,EAA0C,EAAC,KAAK,EAAN,EAA1C,CAArC,GAA4F,KAAK,iCAAL,EAAwC,EAAC,KAAK,EAAN,EAAxC,CA5B9G,oDA6BkB,eAAe,mBAAf,GAAqC,KAAK,mCAAL,EAA0C,EAAC,KAAK,EAAN,EAA1C,CAArC,GAA4F,KAAK,iCAAL,EAAwC,EAAC,KAAK,EAAN,EAAxC,CA7B9G,oDA8BkB,eAAe,mBAAf,GAAqC,KAAK,mCAAL,EAA0C,EAAC,KAAK,EAAN,EAA1C,CAArC,GAA4F,KAAK,iCAAL,EAAwC,EAAC,KAAK,EAAN,EAAxC,CA9B9G,qDA+BmB,eAAe,mBAAf,GAAqC,KAAK,mCAAL,EAA0C,EAAC,KAAK,GAAN,EAA1C,CAArC,GAA6F,KAAK,iCAAL,EAAwC,EAAC,KAAK,GAAN,EAAxC,CA/BhH,6SAyC4D,eAAe,mBAAf,GAAqC,KAAK,SAAL,CAArC,GAAuD,KAAK,0BAAL,CAzCnH,gGA2CC,eAAe,mBAAf,GAAqC,KAAK,SAAL,CAArC,GAAuD,KAAK,0BAAL,CA3CxD,sCA6CT,eAAe,mBAAf,IAAsC,CAAC,WAAvC,GACG,EADH,2KAGe,KAAK,gCAAL,CAHf,+BA7CS,gIAkDyG,KAAK,QAAL,CAlDzG;AAAA,C;;;;;;;;;;;ACDf;;;;AACA;;;;;;;;;;cAC+B,M;IAAvB,I,WAAA,I;IAAM,Y,WAAA,Y;;IAEO,uB;;;AACjB,qCAAY,KAAZ,EAAmB,cAAnB,EAAmC;AAAA;;AAAA,uJACtB,SADsB;;AAE/B,cAAK,KAAL,GAAa,KAAb;AACA,cAAK,cAAL,GAAsB,cAAtB;AACA,cAAK,GAAL,GAAW,YAAX;AACA,cAAK,MAAL;AAL+B;AAMlC;;;;iCAEO;AACJ,gBAAI,gBAAgB;AAChB,uBAAO,KAAK,iCAAL,CADS;AAEhB,0BAAU,KAFM;AAGhB,yBAAS,CAAC,OAAD,EAAU,kBAAV,EAA8B,aAA9B,CAHO;AAIhB,yBAAS,kDAAS,KAAK,KAAL,CAAW,UAApB,EAAgC,EAAhC,EAAoC,EAApC,EAAwC,EAAxC,EAA4C,KAAK,cAAjD;AAJO,aAApB;;AAOA,gBAAG,OAAO,cAAP,CAAsB,SAAtB,CAAgC,+BAAhC,CAAH,EAAoE;AAChE,oBAAI,QAAQ,KAAK,KAAL,CAAW,QAAX,CAAoB,GAApB,CAAZ;AACA,8BAAc,OAAd,GAAwB,kDAAS,IAAT,EAAe,SAAS,MAAM,IAA9B,EAAoC,KAAK,KAAL,CAAW,GAAX,CAAe,OAAf,CAApC,EAA6D,KAAK,KAAL,CAAW,GAAX,CAAe,kBAAf,CAA7D,EAAiG,KAAK,cAAtG,CAAxB;AACH;;AAED,iBAAK,KAAL,GAAa,IAAI,YAAJ,CAAU,aAAV,CAAb;AACA,iBAAK,YAAL,CAAkB,KAAK,KAAL,CAAW,GAA7B;AACA,iBAAK,KAAL,CAAW,IAAX;AACH;;;qCAEY,K,EAAM;AAAA;;AACf,kBAAM,IAAN,CAAW,SAAX,EAAsB,EAAtB,CAAyB,OAAzB,EAAkC,YAAM;AACpC,sBAAM,IAAN,CAAW,qBAAX,EAAkC,KAAlC;AACH,aAFD;;AAIA,iBAAK,KAAL,CAAW,EAAX,CAAc,cAAd,EAA8B;AAAA,uBAAM,OAAK,GAAL,CAAS,OAAT,CAAiB,wBAAjB,CAAN;AAAA,aAA9B;AACH;;;;EAjCgD,SAAS,I;;qBAAzC,uB;;;;;;;;cCJJ,M;IAAT,I,WAAA,I;;qBACO,UAAC,IAAD,EAAO,KAAP,EAAc,KAAd,EAAqB,MAArB,EAA6B,cAA7B;AAAA,qGAGR,OAAO,cAAP,CAAsB,SAAtB,CAAgC,+BAAhC,mBACc,KADd,mEAE6B,KAF7B,uDAG0B,MAH1B,2BAKc,KAAK,MAAL,CAAY,YAAZ,CAAyB,IALvC,mEAM6B,KAAK,KANlC,uDAO0B,KAAK,gBAP/B,SAHQ,sJAgBL,mBAAmB,OAAnB,QACK,KAAK,kDAAL,CADL,QAEK,KAAK,4CAAL,EAAmD,EAAC,gBAAgB,KAAK,WAAL,EAAkB,EAAC,GAAG,cAAJ,EAAlB,CAAjB,EAAnD,CAlBA,oLAwByG,KAAK,OAAL,CAxBzG;AAAA,C;;;;;;;;;;;;;ACIf;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;AACA;;;;AACA;;;;;;;;;;AAZA,IAAM,WAAW,OAAO,QAAxB;AACA,IAAM,OAAO,OAAO,IAApB;AACA,IAAM,MAAM,OAAO,GAAnB;AACA,IAAM,kBAAkB,CAAC,OAAD,EAAU,WAAV,EAAuB,OAAvB,EAAgC,UAAhC,CAAxB;;IAWqB,qB;;;AACjB,yCASG;AAAA,YARC,IAQD,QARC,IAQD;AAAA,YAPC,KAOD,QAPC,KAOD;AAAA,YANC,GAMD,QANC,GAMD;AAAA,YALC,cAKD,QALC,cAKD;AAAA,YAJC,cAID,QAJC,cAID;AAAA,YAHC,aAGD,QAHC,aAGD;AAAA,kCAFC,SAED;AAAA,YAFC,SAED,kCAFa,KAEb;AAAA,mCADC,UACD;AAAA,YADC,UACD,mCADc,IACd;;AAAA;;AAAA,mJACU,SADV;;AAEC,cAAK,IAAL,GAAY,IAAZ;AACA,cAAK,KAAL,GAAa,KAAb;AACA,cAAK,GAAL,GAAW,GAAX;AACA,cAAK,cAAL,GAAsB,cAAtB;AACA,cAAK,cAAL,GAAsB,cAAtB;AACA,cAAK,aAAL,GAAqB,aAArB;AACA,cAAK,SAAL,GAAiB,SAAjB;AACA,cAAK,UAAL,GAAkB,UAAlB;AACA,cAAK,MAAL,GAAc,EAAd;;AAEA,YAAI,QAAQ,OAAO,SAAP,CAAiB,KAA7B;AACA,cAAK,0BAAL,GAAkC,EAC9B,MAAK,cAAL,CAAoB,SAApB,CAA8B,iBAA9B,KAAoD,CAAC,KADvB,CAAlC;AAGA,cAAK,mBAAL,GACI,MAAK,IAAL,CAAU,WAAV,IACA,MAAK,IAAL,CAAU,YADV,IAEA,MAAK,cAAL,CAAoB,SAApB,CAA8B,iBAA9B,CAFA,IAGA,CAAC,KAHD,IAIA,MAAK,cAAL,CAAoB,SAApB,CAA8B,cAA9B,CALJ;AAMA,cAAK,MAAL,CAAY,IAAZ,CACK,MAAK,KAAL,GAAa,IAAI,kBAAJ,CAAU;AACpB,mBAAO,MAAK,KADQ;AAEpB,yBAAa,EAAE,QAAQ,GAAV,EAAe,QAAQ,GAAvB,EAA4B,SAAS,GAArC;AAFO,SAAV,CADlB;AAMA,cAAK,MAAL,CAAY,IAAZ,CACK,MAAK,WAAL,GAAmB,IAAI,6BAAJ,CAAqB;AACrC,oBAAQ,MAAK,KAAL,CAAW,GAAX,CAAe,MAAf,EAAuB;AADM,SAArB,CADxB;AA5BD;AAiCF;;;;iCAEQ;AACL,gBAAI,gBAAgB,QAAhB,CAAyB,KAAK,IAAL,CAAU,IAAV,CAAe,EAAxC,CAAJ,EAAiD;AAC7C,qBAAK,WAAL,CAAiB,MAAjB;;AAEA,oBAAI,QAAO,KAAK,cAAL,EAAX;;AAEA,oBAAI,gBAAgB;AAChB,2BAAO,KAAK,gBAAL,CADS;AAEhB,8BAAU,KAFM;AAGhB,6BAAS,CAAC,OAAD,EAAU,uBAAV,CAHO;AAIhB,6BAAS;AAJO,iBAApB;;AAOA,qBAAK,KAAL,GAAa,IAAI,YAAJ,CAAU,aAAV,CAAb;AACA,qBAAK,YAAL,CAAkB,KAAK,KAAL,CAAW,GAA7B;AACA,qBAAK,KAAL,CAAW,IAAX;AACH,aAfD,MAeO;AACH,uBAAO,MAAP,CAAc,GAAd,CAAkB,OAAlB,EAA2B,iCAA3B,EAA8D;AAC1D,4BAAQ,mBADkD;AAE1D,2BAAO,KAAK,IAAL,CAAU,KAFyC;AAG1D,wBAAI,KAAK,IAAL,CAAU,EAH4C;AAI1D,0BAAM,KAAK,IAAL,CAAU;AAJ0C,iBAA9D;AAMA,oBAAI,OAAJ,EAAa;AACT,4BAAQ,IAAR,CAAa,KAAK,cAAL,CAAb,EAAmC,OAAnC;AACH;AACJ;AACJ;;;qCAEY,I,EAAM;AAAA;;AACf,gBAAI,aAAa,KAAK,KAAtB;AACA,iBAAK,IAAL,CAAU,0BAAV,EAAsC,KAAtC,CAA4C,UAAC,GAAD,EAAS;AACjD,oBAAI,WAAW,EAAE,IAAI,aAAN,EAAqB,IAArB,CAA0B,gBAA1B,CAAf;;AAEA,oBACI,OAAO,eAAP,CAAuB,iBAAvB,CACI,OAAO,eAAP,CAAuB,YAAvB,CAAoC,UADxC,KAGA,EACI,QAAQ,GAAR,CAAY,8BAAZ,KACA,QAAQ,GAAR,CAAY,8BAAZ,MAAgD,GAFpD,CAHA,IAOA,OAAO,iBAAP,CAAyB,GAAzB,CAA6B,mBAA7B,KAAqD,IARzD,EASE;AACE;AACA,wBAAI,cAAJ;;AAEA,wBAAI,gBAAgB,IAAI,OAAO,MAAP,CAAc,aAAlB,EAAiC;AACjD,gCAAQ,QADyC;AAEjD,iCAAS,OAAK,IAAL,CAAU;AAF8B,qBAAjC,CAApB;;AAKA,wBAAI,6BAAJ,CAAqB;AACjB,6BAAK,OAAK,GADO;AAEjB,2CAAmB,OAAO,iBAFT;AAGjB,gCAAQ,qBAHS;AAIjB,6CAAqB;AAJJ,qBAArB,EAKG,GALH;AAMH;AACD,uBAAK,GAAL,CAAS,OAAT,CAAiB,gBAAjB,EAAmC;AAC/B,0CAD+B;AAE/B,6BAAS,EAAE,kBAAF;AAFsB,iBAAnC;AAIH,aAhCD;;AAkCA,iBAAK,IAAL,CAAU,mBAAV,EAA+B,KAA/B,CAAqC,UAAC,GAAD,EAAS;AAC1C,oBAAI,WAAW,EAAE,IAAI,aAAN,EAAqB,IAArB,CAA0B,gBAA1B,CAAf;AACA,uBAAK,GAAL,CAAS,OAAT,CAAiB,gBAAjB,EAAmC;AAC/B,0CAD+B;AAE/B,6BAAS,EAAE,kBAAF;AAFsB,iBAAnC;AAIH,aAND;;AAQA,iBAAK,IAAL,CAAU,8CAAV,EAA0D,KAA1D,CACI,UAAC,GAAD,EAAS;AACL,oBAAI,iCAAJ,CAAyB,EAAE,IAAI,aAAN,CAAzB;AACA,oBAAI,WAAW,EAAE,IAAI,aAAN,EAAqB,IAArB,CAA0B,gBAA1B,CAAf;AACA,uBAAK,GAAL,CAAS,OAAT,CAAiB,gBAAjB,EAAmC;AAC/B,0CAD+B;AAE/B,6BAAS,EAAE,kBAAF;AAFsB,iBAAnC;AAIH,aARL;;AAWA,gBAAI,aAAa,KAAK,IAAL,CAAU,gCAAV,CAAjB;AACA,gBAAI,UAAJ,EAAgB;AACZ,oBAAI,yCAAJ,CAAiC,UAAjC,EAA6C,MAA7C;AACH;;AAED,iBAAK,IAAL,CAAU,qBAAV,EAAiC,KAAjC,CAAuC;AAAA,uBACnC,OAAK,uBAAL,EADmC;AAAA,aAAvC;AAGH;;;kDA0CyB;AACtB,gBAAM,QAAQ,KAAK,KAAL,CAAW,GAAzB;AACA,gBAAM,gBAAgB,KAAK,KAAL,CAAW,GAAX,CAAe,IAAf,CAAoB,aAApB,EAAmC,EAAzD;;AAEA,kBAAM,QAAN,CAAe,mCAAf;AACA,0BAAc,IAAd;;AAEA,mBAAO,yBAAP,CAAiC,MAAjC,CAAwC;AACpC,yBAAS,mBAAM;AACX,2BAAO,yBAAP,CAAiC,MAAjC,CAAwC;AACpC,iCAAS,OAAO,6BADoB;AAEpC,8BAAM;AAF8B,qBAAxC;;AAKA,kCAAc,IAAd;AACA,0BAAM,WAAN,CAAkB,mCAAlB;AACH,iBATmC;AAUpC,sBAAM,IAV8B;AAWpC,6BAAa,KAAK,IAAL,CAAU,WAXa;AAYpC,yBAAS,KAAK,IAAL,CAAU,OAZiB;AAapC,yCAAyB,CAAC,EACtB,KAAK,IAAL,CAAU,kBAAV,IAAgC,KAAK,IAAL,CAAU,gBADpB;AAbU,aAAxC;AAiBH;;;yCAEgB;AACb,gBAAM,aAAa,KAAK,SAAL,IAAkB,KAAK,UAAL,KAAoB,cAAzD;AACA,gBAAM,UAAU,KAAK,cAAL,CAAoB,UAApB,CAAhB;AACA,mBAAO,KAAK,kBAAL,CAAwB,OAAxB,EAAiC,UAAjC,CAAP;AACH;;;uCAEc,U,EAAY;AACvB,iBAAK,uBAAL;;AAEA,gBAAI,eAAe,EAAnB;AACA,gBAAI,cAAc,EAAlB;AACA,2BAAe,oDACX,KAAK,cADM,EAEX,KAAK,IAFM,EAGX;AACI,uBAAO,OAAO,SAAP,CAAiB,KAD5B;AAEI,kCAAkB,KAAK,gBAF3B;AAGI,iCAAiB,OAAO,SAAP,CAAiB,SAAjB,CAA2B,KAA3B,CACb,mCADa,CAHrB;AAMI,gCAAgB,OAAO,SAAP,CAAiB,cANrC;AAOI,sCAPJ;AAQI,yCAAyB,KAAK;AARlC,aAHW,CAAf;;AAeA,sCACM,WADN,uBAGQ,aAAa,UAAb,KAA4B,QAA5B,GACM,KAAK,kBAAL,EADN,GAEM,EALd,wBAQQ,aAAa,UAAb,KAA4B,UAA5B,GACM,KAAK,oBAAL,CAA0B,aAAa,QAAvC,CADN,GAEM,EAVd,wBAaQ,aAAa,UAAb,KAA4B,aAA5B,GACM,KAAK,oBAAL,CAA0B,aAAa,QAAvC,EAAiD,IAAjD,CADN,GAEM,EAfd,wBAkBQ,aAAa,UAAb,KAA4B,QAA5B,GACM,KAAK,kBAAL,EADN,GAEM,EApBd,wBAuBQ,KAAK,0BAAL,IACA,aAAa,kCAAb,KAAoD,UADpD,GAEM,KAAK,sBAAL,EAFN,GAGM,EA1Bd,wBA6BQ,aAAa,mBAAb,yCACwC,KAC9B,8CAD8B,CADxC,cAIM,EAjCd,wBAoCQ,aAAa,gBAAb,GACM,KAAK,sBAAL,EADN,GAEM,EAtCd,wBAyCQ,aAAa,WAAb,IAA4B,CAAC,KAAK,mBAAlC,GACM,KAAK,mBAAL,EADN,GAEM,EA3Cd,wBA6CM,KAAK,mBAAL,GAA2B,KAAK,qBAAL,EAA3B,GAA0D,EA7ChE,wBA+CQ,aAAa,SAAb,KAA2B,QAA3B,GACM,KAAK,kBAAL,EADN,GAEM,EAjDd,wBAoDQ,aAAa,oBAAb,IACA,aAAa,SAAb,KAA2B,WAD3B,IAEC,aAAa,UAAb,KAA4B,WAA5B,IACG,KAAK,cAAL,CAAoB,SAApB,CACI,0BADJ,CAHJ,IAMC,aAAa,QAAb,KAA0B,eAA1B,IACG,aAAa,UAAb,KAA4B,QAPhC,GAQM,KAAK,wBAAL,EARN,GASM,EA7Dd,wBAgEQ,aAAa,2BAAb,GACM,KAAK,oBAAL,EADN,GAEM,EAlEd,wBAqEQ,aAAa,gCAAb,GACM,KAAK,sBAAL,EADN,GAEM,EAvEd,wBA0EQ,aAAa,0BAAb,GACM,KAAK,2BAAL,EADN,GAEM,EA5Ed,wBA+EQ,aAAa,2BAAb,GACM,KAAK,6BAAL,CACI,KAAK,IAAL,CAAU,iBADd,CADN,GAIM,EAnFd,wBAsFQ,KAAK,0BAAL,IACA,aAAa,kCAAb,KAAoD,MADpD,GAEM,KAAK,sBAAL,EAFN,GAGM,EAzFd,uBA2FM,KAAK,+BAAL,EA3FN;AA6FH;;;gDAEuB;AACpB,gBAAI,KAAK,mBAAT,EAA8B;AAC1B,mPAGqD,8BAC7B,8BAD6B,CAHrD,2HAOyB,KACD,mCADC,CAPzB;AAaH;AACJ;;;iDAEwB;AACrB,kHAEqC,KAC7B,6CAD6B,CAFrC;AAOH;;;iDAEwB;AACrB,2JAGa,KAAK,sCAAL,CAHb;AAOH;;;2CAEkB,W,EAAa,U,EAAY;AACxC,gBAAI,uCAAmC,KAAK,KAAL,CAAW,GAAX,CAAe,OAAf,CAAnC,YAAJ;AACA,gBAAI,iBAAiB,KAAK,aAAL,CAAmB,cAAxC;;AAEA,gBAAI,mBAAmB,EAAvB;AACA,gBAAI,iBAAiB,CAArB,EAAwB;AACpB,oBAAI,KAAK,IAAL,CAAU,UAAd,EAA0B;AACtB,uCAAmB,KACf,gDADe,EAEf,EAAE,OAAO,cAAT,EAFe,CAAnB;AAIH,iBALD,MAKO;AACH,uCAAmB,KAAK,qCAAL,EAA4C;AAC3D,+BAAO;AADoD,qBAA5C,CAAnB;AAGH;AACJ,aAXD,MAWO,IACH,EACI,KAAK,cAAL,CAAoB,SAApB,CACI,iCADJ,KAEK,KAAK,IAAL,CAAU,UAHnB,CADG,EAML;AACE,mCAAmB,KAAK,uCAAL,CAAnB;AACH;;AAED,qIAGuC,KAAK,KAAL,CAAW,GAAX,CAAe,IAAf,EAHvC,+JAOoB,KAAK,IAAL,CAAU,gBAAV,GACM,KACI,yCADJ,EAEI;AACI,sBAAM,KAAK,IAAL,CAAU,OADpB;AAEI,uBAAO,SAFX;AAGI,uBAAO,KAAK,IAAL,CAAU,WAAV,CACF;AAJT,aAFJ,CADN,GAUM,KAAK,SAAL,GACA,KAAK,yBAAL,EAAgC;AAC5B,uBAAO,SADqB;AAE5B,gCAAgB,KAAK,IAAL,CAAU;AAFE,aAAhC,CADA,GAKA,KAAK,gCAAL,EAAuC;AACnC,sBAAM,KAAK,IAAL,CAAU,OADmB;AAEnC,uBAAO;AAF4B,aAAvC,CAtB1B,0CA4BoB,KAAK,SAAL,GACM,EADN,uCAEsC,gBAFtC,WA5BpB,4DAkCgB,KAAK,IAAL,CAAU,cAAV,CAAyB,MAAzB,GAAkC,CAAlC,GACM,KAAK,oBAAL,EADN,GAEM,EApCtB,kGAwCoB,KAAK,SAAL,IAAkB,CAAC,CAAC,KAAK,UAAzB,GACM,2DACgD,KACxC,0CADwC,CADhD,0OAK8I,KACxI,kDADwI,CAL9I,+EAQ4B,KACtB,4CADsB,CAR5B,sFAYoC,KAC5B,2BAD4B,CAZpC,WADN,GAgBM,EAxD1B,mCA0DkB,WA1DlB,+KAkEY,KAAK,SAAL,IAAkB,CAAC,CAAC,KAAK,UAAzB,GACM,2DACgD,KACxC,0CADwC,CADhD,0NAK8I,KACxI,kDADwI,CAL9I,uEAQ4B,KACtB,4CADsB,CAR5B,8EAYoC,KAC5B,2BAD4B,CAZpC,WADN,GAgBM,EAlFlB,2BAoFU,WApFV;AAuFH;;;8CAEqB;AAClB;AACA;AACA,6IAGgB,CAAC,KAAK,IAAL,CAAU,mBAAX,6FAGE,KAAK,IAAL,CAHF,qCAKM,EARtB;AAWH;;;6CAEoB;AACjB,kEAAoD,IAChD,OAAO,MAAP,CAAc,aADkC,EAEhD;AACI,wBAAQ,KAAK,IAAL,CAAU,YAAV,CAAuB,EADnC;AAEI,yBAAS,KAAK,IAAL,CAAU;AAFvB,aAFgD,CAApD,2JASgB,KAAK,IAAL,CAAU,YAAV,CAAuB,EATvC,yBAUgC,KAAK,IAAL,CAAU,EAV1C,iDAWgC,kBACL,KAAK,IAAL,CAAU,YAAV,CAAuB,EADlB,CAXhC,uCAcqB,KAAK,2BAAL,EAAkC;AACvC,qEAAmD,KAC/C,0BAD+C,CAAnD;AADuC,aAAlC,CAdrB,iHAqBoB,KACJ,6CADI,CArBpB,sTA+BY,KAAK,IAAL,CAAU,0BAAV,GACM,KAAK,4BAAL,EADN,GAEM,EAjClB;AAoCH;;;uDAE8B;AAC3B,gBAAI,iBAAiB,EAArB;AACA,gBAAI,KAAK,IAAL,CAAU,kBAAd,EAAkC;AAC9B,iCAAiB,KAAK,kBAAL,EAAjB;AACH;;AAED,4NAGoB,KAAK,IAAL,CAAU,EAH9B,sIAMmE,KACvC,4BADuC,CANnE,2VAeoB,KAAK,IAAL,CAAU,EAf9B,wDAiBsB,cAjBtB;AAqBH;;;mDAE0B;AACvB,gBACI,CAAC,KAAK,cAAL,CAAoB,SAApB,CAA8B,oBAA9B,CAAD,IACA,CAAC,KAAK,cAAL,CAAoB,SAApB,CAA8B,cAA9B,CADD,IAEA,KAAK,cAAL,CAAoB,SAApB,CAA8B,yBAA9B,CAFA,IAGA,KAAK,0BAJT,EAKE;AACE,8EAEI,KAAK,IAAL,CAAU,yBAAV,uDAEU,KAAK,gCAAL,EAFV,oCAIM,EANV;AASH;;AAED,gBACI,CAAC,KAAK,cAAL,CAAoB,SAApB,CAA8B,cAA9B,CAAD,IACA,KAAK,0BADL,IAEA,CAAC,KAAK,uBAHV,EAIE;AACE,sFAEY,KAAK,IAAL,CAAU,yBAAV,oNAIQ,KAAK,IAAL,CAAU,EAJlB,yLASoB,KAAK,cAAL,CAAoB,SAApB,CACI,oBADJ,IAGM,KACI,oCADJ,CAHN,GAMM,KACI,6BADJ,CAf1B,0ZA0BQ,KAAK,IAAL,CAAU,EA1BlB,4DA4BU,KAAK,oBAAL,EA5BV,sGAgCM,EAlClB;AAqCH;;AAED,kFAEgB,KAAK,cAAL,CAAoB,SAApB,CAA8B,cAA9B,IACM,KAAK,iCAAL,EADN,GAEM,EAJtB,sDAQgB,KAAK,IAAL,CAAU,yBAAV,GACM,KAAK,gCAAL,EADN,GAEM,EAVtB;AAaH;;;4DAEmC;AAChC,gBAAI,CAAC,KAAK,mBAAV,EAA+B;AAC3B,oBAAI,KAAK,cAAL,CAAoB,SAApB,CAA8B,sBAA9B,CAAJ,EAA2D;AACvD,wDAAkC,KAC9B,4BAD8B,CAAlC,4LAIc,KAAK,uBAAL,CAJd;AAMH,iBAPD,MAOO;AACH,gKACM,KAAK,uBAAL,CADN;AAGH;AACJ,aAbD,MAaO;AACH,uBAAO,EAAP;AACH;AACJ;;;2DAEkC;AAC/B,gBAAI,eAAe,OAAO,cAAP,CAAsB,SAAtB,CAAgC,oBAAhC,IACb,KAAK,oCAAL,CADa,GAEb,KAAK,6BAAL,CAFN;AAGA,gBAAI,kBACA,KAAK,0BAAL,IAAmC,CAAC,KAAK,uBAAzC,GACM,KAAK,oBAAL,EADN,GAEM,EAHV;;AAKA,gBACI,KAAK,cAAL,CAAoB,SAApB,CAA8B,yBAA9B,KACA,CAAC,KAAK,0BAFV,EAGE;AACE,+BAAe,KAAK,oCAAL,CAAf;AACA,yFACE,KAAK,0CAAL,CADF;AAEH;;AAED,gBAAI,oBAAoB,EAAxB,EAA4B;AACxB,gOAEkE,KAAK,IAAL,CAAU,EAF5E,4KAK0B,YAL1B,6XAYyC,KAAK,IAAL,CAAU,EAZnD,wDAakB,eAblB;AAiBH,aAlBD,MAkBO;AACH,uBAAO,EAAP;AACH;AACJ;;;+CAKC;AAAA,gBAFE,QAEF,uEAFa,KAAK,IAAL,CAAU,uBAAV,CAAkC,CAAlC,EAAqC,EAElD;AAAA,gBADE,iBACF,uEADsB,KACtB;;AACE,gBAAI,iBAAJ,EAAuB;AACnB,mFAC2C,OAAO,IAAP,cACxB,QADwB,CAD3C,2CAIkB,OAAO,IAAP,CAAY,gCAAZ,EAA8C;AACpD,6BAAS;AAD2C,iBAA9C,CAJlB;AASH,aAVD,MAUO,IAAI,CAAC,KAAK,cAAL,CAAoB,SAApB,CAA8B,qBAA9B,CAAL,EAA2D;AAC9D,oBAAM,iCACF,KAAK,wCAAL,CAA8C,QAA9C,CADJ;AAEA,oBAAI,+BAA+B,IAAnC,EAAyC;AACrC,uFAEI,+BAA+B,MAFnC,2CAIc,OAAO,IAAP,CAAY,gCAAZ,EAA8C;AACpD,iCAAS;AAD2C,qBAA9C,CAJd;AASH;AACJ;;AAED,qMAE8B,QAF9B,yBAE0D,KAAK,IAAL,CAAU,EAFpE,iDAGgC,kBAAgB,QAAhB,CAHhC,oCAKgB,aAAa,gBAAb,GACM,KAAK,SAAL,CADN,GAEM,KAAK,SAAL,IAAkB,CAAC,CAAC,KAAK,UAAzB,GACA,KAAK,uBAAL,CADA,GAEA,KAAK,uBAAL,CATtB,8DAWoC,kBAAgB,QAAhB,CAXpC;AAaH;;;6CAEoB;AACjB,gBAAI,aAAa,EAAjB;AACA,gBAAI,gBAAgB,EAApB;;AAEA,gBAAI,KAAK,IAAL,CAAU,OAAV,IAAqB,KAAK,IAAL,CAAU,UAAnC,EAA+C;AAC3C,gCAAgB,KAAK,SAAL,CAAhB;AACH,aAFD,MAEO,IAAI,KAAK,IAAL,CAAU,OAAd,EAAuB;AAC1B,gCAAgB,OAAO,SAAP,CAAiB,KAAjB,GACV,KAAK,gBAAL,CADU,GAEV,KAAK,UAAL,CAFN;AAGH,aAJM,MAIA,IAAI,KAAK,IAAL,CAAU,WAAd,EAA2B;AAC9B,gCAAgB,KAAK,WAAL,CAAhB;AACH;;AAED,gBAAI,KAAK,IAAL,CAAU,YAAd,EAA4B;AACxB,8DAA4C,KACxC,uBADwC,CAA5C;AAGH;;AAED,4BACI,KAAK,IAAL,CAAU,eAAV,CAA0B,EAA1B,KAAiC,iBAAjC,GACM,sBADN,GAEM,EAHV,kCAKiB,IAAI,OAAO,MAAP,CAAc,aAAlB,EAAiC;AACtC,wBAAQ,KAAK,IAAL,CAAU,eAAV,CAA0B,EADI;AAEtC,yBAAS,KAAK,IAAL,CAAU;AAFmB,aAAjC,CALjB,kMAY0B,KAAK,IAAL,CAAU,eAAV,CAA0B,EAZpD,0CAcY,KAAK,IAAL,CAAU,EAdtB,eAekB,aAflB,YAesC,UAftC;AAiBH;;;iDAEwB;AAAA;;AACrB,gBAAI,UAAU,EAAd;;AAEA,iBAAK,IAAL,CAAU,uBAAV,CAAkC,OAAlC,CAA0C,UAAC,MAAD,EAAY;AAClD,0BAAa,OAAb,uIAEqE,kBACtC,OAAO,EAD+B,CAFrE,0BAIsC,OAAO,EAJ7C,sDAKiC,OAAK,IAAL,CAAU,EAL3C,sBAK8D,KAC1D,yBAD0D,EAE1D,EAAE,QAAQ,kBAAgB,OAAO,EAAvB,CAAV,EAF0D,CAL9D,wCAUoB,OAAK,IAAL,CAAU,YAAV,CAAuB,CAAvB,EAA0B,EAA1B,KAAiC,cAAjC,GACM,kCADN,GAEM,EAZ1B,yFAewB,IAAI,OAAO,MAAP,CAAc,aAAlB,EAAiC;AACrC,4BAAQ,OAAO,EADsB;AAErC,6BAAS,OAAK,IAAL,CAAU;AAFkB,iBAAjC,CAfxB,UAkBuB,kBAAgB,OAAO,EAAvB,CAlBvB;AAoBH,aArBD;;AAuBA,gBAAI,4DACA,KAAK,IAAL,CAAU,EADV,mEAIwB,KAAK,IAAL,CAAU,EAJlC,4IAM0E,KAClD,uBADkD,CAN1E,qEAUgB,KAAK,IAAL,CAAU,EAV1B,gKAYkB,OAZlB,qCAAJ;AAcA,mBAAO,OAAP;AACH;;;+CAEsB;AAAA;;AACnB,gBAAI,iBAAiB,EAArB;AACA,gBAAI,mBAAmB,EAAvB;AACA,iBAAK,IAAL,CAAU,cAAV,CAAyB,OAAzB,CAAiC,UAAC,UAAD,EAAgB;AAC7C,oBAAI,SAAS,WAAW,YAAX,CAAwB,CAAxB,CAAb;AACA,oBAAI,QAAQ,EAAZ;AACA,wBAAQ,OAAO,EAAf;AACI,yBAAK,iBAAL;AACA,yBAAK,oBAAL;AACI,gCAAQ,KAAK,SAAL,CAAR;AACA;AACJ,yBAAK,qBAAL;AACI,gCAAQ,KAAK,WAAL,CAAR;AACA;AACJ,yBAAK,iBAAL;AACI,gCAAQ,KAAK,UAAL,CAAR;AACA;AACJ;AACI,gCAAW,kBAAgB,OAAO,EAAvB,CAAX,eAAiD,KAC7C,uBAD6C,CAAjD;AAZR;AAgBA,oBAAI,OAAK,YAAL,CAAkB,MAAlB,CAAJ,EAA+B;AAC3B,qCAAiB,IAAjB,CAAsB,MAAtB;AACH,iBAFD,MAEO,IAAI,WAAW,EAAf,EAAmB;AACtB,gJACI,WAAW,EADf,2BAGI,OAAO,EAAP,IAAa,WAAW,eAAX,CAA2B,EAH5C,6CAMmB,WAAW,IAAX,uBACwB,WAAW,IAAX,CAAgB,EADxC,sCAEM,EARzB,0CAUiB,KAVjB;AAWH;AACD;AAbO,qBAcF;AACD,oKAA0I,KACtI,WADsI,CAA1I;AAGH;AACJ,aAxCD;;AA0CA,kFACI,KAAK,IAAL,CAAU,EADd,oCAGI,KAAK,IAAL,CAAU,EAHd,4CAIuC,KACnC,2BADmC,CAJvC,+JAUY,KAAK,IAAL,CAAU,EAVtB,kKAY6C,KAC7B,2BAD6B,CAZ7C,mCAec,cAfd,+BAiBgB,iBAAiB,MAAjB,GAA0B,CAA1B,yCAC0C,KAAK,6BAAL,CAChC,gBADgC,CAD1C,aAIM,EArBtB;AAyBH;;;sDAE6B,O,EAAS;AACnC,gBAAI,cAAc,EAAlB;AACA,oBAAQ,OAAR,CAAgB,UAAC,MAAD,EAAY;AACxB,4BAAY,IAAZ,CAAiB,OAAO,IAAxB;AACH,aAFD;AAGA,gBAAI,cAAc,YAAY,IAAZ,CAAiB,KAAjB,CAAlB;AACA,yFACoB,WADpB,6CAEsB,OAAO,IAAP,CAAY,gCAAZ,EAA8C;AACpD,yBAAS,QAAQ;AADmC,aAA9C,CAFtB;AAMH;;;sDAE6B;AAC1B,yFACoB,OAAO,IAAP,CAAY,yBAAZ,CADpB,6CAEsB,OAAO,IAAP,CACN,6BADM,CAFtB;AAMH;;;0DAEiC;AAC9B,gBAAI,YAAY,OAAO,SAAP,CAAiB,SAAjC;AACA,gBAAI,QAAQ,OAAO,SAAP,CAAiB,KAA7B;AACA,gBAAI,qBAAqB,KAAK,IAAL,CAAU,OAAV,IAAqB,KAAK,IAAL,CAAU,WAAxD;;AAEA,gBACI,aACA,KADA,IAEA,kBAFA,IAGA,KAAK,cAAL,CAAoB,SAApB,CAA8B,8BAA9B,CAJJ,EAKE;AACE,kJAEoD,8BACxC,6BADwC,CAFpD,oEAK8C,KAClC,oCADkC,CAL9C;AAUH;AACD,mBAAO,EAAP;AACH;;;iCAEQ;AACL,iBAAK,MAAL,CAAY,OAAZ,CAAoB,UAAC,IAAD;AAAA,uBAAU,KAAK,MAAL,EAAV;AAAA,aAApB;AACA;AACH;;;kDAEyB;AAAA;;AACtB,iBAAK,IAAL,CAAU,iBAAV,GAA8B,EAA9B;AACA,gBAAI,KAAK,UAAT,EAAqB;AACjB,qBAAK,IAAL,CAAU,YAAV,GAAyB,KAAK,IAAL,CAAU,YAAV,CAAuB,MAAvB,CACrB,UAAC,MAAD;AAAA,2BAAY,OAAO,EAAP,KAAc,OAAK,UAA/B;AAAA,iBADqB,CAAzB;AAGH;AACD,iBAAK,IAAL,CAAU,YAAV,GAAyB,KAAK,IAAL,CAAU,YAAV,CAAuB,MAAvB,CAA8B,UAAC,MAAD,EAAY;AAC/D,oBAAI,eAAe,OAAK,YAAL,CAAkB,MAAlB,CAAnB;AACA,oBAAI,YAAJ,EAAkB;AACd,2BAAK,IAAL,CAAU,iBAAV,CAA4B,IAA5B,CAAiC,MAAjC;AACH;AACD,uBAAO,CAAC,YAAR;AACH,aANwB,CAAzB;AAOH;;;qCAEY,M,EAAQ;AACjB,gBAAI,SAAS,OAAO,MAApB;AACA,gBAAI,eAAe,CAAC,CAAC,OAAO,SAAP,CAAiB,SAAjB,CAA2B,KAA3B,CAAiC,MAAjC,CAArB;AACA,gBAAI,YACA,OAAO,SAAP,CAAiB,QAAjB,CAA0B,KAA1B,CAAgC,KAAhC,KAA0C,CAAC,OAAO,YADtD;AAEA,gBAAI,QAAQ,OAAO,SAAP,CAAiB,KAA7B;AACA,gBAAI,QAAQ,OAAO,SAAP,CAAiB,SAAjB,CAA2B,KAA3B,CAAiC,KAAjC,KAA2C,CAAC,OAAO,GAA/D;AACA,gBAAI,SACA,KAAK,cAAL,CAAoB,SAApB,CAA8B,6BAA9B,KACA,OAAO,SAAP,CAAiB,SAAjB,CAA2B,KAA3B,CACI,mCADJ,CAFJ;;AAMA,oBAAQ,OAAO,EAAf;AACI,qBAAK,iBAAL;AACI,2BACI,OAAO,GAAP,IACA,OAAO,OADP,IAEA,OAAO,YAFP,IAGA,OAAO,UAHP,IAIA,YAJA,IAKC,aAAa,KALd,IAMA,MAPJ;AASJ,qBAAK,kBAAL;AACI,2BAAO,gBAAgB,CAAC,KAAxB;AACJ,qBAAK,gBAAL;AACI,2BACK,CAAC,OAAO,GAAP,IACE,OAAO,OADT,IAEE,SAFF,IAGE,YAHH,KAIG,KAJJ,IAKA,OAAO,YALP,IAMA,OAAO,UANP,IAOA,MARJ;AAUJ,qBAAK,eAAL;AACI,2BACK,gBAAgB,CAAC,KAAlB,IACC,UACI,KAAK,KAAL,CAAW,GAAX,CAAe,SAAf,EAA0B,MAA1B,KAAqC,CAArC,IACI,SACG,KAAK,KAAL,CAAW,GAAX,CAAe,SAAf,EAA0B,MAA1B,KAAqC,CAHhD,KAIG,KAAK,cAAL,CAAoB,SAApB,CAA8B,sBAA9B,CAJH,KAKI,CAAC,KAAK,cAAL,CAAoB,SAApB,CACE,qCADF,CAAD,IAGG,CAAC,OAAO,SAAP,CAAiB,gBARzB,CAFL;AAYJ;AACI,2BAAO,KAAP;AAtCR;AAwCH;;;iEAEwC,Q,EAAU;AAC/C,gBAAI,CAAC,OAAO,SAAP,CAAiB,cAAtB,EAAsC;AAClC,uBAAO,EAAE,MAAM,KAAR,EAAe,QAAQ,EAAvB,EAAP;AACH;;AAED,gBAAI,aAAa,gBAAjB,EAAmC;AAC/B,uBAAO,EAAE,MAAM,IAAR,EAAc,QAAQ,OAAO,IAAP,cAAuB,QAAvB,CAAtB,EAAP;AACH;;AAED,mBAAO,EAAE,MAAM,KAAR,EAAe,QAAQ,EAAvB,EAAP;AACH;;;4BA93B6B;AAC1B,gBAAM,QAAQ,CAAC,EACX,OAAO,SAAP,CAAiB,SAAjB,CAA2B,KAA3B,CAAiC,KAAjC,KAA2C,CAAC,OAAO,GADxC,CAAf;AAGA,mBACI,KAAK,IAAL,CAAU,WAAV,IACA,KAAK,cAAL,CAAoB,SAApB,CAA8B,sBAA9B,CADA,IAEA,KAFA,IAGA,CAAC,OAAO,GAHR,KAIC,CAAC,KAAK,cAAL,CAAoB,SAApB,CACE,qCADF,CAAD,IAGG,CAAC,OAAO,SAAP,CAAiB,gBAPtB,KAQA,EACI,KAAK,cAAL,CAAoB,SAApB,CAA8B,6BAA9B,KACA,OAAO,SAAP,CAAiB,SAAjB,CAA2B,KAA3B,CACI,mCADJ,CAFJ,CATJ;AAgBH;;;4BAEsB;AACnB,gBAAM,QAAQ,CAAC,EACX,OAAO,SAAP,CAAiB,SAAjB,CAA2B,KAA3B,CAAiC,KAAjC,KAA2C,CAAC,OAAO,GADxC,CAAf;AAGA,gBAAM,SACF,KAAK,cAAL,CAAoB,SAApB,CAA8B,6BAA9B,KACA,OAAO,SAAP,CAAiB,SAAjB,CAA2B,KAA3B,CACI,mCADJ,CAFJ;AAKA,mBACI,KAAK,IAAL,CAAU,WAAV,IACA,KAAK,cAAL,CAAoB,SAApB,CAA8B,sBAA9B,CADA,IAEA,KAFA,IAGA,CAAC,OAAO,GAHR,IAIA,CAAC,MALL;AAOH;;;;EAjL8C,SAAS,I;;qBAAvC,qB;;;;;;;;;;;ACdrB;;;;;;;;IAEqB,4B;;;AAoBjB,0CAAY,kBAAZ,EAAgC,oBAAhC,EAAsD;AAAA;;AAAA;;AAAA;;AAGlD,cAAK,OAAL,CAAa,kBAAb,EAAiC,oBAAjC;;AAEA,YAAI,QAAQ,EAAZ;AACA,YAAI,qBAAqB,CAAzB,EAA4B;AACxB,oBAAQ,KAAK,gBAAL,CAAR;AACH,SAFD,MAEO;AACH,oBAAQ,KAAK,sCAAL,CAAR;AACH;;AAED,YAAI,gBAAgB;AAChB,sBAAU,KADM;AAEhB,mBAAO,KAFS;AAGhB,qBAAS,CAAC,OAAD,CAHO;AAIhB,qBAAS,MAAK;AAJE,SAApB;;AAOA,cAAK,KAAL,GAAa,IAAI,YAAJ,CAAU,aAAV,CAAb;AACA,cAAK,KAAL,CAAW,IAAX;AApBkD;AAqBrD;;;;gCAEO,kB,EAAoB,oB,EAAsB;AAC9C,gBAAI,qBAAqB,CAAzB,EAA4B;AACxB,qBAAK,GAAL,CAAS,MAAT,CAAgB,KAAK,sBAAL,CAA4B,kBAA5B,CAAhB;AACH,aAFD,MAEO,IAAI,CAAC,CAAC,oBAAN,EAA4B;AAC/B,qBAAK,GAAL,CAAS,MAAT,CAAgB,KAAK,wBAAL,CAA8B,kBAA9B,CAAhB;AACH,aAFM,MAEA;AACH,qBAAK,GAAL,CAAS,MAAT,CAAgB,KAAK,qBAAL,EAAhB;AACH;AACJ;;;;EAnDqD,SAAS,I;;;SAC/D,sB,GAAyB,UAAC,kBAAD;AAAA,uDACiB,KAClC,sCADkC,EAElC,EAAE,OAAO,kBAAT,EAFkC,CADjB;AAAA,K;;SAMzB,wB,GAA2B;AAAA,iCAClB,KAAK,oCAAL,CADkB,yBAElB,OAAO,IAAP,CAAY,2BAAZ,EAAyC;AAC1C,+HAAiH,OAAO,IAAP,CAC7G,4BAD6G,CAAjH;AAD0C,SAAzC,CAFkB;AAAA,K;;SAS3B,qB,GAAwB;AAAA,iCACf,KAAK,0BAAL,CADe;AAAA,K;;;qBAhBP,4B;;;;;;;;;;ACFrB;;AAEA,IAAM,yBAAyB,SAAzB,sBAAyB,CAAC,MAAD,EAAY;AACvC,QAAM,cAAc,OAAO,OAAP,CAAe,GAAf,CAApB;AACA,WAAO,cAAc,CAAd,GAAkB,OAAO,MAAP,CAAc,CAAd,EAAiB,WAAjB,CAAlB,GAAkD,MAAzD;AACH,CAHD;;AAKA,IAAM,uBAAuB,SAAvB,oBAAuB,CAAC,MAAD,EAAS,UAAT;AAAA,WACzB,WAAW,MAAX,KACA,WAAW,uBAAuB,MAAvB,CAAX,CADA,IAEA,WAAW,IAAX,CAHyB;AAAA,CAA7B;;AAKA,IAAM,sBAAsB,SAAtB,mBAAsB,CAAC,WAAD;AAAA,WAAiB,UAAC,MAAD,EAAY;AACrD,YAAM,MAAM,8BAAY,YAAY,MAAZ,CAAZ,CAAZ;AACA,eAAO,IAAI,QAAJ,CAAa,WAAb,IAA4B,SAA5B,GAAwC,GAA/C;AACH,KAH2B;AAAA,CAA5B;;AAKA,IAAM,qBAAqB,SAArB,kBAAqB,CAAC,MAAD,EAAS,WAAT;AAAA,WACvB,qBAAqB,MAArB,EAA6B,oBAAoB,WAApB,CAA7B,CADuB;AAAA,CAA3B;;AAGA,IAAM,WAAW,SAAX,QAAW;AAAA,QAAG,GAAH,QAAG,GAAH;AAAA,QAAQ,IAAR,QAAQ,IAAR;AAAA,QAAc,EAAd,QAAc,EAAd;AAAA,QAAkB,GAAlB,QAAkB,GAAlB;AAAA,6DAEN,IAFM,mEAKD,GALC,6DAOP,cAAY,EAAZ,SAAoB,EAPb,wBAQF,GARE;AAAA,CAAjB;;AAYO,IAAM,kDAAqB,SAArB,kBAAqB,QAK5B;AAAA,QAJF,YAIE,SAJF,YAIE;AAAA,QAHF,IAGE,SAHF,IAGE;AAAA,QAFF,EAEE,SAFF,EAEE;AAAA,QADF,gBACE,SADF,gBACE;;AACF,QAAM,MAAM,eACN,mBACI,gBADJ,EAEI,UAAC,MAAD;AAAA,+CAA0C,MAA1C;AAAA,KAFJ,CADM,GAKN,mBACI,gBADJ,EAEI,UAAC,MAAD;AAAA,+CAA0C,MAA1C;AAAA,KAFJ,CALN;AASA,WAAO,SAAS;AACZ,aAAK,KAAK,2BAAL,CADO;AAEZ,kBAFY;AAGZ,cAHY;AAIZ;AAJY,KAAT,CAAP;AAMH,CArBM;;AAuBA,IAAM,sDAAuB,SAAvB,oBAAuB,QAK9B;AAAA,QAJF,YAIE,SAJF,YAIE;AAAA,QAHF,IAGE,SAHF,IAGE;AAAA,QAFF,EAEE,SAFF,EAEE;AAAA,QADF,gBACE,SADF,gBACE;;AACF,QAAM,MAAM,eACN,mBACI,gBADJ,EAEI,UAAC,MAAD;AAAA,iDAA4C,MAA5C;AAAA,KAFJ,CADM,GAKN,mBACI,gBADJ,EAEI,UAAC,MAAD;AAAA,iDAA4C,MAA5C;AAAA,KAFJ,CALN;AASA,WAAO,SAAS;AACZ,aAAK,KAAK,6BAAL,CADO;AAEZ,kBAFY;AAGZ,cAHY;AAIZ;AAJY,KAAT,CAAP;AAMH,CArBM;;;;;;;;;;;ACvDP;;;;;;;;;;;;IACqB,U;;;AACjB,wBAAY,OAAZ,EAAqB;AAAA;;AAAA,4HACX,OADW;;AAEjB,cAAK,WAAL,GAAmB,KAAnB;AAFiB;AAGpB;;;;+BAEM,M,EAAQ;AACX,iBAAK,WAAL;AACA,iBAAK,eAAL;AACH;;;mCAEU;AACP,iBAAK,gBAAL;AACH;;AAGD;;;;;;sCAGc;AACV,gBAAI,EAAE,MAAF,KAAa,EAAE,MAAF,EAAU,SAAvB,IAAoC,KAAK,UAAL,GAAkB,OAAlB,CAA0B,CAA1B,CAApC,IAAoE,KAAK,UAAL,GAAkB,gBAAlB,EAApE,IACA,KAAK,UAAL,GAAkB,OAAlB,CAA0B,CAA1B,EAA6B,MADjC,EACyC;AACrC,kBAAE,MAAF,EAAU,SAAV,CAAoB,KAAK,UAAL,GAAkB,OAAlB,CAA0B,CAA1B,EAA6B,MAAjD;AACH;AACJ;;AAED;;;;;;oDAG4B;AACxB,gBAAI,iBAAiB,EAAE,qBAAF,CAArB;AACA,gBAAI,gBAAgB,EAAE,oBAAF,CAApB,CAFwB,CAEqB;;AAE7C,gBAAI,CAAC,cAAc,MAAd,IAAwB,eAAe,MAAxC,KAAmD,CAAC,eAAe,EAAf,CAAkB,UAAlB,CAApD,IAAqF,CAAC,KAAK,WAA/F,EAA4G;AACxG,qBAAK,WAAL;AACH,aAFD,MAEO;AACH,6BAAa,KAAK,SAAlB;AACA,qBAAK,WAAL;AACH;AACJ;;AAED;;;;;;;;sCAKc;AACV,mBAAO,CAAC,CAAC,qBAAF,GACH,sBAAsB,KAAK,yBAAL,CAA+B,IAA/B,CAAoC,IAApC,CAAtB,CADG,GAEH,WAAW,KAAK,yBAAL,CAA+B,IAA/B,CAAoC,IAApC,CAAX,EAAsD,EAAtD,CAFJ;AAGH;;AAED;;;;;;;0CAIkB;AAAA;;AACd,iBAAK,SAAL,GAAiB,WAAW,YAAM;AAC9B,uBAAK,WAAL,GAAmB,IAAnB;AACH,aAFgB,EAEd,KAFc,CAAjB;AAGH;;;2CAEkB;AACf,gBAAI,EAAE,MAAF,KAAa,EAAE,MAAF,EAAU,SAA3B,EAAsC;AAClC,qBAAK,UAAL,GAAkB,eAAlB,CAAkC,QAAlC,EAA4C,EAAE,MAAF,EAAU,SAAV,EAA5C;AACH;AACJ;;;;EAlEmC,iC;;qBAAnB,U;;;;;;;;;;;ACDrB;;;;;;;;;;;;AACA;;;;IAIqB,kB;;;AACjB,gCAAY,OAAZ,EAAqB;AAAA;;AAAA,4IACX,OADW;;AAEjB,cAAK,cAAL;AAFiB;AAGpB;;;;+BAEM,M,EAAQ;AACX,gBAAI,OAAO,SAAP,CAAiB,WAArB,EAAkC;AAC9B,qBAAK,UAAL,GAAkB,eAAlB,CAAkC,SAAlC,EAA6C,OAAO,SAAP,CAAiB,WAAjB,CAA6B,OAA1E;AACH,aAFD,MAGK;AACD,qBAAK,UAAL,GAAkB,eAAlB,CAAkC,SAAlC,EAA6C,cAA7C;AACH;AACJ;;AAGD;;;;;;;yCAIiB;AACb,mBAAO,gBAAP,GAA0B,CAAC,CAAC,QAAQ,GAAR,CAAY,gBAAZ,CAA5B;AACA,gBAAI,CAAC,OAAO,SAAP,CAAiB,WAAlB,IAAiC,OAAO,gBAA5C,EAA8D;AAC1D,wBAAQ,MAAR,CAAe,gBAAf,EAAiC,EAAC,MAAM,GAAP,EAAY,QAAQ,SAAS,QAA7B,EAAjC;AACA,uBAAO,gBAAP,GAA0B,KAA1B;AACH;AACJ;;;;EA1B2C,iC;;qBAA3B,kB;;;;;;;;;;;;;;;;;ICLA,Q;;;;;uCAC6B;AAAA,gBAApC,SAAoC,QAApC,SAAoC;AAAA,gBAAzB,IAAyB,QAAzB,IAAyB;AAAA,gBAAnB,KAAmB,QAAnB,KAAmB;AAAA,gBAAZ,SAAY,QAAZ,SAAY;;AAC1C,yHAEuC,IAFvC,mBAEuD,SAFvD,wBAEiF,SAFjF,yKAKuC,KALvC;AAQH;;;4BAEY;AAAA;;AACT,mBAAO;AACH,0CAA0B,4BAAC,CAAD,EAAO;AAC7B,2BAAK,OAAL,CAAa,QAAb,EAAuB,EAAE,aAAF,CAAgB,OAAvC;AACH;AAHE,aAAP;AAKH;;;AAED,6BAAkD;AAAA,YAApC,SAAoC,SAApC,SAAoC;AAAA,YAAzB,IAAyB,SAAzB,IAAyB;AAAA,YAAnB,KAAmB,SAAnB,KAAmB;AAAA,YAAZ,SAAY,SAAZ,SAAY;;AAAA;;AAAA,yHACrC,SADqC;;AAG9C,UAAE,MAAF,QAAe,UAAU,CAAV,CAAf;AAH8C;AAIjD;;;;iCAEQ;AACL,iBAAK,GAAL,CAAS,KAAT,GAAiB,MAAjB,CAAwB,KAAK,QAAL,CAAc,IAAd,CAAxB;;AAEA,iBAAK,SAAL,GAAiB,KAAK,GAAL,CAAS,IAAT,CAAc,uBAAd,CAAjB;;AAEA,mBAAO,IAAP;AACH;;;4BAEG,O,EAAS;AACT,iBAAK,SAAL,CAAe,IAAf,CAAoB,SAApB,EAA+B,OAA/B,EAAwC,MAAxC;AACH;;;;EApCiC,SAAS,I;;qBAA1B,Q;;;;;;;;;;;ACArB;;;;;;;;IAEqB,W;;;;;;;gCAEF;AACX,gBAAI,aAAa,yBAAY,KAAZ,CAAkB,SAAS,IAAT,CAAc,MAAd,CAAqB,CAArB,CAAlB,CAAjB;;AAEA,cAAE,IAAF,CAAO,UAAP,EAAmB,OAAnB,CAA2B,UAAC,GAAD,EAAS;AAChC,2BAAW,GAAX,IAAkB,EAAE,OAAF,CAAU,CAAC,WAAW,GAAX,KAAmB,EAApB,CAAV,CAAlB;AACH,aAFD;;AAIA,mBAAO,UAAP;AACH;;;+BAEa,M,EAAQ;AAClB,gBAAI,UAAU,yBAAY,SAAZ,CAAsB,MAAtB,CAAd;AACA,gBAAI,YAAY,GAAhB,EAAoB;AAChB,yBAAS,IAAT,GAAgB,OAAhB;AACH;AACJ;;;4BAEU,G,EAAK;AACZ,gBAAI,WAAW,KAAK,KAAL,EAAf;;AAEA,gBAAI,EAAE,QAAF,CAAW,GAAX,CAAJ,EAAqB;AACjB,uBAAO,SAAS,GAAT,CAAP;AACH;;AAED,mBAAO,QAAP;AACH;;;4BAEU,G,EAAK,K,EAAO;AACnB,gBAAI,OAAO,KAAK,KAAL,EAAX;;AAEA,iBAAK,GAAL,IAAY,EAAE,OAAF,CAAU,CAAC,KAAD,CAAV,CAAZ;;AAEA,iBAAK,MAAL,CAAY,IAAZ;AACH;;;6BAEW,G,EAAK,K,EAAO;AACpB,gBAAI,OAAO,KAAK,KAAL,EAAX;;AAEA,iBAAK,GAAL,IAAY,KAAK,GAAL,KAAa,EAAzB;AACA,iBAAK,GAAL,EAAU,IAAV,CAAe,KAAf;;AAEA,iBAAK,MAAL,CAAY,IAAZ;AACH;;;+BAEa,G,EAAK;AACf,gBAAI,OAAO,KAAK,KAAL,EAAX;;AAEA,iBAAK,GAAL,KAAa,OAAO,KAAK,GAAL,CAApB;;AAEA,iBAAK,MAAL,CAAY,IAAZ;AACH;;;;;;qBApDgB,W;;;;;;;;;;;;;;;;;ICFA,W;;;;;uCACkD;AAAA,gBAAzD,KAAyD,QAAzD,KAAyD;AAAA,gBAAlD,OAAkD,QAAlD,OAAkD;AAAA,gBAAzC,SAAyC,QAAzC,SAAyC;AAAA,gBAA9B,IAA8B,QAA9B,IAA8B;AAAA,gBAAxB,KAAwB,QAAxB,KAAwB;AAAA,gBAAjB,SAAiB,QAAjB,SAAiB;AAAA,gBAAN,GAAM,QAAN,GAAM;;AAC/D,8KAGyC,KAHzC,kBAGyD,IAHzD,SAGiE,GAHjE,mBAGgF,SAHhF,wBAG0G,SAH1G,YAGwH,UAAU,SAAV,GAAsB,EAH9I,iQAQc,KARd;AAWH;;;4BAEY;AAAA;;AACT,mBAAO;AACH,uCAAuB,yBAAC,CAAD,EAAO;AAC1B,2BAAK,OAAL,CAAa,QAAb,EAAuB,EAAE,aAAF,CAAgB,OAAvC;AACH;AAHE,aAAP;AAKH;;;AAED,gCAAuD;AAAA,YAAzC,SAAyC,SAAzC,SAAyC;AAAA,YAA9B,IAA8B,SAA9B,IAA8B;AAAA,YAAxB,KAAwB,SAAxB,KAAwB;AAAA,YAAjB,SAAiB,SAAjB,SAAiB;AAAA,YAAN,GAAM,SAAN,GAAM;;AAAA;;AAAA,+HAC1C,SAD0C;;AAGnD,UAAE,MAAF,QAAe,UAAU,CAAV,CAAf;AAHmD;AAItD;;;;iCAEQ;AACL,iBAAK,GAAL,CAAS,KAAT,GAAiB,MAAjB,CAAwB,KAAK,QAAL,CAAc,IAAd,CAAxB;;AAEA,iBAAK,MAAL,GAAc,KAAK,GAAL,CAAS,IAAT,CAAc,oBAAd,CAAd;;AAEA,mBAAO,IAAP;AACH;;;4BAEG,O,EAAS;AACT,iBAAK,MAAL,CAAY,IAAZ,CAAiB,SAAjB,EAA4B,OAA5B,EAAqC,MAArC;AACH;;;;EAvCoC,SAAS,I;;qBAA7B,W;;;;;;;;;;;ACArB;;;;;;;;IAEM,a;;;AACF,2BAAY,OAAZ,EAAqB;AAAA;;AAAA,kIACX,OADW;;AAGjB,cAAK,GAAL,CAAS,MAAT,CAAgB,EAAE,MAAK,cAAP,CAAhB;;AAEA,cAAK,aAAL,GAAsB,MAAK,GAAL,CAAS,IAAT,CAAc,gBAAd,CAAtB;AACA,cAAK,aAAL,GAAsB,MAAK,GAAL,CAAS,IAAT,CAAc,gBAAd,CAAtB;;AAEA,cAAK,UAAL;;AAEA,cAAK,OAAL;AAViB;AAWpB;;AAED;AACA;;;;;qCACa;AAAA;;AACT,iBAAK,aAAL,CAAmB,EAAnB,CAAsB,OAAtB,EAA+B,YAAM;AACjC,uBAAK,OAAL,CAAa,QAAb,EAAuB,MAAvB;AACA,uBAAK,OAAL,CAAa,OAAb;AACH,aAHD;;AAKA,iBAAK,aAAL,CAAmB,EAAnB,CAAsB,OAAtB,EAA+B,UAAC,CAAD,EAAO;AAClC,uBAAK,OAAL,CAAa,QAAb,EAAuB,MAAvB;AACA,uBAAK,OAAL,CAAa,OAAb;AACH,aAHD,EAGG,EAHH,CAGM,SAHN,EAGiB,UAAC,CAAD;AAAA,uBAAO,EAAE,eAAT;AAAA,aAHjB;AAIH;;;4BAEoB;AACjB,mBAAO,mDAC4B,KAAK,WAAL,IAAoB,OADhD,iHAEuF,KAAK,UAF5F,0HAG0F,KAAK,UAH/F,6CAAP;AAMH;;;;EAnCuB,Y;;qBAsCb,a;;;;;;;;;;;;ACxCf,IAAA,SAAA,GAAA,OAAA,CAAA,qBAAA,CAAA,CAAA;;;;AACA,IAAA,MAAA,GAAA,OAAA,CAAA,wBAAA,CAAA,CAAA;;;;;;;;;;;;IAEM;;;;;;;;;;;;;;wLAsEF,gBAAgB,UAAC,CAAD,EAAA;YAAA,OAAO,CAAC,CAAA,CAAE,IAAF,KAAW,OAAX,IAAsB,CAAA,CAAE,KAAF,KAAY,EAAlC,IAAwC,CAAA,CAAE,KAAF,KAAY,EAArD,MAA6D,CAAA,CAAE,cAAF,EAAA,IAAsB,IAAnF,CAAP,CAAA;;;;;;mCA1CL,SAAS;YAChB,CAAA,CAAE,MAAF,CAAS,IAAT,EAAe,IAAA,CAAK,QAApB,EAA8B,OAA9B,CAAA,CAAA;;YAEA,IAAA,CAAK,GAAL,GAAW,OAAA,CAAA,SAAA,CAAX,CAAA;YACA,IAAA,CAAK,UAAL,CAAgB,IAAA,CAAK,GAAL,CAAS,IAAT,CAAhB,CAAA,CAAA;;YAEA,IAAI,IAAA,CAAK,EAAL,CAAQ,MAAZ,EAAoB;gBAChB,IAAA,CAAK,GAAL,CAAS,IAAT,CAAc,IAAd,EAAoB,IAAA,CAAK,EAAzB,CAAA,CAAA;aACH;;YAED,IAAA,CAAK,QAAL,GAAgB,IAAA,CAAK,GAAL,CAAS,IAAT,CAAc,kBAAd,CAAhB,CAAA;;YAEA,IAAA,CAAK,QAAL,CAAc,KAAd,EAAA,CAAsB,MAAtB,CAA6B,IAAA,CAAK,OAAlC,CAAA,CAAA;;YAEA,IAAA,CAAK,GAAL,CAAS,QAAT,CAAkB,IAAA,CAAK,OAAL,CAAa,IAAb,CAAkB,GAAlB,CAAlB,CAAA,CAAA;;YAEA,IAAA,CAAK,MAAL,GAAc,IAAA,CAAK,GAAL,CAAS,IAAT,CAAc,cAAd,CAAd,CAAA;;YAEA,IAAI,IAAA,CAAK,WAAT,EAAsB;gBAClB,IAAA,CAAK,MAAL,CAAY,GAAZ,CAAgB,SAAhB,EAA2B,GAA3B,CAAA,CAAA;aACH;;YAED,IAAI,IAAA,CAAK,UAAT,EAAqB;gBACjB,IAAA,CAAK,OAAL,EAAA,CAAA;aACH;;YAED,IAAA,CAAK,WAAL,EAAA,CAAA;SACH;;;kCAES;YACN,IAAI,IAAA,CAAK,gBAAT,EAA2B;;gBAEvB,CAAA,CAAE,MAAF,CAAA,CAAU,MAAV,CAAiB,IAAA,CAAK,EAAtB,CAAA,CAAA;aACH;;YAED,IAAI,IAAA,CAAK,QAAT,EAAmB;gBACf,IAAA,CAAK,IAAL,EAAA,CAAA;aACH;;YAED,OAAO,IAAP,CAAA;SACH;;;;;;;sCAMa;YAAA,IAAA,MAAA,GAAA,IAAA,CAAA;;YACV,IAAA,CAAK,GAAL,CAAS,EAAT,CAAY,eAAZ,EAA6B,WAA7B,EAA0C,UAAC,CAAD,EAAO;gBAC7C,MAAA,CAAK,aAAL,CAAmB,CAAnB,CAAA,IAAyB,MAAA,CAAK,OAAL,CAAa,QAAb,EAAuB,MAAvB,CAAzB,CAAA;aADJ,CAAA,CAAA;;YAIA,IAAI,IAAA,CAAK,sBAAT,EAAiC;gBAC7B,IAAA,CAAK,EAAL,CAAQ,cAAR,EAAwB,YAAM;oBAAE,MAAA,CAAK,KAAL,EAAA,CAAA;iBAAhC,CAAA,CAAA;aACH;;YAED,IAAA,CAAK,GAAL,CAAS,EAAT,CAAY,UAAZ,EAAwB,GAAxB,EAA6B,UAAC,CAAD,EAAO;gBAChC,IAAI,CAAA,CAAE,KAAF,KAAY,UAAA,CAAA,SAAA,CAAA,CAAK,GAArB,EAA0B;oBACtB,MAAA,CAAK,UAAL,CAAgB,CAAhB,CAAA,CAAA;iBACH;aAHL,CAAA,CAAA;;YAMA,IAAG,MAAA,CAAO,cAAP,CAAsB,SAAtB,CAAgC,wBAAhC,CAAH,EAA8D;;gBAE1D,IAAA,CAAK,GAAL,CAAS,EAAT,CAAY,qBAAZ,EAAmC,QAAnC,EAA6C,UAAS,CAAT,EAAY;oBACrD,IAAI,gBAAA,GAAmB,CAAA,CAAE,IAAF,KAAW,OAAX,IAAsB,CAAA,CAAE,KAAF,KAAY,UAAA,CAAA,SAAA,CAAA,CAAK,KAAvC,IAAgD,CAAA,CAAE,KAAF,KAAY,UAAA,CAAA,SAAA,CAAA,CAAK,GAAxF,CAAA;oBACA,IAAG,CAAC,gBAAJ,EAAsB,OAAA;;oBAEtB,IAAI,UAAA,GAAa,CAAA,CAAE,IAAF,CAAA,CAAQ,IAAR,CAAa,WAAb,CAAjB,CAAA;;oBAEA,IAAG,UAAA,KAAe,MAAlB,EAA0B;wBACtB,CAAA,CAAE,IAAF,CAAA,CAAQ,IAAR,CAAa,WAAb,EAA0B,OAA1B,CAAA,CAAA;wBACA,CAAA,CAAE,eAAF,EAAA,CAAA;qBACH;;oBAED,IAAG,CAAC,UAAA,KAAe,OAAf,IAA0B,UAAA,IAAc,IAAzC,KAAkD,CAAA,CAAE,KAAF,KAAY,UAAA,CAAA,SAAA,CAAA,CAAK,GAAtE,EAA2E;wBACvE,CAAA,CAAE,IAAF,CAAA,CAAQ,IAAR,CAAa,WAAb,EAA0B,MAA1B,CAAA,CAAA;qBACH;iBAbL,CAAA,CAAA;;gBAgBA,IAAA,CAAK,GAAL,CAAS,EAAT,CAAY,MAAZ,EAAoB,QAApB,EAA8B,YAAW;oBACrC,CAAA,CAAE,IAAF,CAAA,CAAQ,IAAR,CAAa,WAAb,EAA0B,OAA1B,CAAA,CAAA;iBADJ,CAAA,CAAA;;;gBAKA,IAAA,CAAK,GAAL,CAAS,EAAT,CAAY,OAAZ,EAAqB,UAAC,CAAD,EAAO;oBACxB,IAAI,eAAA,GAAkB,CAAC,CAAA,CAAE,QAAF,CAAA,CAAY,EAAZ,CAAe,QAAf,CAAD,IAA6B,CAAA,CAAE,QAAF,CAAA,CAAY,IAAZ,CAAiB,WAAjB,CAAA,KAAkC,MAArF,CAAA;oBACA,IAAI,CAAA,CAAE,KAAF,KAAY,UAAA,CAAA,SAAA,CAAA,CAAK,GAAjB,IAAwB,eAAxB,IAA2C,CAAA,CAAE,kBAAF,CAAA,CAAsB,MAAtB,KAAiC,CAAhF,EAAmF;wBAC/E,MAAA,CAAK,OAAL,CAAa,QAAb,EAAuB,MAAvB,CAAA,CAAA;qBACH;iBAJL,CAAA,CAAA;aAMH;SACJ;;;+BAEM;YAAA,IAAA,MAAA,GAAA,IAAA,CAAA;;YACH,IAAA,CAAK,WAAL,EAAA,CAAA;YACA,IAAA,CAAK,GAAL,CAAS,UAAT,CAAoB,QAApB,EAA8B,MAA9B,CAAA,CAAA;YACA,IAAA,CAAK,OAAL,CAAa,MAAb,EAAqB,IAArB,CAAA,CAAA;;YAEA,IAAA,CAAK,GAAL,CAAS,EAAT,CAAY,SAAZ,EAAuB,UAAC,CAAD,EAAO;gBAC1B,MAAA,CAAK,UAAL,CAAgB,CAAhB,CAAA,CAAA;aADJ,CAAA,CAAA;;;YAKA,IAAA,CAAK,GAAL,CAAS,EAAT,CAAY,qBAAZ,EAAmC,YAAA;gBAAA,OAAM,MAAA,CAAK,UAAL,EAAN,CAAA;aAAnC,CAAA,CAAA;;;YAGA,IAAA,CAAK,GAAL,CAAS,GAAT,CAAa,QAAb,CAAA,CAAA;;;YAGA,IAAA,CAAK,GAAL,CAAS,EAAT,CAAY,oBAAZ,EAAkC,YAAM;gBACpC,MAAA,CAAK,GAAL,CAAS,GAAT,CAAa,oBAAb,CAAA,CAAA;gBACA,MAAA,CAAK,OAAL,CAAa,OAAb,CAAA,CAAA;aAFJ,CAAA,CAAA;SAIH;;;sCAEa;YACV,IAAA,CAAK,OAAL,GAAe,CAAA,CAAE,QAAA,CAAS,aAAX,CAAf,CAAA;SACH;;;qCAEY;YACT,IAAA,CAAK,GAAL,CAAS,IAAT,CAAc,aAAd,EAA6B,KAA7B,CAAA,CAAA;YACA,CAAA,CAAE,YAAF,CAAA,CAAgB,IAAhB,CAAqB,aAArB,EAAoC,MAApC,CAAA,CAAA;YACA,CAAA,CAAE,aAAF,CAAA,CAAiB,IAAjB,CAAsB,aAAtB,EAAqC,MAArC,CAAA,CAAA;YACA,CAAA,CAAE,gBAAF,CAAA,CAAoB,IAApB,CAAyB,aAAzB,EAAwC,MAAxC,CAAA,CAAA;;YAEA,IAAA,CAAK,MAAL,CAAY,KAAZ,EAAA,CAAA;YACA,IAAA,CAAK,UAAL,EAAA,CAAA;SACH;;;qCAEY;YACT,IAAI,MAAA,GAAS,MAAA,CAAO,WAAP,GAAqB,QAAA,CAAS,IAAA,CAAK,GAAL,CAAS,GAAT,CAAa,KAAb,CAAA,CAAoB,KAApB,CAA0B,CAA1B,EAA6B,CAAC,CAA9B,CAAT,EAA2C,EAA3C,CAAlC,CADS;YAET,IAAI,MAAA,CAAO,WAAP,GAAqB,IAAA,CAAK,EAAL,CAAQ,YAAR,GAAuB,MAAhD,EAAwD;;gBACpD,MAAA,GAAS,IAAA,CAAK,GAAL,CAAS,IAAA,CAAK,EAAL,CAAQ,YAAR,GAAuB,MAAA,CAAO,WAA9B,GAA4C,EAArD,EAAyD,CAAC,CAA1D,CAAT,CAAA;aADJ,MAGK,IAAI,MAAA,CAAO,UAAP,GAAoB,GAAxB,EAA6B;;gBAC9B,MAAA,IAAU,CAAV,CAAA;aACH;YACD,IAAA,CAAK,EAAL,CAAQ,cAAR,EAAA,CARS;YAST,MAAA,CAAO,QAAP,CAAgB,CAAhB,EAAmB,MAAnB,CAAA,CATS;SAUZ;;;mCAEU,GAAG;YACV,IAAM,UAAA,GAAa,CAAA,CAAE,QAAA,CAAS,aAAX,CAAnB,CAAA;YACA,IAAM,cAAA,GAAiB,IAAA,CAAK,MAAL,IAAe,IAAA,CAAK,GAAL,CAAS,IAAT,CAAc,oBAAd,CAAA,CAAoC,KAApC,EAAtC,CAAA;YACA,IAAM,aAAA,GAAgB,IAAA,CAAK,GAAL,CAAS,IAAT,CAAc,oBAAd,CAAA,CAAoC,IAApC,EAAtB,CAAA;;YAEA,IAAI,UAAA,CAAW,EAAX,CAAc,cAAd,CAAA,IAAiC,CAAA,CAAE,KAAF,KAAY,UAAA,CAAA,SAAA,CAAA,CAAK,GAAlD,IAAyD,CAAA,CAAE,QAA/D,EAAyE;gBACrE,CAAA,CAAE,cAAF,EAAA,CAAA;gBACA,aAAA,CAAc,KAAd,EAAA,CAAA;aAFJ,MAGO,IAAI,CAAA,CAAE,UAAF,CAAA,CAAc,EAAd,CAAiB,aAAjB,CAAA,IAAmC,CAAA,CAAE,KAAF,KAAY,UAAA,CAAA,SAAA,CAAA,CAAK,GAApD,IAA2D,CAAC,CAAA,CAAE,QAAlE,EAA4E;gBAC/E,CAAA,CAAE,cAAF,EAAA,CAAA;gBACA,cAAA,CAAe,KAAf,EAAA,CAAA;aACH;SACJ;;;+BAEM;YACH,IAAA,CAAK,GAAL,CAAS,UAAT,CAAoB,QAApB,EAA8B,OAA9B,CAAA,CAAA;YACA,IAAA,CAAK,OAAL,CAAa,MAAb,EAAqB,IAArB,CAAA,CAAA;YACA,CAAA,CAAE,YAAF,CAAA,CAAgB,IAAhB,CAAqB,aAArB,EAAoC,OAApC,CAAA,CAAA;YACA,CAAA,CAAE,aAAF,CAAA,CAAiB,IAAjB,CAAsB,aAAtB,EAAqC,OAArC,CAAA,CAAA;YACA,CAAA,CAAE,gBAAF,CAAA,CAAoB,IAApB,CAAyB,aAAzB,EAAwC,OAAxC,CAAA,CAAA;YACA,IAAA,CAAK,OAAL,CAAa,KAAb,EAAA,CAAA;SACH;;;gCAEO;YACJ,IAAA,CAAK,IAAL,EAAA,CAAA;YACA,IAAA,CAAK,MAAL,EAAA,CAAA;SACH;;;4BAjMc;;;;YAIX,IAAI,eAAA,GAAkB,MAAA,CAAO,cAAP,CAAsB,SAAtB,CAAgC,wBAAhC,CAAA,GAA4D,KAA5D,GAAoE,IAA1F,CAAA;;YAEA,OAAO;gBACH,QAAA,EAA0B,IADvB;gBAEH,UAAA,EAA0B,IAFvB;gBAGH,UAAA,EAA0B,eAHvB;gBAIH,WAAA,EAA0B,IAJvB;;gBAMH,EAAA,EAA0B,EANvB;gBAOH,OAAA,EAA0B,CAAC,OAAD,CAPvB;gBAQH,WAAA,EAA0B,OARvB;gBASH,KAAA,EAA0B,OATvB;gBAUH,WAAA,EAA0B,KAVvB;gBAWH,OAAA,EAA0B,cAXvB;gBAYH,UAAA,EAA0B,IAAA,CAAK,IAAL,CAZvB;gBAaH,UAAA,EAA0B,IAAA,CAAK,QAAL,CAbvB;gBAcH,gBAAA,EAA0B,IAdvB;gBAeH,sBAAA,EAA0B,IAfvB;gBAgBH,eAAA,EAA0B,IAAA;aAhB9B,CAAA;SAkBH;;;;EA1Be,QAAA,CAAS;;QAsMpB,QAAA;;;;;;;;;;qBCzMM;AAAA,QAAE,KAAF,QAAE,KAAF;AAAA,QAAS,UAAT,QAAS,UAAT;AAAA,QAAqB,WAArB,QAAqB,WAArB;AAAA,QAAkC,eAAlC,QAAkC,eAAlC;AAAA,kHAA6J,UAA7J,mCAAuM,WAAvM,wGAE+C,KAF/C,wBAGL,wFAAuF,OAAO,IAAP,CAAY,OAAZ,CAAvF,iCAA0I,EAHrI;AAAA,C;;;;;;;;;qBCmBA,YAAY;AACvB,QAAM,wBAAwB,2BAA9B;;AAEA,2BACO,KAAK,4BAAL,CADP,2HAIkC,KAC1B,oCAD0B,CAJlC,kEAOiD,KACzC,iCADyC,CAPjD,qJAaiC,KACzB,oCADyB,CAbjC,0JAmBiC,KACzB,kCADyB,CAnBjC,kGAyBM,KAAK,6BAAL,EAAoC;AAClC,qIAA2H,qBAA3H,UAAqJ,KACjJ,mBADiJ,CAArJ,SADkC;AAIlC,uIAA6H,qBAA7H,UAAuJ,KACnJ,qBADmJ,CAAvJ;AAJkC,KAApC,CAzBN,iGAoCqE,KACjE,4BADiE,CApCrE;AAyCH,C;;cA/DgB,M;IAAT,I,WAAA,I;;;AAER,IAAM,4BAA4B,SAA5B,yBAA4B,GAAM;AAAA,4BACD,OAAO,SADN;AAAA,QAC5B,YAD4B,qBAC5B,YAD4B;AAAA,QACd,QADc,qBACd,QADc;;AAEpC,QAAM,wBAAwB,EAA9B;AACA,QAAI,YAAJ,EAAkB;AACd,8BAAsB,IAAtB,CAA2B,iBAA3B;AACH;AACD,QAAI,QAAJ,EAAc;AACV,8BAAsB,IAAtB,CAA2B,YAA3B;AACH;;AAED,QAAI,sBAAsB,MAAtB,KAAiC,CAArC,EAAwC;AACpC,eAAO,EAAP;AACH;;AAED,iBAAW,sBAAsB,IAAtB,CAA2B,GAA3B,CAAX;AACH,CAfD;;;;;;;;;;;ACFA;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;;;;;;;;;cAE+B,M;IAAvB,O,WAAA,O;IAAS,S,WAAA,S;gBACE,Q;IAAX,M,aAAA,M;IACA,O,GAAY,yB,CAAZ,O;;IAEa,mB;;;AAIjB,iCAAY,IAAZ,EAAiB;AAAA;;AAAA,8IACP,IADO;;AAAA,cAFjB,WAEiB,GAFH,UAEG;;;AAGb,cAAK,OAAL,GAAe,IAAI,oBAAJ,CAAY,QAAQ,GAAR,CAAY,MAAK,WAAjB,CAAZ,EAA2C,UAAU,aAArD,CAAf;AACA,cAAK,aAAL,GAAqB,KAAK,aAA1B;AAJa;AAKhB;;;;iCAEQ;AAAA;;AAEL,iBAAK,GAAL,CAAS,KAAT,GAAiB,MAAjB,CAAwB,uCAAxB;;AAEA,iBAAK,kBAAL,GAA0B,IAAI,qBAAJ,CAAa;AACnC,oBAAI,KAAK,GAAL,CAAS,IAAT,CAAc,qBAAd,CAD+B;AAEnC,uBAAO,KAAK,uCAAL,CAF4B;AAGnC,2BAAW,KAAK,uCAAL;AAHwB,aAAb,EAIvB,MAJuB,EAA1B;AAKA,iBAAK,kBAAL,CAAwB,GAAxB,CAA4B,KAAK,OAAL,CAAa,mBAAzC;AACA,iBAAK,kBAAL,CAAwB,EAAxB,CAA2B,QAA3B,EAAqC,UAAC,GAAD,EAAS;AAC1C,uBAAK,OAAL,CAAa,mBAAb,GAAmC,GAAnC;AACH,aAFD;;AAIA,iBAAK,uBAAL,GAA+B,IAAI,qBAAJ,CAAa;AACxC,oBAAI,KAAK,GAAL,CAAS,IAAT,CAAc,0BAAd,CADoC;AAExC,uBAAO,KAAK,qCAAL,CAFiC;AAGxC,2BAAW,KAAK,qCAAL;AAH6B,aAAb,EAI5B,MAJ4B,EAA/B;AAKA,iBAAK,uBAAL,CAA6B,GAA7B,CAAiC,KAAK,OAAL,CAAa,wBAA9C;AACA,iBAAK,uBAAL,CAA6B,EAA7B,CAAgC,QAAhC,EAA0C,UAAC,GAAD,EAAS;AAC/C,uBAAK,OAAL,CAAa,wBAAb,GAAwC,GAAxC;AACH,aAFD;;AAKA,iBAAK,GAAL,CAAS,IAAT,CAAc,UAAd,EAA0B,EAA1B,CAA6B,OAA7B,EAAsC;AAAA,uBAAM,OAAK,OAAL,EAAN;AAAA,aAAtC;;AAEA,gBAAI,OAAO;AACP,0BAAU,KADH;AAEP,uBAAO,KAAK,0BAAL,CAFA;AAGP,yBAAS,KAAK,GAHP;AAIP,yBAAS,CAAC,qBAAD,CAJF;AAKP,4BAAa,KAAK,aALX;AAMP,6BAAc,KAAK,aANZ;AAOP,iCAAiB,KAAK;AAPf,aAAX;;AAWA,iBAAK,GAAL,CAAS,IAAT,CAAc,cAAd,EAA8B,IAA9B,CAAmC,UAAC,CAAD,EAAI,IAAJ,EAAa;AAC5C,oBAAI,QAAQ,EAAE,IAAF,CAAO,IAAP,EAAa,KAAb,CAAmB,EAAnB,CAAZ;AACA,kCAAgB,MAAM,IAAN,CAAW,eAAX,CAAhB;AACH,aAHD;;AAKA,iBAAK,KAAL,GAAa,IAAI,YAAJ,CAAU,IAAV,CAAb;AACA,iBAAK,KAAL,CAAW,IAAX;AACH;;;kCAEQ;AACL,oBAAQ,GAAR,CAAY,QAAQ,IAApB,EAA0B,KAAK,OAAL,CAAa,KAAvC,EAA6C;AACzC,wBAAQ,OAAO,SAAP,CAAiB,OAAjB,GAA2B,gBAA3B,GAA8C,QAAQ,MADrB;AAEzC,yBAAS,IAAI,IAAJ,CAAS,KAAK,GAAL,KAAa,QAAQ,UAA9B;AAFgC,aAA7C;AAIA,iBAAK,KAAL,CAAW,IAAX;;AAEA;AACA,qBAAS,MAAT;AACH;;;;EAnE4C,SAAS,I;;qBAArC,mB;;;;;;;;;;;;;ICVA,qB;AACjB,mCAAY,OAAZ,EAAqB;AAAA;;AACjB,aAAK,QAAL,GAAgB,OAAhB;AACH;;;;+BAEM,M,EAAQ;AACX;AACH;;;mCAEU;AACP;AACH;;;qCAEY;AACT,mBAAO,KAAK,QAAZ;AACH;;;;;;qBAfgB,qB;;;;;;;;;;;ACArB;;;;AACA;;;;AACA;;;;;;;;IAEqB,oB;AACjB,oCAAc;AAAA;;AACV,aAAK,YAAL,GAAoB,KAApB;AACA,aAAK,UAAL,GAAkB,CAAlB;AACA,aAAK,gBAAL,CAAsB,CAAC,IAAI,uBAAJ,CAAe,IAAf,CAAD,EAAuB,IAAI,+BAAJ,CAAuB,IAAvB,CAAvB,CAAtB;AAGH;;;;yCAEgB,S,EAAW;AACxB,gBAAI,sBAAsB,QAAQ,GAAR,CAAY,YAAZ,CAA1B;AACA,gBAAI,SAAS,sBAAsB,KAAK,KAAL,CAAW,mBAAX,CAAtB,GAAwD,EAArE;AACA,mBAAO,OAAO,MAAP,GAAgB,KAAK,UAAL,GAAkB,CAAzC,EAA4C;AACxC,uBAAO,KAAP;AACH;AACD,gBAAM,WAAW,OAAO,QAAP,CAAgB,QAAhB,GAA2B,OAAO,QAAP,CAAgB,QAA3C,GAAsD,GAAvE;AACA,gBAAM,SAAS,OAAO,QAAP,CAAgB,MAAhB,GAAyB,OAAO,QAAP,CAAgB,MAAzC,GAAkD,EAAjE;AACA,gBAAM,OAAO,OAAO,QAAP,CAAgB,IAAhB,GAAuB,OAAO,QAAP,CAAgB,IAAvC,GAA8C,EAA3D;AACA,gBAAM,QAAQ,WAAW,MAAX,GAAoB,IAAlC;AACA,mBAAO,IAAP,CAAY,KAAK,SAAL,CAAe,EAAE,SAAS,wBAAW,IAAX,CAAgB,KAAhB,CAAX,EAAf,CAAZ;AACA,oBAAQ,GAAR,CAAY,YAAZ,EAA0B,MAA1B,EAAkC,EAAE,MAAM,GAAR,EAAlC;AACA,iBAAK,kBAAL,CAAwB,SAAxB,EAAmC,MAAnC;AAEH;;;2CAEkB;AACf,gBAAI,SAAS,KAAK,OAAL,EAAb;AACA,gBAAI,OAAO,MAAP,GAAgB,CAApB,EAAuB;AACnB,uBAAO,KAAP;AACH;AACD,gBAAM,uBAAuB,OAAO,OAAO,MAAP,GAAgB,CAAvB,EAA0B,KAAvD;AACA,gBAAM,mBAAmB,OAAO,OAAO,MAAP,GAAgB,CAAvB,EAA0B,KAAnD;AACA,gBAAM,gBAAgB,OAAO,OAAO,MAAP,GAAgB,CAAvB,EAA0B,KAAhD;AACA,mBAAQ,OAAO,MAAP,IAAiB,CAAjB,IAAsB,yBAAyB,aAA/C,IAAgE,kBAAkB,gBAA1F;AACH;;;wCAEe,I,EAAM,K,EAAO;AACzB,gBAAI,sBAAsB,QAAQ,GAAR,CAAY,YAAZ,CAA1B;AACA,gBAAI,wBAAwB,SAA5B,EAAuC;AACnC,oBAAI,SAAS,KAAK,KAAL,CAAW,mBAAX,CAAb;AACA;AACA,oBAAI,QAAQ,OAAO,OAAO,OAAO,MAAP,GAAgB,CAAvB,CAAP,KAAqC,QAArC,GAAgD,KAAK,KAAL,CAAW,OAAO,OAAO,MAAP,GAAgB,CAAvB,CAAX,CAAhD,GAAwF,OAAO,OAAO,MAAP,GAAgB,CAAvB,CAApG;AACA,sBAAM,IAAN,IAAe,KAAf;AACA,uBAAO,OAAO,MAAP,GAAgB,CAAvB,IAA4B,KAA5B;AACA,wBAAQ,GAAR,CAAY,YAAZ,EAA0B,KAAK,SAAL,CAAe,MAAf,CAA1B,EAAkD,EAAE,MAAM,GAAR,EAAlD;AACH;AACJ;;;gCAEO,K,EAAO;AACX,gBAAI,QAAQ,GAAR,CAAY,YAAZ,CAAJ,EAA+B;AAC3B,oBAAI,sBAAsB,QAAQ,GAAR,CAAY,YAAZ,CAA1B;AACA,oBAAI,SAAS,KAAK,KAAL,CAAW,mBAAX,CAAb;AACA,qBAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,OAAO,MAA3B,EAAmC,GAAnC,EAAwC;AACpC,2BAAO,CAAP,IAAY,OAAO,OAAO,CAAP,CAAP,KAAqB,QAArB,GAAgC,KAAK,KAAL,CAAW,OAAO,CAAP,CAAX,CAAhC,GAAwD,OAAO,CAAP,CAApE;AACH;AACD,oBAAI,QAAQ,CAAC,CAAT,IAAc,OAAO,KAAP,CAAlB,EAAiC;AAC7B,2BAAO,OAAO,KAAP,CAAP;AACH,iBAFD,MAGK,IAAI,CAAC,KAAL,EAAY;AACb,2BAAO,MAAP;AACH;AACJ;AACD,mBAAO,EAAP;AACH;;;2CAEkB,S,EAAW,M,EAAQ;AAAA;;AAAA;AAAA;AAAA;;AAAA;AAAA;AAAA,wBACzB,QADyB;;AAE9B,6BAAS,MAAT,CAAgB,MAAhB;AACA;AACA,2BAAO,gBAAP,CAAwB,cAAxB,EAAwC,YAAM;AAC1C,4BAAI,CAAC,MAAK,YAAV,EAAwB;AACpB,qCAAS,QAAT;AACA,kCAAK,YAAL,GAAoB,IAApB;AACH;AACJ,qBALD,EAKG,KALH;;AAOA;AACA,2BAAO,gBAAP,CAAwB,UAAxB,EAAoC,YAAM;AACtC,4BAAI,CAAC,MAAK,YAAV,EAAwB;AACpB,qCAAS,QAAT;AACA,kCAAK,YAAL,GAAoB,IAApB;AACH;AACJ,qBALD,EAKG,KALH;AAZ8B;;AAClC,qCAAqB,SAArB,8HAAgC;AAAA;AAiB/B;AAlBiC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAmBrC;;;;;;qBApFgB,oB;;;;;;;;;ACJrB;;;;AACA;;;;AACA;;;;AACA;;;;;;AAEA,IAAM,iCAAiC,SAAjC,8BAAiC,OAAU;AAAA,QAAR,EAAQ,QAAR,EAAQ;;AAC7C;AACA;AACA,MAAE,QAAF,EAAY,EAAZ,CAAe,OAAf,EAAwB,kDAAxB,EAA4E,UAAC,CAAD,EAAO;AAC/E,YAAM,iBAAiB,IAAI,2BAAJ,EAAvB;;AAEA,YAAM,UAAU,EAAE,EAAE,MAAJ,EAAY,OAAZ,CAAoB,kDAApB,CAAhB;AACA,YAAM,UAAU,QAAQ,IAAR,CAAa,UAAb,CAAhB;;AAEA,uBAAe,MAAf,CAAsB,EAAC,SAAS,OAAV,EAAtB,EAA0C,IAA1C,CAA+C,UAAC,QAAD,EAAc;AACzD,gBAAM,QAAQ,IAAI,kBAAJ,CAAU,QAAV,CAAd;;AAEA;AACA,kBAAM,GAAN,CAAU,EAAC,YAAY,QAAb,EAAV;;AAEA,mBAAO,IAAP,CAAY,OAAZ,CAAoB,MAAM,GAAN,CAAU,IAAV,CAApB,EAAqC,IAArC,CAA0C,UAAC,QAAD,EAAc;AAAE;AACtD,sBAAM,GAAN,CAAU;AACN,gCAAY,SAAS,UADf;AAEN,gCAAY,SAAS,UAFf;AAGN,sCAAkB,SAAS;AAHrB,iBAAV;;AAMA,oBAAI,OAAO,cAAP,CAAsB,SAAtB,CAAgC,YAAhC,CAAJ,EAAkD;AAC9C,wBAAI,kCAAJ,CAA2B,EAAC,YAAD,EAAQ,eAAe,IAAvB,EAA6B,MAA7B,EAA3B;AACH,iBAFD,MAEO;AACH,wBAAI,iCAAJ,CAAyB,EAAC,YAAD,EAAQ,MAAM,eAAd,EAA+B,MAA/B,EAAzB;AACH;AAEJ,aAbD;AAcH,SApBD;AAqBH,KA3BD;AA4BH,CA/BD;;qBAiCe,8B;;;;;;;;;qBCtCA;AAAA,QAAG,iBAAH,QAAG,iBAAH;AAAA,QAAsB,WAAtB,QAAsB,WAAtB;AAAA,QAAmC,OAAnC,QAAmC,OAAnC;AAAA,QAA4C,IAA5C,QAA4C,IAA5C;AAAA,uBACT,kBAAkB,MAAlB,GAA2B,CAA3B,wCAAgE,iBAAhE,YAA0F,EADjF,gBAET,YAAY,MAAZ,GAAqB,CAArB,iCAAmD,WAAnD,YAAuE,EAF9D,eAGT,QAAQ,GAAR,CAAY,UAAC,MAAD;AAAA,wCAAiC,MAAjC;AAAA,KAAZ,EAA2D,IAA3D,CAAgE,EAAhE,CAHS,eAIT,KAAK,MAAL,GAAc,CAAd,0BAAqC,IAArC,YAAkD,EAJzC;AAAA,C;;;;;;;;;;;ACAf;;;;;;;;;;;;cAE8B,M;IAAtB,I,WAAA,I;IAAM,G,WAAA,G;IAAK,M,WAAA,M;;IAEE,e;;;;;4BACO;AACpB,gBAAM,mBAAmB,KAAK,KAAL,CAAW,GAAX,CAAe,SAAf,KAA6B,CAAC,KAAK,KAAL,CAAW,GAAX,CAAe,aAAf,CAAvD;AACA,gBAAI,gBAAJ,EAAsB;AAClB,oBAAI,KAAK,IAAL,KAAc,iBAAlB,EAAqC;AACjC,2BAAU,KAAK,yCAAL,CAAV,mDAAoG,IAAI,OAAO,YAAX,CAApG,WAAiI,KAAK,8BAAL,CAAjI;AACH,iBAFD,MAEO,IAAI,OAAO,cAAP,CAAsB,SAAtB,CAAgC,mBAAhC,IAAuD,KAAK,KAAL,CAAW,GAAX,CAAe,UAAf,CAAvD,GAAoF,KAAK,KAAL,CAAW,GAAX,CAAe,YAAf,MAAiC,QAAzH,EAAmI;AACtI,2BAAO,KAAK,sCAAL,CAAP;AACH;AACD,uBAAO,KAAK,kCAAL,CAAP;AACH;AACD,mBAAO,EAAP;AACH;;;4BAEiB;AACd,gBAAM,aAAa,KAAK,KAAL,CAAW,GAAX,CAAe,YAAf,CAAnB;AACA,gBAAM,mBAAmB,KAAK,KAAL,CAAW,GAAX,CAAe,kBAAf,KAAsC,CAA/D;;AAEA,gBAAI,KAAK,KAAL,CAAW,GAAX,CAAe,mBAAf,KAAuC,qBAAqB,CAAhE,EAAmE;AAC/D,uBAAO,KAAK,mCAAL,CAAP;AACH;;AAED,oBAAQ,KAAK,IAAb;AACI,qBAAK,OAAL;AACI,wBAAI,UAAJ,EAAgB;AACZ,+BAAO,cAAc,CAAd,GACD,KAAK,sCAAL,EAA6C,EAAE,YAAY,KAAK,KAAL,CAAW,GAAX,CAAe,YAAf,CAAd,EAA7C,CADC,GAED,KAAK,mCAAL,CAFN;AAGH;AACD,2BAAO,EAAP;AACJ,qBAAK,eAAL;AACA,qBAAK,iBAAL;AACA,qBAAK,OAAL;AACA;AACI,2BAAO,EAAP;AAZR;AAcH;;;4BAEa;AACV,gBAAM,aAAa,KAAK,KAAL,CAAW,GAAX,CAAe,YAAf,KAAgC,CAAnD;AACA,gBAAM,cAAc,KAAK,KAAL,CAAW,GAAX,CAAe,aAAf,KAAiC,CAArD;AACA,gBAAM,mBAAmB,KAAK,KAAL,CAAW,GAAX,CAAe,kBAAf,KAAsC,CAA/D;AACA,oBAAQ,KAAK,IAAb;AACI,qBAAK,eAAL;AACA,qBAAK,iBAAL;AACI,2BAAO,CACH,KAAK,2CAAL,EAAkD,EAAE,kCAAF,EAAoB,sBAApB,EAAlD,CADG,EAEH,KAAK,mCAAL,EAA0C,EAAE,wBAAF,EAA1C,CAFG,CAAP;AAIJ,qBAAK,OAAL;AACA,qBAAK,OAAL;AACA;AACI,2BAAO,CACH,KAAK,oCAAL,EAA2C,EAAE,sBAAF,EAA3C,CADG,EAEH,KAAK,mCAAL,EAA0C,EAAE,wBAAF,EAA1C,CAFG,CAAP;AAVR;AAeH;;;4BAEU;AACP,mBAAO,KAAK,KAAL,CAAW,GAAX,CAAe,YAAf,IAA+B,KAAK,uBAAL,CAA/B,GAA+D,EAAtE;AACH;;;AAED,mCAAsB;AAAA,YAAR,IAAQ,QAAR,IAAQ;;AAAA;;AAAA,uIACT,SADS;;AAElB,cAAK,EAAL,GAAU,MAAK,EAAL,IAAW,SAAS,aAAT,CAAuB,KAAvB,CAArB;AACA,cAAK,EAAL,CAAQ,SAAR,GAAuB,MAAK,EAAL,CAAQ,SAA/B;AACA,cAAK,IAAL,GAAY,QAAQ,OAApB;AAJkB;AAKrB;;;;iCAEQ;AACL,gBAAM,OAAO,kCAAwB;AACjC,mCAAmB,KAAK,iBADS;AAEjC,6BAAa,KAAK,WAFe;AAGjC,yBAAS,KAAK,OAHmB;AAIjC,sBAAM,KAAK;AAJsB,aAAxB,CAAb;AAMA,iBAAK,GAAL,CAAS,KAAT,GAAiB,MAAjB,CAAwB,IAAxB;;AAEA,mBAAO,IAAP;AACH;;;;EAhFwC,SAAS,I;;qBAAjC,e;;;;;;;;;ACJrB;;AACA;;;;;;;;;;;;IAEqB,oB;;;AACjB,wCAA6B;AAAA,YAAf,KAAe,QAAf,KAAe;AAAA,YAAR,IAAQ,QAAR,IAAQ;;AAAA;;AACzB,YAAM,cAAc,IAAI,4BAAJ,CAAoB,EAAE,YAAF,EAAS,UAAT,EAApB,EAAqC,MAArC,EAApB;AACA,YAAM,gBAAgB;AAClB,qBAAS,CAAC,sBAAD,CADS;AAElB,mBAAO,OAAO,IAAP,CAAY,6BAAZ,CAFW;AAGlB,qBAAS,YAAY;AAHH,SAAtB;AAFyB,2IAOnB,aAPmB;AAQ5B;;;EAT6C,Y;;qBAA7B,oB;;;;;;;;;ACHrB;;AACA;;;;;;;;;;;;IAEqB,sB;;;AACjB,0CAA6C;AAAA,YAA/B,KAA+B,QAA/B,KAA+B;AAAA,sCAAxB,aAAwB;AAAA,YAAxB,aAAwB,sCAAR,KAAQ;;AAAA;;AACzC,YAAM,cAAc,IAAI,6BAAJ,CAAsB,EAAC,YAAD,EAAQ,4BAAR,EAAuB,WAAW,OAAO,SAAP,CAAiB,SAAnD,EAAtB,EAAqF,MAArF,EAApB;AACA,YAAM,gBAAgB;AAClB,qBAAS,CAAC,wBAAD,CADS;AAElB,mBAAO,OAAO,IAAP,CAAY,6BAAZ,CAFW;AAGlB,qBAAS,YAAY;AAHH,SAAtB;AAFyC,+IAOnC,aAPmC;AAQ5C;;;EAT+C,Y;;qBAA/B,sB;;;;;;;;cCHE,M;IAAf,I,WAAA,I;IAAM,I,WAAA,I;;qBACC;AAAA,QAAG,WAAH,QAAG,WAAH;AAAA,QAAgB,OAAhB,QAAgB,OAAhB;AAAA,QAAyB,IAAzB,QAAyB,IAAzB;AAAA,QAA+B,gBAA/B,QAA+B,gBAA/B;AAAA,uBACT,eAAe,YAAY,MAAZ,GAAqB,CAApC,iCAAkE,WAAlE,YAAsF,EAD7E,gBAET,WAAW,QAAQ,GAAR,CAAY,UAAC,MAAD;AAAA,sEAA6D,OAAO,KAApE,uBAA2F,OAAO,KAAlG;AAAA,KAAZ,EAAkI,IAAlI,CAAuI,EAAvI,CAFF,gBAGT,QAAQ,KAAK,MAAL,GAAc,CAAtB,0BAA6C,IAA7C,YAA0D,EAHjD,gBAIT,oBAAoB,iBAAiB,MAAjB,GAA0B,CAA9C,oCAAiF,gBAAjF,YAA0G,EAJjG;AAAA,C;;;;;;;;;;;ACDf;;;;AACA;;;;;;;;;;;;cACiB,M;IAAT,I,WAAA,I;;IAEa,iB;;;AACjB,qCAA0D;AAAA,sCAA5C,aAA4C;AAAA,YAA5C,aAA4C,sCAA5B,KAA4B;AAAA,kCAArB,SAAqB;AAAA,YAArB,SAAqB,kCAAT,KAAS;;AAAA;;AAAA,2IAC7C,SAD6C;;AAEtD,cAAK,EAAL,GAAU,MAAK,EAAL,IAAW,SAAS,aAAT,CAAuB,KAAvB,CAArB;AACA,cAAK,aAAL,GAAqB,aAArB;AACA,cAAK,SAAL,GAAiB,SAAjB;AACA,cAAK,uBAAL,GAA+B,CAA/B;AACA,cAAK,sBAAL,GAA8B,EAA9B;AACA,cAAK,QAAL,CAAc,MAAK,KAAnB,EAA0B,mBAA1B,EAA+C,MAAK,cAApD;AAPsD;AAQzD;;;;iCAEQ;AACL,gBAAM,OAAO,mCAAwB;AACjC,6BAAa,KAAK,WADe;AAEjC,yBAAS,KAAK,OAFmB;AAGjC,sBAAM,KAAK,IAHsB;AAIjC,kCAAkB,KAAK;AAJU,aAAxB,CAAb;AAMA,iBAAK,GAAL,CAAS,KAAT,GAAiB,MAAjB,CAAwB,IAAxB;;AAEA,mBAAO,IAAP;AACH;;;yCAEgB;AACb,gBAAI,KAAK,YAAT,EAAuB;AACnB,qBAAK,GAAL,CAAS,IAAT;AACH;AACJ;;;4BAEiB;AACd,gBAAI,KAAK,iBAAT,EAA4B;AACxB,uBAAO,KAAK,uCAAL,CAAP;AACH,aAFD,MAEO,IAAI,KAAK,cAAT,EAAyB;AAC5B,oBAAI,UAAU,EAAd;AACA,oBAAI,KAAK,KAAL,CAAW,GAAX,CAAe,YAAf,MAAiC,QAArC,EAA+C;AAC3C,8BAAU,KAAK,yCAAL,CAAV;AACH,iBAFD,MAEO;AACH,8BAAU,KAAK,kCAAL,CAAV;AACH;AACD,uBAAO,KAAK,aAAL,GACD,OADC,cAEQ,OAFR,0FAEoG,KACjG,8BADiG,CAFpG,gBAAP;AAKH,aAZM,MAYA,IACH,KAAK,KAAL,CAAW,oBAAX,IACA,KAAK,KAAL,CAAW,GAAX,CAAe,YAAf,MAAiC,QAF9B,EAGL;AACE,oBAAI,aAAa,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,OAAzB,EAAkC;AAC/C,wBAAI,KAAK,KAAL,CAAW,GAAX,CAAe,IAAf;AAD2C,iBAAlC,CAAjB;AAGA,oBAAI,+DAA6D,UAA7D,UAA4E,KAC5E,uCAD4E,CAA5E,SAAJ;AAGA,uBAAO,KAAK,+BAAL,EAAsC,EAAE,MAAM,WAAR,EAAtC,CAAP;AACH,aAXM,MAWA,IAAI,KAAK,eAAT,EAA0B;AAC7B,uBAAO,KAAK,kCAAL,CAAP;AACH,aAFM,MAEA,IAAI,KAAK,SAAT,EAAoB;AACvB,uBAAO,KAAK,4BAAL,CAAP;AACH;AACD,mBAAO,EAAP;AACH;;;4BAEa;AACV,gBAAI,UAAU,EAAd;AACA,gBAAI,CAAC,KAAK,uBAAN,IAAiC,CAAC,KAAK,YAA3C,EAAyD;AACrD,wBAAQ,IAAR,CAAa;AACT,2BAAO,KAAK,2BAAL,CADE;AAET,2BAAO,KAAK;AAFH,iBAAb;AAIH;;AAED,gBAAI,KAAK,KAAL,CAAW,GAAX,CAAe,kBAAf,CAAJ,EAAwC;AACpC,wBAAQ,IAAR,CAAa;AACT,2BAAO,KAAK,8BAAL,CADE;AAET,2BAAO,KAAK,KAAL,CAAW,GAAX,CAAe,kBAAf;AAFE,iBAAb;AAIH;;AAED,gBAAI,cAAc,KAAK,KAAL,CAAW,GAAX,CAAe,aAAf,KAAiC,CAAnD;AACA,gBAAI,aAAa,KAAK,KAAL,CAAW,GAAX,CAAe,YAAf,KAAgC,CAAjD;;AAEA,oBAAQ,IAAR,CAAa;AACT,uBAAO,KAAK,gCAAL,CADE;AAET,uBAAO;AAFE,aAAb;;AAKA,gBAAI,cAAc,CAAlB,EAAqB;AACjB,oBAAI,aACA,eAAe,UAAf,GAA4B,aAAa,WAAzC,GAAuD,CAD3D;AAEA,oBAAI,oBACA,aAAa,CAAb,IAAkB,aAAa,CAA/B,GACM,KADN,GAEM,KAAK,KAAL,CAAW,UAAX,CAHV;AAIA,wBAAQ,IAAR,CAAa;AACT,2BAAO,KAAK,qCAAL,CADE;AAET,2BAAO;AAFE,iBAAb;AAIA,wBAAQ,IAAR,CAAa;AACT,2BAAO,KAAK,uCAAL,CADE;AAET,2BAAO;AAFE,iBAAb;AAIH,aAfD,MAeO;AACH,wBAAQ,IAAR,CAAa;AACT,2BAAO,KAAK,gCAAL,CADE;AAET,2BAAO;AAFE,iBAAb;AAIH;AACD,mBAAO,OAAP;AACH;;;4BAEkB;AACf,gBAAI,OAAO,EAAX;AACA,gBAAI,CAAC,KAAK,YAAV,EAAwB;AACpB,wDAAoC,OAAO,IAAP,CAChC,2BADgC,CAApC,UAEM,KAAK,YAFX;AAGH;AACD,mBAAO,IAAP;AACH;;;4BAEkB;AACf,gBAAI,eAAe,EAAnB;;AAEA,gBAAI,CAAC,KAAK,YAAV,EAAwB;AACpB,oBAAI,KAAK,uBAAT,EAAkC;AAC9B,mCAAe,KAAK,+BAAL,CAAf;AACH,iBAFD,MAEO;AACH,wBAAI,oBAAoB,OACpB,KAAK,KAAL,CAAW,GAAX,CAAe,mBAAf,CADoB,CAAxB;AAGA,wBAAI,qBAAqB,CAAzB,EAA4B;AACxB,uCAAe,KAAK,gCAAL,CAAf;AACH,qBAFD,MAEO,IACH,oBACA,IAAI,KAAK,sBAFN,EAGL;AACE,uCAAe,KAAK,8BAAL,EAAqC;AAChD,mCAAO,KAAK,IAAL,CAAU,oBAAoB,CAA9B;AADyC,yBAArC,CAAf;AAGH,qBAPM,MAOA;AACH;AACA,uCAAe,KAAK,iCAAL,EAAwC;AACnD,oCAAQ,KAAK,GAAL,CACJ,KAAK,IAAL,CAAU,oBAAoB,EAA9B,CADI,EAEJ,KAAK,uBAFD;AAD2C,yBAAxC,CAAf;AAMH;AACJ;AACJ;;AAED,mBAAO,YAAP;AACH;;;4BAE6B;AAC1B,mBACI,KAAK,KAAL,CAAW,GAAX,CAAe,mBAAf,MAAwC,SAAxC,IACA,KAAK,KAAL,CAAW,GAAX,CAAe,mBAAf,MAAwC,IADxC,IAEA,KAAK,iBAFL,IAGA,KAAK,SAHL,IAIA,KAAK,cALT;AAOH;;;4BAEkB;AACf,mBACI,KAAK,eAAL,IACA,KAAK,KAAL,CAAW,GAAX,CAAe,YAAf,MAAiC,QADjC,KAEC,OAAO,cAAP,CAAsB,SAAtB,CAAgC,mBAAhC,IACK,KAAK,KAAL,CAAW,GAAX,CAAe,YAAf,CADL,GAEK,KAAK,KAAL,CAAW,GAAX,CAAe,YAAf,MAAiC,UAJvC,CADJ;AAOH;;;4BAEoB;AACjB,mBAAO,OAAO,cAAP,CAAsB,SAAtB,CAAgC,yBAAhC,IACD,KAAK,KAAL,CAAW,SADV,GAED,KAAK,KAAL,CAAW,GAAX,CAAe,SAAf,KACI,CAAC,KAAK,KAAL,CAAW,GAAX,CAAe,aAAf,CADL,IAEI,CAAC,KAAK,KAAL,CAAW,oBAJtB;AAKH;;;4BAEqB;AAClB,mBAAO,KAAK,KAAL,CAAW,GAAX,CAAe,YAAf,CAAP;AACH;;;4BAEuB;AACpB,mBAAO,KAAK,KAAL,CAAW,GAAX,CAAe,mBAAf,CAAP;AACH;;;4BAEU;AACP,mBAAO,EAAP;AACH;;;4BAEsB;AACnB,mBAAO,mCAAiB,KAAK,KAAtB,CAAP;AACH;;;;EArM0C,SAAS,I;;qBAAnC,iB;;;;;;;;;;ACJrB;;AAEA,IAAM,mBAAmB,SAAnB,gBAAmB;AAAA,QAAG,GAAH,QAAG,GAAH;AAAA,gDACO,GADP;AAAA,CAAzB;;AAIO,IAAM,sDAAuB,SAAvB,oBAAuB;AAAA,QAChC,eADgC,SAChC,eADgC;AAAA,QAEhC,aAFgC,SAEhC,aAFgC;AAAA,QAGhC,UAHgC,SAGhC,UAHgC;AAAA,QAIhC,eAJgC,SAIhC,eAJgC;AAAA,QAKhC,YALgC,SAKhC,YALgC;AAAA,qNAWtB,OAAO,IAAP,CAAY,uBAAZ,CAXsB,oFAetB,OAAO,IAAP,CAAY,0BAAZ,CAfsB,yIAqBhB,gBAAgB,eAAhB,GAAkC,OAAO,MAAP,CAAc,MAAd,CAAqB,KArBvC,iJA2BhB,gBACM,OAAO,IAAP,CAAY,2BAAZ,CADN,GAEM,OAAO,IAAP,CAAY,0BAAZ,CA7BU,4GAqCxB,iFAGE,aAAa,GAAb,CAAiB,UAAC,GAAD;AAAA,eAAS,iBAAiB,EAAE,QAAF,EAAjB,CAAT;AAAA,KAAjB,EAAqD,IAArD,CAA0D,EAA1D,CAHF,uFAME,gBAAgB,GAAhB,CAAoB,UAAC,GAAD;AAAA,eAAS,iBAAiB,EAAE,QAAF,EAAjB,CAAT;AAAA,KAApB,EAAwD,IAAxD,CAA6D,EAA7D,CANF,kCASM,EA9CkB,uFAmDhB,KAAK,eAAL,CAnDgB,6BAoDjB,8BAAY,kCAAZ,CApDiB;AAAA,CAA7B;;;;;;;;;;;;ACNP;;AACA;;;;;;;;cAEmB,M;IAAX,M,WAAA,M;;IAEK,gB,WAAA,gB;;;AAKT,oCAA+D;AAAA,YAAjD,YAAiD,QAAjD,YAAiD;AAAA,YAAnC,cAAmC,QAAnC,cAAmC;AAAA,YAAnB,eAAmB,QAAnB,eAAmB;;AAAA;;AAAA,yIAClD,SADkD;;AAG3D,cAAK,YAAL,GAAoB,YAApB;AACA,cAAK,cAAL,GAAsB,cAAtB;AACA,cAAK,eAAL,GAAuB,eAAvB;;AAEA,cAAK,MAAL;AAP2D;AAQ9D;;;;iCAEQ;AACL,gBAAM,eAAe,EAArB;AACA,gBAAM,kBAAkB,EAAxB;;AAEA,iBAAK,IAAI,QAAQ,CAAjB,EAAoB,SAAS,EAA7B,EAAiC,OAAjC,EAA0C;AACtC,oBAAM,WAAW,iEACoB,KADpB,WAAjB;AAGA,oBAAI,SAAS,CAAb,EAAgB;AACZ,iCAAa,IAAb,CAAkB,QAAlB;AACH,iBAFD,MAEO;AACH,oCAAgB,IAAhB,CAAqB,QAArB;AACH;AACJ;;AAbI,gBAeG,MAfH,GAesB,MAftB,CAeG,MAfH;AAAA,gBAeW,MAfX,GAesB,MAftB,CAeW,MAfX;;AAgBL,gBAAM,gBACF,CAAC,MAAD,IAAW,CAAC,MAAZ,IAAsB,CAAC,KAAK,KAA5B,IAAqC,CAAC,KAAK,cAD/C;AAEA,gBAAM,kBAAkB,gBAClB,KAAK,eADa,GAElB,wBAFN;;AAIA,gBAAM,OAAO,4CAAqB;AAC9B,gDAD8B;AAE9B,4CAF8B;AAG9B,4BACI,CAAC,KAAK,cAAN,IACA,CAAC,KAAK,YADN,IAEA,CAAC,OAAO,cAAP,CAAsB,SAAtB,CAAgC,oBAAhC,CANyB;AAO9B,gDAP8B;AAQ9B;AAR8B,aAArB,CAAb;AAUA,iBAAK,GAAL,CAAS,KAAT,GAAiB,MAAjB,CAAwB,IAAxB;AACH;;;;EAhDiC,SAAS,I;;;;;;;;;;;ACL/C;;;;AACA;;;;;;;;cAEwB,M;IAAhB,G,WAAA,G;IAAK,M,WAAA,M;;IAEQ,gB;AACjB,oCAAmE;AAAA,YAAtD,GAAsD,QAAtD,GAAsD;AAAA,YAAjD,iBAAiD,QAAjD,iBAAiD;AAAA,YAA9B,MAA8B,QAA9B,MAA8B;AAAA,YAAtB,mBAAsB,QAAtB,mBAAsB;;AAAA;;AAC/D,aAAK,GAAL,GAAW,GAAX;AACA,aAAK,MAAL,GAAc,MAAd;AACA,aAAK,iBAAL,GAAyB,iBAAzB;AACA,aAAK,mBAAL,GAA2B,mBAA3B;AACH;;;;8BAEK;AAAA;;AACF,iBAAK,eAAL,GAAuB,IAAI,kCAAJ,CAA0B,KAAK,mBAA/B,CAAvB;;AAEA,iBAAK,eAAL,CAAqB,GAArB,CAAyB,IAAzB,CAA8B,iBAA9B,EAAiD,EAAjD,CAAoD,OAApD,EAA6D,YAAM;AAC/D,oBAAM,mBAAmB,MAAK,MAAL,KAAgB,qBAAhB,GAAwC,KAAK,yCAAL,CAAxC,GAA0F,KAAK,IAAL,CAAnH;AACA,oBAAI,aAAa,MAAK,iBAAL,CAAuB,IAAvB,EAA6B,IAA7B,CAAkC,YAAM;AACrD,0BAAK,eAAL,CAAqB,KAArB;AACA,0BAAK,WAAL,GAAmB,IAAI,wCAAJ,CAAgC,EAAC,gBAAgB,IAAjB,EAAuB,eAAe,IAAtC,EAA4C,YAAY,gBAAxD,EAA0E,mBAAmB,MAAK,mBAAlG,EAAhC,CAAnB;AACH,iBAHgB,WAGR,YAAM;AACX,0BAAK,eAAL,CAAqB,KAArB;AACA,0BAAK,WAAL,GAAmB,IAAI,wCAAJ,CAAgC,EAAC,gBAAgB,IAAjB,EAAuB,eAAe,KAAtC,EAA6C,YAAY,gBAAzD,EAA2E,mBAAmB,MAAK,mBAAnG,EAAhC,CAAnB;AACH,iBANgB,CAAjB;AAOH,aATD;;AAWA,iBAAK,eAAL,CAAqB,GAArB,CAAyB,IAAzB,CAA8B,cAA9B,EAA8C,EAA9C,CAAiD,OAAjD,EAA0D,YAAM;AAC5D,sBAAK,iBAAL,CAAuB,KAAvB,EAA8B,IAA9B,CAAmC,YAAM;AACrC,0BAAK,eAAL,CAAqB,KAArB;AACH,iBAFD,WAES,YAAM;AACX,0BAAK,eAAL,CAAqB,KAArB;AACH,iBAJD;AAKH,aAND;AAOH;;;0CAEiB,G,EAAK;AACnB,mBAAO,KAAK,iBAAL,CAAuB,8BAAvB,CAAsD,GAAtD,EAA2D,KAAK,MAAhE,CAAP;AACH;;;;;;qBAjCgB,gB;;;;;;;;cCLJ,M;IAAT,I,WAAA,I;;qBAEO,UAAC,iBAAD;AAAA,mEAGL,KAAK,sCAAL,CAHK,kBAIL,KAAK,+CAAL,EAAsD;AACpD,sBAAc,KAAK,UAAL;AADsC,KAAtD,CAJK,mEAWP,iCACiB,iBADjB,mIAC0J,KAChJ,UADgJ,CAD1J,8HAIkH,KACxG,UADwG,CAJlH,cAXO,0HAoB4F,KACnG,wCADmG,CApB5F,0BAyBP,iCACiB,iBADjB,kIACyJ,KAC/I,UAD+I,CADzJ,6HAIiH,KACvG,UADuG,CAJjH,cAzBO;AAAA,C;;;;;;;;cCFe,M;IAAtB,I,WAAA,I;IAAM,G,WAAA,G;IAAK,M,WAAA,M;;qBAEJ;AAAA,QAAG,aAAH,QAAG,aAAH;AAAA,QAAkB,UAAlB,QAAkB,UAAlB;AAAA,QAA8B,iBAA9B,QAA8B,iBAA9B;AAAA,uDAGP,kCAEK,KAAK,kDAAL,CAFL,oCAKK,KAAK,8CAAL,EAAqD;AACtD,4CAAiC,IAC7B,OAAO,eADsB,CAAjC,WAEM,KAAK,iCAAL,CAFN;AADsD,KAArD,CALL,eAHO,0DAkBP,iCACiB,iBADjB,kJAEU,UAFV,0JAKU,UALV,2BAlBO;AAAA,C;;;;;;;;;ACFf;;AACA;;;;;;;;;;;;IAEqB,qB;;;AACjB,mCAAY,iBAAZ,EAA+B;AAAA;;AAC3B,YAAM,gBAAgB;AAClB,qBAAS,CAAC,uBAAD,CADS;AAElB,mBAAO,OAAO,IAAP,CAAY,wCAAZ,CAFW;AAGlB,qBAAS,wCAA8B,iBAA9B,CAHS;AAIlB,wBAAY,KAJM;AAKlB,yBAAa;AALK,SAAtB;;AAD2B,kJAQrB,aARqB;;AAU3B,YAAI,4HAAqH,KAAK,0BAAL,CAArH,gBAAJ;AACA,cAAK,MAAL,CAAY,MAAZ,CAAmB,UAAnB;;AAEA,cAAK,GAAL,CAAS,IAAT,CAAc,qBAAd,EAAqC,MAArC;AAb2B;AAc9B;;;EAf8C,Y;;qBAA9B,qB;;;;;;;;;ACHrB;;AACA;;;;;;;;;;;;IAEqB,4B;;;AACjB,gDAA8D;AAAA,YAAhD,aAAgD,QAAhD,aAAgD;AAAA,YAAjC,UAAiC,QAAjC,UAAiC;AAAA,YAArB,iBAAqB,QAArB,iBAAqB;;AAAA;;AAC1D,YAAM,gBAAgB;AAClB,qBAAS,CAAC,6BAAD,CADS;AAElB,mBAAO,gBAAgB,OAAO,IAAP,CAAY,gBAAZ,CAAhB,GAAgD,OAAO,IAAP,CAAY,cAAZ,CAFrC;AAGlB,qBAAS,8CAAoC,EAAC,4BAAD,EAAgB,sBAAhB,EAA4B,oCAA5B,EAApC;AAHS,SAAtB;;AAD0D,gKAMpD,aANoD;;AAQ1D,YAAI,4HAAqH,KAAK,0BAAL,CAArH,gBAAJ;AACA,cAAK,MAAL,CAAY,MAAZ,CAAmB,UAAnB;;AAEA,cAAK,GAAL,CAAS,IAAT,CAAc,kBAAd,EAAkC,EAAlC,CAAqC,OAArC,EAA8C,YAAM;AAChD,kBAAK,OAAL,CAAa,OAAb;AACH,SAFD;AAX0D;AAc7D;;;EAfqD,Y;;qBAArC,4B;;;;;;;;;ACHrB;;;;AACA;;;;;;AAEA,IAAM,kBAAkB,SAAlB,eAAkB,OAA8C;AAAA,QAA5C,EAA4C,QAA5C,EAA4C;AAAA,QAAxC,QAAwC,QAAxC,QAAwC;AAAA,QAA9B,QAA8B,QAA9B,QAA8B;AAAA,QAApB,cAAoB,QAApB,cAAoB;;AAClE,QAAM,mBAAmB,IAAI,wBAAJ,EAAzB;AACA,qBAAiB,qBAAjB,CAAuC,SAAvC;AACA,QAAM,gBAAgB,IAAI,+BAAJ,CAA0B,EAAC,MAAD,EAAK,kCAAL,EAA1B,CAAtB,CAHkE,CAGO;AACzE,QAAM,aAAa,IAAI,+BAAJ,CAA0B,EAAC,IAAI,QAAL,EAAe,kCAAf,EAA1B,CAAnB,CAJkE,CAIc;AAChF,QAAM,aAAa,IAAI,+BAAJ,CAA0B,EAAC,IAAI,QAAL,EAAe,kCAAf,EAA1B,CAAnB,CALkE,CAKc;AAChF,QAAM,mBAAmB,IAAI,+BAAJ,CAA0B,EAAC,IAAI,cAAL,EAAqB,kCAArB,EAA1B,CAAzB,CANkE,CAM0B;AAC/F,CAPD;;qBASe,e;;;;;;;;;ACZf,IAAA,kBAAA,GAAA,OAAA,CAAA,2DAAA,CAAA,CAAA;;;;AACA,IAAA,KAAA,GAAA,OAAA,CAAA,qBAAA,CAAA,CAAA;;;;AACA,IAAA,SAAA,GAAA,OAAA,CAAA,wBAAA,CAAA,CAAA;;;;;;AACA,IAAM,OAAA,GAAU,OAAA,CAAQ,+BAAR,CAAhB,CAAA;;AAEA,IAAM,qBAAA,GAAwB,MAAA,CAAA,SAAA,CAAA,CAAS,MAAT,CAAgB;IAC1C,MAAA,EAAQ;QACJ,wBAAA,EAA0B,qBADtB;QAEJ,2BAAA,EAA6B,qBAAA;KAHS;IAK1C,UAL0C,EAAA,SAAA,UAAA,CAAA,IAAA,EAKX;QAAA,IAAnB,gBAAmB,GAAA,IAAA,CAAnB,gBAAmB,CAAA;;QAC3B,IAAA,CAAK,KAAL,GAAa,gBAAb,CAAA;QACA,IAAA,CAAK,QAAL,CAAc,IAAA,CAAK,KAAnB,EAA0B,QAA1B,EAAoC,IAAA,CAAK,SAAzC,CAAA,CAAA;QACA,IAAM,gBAAA,GAAmB,IAAA,CAAK,GAAL,CAAS,IAAT,CAAc,2BAAd,CAAzB,CAAA;QACA,IAAM,gBAAA,GAAmB,gBAAA,CAAiB,IAAjB,EAAzB,CAAA;QACA,IAAM,YAAA,GAAe,IAAA,CAAK,KAAL,CAAW,GAAX,CAAe,mBAAf,CAArB,CAAA;QACA,IAAI,gBAAJ,EAAsB;YAClB,IAAA,CAAK,GAAL,CAAS,IAAT,CAAc,qBAAd,CAAA,CAAqC,IAArC,CAA0C,gBAA1C,CAAA,CAAA;SACH;;;QAGD,IAAI,OAAA,CAAQ,GAAR,CAAY,oBAAZ,CAAA,IAAqC,YAAA,KAAiB,OAAA,CAAQ,GAAR,CAAY,oBAAZ,CAA1D,EAA6F;YACzF,IAAA,CAAK,wBAAL,CAA8B,OAAA,CAAQ,GAAR,CAAY,oBAAZ,CAA9B,EAAiE,KAAjE,CAAA,CAAA;SACH;KAlBqC;IAoB1C,mBApB0C,EAAA,SAAA,mBAAA,CAoBtB,CApBsB,EAoBnB;QACnB,IAAA,CAAK,wBAAL,CAA8B,CAAA,CAAE,CAAA,CAAE,aAAJ,CAAA,CAAmB,IAAnB,CAAwB,MAAxB,CAA9B,EAA+D,IAA/D,CAAA,CAAA;KArBsC;IAuB1C,mBAvB0C,EAAA,SAAA,mBAAA,CAuBtB,CAvBsB,EAuBnB;QACnB,IAAI,CAAA,CAAE,OAAF,KAAc,UAAA,CAAA,SAAA,CAAA,CAAS,KAA3B,EAAkC;YAC9B,IAAA,CAAK,wBAAL,CAA8B,CAAA,CAAE,CAAA,CAAE,aAAJ,CAAA,CAAmB,IAAnB,CAAwB,MAAxB,CAA9B,EAA+D,IAA/D,CAAA,CAAA;SACH;KA1BqC;IA4B1C,wBA5B0C,EAAA,SAAA,wBAAA,CA4BjB,IA5BiB,EA4BX,OA5BW,EA4BF;QAAA,IAAA,KAAA,GAAA,IAAA,CAAA;;QACpC,IAAM,YAAA,GAAe;YACjB,iBAAA,EAAmB,IAAA;SADvB,CAAA;;;QAKA,IAAI,mBAAA,CAAA,SAAA,CAAA,CAAkB,IAAlB,CAAJ,EAA6B;YACzB,IAAI,OAAA,CAAQ,GAAR,CAAY,kBAAZ,CAAJ,EAAqC;;;;gBAIjC,IAAA,CAAK,KAAL,CAAW,UAAX,CAAsB,QAAtB,GAAiC,IAAjC,CAAA;aACH;;YAED,OAAA,CAAQ,MAAR,CAAe,kBAAf,EAAmC,EAAC,IAAA,EAAM,GAAP,EAAnC,CAAA,CAAA;YACA,YAAA,CAAa,QAAb,GAAwB,KAAxB,CAAA;SACH;;QAED,IAAA,CAAK,KAAL,CAAW,GAAX,CAAe,YAAf,CAAA,CAAA;;QAEA,IAAI,MAAA,CAAO,SAAP,CAAiB,eAArB,EAAsC;YAClC,IAAA,CAAK,KAAL,CAAW,IAAX,CAAgB,IAAA,CAAK,KAAL,CAAW,YAAX,EAAhB,EAA2C;gBACvC,KAAA,EAAO,IADgC,EAC1B,OAAA,EAAS,SAAA,OAAA,GAAM;oBACxB,KAAA,CAAK,mBAAL,CAAyB,IAAzB,EAA+B,OAA/B,CAAA,CAAA;iBACH;aAHL,CAAA,CAAA;SADJ,MAMO;YACH,IAAA,CAAK,mBAAL,CAAyB,IAAzB,EAA+B,OAA/B,CAAA,CAAA;SACH;KAxDqC;IA0D1C,mBA1D0C,EAAA,SAAA,mBAAA,CA0DtB,sBA1DsB,EA0DE,OA1DF,EA0DW;;QAEjD,OAAA,CAAQ,MAAR,CAAe,oBAAf,EAAqC,EAAC,IAAA,EAAM,GAAP,EAArC,CAAA,CAAA;;QAEA,IAAI,MAAA,GAAS,MAAA,CAAO,QAAP,CAAgB,QAAhB,IAA4B,eAAzC,CAAA;QACA,MAAA,GAAS,GAAA,GAAM,MAAA,CAAO,KAAP,CAAa,GAAb,CAAA,CAAkB,MAAlB,CAAyB,CAAC,CAA1B,CAAA,CAA6B,IAA7B,CAAkC,GAAlC,CAAf,CALiD;;QAOjD,OAAA,CAAQ,GAAR,CAAY,oBAAZ,EAAkC,sBAAlC,EACI;YACI,QAAA,EAAU,KADd;YAEI,OAAA,EAAS,IAAI,IAAJ,CAAS,IAAA,CAAK,GAAL,EAAA,GAAa,OAAA,CAAQ,kBAA9B,CAFb;YAGI,MAAA,EAAQ,MAHZ;YAII,SAAA,EAAW,IAJf;YAKI,IAAA,EAAM,GAAA;SANd,CAAA,CAAA;;;QAWA,IAAI,MAAA,CAAO,SAAP,CAAiB,QAAjB,KAA8B,OAA9B,IAAyC,OAA7C,EAAsD;YAClD,MAAA,CAAO,QAAP,CAAgB,MAAhB,EAAA,CAAA;SACH;KACJ;CA/EyB,CAA9B,CAAA;;qBAkFe;;;;;;;;;;;;ACvFf;;;;;;;;;;;;IAEqB,uB;;;;;;;;;;;4BACL;AACR,mBAAO,0BAAP;AACH;;;;EAHgD,SAAS,U;;qBAAzC,uB;;;;;;;;;qBCFN;AAAA,QACX,KADW,QACX,KADW;AAAA,QAEX,KAFW,QAEX,KAFW;AAAA,QAGX,cAHW,QAGX,cAHW;AAAA,QAIX,SAJW,QAIX,SAJW;AAAA,QAKX,oBALW,QAKX,oBALW;AAAA,QAMX,YANW,QAMX,YANW;AAAA,QAOX,oBAPW,QAOX,oBAPW;AAAA,QAQX,kBARW,QAQX,kBARW;AAAA,QASX,qBATW,QASX,qBATW;AAAA,QAUX,eAVW,QAUX,eAVW;AAAA,+HAeD,MAAM,GAAN,CAAU,IAAV,EAfC,+JAmBuC,MAAM,GAAN,CAAU,OAAV,CAnBvC,iCAqBK,MAAM,GAAN,CAAU,QAAV,KAAuB,CAAC,MAAM,UAA9B,wCACuC,MAAM,GAAN,CAC7B,QAD6B,CADvC,cAIM,EAzBX,4BA4BK,MAAM,UAAN,IAAoB,MAAM,GAAN,CAAU,SAAV,CAApB,wCACuC,MAAM,GAAN,CAC7B,SAD6B,CADvC,cAIM,EAhCX,6FAmCK,MAAM,GAAN,CAAU,MAAV,EAAkB,EAnCvB,cAoCU,OAAO,IAAP,CAAY,MAAM,GAAN,CAAU,MAAV,EAAkB,EAA9B,CApCV,sGAuCS,eAAe,MAAf,GAAwB,CAAxB,GACM,OAAO,IAAP,CACI,YACM,0BADN,GAEM,mBAHV,EAII;AACI,4KAER,eAAe,GAAf,CACE,UAAC,aAAD;AAAA,wCACsB,cAAc,GADpC,YAEQ,cAAc,GAAd,CACI,0BADJ,IAGM,UAHN,GAIM,EANd,gDAQM,OAAO,IAAP,CAAY,0BAAZ,EAAwC;AACtC,sBAAM,cAAc,MAAd,CAAqB;AADW,aAAxC,CARN;AAAA,SADF,CAFQ;AADJ,KAJJ,CADN,GAyBM,uBACA,qBACI,OAAO,IAAP,CAAY,+BAAZ,EAA6C;AACzC,cAAM;AADmC,KAA7C,CADJ,GAII,MAAM,GAAN,CAAU,UAAV,IACA,OAAO,IAAP,CAAY,2BAAZ,EAAyC;AACrC,cAAM;AAD+B,KAAzC,CADA,GAIA,OAAO,IAAP,CAAY,qBAAZ,EAAmC;AAC/B,cAAM;AADyB,KAAnC,CATJ,GAYA,eAAe,KAAf,GAAuB,KA5EtC,qIAmFL,gBACG,GADH,CAEM,UAAC,cAAD;AAAA,8FAEoB,eAAe,WAFnC,iBAEwD,eAAe,cAFvE,mFAGkD,eAAe,UAHjE,uHAKwD,eAAe,UALvE;AAAA,KAFN,EASG,IATH,CASQ,EATR,CAnFK,4DAgGP,gNAKM,EArGC,gBAwGP,qDAC0C,OAAO,IAAP,CAChC,0BADgC,CAD1C,cAIM,EA5GC,gGAgHH,uBACM,EADN,qBAEqB,OAAO,IAAP,CACX,YAAY,oBAAZ,GAAmC,aADxB,EAEX,EAAE,OAAO,MAAM,GAAN,CAAU,OAAV,CAAT,EAFW,CAFrB,OAhHG,4FAwHC,YACM,OAAO,IAAP,CAAY,eAAZ,CADN,GAEM,uBACA,OAAO,IAAP,CAAY,oBAAZ,EAAkC;AAC9B,cAAM;AADwB,KAAlC,CADA,GAIA,OAAO,IAAP,CAAY,QAAZ,CA9HP,+CAmIP,sLAGU,OAAO,IAAP,CAAY,WAAZ,CAHV,+CAMM,EAzIC,4GA4I6B,OAAO,IAAP,CAChC,QADgC,CA5I7B,sFA+ID,OAAO,IAAP,CAAY,QAAZ,CA/IC;AAAA,C;;;;;;;;;;;ACAf;;AACA;;;;AACA;;;;AACA;;;;AAEA;;;;;;;;;;;;IAEqB,kB;;;AACjB,sCAAyD;AAAA,YAA3C,GAA2C,QAA3C,GAA2C;AAAA,YAAtC,MAAsC,QAAtC,MAAsC;AAAA,YAA9B,OAA8B,QAA9B,OAA8B;AAAA,kCAArB,SAAqB;AAAA,YAArB,SAAqB,kCAAT,KAAS;;AAAA;;AAAA,6IAC5C,SAD4C;;AAGrD,cAAK,GAAL,GAAW,GAAX;AACA,cAAK,MAAL,GAAc,UAAW,YAAM,CAAE,CAAjC;AACA,cAAK,OAAL,GAAe,WAAY,YAAM,CAAE,CAAnC;AACA,cAAK,SAAL,GAAiB,SAAjB;;AAEA,cAAK,KAAL,GAAa,IAAI,kBAAJ,CAAU,EAAE,OAAO,MAAK,KAAd,EAAV,CAAb;AACA;AACA,cAAK,yBAAL,GAAiC,IAAI,sCAAJ,CAA8B;AAC3D,qBAAS,MAAK,KAAL,CAAW,GAAX,CAAe,IAAf;AADkD,SAA9B,CAAjC;AAGA,cAAK,yBAAL,CACK,SADL,GAEK,IAFL,CAEU,YAAM;AACR,gBAAM,iBACF,MAAK,yBAAL,CAA+B,GAA/B,CAAmC,gBAAnC,CADJ;AAEA,kBAAK,KAAL,CAAW,GAAX,CACI,YADJ,EAEI,MAAK,SAAL,GAAiB,OAAjB,GAA2B,QAF/B;AAIA,kBAAK,UAAL,CAAgB,cAAhB;AACH,SAVL,WAWW,UAAC,KAAD,EAAW;AACd,kBAAK,OAAL,CAAa,KAAb;AACH,SAbL;AAbqD;AA2BxD;;;;mCAEU,c,EAAgB;AAAA;;AACvB,gBAAI,uBAAuB,IAAI,OAAJ,CAAY,UAAC,OAAD,EAAa;AAChD,oBAAI,OAAK,KAAL,CAAW,GAAX,CAAe,UAAf,CAAJ,EAAgC;AAC5B,sBAAE,IAAF,CAAO;AACH,6BAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,aAAzB,EAAwC;AACzC,qCAAS,OAAK,KAAL,CAAW,GAAX,CAAe,IAAf;AADgC,yBAAxC,CADF;AAIH,8BAAM;AAJH,qBAAP,EAMK,IANL,CAMU,UAAC,QAAD,EAAc;AAChB,+BAAK,KAAL,CAAW,GAAX,CAAe,gBAAf,EAAiC,SAAS,WAA1C;AACH,qBARL,EASK,MATL,CASY,YAAM;AACV;AACH,qBAXL;AAYH,iBAbD,MAaO;AACH;AACH;AACJ,aAjB0B,CAA3B;;AAmBA,iCAAqB,IAArB,CAA0B,YAAM;AAC5B,oBAAI,uBACA,OAAK,KAAL,CAAW,kBAAX,IACA,CAAC,CAAC,OAAO,SAAP,CAAiB,8BADnB,IAEA,CAAC,CAAC,OAAO,SAAP,CAAiB,8BAAjB,CACE,OAAK,KAAL,CAAW,GAAX,CAAe,MAAf,EAAuB,EADzB,CAFF,IAKA,CAAC,OAAK,SANV;;AAQA,oBAAI,qBACA,wBACA,OAAK,KAAL,CAAW,YADX,IAEA,CAAC,OAAK,KAAL,CAAW,oBAHhB;;AAKA,oBAAI,8BAAJ;AACA,oBAAI,oBAAJ,EAA0B;AACtB,4CACI,OAAO,SAAP,CAAiB,8BAAjB,CACI,OAAK,KAAL,CAAW,GAAX,CAAe,MAAf,EAAuB,EAD3B,CADJ;AAIH;;AAED,oBAAI,uBACA,OAAK,KAAL,CAAW,kBAAX,IACA,OAAK,KAAL,CAAW,GAAX,CAAe,UAAf,CADA,IAEA,CAAC,OAAK,KAAL,CAAW,GAAX,CAAe,gBAAf,CAFD,IAGA,oBAJJ;;AAMA,oBAAI,aACA,OAAK,KAAL,CAAW,kBAAX,IACA,CAAC,oBADD,IAEA,OAAK,KAAL,CAAW,GAAX,CAAe,UAAf,CAHJ;;AAKA,oBAAI,mBAAJ;AACA,oBAAI,OAAK,SAAT,EAAoB;AAChB,iCAAa,OAAO,IAAP,CAAY,sBAAZ,CAAb;AACH,iBAFD,MAEO,IAAI,oBAAJ,EAA0B;AAC7B,iCAAa,OAAO,IAAP,CAAY,mBAAZ,EAAiC;AAC1C,8BAAM;AADoC,qBAAjC,CAAb;AAGH,iBAJM,MAIA;AACH,iCAAa,OAAO,IAAP,CAAY,QAAZ,CAAb;AACH;;AAED,oBAAM,kBAAkB,EAAxB;AACA,oBAAI,eAAe,OAAK,KAAL,CAAW,UAAX,CAAsB,eAAzC;AACA,oBAAI,OAAO,SAAP,CAAiB,aAAjB,IAAkC,YAAtC,EAAoD;AAAA;AAAA;AAAA;;AAAA;AAChD,6CAAiB,OAAO,SAAP,CAAiB,aAAlC,8HAAiD;AAAA,gCAAtC,EAAsC;;AAC7C,gCAAI,aAAa,EAAb,CAAJ,EAAsB;AAClB,oCAAM,oBAAoB,EAA1B;AACA,kDAAkB,UAAlB,GAA+B,OAAO,IAAP,sBACR,EADQ,SACF,aAAa,EAAb,EAAiB,KADf,aAA/B;AAGA,kDAAkB,UAAlB,GAA+B,OAAO,IAAP,sBACR,EADQ,iBAA/B;AAGA,kDAAkB,WAAlB,GACI,aAAa,EAAb,EAAiB,SADrB;AAEA,kDAAkB,cAAlB,GAAmC,OAAO,IAAP,sBACZ,EADY,0BAE/B;AACI,8CAAU,OAAO,IAAP,sBACa,EADb,SACmB,aAAa,EAAb,EAAiB,KADpC;AADd,iCAF+B,CAAnC;AAQA,gDAAgB,IAAhB,CAAqB,iBAArB;AACH;AACJ;AAtB+C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAuBnD;;AAED,oBAAM,gBAAgB;AAClB,6BAAS,CAAC,oBAAD,EAAuB,OAAvB,CADS;AAElB,2BAAO,UAFW;AAGlB,iCAAa,CAAC,oBAHI;AAIlB,6BAAS,qCAA2B;AAChC,+BAAO,OAAK,KADoB;AAEhC,+BAAO,OAAK,KAFoB;AAGhC,wCAAgB,uBAAuB,EAAvB,GAA4B,cAHZ;AAIhC,mCAAW,OAAK,SAJgB;AAKhC,kEALgC;AAMhC,sCAAc,UANkB;AAOhC,kEAPgC;AAQhC,8DARgC;AAShC,oEATgC;AAUhC;AAVgC,qBAA3B;AAJS,iBAAtB;AAiBA,uBAAK,KAAL,GAAa,IAAI,YAAJ,CAAU,aAAV,CAAb;AACA,oBAAM,WAAW,OAAK,KAAL,CAAW,GAA5B;;AAEA,oBAAI,oBAAJ,EAA0B;AACtB,wBAAI,wBAAJ,CAAgB;AACZ,+BAAO,IADK;AAEZ,iCAAS,IAFG;AAGZ,4BAAI,aAHQ;AAIZ,mCAAW,kBAJC;AAKZ,8BAAM,kBALM;AAMZ,+BAAO,OAAO,IAAP,CAAY,8BAAZ,CANK;AAOZ,6BAAK;AAPO,qBAAhB,EAQG,MARH;;AAUA,wBAAI,wBAAJ,CAAgB;AACZ,+BAAO,KADK;AAEZ,4BAAI,aAFQ;AAGZ,mCAAW,kBAHC;AAIZ,8BAAM,kBAJM;AAKZ,+BAAO,OAAO,IAAP,CAAY,yBAAZ,CALK;AAMZ,6BAAK;AANO,qBAAhB,EAOG,MAPH;AAQH;;AAED,yBAAS,EAAT,CAAY,OAAZ,EAAqB,gBAArB,EAAuC,YAAM;AACzC,2BAAK,KAAL,CAAW,KAAX;AACH,iBAFD;;AAIA,yBAAS,EAAT,CAAY,OAAZ,EAAqB,gBAArB,EAAuC,YAAM;AACzC,wBAAI,8BAAJ;AACA,wBAAI,oBAAJ,EAA0B;AACtB,gDAAwB;AACpB,mCAAO,MADa;AAEpB,sDAA0B,KAFN;AAGpB,2CAAe;AAHK,yBAAxB;AAKH,qBAND,MAMO;AACH,gDACI,eAAe,MAAf,GAAwB,CAAxB,GACM,eACK,GADL,CAEQ,SACK,IADL,CACU,wBADV,EAEK,GAFL,EAFR,EAMK,MANL,EADN,GAQM,eAAe,KAAf,GAAuB,MAAvB,EATV;AAUH;;AAED,2BAAK,KAAL,CAAW,GAAX,CAAe,eAAf,EAAgC,qBAAhC;;AAEA,6BACK,IADL,CACU,gBADV,EAEK,QAFL,CAEc,SAFd,EAGK,MAHL,CAGY,6BAHZ;;AAKA,2BAAK,MAAL,CAAY,OAAK,KAAjB;AACH,iBA7BD;;AA+BA,yBAAS,EAAT,CAAY,OAAZ,EAAqB,cAArB,EAAqC,YAAM;AACvC,2BAAK,KAAL,CAAW,OAAX,CAAmB,cAAnB,EAAmC;AAC/B,gCAAQ,MADuB;AAE/B,+BAAO,OAAK;AAFmB,qBAAnC;AAIA,6BACK,IADL,CACU,cADV,EAEK,QAFL,CAEc,SAFd,EAGK,MAHL,CAGY,6BAHZ;AAIA,2BAAK,GAAL,CAAS,EAAT,CAAY,gBAAZ,EAA8B,YAAM;AAChC,+BAAK,KAAL,CAAW,KAAX;AACH,qBAFD;AAGH,iBAZD;;AAcA,yBAAS,EAAT,CAAY,QAAZ,EAAsB,mBAAtB,EAA2C,UAAC,KAAD,EAAW;AAClD,iCAAa,MAAM,MAAN,CAAa,KAAb,KAAuB,MAApC;AACH,iBAFD;AAGH,aApKD;AAqKH;;;;EAvN2C,SAAS,I;;qBAApC,kB;;;;;;;;;;;ACPrB;;AACA;;;;;;;;;;;;cAEgC,M;IAAxB,M,WAAA,M;IAAQ,G,WAAA,G;IAAK,M,WAAA,M;;IAEA,yB;;;;;;;;;;;mCACN;AACP,mBAAO;AACH,yBAAS,CADN;AAEH,gCAAgB,IAAI,oCAAJ;AAFb,aAAP;AAIH;;;oCAEW;AAAA;;AACR,mBAAO,QAAQ,IAAR,CAAa;AAChB,wBAAQ,KADQ;AAEhB,qBAAK,IAAI,OAAO,mBAAX,EAAgC,EAAC,SAAS,KAAK,GAAL,CAAS,SAAT,CAAV,EAAhC,CAFW;AAGhB,yBAAS;AAHO,aAAb;AAKP;AALO,aAMF,IANE,CAMG,UAAC,QAAD,EAAc;AAChB,uBAAK,GAAL,CAAS,gBAAT,EAA2B,GAA3B,CAA+B,QAA/B;AACA,uBAAO,QAAP;AACH,aATE;AAUH;AAVG,sBAWI,UAAC,KAAD,EAAW;AACd,uBAAO,GAAP,CAAW,OAAX,EAAoB,mDAApB,EAAyE,EAAC,SAAS,OAAK,GAAL,CAAS,SAAT,CAAV,EAA+B,YAA/B,EAAzE;AACA,sBAAM,KAAN;AACH,aAdE,CAAP;AAeH;;;;EAxBkD,SAAS,K;;qBAA3C,yB;;;;;;;;;;ACLrB;;AAEA,IAAM,aAAa,SAAb,UAAa;AAAA,QAAG,GAAH,QAAG,GAAH;AAAA,QAAQ,GAAR,QAAQ,GAAR;AAAA,0BACF,GADE,mDAC+C,8BAAY,GAAZ,CAD/C;AAAA,CAAnB;;AAGA,IAAM,0BAA0B,SAA1B,uBAA0B,CAAC,YAAD,EAAkB;AAC9C,QAAM,MAAM,eACN,+CADM,GAEN,+CAFN;AAGA,WAAO,WAAW,EAAE,KAAK,KAAK,0BAAL,CAAP,EAAyC,QAAzC,EAAX,CAAP;AACH,CALD;;AAOA,IAAM,4BAA4B,SAA5B,yBAA4B,CAAC,YAAD,EAAkB;AAChD,QAAM,MAAM,eACN,iDADM,GAEN,iDAFN;AAGA,WAAO,WAAW,EAAE,KAAK,KAAK,4BAAL,CAAP,EAA2C,QAA3C,EAAX,CAAP;AACH,CALD;;AAOO,IAAM,0BAAS,SAAT,MAAS,CAAC,YAAD;AAAA,6JAGR,wBAAwB,YAAxB,CAHQ,sBAIR,0BAA0B,YAA1B,CAJQ;AAAA,CAAf;;;;;;;;;;ACnBP;;AACA;;AACA;;AAEA,IAAM,OAAO,SAAP,IAAO,CAAC,GAAD;AAAA,WAAS,OAAO,IAAP,CAAY,GAAZ,CAAT;AAAA,CAAb;AACA,IAAM,OAAO,SAAP,IAAO,CAAC,GAAD;AAAA,WAAS,OAAO,IAAP,CAAY,GAAZ,CAAT;AAAA,CAAb;;AAEA,IAAM,YAAY,SAAZ,SAAY;AAAA,WAAM,CAAE,OAAO,SAAP,IAAoB,OAAO,SAAP,CAAiB,OAAtC,IAAkD,IAAnD,EAAyD,WAAzD,EAAN;AAAA,CAAlB;;AAEA,IAAM,gBAAgB,SAAhB,aAAgB,CAAC,iBAAD,EAAoB,mBAApB,EAAyC,YAAzC;AAAA,iSAKU,KAAK,iBAAL,CALV,gFAMS,8BAAY,wBAAZ,CANT,gHASI,KAAK,qBAAL,CATJ,0IAYI,KAAK,oBAAL,CAZJ,wJAiBA,kCAAmB,EAAE,MAAM,iBAAR,EAA2B,0BAA3B,EAAyC,kBAAkB,WAA3D,EAAnB,CAjBA,8BAkBA,oCAAqB,EAAE,MAAM,mBAAR,EAA6B,0BAA7B,EAA2C,kBAAkB,WAA7D,EAArB,CAlBA;AAAA,CAAtB;;AAyBA,IAAM,aAAa,SAAb,UAAa;AAAA,QAAG,QAAH,QAAG,QAAH;AAAA,WACf,WAAW,EAAX,2ZAQkB,KAAK,kCAAL,CARlB,0EADe;AAAA,CAAnB;;AAgBO,IAAM,wCAAgB,SAAhB,aAAgB;AAAA,QACzB,iBADyB,SACzB,iBADyB;AAAA,QACN,mBADM,SACN,mBADM;AAAA,QACe,YADf,SACe,YADf;AAAA,QAC6B,UAD7B,SAC6B,UAD7B;AAAA,QACyC,kBADzC,SACyC,kBADzC;AAAA,QAC6D,QAD7D,SAC6D,QAD7D;AAAA,6DAInB,cAAc,iBAAd,EAAiC,mBAAjC,EAAsD,YAAtD,CAJmB,mBAKnB,aAAa,4BAAO,YAAP,CAAb,GAAoC,EALjB,oBAMnB,qBAAqB,WAAW,EAAE,kBAAF,EAAX,CAArB,GAAgD,EAN7B;AAAA,CAAtB;;;;;;;;;;;AClDP;;;;;;;;;;;;cAC+D,M;IAAvD,c,WAAA,c;IAAgB,G,WAAA,G;IAAK,M,WAAA,M;IAAQ,S,WAAA,S;IAAW,I,WAAA,I;IAAM,I,WAAA,I;;IAEjC,W;;;AAGjB,2BAAc;AAAA;;AAAA,+HACD,SADC;;AAAA,cAFd,QAEc,GAFH,wBAEG;;AAAA,cAwJd,qBAxJc,GAwJU,UAAC,CAAD;AAAA,mBACpB,CAAC,EAAE,KAAF,KAAY,EAAZ,IAAkB,EAAE,KAAF,KAAY,EAA/B,MAAuC,EAAE,cAAF,MAAsB,IAA7D,CADoB;AAAA,SAxJV;;AAGV,cAAK,GAAL,GAAW,KAAK,MAAL,GAAc,QAAd,CAAuB,EAAvB,EAA2B,SAA3B,CAAqC,CAArC,CAAX;;AAEA,cAAK,QAAL,CAAc,MAAK,KAAnB,EAA0B,oBAA1B,EAAgD;AAAA,mBAAM,MAAK,MAAL,EAAN;AAAA,SAAhD;;AAEA,cAAK,MAAL;AAPU;AAQb;;;;iCAEQ;AACL,gBAAI,SAAS;AACT,2CAA2B,cADlB;AAET,6CAA6B,mBAFpB;AAGT,8CAA8B;AAHrB,aAAb;;AAMA,gBAAI,eAAe,SAAf,CAAyB,0BAAzB,CAAJ,EAA0D;AACtD,uBAAO,wBAAP,IAAmC,uBAAnC;AACH;AACD,mBAAO,MAAP;AACH;;;8CAEqB,C,EAAG;AACrB,gBAAI,EAAE,OAAF,KAAc,EAAlB,CAAqB,OAArB,EAA8B;AAC1B,yBAAK,KAAL;AACH;AACJ;;;uCAEc;AACX,iBAAK,KAAL,CAAW,OAAX,CAAmB,cAAnB,EAAmC;AAC/B,wBAAQ,SADuB;AAE/B,uBAAO,KAAK;AAFmB,aAAnC;AAIH;;;0CAEiB,C,EAAG;AACjB,gBAAI,CAAC,OAAO,cAAP,CAAsB,SAAtB,CAAgC,0BAAhC,CAAL,EAAkE;AAC9D,kBAAE,wBAAF;AACH;;AAED,gBAAI,EAAE,OAAF,KAAc,EAAd,IAAoB,EAAE,OAAF,KAAc,EAAtC,EAA0C;AACtC,oBAAI,OAAO,cAAP,CAAsB,SAAtB,CAAgC,0BAAhC,CAAJ,EAAiE;AAC7D,sBAAE,wBAAF;AACH;AACD,qBAAK,KAAL,CAAW,OAAX,CAAmB,cAAnB,EAAmC;AAC/B,4BAAQ,SADuB;AAE/B,2BAAO,KAAK;AAFmB,iBAAnC;AAIH;AACJ;;;yCAmEgB;AACb,gBAAM,OAAO,KAAK,KAAL,CAAW,GAAX,CAAe,MAAf,EAAuB,EAApC;;AAEA,gBAAI,SAAS,WAAT,IAAwB,SAAS,OAArC,EAA8C;AAC1C,uBAAO,KAAK,cAAL,CAAP;AACH,aAFD,MAEO,IAAI,SAAS,OAAb,EAAsB;AACzB,uBAAO,KAAK,aAAL,CAAP;AACH;;AAED,mBAAO,KAAK,YAAL,CAAP;AACH;;;iDAEwB;AACrB,gBAAM,QAAQ,KAAK,KAAL,CAAW,GAAX,CAAe,OAAf,CAAd;AACA,gBAAI,KAAK,KAAL,CAAW,GAAX,CAAe,aAAf,CAAJ,EAAmC;AAC/B,uBAAO,KAAK,4BAAL,EAAmC,EAAE,YAAF,EAAnC,CAAP;AACH,aAFD,MAEO;AACH,uBAAO,KAAK,yBAAL,EAAgC,EAAE,YAAF,EAAhC,CAAP;AACH;AACJ;;;gDAEuB;AACpB,gBAAI,KAAK,KAAL,CAAW,GAAX,CAAe,aAAf,CAAJ,EAAmC;AAC/B,uBAAO,KAAK,uBAAL,CAAP;AACH,aAFD,MAEO;AACH,uBAAO,KAAK,oBAAL,CAAP;AACH;AACJ;;;iCAEQ;AACL,iBAAK,GAAL,CAAS,KAAT,GAAiB,MAAjB,CAAwB,KAAK,QAAL,CAAc,KAAK,SAAnB,CAAxB;;AAEA,mBAAO,IAAP;AACH;;;gCAKO;AACJ,mBAAO,UAAP,CAAkB,IAAlB,CAAuB,QAAvB,CAAgC,KAAhC,CACI,KAAK,GAAL,CAAS,IAAT,CAAc,kBAAd,CADJ;AAGH;;;+BAEM,C,EAAG;AACN,gBAAI,KAAK,qBAAL,CAA2B,CAA3B,CAAJ,EAAmC;AAC/B,uBAAO,UAAP,CAAkB,IAAlB,CAAuB,QAAvB,CAAgC,MAAhC,CACI,KAAK,GAAL,CAAS,IAAT,CAAc,oBAAd,CADJ;AAGH;AACJ;;;4BAnHe;AACZ,gBAAI,kBAAkB,EAAtB;AACA,gBACI,EACI,KAAK,KAAL,CAAW,UAAX,IACA,eAAe,SAAf,CAAyB,iBAAzB,CAFJ,CADJ,EAKE;AACE,oBACI,eAAe,SAAf,CAAyB,gBAAzB,KACA,KAAK,KAAL,CAAW,GAAX,CAAe,gBAAf,CAFJ,EAGE;AACE,sCAAkB,IAAI,OAAO,YAAX,EAAyB;AACvC,8BAAM,UADiC;AAEvC,+BAAO,KAAK,KAAL,CAAW,GAAX,CAAe,gBAAf,EAAiC,QAFD;AAGvC,gCAAQ;AAH+B,qBAAzB,CAAlB;AAKH,iBATD,MASO,IAAI,KAAK,KAAL,CAAW,GAAX,CAAe,QAAf,CAAJ,EAA8B;AACjC,sCAAkB,IAAI,OAAO,YAAX,EAAyB;AACvC,8BAAM,QADiC;AAEvC,+BAAO,KAAK,KAAL,CAAW,GAAX,CAAe,QAAf,CAFgC;AAGvC,gCAAQ;AAH+B,qBAAzB,CAAlB;AAKH;AACJ;;AAED,gBAAI,mBAAmB,KAAvB;AACA,iBAAK,KAAL,CAAW,GAAX,CAAe,SAAf,EAA0B,OAA1B,CAAkC,UAAC,MAAD,EAAY;AAC1C,oBAAI,OAAO,EAAP,KAAc,gBAAlB,EAAoC;AAChC,uCAAmB,IAAnB;AACH;AACJ,aAJD;;AAMA,gBAAI,gBAAgB,KAAK,KAAL,CAAW,UAAX,CAAsB,OAAtB,CAA8B,aAA9B,CAA4C,EAAhE;;AAEA,gBAAM,4BAA0B,OAAO,GAAP,CAC5B,OAAO,MAAP,CAAc,cADc,EAE5B;AACI,oBAAI,KAAK,KAAL,CAAW,GAAX,CAAe,IAAf;AADR,aAF4B,CAA1B,IAKF,oCAAkC,aAAlC,GAAoD,EALlD,CAAN;;AAOA,mBAAO;AACH,yBAAS,KAAK,KAAL,CAAW,GAAX,CAAe,SAAf,CADN;AAEH,0DAFG;AAGH,oBAAI,KAAK,KAAL,CAAW,EAHZ;AAIH,qBAAK,KAAK,GAJP;AAKH,uBAAO,KAAK,KAAL,CAAW,GAAX,CAAe,OAAf,CALJ;AAMH,wBAAQ,KAAK,KAAL,CAAW,GAAX,CAAe,MAAf,EAAuB,EAN5B;AAOH,4BAAY,KAAK,KAAL,CAAW,GAAX,CAAe,QAAf,EAAyB,IAAzB,IAAiC,EAP1C;AAQH,4BAAY,KAAK,cAAL,EART;AASH,2BAAW,QATR;AAUH,oCAAoB,KAAK,sBAAL,EAVjB;AAWH,mCAAmB,KAAK,qBAAL,EAXhB;AAYH,gCACI,UAAU,kBAAV,IACA,CAAC,KAAK,KAAL,CAAW,GAAX,CAAe,mBAAf,CAdF;AAeH,iCAAiB,KAAK,KAAL,CAAW,GAAX,CAAe,aAAf,IACX,gBADW,GAEX,aAjBH;AAkBH,gDAlBG;AAmBH;AAnBG,aAAP;AAqBH;;;;EAtHoC,SAAS,I;;qBAA7B,W;;;;;;;;;;;ACHrB;;;;AACA;;;;AACA;;;;;;;;;;IAEqB,K;;;AACjB,yBAA+D;AAAA,YAAjD,WAAiD,QAAjD,WAAiD;AAAA,YAApC,QAAoC,QAApC,QAAoC;AAAA,uCAA1B,cAA0B;AAAA,YAA1B,cAA0B,uCAAT,KAAS;;AAAA;;AAAA,mHAClD,SADkD;;AAG3D,cAAK,WAAL,GAAmB,EAAE,MAAF,CACf,EAAE,QAAQ,GAAV,EAAe,QAAQ,GAAvB,EAA4B,SAAS,GAArC,EADe,EAEf,WAFe,CAAnB;AAIA,cAAK,QAAL,GAAgB,QAAhB;AACA,cAAK,cAAL,GAAsB,cAAtB;;AAEA,cAAK,QAAL,CAAc,MAAK,KAAnB,EAA0B,QAA1B,EAAoC,MAAK,OAAzC;AACA,cAAK,OAAL;AAX2D;AAY9D;;;;iCAEQ;AACL,cAAE,MAAF,EAAU,GAAV,aAAwB,KAAK,KAAL,CAAW,EAAnC;AACH;;;kCAES;AAAA;;AACN,gBAAM,QAAQ,KAAK,KAAL,CAAW,MAAX,EAAd;AACA,gBAAM,aAAa,OAAO,MAAP,GACb,KAAK,WAAL,CAAiB,MADJ,GAEb,OAAO,MAAP,GACA,KAAK,WAAL,CAAiB,MADjB,GAEA,KAAK,WAAL,CAAiB,OAJvB;AAKA,gBAAM,QAAQ,KAAK,KAAL,CAAW,QAAX,CAAoB,UAApB,CAAd;;AAEA,gBAAI,KAAK,KAAL,CAAW,aAAf,EAA8B;AAC1B,oBAAI,kDAAJ;AACA,qBAAK,GAAL,CAAS,KAAT,GAAiB,MAAjB,CAAwB,MAAxB;AACH,aAHD,MAGO,IAAI,SAAS,MAAM,IAAnB,EAAyB;AAC5B,oBAAI,UAAS,EACT,wBAAc;AACV,gCADU;AAEV,gCACK,SACG,MAAM,YADT,IAEG,MAAM,YAAN,CAAmB,GAFvB,IAGA,SANM;AAOV,yBAAK,SAAS,MAAM,IAPV;AAQV,0BAAM,KAAK,KAAL,CAAW,eARP;AASV,2BAAO,OAAO,IAAP,CAAY,uBAAZ,EAAqC;AACxC,+BAAO,MAAM,KAD2B;AAExC,iCAAS,MAAM;AAFyB,qBAArC,CATG;AAaV,mCACI,MAAM,MAAN,CAAa,IAAb,IAAqB,IAArB,GAA4B,aAA5B,GAA4C,EAdtC;AAeV,4BAAQ,SAAS,MAAM;AAfb,iBAAd,CADS,CAAb;;AAoBA;AACA,wBAAO,IAAP,CAAY,KAAZ,EAAmB,EAAnB,CAAsB,OAAtB,EAA+B,YAAM;AACjC,wBAAI,gBAAgB,KAAK,KAAL,CAChB,KAAK,SAAL,CAAe,OAAK,KAAL,CAAW,UAAX,CAAsB,MAArC,CADgB,CAApB;;AAIA,sBAAE,aAAF,EAAiB,IAAjB,CAAsB,UAAC,KAAD,EAAW;AAC7B,+BAAO,MAAM,IAAb;AACH,qBAFD;;AAIA,2BAAK,KAAL,CAAW,GAAX,CAAe,EAAE,QAAQ,aAAV,EAAf;AACH,iBAVD;;AAYA,qBAAK,GAAL,CAAS,KAAT,GAAiB,MAAjB,CAAwB,OAAxB;AACH,aAnCM,MAmCA,IAAI,KAAK,cAAT,EAAyB;AAC5B,qBAAK,GAAL,CAAS,KAAT,GAAiB,MAAjB,eACgB,KAAK,KAAL,CAAW,eAD3B,0CAEoB,OAAO,IAAP,CAAY,oBAAZ,EAAkC;AAC1C,2BAAO,MAAM;AAD6B,iBAAlC,CAFpB,uCAI4C,8BACpC,wBADoC,CAJ5C;AASH,aAVM,MAUA;AACH,oBAAI,cAAc,KAAK,KAAL,CAAW,UAAX,GACZ,KAAK,KAAL,CAAW,GAAX,CAAe,SAAf,CADY,GAEZ,KAAK,KAAL,CAAW,GAAX,CAAe,kBAAf,CAFN;AAGA,qBAAK,GAAL,CAAS,KAAT,GAAiB,MAAjB,CACI,0BAAgB;AACZ,gCADY;AAEZ,0BAAM,KAAK,KAAL,CAAW,eAFL;AAGZ,8BAAU,KAAK,QAHH;AAIZ,gCAAY,UAJA;AAKZ,iCAAc,aAAa,GAAd,GAAqB,GALtB;AAMZ,iCAAa;AAND,iBAAhB,CADJ;AAUA,kBAAE,MAAF,EAAU,EAAV,aACc,KAAK,KAAL,CAAW,EADzB,EAEI,EAAE,IAAF,CACI,KAAK,eADT,EAEI,IAFJ,EAGI,+CAHJ,EAII,KAAK,KAAL,CAAW,GAAX,CAAe,OAAf,CAJJ,CAFJ;AASA,kBAAE,MAAF,EAAU,EAAV,aACc,KAAK,KAAL,CAAW,EADzB,EAEI,EAAE,IAAF,CACI,KAAK,eADT,EAEI,IAFJ,EAGI,gDAHJ,EAII,WAJJ,CAFJ;AASA,kBAAE,MAAF,EAAU,EAAV,aACc,KAAK,KAAL,CAAW,EADzB,EAEI,EAAE,IAAF,CAAO,KAAK,iBAAZ,EAA+B,IAA/B,CAFJ;;AAKA;AACA,2BAAW,YAAM;AACb,2BAAK,eAAL,CACI,+CADJ,EAEI,OAAK,KAAL,CAAW,GAAX,CAAe,OAAf,CAFJ;AAIA,2BAAK,eAAL,CACI,gDADJ,EAEI,WAFJ;AAIA,2BAAK,iBAAL;AACH,iBAVD,EAUG,CAVH;AAWH;;AAED,mBAAO,IAAP;AACH;;;4CAEmB;AAChB,gBAAM,QAAQ,KAAK,EAAL,CAAQ,aAAR,CAAsB,KAAtB,CAAd;AACA,gBAAI,KAAJ,EAAW;AACP,kBAAE,KAAF,EAAS,MAAT,CAAiB,EAAE,KAAF,EAAS,MAAT,GAAkB,KAAlB,KAA4B,GAA7B,GAAoC,GAApD;AACH;AACJ;;;wCACe,Q,EAAU,S,EAAW;AACjC,gBAAM,UAAU,KAAK,EAAL,CAAQ,aAAR,CAAsB,QAAtB,CAAhB;AACA,gBAAI,OAAJ,EAAa;AACT,wBAAQ,SAAR,GAAoB,SAApB;AACA,oBAAI,SAAS,OAAT,CAAiB,QAAjB,MAA+B,CAAC,CAApC,EAAuC;AACnC,wBAAI,EAAE,OAAF,EAAW,KAAX,KAAqB,GAAzB,EAA8B;AAC1B,0BAAE,OAAF,EAAW,GAAX,CAAe,WAAf,EAA4B,MAA5B;AACH,qBAFD,MAEO,IACH,EAAE,OAAF,EAAW,KAAX,KAAqB,GAArB,IACA,EAAE,OAAF,EAAW,KAAX,MAAsB,GAFnB,EAGL;AACE,0BAAE,OAAF,EAAW,GAAX,CAAe,WAAf,EAA4B,MAA5B;AACH,qBALM,MAKA,IACH,EAAE,OAAF,EAAW,KAAX,KAAqB,GAArB,IACA,EAAE,OAAF,EAAW,KAAX,MAAsB,GAFnB,EAGL;AACE,0BAAE,OAAF,EAAW,GAAX,CAAe,WAAf,EAA4B,MAA5B;AACH,qBALM,MAKA,IAAI,EAAE,OAAF,EAAW,KAAX,MAAsB,GAA1B,EAA+B;AAClC,0BAAE,OAAF,EAAW,GAAX,CAAe,WAAf,EAA4B,MAA5B;AACH;AACJ,iBAhBD,MAgBO,IAAI,SAAS,OAAT,CAAiB,SAAjB,MAAgC,CAAC,CAArC,EAAwC;AAC3C,wBAAI,EAAE,OAAF,EAAW,KAAX,KAAqB,GAAzB,EAA8B;AAC1B,0BAAE,OAAF,EAAW,GAAX,CAAe,WAAf,EAA4B,MAA5B;AACH,qBAFD,MAEO,IACH,EAAE,OAAF,EAAW,KAAX,KAAqB,GAArB,IACA,EAAE,OAAF,EAAW,KAAX,MAAsB,GAFnB,EAGL;AACE,0BAAE,OAAF,EAAW,GAAX,CAAe,WAAf,EAA4B,MAA5B;AACH,qBALM,MAKA,IACH,EAAE,OAAF,EAAW,KAAX,KAAqB,GAArB,IACA,EAAE,OAAF,EAAW,KAAX,MAAsB,GAFnB,EAGL;AACE,0BAAE,OAAF,EAAW,GAAX,CAAe,WAAf,EAA4B,MAA5B;AACH,qBALM,MAKA,IAAI,EAAE,OAAF,EAAW,KAAX,MAAsB,GAA1B,EAA+B;AAClC,0BAAE,OAAF,EAAW,GAAX,CAAe,WAAf,EAA4B,MAA5B;AACH;AACJ;AACD,oBACI,QAAQ,YAAR,GAAuB,CAAvB,IACA,QAAQ,YAAR,GAAuB,QAAQ,YAFnC,EAGE;AACE,wBAAI,OAAO,QAAQ,SAAnB;AACA,2BAAU,KAAK,OAAL,CAAa,OAAb,EAAsB,EAAtB,CAAV,SAFF,CAE4C;AAC1C,2BACI,SAAS,KAAT,IACA,QAAQ,YAAR,GAAuB,QAAQ,YAFnC,EAGE;AACE,+BAAO,KAAK,OAAL,CAAa,mBAAb,EAAkC,IAAlC,CAAP,CADF,CACkD;AAChD,gCAAQ,SAAR,GAAoB,IAApB;AACH;AACD;AACH;AACJ;AACJ;;;;EA7L8B,SAAS,I;;qBAAvB,K;;;;;;;;;;;ACJrB;;;;AACA;;;;;;;;IAEqB,c;AAEjB,8BAAc;AAAA;;AACV,UAAE,MAAF,CAAS,IAAT,EAAe,SAAS,MAAxB;;AAEA,aAAK,KAAL,GAAsB,IAAI,4BAAJ,EAAtB;AACA,aAAK,MAAL,GAAsB,EAAtB;AACA,aAAK,WAAL,GAAsB,EAAtB;AACH;;;;oCAEW,I,EAAM,O,EAAS;AACvB,mBAAO,KAAK,MAAL,CAAY,EAAE,MAAF,CAAS,EAAT,EAAa,EAAE,OAAO,IAAT,EAAb,EAA8B,OAA9B,CAAZ,CAAP;AACH;;;+BAEM,U,EAAY,O,EAAS;AACxB,mBAAO,KAAK,MAAL,CAAY,EAAE,MAAF,CAAS,EAAT,EAAa,UAAb,EAAyB,OAAzB,CAAZ,CAAP;AACH;;;4CAEmB,E,EAAI,O,EAAS;AAC7B,mBAAO,KAAK,MAAL,CAAY,EAAE,MAAF,CAAS,EAAT,EAAa,EAAE,cAAc,EAAhB,EAAb,EAAmC,OAAnC,CAAZ,CAAP;AACH;;;oDAE2B,iB,EAAmB,O,EAAS;AACpD,mBAAO,KAAK,MAAL,CAAY,EAAE,MAAF,CAAS,EAAT,EAAa,iBAAb,EAAgC,OAAhC,CAAZ,CAAP;AACH;;AAED;;;;6CACqB;AACjB,iBAAK,OAAL,CAAa,YAAb,EAA2B,IAA3B,EAAiC,EAAE,iBAAiB,IAAnB,EAAjC;;AAEA,gBAAI,gBAAgB;AAChB,uBAAc,EADE;AAEhB,wBAAc,EAFE;AAGhB,6BAAc;AAHE,aAApB;;AAMA,iBAAK,UAAL,CAAgB,aAAhB,EAA+B,WAA/B;;AAEA,iBAAK,OAAL,CAAa,UAAb,EAAyB,IAAzB;;AAEA,mBAAO,QAAQ,OAAR,CAAgB,aAAhB,CAAP;AACH;;AAED;;;;;;;+BAIO,U,EAAY;AAAA;;AAEf,gBAAI,CAAC,UAAL,EAAgB;AACZ,6BAAa,EAAb;AACH;;AAED;AACA,gBAAI,CAAC,WAAW,cAAZ,IAA8B,CAAC,WAAW,OAA9C,EAAsD;AAClD,2BAAW,cAAX,GAA4B,OAAO,SAAP,CAAiB,eAA7C;AACH;;AAED,gBAAI,OAAO,cAAP,CAAsB,SAAtB,CAAgC,UAAhC,KAA+C,WAAW,OAA9D,EAAsE;AAClE,oBAAM,QAAQ,CAAC,aAAD,EAAgB,aAAhB,EAA+B,OAA/B,EAAwC,QAAxC,EAAkD,YAAlD,EAAgE,gBAAhE,EAAkF,kBAAlF,CAAd;AACA,2BAAW,MAAX,GAAoB,MAAM,KAAK,KAAL,CAAW,KAAK,MAAL,KAAgB,MAAM,MAAjC,CAAN,CAApB;AACH;;AAED,gBAAI,kBAAkB,IAAI,4BAAJ,CAAoB,UAApB,CAAtB;;AAEA,gBAAI,CAAC,CAAC,OAAO,SAAP,CAAiB,iBAAvB,EAA0C;AACtC,gCAAgB,iBAAhB,GAAoC,IAApC;AACH;;AAED,iBAAK,OAAL,CAAa,YAAb,EAA2B,IAA3B,EAAiC,EAAE,gCAAF,EAAjC;;AAEA,mBAAO,IAAI,OAAJ,CAAY,UAAC,OAAD,EAAU,MAAV,EAAqB;AACpC,kBAAE,IAAF,CAAO;AACH,yBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,IAAd,CAAmB,KAAnB,CAAyB,KAApC,CADF;AAEH,4BAAU,MAFP;AAGH,8BAAU,MAHP;AAIH,iCAAa,iCAJV;AAKH,0BAAU,KAAK,SAAL,CAAe,gBAAgB,SAAhB,EAAf,CALP;AAMH,6BAAS;AANN,iBAAP,EAQC,IARD,CAQM,UAAC,IAAD,EAAO,UAAP,EAAmB,KAAnB,EAA6B;AAC/B,wBAAI,OAAO,cAAP,CAAsB,SAAtB,CAAgC,UAAhC,KAA+C,WAAW,OAA9D,EAAsE;AAClE,6BAAK,KAAL,GAAa,KAAK,KAAL,IAAc,EAAE,OAAF,CAAU,KAAK,KAAf,CAA3B;AACH;AACD,wBAAI,OAAO,cAAP,CAAsB,SAAtB,CAAgC,yBAAhC,KAA8D,KAAK,KAAvE,EAA8E;AAC1E,6BAAK,KAAL,GAAa,KAAK,KAAL,CAAW,MAAX,CAAkB,UAAC,CAAD;AAAA,mCAAO,EAAE,OAAF,KAAc,IAArB;AAAA,yBAAlB,CAAb;AACH;AACD,0BAAK,UAAL,CAAgB,IAAhB,EAAsB,UAAtB,EAAkC,KAAlC;AACA,0BAAK,OAAL,CAAa,UAAb,EAAyB,KAAzB;AACA,4BAAQ,IAAR;AACH,iBAlBD,EAmBC,IAnBD,CAmBM,UAAC,KAAD,EAAQ,UAAR,EAAoB,WAApB,EAAoC;AACtC,0BAAK,UAAL,CAAgB,KAAhB,EAAuB,UAAvB,EAAmC,WAAnC;AACA,0BAAK,OAAL,CAAa,UAAb,EAAyB,KAAzB;AACA,2BAAO,KAAP;AACH,iBAvBD;AAwBH,aAzBM,CAAP;AA0BH;;;mCAEU,I,EAAM,U,EAAY,K,EAAO;AAChC,iBAAK,KAAL,CAAW,KAAX,CAAiB,KAAK,KAAtB;AACA,iBAAK,OAAL,CAAa,cAAb,EAA6B,IAA7B,EAAmC,EAAE,UAAF,EAAQ,sBAAR,EAAoB,YAApB,EAAnC;AACH;;;mCAEU,K,EAAO,U,EAAY,W,EAAa;AACvC,iBAAK,OAAL,CAAa,WAAb,EAA0B,IAA1B,EAAgC,EAAE,YAAF,EAAS,sBAAT,EAAqB,wBAArB,EAAhC;AACH;;;;;;qBA1GgB,c;;;;;;;;;;;;;;;;;ICHA,iB;;;AACjB,qCAA8C;AAAA,6BAAhC,IAAgC;AAAA,YAAhC,IAAgC,6BAAzB,MAAyB;AAAA,YAAjB,MAAiB,QAAjB,MAAiB;AAAA,YAAT,KAAS,QAAT,KAAS;;AAAA;;AAAA,2IACjC,SADiC;;AAAA,cA2E9C,aA3E8C,GA2E9B,UAAC,CAAD;AAAA,mBACZ,CAAC,EAAE,IAAF,KAAW,OAAX,IAAsB,EAAE,KAAF,KAAY,EAAlC,IAAwC,EAAE,KAAF,KAAY,EAArD,MACC,EAAE,cAAF,MAAsB,IADvB,CADY;AAAA,SA3E8B;;AAG1C,cAAK,IAAL,GAAY,IAAZ;;AAEA,cAAK,eAAL,GAAuB,KAAvB;AACA,YAAI,CAAC,CAAC,MAAN,EAAc;AACV,kBAAK,MAAL,GAAc,MAAd;AACA,kBAAK,eAAL,GAAuB,IAAvB;AACH;;AAED,cAAK,KAAL,GAAa,KAAb;;AAEA,cAAK,OAAL,GAAe,EAAE,YAAF,CAAf;;AAEA,cAAK,QAAL,CAAc,MAAK,KAAnB,EAA0B,mBAA1B,EAA+C,MAAK,MAApD;;AAEA,cAAK,MAAL;AAjB0C;AAkB7C;;;;iCAcQ;AACL,iBAAK,OAAL,CAAa,GAAb;AACA,iBAAK,GAAL,CAAS,GAAT;;AAEA,gBAAI,aAAa,KAAK,cAAL,EAAjB;AACA,gBAAI,EAAE,WAAW,IAAb,EAAmB,OAAnB,EAAJ,EAAkC;AAC9B,qBAAK,OAAL,GAAe,EAAE,YAAF,EAAgB,UAAhB,CAAf;AACH,aAFD,MAEO;AACH,qBAAK,OAAL,GAAe,EAAE,OAAF,EAAW,UAAX,CAAf;AACH;;AAED;AACA;AACA;AACA,gBAAI,EAAE,WAAW,IAAb,EAAmB,OAAnB,MAAgC,KAAK,eAAzC,EAA0D;AACtD,qBAAK,oBAAL,CAA0B,KAAK,OAA/B;AACH;;AAED,iBAAK,GAAL,CAAS,KAAT,GAAiB,MAAjB,CAAwB,KAAK,OAA7B;;AAEA,mBAAO,IAAP;AACH;;;kCAEyB;AAAA,gBAAlB,SAAkB,uEAAN,IAAM;;AACtB,gBAAI,SAAJ,EAAe;AACX,qBAAK,OAAL,CACK,GADL,CACS,oBADT,EAEK,QAFL,CAEc,SAFd,EAGK,IAHL,CAGU,UAHV,EAGsB,SAHtB,EAIK,MAJL,CAIY,6BAJZ;AAKH,aAND,MAMO;AACH,qBAAK,OAAL,CACK,WADL,CACiB,SADjB,EAEK,IAFL,CAEU,UAFV,EAEsB,SAFtB,EAGK,IAHL,CAGU,UAHV,EAIK,MAJL;;AAMA,qBAAK,oBAAL,CAA0B,KAAK,OAA/B;AACH;;AAED,mBAAO,IAAP;AACH;;;6CAMoB,G,EAAK;AAAA;;AACtB,gBAAI,GAAJ,CAAQ,oBAAR;;AAEA,gBAAI,EAAJ,CAAO,yBAAP,EAAkC,UAAC,CAAD,EAAO;AACrC,uBAAK,aAAL,CAAmB,CAAnB,KAAyB,OAAK,MAAL,CAAY,CAAZ,CAAzB;AACH,aAFD;AAGA,gBAAI,EAAJ,CAAO,2BAAP,EAAoC,UAAC,CAAD,EAAO;AACvC,uBAAK,aAAL,CAAmB,CAAnB,KAAyB,OAAK,MAAL,CAAY,CAAZ,CAAzB;AACH,aAFD;AAGH;;;+BAEM,K,EAAO;AACV,iBAAK,aAAL,CAAmB,KAAnB,KAA6B,KAAK,mBAAL,EAA7B;AACH;;;8CAEqB;AAClB,iBAAK,KAAL,CAAW,OAAX,CAAmB,cAAnB,EAAmC;AAC/B,wBAAQ,KAAK,KADkB;AAE/B,uBAAO,KAAK;AAFmB,aAAnC;AAIH;;;+CAEsB;AACnB,gBAAI,OAAO,cAAP,CAAsB,SAAtB,CAAgC,SAAhC,CAAJ,EAAgD;AAC5C,uBAAO,KAAK,KAAL,CAAW,UAAX,CAAsB,IAAtB,CAA2B,EAA3B,KAAkC,WAAlC,GACD,OAAO,IAAP,CAAY,QAAZ,CADC,GAED,OAAO,IAAP,CAAY,MAAZ,CAFN;AAGH;AACD,mBAAO,OAAO,IAAP,CAAY,QAAZ,CAAP;AACH;;;kDAEyB,K,EAAO;AAC7B,gBAAI,OAAO,cAAP,CAAsB,SAAtB,CAAgC,SAAhC,CAAJ,EAAgD;AAC5C,uBAAO,KAAK,KAAL,CAAW,UAAX,CAAsB,IAAtB,CAA2B,EAA3B,KAAkC,WAAlC,GACD,OAAO,IAAP,CAAY,eAAZ,EAA6B,EAAE,YAAF,EAA7B,CADC,GAED,OAAO,IAAP,CAAY,WAAZ,EAAyB,EAAE,YAAF,EAAzB,CAFN;AAGH;AACD,mBAAO,OAAO,IAAP,CAAY,aAAZ,EAA2B,EAAE,YAAF,EAA3B,CAAP;AACH;;;yCAEgB;AACb,gBAAI,cAAc;AACd,iCAAiB,KAAK,KAAL,CAAW,EADd;AAEd,6BAAa,KAAK,KAAL,CAAW,UAAX,CAAsB,IAAtB,CAA2B,EAF1B;AAGd,kCACK,KAAK,KAAL,CAAW,UAAX,CAAsB,IAAtB,CAA2B,EAA3B,IACG,OAAO,IAAP,CAAY,KAAK,KAAL,CAAW,UAAX,CAAsB,IAAtB,CAA2B,EAAvC,CADJ,IAEA,EANU;AAOd,sBAAO,KAAK,OAAL,CAAa,IAAb,IAAqB,KAAK,OAAL,CAAa,IAAb,EAAtB,IAA8C,EAPtC;AAQd,0BAAU;AARI,aAAlB;;AAWA,gBAAI,QAAQ,KAAK,KAAL,CAAW,UAAX,CAAsB,KAAlC;;AAEA,gBAAI,UAAU,CAAC,mBAAD,EAAsB,WAAtB,CAAd;;AAEA,gBAAI,KAAK,QAAT,EAAmB;AAAA;;AACf,qCAAQ,IAAR,iBAAgB,CAAC,QAAD,EAAW,QAAX,EAAqB,WAArB,EAAkC,WAAlC,CAAhB;AACH;;AAED,gBAAI,KAAK,KAAL,KAAe,MAAnB,EAA2B;AACvB,wBAAQ,IAAR,CAAa,MAAb;AACH;;AAED,oBAAQ,KAAK,KAAb;AACI,qBAAK,aAAL;AACI,4BAAQ,IAAR,CAAa,wCAAb;AACA,wBAAI,OAAO,cAAP,CAAsB,SAAtB,CAAgC,SAAhC,CAAJ,EAAgD;AAC5C,gCAAQ,IAAR,CAAa,qBAAb;AACH;AACD,gCAAY,IAAZ,cAA4B,OAAO,IAAP,CACxB,yBADwB,CAA5B;AAGA;AACJ,qBAAK,MAAL;AACI,4BAAQ,IAAR,CAAa,iBAAb;AACA,gCAAY,IAAZ,cAA4B,OAAO,IAAP,CAAY,YAAZ,CAA5B;AACA;AACJ,qBAAK,SAAL;AACI,wBAAI,KAAK,MAAT,EAAiB;AACb,gCAAQ,IAAR,CAAa,iBAAb;AACH;;AAED,4BAAQ,IAAR,CAAa,iCAAb;AACA,gCAAY,IAAZ,cAA4B,OAAO,IAAP,CACxB,kBADwB,CAA5B;AAGA,gCAAY,YAAZ,IAA4B,OAAO,IAAP,CACxB,uBADwB,EAExB,EAAE,YAAF,EAFwB,CAA5B;AAIA;AACJ,qBAAK,QAAL;AACI,wBAAI,KAAK,MAAT,EAAiB;AACb,gCAAQ,IAAR,CAAa,iBAAb;AACH;;AAED,4BAAQ,IAAR,CAAa,+BAAb;AACA,gCAAY,IAAZ,cAA4B,KAAK,oBAAL,EAA5B;AACA,gCAAY,YAAZ,IACI,KAAK,yBAAL,CAA+B,KAA/B,CADJ;AAEA;AACJ,qBAAK,UAAL;AACI,wBAAI,OAAO,cAAP,CAAsB,SAAtB,CAAgC,SAAhC,CAAJ,EAAgD;AAC5C,gCAAQ,IAAR,CAAa,iBAAb;AACA,oCAAY,IAAZ,cAA4B,OAAO,IAAP,CACxB,UADwB,CAA5B;AAGA,oCAAY,IAAZ,GAAmB,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,aAAzB,EAAwC;AACvD,oCAAQ,KAAK,KAAL,CAAW,UAAX,CAAsB,OAAtB,CAA8B,CAA9B,EAAiC,EADc;AAEvD,qCAAS,KAAK,KAAL,CAAW;AAFmC,yBAAxC,CAAnB;AAIA,oCAAY,YAAZ,IAA4B,OAAO,IAAP,CAAY,eAAZ,EAA6B;AACrD,uCAAW;AAD0C,yBAA7B,CAA5B;AAGA,oCAAY,MAAZ,GAAqB,QAArB;AACA,oCAAY,GAAZ,GAAkB,YAAlB;AACH,qBAdD,MAcO;AACH,gCAAQ,IAAR,CAAa,yBAAb;AACA,oCAAY,IAAZ,cAA4B,OAAO,IAAP,CACxB,WADwB,CAA5B;AAGA,oCAAY,IAAZ,GAAmB,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,YAAzB,CAAnB;AACH;AACD;AACJ,qBAAK,MAAL;AACI,wBAAI,KAAK,MAAT,EAAiB;AACb,gCAAQ,IAAR,CAAa,uBAAb;AACH;;AAED,4BAAQ,IAAR,CAAa,iBAAb;AACA,gCAAY,IAAZ,cAA4B,OAAO,IAAP,CAAY,YAAZ,CAA5B;AACA,gCAAY,YAAZ,IAA4B,OAAO,IAAP,CAAY,mBAAZ,EAAiC;AACzD;AADyD,qBAAjC,CAA5B;AAGA;AACJ,qBAAK,QAAL;AACI,wBAAI,KAAK,QAAT,EAAmB;AACf,gCAAQ,IAAR,CAAa,SAAb;AACH;;AAED,4BAAQ,IAAR,CAAa,qBAAb;AACA,gCAAY,IAAZ,cAA4B,OAAO,IAAP,CAAY,WAAZ,CAA5B;AACA,gCAAY,IAAZ,GAAmB,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,YAAzB,CAAnB;AACA;AACJ,qBAAK,OAAL;AACI,4BAAQ,IAAR,CAAa,wBAAb;AACA,8BAAU,QAAQ,MAAR,CAAe,UAAC,CAAD;AAAA,+BAAO,MAAM,WAAb;AAAA,qBAAf,CAAV;AACA,gCAAY,IAAZ,gEAA8E,OAAO,IAAP,CAC1E,oBAD0E,EAE1E,EAAE,OAAO,EAAT,EAF0E,CAA9E;AAIA;AACJ,qBAAK,cAAL;AACI,4BAAQ,IAAR,CAAa,+BAAb;AACA,8BAAU,QAAQ,MAAR,CAAe,UAAC,CAAD;AAAA,+BAAO,MAAM,WAAb;AAAA,qBAAf,CAAV;AACA,gCAAY,IAAZ,gEAA8E,OAAO,IAAP,CAC1E,2BAD0E,CAA9E;AAGA;AACJ,qBAAK,WAAL;AACI,4BAAQ,IAAR,CAAa,4BAAb;AACA,8BAAU,QAAQ,MAAR,CAAe,UAAC,CAAD;AAAA,+BAAO,MAAM,WAAb;AAAA,qBAAf,CAAV;AACA,gCAAY,IAAZ,gEAA8E,OAAO,IAAP,CAC1E,wBAD0E,CAA9E;AAGA;AACJ,qBAAK,SAAL;AACI,4BAAQ,IAAR,CAAa,0BAAb;AACA,8BAAU,QAAQ,MAAR,CAAe,UAAC,CAAD;AAAA,+BAAO,MAAM,WAAb;AAAA,qBAAf,CAAV;AACA,gCAAY,IAAZ,gEAA8E,OAAO,IAAP,CAC1E,sBAD0E,CAA9E;AAGA;AACJ,qBAAK,WAAL;AACI,4BAAQ,IAAR,CAAa,cAAb;AACA,gCAAY,IAAZ,cAA4B,OAAO,IAAP,CAAY,WAAZ,CAA5B;AACA,gCAAY,IAAZ,GAAmB,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,aAAzB,EAAwC;AACvD,gCAAQ,qBAD+C;AAEvD,iCAAS,KAAK,KAAL,CAAW;AAFmC,qBAAxC,CAAnB;AAIA,gCAAY,MAAZ,GAAqB,QAArB;AACA,gCAAY,GAAZ,GAAkB,YAAlB;AACA;AACJ,qBAAK,SAAL;AACI,4BAAQ,IAAR,CAAa,YAAb;AACA,gCAAY,IAAZ,cAA4B,OAAO,IAAP,CAAY,SAAZ,CAA5B;AACA,gCAAY,IAAZ,GAAmB,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,aAAzB,EAAwC;AACvD,gCAAQ,iBAD+C;AAEvD,iCAAS,KAAK,KAAL,CAAW;AAFmC,qBAAxC,CAAnB;AAIA,gCAAY,MAAZ,GAAqB,QAArB;AACA,gCAAY,GAAZ,GAAkB,YAAlB;AACA;AACJ,qBAAK,UAAL;AACI,wBAAI,KAAK,MAAT,EAAiB;AACb,gCAAQ,IAAR,CAAa,uBAAb;AACH;;AAED,4BAAQ,IAAR,CAAa,aAAb;AACA,gCAAY,IAAZ,cAA4B,OAAO,IAAP,CAAY,UAAZ,CAA5B;AACA,gCAAY,IAAZ,GAAmB,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,aAAzB,EAAwC;AACvD,gCAAQ,KAAK,KAAL,CAAW,GAAX,CAAe,gBAAf,CAD+C;AAEvD,iCAAS,KAAK,KAAL,CAAW;AAFmC,qBAAxC,CAAnB;AAIA;AACJ,qBAAK,SAAL;AACI,wBAAI,KAAK,MAAT,EAAiB;AACb,4BAAI,aAAa,EAAE,OAAO,uBAAT,CAAjB;AACA,mCAAW,GAAX,CAAe,OAAf,EAAwB,SAAxB;AACA,oCAAY,IAAZ,GAAmB,UAAnB;AACA;AACH;;AAED,4BAAQ,IAAR,CAAa,mBAAb;AACA,gCAAY,QAAZ,GAAuB,IAAvB;AACA,gCAAY,IAAZ,GACI,iDADJ;AAEA;AA1JR;;AA6JA,mCAAoB,QAAQ,IAAR,CAAa,GAAb,CAApB;;AAEA,mBAAO,WAAP;AACH;;;4BA3Rc;AACX,mBAAO,KAAK,IAAL,KAAc,QAArB;AACH;;;4BAEY;AACT,mBAAO,KAAK,IAAL,KAAc,MAArB;AACH;;;4BAEW;AACR,mBAAO,KAAK,KAAL,CAAW,GAAX,CAAe,YAAf,CAAP;AACH;;;;EA/B0C,SAAS,I;;qBAAnC,iB;;;;;;;;;;;;;ACArB;;;;AAEA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;;;;;;;;;IAEqB,S;;;;;4BACD;AACZ,mBAAO,uBAAP;AACH;;;AAID,6BAA+C;AAAA,YAAjC,WAAiC,QAAjC,WAAiC;AAAA,iCAApB,QAAoB;AAAA,YAApB,QAAoB,iCAAT,KAAS;;AAAA;;AAAA,2HAClC,SADkC;;AAAA,cAF/C,QAE+C,GAFpC,sBAEoC;;AAE3C,cAAK,MAAL,GAAc,EAAd;;AAEA,cAAK,WAAL,GAAmB,WAAnB;AACA,cAAK,QAAL,GAAgB,QAAhB;;AAEA,cAAK,MAAL;AAP2C;AAQ9C;;;;iCAEQ;AAAA,gBACG,KADH,GACoC,IADpC,CACG,KADH;AAAA,gBACU,WADV,GACoC,IADpC,CACU,WADV;AAAA,gBACuB,QADvB,GACoC,IADpC,CACuB,QADvB;;;AAGL,iBAAK,GAAL,CAAS,KAAT;;AAEA,iBAAK,MAAL,CAAY,OAAZ,CAAoB,UAAC,IAAD;AAAA,uBAAU,KAAK,MAAL,EAAV;AAAA,aAApB;AACA,iBAAK,MAAL,GAAc,EAAd;;AAEA,gBAAM,OAAO,EACT,KAAK,QAAL,CAAc;AACV,6BAAa,OAAO,cAAP,CAAsB,SAAtB,CAAgC,SAAhC,IACP,QADO,GAEP;AAHI,aAAd,CADS,CAAb;;AAQA;AACA,gBAAI,KAAK,KAAL,CAAW,aAAf,EAA8B;AAC1B,qBAAK,GAAL,CAAS,QAAT,CAAkB,aAAlB;AACH;;AAED,gBAAI,CAAC,OAAO,cAAP,CAAsB,SAAtB,CAAgC,SAAhC,CAAL,EAAiD;AAC7C,qBAAK,MAAL,CAAY,IAAZ,CACK,KAAK,cAAL,GAAsB,IAAI,2BAAJ,CAAmB;AACtC,gCADsC;AAEtC,wBAAI,KAAK,IAAL,CAAU,iBAAV;AAFkC,iBAAnB,CAD3B;AAMH;;AAED,iBAAK,MAAL,CAAY,IAAZ,CACK,KAAK,KAAL,GAAa,IAAI,kBAAJ,CAAU;AACpB,4BADoB;AAEpB,oBAAI,KAAK,IAAL,CAAU,aAAV,CAFgB;AAGpB,wCAHoB;AAIpB;AAJoB,aAAV,CADlB;;AASA,iBAAK,MAAL,CAAY,IAAZ,CACK,KAAK,SAAL,GAAiB,IAAI,sBAAJ,CAAc;AAC5B,4BAD4B;AAE5B,oBAAI,KAAK,IAAL,CAAU,YAAV;AAFwB,aAAd,CADtB;;AAOA,iBAAK,MAAL,CAAY,IAAZ,CACK,KAAK,iBAAL,GAAyB,IAAI,8BAAJ,CAAsB;AAC5C,4BAD4C;AAE5C,oBAAI,KAAK,IAAL,CAAU,cAAV;AAFwC,aAAtB,CAD9B;;AAOA,gBACI,CAAC,OAAO,cAAP,CAAsB,SAAtB,CAAgC,gBAAhC,CAAD,IACA,EACI,OAAO,cAAP,CAAsB,SAAtB,CAAgC,iBAAhC,KACA,KAAK,KAAL,CAAW,UAFf,CADA,IAKA,CAAC,OAAO,cAAP,CAAsB,SAAtB,CAAgC,iBAAhC,CANL,EAOE;AACE,qBAAK,MAAL,CAAY,IAAZ,CACK,KAAK,cAAL,GAAsB,IAAI,2BAAJ,CAAmB;AACtC,gCADsC;AAEtC,wBAAI,KAAK,IAAL,CAAU,gBAAV,CAFkC;AAGtC,0BAAM;AAHgC,iBAAnB,EAIpB,MAJoB,EAD3B;AAOH;;AAED,iBAAK,GAAL,CAAS,MAAT,CAAgB,IAAhB;;AAEA,mBAAO,IAAP;AACH;;;iCAEQ;AACL,iBAAK,MAAL,CAAY,OAAZ,CAAoB,UAAC,IAAD;AAAA,uBAAU,KAAK,MAAL,EAAV;AAAA,aAApB;AACA;AACH;;;;EA/FkC,SAAS,I;;qBAA3B,S;;;;;;;;;;;;;ACRrB;;;;AACA;;;;AAEA;;;;AACA;;;;;;;;;;;;;;AACA,IAAM,KAAK,QAAQ,IAAR,CAAX;AACA;;IACqB,mB;;;AAEjB,uCAA8F;AAAA,YAAhF,GAAgF,QAAhF,GAAgF;AAAA,YAA3E,qBAA2E,QAA3E,qBAA2E;AAAA,YAApD,IAAoD,QAApD,IAAoD;AAAA,YAA9C,UAA8C,QAA9C,UAA8C;AAAA,YAAlC,WAAkC,QAAlC,WAAkC;AAAA,YAArB,QAAqB,QAArB,QAAqB;AAAA,YAAX,OAAW,QAAX,OAAW;;AAAA;;AAAA,+IACjF,SADiF;;AAG1F,cAAK,MAAL,GAAsB,EAAtB;;AAEA,cAAK,GAAL,GAAsB,GAAtB;AACA,cAAK,IAAL,GAAsB,QAAQ,sBAA9B;AACA,cAAK,UAAL,GAAsB,EAAE,MAAF,CAAS,EAAT,EAAa,UAAb,CAAtB;AACA,cAAK,WAAL,GAAsB,WAAtB;AACA,cAAK,QAAL,GAAsB,QAAtB;AACA,cAAK,OAAL,GAAsB,OAAtB;;AAEA,cAAK,YAAL,GAAsB,IAAI,yBAAJ,CAAiB,EAAE,KAAK,MAAK,GAAZ,EAAiB,gBAAjB,EAAjB,CAAtB;;AAEA,cAAK,QAAL,CAAc,MAAK,UAAnB,EAA+B,cAA/B,EAA+C,MAAK,kBAApD;;AAEA;AACA;AACA;AACA,YAAI,yBAAyB,OAAO,SAAP,CAAiB,eAA1C,IAA6D,OAAO,SAAP,CAAiB,cAAlF,EAAkG;AAC9F,kCACK,YADL,GAEK,IAFL,CAEU,UAAC,UAAD,EAAgB;AAClB,sBAAK,kBAAL,CAAwB,UAAxB;AACH,aAJL;AAKH;;AAED,cAAK,MAAL;AA3B0F;AA4B7F;;;;kDAKqC;AAAA,gBAAjB,MAAiB,SAAjB,MAAiB;AAAA,gBAAT,KAAS,SAAT,KAAS;;AAClC,iBAAK,YAAL,CAAkB,OAAlB,CAA0B,MAA1B,EAAkC,KAAlC;AACH;;;2CAEkB,U,EAAY;AAAA;;AAC3B,gBAAI,MAAM,EAAV;AACA,cAAE,EAAE,MAAF,CAAS,UAAT,CAAF,EAAwB,IAAxB,CAA6B,UAAC,IAAD,EAAU;AACnC,oBAAI,EAAE,OAAF,CAAU,IAAV,CAAJ,EAAqB;AAAA;;AACjB,iCAAI,IAAJ,gCAAY,IAAZ;AACH,iBAFD,MAEO,IAAI,EAAE,QAAF,CAAW,IAAX,CAAJ,EAAsB;AAAA;;AACzB,kCAAI,IAAJ,iCAAY,EAAE,IAAF,CAAO,IAAP,EAAa,GAAb,CAAiB,MAAjB,CAAZ;AACH,iBAFM,MAEA;AACH,wBAAI,IAAJ,CAAS,IAAT;AACH;AACJ,aARD;AASA,kBAAM,EAAE,IAAF,CAAO,GAAP,CAAN;;AAEA,gBAAI,OAAJ,CAAY,UAAC,EAAD,EAAQ;AAChB,oBAAM,QAAQ,OAAK,UAAL,CAAgB,GAAhB,CAAoB,EAApB,CAAd;;AAEA,oBAAI,KAAJ,EAAW;AACP,0BAAM,iBAAN,CAAwB,UAAxB;AACH;AACJ,aAND;;AAQA,iBAAK,uBAAL;AACH;;;iCAEQ;AAAA;;AACL,gBAAI,OAAO,SAAS,sBAAT,EAAX;;AAEA,iBAAK,MAAL,CAAY,OAAZ,CAAoB,UAAC,IAAD;AAAA,uBAAU,KAAK,MAAL,EAAV;AAAA,aAApB;AACA,iBAAK,MAAL,GAAc,EAAd;;AAEA,iBAAK,UAAL,CAAgB,OAAhB,CAAwB,UAAC,KAAD,EAAW;;AAE/B,sBAAM,GAAN,CAAU,OAAV,EAAmB,GAAG,MAAH,CAAU,MAAM,GAAN,CAAU,OAAV,CAAV,CAAnB;;AAEA,sBAAM,UAAN,CAAiB,OAAK,OAAtB;;AAEA,oBAAI,OAAO,IAAI,OAAK,IAAT,CAAc;AACrB,2BAAc,KADO;AAErB,yBAAc,OAAK,GAFE;AAGrB,iCAAc,OAAK,WAHE;AAIrB,8BAAc,OAAK;AAJE,iBAAd,CAAX;;AAOA,qBAAK,WAAL,CACI,EAAE,QAAF,EAAY;AACR,6BAAO;AADC,iBAAZ,EAEG,MAFH,CAEU,KAAK,GAFf,EAEoB,CAFpB,CADJ;;AAMA,uBAAK,MAAL,CAAY,IAAZ,CAAiB,IAAjB;AACH,aApBD;;AAsBA,gBAAI,CAAC,OAAO,cAAP,CAAsB,SAAtB,CAAgC,6BAAhC,CAAL,EAAoE;AAChE;AACA;AACA,oBAAM,mBAAmB,EAAE,6BAAF,CAAzB;AACA,qBAAK,GAAL,CAAS,IAAT,CAAc,KAAK,UAAnB;AACA,qBAAK,GAAL,CAAS,KAAT,GAAiB,MAAjB,CAAwB,gBAAxB,EAA0C,MAA1C,CAAiD,IAAjD;AACH,aAND,MAMO;AACH,qBAAK,GAAL,CAAS,IAAT,CAAc,KAAK,UAAnB;AACA,qBAAK,GAAL,CAAS,KAAT,GAAiB,MAAjB,CAAwB,IAAxB;AACH;AACJ;;;iCAEQ;AACL,iBAAK,MAAL,CAAY,OAAZ,CAAoB,UAAC,IAAD;AAAA,uBAAU,KAAK,MAAL,EAAV;AAAA,aAApB;AACA;AACH;;;kDAEyB;AACtB,gBAAI,OAAO,SAAP,CAAiB,eAAjB,IAAoC,OAAO,SAAP,CAAiB,cAArD,IAAuE,yBAAY,GAAZ,CAAgB,QAAhB,CAA3E,EAAsG;AAClG,oBAAM,kBAAkB,IAAI,mCAAJ,CAA2B,KAAK,UAAhC,EAA4C,KAAK,GAAjD,CAAxB;AACA,gCAAgB,aAAhB;AACA,uBAAO,eAAP,GAAyB,eAAzB;AACH;AACJ;;;4BAnFa;AACV,mBAAO,IAAP;AACH;;;;EAjC4C,SAAS,I;;qBAArC,mB;;;;;;;;ACPrB,IAAM,WAAW,OAAO,QAAxB;;AAEA,IAAM,iBAAiB,SAAS,IAAT,CAAc,MAAd,CAAqB;AACxC,cADwC,wBAC3B;AACT,aAAK,QAAL,CAAc,KAAK,KAAnB,EAA0B,QAA1B,EAAoC,KAAK,MAAzC;;AAEA,aAAK,eAAL,GAAuB,EAAE,SAAF,CAAvB;;AAEA,aAAK,MAAL;AACH,KAPuC;AASxC,UATwC,oBAS/B;AACL,YAAM,IAAI,KAAK,WAAL,EAAV;;AAEA,aAAK,eAAL,GAAuB,EAAE,SAAF,EAAa,EAAE,SAAf,EAA0B,MAA1B,CACnB,EAAE,OAAF,EAAW,EAAE,IAAb,CADmB,CAAvB;AAGA,aAAK,GAAL,CAAS,IAAT,CAAc,KAAK,eAAnB;AACA,aAAK,GAAL,CAAS,IAAT,CAAc,aAAd,EAA6B,MAA7B;;AAEA,eAAO,IAAP;AACH,KAnBuC;AAqBxC,eArBwC,yBAqB1B;AACV,YAAI,SAAS;AACT,uBAAW;AACP,yBAAS,CAAC,kBAAD,EAAqB,WAArB;AADF,aADF;AAIT,kBAAM;AACF,sBAAM,EADJ;AAEF,sBAAM,KAAK,KAAL,CAAW,eAFf;AAGF,0BAAU,CAAC;AAHT;AAJG,SAAb;;AAWA,aAAK,MAAL,GAAc,KAAK,KAAL,CAAW,GAAX,CAAe,YAAf,CAAd;;AAEA,gBAAQ,KAAK,MAAb;AACI,iBAAK,aAAL;AACI,uBAAO,SAAP,CAAiB,OAAjB,CAAyB,IAAzB,CACI,kCADJ;AAGA,uBAAO,IAAP,CAAY,IAAZ,GAAmB,OAAO,IAAP,CAAY,yBAAZ,CAAnB;AACA;AACJ,iBAAK,MAAL;AACI,uBAAO,SAAP,CAAiB,OAAjB,CAAyB,IAAzB,CACI,8CADJ;AAGA,uBAAO,IAAP,CAAY,IAAZ,GAAmB,OAAO,IAAP,CAAY,uBAAZ,CAAnB;AACA;AACJ,iBAAK,QAAL;AACI,uBAAO,SAAP,CAAiB,OAAjB,CAAyB,IAAzB,CACI,gDADJ;AAGA,uBAAO,IAAP,CAAY,IAAZ,GAAmB,OAAO,IAAP,CAAY,uBAAZ,CAAnB;AACA;AACJ,iBAAK,UAAL;AACA,iBAAK,UAAL;AACA,iBAAK,WAAL;AACA,iBAAK,SAAL;AACI,uBAAO,SAAP,CAAiB,OAAjB,CAAyB,IAAzB,CACI,kDADJ;AAGA,uBAAO,IAAP,CAAY,IAAZ,GAAmB,OAAO,IAAP,CAAY,UAAZ,CAAnB;AACA;AACJ,iBAAK,MAAL;AACI,uBAAO,SAAP,CAAiB,OAAjB,CAAyB,IAAzB,CAA8B,2BAA9B;AACA,uBAAO,IAAP,CAAY,IAAZ,GAAmB,KAAK,KAAL,CAAW,GAAX,CAAe,mBAAf,IACb,OAAO,IAAP,CAAY,wBAAZ,CADa,GAEb,OAAO,IAAP,CAAY,sBAAZ,CAFN;AAGA;AACJ,iBAAK,QAAL;AACI,uBAAO,SAAP,CAAiB,OAAjB,CAAyB,IAAzB,CAA8B,6BAA9B;AACA,uBAAO,IAAP,CAAY,IAAZ,GAAmB,OAAO,IAAP,CAAY,QAAZ,CAAnB;AACA;AACJ,iBAAK,SAAL;AACI,uBAAO,SAAP,CAAiB,OAAjB,GAA2B,KAAK,eAAL,CACtB,IADsB,CACjB,OADiB,EAEtB,KAFsB,CAEhB,GAFgB,CAA3B;AAGA,uBAAO,IAAP,CAAY,IAAZ,GAAmB,KAAK,eAAL,CAAqB,IAArB,CAA0B,SAA1B,EAAqC,IAArC,EAAnB;AACA;AA3CR;;AA8CA,eAAO,SAAP,YAAyB,OAAO,SAAP,CAAiB,OAAjB,CAAyB,IAAzB,CAA8B,GAA9B,CAAzB;;AAEA,eAAO,MAAP;AACH;AApFuC,CAArB,CAAvB;;qBAuFe,c;;;;;;;;;;;ACzFf;;;;;;;;;;;;IAEqB,c;;;;;4BACG;AAChB,mBAAO,KAAK,QAAL,KAAkB,SAAlB,GAA8B,EAA9B,GAAmC,oBAA1C;AACH;;;4BAEe;AACZ,gBAAM,QAAQ,KAAK,KAAL,CAAW,UAAX,CAAsB,KAApC;AACA,mBAAO,KAAK,KAAL,CAAW,GAAX,CAAe,eAAf,MAAoC,aAApC,GACD,OAAO,IAAP,CAAY,oBAAZ,EAAkC,EAAE,YAAF,EAAlC,CADC,GAED,OAAO,IAAP,CAAY,yBAAZ,EAAuC,EAAE,YAAF,EAAvC,CAFN;AAGH;;;4BAEe;AACZ,mBAAO,KAAK,KAAL,CAAW,GAAX,CAAe,eAAf,MAAoC,aAApC,GACD,gBADC,GAED,sBAFN;AAGH;;;4BAEU;AACP,gBAAI,KAAK,IAAL,KAAc,WAAlB,EAA+B;AAC3B,uBAAO,EAAP;AACH;AACD,mBAAO,KAAK,KAAL,CAAW,GAAX,CAAe,eAAf,MAAoC,aAApC,GACD,OAAO,IAAP,CAAY,eAAZ,CADC,GAED,OAAO,IAAP,CAAY,oBAAZ,CAFN;AAGH;;;4BAEQ;AACL,gBAAM,QAAQ,KAAK,KAAL,CAAW,GAAX,CAAe,eAAf,MAAoC,aAAlD;AACA,gBAAI,KAAJ,EAAW;AACP,uBAAO;AACH,6BAAS,KAAK,KAAL,CAAW,UAAX,CAAsB,EAD5B;AAEH,gCAAY,KAAK,KAAL,CAAW,UAAX,CAAsB,IAAtB,CAA2B;AAFpC,iBAAP;AAIH;AACD,mBAAO,IAAP;AACH;;;AAED,kCAAgC;AAAA,YAAlB,IAAkB,QAAlB,IAAkB;AAAA,YAAZ,QAAY,QAAZ,QAAY;;AAAA;;AAAA,qIACnB,SADmB;;AAE5B,cAAK,IAAL,GAAY,QAAQ,WAApB;AACA,cAAK,QAAL,GAAgB,YAAY,SAA5B;;AAEA,cAAK,QAAL,CAAc,MAAK,KAAnB,EAA0B,sBAA1B,EAAkD,MAAK,MAAvD;AACA,cAAK,IAAL,GAAY,QAAQ,WAApB;AAN4B;AAO/B;;;;iCAEQ;AACL,mBAAO,EAAE,OAAO,cAAT,EAAP;AACH;;;iCAEQ;AACL,gBAAI,CAAC,KAAK,EAAN,IAAY,KAAK,GAAL,CAAS,MAAT,GAAkB,CAAlC,EAAqC;AACjC,uBADiC,CACzB;AACX;;AAED;AACA,gBAAM,eACF,KAAK,EAAL,CAAQ,aAAR,CAAsB,iBAAtB,MAA6C,SAAS,aAD1D;;AAGA,iBAAK,GAAL,CAAS,KAAT;;AAEA,gBAAM,aAAa,iCAAuB;AACtC,oBAAI,KAAK,EAD6B;AAEtC,+BAAe,KAAK,aAFkB;AAGtC,2BAAW,KAAK,SAHsB;AAItC,2BAAW,KAAK,SAJsB;AAKtC,sBAAM,KAAK,IAL2B;AAMtC,sCAAsB,OAAO,SAAP,CAAiB,cAAjB,GAChB,EADgB,GAEhB;AARgC,aAAvB,CAAnB;;AAWA,iBAAK,GAAL,CAAS,MAAT,CAAgB,UAAhB;;AAEA,gBAAI,YAAJ,EAAkB;AACd,qBAAK,EAAL,CAAQ,aAAR,CAAsB,iBAAtB,EAAyC,KAAzC;AACH;;AAED,mBAAO,IAAP;AACH;;;uCAEc;AACX,iBAAK,KAAL,CAAW,OAAX,CAAmB,cAAnB,EAAmC;AAC/B,wBAAQ,MADuB;AAE/B,uBAAO,KAAK;AAFmB,aAAnC;AAIA,gBAAI,CAAC,OAAO,SAAP,CAAiB,cAAtB,EAAsC;AAClC,qBAAK,QAAL;AACH;AACJ;;;mCAEU;AACP,iBAAK,GAAL,CACK,IADL,CACU,GADV,EAEK,WAFL,CAEiB,6BAFjB,EAGK,QAHL,CAGc,oBAHd;AAIH;;;;EAjGuC,SAAS,I;;qBAAhC,c;;;;;;;;;;;;;;;;;ICFA,a;;;;;;;;;;;4BACF;AACX,mBAAO;AACH,0CAA0B,KADvB;AAEH,+BAA0B,CAFvB;AAGH,uBAA0B,MAHvB;AAIH,0BAA0B,KAJvB,CAI6B;AAJ7B,aAAP;AAMH;;;4BAEY;AACT,gBAAI,gBAAgB,KAAK,GAAL,CAAS,eAAT,CAApB;AACA,gBAAI,KAAK,GAAL,CAAS,OAAT,MAAsB,SAA1B,EAAqC;;AAEjC,oBAAI,sBAAuB,iBAAiB,KAAK,EAAtB,CAA3B;;AAEA,uBAAO;AACH,0BAAM,CAAC,gBAAgB,mBAAjB,KAAyC,KAAK,EAA9C,CADH;AAEH,2BAAO,KAAK,IAAL,CAAU,sBAAsB,EAAhC;AAFJ,iBAAP;AAIH;AACD,mBAAO;AACH,sBAAM;AADH,aAAP;AAGH;;AAED;;;;4BACY;AACR;AACA,gBAAI,YAAY,EAAhB;AACA,aAAC,CAAC,KAAK,MAAL,CAAY,IAAd,IAAsB,KAAK,MAAL,CAAY,IAAZ,GAAmB,CAAzC,IAA+C,UAAU,IAAV,CAAe,OAAO,IAAP,CAAY,0BAAZ,EAAyC,EAAE,MAAM,KAAK,MAAL,CAAY,IAApB,EAAzC,CAAf,CAA/C;AACA,aAAC,CAAC,KAAK,MAAL,CAAY,KAAd,IAAuB,KAAK,MAAL,CAAY,KAAZ,GAAoB,CAA3C,IAAgD,UAAU,IAAV,CAAe,OAAO,IAAP,CAAY,2BAAZ,EAAyC,EAAE,MAAM,KAAK,MAAL,CAAY,KAApB,EAAzC,CAAf,CAAhD;;AAEA,mBAAO,OAAO,IAAP,CAAY,mBAAZ,EAAiC,EAAE,MAAM,UAAU,IAAV,CAAe,GAAf,CAAR,EAAjC,CAAP;AAEH;;;;EAnCsC,SAAS,K;;qBAA/B,a;;;;;;;;;;;;;ACArB;;;;AACA;;;;AACA;;AACA;;;;;;;;;;IAEqB,K;;;;;mCAKN;AACP,mBAAO;AACH,oBAAI,CADD;AAEH,kCAAkB,IAFf;AAGH,uBAAO,OAHJ;AAIH,gCAAgB,CAJb;AAKH,yBAAS,EALN;AAMH,yBAAS,KANN;AAOH,4BAAY,KAPT;AAQH,mCAAmB,KARhB;AASH,6BAAa,KATV;AAUH,4BAAY,GAVT;AAWH,gCAAgB,CAXb;AAYH,iCAAiB,CAZd;AAaH,4BAAY,CAbT;AAcH,4BAAY,CAdT;AAeH,6BAAa,CAfV;AAgBH,iCAAiB,CAhBd;AAiBH,qCAAqB,CAjBlB;AAkBH,yCAAyB,CAlBtB;AAmBH,sCAAsB,EAnBnB;AAoBH,kCAAkB,EApBf;AAqBH,6BAAa,EArBV;AAsBH,wBAAQ,EAtBL,EAsBS;AACZ,2BAAW,EAvBR,EAuBY;AACf,sBAAM,EAAE,IAAI,OAAN,EAxBH,EAwBoB;AACvB,wBAAQ,EAzBL,EAyBS;AACZ,uCAAuB,CA1BpB;AA2BH,yBAAS;AACL,mCAAe;AADV,iBA3BN;AA8BH;AACA,4BAAY,SA/BT;AAgCH,+BAAe,aAhCZ;AAiCH,6BAAa,KAjCV;AAkCH,gCAAgB,IAlCb;AAmCH,0BAAU,KAnCP;AAoCH,gCAAgB,KApCb;AAqCH,4BAAY,KArCT;AAsCH,sCAAsB;AAtCnB,aAAP;AAwCH;;;mCAMU,O,EAAS;AAChB,iBAAK,OAAL,GAAe,OAAf;AACH;;;4BArDiB;AACd,mBAAO,IAAP;AACH;;;4BA6CmB;AAChB,mBAAO,KAAK,GAAL,CAAS,aAAT,CAAP;AACH;;;AAMD,mBAAY,KAAZ,EAAmB,OAAnB,EAA4B,OAA5B,EAAqC;AAAA;;AAAA,mBACX,WAAW,EADA;AAAA,YAC3B,WAD2B,QAC3B,WAD2B;;AAAA,kHAG3B,KAH2B,EAGpB,OAHoB;;AAKjC,cAAK,UAAL,CAAgB,OAAhB;;AAEA,cAAK,GAAL,CACI,EAAE,MAAF,CAAS,EAAT,EAAa,KAAb,EAAoB,EAAE,YAAY,MAAK,SAAL,CAAe,WAAf,CAAd,EAApB,CADJ;AAGA,YAAI,CAAC,MAAK,aAAV,EAAyB;AACrB,kBAAK,IAAL,CAAU,OAAO,YAAjB;AACH;AAZgC;AAapC;;;;6BAEI,G,EAAK;AAAA;;AACN;AACA,gBAAI,KAAK,GAAT,EAAc;AACV,qBAAK,aAAL,CAAmB,KAAK,GAAxB,EAA6B,cAA7B;AACA,qBAAK,GAAL,GAAW,IAAX;AACH;;AAED;AACA,gBAAI,GAAJ,EAAS;AACL,qBAAK,GAAL,GAAW,GAAX;AACA,qBAAK,QAAL,CAAc,KAAK,GAAnB,EAAwB,cAAxB,EAAwC,UAAC,UAAD,EAAgB;AACpD,2BAAK,aAAL,CAAmB,UAAnB;AACH,iBAFD;AAGH;;AAED,mBAAO,IAAP;AACH;;;sCAEa,U,EAAY;AACtB,gBAAI,eAAe,IAAf,IAAuB,WAAW,EAAX,KAAkB,KAAK,EAAlD,EAAsD;AAClD,kHAAU,WAAW,iBAAX,EAAV;AACH;AACJ;;;8BAEK;AACF,+GAAa,SAAb;AACA,iBAAK,GAAL,IAAY,KAAK,GAAL,CAAS,OAAT,CAAiB,cAAjB,EAAiC,IAAjC,CAAZ;AACH;;AAED;;;;0CA6EkB,W,EAA2B;AAAA,gBAAd,OAAc,uEAAJ,EAAI;;AACzC,iBAAK,GAAL,CACI;AACI,4BAAY,KAAK,SAAL,CAAe,WAAf,CADhB;AAEI,+BAAe,wBAAW,YAAX,CACX,KAAK,UADM,EAEX,WAFW,IAIT,gBAJS,GAKT,aAPV;AAQI,gCAAgB,wBAAW,UAAX,CACZ,KAAK,UADO,EAEZ,WAFY,CARpB,CAWO;AAXP,aADJ,EAcI,OAdJ;AAgBA,gBAAM,sBAAsB,wBAAW,kBAAX,CACxB,KAAK,UADmB,EAExB,WAFwB,CAA5B;AAIA,iBAAK,GAAL,CAAS,aAAT,EAAwB,mBAAxB,EAA6C,WAAW,EAAxD;;AAEA,gBAAM,iBAAiB,wBAAW,UAAX,CACnB,KAAK,UADc,EAEnB,WAFmB,CAAvB;AAIA,iBAAK,GAAL,CAAS,gBAAT,EAA2B,cAA3B,EAA2C,WAAW,EAAtD,EA3ByC,CA2BkB;AAC9D;;;iCAEQ,W,EAAa;AAClB,gBAAM,SAAS,EAAE,GAAF,CAAM,KAAK,GAAL,CAAS,QAAT,CAAN,EAA0B,UAAC,KAAD;AAAA,uBAAW,KAAX;AAAA,aAA1B,CAAf,CADkB,CAC0C;AAC5D,mBAAO,6CAAmB,MAAnB,EAA2B,WAA3B,CAAP;AACH;;;oCAEW,W,EAAa;AACrB,gBAAM,QAAQ,KAAK,QAAL,CAAc,WAAd,CAAd;AACA,mBAAQ,SAAS,MAAM,IAAhB,IAAyB,8BAAY,wBAAZ,CAAhC;AACH;;;iDAEwB;AACrB,mBAAO,EAAE,IAAF,CAAO;AACV,qBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,mBAAzB,EAA8C,EAAE,IAAI,KAAK,EAAX,EAA9C,CADK;AAEV,sBAAM,KAFI;AAGV,yBAAS;AAHC,aAAP,CAAP;AAKH;;;4CAEmB,S,EAAW;AAAA;;AAC3B,gBAAI,CAAC,KAAK,eAAV,EAA2B;AACvB,qBAAK,eAAL,GAAuB,IAAI,2BAAJ,EAAvB;AACH;AACD,mBAAO,KAAK,eAAL,CACF,MADE,CACK,EAAE,SAAS,KAAK,GAAL,CAAS,IAAT,CAAX,EADL,EAEF,IAFE,CAEG,UAAC,QAAD,EAAc;AAChB,uBAAK,GAAL,CAAS,SAAT,EAAoB,SAAS,SAAT,CAApB;AACA,uBAAO,QAAQ,OAAR,EAAP;AACH,aALE,CAAP;AAMH;;;2CAEkB;AACf,gBAAI,SAAS,KAAK,GAAL,CAAS,YAAT,CAAb;AACA,gBAAI,mBAAmB,EAAvB;;AAEA,oBAAQ,MAAR;AACI,qBAAK,aAAL;AACI,uCAAmB,OAAO,IAAP,CAAY,yBAAZ,CAAnB;AACA;AACJ,qBAAK,MAAL;AACI,uCAAmB,OAAO,IAAP,CAAY,uBAAZ,CAAnB;AACA;AACJ,qBAAK,YAAY,SAAjB;AACI,uCAAmB,OAAO,IAAP,CAAY,uBAAZ,CAAnB;AACA;AACJ,qBAAK,UAAL;AACA,qBAAK,UAAL;AACA,qBAAK,WAAL;AACA,qBAAK,SAAL;AACI,uCAAmB,OAAO,IAAP,CAAY,UAAZ,CAAnB;AACA;AACJ,qBAAK,MAAL;AACI,wBAAI,KAAK,GAAL,CAAS,mBAAT,CAAJ,EAAmC;AAC/B,2CAAmB,OAAO,IAAP,CAAY,wBAAZ,CAAnB;AACA;AACH;;AAED,uCAAmB,KAAK,GAAL,CAAS,mBAAT,IACb,OAAO,IAAP,CAAY,wBAAZ,CADa,GAEb,OAAO,IAAP,CAAY,sBAAZ,CAFN;AAGA;AACJ,qBAAK,QAAL;AACI,uCAAmB,OAAO,IAAP,CAAY,QAAZ,CAAnB;AACA;AACJ,qBAAK,SAAL;AACI,uCAAmB,OAAO,IAAP,CAAY,SAAZ,CAAnB;AACA;AA/BR;;AAkCA,mBAAO,gBAAP;AACH;;;kCAES,W,EAAa;AACnB,iBAAK,cAAL,CAAoB,WAApB;AACA,mBAAO,wBAAW,QAAX,CAAoB,KAAK,UAAzB,EAAqC,WAArC,CAAP;AACH;;;uCAEc,W,EAAa;AACxB,iBAAK,GAAL,CAAS;AACL,0BAAU,eAAe,YAAY,OAAZ,CAAoB,OAApB,CAA4B,KAAK,EAAjC,IAAuC,CAAC;AAD5D,aAAT;AAGA,iBAAK,GAAL,CAAS;AACL,4BACI,eAAe,YAAY,WAAZ,CAAwB,OAAxB,CAAgC,KAAK,EAArC,IAA2C,CAAC;AAF1D,aAAT;AAIH;;;wCAEe;AACZ,gBAAI,OAAO,KAAK,GAAL,CAAS,aAAT,EAAwB,OAAxB,CACP,8BADO,EAEP,GAFO,CAAX;AAIA,mBAAO,YAAU,IAAV,aAAwB,IAAxB,EAAP;AACH;;;sCAEa,O,EAAS,O,EAAS,M,EAAQ;AAAA;;AACpC,cAAE,IAAF,CAAO;AACH,qBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,WAAzB,EAAsC,EAAE,IAAI,OAAN,EAAtC,CADF;AAEH,sBAAM,KAFH;AAGH,yBAAS,KAHN;AAIH,yBAAS,iBAAC,IAAD,EAAU;AACf,2BAAK,GAAL,CAAS,IAAT;AACA,2BAAK,GAAL,CAAS,YAAT,EAAuB,OAAK,SAAL,CAAe,IAAf,CAAvB;AACA;AACH,iBARE;AASH,sBAAM,cAAC,GAAD,EAAS;AACX,2BAAO,GAAP;AACH;AAXE,aAAP;AAaH;;;4BAtNyB;AACtB,mBAAO,KAAK,OAAL,IAAgB,KAAK,OAAL,CAAa,oBAA7B,GACD,KAAK,OAAL,CAAa,oBAAb,CAAkC,EADjC,GAED,SAFN;AAGH;;;4BAEqB;AAClB;AACA,gBAAI,QAAQ,EAAE,IAAI,KAAK,EAAX,EAAZ;;AAEA,gBAAI,KAAK,mBAAT,EAA8B;AAC1B,sBAAM,GAAN,GAAY,KAAK,mBAAjB;AACH;;AAED,mBAAO,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,OAAzB,EAAkC,KAAlC,CAAP;AACH;;;4BAEuB;AACpB,mBACI,OAAO,cAAP,CAAsB,SAAtB,CAAgC,UAAhC,KACA,KAAK,GAAL,CAAS,qBAAT,IAAkC,CAFtC;AAIH;;;4BAE0B;AACvB,mBAAO,KAAK,iBAAL,IAA0B,KAAK,GAAL,CAAS,aAAT,MAA4B,CAA7D;AACH;;;4BAEwB;AACrB,mBACI,KAAK,0BAAL,IACA,KAAK,GAAL,CAAS,iBAAT,MAAgC,CADhC,IAEA,CAAC,KAAK,GAAL,CAAS,gBAAT,CAHL;AAKH;;;4BAEkB;AACf,mBACI,KAAK,GAAL,CAAS,YAAT,KACA,CAAC,KAAK,GAAL,CAAS,UAAT,CADD,IAEA,OAAO,cAAP,CAAsB,SAAtB,CAAgC,eAAhC,CAHJ;AAKH;;;4BAEiB;AACd,mBAAO,KAAK,GAAL,CAAS,aAAT,KAA2B,KAAK,0BAAvC;AACH;;;4BAEgC;AAC7B,mBACI,KAAK,iBAAL,IAA0B,KAAK,GAAL,CAAS,yBAAT,IAAsC,CADpE;AAGH;;;4BAEe;AACZ,mBACI,KAAK,GAAL,CAAS,SAAT,MACC,KAAK,gBAAL,IAAyB,KAAK,mBAD/B,CADJ;AAIH;;;4BAEsB;AACnB,mBACI,KAAK,GAAL,CAAS,kBAAT,MAAiC,QAAjC,IACA,CAAC,KAAK,GAAL,CAAS,mBAAT,CADD,IAEA,CAAC,KAAK,GAAL,CAAS,aAAT,CAHL;AAKH;;;4BAEyB;AACtB,mBACI,KAAK,GAAL,CAAS,kBAAT,MAAiC,QAAjC,IACA,CAAC,KAAK,GAAL,CAAS,aAAT,CAFL;AAIH;;;4BA8IgB;AACb,mBAAO,KAAK,GAAL,CAAS,MAAT,EAAiB,EAAjB,KAAwB,UAA/B;AACH;;;;EA/T8B,SAAS,K;;qBAAvB,K;;;;;;;;;;;ACJrB;;;;;;;;;;;;IAEqB,e;;;;;;;;;;;4BACL;AAAE,mBAAO,kBAAP;AAAe;;;;EADY,SAAS,U;;qBAAjC,e;;;;;;;;cCHyB,M;IAAtC,c,WAAA,c;IAAgB,I,WAAA,I;IAAM,G,WAAA,G;IAAK,M,WAAA,M;;qBAEpB;AAAA,QACX,OADW,QACX,OADW;AAAA,QAEX,oBAFW,QAEX,oBAFW;AAAA,QAGX,EAHW,QAGX,EAHW;AAAA,QAIX,GAJW,QAIX,GAJW;AAAA,QAKX,MALW,QAKX,MALW;AAAA,QAMX,KANW,QAMX,KANW;AAAA,QAOX,SAPW,QAOX,SAPW;AAAA,QAQX,UARW,QAQX,UARW;AAAA,QASX,UATW,QASX,UATW;AAAA,QAUX,kBAVW,QAUX,kBAVW;AAAA,QAWX,iBAXW,QAWX,iBAXW;AAAA,QAYX,cAZW,QAYX,cAZW;AAAA,QAaX,eAbW,QAaX,eAbW;AAAA,QAcX,eAdW,QAcX,eAdW;AAAA,QAeX,gBAfW,QAeX,gBAfW;AAAA,+HAkBqE,EAlBrE,gCAmBQ,KAnBR,gDAoBwB,EApBxB,SAoB8B,GApB9B,wCAqBgB,SArBhB,qDAsB6B,EAtB7B,gEAwBQ,KAAK,iBAAL,EAAwB,EAAE,YAAF,EAAxB,CAxBR,iIA6BY,EA7BZ,SA6BkB,GA7BlB,4KA+BH,CAAC,CAAC,OAAO,cAAP,CAAsB,SAAtB,CAAgC,sBAAhC,CAAD,IACG,OADJ,KAEA,eAAe,EAFf,+FAKoB,UALpB,yBAKkD,EALlD,sBAKqE,KALrE,+DAM0C,EAN1C,qBAM4D,MAN5D,2BAMwF,gBANxF,+EAO0D,KAClD,mBADkD,EAElD,EAAE,QAAQ,UAAV,EAAsB,YAAtB,EAFkD,CAP1D,gCAWU,UAXV,iDAcM,EA7CH,qFAgDsB,IAAI,OAAO,OAAX,EAAoB;AACzC;AADyC,KAApB,CAhDtB,sBAkDgB,KAAK,uBAAL,EAA8B;AACzD;AADyD,KAA9B,CAlDhB,UAoDR,KAAK,aAAL,CApDQ,sCAuDH,mBAAmB,oBAAoB,EAAvC,0EAEsD,eAFtD,UAE0E,KAChE,YADgE,CAF1E,iBAKM,EA5DH,oBA+DH,oFACuE,eADvE,yBAC0G,EAD1G,qDAC4J,kBAD5J,UACmL,iBADnL,mBA/DG,uEAmE+C,oBAnE/C,sBAmEoF,KAC/F,oBAD+F,EAE/F,EAAE,YAAF,EAF+F,CAnEpF,UAsET,KAAK,gBAAL,CAtES;AAAA,C;;;;;;;;;qBCFA;AAAA,QAAG,KAAH,QAAG,KAAH;AAAA,QAAU,GAAV,QAAU,GAAV;AAAA,QAAe,IAAf,QAAe,IAAf;AAAA,QAAqB,UAArB,QAAqB,UAArB;AAAA,QAAiC,aAAjC,QAAiC,aAAjC;AAAA,QAAgD,MAAhD,QAAgD,MAAhD;AAAA,+EAC6C,UAD7C,2BAEA,IAFA,mEAIa,IAJb,uCAKa,MAAM,EALnB,uCAMa,MAAM,KANnB,uCAOa,MAAM,IAAN,CAAW,EAPxB,iFAUW,MAAM,KAVjB,WAU4B,KAAK,MAAM,IAAN,CAAW,EAAhB,CAV5B,+FAYyC,aAZzC,+BAaI,GAbJ,yBAcD,wBAAqB,MAArB,OAdC,6BAeI,MAAM,KAfV,WAeqB,KAAK,MAAM,IAAN,CAAW,EAAhB,CAfrB,kDAgBwB,UAhBxB;AAAA,C;;;;;;;;;qBCAD;AAAA,QAAE,OAAF,QAAE,OAAF;AAAA,QAAW,WAAX,QAAW,WAAX;AAAA,4CAEJ,OAFI,2GAKuC,WALvC,6GAK0J,KAAK,SAAL,CAL1J,UAK8K,KAAK,SAAL,CAL9K,0HAMgG,KAAK,QAAL,CANhG;AAAA,C;;;;;;;;cCAG,M;IAAT,I,WAAA,I;;qBAEM;AAAA,QAAE,OAAF,QAAE,OAAF;AAAA,QAAW,GAAX,QAAW,GAAX;AAAA,QAAgB,UAAhB,QAAgB,UAAhB;AAAA,2HAE8B,OAF9B,uBAGA,mUAMA,EATA,kHAc4B,GAd5B,eAcyC,KAAK,YAAL,CAdzC,kOAmBgF,KAAK,QAAL,CAnBhF;AAAA,C;;;;;;;;;qBCFC;AAAA,QAAG,WAAH,QAAG,WAAH;AAAA,qFACsD,OAAO,IAAP,CAC7D,yCAD6D,CADtD,kMAQwD,WARxD,uBAQqF,OAAO,IAAP,CAChG,2BADgG,CARrF;AAAA,C;;;;;;;;cCCqB,M;IAA5B,I,WAAA,I;IAAM,I,WAAA,I;IAAM,G,WAAA,G;IAAK,M,WAAA,M;;qBAEV;AAAA,QAAE,qBAAF,QAAE,qBAAF;AAAA,QAAyB,cAAzB,QAAyB,cAAzB;AAAA,QAAyC,KAAzC,QAAyC,KAAzC;AAAA,QAAgD,UAAhD,QAAgD,UAAhD;AAAA,QAA4D,gBAA5D,QAA4D,gBAA5D;AAAA,QAA8E,SAA9E,QAA8E,SAA9E;AAAA,QAAyF,WAAzF,QAAyF,WAAzF;AAAA,QAAsG,gBAAtG,QAAsG,gBAAtG;AAAA,6DAC8B,WAAW,KADzC,mEAGL,KAAK,QAAL,EAAe,EAAC,qDAAmD,gBAAnD,sBAAoF,KAAK,sBAAL,EAA6B,EAAC,QAAQ,WAAW,gBAApB,EAA7B,CAApF,UAA4J,WAAW,gBAAvK,SAAD,EAAf,CAHK,2EAML,SANK,kFASJ,gBAAgB,CAAhB,GACG,KAAK,qBAAL,EAA4B,EAAC,OAAO,KAAR,EAAe,6DAA2D,cAA3D,UAA8E,OAAO,IAAP,CAAY,8BAAZ,CAA9E,SAAf,EAA5B,CADH,KATI,4BAaR,oBAAoB,iBAAiB,MAAjB,GAA0B,CAA/C,oCAAmF,gBAAnF,cAbS;AAAA,C;;;;;;;;;ACHf;;qBAEe;AAAA,QAAG,KAAH,QAAG,KAAH;AAAA,QAAU,IAAV,QAAU,IAAV;AAAA,QAAgB,QAAhB,QAAgB,QAAhB;AAAA,QAA0B,UAA1B,QAA0B,UAA1B;AAAA,QAAsC,WAAtC,QAAsC,WAAtC;AAAA,QAAmD,WAAnD,QAAmD,WAAnD;AAAA,qGAEmC,WAAW,sBAAX,GAAoC,oBAFvE,sBAGF,IAHE,iDAKO,IALP,8BAMO,MAAM,EANb,8BAOO,MAAM,KAPb,8BAQO,MAAM,IAAN,CAAW,EARlB,uCASc,WAAW,8BAAX,GAA4C,yCAT1D,WAS0G,MAAM,KAThH,4CAUe,WAAW,EAAX,GAAgB,cAV/B,WAUoD,WAVpD,mFAcY,MAAM,KAdlB,WAc+B,KAAK,MAAM,IAAN,CAAW,EAAhB,CAd/B,8GAiBK,8BAAY,eAAZ,CAjBL,4BAkBK,MAAM,KAlBX,WAkBwB,KAAK,MAAM,IAAN,CAAW,EAAhB,CAlBxB;AAAA,C;;;;;;;;cCFQ,M;IAAf,I,WAAA,I;IAAM,I,WAAA,I;;qBAEC;AAAA,QAAG,KAAH,QAAG,KAAH;AAAA,QAAU,IAAV,QAAU,IAAV;AAAA,QAAgB,QAAhB,QAAgB,QAAhB;AAAA,QAA0B,EAA1B,QAA0B,EAA1B;AAAA,QAA8B,iBAA9B,QAA8B,iBAA9B;AAAA,QAAiD,cAAjD,QAAiD,cAAjD;AAAA,QAAiE,WAAjE,QAAiE,WAAjE;AAAA,QAA8E,WAA9E,QAA8E,WAA9E;AAAA,QAA2F,cAA3F,QAA2F,cAA3F;AAAA,0EAEJ,KAFI,mEAGwC,KAAK,EAH7C,qBAGiE,KAAK,KAAK,EAAV,CAHjE,sHAOwB,QAPxB,eAO4C,KAAK,YAAL,CAP5C,mDAUgB,EAVhB,2CAU0D,EAV1D,yDAYJ,CAAC,iBAAD,GAAqB,EAArB,6DAC0D,KAAK,iBAAL,EAAwB,EAAE,8BAAF,EAAxB,CAD1D,SAZI,mFAgBA,gBAAgB,CAAhB,GACG,KAAK,kCAAL,CADH,GAEG,iBACE,KAAK,oCAAL,EAA2C,EAAE,wBAAF,EAA3C,CADF,GAEE,KAAK,gCAAL,EAAuC,EAAE,wBAAF,EAAvC,CApBL,+GAyBuD,EAzBvD,kFAyBwI,KAAK,cAAL,CAzBxI,iBAyB0K,KAAK,cAAL,CAzB1K,sBAyBiN,KAAK,cAAL,CAzBjN,yGA2BiB,KAAK,oBAAL,CA3BjB,4FA8B2C,EA9B3C,+EA8ByH,KAAK,cAAL,CA9BzH,iBA8B2J,KAAK,cAAL,CA9B3J,sBA8BkM,KAAK,cAAL,CA9BlM,+CA8BkQ,EA9BlQ,6DAgCiB,KAAK,sBAAL,CAhCjB,wPAsC4F,KAAK,QAAL,CAtC5F;AAAA,C;;;;;;;;;qBCFA;AAAA,QAAE,IAAF,QAAE,IAAF;AAAA,QAAQ,SAAR,QAAQ,SAAR;AAAA,QAAmB,YAAnB,QAAmB,YAAnB;AAAA,QAAiC,YAAjC,QAAiC,YAAjC;AAAA,6BACF,IADE,2HAI6C,SAJ7C,uHAKS,YALT,qNAOwJ,YAPxJ;AAAA,C;;;;;;;;;qBCAA;AAAA,QAAG,WAAH,QAAG,WAAH;AAAA,6DAC6B,WAD7B;AAAA,C;;;;;;;;;qBCAA;AAAA,QAAE,MAAF,QAAE,MAAF;AAAA,mBACb,uFACuE,MADvE,cACsF,OAAO,IAAP,CAAY,MAAZ,CADtF,iBAEE,EAHW;AAAA,C;;;;;;;;;qBCAA;AAAA,QAAG,OAAH,QAAG,OAAH;AAAA,QAAY,KAAZ,QAAY,KAAZ;AAAA,QAAmB,IAAnB,QAAmB,IAAnB;AAAA,QAAyB,SAAzB,QAAyB,SAAzB;AAAA,4BAAwD,KAAxD,gDAAsG,OAAtG,0DACc,IADd,sCACiD,SADjD,qBAEJ,KAFI;AAAA,C;;;;;;;;;qBCAA;AAAA,QAAE,EAAF,QAAE,EAAF;AAAA,QAAM,aAAN,QAAM,aAAN;AAAA,QAAqB,SAArB,QAAqB,SAArB;AAAA,QAAgC,SAAhC,QAAgC,SAAhC;AAAA,QAA2C,IAA3C,QAA2C,IAA3C;AAAA,QAAiD,oBAAjD,QAAiD,oBAAjD;AAAA,2BACL,oDAAkD,GAAG,OAArD,uBAA8E,GAAG,UAAjF,GAAgG,EAD3F,iCAES,aAFT,wCAID,SAJC,0BAKC,SALD,cAKmB,oBALnB,wCAMT,wDAAsD,IAAtD,eAAsE,EAN7D;AAAA,C;;;;;;;;;;;ACAf;;AACA;;;;;;;;;;;;AAEA,IAAI,iBAAiB,OAAO,cAA5B;;wBAEqC,OAAO,S;IAApC,O,qBAAA,O;IAAS,e,qBAAA,e;cACG,M;IAAZ,O,WAAA,O;;;AAER,IAAM,cAAc,CAAC,EACjB,eAAe,SAAf,CAAyB,6BAAzB,KACA,OAAO,SAAP,CAAiB,SAAjB,CAA2B,KAA3B,CAAiC,mCAAjC,CAFiB,CAArB;AAIA,IAAM,QAAQ,CAAC,EACX,OAAO,SAAP,CAAiB,SAAjB,CAA2B,KAA3B,CAAiC,KAAjC,KACA,CAAC,OAAO,GADR,IAEA,CAAC,WAHU,CAAf;AAKA,IAAM,YACF,CAAC,EAAE,OAAO,SAAP,CAAiB,SAAjB,CAA2B,KAA3B,CAAiC,KAAjC,KAA2C,CAAC,OAAO,YAArD,CAAD,IACA,CAAC,OAAO,SAAP,CAAiB,cAFtB;AAGA,IAAM,kBAAkB,CAAC,CAAC,OAAO,SAAP,CAAiB,SAAjB,CAA2B,KAA3B,CACtB,oFADsB,CAA1B;AAGA,IAAM,QAAQ,QAAQ,GAAR,CAAY,WAAZ,MAA6B,SAA3C;AACA,IAAM,wBAAwB,CAAC,EAC3B,OAAO,YAAP,IAAuB,SAAS,OAAO,SAAhB,EAA2B,EAA3B,KAAkC,IAD9B,CAA/B;AAGA,IAAM,kBAAkB,CAAC,EACrB,OAAO,YAAP,IAAuB,SAAS,OAAO,SAAhB,EAA2B,EAA3B,IAAiC,IADnC,CAAzB;;IAIqB,oB;;;;;;;;;;;mCACN,E,EAAI;AAAA;;AACX,gBAAI,SAAS,GAAG,IAAH,CAAQ,WAAR,CAAb;AACA,gBAAI,UAAU,GAAG,IAAH,CAAQ,SAAR,CAAd;;AAEA,gBAAI,UAAU,KAAK,UAAL,CAAgB,MAAhB,CAAd;AACA,gBAAI,cAAc,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,aAAzB,EAAwC;AACtD,8BADsD;AAEtD;AAFsD,aAAxC,CAAlB;;AAKA,gBAAI,YAAY,EAAZ,IAAkB,CAAC,KAAK,kBAAL,CAAwB,OAAxB,CAAvB,EAAyD;AACrD,oBAAI,WAAW,EAAE,SAAS,KAAK,WAAL,CAAiB,OAAjB,CAAX,EAAsC,wBAAtC,EAAf;;AAEA,oBAAM,UAAU,EAAE,uCAAwB,QAAxB,CAAF,CAAhB;;AAEA,qBAAK,KAAL,GAAa,IAAI,YAAJ,CAAU;AACnB,2BAAO,KAAK,8BAAL,CADY;AAEnB,6BAAS;AAFU,iBAAV,CAAb;;AAKA,qBAAK,KAAL,CAAW,IAAX;;AAEA,qBAAK,KAAL,CAAW,GAAX,CAAe,IAAf,CAAoB,SAApB,EAA+B,EAA/B,CAAkC,OAAlC,EAA2C,YAAM;AAC7C,2BAAK,KAAL,CAAW,KAAX;AACH,iBAFD;AAGA,qBAAK,KAAL,CAAW,GAAX,CAAe,IAAf,CAAoB,UAApB,EAAgC,EAAhC,CAAmC,OAAnC,EAA4C,YAAM;AAC9C,2BAAK,gBAAL,CAAsB,OAAtB;AACA,2BAAK,KAAL,CAAW,KAAX;AACH,iBAHD;AAIH,aAnBD,MAmBO,IAAI,WAAW,gBAAf,EAAiC;AACpC,oBAAI,KAAJ,EAAW;AACP,2BAAO,QAAP,CAAgB,IAAhB,GAAuB,WAAvB;AACH,iBAFD,MAEO;AACH,2BAAO,IAAP,CAAY,WAAZ,EAAyB,QAAzB,EAAmC,YAAnC;AACH;AACJ,aANM,MAMA;AACH;AACA,uBAAO,QAAP,CAAgB,IAAhB,GAAuB,WAAvB;AACH;AACJ;;;oCAEW,O,EAAS;AACjB,oBAAQ,OAAR;AACI,qBAAK,OAAL;AACI,2BAAO,KAAK,+BAAL,EAAsC;AACzC,8BACI,yGACA,KAAK,cAAL,CADA,GAEA,gBAFA,GAGA,KAAK,cAAL,CAHA,GAIA;AANqC,qBAAtC,CAAP;AAQJ,qBAAK,KAAL;AACI,2BAAO,KAAK,+BAAL,EAAsC;AACzC,8BACI,+EACA;AAHqC,qBAAtC,CAAP;AAKJ,qBAAK,YAAL;AACI,2BAAO,KAAK,mCAAL,EAA0C;AAC7C,8BACI,yGACA,KAAK,cAAL,CADA,GAEA,gBAFA,GAGA,KAAK,cAAL,CAHA,GAIA;AANyC,qBAA1C,CAAP;AAQJ,qBAAK,OAAL;AACI,2BAAO,KAAK,sCAAL,EAA6C;AAChD,8BACI,yGACA,KAAK,cAAL,CADA,GAEA,gBAFA,GAGA,KAAK,cAAL,CAHA,GAIA;AAN4C,qBAA7C,CAAP;AAQJ,qBAAK,QAAL;AACI,2BAAO,KAAK,2CAAL,EAAkD;AACrD,+BACI,+IACA,KAAK,sCAAL,EAA6C;AACzC,qCAAS;AADgC,yBAA7C,CADA,GAIA,qCANiD;AAOrD,+BACI,6GACA,KAAK,sCAAL,EAA6C;AACzC,qCAAS;AADgC,yBAA7C,CADA,GAIA;AAZiD,qBAAlD,CAAP;AAcJ,qBAAK,QAAL;AACI,2BAAO,KAAK,uCAAL,CAAP;AACJ,qBAAK,OAAL;AACI,2BAAO,KAAK,oCAAL,EAA2C;AAC9C,8BACI,2GACA,KAAK,gBAAL,CADA,GAEA,gBAFA,GAGA,KAAK,gBAAL,CAHA,GAIA;AAN0C,qBAA3C,CAAP;AAQJ,qBAAK,cAAL;AACI,2BAAO,KAAK,mCAAL,EAA0C;AAC7C,8BACI,cACA,OAAO,UAAP,CACI,OADJ,EAEI,gBAAgB,qBAFpB,CADA,GAKA,oEALA,GAMA,KAAK,yBAAL,CANA,GAOA,gBAPA,GAQA,KAAK,yBAAL,CARA,GASA;AAXyC,qBAA1C,CAAP;AA7DR;AA2EH;;;mCAEU,M,EAAQ;AACf,gBAAI,UAAU,EAAd;AACA,gBAAI,WAAW,kBAAf,EAAmC;AAC/B,oBAAI,KAAJ,EAAW;AACP,8BAAU,KAAV;AACH,iBAFD,MAEO,IAAI,aAAa,CAAC,KAAlB,EAAyB;AAC5B,8BAAU,KAAV;AACH,iBAFM,MAEA,IACH,CAAC,OAAO,GAAP,IACI,OAAO,OAAP,IAAkB,CAAC,OAAO,SAAP,CAAiB,cADzC,KAEA,CAAC,KAHE,EAIL;AACE,8BAAU,OAAV;AACH,iBANM,MAMA,IAAI,yBAAyB,CAAC,KAA9B,EAAqC;AACxC,8BAAU,OAAV;AACH,iBAFM,MAEA,IAAI,mBAAmB,CAAC,KAAxB,EAA+B;AAClC,8BAAU,cAAV;AACH;AACJ,aAhBD,MAgBO,IACH,WAAW,iBAAX,KACC,SAAU,aAAa,CAAC,KADzB,CADG,EAGL;AACE,0BAAU,KAAV;AACH,aALM,MAKA,IAAI,WAAW,iBAAf,EAAkC;AACrC,oBAAI,KAAJ,EAAW;AACP,8BAAU,KAAV;AACH,iBAFD,MAEO,IAAI,aAAa,CAAC,KAAlB,EAAyB;AAC5B,8BAAU,KAAV;AACH,iBAFM,MAEA,IACH,CAAC,OAAO,GAAP,IACI,OAAO,OAAP,IAAkB,CAAC,OAAO,SAAP,CAAiB,cADzC,KAEA,CAAC,KAHE,EAIL;AACE,8BAAU,YAAV;AACH,iBANM,MAMA,IAAI,yBAAyB,CAAC,KAA9B,EAAqC;AACxC,8BAAU,OAAV;AACH,iBAFM,MAEA,IAAI,mBAAmB,CAAC,KAAxB,EAA+B;AAClC,8BAAU,cAAV;AACH;AACJ,aAhBM,MAgBA,IACH,WAAW,eAAX,IACA,EAAE,eAAe,SAAf,CAAyB,cAAzB,KAA4C,CAAC,KAA/C,CAFG,EAGL;AACE,oBACK,CAAC,OAAO,GAAP,IAAc,OAAO,OAAtB,KAAkC,CAAC,KAApC,IACA,KADA,IAEC,aAAa,CAAC,KAHnB,EAIE;AACE,8BAAU,OAAV;AACH,iBAND,MAMO,IAAI,yBAAyB,CAAC,KAA9B,EAAqC;AACxC,8BAAU,OAAV;AACH,iBAFM,MAEA,IAAI,mBAAmB,CAAC,KAAxB,EAA+B;AAClC,8BAAU,cAAV;AACH;AACJ;AACD,mBAAO,OAAP;AACH;;;2CAEkB,O,EAAS;AACxB,gBAAM,SAAS,QAAQ,GAAR,CAAY,mBAAZ,CAAf;AACA,gBAAI,WAAW,SAAf,EAA0B;AACtB,uBAAO,KAAP;AACH,aAFD,MAEO;AACH,oBAAI,MAAM,OAAO,KAAP,CAAa,GAAb,CAAV;AACA,uBAAO,IAAI,OAAJ,CAAY,OAAZ,IAAuB,CAAC,CAA/B;AACH;AACJ;;;yCAEgB,O,EAAS;AACtB,gBAAI,SAAS,QAAQ,GAAR,CAAY,mBAAZ,CAAb;AACA,gBAAI,WAAW,SAAf,EAA0B;AACtB,wBAAQ,GAAR,CAAY,mBAAZ,EAAiC,UAAU,GAA3C,EAAgD;AAC5C,0BAAM,GADsC;AAE5C,6BAAS,GAFmC;AAG5C,+BAAW;AAHiC,iBAAhD;AAKH,aAND,MAMO;AACH,wBAAQ,GAAR,CAAY,mBAAZ,EAAiC,SAAS,OAAT,GAAmB,GAApD,EAAyD;AACrD,0BAAM,GAD+C;AAErD,6BAAS,GAF4C;AAGrD,+BAAW;AAH0C,iBAAzD;AAKH;AACJ;;;;EA3M6C,SAAS,I;;qBAAtC,oB;;;;;AC7BrB;;AACA;;;;AACA;;;;AACA;;;;;;AALA,IAAM,WAAY,OAAO,QAAzB;;AAOA,IAAM,oBAAoB,SAAS,IAAT,CAAc,MAAd,CAAqB;AAC3C,cAD2C,sBAChC,GADgC,EAC3B,UAD2B,EACD;AAAA;;AAAA,YAAd,OAAc,uEAAJ,EAAI;;AACtC,aAAK,GAAL,GAAW,GAAX;;AAEA,YAAM,WAAW;AACb,qBAAS,OAAO,IAAP,CAAY,CAAC,CAAC,QAAQ,UAAV,GAAuB,8CAAvB,GACD,iDADX,EAEW,EAAC,iBAAe,WAAW,GAAX,CAAe,OAAf,CAAf,YAAD,EAFX,CADI;AAIb,iBAAK,WAAW,WAAX,CAAuB,GAAvB,CAJQ;AAKb,wBAAY,CAAC,CAAC,QAAQ;AALT,SAAjB;;AAQA,YAAI,gBAAgB;AAChB,sBAAU,KADM;AAEhB,mBAAO,OAAO,IAAP,CAAY,6BAAZ,CAFS;AAGhB,qBAAS,CAAC,uBAAD,CAHO;AAIhB,qBAAS,oCAAkB,QAAlB,CAJO;AAKhB,gBAAI,uBALY;AAMhB,wBAAY;AANI,SAApB;AAQA,aAAK,KAAL,GAAa,IAAI,YAAJ,CAAU,aAAV,CAAb;;AAEA,aAAK,KAAL,CAAW,CAAX,CAAa,YAAb,EAA2B,EAA3B,CAA8B,OAA9B,EAAuC,YAAM;AACzC,kBAAK,KAAL,CAAW,KAAX;AACH,SAFD;;AAIA,aAAK,QAAL,CAAc,KAAK,GAAnB,EAAwB,iBAAxB,EAA2C,YAAM;AAC9C,kBAAK,KAAL,CAAW,KAAX;AACF,SAFD;;AAIA,aAAK,iBAAL,GAAyB,IAAI,8BAAJ,CAAsB,EAAE,OAAO,UAAT,EAAqB,MAAM,QAA3B,EAAqC,IAAI,KAAK,KAAL,CAAW,CAAX,CAAa,cAAb,CAAzC,EAAuE,OAAO,MAA9E,EAAtB,CAAzB;;AAEA,aAAK,KAAL,CAAW,IAAX;;AAEA,YAAI,QAAQ,UAAZ,EAAuB;AACnB,iBAAK,SAAL,GAAiB,IAAI,oBAAJ,CAAY;AACzB,wBAAQ,KAAK,KAAL,CAAW,GAAX,CAAe,IAAf,CAAoB,kBAApB,CADiB;AAEzB,kCAAgB,KAAK,mCAAL,CAAhB;AAFyB,aAAZ,CAAjB;AAIH;AACJ;AAxC0C,CAArB,CAA1B;;AA2CA,OAAO,OAAP,GAAiB,iBAAjB;;;;;;;;;AClDA;;AACA;;;;;;;;;;;;IAEqB,S;;;AACjB,6BAA0C;AAAA,YAA5B,GAA4B,QAA5B,GAA4B;AAAA,YAAvB,UAAuB,QAAvB,UAAuB;AAAA,YAAX,OAAW,QAAX,OAAW;;AAAA;;AAAA,2HAC7B,SAD6B;;AAEtC,cAAK,GAAL,GAAW,GAAX;;AAEA,cAAK,cAAL,GAAsB,IAAI,2BAAJ,CAAmB,EAAE,QAAF,EAAO,sBAAP,EAAmB,gBAAnB,EAA4B,gBAAgB,CAAC,CAAC,QAAQ,cAAtD,EAAnB,CAAtB;;AAEA,cAAK,KAAL,GAAa,IAAI,YAAJ,CAAU;AACnB,sBAAa,KADM;AAEnB,mBAAa,OAAO,IAAP,CAAY,6BAAZ,CAFM;AAGnB,qBAAa,CAAC,OAAD,EAAU,WAAV,CAHM;AAInB,qBAAa,MAAK,cAAL,CAAoB,GAJd;AAKnB,wBAAa,MAAK,cAAL,CAAoB,GAApB,CAAwB,IAAxB,CAA6B,iBAA7B;AALM,SAAV,CAAb;;AAQA,cAAK,KAAL,CAAW,IAAX;;AAEA,cAAK,QAAL,CAAc,MAAK,GAAnB,EAAwB,gBAAxB,EAA0C,YAAM;AAAE,kBAAK,KAAL,CAAW,KAAX;AAAqB,SAAvE;AAhBsC;AAiBzC;;;EAlBkC,SAAS,I;;qBAA3B,S;;;;;;;;;;;ACHrB,IAAA,UAAA,GAAA,OAAA,CAAA,cAAA,CAAA,CAAA;;;;AACA,IAAA,gBAAA,GAAA,OAAA,CAAA,2BAAA,CAAA,CAAA;;;;AACA,IAAA,oBAAA,GAAA,OAAA,CAAA,wBAAA,CAAA,CAAA;;;;AACA,IAAA,gBAAA,GAAA,OAAA,CAAA,6CAAA,CAAA,CAAA;;;;AACA,IAAA,oBAAA,GAAA,OAAA,CAAA,uCAAA,CAAA,CAAA;;;;AACA,IAAA,MAAA,GAAA,OAAA,CAAA,oBAAA,CAAA,CAAA;;AASA,IAAA,yBAAA,GAAA,OAAA,CAAA,4CAAA,CAAA,CAAA;;;;AACA,IAAA,iBAAA,GAAA,OAAA,CAAA,6CAAA,CAAA,CAAA;;;;;;;;;;;;cARiC;IAAzB,yBAAA;IAAgB,eAAA;;AACxB;AACA,IAAM,IAAA,GAAO,OAAA,CAAQ,MAAR,CAAb,CAAA;AACA,IAAM,qBAAA,GAAwB,q9BAA9B,CAAA;;IAOqB;;;IAKjB,SAAA,gBAAA,CAAA,IAAA,EAA6D;QAAA,IAA/C,GAA+C,GAAA,IAAA,CAA/C,GAA+C;YAA1C,UAA0C,GAAA,IAAA,CAA1C,UAA0C;YAA9B,KAA8B,GAAA,IAAA,CAA9B,KAA8B;YAAvB,mBAAuB,GAAA,IAAA,CAAvB,mBAAuB,CAAA;;QAAA,eAAA,CAAA,IAAA,EAAA,gBAAA,CAAA,CAAA;;QAAA,IAAA,KAAA,GAAA,0BAAA,CAAA,IAAA,EAAA,CAAA,gBAAA,CAAA,SAAA,IAAA,MAAA,CAAA,cAAA,CAAA,gBAAA,CAAA,EAAA,IAAA,CAAA,IAAA,CAAA,CAAA,CAAA;;QAAA,KAAA,CAJ7D,gBAI6D,GAJ1C,cAAA,CAAe,SAAf,CAAyB,mBAAzB,CAAA,GACb,qBAAA,CAAA,SAAA,CADa,GAEb,CAAA,CAAE,QAAF,CAAW,qBAAX,CAEuD,CAAA;;QAEzD,KAAA,CAAK,GAAL,GAAW,GAAX,CAAA;QACA,KAAA,CAAK,UAAL,GAAkB,UAAlB,CAAA;QACA,KAAA,CAAK,KAAL,GAAa,KAAb,CAAA;QACA,KAAA,CAAK,mBAAL,GAA2B,mBAA3B,CAAA;QACA,KAAA,CAAK,UAAL,GAAkB,IAAI,iBAAA,CAAA,SAAA,CAAJ,EAAlB,CAAA;QACA,KAAA,CAAK,aAAL,GAAqB,UAAA,CAAW,UAAX,CAAsB,OAAtB,CAA8B,aAA9B,CAA4C,EAAjE,CAAA;;QAEA,KAAA,CAAK,UAAL,CAAgB,GAAhB,GAAyB,MAAA,CAAO,GAAP,CACrB,MAAA,CAAO,MAAP,CAAc,IAAd,CAAmB,KAAnB,CAAyB,gBADJ,EAErB,EAAE,EAAA,EAAI,UAAA,CAAW,EAAjB,EAFqB,CAAzB,GAAA,QAAA,IAII,KAAA,CAAK,aAAL,GAAA,iBAAA,GAAuC,KAAA,CAAK,aAA5C,GAA8D,EAJlE,CAAA,CAAA;QAMA,KAAA,CAAK,UAAL,CAAgB,KAAhB,GAAwB,UAAC,QAAD,EAAc;YAClC,IAAI,gBAAA,GAAmB,QAAA,CAAS,MAAhC,CAAA;YACA,IACI,MAAA,CAAO,cAAP,CAAsB,SAAtB,CAAgC,yBAAhC,CAAA,IACA,QAAA,CAAS,MAFb,EAGE;gBACE,gBAAA,GAAmB,QAAA,CAAS,MAAT,CAAgB,MAAhB,CACf,UAAC,CAAD,EAAA;oBAAA,OAAO,CAAA,CAAE,OAAF,KAAc,IAArB,CAAA;iBADe,CAAnB,CAAA;aAGH;YACD,OAAO,CAAA,CAAE,MAAF,CAAS,gBAAT,CAAP,CAAA;SAVJ,CAAA;QAYA,KAAA,CAAK,WAAL,GAAmB,KAAA,CAAK,UAAL,CAAgB,GAAhB,CAAoB,aAApB,CAAA,IAAsC,CAAzD,CAAA;QACA,KAAA,CAAK,gBAAL,GAAwB,CAAA,CAAA,EAAA,kBAAA,CAAA,SAAA,CAAA,EAAiB,KAAA,CAAK,UAAtB,CAAxB,CAAA;;QAEA,KAAA,CAAK,eAAL,EAAA,CAAA;QACA,KAAA,CAAK,eAAL,GAAuB,KAAA,CAAK,CAAL,CAAO,yBAAP,CAAvB,CAAA;;QAEA,IAAM,QAAA,GAAW,IAAI,MAAA,CAAO,QAAP,CAAgB,MAApB,CAA2B;YACxC,OAAA,EAAS,KAAA,CAAK,eAD0B;YAExC,KAAA,EAAO,SAAA,KAAA,GAAM;gBACT,QAAA,CAAS,OAAT,EAAA,CAAA;gBACA,KAAA,CAAK,kBAAL,EAAA,CAAA;aACH;SALY,CAAjB,CAAA;;QAQA,IAAI,aAAA,GAAgB;YAChB,QAAA,EAAU,KADM;YAEhB,KAAA,EAAO,IAAA,CAAK,gBAAL,CAFS;YAGhB,OAAA,EAAS,CAAC,yBAAD,CAHO;YAIhB,OAAA,EAAS,KAAA,CAAK,GAAA;SAJlB,CAAA;;QAOA,KAAA,CAAK,KAAL,GAAa,IAAI,MAAA,CAAA,KAAJ,CAAU,aAAV,CAAb,CAAA;QACA,KAAA,CAAK,KAAL,CAAW,IAAX,EAAA,CAAA;QAjDyD,OAAA,KAAA,CAAA;KAkD5D;;;;6CAEoB;YAAA,IAAA,MAAA,GAAA,IAAA,CAAA;;YACjB,IAAA,CAAK,UAAL,CACK,KADL,EAAA,CAEK,IAFL,CAEU,UAAC,GAAD,EAAS;gBACX,IAAI,CAAA,CAAE,GAAA,CAAI,MAAN,CAAA,CAAc,OAAd,EAAJ,EAA6B;oBACzB,MAAA,CAAK,eAAL,CAAqB,KAArB,EAAA,CAAA;oBACA,OAAA;iBACH;gBACD,MAAA,CAAK,mBAAL,EAAA,CAAA;aAPR,CAAA,CASK,IATL,CASU,YAAM;gBACR,MAAA,CAAK,eAAL,CAAqB,KAArB,EAAA,CAAA;aAVR,CAAA,CAAA;SAYH;;;0CAEiB;YACd,IAAI,cAAA,CAAe,SAAf,CAAyB,YAAzB,CAAJ,EAA4C;gBACxC,IAAI,IAAA,GAAO,IAAX,CAAA;gBACA,IAAI,SAAA,GAAY,cAAA,CAAe,SAAf,CAAyB,yBAAzB,CAAA,GACV,IAAA,CAAK,UAAL,CAAgB,SADN,GAEV,IAAA,CAAK,UAAL,CAAgB,GAAhB,CAAoB,SAApB,CAAA,IACA,CAAC,IAAA,CAAK,UAAL,CAAgB,GAAhB,CAAoB,aAApB,CAHP,CAAA;;gBAKA,IAAI,SAAJ,EAAe;oBACX,IAAA,GAAA,QAAA,GAAgB,IAAA,CACZ,yCADY,CAAhB,GAAA,oFAAA,GAEsF,IAAA,CAClF,8BADkF,CAFtF,GAAA,aAAA,CAAA;iBADJ,MAMO,IAAI,IAAA,CAAK,UAAL,CAAgB,GAAhB,CAAoB,YAApB,CAAJ,EAAuC;oBAC1C,IAAA,GAAO,IAAA,CAAK,kCAAL,CAAP,CAAA;iBADG,MAEA,IAAI,MAAA,CAAO,SAAP,CAAiB,SAArB,EAAgC;oBACnC,IAAA,GAAO,IAAA,CAAK,4BAAL,CAAP,CAAA;iBACH;;gBAED,OAAA,4EAAA,GACsC,IAAA,CACtB,oCADsB,CADtC,GAAA,yCAAA,GAIoB,IAAA,CAAK,+BAAL,EAAsC;oBAC1C,gBAAA,EACI,IAAA,CAAK,UAAL,CAAgB,GAAhB,CAAoB,kBAApB,CAFsC;oBAG1C,WAAA,EAAa,IAAA,CAAK,UAAL,CAAgB,GAAhB,CAAoB,aAApB,CAAA;iBAHT,CAJpB,GAAA,yDAAA,IAWY,IAAA,GAAA,0CAAA,GACiD,IAAA,CACvC,MADuC,CADjD,GAAA,eAAA,GAGuB,IAHvB,GAAA,aAAA,GAIM,EAflB,CAAA,CAAA;aAnBJ,MAoCO;gBACH,IAAI,IAAA,GAAO,IAAI,iBAAA,CAAA,SAAA,CAAJ,CAAoB;oBAC3B,KAAA,EAAO,IAAA,CAAK,UADe;oBAE3B,IAAA,EAAM,iBAAA;iBAFC,CAAA,CAGR,MAHQ,EAAX,CAAA;gBAIA,OAAO,IAAA,CAAK,GAAL,CAAS,IAAT,EAAP,CAAA;aACH;SACJ;;;8CAEqB;YAClB,IAAA,CAAK,eAAL,CAAqB,KAArB,EAAA,CAAA;;YAEA,IAAM,WAAA,GAAA,EAAA,GAAiB,MAAA,CAAO,GAAP,CAAW,MAAA,CAAO,MAAP,CAAc,cAAzB,EAAyC;gBAC5D,EAAA,EAAI,IAAA,CAAK,UAAL,CAAgB,UAAhB,CAA2B,EAAA;aADZ,CAAjB,IAED,IAAA,CAAK,aAAL,GAAA,iBAAA,GAAuC,IAAA,CAAK,aAA5C,GAA8D,EAF7D,CAAN,CAAA;;YAIA,IAAA,CAAK,eAAL,CAAqB,MAArB,CAA4B,CAAA,CAAA,EAAA,0BAAA,CAAA,SAAA,CAAA,EAAsB,EAAE,WAAA,EAAA,WAAF,EAAtB,CAA5B,CAAA,CAAA;;YAEA,IAAA,CAAK,mBAAL,GAA2B,IAAI,qBAAA,CAAA,SAAA,CAAJ,CAAwB;gBAC/C,EAAA,EAAI,IAAA,CAAK,eAAL,CAAqB,IAArB,CAA0B,gBAA1B,CAD2C;gBAE/C,GAAA,EAAK,IAAA,CAAK,GAFqC;gBAG/C,IAAA,EAAM,WAAA,CAAA,SAAA,CAHyC;gBAI/C,UAAA,EAAY;oBACR,OAAA,EAAO,0EAAA;iBALoC;gBAO/C,UAAA,EAAY,IAAA,CAAK,UAP8B;gBAQ/C,WAAA,EAAa,EAAE,MAAA,EAAQ,GAAV,EAAe,MAAA,EAAQ,GAAvB,EAA4B,OAAA,EAAS,GAArC,EAAA;aARU,CAA3B,CAAA;SAUH;;;0CAEiB;YACd,IAAI,kBAAA,GAAqB,MAAA,CAAO,GAAP,CAAW,MAAA,CAAO,MAAP,CAAc,YAAzB,EAAuC;gBAC5D,IAAA,EAAM,WADsD;gBAE5D,KAAA,EAAO,IAAA,CAAK,UAAL,CAAgB,GAAhB,CAAoB,gBAApB,CAFqD;gBAG5D,MAAA,EAAQ,YAAA;aAHa,CAAzB,CAAA;;YAMA,IAAA,CAAK,GAAL,CAAS,MAAT,CACI,IAAA,CAAK,gBAAL,CAAsB;gBAClB,qBAAA,EACI,IAAA,CAAK,mBAAL,IACA,CAAC,cAAA,CAAe,SAAf,CAAyB,gBAAzB,CADD,GAEM,oCAFN,GAGM,wBALQ;gBAMlB,cAAA,EAAgB,MAAA,CAAO,GAAP,CAAW,MAAA,CAAO,MAAP,CAAc,YAAzB,CANE;gBAOlB,KAAA,EAAO,IAAA,CAAK,KAPM;gBAQlB,UAAA,EAAY,IAAA,CAAK,UAAL,CAAgB,UARV;gBASlB,gBAAA,EAAkB,kBATA;gBAUlB,SAAA,EAAW,IAAA,CAAK,eAAL,EAVO;gBAWlB,WAAA,EAAa,IAAA,CAAK,WAXA;gBAYlB,gBAAA,EAAkB,IAAA,CAAK,gBAAA;aAZ3B,CADJ,CAAA,CAAA;SAgBH;;;;EAlKyC,QAAA,CAAS;;qBAAlC;;;;;;ACfrB,IAAA,cAAA,GAAA,OAAA,CAAA,4BAAA,CAAA,CAAA;;;;AACA,IAAA,YAAA,GAAA,OAAA,CAAA,gCAAA,CAAA,CAAA;;;;AAHA,IAAM,QAAA,GAAY,MAAA,CAAO,QAAzB,CAAA;;AAKA;AACA,IAAM,IAAA,GAAO,OAAA,CAAQ,MAAR,CAAb,CAAA;AACA,IAAM,gBAAA,GAAmB,u7BAAzB,CAAA;;AAEA,IAAM,aAAA,GAAgB,QAAA,CAAS,IAAT,CAAc,MAAd,CAAqB;IACvC,QAAA,EAAU,CAAA,CAAE,QAAF,CAAW,gBAAX,CAD6B;;IAGvC,UAHuC,EAAA,SAAA,UAAA,CAG5B,GAH4B,EAGvB,UAHuB,EAGX;QAAA,IAAA,KAAA,GAAA,IAAA,CAAA;;QACxB,IAAA,CAAK,GAAL,GAAW,GAAX,CAAA;;QAEA,IAAM,QAAA,GAAW;YACb,SAAA,EAAW,CAAA,CAAA,EAAA,YAAA,CAAA,WAAA,EAAY,iBAAZ,CADE;YAEb,IAAA,EAAM,MAAA,CAAO,IAFA;YAGb,IAAA,EAAM,MAAA,CAAO,IAAA;SAHjB,CAAA;;QAMA,IAAA,CAAK,GAAL,CAAS,IAAT,CAAc,IAAA,CAAK,QAAL,CAAc,QAAd,CAAd,CAAA,CAAA;;QAEA,IAAI,aAAA,GAAgB;YAChB,QAAA,EAAU,KADM;YAEhB,UAAA,EAAY,MAAA,CAAO,IAAP,CAAY,gCAAZ,CAFI;YAGhB,KAAA,EAAO,MAAA,CAAO,IAAP,CAAY,YAAZ,CAHS;YAIhB,OAAA,EAAS,CAAC,OAAD,EAAU,eAAV,CAJO;YAKhB,OAAA,EAAS,IAAA,CAAK,GAAA;SALlB,CAAA;;QAQA,IAAA,CAAK,KAAL,GAAa,IAAI,eAAA,CAAA,SAAA,CAAJ,CAAkB,aAAlB,CAAb,CAAA;;QAEA,IAAA,CAAK,KAAL,CAAW,IAAX,EAAA,CAAA;;QAEA,IAAA,CAAK,KAAL,CAAW,EAAX,CAAc,QAAd,EAAwB,YAAA;YAAA,OAAM,KAAA,CAAK,GAAL,CAAS,OAAT,CAAiB,0BAAjB,EAA6C,EAAE,KAAA,EAAO,UAAT,EAA7C,CAAN,CAAA;SAAxB,CAAA,CAAA;;QAEA,IAAA,CAAK,QAAL,CAAc,IAAA,CAAK,GAAnB,EAAwB,gBAAxB,EAA0C,YAAM;YAAE,KAAA,CAAK,KAAL,CAAW,KAAX,EAAA,CAAA;SAAlD,CAAA,CAAA;KACH;CA7BiB,CAAtB,CAAA;;AAgCA,MAAA,CAAO,OAAP,GAAiB,aAAjB,CAAA;;;;;;;;;;;;ACzCA;;;;AACA;;;;;;;;;;;;IAEqB,c;;;AAGjB,kCAAkE;AAAA,YAApD,GAAoD,QAApD,GAAoD;AAAA,YAA/C,UAA+C,QAA/C,UAA+C;AAAA,YAAnC,OAAmC,QAAnC,OAAmC;AAAA,uCAA1B,cAA0B;AAAA,YAA1B,cAA0B,uCAAT,KAAS;;AAAA;;AAAA,qIACrD,SADqD;;AAAA,cAFlE,QAEkE,GAFvD,2BAEuD;;;AAG9D,cAAK,UAAL,GAAkB,UAAlB;AACA,cAAK,OAAL,GAAkB,OAAlB;AACA,cAAK,GAAL,GAAkB,GAAlB;AACA,cAAK,IAAL,GAAkB,OAAO,IAAzB;AACA,cAAK,cAAL,GAAsB,cAAtB;;AAEA,cAAK,IAAL,CAAU,MAAV,CAAiB,IAAjB,CAAsB,YAAM;AACxB,kBAAK,MAAL;AACA,kBAAK,WAAL;AACH,SAHD;AAT8D;AAajE;;;;iCAEQ;AAAA;;AACL,gBAAM,WAAW;AACb,uBAAoB,KAAK,UAAL,CAAgB,GAAhB,CAAoB,OAApB,CADP;AAEb,sBAAoB,KAAK,UAAL,CAAgB,GAAhB,CAAoB,MAApB,CAFP;AAGb,0BAAoB,KAAK,UAAL,CAAgB,WAAhB,CAA4B,GAA5B,CAHP;AAIb,oBAAoB,KAAK,UAAL,CAAgB,EAJvB;AAKb,mCAAoB,KAAK,UAAL,CAAgB,GAAhB,CAAoB,mBAApB,CALP;AAMb,gCAAoB,KAAK,UAAL,CAAgB,GAAhB,CAAoB,sBAApB,CANP;AAOb,6BAAoB,KAAK,UAAL,CAAgB,GAAhB,CAAoB,aAApB,CAPP;AAQb;AACA,6BAAoB,OAAO,OAAO,SAAP,CAAiB,WAAxB,EAAqC,OAArC,CAA6C,OAA7C,EAAsD,IAAtD,CATP;AAUb,sBAAoB,OAAO,IAVd;AAWb,sBAAoB,OAAO,IAXd;AAYb,gCAAoB,KAAK;AAZZ,aAAjB;;AAeA,iBAAK,GAAL,CAAS,IAAT,CAAc,KAAK,QAAL,CAAc,QAAd,CAAd;;AAEA,iBAAK,KAAL,GAAa,KAAK,GAAL,CAAS,IAAT,CAAc,MAAd,CAAb;;AAEA,gBAAI,KAAK,UAAL,CAAgB,kBAApB,EAAwC;AACpC,qBAAK,UAAL,CAAgB,GAAhB,CAAoB,YAApB,EAAkC,MAAlC;AACH;;AAED,iBAAK,iBAAL,GAAyB,IAAI,8BAAJ,CAAsB;AAC3C,uBAAU,KAAK,UAD4B;AAE3C,sBAAU,QAFiC;AAG3C,oBAAU,KAAK,KAAL,CAAW,IAAX,CAAgB,cAAhB,CAHiC;AAI3C,wBAAU;AAAA,2BAAM,OAAK,KAAL,CAAW,MAAX,EAAN;AAAA;AAJiC,aAAtB,CAAzB;AAMH;;;sCAEa;AAAA;;AACV,iBAAK,KAAL,CACK,UADL,CACgB,OADhB,EACyB,QADzB,EAEK,EAFL,CAEQ,mBAFR,EAE6B,YAAM;AAC3B,uBAAK,IAAL,CAAU,YAAV,CAAuB,OAAK,GAAL,CAAS,IAAT,CAAc,2BAAd,EAA2C,GAA3C,GAAiD,IAAjD,EAAvB;AACA,uBAAK,GAAL,CAAS,OAAT,CAAiB,YAAjB,EAA+B,OAAK,UAApC,EAAgD,OAAK,OAArD;AACH,aALL;AAMH;;;;EAzDuC,SAAS,I;;qBAAhC,c;;;;;;;;;;;ACHrB;;AACA;;;;;;;;;;;;IAEqB,kB;;;;;;;;;;;yCACgB;AAAA;;AAAA,gBAArB,GAAqB,QAArB,GAAqB;AAAA,gBAAhB,KAAgB,QAAhB,KAAgB;AAAA,gBAAT,MAAS,QAAT,MAAS;;AAC7B,iBAAK,GAAL,GAAkB,GAAlB;AACA,iBAAK,MAAL,GAAkB,UAAW,YAAM,CAAE,CAArC;;AAEA,gBAAM,WAAY;AACd,sBAAkB,OAAO,IAAP,CAAY,8BAAZ,CADJ;AAEd,2BAAkB,OAAO,IAAP,CAAY,4BAAZ,EAA0C,EAAE,OAAO,MAAM,UAAN,CAAiB,KAA1B,EAA1C,CAFJ;AAGd,8BAAkB,OAAO,IAAP,CAAY,uBAAZ,CAHJ;AAId,8BAAkB,OAAO,IAAP,CAAY,QAAZ;AAJJ,aAAlB;;AAOA,gBAAM,UAAU,EAAE,gCAA2B,QAA3B,CAAF,CAAhB;;AAEA,gBAAI,gBAAgB;AAChB,0BAAU,KADM;AAEhB,uBAAO,OAAO,IAAP,CAAY,uBAAZ,CAFS;AAGhB,yBAAS,OAHO;AAIhB,oBAAI;AAJY,aAApB;;AAOA,iBAAK,KAAL,GAAa,IAAI,YAAJ,CAAU,aAAV,CAAb;;AAEA,iBAAK,KAAL,CAAW,GAAX,CAAe,IAAf,CAAoB,YAApB,EAAkC,EAAlC,CAAqC,OAArC,EAA8C,YAAM;AAChD,uBAAK,KAAL,CAAW,KAAX;AACH,aAFD;;AAIA,iBAAK,KAAL,CAAW,GAAX,CAAe,IAAf,CAAoB,oBAApB,EAA0C,EAA1C,CAA6C,OAA7C,EAAsD,YAAM;AACxD,uBAAK,MAAL;AACA,uBAAK,KAAL,CAAW,KAAX;AACH,aAHD;;AAKA,iBAAK,KAAL,CAAW,IAAX;AACH;;;;EAjC2C,SAAS,I;;qBAApC,kB;;;;;;;;;;;;;ACHrB;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;;;;;;;;;;;IAEqB,S;;;;;4BACD;AACZ,mBAAO,YAAP;AACH;;;AAED,yBAAc;AAAA;;AAAA,2HACD,SADC;;AAEV,cAAK,MAAL,GAAc,EAAd;;AAEA,cAAK,MAAL;AAJU;AAKb;;;;iCAEQ;AACL,iBAAK,MAAL,CAAY,OAAZ,CAAoB,UAAC,IAAD;AAAA,uBAAU,KAAK,MAAL,EAAV;AAAA,aAApB;AACA,iBAAK,MAAL,GAAc,EAAd;AACH;;;iCAEQ;AACL,iBAAK,MAAL;AACA;AACH;;;iCAEQ;AAAA;;AACL,iBAAK,MAAL;;AAEA,iBAAK,MAAL,CAAY,IAAZ,CACK,KAAK,SAAL,GAAiB,IAAI,sBAAJ,CAAc,EAAE,OAAO,KAAK,KAAd,EAAd,CADtB;;AAIA,gBAAI,CAAC,OAAO,cAAP,CAAsB,SAAtB,CAAgC,SAAhC,CAAL,EAAiD;AAC7C,qBAAK,MAAL,CAAY,IAAZ,CACK,KAAK,WAAL,GAAmB,IAAI,wBAAJ,CAAgB,EAAE,OAAO,KAAK,KAAd,EAAhB,CADxB;AAGA,qBAAK,WAAL,CAAiB,GAAjB,CAAqB,QAArB,CAA8B,YAA9B;AACH;AACD,gBAAI,KAAK,KAAL,CAAW,UAAf,EAA2B;AACvB,qBAAK,MAAL,CAAY,IAAZ,CACK,KAAK,YAAL,GAAoB,IAAI,yBAAJ,CAAiB,EAAE,OAAO,KAAK,KAAd,EAAjB,CADzB;AAGH,aAJD,MAIO,IAAI,CAAC,OAAO,cAAP,CAAsB,SAAtB,CAAgC,SAAhC,CAAL,EAAiD;AACpD,qBAAK,MAAL,CAAY,IAAZ,CACK,KAAK,WAAL,GAAmB,IAAI,wBAAJ,CAAgB,EAAE,OAAO,KAAK,KAAd,EAAhB,CADxB;AAGH;;AAED,iBAAK,MAAL,CAAY,IAAZ,CACK,KAAK,gBAAL,GAAwB,IAAI,6BAAJ,CAAqB;AAC1C,wBAAQ,KAAK,KAAL,CAAW,GAAX,CAAe,MAAf,EAAuB;AADW,aAArB,CAD7B;;AAMA,iBAAK,GAAL,CAAS,KAAT;AACA,yBAAK,GAAL,EAAS,MAAT,gCAAmB,KAAK,MAAL,CAAY,GAAZ,CAAgB,UAAC,IAAD;AAAA,uBAAU,KAAK,GAAf;AAAA,aAAhB,CAAnB;AACH;;;;EArDkC,SAAS,I;;qBAA3B,S;;;;;;;;ACNrB,IAAM,QAAA,GAAY,MAAA,CAAO,QAAzB,CAAA;AACA,IAAM,cAAA,GAAwB,MAAA,CAAO,cAArC,CAAA;;AAEA;AACA,IAAM,IAAA,GAAO,OAAA,CAAQ,MAAR,CAAb,CAAA;AACA,IAAM,mBAAA,GAAsB,+HAA5B,CAAA;;AAEA,IAAM,WAAA,GAAc,QAAA,CAAS,IAAT,CAAc,MAAd,CAAqB;IACrC,QAAA,EAAU,CAAA,CAAE,QAAF,CAAW,mBAAX,CAD2B;;IAGrC,SAAA,EAAW,cAH0B;;IAKrC,OAAA,EAAS,GAL4B;;IAOrC,UAPqC,EAAA,SAAA,UAAA,GAOxB;QACT,IAAI,IAAA,CAAK,KAAL,CAAW,GAAX,CAAe,MAAf,CAAA,CAAuB,EAAvB,KAA8B,aAAlC,EAAiD;YAC7C,IAAA,CAAK,MAAL,EAAA,CAAA;SACH;KAVgC;IAarC,MAbqC,EAAA,SAAA,MAAA,GAa5B;QACL,IAAI,KAAA,GAAQ,IAAA,CAAK,KAAL,CAAW,MAAX,EAAZ,CAAA;;QAEA,IAAI,KAAA,CAAM,gBAAN,IAA0B,IAA1B,IAAkC,CAAC,CAAA,CAAE,OAAF,CAAU,KAAA,CAAM,gBAAhB,CAAvC,EAA0E;YACtE,IAAI,WAAA,GAAc,cAAA,CAAe,SAAf,CAAyB,mBAAzB,CAAA,GAAgD,KAAA,CAAM,gBAAtD,GAAyE,CAAA,CAAE,MAAF,CAAS,KAAA,CAAM,gBAAf,CAA3F,CAAA;;YAEA,IAAM,QAAA,GAAW;gBACb,IAAA,EAAc,MAAA,CAAO,GAAP,CAAW,MAAA,CAAO,MAAP,CAAc,YAAzB,EAAuC,EAAE,IAAA,EAAM,WAAR,EAAqB,KAAA,EAAO,KAAA,CAAM,cAAlC,EAAkD,MAAA,EAAQ,YAA1D,EAAvC,CADD;gBAEb,KAAA,EAAc,MAAA,CAAO,IAAP,CAAY,sBAAZ,EAAoC,EAAE,MAAA,EAAQ,WAAV,EAApC,CAFD;gBAGb,IAAA,EAAc,WAAA;aAHlB,CAAA;;YAMA,IAAA,CAAK,GAAL,CAAS,IAAT,CAAc,MAAA,CAAO,IAAP,CAAY,QAAZ,EAAsB,EAAE,OAAA,EAAS,IAAA,CAAK,QAAL,CAAc,QAAd,CAAX,EAAtB,CAAd,CAAA,CAAA;SATJ,MAUK;YACD,IAAG,CAAC,cAAA,CAAe,SAAf,CAAyB,eAAzB,CAAJ,EAA8C;gBAC1C,IAAA,CAAK,GAAL,CAAS,IAAT,CAAc,MAAA,CAAO,IAAP,CAAY,yBAAZ,CAAd,CAAA,CAAA;aACH;SACJ;KACJ;CA/Be,CAApB,CAAA;;qBAmCe;;;;;;;;;;;;;;;;;;ICzCM,Y;;;AACjB,4BAAc;AAAA;;AAAA,iIACD,SADC;;AAEV,cAAK,MAAL;AAFU;AAGb;;;;iCAEQ;AACL,gBAAI,OAAO,kCAAgC,KAAK,KAAL,CAAW,GAAX,CAAe,SAAf,CAAhC,YAAX;AACA,iBAAK,UAAL,CAAgB,IAAhB;AACH;;;;EATqC,SAAS,I;;qBAA9B,Y;;;;;;;;;ACDrB;;;;;;AAEA,IAAM,mBAAmB,SAAS,IAAT,CAAc,MAAd,CAAqB;AAC1C,cAD0C,4BACrB;AAAA,YAAT,MAAS,QAAT,MAAS;;AACjB,aAAK,MAAL,GAAc,MAAd;AACA,aAAK,MAAL;AACH,KAJyC;AAM1C,UAN0C,oBAMjC;AACL,aAAK,UAAL,CAAgB,EAAE,mCAAyB,EAAC,QAAQ,KAAK,MAAd,EAAzB,CAAF,CAAhB;AACH;AARyC,CAArB,CAAzB;;qBAWe,gB;;;;;;;;;;;ACbf;;;;;;;;;;;;IAEqB,S;;;AACjB,yBAAc;AAAA;;AAAA,2HACD,SADC;;AAGV,cAAK,QAAL,GAAgB,sBAAhB;AACA,cAAK,MAAL;AAJU;AAKb;;;;yCAEgB;AACb,gBAAI,aAAa,EAAjB;;AAEA,uBAAW,IAAX,CAAgB,KAAK,KAAL,CAAW,GAAX,CAAe,OAAf,CAAhB;;AAEA,gBAAI,CAAC,CAAC,KAAK,KAAL,CAAW,GAAX,CAAe,kBAAf,CAAN,EAA0C;AACtC,2BAAW,IAAX,CAAgB,OAAO,IAAP,CAAY,QAAZ,EAAsB,EAAC,SAAS,KAAK,KAAL,CAAW,UAAX,GAAwB,KAAK,KAAL,CAAW,GAAX,CAAe,WAAf,EAA4B,IAApD,GAA2D,KAAK,KAAL,CAAW,GAAX,CAAe,kBAAf,CAArE,EAAtB,CAAhB;AACH;;AAED,uBAAW,IAAX,CAAgB,KAAK,KAAL,CAAW,gBAAX,EAAhB;;AAEA,uBAAW,IAAX,CAAgB,KAAK,KAAL,CAAW,GAAX,CAAe,MAAf,EAAuB,IAAvC;;AAEA,mBAAO,WAAW,IAAX,CAAgB,GAAhB,CAAP;AACH;;;iCAEQ;AACL,gBAAM,WAAW;AACb,yBAAY,KAAK,KAAL,CAAW,EADV;AAEb,sBAAY,KAAK,KAAL,CAAW,eAFV;AAGb,2BAAY,EAAE,MAAF,CAAS,KAAK,cAAL,EAAT,CAHC;AAIb,uBAAY,KAAK,KAAL,CAAW,GAAX,CAAe,OAAf;AAJC,aAAjB;;AAOA,iBAAK,UAAL,CAAgB,EAAE,KAAK,QAAL,CAAc,QAAd,CAAF,CAAhB;AACH;;;;EAjCkC,SAAS,I;;qBAA3B,S;;;;;;;;;ACFrB;;;;;;AAEA,IAAM,kBAAkB,SAAlB,eAAkB,OAAU;AAAA,QAAR,EAAQ,QAAR,EAAQ;;AAC9B,QAAM,OAAO,IAAI,gCAAJ,CAA0B,EAAC,MAAD,EAA1B,CAAb,CAD8B,CACgB;AAC9C,WAAO,qBAAP,GAA+B,IAA/B;AACH,CAHD;;qBAKe,e;;;;;;;;;ACPf;;;;;;AAEA,IAAM,wBAAwB,kBAAS,MAAT,CAAgB;AAC1C,YAAQ;AACJ,uCAA+B;AAD3B,KADkC;AAI1C,cAJ0C,4BAIzB;AAAA,YAAL,EAAK,QAAL,EAAK;;AACb,aAAK,EAAL,GAAU,EAAV;AACA,aAAK,gBAAL,GAAwB,EAAE,uBAAF,CAAxB;AACA,aAAK,mBAAL,GAA2B,EAAE,yBAAF,CAA3B;AACH,KARyC;AAS1C,QAT0C,kBASnC;AACH,UAAE,sBAAF,EAA0B,QAA1B,CAAmC,iBAAnC;AACA,aAAK,gBAAL,CAAsB,GAAtB,CAA0B,KAAK,mBAAL,CAAyB,CAAzB,CAA1B,EAAuD,QAAvD,CAAgE,SAAhE;;AAEA;AACA,UAAE,QAAF,EAAY,UAAZ,CAAuB,UAAvB,EAAmC,OAAnC,EAA4C,EAAE,yBAAF,CAA5C;AACA,YAAI,OAAJ,EAAa,QAAQ,WAAR;AAChB,KAhByC;AAiB1C,SAjB0C,mBAiBlC;AACJ,UAAE,sBAAF,EAA0B,WAA1B,CAAsC,iBAAtC;AACA,aAAK,gBAAL,CAAsB,GAAtB,CAA0B,KAAK,mBAAL,CAAyB,CAAzB,CAA1B,EAAuD,WAAvD,CAAmE,SAAnE;AACA,YAAI,OAAJ,EAAa,QAAQ,WAAR;AAChB,KArByC;AAsB1C,yBAtB0C,mCAsBlB;AACpB,YAAI,KAAK,gBAAL,CAAsB,QAAtB,CAA+B,SAA/B,CAAJ,EAA+C;AAC3C,iBAAK,KAAL;AACH,SAFD,MAEO;AACH,iBAAK,IAAL;AACH;AACJ;AA5ByC,CAAhB,CAA9B;;qBA+Be,qB;;;;;;;;;;;ACjCf;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;;;;;;;;;cAEiB,M;IAAT,I,WAAA,I;;IAEa,oB;;;AACjB,kCAAY,UAAZ,EAAsC;AAAA,YAAd,OAAc,uEAAJ,EAAI;;AAAA;;AAClC,YAAM,UAAU,KACZ,QAAQ,UAAR,GACM,0CADN,GAEM,kCAHM,EAIZ;AACI,wDAA0C,WAAW,GAAX,CACtC,OADsC,CAA1C;AADJ,SAJY,CAAhB;;AAWA,YAAM,gBAAgB;AAClB,qBAAS,CAAC,sBAAD,CADS;AAElB,mBAAO,KAAK,8BAAL,CAFW;AAGlB,qBAAS,sCAAS,EAAE,sBAAF,EAAc,gBAAd,EAAuB,gBAAvB,EAAT;AAHS,SAAtB;;AAZkC,gJAkB5B,aAlB4B;;AAoBlC,cAAK,UAAL,GAAkB,IAAI,4BAAJ,EAAlB;AACA,cAAK,UAAL,CAAgB,GAAhB,GAAyB,OAAO,GAAP,CACrB,OAAO,MAAP,CAAc,IAAd,CAAmB,KAAnB,CAAyB,gBADJ,EAErB,EAAE,IAAI,WAAW,EAAjB,EAFqB,CAAzB;AAIA,cAAK,UAAL,CAAgB,KAAhB,GAAwB,UAAC,QAAD,EAAc;AAClC,mBAAO,EAAE,MAAF,CAAS,SAAS,MAAlB,CAAP;AACH,SAFD;AAGA,cAAK,eAAL,GAAuB,MAAK,CAAL,CAAO,yBAAP,CAAvB;AACA,cAAK,UAAL,GAAkB,UAAlB;AACA,cAAK,kBAAL;;AAEA,YAAI,QAAQ,UAAZ,EAAwB;AACpB,kBAAK,SAAL,GAAiB,IAAI,oBAAJ,CAAY;AACzB,wBAAQ,MAAK,GAAL,CAAS,IAAT,CAAc,kBAAd,CADiB;AAEzB,kCAAgB,KAAK,mCAAL,CAAhB;AAFyB,aAAZ,CAAjB;AAIH;AArCiC;AAsCrC;;;;6CAEoB;AAAA;;AACjB,iBAAK,UAAL,CACK,KADL,GAEK,IAFL,CAEU,UAAC,GAAD,EAAS;AACX,oBAAI,EAAE,IAAI,MAAN,EAAc,OAAd,EAAJ,EAA6B;AACzB,2BAAK,eAAL,CAAqB,KAArB;AACA;AACH;;AAED,uBAAK,mBAAL;AACH,aATL,EAUK,IAVL,CAUU,YAAM;AACR,uBAAK,eAAL,CAAqB,KAArB;AACH,aAZL;AAaH;;;8CAEqB;AAClB,iBAAK,eAAL,CAAqB,KAArB;AACA,iBAAK,eAAL,CAAqB,MAArB,CACI,2CAAsB,EAAE,YAAY,KAAK,UAAL,CAAgB,UAA9B,EAAtB,CADJ;;AAIA,iBAAK,mBAAL,GAA2B,IAAI,gCAAJ,CAAwB;AAC/C,oBAAI,KAAK,eAAL,CAAqB,IAArB,CAA0B,gBAA1B,CAD2C;AAE/C,qBAAK,KAAK,GAFqC;AAG/C,sBAAM,sBAHyC;AAI/C,4BAAY;AACR,6BAAO;AADC,iBAJmC;AAO/C,4BAAY,KAAK,UAP8B;AAQ/C,6BAAa,EAAE,QAAQ,GAAV,EAAe,QAAQ,GAAvB,EAA4B,SAAS,GAArC;AARkC,aAAxB,CAA3B;AAUH;;;;EAzE6C,Y;;qBAA7B,oB;;;;;;;;;qBCVP;AAAA,QAAE,UAAF,QAAE,UAAF;AAAA,QAAc,OAAd,QAAc,OAAd;AAAA,QAAuB,OAAvB,QAAuB,OAAvB;AAAA,iGAGA,OAHA,uBAIA,QAAQ,UAAR,IAAsB,CAAC,WAAW,GAAX,CAAe,UAAf,CAAvB,yUAMI,EAVJ,wBAWA,WAAW,GAAX,CAAe,UAAf,yDACkC,OAAO,IAAP,CAAY,kCAAZ,EAAgD,EAAC,OAAO,WAAW,KAAnB,EAAhD,CADlC,0BAEE,EAbF;AAAA,C;;;;;;;;;;;ACAd;;;;AACA;;;;AACA;;;;;;;;;;;;cACsB,M;IAAd,I,WAAA,I;IAAM,G,WAAA,G;;IAEO,kB;;;AACjB,kCAAc;AAAA;;AAAA,6IACD,SADC;;AAEV,cAAK,UAAL,GAAkB,EAAE,yBAAF,CAAlB;AACA,cAAK,MAAL,GAAc,KAAd;AACA,cAAK,SAAL,GAAiB,CAAjB;AACA,cAAK,kBAAL,GAA0B,CAA1B;AACA,cAAK,OAAL,GAAe,CAAf;AACA,cAAK,aAAL,GAAqB,EAArB;;AAEA,cAAK,WAAL;AACA,cAAK,QAAL;;AAEA,cAAK,GAAL,CAAS,EAAT,CAAY,OAAZ,EAAqB,UAAC,CAAD,EAAO;AACxB;AACA,cAAE,eAAF;AACH,SAHD;;AAKA,UAAE,MAAF,EAAU,EAAV,CAAa,OAAb,EAAsB,UAAC,CAAD;AAAA,mBAAO,MAAK,QAAL,CAAc,CAAd,CAAP;AAAA,SAAtB;AACA,cAAK,UAAL,CAAgB,EAAhB,CAAmB,OAAnB,EAA4B,UAAC,CAAD;AAAA,mBAAO,MAAK,MAAL,CAAY,CAAZ,CAAP;AAAA,SAA5B;;AAEA,cAAK,GAAL,CAAS,EAAT,CAAY,OAAZ,EAAqB,UAAC,CAAD,EAAO;AACxB,gBAAI,EAAE,KAAF,KAAY,sBAAK,GAArB,EAA0B;AACtB,sBAAK,QAAL,CAAc,CAAd;AACH;AACJ,SAJD;AApBU;AAyBb;;;;gCAEO;AACJ,iBAAK,GAAL,CAAS,MAAT;AACA,iBAAK,MAAL,GAAc,KAAd;AACH;;;iCAEQ,C,EAAG;AACR,gBAAI,KAAK,MAAL,IAAe,CAAf,IAAoB,CAAC,EAAE,aAAF,CAAgB,iBAAzC,EAA4D;AACxD,qBAAK,KAAL;AACH;AACJ;;;6BAEI,C,EAAG;AAAA;;AACJ,gBAAI,CAAC,KAAK,MAAV,EAAkB;AACd,kBAAE,aAAF,CAAgB,iBAAhB,GAAoC,IAApC;AACA;AACA,kBAAE,EAAE,aAAJ,EACK,QADL,CACc,yBADd,EAEK,MAFL,CAEY,KAAK,GAFjB;AAGA,qBAAK,MAAL,GAAc,IAAd;AACA,kBAAE,oBAAF,EAAwB,WAAxB,CAAoC,MAApC;AACA;;AAEA,qBAAK,GAAL,CAAS,IAAT,CAAc,oBAAd,EAAoC,KAApC,GAA4C,KAA5C;;AAEA,qBAAK,GAAL,CAAS,EAAT,CAAY,SAAZ,EAAuB,UAAC,EAAD,EAAQ;AAC3B,wBAAI,GAAG,KAAH,KAAa,sBAAK,GAAtB,EAA2B;AACvB,+BAAK,SAAL,CAAe,EAAf;AACH;AACJ,iBAJD;AAKH;AACJ;;;+BAEM,C,EAAG;AACN,gBAAI,KAAK,MAAT,EAAiB;AACb,qBAAK,QAAL,CAAc,CAAd;AACA,kBAAE,eAAF;AACH,aAHD,MAGO;AACH,qBAAK,IAAL,CAAU,CAAV;AACH;AACJ;;;kCAES,C,EAAG;AACT,gBAAM,aAAa,EAAE,SAAS,aAAX,CAAnB;AACA,gBAAM,iBACF,KAAK,CAAL,CAAO,oBAAP,EAA6B,CAA7B,KACA,KAAK,GAAL,CAAS,IAAT,CAAc,oBAAd,EAAoC,KAApC,EAFJ;AAGA,gBAAM,gBAAgB,KAAK,GAAL,CAAS,IAAT,CAAc,6BAAd,EAClB,KAAK,GAAL,CAAS,IAAT,CAAc,6BAAd,EAA6C,MAA7C,GAAsD,CADpC,CAAtB;;AAIA,gBACI,WAAW,EAAX,CAAc,cAAd,KACA,EAAE,KAAF,KAAY,sBAAK,GADjB,IAEA,EAAE,QAHN,EAIE;AACE,kBAAE,cAAF;AACA,8BAAc,KAAd;AACH,aAPD,MAOO,IACH,EAAE,UAAF,EAAc,EAAd,CAAiB,aAAjB,KACA,EAAE,KAAF,KAAY,sBAAK,GADjB,IAEA,CAAC,EAAE,QAHA,EAIL;AACE,kBAAE,cAAF;AACA,+BAAe,KAAf;AACH;AACJ;;;qCAEY,M,EAAQ;AACjB,mBAAO,MAAP,CAAc,KAAK,QAAnB;AACH;;;sCAEa;AACV,iBAAK,QAAL,CAAc,MAAd;AACH;;;qCAEY,W,EAAa;AACtB,cAAE,2BAAF,EAA+B,GAA/B,CAAmC,SAAnC,EAA8C,OAA9C;AACA,cAAE,kCAAF,EAAsC,GAAtC,CAA0C,SAA1C,EAAqD,cAArD;AACA,cAAE,yBAAF,EAA6B,IAA7B,CACI,YADJ,EAEI,KAAK,wCAAL,EAA+C,EAAE,KAAK,WAAP,EAA/C,CAFJ;AAIA,cAAE,yBAAF,EAA6B,IAA7B,CAAkC,MAAlC,EAA0C,cAA1C;AACA,cAAE,oBAAF,EAAwB,QAAxB,CAAiC,MAAjC;AACH;;;sCAEa;AACV,iBAAK,GAAL,CAAS,KAAT;AACA,iBAAK,GAAL,CAAS,MAAT;AAQA,iBAAK,QAAL,GAAgB,KAAK,GAAL,CAAS,IAAT,CAAc,aAAd,CAAhB;AACA,iBAAK,cAAL,GAAsB,KAAK,GAAL,CAAS,IAAT,CAAc,yBAAd,CAAtB;AACA,iBAAK,MAAL,GAAc,KAAK,GAAL,CAAS,IAAT,CAAc,qBAAd,CAAd;AACH;;;mCAMU;AAAA;;AACP,iBAAK,gBAAL,GACK,IADL,CACU,UAAC,GAAD,EAAS;AACX,oBAAI,OAAK,OAAL,KAAiB,CAArB,EAAwB;AACpB,2BAAK,kBAAL,GAA0B,IAAI,gBAA9B;AACA,2BAAK,QAAL,GAAgB,KAAK,IAAL,CACZ,OAAK,kBAAL,GAA0B,OAAK,SADnB,CAAhB;AAGH;;AAED;AACA;AACA;AACA;AACA,oBACI,OACA,IAAI,KADJ,IAEA,IAAI,KAAJ,CAAU,MAAV,KAAqB,CAFrB,IAGA,OAAK,YAJT,EAKE;AACE,2BAAK,OAAL,IAAgB,CAAhB;AACA,2BAAO,OAAK,QAAL,EAAP;AACH;;AAED,uBAAK,WAAL;AACA,oBAAI,OAAO,OAAO,IAAI,KAAX,KAAqB,WAAhC,EAA6C;AACzC,wBAAI,mBAAmB,EAAvB;AACA,wBAAI,KAAJ,CAAU,OAAV,CAAkB,UAAC,CAAD,EAAO;AACrB,4BAAI,OAAO,IAAI,8BAAJ,CAAqB,CAArB,CAAX;AACA,6BAAK,uBAAL,CAA6B;AAAA,mCACzB,OAAK,qBAAL,EADyB;AAAA,yBAA7B;AAGA,yCAAiB,IAAjB,CAAsB,IAAtB;AACH,qBAND;AAOA,2BAAK,aAAL,GACI,OAAK,aAAL,CAAmB,MAAnB,CAA0B,gBAA1B,CADJ;AAEA,2BAAK,UAAL,CAAgB,gBAAhB;AACH;AACJ,aArCL,WAsCW,UAAC,KAAD,EAAW;AACd,uBAAK,WAAL;AACA,uBAAO,MAAP,CAAc,GAAd,CAAkB,OAAlB,EAA2B,8BAA3B,EAA2D;AACvD,6BAAS,MAAM,UAAN,IAAoB;AAD0B,iBAA3D;AAGA,oBAAI,OAAK,OAAL,KAAiB,CAArB,EAAwB;AACpB,2BAAK,cAAL,CACK,KADL,GAEK,MAFL,CAGQ,0CACwC,KAChC,6BADgC,EAEhC,EAAE,MAAM,OAAK,qBAAL,EAAR,EAFgC,CADxC,gBAHR;AAUH,iBAXD,MAWO;AACH,2BAAK,YAAL,CACK,KADL,GAEK,MAFL,8DAG+D,KACnD,6BADmD,CAH/D,SAKa,KACD,gCADC,CALb;AASA,2BAAK,YAAL,CACK,IADL,CACU,yBADV,EAEK,EAFL,CAEQ,OAFR,EAEiB,UAAC,CAAD;AAAA,+BAAO,OAAK,aAAL,CAAmB,CAAnB,CAAP;AAAA,qBAFjB;AAGH;AACJ,aApEL;AAqEH;;;2CAEkB;AAAA;;AACf,mBAAO,IAAI,OAAJ,CAAY,UAAC,OAAD,EAAU,MAAV;AAAA,uBACf,EAAE,IAAF,CAAO;AACH,4BAAQ,KADL;AAEH,yBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,IAAd,CAAmB,mBAAnB,CAAuC,GAAlD,CAFF;AAGH,0BAAM;AACF,oCAAY,OAAK,OADf;AAEF,kCAAU,OAAK;AAFb,qBAHH;AAOH,6BAAS;AAPN,iBAAP,EASK,IATL,CASU,UAAC,QAAD;AAAA,2BAAc,QAAQ,QAAR,CAAd;AAAA,iBATV,EAUK,IAVL,CAUU,UAAC,GAAD,EAAM,MAAN,EAAc,GAAd;AAAA,2BAAsB,OAAO,GAAP,CAAtB;AAAA,iBAVV,CADe;AAAA,aAAZ,CAAP;AAaH;;;mCAEU,a,EAAe;AAAA;;AACtB,gBACI,KAAK,OAAL,KAAiB,CAAjB,KACC,CAAC,aAAD,IAAkB,cAAc,MAAd,KAAyB,CAD5C,CADJ,EAGE;AACE,qBAAK,6BAAL;AACH,aALD,MAKO,IAAI,KAAK,aAAL,CAAmB,MAAnB,GAA4B,CAAhC,EAAmC;AACtC,oBAAI,KAAK,OAAL,KAAiB,CAArB,EAAwB;AACpB,yBAAK,cAAL,CACK,MADL;;AAMA,yBAAK,sBAAL,GACI,KAAK,cAAL,CAAoB,IAApB,CAAyB,oBAAzB,CADJ;AAEA,yBAAK,eAAL,GAAuB,KAAK,cAAL,CAAoB,IAApB,CACnB,yBADmB,CAAvB;AAGA,wBAAI,KAAK,kBAAL,GAA0B,CAA9B,EAAiC;AAC7B,6BAAK,YAAL,CAAkB,KAAK,kBAAvB;AACH;AACJ;;AAED,qBAAK,WAAL;AACA,qBAAK,WAAL;;AAEA,oBAAI,KAAK,YAAT,EAAuB;AACnB,yBAAK,YAAL,CAAkB,MAAlB;AACH;;AAED,8BAAc,OAAd,CAAsB,UAAC,CAAD,EAAO;AACzB,2BAAK,sBAAL,CAA4B,MAA5B,CAAmC,EAAE,MAAF,EAAnC;AACH,iBAFD;;AAIA,oBAAI,KAAK,YAAT,EAAuB;AACnB,yBAAK,YAAL,GAAoB,wIAC8D,KAClD,wBADkD,CAD9D,8DAApB;AAKA,yBAAK,sBAAL,CAA4B,MAA5B,CAAmC,KAAK,YAAxC;AACA,yBAAK,YAAL,CACK,IADL,CACU,yBADV,EAEK,EAFL,CAEQ,OAFR,EAEiB,UAAC,CAAD;AAAA,+BAAO,OAAK,aAAL,CAAmB,CAAnB,CAAP;AAAA,qBAFjB;AAGH;;AAED,oBAAI,KAAK,OAAL,KAAiB,CAArB,EAAwB;AACpB,sBAAE,oBAAF,EAAwB,KAAK,OAAL,GAAe,KAAK,SAA5C,EAAuD,KAAvD;AACH;;AAED,qBAAK,OAAL,IAAgB,CAAhB;AACH;AACJ;;;wDAE+B;AAC5B,iBAAK,cAAL,CAAoB,KAApB,GACK,MADL,iQAG0D,KAClC,oCADkC,CAH1D,8CAMyB,KAAK,+BAAL,CANzB;AAQH;;;wCAEe;AACZ,iBAAK,YAAL,CAAkB,KAAlB;AACA,iBAAK,YAAL,CAAkB,KAAK,YAAvB;AACA,iBAAK,QAAL;AACH;;;sCAEa;AACV,gBAAI,KAAK,aAAL,CAAmB,MAAnB,GAA4B,CAAhC,EAAmC;AAC/B,qBAAK,MAAL,CAAY,WAAZ,CAAwB,OAAxB;AACH,aAFD,MAEO,IAAI,CAAC,KAAK,MAAL,CAAY,QAAZ,CAAqB,OAArB,CAAL,EAAoC;AACvC,qBAAK,MAAL,CAAY,QAAZ,CAAqB,OAArB;AACH;AACJ;;;sCAEa;AACV,iBAAK,eAAL,CAAqB,KAArB;AACA,iBAAK,eAAL,CAAqB,MAArB,UACW,KAAK,iCAAL,EAAwC;AAC3C,qBAAK,KAAK,aAAL,CAAmB,MADmB;AAE3C,uBAAO,KAAK;AAF+B,aAAxC,CADX;AAMH;;;gDAEuB;AACpB,iBAAK,kBAAL,IAA2B,CAA3B;AACA,iBAAK,aAAL,GAAqB,KAAK,aAAL,CAAmB,MAAnB,CAA0B,UAAC,CAAD;AAAA,uBAAO,CAAC,EAAE,WAAV;AAAA,aAA1B,CAArB;;AAEA,gBAAI,KAAK,kBAAL,GAA0B,CAA9B,EAAiC;AAC7B,qBAAK,6BAAL;AACH;;AAED,iBAAK,WAAL;AACH;;;gDAEuB;AACpB,gBAAI,OAAO,EAAX;AACA,gBAAI,OAAO,SAAP,CAAiB,iBAAjB,KAAuC,EAA3C,EAA+C;AAC3C,uBAAO,OAAO,SAAP,CAAiB,iBAAxB;AACH,aAFD,MAEO,IAAI,OAAO,SAAP,CAAiB,mBAAjB,KAAyC,EAA7C,EAAiD;AACpD,uBAAO,OAAO,SAAP,CAAiB,mBAAxB;AACH,aAFM,MAEA;AACH,uBAAO,IAAI,OAAO,MAAP,CAAc,cAAlB,CAAP;AACH;AACD,0DAAyC,IAAzC,gDAAmF,KAC/E,gBAD+E,EAEjF,WAFiF,EAAnF;AAGH;;;4BA7MkB;AACf,mBAAO,KAAK,OAAL,GAAe,KAAK,QAAL,GAAgB,CAAtC;AACH;;;;EAnI2C,SAAS,I;;qBAApC,kB;;;;;;;;;;;ACLrB;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;;;;;;;;;cAEiB,M;IAAT,I,WAAA,I;;IAEa,iB;;;AACjB,qCAAsE;AAAA,YAAzD,EAAyD,QAAzD,EAAyD;AAAA,YAArD,OAAqD,QAArD,OAAqD;AAAA,YAA5C,IAA4C,QAA5C,IAA4C;AAAA,YAAtC,OAAsC,QAAtC,OAAsC;AAAA,YAA7B,IAA6B,QAA7B,IAA6B;AAAA,uCAAvB,cAAuB;AAAA,YAAvB,cAAuB,uCAAN,IAAM;;AAAA;;AAAA,2IACzD,SADyD;;AAElE,cAAK,EAAL,GAAU,EAAV;AACA,cAAK,OAAL,GAAe,OAAf;AACA,cAAK,IAAL,GAAY,IAAZ;AACA,cAAK,IAAL,GAAY,OAAZ;AACA,cAAK,IAAL,GAAY,QAAQ,EAApB;AACA,cAAK,KAAL,GAAa,IAAI,kBAAJ,CAAU,IAAV,CAAb;AACA,cAAK,MAAL,GAAc,SAAS,aAAvB;AACA,cAAK,GAAL,GAAW,OAAO,YAAlB;AACA,cAAK,cAAL,GAAsB,cAAtB;AACA,cAAK,SAAL,GAAiB,KAAjB;AACA,cAAK,gBAAL,GAAwB,EAAxB;;AAEA,cAAK,eAAL;AAdkE;AAerE;;;;iCAEO;AAAA;;AACJ,iBAAK,GAAL,GAAW,KAAK,QAAL,EAAX;AACA,iBAAK,gBAAL,CAAsB,KAAK,GAA3B;AACA,iBAAK,qBAAL;AACA,iBAAK,GAAL,CAAS,IAAT,CAAc,oBAAd,EAAoC,EAApC,CAAuC,OAAvC,EAAgD;AAAA,uBAAM,OAAK,mBAAL,EAAN;AAAA,aAAhD;AACA,mBAAO,KAAK,GAAZ;AACH;;;0CAEgB;AACb,gBAAG,CAAC,mBAAD,EAAsB,WAAtB,EAAmC,qBAAnC,EAA0D,qBAA1D,EAAiF,QAAjF,CAA0F,KAAK,IAA/F,CAAH,EAAwG;AACpG;;;AAGA,qBAAK,KAAL,CAAW,GAAX,CAAe,UAAf,EAA2B,IAA3B;AACH;AACJ;;;gDAEuB,Q,EAAS;AAC7B,iBAAK,gBAAL,CAAsB,IAAtB,CAA2B,QAA3B;AACH;;;8CAEoB;AAAA;;AACjB,iBAAK,MAAL,GADiB,CACF;AACf,cAAE,IAAF,CAAO;AACH,qBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,IAAd,CAAmB,mBAAnB,CAAuC,OAAlD,EAA2D,EAAC,IAAI,KAAK,EAAV,EAA3D,CADF;AAEH,sBAAM;AAFH,aAAP,EAIC,IAJD,CAIM,YAAM;AACR,uBAAK,mBAAL;AACH,aAND,EAMG,IANH,CAMQ,UAAC,GAAD,EAAM,MAAN,EAAc,GAAd,EAAsB;AAC1B,uBAAO,MAAP,CAAc,GAAd,CAAkB,OAAlB,EAA2B,+BAA3B,EAA4D,EAAC,SAAS,IAAI,UAAJ,IAAkB,GAA5B,EAA5D;AACH,aARD;AASH;;;iCAEO;AAAA;;AACJ,iBAAK,WAAL,GAAmB,IAAnB;AACA,iBAAK,GAAL,CAAS,IAAT,CAAc,eAAd,EAA+B,QAA/B,CAAwC,uBAAxC,EAFI,CAE8D;AAClE,iBAAK,GAAL,CAAS,QAAT,CAAkB,kBAAlB,EAHI,CAGmC;AACvC,uBAAW,YAAM;AAAE,uBAAK,GAAL,CAAS,IAAT;AAAkB,aAArC,EAAuC,GAAvC,EAJI,CAIyC;AAC7C,iBAAK,gBAAL,CAAsB,OAAtB,CAA8B,UAAC,QAAD,EAAc;AACxC;AACH,aAFD;AAGH;;;8CAEqB;AAClB,oBAAO,KAAK,IAAZ;AACI,qBAAK,mBAAL;AACI,yBAAK,GAAL,CAAS,OAAT,CAAiB,uBAAjB,EAA0C,EAAC,YAAY,KAAK,KAAlB,EAAyB,SAAS,EAAE,gBAAgB,KAAK,cAAvB,EAAlC,EAA1C;AACA;AACJ,qBAAK,YAAL;AACI,yBAAK,GAAL,CAAS,OAAT,CAAiB,2BAAjB,EAA8C,EAAC,YAAY,KAAK,KAAlB,EAAyB,SAAS,EAAE,gBAAgB,KAAK,cAAvB,EAAlC,EAA9C;AACA;AACJ;AACI;AARR;AAUH;;;gDAEsB;AACnB,mBAAO,IAAI,IAAJ,CAAS,KAAK,IAAd,CAAP;AACH;;;wCAEc;AACX,gBAAG,KAAK,IAAR,EAAa;AACT,uBAAO,KAAK,KAAL,CAAW,WAAX,CAAuB,GAAvB,CAAP;AACH;AACJ;;;4CAEmB,S,EAAU;AAC1B,oBAAQ,KAAK,IAAb;AACI,qBAAK,WAAL;AAAiB;AACb,4BAAI,UAAU,IAAI,IAAJ,CAAS,KAAK,KAAL,CAAW,GAAX,CAAe,YAAf,CAAT,CAAd;AACA,4BAAI,MAAM,IAAI,IAAJ,EAAV;AACA,4BAAI,SAAS,EAAb;AACA,4BAAI,YAAY,KAAK,KAAL,CAAW,CAAC,QAAQ,OAAR,KAAoB,IAAI,OAAJ,EAArB,IAAsC,MAAjD,CAAhB;AACA,4BAAI,aAAa,EAAjB,EAAqB;AAAE;AACnB,gCAAI,WAAW,KAAK,KAAL,CAAW,CAAC,QAAQ,OAAR,KAAoB,IAAI,OAAJ,EAArB,IAAsC,OAAjD,CAAf;AACA,qCAAS,KAAK,qCAAL,EAA4C,EAAC,OAAO,SAAR,EAAmB,MAAM,QAAzB,EAA5C,CAAT;AACH,yBAHD,MAIK,IAAI,aAAa,CAAjB,EAAmB;AAAE;AACtB,qCAAS,KAAK,sCAAL,EAA6C,EAAC,OAAO,SAAR,EAAmB,MAAM,SAAzB,EAA7C,CAAT;AACH,yBAFI,MAEE;AAAE;AACL,gCAAI,cAAc,KAAK,KAAL,CAAW,CAAC,QAAQ,OAAR,KAAoB,IAAI,OAAJ,EAArB,IAAsC,KAAjD,CAAlB;AACA,qCAAS,KAAK,qCAAL,EAA4C,EAAC,OAAO,SAAR,EAAmB,MAAM,WAAzB,EAA5C,CAAT;AACH;AACD,+BAAO;AACH,oCAAS,MADN;AAEH,sCAAW,KAAK,kCAAL;AAFR,yBAAP;AAIH;AACD,qBAAK,mBAAL;AAAyB;AACrB,+BAAO;AACH,oCAAS,KAAK,wCAAL,EAA+C,EAAC,OAAO,SAAR,EAAmB,MAAM,KAAK,KAAL,CAAW,GAAX,CAAe,eAAf,CAAzB,EAA/C,CADN;AAEH,sCAAW,KAAK,0CAAL,EAAiD,EAAC,MAAM,KAAK,KAAL,CAAW,GAAX,CAAe,eAAf,CAAP,EAAjD;AAFR,yBAAP;AAIH;AACD,qBAAK,YAAL;AAAkB;AACd,+BAAO;AACH,oCAAQ,KAAK,iCAAL,EAAwC,EAAC,OAAO,SAAR,EAAxC,CADL;AAEH,sCAAW,KAAK,mCAAL;AAFR,yBAAP;AAIH;AACD;AAAQ;AACJ,+BAAO;AACH,oCAAY,SAAZ,qDADG;AAEH,sCAAW;AAFR,yBAAP;AAIH;AAtCL;AAwCH;;;wCAEc;AACX,mBAAO,KAAK,MAAL,IAAe,KAAK,IAAL,KAAc,mBAA7B,IAAoD,KAAK,IAAL,KAAc,YAAzE;AACH;;;mCAES;AACN,gBAAI,mBAAmB,KAAK,oBAAL,EAA2B,EAAC,MAAM,KAAK,qBAAL,EAAP,EAA3B,CAAvB;AACA,gBAAI,aAAa,KAAK,aAAL,EAAjB;AACA,gBAAI,YAAY,KAAK,KAAL,CAAW,eAA3B;AACA,gBAAI,YAAY,KAAK,KAAL,CAAW,GAAX,CAAe,OAAf,CAAhB;;AAEA,gBAAI,UAAU,KAAK,mBAAL,CAAyB,SAAzB,CAAd;AACA,gBAAI,SAAS,QAAQ,MAArB;AACA,gBAAI,WAAW,QAAQ,QAAvB;;AAEA,mBAAO,wEACkD,KAAK,iCAAL,EAAwC,EAAC,OAAO,SAAR,EAAxC,CADlD,0HAGqC,KAAK,aAAL,KAAuB,oBAAvB,GAA8C,EAHnF,kJAMwB,SANxB,oBAMgD,SANhD,eAMmE,UANnE,yJASoC,gBATpC,6GAWyC,MAXzC,qEAYyC,QAZzC,2GAeW,KAAK,aAAL,2CAEsC,KAAK,sCAAL,EAA6C,EAAC,OAAO,SAAR,EAA7C,CAFtC,gDAEiJ,KAAK,EAFtJ,6GAIe,EAnB1B,8DAsBO,CAAC,KAAK,MAAN,+DAEQ,EAxBf,0KA8BqC,KAAK,aAAL,KAAuB,oBAAvB,GAA8C,EA9BnF,kJAiCwB,SAjCxB,oBAiCgD,SAjChD,eAiCmE,UAjCnE,yJAoCoC,gBApCpC,4GAsCwC,MAtCxC,2GAyCW,KAAK,aAAL,wCACqC,KAAK,sCAAL,EAA6C,EAAC,OAAO,SAAR,EAA7C,CADrC,gDACgJ,KAAK,EADrJ,0GAGY,EA5CvB,wJA+CiC,QA/CjC,uCAgDW,CAAC,KAAK,MAAN,GAAe,mCAAf,GAAqD,EAhDhE,4GAAP;AAwDH;;;gDAEuB;AAAA;;AACpB,gBAAI,eAAe,sBAAnB;AACA,gBAAI,mBAAmB,2BAAvB;AACA,gBAAI,yBAAyB,yBAA7B;AACA,gBAAI,oBAAoB,eAAxB,CAJoB,CAIqB;AACzC,gBAAI,kBAAkB,oBAAtB;;AAEA,gBAAI,iBAAiB,EAArB;AACA,oBAAQ,KAAK,IAAb;AACI,qBAAK,WAAL;AACI,qCAAiB,CAAC,YAAD,EAAe,iBAAf,EAAkC,gBAAlC,CAAjB;AACA;AACJ,qBAAK,YAAL;AACI,qCAAiB,CAAC,eAAD,CAAjB;AACA;AACJ,qBAAK,mBAAL;AACI,qCAAiB,CAAC,gBAAD,EAAmB,iBAAnB,EAAsC,sBAAtC,CAAjB;AACA;AACJ;AACI,0BAAM,IAAI,KAAJ,0BAAgC,KAAK,IAArC,kCAAN;AAXR;;AAcA,gBAAI,wBAAwB,SAAxB,qBAAwB,QAAkB;AAAA,oBAAhB,UAAgB,SAAhB,UAAgB;;AAC1C,oBAAI,cAAc,WAAW,GAAX,CAAe,IAAf,MAAyB,OAAK,KAAL,CAAW,GAAX,CAAe,IAAf,CAA3C,EAAgE;AAC5D,2BAAK,mBAAL;AACH;AACJ,aAJD;;AAMA,2BAAe,OAAf,CAAuB,UAAC,MAAD,EAAY;AAC/B,uBAAK,GAAL,CAAS,EAAT,CAAY,MAAZ,EAAoB,qBAApB;AACH,aAFD;AAGH;;;yCAGgB,Q,EAAS;AACtB,gBAAI,mBAAmB,SAAS,IAAT,CAAc,gBAAd,CAAvB;AACA,gBAAI,UAAU,KAAK,KAAL,CAAW,GAAX,CAAe,IAAf,CAAd;AACA,gBAAI,YAAY,KAAK,KAAL,CAAW,GAAX,CAAe,OAAf,CAAhB;AACA,gBAAG,iBAAiB,MAAjB,GAA0B,CAA7B,EAA+B;AAC3B,wBAAQ,KAAK,IAAb;AACI,yBAAK,WAAL;AACI,yCAAiB,MAAjB,CAAwB,KAAK,YAAL,CAAkB,OAAlB,EAA2B,SAA3B,CAAxB;AACA,yCAAiB,MAAjB,CAAwB,KAAK,iBAAL,CAAuB,OAAvB,EAAgC,SAAhC,CAAxB;AACA,yCAAiB,MAAjB,CAAwB,KAAK,gBAAL,CAAsB,OAAtB,EAA+B,SAA/B,CAAxB;AACA;;AAEJ,yBAAK,YAAL;AACI,yCAAiB,MAAjB,CAAwB,KAAK,eAAL,CAAqB,OAArB,EAA8B,SAA9B,CAAxB;AACA;AACJ,yBAAK,mBAAL;AACI,yCAAiB,MAAjB,CAAwB,KAAK,yBAAL,EAAxB;AACA,yCAAiB,MAAjB,CAAwB,KAAK,iBAAL,CAAuB,OAAvB,EAAgC,SAAhC,EAA2C,KAAK,gCAAL,CAA3C,CAAxB;AACA,yCAAiB,MAAjB,CAAwB,KAAK,gBAAL,CAAsB,OAAtB,EAA+B,SAA/B,CAAxB;AACA;AACJ;AACI,8BAAM,IAAI,KAAJ,0BAAgC,KAAK,IAArC,kCAAN;AAhBR;AAkBH;AACJ;;;oDAE0B;AAAA;;AACvB,gBAAI,WAAW,2HACW,KAAK,IAAL,CADX,6CAAf;AAGA,qBAAS,EAAT,CAAY,OAAZ,EAAqB;AAAA,uBAAM,OAAK,mBAAL,EAAN;AAAA,aAArB;AACA,mBAAO,QAAP;AACH;;;qCAEY,O,EAAS,S,EAAU;AAAA;;AAC5B,gBAAI,WAAW,sGAAoG,OAApG,sBAA4H,KAAK,aAAL,EAAoB,EAAC,OAAO,SAAR,EAApB,CAA5H,4CACW,KAAK,QAAL,CADX,6CAAf;;AAIA,qBAAS,EAAT,CAAY,OAAZ,EAAqB,UAAC,CAAD,EAAO;AACxB,oBAAI,mBAAJ,CAAW,OAAK,GAAhB,EAAqB,WAArB,CAAiC,OAAK,KAAtC,EAA6C,EAAE,gBAAgB,OAAK,cAAvB,EAA7C;AACH,aAFD;;AAIA,mBAAO,QAAP;AACH;;;yCAEgB,O,EAAS,S,EAAU;AAAA;;AAChC,gBAAI,WAAW,2GAAyG,OAAzG,sBAAiI,KAAK,gCAAL,EAAuC,EAAC,OAAO,SAAR,EAAvC,CAAjI,4CACW,KAAK,8BAAL,CADX,6CAAf;;AAKA,qBAAS,EAAT,CAAY,OAAZ,EAAqB,YAAM;AACtB,oBAAI,4BAAJ,EAAD,CAAwB,EAAxB,CAA2B,SAA3B,EAAsC,UAAC,KAAD,EAAW;AAC7C;AACA,2BAAK,GAAL,CAAS,OAAT,CAAiB,mBAAjB,EAAsC,OAAK,KAA3C,EAAkD,EAAE,gBAAgB,OAAK,cAAvB,EAAlD;AACA,0BAAM,KAAN;AACH,iBAJD;AAKH,aAND;;AAQA,mBAAO,QAAP;AACH;;;0CAEiB,O,EAAS,S,EAAoB;AAAA;;AAAA,gBAAT,KAAS,uEAAH,EAAG;;AAC3C,gBAAI,YAAY,UAAU,EAAV,GAAe,KAAK,4BAAL,CAAf,GAAoD,KAApE;AACA,gBAAI,WAAW,oFAAkF,OAAlF,sBAA0G,SAA1G,WAAyH,SAAzH,4CACW,SADX,6CAAf;;AAIA,qBAAS,EAAT,CAAY,OAAZ,EAAqB,YAAM;AACvB,oBAAI,6BAAJ,CAAoB,OAAK,KAAzB,EAAgC,KAAhC,EAAuC,OAAK,cAA5C;AACH,aAFD;;AAIA,mBAAO,QAAP;AACH;;;wCAEe,O,EAAS,S,EAAU;AAAA;;AAC/B,gBAAI,WAAW,0GAAwG,OAAxG,sBAAgI,KAAK,mBAAL,EAA0B,EAAC,OAAO,SAAR,EAA1B,CAAhI,4CACW,KAAK,YAAL,CADX,6CAAf;;AAIA,qBAAS,EAAT,CAAY,OAAZ,EAAqB,UAAC,CAAD,EAAO;AACxB,wBAAK,GAAL,CAAS,OAAT,CAAiB,YAAjB,EAA+B,QAAK,KAApC,EAA2C,EAAE,gBAAgB,QAAK,cAAvB,EAA3C;AACH,aAFD;;AAIA,mBAAO,QAAP;AACH;;;yCAEgB,S,EAAU;AACvB,gBAAI,WAAW,6FAA2F,KAAK,qBAAL,CAA3F,SAA0H,SAA1H,wCACO,KAAK,qBAAL,CADP,yCAAf;AAGA,mBAAO,QAAP;AACH;;;qCAEY,S,EAAU;AACnB,gBAAI,WAAW,6FAA2F,KAAK,wCAAL,EAA+C,EAAC,OAAO,SAAR,EAA/C,CAA3F,wCACO,KAAK,eAAL,CADP,yCAAf;AAGA,mBAAO,QAAP;AACH;;;0CAEiB,S,EAAU;AACxB,gBAAI,WAAW,0EAAwE,KAAK,qBAAL,CAAxE,SAAuG,SAAvG,wCACO,KAAK,qBAAL,CADP,yCAAf;AAGA,mBAAO,QAAP;AACH;;;2CAEkB,S,EAAU;AACzB,gBAAI,WAAW,6FAA2F,KAAK,gCAAL,EAAuC,EAAC,OAAO,SAAR,EAAvC,CAA3F,wCACO,KAAK,2BAAL,CADP,yCAAf;AAGA,mBAAO,QAAP;AACH;;;;EA5V0C,SAAS,I;;qBAAnC,iB;;;;;;;;;;;;;cCRG,M;IAAhB,G,WAAA,G;IAAK,M,WAAA,M;;IAEQ,yB;AACjB,uCAAY,GAAZ,EAAiB;AAAA;;AAAA;;AAEb,aAAK,GAAL,GAAW,GAAX;AACA,aAAK,UAAL,GAAkB,OAAO,SAAP,CAAiB,MAAnC;;AAEA,aAAK,GAAL,CACK,EADL,CACQ,sBADR,EACwC,UAAC,MAAD;AAAA,mBAAY,MAAK,yBAAL,CAA+B,MAA/B,EAAuC,QAAvC,CAAZ;AAAA,SADxC,EAEK,EAFL,CAEQ,oBAFR,EAEwC,UAAC,MAAD;AAAA,mBAAY,MAAK,yBAAL,CAA+B,MAA/B,EAAuC,MAAvC,CAAZ;AAAA,SAFxC,EAGK,EAHL,CAGQ,2BAHR,EAGwC,UAAC,MAAD;AAAA,mBAAY,MAAK,yBAAL,CAA+B,MAA/B,EAAuC,aAAvC,CAAZ;AAAA,SAHxC,EAIK,EAJL,CAIQ,eAJR,EAIwC,UAAC,MAAD;AAAA,mBAAY,MAAK,yBAAL,CAA+B,MAA/B,EAAuC,cAAvC,CAAZ;AAAA,SAJxC,EAKK,EALL,CAKQ,yBALR,EAKwC,UAAC,MAAD;AAAA,mBAAY,MAAK,yBAAL,CAA+B,MAA/B,EAAuC,uBAAvC,CAAZ;AAAA,SALxC;AAOH;;;;wDAEgD,K,EAAM;AAAA;;AAAA,gBAA5B,UAA4B,QAA5B,UAA4B;AAAA,gBAAhB,OAAgB,QAAhB,OAAgB;;AACnD,gBAAI,OAAJ,CAAY,UAAC,OAAD,EAAU,MAAV;AAAA,uBACZ,EAAE,IAAF,CAAO;AACH,yBAAK,IAAI,OAAO,IAAP,CAAY,mBAAZ,CAAgC,eAApC,CADF;AAEH,0BAAM,MAFH;AAGH,0BAAM;AACF,gCAAQ,KADN;AAEF,mCAAW,OAAK,UAFd;AAGF,iCAAS,WAAW;AAHlB;AAHH,iBAAP,EASC,IATD,CASM,UAAC,QAAD;AAAA,2BAAc,QAAQ,QAAR,CAAd;AAAA,iBATN,EAUC,IAVD,CAUM,UAAC,GAAD,EAAM,MAAN,EAAc,GAAd;AAAA,2BAAsB,OAAO,GAAP,CAAtB;AAAA,iBAVN,CADY;AAAA,aAAZ,WAYO,UAAC,KAAD,EAAW;AACd,uBAAO,MAAP,CAAc,GAAd,CAAkB,OAAlB,EAA2B,oDAA3B,EAAiF,EAAC,SAAS,MAAM,UAAN,IAAoB,KAA9B,EAAjF;AACH,aAdD;AAeH;;;;;;qBA/BgB,yB;;;;;;;;;;;ACFrB,IAAA,UAAA,GAAA,OAAA,CAAA,sBAAA,CAAA,CAAA;;;;;;;;;;;;IAEqB;;;IAEjB,SAAA,OAAA,CAAY,IAAZ,EAAiB;QAAA,eAAA,CAAA,IAAA,EAAA,OAAA,CAAA,CAAA;;QAAA,IAAA,KAAA,GAAA,0BAAA,CAAA,IAAA,EAAA,CAAA,OAAA,CAAA,SAAA,IAAA,MAAA,CAAA,cAAA,CAAA,OAAA,CAAA,EAAA,KAAA,CAAA,IAAA,EACJ,SADI,CAAA,CAAA,CAAA;;QAGb,IAAG,CAAC,IAAA,CAAK,MAAT,EAAgB;YACZ,MAAM,IAAI,KAAJ,CAAU,2BAAV,CAAN,CAAA;SACH;;QAED,KAAA,CAAK,QAAL,GAAgB,IAAA,CAAK,QAArB,CAAA;QACA,KAAA,CAAK,MAAL,GAAc,IAAA,CAAK,MAAnB,CAAA;QACA,KAAA,CAAK,OAAL,GAAe,KAAf,CAAA;QACA,KAAA,CAAK,SAAL,GAAiB,IAAA,CAAK,SAAtB,CAAA;QACA,KAAA,CAAK,cAAL,GAAsB,IAAA,CAAK,KAAL,IAAc,GAApC,CAAA;QACA,KAAA,CAAK,iBAAL,GAAyB,IAAA,CAAK,iBAAL,IAA0B,KAAnD,CAAA;QACA,KAAA,CAAK,OAAL,GAAe,IAAA,CAAK,OAApB,CAAA;QACA,KAAA,CAAK,WAAL,GAAmB,IAAA,CAAK,WAAxB,CAAA;;QAEA,KAAA,CAAK,MAAL,CAAY,EAAZ,CAAe,OAAf,EAAwB,UAAC,CAAD,EAAO;YAC3B,KAAA,CAAK,MAAL,EAAA,CAAA;YACA,CAAA,CAAE,eAAF,EAAA,CAAA;SAFJ,CAAA,CAAA;QAhBa,OAAA,KAAA,CAAA;KAoBhB;;;;oCAEW;YACR,IAAI,SAAA,GAAY,CAAhB,CAAA;YACA,IAAI,UAAA,GAAa,CAAjB,CAAA;YACA,IAAI,WAAA,GAAc,CAAlB,CAAA;YACA,IAAI,YAAA,GAAe,IAAA,CAAK,MAAL,CAAY,MAAZ,EAAnB,CAAA;YACA,IAAI,WAAA,GAAc,IAAA,CAAK,MAAL,CAAY,KAAZ,EAAlB,CAAA;YACA,YAAA,CAAa,KAAb,GAAqB,YAAA,CAAa,IAAb,GAAoB,WAAzC,CAAA;YACA,IAAI,YAAA,GAAe,IAAA,CAAK,MAAL,CAAY,MAAZ,EAAnB,CAAA;YACA,IAAI,aAAA,GAAgB,CAAA,CAAE,MAAF,CAAA,CAAU,KAAV,EAApB,CAAA;YACA,IAAI,cAAA,GAAiB,CAAA,CAAE,MAAF,CAAA,CAAU,MAAV,EAArB,CAAA;YACA,IAAI,KAAA,GAAQ,IAAA,CAAK,GAAL,CAAS,IAAA,CAAK,cAAL,GAAuB,CAAA,GAAI,UAApC,EAAiD,aAAjD,CAAZ,CAAA;YACA,IAAI,QAAA,GAAW,KAAA,GAAQ,WAAvB,CAAA;YACA,IAAI,WAAA,GAAc,YAAA,CAAa,IAA/B,CAAA;YACA,IAAI,YAAA,GAAe,aAAA,GAAgB,YAAA,CAAa,KAAhD,CAAA;YACA,IAAI,WAAA,GAAc,WAAA,IAAgB,QAAA,GAAW,CAA7C,CAAA;YACA,IAAI,YAAA,GAAe,YAAA,IAAiB,QAAA,GAAW,CAA/C,CAAA;;;YAIA,IAAI,IAAA,GAAA,KAAA,CAAJ;gBAAU,KAAA,GAAA,KAAA,CAAV;gBAAiB,GAAA,GAAA,KAAA,CAAjB;gBAAsB,MAAA,GAAA,KAAA,CAAtB;gBAA8B,SAAA,GAAA,KAAA,CAA9B;gBAAyC,UAAA,GAAA,KAAA,CAAzC;gBAAqD,cAAA,GAAA,KAAA,CAArD,CAAA;;YAEA,IAAI,WAAA,IAAe,YAAnB,EAAgC;;gBAE5B,IAAA,GAAO,YAAA,CAAa,IAAb,GAAqB,QAAA,GAAW,CAAvC,CAAA;gBACA,KAAA,GAAQ,aAAA,GAAgB,YAAA,CAAa,KAA7B,GAAsC,QAAA,GAAW,CAAzD,CAAA;gBACA,SAAA,GAAY,KAAA,GAAQ,CAApB,CAAA;gBACA,cAAA,GAAiB,eAAjB,CAAA;aALJ,MAMO,IAAI,YAAA,IAAgB,QAApB,EAA6B;;gBAEhC,IAAA,GAAO,YAAA,CAAa,IAApB,CAAA;gBACA,KAAA,GAAQ,aAAA,GAAgB,YAAA,CAAa,KAA7B,GAAqC,QAA7C,CAAA;gBACA,SAAA,GAAY,WAAZ,CAAA;gBACA,cAAA,GAAiB,aAAjB,CAAA;aALG,MAMA,IAAI,WAAA,IAAe,QAAnB,EAA4B;;gBAE/B,IAAA,GAAO,YAAA,CAAa,IAAb,GAAoB,QAA3B,CAAA;gBACA,KAAA,GAAQ,aAAA,GAAgB,YAAA,CAAa,KAArC,CAAA;gBACA,UAAA,GAAa,WAAb,CAAA;gBACA,cAAA,GAAiB,cAAjB,CAAA;aALG,MAMA;;gBAEH,IAAA,GAAO,CAAP,CAAA;gBACA,KAAA,GAAQ,CAAR,CAAA;gBACA,SAAA,GAAY,YAAA,CAAa,IAAb,GAAqB,WAAA,GAAc,CAA/C,CAAA;gBACA,cAAA,GAAiB,YAAjB,CAAA;aACH;;YAED,IAAI,MAAA,GAAU,CAAC,IAAA,CAAK,MAAL,CAAY,CAAZ,CAAA,CAAe,qBAAf,EAAA,CAAuC,GAAvC,GAA8C,YAAA,GAAe,CAA9D,IAAoE,cAArE,GAAuF,QAApG,CAAA;YACA,IAAI,CAAC,MAAL,EAAY;gBACR,GAAA,GAAM,YAAA,CAAa,GAAb,GAAmB,SAAnB,GAA+B,YAArC,CAAA;aADJ,MAEO;gBACH,MAAA,GAAS,cAAA,GAAiB,YAAA,CAAa,GAA9B,GAAoC,SAA7C,CAAA;aACH;;YAED,OAAO;gBACH,IAAA,EAAM;oBACF,GAAA,EAAA,GADE;oBAEF,MAAA,EAAA,MAFE;oBAGF,IAAA,EAAA,IAHE;oBAIF,KAAA,EAAA,KAAA;iBALD;gBAOH,KAAA,EAAO;oBACH,IAAA,EAAM,SADH;oBAEH,KAAA,EAAO,UAAA;iBATR;gBAWH,cAAA,EAAgB,MAAA,GAAS,WAAT,GAAuB,aAXpC;gBAYH,cAAA,EAAA,cAAA;aAZJ,CAAA;SAcH;;;iCAGQ;YAAA,IAAA,MAAA,GAAA,IAAA,CAAA;;YACL,IAAI,MAAA,GAAS,IAAA,CAAK,SAAL,EAAb,CAAA;;YAEA,IAAA,CAAK,GAAL,CAAS,KAAT,EAAA,CAAA;YACA,IAAA,CAAK,GAAL,GAAW,CAAA,CAAA,4BAAA,GACO,IAAA,CAAK,SADZ,GAAA,iBAAA,GACuC,MAAA,CAAO,cAD9C,GAAA,GAAA,GACgE,MAAA,CAAO,cADvE,GAAA,wEAAA,IAGG,MAAA,CAAO,IAAP,CAAY,GAAZ,GAAA,MAAA,GAA0B,MAAA,CAAO,IAAP,CAAY,GAAtC,GAAA,KAAA,GAAiD,EAHpD,CAAA,GAAA,wBAAA,IAIG,MAAA,CAAO,IAAP,CAAY,MAAZ,GAAA,SAAA,GAAgC,MAAA,CAAO,IAAP,CAAY,MAA5C,GAAA,KAAA,GAA0D,EAJ7D,CAAA,GAAA,6BAAA,GAKQ,MAAA,CAAO,IAAP,CAAY,IALpB,GAAA,iCAAA,GAMS,MAAA,CAAO,IAAP,CAAY,KANrB,GAAA,2IAAA,IASe,MAAA,CAAO,KAAP,CAAa,KAAb,GAAA,QAAA,GAA+B,MAAA,CAAO,KAAP,CAAa,KAA5C,GAAA,KAAA,GAAyD,EATxE,CAAA,GAAA,oCAAA,IAUe,MAAA,CAAO,KAAP,CAAa,IAAb,GAAA,OAAA,GAA6B,MAAA,CAAO,KAAP,CAAa,IAA1C,GAAA,KAAA,GAAsD,EAVrE,CAAA,GAAA,gIAAA,GAaO,IAAA,CAAK,QAbZ,GAAA,wDAAA,CAAX,CAAA;;YAkBA,CAAA,CAAE,MAAF,CAAA,CAAU,MAAV,CAAiB,IAAA,CAAK,GAAtB,CAAA,CAAA;YACA,CAAA,CAAE,MAAF,CAAA,CAAU,KAAV,CAAgB,YAAA;gBAAA,OAAM,MAAA,CAAK,IAAL,EAAN,CAAA;aAAhB,CAAA,CAAA;SACH;;;+BAEM;YACH,IAAA,CAAK,GAAL,CAAS,MAAT,EAAA,CAAA;YACA,IAAA,CAAK,OAAL,GAAe,KAAf,CAAA;SACH;;;+BAEK;YACF,IAAA,CAAK,MAAL,EAAA,CAAA;YACA,IAAG,IAAA,CAAK,iBAAR,EAA0B;gBACtB,CAAA,CAAA,EAAA,WAAA,CAAA,SAAA,CAAA,GAAA,CAAA;aACH;YACD,IAAG,IAAA,CAAK,OAAR,EAAgB;gBACZ,IAAA,CAAK,OAAL,EAAA,CAAA;aACH;YACD,IAAA,CAAK,OAAL,GAAe,IAAf,CAAA;SACH;;;iCAEO;YACJ,IAAI,IAAA,CAAK,OAAT,EAAiB;gBACb,IAAG,IAAA,CAAK,WAAR,EAAoB;oBAChB,IAAA,CAAK,WAAL,EAAA,CAAA;iBACH;gBACD,IAAA,CAAK,IAAL,EAAA,CAAA;aAJJ,MAMK;gBACD,IAAA,CAAK,IAAL,EAAA,CAAA;aACH;SACJ;;;;EAnJgC,QAAA,CAAS;;qBAAzB;;;;;;;;;;ACFrB;;;;AACA;;;;AACA;;AACA;;;;;;AAEA,IAAM,4BAA4B,kBAAe,MAAf,CAAsB;;AAEpD,WAAO,2BAF6C;;AAIpD,OAJoD,iBAI9C;AACF,eAAU,UAAU,gBAApB;AACH,KANmD;AAQpD,cARoD,sBAQzC,MARyC,QAQM;AAAA,YAAtC,KAAsC,QAAtC,KAAsC;AAAA,8BAA/B,KAA+B;AAAA,YAA/B,KAA+B,8BAAvB,EAAuB;AAAA,+BAAnB,MAAmB;AAAA,YAAnB,MAAmB,+BAAV,OAAU;;AACtD,aAAK,KAAL,GAAa,KAAb;AACA,aAAK,KAAL,GAAa,KAAb;AACA,aAAK,MAAL,GAAc,MAAd;AACA,aAAK,MAAL,GAAc,UAAU,kBAAxB;;AAEA,aAAK,SAAL,GAAiB,KAAK,uBAAL,EAAjB;;AAEA,aAAK,QAAL,CAAc,KAAK,KAAnB,EAA0B,aAA1B,EAAyC,KAAK,iBAAL,CAAuB,IAAvB,CAA4B,IAA5B,CAAzC;AACA,aAAK,EAAL,CAAQ,MAAR,EAAgB,KAAK,gBAArB;AACH,KAlBmD;AAoBpD,qBApBoD,+BAoBhC;AAChB,YAAI,KAAK,KAAL,CAAW,sBAAX,EAAJ,EAAyC;AACrC;AACA,iBAAK,UAAL,IAAmB,KAAK,UAAL,CAAgB,KAAhB,EAAnB;;AAEA,iBAAK,UAAL,GAAkB,KAAK,KAAL,EAAlB;AACH,SALD,MAKO;AACH,iBAAK,KAAL;AACH;AACJ,KA7BmD;AA+BpD,eA/BoD,yBA+BtC;AACV,YAAI,SAAS,EAAC,OAAO,KAAK,KAAL,CAAW,GAAX,CAAe,MAAf,CAAR,EAAgC,SAAS,KAAK,KAA9C,EAAqD,cAAc,KAAK,KAAxE,EAA+E,QAAQ,KAAK,MAA5F,EAAoG,WAAW,KAAK,SAApH,EAAb;AACA,YAAI,UAAU,gBAAV,KAA+B,UAAU,WAA7C,EAA0D;AACtD,mBAAO,SAAP,IAAoB,KAAK,MAAzB;AACH;;AAED,YAAI,SAAS,OAAO,cAAP,CAAsB,SAAtB,CAAgC,gBAAhC,IAAoD,EAAE,KAAF,CAAQ,MAAR,EAAgB,IAAhB,CAApD,GAA4E,EAAE,KAAF,CAAQ,MAAR,CAAzF;AACA,eAAO,MAAP;AACH,KAvCmD;AAyCpD,SAzCoD,mBAyC5C;AACJ,YAAM,OAAO,KAAK,WAAL,EAAb;AACA,eAAO,sCAAoB,kBAAe,SAAf,CAAyB,KAAzB,CAA+B,IAA/B,CAAoC,IAApC,EAA0C,EAAC,UAAD,EAA1C,CAApB,CAAP;AACH,KA5CmD;AA8CpD,oBA9CoD,4BA8CnC,UA9CmC,EA8CvB,QA9CuB,EA8Cb,OA9Ca,EA8CJ;AAC5C,YAAI,QAAQ,IAAR,KAAiB,KAAK,WAAL,EAArB,EAAyC;AACrC,iBAAK,OAAL,CAAa,WAAb;AACH;AACJ,KAlDmD;AAoDpD,SApDoD,iBAoD9C,QApD8C,EAoDpC;AACZ,YAAM,SAAS,EAAE,GAAF,CAAM,SAAS,KAAf,EAAsB,UAAC,IAAD,EAAO,KAAP;AAAA,mBAAkB,EAAC,MAAM,0BAAe,KAAK,IAApB,CAAP,EAAkC,OAAO,KAAK,KAA9C,EAAqD,YAArD,EAAlB;AAAA,SAAtB,CAAf;AACA,eAAO,EAAE,IAAF,CAAO,MAAP,EAAe,UAAC,IAAD;AAAA,mBAAU,KAAK,IAAL,CAAU,WAAV,EAAV;AAAA,SAAf,CAAP;AACH,KAvDmD;AAyDpD,2BAzDoD,qCAyD1B;AACtB,YAAI,YAAY,EAAhB;;AAEA,YAAM,mBAAmB,OAAO,SAAP,CAAiB,gBAA1C;AACA,YAAI,oBAAoB,EAAE,OAAF,CAAU,gBAAV,CAAxB,EAAqD;AACjD;AACA;AACA,wBAAY,iBAAiB,GAAjB,CAAqB,UAAC,MAAD,EAAY;AACzC,oBAAI,cAAc,OAAO,EAAzB;AACA,oBAAM,gBAAgB,YAAY,OAAZ,CAAoB,GAApB,CAAtB;AACA,oBAAI,kBAAkB,CAAC,CAAvB,EAA0B;AACtB,kCAAc,YAAY,SAAZ,CAAsB,CAAtB,EAAyB,aAAzB,CAAd;AACH;AACD,uBAAO,WAAP;AACH,aAPW,CAAZ;AAQA,wBAAY,UAAU,MAAV,CAAiB,UAAC,KAAD,EAAQ,KAAR;AAAA,uBAAkB,UAAU,OAAV,CAAkB,KAAlB,MAA6B,KAA/C;AAAA,aAAjB,CAAZ;AACH;;AAED,YAAM,OAAO,OAAO,SAAP,CAAiB,WAA9B;AACA,YAAM,cAAc,QAAQ,KAAK,OAAb,IAAwB,KAAK,OAAL,CAAa,SAAzD;AACA,YAAI,WAAJ,EAAiB;AACb,wBAAY,EAAE,SAAF,EAAa,YAAb,CAA0B,WAA1B,CAAZ;AACH;;AAED,YAAG,OAAO,cAAP,CAAsB,SAAtB,CAAgC,gBAAhC,CAAH,EAAsD;AAClD,gBAAI,wBAAwB,OAAO,SAAP,CAAiB,qBAAjB,CAAuC,KAAvC,CAA6C,GAA7C,CAA5B;AACA,wBAAY,UAAU,MAAV,CAAiB;AAAA,uBAAQ,sBAAsB,QAAtB,CAA+B,IAA/B,CAAR;AAAA,aAAjB,CAAZ;AACH;;AAED,eAAO,SAAP;AACH;AAvFmD,CAAtB,CAAlC;;qBA0Fe,yB;;;;;;;;;AC/Ff;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;;;AACA,IAAM,WAAW,OAAO,QAAxB;;AAEA,IAAM,kBAAkB,SAAlB,eAAkB,OAA4D;AAAA,QAA1D,QAA0D,QAA1D,QAA0D;AAAA,QAAhD,iBAAgD,QAAhD,iBAAgD;AAAA,QAA7B,cAA6B,QAA7B,cAA6B;AAAA,QAAb,OAAa,QAAb,OAAa;;AAChF,QAAM,QAAQ,IAAI,yBAAJ,EAAd;AACA,QAAM,iBAAiB,OAAO,cAA9B;;AAEA;AACA,QAAI,eAAe,SAAf,CAAyB,cAAzB,CAAJ,EAA8C;AAC1C,YAAM,kBAAkB,EAAE,MAAF,CAAS,EAAT,EAAa,SAAS,MAAtB,CAAxB;AACA,YAAM,wBAAwB,IAAI,oCAAJ,CAA8B,EAAC,IAAI,QAAL,EAAe,8BAAf,EAA+B,YAA/B,EAAsC,gCAAtC,EAA9B,CAA9B,CAF0C,CAE2E;AACrH,YAAM,kBAAkB,IAAI,4BAAJ,CAA8B,IAA9B,EAAoC,EAAC,YAAD,EAApC,CAAxB;AACA,YAAM,cAAc;AAChB,wBADgB;AAEhB,4CAFgB;AAGhB,gBAAI,iBAHY;AAIhB,wBAAY,eAJI;AAKhB;AALgB,SAApB;AAOA,YAAM,sBAAsB,IAAI,4BAAJ,CAAwB,WAAxB,CAA5B,CAX0C,CAWwB;AACrE,KAZD,MAYO;AACH,YAAM,YAAY,IAAI,uBAAJ,CAAkB,EAAC,IAAI,QAAL,EAAe,YAAf,EAAsB,SAAS,EAAC,eAAe,cAAhB,EAA/B,EAAlB,CAAlB,CADG,CACmG;AACzG;AACJ,CApBD;;qBAsBe,e;;;;;;;;;AC7Bf;;;;;;AAEA,IAAM,iBAAiB,kBAAU,MAAV,CAAiB;AAEpC,YAFoC,sBAEzB;AACP,eAAO;AACH,kBAAM,EADH;AAEH,oBAAQ;AAFL,SAAP;AAIH,KAPmC;AASpC,SAToC,iBAS9B,MAT8B,EAStB;AACV,eAAO,IAAP,GAAc,KAAK,WAAL,CAAiB,OAAO,IAAxB,CAAd;AACA,eAAO,MAAP;AACH,KAZmC;AAcpC,eAdoC,uBAcxB,IAdwB,EAclB;AACd,eAAO,KAAK,OAAL,CAAa,eAAb,EAA8B,GAA9B,CAAP;AACH;AAhBmC,CAAjB,CAAvB;;qBAmBe,c;;;;;;;;;ACrBf;;;;;;AAEA,IAAM,uBAAuB,CAA7B;AACA,IAAM,iBAAiB,CAAvB;;AAEA,IAAM,mBAAmB,kBAAU,MAAV,CAAiB;AACtC,YADsC,sBAC3B;AACP,eAAO;AACH,kBAAM;AADH,SAAP;AAGH,KALqC;AAOtC,0BAPsC,oCAOb;AACrB,YAAM,QAAQ,KAAK,GAAL,CAAS,MAAT,CAAd;AACA,YAAM,oBAAoB,MAAM,OAAN,CAAc,KAAd,EAAqB,EAArB,EAAyB,MAAzB,KAAoC,CAA9D;AACA,YAAM,4BACF,KAAK,GAAL,CAAS,MAAT,EAAiB,MAAjB,IAA2B,oBAD/B;;AAGA,eAAO,CAAC,iBAAD,IAAsB,yBAA7B;AACH,KAdqC;AAgBtC,oBAhBsC,8BAgBnB;AACf,eAAO,KAAK,GAAL,CAAS,MAAT,EAAiB,MAAjB,IAA2B,cAAlC;AACH;AAlBqC,CAAjB,CAAzB;;qBAqBe,gB;;;;;;;;;AC1Bf,IAAA,KAAA,GAAA,OAAA,CAAA,qBAAA,CAAA,CAAA;;;;AACA,IAAA,KAAA,GAAA,OAAA,CAAA,oBAAA,CAAA,CAAA;;;;AACA;AACA,IAAM,IAAA,GAAO,OAAA,CAAQ,MAAR,CAAb,CAAA;AACA,IAAM,QAAA,GAAW,sUAAjB,CAAA;;AAEA,IAAM,cAAA,GAAiB,MAAA,CAAA,SAAA,CAAA,CAAS,MAAT,CAAgB;;IAEnC,QAAA,EAAU,CAAA,CAAE,QAAF,CAAW,QAAX,EAAqB,EAAC,QAAA,EAAU,MAAX,EAArB,CAFyB;;IAInC,UAJmC,EAAA,SAAA,UAAA,CAAA,IAAA,EAIR;QAAA,IAAf,KAAe,GAAA,IAAA,CAAf,KAAe;YAAR,KAAQ,GAAA,IAAA,CAAR,KAAQ,CAAA;;QACvB,IAAA,CAAK,KAAL,GAAa,KAAb,CAAA;QACA,IAAA,CAAK,KAAL,GAAa,KAAb,CAAA;QACA,IAAA,CAAK,QAAL,CAAc,IAAA,CAAK,KAAnB,EAA0B,eAA1B,EAA2C,IAAA,CAAK,MAAhD,CAAA,CAAA;KAP+B;IAUnC,kBAVmC,EAAA,SAAA,kBAAA,GAUd;QACjB,IAAA,CAAK,KAAL,CAAW,OAAX,EAAA,CAAA;QACA,IAAA,CAAK,UAAL,EAAA,CAAA;KAZ+B;IAenC,UAfmC,EAAA,SAAA,UAAA,GAetB;QACT,IAAA,CAAK,MAAL,EAAA,CAAA;QACA,IAAA,CAAK,MAAL,EAAA,CAAA;KAjB+B;IAoBnC,eApBmC,EAAA,SAAA,eAAA,GAoBjB;QACd,IAAM,IAAA,GAAO,MAAA,CAAO,GAAP,CAAW,MAAA,CAAO,MAAP,CAAc,MAAzB,EAAiC;YAC1C,KAAA,EAAO,IAAA,CAAK,KAAL,CAAW,GAAX,CAAe,MAAf,CAAA;SADE,CAAb,CAAA;;QAIA,OAAO,CAAA,CAAE,MAAF,CAAS,EAAT,EAAa,IAAA,CAAK,KAAL,CAAW,UAAxB,EAAoC;YACvC,IAAA,EAAA,IADuC;YAEvC,UAAA,EAAY,CAAA,CAAA,EAAA,KAAA,CAAA,eAAA,EAAgB;gBACxB,IAAA,EAAM,IAAA,CAAK,KAAL,CAAW,GAAX,CAAe,MAAf,CADkB;gBAExB,OAAA,EAAS,IAAA,CAAK,KAAL,CAAW,GAAX,CAAe,MAAf,CAFe;gBAGxB,GAAA,EAAK,GAHmB;gBAIxB,UAAA,EAAY,IAAA;aAJJ,CAF2B;YAQvC,KAAA,EAAO,MAAA,CAAO,IAAP,CAAY,eAAA,GAAkB,IAAA,CAAK,KAAL,CAAW,GAAX,CAAe,OAAf,CAA9B,CAAA;SARJ,CAAP,CAAA;KAUH;CAnCkB,CAAvB,CAAA;;qBAsCe;;;;;;;;;;AC5Cf,IAAA,WAAA,GAAA,OAAA,CAAA,2BAAA,CAAA,CAAA;;;;AACA,IAAA,eAAA,GAAA,OAAA,CAAA,kBAAA,CAAA,CAAA;;;;;;AACA;AACA,IAAM,IAAA,GAAO,OAAA,CAAQ,MAAR,CAAb,CAAA;AACA,IAAM,QAAA,GAAW,6KAAjB,CAAA;;AAEA,IAAM,eAAA,GAAkB,YAAA,CAAA,SAAA,CAAA,CAAe,MAAf,CAAsB;;IAE1C,QAAA,EAAU,CAAA,CAAE,QAAF,CAAW,QAAX,CAFgC;;IAI1C,UAJ0C,EAAA,SAAA,UAAA,CAAA,IAAA,EAIyB;QAAA,IAAvD,EAAuD,GAAA,IAAA,CAAvD,EAAuD;YAAnD,KAAmD,GAAA,IAAA,CAAnD,KAAmD;YAA5C,UAA4C,GAAA,IAAA,CAA5C,UAA4C;YAAhC,eAAgC,GAAA,IAAA,CAAhC,eAAgC;YAAA,YAAA,GAAA,IAAA,CAAf,OAAe;YAAf,OAAe,GAAA,YAAA,KAAA,SAAA,GAAL,EAAK,GAAA,YAAA,CAAA;;QAC/D,IAAA,CAAK,EAAL,GAAU,EAAV,CAAA;QACA,IAAA,CAAK,UAAL,GAAkB,UAAlB,CAAA;QACA,IAAA,CAAK,KAAL,GAAa,KAAb,CAAA;QACA,IAAA,CAAK,eAAL,GAAuB,eAAvB,CAAA;QACA,IAAA,CAAK,OAAL,GAAe,OAAf,CAAA;QACA,IAAA,CAAK,eAAL,GAAuB,CAAA,CAAE,2BAAF,CAAvB,CAAA;QACA,IAAA,CAAK,UAAL,GAAkB,CAAA,CAAE,aAAF,CAAlB,CAAA;QACA,IAAA,CAAK,QAAL,CAAc,IAAA,CAAK,UAAnB,EAA+B,OAA/B,EAAwC,IAAA,CAAK,qBAA7C,CAAA,CAAA;QACA,IAAA,CAAK,QAAL,CAAc,IAAA,CAAK,UAAnB,EAA+B,WAA/B,EAA4C,IAAA,CAAK,WAAjD,CAAA,CAAA;QACA,IAAA,CAAK,QAAL,CAAc,eAAd,EAA+B,kBAA/B,EAAmD,IAAA,CAAK,qBAAxD,CAAA,CAAA;QACA,IAAA,CAAK,QAAL,CAAc,eAAd,EAA+B,mBAA/B,EAAoD,IAAA,CAAK,WAAzD,CAAA,CAAA;QACA,IAAA,CAAK,QAAL,CAAc,eAAd,EAA+B,2BAA/B,EAA4D,IAAA,CAAK,aAAjE,CAAA,CAAA;KAhBsC;IAmB1C,qBAnB0C,EAAA,SAAA,qBAAA,GAmBlB;QACpB,IAAI,IAAA,CAAK,OAAL,CAAa,OAAjB,EAA0B;YACtB,IAAA,CAAK,eAAL,CAAqB,IAArB,EAAA,CAAA;SACH;;QAED,IAAI,IAAA,CAAK,OAAL,CAAa,MAAjB,EAAyB;YACrB,IAAA,CAAK,oBAAL,EAAA,CAAA;SACH;QACD,IAAA,CAAK,UAAL,CAAgB,MAAhB,CAAuB,KAAvB,EAA8B,EAAC,MAAA,EAAQ,KAAT,EAA9B,CAAA,CAAA;QACA,IAAA,CAAK,OAAL,EAAA,CAAA;QACA,IAAA,CAAK,oBAAL,GAA4B,IAA5B,CAAA;KA7BsC;IAgC1C,oBAhC0C,EAAA,SAAA,oBAAA,GAgCnB;;QAEnB,CAAA,CAAE,4BAAF,CAAA,CAAgC,WAAhC,CAA4C,iBAA5C,CAAA,CAAA;QACA,CAAA,CAAE,uBAAF,CAAA,CAA2B,QAA3B,CAAoC,WAApC,CAAA,CAAA;QACA,CAAA,CAAE,0BAAF,CAAA,CAA8B,WAA9B,CAA0C,WAA1C,CAAA,CAAA;QACA,CAAA,CAAE,uBAAF,CAAA,CAA2B,WAA3B,CAAuC,WAAvC,CAAA,CAAA;KArCsC;IAwC1C,aAxC0C,EAAA,SAAA,aAAA,CAwC5B,SAxC4B,EAwCjB;QACrB,IAAI,IAAA,CAAK,UAAL,CAAgB,MAAhB,CAAuB,MAAvB,KAAkC,CAAtC,EAAyC;YACrC,OAAA;SACH;QACD,IAAI,IAAA,CAAK,oBAAL,IAA6B,IAAjC,EAAuC;YACnC,IAAA,CAAK,oBAAL,GAA4B,SAAA,GAAY,CAAZ,GAAgB,CAAhB,GAAoB,SAAhD,CAAA;SADJ,MAEO;YACH,IAAA,CAAK,oBAAL,IAA6B,SAA7B,CAAA;SACH;QACD,IAAI,IAAA,CAAK,oBAAL,GAA4B,CAAhC,EAAmC;YAC/B,IAAA,CAAK,oBAAL,GAA4B,IAAA,CAAK,KAAL,CAAW,MAAX,GAAoB,CAAhD,CAAA;SADJ,MAEO,IAAI,IAAA,CAAK,oBAAL,IAA6B,IAAA,CAAK,UAAL,CAAgB,MAAhB,CAAuB,MAAxD,EAAgE;YACnE,IAAA,CAAK,oBAAL,GAA4B,CAA5B,CAAA;SACH;QACD,IAAM,KAAA,GAAQ,IAAA,CAAK,UAAL,CAAgB,MAAhB,CAAuB,IAAA,CAAK,oBAA5B,CAAd,CAAA;QACA,IAAA,CAAK,UAAL,CAAgB,MAAhB,CAAuB,KAAvB,EAA8B,EAAC,MAAA,EAAQ,KAAT,EAA9B,CAAA,CAAA;QACA,KAAA,CAAM,GAAN,CAAU,QAAV,EAAoB,IAApB,CAAA,CAAA;QACA,IAAA,CAAK,eAAL,CAAqB,OAArB,CAA6B,kBAA7B,EAAiD,KAAA,CAAM,GAAN,CAAU,MAAV,CAAjD,CAAA,CAAA;KAzDsC;IA4D1C,WA5D0C,EAAA,SAAA,WAAA,GA4D5B;QACV,IAAM,SAAA,GAAY,yBAAlB,CAAA;QACA,IAAA,CAAK,CAAL,CAAO,SAAP,CAAA,CAAkB,MAAlB,CAAyB,IAAA,CAAK,IAA9B,CAAA,CAAA;KA9DsC;IAiE1C,WAjE0C,EAAA,SAAA,WAAA,GAiE5B;QACV,IAAA,CAAK,oBAAL,GAA4B,IAA5B,CAAA;QACA,IAAI,IAAA,CAAK,KAAL,CAAW,GAAX,CAAe,MAAf,CAAA,CAAuB,MAAvB,IAAiC,IAAA,CAAK,UAAL,CAAgB,MAAhB,CAAuB,MAA5D,EAAoE;YAChE,IAAA,CAAK,MAAL,EAAA,CAAA;YACA,IAAA,CAAK,eAAL,CAAqB,IAArB,EAAA,CAAA;SAFJ,MAGO;YACH,IAAA,CAAK,OAAL,EAAA,CAAA;SACH;KAxEqC;IA2E1C,cA3E0C,EAAA,SAAA,cAAA,CAAA,KAAA,EA2ElB;QAAA,IAAR,KAAQ,GAAA,KAAA,CAAR,KAAQ,CAAA;;QACpB,OAAO,IAAI,gBAAA,CAAA,SAAA,CAAJ,CAAqB;YACxB,KAAA,EAAA,KADwB;YAExB,KAAA,EAAO,IAAA,CAAK,KAAA;SAFT,CAAP,CAAA;KAIH;CAhFmB,CAAxB,CAAA;;qBAoFe;;;;;;;;;;AC1Ff;;;;AACA;;;;;;AAEA,IAAM,IAAI,OAAO,CAAjB;;AAEA,IAAM,YAAY,kBAAS,MAAT,CAAgB;;AAE9B,YAAQ;AACJ,mCAA2B,YADvB;AAEJ,sCAA8B,OAF1B;AAGJ,uCAA+B,QAH3B;AAIJ,sCAA8B,OAJ1B;AAKJ,iCAAyB;AALrB,KAFsB;;AAU9B,cAV8B,4BAUG;AAAA;;AAAA,YAArB,EAAqB,QAArB,EAAqB;AAAA,YAAjB,KAAiB,QAAjB,KAAiB;AAAA,YAAV,OAAU,QAAV,OAAU;;AAC7B,aAAK,0BAAL;;AAEA,aAAK,UAAL,CAAgB,EAAhB;AACA,aAAK,cAAL;AACA,aAAK,KAAL,GAAa,KAAb;;AAEA,aAAK,MAAL,GAAsB,KAAK,GAAL,CAAS,IAAT,CAAc,sBAAd,CAAtB;AACA,aAAK,KAAL,GAAsB,KAAK,GAAL,CAAS,IAAT,CAAc,qBAAd,CAAtB;AACA,aAAK,aAAL,GAAsB,KAAK,GAAL,CAAS,IAAT,CAAc,kBAAd,CAAtB;AACA,aAAK,YAAL,GAAsB,KAAK,GAAL,CAAS,IAAT,CAAc,iBAAd,CAAtB;;AAEA;AACA,aAAK,KAAL,CAAW,GAAX,CAAe,MAAf,EAAuB,KAAK,MAAL,CAAY,GAAZ,EAAvB;;AAEA,UAAE,MAAF,CAAS,IAAT,EAAgB,WAAW,EAA3B;;AAEA,aAAK,aAAL,CAAmB,EAAnB,CAAsB,gBAAtB,EAAwC,UAAC,EAAD,EAAQ;AAAE,kBAAK,YAAL,CAAkB,EAAlB;AAAwB,SAA1E;AACH,KA5B6B;AA8B9B,8BA9B8B,wCA8BD;AACzB,UAAE,EAAF,CAAK,kBAAL,GAA0B,YAAW;AACjC,gBAAM,cAAc,KAAK,GAAL,EAApB;AACA,iBAAK,GAAL,CAAS,EAAT,EAAa,GAAb,CAAiB,WAAjB;AACH,SAHD;AAIH,KAnC6B;AAqC9B,cArC8B,sBAqCnB,EArCmB,EAqCf;AACX,YAAI,KAAK,KAAL,CAAW,gBAAX,EAAJ,EAAmC;AAC/B,iBAAK,KAAL,CAAW,MAAX;AACH,SAFD,MAEO;AACH,eAAG,eAAH;AACA,eAAG,cAAH;AACH;AACJ,KA5C6B;AA8C9B,SA9C8B,iBA8CxB,EA9CwB,EA8CpB;AACN,aAAK,eAAL;;AAEA,YAAI,KAAK,QAAL,CAAc,GAAd,CAAkB,GAAG,KAArB,CAAJ,EAAiC;AAC7B,iBAAK,QAAL,CAAc,GAAd,CAAkB,GAAG,KAArB,EAA4B,IAA5B;AACH,SAFD,MAEO;AACH,iBAAK,KAAL,CAAW,GAAX,CAAe,MAAf,EAAuB,GAAG,MAAH,CAAU,KAAjC;AACA,eAAG,eAAH;AACA,eAAG,cAAH;AACH;AACJ,KAxD6B;AA0D9B,SA1D8B,iBA0DxB,EA1DwB,EA0DpB;AACN,aAAK,eAAL;AACA,aAAK,KAAL,CAAW,GAAX,CAAe,MAAf,EAAuB,GAAG,MAAH,CAAU,KAAjC;AACA,WAAG,eAAH;AACA,WAAG,cAAH;AACH,KA/D6B;AAiE9B,mBAjE8B,6BAiEZ;AACd,YAAI,KAAK,MAAL,CAAY,GAAZ,EAAJ,EAAuB;AACnB,iBAAK,YAAL,CAAkB,IAAlB;AACH,SAFD,MAEO;AACH,iBAAK,YAAL,CAAkB,IAAlB;AACH;AACJ,KAvE6B;AAyE9B,eAzE8B,yBAyEhB;AACV,aAAK,MAAL,CAAY,GAAZ,CAAgB,EAAhB,EAAoB,KAApB;AACA,aAAK,YAAL,CAAkB,IAAlB;AACH,KA5E6B;;;AA8E9B,cAAU,IAAI,GAAJ,CAAQ,CACd,CAAC,sBAAS,KAAV,EAAiB,UAAC,IAAD;AAAA,eAAU,KAAK,UAAL,EAAV;AAAA,KAAjB,CADc,CAAR,CA9EoB;;AAkF9B,gBAlF8B,wBAkFjB,EAlFiB,EAkFb;AACb,YAAI,GAAG,KAAH,KAAa,sBAAS,KAAtB,IAA+B,GAAG,KAAH,KAAa,sBAAS,KAArD,IAA8D,GAAG,IAAH,KAAY,OAA9E,EAAuF;AACnF,iBAAK,GAAL,CAAS,WAAT,CAAqB,QAArB;AACA,iBAAK,MAAL,CAAY,KAAZ,GAAoB,kBAApB;AACH;;AAED,aAAK,eAAL;;AAEA,YAAI,OAAJ,EAAa,QAAQ,WAAR;AAChB;AA3F6B,CAAhB,CAAlB;;qBA+Fe,S;;;;;;;;;ACpGf;;;;AACA;;;;;;;;AAEA,IAAM,wBAAwB,wBAAU,MAAV,CAAiB;AAE3C,UAF2C,oBAElC;AACL,eAAO,EAAE,MAAF,CAAS,EAAT,EAAa,EAAE,MAAF,CAAS,wBAAU,SAAnB,EAA8B,QAA9B,CAAb,EAAsD;AACzD,yCAA6B,MAD4B;AAEzD,0CAA8B,OAF2B;AAGzD,4CAAgC;AAHyB,SAAtD,CAAP;AAKH,KAR0C;AAU3C,cAV2C,4BAUc;AAAA,YAA7C,EAA6C,QAA7C,EAA6C;AAAA,YAAzC,cAAyC,QAAzC,cAAyC;AAAA,YAAzB,KAAyB,QAAzB,KAAyB;AAAA,YAAlB,eAAkB,QAAlB,eAAkB;;AACrD,YAAI,UAAU,EAAd;AACA,YAAI,cAAJ,EAAoB;AAChB,oBAAQ,aAAR,GAAwB,cAAxB;AACH;;AAED,gCAAU,SAAV,CAAoB,UAApB,CAA+B,IAA/B,CAAoC,IAApC,EAA0C,EAAC,MAAD,EAAK,YAAL,EAAY,gBAAZ,EAA1C;AACA,aAAK,eAAL,GAAuB,eAAvB;AACA,aAAK,QAAL,CAAc,KAAK,eAAnB,EAAoC,kBAApC,EAAwD,KAAK,UAA7D;AACH,KAnB0C;AAqB3C,cArB2C,sBAqBhC,IArBgC,EAqB1B;AACb,aAAK,MAAL,CAAY,GAAZ,CAAgB,IAAhB;AACH,KAvB0C;AAyB3C,qBAzB2C,6BAyBzB,EAzByB,EAyBrB;AAClB,YAAM,UAAU,CAAC,uBAAD,EAA0B,oBAA1B,EAAgD,qBAAhD,EAAuE,iBAAvE,CAAhB;AACA,YAAM,oBAAoB,SAAS,aAAnC;AACA,YAAM,iBAAiB,GAAG,aAA1B;AACA,eAAO,QAAQ,KAAR,CAAc,UAAC,SAAD;AAAA,mBACjB,EAAE,kBAAkB,SAAlB,CAA4B,QAA5B,CAAqC,SAArC,KACM,kBAAkB,CAAC,eAAe,SAAf,CAAyB,QAAzB,CAAkC,SAAlC,CAD3B,CADiB;AAAA,SAAd,KAGF,KAHL;AAIH,KAjC0C;AAmC3C,WAnC2C,mBAmCnC,EAnCmC,EAmC/B;AACR,YAAI,GAAG,KAAH,KAAa,sBAAS,EAAtB,IAA4B,GAAG,KAAH,KAAa,sBAAS,IAAtD,EAA4D;AACxD,mBAAO,KAAP;AACH;AACD,YAAI,GAAG,KAAH,KAAa,sBAAS,GAA1B,EAA+B;AAC3B,iBAAK,gBAAL;AACH;AACD,eAAO,KAAK,CAAZ;AACH,KA3C0C;AA6C3C,oBA7C2C,8BA6CxB;AACf,aAAK,eAAL,CAAqB,OAArB,CAA6B,kBAA7B;AACH,KA/C0C;AAiD3C,QAjD2C,gBAiDtC,EAjDsC,EAiDlC;AAAA;;AACL,mBAAW,YAAM;AACb,gBAAI,MAAK,iBAAL,CAAuB,EAAvB,CAAJ,EAAgC;AAC5B,sBAAK,gBAAL;AACH;AACJ,SAJD,EAIG,CAJH;AAKH,KAvD0C;AAyD3C,SAzD2C,mBAyDnC;AACJ,aAAK,eAAL,CAAqB,OAArB,CAA6B,mBAA7B;AACH,KA3D0C;;;AA6D3C,cAAU,IAAI,GAAJ,CAAQ,CACd,CAAC,sBAAS,EAAV,EAAc,UAAC,IAAD;AAAA,eAAU,KAAK,eAAL,CAAqB,OAArB,CAA6B,2BAA7B,EAA0D,CAAC,CAA3D,CAAV;AAAA,KAAd,CADc,EAEd,CAAC,sBAAS,IAAV,EAAgB,UAAC,IAAD;AAAA,eAAU,KAAK,eAAL,CAAqB,OAArB,CAA6B,2BAA7B,EAA0D,CAA1D,CAAV;AAAA,KAAhB,CAFc,+BAGV,wBAAU,SAAV,CAAoB,QAHV,GAAR;;AA7DiC,CAAjB,CAA9B;;qBAqEe,qB;;;;;;;;;qBCxEA;AAAA,QAAE,SAAF,QAAE,SAAF;AAAA,QAAa,gBAAb,QAAa,gBAAb;AAAA,2DAEH,KAAK,8BAAL,CAFG,yBAIL,gBAJK,sEAOK,SAPL,2FAOsG,KAAK,QAAL,CAPtG,wBAQA,KAAK,QAAL,CARA,uHAUmF,KAAK,QAAL,CAVnF;AAAA,C;;;;;;;;;ACAf;;AACA;;;;;;;;;;;;cACiB,M;IAAT,I,WAAA,I;;IAEa,mB;;;AACjB,iCAAY,UAAZ,EAAwB;AAAA;;AACpB,YAAI,aAAa,OAAO,MAAP,CAAc,cAA/B;AACA,YAAI,iBAAe,OAAO,MAAP,CAAc,kBAA7B,IACA,2BAAyB,mBAAmB,UAAnB,CAAzB,GAA4D,EAD5D,CAAJ;;AAIA,YAAI,sEAAoE,UAApE,UAAmF,KACnF,sBADmF,CAAnF,SAAJ;AAGA,YAAI,mBAAmB,KAAK,wCAAL,EAA+C;AAClE,8BAAkB;AADgD,SAA/C,CAAvB;AAGA,YAAM,gBAAgB;AAClB,qBAAS,CAAC,qBAAD,CADS;AAElB,mBAAO,KAAK,6BAAL,CAFW;AAGlB,qBAAS,sCAA4B;AACjC,oCADiC;AAEjC;AAFiC,aAA5B;AAHS,SAAtB;;AAZoB,8IAqBd,aArBc;;AAsBpB,cAAK,GAAL,CAAS,IAAT,CAAc,SAAd,EAAyB,EAAzB,CAA4B,OAA5B,EAAqC,YAAM;AACvC,kBAAK,KAAL;AACH,SAFD;AAtBoB;AAyBvB;;;EA1B4C,Y;;qBAA5B,mB;;;;;;;ACJrB;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AAEA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;;;;;IAEM,W;AACF,+BAMG;AAAA,YALC,GAKD,QALC,GAKD;AAAA,YAJC,IAID,QAJC,IAID;AAAA,YAHC,cAGD,QAHC,cAGD;AAAA,YAFC,cAED,QAFC,cAED;AAAA,YADC,iBACD,QADC,iBACD;;AAAA;;AACC,aAAK,GAAL,GAAW,GAAX;AACA,aAAK,IAAL,GAAY,IAAZ;AACA,aAAK,cAAL,GAAsB,cAAtB;AACA,aAAK,cAAL,GAAsB,cAAtB;AACA,aAAK,iBAAL,GAAyB,iBAAzB;;AAEA,aAAK,mBAAL;AACA,aAAK,4BAAL;AACA,aAAK,6BAAL;AACH;;;;8CAEqB;AAClB,iBAAK,IAAI,+BAAJ,CAAuB,KAAK,GAA5B,EAAiC,KAAK,IAAtC,EAA4C,KAAK,cAAjD,CAAL;AACA,iBAAK,IAAI,0BAAJ,CACD,KAAK,GADJ,EAED,KAAK,cAFJ,EAGD,KAAK,iBAHJ,CAAL;AAKA,iBAAK,IAAI,wBAAJ,CAAgB,KAAK,GAArB,CAAL;AACA,iBAAK,IAAI,wBAAJ,CAAgB,KAAK,GAArB,CAAL;AACA,iBAAK,IAAI,8BAAJ,CAAsB,KAAK,GAA3B,CAAL;AACA,iBAAK,IAAI,kCAAJ,CAA0B,KAAK,GAA/B,CAAL;;AAEA,gBAAI,KAAK,cAAL,CAAoB,SAApB,CAA8B,eAA9B,CAAJ,EAAoD;AAChD,qBAAK,IAAI,sCAAJ,CAA8B,KAAK,GAAnC,CAAL;AACH;AACJ;;;uDAE8B;AAC3B,iBAAK,IAAI,0BAAJ,CAAkB,KAAK,GAAvB,CAAL;AACH;;;wDAE+B;AAC5B,kBAAM,OAAO,SAAP,CAAiB,aAAjB,GAAiC,IAAI,gCAAJ,CACnC,KAAK,GAD8B,CAAvC;AAGA,iBAAK,IAAI,sCAAJ,CAA0B,KAAK,GAA/B,CAAL;AACA,iBAAK,IAAI,gCAAJ,CAAwB,KAAK,GAA7B,CAAL;AACA,iBAAK,IAAI,yCAAJ,CAAiC,KAAK,GAAtC,CAAL;AACH;;;;;;AAGL,OAAO,OAAP,GAAiB,WAAjB;;;;;;;;;;;;;cChEwB,M;IAAhB,G,WAAA,G;IAAK,M,WAAA,M;;IAEQ,mB;;;4BACH;AACV,mBAAO,EAAE,OAAO,EAAT,EAAa,OAAb,EAAP;AACH;;;4BAEmB;AAChB,mBAAO;AACH,sBAAM,oBAAwC;AAAA,wBAArC,KAAqC,QAArC,KAAqC;AAAA,wBAA9B,OAA8B,QAA9B,OAA8B;AAAA,wBAArB,cAAqB,QAArB,cAAqB;;AAC1C;AACA,4BAAQ,GAAR,cAAuB,KAAvB,UAAmC;AAC/B,oCAD+B;AAE/B,wCAF+B;AAG/B;AAH+B,qBAAnC;AAKH;AARE,aAAP;AAUH;;;AAED,iCAAY,GAAZ,EAAiB;AAAA;;AAAA;;AACb,aAAK,GAAL,GAAW,GAAX;;AAEA,aAAK,UAAL,GAAkB,OAAO,SAAP,IAAoB,KAAK,aAA3C;AACA,aAAK,UAAL,GAAkB,OAAO,SAAP,CAAiB,MAAnC;;AAEA,aAAK,GAAL,CACK,EADL,CACQ,sBADR,EACgC,UAAC,MAAD;AAAA,mBACxB,MAAK,SAAL,CAAe,MAAf,EAAuB,aAAvB,CADwB;AAAA,SADhC,EAIK,EAJL,CAIQ,oBAJR,EAI8B,UAAC,MAAD;AAAA,mBACtB,MAAK,SAAL,CAAe,MAAf,EAAuB,WAAvB,CADsB;AAAA,SAJ9B,EAOK,EAPL,CAOQ,2BAPR,EAOqC,UAAC,MAAD;AAAA,mBAC7B,MAAK,SAAL,CAAe,MAAf,EAAuB,iBAAvB,CAD6B;AAAA,SAPrC,EAUK,EAVL,CAUQ,2BAVR,EAUqC,UAAC,MAAD;AAAA,mBAC7B,MAAK,SAAL,CAAe,MAAf,EAAuB,wBAAvB,CAD6B;AAAA,SAVrC,EAaK,EAbL,CAaQ,wBAbR,EAakC,UAAC,MAAD;AAAA,mBAC1B,MAAK,SAAL,CAAe,MAAf,EAAuB,eAAvB,CAD0B;AAAA,SAblC,EAgBK,EAhBL,CAgBQ,2BAhBR,EAgBqC,UAAC,MAAD;AAAA,mBAC7B,MAAK,SAAL,CAAe,MAAf,EAAuB,cAAvB,CAD6B;AAAA,SAhBrC,EAmBK,EAnBL,CAmBQ,gBAnBR,EAmB0B,UAAC,MAAD;AAAA,mBAClB,MAAK,SAAL,CAAe,MAAf,EAAuB,eAAvB,CADkB;AAAA,SAnB1B,EAsBK,EAtBL,CAsBQ,eAtBR,EAsByB,UAAC,MAAD;AAAA,mBACjB,MAAK,SAAL,CAAe,MAAf,EAAuB,cAAvB,CADiB;AAAA,SAtBzB,EAyBK,EAzBL,CAyBQ,yBAzBR,EAyBmC,UAAC,MAAD;AAAA,mBAC3B,MAAK,SAAL,CAAe,MAAf,EAAuB,uBAAvB,CAD2B;AAAA,SAzBnC,EA4BK,EA5BL,CA4BQ,uBA5BR,EA4BiC,UAAC,MAAD;AAAA,mBACzB,MAAK,SAAL,CAAe,MAAf,EAAuB,qBAAvB,CADyB;AAAA,SA5BjC;AA+BH;;;;yCAEkC,K,EAAO;AAAA,gBAA9B,UAA8B,SAA9B,UAA8B;AAAA,gBAAlB,OAAkB,SAAlB,OAAkB;;AACtC,gBAAI,UAAU,EAAE,MAAF,CACV,EADU,EAEV,KAAK,aAAL,CAAmB,UAAnB,CAFU,EAGV,KAAK,kBAAL,CACI,UAAU,QAAQ,oBAAlB,GAAyC,EAD7C,CAHU,EAMV,KAAK,gBAAL,CACI,WAAW,OAAX,GAAqB,WAAW,OAAX,CAAmB,QAAxC,GAAmD,EADvD,CANU,EASV,WAAW,QAAQ,QAAnB,GAA8B,EAAE,UAAU,QAAQ,QAApB,EAA9B,GAA+D,EATrD,EAUV,OAAO,cAAP,CAAsB,SAAtB,CAAgC,gBAAhC,IACM,KAAK,oBAAL,CAA0B,OAA1B,EAAmC,UAAnC,EAA+C,KAA/C,CADN,GAEM,EAZI,CAAd;;AAeA;AACA;AACA,gBAAI,UAAU,aAAV,IAA2B,QAAQ,SAAvC,EAAkD;AAC9C,wBAAQ,YAAR;AACH,aAFD,MAEO,IAAI,UAAU,WAAV,IAAyB,QAAQ,cAArC,EAAqD;AACxD,wBAAQ,mBAAR;AACH;;AAED,gBAAI,uBAAJ;AACA,sBACO,iBAAiB,QAAQ,cADhC,GAEO,iBAAiB,KAFxB;;AAIA,iBAAK,UAAL,CAAgB,IAAhB,CAAqB,EAAE,YAAF,EAAS,gBAAT,EAAkB,8BAAlB,EAArB;AACH;;;sCAEa,U,EAAY;AACtB,gBAAI,IAAI,WAAW,UAAnB;;AAEA,mBAAO;AACH,yBAAS,EAAE,EADR;AAEH,2BAAW,EAAE,KAFV;AAGH,wBAAQ,EAAE,gBAHP;AAIH,6BAAc,EAAE,IAAF,IAAU,EAAE,IAAF,CAAO,EAAlB,IAAyB;AAJnC,aAAP;AAMH;;;oCAEW,O,EAAS;AACjB,gBAAI,WAAW,QAAQ,QAAvB,EAAiC;AAC7B,uBAAO,EAAE,UAAU,QAAQ,QAApB,EAAP;AACH;AACD,mBAAO,EAAP;AACH;;;2CAEkB,oB,EAAsB;AACrC,gBAAI,EAAE,oBAAF,EAAwB,OAAxB,EAAJ,EAAuC;AACnC,uBAAO,EAAP;AACH;;AAED,gBAAI,IAAI,oBAAR;AACA,mBAAO;AACH,wBAAQ,EAAE,UAAF,CAAa,EADlB;AAEH,0BAAU,EAAE,UAAF,CAAa,IAFpB;AAGH,yBAAS,IAAI,OAAO,cAAX,EAA2B;AAChC,kCAAc,EAAE,UAAF,CAAa;AADK,iBAA3B,CAHN;AAMH;AACA;AACA,0BAAU,EAAE,SAAF,GAAc,SAAd,GAA0B,WARjC;AASH,4BAAY,EAAE,UAAF,CAAa;AATtB,aAAP;AAWH;;;yCAEgB,Q,EAAU;AACvB,gBAAI,EAAE,QAAF,EAAY,OAAZ,EAAJ,EAA2B;AACvB,uBAAO,EAAP;AACH;;AAED,mBAAO;AACH,4BAAY,SAAS,EADlB;AAEH,8BAAc,SAAS;AAFpB,aAAP;AAIH;;;6CAEoB,O,EAAS,U,EAAY,K,EAAO;AAC7C,gBACI,UAAU,cAAV,IACA,CAAC,EAAE,OAAF,EAAW,OAAX,EADD,IAEA,QAAQ,SAHZ,EAIE;AACE,uBAAO;AACH,iCAAa,QAAQ,SADlB;AAEH,mCAAe,QAAQ,YAFpB;AAGH,iCAAa,QAAQ,WAHlB;AAIH,2CAAuB,WAAW,GAAX,CACnB,4BADmB,CAJpB;AAOH,8CAA0B,WAAW,GAAX,CACtB,4BADsB;AAPvB,iBAAP;AAWH,aAhBD,MAgBO,IAAI,UAAU,uBAAd,EAAuC;AAC1C,uBAAO;AACH,2CAAuB,WAAW,GAAX,CACnB,4BADmB,CADpB;AAIH,8CAA0B,WAAW,GAAX,CACtB,4BADsB;AAJvB,iBAAP;AAQH,aATM,MASA;AACH,uBAAO,EAAP;AACH;AACJ;;;;;;qBAtKgB,mB;;;;;;;;;;;;;ICDA,yB;;;4BACH;AACV,mBAAO,EAAE,OAAO,EAAT,EAAa,OAAb,EAAP;AACH;;;4BAEmB;AAChB,mBAAO;AACH,sBAAM,oBAAwB;AAAA,wBAArB,KAAqB,QAArB,KAAqB;AAAA,wBAAd,OAAc,QAAd,OAAc;;AAC1B,4BAAQ,GAAR,cAAuB,KAAvB,UAAmC,OAAnC,EAD0B,CACmB;AAChD;AAHE,aAAP;AAKH;;;AAED,uCAAY,GAAZ,EAAiB;AAAA;;AAAA;;AACb,aAAK,GAAL,GAAW,GAAX;;AAEA,aAAK,UAAL,GAAkB,OAAO,SAAP,IAAoB,KAAK,aAA3C;;AAEA,aAAK,GAAL,CACK,EADL,CACQ,mCADR,EAC4C;AAAA,gBAAE,OAAF,SAAE,OAAF;AAAA,gBAAW,MAAX,SAAW,MAAX;AAAA,mBAAuB,MAAK,SAAL,CAAe,EAAC,gBAAD,EAAU,cAAV,EAAf,CAAvB;AAAA,SAD5C;AAEH;;;;yCAE4B;AAAA,gBAAlB,OAAkB,SAAlB,OAAkB;AAAA,gBAAT,MAAS,SAAT,MAAS;;AACzB,gBAAI,EAAE,OAAO,IAAP,CAAY,QAAQ,OAApB,CAAF,EAAgC,QAAhC,CAAyC,mBAAzC,CAAJ,EAAmE;AAC/D,qBAAK,UAAL,CAAgB,IAAhB,CAAqB;AACjB,2BAAO,mBADU;AAEjB,6BAAS;AACL,sCADK,EACG;AACR,+BAAO,QAAQ,OAAR,CAAgB;AAFlB;AAFQ,iBAArB;AAOH;AACJ;;;;;;qBAhCgB,yB;;;;;;;;;;;;;ICAA,4B;;;4BACH;AACV,mBAAO,EAAE,OAAO,EAAT,EAAa,OAAb,EAAP;AACH;;;4BAEmB;AAChB,mBAAO;AACH,sBAAM,oBAAwB;AAAA,wBAArB,KAAqB,QAArB,KAAqB;AAAA,wBAAd,OAAc,QAAd,OAAc;;AAC1B,4BAAQ,GAAR,cAAuB,KAAvB,UAAmC,OAAnC,EAD0B,CACmB;AAChD;AAHE,aAAP;AAKH;;;AAED,0CAAY,GAAZ,EAAiB;AAAA;;AAAA;;AACb,aAAK,GAAL,GAAW,GAAX;;AAEA,aAAK,UAAL,GAAkB,OAAO,SAAP,IAAoB,KAAK,aAA3C;;AAEA,aAAK,GAAL,CACK,EADL,CACQ,uBADR,EAC4C,UAAC,MAAD;AAAA,mBAAY,MAAK,SAAL,CAAe,MAAf,EAAuB,qBAAvB,CAAZ;AAAA,SAD5C,EAEK,EAFL,CAEQ,wBAFR,EAE6C,UAAC,MAAD;AAAA,mBAAY,MAAK,SAAL,CAAe,MAAf,EAAuB,sBAAvB,CAAZ;AAAA,SAF7C,EAGK,EAHL,CAGQ,yBAHR,EAG8C,UAAC,MAAD;AAAA,mBAAY,MAAK,SAAL,CAAe,MAAf,EAAuB,uBAAvB,CAAZ;AAAA,SAH9C,EAIK,EAJL,CAIQ,wBAJR,EAI6C,UAAC,MAAD;AAAA,mBAAY,MAAK,SAAL,CAAe,MAAf,EAAuB,sBAAvB,CAAZ;AAAA,SAJ7C,EAKK,EALL,CAKQ,yBALR,EAK8C,UAAC,MAAD;AAAA,mBAAY,MAAK,SAAL,CAAe,MAAf,EAAuB,uBAAvB,CAAZ;AAAA,SAL9C,EAMK,EANL,CAMQ,uBANR,EAM4C,UAAC,MAAD;AAAA,mBAAY,MAAK,SAAL,CAAe,MAAf,EAAuB,qBAAvB,CAAZ;AAAA,SAN5C;AAOH;;;;kCAES,O,EAAS,S,EAAW;AACtB,iBAAK,UAAL,CAAgB,IAAhB,CAAqB;AACjB,uBAAO,SADU;AAEjB,yBAAS;AAFQ,aAArB;AAIP;;;;;;qBAhCgB,4B;;;;;;;;;;;;;ICDA,mB;AACjB,iCAAY,GAAZ,EAAiB;AAAA;;AAAA;;AACb,aAAK,GAAL,GAAW,GAAX;;AAEA,aAAK,UAAL,GAAkB,OAAO,SAAP,IAAoB,KAAK,aAA3C;;AAEA,aAAK,GAAL,CACK,EADL,CACQ,gBADR,EAC0B,UAAC,MAAD;AAAA,mBAClB,MAAK,eAAL,CAAqB,MAArB,EAA6B,sBAA7B,CADkB;AAAA,SAD1B,EAIK,EAJL,CAIQ,iBAJR,EAI2B,UAAC,MAAD;AAAA,mBACnB,MAAK,eAAL,CAAqB,MAArB,EAA6B,kBAA7B,CADmB;AAAA,SAJ3B,EAOK,EAPL,CAOQ,cAPR,EAOwB,UAAC,MAAD;AAAA,mBAChB,MAAK,eAAL,CAAqB,MAArB,EAA6B,eAA7B,CADgB;AAAA,SAPxB,EAUK,EAVL,CAUQ,kBAVR,EAU4B,UAAC,MAAD;AAAA,mBACpB,MAAK,eAAL,CAAqB,MAArB,EAA6B,uBAA7B,CADoB;AAAA,SAV5B,EAaK,EAbL,CAaQ,YAbR,EAasB,UAAC,MAAD;AAAA,mBACd,MAAK,eAAL,CAAqB,MAArB,EAA6B,aAA7B,CADc;AAAA,SAbtB,EAgBK,EAhBL,CAgBQ,sBAhBR,EAgBgC,UAAC,MAAD;AAAA,mBACxB,MAAK,eAAL,CAAqB,MAArB,EAA6B,6BAA7B,CADwB;AAAA,SAhBhC,EAmBK,EAnBL,CAmBQ,kBAnBR,EAmB4B,UAAC,MAAD;AAAA,mBACpB,MAAK,eAAL,CAAqB,MAArB,EAA6B,+BAA7B,CADoB;AAAA,SAnB5B,EAsBK,EAtBL,CAsBQ,oBAtBR,EAsB8B,UAAC,MAAD;AAAA,mBACtB,MAAK,eAAL,CAAqB,MAArB,EAA6B,iCAA7B,CADsB;AAAA,SAtB9B,EAyBK,EAzBL,CAyBQ,iBAzBR,EAyB2B,UAAC,MAAD;AAAA,mBACnB,MAAK,eAAL,CAAqB,MAArB,EAA6B,8BAA7B,CADmB;AAAA,SAzB3B,EA4BK,EA5BL,CA4BQ,mBA5BR,EA4B6B,UAAC,MAAD;AAAA,mBACrB,MAAK,eAAL,CAAqB,MAArB,EAA6B,gCAA7B,CADqB;AAAA,SA5B7B,EA+BK,EA/BL,CA+BQ,qBA/BR,EA+B+B,UAAC,MAAD;AAAA,mBACvB,MAAK,eAAL,CAAqB,MAArB,EAA6B,qBAA7B,CADuB;AAAA,SA/B/B,EAmCK,EAnCL,CAmCQ,2BAnCR,EAmCqC;AAAA,mBAC7B,MAAK,iBAAL,CAAuB,+BAAvB,CAD6B;AAAA,SAnCrC,EAsCK,EAtCL,CAsCQ,6BAtCR,EAsCuC;AAAA,mBAC/B,MAAK,iBAAL,CAAuB,iCAAvB,CAD+B;AAAA,SAtCvC,EAyCK,EAzCL,CAyCQ,+BAzCR,EAyCyC;AAAA,mBACjC,MAAK,iBAAL,CAAuB,6BAAvB,CADiC;AAAA,SAzCzC,EA4CK,EA5CL,CA4CQ,wBA5CR,EA4CkC;AAAA,mBAC1B,MAAK,iBAAL,CAAuB,aAAvB,CAD0B;AAAA,SA5ClC,EAgDK,EAhDL,CAgDQ,mBAhDR,EAgD6B;AAAA,mBACrB,MAAK,iBAAL,CAAuB,qBAAvB,CADqB;AAAA,SAhD7B,EAmDK,EAnDL,CAmDQ,2BAnDR,EAmDqC;AAAA,mBAC7B,MAAK,iBAAL,CAAuB,oBAAvB,CAD6B;AAAA,SAnDrC,EAsDK,EAtDL,CAsDQ,6BAtDR,EAsDuC;AAAA,mBAC/B,MAAK,iBAAL,CAAuB,kBAAvB,CAD+B;AAAA,SAtDvC,EAyDK,EAzDL,CAyDQ,0BAzDR,EAyDoC;AAAA,mBAC5B,MAAK,iBAAL,CAAuB,kBAAvB,CAD4B;AAAA,SAzDpC;AA4DH;;;;wCAUe,W,EAAa,M,EAAQ;AACjC,gBAAI,UAAU;AACV,uBAAO,MADG;AAEV,+BAAe,gBAFL;AAGV,6BAAa,MAHH;AAIV,4BAAY;AAJF,aAAd;;AAOA,iBAAK,UAAL,CAAgB,IAAhB,CAAqB,OAArB;AACH;;;0CAEiB,M,EAAQ;AACtB,gBAAI,UAAU;AACV,uBAAO,UADG;AAEV,+BAAe,SAFL;AAGV,6BAAa,YAHH;AAIV,4BAAY;AAJF,aAAd;;AAOA,iBAAK,UAAL,CAAgB,IAAhB,CAAqB,OAArB;AACH;;;4BA5BmB;AAChB,mBAAO;AACH,sBAAM,oBAAwB;AAAA,wBAArB,KAAqB,QAArB,KAAqB;AAAA,wBAAd,OAAc,QAAd,OAAc;;AAC1B,4BAAQ,GAAR,cAAuB,KAAvB,UAAmC,EAAE,YAAF,EAAS,gBAAT,EAAnC,EAD0B,CAC8B;AAC3D;AAHE,aAAP;AAKH;;;;;;qBA1EgB,mB;;;;;;;;;ACArB;;qBAEe;AAAA,+CAEK,8BAAY,qBAAZ,CAFL,0BAGD,KAAK,qBAAL,CAHC,6CAIiB,KAAK,wBAAL,CAJjB,gIAKqG,KACxG,sBADwG,CALrG,2EAQ4C,KAC/C,8BAD+C,CAR5C;AAAA,C;;;;;;;;;;;;;ACFf;;AACA;;;;AACA;;;;;;;;;;;;IAEqB,e;;;AACjB,+BAAc;AAAA;;AACV,YAAI,UAAU,mCAAd;AACA,YAAI,gBAAgB;AAChB,qBAAS,CAAC,OAAD,EAAU,iBAAV,CADO;AAEhB,mBAAO,OAAO,IAAP,CAAY,kBAAZ,CAFS;AAGhB,yBAAa,IAHG;AAIhB;AAJgB,SAApB;;AAFU,iIASJ,aATI;AAUb;;;;gCAEO;AACJ,iBAAK,SAAL;AACA;AACH;;;oCAEW;AACR,oBAAQ,MAAR,CAAe,mBAAf,EAAoC,EAAC,MAAM,GAAP,EAApC;AACA,oBAAQ,GAAR,CAAY,mBAAZ,EAAiC,WAAjC,EAA8C,EAAC,MAAM,GAAP,EAAY,SAAS,EAArB,EAA9C;AACH;;;;EArBwC,Y;;qBAAxB,e;;;;;;;;;ACJrB,IAAA,KAAA,GAAA,OAAA,CAAA,qBAAA,CAAA,CAAA;;;;AACA,IAAA,QAAA,GAAA,OAAA,CAAA,gBAAA,CAAA,CAAA;;;;;;AACA;AACA,IAAM,IAAA,GAAO,OAAA,CAAQ,MAAR,CAAb,CAAA;AACA,IAAM,QAAA,GAAW,2qBAAjB,CAAA;;AAKA,IAAM,oBAAA,GACF,8MADJ,CAAA;AAEA,IAAM,sBAAA,GACF,+NADJ,CAAA;;AAGA,IAAM,OAAA,GAAU,MAAA,CAAA,SAAA,CAAA,CAAS,MAAT,CAAgB;IAC5B,SAAA,EAAW,2BADiB;;IAG5B,OAAA,EAAS,IAHmB;;IAK5B,IAAA,EAAM,IALsB;;IAO5B,IAAA,EAAM,EAPsB;;IAS5B,SAAA,EAAW,EATiB;;IAW5B,YAAA,EAAc,EAXc;;IAa5B,KAAA,EAAO;QACH,KAAA,EAAO,gBADJ;QAEH,OAAA,EAAS,kBAFN;QAGH,KAAA,EAAO,WAHJ;QAIH,KAAA,EAAO,gBAAA;KAjBiB;;IAoB5B,YAAA,EAAc;QACV,OAAA,EAAS,EADC;QAEV,MAAA,EAAQ,WAFE;QAGV,KAAA,EAAO,UAHG;QAIV,UAAA,EAAY,eAAA;KAxBY;;IA2B5B,QAAA,EAAU,CAAA,CAAE,QAAF,CAAW,QAAX,CA3BkB;;IA6B5B,MA7B4B,EAAA,SAAA,MAAA,GA6BnB;QACL,OAAA,eAAA,CAAA,EAAA,EAAA,QAAA,GACc,IAAA,CAAK,KAAL,CAAW,KADzB,EACmC,YADnC,CAAA,CAAA;KA9BwB;IAmC5B,UAnC4B,EAAA,SAAA,UAAA,CAAA,KAAA,EAmCL;QAAA,IAAV,MAAU,GAAA,KAAA,CAAV,MAAU,CAAA;;QACnB,IAAA,CAAK,MAAL,GAAc,MAAd,CAAA;KApCwB;IAuC5B,UAvC4B,EAAA,SAAA,UAAA,GAuCf;QACT,IAAM,QAAA,GAAW,IAAA,CAAK,CAAL,CAAO,IAAA,CAAK,KAAL,CAAW,OAAlB,CAAjB,CAAA;QACA,IAAM,OAAA,GAAU,QAAA,CAAS,IAAT,CAAc,IAAd,CAAhB,CAAA;;QAEA,IAAM,IAAA,GAAO;YACT,qBAAA,EAAuB,EAAE,IAAA,EAAM,qBAAR,EAA+B,KAAA,EAAO,GAAtC,EAAA;SAD3B,CAAA;QAGA,IAAM,KAAA,GAAQ,IAAA,CAAK,OAAL,CAAd,CAAA;QACA,IAAI,KAAJ,EAAW;YACP,OAAA,CAAQ,MAAR,CAAe,KAAA,CAAM,IAArB,EAA2B,EAAE,IAAA,EAAM,GAAR,EAA3B,CAAA,CAAA;YACA,OAAA,CAAQ,GAAR,CAAY,KAAA,CAAM,IAAlB,EAAwB,KAAA,CAAM,KAA9B,EAAqC,EAAE,IAAA,EAAM,GAAR,EAAa,OAAA,EAAS,GAAtB,EAArC,CAAA,CAAA;SACH;;QAED,IAAI,OAAA,KAAY,cAAhB,EAAgC;YAC5B,IAAM,SAAA,GAAY,QAAA,CAAS,QAAA,CAAS,IAAT,CAAc,iBAAd,CAAT,EAA2C,EAA3C,CAAlB,CAAA;YACA,IAAM,MAAA,GAAS,OAAA,CAAQ,GAAR,CAAY,kBAAZ,CAAf,CAAA;YACA,IAAI,SAAA,GAAY,EAAhB,CAAA;;YAEA,IAAI,MAAJ,EAAY;gBACR,IAAM,UAAA,GAAa,IAAA,CAAK,KAAL,CAAW,MAAX,CAAnB,CAAA;;;gBAGA,IAAI,UAAA,CAAW,MAAX,IAAqB,UAAA,CAAW,MAApC,EAA4C;oBACxC,SAAA,GAAY;wBACR,MAAA,EAAQ,UAAA,CAAW,MADX;wBAER,MAAA,EAAQ,UAAA,CAAW,MAAA;qBAFvB,CAAA;;oBAKA,IAAI,QAAA,CAAS,UAAA,CAAW,MAApB,EAA4B,EAA5B,CAAA,GAAkC,SAAtC,EAAiD;wBAC7C,SAAA,CAAU,MAAV,GAAmB,SAAnB,CAAA;qBACH;;oBAED,IAAI,QAAA,CAAS,UAAA,CAAW,MAApB,EAA4B,EAA5B,CAAA,GAAkC,SAAtC,EAAiD;wBAC7C,SAAA,CAAU,MAAV,GAAmB,SAAnB,CAAA;qBACH;iBAZL,MAaO;;;oBAGH,SAAA,GAAY;wBACR,MAAA,EAAQ,SADA;wBAER,MAAA,EAAQ,SAAA;qBAFZ,CAAA;iBAIH;aAxBL,MAyBO;;gBAEH,SAAA,GAAY;oBACR,MAAA,EAAQ,SADA;oBAER,MAAA,EAAQ,SAAA;iBAFZ,CAAA;aAIH;;YAED,OAAA,CAAQ,MAAR,CAAe,kBAAf,EAAmC,EAAE,IAAA,EAAM,GAAR,EAAnC,CAAA,CAAA;YACA,OAAA,CAAQ,GAAR,CAAY,kBAAZ,EAAgC,SAAhC,EAA2C;gBACvC,IAAA,EAAM,GADiC;gBAEvC,OAAA,EAAS,GAAA;aAFb,CAAA,CAAA;SAIH;;QAED,IAAI,OAAA,IAAW,aAAf,EAA8B;YAC1B,OAAA,CAAQ,MAAR,CAAe,aAAf,EAA8B,EAAE,IAAA,EAAM,GAAR,EAA9B,CAAA,CAAA;YACA,OAAA,CAAQ,GAAR,CAAY,aAAZ,EAA2B,WAA3B,EAAwC,EAAE,IAAA,EAAM,GAAR,EAAa,OAAA,EAAS,EAAtB,EAAxC,CAAA,CAAA;SACH;;QAED,IAAA,CAAK,GAAL,EAAA,CAAA;;QAEA,IAAI,IAAA,CAAK,SAAL,CAAe,MAAf,GAAwB,CAA5B,EAA+B;YAC3B,IAAA,CAAK,IAAL,CAAU,IAAV,CAAe,IAAA,CAAK,SAAL,CAAe,GAAf,EAAf,CAAA,CAAA;SACH;QACD,IAAA,CAAK,YAAL,GAAoB,EAApB,CAAA;QACA,IAAA,CAAK,aAAL,EAAA,CAAA;KA5GwB;;;;;;IAkH5B,gBAlH4B,EAAA,SAAA,gBAAA,GAkHT;QACf,IAAA,CAAK,WAAL,EAAA,CAAA;QACA,IAAA,CAAK,gBAAL,EAAA,CAAA;QACA,IAAA,CAAK,oBAAL,EAAA,CAAA;KArHwB;;;;;;IA2H5B,WA3H4B,EAAA,SAAA,WAAA,GA2Hd;QACV,IAAI,CAAA,CAAE,oBAAF,CAAA,CAAwB,QAAxB,CAAiC,kBAAjC,CAAJ,EAA0D;YACtD,IAAA,CAAK,GAAL,CAAS,GAAT,CAAa;gBACT,SAAA,EAAW,OADF;gBAET,mBAAA,EAAqB,sBAFZ;gBAGT,SAAA,EAAW,sBAHF;gBAIT,QAAA,EAAU,OAJD;gBAKT,GAAA,EAAK,aAAA;aALT,CAAA,CAAA;SADJ,MAQO;YACH,IAAA,CAAK,GAAL,CAAS,GAAT,CAAa;gBACT,QAAA,EAAU,SAAA;aADd,CAAA,CAAA;SAGH;KAxIuB;;;;;;;IA+I5B,gBA/I4B,EAAA,SAAA,gBAAA,GA+IT;QACf,IAAI,MAAA,IAAU,MAAA,CAAO,OAArB,EAA8B;YAC1B,IAAM,cAAA,GAAiB,QAAA,CAAS,MAAA,CAAO,SAAhB,EAA2B,EAA3B,CAAvB,CAAA;YACA,IAAI,cAAA,GAAiB,CAArB,EAAwB;gBACpB,CAAA,CAAE,MAAF,CAAA,CAAU,SAAV,CAAoB,CAApB,CAAA,CAAA;aACH;SACJ;KArJuB;;;;IAyJ5B,oBAzJ4B,EAAA,SAAA,oBAAA,GAyJL;QACnB,CAAA,CAAE,sBAAF,CAAA,CAA0B,GAA1B,CAA8B,QAA9B,EAAwC,IAAA,CAAK,GAAL,CAAS,MAAT,EAAxC,CAAA,CAAA;KA1JwB;;;;;;;;;;IAoK5B,IApK4B,EAAA,SAAA,IAAA,CAoKvB,OApKuB,EAoKmC;QAAA,IAAjD,WAAiD,GAAA,SAAA,CAAA,MAAA,GAAA,CAAA,IAAA,SAAA,CAAA,CAAA,CAAA,KAAA,SAAA,GAAA,SAAA,CAAA,CAAA,CAAA,GAAnC,SAAmC,CAAA;QAAA,IAAxB,EAAwB,GAAA,SAAA,CAAA,MAAA,GAAA,CAAA,IAAA,SAAA,CAAA,CAAA,CAAA,KAAA,SAAA,GAAA,SAAA,CAAA,CAAA,CAAA,GAAnB,EAAmB,CAAA;QAAA,IAAf,SAAe,GAAA,SAAA,CAAA,MAAA,GAAA,CAAA,IAAA,SAAA,CAAA,CAAA,CAAA,KAAA,SAAA,GAAA,SAAA,CAAA,CAAA,CAAA,GAAH,CAAG,CAAA;;QAC3D,IAAI,OAAA,IAAW,OAAA,KAAY,EAA3B,EAA+B;YAC3B,IAAA,CAAK,IAAL,CAAU,IAAV,CAAe,EAAE,OAAA,EAAA,OAAF,EAAW,WAAA,EAAA,WAAX,EAAwB,EAAA,EAAA,EAAxB,EAA4B,SAAA,EAAA,SAA5B,EAAf,CAAA,CAAA;SACH;QACD,IAAA,CAAK,aAAL,EAAA,CAAA;KAxKwB;;;;;;;IA+K5B,iBA/K4B,EAAA,SAAA,iBAAA,CA+KV,MA/KU,EA+KF;QACtB,IAAI,QAAA,GAAW,MAAf,CAAA;;QAEA,IAAA,CAAK,IAAL,GAAY,IAAA,CAAK,IAAL,CAAU,MAAV,CAAiB,QAAjB,CAAZ,CAAA;QACA,IAAA,CAAK,aAAL,EAAA,CAAA;KAnLwB;;;;;;IAyL5B,aAzL4B,EAAA,SAAA,aAAA,GAyLZ;QACZ,IAAI,IAAA,CAAK,IAAL,CAAU,MAAV,GAAmB,CAAvB,EAA0B;YACtB,IAAM,SAAA,GAAY,IAAA,CAAK,IAAL,CAAU,GAAV,EAAlB,CAAA;YACA,SAAA,CAAU,WAAV,GACI,IAAA,CAAK,YAAL,CAAkB,SAAA,CAAU,WAA5B,CAAA,IACA,SAAA,CAAU,WAFd,CAAA;;YAIA,IACI,CAAC,CAAA,CAAE,OAAF,CAAU,IAAA,CAAK,YAAf,CAAD,IACA,IAAA,CAAK,YAAL,CAAkB,WAAlB,KAAkC,IAAA,CAAK,YAAL,CAAkB,UAFxD,EAGE;gBACE,IAAA,CAAK,SAAL,CAAe,IAAf,CAAoB,IAAA,CAAK,YAAzB,CAAA,CAAA;aACH;YACD,IAAA,CAAK,aAAL,CAAmB,SAAnB,CAAA,CAAA;YACA,IAAA,CAAK,YAAL,GAAoB,SAApB,CAAA;YACA,IAAA,CAAK,gBAAL,EAAA,CAAA;SAdJ,MAeO;;YAEH,CAAA,CAAE,sBAAF,CAAA,CAA0B,IAA1B,EAAA,CAAA;YACA,CAAA,CAAE,MAAF,CAAA,CAAU,MAAV,CAAiB,cAAjB,CAAA,CAAA;SACH;KA7MuB;;;;;;;IAoN5B,aApN4B,EAAA,SAAA,aAAA,CAoNd,IApNc,EAoNR;QAAA,IAAA,KAAA,GAAA,IAAA,CAAA;;QAChB,IACI,cAAA,CAAe,SAAf,CAAyB,eAAzB,CAAA,IACA,MAAA,CAAO,kBADP,IAEA,MAAA,CAAO,kBAAP,CAA0B,MAH9B,EAIE;YACE,MAAA,CAAO,kBAAP,CAA0B,KAA1B,EAAA,CAAA;SACH;;QAED,IAAM,mBAAA,GAAsB;YACxB,iBAAA,EAAmB,oBADK;YAExB,mBAAA,EAAqB,sBAFG;YAGxB,YAAA,EAAc,MAAA,CAAO,SAAP,CAAiB,YAHP;YAIxB,KAAA,EAAO,IAAA,CAAK,KAJY;YAKxB,SAAA,EAAW,CALa;YAMxB,WAAA,EAAa,IAAA,CAAK,YAAL,CAAkB,OAAA;SANnC,CAAA;QAQA,IAAM,YAAA,GAAe,CAAA,CAAE,MAAF,CAAS,EAAT,EAAa,mBAAb,EAAkC,IAAlC,CAArB,CAAA;QACA,IAAA,CAAK,GAAL,EAAA,CAAA;;QAEA,IAAA,CAAK,QAAL,GAAgB,QAAA,CAAA,aAAhB,CAAA;;QAEA,IAAA,CAAK,MAAL,CAAY,EAAE,YAAA,EAAA,YAAF,EAAZ,CAAA,CAAA;;QAEA,IAAA,CAAK,WAAL,EAAA,CAAA;QACA,CAAA,CAAE,MAAF,CAAA,CAAU,EAAV,CAAa,mBAAb,EAAkC,YAAM;YACpC,KAAA,CAAK,WAAL,EAAA,CAAA;SADJ,CAAA,CAAA;QAGA,CAAA,CAAE,MAAF,CAAA,CAAU,EAAV,CAAa,QAAb,EAAuB,YAAM;YACzB,KAAA,CAAK,WAAL,EAAA,CAAA;SADJ,CAAA,CAAA;;QAIA,IAAA,CAAK,CAAL,CAAO,IAAA,CAAK,KAAL,CAAW,OAAlB,CAAA,CAA2B,KAA3B,EAAA,CAAA;KApPwB;;;;;;IA0P5B,GA1P4B,EAAA,SAAA,GAAA,GA0PtB;QACF,IAAM,KAAA,GAAQ,IAAA,CAAK,CAAL,CAAO,IAAA,CAAK,KAAL,CAAW,KAAlB,CAAd,CAAA;QACA,KAAA,CAAM,WAAN,CAAkB,iBAAlB,CAAA,CAAqC,QAArC,CAA8C,kBAA9C,CAAA,CAAA;QACA,KAAA,CAAM,GAAN,CACI,8EADJ,EAEI,KAAA,CAAM,MAAN,EAFJ,CAAA,CAAA;KA7PwB;;;;;;;IAuQ5B,WAvQ4B,EAAA,SAAA,WAAA,GAuQd;QACV,IAAM,KAAA,GAAQ,CAAA,CAAE,MAAF,CAAA,CAAU,KAAV,EAAd,CAAA;QACA,IAAM,SAAA,GACF,CAAA,CAAE,MAAF,CAAA,CAAU,SAAV,EAAA,GAAwB,CAAA,CAAE,aAAF,CAAA,CAAiB,WAAjB,CAA6B,IAA7B,CAD5B,CAAA;QAEA,IAAM,KAAA,GAAQ,IAAA,CAAK,GAAnB,CAAA;QACA,IAAM,UAAA,GAAa,CAAA,CAAE,gBAAF,CAAA,CAAoB,EAApB,CAAuB,UAAvB,CAAA,GACb,CAAA,CAAE,gBAAF,CAAA,CAAoB,WAApB,CAAgC,IAAhC,CADa,GAEb,CAFN,CAAA;QAGA,IAAM,eAAA,GAAkB,CAAA,CAAE,eAAF,CAAA,CAAmB,WAAnB,CAA+B,IAA/B,CAAxB,CAAA;QACA,IAAM,aAAA,GAAgB,CAAA,CAAE,SAAF,CAAA,CAAa,EAAb,CAAgB,UAAhB,CAAA,GAChB,CAAA,CAAE,SAAF,CAAA,CAAa,WAAb,CAAyB,IAAzB,CADgB,GAEhB,CAFN,CAAA;QAGA,IAAM,oBAAA,GAAuB,CAAA,CAAE,qBAAF,CAAA,CAAyB,EAAzB,CAA4B,UAA5B,CAAA,GACvB,CAAA,CAAE,qBAAF,CAAA,CAAyB,WAAzB,CAAqC,IAArC,CADuB,GAEvB,CAFN,CAAA;QAGA,IAAI,SAAA,GAAY,CAAhB,CAAA;;;QAGA,IAAI,KAAA,IAAS,GAAb,EAAkB;YACd,SAAA,GAAY,aAAA,GAAgB,eAAhB,GAAkC,UAA9C,CAAA;SADJ,MAEO,IAAI,KAAA,GAAQ,GAAZ,EAAiB;;YAEpB,SAAA,GAAY,aAAA,GAAgB,oBAAhB,GAAuC,UAAnD,CAAA;SACH;;;;QAID,IAAI,CAAA,CAAE,oBAAF,CAAA,CAAwB,QAAxB,CAAiC,qBAAjC,CAAJ,EAA6D;;YAEzD,KAAA,CAAM,QAAN,CAAe,QAAf,CAAA,CAAA;SAFJ,MAGO;YACH,IAAA,CAAK,GAAL,CAAS,GAAT,CAAa;gBACT,QAAA,EAAU,SADD;gBAET,SAAA,EAAW,KAAA;aAFf,CAAA,CAAA;;YAKA,KAAA,CAAM,GAAN,CAAU,KAAV,EAAiB,SAAjB,CAAA,CAAA;YACA,IAAI,SAAA,IAAa,SAAjB,EAA4B;gBACxB,KAAA,CAAM,QAAN,CAAe,QAAf,CAAA,CAAA;gBACA,CAAA,CAAE,sBAAF,CAAA,CAA0B,IAA1B,EAAA,CAAA;aAFJ,MAGO;gBACH,KAAA,CAAM,WAAN,CAAkB,QAAlB,CAAA,CAAA;gBACA,CAAA,CAAE,sBAAF,CAAA,CAA0B,IAA1B,EAAA,CAAA;aACH;;YAED,CAAA,CAAE,MAAF,CAAA,CAAU,EAAV,CAAa,cAAb,EAA6B,YAAM;gBAC/B,KAAA,CAAM,WAAN,CAAkB,QAAlB,EAA4B,CAAA,CAAE,MAAF,CAAA,CAAU,SAAV,EAAA,GAAwB,SAApD,CAAA,CAAA;gBACA,IAAI,KAAA,CAAM,QAAN,CAAe,QAAf,CAAJ,EAA8B;oBAC1B,CAAA,CAAE,sBAAF,CAAA,CAA0B,IAA1B,EAAA,CAAA;iBADJ,MAEO;oBACH,CAAA,CAAE,sBAAF,CAAA,CAA0B,IAA1B,EAAA,CAAA;iBACH;aANL,CAAA,CAAA;SAQH;KACJ;CA7TW,CAAhB,CAAA;;qBAgUe,IAAI,OAAJ,CAAY,EAAE,MAAA,EAAQ,aAAV,EAAZ;;;;;;;;;;;AC9Uf;;AACA;;AAEA,IAAM,OAAO,SAAP,IAAO,CAAC,GAAD;AAAA,WAAS,OAAO,IAAP,CAAY,GAAZ,CAAT;AAAA,CAAb;;AAEA,IAAM,QAAQ,SAAR,KAAQ;AAAA,4BACV,OADU;AAAA,QACV,OADU,gCACA,EADA;AAAA,QAEV,EAFU,QAEV,EAFU;AAAA,QAGV,OAHU,QAGV,OAHU;AAAA,QAIV,SAJU,QAIV,SAJU;AAAA,QAKV,iBALU,QAKV,iBALU;AAAA,QAMV,WANU,QAMV,WANU;AAAA,yDAQ2B,WAR3B,kGAUkB,OAVlB,+BAUmD,OAVnD,qRAegB,EAfhB,qDAgB6B,SAhB7B,oCAiBY,OAjBZ,iFAqBU,qGAGkB,KAAK,oBAAL,CAHlB,yKAQM,EA7BhB;AAAA,CAAd;;AAqCO,IAAM,wCAAgB,SAAhB,aAAgB;AAAA,QAAG,EAAH,SAAG,EAAH;AAAA,QAAO,OAAP,SAAO,OAAP;AAAA,QAAgB,SAAhB,SAAgB,SAAhB;AAAA,QAA2B,WAA3B,SAA2B,WAA3B;AAAA,WACzB,MAAM,EAAE,MAAF,EAAM,gBAAN,EAAe,oBAAf,EAA0B,mBAAmB,IAA7C,EAAmD,wBAAnD,EAAN,CADyB;AAAA,CAAtB;;;;;;;;;AC1CP;;;;;;;;cAEiB,M;IAAT,I,WAAA,I;;IAEa,4B;;;AACjB,0CAAY,MAAZ,EAAoB;AAAA;;AAChB,YAAI,aAAa,uCAAqC,OAAO,IAAP,GAAc,WAAd,EAArC,CAAjB;AACA,YAAI,CAAC,UAAL,EAAiB;AACb,kBAAM,IAAI,KAAJ,QAAc,MAAd,kCAAN;AACH;AACD,YAAI,UAAU,KAAK,sCAAL,EAA6C,EAAC,aAAa,OAAO,SAAP,CAAiB,WAA/B,EAA4C,QAAQ,UAApD,EAA7C,CAAd;AACA,YAAM,gBAAgB;AAClB,qBAAS,CAAC,8BAAD,CADS;AAElB,mBAAO,KAAK,sCAAL,CAFW;AAGlB,6BAAe,OAAf,gMAE0G,KAAK,IAAL,CAF1G;AAHkB,SAAtB;;AANgB,gKAeV,aAfU;;AAiBhB,cAAK,GAAL,CAAS,IAAT,CAAc,iBAAd,EAAiC,EAAjC,CAAoC,OAApC,EAA6C,YAAM;AAC/C,kBAAK,KAAL;AACH,SAFD;AAjBgB;AAoBnB;;;EArBqD,Y;;qBAArC,4B;;;;;;;;;ACJrB;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;;;AAEA;;;AAGA,IAAM,kBAAkB,SAAlB,eAAkB,GAAY;AAChC,QAAI,CAAC,OAAO,SAAP,CAAiB,eAAtB,EAAuC;AACnC,+BAAiC;AAC7B,gBAAI,SAAS,aAAT,CAAuB,uBAAvB,CADyB;AAE7B,sBAAU,SAAS,aAAT,CAAuB,6BAAvB,CAFmB;AAG7B,sBAAU,SAAS,aAAT,CAAuB,6BAAvB,CAHmB;AAI7B,4BAAgB,SAAS,aAAT,CACZ,mCADY;AAJa,SAAjC;;AASA;AACA,+BAA+B;AAC3B,gBAAI,SAAS,aAAT,CAAuB,MAAvB;AADuB,SAA/B;;AAIA;AACA,+BAAoC;AAChC,sBAAU,SAAS,aAAT,CAAuB,4BAAvB,CADsB;AAEhC,+BAAmB,SAAS,aAAT,CACf,uCADe,CAFa;AAKhC,4BAAgB,EAAE,2BAAF,CALgB;AAMhC,qBAAS,EAAE,SAAS,IAAX;AANuB,SAApC;;AASA;AACA,+BAAoC;AAChC,sBAAU,SAAS,aAAT,CAAuB,2BAAvB,CADsB;AAEhC,+BAAmB,SAAS,aAAT,CACf,sCADe,CAFa;AAKhC,4BAAgB,EAAE,2BAAF,CALgB;AAMhC,qBAAS,EAAE,QAAQ,IAAV;AANuB,SAApC;;AASA,+BAAiC;AAC7B,gBAAI,SAAS,aAAT,CAAuB,gBAAvB;AADyB,SAAjC;;AAIA;AACA;;AAEA;AACA,8EAAoC,MAApC;;AAEA;AACA,YAAI,gCAAJ;;AAEA;;AAEA,YAAI,OAAO,SAAP,CAAiB,uBAArB,EAA8C;AAC1C,gBAAI,gCAAJ,CAAwB,EAAE,eAAe,KAAjB,EAAxB,EAAkD,MAAlD;AACH;;AAED,UAAE,uBAAF,EAA2B,EAA3B,CAA8B,OAA9B,EAAuC,YAAM;AACzC,gBAAI,gCAAJ,CAAwB,EAAE,eAAe,IAAjB,EAAxB,EAAiD,MAAjD;AACH,SAFD;;AAIA,YACI,OAAO,cAAP,CAAsB,SAAtB,CAAgC,eAAhC,KACA,OAAO,SAAP,CAAiB,eAFrB,EAGE;AACE;AACA,mBAAO,kBAAP,GAA4B,IAAI,gCAAJ,EAA5B;AACH;AACJ;;AAED,QACI,WACA,OAAO,SAAP,CAAiB,eADjB,IAEA,OAAO,cAAP,CAAsB,SAAtB,CAAgC,0BAAhC,CAFA,IAGA,CAAC,QAAQ,GAAR,CAAY,aAAZ,CAJL,EAKE;AACE,YAAI,iGAA+F,OAAO,IAAP,CAC/F,sBAD+F,CAA/F,WAAJ;AAGA,gBAAQ,IAAR,CACO,OAAO,IAAP,CAAY,qBAAZ,CADP,SAC6C,IAD7C,EAEI,OAFJ,EAGI,aAHJ;AAKH;;AAED,QAAI,OAAO,SAAP,CAAiB,mBAArB,EAA0C;AACtC,YAAI,4BAAJ;AACH;;AAED;AACA,MAAE,QAAF,EAAY,KAAZ,CAAkB,UAAU,CAAV,EAAa;AAC3B,YACI,OAAO,cAAP,CAAsB,SAAtB,CAAgC,wBAAhC,KACA,EAAE,KAAF,KAAY,sBAAK,GADjB,IAEA,EAAE,kBAAF,EAAsB,MAAtB,GAA+B,CAHnC,EAIE;AACE,gBAAI,KAAK,EAAE,kBAAF,EAAsB,IAAtB,CAA2B,IAA3B,CAAT;AACA,cAAE,QAAF,EAAY,UAAZ,CAAuB,UAAvB,EAAmC,UAAnC;AACA,kCAAoB,EAApB,QAA2B,KAA3B;AACH;AACJ,KAVD;AAWH,CApGD;;qBAsGe,e;;;;;ACtHf;;;;AACA;;;;;;AAEA;AACA,EAAE,MAAF,EAAU,IAAV,CAAe,UAAf,EAA2B,4BAA3B;;AAEA;AACA,EAAE,QAAF,EAAY,KAAZ,CAAkB,2BAAlB;;AAEA,IAAI,OAAO,SAAP,CAAiB,QAAjB,CAA0B,SAA1B,CAAoC,sBAApC,CAAJ,EAAiE;AAC7D,MAAE,aAAF,CAAgB,UAAC,CAAD,EAAI,EAAJ,EAAQ,KAAR,EAAkB;AAC9B,cAAM,UAAN,GAAmB,IAAI,KAAJ,GAAY,KAA/B;AACH,KAFD;;AAIA,MAAE,QAAF,EAAY,SAAZ,CAAsB,UAAC,KAAD,EAAQ,KAAR,EAAe,QAAf,EAA4B;AAC9C,YAAI;AACA;AACA,gBAAI,SAAS,GAAT,KAAiB,0BAArB,EAAiD;AAC7C;AACH;;AAED,cAAE,IAAF,CAAO,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,GAAd,CAAkB,SAAlB,CAA4B,SAAvC,CAAP,EAA0D;AACtD,2BAAW,MAAM,UADqC;AAEtD,2BAAW,MAAM,IAFqC;AAGtD,0BAAU,OAAO,QAAP,CAAgB,IAH4B;AAItD,iCAAiB,SAAS,QAJ4B;AAKtD,+BAAe,SAAS,IAL8B;AAMtD,4BAAY,SAAS,GANiC;AAOtD,oCAAoB,MAAM,MAP4B;AAQtD,8BAAc,MAAM;AARkC,aAA1D;AAUH,SAhBD,CAgBE,OAAO,GAAP,EAAY,CAAG;AACpB,KAlBD;AAmBH;;;;;AC5BD;;AACA;;AACA;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AAEA;AAtCA;AACA;AACA;;AAEA;AAmCA,OAAO,cAAP,GAAwB,wCACpB,UAAU,qBADU,EAEpB,UAAU,MAFU,EAGpB,UAAU,WAHU,EAIpB,UAAU,QAJU,CAAxB;AAMA,OAAO,KAAP,GAAe,kBAAf;AACA,OAAO,gBAAP,GAA0B,uBAA1B;AACA,OAAO,MAAP,GAAgB,cAAhB;AACA,OAAO,GAAP,GAAa,WAAb;AACA,OAAO,UAAP,GAAoB,uBAApB;AACA,OAAO,IAAP,GAAc,aAAd;AACA,OAAO,IAAP,GAAc,aAAd;AACA,OAAO,sBAAP,GAAgC,mCAAhC;AACA,OAAO,oBAAP,GAA8B,iCAA9B;AACA,OAAO,yBAAP,GAAmC,sCAAnC;AACA,OAAO,cAAP,GAAwB,2BAAxB;AACA,OAAO,kBAAP,GAA4B,+BAA5B;AACA,OAAO,uBAAP,GAAiC,oCAAjC;AACA,OAAO,mBAAP,GAA6B,gCAA7B;AACA,OAAO,YAAP,GAAsB,yBAAtB;AACA,OAAO,QAAP,GAAkB,qBAAlB;AACA,OAAO,cAAP,GAAwB,2BAAxB;AACA,OAAO,OAAP,GAAiB,oBAAjB;AACA,OAAO,iBAAP,GAA2B,8BAA3B;AACA,OAAO,aAAP,GAAuB,0BAAvB;AACA,OAAO,cAAP,GAAwB,2BAAxB;AACA,OAAO,QAAP,GAAkB,qBAAlB;AACA,OAAO,4BAAP,GAAsC,yCAAtC;AACA,OAAO,iBAAP,GAA2B,8BAA3B;AACA,OAAO,SAAP,GAAmB,sBAAnB;AACA,OAAO,gBAAP,GAA0B,6BAA1B;AACA,OAAO,qBAAP,GAA+B,kCAA/B;AACA,OAAO,uBAAP,GAAiC,oCAAjC;AACA,OAAO,MAAP,GAAgB,mBAAhB;AACA,OAAO,YAAP,GAAsB,yBAAtB;AACA,OAAO,OAAP,GAAiB,OAAO,SAAP,CAAiB,cAAjB,GAAkC,SAAlC,GAA8C,gBAA/D;AACA,OAAO,eAAP,GAAyB,6BAAgB,YAAhB,CAA6B,MAA7B,CAAzB;;AAEA;;;;;;AAMA,OAAO,YAAP,GAAsB,EAAE,KAAF,CAAQ,OAAO,QAAP,CAAgB,MAAxB,CAAtB;;AAEA,SAAS,aAAT,CAAuB,IAAI,WAAJ,CAAgB,4BAAhB,CAAvB;;;;;;;;;;;;;;;;;ACtFA,IAAM,SAAS,OAAO,MAAtB;AACA,IAAM,UAAU,OAAO,OAAvB;AACA,IAAM,UAAU,QAAQ,sBAAR,CAAhB;;IAEqB,I;;;;;mCAGN;AACP,mBAAO;AACH,2BAAW,CADR;AAEH,0BAAU,EAFP;AAGH,+BAAe,EAHZ;AAIH,gCAAgB,EAJb;AAKH,6BAAa,EALV;AAMH,uBAAO,EANJ;AAOH,+BAAe,IAPZ;AAQH,gCAAgB,KARb;;AAUH,2CAA2B;AACvB,gCAAY,CADW;AAEvB,2BAAO,CAFgB;AAGvB,+BAAW,CAHY;AAIvB,2BAAO;AAJgB;AAVxB,aAAP;AAiBH;;AAED;;;;AAGA,oBAAc;AAAA;;AAAA,iHACD,SADC;;AAAA,cAzBd,GAyBc,GAzBR,OAAO,IAAP,CAAY,OAAZ,CAAoB,GAyBZ;AAAA,cAFd,IAEc,GAFP,MAEO;;;AAGV,YACI,OAAO,SAAP,CAAiB,eAAjB,IACA,OAAO,SAAP,CAAiB,cAFrB,EAGE;AACE,gBAAI,MAAK,eAAT,EAA0B;AACtB,sBAAK,GAAL,CAAS,MAAK,SAAL,EAAT;;AAEA;AACA,sBAAK,MAAL,GAAc,QAAQ,OAAR,EAAd;AACH,aALD,MAKO;AACH,sBAAK,MAAL,GAAc,MAAK,KAAL,EAAd;AACA,sBAAK,MAAL,CAAY,IAAZ,CAAiB;AAAA,2BAAM,MAAK,SAAL,CAAe,MAAK,UAApB,CAAN;AAAA,iBAAjB;AACH;AACJ;AAhBS;AAiBb;;;;qCAEY,K,EAAO;AAChB,iBAAK,GAAL,CAAS,EAAE,eAAe,KAAjB,EAAT;;AAEA,iBAAK,SAAL,CAAe,KAAK,UAApB;AACH;;;+CAkBsB,K,EAAO;AAC1B,iBAAK,GAAL,CAAS,qBAAT,EAAgC,CAAC,CAAC,KAAlC;AACA,iBAAK,SAAL,CAAe,KAAK,UAApB;AACH;;;oCAEW;AACR,mBAAO,KAAK,KAAL,CAAW,QAAQ,GAAR,CAAY,KAAK,IAAjB,KAA0B,IAArC,CAAP;AACH;;;qCAEY;AAAA;;AACT,gBACI,OAAO,SAAP,CAAiB,eAAjB,IACA,OAAO,SAAP,CAAiB,cAFrB,EAGE;AACE,wBAAQ,MAAR,CAAe,KAAK,IAApB;AACA,qBAAK,MAAL,GAAc,KAAK,KAAL,EAAd;AACA,uBAAO,KAAK,MAAL,CAAY,IAAZ,CAAiB;AAAA,2BAAM,OAAK,SAAL,CAAe,OAAK,UAApB,CAAN;AAAA,iBAAjB,CAAP;AACH;AACD,mBAAO,QAAQ,OAAR,EAAP;AACH;;;kCAES,K,EAAO;AACb,oBAAQ,GAAR,CAAY,KAAK,IAAjB,EAAuB,KAAK,SAAL,CAAe,KAAf,CAAvB,EAA8C;AAC1C,yBAAS,IAAI,IAAJ,CACL,IAAI,IAAJ,GAAW,OAAX,KAAuB,KAAK,QAAQ,oBAD/B;AADiC,aAA9C;AAKH;;;4BA3CwB;AACrB,mBAAO,KAAK,GAAL,CAAS,eAAT,KAA6B,KAAK,GAAL,CAAS,YAAT,CAA7B,IAAuD,EAA9D;AACH;;;4BAEqB;AAClB,mBAAO,CAAC,EAAE,KAAK,SAAL,EAAF,EAAoB,OAApB,EAAR;AACH;;;4BAEmB;AAChB,mBAAO,KAAK,GAAL,CAAS,eAAT,CAAP;AACH;;;4BAEoB;AACjB,mBAAO,KAAK,GAAL,CAAS,gBAAT,CAAP;AACH;;;;EAjE6B,SAAS,K;;qBAAtB,I;;;;;;;;;;;ACJrB;;;;;;;;;;;;cAEiC,M;IAAzB,I,WAAA,G;IAAK,M,WAAA,M;IAAQ,O,WAAA,O;;AAErB;;AACA,OAAO,IAAP,CAAY,WAAZ,GAA0B,EAAE,QAAQ,EAAE,OAAM,2BAAR,EAAV,EAA1B;;IAEqB,iB;;;;;8BAKT;AAAE,mBAAO,KAAI,OAAO,IAAP,CAAY,WAAZ,CAAwB,MAAxB,CAA+B,KAAnC,CAAP;AAAmD;;AAH7D;;;;gCAIQ;AAAE,mBAAO,KAAP;AAAe;;;mCAEd;AACP,mBAAO;AACH,mCAAmB;AADhB,aAAP;AAGH;;;AAED,+BAAY,UAAZ,QAAiC;AAAA,YAAP,GAAO,QAAP,GAAO;;AAAA;;AAAA,2IACpB,SADoB;;AAAA,cAXjC,IAWiC,GAX1B,MAW0B;;AAE7B,cAAK,GAAL,GAAW,GAAX;;AAEA,cAAK,UAAL;AAJ6B;AAKhC;;;;yDAEsD;AAAA;;AAAA,gBAAxB,OAAwB,uEAAd,IAAc;AAAA,gBAAR,MAAQ;;AACnD,mBAAO,IAAI,OAAJ,CAAY,UAAC,OAAD,EAAU,MAAV,EAAqB;AACpC,uBAAK,IAAL,CAAU,EAAE,mBAAmB,CAAC,CAAC,OAAvB,EAAV,EAA4C;AACxC,2BAAU,IAD8B;AAExC,0BAAU,IAF8B;AAGxC,6BAAU,iBAAC,OAAD,EAAa;AACnB,+BAAK,GAAL,CAAS,OAAT,CAAiB,mCAAjB,EAAsD,EAAE,gBAAF,EAAW,cAAX,EAAtD;AACA,+BAAK,SAAL,CAAe,OAAK,UAApB;AACA;AACH,qBAPuC;AAQxC,2BAAU,eAAC,MAAD,EAAW;AACjB,+BAAO,MAAP;AACH;AAVuC,iBAA5C;AAYH,aAbM,CAAP;AAcH;;AAGD;;;;qCACa;AAAA;;AACT,gBAAI,OAAO,SAAP,CAAiB,eAAjB,IAAoC,OAAO,SAAP,CAAiB,cAAzD,EAAyE;AACrE,oBAAI,KAAK,eAAT,EAA0B;AACtB,yBAAK,GAAL,CAAS,KAAK,SAAL,EAAT;;AAEA;AACA,yBAAK,MAAL,GAAc,QAAQ,OAAR,EAAd;AACH,iBALD,MAKO;AACH,yBAAK,MAAL,GAAc,KAAK,KAAL,EAAd;AACA,yBAAK,MAAL,CAAY,IAAZ,CAAiB,YAAM;AACnB,+BAAK,SAAL,CAAe,OAAK,UAApB;AACH,qBAFD;AAGH;AACJ;AACJ;;;oCAEW;AACR,mBAAO,KAAK,KAAL,CAAW,QAAQ,GAAR,CAAY,KAAK,IAAjB,KAA0B,IAArC,CAAP;AACH;;;kCAES,K,EAAO;AACb,oBAAQ,GAAR,CAAY,KAAK,IAAjB,EAAuB,KAAK,SAAL,CAAe,KAAf,CAAvB,EAA8C;AAC1C,yBAAS,IAAI,IAAJ,CAAS,IAAI,IAAJ,GAAW,OAAX,KAAuB,KAAK,qBAAQ,oBAA7C;AADiC,aAA9C;AAGH;;;4BAEqB;AAClB,mBAAO,CAAC,EAAE,KAAK,SAAL,EAAF,EAAoB,OAApB,EAAR;AACH;;;;EApE0C,SAAS,K;;qBAAnC,iB;;;;;;;;ACPrB;qBACe,OAAO,QAAP,CAAgB,K;;;;;;;;;ACC/B;;;;;;kNAFA;;AAIA,IAAM,eAAe;AACjB,2BAAuB,uBADN;AAEjB,cAAU,kBAFO;AAGjB,kBAAc,eAHG;AAIjB,cAAU,UAJO;AAKjB,uBAAmB,oBALF;AAMjB,uBAAmB;AANF,CAArB;;AASA,IAAM,mBAAmB,kBAAU,MAAV,CAAiB;AACtC,cADsC,wBACzB;AACT,aAAK,EAAL,CAAQ,8BAAR,EAAwC,KAAK,WAAL,CAAiB,IAAjB,CAAsB,IAAtB,CAAxC;AACH,KAHqC;AAKtC,OALsC,iBAKhC;AACF,eAAO,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,WAAzB,CAAP;AACH,KAPqC;AAStC,SATsC,mBAS9B;AACJ,eAAO,KAAP;AACH,KAXqC;AAatC,qBAbsC,6BAapB,QAboB,EAaV;AACxB,eAAO,EAAE,MAAF,CACH,EAAE,GAAF,CAAM,EAAE,KAAF,CAAQ,QAAR,CAAN,EAAyB,UAAC,IAAD;AAAA,mBAAU,KAAK,CAAL,MAAY,IAAZ,IAAoB,KAAK,CAAL,CAA9B;AAAA,SAAzB,CADG,CAAP;AAGH,KAjBqC;AAmBtC,yBAnBsC,uCA0BnC;AAAA,YANC,QAMD,QANC,QAMD;AAAA,YALC,YAKD,QALC,YAKD;AAAA,YAJC,qBAID,QAJC,qBAID;AAAA,YAHC,QAGD,QAHC,QAGD;AAAA,YAFC,iBAED,QAFC,iBAED;AAAA,YADC,iBACD,QADC,iBACD;;AACC,aAAK,GAAL,CACI,EAAE,MAAF,CACI,EAAE,UAAU,KAAK,iBAAL,CAAuB,QAAvB,CAAZ,EADJ,EAEI;AACI,mCAAuB,CAAC,CAAC,qBAD7B;AAEI,0BAAc,CAAC,CAAC,YAFpB;AAGI,sBAAU,CAAC,CAAC,QAHhB;AAII,gDAJJ;AAKI;AALJ,SAFJ,CADJ,EAWI,EAAE,QAAQ,IAAV,EAXJ;AAaH,KAxCqC;AA0CtC,gBA1CsC,0BA0CvB;AACX,YAAM,oBAAoB,EAAE,IAAF,CAAO,KAAK,iBAAL,EAAP,CAA1B;AACA,YAAM,SAAS,KAAK,MAAL,EAAf;AACA,YAAM,OAAO,EAAb;;AAEA,0BAAkB,OAAlB,CAA0B,UAAC,IAAD,EAAU;AAChC,iBAAK,aAAa,IAAb,CAAL,IAA2B,OAAO,aAAa,IAAb,CAAP,CAA3B;AACH,SAFD;;AAIA,eAAO,EAAE,IAAF,CAAO,IAAP,EAAa,UAAC,KAAD;AAAA,mBAAW,UAAU,KAAK,CAA1B;AAAA,SAAb,CAAP;AACH,KApDqC;AAsDtC,UAtDsC,oBAsD7B;AAAA;;AACL,YAAM,iDACD,aAAa,QADZ,EACuB,KAAK,GAAL,CAAS,UAAT,CADvB,4BAED,aAAa,qBAFZ,EAEoC,KAAK,GAAL,CAClC,uBADkC,CAFpC,4BAKD,aAAa,YALZ,EAK2B,KAAK,GAAL,CAAS,cAAT,CAL3B,4BAMD,aAAa,QANZ,EAMuB,KAAK,GAAL,CAAS,UAAT,CANvB,4BAOD,aAAa,iBAPZ,EAOgC,KAAK,GAAL,CAAS,mBAAT,CAPhC,4BAQD,aAAa,iBARZ,EAQgC,KAAK,GAAL,CAAS,mBAAT,CARhC,WAAN;AAUA,eAAO,EAAE,IAAF,CAAO,MAAP,EAAe,UAAC,KAAD;AAAA,mBAAW,UAAU,KAAK,CAA1B;AAAA,SAAf,CAAP;AACH,KAlEqC;AAoEtC,eApEsC,yBAoExB;AACV;AACA,YAAM,eAAe,KAAK,GAAL,CAAS,uBAAT,CAArB;AACA,UAAE,IAAF,CAAO;AACH,iBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,kBAAzB,CADF;AAEH,yBAAa,kBAFV;AAGH,kBAAM,MAHH;AAIH,kBAAM,KAAK,SAAL,CAAe,EAAE,oBAAoB,YAAtB,EAAf;AAJH,SAAP;AAMH;AA7EqC,CAAjB,CAAzB;;qBAgFe,gB;;;;;AC7Ff;;AACA;;AAEA;;;;AACA;;;;AAEA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;;;AAEA,OAAO,MAAP,GAAgB,mBAAhB;;AAEA,MAAM,mCAAuB,4BAA7B;;AAEA,OAAO,iBAAP,GAA2B,IAAI,8BAAJ,CAAsB,EAAtB,EAA0B,EAAE,KAAK,OAAO,YAAd,EAA1B,CAA3B;AACA,OAAO,IAAP,GAAc,IAAI,iBAAJ,EAAd;;AAEA,KAAM,IAAI,wBAAJ,CAAgB;AAClB,SAAoB,OAAO,YADT;AAElB,UAAoB,OAAO,IAFT;AAGlB,oBAAoB,OAAO,cAHT;AAIlB,oBAAoB,OAAO,cAJT;AAKlB,uBAAoB,OAAO;AALT,CAAhB,CAAN;;AAQA,OAAO,SAAP,CAAiB,uBAAjB,GAA2C,IAAI,oCAAJ,CAA4B,QAAQ,GAAR,CAAY,0BAAa,eAAb,CAA6B,IAAzC,KAAkD,GAA9E,EAAmF,OAAO,cAA1F,EAA0G,OAAO,SAAP,CAAiB,mBAA3H,CAA3C;AACA,OAAO,SAAP,CAAiB,uBAAjB,GAA2C,IAAI,oCAAJ,CAA4B,OAAO,SAAP,CAAiB,uBAA7C,CAA3C;;;;;AC9BA,CAAC,YAAM;AACH,QAAI,OAAO,OAAO,WAAd,KAA8B,UAAlC,EAA8C;AAC1C,eAAO,KAAP;AACH;;AAED,QAAM,cAAc,SAAd,WAAc,CAAC,IAAD,EAAO,aAAP,EAAyB;AACzC,YAAM,QAAQ,SAAS,WAAT,CAAqB,aAArB,CAAd;AACA,YAAI,aAAJ,EAAmB;AACf,kBAAM,eAAN,CAAsB,IAAtB,EAA4B,cAAc,OAA1C,EAAmD,cAAc,UAAjE,EAA6E,cAAc,MAA3F;AACH,SAFD,MAEO;AACH,kBAAM,eAAN,CAAsB,IAAtB;AACH;AACD,eAAO,KAAP;AACH,KARD;;AAUA,gBAAY,SAAZ,GAAwB,OAAO,KAAP,CAAa,SAArC;AACA,WAAO,WAAP,GAAqB,WAArB;AACH,CAjBD;;;;;;;;;;;ACAA;;;;IAEqB,O;AACjB,qBAAY,GAAZ,EAAiB;AAAA;;AACb,aAAK,GAAL,GAAW,GAAX;AACH;;;;mCAEU,U,EAAW;AAClB,gBAAI,OAAO;AACP,0BAAU,KADH;AAEP,uBAAO,WAAW,GAAX,CAAe,OAAf,CAFA;AAGP,2CAA0B,WAAW,GAAX,CAAe,QAAf,EAAyB,IAAnD,gBAHO;AAIP,yBAAS,CAAC,cAAD,CAJF;AAKP,4BAAa,IALN;AAMP,6BAAc,IANP;AAOP,iCAAiB;AAPV,aAAX;AASA,iBAAK,KAAL,GAAa,IAAI,YAAJ,CAAU,IAAV,CAAb;AACA,iBAAK,KAAL,CAAW,IAAX;AACH;;;;;;qBAjBgB,O;;;;;;;;;;;ACFrB;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AAEA;;;;AACA;;;;AACA;;;;;;;;IAEqB,kB;AACjB,gCAAY,GAAZ,EAAiB,IAAjB,EAAuB,cAAvB,EAAuC;AAAA;;AAAA;;AACnC,aAAK,GAAL,GAAW,GAAX;AACA,aAAK,IAAL,GAAY,IAAZ;AACA,aAAK,cAAL,GAAsB,cAAtB;;AAEA,aAAK,OAAL,GAAe,IAAI,mBAAJ,CAAW,KAAK,GAAhB,CAAf;AACA,aAAK,KAAL,GAAa,IAAI,iBAAJ,CAAS,KAAK,GAAd,EAAmB,KAAK,IAAxB,CAAb;AACA,aAAK,SAAL,GAAiB,IAAI,qBAAJ,CAAa,KAAK,GAAlB,CAAjB;AACA,aAAK,KAAL,GAAa,IAAI,iBAAJ,CAAS,KAAK,GAAd,CAAb;AACA,aAAK,OAAL,GAAe,IAAI,uBAAJ,CAAe,KAAK,GAApB,CAAf;AACA,aAAK,QAAL,GAAgB,IAAI,2BAAJ,CAAmB,KAAK,GAAxB,CAAhB;AACA,aAAK,QAAL,GAAgB,IAAI,oBAAJ,CAAY,KAAK,GAAjB,CAAhB;;AAEA,aAAK,GAAL,CACK,EADL,CACQ,cADR,EACwB,UAAC,KAAD,EAAQ,OAAR;AAAA,mBAChB,MAAK,OAAL,CAAa,QAAb,EAAuB,KAAvB,EAA8B,OAA9B,CADgB;AAAA,SADxB,EAIK,EAJL,CAIQ,YAJR,EAIsB,UAAC,KAAD,EAAQ,OAAR;AAAA,mBACd,MAAK,OAAL,CAAa,MAAb,EAAqB,KAArB,EAA4B,OAA5B,CADc;AAAA,SAJtB,EAOK,EAPL,CAOQ,mBAPR,EAO6B,UAAC,KAAD,EAAQ,OAAR;AAAA,mBACrB,MAAK,OAAL,CAAa,YAAb,EAA2B,KAA3B,EAAkC,OAAlC,CADqB;AAAA,SAP7B,EAUK,EAVL,CAUQ,gBAVR,EAU0B,UAAC,KAAD,EAAQ,OAAR;AAAA,mBAClB,MAAK,OAAL,CAAa,MAAb,EAAqB,KAArB,EAA4B,OAA5B,CADkB;AAAA,SAV1B,EAaK,EAbL,CAaQ,YAbR,EAasB,UAAC,KAAD,EAAQ,OAAR;AAAA,mBACd,MAAK,OAAL,CAAa,MAAb,EAAqB,KAArB,EAA4B,OAA5B,CADc;AAAA,SAbtB,EAgBK,EAhBL,CAgBQ,cAhBR,EAgBwB,UAAC,KAAD,EAAQ,OAAR;AAAA,mBAChB,MAAK,OAAL,CAAa,QAAb,EAAuB,KAAvB,EAA8B,OAA9B,CADgB;AAAA,SAhBxB,EAmBK,EAnBL,CAmBQ,eAnBR,EAmByB,UAAC,KAAD,EAAQ,OAAR;AAAA,mBACjB,MAAK,OAAL,CAAa,SAAb,EAAwB,KAAxB,EAA+B,OAA/B,CADiB;AAAA,SAnBzB,EAsBK,EAtBL,CAsBQ,eAtBR,EAsByB,UAAC,KAAD,EAAQ,OAAR;AAAA,mBACjB,MAAK,OAAL,CAAa,SAAb,EAAwB,KAAxB,EAA+B,OAA/B,CADiB;AAAA,SAtBzB,EAyBK,EAzBL,CAyBQ,aAzBR,EAyBuB,UAAC,KAAD,EAAQ,OAAR;AAAA,mBACf,MAAK,OAAL,CAAa,OAAb,EAAsB,KAAtB,EAA6B,OAA7B,CADe;AAAA,SAzBvB,EA4BK,EA5BL,CA4BQ,oBA5BR,EA4B8B,UAAC,KAAD,EAAQ,OAAR;AAAA,mBACtB,MAAK,OAAL,CAAa,cAAb,EAA6B,KAA7B,EAAoC,OAApC,CADsB;AAAA,SA5B9B;AA+BH;;;;gCAEO,M,EAAQ,U,EAAY,O,EAAS;AACjC,gBAAI,CAAC,OAAO,SAAP,CAAiB,eAAlB,IAAqC,WAAW,SAApD,EAA+D;AAC3D,qBAAK,eAAL,CACI,MADJ,EAEI,WAAW,EAFf,EAGI,WAAW,GAAX,CAAe,gBAAf,CAHJ;AAKH,aAND,MAMO,IACH,CAAC,OAAO,SAAP,CAAiB,cAAlB,IACA,CAAC,OAAO,cAAP,CAAsB,SAAtB,CAAgC,gBAAhC,CAFE,EAGL;AACE,oBAAI,cAAc,WAAW,GAAX,CAAe,YAAf,CAAlB;AACA,oBAAI,WAAW,QAAf,EAAyB;AACrB,8CAAwB,WAAW,GAAX,CAAe,gBAAf,CAAxB;AACH;AACD,qBAAK,GAAL,CAAS,OAAT,CAAiB,gBAAjB,EAAmC,EAAE,QAAQ,WAAV,EAAnC;AACH,aATM,MASA,IAAI,OAAO,KAAK,QAAL,MAAiB,MAAjB,CAAP,KAAsC,UAA1C,EAAsD;AACzD,qBAAK,cAAL,CAAoB,MAApB,EAA4B,UAA5B,EAAwC,OAAxC;AACH;;AAED;AACH;;;wCAEe,M,EAAQ,E,EAAI,M,EAAQ;AAChC,gBAAI,YAAe,MAAf,SAAyB,EAA7B;AACA,gBAAI,MAAJ,EAAY;AACR,mCAAiB,MAAjB;AACH;AACD,mBAAO,QAAP,GAAkB,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,aAAzB,EAAwC;AACtD,yBACI,OAAO,QAAP,CAAgB,QAAhB,GACA,OAAO,QAAP,CAAgB,MADhB,GAEA,UAFA,GAGA;AALkD,aAAxC,CAAlB;AAOH;;;uCAEc,M,EAAQ,K,EAAO,O,EAAS;AAAA;;AACnC,iBAAK,cAAL,CAAoB,MAApB,EAA4B,KAA5B,EAAmC;AAAA,uBAC/B,OAAK,QAAL,MAAiB,MAAjB,EAA2B,KAA3B,EAAkC,OAAlC,CAD+B;AAAA,aAAnC;AAGH;;;uCAEc,M,EAAQ,K,EAAO,e,EAAiB;AAAA;;AAC3C,gBAAI,cAAc,KAAlB;AACA,gBAAI,EAAE,CAAC,QAAD,EAAW,MAAX,EAAmB,SAAnB,CAAF,EAAiC,QAAjC,CAA0C,MAA1C,CAAJ,EAAuD;AACnD,8BAAc,IAAd;AACH,aAFD,MAEO,IAAI,WAAW,MAAf,EAAuB;AAC1B,8BAAc,MAAM,GAAN,CAAU,eAAV,MAA+B,aAA7C;AACH,aAFM,MAEA,IAAI,WAAW,SAAf,EAA0B;AAC7B,8BAAc,CAAC,MAAM,GAAN,CAAU,aAAV,CAAf;AACH;;AAED,gBAAI,WAAJ,EAAiB;AACb,oBAAI,oBAAoB,CAAC,MAAM,GAAN,CAAU,WAAV,CAAD,GAClB,MAAM,mBAAN,CAA0B,WAA1B,CADkB,GAElB,QAAQ,OAAR,EAFN;AAGA,kCAAkB,IAAlB,CAAuB,YAAM;AACzB,wBACI,OAAK,mBAAL,CAAyB,KAAzB,KACC,QAAQ,GAAR,CAAY,2BAAZ,KACG,QAAQ,GAAR,CAAY,2BAAZ,MAA6C,GAHrD,EAIE;AACE;AACH,qBAND,MAMO;AACH,+BAAO,MAAP,CAAc,GAAd,CACI,MADJ,EAEI,mCAFJ,EAGI;AACI,4CACI,OAAO,cAAP,CAAsB,oBAAtB,CAFR;AAGI,4CAAgB,MAAM,GAAN,CAAU,WAAV;AAHpB,yBAHJ;AASA,4BAAM,gBAAgB,IAAI,kCAAJ,CAA0B;AAC5C,mCAAO,IAAI,6BAAJ,CAAqB;AACxB,2CAAW,MAAM,GAAN,CAAU,WAAV,CADa;AAExB;AAFwB,6BAArB;AADqC,yBAA1B,CAAtB;AAMA,sCAAc,GAAd,CACK,IADL,CACU,iBADV,EAEK,EAFL,CAEQ,OAFR,EAEiB,YAAM;AACf,0CAAc,KAAd;AACA,gCACI,cAAc,GAAd,CACK,IADL,CACU,mBADV,EAEK,EAFL,CAEQ,UAFR,CADJ,EAIE;AACE,oCAAM,qBACF,OAAO,EAAP,GAAY,EAAZ,GAAiB,EAAjB,GAAsB,GAD1B;AAEA,oCAAM,aAAa,IAAI,IAAJ,CACf,KAAK,GAAL,KAAa,kBADE,CAAnB;AAGA,wCAAQ,GAAR,CAAY,2BAAZ,EAAyC,GAAzC,EAA8C;AAC1C,8CAAU,KADgC;AAE1C,6CAAS;AAFiC,iCAA9C;AAIH;AACD;AACH,yBApBL;AAqBA,sCAAc,GAAd,CAAkB,IAAlB,CAAuB,gBAAvB,EAAyC,EAAzC,CAA4C,OAA5C,EAAqD,YAAM;AACvD,0CAAc,KAAd;AACA,kCAAM,OAAN,CAAc,sBAAd;AACH,yBAHD;AAIH;AACJ,iBAjDD;AAkDH,aAtDD,MAsDO;AACH;AACH;AACJ;;;4CAEmB,K,EAAO;AACvB,gBAAM,iBAAiB,MAAM,GAAN,CAAU,WAAV,CAAvB;AACA,gBAAM,mBACD,kBAAkB,eAAe,GAAf,CAAmB,UAAC,QAAD;AAAA,uBAAc,SAAS,EAAvB;AAAA,aAAnB,CAAnB,IACA,EAFJ;AAGA,gBAAI,iBAAiB,OAAO,cAAP,CAAsB,oBAAtB,CAArB;AACA,gBAAI,CAAC,CAAC,cAAN,EAAsB;AAClB,oBAAM,eAAe,eAAe,OAAf,CAAuB,GAAvB,CAArB;AACA,oBAAI,iBAAiB,CAAC,CAAtB,EAAyB;AACrB,qCAAiB,eAAe,SAAf,CAAyB,CAAzB,EAA4B,YAA5B,CAAjB;AACH;AACD,oBAAI,CAAC,iBAAiB,QAAjB,CAA0B,cAA1B,CAAL,EAAgD;AAC5C,2BAAO,KAAP;AACH;AACJ;AACD,mBAAO,IAAP;AACH;;;4BAEc;AACX,gBAAI,OAAO,IAAX;AACA,mBAAO;AACH,sBADG,kBACI,KADJ,EACW,OADX,EACoB;AACnB,yBAAK,OAAL,CAAa,WAAb,CAAyB,KAAzB,EAAgC,OAAhC;AACH,iBAHE;AAKH,oBALG,gBAKE,KALF,EAKS,OALT,EAKkB;AACjB,yBAAK,KAAL,CAAW,SAAX,CAAqB,KAArB,EAA4B,OAA5B;AACH,iBAPE;AASH,0BATG,sBASQ,KATR,EASe,OATf,EASwB;AACvB,yBAAK,KAAL,CAAW,UAAX,CAAsB,KAAtB,EAA6B,OAA7B;AACH,iBAXE;AAaH,oBAbG,gBAaE,KAbF,EAaS,OAbT,EAakB;AACjB,yBAAK,SAAL,CAAe,cAAf,CAA8B,KAA9B,EAAqC,OAArC;AACH,iBAfE;AAiBH,oBAjBG,gBAiBE,KAjBF,EAiBS,OAjBT,EAiBkB;AACjB,yBAAK,KAAL,CAAW,UAAX,CAAsB,KAAtB,EAA6B,OAA7B;AACH,iBAnBE;AAqBH,sBArBG,kBAqBI,KArBJ,EAqBW,OArBX,EAqBoB;AACnB,yBAAK,OAAL,CAAa,cAAb,CAA4B,KAA5B,EAAmC,OAAnC;AACH,iBAvBE;AAyBH,uBAzBG,mBAyBK,KAzBL,EAyBY,OAzBZ,EAyBqB;AACpB,yBAAK,QAAL,CAAc,oBAAd,CAAmC,KAAnC,EAA0C,OAA1C;AACH,iBA3BE;AA6BH,uBA7BG,mBA6BK,KA7BL,EA6BY;AACX,yBAAK,QAAL,CAAc,UAAd,CAAyB,KAAzB;AACH,iBA/BE;AAiCH,qBAjCG,iBAiCG,KAjCH,EAiCU,OAjCV,EAiCmB;AAClB,4BAAQ,SAAR,GAAoB,IAApB;AACA,4BAAQ,UAAR,GAAqB,IAArB;AACA,wBAAI,MAAM,UAAN,CAAiB,gBAArB,EAAuC;AACnC,gCAAQ,UAAR,GACI,MAAM,UAAN,CAAiB,YAAjB,CAA8B,MAA9B,IACA,MAAM,UAAN,CAAiB,YAAjB,CAA8B,CAA9B,EAAiC,EAFrC;AAGH;AACD,yBAAK,OAAL,CAAa,WAAb,CAAyB,KAAzB,EAAgC,OAAhC;AACH,iBA1CE;AA4CH,4BA5CG,wBA4CU,KA5CV,EA4CiB,OA5CjB,EA4C0B;AACzB,4BAAQ,cAAR,GAAyB,IAAzB;AACA,yBAAK,KAAL,CAAW,SAAX,CAAqB,KAArB,EAA4B,OAA5B;AACH;AA/CE,aAAP;AAiDH;;;;;;qBApOgB,kB;;;;;;;;;;;;;ICXA,Y;AACjB,gCAA8B;AAAA,YAAhB,GAAgB,QAAhB,GAAgB;AAAA,YAAX,OAAW,QAAX,OAAW;;AAAA;;AAC1B,aAAK,GAAL,GAAW,GAAX;;AAEA,aAAK,OAAL,GAAe;AACX,kBAAM,SADK;AAEX,kCAAsB;AAFX,SAAf;;AAKA,UAAE,MAAF,CAAS,KAAK,OAAd,EAAuB,OAAvB;AACH;;;;gCAEO,M,EAAQ,U,EAAY;AACxB,gBAAI,OAAO,WAAS,MAAT,CAAP,KAA8B,UAAlC,EAA8C;AAC1C,2BAAS,MAAT,EAAmB,UAAnB;AACH;AACJ;;;gCAEO,U,EAAY;AAChB,iBAAK,GAAL,CAAS,OAAT,CAAiB,cAAjB,EAAiC,UAAjC,EAA6C,KAAK,OAAlD;AACH;;;8BAEK,U,EAAY;AACd,iBAAK,GAAL,CAAS,OAAT,CAAiB,YAAjB,EAA+B,UAA/B,EAA2C,KAAK,OAAhD;AACH;;;8BAEK,U,EAAY;AACd,iBAAK,GAAL,CAAS,OAAT,CAAiB,gBAAjB,EAAmC,UAAnC,EAA+C,KAAK,OAApD;AACH;;;8BAEK,U,EAAY;AACd,iBAAK,GAAL,CAAS,OAAT,CAAiB,YAAjB,EAA+B,UAA/B,EAA2C,KAAK,OAAhD;AACH;;;gCAEO,U,EAAY;AAChB,iBAAK,GAAL,CAAS,OAAT,CAAiB,cAAjB,EAAiC,UAAjC,EAA6C,KAAK,OAAlD;AACH;;;iCAEQ,U,EAAY;AACjB,iBAAK,GAAL,CAAS,OAAT,CAAiB,eAAjB,EAAkC,UAAlC,EAA8C,KAAK,OAAnD;AACH;;;kCAES,U,EAAY;AAClB,iBAAK,GAAL,CAAS,OAAT,CAAiB,gBAAjB,EAAmC,UAAnC,EAA+C,KAAK,OAApD;AACH;;;iCAEQ,U,EAAY;AACjB,iBAAK,GAAL,CAAS,OAAT,CAAiB,eAAjB,EAAkC,UAAlC,EAA8C,KAAK,OAAnD;AACH;;;+BAEM,U,EAAY;AACf,iBAAK,GAAL,CAAS,OAAT,CAAiB,aAAjB,EAAgC,UAAhC,EAA4C,KAAK,OAAjD;AACH;;;sCAEa,U,EAAY;AACtB,iBAAK,GAAL,CAAS,OAAT,CAAiB,oBAAjB,EAAuC,UAAvC,EAAmD,KAAK,OAAxD;AACH;;;uCAEc,I,EAAM;AACjB,gBAAI,EAAE,IAAF,EAAQ,OAAR,EAAJ,EAAuB;AACnB,uBAAO,KAAK,OAAL,CAAa,IAApB;AACH,aAFD,MAEO;AACH,qBAAK,OAAL,CAAa,IAAb,GAAoB,IAApB;AACH;;AAED,mBAAO,IAAP;AACH;;;6CAEoB,e,EAAiB;AAClC,gBAAI,EAAE,eAAF,EAAmB,OAAnB,EAAJ,EAAkC;AAC9B,uBAAO,KAAK,OAAL,CAAa,eAApB;AACH,aAFD,MAEO;AACH,qBAAK,OAAL,CAAa,eAAb,GAA+B,eAA/B;AACH;;AAED,mBAAO,IAAP;AACH;;;;;;qBA5EgB,Y;;;;;;;;;;;;;ICAf,U;;;;;;;iCACc,K,EAAO,W,EAAa;AAChC,gBAAM,iBAAiB,OAAO,cAA9B;;AAEA,gBAAI,eAAe,SAAf,CAAyB,gBAAzB,CAAJ,EAAgD;AAC5C,uBAAO,SAAP;AACH;;AAED,gBAAI,UAAU,MAAM,EAApB;;AAEA,gBAAI,WAAW,eAAe,YAAY,OAAZ,CAAoB,OAApB,CAA4B,OAA5B,IAAuC,CAAC,CAAtE;AACA,gBAAI,gBACA,eAAe,YAAY,WAAZ,CAAwB,OAAxB,CAAgC,OAAhC,IAA2C,CAAC,CAD/D;AAEA,gBAAI,cACA,MAAM,WAAN,IACC,eAAe,SAAf,CAAyB,UAAzB,KACG,MAAM,uBAAN,GAAgC,CAHxC;;AAKA,gBACI,iBAAiB,IAAjB,CAAsB,OAAO,QAAP,CAAgB,IAAtC,KACA,MAAM,WADN,IAEA,eAAe,SAAf,CAAyB,eAAzB,CAHJ,EAIE;AACE,oBAAI,QAAJ,EAAc;AACV,2BAAO,WAAP;AACH,iBAFD,MAEO,IACH,MAAM,UAAN,IAAoB,CAApB,IACA,MAAM,WAAN,IAAqB,CADrB,IAEA,EACI,eAAe,SAAf,CAAyB,UAAzB,KACA,MAAM,kBAFV,CAHG,EAOL;AACE,2BAAO,OAAP;AACH;AACD,uBAAO,cAAP;AACH;;AAED,gBAAI,aAAJ,EAAmB;AACf,uBAAO,UAAP;AACH;;AAED,gBAAI,YAAY,CAAC,WAAjB,EAA8B;AAC1B,uBAAO,QAAP;AACH;;AAED,gBAAI,WAAJ,EAAiB;AACb,oBAAI,MAAM,IAAN,CAAW,EAAX,KAAkB,aAAtB,EAAqC;AACjC,2BAAO,MAAP;AACH;;AAED,uBAAO,QAAP;AACH;;AAED,gBAAI,MAAM,UAAN,IAAoB,eAAe,SAAf,CAAyB,eAAzB,CAAxB,EAAmE;AAC/D,uBAAO,MAAP;AACH;;AAED,mBAAO,aAAP;AACH;;;qCAEmB,K,EAAO,W,EAAa;AACpC,mBAAO,eAAe,YAAY,UAAZ,CAAuB,OAAvB,CAA+B,MAAM,EAArC,IAA2C,CAAC,CAAlE;AACH;;;2CAEyB,K,EAAO,W,EAAa;AAC1C,mBACI,eAAe,YAAY,gBAAZ,CAA6B,OAA7B,CAAqC,MAAM,EAA3C,IAAiD,CAAC,CADrE;AAGH;;;mCAEiB,K,EAAO,W,EAAa;AAClC;AACA,mBACK,eACG,YAAY,WADf,IAEG,YAAY,WAAZ,CAAwB,MAAM,EAA9B,CAFJ,IAGA,CAJJ;AAMH;;;;;;qBAGU,U;;;;;;;;;;;AClFf;;;;AACA;;;;;;;;IAEM,M;AACF,oBAAY,GAAZ,EAAiB;AAAA;;AACb,aAAK,GAAL,GAAW,GAAX;AACH;;;;oCAEW,U,EAAY,O,EAAS;AAAA;;AAC7B,gBAAI,SAAS,SAAT,MAAS,GAAM;AACf,oBAAI,CAAC,QAAQ,SAAb,EAAwB;AACpB,+BAAW,GAAX,CAAe,YAAf,EAA6B,SAA7B;AACH;;AAED,qBAAK,IAAI,+BAAJ,CAAuB;AACxB,2BAAO,UADiB;AAExB,yBAAK,MAAK,GAFc;AAGxB,+BAAW,CAAC,CAAC,QAAQ,SAHG;AAIxB,4BAAQ,gBAAC,KAAD,EAAW;AACf,8BAAK,WAAL,CAAiB,UAAjB,EAA6B,OAA7B,EAAsC,MAAtC,CAA6C,YAAM;AAC/C,kCAAM,KAAN;AACH,yBAFD;AAGH,qBARuB;AASxB,6BAAS,iBAAC,KAAD,EAAW;AAChB,8BAAK,cAAL,CAAoB,UAApB,EAAgC,EAAhC,EAAoC,EAApC,EAAwC,KAAxC;AACH;AAXuB,iBAAvB,CAAL;AAaH,aAlBD;;AAoBA,gBAAI,OAAO,cAAP,CAAsB,SAAtB,CAAgC,YAAhC,CAAJ,EAAmD;AAC/C,oBAAI,WAAW,WAAX,IAA0B,CAAC,CAAC,QAAQ,SAAxC,EAAmD;AAC/C;AACH,iBAFD,MAEO,IAAI,OAAO,SAAP,CAAiB,SAArB,EAAgC;AACnC,wBAAI,yCAAJ,CAAiC,QAAjC;AACH;AACJ,aAND,MAMO;AACH;AACH;AACJ;;;oCAEW,U,EAAY,O,EAAS;AAAA;;AAC7B,iBAAK,GAAL,CAAS,OAAT,CAAiB,oBAAjB,EAAuC,EAAE,sBAAF,EAAc,gBAAd,EAAvC;;AAD6B,0BAGJ,MAHI;AAAA,gBAGvB,MAHuB,WAGvB,MAHuB;AAAA,gBAGf,MAHe,WAGf,MAHe;;;AAK7B,gBAAM,gBAAgB,WAAW,GAAX,CAAe,eAAf,CAAtB;AACA,mBAAO,EAAE,IAAF,CACH,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,WAAzB,EAAsC,EAAE,SAAS,WAAW,EAAtB,EAAtC,CADG,EAEH;AACI,+BAAe,cAAc,aADjC;AAEI,uBAAO,cAAc,KAFzB;AAGI,0BAAU,UAAU,MAHxB;AAII,sCAAsB,IAJ1B;AAKI,2BAAW,CAAC,CAAC,QAAQ,SALzB;AAMI,oCACI,WAAW,kBAAX,IAAiC,CAAC,QAAQ;AAPlD,aAFG,EAYF,IAZE,CAYG,UAAC,QAAD;AAAA,uBACF,OAAK,cAAL,CAAoB,UAApB,EAAgC,QAAhC,EAA0C,OAA1C,CADE;AAAA,aAZH,EAeF,IAfE,CAeG,UAAC,KAAD,EAAQ,UAAR,EAAoB,WAApB;AAAA,uBACF,OAAK,cAAL,CAAoB,UAApB,EAAgC,KAAhC,EAAuC,UAAvC,EAAmD,WAAnD,CADE;AAAA,aAfH,EAkBF,MAlBE,CAkBK,YAAM;AACV,uBAAK,GAAL,CAAS,OAAT,CAAiB,kBAAjB,EAAqC,UAArC;AACH,aApBE,CAAP;AAqBH;;;uCAEc,U,EAAY,Q,EAAU,O,EAAS;AAC1C,gBAAI,CAAC,CAAC,QAAQ,SAAd,EAAyB;AACrB,2BAAW,GAAX,CAAe,YAAf,EAA6B,SAA7B;AACH,aAFD,MAEO;AACH,2BAAW,GAAX,CAAe,YAAf,EAA6B,UAA7B;AACH;;AAED,iBAAK,GAAL,CAAS,OAAT,CAAiB,sBAAjB,EAAyC;AACrC,yBAAS,SAAS,OADmB;AAErC,sBAAM,QAF+B;AAGrC,sCAHqC;AAIrC;AAJqC,aAAzC;;AAOA,uBAAW,GAAX,CAAe,aAAf,EAA8B,IAA9B;AACH;;;uCAEc,U,EAAY,K,EAAO,U,EAAY,W,EAAa,O,EAAS;AAChE,gBAAI,CAAC,iBAAiB,IAAjB,CAAsB,OAAO,QAAP,CAAgB,IAAtC,CAAL,EAAkD;AAC9C,2BAAW,GAAX,CAAe,YAAf,EAA6B,QAA7B;AACH;;AAED,iBAAK,GAAL,CAAS,OAAT,CAAiB,mBAAjB,EAAsC;AAClC,4BADkC;AAElC,sCAFkC;AAGlC,wCAHkC;AAIlC,sCAJkC;AAKlC;AALkC,aAAtC;AAOH;;;;;;qBAGU,M;;;;;;;;;;;ACnGf;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;AACA;;;;;;AARA,IAAI,SAAS,QAAQ,QAAR,CAAb;;IAUM,a;AACF,2BAAY,GAAZ,EAAiB,cAAjB,EAAiC,iBAAjC,EAAoD;AAAA;;AAAA;;AAChD,aAAK,GAAL,GAAW,GAAX;AACA,aAAK,cAAL,GAAsB,cAAtB;AACA,aAAK,iBAAL,GAAyB,iBAAzB;;AAEA,aAAK,GAAL,CACK,EADL,CACQ,sBADR,EACgC,UAAC,IAAD;AAAA,mBAAU,MAAK,aAAL,CAAmB,IAAnB,CAAV;AAAA,SADhC,EAEK,EAFL,CAEQ,mBAFR,EAE6B,UAAC,IAAD;AAAA,mBAAU,MAAK,UAAL,CAAgB,IAAhB,CAAV;AAAA,SAF7B,EAGK,EAHL,CAGQ,uBAHR,EAGiC,UAAC,IAAD;AAAA,mBACzB,MAAK,kBAAL,CAAwB,KAAK,UAA7B,CADyB;AAAA,SAHjC;AAMH;;;;sCAEa,I,EAAM;AAAA;;AAChB,gBAAM,MAAM,OAAO,IAAP,CAAY,WAAZ,EAAyB,EAAE,GAAG,KAAK,OAAV,EAAzB,CAAZ;AACA,gBAAM,UAAU,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,YAAzB,CAAhB;AACA,gBAAM,QAAQ,OAAO,IAAP,CAAY,OAAZ,CAAd;AACA,gBAAM,YAAY,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,IAAd,CAAmB,OAAnB,CAA2B,MAAtC,CAAlB;;AAEA,cAAE,IAAF,CAAO,SAAP,EAAkB,IAAlB,CAAuB,UAAC,MAAD,EAAY;AAC/B,oBAAI,gBAAgB,IAAI,0BAAJ,CAAkB,OAAO,IAAzB,CAApB;AACA,oBAAI,eAAe,OAAK,cAAL,CAAoB,SAApB,CACf,uBADe,CAAnB;AAGA,oBAAI,eACC,QAAQ,GAAR,CAAY,8BAAZ,KACG,QAAQ,GAAR,CAAY,8BAAZ,MAAgD,GADpD,IAEC,OAAK,iBAAL,IACG,OAAK,iBAAL,CAAuB,GAAvB,CAA2B,mBAA3B,CAJR;AAKA,oBAAI,QAAQ,QAAQ,GAAR,CAAY,WAAZ,MAA6B,SAAzC;AACA,oBAAI,gBACA,OAAK,cAAL,CAAoB,SAApB,CAA8B,0BAA9B,KACA,KADA,IAEA,OAAO,SAAP,CACI,OAAO,MAAP,CAAc,OAAO,SAAP,CAAiB,UAA/B,CADJ,EAEI,QAFJ,CAHJ;;AAQA,oBAAI,OAAO,IAAI,sBAAJ,CACP,KAAK,IADE,EAEP,YAFO,EAGP,YAHO,EAIP,KAJO,EAKP,OAAO,MAAP,CAAc,GALP,EAMP,OAAK,cAAL,CAAoB,SAApB,CAA8B,sBAA9B,CANO,EAOP,OAAK,cAAL,CAAoB,SAApB,CACI,qCADJ,CAPO,EAUP,OAAO,SAAP,CAAiB,gBAVV,EAWP,aAXO,EAYP,OAAK,cAAL,CAAoB,SAApB,CAA8B,uBAA9B,CAZO,EAaP,OAAK,cAAL,CAAoB,SAApB,CAA8B,cAA9B,CAbO,EAcP,OAAK,cAAL,CAAoB,SAApB,CACI,iCADJ,CAdO,EAiBP,OAAK,cAAL,CAAoB,SAApB,CAA8B,0BAA9B,CAjBO,CAAX;;AAoBA,oBAAI,QAAQ,IAAI,kCAAJ,CAA0B;AAClC,0BAAM,IAD4B;AAElC,2BAAO,KAAK,UAFsB;AAGlC,yBAAK,OAAK,GAHwB;AAIlC,oCAAgB,OAAK,cAJa;AAKlC,uCAAmB,OAAK,iBALU;AAMlC,mCAAe,aANmB;AAOlC,+BAAW,CAAC,CAAC,KAAK,OAAL,CAAa,SAPQ;AAQlC,gCAAY,KAAK,OAAL,CAAa,UAAb,IAA2B;AARL,iBAA1B,CAAZ;AAUA,sBAAM,MAAN;AACH,aAlDD;AAmDH;;;mCAEU,I,EAAM;AACb,gBAAM,WAAW,KAAK,KAAL,CAAW,KAAK,KAAL,CAAW,YAAX,IAA2B,IAAtC,CAAjB;AACA,gBAAI,SAAS,SAAT,KAAuB,gCAA3B,EAA6D;AACzD,qBAAK,GAAL,CAAS,OAAT,CAAiB,mBAAjB;AACH,aAFD,MAEO,IAAI,SAAS,cAAb,EAA6B;AAChC,qBAAK,GAAL,CAAS,OAAT,CAAiB,sBAAjB,EAAyC;AACrC,wCAAkB,KAAK,UAAL,CAAgB;AADG,iBAAzC;AAGH,aAJM,MAIA,IACH,SAAS,SAAT,KAAuB,qCAAvB,IACA,SAAS,SAAT,KAAuB,wBAFpB,EAGL;AACE,qBAAK,kBAAL,CAAwB,KAAK,UAA7B;AACH,aALM,MAKA,IAAI,SAAS,SAAT,KAAuB,qBAA3B,EAAkD;AACrD,qBAAK,kBAAL,CAAwB,KAAK,UAA7B;AACH,aAFM,MAEA,IACH,SAAS,SAAT,KAAuB,eAAvB,IACA,SAAS,SAAT,KAAuB,qBAFpB,EAGL;AACE,qBAAK,kBAAL,CAAwB,KAAK,UAA7B;AACH,aALM,MAKA,IACH,SAAS,SAAT,KAAuB,6BAAvB,IACA,KAAK,cAAL,CAAoB,SAApB,CAA8B,UAA9B,CAFG,EAGL;AACE,qBAAK,kBAAL,CAAwB,KAAK,UAA7B,EAAyC,EAAE,YAAY,IAAd,EAAzC;AACH,aALM,MAKA,IACH,SAAS,SAAT,KAAuB,wCADpB,EAEL;AACE,oBAAI,OAAO,QAAP,CAAgB,IAAhB,CAAqB,KAArB,CAA2B,SAA3B,MAA0C,IAA9C,EAAoD;AAChD,wBAAI,OAAJ,EACI,QAAQ,IAAR,MAAgB,OAAO,IAAP,CAAY,eAAZ,CAAhB,EAAgD,OAAhD;AACP,iBAHD,MAGO;AACH,yBAAK,kBAAL,CAAwB,KAAK,UAA7B;AACH;AACJ,aATM,MASA,IAAI,SAAS,SAAT,KAAuB,8BAA3B,EAA2D;AAC9D,oBAAI,yCAAJ,CAAiC,QAAjC;AACA,oBAAI,OAAO,cAAP,CAAsB,SAAtB,CAAgC,YAAhC,CAAJ,EAAmD;AAC/C,yBAAK,UAAL,CAAgB,GAAhB,CAAoB;AAChB,oCAAY,aADI;AAEhB,yCAAiB,CAFD;AAGhB,qCAAa;AAHG,qBAApB;AAKH;AACJ,aATM,MASA,IAAI,SAAS,SAAT,KAAuB,sBAA3B,EAAmD;AACtD,oBAAI,YAAJ,CAAU;AACN,2BAAO,OAAO,IAAP,CAAY,cAAZ,CADD;AAEN,qCAAe,OAAO,IAAP,CAAY,oBAAZ,CAAf;AAFM,iBAAV;AAIH,aALM,MAKA;AACH,qBAAK,aAAL,CAAmB,SAAS,SAA5B,EAAuC,KAAK,UAA5C;AACH;AACJ;;;sCAEa,S,EAAW,U,EAAY;AACjC,gBAAI,OAAO,EAAX;AACA,gBAAI,WAAW,EAAf;;AAEA,gBACI,cAAc,6BAAd,IACA,cAAc,mBAFlB,EAGE;AACE,uBAAO,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,YAAzB,CAAP;AACA,2BAAW,OAAO,IAAP,CAAY,OAAZ,CAAX;AACH,aAND,MAMO,IACH,cAAc,6BAAd,IACA,cAAc,+BAFX,EAGL;AACE,uBAAO,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,cAAzB,CAAP;AACA,2BAAW,OAAO,IAAP,CAAY,sBAAZ,CAAX;AACH;;AAED,gBAAI,OAAJ,EAAa;AACT,oBAAM,kCAAgC,IAAhC,uBAAsD,QAAtD,SAAN;AACA,oBACI,cAAc,6BAAd,IACA,KAAK,cAAL,CAAoB,SAApB,CAA8B,gBAA9B,CADA,IAEA,WAAW,GAAX,CAAe,kBAAf,MAAuC,CAH3C,EAIE;AACE,4BAAQ,IAAR,MACO,OAAO,IAAP,8BAAyC,EAAE,UAAF,EAAzC,CADP,EAEI,OAFJ;AAIH,iBATD,MASO;AACH,4BAAQ,IAAR,cACe,OAAO,IAAP,CACP,cADO,CADf,kBAGkB,OAAO,IAAP,YAAqB,SAArB,EAAkC,EAAE,UAAF,EAAlC,CAHlB,EAII,OAJJ;AAMH;AACJ;AACJ;;;2CAEkB,U,EAA0B;AAAA,gBAAd,OAAc,uEAAJ,EAAI;;AACzC;AACA;AACA,gBAAI,CAAC,WAAW,YAAhB,EAA8B;AAC1B,oBAAI,iCAAJ,CAAyB,UAAzB,EAAqC,OAArC;AACA,2BAAW,GAAX,CAAe;AACX,gCAAY,WAAW,GAAX,CAAe,UAAf,IACN,QADM,GAEN,aAHK;AAIX,qCAAiB,CAJN;AAKX,iCAAa;AALF,iBAAf;AAOH,aATD,MASO;AACH,oBAAI,iBAAiB,iBAAiB,IAAjB,CAAsB,OAAO,QAAP,CAAgB,IAAtC,CAArB;AACA,2BAAW,GAAX,CAAe;AACX,gCAAY,iBAAiB,cAAjB,GAAkC,MADnC;AAEX,qCAAiB,CAFN;AAGX,iCAAa;AAHF,iBAAf;AAKA,oBAAI,8BAAJ,CAAsB,KAAK,GAA3B,EAAgC,UAAhC,EAA4C,OAA5C;AACH;AACJ;;;;;;qBAGU,a;;;;;;;;;;;;;;;;;cCxME,M;IAAT,I,WAAA,I;;IAEa,gB;;;;;;;;;;;4BACE;AACf,gBAAM,gBAAgB,KAAK,GAAL,CAAS,WAAT,EAAsB,GAAtB,CAClB,UAAC,QAAD;AAAA,uBAAc,SAAS,EAAT,IAAe,SAAS,EAAT,CAAY,KAAZ,CAAkB,GAAlB,EAAuB,CAAvB,CAA7B;AAAA,aADkB,CAAtB;AAGA,gBAAM,eAAe,cAAc,GAAd,CACjB,UAAC,IAAD;AAAA,uBAAU,QAAQ,yBAAuB,IAAvB,CAAlB;AAAA,aADiB,CAArB;AAGA,mBAAO,KAAK,6BAAL,EAAoC;AACvC,0BAAU,aAAa,IAAb,CAAkB,IAAlB;AAD6B,aAApC,CAAP;AAGH;;;4BAEoB;AACjB,oBAAQ,KAAK,GAAL,CAAS,QAAT,CAAR;AACI,qBAAK,QAAL;AACI,2BAAO,KAAK,oCAAL,CAAP;AACJ,qBAAK,MAAL;AACI,2BAAO,KAAK,kCAAL,CAAP;AACJ,qBAAK,MAAL;AACI,2BAAO,KAAK,kCAAL,CAAP;AACJ,qBAAK,SAAL;AACI,2BAAO,KAAK,qCAAL,CAAP;AACJ;AACI,2BAAO,EAAP;AAVR;AAYH;;;4BAEgB;AACb,oBAAQ,KAAK,GAAL,CAAS,QAAT,CAAR;AACI,qBAAK,QAAL;AACI,2BAAO,KAAK,QAAL,CAAP;AACJ,qBAAK,MAAL;AACI,2BAAO,KAAK,WAAL,CAAP;AACJ,qBAAK,MAAL;AACI,2BAAO,KAAK,eAAL,CAAP;AACJ,qBAAK,SAAL;AACI,2BAAO,KAAK,oBAAL,CAAP;AACJ;AACI,2BAAO,KAAK,SAAL,CAAP;AAVR;AAYH;;;;EAzCyC,SAAS,K;;qBAAlC,gB;;;;;;;;;qBCFN;AAAA,QAAE,YAAF,QAAE,YAAF;AAAA,QAAgB,cAAhB,QAAgB,cAAhB;AAAA,QAAgC,UAAhC,QAAgC,UAAhC;AAAA,0DAEL,YAFK,SAEW,cAFX,2KAI2H,OAAO,IAAP,CAAY,UAAZ,CAJ3H,qMAQgG,UARhG,sHASkF,OAAO,IAAP,CAAY,QAAZ,CATlF;AAAA,C;;;;;;;;;ACAf;;AACA;;;;;;;;;;;;IAEqB,qB;;;AACjB,yCAAqB;AAAA,YAAR,KAAQ,QAAR,KAAQ;;AAAA;;AACjB,YAAM,gBAAgB;AAClB,qBAAS,CAAC,uBAAD,CADS;AAElB,mBAAO,OAAO,IAAP,CAAY,uCAAZ,CAFW;AAGlB,qBAAS,wCAA8B;AACnC,8BAAc,MAAM,YADe;AAEnC,gCAAgB,MAAM,cAFa;AAGnC,4BAAY,MAAM;AAHiB,aAA9B;AAHS,SAAtB;AADiB,6IAUX,aAVW;AAWpB;;;EAZ8C,Y;;qBAA9B,qB;;;;;;;;;;;ACHrB;;;;;;;;IAEM,c;AACF,4BAAY,GAAZ,EAAiB;AAAA;;AACb,aAAK,GAAL,GAAW,GAAX;AACH;;;;0CAEiB;AAAA;;AACd,iBAAK,GAAL,CAAS,OAAT,CAAiB,+BAAjB;;AAEA,mBAAO,EAAE,IAAF,CAAO,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,IAAd,CAAmB,cAAnB,CAAkC,KAA7C,CAAP,EACF,IADE,CACG;AAAA;;AAAA,kDAAI,MAAJ;AAAI,0BAAJ;AAAA;;AAAA,uBAAiB,cAAK,GAAL,EAAS,OAAT,cAAiB,iCAAjB,SAAuD,MAAvD,EAAjB;AAAA,aADH,EAEF,IAFE,CAEG;AAAA;;AAAA,mDAAI,MAAJ;AAAI,0BAAJ;AAAA;;AAAA,uBAAiB,eAAK,GAAL,EAAS,OAAT,eAAiB,8BAAjB,SAAoD,MAApD,EAAjB;AAAA,aAFH,EAGF,MAHE,CAGK;AAAA,uBAAe,MAAK,GAAL,CAAS,OAAT,CAAiB,6BAAjB,CAAf;AAAA,aAHL,CAAP;AAIH;;;6CAEoB,U,EAAY,O,EAAS;AAAA;;AACtC,gBAAI,SAAS,WAAW,GAAX,CAAe,aAAf,IAAgC,QAAhC,GAA2C,KAAxD;;AAEA,iBAAK,GAAL,CAAS,OAAT,CAAiB,qBAAjB,EAAwC,EAAE,sBAAF,EAAc,cAAd,EAAxC;;AAEA,gBAAI,WAAW,IAAI,OAAJ,CAAY,UAAC,OAAD,EAAU,MAAV,EAAqB;AAC5C,oBAAI,WAAW,QAAf,EAAyB;AACrB,wBAAI,+BAAJ,CAAuB;AACnB,6BAAQ,OAAK,GADM;AAEnB,+BAAQ,UAFW;AAGnB,gCAAQ,kBAAM;AACV,mCAAK,kBAAL,CAAwB,UAAxB,EAAoC,OAApC,EAA6C,IAA7C,CAAkD,OAAlD,EAA2D,IAA3D,CAAgE,MAAhE;AACH;AALkB,qBAAvB;AAOH,iBARD,MAQO;AACH,2BAAK,eAAL,CAAqB,UAArB,EAAiC,OAAjC,EAA0C,IAA1C,CAA+C,OAA/C,EAAwD,IAAxD,CAA6D,MAA7D;AACH;AACJ,aAZc,CAAf;;AAcA,mBAAO,SACF,IADE,CACG;AAAA;;AAAA,mDAAI,MAAJ;AAAI,0BAAJ;AAAA;;AAAA,uBAAiB,gBAAK,GAAL,EAAS,OAAT,eAAiB,uBAAjB,EAA6C,EAAE,sBAAF,EAAc,cAAd,EAAsB,gBAAtB,EAA7C,SAAiF,MAAjF,EAAjB;AAAA,aADH,WAEI;AAAA;;AAAA,mDAAI,MAAJ;AAAI,0BAAJ;AAAA;;AAAA,uBAAgB,gBAAK,GAAL,EAAS,OAAT,eAAiB,oBAAjB,EAA6C,EAAE,sBAAF,EAAc,cAAd,EAAsB,gBAAtB,EAA7C,SAAiF,MAAjF,EAAhB;AAAA,aAFJ,EAGF,IAHE,CAGG;AAAA,uBAAiB,OAAK,GAAL,CAAS,OAAT,CAAiB,mBAAjB,EAA6C,EAAE,sBAAF,EAAc,cAAd,EAAsB,gBAAtB,EAA7C,CAAjB;AAAA,aAHH,CAAP;AAIH;;;wCAEe,U,EAAY,O,EAAS;AAAA;;AACjC,iBAAK,GAAL,CAAS,OAAT,CAAiB,yBAAjB,EAA4C,EAAE,sBAAF,EAAc,gBAAd,EAA5C;;AAEA,gBAAI,WAAW,EAAE,IAAF,CAAO;AAClB,qBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,IAAd,CAAmB,cAAnB,CAAkC,KAA7C,EAAoD,EAAC,IAAI,WAAW,GAAX,CAAe,IAAf,CAAL,EAApD,CADa;AAElB,sBAAM;AAFY,aAAP,CAAf;;AAKA,qBACK,IADL,CACU,YAAM;AACR,2BAAW,GAAX,CAAe,aAAf,EAA8B,CAAC,WAAW,GAAX,CAAe,aAAf,CAA/B;AACA,uBAAK,GAAL,CAAS,OAAT,CAAiB,2BAAjB,EAA8C,EAAE,sBAAF,EAAc,gBAAd,EAA9C;AACH,aAJL,EAKK,IALL,CAKU;AAAA;;AAAA,mDAAI,MAAJ;AAAI,0BAAJ;AAAA;;AAAA,uBAAe,gBAAK,GAAL,EAAS,OAAT,eAAiB,wBAAjB,EAA2C,EAAE,sBAAF,EAAc,gBAAd,EAA3C,SAAuE,MAAvE,EAAf;AAAA,aALV,EAMK,MANL,CAMY;AAAA,uBAAM,OAAK,GAAL,CAAS,OAAT,CAAiB,uBAAjB,EAA0C,EAAE,sBAAF,EAAc,gBAAd,EAA1C,CAAN;AAAA,aANZ;;AAQA,mBAAO,QAAP;AACH;;;2CAEkB,U,EAAY,O,EAAS;AAAA;;AACpC,iBAAK,GAAL,CAAS,OAAT,CAAiB,4BAAjB,EAA+C,EAAE,sBAAF,EAAc,gBAAd,EAA/C;;AAEA,gBAAI,WAAW,EAAE,IAAF,CAAO;AAClB,qBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,IAAd,CAAmB,cAAnB,CAAkC,KAA7C,EAAoD,EAAC,IAAI,WAAW,GAAX,CAAe,IAAf,CAAL,EAApD,CADa;AAElB,sBAAM;AAFY,aAAP,CAAf;;AAKA,qBACK,IADL,CACU,YAAM;AACR,2BAAW,GAAX,CAAe,aAAf,EAA8B,CAAC,WAAW,GAAX,CAAe,aAAf,CAA/B;AACA,uBAAK,GAAL,CAAS,OAAT,CAAiB,8BAAjB,EAAiD,EAAE,sBAAF,EAAc,gBAAd,EAAjD;AACH,aAJL,EAKK,IALL,CAKU;AAAA;;AAAA,mDAAI,MAAJ;AAAI,0BAAJ;AAAA;;AAAA,uBAAe,gBAAK,GAAL,EAAS,OAAT,eAAiB,2BAAjB,EAA8C,EAAE,sBAAF,EAAc,gBAAd,EAA9C,SAA0E,MAA1E,EAAf;AAAA,aALV,EAMK,MANL,CAMY;AAAA,uBAAM,OAAK,GAAL,CAAS,OAAT,CAAiB,0BAAjB,EAA6C,EAAE,sBAAF,EAAc,gBAAd,EAA7C,CAAN;AAAA,aANZ;;AAQA,mBAAO,QAAP;AACH;;;;;;qBAGU,c;;;;;;;;;;;AChFf;;;;;;;;IAEqB,qB;AACjB,mCAAY,GAAZ,EAAiB;AAAA;;AAAA;;AACb,aAAK,GAAL,GAAW,GAAX;;AAEA,aAAK,GAAL,CACK,EADL,CACQ,iCADR,EAC4C;AAAA,mBAAe,MAAK,wBAAL,wBAAf;AAAA,SAD5C,EAEK,EAFL,CAEQ,oBAFR,EAE4C;AAAA,mBAAe,MAAK,cAAL,wBAAf;AAAA,SAF5C;AAIH;;;;iDAEwB,I,EAAM;AAC3B,gBAAI,yCAAJ,CAA6B,KAAK,kBAAlC,EAAsD,KAAK,oBAA3D;AACH;;;6CAE8B,K,EAAO,U,EAAY,W,EAAa;AAAA,gBAA9C,UAA8C,QAA9C,UAA8C;;AAC3D,gBAAI,WAAW,KAAK,KAAL,CAAW,MAAM,YAAN,IAAsB,IAAjC,CAAf;;AAEA,gBAAI,SAAS,cAAb,EAA6B;AACzB,qBAAK,GAAL,CAAS,OAAT,CAAiB,sBAAjB;AACH,aAFD,MAEO,IAAI,OAAJ,EAAa;AAChB,wBAAQ,IAAR,CAAa,OAAO,IAAP,CAAY,wBAAZ,CAAb,EAAoD,OAApD;AACH;AACJ;;;;;;qBAtBgB,qB;;;;;;;;;;;ACFrB;;;;;;;;IAEqB,I;AACjB,kBAAY,GAAZ,EAAiB,IAAjB,EAAuB;AAAA;;AACnB,aAAK,GAAL,GAAW,GAAX;AACA,aAAK,IAAL,GAAY,IAAZ;AACH;;;;kCAES,U,EAAY,O,EAAS;AAAA;;AAC3B,gBACI,OAAO,cAAP,CAAsB,SAAtB,CAAgC,YAAhC,KACA,OAAO,SAAP,CAAiB,SADjB,KAEC,CAAC,OAAO,cAAP,CAAsB,SAAtB,CAAgC,eAAhC,CAAD,IACG,CAAC,WAAW,GAAX,CAAe,YAAf,CAHL,CADJ,EAKE;AACE,oBAAI,yCAAJ,CAAiC,MAAjC;AACH,aAPD,MAOO,IAAI,KAAK,IAAL,CAAU,kBAAV,CAA6B,MAAjC,EAAyC;AAC5C;AACA,qBAAK,SAAL,CAAe,UAAf,EAA2B,OAA3B;AACH,aAHM,MAGA;AACH,qBAAK,IAAL,CAAU,MAAV,CAAiB,IAAjB,CAAsB,YAAM;AACxB,wBAAI,MAAK,IAAL,CAAU,kBAAV,CAA6B,MAAjC,EAAyC;AACrC,8BAAK,SAAL,CAAe,UAAf,EAA2B,OAA3B;AACH,qBAFD,MAEO;AACH,8BAAK,GAAL,CAAS,OAAT,CAAiB,0BAAjB,EAA6C;AACzC,kDADyC;AAEzC;AAFyC,yBAA7C;AAIH;AACJ,iBATD;AAUH;AACJ;;;mCAEU,U,EAAY,O,EAAS;AAAA;;AAC5B,mBAAO,EAAE,IAAF,CAAO;AACV,sBAAM,QADI;AAEV,qBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,eAAzB,EAA0C;AAC3C,6BAAS,WAAW;AADuB,iBAA1C;AAFK,aAAP,EAMF,IANE,CAMG,UAAC,QAAD,EAAc;AAChB,2BAAW,GAAX,CAAe,YAAf,EAA6B,MAA7B;AACA,uBAAK,GAAL,CAAS,OAAT,CAAiB,2BAAjB,EAA8C;AAC1C,0CAD0C;AAE1C;AAF0C,iBAA9C;AAIH,aAZE,EAaF,IAbE,CAaG,UAAC,KAAD,EAAQ,UAAR,EAAoB,WAApB,EAAoC;AACtC,2BAAW,GAAX,CAAe,YAAf,EAA6B,QAA7B;AACA,uBAAK,GAAL,CAAS,OAAT,CAAiB,wBAAjB,EAA2C;AACvC,gCADuC;AAEvC,0CAFuC;AAGvC,4CAHuC;AAIvC,0CAJuC;AAKvC;AALuC,iBAA3C;AAOH,aAtBE,EAuBF,QAvBE,CAuBO,YAAM;AACZ,uBAAK,GAAL,CAAS,OAAT,CAAiB,uBAAjB,EAA0C;AACtC,0CADsC;AAEtC;AAFsC,iBAA1C;AAIH,aA5BE,CAAP;AA6BH;;;kCAES,U,EAAY,O,EAAS;AAAA;;AAC3B,iBAAK,GAAL,CAAS,OAAT,CAAiB,kBAAjB,EAAqC;AACjC,sCADiC;AAEjC,uBAAO,KAAK,IAAL,CAAU,kBAFgB;AAGjC;AAHiC,aAArC;;AAMA,gBAAI,CAAC,QAAQ,cAAb,EAA6B;AACzB,2BAAW,GAAX,CAAe,YAAf,EAA6B,SAA7B;AACH;;AAT0B,0BAWF,MAXE;AAAA,gBAWrB,MAXqB,WAWrB,MAXqB;AAAA,gBAWb,MAXa,WAWb,MAXa;;;AAa3B,mBAAO,EAAE,IAAF,CAAO;AACV,qBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,cAAzB,CADK;AAEV,sBAAM,MAFI;AAGV,sBAAM;AACF,6BAAS,WAAW,EADlB;AAEF,2BAAO,KAAK,IAAL,CAAU,kBAFf;AAGF,8BAAU,UAAU,MAHlB;AAIF,kCACI,OAAO,cAAP,CAAsB,oBAAtB,KACA,OAAO,OAAP,CAAe,GAAf,CAAmB,oBAAnB,CADA,IAEA,EAAE,MAAF,EAAU,IAAV,CAAe,MAAf,CAFA,IAGA;AARF;AAHI,aAAP,EAcF,IAdE,CAcG,UAAC,QAAD,EAAc;AAChB,oBAAI,iBACA,CAAC,CAAC,QAAQ,cAAV,IACA,iBAAiB,IAAjB,CAAsB,OAAO,QAAP,CAAgB,IAAtC,CAFJ;AAGA,2BAAW,GAAX,CACI,YADJ,EAEI,iBAAiB,WAAjB,GAA+B,QAFnC;AAIA,uBAAK,GAAL,CAAS,OAAT,CAAiB,oBAAjB,EAAuC,EAAE,sBAAF,EAAc,gBAAd,EAAvC;AACH,aAvBE,EAwBF,IAxBE,CAwBG,UAAC,KAAD,EAAQ,UAAR,EAAoB,WAApB,EAAoC;AACtC,oBAAI,CAAC,QAAQ,cAAb,EAA6B;AACzB,+BAAW,GAAX,CAAe,YAAf,EAA6B,MAA7B;AACH;AACD,uBAAK,GAAL,CAAS,OAAT,CAAiB,iBAAjB,EAAoC;AAChC,gCADgC;AAEhC,0CAFgC;AAGhC,4CAHgC;AAIhC,0CAJgC;AAKhC;AALgC,iBAApC;AAOH,aAnCE,EAoCF,QApCE,CAoCO,YAAM;AACZ,uBAAK,GAAL,CAAS,OAAT,CAAiB,gBAAjB,EAAmC,EAAE,sBAAF,EAAc,gBAAd,EAAnC;AACH,aAtCE,CAAP;AAuCH;;;;;;qBAnHgB,I;;;;;;;;;;;ACFrB;;;;AACA;;;;AACA;;;;;;;;IAEqB,W;AACjB,yBAAY,GAAZ,EAAiB;AAAA;;AAAA;;AACb,aAAK,GAAL,GAAW,GAAX;;AAEA,aAAK,GAAL,CACK,EADL,CACQ,oBADR,EACoC,UAAC,IAAD;AAAA,mBAAU,MAAK,WAAL,CAAiB,IAAjB,CAAV;AAAA,SADpC,EAEK,EAFL,CAEQ,iBAFR,EAEoC,UAAC,IAAD;AAAA,mBAAU,MAAK,QAAL,CAAc,IAAd,CAAV;AAAA,SAFpC,EAGK,EAHL,CAGQ,0BAHR,EAGoC,UAAC,IAAD;AAAA,mBAAU,MAAK,cAAL,CAAoB,IAApB,CAAV;AAAA,SAHpC,EAIK,EAJL,CAIQ,qBAJR,EAIoC,UAAC,IAAD;AAAA,mBAAU,MAAK,kBAAL,CAAwB,KAAK,UAA7B,CAAV;AAAA,SAJpC,EAKK,EALL,CAKQ,wBALR,EAKoC,UAAC,IAAD;AAAA,mBAAU,MAAK,cAAL,CAAoB,IAApB,CAAV;AAAA,SALpC;;AAOA,aAAK,cAAL,GAAuB,OAAO,cAA9B;AACH;;;;oCAEW,I,EAAM;AAAA;;AACd,mBAAO,IAAP,CAAY,OAAZ,CAAoB,KAAK,UAAL,CAAgB,GAAhB,CAAoB,IAApB,CAApB,EAA+C,IAA/C,CAAoD,UAAC,QAAD,EAAc;AAC9D,qBAAK,UAAL,CAAgB,GAAhB,CAAoB;AAChB,gCAAY,SAAS,UADL;AAEhB,gCAAY,SAAS,UAFL;AAGhB,sCAAkB,SAAS;AAHX,iBAApB;AAKA,oBAAI,6BAAJ,CAAqB,EAAC,KAAI,OAAK,GAAV;AACjB,gCAAY,KAAK,UADA;AAEjB,2BAAO,OAAO,IAAP,CAAY,kBAFF;AAGjB,yCAAqB,OAAO,cAAP,CAAsB,uBAAtB,MAAmD,CAHvD,EAArB;AAIH,aAVD;AAWH;;;uCAE+B;AAAA,gBAArB,KAAqB,QAArB,KAAqB;AAAA,gBAAd,UAAc,QAAd,UAAc;;AAC5B,gBAAM,WAAW,KAAK,KAAL,CAAW,MAAM,YAAjB,CAAjB;;AAEA,gBAAI,SAAS,SAAT,KAAuB,gCAA3B,EAA6D;AACzD,qBAAK,GAAL,CAAS,OAAT,CAAiB,mBAAjB;AACH,aAFD,MAEO,IAAI,SAAS,cAAb,EAA6B;AAChC,qBAAK,GAAL,CAAS,OAAT,CAAiB,sBAAjB,EAAyC,EAAE,kBAAgB,WAAW,EAA7B,EAAzC;AACH,aAFM,MAEA,IAAI,SAAS,SAAT,KAAuB,mBAAvB,IAA8C,SAAS,SAAT,KAAuB,yBAAzE,EAAoG;AACvG,oBAAI,kCAAgC,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,YAAzB,CAAhC,uBAAwF,OAAO,IAAP,CAAY,OAAZ,CAAxF,SAAJ;AACA,qBAAK,WAAL,CAAiB,IAAjB,EAAuB,SAAS,SAAhC;AACH,aAHM,MAGA,IAAI,SAAS,SAAT,KAAuB,+BAAvB,IAA0D,SAAS,SAAT,KAAuB,wBAArF,EAA+G;AAClH,oBAAI,mCAAgC,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,cAAzB,CAAhC,uBAA0F,OAAO,IAAP,CAAY,sBAAZ,CAA1F,SAAJ;AACA,qBAAK,WAAL,CAAiB,KAAjB,EAAuB,SAAS,SAAhC;AACH,aAHM,MAGA,IAAI,SAAS,SAAT,KAAuB,0BAA3B,EAAsD;AACzD,oBAAI,yCAAJ,CAAiC,MAAjC;AACH,aAFM,MAEA,IAAI,SAAS,SAAb,EAAwB;AAC3B,qBAAK,WAAL,CAAiB,EAAjB,EAAqB,SAAS,SAA9B;AACH,aAFM,MAEA,IAAI,OAAJ,EAAa;AAChB,wBAAQ,IAAR,cAAwB,OAAO,IAAP,CAAY,cAAZ,CAAxB,gBAAgE,OAAhE;AACH;AACJ;;;8CAEuE;AAAA,gBAAvD,KAAuD,SAAvD,KAAuD;AAAA,gBAAhD,UAAgD,SAAhD,UAAgD;AAAA,gBAApC,WAAoC,SAApC,WAAoC;AAAA,gBAAvB,UAAuB,SAAvB,UAAuB;AAAA,gBAAX,OAAW,SAAX,OAAW;;AACpE,gBAAI,WAAW,KAAK,KAAL,CAAW,MAAM,YAAjB,CAAf;AACA,gBAAG,SAAS,cAAZ,EAA2B;AACvB,qBAAK,GAAL,CAAS,OAAT,CAAiB,sBAAjB;AACH,aAFD,MAEO,IAAI,OAAJ,EAAa;AAChB,wBAAQ,IAAR,cAAwB,OAAO,IAAP,CAAY,cAAZ,CAAxB,kBAAgE,OAAO,IAAP,CAAY,WAAW,SAAS,SAAhC,CAAhE,EAA8G,OAA9G;AACH;AAEJ;;;oCAEW,Q,EAAU,S,EAAW;AAC7B,gBAAI,OAAJ,EAAa,QAAQ,IAAR,cAAwB,OAAO,IAAP,CAAY,cAAZ,CAAxB,kBAAgE,OAAO,IAAP,YAAqB,SAArB,EAAkC,EAAC,MAAM,QAAP,EAAlC,CAAhE,EAAuH,OAAvH;AAChB;;;8CAEuC;AAAA,gBAAvB,UAAuB,SAAvB,UAAuB;AAAA,gBAAX,OAAW,SAAX,OAAW;;AACpC,gBAAI,OAAO,cAAP,CAAsB,SAAtB,CAAgC,YAAhC,CAAJ,EAAkD;AAC9C,oBAAI,OAAO,SAAP,CAAiB,SAAjB,IAA8B,CAAC,KAAK,cAAL,CAAoB,SAApB,CAA8B,eAA9B,CAAnC,EAAmF;AAC/E,wBAAI,yCAAJ,CAAiC,MAAjC;AACH,iBAFD,MAEO;AACH,wBAAI,sBAAJ,CAAc;AACV,6BAAK,KAAK,GADA;AAEV,8CAFU;AAGV;AAHU,qBAAd;AAKH;AACJ,aAVD,MAUO;AACH,oBAAI,sBAAJ,CAAc,EAAC,KAAK,KAAK,GAAX,EAAgB,sBAAhB,EAA4B,gBAA5B,EAAd;AACH;AAGJ;;;;;;qBAhFgB,W;;;;;;;;;;;;;ICJf,I;AACF,kBAAY,GAAZ,EAAiB;AAAA;;AAAA;;AACb,aAAK,GAAL,GAAW,GAAX;;AAEA,aAAK,GAAL,CAAS,EAAT,CAAY,0BAAZ,EAAwC,UAAC,IAAD;AAAA,mBAAU,MAAK,cAAL,CAAoB,KAAK,KAAzB,CAAV;AAAA,SAAxC;AACH;;;;mCAEU,K,EAAO;AACd,gBAAI,QAAQ,GAAR,CAAY,mBAAZ,MAAqC,GAAzC,EAA8C;AAC1C,qBAAK,SAAL,CAAe,KAAf;AACH,aAFD,MAEO;AACH,qBAAK,GAAL,CAAS,OAAT,CAAiB,yBAAjB,EAA6C,EAAE,YAAY,KAAd,EAA7C;AACH;AACJ;;;kCAES,K,EAAO;AAAA;;AACb,kBAAM,GAAN,CAAU,YAAV,EAAwB,SAAxB;AACA,iBAAK,GAAL,CAAS,OAAT,CAAiB,kBAAjB,EAAqC,KAArC;;AAEA,mBAAO,EAAE,IAAF,CAAO;AACV,qBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,WAAzB,EAAsC;AACvC,6BAAS,MAAM;AADwB,iBAAtC,CADK;AAIV,sBAAM;AAJI,aAAP,EAMN,IANM,CAMD,UAAC,QAAD;AAAA,uBAAc,OAAK,YAAL,CAAkB,KAAlB,EAAyB,QAAzB,CAAd;AAAA,aANC,EAON,IAPM,CAOD,UAAC,KAAD,EAAQ,UAAR,EAAoB,WAApB;AAAA,uBAAoC,OAAK,YAAL,CAAkB,KAAlB,EAAyB,KAAzB,EAAgC,UAAhC,EAA4C,WAA5C,CAApC;AAAA,aAPC,EAQN,QARM,CAQG,YAAM;AAAE,uBAAK,GAAL,CAAS,OAAT,CAAiB,gBAAjB,EAAmC,KAAnC;AAA4C,aARvD,CAAP;AASH;;;qCAEY,K,EAAO;AAChB,kBAAM,GAAN,CAAU,YAAV,EAAwB,UAAxB;AACA,iBAAK,GAAL,CAAS,OAAT,CAAiB,oBAAjB,EAAuC,EAAC,YAAY,KAAb,EAAvC;AACH;;;qCAEY,K,EAAO,K,EAAO,U,EAAY,W,EAAa;AAChD,kBAAM,GAAN,CAAU,YAAV,EAAwB,MAAxB;;AAEA,iBAAK,GAAL,CAAS,OAAT,CAAiB,iBAAjB,EAAoC,EAAC,YAAD,EAAQ,sBAAR,EAAoB,wBAApB,EAAiC,YAAY,KAA7C,EAApC;AACH;;;uCAEc,U,EAAY;AACvB,oBAAQ,GAAR,CAAY,mBAAZ,EAAiC,GAAjC;AACA,iBAAK,SAAL,CAAe,UAAf;AACH;;;;;;qBAGU,I;;;;;;;;;;;AC/Cf;;;;;;;;IAEM,W;AACF,yBAAY,GAAZ,EAAiB;AAAA;;AAAA;;AACb,aAAK,GAAL,GAAW,GAAX;;AAEA,aAAK,GAAL,CACK,EADL,CACQ,oBADR,EACoC,UAAC,IAAD;AAAA,mBAAU,MAAK,WAAL,CAAiB,IAAjB,CAAV;AAAA,SADpC,EAEK,EAFL,CAEQ,iBAFR,EAEoC,UAAC,IAAD;AAAA,mBAAU,MAAK,QAAL,CAAc,IAAd,CAAV;AAAA,SAFpC,EAGK,EAHL,CAGQ,yBAHR,EAGoC,UAAC,IAAD;AAAA,mBAAU,MAAK,kBAAL,CAAwB,KAAK,UAA7B,CAAV;AAAA,SAHpC;AAIH;;;;oCAEW,I,EAAM;AACd,mBAAO,QAAP,CAAgB,IAAhB,GAAuB,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,aAAzB,EAAwC,EAAC,QAAQ,kBAAT,EAA6B,SAAS,KAAK,UAAL,CAAgB,EAAtD,EAAxC,CAAvB;AACH;;;iCAEQ,I,EAAM;AACX,gBAAM,WAAW,KAAK,KAAL,CAAW,KAAK,KAAL,CAAW,YAAtB,CAAjB;;AAEA,gBAAI,SAAS,SAAT,KAAuB,gCAA3B,EAA6D;AACzD,qBAAK,GAAL,CAAS,OAAT,CAAiB,mBAAjB;AACH,aAFD,MAGK,IAAI,SAAS,SAAT,KAAuB,wCAA3B,EAAqE;AACtE,oBAAM,OAAO,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,YAAzB,CAAb;AACA,oBAAM,WAAW,OAAO,IAAP,CAAY,OAAZ,CAAjB;AACA,oBAAM,kCAAgC,IAAhC,uBAAsD,QAAtD,SAAN;AACA,oBAAI,OAAJ,EAAa,QAAQ,IAAR,cAAwB,OAAO,IAAP,CAAY,cAAZ,CAAxB,kBAAgE,OAAO,IAAP,YAAqB,SAAS,SAA9B,EAA2C,EAAC,UAAD,EAA3C,CAAhE,EAAsH,OAAtH;AAChB,aALI,MAMA,IAAI,SAAS,cAAb,EAA6B;AAC9B,qBAAK,GAAL,CAAS,OAAT,CAAiB,sBAAjB;AACH;AACJ;;;2CAEkB,U,EAAY;AAC3B,gBAAI,0BAAJ,CAAc,KAAK,GAAnB,EAAwB,UAAxB;AACH;;;;;;qBAGU,W;;;;;;;;;;;;;ICrCT,U;AACF,wBAAY,GAAZ,EAAiB;AAAA;;AACb,aAAK,GAAL,GAAW,GAAX;AACH;;;;uCAEc,K,EAAO;AAClB,gBAAI,MAAM,GAAN,CAAU,gBAAV,IAA8B,CAAlC,EAAqC;AACjC;AACA,qBAAK,cAAL,CAAoB,KAApB;AACH,aAHD,MAGO;AACH;AACA,qBAAK,iBAAL,CAAuB,KAAvB;AACH;AACJ;;;uCAEc,K,EAAO;AAAA;;AAClB,mBAAO,EAAE,IAAF,CAAO;AACV,qBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,sBAAzB,EAAiD,EAAC,SAAS,MAAM,GAAN,CAAU,IAAV,CAAV,EAAjD,CADK;AAEV,sBAAM,KAFI;AAGV,sBAAM,EAAC,QAAQ,MAAM,GAAN,CAAU,gBAAV,CAAT,EAHI;AAIV,yBAAS;AAJC,aAAP,EAMN,IANM,CAMD,UAAC,KAAD,EAAQ,UAAR,EAAoB,WAApB;AAAA,uBAAoC,MAAK,aAAL,CAAmB,KAAnB,EAA0B,KAA1B,EAAiC,UAAjC,EAA6C,WAA7C,CAApC;AAAA,aANC,CAAP;AAOH;;;0CAEiB,K,EAAO;AAAA;;AACrB,mBAAO,EAAE,IAAF,CAAO;AACV,qBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,sBAAzB,EAAiD,EAAC,SAAS,MAAM,GAAN,CAAU,IAAV,CAAV,EAAjD,CADK;AAEV,sBAAM,QAFI;AAGV,yBAAS;AAHC,aAAP,EAKN,IALM,CAKD,UAAC,KAAD,EAAQ,UAAR,EAAoB,WAApB;AAAA,uBAAoC,OAAK,aAAL,CAAmB,KAAnB,EAA0B,KAA1B,EAAiC,UAAjC,EAA6C,WAA7C,CAApC;AAAA,aALC,CAAP;AAMH;;;sCAEa,K,EAAO,K,EAAO,U,EAAY,W,EAAa;AACjD,iBAAK,GAAL,CAAS,OAAT,CAAiB,mBAAjB,EAAsC,EAAC,YAAD,EAAQ,YAAR,EAAe,sBAAf,EAA2B,wBAA3B,EAAtC;AACH;;;;;;qBAGU,U;;;;;;;;;;;;;ICvCT,iB;AACF,+BAAY,GAAZ,EAAiB;AAAA;;AAAA;;AACb,aAAK,GAAL,GAAW,GAAX;;AAEA,aAAK,GAAL,CAAS,EAAT,CAAY,mBAAZ,EAAiC,UAAC,IAAD;AAAA,mBAAU,MAAK,UAAL,CAAgB,IAAhB,CAAV;AAAA,SAAjC;AACH;;;;mCAEU,I,EAAM;AACb,gBAAI,iBAAJ;AACA,gBAAI;AACA,2BAAW,KAAK,KAAL,CAAW,KAAK,KAAL,CAAW,YAAtB,CAAX;AACH,aAFD,CAEE,OAAO,EAAP,EAAU;AACR,2BAAW,EAAX;AACH;;AAED,gBAAI,SAAS,cAAb,EAA4B;AACxB,qBAAK,GAAL,CAAS,OAAT,CAAiB,sBAAjB;AACH,aAFD,MAEO;AACH,oBAAI,kCAAgC,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,cAAzB,CAAhC,uBAA0F,OAAO,IAAP,CAAY,sBAAZ,CAA1F,SAAJ;AACA,wBAAQ,IAAR,cAAwB,OAAO,IAAP,CAAY,cAAZ,CAAxB,kBAAgE,OAAO,IAAP,CAAY,2BAAZ,EAAyC,EAAC,UAAD,EAAzC,CAAhE,EAAoH,OAApH;AACH;AACJ;;;;;;qBAGU,iB;;;;;;;;;;;ACzBf;;;;;;;;IAEqB,a;AACjB,2BAAY,GAAZ,EAAiB;AAAA;;AAAA;;AACb,aAAK,GAAL,GAAW,GAAX;;AAEA,aAAK,GAAL,CACK,EADL,CACQ,sBADR,EACgC,UAAC,IAAD;AAAA,mBAAU,MAAK,eAAL,CAAqB,IAArB,CAAV;AAAA,SADhC,EAEK,EAFL,CAEQ,mBAFR,EAE6B;AAAA,mBAAM,MAAK,+BAAL,EAAN;AAAA,SAF7B,EAGK,EAHL,CAGQ,gBAHR,EAG0B,UAAC,IAAD;AAAA,mBAAU,MAAK,cAAL,CAAoB,KAAK,MAAzB,CAAV;AAAA,SAH1B;AAIH;;;;wCAEe,I,EAAM;AAClB,gBAAI,aAAa,OAAO,QAAP,CAAgB,QAAhB,GAA2B,OAAO,QAAP,CAAgB,MAA5D;AACA,gBAAI,QAAQ,KAAK,MAAjB,EAAwB;AACpB,2CAAyB,mBAAmB,KAAK,MAAxB,CAAzB;AACH;AACD,gBAAI,gCAAJ,CAAwB,UAAxB;AACH;;;uCAEc,M,EAAQ;AACnB,gBAAI,CAAC,OAAO,cAAP,CAAsB,SAAtB,CAAgC,gBAAhC,CAAL,EAAuD;AACnD,oBAAM,aAAa,OAAO,QAAP,CAAgB,QAAhB,GAA2B,OAAO,QAAP,CAAgB,MAAhB,CAAuB,OAAvB,CAA+B,qCAA/B,EAAsE,EAAtE,CAA9C;AACA,oBAAM,sBAAsB,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,oBAAzB,EAA+C,EAAC,SAAS,UAAV,EAAsB,cAAtB,EAA/C,CAA5B;AACA,kBAAE,kBAAF,EAAsB,IAAtB,CAA2B,MAA3B,EAAmC,mBAAnC;AACA,kBAAE,kBAAF,EAAsB,UAAtB,CAAiC,QAAjC,EAA2C,MAA3C;AACH;AACJ;;;0DAEiC;AAC9B,gBAAI,OAAO,SAAP,CAAiB,QAAjB,KAA8B,SAA9B,IAA2C,OAAO,cAAP,CAAsB,SAAtB,CAAgC,qBAAhC,CAA/C,EAAuG;AACnG,oBAAI,gCAAJ;AACH,aAFD,MAEO;AACH;AACA,kBAAE,sBAAF,EAA0B,UAA1B,CAAqC,QAArC,EAA+C,MAA/C;AACH;AACJ;;;;;;qBAlCgB,a;;;;;;;;;;;;;ICFf,Q;AACF,sBAAY,GAAZ,EAAiB;AAAA;;AACb,aAAK,GAAL,GAAW,GAAX;AACH;;;;uCAEc,U,EAAY,O,EAAS;AAAA;;AAChC,gBAAI,SAAS,WAAW,GAAX,CAAe,eAAf,MAAoC,aAApC,GAAoD,KAApD,GAA4D,QAAzE;;AAEA,iBAAK,GAAL,CAAS,OAAT,CAAiB,sBAAjB,EAAyC,EAAE,sBAAF,EAAc,cAAd,EAAzC;;AAEA,gBAAI,UAAU,IAAI,OAAJ,CAAY,UAAC,OAAD,EAAU,MAAV,EAAqB;AAC3C,oBAAI,WAAW,GAAX,CAAe,eAAf,MAAoC,aAAxC,EAAuD;AACnD,0BAAK,gBAAL,CAAsB,UAAtB,EACK,IADL,CACU,OADV,EAEK,IAFL,CAEU,UAAC,KAAD;AAAA,+BAAW,OAAO,EAAE,YAAF,EAAS,sBAAT,EAAP,CAAX;AAAA,qBAFV;AAGH,iBAJD,MAIO;AACH,0BAAK,mBAAL,CAAyB,UAAzB,EACK,IADL,CACU,OADV,EAEK,IAFL,CAEU,UAAC,KAAD;AAAA,+BAAW,OAAO,EAAE,YAAF,EAAS,sBAAT,EAAP,CAAX;AAAA,qBAFV;AAGH;AACJ,aAVa,CAAd;;AAYA,oBACK,IADL,CACU;AAAA;;AAAA,kDAAI,MAAJ;AAAI,0BAAJ;AAAA;;AAAA,uBAAiB,cAAK,GAAL,EAAS,OAAT,cAAiB,wBAAjB,EAA2C,EAAE,sBAAF,EAAc,cAAd,EAAsB,gBAAtB,EAA3C,SAA+E,MAA/E,EAAjB;AAAA,aADV,WAEW,YAAgB;AAAA;;AAAA,mDAAZ,MAAY;AAAZ,0BAAY;AAAA;;AAAA,oBACb,KADa,GACH,CAAC,OAAO,MAAP,IAAiB,MAAjB,IAA2B,CAAC,EAAD,CAA5B,EAAkC,CAAlC,CADG,CACb,KADa;;;AAGnB,sBAAK,gBAAL,CAAsB,UAAtB,EAAkC,KAAlC;AACA,+BAAK,GAAL,EAAS,OAAT,eAAiB,qBAAjB,EAAwC,EAAE,sBAAF,EAAc,cAAd,EAAsB,gBAAtB,EAAxC,SAA4E,MAA5E;AACH,aAPL,EAQK,IARL,CAQU;AAAA,uBAAM,MAAK,GAAL,CAAS,OAAT,CAAiB,oBAAjB,EAAuC,EAAE,sBAAF,EAAc,cAAd,EAAsB,gBAAtB,EAAvC,CAAN;AAAA,aARV;;AAUA,mBAAO,OAAP;AACH;;;yCAEgB,U,EAAY,O,EAAS;AAAA;;AAClC,iBAAK,GAAL,CAAS,OAAT,CAAiB,0BAAjB,EAA6C,EAAE,sBAAF,EAAc,gBAAd,EAA7C;;AAEA,gBAAI,WAAW,EAAE,IAAF,CAAO;AAClB,qBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,kBAAzB,EAA6C,EAAC,SAAS,WAAW,EAArB,EAA7C,CADa;AAElB,sBAAM;AAFY,aAAP,CAAf;;AAKA,qBACK,IADL,CACU,YAAM;AACR,2BAAW,GAAX,CAAe,eAAf,EAAgC,gBAAhC;AACA,uBAAK,GAAL,CAAS,OAAT,CAAiB,4BAAjB,EAA+C,EAAE,sBAAF,EAAc,gBAAd,EAA/C;AACH,aAJL,EAKK,IALL,CAKU;AAAA;;AAAA,mDAAI,MAAJ;AAAI,0BAAJ;AAAA;;AAAA,uBAAe,gBAAK,GAAL,EAAS,OAAT,eAAiB,yBAAjB,EAA4C,EAAE,sBAAF,EAAc,gBAAd,EAA5C,SAAwE,MAAxE,EAAf;AAAA,aALV,EAMK,MANL,CAMY;AAAA,uBAAM,OAAK,GAAL,CAAS,OAAT,CAAiB,wBAAjB,EAA2C,EAAE,sBAAF,EAAc,gBAAd,EAA3C,CAAN;AAAA,aANZ;;AAQA,mBAAO,QAAP;AACH;;;4CAEmB,U,EAAY,O,EAAS;AAAA;;AACrC,iBAAK,GAAL,CAAS,OAAT,CAAiB,6BAAjB,EAAgD,EAAE,sBAAF,EAAc,gBAAd,EAAhD;;AAEA,gBAAI,WAAW,EAAE,IAAF,CAAO;AAClB,qBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,qBAAzB,EAAgD,EAAC,SAAS,WAAW,EAArB,EAAhD,CADa;AAElB,sBAAM;AAFY,aAAP,CAAf;;AAKA,qBACK,IADL,CACU,YAAM;AACR,2BAAW,GAAX,CAAe,eAAf,EAAgC,aAAhC;AACA,uBAAK,GAAL,CAAS,OAAT,CAAiB,+BAAjB,EAAkD,EAAE,sBAAF,EAAc,gBAAd,EAAlD;AACH,aAJL,EAKK,IALL,CAKU;AAAA;;AAAA,mDAAI,MAAJ;AAAI,0BAAJ;AAAA;;AAAA,uBAAe,gBAAK,GAAL,EAAS,OAAT,eAAiB,4BAAjB,EAA+C,EAAE,sBAAF,EAAc,gBAAd,EAA/C,SAA2E,MAA3E,EAAf;AAAA,aALV,EAMK,MANL,CAMY;AAAA,uBAAM,OAAK,GAAL,CAAS,OAAT,CAAiB,2BAAjB,EAA8C,EAAE,sBAAF,EAAc,gBAAd,EAA9C,CAAN;AAAA,aANZ;;AAQA,mBAAO,QAAP;AACH;;;yCAEgB,U,EAAY,K,EAAO;AAChC,gBAAI,MAAM,YAAN,IAAsB,KAAK,KAAL,CAAW,MAAM,YAAjB,EAA+B,cAAzD,EAAyE;AACrE,qBAAK,GAAL,CAAS,OAAT,CAAiB,sBAAjB;AACH,aAFD,MAEO;AACH,wBAAQ,IAAR,CAAa,OAAO,IAAP,CAAY,wBAAZ,CAAb,EAAoD,OAApD;AACH;AACJ;;;;;;qBAGU,Q;;;;;;;;;;;AClFf;;;;;;;;IAEqB,uB;AACjB,qCAAY,uBAAZ,EAAoC;AAAA;;AAAA;;AAChC,aAAK,uBAAL,GAA+B,uBAA/B;;AAEA,UAAE,kEAAF,EAAsE,EAAtE,CAAyE,OAAzE,EAAkF,UAAC,CAAD;AAAA,mBAAO,MAAK,yBAAL,CAA+B,CAA/B,CAAP;AAAA,SAAlF;AACA,UAAE,iCAAF,EAAqC,EAArC,CAAwC,OAAxC,EAAiD;AAAA,mBAAM,MAAK,kBAAL,EAAN;AAAA,SAAjD;AACH;;;;6CAEoB;AACjB,iBAAK,uBAAL,CAA6B,sBAA7B;AACA,iBAAK,IAAL;AACH;;;kDAE0B,C,EAAE;AACzB,gBAAI,cAAc,KAAK,cAAL,CAAoB,EAAE,aAAtB,CAAlB;;AAEA,gBAAI,CAAC,KAAK,uBAAL,CAA6B,UAA7B,CAAwC,WAAxC,CAAL,EAA0D;AACtD,qBAAK,uBAAL,CAA6B,KAA7B,CAAmC,WAAnC;AACA,qBAAK,IAAL;AACH;;AAED,iBAAK,qBAAL,CAA2B,WAA3B;AACA,iBAAK,mBAAL,GATyB,CASG;AAC/B;;;uCAEc,O,EAAQ;AACnB,gBAAI,SAAS,KAAK,qBAAL,CAA2B,OAA3B,CAAb;AACA,mBAAO,OAAO,UAAP,CAAkB,mBAAlB,EAAuC,KAA9C;AACH;;;8CAEqB,W,EAAY;AAC9B,uCAAyB,WAAzB,SAA0C,WAA1C,CAAsD,YAAtD;AACH;;;8CAEqB,c,EAAe;AACjC,gBAAI,EAAE,cAAF,EAAkB,QAAlB,CAA2B,oBAA3B,CAAJ,EAAsD;AAClD,uBAAO,cAAP;AACH,aAFD,MAGK;AACD,oBAAI,gBAAgB,EAAE,cAAF,EAAkB,OAAlB,CAA0B,qBAA1B,EAAiD,KAAjD,EAApB;AACA,oBAAI,CAAC,aAAD,IAAkB,cAAc,MAAd,KAAyB,CAA/C,EAAiD;AAC7C,0BAAM,IAAI,KAAJ,CAAU,mDAAV,CAAN;AACH;AACD,uBAAO,cAAc,CAAd,CAAP;AACH;AACJ;;;8CAEoB;AACjB,gBAAI,CAAC,KAAK,uBAAL,CAA6B,uBAAlC,EAA2D;AACvD,kBAAE,wBAAF,EAA4B,WAA5B,CAAwC,2BAAxC;AACH;AACJ;;;+BAEM;AACH,gBAAI,aAAa,0BAAa,eAA9B;AACA,oBAAQ,GAAR,CAAY,WAAW,IAAvB,EAA6B,KAAK,uBAAL,CAA6B,KAA1D,EAAiE,EAAE,SAAS,IAAI,IAAJ,CAAS,KAAK,GAAL,KAAa,WAAW,UAAjC,CAAX,EAAjE;;AAEA,gBAAG,OAAO,SAAP,CAAiB,eAApB,EAAqC;AACjC,kBAAE,IAAF,CAAO;AACH,yBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,WAAzB,CADF;AAEH,0BAAM,OAFH;AAGH,iCAAc,kBAHX;AAIH,0BAAM,KAAK,SAAL,CAAe,EAAE,iBAAiB,KAAK,uBAAL,CAA6B,KAAhD,EAAf,CAJH;AAKH,yBALG,iBAKG,KALH,EAKU,UALV,EAKsB,WALtB,EAKmC;AAClC,+BAAO,MAAP,CAAc,GAAd,CAAkB,OAAlB,EAA2B,0DAA3B,EAAsF,EAAC,QAAQ,UAAT,EAAqB,OAAO,WAA5B,EAAtF;AACH;AAPE,iBAAP;AASH;AACJ;;;;;;qBApEgB,uB;;;;;;;ACFrB;AACA,QAAQ,MAAR,GAAiB,UAAS,QAAT,EAAmB;AAAA,QAC1B,iBAD0B,GAE5B,2BAAY,SAAZ,EAAuB,KAAvB,EAA8B;AAAA;;AAC1B,aAAK,SAAL,GAAiB,SAAjB;AACA,aAAK,KAAL,GAAa,KAAb;AACH,KAL2B;;AAQhC,WAAO,QAAQ,GAAR,CAAY,SAAS,GAAT,CAAa,UAAC,CAAD;AAAA;AAC5B;AACA,oBAAQ,OAAR,CAAgB,CAAhB,EAAmB,IAAnB,CAAwB,UAAC,GAAD;AAAA,uBAAS,IAAI,iBAAJ,CAAsB,IAAtB,EAA4B,GAA5B,CAAT;AAAA,aAAxB,WAAyE,UAAC,GAAD;AAAA,uBAAS,IAAI,iBAAJ,CAAsB,KAAtB,EAA6B,GAA7B,CAAT;AAAA,aAAzE;AAF4B;AAAA,KAAb,CAAZ,CAAP;AAGH,CAXD;;AAaA;AACA,QAAQ,IAAR,GAAe,UAAS,OAAT,EAAkB;AAC7B,WAAO,IAAI,OAAJ,CAAY,UAAC,OAAD,EAAU,MAAV;AAAA,eACf,EAAE,IAAF,CAAO,OAAP,EACK,IADL,CACU,UAAC,QAAD;AAAA,mBAAc,QAAQ,QAAR,CAAd;AAAA,SADV,EAEK,IAFL,CAEU,UAAC,GAAD,EAAM,MAAN,EAAc,GAAd;AAAA,mBAAsB,OAAO,GAAP,CAAtB;AAAA,SAFV,CADe;AAAA,KAAZ,CAAP;AAKH,CAND;;;;;;;;;ACfA;;;;;;AACA;;;;AAIA,IAAM,sBAAsB,SAAtB,mBAAsB,CAAS,CAAT,EAAY;AACpC,QAAI,EAAE,KAAF,KAAY,sBAAS,IAAzB,EAA+B;AAC3B,UAAE,cAAF;AACA,YAAI,EAAE,EAAE,MAAJ,EAAY,EAAZ,CAAe,IAAf,CAAJ,EAA0B;AACtB,cAAE,iCAAF,EAAqC,KAArC;AACH,SAFD,MAEO;AACH,cAAE,EAAE,MAAJ,EAAY,UAAZ;AACH;AACJ;AACD,QAAI,EAAE,KAAF,KAAY,sBAAS,EAAzB,EAA6B;AACzB,UAAE,cAAF;AACA,UAAE,EAAE,MAAJ,EAAY,UAAZ,CAAuB,CAAC,CAAxB;AACH;;AAED,MAAE,eAAF;AACH,CAfD;;qBAiBe,mB;;;;;;;;ACtBf,IAAM,0BAA0B,SAA1B,uBAA0B,CAAS,CAAT,EAAY,EAAZ,EAAgB;AAC5C,QAAM,QAAQ,EAAE,EAAF,EAAM,QAAN,CAAe,kBAAf,CAAd;AACA,QAAM,YAAY,EAAE,EAAF,EAAM,CAAN,EAAS,qBAAT,GAAiC,KAAnD;AACA,QAAM,aAAa,MAAM,CAAN,EAAS,qBAAT,GAAiC,KAApD;AACA,QAAM,cAAc,MAAM,MAA1B;;AAEA,QAAI,EAAE,EAAF,EAAM,UAAN,OAAuB,CAA3B,EAA8B;AAC1B,UAAE,EAAF,EAAM,MAAN,GAAe,QAAf,CAAwB,uBAAxB,EAAiD,GAAjD,CAAqD,YAArD,EAAmE,QAAnE;AACH,KAFD,MAEO;AACH,UAAE,EAAF,EAAM,MAAN,GAAe,QAAf,CAAwB,uBAAxB,EAAiD,GAAjD,CAAqD,YAArD,EAAmE,SAAnE;AACH;;AAED,QAAI,EAAE,EAAF,EAAM,UAAN,KAAqB,SAArB,IAAmC,aAAa,WAAd,GAA8B,cAAc,GAAlF,EAAwF;AACpF,UAAE,EAAF,EAAM,MAAN,GAAe,QAAf,CAAwB,wBAAxB,EAAkD,GAAlD,CAAsD,YAAtD,EAAoE,QAApE;;AAEA;AACA,YAAI,OAAO,SAAP,KAAqB,CAAzB,EAA4B;AACxB,mBAAO,SAAP,GAAmB,EAAE,EAAF,EAAM,UAAN,EAAnB;AACH,SAFD,MAEO;AACH,cAAE,EAAF,EAAM,UAAN,CAAiB,OAAO,SAAxB;AACA,mBAAO,SAAP,GAAmB,CAAnB;AACH;AACJ,KAVD,MAUO;AACH,UAAE,EAAF,EAAM,MAAN,GAAe,QAAf,CAAwB,wBAAxB,EAAkD,GAAlD,CAAsD,YAAtD,EAAoE,SAApE;AACH;AACJ,CAzBD;;qBA2Be,uB;;;;;;;;AC3Bf,IAAM,0BAA0B,SAA1B,uBAA0B,CAAS,EAAT,EAAa;AACzC,QAAM,QAAQ,EAAE,EAAF,EAAM,QAAN,CAAe,kBAAf,CAAd;AACA,QAAM,cAAc,MAAM,MAA1B;AACA,QAAM,aAAa,MAAM,CAAN,EAAS,qBAAT,GAAiC,KAApD;AACA,QAAM,YAAY,EAAE,EAAF,EAAM,CAAN,EAAS,qBAAT,GAAiC,KAAnD;;AAEA,MAAE,EAAF,EAAM,MAAN,GAAe,QAAf,CAAwB,wBAAxB,EAAkD,GAAlD,CAAsD,YAAtD,EAAoE,SAApE;;AAEA,QAAK,cAAc,UAAf,IAA8B,SAAlC,EAA6C;AACzC,UAAE,EAAF,EAAM,MAAN,GAAe,QAAf,CAAwB,uBAAxB,EAAiD,GAAjD,CAAqD,YAArD,EAAmE,QAAnE;AACA,UAAE,EAAF,EAAM,MAAN,GAAe,QAAf,CAAwB,wBAAxB,EAAkD,GAAlD,CAAsD,YAAtD,EAAoE,QAApE;AACH;AACJ,CAZD;;qBAce,uB;;;;;;;;ACdf;;;AAGA,IAAM,cAAc,SAAd,WAAc,CAAS,CAAT,EAAY,SAAZ,EAAuB,KAAvB,EAA8B;AAC9C,QAAI,cAAc,MAAlB,EAA0B;AACtB,eAAO,KAAK,IAAL,CAAU,IAAI,KAAd,IAAuB,KAA9B;AACH;AACD,WAAO,KAAK,KAAL,CAAW,IAAI,KAAf,IAAwB,KAA/B;AACH,CALD;;qBAOe,W;;;;;;;;;ACVf;;;;;;AAEA;;;;;AAKA,IAAM,iBAAiB,SAAjB,cAAiB,CAAS,SAAT,EAAoB,IAApB,EAA0B;AAC7C,QAAM,QAAQ,EAAE,IAAF,EAAQ,QAAR,CAAiB,kBAAjB,CAAd;AACA,QAAM,YAAY,KAAK,CAAL,EAAQ,qBAAR,GAAgC,KAAlD;AACA,QAAM,aAAa,MAAM,CAAN,EAAS,qBAAT,GAAiC,KAApD;AACA,QAAM,cAAc,MAAM,MAA1B;;AAEA;AACA,QAAM,YAAY,KAAK,IAAL,CAAU,KAAK,UAAL,KAAoB,UAA9B,CAAlB;;AAEA;AACA,QAAM,eAAe,CAAC,YAAY,CAAb,IAAkB,CAAvC;;AAEA,QAAI,cAAc,OAAlB,EAA2B;AACvB,YAAI,KAAK,UAAL,KAAoB,SAApB,GAAiC,aAAa,WAAlD,EAAgE;AAC5D,gBAAM,IAAI,8BAAY,KAAK,UAAL,EAAZ,EAA+B,OAA/B,EAAwC,UAAxC,CAAV;AACA,gBAAM,IAAI,8BAAY,SAAZ,EAAuB,OAAvB,EAAgC,UAAhC,CAAV;AACA,gBAAM,aAAa,IAAI,CAAJ,GAAQ,YAA3B;AACA,iBAAK,OAAL,CAAa,EAAC,sBAAD,EAAb;AACH;AACJ,KAPD,MAOO;AACH;AACA,YAAI,WAAW,CAAf;AACA,YAAI,8BAAY,KAAK,UAAL,EAAZ,EAA+B,MAA/B,EAAuC,UAAvC,IAAqD,KAAK,UAAL,EAArD,GAAyE,GAA7E,EAAkF;AAC9E,wBAAY,UAAZ;AACH;AACD,YAAM,KAAI,8BAAY,KAAK,UAAL,EAAZ,EAA+B,MAA/B,EAAuC,UAAvC,CAAV;AACA,YAAM,KAAI,CAAC,SAAX;AACA,YAAM,IAAI,YAAV;AACA,YAAM,IAAI,CAAC,EAAX;AACA,YAAM,IAAI,CAAC,QAAX;AACA,YAAM,cAAa,KAAI,EAAJ,GAAQ,CAAR,GAAY,CAAZ,GAAgB,CAAnC;AACA,aAAK,OAAL,CAAa,EAAC,uBAAD,EAAb;AACH;AACJ,CAjCD;;qBAmCe,c;;;;;;;;AC1Cf,IAAM,iBAAiB,SAAjB,cAAiB,CAAS,CAAT,EAAY;AAC/B,QAAM,MAAM,EAAE,QAAF,CAAW,EAAX,CAAZ;AACA,WAAO,IAAI,MAAJ,KAAe,CAAf,SAAuB,GAAvB,GAA+B,GAAtC;AACH,CAHD;;qBAKe,c;;;;;;;;;ACLf;;;;;;AAEA,IAAM,WAAW,SAAX,QAAW,CAAS,CAAT,EAAY,CAAZ,EAAe,CAAf,EAAkB;AAC/B,iBAAW,iCAAe,CAAf,CAAX,GAA+B,iCAAe,CAAf,CAA/B,GAAmD,iCAAe,CAAf,CAAnD;AACH,CAFD;;qBAIe,Q;;;;;;;;;ACNf;;;;;;AAEA;;;AAGA,IAAM,gBAAgB,SAAhB,aAAgB,CAAS,OAAT,EAAkB;AACpC,WACI,CAAC,QAAQ,EAAR,CAAW,IAAX,CAAD,IACG,QAAQ,OAAR,CAAgB,IAAhB,EAAsB,EAAtB,CAAyB,cAAzB,CADH,KAIQ,QAAQ,OAAR,CAAgB,IAAhB,EAAsB,QAAtB,CAA+B,eAA/B,KACG,QAAQ,OAAR,CAAgB,IAAhB,EAAsB,OAAtB,CAA8B,IAA9B,EAAoC,EAApC,CAAuC,cAAvC,CAFP,IAIG,QAAQ,OAAR,CAAgB,IAAhB,EAAsB,QAAtB,CAA+B,gBAA/B,CAPP,CADJ;AAWH,CAZD;;AAcA;;;;AAIA,IAAM,eAAe,SAAf,YAAe,CAAS,CAAT,EAAY;AAC7B,QAAI,KAAK,EAAT;AACA,QAAM,UAAU,EAAE,EAAE,MAAJ,CAAhB;AACA,QAAI,EAAE,KAAF,KAAY,sBAAS,IAAzB,EAA+B;AAC3B,UAAE,cAAF;AACA;AACA,YAAI,QAAQ,QAAR,CAAiB,YAAjB,CAAJ,EAAoC;AAChC,oBAAQ,QAAR,CAAiB,cAAjB,EAAiC,IAAjC,CAAsC,UAAtC,EAAkD,KAAlD;AACH,SAFD,MAEO,IAAI,QAAQ,EAAR,CAAW,IAAX,CAAJ,EAAsB;AACzB,oBAAQ,IAAR,CAAa,IAAb,EAAmB,IAAnB,CAAwB,SAAxB,EAAmC,KAAnC;AACH,SAFM,MAEA,IAAI,QAAQ,QAAR,CAAiB,YAAjB,CAAJ,EAAoC;AACvC,gBAAI,QAAQ,OAAR,CAAgB,KAAhB,EAAuB,QAAvB,CAAgC,UAAhC,CAAJ,EAAiD;AAC7C,oBAAI,QAAQ,OAAR,CAAgB,WAAhB,EAA6B,IAA7B,CAAkC,KAAlC,EAAyC,QAAzC,CAAkD,SAAlD,CAAJ,EAAkE;AAC9D,4BAAQ,OAAR,CAAgB,WAAhB,EAA6B,IAA7B,CAAkC,aAAlC,EAAiD,IAAjD,CAAsD,UAAtD,EAAkE,KAAlE;AACH,iBAFD,MAEO;AACH,yBAAK,QAAQ,OAAR,CAAgB,IAAhB,EAAsB,IAAtB,CAA2B,IAA3B,CAAL;AACA,6CAAuB,EAAvB,WAAiC,KAAjC;AACH;AACJ,aAPD,MAOO;AACH,qBAAK,QAAQ,OAAR,CAAgB,IAAhB,EAAsB,IAAtB,CAA2B,IAA3B,CAAL;AACA,yCAAuB,EAAvB,SAA+B,KAA/B;AACH;AACJ,SAZM,MAYA;AACH,oBAAQ,UAAR;AACH;AACJ,KAtBD,MAsBO,IAAI,EAAE,KAAF,KAAY,sBAAS,EAAzB,EAA6B;AAChC,UAAE,cAAF;AACA,YAAI,cAAc,OAAd,CAAJ,EAA4B;AACxB,oBAAQ,OAAR,CAAgB,KAAhB,EAAuB,IAAvB,CAA4B,IAA5B,EAAkC,KAAlC;AACH,SAFD,MAEO,IAAI,QAAQ,QAAR,CAAiB,YAAjB,CAAJ,EAAoC;AACvC,oBAAQ,IAAR,CAAa,IAAb,EAAmB,IAAnB,CAAwB,iBAAxB,EAA2C,KAA3C;AACH,SAFM,MAEA,IAAI,QAAQ,EAAR,CAAW,IAAX,CAAJ,EAAsB;AACzB,gBAAI,QAAQ,OAAR,CAAgB,KAAhB,EAAuB,QAAvB,CAAgC,SAAhC,CAAJ,EAAgD;AAC5C,wBAAQ,OAAR,CAAgB,aAAhB,EAA+B,IAA/B,CAAoC,cAApC,EAAoD,IAApD,CAAyD,cAAzD,EAAyE,KAAzE;AACH,aAFD,MAEO;AACH,qBAAK,QAAQ,OAAR,CAAgB,IAAhB,EAAsB,IAAtB,CAA2B,IAA3B,CAAL;AACA,yCAAuB,EAAvB,WAAiC,KAAjC;AACH;AACJ,SAPM,MAOA;AACH,oBAAQ,UAAR,CAAmB,CAAC,CAApB;AACH;AACJ;AACD,MAAE,eAAF;AACH,CA3CD;;qBA6Ce,Y;;;;;;;;ACpEf;AACA;AACA,IAAM,sBAAsB,SAAtB,mBAAsB,CAAC,KAAD,EAAW;AACnC,QAAI,MAAM,aAAN,CAAoB,SAAxB,EAAmC;AAC/B,eAAO,QAAP,CAAgB,MAAhB;AACH;AACJ,CAJD;;qBAMe,mB;;;;;;;;ACRf;AACA;AACA,IAAM,WAAW,SAAX,QAAW,GAAW,CAAE,CAA9B,C,CAAgC;qBACjB,Q;;;;;;;;ACHf;;;AAGA,IAAM,8BAA8B,SAA9B,2BAA8B,GAAY;AAC5C,QAAM,kBAAkB,KAAK,GAAL,CAAS,OAAO,WAAhB,MAAiC,EAAzD;AACA;AACA,MAAE,kBAAF,EAAsB,IAAtB,CAA2B,UAAC,KAAD,EAAQ,EAAR,EAAe;AACtC,YAAI,WAAW,EAAE,EAAF,EAAM,QAAN,EAAf;AACA,aAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,SAAS,MAA7B,EAAqC,GAArC,EAA0C;AACtC,cAAE,SAAS,CAAT,CAAF,EAAe,MAAf;AACH;;AAED,mBAAW,SAAS,KAAT,CAAe,CAAf,EAAkB,CAAlB,CAAX;AACA,iBAAS,QAAT,CAAkB,WAAlB;AACA,UAAE,EAAF,EAAM,QAAN,CAAe,aAAf,EAA8B,GAA9B,CAAkC,YAAlC,EAAgD,QAAhD;;AAEA,YAAI,eAAJ,EAAqB;AACjB,qBAAS,IAAT,GAAgB,IAAhB;AACH;AACJ,KAbD;AAcA,MAAE,mBAAF,EAAuB,MAAvB,GAjB4C,CAiBX;AACpC,CAlBD;;AAoBA;;;AAGA,IAAM,wCAAwC,SAAxC,qCAAwC,GAAY;AACtD,WAAO,mBAAP,GAA6B,YAAY;AACrC,UAAE,kBAAF,EAAsB,IAAtB,CAA2B,UAAC,KAAD,EAAQ,EAAR;AAAA,mBACvB,EAAE,EAAF,EAAM,QAAN,GAAiB,IAAjB,GAAwB,IAAxB,EADuB;AAAA,SAA3B;AAGH,KAJD;AAKH,CAND;;AAQA;;;;AAIA,IAAM,sCAAsC,SAAtC,mCAAsC,CAAU,MAAV,EAAkB;AAC1D,QAAM,SAAS,QAAQ,QAAR,CAAf;AACA,QAAI,cAAc,OAAO,MAAP,CAAc,OAAO,SAArB,CAAlB;AACA,QAAM,eACF,OAAO,OAAP,IACA,OAAO,SAAP,CAAiB,WAAjB,EAA8B,SAA9B,CADA,IAEA,CAAC,CAAC,OAAO,SAAP,CAAiB,SAAjB,CAA2B,KAA3B,CAAiC,MAAjC,CAHN;AAIA,QAAM,eAAe,OAAO,OAAP,IAAkB,SAAS,OAAO,SAAhB,EAA2B,EAA3B,IAAiC,CAAxE;;AAEA,QAAI,gBAAgB,YAApB,EAAkC;AAC9B;AACA;AACH;AACJ,CAbD;;QAeS,mC,GAAA,mC;;;;;;;;ACrDT,IAAM,UAAU,SAAV,OAAU,CAAS,IAAT,EAAe;AAC3B,QAAM,IAAI,IAAI,IAAJ,EAAV;AACA,MAAE,OAAF,CAAU,EAAE,OAAF,KAAc,OAAO,EAAP,GAAY,EAAZ,GAAiB,EAAjB,GAAsB,IAA9C;AACA,WAAO,EAAE,WAAF,EAAP;AACH,CAJD;;qBAMe,O;;;;;;;;;ACNf;;;;;;AAEA;;;AAGA,IAAM,yDAAyD,SAAzD,sDAAyD,GAAW;AACtE,QAAI,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,GAAf,CAAmB,kBAAnB,MAA2C,GAAjE,EAAsE;AAClE,yEAA+C,eAA/C,EAAgE,CAAC,CAAjE;AACH;AACJ,CAJD;;qBAMe,sD;;;;;;;;ACXf,IAAM,8CAAA,GAAiD,SAAjD,8CAAiD,CAAC,IAAD,EAAO,cAAP,EAA0B;IAC7E,CAAA,CAAE,8EAAF,CAAA,CAAkF,IAAlF,CAAuF,UAAC,KAAD,EAAQ,EAAR,EAAe;QAClG,EAAA,CAAG,KAAH,CAAS,WAAT,CAAqB,aAArB,EAAoC,IAApC,EAA0C,WAA1C,CAAA,CAAA;QACA,IAAM,GAAA,GAAM,CAAA,CAAE,EAAF,CAAZ,CAAA;QACA,IAAI,GAAA,CAAI,QAAJ,EAAA,CAAe,MAAf,KAA0B,CAA1B,IAAgC,GAAA,CAAI,QAAJ,EAAA,CAAe,MAAf,KAA0B,CAA1B,IAA+B,GAAA,CAAI,QAAJ,CAAa,GAAb,CAAA,CAAkB,MAAlB,IAA4B,CAA/F,EAAmG;YAC/F,IAAM,QAAA,GAAW,QAAA,CAAS,GAAA,CAAI,GAAJ,CAAQ,WAAR,CAAT,EAA+B,EAA/B,CAAjB,CAAA;YACA,GAAA,CAAI,GAAJ,CAAQ,WAAR,EAAwB,QAAA,GAAW,cAAnC,GAAA,IAAA,CAAA,CAAA;SACH;KANL,CAAA,CAAA;CADJ,CAAA;;qBAWe;;;;;;;;;ACXf;;;;;AAKA,IAAM,4BAA4B,SAA5B,yBAA4B,CAAS,GAAT,EAAc;AAC5C,SAAO,mBAAmB,GAAnB,EAAwB,OAAxB,CAAgC,WAAhC,EAA6C,MAA7C,CAAP;AACH,CAFD;;qBAIe,yB;;;;;;;;ACTf;;;;AAIA,IAAM,eAAe,SAAf,YAAe,CAAS,OAAT,EAAkB;AACnC,QAAI,WAAW,IAAf,EAAqB;AACjB,aAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,QAAQ,MAA5B,EAAoC,GAApC,EAAyC;AACrC,gBAAM,MAAM,QAAQ,CAAR,CAAZ;AACA,gBAAI,IAAI,EAAJ,KAAW,kBAAX,IACO,IAAI,EAAJ,KAAW,iBADlB,IAEO,IAAI,EAAJ,KAAW,eAFlB,IAGO,IAAI,EAAJ,KAAW,iBAHtB,EAGyC;AACrC,uBAAO,IAAI,EAAX;AACH;AACJ;AACJ;AACD,WAAO,IAAP;AACH,CAbD;;qBAee,Y;;;;;;;;ACnBf,IAAM,OAAO,OAAO,MAAP,CAAc;AACvB,SAAK,CADkB;AAEvB,WAAO,EAFgB;AAGvB,UAAM,EAHiB;AAIvB,QAAI,EAJmB;AAKvB,WAAO,EALgB;AAMvB,UAAM,EANiB;AAOvB,WAAO,EAPgB;AAQvB,SAAK;AARkB,CAAd,CAAb;qBAUe,I;;;;;;;;cCVD,M;IAAN,C,WAAA,C;;;AAER,IAAM,SAAS;AACX,OADW,eACP,KADO,EACA,OADA,EACS,MADT,EACiB;AACxB,YAAM,OAAO;AACT,mBAAO,SAAS,MADP;AAET,qBAAS,WAAW,sBAFX;AAGT,oBAAQ;AACJ,sBAAM,OAAO,QAAP,CAAgB;AADlB;AAHC,SAAb;;AAQA,YAAI,UAAU,OAAd,EAAuB;AACnB,iBAAK,MAAL,CAAY,UAAZ,GAAyB,IAAI,KAAJ,GAAY,KAArC;AACH;;AAED,YAAI,CAAC,EAAE,MAAF,EAAU,OAAV,EAAL,EAA0B;AACtB,mBAAO,MAAP,CAAc,KAAK,MAAnB,EAA2B,MAA3B;AACH;;AAED;AACA,gBAAQ,GAAR,CAAY,IAAZ;;AAEA,YAAM,cAAc,KAAK,SAAL,CAAe,IAAf,CAApB;;AAEA,YAAI,UAAU,IAAI,cAAJ,EAAd;AACA,gBAAQ,IAAR,CAAa,MAAb,EAAqB,MAArB,EAA6B,IAA7B;AACA,gBAAQ,gBAAR,CAAyB,cAAzB,EAAyC,kBAAzC;AACA,gBAAQ,IAAR,CAAa,WAAb;AACH;AA3BU,CAAf;;qBA8Be,OAAO,MAAP,CAAc,MAAd,C;;;;;;;;AChCf,IAAM,SAAS,SAAT,MAAS,CAAS,MAAT,EAAiB,OAAjB,EAA0B,IAA1B,EAAgC;AAC3C;AACA,QAAM,aAAa,KAAK,OAAL,CAAa,mBAAmB,sBAAnB,CAAb,EAAyD,EAAzD,EAA6D,OAA7D,CAAqE,qCAArE,EAA4G,EAA5G,CAAnB;AACA,QAAM,cAAc,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,oBAAzB,EAA+C,EAAC,SAAS,UAAV,EAAsB,QAAQ,CAAC,MAAD,EAAS,OAAT,EAAkB,IAAlB,CAAuB,GAAvB,CAA9B,EAA/C,CAApB;AACA,MAAE,kBAAF,EAAsB,IAAtB,CAA2B,MAA3B,EAAmC,WAAnC;AACH,CALD;;qBAOe,M;;;;;;;;ACPf,IAAM,YAAY,SAAZ,SAAY,GAAM;AACpB,UAAM,IAAI,KAAJ,CAAU,mBAAV,CAAN;AACH,CAFD;;QAKI,S,GAAA,S;;;;;;;;;;ACLJ;;;;;;AAEA,IAAM,mBAAmB,SAAnB,gBAAmB,CAAC,EAAD,EAAK,KAAL,EAAe;AACpC,QAAI,QAAQ,GAAG,WAAH,EAAZ;AACA,QAAI,GAAG,CAAH,MAAU,GAAd,EAAmB;AACf,gBAAQ,GAAG,MAAH,CAAU,CAAV,CAAR,CADe,CACO;AACzB;AACD,QAAM,WAAW,yBAAY,KAAZ,CAAkB,KAAlB,CAAjB;AACA,WAAO,SAAS,KAAT,CAAP;AACA,iBAAW,yBAAY,SAAZ,CAAsB,QAAtB,CAAX,CAPoC,CAOU;AACjD,CARD;;QAWI,gB,GAAA,gB;;;;;;;;;qBCbW,UAAS,SAAT,EAAoB;AAC/B,QAAM,UAAU,EAAE,YAAF,CAAe,OAA/B;AACA,WAAO,EAAE,YAAF,CAAe,OAAtB;AACA,QAAM,UAAU,WAAhB;AACA,MAAE,YAAF,CAAe,OAAf,GAAyB,OAAzB;AACA,WAAO,OAAP;AACH,C;;;;;;;;;;ACND;;;;;;AAEA,IAAM,SAAS,qBAAQ,MAAvB;;AAEA,IAAM,MAAM,SAAN,GAAM,CAAS,KAAT,EAAgB,UAAhB,EAA4B;AACpC,QAAM,SAAS,qBAAQ,WAAR,CAAoB,EAAC,SAAS,OAAO,SAAP,CAAiB,QAA3B,EAApB,EAA0D,KAA1D,EAAiE,UAAjE,CAAf;;AAEA,QAAI,CAAC,MAAL,EAAa;AACT,YAAI;AACA,gBAAI,+BAA6B,KAAjC;AACA,gBAAI,cAAc,IAAlB,EAAwB;AACpB,oBAAM,iBAAiB,KAAK,SAAL,CAAe,UAAf,CAAvB;AACA,iDAA+B,cAA/B;AACH;;AAED,gBAAM,QAAQ,IAAI,KAAJ,CAAU,OAAV,CAAd;;AAEA,gBAAI,OAAO,KAAP,IAAgB,OAAO,KAAP,CAAa,WAAjC,EAA8C;AAC1C,uBAAO,KAAP,CAAa,WAAb,CAAyB,KAAzB;AACH,aAFD,MAEO,IAAI,OAAO,OAAP,IAAkB,OAAO,OAAP,CAAe,KAArC,EAA4C;AAC/C,uBAAO,OAAP,CAAe,KAAf,CAAqB,KAArB;AACH;AACJ,SAdD,CAcE,OAAO,CAAP,EAAU;AACR;AACH;AACJ;AACD,WAAO,MAAP;AACH,CAvBD;;QA0BI,G,GAAA,G;QACA,M,GAAA,M;;;;;;;;;AC/BJ;;AAEA;qBACe,YAAM;AACjB,MAAE,YAAM;AACJ,YAAI;AACA,mBAAO,EAAE,YAAF,CAAe,OAAf,CAAuB,YAAvB,CAAP;;AAEA,cAAE,qBAAF,EAAyB,IAAzB,CAA8B,UAAC,CAAD,EAAI,EAAJ,EAAW;AACrC,oBAAI,OAAO,EAAE,EAAF,CAAX;AACA,oBAAI,MAAM,KAAK,IAAL,CAAU,UAAV,CAAV;;AAEA,oBAAI,CAAC,EAAE,GAAF,EAAO,OAAP,EAAD,IAAqB,CAAC,KAAK,IAAL,EAA1B,EAAuC;AACnC,sBAAE,GAAF,CAAM,uCAAmB,GAAnB,CAAN,EAAiC,IAAjC,CAAsC,UAAC,QAAD,EAAc;AAChD,4BAAI,CAAC,KAAK,IAAL,EAAL,EAAkB;AACd,iCAAK,MAAL,CAAY,EAAE,KAAF,EAAS,QAAT,CAAZ;AACH;AACJ,qBAJD;AAKH;AACJ,aAXD;AAYH,SAfD,SAgBQ;AACJ,cAAE,SAAF,CAAY;AACR,yBAAS,EAAC,cAAc,EAAE,OAAF,EAAW,GAAX,MAAoB,UAAU,KAA7C;AADD,aAAZ;AAGH;AACJ,KAtBD;AAuBH,C;;;;;;;;;;AC3BD;;AAEA,IAAM,mBAAmB,SAAnB,gBAAmB,CAAC,GAAD;AAAA,iBAAa,GAAb;AAAA,CAAzB;;AAEA,IAAM,mBAAmB,SAAnB,gBAAmB,CAAC,GAAD;AAAA,kBAAc,GAAd;AAAA,CAAzB;;AAEA,IAAM,iBAAiB,SAAjB,cAAiB,CAAC,aAAD,EAAmB;AACtC,QAAM,WAAW,SAAS,aAAT,CAAuB,UAAvB,CAAjB;AACA,aAAS,SAAT,GAAqB,aAArB;AACA,WAAO,SAAS,KAAhB;AACH,CAJD;;AAMA,IAAM,cAAc,CAChB,GADgB,EAEhB,GAFgB,EAGhB,GAHgB,EAIhB,GAJgB,EAKhB,GALgB,EAMhB,GANgB,EAOhB,GAPgB,EAQhB,GARgB,EAShB,GATgB,EAUhB,GAVgB,EAWhB,GAXgB,EAYhB,GAZgB,EAahB,GAbgB,EAchB,GAdgB,EAehB,GAfgB,CAApB;;AAkBA,IAAM,kBAAkB,SAAlB,eAAkB,CAAC,OAAD,EAAa;AACjC,QAAI,eAAe,OAAnB;AACA,gBAAY,OAAZ,CAAoB,UAAC,EAAD,EAAQ;AACxB,YAAM,UAAU,IAAI,MAAJ,QAAgB,EAAhB,EAAsB,GAAtB,CAAhB;AACA,uBAAe,aAAa,OAAb,CAAqB,OAArB,EAA8B,EAA9B,CAAf;AACH,KAHD;AAIA,WAAO,YAAP;AACH,CAPD;;AASA,IAAM,4BAA4B,SAA5B,yBAA4B,GAAM;AACpC,QAAI,kBAAkB,EAAtB;AACA,gBAAY,OAAZ,CAAoB,UAAC,EAAD,EAAQ;AACxB,YAAI,oBAAoB,EAAxB,EAA4B;AACxB,qCAAuB,EAAvB;AACH,SAFD,MAEO;AACH,8BAAqB,eAArB,WAA0C,EAA1C;AACH;AACJ,KAND;AAOA,iBAAW,eAAX;AACH,CAVD;;AAYA,IAAM,kBAAkB,SAAlB,eAAkB,OAMlB;AAAA,yBALF,IAKE;AAAA,QALF,IAKE,6BALK,4BAKL;AAAA,4BAJF,OAIE;AAAA,QAJF,OAIE,gCAJQ,4BAIR;AAAA,wBAHF,GAGE;AAAA,QAHF,GAGE,4BAHI,4BAGJ;AAAA,+BAFF,UAEE;AAAA,QAFF,UAEE,mCAFW,KAEX;AAAA,2BADF,MACE;AAAA,QADF,MACE,+BADO,KACP;;AACF;AACA,QAAM,eAAe,gBAAgB,OAAhB,CAArB;AACA;AACA,QAAM,gBAAc,aACf,KADe,CACT,EADS,EAEf,IAFe,CAEV,2BAFU,CAAd,MAAN;AAGA,QAAM,cAAW,aAAa,GAAb,GAAmB,EAA9B,KAAmC,SAAS,GAAT,GAAe,EAAlD,CAAN;AACA,QAAM,SAAS,IAAI,MAAJ,CAAW,OAAX,EAAoB,KAApB,CAAf;AACA,QAAM,eAAkB,iBAAiB,GAAjB,CAAlB,UAA4C,iBAAiB,GAAjB,CAAlD;AACA,WAAO,KAAK,OAAL,CAAa,MAAb,EAAqB,YAArB,CAAP;AACH,CAjBD;;AAmBA,IAAM,cAAc,SAAd,WAAc,QAKd;AAAA,2BAJF,IAIE;AAAA,QAJF,IAIE,8BAJK,4BAIL;AAAA,iCAHF,UAGE;AAAA,QAHF,UAGE,oCAHW,KAGX;AAAA,6BAFF,MAEE;AAAA,QAFF,MAEE,gCAFO,KAEP;AAAA,sCADF,gBACE;AAAA,QADF,gBACE,yCADiB,KACjB;;AACF,QAAM,UAAU,yBACN,KAAK,KAAL,CAAW,EAAX,EAAe,IAAf,CAAoB,YAApB,CADM,SAEV,IAFN;AAGA,QAAM,cAAW,aAAa,GAAb,GAAmB,EAA9B,KAAmC,SAAS,GAAT,GAAe,EAAlD,CAAN;AACA,QAAM,SAAS,IAAI,MAAJ,CAAW,OAAX,EAAoB,KAApB,CAAf;AACA,WAAO,MAAP;AACH,CAZD;;QAeI,gB,GAAA,gB;QACA,gB,GAAA,gB;QACA,c,GAAA,c;QACA,e,GAAA,e;QACA,W,GAAA,W;;;;;;;;ACzFJ,IAAM,YAAY,SAAZ,SAAY,CAAS,UAAT,EAAqB,KAArB,EAA4B,OAA5B,EAAqC;AACnD,YAAQ,SAAS,CAAjB;AACA,cAAU,WAAW,EAArB;AACA,QAAI,WAAW,WAAW,QAAX,CAAoB,YAApB,CAAf;;AAEA,aAAS,WAAT,CAAqB,QAArB;AACA,QAAI,CAAC,QAAQ,OAAb,EAAsB;AAAE;AACpB,iBAAS,IAAT,CAAc,UAAC,CAAD,EAAI,EAAJ,EAAW;AACrB,gBAAI,aAAa,OAAO,IAAP,CAAY,yBAAZ,EAAuC,EAAC,QAAQ,IAAI,CAAb,EAAgB,eAAe,KAA/B,EAAvC,CAAjB;AACA,gBAAI,QAAQ,SAAZ,EAAuB;AACnB,6BAAa,OAAO,IAAP,CAAY,2BAAZ,EAAyC,EAAC,QAAQ,IAAI,CAAb,EAAgB,eAAe,KAA/B,EAAzC,CAAb;AACH;AACD,cAAE,EAAF,EAAM,IAAN,CAAW,YAAX,EAAyB,UAAzB;AACH,SAND;AAOH;;AAED,eAAW,SAAS,MAAT,CAAgB,UAAC,CAAD;AAAA,eAAQ,IAAI,CAAL,IAAW,KAAK,KAAL,CAAW,KAAX,CAAlB;AAAA,KAAhB,EACV,QADU,CACD,QADC,CAAX;;AAGA,QAAI,QAAQ,SAAZ,EAAuB;AACnB,iBACK,IADL,GAEK,IAFL,CAEU,YAFV,EAEwB,OAAO,IAAP,CAAY,yBAAZ,EAAuC,EAAC,YAAD,EAAvC,CAFxB;AAGH;AACJ,CAxBD;;qBA0Be,S;;;;;;;;;AC1Bf;;AACA;;AAEA,IAAM,0BAA0B,SAA1B,uBAA0B,CAAS,IAAT,EAAe,OAAf,EAAwB;AACpD,MAAE,IAAF,CAAO,KAAK,cAAL,EAAP,EAA8B,IAA9B,CAAmC,UAAC,SAAD,EAAe;AAC9C,YAAI,cAAc,EAAlB,EAAsB;AAClB,gBAAM,QAAQ,KAAK,KAAnB;AACA,gBAAM,SAAS,KAAK,IAAL,CAAU,EAAzB;AACA,gBAAM,WAAW,KAAK,IAAL,CAAU,IAA3B;AACA,gBAAM,UAAU,KAAK,MAAL,CAAY,YAAZ,CAAyB,IAAzB,IAAiC,IAAjC,GAAwC,8BAAY,wBAAZ,CAAxC,GAAgF,KAAK,MAAL,CAAY,YAAZ,CAAyB,IAAzH;AACA,gBAAM,iBAAiB,mBAAK,WAAL,EAAkB,EAAC,GAAG,KAAK,oBAAT,EAAlB,CAAvB;AACA,gBAAM,eAAe,KAAK,iBAA1B;AACA,gBAAM,UAAU,OAAhB;;AAEA,gBAAM,QAAQ,EAAE,qBAAF,CAAd;AACA,cAAE,mBAAF,EAAuB,IAAvB,CAA4B,KAA5B;AACA,cAAE,yBAAF,EAA6B,WAA7B,GAA2C,QAA3C,WAA4D,MAA5D;AACA,cAAE,yBAAF,EAA6B,IAA7B,CAAkC,QAAlC;AACA,cAAE,yBAAF,EAA6B,IAA7B,CAAkC,KAAlC,EAAyC,OAAzC;AACA,gBAAI,kBAAkB,IAAlB,IAA0B,YAA9B,EAA4C;AACxC,kBAAE,+BAAF,EAAmC,IAAnC,CAAwC,OAAO,IAAP,CAAY,iCAAZ,EAA+C,EAAC,MAAM,cAAP,EAA/C,CAAxC,EAAgH,WAAhH,CAA4H,QAA5H;AACH,aAFD,MAEO;AACH,kBAAE,+BAAF,EAAmC,IAAnC,CAAwC,EAAxC,EAA4C,QAA5C,CAAqD,QAArD;AACH;;AAED,cAAE,wBAAF,EAA4B,IAA5B,CAAiC,EAAC,iBAAiB,OAAlB,EAA2B,kBAAkB,MAA7C,EAAjC;;AAEA;AACA,gBAAI,KAAK,SAAL,CAAe,EAAf,IAAqB,KAArB,IAA8B,KAAK,SAAL,CAAe,EAAf,IAAqB,KAAnD,IAA4D,QAAQ,GAAR,CAAY,qBAAZ,MAAuC,GAAvG,EAA4G;AACxG,kBAAE,oBAAF,EAAwB,UAAxB,CAAmC,QAAnC,EAA6C,MAA7C;AACH,aAFD,MAEO;AACH,sBAAM,UAAN,CAAiB,QAAjB,EAA2B,MAA3B;AACH;AACJ,SA5BD,MA4BO;AACH,iBAAK,SAAL,CAAe,OAAf,EAAwB,SAAxB,EAAmC,EAAE,MAAF,CAAnC;AACH;AACJ,KAhCD;AAiCH,CAlCD;;qBAoCe,uB;;;;;;;;ACvCf;;;AAGA,IAAM,wBAAwB,SAAxB,qBAAwB,CAAS,SAAT,EAAoB;AAC9C,QAAM,uBAAuB,sCAAoC,UAAU,EAA9C,SAAsD,IAAtD,EAA7B;;AAEA,MAAE,QAAF,EAAY,UAAZ,CAAuB,QAAvB,EAAiC,OAAjC;;AAEA,QAAM,WAAW,UAAU,MAA3B;AACA,QAAM,aAAa,EAAE,wDAAF,CAAnB;;AAEA,oCAA8B,UAAU,EAAxC,SAAgD,IAAhD,CAAqD,oBAArD;AACA,MAAE,mBAAF,EAAuB,IAAvB,CAA4B,UAAU,KAAtC;AACA,MAAE,yBAAF,EAA6B,IAA7B,CAAkC,KAAlC,EAAyC,UAAU,KAAnD;;AAEA,eAAW,IAAX,CAAgB,YAAhB,EAA8B,UAAU,KAAxC,EAA+C,IAA/C,CAAoD,cAApD,EAAoE,UAAU,KAA9E,EACK,IADL,CACU,WADV,EACuB,QADvB,EACiC,IADjC,CACsC,gBADtC,EACwD,SAAS,WAAT,EADxD,EACgF,IADhF,CACqF,kBADrF,EACyG,UAAU,UADnH;;AAGA,YAAQ,iBAAR,CAA0B,UAA1B,EAAsC,MAAtC;;AAEA,eAAW,IAAX,CAAgB,eAAhB,EAAiC,UAAU,EAA3C,EAA+C,IAA/C,CAAoD,MAApD,EAA4D,oBAA5D,EAAkF,IAAlF,CAAuF,aAAvF,EAAsG,MAAtG;AACA,MAAE,wBAAF,EAA4B,UAA5B,CAAuC,QAAvC,EAAiD,MAAjD;AACH,CAnBD;;qBAsBe,qB;;;;;;;;;;;ACzBf;;;;AACA;;;;AACA;;;;;;;;IAEqB,sB;AACjB,oCAAY,UAAZ,EAAwB,GAAxB,EAA6B,KAA7B,EAAoC;AAAA;;AAChC,YAAI,OAAO,yBAAY,GAAZ,CAAgB,QAAhB,EAA0B,CAA1B,CAAX;AACA,aAAK,SAAL,GAAiB,OAAO,KAAK,KAAL,CAAW,GAAX,CAAP,GAAyB,EAA1C;AACA,aAAK,MAAL,GAAc,KAAK,SAAL,CAAe,CAAf,KAAqB,IAAnC;AACA,aAAK,OAAL,GAAe,KAAK,SAAL,CAAe,CAAf,KAAqB,IAApC;AACA,aAAK,MAAL,GAAc,KAAK,SAAL,CAAe,CAAf,KAAqB,CAAnC;AACA,aAAK,KAAL,GAAa,SAAS,IAAtB;AACA,aAAK,UAAL,GAAkB,WAAW,MAA7B;AACA,aAAK,GAAL,GAAW,GAAX;AACH;;AAED;;;;;wCACgB;AAAA;;AACZ,gBAAI,CAAC,KAAK,MAAN,IAAgB,CAAC,KAAK,OAA1B,EAAmC;AAC/B;AACH;;AAED,gBACI,CAAC,KAAK,KAAN,IACC,KAAK,KAAL,IAAc,KAAK,KAAL,CAAW,GAAX,CAAe,IAAf,MAAyB,KAAK,OAFjD,EAGE;AACE,qBAAK,KAAL,GAAa,EAAE,IAAF,CACT,KAAK,UADI,EAET,UAAC,KAAD;AAAA,2BAAW,MAAM,EAAN,KAAa,MAAK,OAA7B;AAAA,iBAFS,CAAb;AAIH;;AAED,gBAAI,eAAe,IAAI,yBAAJ,CAAiB,EAAE,KAAK,KAAK,GAAZ,EAAjB,CAAnB;;AAEA,gBAAI,KAAK,KAAT,EAAgB;AACZ;AACA,yCAAY,MAAZ,CAAmB,QAAnB;AACA,qBAAK,KAAL,CAAW,GAAX,CAAe,gBAAf,EAAiC,KAAK,MAAtC;AACA,6BAAa,OAAb,CAAqB,KAAK,MAA1B,EAAkC,KAAK,KAAvC;AACH,aALD,MAKO;AACH;AACA,oBAAI,QAAQ,IAAI,kBAAJ,EAAZ;AACA,oBAAI,UAAU,IAAI,OAAJ,CAAY,UAAC,OAAD,EAAU,MAAV,EAAqB;AAC3C,0BAAM,aAAN,CAAoB,MAAK,OAAzB,EAAkC,OAAlC,EAA2C,MAA3C;AACH,iBAFa,CAAd;;AAIA,wBAAQ,IAAR,CAAa,YAAM;AACf,0BAAK,KAAL,IAAc,MAAK,KAAL,CAAW,GAAX,CAAe,gBAAf,EAAiC,MAAK,MAAtC,CAAd;AACA,iCAAa,OAAb,CAAqB,MAAK,MAA1B,EAAkC,KAAlC;AACA,6CAAY,MAAZ,CAAmB,QAAnB;AACH,iBAJD;AAKH;AACJ;;;;;;qBAhDgB,sB;;;;;;;;;ACJrB;;;;AACA;;AACA;;;;AACA;;;;AACA,IAAM,wBAAwB,4BAA9B;AACA,IAAM,0BAA0B,8BAAhC;;AAEA,IAAM,+BAA+B,SAA/B,4BAA+B,CAAU,IAAV,EAAgB;AACjD,QAAM,UACF,QACA,OAAO,QAAP,CAAgB,QAAhB,IACK,OAAO,QAAP,CAAgB,MAAhB,GAAyB,OAAO,QAAP,CAAgB,MAAzC,GAAkD,EADvD,CAFJ;AAIA,QAAI,SAAS,iCAAe,OAAO,QAAP,CAAgB,MAA/B,EAAuC,MAApD;AACA,QAAM,OAAO,EAAE,MAAF,EAAU,IAAV,CAAe,uBAAf,CAAb;AACA,QAAM,KAAK,6BAAiB,OAAO,QAAP,CAAgB,MAAjC,EAAyC,QAAzC,CAAX;;AAEA,QACI,UACA,CAAC,IADD,IAEA,OAAO,OAAP,CAAe,GAAf,IAAsB,CAAC,CAFvB,IAGA,EAAE,MAAF,EAAU,IAAV,CAAe,iBAAf,MAAsC,OAJ1C,EAKE;AACE,gBAAQ,YAAR,CAAqB,IAArB,EAA2B,IAA3B,EAAiC,OAAO,QAAP,CAAgB,QAAhB,GAA2B,EAA5D;;AAEA,iBAAS,OAAO,KAAP,CAAa,GAAb,CAAT;AACA,YAAM,UAAU,OAAO,CAAP,CAAhB;AACA,YAAM,aAAa,mDACgC,OADhC,QAAnB;AAGA,YAAM,YAAY,6BAA2B,OAA3B,UAAlB;AACA,YAAM,SAAS,SAAS,OAAO,CAAP,CAAT,EAAoB,EAApB,CAAf;AACA,YAAM,eAAe,oCACe,OADf,SAEnB,KAFmB,EAArB,CAVF,CAYa;AACX,YAAM,gBAAgB,uCACiB,OADjB,+CACkE,OADlE,SAEpB,KAFoB,EAAtB,CAbF,CAea;AACX,YAAI,OAAO,IAAX;AACA,YAAI,iBAAiB,EAArB,CAjBF,CAiB2B;;AAEzB,gBAAQ,OAAO,CAAP,CAAR;AACI,iBAAK,MAAL;AACA,iBAAK,cAAL;AACA,iBAAK,iBAAL;AACI;AACA,oBACI,sDACsD,OADtD,SAEE,MAFF,IAGA,6BAC6B,OAD7B,gCAEE,MANN,EAOE;AACE;AACH;;AAED;AACA,oBAAI,WAAW,MAAf,EAAuB;AACnB;AACA,+BAAW,KAAX;AACH,iBAHD,MAGO,IAAI,UAAU,MAAd,EAAsB;AACzB;AACA,8BAAU,KAAV;AACH,iBAHM,MAGA;AACH;AACA,yBAAK,WAAL,CAAiB,OAAjB,EAA0B,EAAE,MAAF,CAA1B;AACA,sBAAE,IAAF,CAAO;AACH,6BAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,WAAzB,EAAsC;AACvC,gCAAI;AADmC,yBAAtC,CADF;AAIH,8BAAM;AAJH,qBAAP;AAMH;AACD;AACJ,iBAAK,MAAL;AACI;AACA,kBAAE,MAAF,EAAU,EAAV,CAAa,mBAAb,EAAkC,YAAM;AACpC,uDACI,8CAC8C,OAD9C,QADJ,EAII,MAJJ;AAMH,iBAPD;AAQA;AACJ;AAAS;AACL,oBACI,aAAa,MAAb,KACC,aAAa,EAAb,CAAgB,UAAhB,KACG,QAAQ,GAAR,CAAY,uBAAZ,MAAyC,MAF7C,CADJ,EAIE;AACE,2BAAO,YAAP;AACA,qCAAiB,KAAK,IAAL,CAAU,aAAV,CAAjB;AACA,wBAAI,mBAAmB,eAAvB,EAAwC;AACpC,yCAAiB,QAAjB;AACH;AACJ,iBAVD,MAUO,IAAI,cAAc,MAAlB,EAA0B;AAC7B,2BAAO,aAAP;AACA,wBACK,KAAK,IAAL,CAAU,SAAV,KACG,KACK,IADL,CACU,SADV,EAEK,WAFL,GAGK,OAHL,CAGa,QAHb,IAGyB,CAAC,CAJ9B,IAKA,KAAK,QAAL,CAAc,WAAd,CANJ,EAOE;AACE,yCAAiB,QAAjB;AACH,qBATD,MASO,IACF,KAAK,IAAL,CAAU,SAAV,KACG,KAAK,IAAL,CAAU,SAAV,EAAqB,WAArB,GAAmC,OAAnC,CAA2C,MAA3C,IACI,CAAC,CAFT,IAGA,KAAK,QAAL,CAAc,SAAd,CAJG,EAKL;AACE,yCAAiB,MAAjB;AACH;AACJ;;AAED,oBAAI,IAAJ,EAAU;AACN,wBAAI,OAAO,CAAP,MAAc,cAAd,IAAgC,OAAO,CAAP,MAAc,MAAlD,EAA0D;AACtD;AACA,6BAAK,KAAL;AACH,qBAHD,MAGO,IAAI,mBAAmB,MAAvB,EAA+B;AAClC,8CAAsB,OAAtB,EAA+B,IAA/B;AACH;AACJ,iBAPD,MAOO;AACH;AACA,sBAAE,IAAF,CAAO;AACH,6BAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,WAAzB,EAAsC;AACvC,gCAAI;AADmC,yBAAtC,CADF;AAIH,8BAAM,KAJH;AAKH,+BALG,mBAKK,IALL,EAKW;AACV,gCACI,OAAO,CAAP,MAAc,QAAd,IACA,OAAO,CAAP,MAAc,eAFlB,EAGE;AACE,qCAAK,MAAL,CAAY,OAAZ,EAAqB,KAArB,EAA4B,EAAE,MAAF,CAA5B;AACA,kCAAE,QAAF,EACK,EADL,CAEQ,eAFR,EAGQ,UAAC,CAAD,EAAI,SAAJ,EAAe,OAAf,EAA2B;AACvB;AACA,wCAAM,OACF,KAAK,IAAL,CAAU,EAAV,KAAiB,OAAjB,GACM,KAAK,IAAL,CAAU,IADhB,GAEM,KAAK,IAAL,CAAU,EAHpB;AAIA,yCAAK,kBAAL,CACI,OADJ,EAEI,IAFJ;AAIH,iCAbT,EAeK,EAfL,CAgBQ,eAhBR,EAiBQ,UAAC,CAAD,EAAI,SAAJ,EAAe,QAAf,EAA4B;AACxB,wCAAM,iBAAiB,KAAK,KAAL,CACnB,SAAS,KAAT,CAAe,YADI,CAAvB;;AAIA;AACA,wCACI,eAAe,SAAf,KACI,wBADJ,IAEA,UAAU,OAAV,CAAkB,OAAlB,KACI,MAJR,EAKE;AACE,4CAAM,WAAW,EAAE,KAAF,EAAS;AACtB,0DAAc,KAAK,KADG;AAEtB,yDAAa,KAAK,IAAL,CAAU,EAFD;AAGtB,4DACI,KAAK,MAAL,CAAY,YAAZ,CACK,IADL,IACa,IADb,GAEM,wBAFN,GAGM,KAAK,MAAL,CACK,YADL,CAEK,IATO;AAUtB,+DAAmB,mBACf,WADe,EAEf;AACI,mDAAG,KAAK;AADZ,6CAFe;AAVG,yCAAT,CAAjB;AAiBA,8DACI,OADJ,EAEI,QAFJ;AAIH,qCA3BD,MA2BO,IACH,eAAe,SADZ,EAEL;AACE,4CAAI,OAAO,EAAX;AACA,4CAAI,WAAW,EAAf;AACA,4CACI,eAAe,SAAf,KACI,6BADJ,IAEA,eAAe,SAAf,KACI,mBAJR,EAKE;AACE,mDAAO,OAAO,GAAP,CACH,OAAO,MAAP,CACK,YAFF,CAAP;AAIA,uDACI,OAAO,IAAP,CAAY,OAAZ,CADJ;AAEH,yCAZD,MAYO,IACH,eAAe,SAAf,KACI,6BADJ,IAEA,eAAe,SAAf,KACI,+BAJD,EAKL;AACE,mDAAO,OAAO,GAAP,CACH,OAAO,MAAP,CACK,cAFF,CAAP;AAIA,uDAAW,OAAO,IAAP,CACP,sBADO,CAAX;AAGH;;AAED,4CAAI,OAAJ,EAAa;AACT,gDAAM,kCAAgC,IAAhC,uBAAsD,QAAtD,SAAN;AACA,oDAAQ,IAAR,cACe,OAAO,IAAP,CACP,cADO,CADf,kBAGkB,OAAO,IAAP,YACD,eAAe,SADd,EAEV,EAAE,UAAF,EAFU,CAHlB,EAOI,OAPJ;AASH;AACJ;AACJ,iCA/FT;AAiGH,6BAtGD,MAsGO,IAAI,OAAO,CAAP,MAAc,MAAlB,EAA0B;AAC7B,kCAAE,IAAF,CAAO,KAAK,eAAL,CAAqB,OAArB,CAAP,EACK,IADL,CACU,UAAC,SAAD,EAAe;AACjB,wCAAI,UAAU,eAAV,GAA4B,CAAhC,EAAmC;AAC/B,4CAAM,WAAW,EAAE,KAAF,EAAS;AACtB,0DAAc,UAAU,KADF;AAEtB,yDAAa,UAAU,IAAV,CAAe,EAFN;AAGtB,4DACI,UAAU,MAAV,CACK,YADL,CACkB,IADlB,IAEA,IAFA,GAGM,wBAHN,GAIM,UAAU,MAAV,CACK,YADL,CAEK,IAVO;AAWtB,+DAAmB,mBACf,WADe,EAEf;AACI,mDAAG,UAAU;AADjB,6CAFe;AAXG,yCAAT,CAAjB;AAkBH,qCAnBD,MAmBO;AACH,gEACI,SADJ,EAEI,OAFJ;AAIH;AACJ,iCA3BL,EA4BK,IA5BL,CA4BU,YAAM;AACR,4DAAwB,IAAxB,EAA8B,OAA9B;AACH,iCA9BL;AA+BH;AACJ;AA7IE,qBAAP;AA+IH;AACD;AAtOR;;AAyOA,UAAE,MAAF,EAAU,IAAV,CAAe,uBAAf,EAAwC,IAAxC;AACH,KAlQD,MAkQO,IACH,UACA,CAAC,IADD,IAEA,EAAE,MAAF,EAAU,IAAV,CAAe,iBAAf,MAAsC,MAHnC,EAIL;AACE,iBAAS,OAAO,KAAP,CAAa,GAAb,CAAT;AACA,YAAM,WAAU,OAAO,CAAP,CAAhB;;AAEA;AACA,YAAM,aAAa,QACd,OADc,CACN,mBAAmB,sBAAnB,CADM,EACsC,EADtC,EAEd,OAFc,CAEN,qCAFM,EAEiC,EAFjC,CAAnB;AAGA,YAAM,cAAc,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,oBAAzB,EAA+C;AAC/D,qBAAS,UADsD;AAE/D,oBAAQ,CAAC,OAAO,CAAP,CAAD,EAAY,QAAZ,EAAqB,IAArB,CAA0B,GAA1B;AAFuD,SAA/C,CAApB;;AAKA,UAAE,kBAAF,EAAsB,IAAtB,CAA2B,iBAA3B,EAA8C,WAA9C;AACH;AACJ,CA9RD;;qBAgSe,4B;;;;;;;;;ACvSf;;;;AACA;;;;;;AAEA;;;AAGA,IAAM,mBAAmB,SAAnB,gBAAmB,CAAS,UAAT,EAAqB,cAArB,EAAqC,OAArC,EAA8C;AACnE,QAAM,UAAU,WAAW,IAAX,CAAgB,UAAhB,CAAhB;AACA,QAAM,iBAAiB,WAAW,IAAX,CAAgB,aAAhB,CAAvB;;AAEA,QAAI,UAAU,KAAd;AACA,QAAI,kBAAkB,IAAlB,IAA0B,mBAAmB,cAAjD,EAAiE;AAC7D,kBAAU,IAAV;AACH;AACD,QAAM,SAAS,UAAU,CAAV,GAAc,cAA7B;AACA,QAAI,OAAJ,EAAa;AACT,mBAAW,IAAX,CAAgB,aAAhB,EAA+B,IAA/B;AACA,mBAAW,WAAX,CAAuB,aAAvB;AACA,oCAAU,UAAV,EAAsB,WAAW,IAAX,CAAgB,eAAhB,CAAtB,EAAwD,EAAC,WAAW,KAAZ,EAAmB,gBAAnB,EAAxD;AACH,KAJD,MAIO;AACH,4CAAkB,UAAlB,EAA8B,MAA9B,EAAsC,EAAC,WAAW,IAAZ,EAAkB,gBAAlB,EAAtC;AACH;;AAED,QAAI,WAAW,QAAX,CAAoB,YAApB,CAAJ,EAAuC;AACnC;AACA,YAAM,aAAa,OAAO,QAAP,CAAgB,QAAnC;AACA,YAAM,SAAS,CAAC,MAAD,EAAS,OAAT,EAAkB,MAAlB,EAA0B,IAA1B,CAA+B,GAA/B,CAAf;AACA,eAAO,QAAP,GAAkB,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,aAAzB,EAAwC,EAAC,SAAS,UAAV,EAAsB,cAAtB,EAAxC,CAAlB;AACH,KALD,MAKO,IAAI,OAAJ,EAAa;AAChB,aAAK,gBAAL,CAAsB,OAAtB;AACH,KAFM,MAEA;AACH,aAAK,aAAL,CAAmB,OAAnB,EAA4B,MAA5B;AACH;AACJ,CA3BD;;qBA6Be,gB;;;;;;;;;ACnCf;;;;;;AAEA;;;AAGA,IAAM,oBAAoB,SAApB,iBAAoB,CAAS,UAAT,EAAqB,MAArB,EAA6B,OAA7B,EAAsC;AAC5D,eAAW,IAAX,CAAgB,aAAhB,EAA+B,MAA/B;AACA,eAAW,WAAX,CAAuB,aAAvB,EAAsC,QAAtC,CAA+C,aAA/C;AACA,gCAAU,UAAV,EAAsB,MAAtB,EAA8B,OAA9B;AACH,CAJD;;qBAMe,iB;;;;;;;;ACXf;;;AAGA,IAAM,uBAAuB,SAAvB,oBAAuB,GAAY;AACrC,QAAM,gBAAgB,OAAO,IAAP,CAAY,wBAAZ,CAAtB;AACA,QAAM,WAAW,OAAO,IAAP,CAAY,UAAZ,CAAjB;AACA,QAAM,cAAc,OAAO,IAAP,CAAY,aAAZ,EAA2B;AAC3C,2GAAiG,aAAjG;AAD2C,KAA3B,CAApB;AAGA,QAAM,kBAAkB,OAAO,IAAP,CAAY,iBAAZ,EAA+B;AACnD,wDAA8C,QAA9C;AADmD,KAA/B,CAAxB;AAGA,MAAE,kBAAF,EAAsB,IAAtB;AACI;AACG,eAFP,8DAKU,eALV;AAQH,CAjBD;;qBAmBe,oB;;;;;;;;ACtBf;;;;;AAKA,IAAM,gBAAgB,SAAhB,aAAgB,CAAS,IAAT,EAAe,KAAf,EAAsB;AACxC,QAAM,OAAO,OAAO,QAAP,CAAgB,QAA7B;AACA,QAAI,cAAc,OAAO,QAAP,CAAgB,MAAlC;;AAEA,QAAI,WAAJ,EAAiB;AACb,6BAAmB,IAAnB,SAA2B,KAA3B;AACH,KAFD,MAEO;AACH,6BAAmB,IAAnB,SAA2B,KAA3B;AACH;;AAED,WAAO,QAAP,CAAgB,IAAhB,GAAuB,OAAO,WAA9B;AACH,CAXD;;qBAae,a;;;;;;;;AClBf;;;;;AAKA,IAAM,iBAAiB,SAAjB,cAAiB,CAAU,EAAV,EAAc;AACjC,QAAM,aAAa,GAAG,KAAH,CAAS,GAAT,EAAc,IAAd,CAAmB,GAAnB,CAAnB;;AAEA,QAAM,SAAS,EAAf;AACA,QAAM,KAAK,uBAAX;AACA,QAAI,SAAS,GAAG,IAAH,CAAQ,UAAR,CAAb;;AAEA,WAAO,MAAP,EAAe;AACX,eAAO,mBAAmB,OAAO,CAAP,CAAnB,CAAP,IAAwC,mBAAmB,OAAO,CAAP,CAAnB,CAAxC;AACA,iBAAS,GAAG,IAAH,CAAQ,UAAR,CAAT;AACH;;AAED,WAAO,MAAP;AACH,CAbD;;qBAee,c;;;;;;;;;ACpBf;;;;;;AACA;;;;;AAKA,IAAM,oBAAoB,SAApB,iBAAoB,CAAS,IAAT,EAAe,KAAf,EAAsB;AAC5C,QAAM,OAAO,OAAO,QAAP,CAAgB,QAA7B;AACA,QAAI,cAAc,OAAO,QAAP,CAAgB,MAAhB,CAAuB,OAAvB,CAA+B,YAA/B,EAA6C,SAA7C,EAAwD,OAAxD,CAAgE,aAAhE,EAA+E,SAA/E,CAAlB;AACA,QAAM,QAAQ,iCAAe,WAAf,CAAd;;AAEA,QAAI,WAAJ,EAAiB;AACb,YAAI,MAAM,IAAN,CAAJ,EAAiB;AACb,0BAAc,YAAY,OAAZ,CAAuB,IAAvB,SAA+B,MAAM,IAAN,CAA/B,EAAiD,IAAjD,SAAyD,KAAzD,CAAd;AACH,SAFD,MAEO;AACH,iCAAmB,IAAnB,SAA2B,KAA3B;AACH;AACJ,KAND,MAMO;AACH,4BAAkB,IAAlB,SAA0B,KAA1B;AACH;;AAED,WAAO,QAAP,CAAgB,IAAhB,GAAuB,OAAO,WAA9B;AACH,CAhBD;;qBAkBe,iB;;;;;;;;ACxBf;;;;;AAKA,IAAM,yBAAyB,SAAzB,sBAAyB,CAAS,EAAT,EAAa;AACxC,QAAM,MAAM,GAAG,KAAH,CAAS,GAAT,CAAZ;;AAEA,QAAI,IAAI,MAAJ,KAAe,CAAf,IAAoB,IAAI,CAAJ,EAAO,OAAP,CAAe,gBAAf,IAAmC,CAA3D,EAA8D;AAC1D,eAAO,EAAP;AACH;;AAED,QAAI,QAAQ,EAAZ;AACA,SAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,IAAI,MAAxB,EAAgC,GAAhC,EAAqC;AACjC,YAAI,IAAI,CAAJ,EAAO,OAAP,CAAe,gBAAf,IAAmC,CAAC,CAAxC,EAA2C;AACvC,gBAAI,CAAJ,IAAS,EAAT;AACH,SAFD,MAEO,IAAI,IAAI,CAAJ,IAAS,IAAI,IAAI,MAArB,EAA6B;AAChC,qBAAS,GAAT;AACH;AACD,iBAAS,IAAI,CAAJ,CAAT;AACH;;AAED,WAAO,KAAP;AACH,CAlBD;;qBAoBe,sB;;;;;;;;;ACxBf,IAAM,QAAA,GAAW,MAAA,CAAO,QAAxB,CAAA;AACA;AACA,IAAM,IAAA,GAAO,OAAA,CAAQ,MAAR,CAAb,CAAA;AACA,IAAM,cAAA,GAAiB,CAAA,CAAE,QAAF,CAAW,4JAAX,CAAvB,CAAA;;AAEA,IAAM,QAAA,GAAW,QAAA,CAAS,IAAT,CAAc,MAAd,CAAqB;IAElC,KAFkC,EAAA,SAAA,KAAA,GAE1B;QACJ,IAAA,CAAK,OAAL,CAAa,OAAb,CAAA,CAAA;QACA,IAAA,CAAK,MAAL,EAAA,CAAA;QACA,IAAA,CAAK,MAAL,EAAA,CAAA;QACA,IAAA,CAAK,aAAL,EAAA,CAAA;;QAEA,IAAA,CAAK,OAAL,IAAgB,IAAA,CAAK,OAAL,EAAhB,CAAA;QACA,OAAO,IAAP,CAAA;KAT8B;IAYlC,OAZkC,EAAA,SAAA,OAAA,GAYL;QAAA,IAAA,IAAA,GAAA,SAAA,CAAA,MAAA,GAAA,CAAA,IAAA,SAAA,CAAA,CAAA,CAAA,KAAA,SAAA,GAAA,SAAA,CAAA,CAAA,CAAA,GAAJ,EAAI;YAApB,YAAoB,GAAA,IAAA,CAApB,YAAoB,CAAA;;QACzB,IAAM,OAAA,GAAU;YACZ,IAAA,EAAM,MAAA,CAAO,IADD;YAEZ,IAAA,EAAM,MAAA,CAAO,IAAA;SAFjB,CAAA;QAIA,IAAM,IAAA,GAAO,YAAA,IAAgB,IAAA,CAAK,eAAL,EAA7B,CAAA;QACA,OAAO,IAAA,CAAK,QAAL,CAAc,CAAA,CAAE,MAAF,CAAS,EAAT,EAAa,IAAb,EAAmB,OAAnB,CAAd,CAAP,CAAA;KAlB8B;IAqBlC,YArBkC,EAAA,SAAA,YAAA,CAqBrB,OArBqB,EAqBZ;QAClB,OAAO,IAAA,CAAK,GAAL,CAAS,IAAT,CAAc,IAAA,CAAK,OAAL,CAAa,OAAb,CAAd,CAAP,CAAA;KAtB8B;IAyBlC,QAzBkC,EAAA,SAAA,QAAA,CAyBzB,OAzByB,EAyBhB;QACd,IAAA,CAAK,YAAL,CAAkB,OAAlB,CAAA,CAAA;QACA,IAAI,IAAA,CAAK,MAAL,IAAe,CAAC,IAAA,CAAK,QAAzB,EAAmC;YAC/B,IAAA,CAAK,YAAL,IAAqB,IAAA,CAAK,YAAL,EAArB,CAAA;YACA,IAAA,CAAK,MAAL,EAAA,CAAA;YACA,IAAA,CAAK,QAAL,GAAgB,IAAhB,CAAA;SACH;KA/B6B;IAkClC,MAlCkC,EAAA,SAAA,MAAA,GAkCzB;QACL,IAAI,EAAE,IAAA,CAAK,OAAL,YAAwB,QAAA,CAAS,CAAnC,CAAJ,EAA2C;YACvC,IAAA,CAAK,OAAL,GAAe,QAAA,CAAS,CAAT,CAAW,IAAA,CAAK,MAAhB,CAAf,CAAA;SACH;QACD,IAAA,CAAK,OAAL,CAAa,MAAb,CAAoB,IAAA,CAAK,GAAzB,CAAA,CAAA;KAtC8B;IAyClC,MAzCkC,EAAA,SAAA,MAAA,CAyC3B,OAzC2B,EAyClB;QACZ,IAAA,CAAK,WAAL,EAAA,CAAA;;QAEA,IAAI,IAAA,CAAK,YAAT,EAAuB;YACnB,IAAA,CAAK,YAAL,EAAA,CAAA;SACH;QACD,IAAA,CAAK,QAAL,CAAc,OAAd,CAAA,CAAA;QACA,IAAI,IAAA,CAAK,WAAT,EAAsB;YAClB,IAAA,CAAK,WAAL,EAAA,CAAA;SACH;QACD,OAAO,IAAP,CAAA;KAnD8B;IAsDlC,eAtDkC,EAAA,SAAA,eAAA,GAsDhB;QACd,OAAO,IAAA,CAAK,KAAL,IAAc,IAAA,CAAK,KAAL,CAAW,MAAX,EAAd,IAAqC,EAA5C,CAAA;KAvD8B;IA0DlC,YA1DkC,EAAA,SAAA,YAAA,GA0DnB;QACX,IAAM,IAAA,GAAO,CAAA,CAAE,IAAA,CAAK,MAAP,CAAA,CAAe,MAAf,GAAwB,CAAA,CAAE,IAAA,CAAK,MAAP,CAAxB,GAAyC,IAAA,CAAK,GAA3D,CAAA;QACA,IAAA,CAAK,KAAL,EAAA,CAAa,MAAb,CAAoB,cAAA,CAAe,EAAC,IAAA,EAAM,MAAA,CAAO,IAAd,EAAf,CAApB,CAAA,CAAA;KA5D8B;IA+DlC,WA/DkC,EAAA,SAAA,WAAA,GA+DpB;;QAEV,IAAM,OAAA,GAAU,CAAA,CAAE,eAAF,CAAhB,CAAA;QACA,IAAI,OAAA,CAAQ,MAAZ,EAAoB;YAChB,OAAA,CAAQ,MAAR,EAAA,CAAA;SACH;KACJ;CArEY,CAAjB,CAAA;;qBAyEe;;;;;;;;;;AC/Ef;;;;;;AAEA,IAAM,iBAAiB,kBAAS,MAAT,CAAgB;;AAEnC,WAAO,EAF4B;;AAInC,UAAM,SAAS,aAAT,CAAuB,KAAvB,CAJ6B;;AAMnC,gBANmC,0BAMpB;AACX,eAAO,KAAK,KAAL,CAAW,MAAX,GAAoB,CAA3B,EAA8B;AAC1B,iBAAK,KAAL,CAAW,CAAX,EAAc,UAAd;AACA,mBAAO,KAAK,KAAL,CAAW,CAAX,CAAP;AACA,iBAAK,KAAL,CAAW,KAAX;AACH;AACJ,KAZkC;AAcnC,WAdmC,qBAczB;AACN,aAAK,YAAL;AACA,aAAK,GAAL,CAAS,KAAT;AACA,aAAK,IAAL,CAAU,SAAV,GAAsB,EAAtB;AACH,KAlBkC;AAoBnC,gBApBmC,0BAoBpB;AACX,aAAK,OAAL;AACH,KAtBkC;AAwBnC,YAxBmC,sBAwBxB;AACP,aAAK,QAAL,IAAiB,kBAAS,SAAT,CAAmB,QAAnB,CAA4B,IAA5B,CAAiC,IAAjC,CAAjB;AACA,aAAK,mBAAL;AACH,KA3BkC;AA6BnC,uBA7BmC,iCA6Bb;AAClB,aAAK,UAAL;AACA,aAAK,WAAL;AACH,KAhCkC;AAkCnC,cAlCmC,wBAkCtB;AACT,aAAK,UAAL,CAAgB,IAAhB,CAAqB,KAAK,SAA1B,EAAqC,IAArC;AACH,KApCkC;AAsCnC,eAtCmC,yBAsCrB;AACV,aAAK,GAAL,CAAS,MAAT,CAAgB,KAAK,IAArB;AACH,KAxCkC;AA0CnC,aA1CmC,qBA0CzB,KA1CyB,EA0ClB,KA1CkB,EA0CX;AACpB,YAAM,OAAO,KAAK,cAAL,CAAoB,EAAC,YAAD,EAApB,CAAb;AACA,aAAK,YAAL,IAAqB,KAAK,YAAL,CAAkB,EAAC,UAAD,EAAO,YAAP,EAAc,YAAd,EAAlB,CAArB;AACA,YAAM,OAAO,KAAK,MAAL,GAAc,EAA3B;AACA,aAAK,UAAL,CAAgB,EAAC,UAAD,EAAO,UAAP,EAAa,YAAb,EAAoB,YAApB,EAAhB;AACA,aAAK,KAAL,CAAW,IAAX,CAAgB,IAAhB;AACH,KAhDkC;AAkDnC,cAlDmC,4BAkDhB;AAAA,YAAP,IAAO,QAAP,IAAO;;AACf,aAAK,IAAL,CAAU,WAAV,CAAsB,IAAtB;AACH,KApDkC;AAsDnC,mBAtDmC,6BAsDjB;AACd,eAAO,KAAK,UAAL,IAAmB,KAAK,UAAL,CAAgB,MAAnC,IAA6C,EAApD;AACH;AAxDkC,CAAhB,CAAvB;;qBA4De,c;;;;;;;;;AC9Df;;;;;;AAEA,IAAM,mBAAmB,SAAnB,gBAAmB,CAAS,KAAT,EAAgB;;AAErC,6CAAoB,KAApB;AAEH,CAJD;;qBAMe,gB;;;;;ACRf;;;;;;;AAOA,EAAE,QAAF,EAAY,KAAZ,CAAkB,YAAY;AAC1B,MAAE,MAAF,EAAU,EAAV,CAAa,eAAb,EAA8B,UAAU,CAAV,EAAa;AACvC,YAAI,EAAE,IAAF,IAAU,mBAAd,EAAmC;AAC/B,cAAE,cAAF;AACH;AACJ,KAJD;;AAMA;AACA,MAAE,MAAF,EAAU,MAAV,CAAiB,UAAU,CAAV,EAAa;AAC1B,YAAI,EAAE,IAAF,EAAQ,IAAR,CAAa,aAAb,EAA4B,EAA5B,CAA+B,UAA/B,CAAJ,EAAgD;AAC5C,cAAE,cAAF;AACH;AACJ,KAJD;;AAMA,QAAI,OAAO,QAAP,KAAoB,UAAxB,EAAoC;AAChC,YAAI,OAAO,SAAS,EAAE,KAAK,YAAP,EAAT,CAAX;;AAEA,UAAE,iBAAF;AACI;AADJ,SAEK,QAFL,CAEc,QAFd;AAGI;AAHJ,SAIK,IAJL,CAKQ,KALR,EAMQ,4EANR;AAQI;AARJ,SASK,EATL,CASQ,MATR,EASgB,YAAY;AACpB,gBAAI,KAAK,YAAL,CAAkB,YAAlB,CAAJ,EAAqC;AACjC,kBAAE,IAAF,EACK,UADL,CACgB,mBADhB,EAEK,WAFL,CAEiB,QAFjB;AAGH;AACJ,SAfL;AAgBI;AAhBJ,SAiBK,IAjBL,CAiBU,YAAY;AACd,iBAAK,IAAL;AACH,SAnBL;AAoBH,KAvBD,MAuBO;AACH,UAAE,iBAAF,EAAqB,IAArB,CAA0B,KAA1B,EAAiC,YAAY;AACzC,mBAAO,EAAE,IAAF,EAAQ,IAAR,CAAa,YAAb,CAAP;AACH,SAFD;AAGH;;AAED,MAAE,gBAAF,EAAoB,IAApB,CACI,MADJ,EAEI,EAAE,gBAAF,EAAoB,IAApB,CAAyB,MAAzB,IACI,WADJ,GAEI,OAAO,QAAP,CAAgB,QAFpB,GAGI,uBAAuB,SAAS,MAAhC,CAHJ,GAII,SAAS,IAAT,CAAc,OAAd,CAAsB,GAAtB,EAA2B,UAA3B,CANR;;AASA,QAAI,YACA,OAAO,SAAP,CAAiB,QAAjB,CAA0B,KAA1B,CAAgC,KAAhC,KAA0C,CAAC,OAAO,YAAlD,GACM,IADN,GAEM,KAHV;AAIA,QAAI,kBAAkB,OAAO,SAAP,CAAiB,SAAjB,CAA2B,KAA3B,CAClB,oFADkB,IAGhB,IAHgB,GAIhB,KAJN;AAKA,QAAI,QAAQ,QAAQ,GAAR,CAAY,WAAZ,KAA4B,SAAxC;;AAEA,QAAI,aAAa,eAAb,IAAgC,KAApC,EAA2C;AACvC,YAAI,QAAQ,EACR,mEADQ,CAAZ;AAGA,cAAM,IAAN,CAAW,YAAY;AACnB,gBAAI,EAAE,IAAF,EAAQ,IAAR,CAAa,WAAb,CAAJ,EAA+B;AAC3B,kBAAE,IAAF,EACK,IADL,CACU,YADV,EACwB,MADxB,EAEK,IAFL,CAEU,MAFV,EAEkB,EAAE,IAAF,EAAQ,IAAR,CAAa,WAAb,CAFlB,EAGK,IAHL,CAGU,QAHV,EAGoB,QAHpB,EAIK,IAJL,CAIU,KAJV,EAIiB,YAJjB,EAKK,UALL,CAKgB,gBALhB;AAMH;AACJ,SATD;AAUH;;AAED,QACI,EAAE,oCAAF,EACK,KADL,GAEK,IAFL,CAEU,iBAFV,EAGK,IAHL,GAGY,MAHZ,GAGqB,GAJzB,EAKE;AACE,UAAE,oBAAF,EAAwB,QAAxB,CAAiC,SAAjC;AACH;;AAED;AACA;AACA;AACA;AACA,QAAI,aAAa,EAAE,0BAAF,CAAjB;AACA,eAAW,EAAX,CAAc,QAAd,EAAwB,YAAY;AAChC,eAAO,iBAAP,CAAyB,QAAzB,EAAmC,EAAE,IAAF,EAAQ,GAAR,EAAnC;AACH,KAFD;AAGH,CAhGD;;AAkGA;;;AAGA,EAAE,eAAF,EAAmB,EAAnB,CAAsB,OAAtB,EAA+B,YAAY;AACvC,MAAE,IAAF,EAAQ,UAAR,CAAmB,QAAnB,EAA6B,OAA7B;AACH,CAFD;;AAIA,OAAO,SAAP,GAAmB,CAAnB;;AAEA;;;AAGA,EAAE,kBAAF,EAAsB,EAAtB,CAAyB,QAAzB,EAAmC,UAAU,CAAV,EAAa;AAC5C,4BAAwB,CAAxB,EAA2B,IAA3B;AACH,CAFD;;AAIA;;;AAGA,EAAE,kBAAF,EAAsB,EAAtB,CAAyB;AACrB,gBAAY,sBAAY;AACpB,eAAO,SAAP,GAAmB,CAAnB;AACH;AAHoB,CAAzB;;AAMA,EAAE,kBAAF,EAAsB,IAAtB,CAA2B,YAAY;AACnC,uBAAmB,IAAnB;AACH,CAFD;;AAIA,IAAI,CAAC,OAAO,MAAR,IAAkB,CAAC,OAAO,MAA9B,EAAsC;AAClC,MAAE,kBAAF,EAAsB,IAAtB,CAA2B,YAAY;AACnC,WAAG,UAAH,CAAc,EAAE,IAAF,EAAQ,CAAR,CAAd,EAA0B,EAAE,iBAAiB,IAAnB,EAA1B;AACH,KAFD;AAGH;;AAED,EAAE,wBAAF,EAA4B,EAA5B,CAA+B,OAA/B,EAAwC,YAAY;AAChD,QAAI,OAAO,EAAE,IAAF,EACN,QADM,CACG,cADH,EAEN,QAFM,CAEG,4BAFH,CAAX;AAGA,mBAAe,OAAf,EAAwB,IAAxB;AACH,CALD;;AAOA,EAAE,uBAAF,EAA2B,EAA3B,CAA8B,OAA9B,EAAuC,YAAY;AAC/C,QAAI,OAAO,EAAE,IAAF,EACN,QADM,CACG,cADH,EAEN,QAFM,CAEG,4BAFH,CAAX;AAGA,mBAAe,MAAf,EAAuB,IAAvB;AACH,CALD;;AAOA;;;AAGA,EAAE,OAAF,EAAW,EAAX,CAAc,uBAAd,EAAuC,YAAY;AAC/C,MAAE,IAAF,EAAQ,IAAR,CAAa,GAAb,EAAkB,IAAlB,CAAuB,UAAvB,EAAmC,IAAnC;AACA,MAAE,IAAF,EAAQ,IAAR,CAAa,IAAb,EAAmB,IAAnB,CAAwB,UAAxB,EAAoC,IAApC;AACA,QAAI,OAAO,EAAE,uBAAuB,EAAE,IAAF,EAAQ,IAAR,CAAa,IAAb,CAAvB,GAA4C,QAA9C,CAAX;AACA,SAAK,IAAL,CAAU,eAAV,EAA2B,OAA3B;AACH,CALD;;AAOA,EAAE,kBAAF,EAAsB,EAAtB,CAAyB,UAAzB,EAAqC,YAAY;AAC7C,QAAI,WAAW,EAAE,IAAF,EAAQ,OAAR,CAAgB,qBAAhB,EAAuC,IAAvC,CAA4C,IAA5C,CAAf;AACA,aAAS,QAAT,CAAkB,GAAlB,EAAuB,KAAvB;AACH,CAHD;;AAKA,EAAE,4BAAF,EACK,EADL,CACQ,SADR,EACmB,UAAU,CAAV,EAAa;AACxB,iBAAa,CAAb;AACH,CAHL,EAIK,EAJL,CAIQ,SAJR,EAImB,GAJnB,EAIwB,UAAU,CAAV,EAAa;AAC7B,iBAAa,CAAb;AACH,CANL;;AAQA,EAAE,gBAAF,EACK,EADL,CACQ,SADR,EACmB,UAAU,CAAV,EAAa;AACxB,wBAAoB,CAApB;AACH,CAHL,EAIK,EAJL,CAIQ,SAJR,EAImB,GAJnB,EAIwB,UAAU,CAAV,EAAa;AAC7B,wBAAoB,CAApB;AACH,CANL;;AAQA;AACA,EAAE,QAAF,EAAY,KAAZ,CAAkB,YAAY;AAC1B,MAAE,QAAF,EAAY,EAAZ,CAAe,qBAAf,EAAsC,YAAY;AAC9C,UAAE,MAAF,CAAS,oBAAT,GAAgC,KAAhC;AACH,KAFD;AAGA,MAAE,QAAF,EAAY,EAAZ,CAAe,iBAAf,EAAkC,YAAY;AAC1C,UAAE,MAAF,CAAS,oBAAT,GAAgC,IAAhC;AACH,KAFD;AAGH,CAPD;;AASA,EAAE,kBAAF,EAAsB,EAAtB,CAAyB,qBAAzB,EAAgD,YAAY;AACxD,QAAI,SAAS,EAAE,kBAAF,CAAb;AACA,QAAI,OAAO,IAAP,CAAY,iBAAZ,CAAJ,EAAoC;AAChC,eAAO,IAAP,CAAY,MAAZ,EAAoB,OAAO,IAAP,CAAY,iBAAZ,CAApB;AACA,eAAO,UAAP,CAAkB,iBAAlB;AACH;AACJ,CAND;;AAQA,EAAE,MAAF,EAAU,MAAV,CAAiB,YAAY;AACzB,iBAAa,KAAK,EAAlB;AACA,SAAK,EAAL,GAAU,WAAW,YAAY,CAAE,CAAzB,EAA2B,GAA3B,CAAV,CAFyB,CAEkB;AAC9C,CAHD;;AAKA;AACA,IAAI,YAAY,KAAhB;AACA,EAAE,MAAF,EACK,EADL,CACQ,WADR,EACqB,YAAY;AACzB,gBAAY,IAAZ;AACH,CAHL,EAIK,EAJL,CAIQ,UAJR,EAIoB,YAAY;AACxB,gBAAY,KAAZ;AACH,CANL;;AAQA;;;;AAIA,EAAE,UAAF,EAAc,EAAd,CAAiB,gBAAjB,EAAmC,UAAU,CAAV,EAAa;AAC5C,QAAI,SAAJ,EAAe;AACX,oBAAY,KAAZ;AACA;AACH;AACD,WAAO,QAAP,GAAkB,EAAE,IAAF,EAAQ,IAAR,CAAa,MAAb,CAAlB;AACH,CAND;;AAQA;AACA;AACA,EAAE,MAAF,CAAS,EAAE,IAAF,CAAO,GAAP,CAAT,EAAsB;AAClB,eAAW,mBAAU,EAAV,EAAc,KAAd,EAAqB,QAArB,EAA+B;AACtC,eAAO,EAAE,EAAF,EAAM,EAAN,CAAS,+BAAT,CAAP;AACH;AAHiB,CAAtB;;AAMA,IAAI;AACA,WAAO,OAAP,IACI,OAAO,OAAP,CAAe,GADnB,IAEI,OAAO,OAAP,CAAe,GAAf,CACI,mMADJ,CAFJ;AAKH,CAND,CAME,OAAO,CAAP,EAAU,CAAE;;;;;ACpPd;AACA,OAAO,IAAP,GAAc;AACV,SAAK,OAAO,YADF;AAEV;AACA,YAAQ,gBAAU,OAAV,EAAmB,aAAnB,EAAkC,QAAlC,EAA4C,KAA5C,EAAmD;AACvD,iBAAS,IAAT,CAAc,YAAY;AACtB,cAAE,IAAF,EAAQ,OAAR,CAAgB,eAAhB;AACH,SAFD;;AAIA,eAAO,EAAE,IAAF,CACH,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,WAAzB,EAAsC,EAAE,SAAS,OAAX,EAAtC,CADG,EAEH;AACI,2BAAe,aADnB;AAEI,mBAAO,KAFX;AAGI,sBAAU,OAAO,MAAP,IAAiB,OAAO;AAHtC,SAFG,EAQF,IARE,CAQG,UAAU,IAAV,EAAgB;AAClB,qBAAS,IAAT,CAAc,UAAU,CAAV,EAAa,EAAb,EAAiB;AAC3B,oBAAI,OAAO,EAAE,EAAF,CAAX;;AAEA,oBAAI,KAAK,IAAL,CAAU,WAAV,MAA2B,aAA/B,EAA8C;AAC1C,sBAAE,QAAF,EAAY,OAAZ,CAAoB,aAApB,EAAmC,CAAC,IAAD,EAAO,IAAP,CAAnC;;AAEA,wBAAI,KAAK,OAAL,CAAa,OAAb,KAAyB,MAA7B,EAAqC;AACjC,6BAAK,UAAL,CAAgB,WAAhB,EAA6B,MAA7B,CACI,eADJ,EADiC,CAG9B;AACN;AACJ,iBARD,MAQO;AACH,sBAAE,QAAF,EAAY,OAAZ,CAAoB,eAApB,EAAqC,CAAC,IAAD,EAAO,IAAP,CAArC;AACH;AACJ,aAdD;AAeH,SAxBE,EAyBF,IAzBE,CAyBG,UAAU,KAAV,EAAiB,UAAjB,EAA6B,WAA7B,EAA0C;AAC5C,qBAAS,IAAT,CAAc,UAAU,CAAV,EAAa,EAAb,EAAiB;AAC3B,oBAAI,OAAO,EAAE,EAAF,CAAX;AACA,qBAAK,OAAL,CAAa,eAAb,EAA8B,CAC1B,IAD0B,EAE1B;AACI,2BAAO,KADX;AAEI,gCAAY,UAFhB;AAGI,iCAAa;AAHjB,iBAF0B,CAA9B;AAQH,aAVD;AAWH,SArCE,CAAP;AAsCH,KA9CS;;AAgDV,iBAAa,qBAAU,OAAV,EAAmB;AAC5B,YAAI,OAAO,IAAX;AACA,UAAE,IAAF,CAAO;AACH,iBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,WAAzB,EAAsC;AACvC,yBAAS,SAAS,OAAT,EAAkB,EAAlB;AAD8B,aAAtC,CADF;AAIH,kBAAM,QAJH;AAKH,qBAAS,mBAAY;AACjB,uBAAO,QAAP,GAAkB,OAAO,QAAP,CAAgB,QAAlC;AACH,aAPE;AAQH,mBAAO,eAAU,KAAV,EAAiB,UAAjB,EAA6B,WAA7B,EAA0C;AAC7C,oBAAI,WAAW,KAAK,KAAL,CAAW,MAAM,YAAjB,CAAf;AACA,oBAAI,SAAS,cAAb,EAA6B;AACzB,yBAAK,GAAL,CAAS,OAAT,CAAiB,sBAAjB;AACH,iBAFD,MAEO,IAAI,OAAJ,EAAa;AAChB,wBAAI,OAAO,EAAX;AACA,wBAAI,SAAS,SAAT,KAAuB,4BAA3B,EAAyD;AACrD,6CAAmB,OAAO,UAAP,CACf,OAAO,SAAP,CAAiB,OADF,EAEf,OAAO,SAAP,CAAiB,eAAjB,CAAiC,WAFlB,CAAnB,uBAGmB,OAAO,IAAP,CACf,qBADe,CAHnB;AAMH,qBAPD,MAOO,IACH,SAAS,SAAT,KACA,wCAFG,EAGL;AACE,6CAAmB,OAAO,GAAP,CACf,OAAO,MAAP,CAAc,aADC,EAEf;AACI,oCAAQ,cADZ;AAEI,qCAAS;AAFb,yBAFe,CAAnB,wDAMoD,OAAO,IAAP,CAChD,aADgD,CANpD;AASH;;AAED,4BAAQ,IAAR,CACI,aACI,OAAO,IAAP,CAAY,cAAZ,CADJ,GAEI,YAFJ,GAGI,OAAO,IAAP,CAAY,WAAW,SAAS,SAAhC,EAA2C;AACvC,8BAAM;AADiC,qBAA3C,CAJR,EAOI,OAPJ;AASH;;AAED,kBAAE,eAAF,EAAmB,UAAnB,CAA8B,QAA9B,EAAwC,OAAxC;AACH;AAhDE,SAAP;AAkDH,KApGS;;AAsGV;AACA,eAAW,mBAAU,OAAV,EAAmB,KAAnB,EAA0B,QAA1B,EAAoC;AAC3C,iBAAS,IAAT,CAAc,YAAY;AACtB,gBAAI,CAAC,EAAE,IAAF,EAAQ,QAAR,CAAiB,gBAAjB,CAAL,EAAyC;AACrC,kBAAE,IAAF,EAAQ,OAAR,CAAgB,aAAhB,EAA+B,EAAE,IAAF,CAA/B;AACH;AACJ,SAJD;;AAMA,UAAE,IAAF,CAAO;AACH,iBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,cAAzB,CADF;AAEH,kBAAM,MAFH;AAGH,kBAAM;AACF,uBAAO,KADL;AAEF,yBAAS,OAFP;AAGF,0BAAU,OAAO,MAAP,IAAiB,OAAO,MAHhC;AAIF,8BACI,OAAO,cAAP,CAAsB,oBAAtB,KACA,OAAO,OAAP,CAAe,GAAf,CAAmB,oBAAnB,CADA,IAEA,EAAE,MAAF,EAAU,IAAV,CAAe,MAAf,CAFA,IAGA;AARF,aAHH;AAaH,qBAAS,iBAAU,IAAV,EAAgB,UAAhB,EAA4B,GAA5B,EAAiC;AACtC,yBAAS,IAAT,CAAc,YAAY;AACtB;AACA,wBAAI,IAAI,MAAJ,KAAe,GAAnB,EAAwB;AACpB,4BAAI,UAAU,EAAE,cAAc,IAAhB,EAAd;AACA,0BAAE,IAAF,EAAQ,OAAR,CAAgB,aAAhB,EAA+B,CAAC,EAAE,IAAF,CAAD,EAAU,OAAV,CAA/B;AACH,qBAHD,MAGO;AACH,0BAAE,IAAF,EAAQ,OAAR,CAAgB,aAAhB,EAA+B,CAAC,EAAE,IAAF,CAAD,EAAU,IAAV,CAA/B;AACH;AACJ,iBARD;AASH,aAvBE;AAwBH,mBAAO,eAAU,QAAV,EAAoB;AACvB,yBAAS,IAAT,CAAc,YAAY;AACtB,sBAAE,IAAF,EAAQ,OAAR,CAAgB,aAAhB,EAA+B,CAAC,EAAE,IAAF,CAAD,EAAU,QAAV,CAA/B;AACH,iBAFD;AAGH;AA5BE,SAAP;AA8BH,KA5IS;;AA8IV;AACA,aAAS,iBAAU,OAAV,EAAmB;AACxB,eAAO,EAAE,IAAF,CAAO;AACV,iBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,aAAzB,EAAwC;AACzC,yBAAS,SAAS,OAAT;AADgC,aAAxC,CADK;AAIV,kBAAM;AAJI,SAAP,CAAP;AAMH,KAtJS;;AAwJV;AACA,kBAAc,sBAAU,OAAV,EAAmB;AAC7B,eAAO,EAAE,IAAF,CAAO;AACV,iBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,WAAzB,EAAsC;AACvC,yBAAS,SAAS,OAAT;AAD8B,aAAtC,CADK;AAIV,kBAAM;AAJI,SAAP,CAAP;AAMH,KAhKS;;AAkKV,gBAAY,oBAAU,IAAV,EAAgB,OAAhB,EAAyB;AACjC,UAAE,IAAF,CAAO;AACH,iBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,eAAzB,EAA0C;AAC3C,yBAAS,OADkC;AAE3C,yBAAS;AAFkC,aAA1C,CADF;AAKH,kBAAM,QALH;AAMH,qBAAS,mBAAY;AACjB,uBAAO,QAAP,CAAgB,MAAhB;AACH,aARE;AASH,mBAAO,eAAU,KAAV,EAAiB,UAAjB,EAA6B,WAA7B,EAA0C;AAC7C,oBAAI,WAAW,KAAK,KAAL,CAAW,MAAM,YAAjB,CAAf;AACA,oBAAI,OAAJ,EAAa;AACT,4BAAQ,IAAR,CACI,aACI,OAAO,IAAP,CAAY,cAAZ,CADJ,GAEI,YAFJ,GAGI,OAAO,IAAP,CAAY,WAAW,SAAS,SAAhC,CAJR,EAKI,OALJ;AAOH;AACD,kBAAE,QAAF,EAAY,UAAZ,CAAuB,QAAvB,EAAiC,OAAjC;AACH;AArBE,SAAP;AAuBH,KA1LS;;AA4LV;AACA,iBAAa,qBAAU,OAAV,EAAmB,QAAnB,EAA6B;AACtC,UAAE,QAAF,EAAY,IAAZ,CAAiB,YAAY;AACzB,cAAE,IAAF,EAAQ,OAAR,CAAgB,oBAAhB;AACH,SAFD;;AAIA,UAAE,IAAF,CAAO;AACH,iBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,kBAAzB,EAA6C;AAC9C,yBAAS;AADqC,aAA7C,CADF;AAIH,kBAAM,KAJH;AAKH,qBAAS,iBAAU,IAAV,EAAgB;AACrB,kBAAE,QAAF,EAAY,IAAZ,CAAiB,YAAY;AACzB,sBAAE,IAAF,EAAQ,OAAR,CAAgB,oBAAhB,EAAsC,IAAtC;AACH,iBAFD;AAGH,aATE;AAUH,mBAAO,eAAU,KAAV,EAAiB,UAAjB,EAA6B,WAA7B,EAA0C;AAC7C,kBAAE,QAAF,EAAY,IAAZ,CAAiB,YAAY;AACzB,sBAAE,IAAF,EAAQ,OAAR,CACI,oBADJ,EAEI,KAFJ,EAGI,UAHJ,EAII,WAJJ;AAMH,iBAPD;AAQH;AAnBE,SAAP;AAqBH,KAvNS;;AAyNV;AACA,oBAAgB,wBAAU,OAAV,EAAmB,QAAnB,EAA6B,MAA7B,EAAqC;AACjD,UAAE,QAAF,EAAY,IAAZ,CAAiB,YAAY;AACzB,cAAE,IAAF,EAAQ,OAAR,CAAgB,uBAAhB,EAAyC,QAAzC;AACH,SAFD;;AAIA,YAAI,OAAO,IAAX;;AAEA,UAAE,IAAF,CAAO;AACH,iBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,qBAAzB,EAAgD;AACjD,yBAAS;AADwC,aAAhD,CADF;AAIH,kBAAM,QAJH;AAKH,qBAAS,iBAAU,IAAV,EAAgB;AACrB,oBAAI,MAAJ,EAAY;AACR;AACA,2BAAO,QAAP,CAAgB,MAAhB;AACH,iBAHD,MAGO;AACH,sBAAE,QAAF,EAAY,IAAZ,CAAiB,YAAY;AACzB,0BAAE,IAAF,EAAQ,OAAR,CAAgB,uBAAhB,EAAyC,IAAzC;AACH,qBAFD;AAGH;AACJ,aAdE;AAeH,mBAAO,eAAU,KAAV,EAAiB,UAAjB,EAA6B,WAA7B,EAA0C;AAC7C,oBAAI,WAAW,KAAK,KAAL,CAAW,MAAM,YAAjB,CAAf;AACA,oBAAI,SAAS,cAAb,EAA6B;AACzB,yBAAK,GAAL,CAAS,OAAT,CAAiB,sBAAjB;AACH,iBAFD,MAEO;AACH,sBAAE,QAAF,EAAY,IAAZ,CAAiB,YAAY;AACzB,0BAAE,IAAF,EAAQ,OAAR,CACI,uBADJ,EAEI,KAFJ,EAGI,UAHJ,EAII,WAJJ;AAMH,qBAPD;AAQH;AACJ;AA7BE,SAAP;AA+BH,KAhQS;;AAkQV,oBAAgB,wBAAU,KAAV,EAAiB;AAC7B,YACI,SACA,MAAM,MADN,IAEA,OAAO,SAAP,CAAiB,eAFjB,IAGA,OAAO,SAAP,CAAiB,cAJrB,EAKE;AACE,cAAE,MAAF,EAAU,OAAV,CAAkB,oBAAlB;;AAEA,cAAE,IAAF,CAAO;AACH,qBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,SAAzB,CADF;AAEH,sBAAM,MAFH;AAGH,6BAAa,kBAHV;AAIH,yBAAS,KAJN;AAKH,sBAAM,KAAK,SAAL,CAAe,EAAE,UAAU,KAAZ,EAAf,CALH;AAMH,yBAAS,iBAAU,IAAV,EAAgB;AACrB,sBAAE,MAAF,EAAU,OAAV,CAAkB,oBAAlB,EAAwC,IAAxC;AACH,iBARE;AASH,uBAAO,eAAU,KAAV,EAAiB,UAAjB,EAA6B,WAA7B,EAA0C;AAC7C,sBAAE,MAAF,EAAU,OAAV,CACI,oBADJ,EAEI,KAFJ,EAGI,UAHJ,EAII,WAJJ,EAKI,KALJ;AAOH;AAjBE,aAAP;AAmBH;AACJ,KA/RS;;AAiSV,uBAAmB,2BAAU,OAAV,EAAmB,QAAnB,EAA6B,QAA7B,EAAuC;AACtD,YAAI,WAAW,EAAX,IAAiB,WAAW,IAAhC,EAAsC;AAClC;AACH;;AAED,UAAE,QAAF,EAAY,IAAZ,CAAiB,YAAY;AACzB,cAAE,IAAF,EAAQ,OAAR,CAAgB,uBAAhB;AACH,SAFD;;AAIA,YAAI,OAAO,IAAX;AACA,UAAE,IAAF,CAAO;AACH,iBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,mBAAzB,EAA8C;AAC/C,yBAAS;AADsC,aAA9C,CADF;AAIH,kBAAM,KAJH;AAKH,qBAAS,CALN;AAMH,qBAAS,iBAAU,IAAV,EAAgB;AACrB,kBAAE,QAAF,EAAY,IAAZ,CAAiB,YAAY;AACzB,sBAAE,IAAF,EAAQ,OAAR,CAAgB,yBAAhB,EAA2C,EAAE,OAAO,IAAT,EAA3C;AACH,iBAFD;;AAIA,oBAAI,YAAY,IAAhB,EAAsB;AAClB,6BAAS,IAAT;AACH;AACJ,aAdE;;AAgBH,mBAAO,eAAU,IAAV,EAAgB;AACnB;AACA,qBAAK,GAAL,CAAS,OAAT,CAAiB,2BAAjB;AACH;AAnBE,SAAP;AAqBH,KAhUS;;AAkUV,qBAAiB,yBAAU,OAAV,EAAmB;AAChC,eAAO,EAAE,IAAF,CAAO;AACV,iBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,mBAAzB,EAA8C,EAAE,IAAI,OAAN,EAA9C,CADK;AAEV,kBAAM,KAFI;AAGV,qBAAS;AAHC,SAAP,CAAP;AAKH,KAxUS;;AA0UV,mBAAe,uBAAU,OAAV,EAAmB,QAAnB,EAA6B;AACxC,UAAE,IAAF,CAAO;AACH,iBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,sBAAzB,EAAiD;AAClD,yBAAS;AADyC,aAAjD,CADF;AAIH,kBAAM,KAJH;AAKH,qBAAS,CALN;AAMH,qBAAS,iBAAU,IAAV,EAAgB;AACrB,kBAAE,QAAF,EAAY,IAAZ,CAAiB,YAAY;AACzB,sBAAE,IAAF,EAAQ,OAAR,CAAgB,sBAAhB,EAAwC,IAAxC;AACH,iBAFD;AAGH,aAVE;;AAYH,mBAAO,eAAU,IAAV,EAAgB;AACnB,kBAAE,IAAF,EAAQ,OAAR,CAAgB,qBAAhB,EAAuC,IAAvC;AACH;AAdE,SAAP;AAgBH,KA3VS;;AA6VV,mBAAe,uBAAU,OAAV,EAAmB,MAAnB,EAA2B;AACtC,YAAI,OAAO,IAAX;AACA,UAAE,IAAF,CAAO;AACH,iBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,sBAAzB,EAAiD;AAClD,yBAAS;AADyC,aAAjD,CADF;AAIH,kBAAM,KAJH;AAKH,kBAAM,EAAE,QAAQ,MAAV,EALH;AAMH,qBAAS,CANN;;AAQH,mBAAO,eAAU,IAAV,EAAgB;AACnB,kBAAE,IAAF,EAAQ,OAAR,CAAgB,qBAAhB,EAAuC,IAAvC;;AAEA;AACA,qBAAK,GAAL,CAAS,OAAT,CAAiB,iBAAjB;AACH;AAbE,SAAP;AAeH,KA9WS;;AAgXV,sBAAkB,0BAAU,OAAV,EAAmB;AACjC,YAAI,OAAO,IAAX;AACA,UAAE,IAAF,CAAO;AACH,iBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,sBAAzB,EAAiD;AAClD,yBAAS;AADyC,aAAjD,CADF;AAIH,kBAAM,QAJH;AAKH,qBAAS,CALN;;AAOH,mBAAO,eAAU,IAAV,EAAgB;AACnB,kBAAE,IAAF,EAAQ,OAAR,CAAgB,qBAAhB,EAAuC,IAAvC;;AAEA;AACA,qBAAK,GAAL,CAAS,OAAT,CAAiB,oBAAjB;AACH;AAZE,SAAP;AAcH,KAhYS;;AAkYV,oBAAgB,wBAAU,QAAV,EAAoB;AAChC,eAAO,EAAE,IAAF,CAAO;AACV,iBAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,WAAzB,CADK;AAEV,kBAAM,KAFI;AAGV,qBAAS;AAHC,SAAP,CAAP;AAKH,KAxYS;;AA0YV,wBAAoB,4BAAU,OAAV,EAAmB,aAAnB,EAAkC;AAClD,YAAI,MAAM,OAAO,IAAP,CAAY,WAAZ,EAAyB,EAAE,GAAG,OAAL,EAAzB,CAAV;AACA,YAAI,eAAe,0BAAnB;AACA,YAAI,IAAI,KAAJ,CAAU,UAAV,CAAJ,EAA2B;AACvB,2BAAe,+BAAf;AACH;AACD,YAAI,UAAU,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,YAAzB,CAAd;AACA,YAAI,QAAQ,OAAO,IAAP,CAAY,OAAZ,CAAZ;AACA,YAAI,OAAJ,EAAa;AACT,oBAAQ,IAAR,CACI,OAAO,IAAP,CAAY,YAAZ,EAA0B;AACtB,+BAAe,aADO;AAEtB,qBAAK,GAFiB;AAGtB,sBACI,2BACA,OADA,GAEA,iBAFA,GAGA,KAHA,GAIA;AARkB,aAA1B,CADJ,EAWI,YAXJ;AAaH;AACJ;AAjaS,CAAd;;;;;ACDA,IAAI,UAAU,EAAE,QAAF,CAAd;;AAEA;;;AAGA,EAAE,eAAF,EAAmB,IAAnB,CAAwB,YAAW;AAC/B;AACA,MAAE,IAAF,EAAQ,EAAR,CAAW,mBAAX,EAAgC,YAAW;AACvC,kBAAU,SAAS,aAAnB;AACH,KAFD;;AAIA,MAAE,IAAF,EAAQ,EAAR,CAAW,qBAAX,EAAkC,YAAW;AACzC,YAAI,QAAQ,IAAZ;;AAEA,UAAE,KAAF,EAAS,IAAT,CAAc,aAAd,EAA6B,KAA7B;AACA,UAAE,YAAF,EAAgB,IAAhB,CAAqB,aAArB,EAAoC,MAApC;AACA,UAAE,aAAF,EAAiB,IAAjB,CAAsB,aAAtB,EAAqC,MAArC;AACA,UAAE,gBAAF,EAAoB,IAApB,CAAyB,aAAzB,EAAwC,MAAxC;;AAEA;AACA,UAAE,KAAF,EAAS,IAAT,CAAc,iBAAd,EAAiC,KAAjC;AAEH,KAXD,EAWG,EAXH,CAWM,qBAXN,EAW6B,YAAW;AACpC,UAAE,IAAF,EAAQ,IAAR,CAAa,aAAb,EAA4B,IAA5B;AACA,UAAE,YAAF,EAAgB,IAAhB,CAAqB,aAArB,EAAoC,OAApC;AACA,UAAE,aAAF,EAAiB,IAAjB,CAAsB,aAAtB,EAAqC,OAArC;AACA,UAAE,gBAAF,EAAoB,IAApB,CAAyB,aAAzB,EAAwC,OAAxC;AACA;AACA,gBAAQ,KAAR;AACH,KAlBD;AAmBH,CAzBD;;AA2BA;;;;;AAKA,EAAE,QAAF,EAAY,EAAZ,CAAe,SAAf,EAA0B,eAA1B,EAA2C,UAAS,CAAT,EAAY;AACnD,QAAI,aAAa,SAAS,aAA1B;;AAEA,QAAI,EAAE,UAAF,EAAc,QAAd,CAAuB,gBAAvB,KAA4C,EAAE,KAAF,KAAY,CAAxD,IAA6D,EAAE,QAAnE,EAA6E;AACzE,UAAE,cAAF;AACA,UAAE,eAAF;AACA,UAAE,IAAF,EAAQ,IAAR,CAAa,gBAAb,EAA+B,KAA/B;AACH,KAJD,MAIO,IAAI,EAAE,UAAF,EAAc,QAAd,CAAuB,eAAvB,KAA2C,EAAE,KAAF,KAAY,CAAvD,IAA4D,CAAC,EAAE,QAAnE,EAA6E;AAChF,UAAE,cAAF;AACA,UAAE,eAAF;AACA,UAAE,IAAF,EAAQ,IAAR,CAAa,iBAAb,EAAgC,KAAhC;AACH;AACJ,CAZD;;AAcA;AACA,EAAE,sBAAF,EAA0B,OAA1B,CAAkC,UAAS,CAAT,EAAY;AAC1C,QAAI,EAAE,KAAF,IAAW,EAAf,EAAmB;AACf,UAAE,IAAF,EAAQ,KAAR;AACH;AACJ,CAJD;;AAMA;AACA,EAAE,mEAAF,EAAuE,EAAvE,CAA0E,qBAA1E,EAAiG,YAAW;;AAExG;AACA,MAAE,8BAAF,EAAkC,IAAlC,CAAuC,YAAW;AAC9C,YAAI,YAAY,EAAE,IAAF,EAAQ,OAAR,CAAgB,kBAAhB,CAAhB;AACA,kBAAU,IAAV,CAAe,UAAU,IAAV,CAAe,oBAAf,CAAf;AACH,KAHD;AAIH,CAPD;;;;;AC3DA;;AAEA;AACA;AACA,IAAI,WAAW,MAAf;;AAEA,IAAI,4BAA4B,SAA5B,yBAA4B,CAAU,CAAV,EAAa;AACzC,QAAI,CAAJ,EAAO;AACH,eAAO,EAAE,OAAF,CAAU,eAAV,EAA2B,IAA3B,CAAP;AACH,KAFD,MAEO;AACH,eAAO,CAAP;AACH;AACJ,CAND;;AAQA,IAAI,eAAe,SAAf,YAAe,CAAU,KAAV,EAAiB;AAChC,WACI,EAAE,2BAAF,EAA+B,KAA/B,KACA,EAAE,yBAAF,EAA6B,KAA7B,EADA,GAEA,MAAM,KAAN,EAFA,GAGA,EAJJ;AAMH,CAPD;;AASA,IAAM,iBAAiB,SAAjB,cAAiB,GAAM;AACzB,QAAM,WAAW,EAAE,2BAAF,CAAjB;AACA,QAAI,OAAO,cAAP,CAAsB,SAAtB,CAAgC,cAAhC,KAAmD,QAAvD,EAAiE;AAC7D,YAAI,kCAAJ,CAAqB;AACjB,gBAAI,QADa;AAEjB,0BAAc,OAAO,SAAP,CAAiB,YAFd;AAGjB,4BAAgB,OAAO,SAAP,CAAiB,cAHhB;AAIjB,6BAAiB,OAAO,SAAP,CAAiB;AAJjB,SAArB;AAMH;AACJ,CAVD;;AAYA,EAAE,QAAF,EAAY,KAAZ,CAAkB,YAAY;AAC1B;AACA,MAAE,QAAF,EAAY,EAAZ,CAAe,OAAf,EAAwB,oBAAxB,EAA8C,UAAU,CAAV,EAAa;AACvD,YAAI,EAAE,KAAF,IAAW,EAAf,EAAmB;AACf,gBAAI,EAAE,IAAF,EAAQ,GAAR,MAAiB,EAArB,EAAyB;AACrB,kBAAE,IAAF,EAAQ,OAAR,CAAgB,MAAhB,EAAwB,MAAxB;AACH,aAFD,MAEO;AACH,kBAAE,cAAF;AACA,uBAAO,KAAP;AACH;AACJ;AACJ,KATD;;AAWA;AACA,QAAI,cAAc,0BAA0B,SAAS,QAAnC,CAAlB;AACA,QAAI,WAAW,0BAA0B,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,IAAzB,CAA1B,CAAf;AACA,QAAI,gBAAgB,QAApB,EAA8B;AAC1B;AACA;AACA,UAAE,cAAc,WAAd,GAA4B,IAA9B,EAAoC,QAApC,CAA6C,UAA7C;AACA,UAAE,cAAc,WAAd,GAA4B,YAA9B,EAA4C,QAA5C,CAAqD,UAArD;AACH;;AAED,QAAI,EAAE,QAAF,EAAY,KAAZ,KAAsB,GAA1B,EAA+B;AAC3B,UAAE,eAAF,EAAmB,WAAnB,CAA+B,KAA/B;AACH;;AAED;AACA,MAAE,sBAAF,EAA0B,GAA1B,CACI,OADJ,EAEI,aAAa,EAAE,4BAAF,CAAb,IAAgD,IAFpD;AAIH,CAhCD;;AAkCA,EAAE,uBAAF,EACK,EADL,CACQ,kBADR,EAC4B,YAAY;AAChC,eAAW,YAAY;AACnB,YAAI,CAAC,EAAE,6BAAF,EAAiC,EAAjC,CAAoC,UAApC,CAAL,EAAsD;AAClD,cAAE,6BAAF,EAAiC,MAAjC;AACA,gBAAI,OAAO,OAAX,EAAoB,OAAO,OAAP,CAAe,WAAf;AACvB;;AAED,YAAI,EAAE,yBAAF,EAA6B,QAA7B,CAAsC,SAAtC,CAAJ,EAAsD;AAClD,mBAAO,qBAAP,CAA6B,KAA7B;AACA,gBAAI,OAAO,OAAX,EAAoB,OAAO,OAAP,CAAe,WAAf;AACvB;AACJ,KAVD,EAUG,CAVH;AAWH,CAbL,EAcK,EAdL,CAcQ,UAdR,EAcoB,YAAY;AACxB,eAAW,YAAY;AACnB,YAAI,UAAU,EAAE,SAAS,aAAX,CAAd;AACA,YACI,CAAC,QAAQ,QAAR,CAAiB,uBAAjB,CAAD,IACA,EAAE,6BAAF,EAAiC,GAAjC,CAAqC,SAArC,KAAmD,OADnD,IAEA,CAAC,QAAQ,QAAR,CAAiB,sBAAjB,CAHL,EAIE;AACE,gBAAI,OAAO,OAAX,EAAoB,OAAO,OAAP,CAAe,WAAf;AACvB;AACJ,KATD,EASG,CATH;AAUH,CAzBL;;AA2BA,EACI,uHADJ,EAEE,EAFF,CAEK,UAFL,EAEiB,YAAY;AACzB,eAAW,YAAY;AACnB,YAAI,UAAU,EAAE,SAAS,aAAX,CAAd;AACA,YACI,CAAC,QAAQ,QAAR,CAAiB,wBAAjB,CAAD,IACA,CAAC,QAAQ,QAAR,CAAiB,yBAAjB,CADD,IAEA,CAAC,QAAQ,QAAR,CAAiB,eAAjB,CAFD,IAGA,CAAC,QAAQ,QAAR,CAAiB,uBAAjB,CAHD,IAIA,CAAC,QAAQ,QAAR,CAAiB,sBAAjB,CALL,EAME;AACE,cAAE,6BAAF,EAAiC,IAAjC;AACH;AACJ,KAXD,EAWG,CAXH;AAYH,CAfD;;AAiBA;AACA,EAAE,gBAAF,EAAoB,EAApB,CACI,WADJ,EAEI,EAAE,QAAF,CAAW,UAAU,CAAV,EAAa;AACpB,MAAE,cAAF;AACA,MAAE,eAAF;;AAEA;AACA;AACA;AACA,QACI,OAAO,cAAP,CAAsB,SAAtB,CAAgC,eAAhC,KACA,OAAO,kBAFX,EAGE;AACE,eAAO,kBAAP,CAA0B,KAA1B;AACH;;AAED;;AAEA,eAAW,YAAY;AACnB,YAAI,OAAO,OAAX,EAAoB,OAAO,OAAP,CAAe,WAAf;AACvB,KAFD,EAEG,CAFH;;AAIA,QAAI,EAAE,kBAAF,EAAsB,QAAtB,CAA+B,UAA/B,CAAJ,EAAgD;AAC5C,UAAE,kBAAF,EACK,WADL,CACiB,UADjB,EAEK,QAFL,CAEc,YAFd;AAGH;;AAED,MACI,gDAAgD,QAAhD,GAA2D,IAD/D,EAEE,MAFF;;AAIA,QAAI,EAAE,yBAAF,EAA6B,QAA7B,CAAsC,SAAtC,CAAJ,EAAsD;AAClD,eAAO,qBAAP,CAA6B,KAA7B;AACH;;AAED,QAAI,EAAE,IAAF,EAAQ,IAAR,CAAa,IAAb,KAAsB,WAA1B,EAAuC;AACnC,YAAI,EAAE,IAAF,EAAQ,IAAR,CAAa,eAAb,KAAiC,OAArC,EAA8C;AAC1C,cAAE,IAAF,EAAQ,IAAR,CAAa,eAAb,EAA8B,MAA9B;AACH,SAFD,MAEO;AACH,cAAE,IAAF,EAAQ,IAAR,CAAa,eAAb,EAA8B,OAA9B;AACH;AACJ;AACD,WAAO,KAAP;AACH,CA1CD,EA0CG,GA1CH,CAFJ;;AA+CA;AACA,EAAE,uBAAF,EACK,EADL,CACQ,uBADR,EACiC,YAAY;AACrC,MAAE,UAAF,EAAc,GAAd,CAAkB,UAAlB,EAA8B,SAA9B;AACA,QAAI,OAAO,EAAE,IAAF,EAAQ,IAAR,CAAa,GAAb,CAAX;AACA,MAAE,IAAF,EAAQ,IAAR,CAAa,GAAb,EAAkB,IAAlB,CAAuB,UAAvB,EAAmC,KAAK,IAAL,CAAU,UAAV,CAAnC;AACA,SAAK,IAAL,CAAU,UAAV,EAAsB,KAAK,IAAL,CAAU,UAAV,CAAtB;AACH,CANL,EAOK,EAPL,CAOQ,uBAPR,EAOiC,YAAY;AACrC,MAAE,IAAF,EAAQ,IAAR,CAAa,GAAb,EAAkB,IAAlB,CAAuB,UAAvB,EAAmC,CAAC,CAApC;AACA,MAAE,IAAF,EAAQ,IAAR,CAAa,GAAb,EAAkB,IAAlB,CAAuB,UAAvB,EAAmC,CAAC,CAApC;AACH,CAVL;;AAYA,EAAE,MAAF,EAAU,MAAV,CAAiB,YAAY;AACzB,QAAI,QAAQ,EAAE,QAAF,EAAY,KAAZ,EAAZ;AACA,QAAI,SAAS,GAAb,EAAkB;AACd,UAAE,eAAF,EAAmB,QAAnB,CAA4B,KAA5B;;AAEA,YAAI,aAAa,EAAE,sBAAF,CAAjB;AACA,YAAI,WAAW,QAAX,CAAoB,aAApB,CAAJ,EAAwC;AACpC,uBAAW,GAAX,CACI,OADJ,EAEI,aAAa,EAAE,4BAAF,CAAb,IAAgD,IAFpD;AAIH,SALD,MAKO;AACH,uBAAW,GAAX,CACI,OADJ,EAEI,aAAa,EAAE,4BAAF,CAAb,IAAgD,IAFpD;AAIH;AACJ,KAfD,MAeO;AACH,UAAE,eAAF,EAAmB,WAAnB,CAA+B,KAA/B;AACH;AACJ,CApBD;;AAsBA,SAAS,cAAT,GAA0B;AACtB,MAAE,4BAAF,EAAgC,QAAhC,CAAyC,UAAzC;AACA,QAAI,gBAAgB,EAAE,4BAAF,CAApB;AACA,kBAAc,WAAd,CAA0B,UAA1B;AACA,MAAE,sBAAF,EACK,WADL,CACiB,aADjB,EAEK,QAFL,CAEc,eAFd,EAGK,GAHL,CAGS,OAHT,EAGkB,aAAa,aAAb,IAA8B,IAHhD;AAIH;;AAED,SAAS,eAAT,GAA2B;AACvB,QAAI,kBAAkB,EAAE,4BAAF,CAAtB;AACA,oBAAgB,WAAhB,CAA4B,UAA5B;AACA,MAAE,4BAAF,EAAgC,QAAhC,CAAyC,UAAzC;AACA,MAAE,sBAAF,EACK,QADL,CACc,aADd,EAEK,WAFL,CAEiB,eAFjB,EAGK,GAHL,CAGS,OAHT,EAGkB,aAAa,eAAb,IAAgC,IAHlD;AAIH;;AAED;AACA,EAAE,uBAAF,EAA2B,EAA3B,CAA8B,WAA9B,EAA2C,YAAY;AACnD,MAAE,uBAAF,EAA2B,GAA3B,CAA+B,EAA/B,EAAmC,OAAnC,CAA2C,OAA3C,EAAoD,KAApD;AACA;AACA,MAAE,6BAAF,EAAiC,IAAjC;;AAEA;AACA,MAAE,sBAAF,EAA0B,uBAA1B,EAAmD,OAAnD,CAA2D,OAA3D;AACA,MAAE,sBAAF,EAA0B,uBAA1B,EAAmD,OAAnD,CAA2D,UAA3D;AACH,CARD;;AAUA,EAAE,uBAAF,EACK,EADL,CACQ,OADR,EACiB,YAAY;AACrB;;AAEA,QAAI,EAAE,IAAF,EAAQ,GAAR,GAAc,MAAd,KAAyB,CAA7B,EAAgC;AAC5B;AACA,UAAE,6BAAF,EAAiC,IAAjC;AACH;AACJ,CARL,EASK,EATL,CASQ,aATR,EASuB,YAAY;AAC3B,QAAI,EAAE,IAAF,EAAQ,GAAR,GAAc,MAAd,GAAuB,CAA3B,EAA8B;AAC1B;AACH;AACD,MAAE,6BAAF,EAAiC,IAAjC;AACH,CAdL,EAeK,EAfL,CAeQ,MAfR,EAegB,YAAY;AACpB;AACA,MAAE,gDAAF,EAAoD,WAApD,CACI,iBADJ;AAGH,CApBL;;AAsBA,EAAE,QAAF,EAAY,KAAZ,CAAkB,UAAU,CAAV,EAAa;AAC3B,QAAI,CAAC,EAAE,EAAE,MAAJ,EAAY,MAAZ,GAAqB,MAArB,GAA8B,QAA9B,CAAuC,0BAAvC,CAAL,EAAyE;AACrE;AACH;AACJ,CAJD;;AAMA,EAAE,mBAAF,EAAuB,EAAvB,CAA0B,kBAA1B,EAA8C,UAAU,CAAV,EAAa;AACvD,QAAI,EAAE,uBAAF,EAA2B,GAA3B,OAAqC,EAAzC,EAA6C;AACzC,UAAE,qBAAF,EAAyB,MAAzB;AACH;AACJ,CAJD;;AAMA;AACA,EAAE,4CAAF,EAAgD,EAAhD,CACI,WADJ,EAEI,wBAFJ,EAGI,UAAU,CAAV,EAAa;AACT,MAAE,eAAF;;AAEA,QAAI,YAAY,EAAE,IAAF,EAAQ,MAAR,EAAhB;;AAEA,QAAI,UAAU,QAAV,CAAmB,QAAnB,KAAgC,UAAU,QAAV,CAAmB,SAAnB,CAApC,EAAmE;AAC/D,kBAAU,WAAV,CAAsB,QAAtB;AACA,UAAE,2CAAF,EAA+C,MAA/C;AACH,KAHD,MAGO,IAAI,UAAU,QAAV,CAAmB,SAAnB,CAAJ,EAAmC;AACtC,UAAE,+BAAF,EAAmC,WAAnC,CAA+C,QAA/C;AACA,kBAAU,QAAV,CAAmB,QAAnB;AACA,UAAE,2CAAF,EAA+C,MAA/C;AACA,UAAE,IAAF,EAAQ,MAAR,GAAiB,IAAjB,CAAsB,UAAtB,EAAkC,MAAlC;AACH;;AAED,QAAI,OAAO,OAAX,EAAoB,OAAO,OAAP,CAAe,WAAf;AACvB,CAnBL;;AAsBA;AACA,IAAI,SAAS,OAAO,MAApB;AACA,IAAI,SAAS,OAAO,MAApB;;AAEA,IAAI,UAAU,MAAd,EAAsB;AAClB,MAAE,eAAF,EAAmB,UAAnB,CAA8B,WAA9B;AACH,CAFD,MAEO;AACH,MAAE,eAAF,EAAmB,KAAnB;AACH;;AAED;AACA,OAAO,mBAAP,GAA6B,YAAY;AACrC,QACI,EAAE,sBAAF,EAA0B,GAA1B,CAA8B,SAA9B,KAA4C,MAA5C,IACA,EAAE,eAAF,EAAmB,GAAnB,CAAuB,SAAvB,KAAqC,MADrC,IAEA,EAAE,aAAF,EAAiB,MAAjB,GAA0B,CAF1B,IAGA,KAAK,GAAL,CAAS,OAAO,WAAhB,KAAgC,EAJpC,EAKE;AACE,UAAE,uBAAF,EAA2B,OAA3B,CAAmC,OAAnC;AACH,KAPD,MAOO,IACH,KAAK,GAAL,CAAS,OAAO,WAAhB,MAAiC,EAAjC,IACA,EAAE,aAAF,EAAiB,MAAjB,GAA0B,CAFvB,EAGL;AACE,UAAE,eAAF,EAAmB,OAAnB,CAA2B,OAA3B;AACH,KALM,MAKA,IAAI,EAAE,aAAF,EAAiB,MAAjB,GAA0B,CAA9B,EAAiC;AACpC,UAAE,uBAAF,EAA2B,OAA3B,CAAmC,OAAnC;AACH;AACJ,CAhBD;;AAkBA,EAAE,oBAAF,EAAwB,KAAxB,CAA8B,UAAU,CAAV,EAAa;AACvC,QAAI,CAAC,EAAE,oBAAF,EAAwB,EAAxB,CAA2B,QAA3B,CAAL,EAA2C;AACvC,iBAAS,aAAT,CAAuB,IAAvB;AACA,UAAE,IAAF,EAAQ,IAAR;AACA,YAAI,OAAO,EAAE,IAAF,EAAQ,GAAR,EAAX;AACA,UAAE,oBAAF,EAAwB,GAAxB,CAA4B,IAA5B;AACA,UAAE,IAAF,EAAQ,KAAR;AACA,UAAE,cAAF;AACH;AACJ,CATD;;AAWA,IAAI,EAAE,uBAAF,EAA2B,IAA3B,CAAgC,KAAhC,KAA0C,EAA9C,EAAkD;AAC9C;AACH;;AAED,IAAI,EAAE,uBAAF,EAA2B,IAA3B,CAAgC,KAAhC,KAA0C,EAA9C,EAAkD;AAC9C;AACH;;AAED;;;;AAIA,IAAI,UAAU,KAAd;AACA,EAAE,qBAAF,EACK,EADL,CACQ,uBADR,EACiC,UAAU,KAAV,EAAiB;AAC1C,MAAE,IAAF,EAAQ,IAAR,CAAa,OAAb,EAAsB,IAAtB,CAA2B,UAA3B,EAAuC,CAAvC;AACA;AACA,QAAI,CAAC,OAAL,EAAc;AACV;AACA,YAAI,MAAM,EAAE,qBAAF,CAAV;AACA,YAAI,UAAU,IAAI,IAAJ,CAAS,gBAAT,EAA2B,QAA3B,CAAoC,IAApC,CAAd;AACA,YAAI,cAAc,QAAQ,MAA1B;AACA,YAAI,cAAe,IAAI,WAAL,GAAoB,GAApB,GAA0B,GAA5C;;AAEA,gBAAQ,GAAR,CAAY,OAAZ,EAAqB,WAArB;;AAEA,YAAI,gBAAgB,CAApB,EAAuB;AACnB,oBAAQ,IAAR,GAAe,GAAf,CAAmB,OAAnB,EAA4B,OAA5B;AACH;;AAED,YAAI,QAAJ,CAAa,SAAS,WAAT,GAAuB,UAApC;AACA,kBAAU,IAAV;AACH;AACJ,CApBL,EAqBK,EArBL,CAqBQ,uBArBR,EAqBiC,YAAY;AACrC,MAAE,IAAF,EAAQ,IAAR,CAAa,OAAb,EAAsB,IAAtB,CAA2B,UAA3B,EAAuC,CAAC,CAAxC;AACH,CAvBL;;AAyBA,EAAE,sBAAF,EAA0B,EAA1B,CAA6B,OAA7B,EAAsC,UAAU,KAAV,EAAiB;AACnD,UAAM,eAAN;AACA,UAAM,cAAN;AACA,WAAO,UAAP,CAAkB,IAAlB,CAAuB,QAAvB,CAAgC,MAAhC,CAAuC,EAAE,IAAF,CAAvC;;AAEA;AACH,CAND;;AAQA,EAAE,sBAAF,EAA0B,EAA1B,CAA6B,OAA7B,EAAsC,UAAU,KAAV,EAAiB;AACnD,UAAM,eAAN;AACA,UAAM,cAAN;AACA,QAAI,MAAM,KAAN,KAAgB,EAApB,EAAwB;AACpB,eAAO,UAAP,CAAkB,IAAlB,CAAuB,QAAvB,CAAgC,MAAhC,CAAuC,EAAE,IAAF,CAAvC;;AAEA;AACH;AACJ,CARD;;AAUA,EAAE,sBAAF,EACK,EADL,CACQ,uBADR,EACiC,YAAY;AACrC,MAAE,IAAF,EAAQ,IAAR,CAAa,GAAb,EAAkB,IAAlB,CAAuB,UAAvB,EAAmC,CAAnC;AACA,MAAE,IAAF,EAAQ,IAAR,CAAa,SAAb;AACA,MAAE,IAAF,EAAQ,IAAR,CAAa,UAAb,EAAyB,CAAzB,EAA4B,KAA5B;AACH,CALL,EAMK,EANL,CAMQ,uBANR,EAMiC,YAAY;AACrC,MAAE,IAAF,EAAQ,IAAR,CAAa,GAAb,EAAkB,IAAlB,CAAuB,UAAvB,EAAmC,CAAC,CAApC;AACA,MAAE,IAAF,EAAQ,IAAR,CAAa,UAAb,EAAyB,CAAC,CAA1B;AACH,CATL;;AAWA;AACA,EAAE,cAAF,EAAkB,EAAlB,CAAqB,uBAArB,EAA8C,UAAU,CAAV,EAAa;AACvD,WAAO,UAAP,CAAkB,IAAlB,CAAuB,QAAvB,CAAgC,KAAhC,CAAsC,EAAE,mBAAF,CAAtC;AACH,CAFD;;AAIA,EAAE,wBAAF,EAA4B,EAA5B,CAA+B,WAA/B,EAA4C,YAAY;AACpD,YAAQ,GAAR,CAAY,qBAAZ,EAAmC,GAAnC,EAAwC,EAAE,MAAM,GAAR,EAAa,SAAS,CAAtB,EAAxC;;AAEA,QAAI,mBAAmB,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,aAAzB,CAAvB;;AAEA,MAAE,mBAAF,EAAuB,IAAvB;AACA,QAAI,OAAO,OAAX,EAAoB,OAAO,OAAP,CAAe,WAAf;AACpB,MAAE,4DAAF,EACK,UADL,CACgB,0CADhB,EAEK,IAFL,CAEU,EAAE,MAAM,gBAAR,EAA0B,gBAAgB,EAA1C,EAFV;AAGA,MACI,wGADJ,EAEE,EAFF,CAEK,OAFL,EAEc,UAAU,CAAV,EAAa;AACvB,UAAE,eAAF;AACH,KAJD;AAKH,CAfD;;;;;AC5YA,CAAA,CAAE,eAAF,CAAA,CAAmB,EAAnB,CAAsB,qBAAtB,EAA6C,UAAU,CAAV,EAAa;IACtD,CAAA,CAAE,8BAAF,CAAA,CAAkC,IAAlC,CAAuC,KAAvC,EAA8C,aAA9C,CAAA,CAAA;CADJ,CAAA,CAAA;;AAIA,CAAA,CAAE,YAAM;IACJ,IAAI,CAAC,MAAA,CAAO,cAAP,CAAsB,SAAtB,CAAgC,0BAAhC,CAAL,EAAkE;QAC9D,CAAA,CAAE,MAAF,CAAA,CAAU,EAAV,CAAa,aAAb,EAA4B,oBAA5B,EAAkD,UAAU,CAAV,EAAa;YAC3D,CAAA,CAAE,wBAAF,EAAA,CAAA;;YAEA,IAAI,CAAA,CAAE,IAAF,KAAW,OAAX,IAAsB,CAAA,CAAE,KAAF,KAAY,EAAlC,IAAwC,CAAA,CAAE,KAAF,KAAY,EAAxD,EAA4D;;gBAExD,IAAI,QAAA,GAAW,CAAA,CAAE,IAAF,CAAA,CAAQ,IAAR,CAAa,eAAb,CAAf,CAAA;;gBAEA,IAAI,CAAA,CAAE,KAAA,GAAQ,QAAV,CAAA,CAAoB,MAApB,EAAA,CAA6B,IAA7B,GAAoC,CAAxC,EAA2C;oBACvC,UAAA,CAAW,IAAX,CAAgB,QAAhB,CAAyB,KAAzB,CACI,CAAA,CAAE,GAAA,GAAM,QAAR,CADJ,EAEI,CAAA,CACI,oCAAA,GACI,CAAA,CAAE,GAAA,GAAM,QAAR,CAAA,CAAkB,IAAlB,CAAuB,IAAvB,CADJ,GAEI,IAHR,CAFJ,CAAA,CAAA;oBAQA,CAAA,CAAE,KAAA,GAAQ,QAAR,GAAmB,OAArB,CAAA,CAA8B,IAA9B,CAAmC,UAAnC,EAA+C,CAAC,CAAhD,CAAA,CAAA;iBATJ,MAUO;oBACH,CAAA,CAAE,QAAF,CAAA,CAAY,UAAZ,CAAuB,UAAvB,EAAmC,UAAnC,CAAA,CAAA;oBACA,CAAA,CAAE,KAAA,GAAQ,QAAR,GAAmB,OAArB,CAAA,CAA8B,IAA9B,CAAmC,UAAnC,EAA+C,CAA/C,CAAA,CAAA;oBACA,UAAA,CAAW,IAAX,CAAgB,QAAhB,CAAyB,IAAzB,CACI,CAAA,CAAE,GAAA,GAAM,QAAR,CADJ,EAEI,CAAA,CACI,oCAAA,GACI,CAAA,CAAE,GAAA,GAAM,QAAR,CAAA,CAAkB,IAAlB,CAAuB,IAAvB,CADJ,GAEI,IAHR,CAFJ,CAAA,CAAA;oBAQA,CAAA,CAAE,IAAF,CAAA,CAAQ,KAAR,EAAA,CAAA;iBACH;aACJ;SA9BL,CAAA,CAAA;KAgCH;CAlCL,CAAA,CAAA;;AAqCA,CAAA,CAAE,MAAF,CAAA,CAAU,EAAV,CAAa,uBAAb,EAAsC,kBAAtC,EAA0D,UAAU,CAAV,EAAa;IACnE,CAAA,CAAE,CAAA,CAAE,MAAJ,CAAA,CAAY,IAAZ,CAAiB,GAAjB,CAAA,CAAsB,IAAtB,CAA2B,UAA3B,EAAuC,IAAvC,CAAA,CAAA;CADJ,CAAA,CAAA;;AAIA,CAAA,CAAE,MAAF,CAAA,CAAU,EAAV,CAAa,uBAAb,EAAsC,kBAAtC,EAA0D,UAAU,CAAV,EAAa;IACnE,CAAA,CAAE,CAAA,CAAE,MAAJ,CAAA,CAAY,IAAZ,CAAiB,GAAjB,CAAA,CAAsB,IAAtB,CAA2B,UAA3B,EAAuC,GAAvC,CAAA,CAAA;CADJ,CAAA,CAAA;;AAIA,CAAA,CAAE,MAAF,CAAA,CAAU,EAAV,CACI,OADJ,EAEI,4DAFJ,EAGI,UAAU,CAAV,EAAa;IACT,IAAI,SAAA,GAAY,MAAA,CAAO,GAAP,CAAW,MAAA,CAAO,MAAP,CAAc,aAAzB,EAAwC;QACpD,OAAA,EAAS,MAAA,CAAO,QAAP,CAAgB,IAAA;KADb,CAAhB,CAAA;IAGA,IAAI,2BAAA,GACA,MAAA,CAAO,cAAP,CAAsB,SAAtB,CAAgC,wBAAhC,CAAA,IACA,CAAC,MAAA,CAAO,SAAP,CAAiB,eADlB,IAEA,CAAC,MAAA,CAAO,SAAP,CAAiB,sBAHtB,CAAA;IAIA,IAAI,2BAAJ,EAAiC;QAC7B,CAAA,CAAE,wBAAF,EAAA,CAAA;QACA,MAAA,CAAO,QAAP,CAAgB,MAAhB,CAAuB,SAAvB,CAAA,CAAA;KAFJ,MAGO;;QAEH,IAAI,KAAA,GAAQ,OAAA,CAAQ,GAAR,CAAY,WAAZ,CAAA,KAA6B,SAAzC,CAAA;QACA,IAAI,MAAA,GAAS,CAAA,CAAE,CAAA,CAAE,MAAJ,CAAA,CAAY,OAAZ,CAAoB,GAApB,CAAb,CAAA;QACA,IAAI,cAAA,GAAiB,KAArB,CAAA;;;QAGA,IAAI,MAAA,CAAO,IAAP,CAAY,iBAAZ,CAAJ,EAAoC;YAChC,cAAA,GACI,MAAA,CAAO,IAAP,CAAY,iBAAZ,CAAA,KAAmC,MAAnC,GAA4C,IAA5C,GAAmD,KADvD,CAAA;SAEH;;QAED,IAAI,cAAA,KAAmB,KAAnB,IAA4B,MAAA,CAAO,SAAP,CAAiB,UAAjD,EAA6D;YACzD,IAAI,KAAA,GACA,MAAA,CAAO,SAAP,CAAiB,UAAjB,CAA4B,MAAA,CAAO,IAAP,CAAY,eAAZ,CAA5B,CADJ,CAAA;YAEA,IAAI,OAAA,GAAU,KAAA,CAAM,SAAN,CAAd,CAAA;YACA,OAAA,CAAQ,OAAR,CAAgB,UAAC,GAAD,EAAS;gBACrB,IAAI,GAAA,CAAI,IAAJ,CAAA,KAAc,gBAAlB,EAAoC;oBAChC,cAAA,GAAiB,IAAjB,CAAA;iBACH;aAHL,CAAA,CAAA;SAKH;;QAED,IACI,CAAA,CAAE,QAAF,CAAA,CAAY,KAAZ,EAAA,IAAuB,GAAvB,IACA,MAAA,CAAO,IAAP,CAAY,WAAZ,CAAA,KAA6B,OAD7B,IAEA,MAAA,CAAO,IAAP,CAAY,YAAZ,CAFA,IAGA,KAHA,IAIA,cALJ,EAME;YACE,MAAA,CACK,IADL,CACU;gBACF,MAAA,EAAQ,QADN;gBAEF,GAAA,EAAK,YAFH;gBAGF,IAAA,EAAM,MAAA,CAAO,IAAP,CAAY,WAAZ,CAAA;aAJd,CAAA,CAMK,UANL,CAMgB,gBANhB,CAAA,CAAA;SAPJ,MAcO;YACH,MAAA,CAAO,IAAP,CAAY,gBAAZ,EAA8B,sBAA9B,CAAA,CAAA;;YAEA,IAAI,MAAA,CAAO,IAAP,CAAY,WAAZ,CAAJ,EAA8B;gBAC1B,CAAA,CAAE,8BAAF,CAAA,CAAkC,IAAlC,CACI,KADJ,EAEI,MAAA,CAAO,IAAP,CAAY,WAAZ,CAFJ,CAAA,CAAA;gBAIA,CAAA,CAAE,iCAAF,CAAA,CAAqC,IAArC,CACI,MAAA,CAAO,IAAP,CAAY,YAAZ,CADJ,CAAA,CAAA;gBAGA,CAAA,CAAE,QAAF,CAAA,CAAY,UAAZ,CAAuB,QAAvB,EAAiC,QAAjC,CAAA,CAAA;aACH;SACJ;KACJ;CAjET,CAAA,CAAA;;;;;;ACjDA;;;;AAIA,OAAO,KAAP,GAAe;AACX,gBAAY,oBAAU,QAAV,EAAoB;AAC5B,eAAO,IAAP,CAAY,SAAZ,CACI,SAAS,IAAT,CAAc,eAAd,CADJ,EAEI,EAAE,4BAAF,EAAgC,GAAhC,EAFJ,EAGI,QAHJ;AAKH,KAPU;;AASX;;;AAGA,qBAAiB,yBAAU,IAAV,EAAgB;AAC7B,YAAI,CAAC,KAAK,QAAL,CAAc,UAAd,CAAL,EAAgC;AAC5B,gBAAI,KAAJ,EACI,MADJ,EAEI,QAFJ,EAGI,OAHJ,EAII,cAJJ,EAKI,YALJ,EAMI,OANJ;;AAQA,oBAAQ,KAAK,IAAL,CAAU,YAAV,CAAR;AACA,qBAAS,KAAK,IAAL,CAAU,WAAV,CAAT;AACA,uBAAW,KAAK,IAAL,CAAU,gBAAV,CAAX;AACA,sBAAU,KAAK,IAAL,CAAU,cAAV,CAAV;AACA,6BAAiB,KAAK,IAAL,CAAU,sBAAV,CAAjB;AACA,2BAAe,KAAK,IAAL,CAAU,sBAAV,KAAqC,EAApD;AACA,sBAAU,KAAK,IAAL,CAAU,eAAV,CAAV;;AAEA,gBAAI,QAAQ,EAAE,qBAAF,CAAZ;AACA,cAAE,mBAAF,EAAuB,IAAvB,CAA4B,KAA5B;AACA,cAAE,yBAAF,EACK,WADL,GAEK,QAFL,CAEc,UAAU,MAFxB;AAGA,cAAE,yBAAF,EAA6B,IAA7B,CAAkC,QAAlC;AACA,cAAE,yBAAF,EAA6B,IAA7B,CAAkC,KAAlC,EAAyC,OAAzC;;AAEA,gBAAI,YAAY,OAAO,IAAP,CAAY,gCAAZ,EAA8C;AAC1D,6BAAa,OAAO,SAAP,CAAiB;AAD4B,aAA9C,CAAhB;AAGA,gBAAI,OAAO,SAAP,CAAiB,UAAjB,CAA4B,OAA5B,EAAqC,WAArC,KAAqD,CAAzD,EAA4D;AACxD,4BAAY,OAAO,IAAP,CAAY,kCAAZ,CAAZ;AACH;AACD,cAAE,sBAAF,EAA0B,IAA1B,CAA+B,SAA/B;;AAEA,gBAAI,kBAAkB,SAAlB,IAA+B,YAAnC,EAAiD;AAC7C,kBAAE,+BAAF,EACK,IADL,CAEQ,OAAO,IAAP,CAAY,iBAAZ,EAA+B;AAC3B,oCAAgB;AADW,iBAA/B,CAFR,EAMK,WANL,CAMiB,QANjB;AAOH,aARD,MAQO;AACH,kBAAE,+BAAF,EAAmC,IAAnC,CAAwC,EAAxC,EAA4C,QAA5C,CAAqD,QAArD;AACH;;AAED,cAAE,wBAAF,EAA4B,IAA5B,CAAiC,eAAjC,EAAkD,OAAlD;;AAEA,gBACI,KAAK,IAAL,CAAU,gBAAV,KAA+B,OAA/B,IACA,KAAK,IAAL,CAAU,gBAAV,KAA+B,OAD/B,IAEA,QAAQ,GAAR,CAAY,qBAAZ,KAAsC,GAH1C,EAIE;AACE;AACA,kBAAE,oBAAF,EAAwB,UAAxB,CAAmC,QAAnC,EAA6C,MAA7C;AACH,aAPD,MAOO;AACH,sBAAM,UAAN,CAAiB,QAAjB,EAA2B,MAA3B;AACH;AACJ;AACJ;AAvEU,CAAf;;AA0EA;;;AAGA,OAAO,OAAP,GAAiB;AACb,cAAU,EADG;;AAGb,iBAAa,qBAAU,IAAV,EAAgB,SAAhB,EAA2B;AACpC,aAAK,WAAL,CAAiB,4CAAjB,EAA+D,QAA/D,CACI,cAAc,SADlB;AAGH,KAPY;;AASb,uBAAmB,2BAAU,IAAV,EAAgB,MAAhB,EAAwB,WAAxB,EAAqC;AACpD,eAAO,KAAK,IAAL,CAAU,aAAV,IACD,IADC,GAED,KAAK,OAAL,CACI,oDADJ,CAFN;AAKA,YAAI,QAAQ,EAAZ;AACA,YAAI,OAAO,KAAK,IAAL,CAAU,MAAV,CAAX;AACA,YAAI,UAAU,KAAK,IAAL,CAAU,UAAV,CAAd;AACA,YAAI,UAAU,KAAK,IAAL,CAAU,SAAV,CAAd;AACA,YAAI,aAAa,EAAjB;AACA,YAAI,QAAQ,QAAQ,GAAR,CAAY,WAAZ,KAA4B,SAAxC;AACA,YAAI,WAAW,aAAa,OAAb,CAAf;AACA,YAAI,eAAe,OAAO,SAAP,CAAiB,SAAjB,CAA2B,KAA3B,CAAiC,MAAjC,IACb,IADa,GAEb,KAFN;AAGA,YAAI,kBAAkB,EAAtB;;AAEA,YAAI,mBACA,OAAO,OAAP,IAAkB,SAAS,OAAO,SAAhB,EAA2B,EAA3B,KAAkC,GAApD,GACM,IADN,GAEM,KAHV;AAIA,YAAI,iBACA,OAAO,SAAP,CAAiB,SAAjB,CAA2B,KAA3B,CAAiC,iBAAjC,KACA,OAAO,OADP,GAEM,IAFN,GAGM,KAJV;AAKA,YAAI,YAAY,OAAO,SAAP,CAAiB,SAAjB,CAA2B,KAA3B,CAAiC,QAAjC,IACV,IADU,GAEV,KAFN;AAGA,YAAI,SACA,OAAO,SAAP,CAAiB,SAAjB,CAA2B,KAA3B,CAAiC,cAAjC,KAAoD,CAAC,OAAO,MAA5D,GACM,IADN,GAEM,KAHV;AAIA,YAAI,SAAS,wBAAwB,IAAxB,CAA6B,UAAU,SAAvC,IACP,IADO,GAEP,KAFN;AAGA,YAAI,uBACC,CAAC,gBAAD,KAAsB,kBAAkB,SAAlB,IAA+B,MAArD,CAAD,IACA,MADA,GAEM,IAFN,GAGM,KAJV;;AAMA,YAAI,kBACA,mEADJ;;AAGA,YAAI,SAAS,EACT,yCACI,KAAK,IAAL,CAAU,eAAV,CADJ,GAEI,MAHK,CAAb;;AAMA,YAAI,OAAJ,EAAa;AACT,iBAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,QAAQ,MAA5B,EAAoC,GAApC,EAAyC;AACrC,oBACI,QAAQ,CAAR,EAAW,IAAX,KAAoB,iBAApB,IACA,QAAQ,CAAR,EAAW,IAAX,KAAoB,iBADpB,IAEA,QAAQ,CAAR,EAAW,IAAX,KAAoB,qBAHxB,EAIE;AACE,sCAAkB,QAAQ,CAAR,EAAW,IAAX,CAAlB;AACH;AACJ;AACJ;;AAED,gBAAQ,MAAR;AACI,iBAAK,QAAL;AACI;AACA,oBAAI,gBAAgB,EAAE,0BAA0B,OAA5B,EAAqC,GAArC,EAApB;AACA,oBAAI,QAAQ,aAAZ,EAA2B;AACvB,4BAAQ,OAAO,IAAP,CAAY,KAAZ,CAAR;AACA,yBAAK,QAAL,CAAc,kBAAd,EAAkC,WAAlC,CACI,6BADJ;;AAIA;;AAEA,wBAAI,QAAQ,GAAR,CAAY,mBAAZ,KAAoC,GAAxC,EAA6C;AACzC,6BAAK,UAAL,CAAgB,gBAAhB;AACH;AACJ,iBAXD,MAWO,IAAI,gBAAgB,CAApB,EAAuB;AAC1B,4BACI,8CACA,OAAO,IAAP,CAAY,QAAZ,CADA,GAEA,sDAFA,GAGA,OAAO,IAAP,CAAY,UAAZ,EAAwB;AACpB,uCAAe;AADK,qBAAxB,CAHA,GAMA,SAPJ;AAQH,iBATM,MASA;AACH,4BAAQ,WAAW,OAAO,IAAP,CAAY,QAAZ,CAAX,GAAmC,SAA3C;AACA,yBAAK,GAAL,CAAS,aAAT,EAAwB,MAAxB,EAFG,CAE8B;AACpC;AACD,qBAAK,WAAL,CAAiB,eAAjB,EACK,QADL,CAEQ,wDAFR,EAIK,IAJL,CAIU,MAJV,EAIkB,oBAJlB;;AAMA,kBAAE,0BAAF,EACK,QADL,CACc,WADd,EAEK,WAFL,CAEiB,UAFjB;AAGA;;AAEJ,iBAAK,eAAL;AACI;AACA,oBAAI,QAAQ,aAAZ,EAA2B;AACvB,4BAAQ,WAAW,OAAO,IAAP,CAAY,YAAZ,CAAX,GAAuC,SAA/C;AACA,yBAAK,QAAL,CAAc,kBAAd,EAAkC,WAAlC,CACI,6BADJ;;AAIA;;AAEA,wBAAI,QAAQ,GAAR,CAAY,mBAAZ,KAAoC,GAAxC,EAA6C;AACzC,6BAAK,UAAL,CAAgB,gBAAhB;AACH;AACJ,iBAXD,MAWO;AACH,4BACI,8CACA,OAAO,IAAP,CAAY,QAAZ,CADA,GAEA,SAHJ;AAIH;AACD,qBAAK,WAAL,CAAiB,eAAjB,EACK,QADL,CACc,mCADd,EAEK,IAFL,CAEU,MAFV,EAEkB,oBAFlB;;AAIA,qBAAK,WAAL,CAAiB,cAAjB;AACA;;AAEJ,iBAAK,MAAL;AACI;AACA,wBAAQ,WAAW,OAAO,IAAP,CAAY,YAAZ,CAAX,GAAuC,SAA/C;AACA,qBAAK,WAAL,CAAiB,eAAjB,EACK,QADL,CACc,sCADd,EAEK,IAFL,CAEU,MAFV,EAEkB,oBAFlB;AAGA;;AAEJ,iBAAK,UAAL;AACI,oBAAI,qBACA,OAAO,GAAP,IAAc,OAAO,SAAP,CAAiB,CAAjB,MAAwB,GAD1C;;AAGA;;AAEA;AACA,oBAAI,eAAe,KAAnB;;AAEA,oBAAI,YAAY,OAAO,IAAP,CAAY,WAAZ,CAAhB;AACA,6BAAa,WAAW,SAAX,GAAuB,SAApC;;AAEA,qBAAK,IAAL,CAAU,MAAV,EAAkB,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,YAAzB,CAAlB,EACK,IADL,CACU,UADV,EACsB,GADtB,EAEK,IAFL,CAEU,OAAO,IAAP,CAAY,WAAZ,CAFV,EAGK,QAHL,CAGc,WAHd;;AAKA,wBAAQ,aACF,UADE,GAEF,WAAW,OAAO,IAAP,CAAY,WAAZ,CAAX,GAAsC,SAF5C;AAGA,qBAAK,QAAL,CAAc,kBAAd,EAAkC,WAAlC,CACI,6BADJ;AAGA,qBAAK,WAAL,CAAiB,cAAjB;;AAEA,oBAAI,KAAK,IAAL,CAAU,WAAV,KAA0B,aAA9B,EAA6C;AACzC,yBAAK,UAAL,CAAgB,gBAAhB;AACH;;AAED,qBAAK,IAAL,CAAU,aAAV,EAAyB,UAAzB,EACK,WADL,CACiB,eADjB,EAEK,QAFL,CAEc,mCAFd;AAGA,oBAAI,CAAC,KAAK,MAAL,GAAc,QAAd,CAAuB,WAAvB,CAAL,EAA0C;AACtC,yBAAK,QAAL,CAAc,cAAd;AACA,wBAAI,UAAU,MAAV,GAAmB,EAAvB,EAA2B;AACvB,6BAAK,QAAL,CAAc,mBAAd;AACH;AACJ,iBALD,MAKO;AACH,wBAAI,UAAU,MAAV,GAAmB,EAAvB,EAA2B;AACvB,6BAAK,QAAL,CAAc,kCAAd;AACH;;AAED,wBAAI,UAAU,MAAV,GAAmB,EAAvB,EAA2B;AACvB,6BAAK,QAAL,CAAc,4BAAd;AACH;AACJ;;AAED,uBAAO,IAAP,CAAY,OAAO,IAAP,CAAY,sBAAZ,CAAZ;AACA,uBACK,OADL,CACa,mBADb,EAEK,QAFL,CAEc,sCAFd,EAGK,WAHL,CAGiB,mBAHjB;;AAKA;;AAEJ,iBAAK,MAAL;AACI;AACA,wBAAQ,WAAW,OAAO,IAAP,CAAY,WAAZ,CAAX,GAAsC,SAA9C;;AAEA,qBAAK,IAAL,CACI,MADJ,EAEI,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,YAAzB,CAFJ,EAGE,UAHF,CAGa,SAHb;AAIA,qBAAK,WAAL,CAAiB,eAAjB,EAAkC,QAAlC,CAA2C,gBAA3C;AACA,oBAAI,CAAC,KAAK,MAAL,GAAc,QAAd,CAAuB,WAAvB,CAAL,EAA0C;AACtC,yBAAK,QAAL,CAAc,cAAd;AACA;AACA,wBAAI,MAAM,MAAN,GAAe,EAAnB,EAAuB;AACnB,6BAAK,QAAL,CAAc,kBAAd;AACH;;AAED,wBAAI,MAAM,MAAN,GAAe,EAAnB,EAAuB;AACnB,6BAAK,QAAL,CAAc,mBAAd;AACH;AACJ,iBAVD,MAUO;AACH;AACA,wBAAI,MAAM,MAAN,GAAe,EAAnB,EAAuB;AACnB,6BAAK,QAAL,CAAc,2BAAd;AACH;;AAED,wBAAI,MAAM,MAAN,GAAe,EAAnB,EAAuB;AACnB,6BAAK,QAAL,CAAc,kCAAd;AACH;;AAED,wBAAI,MAAM,MAAN,GAAe,EAAnB,EAAuB;AACnB,6BAAK,QAAL,CAAc,4BAAd;AACH;AACJ;AACD,qBAAK,IAAL,CAAU,aAAV,EAAyB,MAAzB,EAAiC,QAAjC,CAA0C,mBAA1C;AACA,uBAAO,IAAP,CAAY,OAAO,IAAP,CAAY,QAAZ,CAAZ;AACA,uBACK,OADL,CACa,mBADb,EAEK,WAFL,CAEiB,sCAFjB,EAGK,QAHL,CAGc,mBAHd,EAIK,QAJL,CAIc,WAJd;AAKA;AACA,oBAAI,OAAO,IAAP,GAAc,MAAd,GAAuB,EAA3B,EAA+B;AAC3B,yBAAK,MAAL,GACK,QADL,CACc,oBADd,EAEK,QAFL,CAEc,eAFd;AAGH;AACD;;AAEJ,iBAAK,cAAL;AACI,wBACI,6BACA,OAAO,IAAP,CAAY,eAAZ,CADA,GAEA,SAHJ;AAIA,qBAAK,QAAL,CAAc,sBAAd,EACK,WADL,CACiB,QADjB,EAEK,IAFL,CAEU,aAFV,EAEyB,cAFzB;AAGA,qBAAK,OAAL,CAAa,qBAAb,EACK,QADL,CACc,QADd,EAEK,WAFL,CAEiB,WAFjB;AAGA,qBAAK,WAAL,CAAiB,cAAjB;AACA;;AAEJ,iBAAK,iBAAL;AACI,wBACI,6BACA,OAAO,IAAP,CAAY,oBAAZ,CADA,GAEA,SAHJ;AAIA,qBAAK,QAAL,CAAc,yBAAd,EACK,WADL,CACiB,KADjB,EAEK,IAFL,CAEU,aAFV,EAEyB,iBAFzB;AAGA,qBAAK,OAAL,CAAa,qBAAb,EACK,QADL,CACc,WADd,EAEK,WAFL,CAEiB,QAFjB;AAGA,qBAAK,WAAL,CAAiB,cAAjB;;AAEA,qBAAK,IAAL,CAAU,aAAV,EAAyB,iBAAzB;AACA;;AAEJ,iBAAK,SAAL;AACI,wBACI,6BACA,OAAO,IAAP,CAAY,oBAAZ,CADA,GAEA,SAHJ;AAIA,qBAAK,QAAL,CAAc,yBAAd,EACK,WADL,CACiB,KADjB,EAEK,IAFL,CAEU,aAFV,EAEyB,iBAFzB;AAGA,qBAAK,WAAL,CAAiB,cAAjB;AACA;;AAEJ,iBAAK,IAAL;AACA,iBAAK,KAAL;AACI,qBAAK,QAAL,CAAc,KAAd,EAAqB,MAArB;AACA,wBAAQ,KAAK,IAAL,EAAR;AACA,yBAAS,SAAT;AACA;;AAEJ;AACI,qBAAK,QAAL,CAAc,KAAd,EAAqB,MAArB;AACA,wBAAQ,KAAK,IAAL,EAAR;AACA,yBAAS,SAAT;AACA;AApOR;;AAuOA,aAAK,IAAL,CAAU,WAAV,EAAuB,OAAvB,EACK,WADL,CACiB,UADjB,EAEK,UAFL,CAEgB,UAFhB;AAGA,aAAK,IAAL,CAAU,gCAAV,EAA4C,WAA5C,CAAwD,UAAxD;;AAEA,YAAI,UAAU,SAAd,EAAyB;AACrB,iBAAK,IAAL,CAAU,aAAV,EAAyB,MAAzB;AACH;;AAED,YAAI,UAAU,QAAV,IAAsB,KAAK,IAAL,CAAU,WAAV,KAA0B,aAApD,EAAmE;AAC/D,iBAAK,QAAL,CAAc,QAAd,EACK,WADL,CACiB,iBADjB,EAEK,GAFL,CAES,UAFT,EAEqB,UAFrB;AAGA,iBAAK,IAAL,CAAU,gCAAV,EAA4C,IAA5C;AACH;;AAED,aAAK,IAAL,CAAU,KAAV,EAAiB,QAAjB,CAA0B,WAA1B;;AAEA,qCACI,OAAO,QAAP,CAAgB,QAAhB,IACK,OAAO,QAAP,CAAgB,MAAhB,GAAyB,OAAO,QAAP,CAAgB,MAAzC,GAAkD,EADvD,CADJ;AAIH,KAtUY;;AAwUb,oBAAgB,wBAAU,OAAV,EAAmB,IAAnB,EAAyB;AACrC,YAAI,aAAa,EAAE,sCAAsC,OAAtC,GAAgD,IAAlD,EACZ,IADY,CACP,GADO,EAEZ,QAFY,CAEH,KAFG,CAAjB;AAGA,YAAI,WAAW,MAAf,EAAuB;AACnB,gBAAI,KAAK,IAAI,MAAJ,CACL,MACI,OAAO,IAAP,CAAY,sBAAZ,CADJ,GAEI,KAFJ,GAGI,OAAO,IAAP,CAAY,MAAZ,CAHJ,GAII,KAJJ,GAKI,OAAO,IAAP,CAAY,QAAZ,CALJ,GAMI,KANJ,GAOI,OAAO,IAAP,CAAY,uBAAZ,CAPJ,GAQI,KARJ,GASI,OAAO,IAAP,CAAY,sBAAZ,CATJ,GAUI,KAVJ,GAWI,OAAO,IAAP,CAAY,wBAAZ,CAXJ,GAYI,GAbC,EAcL,IAdK,CAAT;AAgBA,uBAAW,IAAX,CAAgB,KAAhB,EAAuB,WAAW,IAAX,CAAgB,KAAhB,EAAuB,OAAvB,CAA+B,EAA/B,EAAmC,IAAnC,CAAvB;AACH;AACJ;AA/VY,CAAjB;;AAkWA;;;AAGA,OAAO,iBAAP,GAA2B,YAAY;AACnC,WAAO,YAAP,CAAoB,OAApB,CAA4B,mBAA5B;AACH,CAFD;;AAIA;;;AAGA,EAAE,YAAY;AACV,QAAI,WACA,+GADJ;AAEA,MAAE,QAAF,EAAY,EAAZ,CAAe,OAAf,EAAwB,QAAxB,EAAkC,UAAU,CAAV,EAAa;AAC3C,YAAI,OACA,EAAE,EAAE,MAAJ,EAAY,EAAZ,CAAe,wBAAf,KACA,EAAE,EAAE,MAAJ,EAAY,EAAZ,CAAe,+BAAf,CADA,GAEM,EAAE,EAAE,MAAJ,CAFN,GAGM,EAAE,EAAE,MAAJ,EAAY,OAAZ,CAAoB,wBAApB,EAA8C,MAA9C,GACA,EAAE,EAAE,MAAJ,EAAY,OAAZ,CAAoB,wBAApB,CADA,GAEA,EAAE,EAAE,MAAJ,EAAY,OAAZ,CAAoB,+BAApB,CANV;AAOA,YAAI,UAAU,KAAK,IAAL,CAAU,eAAV,CAAd;;AAEA,YAAI,KAAK,IAAL,CAAU,WAAV,KAA0B,aAA9B,EAA6C;AACzC,gBAAI,qBAAqB,EAAE,2BAA2B,OAA7B,EACpB,MADoB,GAEnB,EAAE,2BAA2B,OAA7B,CAFmB,GAGnB,EAAE,qBAAqB,OAAvB,CAHN;AAIA,mBAAO,IAAP,CAAY,MAAZ,CAAmB,OAAnB,EAA4B,mBAAmB,GAAnB,EAA5B,EAAsD,IAAtD;;AAEA;AACA,iBAAK,GAAL,CAAS,OAAT;AACH,SATD,MASO,IACH,KAAK,IAAL,CAAU,WAAV,KAA0B,aAA1B,IACA,QAAQ,GAAR,CAAY,mBAAZ,KAAoC,GAFjC,EAGL;AACE,cAAE,uBAAF,EAA2B,IAA3B,CAAgC,eAAhC,EAAiD,OAAjD;AACH,SALM,MAKA;AACH;AACA,iBAAK,IAAL,CAAU,aAAV,EAAyB,MAAzB,EAAiC,KAAjC;AACH;AACJ,KA5BD;;AA8BA;AACA,MAAE,QAAF,EAAY,EAAZ,CAAe,2BAAf,EAA4C,UAAU,CAAV,EAAa,IAAb,EAAmB,IAAnB,EAAyB;AACjE,YAAI,UAAU,KAAK,IAAL,CAAU,eAAV,CAAd;AACA,YAAI,eAAe,EACf,kDACI,OADJ,GAEI,0CAFJ,GAGI,OAHJ,GAII,IALW,CAAnB;;AAQA;AACA,UAAE,oCAAoC,OAApC,GAA8C,IAAhD,EAAsD,GAAtD,CACI,YADJ,EAEI,QAFJ;AAIH,KAfD;;AAiBA;AACA,MAAE,QAAF,EACK,EADL,CACQ,eADR,EACyB,UAAU,CAAV,EAAa,IAAb,EAAmB,IAAnB,EAAyB;AAC1C,YAAI,UAAU,KAAK,IAAL,CAAU,eAAV,CAAd;AACA,YAAI,eAAe,EACf,kDAAkD,OAAlD,GAA4D,IAD7C,CAAnB;;AAIA;AACA,YAAI,OAAO,OAAO,IAAP,CAAY,sBAAZ,EAAoC,WAApC,EAAX;AACA,UAAE,sCAAsC,OAAtC,GAAgD,MAAlD,EACK,IADL,CAEQ,OACI,wEAHZ,EAKK,IALL,CAKU,MALV,EAKkB,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,YAAzB,CALlB;;AAOA;AACA,eAAO,OAAP,CAAe,iBAAf,CAAiC,YAAjC,EAA+C,UAA/C;;AAEA;AACA,YACI,aAAa,IAAb,CAAkB,WAAlB,MAAmC,aAAnC,IACA,CAAC,KAAK,cAFV,EAGE;AACE,mBAAO,IAAP,CAAY,kBAAZ,CACI,IADJ,EAEI,KAAK,IAAL,CAAU,gBAAV,CAFJ;AAIH;;AAED;AACA,UAAE,QAAF,EAAY,UAAZ,CAAuB,QAAvB,EAAiC,OAAjC;AACH,KAhCL,EAiCK,EAjCL,CAiCQ,eAjCR,EAiCyB,UAAU,CAAV,EAAa;AAC9B;AACA,YAAI,EAAE,EAAE,MAAJ,EAAY,OAAZ,CAAoB,OAApB,KAAgC,MAApC,EAA4C,CAC3C;AACJ,KArCL,EAsCK,EAtCL,CAsCQ,eAtCR,EAsCyB,UAAU,CAAV,EAAa,IAAb,EAAmB,QAAnB,EAA6B;AAC9C,mBAAW,KAAK,KAAL,CAAW,SAAS,KAAT,CAAe,YAA1B,CAAX;AACA,YAAI,SAAS,IAAb;AACA,YAAI,UAAU,OAAO,IAAP,CAAY,eAAZ,CAAd;;AAEA;AACA;AACA;AACA;AACA,YAAI,SAAS,SAAT,KAAuB,gCAA3B,EAA6D;AACzD,gBAAI,OAAO,SAAP,CAAiB,QAAjB,KAA8B,SAAlC,EAA6C;AACzC,uBAAO,iBAAP;AACH,aAFD,MAEO;AACH;AACA,kBAAE,sBAAF,EAA0B,UAA1B,CAAqC,QAArC,EAA+C,MAA/C;AACA,kBAAE,oCAAoC,OAApC,GAA8C,IAAhD,EAAsD,IAAtD,CACI,EACI,oCAAoC,OAApC,GAA8C,IADlD,EAEE,IAFF,CAEO,oBAFP,CADJ;AAKH;AACJ,SAZD,MAYO,IAAI,SAAS,cAAb,EAA6B;AAChC,gBAAI,aAAa,OAAO,QAAP,CAAgB,QAAjC;AACA,gBAAI,OAAO,QAAP,CAAgB,MAApB,EAA4B;AACxB,8BAAc,OAAO,QAAP,CAAgB,MAAhB,GAAyB,UAAzB,GAAsC,OAApD;AACH,aAFD,MAEO;AACH,8BAAc,aAAa,OAA3B;AACH;AACD,cAAE,oBAAF,EAAwB,IAAxB,CACI,MADJ,EAEI,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,aAAzB,EAAwC;AACpC,yBAAS;AAD2B,aAAxC,CAFJ;AAMA,cAAE,qBAAF,EAAyB,UAAzB,CAAoC,QAApC,EAA8C,MAA9C;AACA,cAAE,oCAAoC,OAApC,GAA8C,IAAhD,EAAsD,IAAtD,CACI,EAAE,oCAAoC,OAApC,GAA8C,IAAhD,EAAsD,IAAtD,CACI,oBADJ,CADJ;AAKH,SAnBM,MAmBA,IAAI,SAAS,SAAT,KAAuB,wBAA3B,EAAqD;AACxD,gBAAI,OAAO,EAAX;AACA,gBAAI,WAAW,EAAf;AACA,gBACI,SAAS,SAAT,KAAuB,6BAAvB,IACA,SAAS,SAAT,KAAuB,mBAF3B,EAGE;AACE,uBAAO,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,YAAzB,CAAP;AACA,2BAAW,OAAO,IAAP,CAAY,OAAZ,CAAX;AACH,aAND,MAMO,IACH,SAAS,SAAT,KAAuB,6BAAvB,IACA,SAAS,SAAT,KAAuB,+BAFpB,EAGL;AACE,uBAAO,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,cAAzB,CAAP;AACA,2BAAW,OAAO,IAAP,CAAY,sBAAZ,CAAX;AACH;AACD,gBAAI,OACA,2BACA,IADA,GAEA,iBAFA,GAGA,QAHA,GAIA,MALJ;AAMA,gBAAI,OAAO,OAAX,EACI,OAAO,OAAP,CAAe,IAAf,CACI,aACI,OAAO,IAAP,CAAY,cAAZ,CADJ,GAEI,YAFJ,GAGI,OAAO,IAAP,CAAY,WAAW,SAAS,SAAhC,EAA2C;AACvC,sBAAM;AADiC,aAA3C,CAJR,EAOI,OAPJ;AASJ,cAAE,oCAAoC,OAApC,GAA8C,IAAhD,EAAsD,IAAtD,CACI,EAAE,oCAAoC,OAApC,GAA8C,IAAhD,EAAsD,IAAtD,CACI,oBADJ,CADJ;AAKH,SArCM,MAqCA,IAAI,KAAK,OAAL,CAAa,OAAb,KAAyB,MAA7B,EAAqC;AACxC,gBAAI,YAAY;AACZ,oBAAI,OADQ;AAEZ,uBAAO,OAAO,IAAP,CAAY,YAAZ,CAFK;AAGZ,uBAAO,OAAO,IAAP,CAAY,SAAZ,CAHK;AAIZ,wBAAQ,OAAO,IAAP,CAAY,WAAZ,CAJI;AAKZ,4BAAY,OAAO,IAAP,CAAY,kBAAZ;AALA,aAAhB;;AAQA,kCAAsB,SAAtB;AACH;AACJ,KA9HL;;AAgIA;AACA;AACA,MAAE,QAAF,EAAY,EAAZ,CACI,WADJ,EAEI,kDAFJ,EAGI,UAAU,CAAV,EAAa;AACT,YAAI,OAAO,EAAE,EAAE,MAAJ,EAAY,EAAZ,CAAe,sBAAf,IACL,EAAE,EAAE,MAAJ,CADK,GAEL,EAAE,EAAE,MAAJ,EAAY,OAAZ,CAAoB,sBAApB,CAFN;AAGA,YAAI,KACA,KAAK,IAAL,CAAU,IAAV,KAAmB,qBAAnB,IACA,QAAQ,GAAR,CAAY,mBAAZ,KAAoC,GAFxC;;AAIA,YAAI,EAAJ,EAAQ;AACJ,mBAAO,EACH,0CACI,KAAK,IAAL,CAAU,eAAV,CADJ,GAEI,IAHD,CAAP,CADI,CAKD;AACH,mBAAO,IAAP,CAAY,MAAZ,CAAmB,KAAK,IAAL,CAAU,eAAV,CAAnB,EAA+C,IAA/C,EAAqD,IAArD;AACH,SAPD,MAOO;AACH,cAAE,uBAAF,EAA2B,IAA3B,CACI,eADJ,EAEI,KAAK,IAAL,CAAU,eAAV,CAFJ;AAIH;AACJ,KAxBL;;AA2BA;AACA,MAAE,0CAAF,EAA8C,EAA9C,CAAiD,OAAjD,EAA0D,YAAY;AAClE,UAAE,sBAAF,EAA0B,IAA1B,CAA+B;AAC3B,6BAAiB,EAAE,IAAF,EAAQ,IAAR,CAAa,eAAb,CADU;AAE3B,yBAAa,EAAE,IAAF,EAAQ,IAAR,CAAa,WAAb;AAFc,SAA/B;AAIH,KALD;AAMH,CAxND;;AA0NA,OAAO,mBAAP,GAA6B,UAAU,OAAV,EAAmB;AAC5C,QAAI,OAAO,EAAE,oCAAoC,OAApC,GAA8C,UAAhD,CAAX;AACA,SAAK,IAAL,CAAU,oBAAV,EAAgC,KAAK,IAAL,EAAhC;AACA,SAAK,IAAL,CAAU,uBAAV;AACA,SAAK,MAAL,CAAY,OAAZ,EAAqB,IAArB,EAA2B,IAA3B;AACH,CALD;;AAOA;;;AAGA,EAAE,YAAY;AACV,QAAI,WAAW,kDAAf;AACA,MAAE,QAAF,EACK,EADL,CACQ,OADR,EACiB,QADjB,EAC2B,UAAU,CAAV,EAAa;AAChC,YAAI,SAAS,EAAE,EAAE,MAAJ,EAAY,OAAZ,CAAoB,QAApB,CAAb;AACA,YAAI,UAAU,OAAO,IAAP,CAAY,eAAZ,CAAd;;AAEA;AACA,eAAO,UAAP,CAAkB,MAAlB,EAA0B,OAA1B;;AAEA,UAAE,wBAAF,EAA4B,UAA5B,CAAuC,iBAAvC;;AAEA;AACA,UAAE,EAAE,EAAE,MAAJ,CAAF,EAAe,GAAf,CAAmB,OAAnB;AACH,KAZL,EAaK,EAbL,CAaQ,aAbR,EAauB,UAAU,CAAV,EAAa,IAAb,EAAmB,IAAnB,EAAyB;AACxC,YAAI,UAAU,KAAK,IAAL,CAAU,eAAV,CAAd;AACA,YAAI,WAAW,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,YAAzB,CAAf;;AAEA;AACA,eAAO,IAAP,CAAY,OAAZ,CAAoB,OAApB,EAA6B,IAA7B,CAAkC,UAAU,KAAV,EAAiB;AAC/C,mBAAO,0BAAP,CAAkC,KAAlC;AACH,SAFD;;AAIA,YAAI,QAAQ,EAAE,4BAAF,EAAgC,GAAhC,EAAZ;;AAEA;AACA,YAAI,QAAQ,IAAI,OAAO,KAAX,CAAiB,OAAO,SAAP,CAAiB,UAAjB,CAA4B,OAA5B,CAAjB,CAAZ;AACA,eAAO,YAAP,CAAoB,OAApB,CAA4B,oBAA5B,EAAkD;AAC9C,wBAAY;AADkC,SAAlD;;AAIA,UAAE,oCAAoC,OAApC,GAA8C,IAAhD,EAAsD,GAAtD,CACI,YADJ,EAEI,QAFJ;;AAKA,YAAI,OACA,cAAc,QAAd,GAAyB,IAAzB,GAAgC,OAAO,IAAP,CAAY,OAAZ,CAAhC,GAAuD,MAD3D;AAEA,UAAE,2BAAF,EAA+B,IAA/B,CACI,OAAO,IAAP,CAAY,uBAAZ,EAAqC,EAAE,MAAM,IAAR,EAArC,CADJ;;AAIA,YACI,EAAE,IAAF,EAAQ,OAAR,CAAgB,mCAAhB,EAAqD,MAArD,GAA8D,CADlE,EAEE;AACE,cAAE,IAAF,EAAQ,IAAR,CAAa,aAAb,EAA4B,MAA5B;AACH;AACD,eAAO,OAAP,CAAe,iBAAf,CACI,EACI,0CACI,OADJ,GAEI,6CAFJ,GAGI,OAHJ,GAII,oDAJJ,GAKI,OALJ,GAMI,2CANJ,GAOI,OAPJ,GAQI,IATR,CADJ,EAYI,MAZJ;;AAeA;AACA,UAAE,sCAAsC,OAAtC,GAAgD,MAAlD,EACK,IADL,CAEQ,OAAO,IAAP,CAAY,QAAZ,IACI,wEAHZ,EAKK,IALL,CAKU,MALV,EAKkB,QALlB,EAMK,QANL,CAMc,WANd;AAOA,eAAO,OAAP,CAAe,cAAf,CAA8B,OAA9B,EAAuC,OAAO,IAAP,CAAY,QAAZ,CAAvC;;AAEA;AACA,UAAE,6CAA6C,OAA7C,GAAuD,IAAzD,EACK,QADL,CACc,qBADd,EAEK,WAFL,CAEiB,yBAFjB;;AAIA;AACA,UAAE,mCAAmC,OAAnC,GAA6C,IAA/C,EAAqD,QAArD,CACI,SADJ;AAGH,KAhFL,EAiFK,EAjFL,CAiFQ,aAjFR,EAiFuB,UAAU,CAAV,EAAa,IAAb,EAAmB,QAAnB,EAA6B;AAC5C,eAAO,OAAP,CAAe,iBAAf,CAAiC,IAAjC,EAAuC,MAAvC;;AAEA,mBAAW,KAAK,KAAL,CAAW,SAAS,YAApB,CAAX;AACA,YAAI,OAAO,EAAX;AACA,YAAI,UAAU,KAAK,IAAL,CAAU,eAAV,CAAd;;AAEA,iBAAS,UAAT,CAAoB,QAApB,EAA8B;AAC1B,mBAAO,OAAP,CAAe,IAAf,CACI,aACI,OAAO,IAAP,CAAY,cAAZ,CADJ,GAEI,YAFJ,GAGI,OAAO,IAAP,CAAY,WAAW,SAAS,SAAhC,EAA2C;AACvC,sBAAM;AADiC,aAA3C,CAJR,EAOI,OAPJ;AASH;;AAED,YAAI,SAAS,cAAb,EAA6B;AACzB,mBAAO,YAAP,CAAoB,OAApB,CAA4B,sBAA5B,EAAoD;AAChD,wBAAQ,UAAU;AAD8B,aAApD;AAGH,SAJD,MAIO,IACH,SAAS,SAAT,KAAuB,gCADpB,EAEL;AACE,cAAE,qBAAF,EAAyB,UAAzB,CAAoC,QAApC,EAA8C,OAA9C;AACA,mBAAO,iBAAP;AACH,SALM,MAKA,IACH,SAAS,SAAT,KAAuB,mBAAvB,IACA,SAAS,SAAT,KAAuB,yBAFpB,EAGL;AACE,cAAE,qBAAF,EAAyB,UAAzB,CAAoC,QAApC,EAA8C,OAA9C;AACA,mBACI,2BACA,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,YAAzB,CADA,GAEA,iBAFA,GAGA,OAAO,IAAP,CAAY,OAAZ,CAHA,GAIA,MALJ;AAMA,gBAAI,OAAO,OAAX,EAAoB,WAAW,IAAX;AACvB,SAZM,MAYA,IACH,SAAS,SAAT,KAAuB,+BAAvB,IACA,SAAS,SAAT,KAAuB,wBAFpB,EAGL;AACE,cAAE,qBAAF,EAAyB,UAAzB,CAAoC,QAApC,EAA8C,OAA9C;AACA,mBACI,2BACA,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,cAAzB,CADA,GAEA,iBAFA,GAGA,OAAO,IAAP,CAAY,sBAAZ,CAHA,GAIA,MALJ;AAMA,gBAAI,OAAO,OAAX,EAAoB,WAAW,IAAX;AACvB,SAZM,MAYA;AACH,cAAE,qBAAF,EAAyB,UAAzB,CAAoC,QAApC,EAA8C,OAA9C;AACA,gBAAI,OAAO,OAAX,EAAoB,WAAW,EAAX;AACvB;;AAED,UACI,oCACI,KAAK,IAAL,CAAU,eAAV,CADJ,GAEI,IAHR,EAIE,IAJF,CAIO,KAAK,IAAL,CAAU,oBAAV,CAJP;AAKH,KA/IL;;AAiJA;;;AAGA,MAAE,wBAAF,EAA4B,EAA5B,CAA+B,mBAA/B,EAAoD,UAAU,CAAV,EAAa;AAC7D,YAAI,OAAO,EACP,yCACI,EAAE,IAAF,EAAQ,IAAR,CAAa,eAAb,CADJ,GAEI,IAHG,EAIT,KAJS,EAAX;;AAMA;AACA,YAAI,EAAE,wBAAF,EAA4B,IAA5B,CAAiC,iBAAjC,CAAJ,EAAyD;AACrD,mBAAO,iBAAP,CACI,EAAE,wBAAF,EAA4B,IAA5B,CAAiC,eAAjC,CADJ,EAEI,EAAE,0CAAF,EAA8C,IAA9C,EAFJ;AAIH,SALD,MAKO,IAAI,EAAE,wBAAF,EAA4B,IAA5B,CAAiC,gBAAjC,CAAJ,EAAwD;AAC3D,mBAAO,IAAP,CAAY,SAAZ,CACI,EAAE,wBAAF,EAA4B,IAA5B,CAAiC,eAAjC,CADJ,EAEI,EAAE,4BAAF,EAAgC,GAAhC,EAFJ,EAGI,EAAE,MAAF,CAHJ;AAKH,SANM,MAMA;AACH,mBAAO,KAAP,CAAa,UAAb,CAAwB,IAAxB;AACH;AACJ,KAtBD;AAuBH,CA7KD;;AA+KA,OAAO,UAAP,GAAoB,UAAU,MAAV,EAAkB,OAAlB,EAA2B;AAC3C,aAAS,eAAT,GAA2B;AACvB,UAAE,yCAAF,EAA6C,IAA7C,CACI,EAAE,mBAAF,EAAuB,IAAvB,CAA4B,YAA5B,CADJ;AAGA,YAAI,OAAO,IAAP,CAAY,cAAZ,CAAJ,EAAiC;AAC7B,cAAE,yBAAF,EAA6B,IAA7B,CACI,KADJ,EAEI,OAAO,IAAP,CAAY,cAAZ,CAFJ;AAIH,SALD,MAKO;AACH,gBAAI,MAAM,EAAE,8BAA8B,OAA9B,GAAwC,QAA1C,EAAoD,IAApD,CACN,KADM,CAAV;AAGA,gBAAI,OAAO,GAAP,IAAc,WAAlB,EAA+B;AAC3B,sBAAM,EAAE,gDAAF,EAAoD,IAApD,CACF,KADE,CAAN;AAGH;AACD,cAAE,yBAAF,EAA6B,IAA7B,CAAkC,KAAlC,EAAyC,GAAzC;AACH;AACD,eAAO,KAAP,CAAa,eAAb,CAA6B,MAA7B;AACH;;AAED,WAAO,IAAP,CACK,cADL,GAEK,IAFL,CAEU,UAAU,KAAV,EAAiB;AACnB,YAAI,SAAS,EAAb,EAAiB;AACb,cAAE,+CAAF,EAAmD,GAAnD,CAAuD,KAAvD;AACA,cACI,qEADJ,EAEE,QAFF,CAEW,aAFX;AAGA,mBAAO,KAAP,CAAa,UAAb,CAAwB,MAAxB;AACH,SAND,MAMO;AACH;AACH;AACJ,KAZL,EAaK,IAbL,CAaU,YAAY;AACd;AACH,KAfL;AAgBH,CAxCD;;AA0CA;;;AAGA,SAAS,qBAAT,CACI,KADJ,EAEI,MAFJ,EAGI,QAHJ,EAII,OAJJ,EAKI,OALJ,EAMI,cANJ,EAOI,YAPJ,EAQE;AACE,QAAI,QAAQ,EAAE,qBAAF,CAAZ;AACA,MAAE,wBAAF,EAA4B,IAA5B,CAAiC,iBAAjC,EAAoD,IAApD;AACA,QAAI,SAAS,EAAE,oCAAoC,OAApC,GAA8C,UAAhD,CAAb;;AAEA,WAAO,IAAP,CAAY,oBAAZ,EAAkC,OAAO,IAAP,EAAlC;AACA,WAAO,IAAP,CAAY,uBAAZ;;AAEA,MAAE,IAAF,CAAO,OAAO,IAAP,CAAY,eAAZ,CAA4B,OAA5B,CAAP,EAA6C,OAAO,IAAP,CAAY,cAAZ,EAA7C,EACK,IADL,CACU,UAAU,gBAAV,EAA4B,SAA5B,EAAuC;AACzC,YAAI,mBAAmB,iBAAiB,CAAjB,CAAvB;AACA,YAAI,QAAQ,UAAU,CAAV,CAAZ;;AAEA,YAAI,SAAS,EAAT,IAAe,iBAAiB,eAAjB,GAAmC,CAAtD,EAAyD;AACrD,cAAE,+CAAF,EAAmD,GAAnD,CAAuD,KAAvD;AACA,cACI,qEADJ,EAEE,QAFF,CAEW,aAFX;AAGA,cAAE,wBAAF,EAA4B,IAA5B,CAAiC,eAAjC,EAAkD,OAAlD;AACA,mBAAO,iBAAP,CACI,OADJ,EAEI,iBAAiB,eAAjB,GAAmC,CAFvC;AAIH,SAVD,MAUO;AACH,cAAE,mBAAF,EAAuB,IAAvB,CAA4B,KAA5B;AACA,cAAE,yBAAF,EACK,WADL,GAEK,QAFL,CAEc,UAAU,MAFxB;AAGA,cAAE,yBAAF,EAA6B,IAA7B,CAAkC,QAAlC;AACA,cAAE,yBAAF,EAA6B,IAA7B,CAAkC,KAAlC,EAAyC,OAAzC;AACA,gBAAI,kBAAkB,SAAlB,IAA+B,YAAnC,EAAiD;AAC7C,kBAAE,+BAAF,EACK,IADL,CACU,2BAA2B,cADrC,EAEK,WAFL,CAEiB,QAFjB;AAGH,aAJD,MAIO;AACH,kBAAE,+BAAF,EACK,IADL,CACU,EADV,EAEK,QAFL,CAEc,QAFd;AAGH;;AAED,gBAAI,YAAY,OAAO,IAAP,CAAY,gCAAZ,EAA8C;AAC1D,6BAAa,OAAO,SAAP,CAAiB;AAD4B,aAA9C,CAAhB;AAGA,gBAAI,OAAO,SAAP,CAAiB,UAAjB,CAA4B,OAA5B,EAAqC,WAArC,KAAqD,CAAzD,EAA4D;AACxD,4BAAY,OAAO,IAAP,CAAY,kCAAZ,CAAZ;AACH;AACD,cAAE,sBAAF,EAA0B,IAA1B,CAA+B,SAA/B;;AAEA,cAAE,wBAAF,EAA4B,IAA5B,CAAiC,eAAjC,EAAkD,OAAlD;;AAEA,gBACI,OAAO,IAAP,CAAY,gBAAZ,KAAiC,OAAjC,IACA,OAAO,IAAP,CAAY,gBAAZ,KAAiC,OADjC,IAEA,QAAQ,GAAR,CAAY,qBAAZ,KAAsC,GAH1C,EAIE;AACE;AACA,kBAAE,oBAAF,EAAwB,UAAxB,CAAmC,QAAnC,EAA6C,MAA7C;AACH,aAPD,MAOO;AACH,sBAAM,UAAN,CAAiB,QAAjB,EAA2B,MAA3B;AACH;AACJ;AACJ,KArDL,EAsDK,IAtDL,CAsDU,YAAY;AACd,eAAO,UAAP,CAAkB,MAAlB,EAA0B,OAA1B;AACH,KAxDL;AAyDH;;AAED,OAAO,iBAAP,GAA2B,UAAU,OAAV,EAAmB,eAAnB,EAAoC;AAC3D,QAAI,OAAO,EAAE,oCAAoC,OAApC,GAA8C,IAAhD,CAAX;;AAEA,QAAI,uBAAuB,EACvB,oCAAoC,OAApC,GAA8C,IADvB,EAEzB,IAFyB,EAA3B;AAGA,SAAK,IAAL,CAAU,OAAO,uBAAjB;AACA,MACI,qEADJ,EAEE,QAFF,CAEW,aAFX;;AAIA,WAAO,IAAP,CAAY,SAAZ,CACI,OADJ,EAEI,mBAAmB,EAAE,4BAAF,EAAgC,GAAhC,EAAnB,CAFJ,EAGI,IAHJ;AAKH,CAhBD;;AAkBA,OAAO,oBAAP,GAA8B,UAAU,MAAV,EAAkB;AAC5C,QAAI,QAAQ,EAAE,sBAAF,CAAZ;AACA,QAAI,UAAU,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,YAAzB,CAAd;AACA,QAAI,cACA,4CACA,OADA,GAEA,iBAFA,GAGA,OAAO,IAAP,CAAY,8BAAZ,CAHA,GAIA,MALJ;AAMA,QAAI,WAAJ;AACA,QAAI,OAAO,mBAAP,IAA8B,CAAlC,EAAqC;AACjC,sBAAc,OAAO,IAAP,CAAY,oCAAZ,EAAkD;AAC5D,mBAAO,OAAO,KAD8C;AAE5D,6BAAiB;AAF2C,SAAlD,CAAd;AAIH,KALD,MAKO;AACH,sBAAc,OAAO,IAAP,CAAY,wBAAZ,EAAsC;AAChD,mBAAO,OAAO,KADkC;AAEhD,6BAAiB;AAF+B,SAAtC,CAAd;AAIH;AACD,UAAM,IAAN,CAAW,+BAAX,EAA4C,IAA5C,CAAiD,uBAAjD;AACA,MAAE,GAAF,CACI,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,0BAAzB,EAAqD;AACjD,iBAAS,OAAO;AADiC,KAArD,CADJ,EAII,UAAU,GAAV,EAAe;AACX,UAAE,wBAAF,EAA4B,IAA5B,CAAiC,GAAjC;AACA,cAAM,IAAN,CAAW,6BAAX,EAA0C,IAA1C,CAA+C,WAA/C;AACA,YAAI,OAAO,SAAS,EAAE,KAAK,YAAP,EAAT,CAAX;AACA,UAAE,iBAAF;AACI;AADJ,SAEK,QAFL,CAEc,QAFd;AAGI;AAHJ,SAIK,IAJL,CAKQ,KALR,EAMQ,4EANR;AAQI;AARJ,SASK,EATL,CASQ,MATR,EASgB,YAAY;AACpB,gBAAI,KAAK,YAAL,CAAkB,YAAlB,CAAJ,EAAqC;AACjC,kBAAE,IAAF,EACK,UADL,CACgB,mBADhB,EAEK,WAFL,CAEiB,QAFjB;AAGH;AACJ,SAfL;AAgBI;AAhBJ,SAiBK,IAjBL,CAiBU,YAAY;AACd,iBAAK,IAAL;AACH,SAnBL;AAoBA,cAAM,IAAN,CAAW,+BAAX,EAA4C,IAA5C,CAAiD,EAAjD;AACA,cAAM,UAAN,CAAiB,QAAjB,EAA2B,MAA3B;AACA,YAAI,OAAO,OAAO,MAAd,IAAwB,UAA5B,EAAwC,OAAO,MAAP;AAC3C,KA/BL;AAiCH,CAvDD;;AAyDA;AACA,EAAE,sBAAF,EAA0B,EAA1B,CAA6B,qBAA7B,EAAoD,UAAU,CAAV,EAAa;AAC7D;AACA,QACI,EAAE,4BAAF,EAAgC,IAAhC,CAAqC,kBAArC,MAA6D,MAA7D,IACA,CAAC,EAAE,EAAE,MAAJ,EAAY,QAAZ,CAAqB,iBAArB,CAFL,EAGE;AACE,UAAE,wBAAF,EAA4B,IAA5B,CAAiC,EAAjC;AACH;AACD,QAAI,OAAO,OAAX,EAAoB,OAAO,OAAP,CAAe,WAAf;AACvB,CATD;;AAWA,EAAE,wBAAF,EAA4B,EAA5B,CAA+B,WAA/B,EAA4C,UAAU,CAAV,EAAa;AACrD,QAAI,EAAE,EAAE,MAAJ,EAAY,QAAZ,CAAqB,0BAArB,CAAJ,EAAsD;AAClD,UAAE,4BAAF,EAAgC,IAAhC,CAAqC,kBAArC,EAAyD,IAAzD;AACH;AACJ,CAJD;;AAMA,EAAE,4BAAF,EAAgC,EAAhC,CAAmC,qBAAnC,EAA0D,YAAY;AAClE,QAAI,EAAE,IAAF,EAAQ,IAAR,CAAa,kBAAb,MAAqC,MAAzC,EAAiD;AAC7C,UAAE,sBAAF,EAA0B,UAA1B,CAAqC,QAArC,EAA+C,MAA/C;AACA,UAAE,IAAF,EAAQ,IAAR,CAAa,kBAAb,EAAiC,KAAjC;AACH;AACJ,CALD;;AAOA;;;AAGA,EAAE,QAAF,EAAY,EAAZ,CAAe,mBAAf,EAAoC,kBAApC,EAAwD,YAAY;AAChE,QAAI,UAAU,EAAE,UAAF,EAAc,GAAd,EAAd;;AAEA,MAAE,IAAF,CAAO;AACH,aAAK,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,aAAzB,EAAwC,EAAE,SAAS,OAAX,EAAxC,CADF;AAEH,cAAM,KAFH;AAGH,cAAM;AACF,mBAAO,EAAE,oBAAF,EAAwB,GAAxB,EADL;AAEF,0BAAc,OAAO,cAAP,CAAsB,uBAAtB,KAAkD;AAF9D,SAHH;AAOH,iBAAS,iBAAU,IAAV,EAAgB;AACrB,gBAAI,QAAQ,EAAE,oBAAF,EAAwB,GAAxB,EAAZ;;AAEA;AACA,mBAAO,IAAP,IAAe,OAAO,IAAP,CAAY,YAAZ,CAAyB,KAAzB,CAAf;AACA,cAAE,wBAAF,EAA4B,UAA5B,CAAuC,QAAvC,EAAiD,OAAjD;AACH,SAbE;AAcH,eAAO,eAAU,KAAV,EAAiB,UAAjB,EAA6B,WAA7B,EAA0C;AAC7C,cAAE,wBAAF,EAA4B,UAA5B,CAAuC,QAAvC,EAAiD,OAAjD;AACA,gBAAI,OAAO,OAAX,EACI,OAAO,OAAP,CAAe,IAAf,CACI,aACI,OAAO,IAAP,CAAY,cAAZ,CADJ,GAEI,YAFJ,GAGI,MAAM,YAJd,EAKI,OALJ;AAOP;AAxBE,KAAP;AA0BH,CA7BD;;AA+BA;;;AAGA,EAAE,YAAY;AACV,QAAI,UAAU,0DAAd;;AAEA,MAAE,MAAF,EACK,EADL,CACQ,OADR,EACiB,OADjB,EAC0B,UAAU,CAAV,EAAa;AAC/B,eAAO,IAAP,CAAY,WAAZ,CACI,EAAE,EAAE,MAAJ,EAAY,OAAZ,CAAoB,GAApB,EAAyB,IAAzB,CAA8B,eAA9B,CADJ,EAEI,EAAE,EAAE,MAAJ,EAAY,OAAZ,CAAoB,GAApB,CAFJ;AAIH,KANL,EAOK,EAPL,CAOQ,oBAPR,EAO8B,OAP9B,EAOuC,UAAU,CAAV,EAAa;AAC5C,YAAI,OAAO,EAAE,EAAE,MAAJ,EAAY,OAAZ,CAAoB,KAApB,EAA2B,QAA3B,CAAoC,GAApC,CAAX;AACA,eAAO,OAAP,CAAe,WAAf,CAA2B,IAA3B,EAAiC,WAAjC;AACH,KAVL,EAWK,EAXL,CAWQ,oBAXR,EAW8B,OAX9B,EAWuC,UAAU,CAAV,EAAa,IAAb,EAAmB;AAClD,YAAI,OAAO,EAAE,EAAE,MAAJ,EAAY,OAAZ,CAAoB,KAApB,EAA2B,QAA3B,CAAoC,GAApC,CAAX;AACA,aAAK,WAAL,CAAiB,gBAAjB,EAAmC,QAAnC,CAA4C,sBAA5C;AACA,YAAI,UAAU,EAAE,EAAE,MAAJ,EAAY,OAAZ,CAAoB,GAApB,EAAyB,IAAzB,CAA8B,eAA9B,CAAd;AACA,eAAO,OAAP,CAAe,iBAAf,CACI,EAAE,EAAE,MAAJ,EAAY,OAAZ,CAAoB,GAApB,CADJ,EAEI,iBAFJ;AAIA,eAAO,OAAP,CAAe,WAAf,CAA2B,IAA3B,EAAiC,UAAjC;;AAEA;AACA,YAAI,WAAW,EACX,iCAAiC,OAAjC,GAA2C,IADhC,EAEb,IAFa,CAER,GAFQ,CAAf;AAGA,iBAAS,QAAT,CAAkB,gBAAlB,IACM,SACK,WADL,CACiB,gBADjB,EAEK,QAFL,CAEc,sBAFd,CADN,GAIM,SACK,WADL,CACiB,sBADjB,EAEK,QAFL,CAEc,gBAFd,CAJN;AAOH,KAhCL;;AAkCA,QAAI,aAAa,iCAAjB;AACA,MAAE,MAAF,EACK,EADL,CACQ,OADR,EACiB,UADjB,EAC6B,UAAU,CAAV,EAAa;AAClC,eAAO,IAAP,CAAY,cAAZ,CACI,EAAE,EAAE,MAAJ,EAAY,OAAZ,CAAoB,GAApB,EAAyB,IAAzB,CAA8B,eAA9B,CADJ,EAEI,EAAE,EAAE,MAAJ,EAAY,OAAZ,CAAoB,GAApB,CAFJ,EAGI,KAHJ;AAKH,KAPL,EAQK,EARL,CAQQ,uBARR,EAQiC,UARjC,EAQ6C,UAAU,CAAV,EAAa;AAClD,YAAI,OAAO,EAAE,EAAE,MAAJ,EAAY,OAAZ,CAAoB,KAApB,EAA2B,QAA3B,CAAoC,GAApC,CAAX;AACA,eAAO,OAAP,CAAe,WAAf,CAA2B,IAA3B,EAAiC,WAAjC;AACH,KAXL,EAYK,EAZL,CAYQ,uBAZR,EAYiC,UAZjC,EAY6C,UAAU,CAAV,EAAa,IAAb,EAAmB;AACxD,YAAI,OAAO,EAAE,EAAE,MAAJ,EAAY,OAAZ,CAAoB,KAApB,EAA2B,QAA3B,CAAoC,GAApC,CAAX;AACA,aAAK,WAAL,CAAiB,sBAAjB,EAAyC,QAAzC,CAAkD,gBAAlD;AACA,YAAI,UAAU,EAAE,EAAE,MAAJ,EAAY,OAAZ,CAAoB,GAApB,EAAyB,IAAzB,CAA8B,eAA9B,CAAd;AACA,UAAE,EAAE,MAAJ,EAAY,OAAZ,CAAoB,GAApB,EAAyB,IAAzB,CAA8B,aAA9B,EAA6C,cAA7C;AACA,eAAO,OAAP,CAAe,iBAAf,CACI,EAAE,EAAE,MAAJ,EAAY,OAAZ,CAAoB,GAApB,CADJ,EAEI,cAFJ;AAIA,eAAO,OAAP,CAAe,WAAf,CAA2B,IAA3B,EAAiC,UAAjC;;AAEA;AACA,YAAI,WAAW,EAAE,2BAA2B,OAA3B,GAAqC,IAAvC,EAA6C,IAA7C,CACX,GADW,CAAf;AAGA,iBAAS,QAAT,CAAkB,gBAAlB,IACM,SACK,WADL,CACiB,gBADjB,EAEK,QAFL,CAEc,sBAFd,CADN,GAIM,SACK,WADL,CACiB,sBADjB,EAEK,QAFL,CAEc,gBAFd,CAJN;AAOH,KAlCL;AAmCH,CAzED;;AA2EA;;;AAGA,OAAO,mBAAP,GAA6B,UAAU,OAAV,EAAmB,IAAnB,EAAyB;AAClD,QAAI,cAAc,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,eAAzB,CAAlB;AACA,QAAI,OAAO,EAAE,IAAF,EAAQ,QAAR,CAAiB,QAAjB,CAAX;AACA,QAAI,YAAY,EACZ,gCAAgC,OAAhC,GAA0C,YAD9B,EAEd,IAFc,EAAhB;AAGA,MAAE,IAAF,EAAQ,QAAR,CAAiB,WAAjB;;AAEA,QAAI,EAAE,IAAF,EAAQ,QAAR,CAAiB,gBAAjB,CAAJ,EAAwC;AACpC;AACA,eAAO,IAAP,CAAY,WAAZ,CAAwB,OAAxB,EAAiC,IAAjC;;AAEA,UAAE,QAAF,EACK,EADL,CACQ,oBADR,EAC8B,IAD9B,EACoC,YAAY;AACxC,cAAE,IAAF,EACK,WADL,CACiB,gBADjB,EAEK,QAFL,CAEc,sBAFd,EAGK,WAHL,CAGiB,WAHjB,EAIK,QAJL,CAIc,UAJd;AAKA,cAAE,IAAF,EAAQ,IAAR,CACI,YADJ,EAEI,OAAO,IAAP,CAAY,yBAAZ,EAAuC,EAAE,OAAO,SAAT,EAAvC,CAFJ;;AAKA;AACA,gBAAI,UAAU,EAAE,IAAF,EACT,OADS,CACD,cADC,EAET,IAFS,CAEJ,eAFI,CAAd;AAGA,gBAAI,WAAW,EACX,kDACI,OADJ,GAEI,IAHO,CAAf;AAKA,gBAAI,WAAW,SAAS,IAAT,CAAc,GAAd,CAAf;AACA,qBAAS,IAAT,CAAc,aAAd,EAA6B,iBAA7B;AACA,qBACK,WADL,CACiB,gBADjB,EAEK,QAFL,CAEc,sBAFd;AAGA,mBAAO,OAAP,CAAe,WAAf,CAA2B,QAA3B,EAAqC,UAArC;AACA,mBAAO,OAAP,CAAe,iBAAf,CAAiC,QAAjC,EAA2C,iBAA3C;;AAEA,cAAE,QAAF,EAAY,GAAZ,CAAgB,oBAAhB;AACH,SA9BL,EA+BK,EA/BL,CAgCQ,oBAhCR,EAiCQ,IAjCR,EAkCQ,UAAU,CAAV,EAAa,KAAb,EAAoB,UAApB,EAAgC,WAAhC,EAA6C;AACzC,oBAAQ,GAAR,CAAY,WAAZ;AACA,gBAAI,UAAU,EAAE,IAAF,EACT,OADS,CACD,cADC,EAET,IAFS,CAEJ,eAFI,CAAd;;AAIA,gBACI,MAAM,YAAN,IACA,KAAK,KAAL,CAAW,MAAM,YAAjB,EAA+B,gBAA/B,CAFJ,EAGE;AACE,oBAAI,aAAa,OAAO,QAAP,CAAgB,QAAjC;AACA,oBAAI,OAAO,QAAP,CAAgB,MAApB,EAA4B;AACxB,kCACI,OAAO,QAAP,CAAgB,MAAhB,GAAyB,QAAzB,GAAoC,OADxC;AAEH,iBAHD,MAGO;AACH,kCAAc,WAAW,OAAzB;AACH;AACD,kBAAE,oBAAF,EAAwB,IAAxB,CACI,MADJ,EAEI,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,aAAzB,EAAwC;AACpC,6BAAS;AAD2B,iBAAxC,CAFJ;AAMA,kBAAE,qBAAF,EAAyB,UAAzB,CAAoC,QAApC,EAA8C,MAA9C;AACH,aAlBD,MAkBO;AACH,oBAAI,OAAO,OAAX,EACI,OAAO,OAAP,CAAe,IAAf,CACI,OAAO,IAAP,CAAY,wBAAZ,CADJ,EAEI,OAFJ;AAIP;;AAED,gBAAI,OAAO,EAAE,IAAF,EAAQ,QAAR,CAAiB,GAAjB,CAAX;AACA,mBAAO,OAAP,CAAe,WAAf,CAA2B,IAA3B,EAAiC,UAAjC;;AAEA,cAAE,QAAF,EAAY,GAAZ,CAAgB,oBAAhB;AACH,SAtET;AAwEH,KA5ED,MA4EO,IAAI,EAAE,IAAF,EAAQ,QAAR,CAAiB,sBAAjB,CAAJ,EAA8C;AACjD;AACA,eAAO,IAAP,CAAY,cAAZ,CAA2B,OAA3B,EAAoC,IAApC,EAA0C,KAA1C;;AAEA,UAAE,QAAF,EACK,EADL,CACQ,uBADR,EACiC,IADjC,EACuC,YAAY;AAC3C,cAAE,IAAF,EACK,WADL,CACiB,sBADjB,EAEK,QAFL,CAEc,gBAFd,EAGK,WAHL,CAGiB,WAHjB,EAIK,QAJL,CAIc,UAJd;AAKA,cAAE,IAAF,EAAQ,IAAR,CACI,YADJ,EAEI,OAAO,IAAP,CAAY,oBAAZ,EAAkC,EAAE,OAAO,SAAT,EAAlC,CAFJ;;AAKA;AACA,gBAAI,UAAU,EAAE,IAAF,EAAQ,OAAR,CAAgB,cAAhB,EAAgC,IAAhC,CAAqC,SAArC,CAAd;AACA,gBAAI,WAAW,EACX,qDACI,OADJ,GAEI,IAHO,CAAf;AAKA,gBAAI,WAAW,SAAS,IAAT,CAAc,GAAd,CAAf;AACA,qBAAS,IAAT,CAAc,aAAd,EAA6B,cAA7B;AACA,qBACK,WADL,CACiB,sBADjB,EAEK,QAFL,CAEc,gBAFd;AAGA,mBAAO,OAAP,CAAe,WAAf,CAA2B,QAA3B,EAAqC,UAArC;AACA,mBAAO,OAAP,CAAe,iBAAf,CAAiC,QAAjC,EAA2C,cAA3C;;AAEA,cAAE,QAAF,EAAY,GAAZ,CAAgB,uBAAhB;AACH,SA5BL,EA6BK,EA7BL,CA8BQ,uBA9BR,EA+BQ,IA/BR,EAgCQ,UAAU,CAAV,EAAa,KAAb,EAAoB,UAApB,EAAgC,WAAhC,EAA6C;AACzC,gBAAI,UAAU,EAAE,IAAF,EACT,OADS,CACD,cADC,EAET,IAFS,CAEJ,SAFI,CAAd;AAGA,oBAAQ,GAAR,CAAY,WAAZ;;AAEA,gBACI,MAAM,YAAN,IACA,KAAK,KAAL,CAAW,MAAM,YAAjB,EAA+B,gBAA/B,CAFJ,EAGE;AACE,oBAAI,aACA,OAAO,QAAP,CAAgB,QAAhB,GAA2B,OAAO,QAAP,CAAgB,MAD/C;AAEA,kBAAE,oBAAF,EAAwB,IAAxB,CACI,MADJ,EAEI,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,aAAzB,EAAwC;AACpC,6BAAS;AAD2B,iBAAxC,CAFJ;AAMA,kBAAE,qBAAF,EAAyB,UAAzB,CAAoC,QAApC,EAA8C,MAA9C;AACH,aAbD,MAaO;AACH,oBAAI,OAAO,OAAX,EACI,OAAO,OAAP,CAAe,IAAf,CACI,OAAO,IAAP,CAAY,wBAAZ,CADJ,EAEI,OAFJ;AAIP;;AAED,gBAAI,OAAO,EAAE,IAAF,EAAQ,QAAR,CAAiB,GAAjB,CAAX;AACA,mBAAO,OAAP,CAAe,WAAf,CAA2B,IAA3B,EAAiC,UAAjC;;AAEA,cAAE,QAAF,EAAY,GAAZ,CAAgB,uBAAhB;AACH,SA/DT;AAiEH;AACJ,CA1JD;;AA4JA;;;AAGA,EAAE,YAAY;AACV,QAAI,QAAQ,EAAZ;AACA,QAAI,gBAAgB,EAApB;;AAEA,MAAE,MAAF,EACK,EADL,CACQ,oBADR,EAC8B,YAAY;AAClC,UACI,kEADJ,EAEE,IAFF,CAEO,YAAY;AACf,gBAAI,SAAS,EAAE,IAAF,EAAQ,IAAR,CAAa,aAAb,CAAb;AACA,gBAAI,UAAU,cAAV,IAA4B,UAAU,iBAA1C,EAA6D;AACzD,oBAAI,OAAO,EAAE,IAAF,EAAQ,OAAR,CAAgB,KAAhB,EAAuB,QAAvB,CAAgC,GAAhC,CAAX;AACA,uBAAO,OAAP,CAAe,WAAf,CAA2B,IAA3B,EAAiC,WAAjC;AACH;AACJ,SARD;AASH,KAXL,EAYK,EAZL,CAYQ,oBAZR,EAY8B,UAAU,CAAV,EAAa,IAAb,EAAmB;AACzC,YAAI,IAAJ;;AAEA;AACA;AACA;AACA;AACA;;AAEA,cAAM,QAAN,CACI,CACI,UAAU,QAAV,EAAoB;AAChB;AACA,gBAAI,KAAK,WAAL,IAAoB,IAAxB,EAA8B;AAC1B,qBAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,WAAL,CAAiB,MAArC,EAA6C,GAA7C,EAAkD;AAC9C,wBAAI,UAAU,KAAK,WAAL,CAAiB,CAAjB,CAAd;AACA,0BAAM,MAAN,CAAa,MAAM,OAAN,CAAc,CAAC,OAAf,CAAb,EAAsC,CAAtC;;AAEA;AACA,sBACI,sCACI,OADJ,GAEI,MAHR,EAKK,IALL,CAMQ,OAAO,IAAP,CAAY,UAAZ,IACI,wEAPZ,EASK,IATL,CAUQ,MAVR,EAWQ,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,YAAzB,CAXR,EAaK,QAbL,CAac,WAbd;AAcA,2BAAO,OAAP,CAAe,cAAf,CACI,OADJ,EAEI,OAAO,IAAP,CAAY,UAAZ,CAFJ;AAIA,sBACI,oCACI,OADJ,GAEI,IAHR,EAIE,QAJF,CAIW,4BAJX;;AAMA;AACA,2BAAO,EACH,2CACI,OADJ,GAEI,mDAFJ,GAGI,OAHJ,GAII,0CAJJ,GAKI,OALJ,GAMI,0CANJ,GAOI,OAPJ,GAQI,IATD,CAAP;AAWA,2BAAO,OAAP,CAAe,iBAAf,CACI,IADJ,EAEI,UAFJ,EAGI,IAHJ;AAKA;AACA,sBACI,kCACI,OADJ,GAEI,IAHR,EAIE,IAJF,CAKI,OACK,IADL,CACU,sBADV,EAEK,WAFL,EALJ;AASH;AACJ;;AAED;AACH,SAhEL,EAiEI,UAAU,QAAV,EAAoB;AAChB;AACA,gBAAI,KAAK,OAAL,IAAgB,IAApB,EAA0B;AACtB,qBAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,OAAL,CAAa,MAAjC,EAAyC,GAAzC,EAA8C;AAC1C;AACA,wBACI,KAAK,WAAL,CAAiB,OAAjB,CAAyB,KAAK,OAAL,CAAa,CAAb,CAAzB,KACA,CAAC,CAFL,EAGE;AACE,4BAAI,UAAU,KAAK,OAAL,CAAa,CAAb,CAAd;AACA,8BAAM,MAAN,CAAa,MAAM,OAAN,CAAc,CAAC,OAAf,CAAb,EAAsC,CAAtC;;AAEA,0BACI,sCACI,OADJ,GAEI,MAHR,EAKK,IALL,CAMQ,OAAO,IAAP,CAAY,QAAZ,IACI,wEAPZ,EASK,IATL,CAUQ,MAVR,EAWQ,OAAO,GAAP,CACI,OAAO,MAAP,CAAc,YADlB,CAXR,EAeK,QAfL,CAec,WAfd;AAgBA,+BAAO,OAAP,CAAe,cAAf,CACI,OADJ,EAEI,OAAO,IAAP,CAAY,QAAZ,CAFJ;;AAKA,0BACI,oCACI,OADJ,GAEI,IAHR,EAIE,QAJF,CAIW,4BAJX;;AAMA;AACA,+BAAO,EACH,yCACI,OADJ,GAEI,4CAFJ,GAGI,OAHJ,GAII,IALD,CAAP;AAOA,+BAAO,OAAP,CAAe,iBAAf,CACI,IADJ,EAEI,MAFJ;;AAKA;AACA,0BACI,kCACI,OADJ,GAEI,IAHR,EAIE,IAJF,CAIO,OAAO,IAAP,CAAY,QAAZ,CAJP;;AAMA;AACA,0BACI,6CACI,OADJ,GAEI,IAHR,EAKK,QALL,CAKc,qBALd,EAMK,WANL,CAMiB,yBANjB;;AAQA;AACA,0BACI,mCACI,OADJ,GAEI,IAHR,EAIE,QAJF,CAIW,SAJX;AAKH;AACJ;AACJ;;AAED;AACH,SAhJL,EAiJI,UAAU,QAAV,EAAoB;AAChB;AACA,gBAAI,KAAK,UAAL,IAAmB,IAAvB,EAA6B;AACzB,qBAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,UAAL,CAAgB,MAApC,EAA4C,GAA5C,EAAiD;AAC7C,wBAAI,UAAU,KAAK,UAAL,CAAgB,CAAhB,CAAd;AACA,wBAAI,YAAY,EACZ,gCACI,OADJ,GAEI,YAHQ,EAId,IAJc,EAAhB;;AAMA,sBACI,8BACI,OADJ,GAEI,MAHR,EAKK,WALL,CAKiB,gBALjB,EAMK,QANL,CAOQ,uCAPR;AASA,sBACI,8BACI,OADJ,GAEI,MAHR,EAIE,IAJF,CAKI,YALJ,EAMI,OAAO,IAAP,CAAY,yBAAZ,EAAuC;AACnC,+BAAO;AAD4B,qBAAvC,CANJ;;AAWA;AACA,2BAAO,EACH,iDACI,OADJ,GAEI,IAHD,CAAP;AAKA,wBAAI,OAAO,KAAK,OAAL,CAAa,KAAb,EAAoB,QAApB,CAA6B,GAA7B,CAAX;AACA,2BAAO,OAAP,CAAe,WAAf,CAA2B,IAA3B,EAAiC,UAAjC;AACA,2BAAO,OAAP,CAAe,iBAAf,CACI,IADJ,EAEI,iBAFJ;AAIA,yBAAK,WAAL,CAAiB,gBAAjB,EAAmC,QAAnC,CACI,sBADJ;AAGH;AACJ;;AAED;AACH,SAnML,CADJ,EAsMI,UAAU,GAAV,EAAe,OAAf,EAAwB;AACpB;AACA,iBAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,MAAM,MAA1B,EAAkC,GAAlC,EAAuC;AACnC,oBAAI,OAAO,EACP,kCACI,MAAM,CAAN,CADJ,GAEI,0BAHG,CAAX;;AAMA,qBAAK,IAAL,CAAU,YAAY;AAClB,2BAAO,OAAP,CAAe,iBAAf,CACI,EAAE,IAAF,CADJ,EAEI,EAAE,IAAF,EAAQ,IAAR,CAAa,aAAb,CAFJ,EAGI,IAHJ;AAKH,iBAND;AAOH;;AAED;AACA,iBAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,cAAc,MAAlC,EAA0C,GAA1C,EAA+C;AAC3C,oBAAI,OAAO,EACP,iDACI,cAAc,CAAd,CADJ,GAEI,IAHG,CAAX;;AAMA,oBAAI,OAAO,KAAK,OAAL,CAAa,KAAb,EAAoB,QAApB,CAA6B,GAA7B,CAAX;AACA,uBAAO,OAAP,CAAe,WAAf,CAA2B,IAA3B,EAAiC,UAAjC;AACA,uBAAO,OAAP,CAAe,iBAAf,CACI,EAAE,IAAF,CADJ,EAEI,EAAE,IAAF,EAAQ,IAAR,CAAa,aAAb,CAFJ,EAGI,IAHJ;AAKH;AACJ,SAxOL;;AA2OA,YAAI,WAAW,OAAO,QAAP,CAAgB,QAAhB,EAAf;;AAEA;AACA,YAAI,SAAS,OAAT,CAAiB,SAAjB,KAA+B,CAAC,CAApC,EAAuC;AACnC,yCACI,OAAO,QAAP,CAAgB,QAAhB,IACK,OAAO,QAAP,CAAgB,MAAhB,GAAyB,OAAO,QAAP,CAAgB,MAAzC,GAAkD,EADvD,CADJ;AAIH;;AAED,UAAE,kBAAF,EAAsB,IAAtB,CAA2B,YAAY;AACnC,gBAAI,CAAC,OAAO,MAAR,IAAkB,CAAC,OAAO,MAA9B,EAAsC;AAClC,mBAAG,MAAH,CAAU,IAAV;AACA,mCAAmB,IAAnB;AACH;AACJ,SALD;;AAOA,UAAE,0BAAF,EAA8B,GAA9B,CAAkC,SAAlC,EAA6C,MAA7C;AACA,UAAE,yBAAF,EACK,GADL,CACS,SADT,EACoB,OADpB,EAEK,OAFL,GAGK,IAHL,CAGU,YAAY;AACd,cAAE,QAAF,EAAY,OAAZ,CAAoB,kBAApB;AACH,SALL;;AAOA,UAAE,oDAAF,EAAwD,WAAxD,CACI,UADJ;AAGH,KA5RL,EA6RK,EA7RL,CA6RQ,oBA7RR,EA6R8B,UAAU,CAAV,EAAa,KAAb,EAAoB;AAC1C,UAAE,oDAAF,EAAwD,IAAxD,CACI,YAAY;AACR,gBACI,EAAE,IAAF,EAAQ,IAAR,CAAa,aAAb,KAA+B,cAA/B,IACA,EAAE,IAAF,EAAQ,IAAR,CAAa,aAAb,KAA+B,iBAFnC,EAGE;AACE,uBAAO,OAAP,CAAe,WAAf,CACI,EAAE,IAAF,EAAQ,OAAR,CAAgB,KAAhB,EAAuB,QAAvB,CAAgC,GAAhC,CADJ,EAEI,UAFJ;AAIH;AACD,mBAAO,OAAP,CAAe,iBAAf,CACI,EAAE,IAAF,CADJ,EAEI,EAAE,IAAF,EAAQ,IAAR,CAAa,aAAb,CAFJ,EAGI,IAHJ;AAKH,SAhBL;;AAmBA,UAAE,kBAAF,EAAsB,IAAtB,CAA2B,YAAY;AACnC,gBAAI,CAAC,OAAO,MAAR,IAAkB,CAAC,OAAO,MAA9B,EAAsC;AAClC,mBAAG,MAAH,CAAU,IAAV;AACA,mCAAmB,IAAnB;AACH;AACJ,SALD;AAMH,KAvTL;;AAyTA,QAAI,WAAW,OAAO,QAAP,CAAgB,QAAhB,EAAf;AACA,QACI,EAAE,MAAF,EAAU,IAAV,CAAe,eAAf,KAAmC,OAAnC,IACA,SAAS,OAAT,CAAiB,QAAjB,KAA8B,CAAC,CAFnC,EAGE;AACE,UACI,oHADJ,EAEE,IAFF,CAEO,YAAY;AACf,gBAAI,UACA,OAAO,EAAE,IAAF,EAAQ,IAAR,CAAa,eAAb,CAAP,KAAyC,WAAzC,GACM,EAAE,IAAF,EAAQ,IAAR,CAAa,SAAb,CADN,GAEM,EAAE,IAAF,EAAQ,IAAR,CAAa,eAAb,CAHV;AAIA,gBAAI,MAAM,OAAN,CAAc,CAAC,OAAf,IAA0B,CAA1B,IAA+B,OAAnC,EAA4C;AACxC,sBAAM,IAAN,CAAW,CAAC,OAAZ;AACA,8BAAc,IAAd,CAAmB,CAAC,OAApB;AACH;AACJ,SAXD;AAYA;AACA,YACK,MAAM,MAAN,KAAiB,CAAjB,IAAsB,SAAS,OAAT,CAAiB,WAAW,MAAM,CAAN,CAA5B,IAAwC,CAA/D,IACA,MAAM,MAAN,GAAe,CAFnB,EAGE;AACE,mBAAO,IAAP,CAAY,cAAZ,CAA2B,KAA3B;AACH;AACJ,KAvBD,MAuBO;AACH,UAAE,oDAAF,EAAwD,IAAxD,CACI,YAAY;AACR,mBAAO,OAAP,CAAe,iBAAf,CACI,EAAE,IAAF,CADJ,EAEI,EAAE,IAAF,EAAQ,IAAR,CAAa,aAAb,CAFJ,EAGI,IAHJ;AAKH,SAPL;;AAUA,UAAE,0BAAF,EAA8B,GAA9B,CAAkC,SAAlC,EAA6C,MAA7C;AACA,UAAE,yBAAF,EAA6B,GAA7B,CAAiC,SAAjC,EAA4C,OAA5C;AACA,UAAE,mCAAF,EAAuC,GAAvC,CAA2C,SAA3C,EAAsD,OAAtD;;AAEA,YAAI,EAAE,MAAF,EAAU,IAAV,CAAe,iBAAf,MAAsC,MAA1C,EAAkD;AAC9C,cAAE,QAAF,EAAY,KAAZ,CAAkB,YAAY;AAC1B,2BAAW,YAAY;AACnB,sBAAE,QAAF,EAAY,OAAZ,CAAoB,mBAApB;AACH,iBAFD,EAEG,GAFH;AAGH,aAJD;AAKH;;AAED,UAAE,kBAAF,EAAsB,IAAtB,CAA2B,YAAY;AACnC,gBAAI,CAAC,OAAO,MAAR,IAAkB,CAAC,OAAO,MAA9B,EAAsC;AAClC,mBAAG,MAAH,CAAU,IAAV;AACA,mCAAmB,IAAnB;AACH;AACJ,SALD;AAMH;AACJ,CAnXD;;AAqXA;;;AAGA,EAAE,YAAY;AACV,MAAE,gCAAF,EACK,EADL,CACQ,yBADR,EACmC,UAAU,CAAV,EAAa,IAAb,EAAmB;AAC9C,YAAI,oBAAoB,EAAE,yBAAF,CAAxB;AACA,0BAAkB,KAAlB,GAF8C,CAEnB;AAC3B,aAAK,IAAI,IAAI,CAAb,EAAgB,IAAI,KAAK,KAAL,CAAW,MAA/B,EAAuC,GAAvC,EAA4C;AACxC,gBAAI,IAAJ;AACA,gBAAI,KAAK,KAAL,CAAW,CAAX,EAAc,KAAd,IAAuB,MAA3B,EAAmC;AAC/B,uBAAO,KAAK,KAAL,CAAW,CAAX,EAAc,aAArB;AACH,aAFD,MAEO;AACH;AACA,uBAAO,KAAK,KAAL,CAAW,CAAX,EAAc,aAAd,GAA8B,IAArC;AACH;AACD,gBAAI,gBAAgB,KAAK,KAAL,CAAW,CAAX,EAAc,wBAAd,GACd,oBADc,GAEd,EAFN;AAGA,gBAAI,eAAe,KAAK,KAAL,CAAW,CAAX,EAAc,wBAAd,GACb,sBADa,GAEb,uBAFN;AAGA,gBAAI,gBAAgB,KAAK,KAAL,CAAW,CAAX,EAAc,wBAAd,GACd,OAAO,IAAP,CAAY,UAAZ,CADc,GAEd,EAFN;;AAIA,gBAAI,UACA,0HACA,YADA,GAEA,eAFA,GAGA,OAAO,IAAP,CAAY,mBAAZ,EAAiC,EAAE,MAAM,IAAR,EAAjC,CAHA,GAIA,aAJA,GAKA,WALA,GAMA,aANA,GAOA,gGAPA,GAQA,OAAO,IAAP,CAAY,UAAZ,EAAwB,EAAE,eAAe,IAAjB,EAAxB,CARA,GASA,eATA,GAUA,IAVA,GAWA,gBAXA,GAYA,IAZA,GAaA,SAbA,GAcA,OAAO,IAAP,CAAY,OAAZ,EAAqB,EAAE,eAAe,IAAjB,EAArB,CAdA,GAeA,WAhBJ;;AAkBA,8BAAkB,MAAlB,CAAyB,OAAzB;;AAEA,gBAAI,KAAK,KAAL,CAAW,CAAX,EAAc,wBAAlB,EAA4C;AACxC,oBAAI,OAAO,IAAX;AACA,2BACI,UAAU,IAAV,EAAgB,IAAhB,EAAsB;AAClB,sBAAE,IAAF,EACK,IADL,CAEQ,sBACI,EAAE,IAAF,EAAQ,IAAR,CAAa,eAAb,CADJ,GAEI,IAJZ,EAMK,QANL,CAMc,kBANd,EAOK,IAPL,CAQQ,OAAO,IAAP,CAAY,UAAZ,EAAwB;AACpB,uCAAe;AADK,qBAAxB,CARR;AAYH,iBAdL,EAeI,CAfJ,EAgBI,IAhBJ,EAiBI,IAjBJ;AAmBA,kBACI,0BAA0B,EAAE,IAAF,EAAQ,IAAR,CAAa,eAAb,CAD9B,EAEE,GAFF,CAEM,IAFN;AAGH;AACJ;;AAED,eAAO,OAAP,CAAe,iBAAf,CACI,EAAE,IAAF,EAAQ,IAAR,CAAa,wBAAb,CADJ,EAEI,QAFJ;;AAKA;AACA,YAAI,WAAW,OAAO,QAAP,CAAgB,QAAhB,EAAf;AACA,YAAI,SAAS,OAAT,CAAiB,SAAjB,IAA8B,CAAC,CAAnC,EAAsC;AAClC,yCACI,OAAO,QAAP,CAAgB,QAAhB,IACK,OAAO,QAAP,CAAgB,MAAhB,GAAyB,OAAO,QAAP,CAAgB,MAAzC,GAAkD,EADvD,CADJ;AAIH;AACJ,KAlFL,EAmFK,IAnFL,CAmFU,YAAY;AACd;AACA,YACK,EAAE,IAAF,EAAQ,OAAR,CAAgB,iCAAhB,EAAmD,MAAnD,IACG,CADH,IAEG,CAAC,EAAE,IAAF,EAAQ,OAAR,CAAgB,iBAAhB,EAAmC,MAFxC,IAGC,EAAE,IAAF,EAAQ,OAAR,CAAgB,iBAAhB,EAAmC,MAAnC,IACG,iBACI,EAAE,IAAF,EAAQ,OAAR,CAAgB,iBAAhB,EAAmC,CAAnC,CADJ,EAEI,IAFJ,EAGE,OAHF,IAGa,MAPjB,IAQA,EAAE,4BAAF,EAAgC,MATpC,EAUE;AACE,gBACI,EAAE,MAAF,EAAU,IAAV,CAAe,eAAf,KAAmC,OAAnC,IACA,EAAE,MAAF,EAAU,IAAV,CAAe,iBAAf,KAAqC,OAFzC,EAGE;AACE,oBAAI,UAAU,EAAE,IAAF,EAAQ,IAAR,CAAa,eAAb,CAAd;AACA,oBAAI,aAAa,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,OAAzB,EAAkC;AAC/C,wBAAI;AAD2C,iBAAlC,CAAjB;AAGA,oBAAI,YAAY,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,aAAzB,EAAwC;AACpD,6BAAS;AAD2C,iBAAxC,CAAhB;AAGA,oBAAI,aACA,qFACA,OAAO,IAAP,CAAY,8BAAZ,CADA,GAEA,UAFA,GAGA,SAHA,GAIA,IAJA,GAKA,OAAO,IAAP,CAAY,QAAZ,CALA,GAMA,MAPJ;AAQA,oBAAI,UAAU,OAAO,IAAP,CACV,qCADU,EAEV,EAAE,MAAM,UAAR,EAFU,CAAd;AAIA,kBACI,+BACI,EAAE,IAAF,EAAQ,IAAR,CAAa,eAAb,CAFR,EAGE,MAHF,CAGS,OAHT;AAIH,aA3BD,MA2BO;AACH;AACA,oBAAI,OAAO,EAAE,IAAF,EAAQ,IAAR,CAAa,sBAAb,CAAX;AACA,oBAAI,OAAO,IAAP,KAAgB,WAAhB,IAA+B,SAAS,KAA5C,EAAmD;AAC/C,wBAAI,cACA,qFACA,OAAO,IAAP,CAAY,8BAAZ,CADA,GAEA,+DAFA,GAGA,OAAO,IAAP,CAAY,UAAZ,CAHA,GAIA,MALJ;AAMA,wBAAI,UAAU,OAAO,IAAP,CACV,qCADU,EAEV,EAAE,MAAM,WAAR,EAFU,CAAd;AAIA,sBACI,+BACI,EAAE,IAAF,EAAQ,IAAR,CAAa,eAAb,CAFR,EAGE,MAHF,CAGS,OAHT;AAIH,iBAfD,MAeO;AACH,2BAAO,IAAP,CAAY,iBAAZ,CACI,EAAE,IAAF,EAAQ,IAAR,CAAa,eAAb,CADJ,EAEI,EAAE,IAAF,CAFJ;AAIH;AACJ;AACJ;AACJ,KArJL;;AAuJA,WAAO,YAAP,CAAoB,EAApB,CAAuB,2BAAvB,EAAoD,YAAY;AAC5D,UAAE,yBAAF,EAA6B,IAA7B,CACI,WAAW,OAAO,IAAP,CAAY,qBAAZ,CAAX,GAAgD,SADpD;AAGH,KAJD;;AAMA;;;AAGA,MAAE,MAAF,EAAU,EAAV,CAAa,eAAb,EAA8B,wBAA9B,EAAwD,UAAU,CAAV,EAAa;AACjE,YAAI,EAAE,IAAF,IAAU,OAAV,IAAqB,EAAE,KAAF,IAAW,EAAhC,IAAsC,EAAE,KAAF,IAAW,EAArD,EAAyD;AACrD,cAAE,cAAF;;AAEA,gBAAI,iBAAiB,EAAE,EAAE,MAAJ,EAChB,OADgB,CACR,IADQ,EAEhB,IAFgB,CAEX,gCAFW,CAArB;AAGA,gBAAI,UAAU,eAAe,IAAf,CAAoB,eAApB,CAAd;;AAEA,gBAAI,kBAAkB,EAClB,qCAAqC,OADnB,EAEpB,MAFoB,GAGhB,qCAAqC,OAHrB,GAIhB,+BAA+B,OAJrC;AAKA,cAAE,kBAAkB,OAApB,EAA6B,IAA7B,CAAkC,YAAY;AAC1C,kBAAE,IAAF,EACK,WADL,CACiB,oBADjB,EAEK,IAFL,CAEU;AACF,qCAAiB,OADf;AAEF,kCAAc,EAAE,IAAF,EAAQ,IAAR,CAAa,YAAb,IACR,EAAE,IAAF,EACK,IADL,CACU,YADV,EAEK,OAFL,CAEa,OAAO,IAAP,CAAY,UAAZ,CAFb,EAEsC,EAFtC,CADQ,GAIR;AANJ,iBAFV;AAUH,aAXD;;AAaA,cACI,kBACI,mBADJ,GAEI,EAAE,IAAF,EAAQ,IAAR,CAAa,MAAb,CAFJ,GAGI,IAJR,EAMK,QANL,CAMc,oBANd,EAOK,IAPL,CAOU;AACF,iCAAiB,MADf;AAEF,8BAAc,OAAO,IAAP,CAAY,mBAAZ,EAAiC;AAC3C,0BAAM,EAAE,IAAF,EAAQ,IAAR,CAAa,MAAb;AADqC,iBAAjC;AAFZ,aAPV;;AAcA,2BACK,IADL,CACU,wBADV,EAEK,IAFL,CAEU,sBAFV,EAGK,IAHL,CAGU,EAAE,IAAF,EAAQ,IAAR,CAAa,MAAb,CAHV;;AAKA,gBAAI,qBAAqB,EAAE,2BAA2B,OAA7B,EACpB,MADoB,GAEnB,EAAE,2BAA2B,OAA7B,CAFmB,GAGnB,EAAE,qBAAqB,OAAvB,CAHN;;AAKA,+BAAmB,GAAnB,CAAuB,EAAE,IAAF,EAAQ,IAAR,CAAa,MAAb,CAAvB;;AAEA,gBAAI,CAAC,EAAE,IAAF,EAAQ,QAAR,CAAiB,SAAjB,CAAL,EAAkC;AAC9B,+BACK,IADL,CACU,wBADV,EAEK,QAFL,CAEc,SAFd;AAGH,aAJD,MAIO;AACH,+BACK,IADL,CACU,wBADV,EAEK,WAFL,CAEiB,SAFjB;AAGH;;AAED;AACA,cAAE,yBAAF,EAA6B,IAA7B;AACA,cAAE,oCAAF,EAAwC,KAAxC;AACH,SAjED,MAiEO,IAAI,EAAE,KAAF,IAAW,EAAf,EAAmB;AACtB;AACA,cAAE,cAAF;AACA,cAAE,IAAF,EAAQ,OAAR,CAAgB,IAAhB,EAAsB,IAAtB,CAA2B,IAA3B,EAAiC,QAAjC,CAA0C,GAA1C,EAA+C,KAA/C;AACH,SAJM,MAIA,IAAI,EAAE,KAAF,IAAW,EAAf,EAAmB;AACtB;AACA,cAAE,cAAF;;AAEA;AACA,gBAAI,EAAE,IAAF,EAAQ,OAAR,CAAgB,IAAhB,EAAsB,EAAtB,CAAyB,cAAzB,CAAJ,EAA8C;AAC1C,kBAAE,IAAF,EAAQ,OAAR,CAAgB,IAAhB,EAAsB,IAAtB,CAA2B,iBAA3B,EAA8C,KAA9C;AACH,aAFD,MAEO;AACH,kBAAE,IAAF,EAAQ,OAAR,CAAgB,IAAhB,EAAsB,IAAtB,CAA2B,IAA3B,EAAiC,QAAjC,CAA0C,GAA1C,EAA+C,KAA/C;AACH;AACJ;AACJ,KAjFD;;AAmFA,MAAE,0BAAF,EAA8B,EAA9B,CAAiC,SAAjC,EAA4C,UAAU,CAAV,EAAa;AACrD,YAAI,EAAE,KAAF,IAAW,EAAf,EAAmB;AACf;AACA,cAAE,cAAF;AACA,gBAAI,WAAW,EAAE,IAAF,EAAQ,IAAR,CAAa,UAAb,CAAf;AACA,cAAE,QAAQ,QAAV,EACK,QADL,CACc,IADd,EAEK,KAFL,GAGK,QAHL,CAGc,GAHd,EAIK,KAJL;AAKH;AACJ,KAXD;;AAaA;AACA,MAAE,uCAAF,EACK,EADL,CACQ,uBADR,EACiC,YAAY;AACrC,UAAE,IAAF,EAAQ,IAAR,CAAa,GAAb,EAAkB,IAAlB,CAAuB,UAAvB,EAAmC,GAAnC;AACH,KAHL,EAIK,EAJL,CAIQ,uBAJR,EAIiC,YAAY;AACrC,YAAI,UAAU,EAAE,IAAF,EAAQ,IAAR,CAAa,eAAb,CAAd;AACA,UAAE,IAAF,EAAQ,IAAR,CAAa,GAAb,EAAkB,IAAlB,CAAuB,UAAvB,EAAmC,IAAnC;AACA,UAAE,0BAA0B,OAA5B,EAAqC,OAArC,CAA6C,QAA7C;AACH,KARL;;AAUA;AACA,MAAE,6BAAF,EAAiC,EAAjC,CAAoC,QAApC,EAA8C,YAAY;AACtD,UAAE,IAAF,EAAQ,IAAR,CAAa,wBAAb,EAAuC,KAAvC;AACH,KAFD;AAGH,CAhRD;;AAkRA;;;AAGA,EAAE,YAAY;AACV;AACA,MAAE,yCAAF,EAA6C,EAA7C,CACI,OADJ,EAEI,YAFJ,EAGI,UAAU,CAAV,EAAa;AACT,YAAI,UAAU,EAAE,EAAE,MAAJ,CAAd;AACA,YAAI,aAAa,QAAQ,OAAR,CAAgB,yBAAhB,CAAjB;AACA,YAAI,SAAS,QAAQ,IAAR,CAAa,OAAb,CAAb;;AAEA,yBAAiB,UAAjB,EAA6B,MAA7B,EAAqC,KAArC;AACH,KATL;;AAYA;AACA,MAAE,MAAF,EAAU,EAAV,CAAa,oBAAb,EAAmC,UAAU,CAAV,EAAa,IAAb,EAAmB;AAClD,aAAK,IAAI,OAAT,IAAoB,KAAK,WAAzB,EAAsC;AAClC,gBAAI,aAAa,EACb,mDACI,OADJ,GAEI,IAHS,CAAjB;AAKA,gBAAI,SAAS,KAAK,WAAL,CAAiB,OAAjB,CAAb;;AAEA,8BAAkB,UAAlB,EAA8B,MAA9B,EAAsC;AAClC,2BAAW,IADuB;AAElC,yBAAS;AAFyB,aAAtC;AAIH;AACD,UAAE,IAAF,EAAQ,OAAR,CAAgB,mBAAhB,EAdkD,CAcZ;AACzC,KAfD;;AAiBA;AACA,MAAE,oDAAF,EAAwD,KAAxD,CAA8D,UAAU,CAAV,EAAa;AACvE,YAAI,QAAQ,EAAE,IAAF,CAAZ;AACA,YAAI,aAAa,MAAM,OAAN,CAAc,yBAAd,CAAjB;AACA,YAAI,aAAa,WAAW,IAAX,CAAgB,aAAhB,CAAjB;;AAEA,mBAAW,QAAX,CAAoB,aAApB;;AAEA,YAAI,qBAAqB,MAAM,IAAN,CAAW,OAAX,CAAzB;AACA,kBAAU,UAAV,EAAsB,kBAAtB,EAA0C;AACtC,uBAAW,KAD2B;AAEtC,qBAAS;AAF6B,SAA1C;AAIH,KAZD;;AAcA,MAAE,yCAAF,EAA6C,EAA7C,CAAgD,YAAhD,EAA8D,YAAY;AACtE,YAAI,QAAQ,EAAE,IAAF,CAAZ;AACA,YAAI,aAAa,MAAM,OAAN,CAAc,yBAAd,CAAjB;AACA,YAAI,aAAa,WAAW,IAAX,CAAgB,aAAhB,CAAjB;AACA,YAAI,gBAAgB,aAAa,CAAjC;;AAEA,YAAI,CAAC,aAAL,EAAoB;AAChB,uBAAW,WAAX,CAAuB,aAAvB;;AAEA,sBAAU,UAAV,EAAsB,WAAW,IAAX,CAAgB,eAAhB,CAAtB,EAAwD;AACpD,2BAAW,KADyC;AAEpD,yBAAS;AAF2C,aAAxD;AAIH,SAPD,MAOO;AACH,sBAAU,UAAV,EAAsB,UAAtB,EAAkC;AAC9B,2BAAW,KADmB;AAE9B,yBAAS;AAFqB,aAAlC;AAIH;AACJ,KAnBD;;AAqBA,WAAO,YAAP,CAAoB,EAApB,CAAuB,iBAAvB,EAA0C,YAAY;AAClD,YAAI,OACA,2BACA,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,cAAzB,CADA,GAEA,iBAFA,GAGA,OAAO,IAAP,CAAY,sBAAZ,CAHA,GAIA,MALJ;AAMA,YAAI,OAAO,OAAX,EACI,OAAO,OAAP,CAAe,IAAf,CACI,aACI,OAAO,IAAP,CAAY,cAAZ,CADJ,GAEI,YAFJ,GAGI,OAAO,IAAP,CAAY,2BAAZ,EAAyC,EAAE,MAAM,IAAR,EAAzC,CAJR,EAKI,OALJ;AAOP,KAfD;;AAiBA,WAAO,YAAP,CAAoB,EAApB,CAAuB,oBAAvB,EAA6C,YAAY;AACrD,YAAI,OACA,2BACA,OAAO,GAAP,CAAW,OAAO,MAAP,CAAc,cAAzB,CADA,GAEA,iBAFA,GAGA,OAAO,IAAP,CAAY,sBAAZ,CAHA,GAIA,MALJ;AAMA,YAAI,OAAO,OAAX,EACI,OAAO,OAAP,CAAe,IAAf,CACI,aACI,OAAO,IAAP,CAAY,cAAZ,CADJ,GAEI,YAFJ,GAGI,OAAO,IAAP,CAAY,2BAAZ,EAAyC,EAAE,MAAM,IAAR,EAAzC,CAJR,EAKI,OALJ;AAOP,KAfD;AAgBH,CArGD;;AAuGA,EAAE,QAAF,EAAY,EAAZ,CAAe,OAAf,EAAwB,mBAAxB,EAA6C,UAAU,CAAV,EAAa;AACtD,MAAE,cAAF;AACH,CAFD;;AAIA,EAAE,QAAF,EAAY,KAAZ,CAAkB,YAAY;AAC1B,MAAE,QAAF,EAAY,EAAZ,CACI,OADJ,EAEI,uEAFJ,EAGI,YAAY;AACR,YAAI,sBAAsB,OAAO,QAAP,CAAgB,MAAhB,CAAuB,OAAvB,CACtB,wCADsB,EAEtB,UAAU,KAAV,EAAiB;AACb,gBAAI,WAAW,MAAM,MAAM,MAAN,GAAe,CAArB,CAAf;AACA,gBAAI,aAAa,GAAjB,EAAsB;AAClB;AACA,uBAAO,MAAM,CAAN,CAAP;AACH,aAHD,MAGO;AACH;AACA,uBAAO,EAAP;AACH;AACJ,SAXqB,CAA1B;;AAcA,YAAI,aACA,OAAO,QAAP,CAAgB,QAAhB,GACA,OAAO,QAAP,CAAgB,MAAhB,CAAuB,OAAvB,CACI,qCADJ,EAEI,EAFJ,CAFJ;AAMA,YAAI,SAAS,EAAb;AACA,YAAI,EAAE,IAAF,EAAQ,QAAR,CAAiB,WAAjB,CAAJ,EAAmC;AAC/B,qBACI,UACA,EAAE,IAAF,EAAQ,MAAR,GAAiB,IAAjB,CAAsB,eAAtB,CADA,GAEA,GAFA,GAGA,EAAE,IAAF,EAAQ,IAAR,CAAa,OAAb,CAJJ,CAD+B,CAKJ;AAC9B,SAND,MAMO;AACH,qBACI,EAAE,IAAF,EAAQ,IAAR,CAAa,aAAb,IACA,GADA,GAEA,EAAE,IAAF,EAAQ,IAAR,CAAa,eAAb,CAHJ;AAIH;AACD,YAAI,sBAAsB,OAAO,GAAP,CACtB,OAAO,MAAP,CAAc,oBADQ,EAEtB,EAAE,SAAS,UAAX,EAAuB,QAAQ,MAA/B,EAFsB,CAA1B;AAIA,UAAE,kBAAF,EAAsB,IAAtB,CAA2B,MAA3B,EAAmC,mBAAnC;AACA,UAAE,kBAAF,EAAsB,UAAtB,CAAiC,QAAjC,EAA2C,MAA3C;AACH,KA3CL;;AA8CA;AACA,MAAE,kBAAF,EAAsB,EAAtB,CAAyB,oBAAzB,EAA+C,YAAY;AACvD,YAAI,YAAY,EAAE,yBAAF,CAAhB;AACA,kBAAU,IAAV,CAAe,aAAf,EAA8B,IAA9B,EAAoC,WAApC,CAAgD,aAAhD;AACA,kBAAU,SAAV,EAAqB,KAAK,KAAL,CAAW,UAAU,IAAV,CAAe,eAAf,CAAX,CAArB;AACH,KAJD;AAKH,CArDD;;AAuDA;AACA,EAAE,QAAF,EAAY,EAAZ,CAAe,OAAf,EAAwB,uBAAxB,EAAiD,YAAY;AACzD,MAAE,IAAF,EAAQ,IAAR,CAAa,GAAb,EAAkB,KAAlB;AACH,CAFD;;AAIA,OAAO,0BAAP,GAAoC,UAAU,KAAV,EAAiB;AACjD,YAAQ,SAAS,EAAjB;AACA,MAAE,qBAAF,EAAyB,IAAzB,CAA8B,YAAY;AACtC,YAAI,EAAE,IAAF,EAAQ,IAAR,CAAa,uBAAb,KAAyC,EAA7C,EAAiD;AAC7C,cAAE,IAAF,EAAQ,IAAR,CACI,SADJ,EAEI,4BACI,EAAE,IAAF,EAAQ,IAAR,CAAa,iBAAb,CADJ,GAEI,IAFJ,GAGI,EAAE,IAAF,EAAQ,IAAR,CAAa,kBAAb,CAHJ,GAII,IAJJ,GAKI,EAAE,IAAF,EAAQ,IAAR,CAAa,iBAAb,CALJ,GAMI,IANJ,GAOI,EAAE,IAAF,EAAQ,IAAR,CAAa,uBAAb,CAPJ,GAQI,IAVR;AAYH;;AAED,YACI,EAAE,IAAF,EAAQ,IAAR,CAAa,kBAAb,KAAoC,EAApC,IACA,EAAE,IAAF,EAAQ,IAAR,CAAa,kBAAb,KAAoC,CAFxC,EAGE;AACE,cAAE,kBAAF,EAAsB,QAAtB,CAA+B,QAA/B;AACA,cAAE,mBAAF,EAAuB,IAAvB,CACI,iBADJ,EAEI,0BAFJ;AAIH;AACJ,KA1BD;;AA4BA,MAAE,6BAAF,EAAiC,IAAjC,CACI,SADJ,EAEI,4BACI,MAAM,UADV,GAEI,IAFJ,GAGI,MAAM,WAHV,GAII,IAJJ,GAKI,MAAM,UALV,GAMI,IANJ,GAOI,MAAM,gBAPV,GAQI,IAVR;AAYH,CA1CD;;;;;AClnEA;;AAEA,IAAI,UAAU,OAAO,IAArB,EAA2B;AACvB,KAAC,UAAU,CAAV,EAAa;AACV;;AACA,UAAE,YAAY;AACV,cAAE,eAAF,EACK,KADL,CACW,YAAY;AACf,oBAAI,QAAQ,EAAE,IAAF,CAAZ;AACA,oBAAI,MAAM,GAAN,OAAgB,MAAM,IAAN,CAAW,aAAX,CAApB,EAA+C;AAC3C,0BAAM,GAAN,CAAU,EAAV,EAAc,WAAd,CAA0B,aAA1B;AACH;AACJ,aANL,EAOK,IAPL,CAOU,YAAY;AACd,oBAAI,QAAQ,EAAE,IAAF,CAAZ;AACA,oBACI,MAAM,GAAN,OAAgB,EAAhB,IACA,MAAM,GAAN,OAAgB,MAAM,IAAN,CAAW,aAAX,CAFpB,EAGE;AACE,0BACK,QADL,CACc,aADd,EAEK,GAFL,CAES,MAAM,IAAN,CAAW,aAAX,CAFT;AAGH;AACJ,aAjBL,EAkBK,IAlBL,GAmBK,OAnBL,CAmBa,MAnBb,EAoBK,MApBL,CAoBY,YAAY;AAChB,kBAAE,IAAF,EACK,IADL,CACU,eADV,EAEK,IAFL,CAEU,YAAY;AACd,wBAAI,QAAQ,EAAE,IAAF,CAAZ;AACA,wBAAI,MAAM,GAAN,OAAgB,MAAM,IAAN,CAAW,aAAX,CAApB,EAA+C;AAC3C,8BAAM,GAAN,CAAU,EAAV;AACH;AACJ,iBAPL;AAQH,aA7BL;AA8BH,SA/BD;AAgCH,KAlCD,EAkCG,MAlCH;AAmCH;;;;;eCtCkB,QAAQ,UAAR,C;IAAX,M,YAAA,M;;AAER,OAAO,OAAP,GAAiB;AACb,YAAQ,OAAO,MAAP,CAAc,MAAd;AADK,CAAjB;;;ACFA;;AACA,OAAO,cAAP,CAAsB,OAAtB,EAA+B,YAA/B,EAA6C,EAAE,OAAO,IAAT,EAA7C;AACA,QAAQ,MAAR,GAAiB,KAAK,CAAtB;AACA,QAAQ,MAAR,GAAiB;AACb,UAAM,GADO;AAEb,YAAQ,SAFK;AAGb,YAAQ,SAHK;AAIb,kBAAc,eAJD;AAKb,oBAAgB,kBALH;AAMb,oBAAgB,2BANH;AAOb,wBAAoB,+BAPP;AAQb,aAAS,YARI;AASb,iBAAa,iBATA;AAUb,oBAAgB,oBAVH;AAWb,gCAA4B,uCAXf;AAYb,eAAW,aAZE;AAab,yBAAqB,yBAbR;AAcb,mBAAe,kCAdF;AAeb,iBAAa,wBAfA;AAgBb,uBAAmB,mCAhBN;AAiBb,iBAAa,wBAjBA;AAkBb,4BAAwB,oCAlBX;AAmBb,qBAAiB,8BAnBJ;AAoBb,mBAAe,sBApBF;AAqBb,oBAAgB,aArBH;AAsBb,mBAAe,4BAtBF;AAuBb,sBAAkB,+BAvBL;AAwBb,+BAA2B,sCAxBd;AAyBb,qBAAiB,8BAzBJ;AA0Bb,qBAAiB,mBA1BJ;AA2Bb,qBAAiB,yBA3BJ;AA4Bb,2BAAuB,qDA5BV;AA6Bb,2BAAuB,yCA7BV;AA8Bb,wBAAoB,sCA9BP;AA+Bb,oBAAgB,kBA/BH;AAgCb,iBAAa,eAhCA;AAiCb,kBAAc,gBAjCD;AAkCb,wBAAoB,uBAlCP;AAmCb,kBAAc,gBAnCD;AAoCb,qBAAiB,mBApCJ;AAqCb,qBAAiB,6BArCJ;AAsCb,oBAAgB,kBAtCH;AAuCb,0BAAsB,6BAvCT;AAwCb,mBAAe,kBAxCF;AAyCb,2BAAuB,2BAzCV;AA0Cb,oBAAgB,mBA1CH;AA2Cb,qBAAiB,2BA3CJ;AA4Cb,WAAO;AACH,gBAAQ,wBADL;AAEH,sBAAc,sBAFX;AAGH,gCAAwB,4BAHrB;AAIH,kBAAU;AAJP,KA5CM;AAkDb,8BAA0B,6BAlDb;AAmDb,oCAAgC,qCAnDnB;AAoDb,iBAAa,eApDA;AAqDb,yBAAqB,uCArDR;AAsDb,YAAQ,SAtDK;AAuDb,aAAS,WAvDI;AAwDb,qBAAiB,uBAxDJ;AAyDb,gBAAY,qBAzDC;AA0Db,mBAAe,2BA1DF;AA2Db,wBAAoB,uBA3DP;AA4Db,iBAAa,WA5DA;AA6Db,iBAAa,cA7DA;AA8Db,qBAAiB,mBA9DJ;AA+Db,aAAS,yBA/DI;AAgEb,qBAAiB,kCAhEJ;AAiEb,oBAAgB,kBAjEH;AAkEb,UAAM;AACF,iBAAS;AACL,iBAAK,gBADA;AAEL,oBAAQ,sBAFH;AAGL,uBAAW;AAHN,SADP;AAMF,qBAAa;AACT,qBAAS;AADA,SANX;AASF,eAAO;AACH,mBAAO,aADJ;AAEH,qBAAS,+BAFN;AAGH,+BAAmB,mCAHhB;AAIH,8BAAkB,wCAJf;AAKH,0BAAc;AALX,SATL;AAgBF,kBAAU;AACN,gCAAoB,yBADd;AAEN,iCAAqB;AAFf,SAhBR;AAoBF,gBAAQ;AACJ,gCAAoB;AADhB,SApBN;AAuBF,wBAAgB;AACZ,mBAAO,sBADK;AAEZ,mBAAO,gCAFK;AAGZ,sBAAU,+BAHE;AAIZ,sBAAQ;AAJI,SAvBd;AA6BF,eAAO;AACH,iBAAK;AADF,SA7BL;AAgCF,mBAAW;AACP,iBAAK,6BADE;AAEP,iCAAqB;AAFd,SAhCT;AAoCF,qBAAa;AACT,oBAAQ;AACJ,uBAAO;AADH;AADC,SApCX;AAyCF,aAAK;AACD,mBAAO;AACH,0BAAU,2BADP;AAEH,wBAAQ,yBAFL;AAGH,4BAAY;AAHT,aADN;AAMD,iBAAK;AACD,2BAAW;AADV,aANJ;AASD,mBAAO;AACH,0BAAU,2BADP;AAEH,4BAAY;AAFT,aATN;AAaD,oBAAQ;AAbP,SAzCH;AAwDF,6BAAqB;AACjB,iBAAK,sBADY;AAEjB,qBAAS,yBAFQ;AAGjB,6BAAiB;AAHA;AAxDnB,KAlEO;AAgIb,YAAQ;AACJ,aAAK;AACD,6BAAiB;AADhB;AADD,KAhIK;AAqIb,sBAAkB,mBArIL;AAsIb,oBAAgB,aAtIH;AAuIb,gBAAY,SAvIC;AAwIb,iBAAa,cAxIA;AAyIb,oBAAgB,aAzIH;AA0Ib,aAAS,MA1II;AA2Ib,0BAAsB;AAClB,eAAO,yBADW;AAElB,aAAK,uBAFa;AAGlB,yBAAiB,4BAHC;AAIlB,6BAAqB,iDAJH;AAKlB,kBAAU;AALQ,KA3IT;AAkJb,SAAK;AACD,iBAAS,cADR;AAED,mBAAW;AACP,uBAAW;AADJ,SAFV;AAKD,gBAAQ;AACJ,uBAAW,+DADP;AAEJ,sBAAU;AAFN;AALP,KAlJQ;AA4Jb,YAAQ;AACJ,wBAAgB,yBADZ;AAEJ,eAAO;AAFH,KA5JK;AAgKb,SAAK;AACD,gBAAQ,eADP;AAED,aAAK,aAFJ;AAGD,eAAO,SAHN;AAID,aAAK;AACD,sBAAU,6BADT;AAED,uBAAW,uBAFV;AAGD,kBAAM,kBAHL;AAID,0BAAc,2BAJb;AAKD,2BAAe;AALd,SAJJ;AAWD,gBAAQ;AAXP;AAhKQ,CAAjB;;AA+KA;;AAEA","file":"app.bundle.min.js","sourcesContent":["(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c=\"function\"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error(\"Cannot find module '\"+i+\"'\");throw a.code=\"MODULE_NOT_FOUND\",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u=\"function\"==typeof require&&require,i=0;i \n * @license MIT\n */\nfunction compare(a, b) {\n if (a === b) {\n return 0;\n }\n\n var x = a.length;\n var y = b.length;\n\n for (var i = 0, len = Math.min(x, y); i < len; ++i) {\n if (a[i] !== b[i]) {\n x = a[i];\n y = b[i];\n break;\n }\n }\n\n if (x < y) {\n return -1;\n }\n if (y < x) {\n return 1;\n }\n return 0;\n}\nfunction isBuffer(b) {\n if (global.Buffer && typeof global.Buffer.isBuffer === 'function') {\n return global.Buffer.isBuffer(b);\n }\n return !!(b != null && b._isBuffer);\n}\n\n// based on node assert, original notice:\n// NB: The URL to the CommonJS spec is kept just for tradition.\n// node-assert has evolved a lot since then, both in API and behavior.\n\n// http://wiki.commonjs.org/wiki/Unit_Testing/1.0\n//\n// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!\n//\n// Originally from narwhal.js (http://narwhaljs.org)\n// Copyright (c) 2009 Thomas Robinson <280north.com>\n//\n// Permission is hereby granted, free of charge, to any person obtaining a copy\n// of this software and associated documentation files (the 'Software'), to\n// deal in the Software without restriction, including without limitation the\n// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n// sell copies of the Software, and to permit persons to whom the Software is\n// furnished to do so, subject to the following conditions:\n//\n// The above copyright notice and this permission notice shall be included in\n// all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN\n// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION\n// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar util = require('util/');\nvar hasOwn = Object.prototype.hasOwnProperty;\nvar pSlice = Array.prototype.slice;\nvar functionsHaveNames = (function () {\n return function foo() {}.name === 'foo';\n}());\nfunction pToString (obj) {\n return Object.prototype.toString.call(obj);\n}\nfunction isView(arrbuf) {\n if (isBuffer(arrbuf)) {\n return false;\n }\n if (typeof global.ArrayBuffer !== 'function') {\n return false;\n }\n if (typeof ArrayBuffer.isView === 'function') {\n return ArrayBuffer.isView(arrbuf);\n }\n if (!arrbuf) {\n return false;\n }\n if (arrbuf instanceof DataView) {\n return true;\n }\n if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) {\n return true;\n }\n return false;\n}\n// 1. The assert module provides functions that throw\n// AssertionError's when particular conditions are not met. The\n// assert module must conform to the following interface.\n\nvar assert = module.exports = ok;\n\n// 2. The AssertionError is defined in assert.\n// new assert.AssertionError({ message: message,\n// actual: actual,\n// expected: expected })\n\nvar regex = /\\s*function\\s+([^\\(\\s]*)\\s*/;\n// based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js\nfunction getName(func) {\n if (!util.isFunction(func)) {\n return;\n }\n if (functionsHaveNames) {\n return func.name;\n }\n var str = func.toString();\n var match = str.match(regex);\n return match && match[1];\n}\nassert.AssertionError = function AssertionError(options) {\n this.name = 'AssertionError';\n this.actual = options.actual;\n this.expected = options.expected;\n this.operator = options.operator;\n if (options.message) {\n this.message = options.message;\n this.generatedMessage = false;\n } else {\n this.message = getMessage(this);\n this.generatedMessage = true;\n }\n var stackStartFunction = options.stackStartFunction || fail;\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, stackStartFunction);\n } else {\n // non v8 browsers so we can have a stacktrace\n var err = new Error();\n if (err.stack) {\n var out = err.stack;\n\n // try to strip useless frames\n var fn_name = getName(stackStartFunction);\n var idx = out.indexOf('\\n' + fn_name);\n if (idx >= 0) {\n // once we have located the function frame\n // we need to strip out everything before it (and its line)\n var next_line = out.indexOf('\\n', idx + 1);\n out = out.substring(next_line + 1);\n }\n\n this.stack = out;\n }\n }\n};\n\n// assert.AssertionError instanceof Error\nutil.inherits(assert.AssertionError, Error);\n\nfunction truncate(s, n) {\n if (typeof s === 'string') {\n return s.length < n ? s : s.slice(0, n);\n } else {\n return s;\n }\n}\nfunction inspect(something) {\n if (functionsHaveNames || !util.isFunction(something)) {\n return util.inspect(something);\n }\n var rawname = getName(something);\n var name = rawname ? ': ' + rawname : '';\n return '[Function' + name + ']';\n}\nfunction getMessage(self) {\n return truncate(inspect(self.actual), 128) + ' ' +\n self.operator + ' ' +\n truncate(inspect(self.expected), 128);\n}\n\n// At present only the three keys mentioned above are used and\n// understood by the spec. Implementations or sub modules can pass\n// other keys to the AssertionError's constructor - they will be\n// ignored.\n\n// 3. All of the following functions must throw an AssertionError\n// when a corresponding condition is not met, with a message that\n// may be undefined if not provided. All assertion methods provide\n// both the actual and expected values to the assertion error for\n// display purposes.\n\nfunction fail(actual, expected, message, operator, stackStartFunction) {\n throw new assert.AssertionError({\n message: message,\n actual: actual,\n expected: expected,\n operator: operator,\n stackStartFunction: stackStartFunction\n });\n}\n\n// EXTENSION! allows for well behaved errors defined elsewhere.\nassert.fail = fail;\n\n// 4. Pure assertion tests whether a value is truthy, as determined\n// by !!guard.\n// assert.ok(guard, message_opt);\n// This statement is equivalent to assert.equal(true, !!guard,\n// message_opt);. To test strictly for the value true, use\n// assert.strictEqual(true, guard, message_opt);.\n\nfunction ok(value, message) {\n if (!value) fail(value, true, message, '==', assert.ok);\n}\nassert.ok = ok;\n\n// 5. The equality assertion tests shallow, coercive equality with\n// ==.\n// assert.equal(actual, expected, message_opt);\n\nassert.equal = function equal(actual, expected, message) {\n if (actual != expected) fail(actual, expected, message, '==', assert.equal);\n};\n\n// 6. The non-equality assertion tests for whether two objects are not equal\n// with != assert.notEqual(actual, expected, message_opt);\n\nassert.notEqual = function notEqual(actual, expected, message) {\n if (actual == expected) {\n fail(actual, expected, message, '!=', assert.notEqual);\n }\n};\n\n// 7. The equivalence assertion tests a deep equality relation.\n// assert.deepEqual(actual, expected, message_opt);\n\nassert.deepEqual = function deepEqual(actual, expected, message) {\n if (!_deepEqual(actual, expected, false)) {\n fail(actual, expected, message, 'deepEqual', assert.deepEqual);\n }\n};\n\nassert.deepStrictEqual = function deepStrictEqual(actual, expected, message) {\n if (!_deepEqual(actual, expected, true)) {\n fail(actual, expected, message, 'deepStrictEqual', assert.deepStrictEqual);\n }\n};\n\nfunction _deepEqual(actual, expected, strict, memos) {\n // 7.1. All identical values are equivalent, as determined by ===.\n if (actual === expected) {\n return true;\n } else if (isBuffer(actual) && isBuffer(expected)) {\n return compare(actual, expected) === 0;\n\n // 7.2. If the expected value is a Date object, the actual value is\n // equivalent if it is also a Date object that refers to the same time.\n } else if (util.isDate(actual) && util.isDate(expected)) {\n return actual.getTime() === expected.getTime();\n\n // 7.3 If the expected value is a RegExp object, the actual value is\n // equivalent if it is also a RegExp object with the same source and\n // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).\n } else if (util.isRegExp(actual) && util.isRegExp(expected)) {\n return actual.source === expected.source &&\n actual.global === expected.global &&\n actual.multiline === expected.multiline &&\n actual.lastIndex === expected.lastIndex &&\n actual.ignoreCase === expected.ignoreCase;\n\n // 7.4. Other pairs that do not both pass typeof value == 'object',\n // equivalence is determined by ==.\n } else if ((actual === null || typeof actual !== 'object') &&\n (expected === null || typeof expected !== 'object')) {\n return strict ? actual === expected : actual == expected;\n\n // If both values are instances of typed arrays, wrap their underlying\n // ArrayBuffers in a Buffer each to increase performance\n // This optimization requires the arrays to have the same type as checked by\n // Object.prototype.toString (aka pToString). Never perform binary\n // comparisons for Float*Arrays, though, since e.g. +0 === -0 but their\n // bit patterns are not identical.\n } else if (isView(actual) && isView(expected) &&\n pToString(actual) === pToString(expected) &&\n !(actual instanceof Float32Array ||\n actual instanceof Float64Array)) {\n return compare(new Uint8Array(actual.buffer),\n new Uint8Array(expected.buffer)) === 0;\n\n // 7.5 For all other Object pairs, including Array objects, equivalence is\n // determined by having the same number of owned properties (as verified\n // with Object.prototype.hasOwnProperty.call), the same set of keys\n // (although not necessarily the same order), equivalent values for every\n // corresponding key, and an identical 'prototype' property. Note: this\n // accounts for both named and indexed properties on Arrays.\n } else if (isBuffer(actual) !== isBuffer(expected)) {\n return false;\n } else {\n memos = memos || {actual: [], expected: []};\n\n var actualIndex = memos.actual.indexOf(actual);\n if (actualIndex !== -1) {\n if (actualIndex === memos.expected.indexOf(expected)) {\n return true;\n }\n }\n\n memos.actual.push(actual);\n memos.expected.push(expected);\n\n return objEquiv(actual, expected, strict, memos);\n }\n}\n\nfunction isArguments(object) {\n return Object.prototype.toString.call(object) == '[object Arguments]';\n}\n\nfunction objEquiv(a, b, strict, actualVisitedObjects) {\n if (a === null || a === undefined || b === null || b === undefined)\n return false;\n // if one is a primitive, the other must be same\n if (util.isPrimitive(a) || util.isPrimitive(b))\n return a === b;\n if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b))\n return false;\n var aIsArgs = isArguments(a);\n var bIsArgs = isArguments(b);\n if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))\n return false;\n if (aIsArgs) {\n a = pSlice.call(a);\n b = pSlice.call(b);\n return _deepEqual(a, b, strict);\n }\n var ka = objectKeys(a);\n var kb = objectKeys(b);\n var key, i;\n // having the same number of owned properties (keys incorporates\n // hasOwnProperty)\n if (ka.length !== kb.length)\n return false;\n //the same set of keys (although not necessarily the same order),\n ka.sort();\n kb.sort();\n //~~~cheap key test\n for (i = ka.length - 1; i >= 0; i--) {\n if (ka[i] !== kb[i])\n return false;\n }\n //equivalent values for every corresponding key, and\n //~~~possibly expensive deep test\n for (i = ka.length - 1; i >= 0; i--) {\n key = ka[i];\n if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects))\n return false;\n }\n return true;\n}\n\n// 8. The non-equivalence assertion tests for any deep inequality.\n// assert.notDeepEqual(actual, expected, message_opt);\n\nassert.notDeepEqual = function notDeepEqual(actual, expected, message) {\n if (_deepEqual(actual, expected, false)) {\n fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);\n }\n};\n\nassert.notDeepStrictEqual = notDeepStrictEqual;\nfunction notDeepStrictEqual(actual, expected, message) {\n if (_deepEqual(actual, expected, true)) {\n fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual);\n }\n}\n\n\n// 9. The strict equality assertion tests strict equality, as determined by ===.\n// assert.strictEqual(actual, expected, message_opt);\n\nassert.strictEqual = function strictEqual(actual, expected, message) {\n if (actual !== expected) {\n fail(actual, expected, message, '===', assert.strictEqual);\n }\n};\n\n// 10. The strict non-equality assertion tests for strict inequality, as\n// determined by !==. assert.notStrictEqual(actual, expected, message_opt);\n\nassert.notStrictEqual = function notStrictEqual(actual, expected, message) {\n if (actual === expected) {\n fail(actual, expected, message, '!==', assert.notStrictEqual);\n }\n};\n\nfunction expectedException(actual, expected) {\n if (!actual || !expected) {\n return false;\n }\n\n if (Object.prototype.toString.call(expected) == '[object RegExp]') {\n return expected.test(actual);\n }\n\n try {\n if (actual instanceof expected) {\n return true;\n }\n } catch (e) {\n // Ignore. The instanceof check doesn't work for arrow functions.\n }\n\n if (Error.isPrototypeOf(expected)) {\n return false;\n }\n\n return expected.call({}, actual) === true;\n}\n\nfunction _tryBlock(block) {\n var error;\n try {\n block();\n } catch (e) {\n error = e;\n }\n return error;\n}\n\nfunction _throws(shouldThrow, block, expected, message) {\n var actual;\n\n if (typeof block !== 'function') {\n throw new TypeError('\"block\" argument must be a function');\n }\n\n if (typeof expected === 'string') {\n message = expected;\n expected = null;\n }\n\n actual = _tryBlock(block);\n\n message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +\n (message ? ' ' + message : '.');\n\n if (shouldThrow && !actual) {\n fail(actual, expected, 'Missing expected exception' + message);\n }\n\n var userProvidedMessage = typeof message === 'string';\n var isUnwantedException = !shouldThrow && util.isError(actual);\n var isUnexpectedException = !shouldThrow && actual && !expected;\n\n if ((isUnwantedException &&\n userProvidedMessage &&\n expectedException(actual, expected)) ||\n isUnexpectedException) {\n fail(actual, expected, 'Got unwanted exception' + message);\n }\n\n if ((shouldThrow && actual && expected &&\n !expectedException(actual, expected)) || (!shouldThrow && actual)) {\n throw actual;\n }\n}\n\n// 11. Expected to throw an error:\n// assert.throws(block, Error_opt, message_opt);\n\nassert.throws = function(block, /*optional*/error, /*optional*/message) {\n _throws(true, block, error, message);\n};\n\n// EXTENSION! This is annoying to write outside this module.\nassert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) {\n _throws(false, block, error, message);\n};\n\nassert.ifError = function(err) { if (err) throw err; };\n\n// Expose a strict only variant of assert\nfunction strict(value, message) {\n if (!value) fail(value, true, message, '==', strict);\n}\nassert.strict = objectAssign(strict, assert, {\n equal: assert.strictEqual,\n deepEqual: assert.deepStrictEqual,\n notEqual: assert.notStrictEqual,\n notDeepEqual: assert.notDeepStrictEqual\n});\nassert.strict.strict = assert.strict;\n\nvar objectKeys = Object.keys || function (obj) {\n var keys = [];\n for (var key in obj) {\n if (hasOwn.call(obj, key)) keys.push(key);\n }\n return keys;\n};\n","\"use strict\";\n\nrequire(\"core-js/shim\");\n\nrequire(\"regenerator-runtime/runtime\");\n\nrequire(\"core-js/fn/regexp/escape\");\n\nif (global._babelPolyfill) {\n throw new Error(\"only one instance of babel-polyfill is allowed\");\n}\nglobal._babelPolyfill = true;\n\nvar DEFINE_PROPERTY = \"defineProperty\";\nfunction define(O, key, value) {\n O[key] || Object[DEFINE_PROPERTY](O, key, {\n writable: true,\n configurable: true,\n value: value\n });\n}\n\ndefine(String.prototype, \"padLeft\", \"\".padStart);\ndefine(String.prototype, \"padRight\", \"\".padEnd);\n\n\"pop,reverse,shift,keys,values,entries,indexOf,every,some,forEach,map,filter,find,findIndex,includes,join,slice,concat,push,splice,unshift,sort,lastIndexOf,reduce,reduceRight,copyWithin,fill\".split(\",\").forEach(function (key) {\n [][key] && define(Array, key, Function.call.bind([][key]));\n});","/*!\n * https://github.com/es-shims/es5-shim\n * @license es5-shim Copyright 2009-2020 by contributors, MIT License\n * see https://github.com/es-shims/es5-shim/blob/master/LICENSE\n */\n\n// vim: ts=4 sts=4 sw=4 expandtab\n\n// Add semicolon to prevent IIFE from being passed as argument to concatenated code.\n; // eslint-disable-line no-extra-semi\n\n// UMD (Universal Module Definition)\n// see https://github.com/umdjs/umd/blob/master/templates/returnExports.js\n(function (root, factory) {\n 'use strict';\n\n /* global define */\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(factory);\n } else if (typeof exports === 'object') {\n // Node. Does not work with strict CommonJS, but\n // only CommonJS-like enviroments that support module.exports,\n // like Node.\n module.exports = factory();\n } else {\n // Browser globals (root is window)\n root.returnExports = factory(); // eslint-disable-line no-param-reassign\n }\n}(this, function () {\n /**\n * Brings an environment as close to ECMAScript 5 compliance\n * as is possible with the facilities of erstwhile engines.\n *\n * Annotated ES5: https://es5.github.io/ (specific links below)\n * ES5 Spec: https://www.ecma-international.org/wp-content/uploads/ECMA-262_5.1_edition_june_2011.pdf\n * Required reading: https://javascriptweblog.wordpress.com/2011/12/05/extending-javascript-natives/\n */\n\n // Shortcut to an often accessed properties, in order to avoid multiple\n // dereference that costs universally. This also holds a reference to known-good\n // functions.\n var $Array = Array;\n var ArrayPrototype = $Array.prototype;\n var $Object = Object;\n var ObjectPrototype = $Object.prototype;\n var $Function = Function;\n var FunctionPrototype = $Function.prototype;\n var $String = String;\n var StringPrototype = $String.prototype;\n var $Number = Number;\n var NumberPrototype = $Number.prototype;\n var array_slice = ArrayPrototype.slice;\n var array_splice = ArrayPrototype.splice;\n var array_push = ArrayPrototype.push;\n var array_unshift = ArrayPrototype.unshift;\n var array_concat = ArrayPrototype.concat;\n var array_join = ArrayPrototype.join;\n var call = FunctionPrototype.call;\n var apply = FunctionPrototype.apply;\n var max = Math.max;\n var min = Math.min;\n var floor = Math.floor;\n var abs = Math.abs;\n var pow = Math.pow;\n var round = Math.round;\n var log = Math.log;\n var LOG10E = Math.LOG10E;\n var log10 = Math.log10 || function log10(value) {\n return log(value) * LOG10E;\n };\n\n // Having a toString local variable name breaks in Opera so use to_string.\n var to_string = ObjectPrototype.toString;\n\n /* eslint-disable one-var-declaration-per-line, no-redeclare, max-statements-per-line */\n var hasToStringTag = typeof Symbol === 'function' && typeof Symbol.toStringTag === 'symbol';\n var isCallable; /* inlined from https://npmjs.com/is-callable */ var fnToStr = Function.prototype.toString, constructorRegex = /^\\s*class /, isES6ClassFn = function isES6ClassFn(value) { try { var fnStr = fnToStr.call(value); var singleStripped = fnStr.replace(/\\/\\/.*\\n/g, ''); var multiStripped = singleStripped.replace(/\\/\\*[.\\s\\S]*\\*\\//g, ''); var spaceStripped = multiStripped.replace(/\\n/mg, ' ').replace(/ {2}/g, ' '); return constructorRegex.test(spaceStripped); } catch (e) { return false; /* not a function */ } }, tryFunctionObject = function tryFunctionObject(value) { try { if (isES6ClassFn(value)) { return false; } fnToStr.call(value); return true; } catch (e) { return false; } }, fnClass = '[object Function]', genClass = '[object GeneratorFunction]', isCallable = function isCallable(value) { if (!value) { return false; } if (typeof value !== 'function' && typeof value !== 'object') { return false; } if (hasToStringTag) { return tryFunctionObject(value); } if (isES6ClassFn(value)) { return false; } var strClass = to_string.call(value); return strClass === fnClass || strClass === genClass; };\n\n var isRegex; /* inlined from https://npmjs.com/is-regex */ var regexExec = RegExp.prototype.exec, tryRegexExec = function tryRegexExec(value) { try { regexExec.call(value); return true; } catch (e) { return false; } }, regexClass = '[object RegExp]'; isRegex = function isRegex(value) { if (typeof value !== 'object') { return false; } return hasToStringTag ? tryRegexExec(value) : to_string.call(value) === regexClass; };\n var isString; /* inlined from https://npmjs.com/is-string */ var strValue = String.prototype.valueOf, tryStringObject = function tryStringObject(value) { try { strValue.call(value); return true; } catch (e) { return false; } }, stringClass = '[object String]'; isString = function isString(value) { if (typeof value === 'string') { return true; } if (typeof value !== 'object') { return false; } return hasToStringTag ? tryStringObject(value) : to_string.call(value) === stringClass; };\n /* eslint-enable one-var-declaration-per-line, no-redeclare, max-statements-per-line */\n\n /* inlined from https://npmjs.com/define-properties */\n var supportsDescriptors = $Object.defineProperty && (function () {\n try {\n var obj = {};\n $Object.defineProperty(obj, 'x', { enumerable: false, value: obj });\n // eslint-disable-next-line no-unreachable-loop, max-statements-per-line\n for (var _ in obj) { return false; } // jscs:ignore disallowUnusedVariables\n return obj.x === obj;\n } catch (e) { /* this is ES3 */\n return false;\n }\n }());\n var defineProperties = (function (has) {\n // Define configurable, writable, and non-enumerable props\n // if they don't exist.\n var defineProperty;\n if (supportsDescriptors) {\n defineProperty = function (object, name, method, forceAssign) {\n if (!forceAssign && (name in object)) {\n return;\n }\n $Object.defineProperty(object, name, {\n configurable: true,\n enumerable: false,\n writable: true,\n value: method\n });\n };\n } else {\n defineProperty = function (object, name, method, forceAssign) {\n if (!forceAssign && (name in object)) {\n return;\n }\n object[name] = method; // eslint-disable-line no-param-reassign\n };\n }\n return function defineProperties(object, map, forceAssign) {\n for (var name in map) {\n if (has.call(map, name)) {\n defineProperty(object, name, map[name], forceAssign);\n }\n }\n };\n }(ObjectPrototype.hasOwnProperty));\n\n // this is needed in Chrome 15 (probably earlier) - 36\n // https://bugs.chromium.org/p/v8/issues/detail?id=3334\n if ($Object.defineProperty && supportsDescriptors) {\n var F = function () {};\n var toStringSentinel = {};\n var sentinel = { toString: toStringSentinel };\n $Object.defineProperty(F, 'prototype', { value: sentinel, writable: false });\n if ((new F()).toString !== toStringSentinel) {\n var $dP = $Object.defineProperty;\n var $gOPD = $Object.getOwnPropertyDescriptor;\n defineProperties($Object, {\n defineProperty: function defineProperty(o, k, d) {\n var key = $String(k);\n if (typeof o === 'function' && key === 'prototype') {\n var desc = $gOPD(o, key);\n if (desc.writable && !d.writable && 'value' in d) {\n try {\n o[key] = d.value; // eslint-disable-line no-param-reassign\n } catch (e) { /**/ }\n }\n return $dP(o, key, {\n configurable: 'configurable' in d ? d.configurable : desc.configurable,\n enumerable: 'enumerable' in d ? d.enumerable : desc.enumerable,\n writable: d.writable\n });\n }\n return $dP(o, key, d);\n }\n }, true);\n }\n }\n\n //\n // Util\n // ======\n //\n\n /* replaceable with https://npmjs.com/package/es-abstract /helpers/isPrimitive */\n var isPrimitive = function isPrimitive(input) {\n var type = typeof input;\n return input === null || (type !== 'object' && type !== 'function');\n };\n\n var isActualNaN = $Number.isNaN || function isActualNaN(x) {\n return x !== x;\n };\n\n var ES = {\n // ES5 9.4\n // https://es5.github.io/#x9.4\n // http://jsperf.com/to-integer\n /* replaceable with https://npmjs.com/package/es-abstract ES5.ToInteger */\n ToInteger: function ToInteger(num) {\n var n = +num;\n if (isActualNaN(n)) {\n n = 0;\n } else if (n !== 0 && n !== (1 / 0) && n !== -(1 / 0)) {\n n = (n > 0 || -1) * floor(abs(n));\n }\n return n;\n },\n\n /* replaceable with https://npmjs.com/package/es-abstract ES5.ToPrimitive */\n ToPrimitive: function ToPrimitive(input) {\n var val, valueOf, toStr;\n if (isPrimitive(input)) {\n return input;\n }\n valueOf = input.valueOf;\n if (isCallable(valueOf)) {\n val = valueOf.call(input);\n if (isPrimitive(val)) {\n return val;\n }\n }\n toStr = input.toString;\n if (isCallable(toStr)) {\n val = toStr.call(input);\n if (isPrimitive(val)) {\n return val;\n }\n }\n throw new TypeError();\n },\n\n // ES5 9.9\n // https://es5.github.io/#x9.9\n /* replaceable with https://npmjs.com/package/es-abstract ES5.ToObject */\n ToObject: function (o) {\n if (o == null) { // this matches both null and undefined\n throw new TypeError(\"can't convert \" + o + ' to object');\n }\n return $Object(o);\n },\n\n /* replaceable with https://npmjs.com/package/es-abstract ES5.ToUint32 */\n ToUint32: function ToUint32(x) {\n return x >>> 0;\n }\n };\n\n //\n // Function\n // ========\n //\n\n // ES-5 15.3.4.5\n // https://es5.github.io/#x15.3.4.5\n\n var Empty = function Empty() {};\n\n defineProperties(FunctionPrototype, {\n bind: function bind(that) { // .length is 1\n // 1. Let Target be the this value.\n var target = this;\n // 2. If IsCallable(Target) is false, throw a TypeError exception.\n if (!isCallable(target)) {\n throw new TypeError('Function.prototype.bind called on incompatible ' + target);\n }\n // 3. Let A be a new (possibly empty) internal list of all of the\n // argument values provided after thisArg (arg1, arg2 etc), in order.\n // XXX slicedArgs will stand in for \"A\" if used\n var args = array_slice.call(arguments, 1); // for normal call\n // 4. Let F be a new native ECMAScript object.\n // 11. Set the [[Prototype]] internal property of F to the standard\n // built-in Function prototype object as specified in 15.3.3.1.\n // 12. Set the [[Call]] internal property of F as described in\n // 15.3.4.5.1.\n // 13. Set the [[Construct]] internal property of F as described in\n // 15.3.4.5.2.\n // 14. Set the [[HasInstance]] internal property of F as described in\n // 15.3.4.5.3.\n var bound;\n var binder = function () {\n\n if (this instanceof bound) {\n // 15.3.4.5.2 [[Construct]]\n // When the [[Construct]] internal method of a function object,\n // F that was created using the bind function is called with a\n // list of arguments ExtraArgs, the following steps are taken:\n // 1. Let target be the value of F's [[TargetFunction]]\n // internal property.\n // 2. If target has no [[Construct]] internal method, a\n // TypeError exception is thrown.\n // 3. Let boundArgs be the value of F's [[BoundArgs]] internal\n // property.\n // 4. Let args be a new list containing the same values as the\n // list boundArgs in the same order followed by the same\n // values as the list ExtraArgs in the same order.\n // 5. Return the result of calling the [[Construct]] internal\n // method of target providing args as the arguments.\n\n var result = apply.call(\n target,\n this,\n array_concat.call(args, array_slice.call(arguments))\n );\n if ($Object(result) === result) {\n return result;\n }\n return this;\n\n }\n // 15.3.4.5.1 [[Call]]\n // When the [[Call]] internal method of a function object, F,\n // which was created using the bind function is called with a\n // this value and a list of arguments ExtraArgs, the following\n // steps are taken:\n // 1. Let boundArgs be the value of F's [[BoundArgs]] internal\n // property.\n // 2. Let boundThis be the value of F's [[BoundThis]] internal\n // property.\n // 3. Let target be the value of F's [[TargetFunction]] internal\n // property.\n // 4. Let args be a new list containing the same values as the\n // list boundArgs in the same order followed by the same\n // values as the list ExtraArgs in the same order.\n // 5. Return the result of calling the [[Call]] internal method\n // of target providing boundThis as the this value and\n // providing args as the arguments.\n\n // equiv: target.call(this, ...boundArgs, ...args)\n return apply.call(\n target,\n that,\n array_concat.call(args, array_slice.call(arguments))\n );\n\n };\n\n // 15. If the [[Class]] internal property of Target is \"Function\", then\n // a. Let L be the length property of Target minus the length of A.\n // b. Set the length own property of F to either 0 or L, whichever is\n // larger.\n // 16. Else set the length own property of F to 0.\n\n var boundLength = max(0, target.length - args.length);\n\n // 17. Set the attributes of the length own property of F to the values\n // specified in 15.3.5.1.\n var boundArgs = [];\n for (var i = 0; i < boundLength; i++) {\n array_push.call(boundArgs, '$' + i);\n }\n\n // XXX Build a dynamic function with desired amount of arguments is the only\n // way to set the length property of a function.\n // In environments where Content Security Policies enabled (Chrome extensions,\n // for ex.) all use of eval or Function costructor throws an exception.\n // However in all of these environments Function.prototype.bind exists\n // and so this code will never be executed.\n bound = $Function('binder', 'return function (' + array_join.call(boundArgs, ',') + '){ return binder.apply(this, arguments); }')(binder);\n\n if (target.prototype) {\n Empty.prototype = target.prototype;\n bound.prototype = new Empty();\n // Clean up dangling references.\n Empty.prototype = null;\n }\n\n // TODO\n // 18. Set the [[Extensible]] internal property of F to true.\n\n // TODO\n // 19. Let thrower be the [[ThrowTypeError]] function Object (13.2.3).\n // 20. Call the [[DefineOwnProperty]] internal method of F with\n // arguments \"caller\", PropertyDescriptor {[[Get]]: thrower, [[Set]]:\n // thrower, [[Enumerable]]: false, [[Configurable]]: false}, and\n // false.\n // 21. Call the [[DefineOwnProperty]] internal method of F with\n // arguments \"arguments\", PropertyDescriptor {[[Get]]: thrower,\n // [[Set]]: thrower, [[Enumerable]]: false, [[Configurable]]: false},\n // and false.\n\n // TODO\n // NOTE Function objects created using Function.prototype.bind do not\n // have a prototype property or the [[Code]], [[FormalParameters]], and\n // [[Scope]] internal properties.\n // XXX can't delete prototype in pure-js.\n\n // 22. Return F.\n return bound;\n }\n });\n\n // _Please note: Shortcuts are defined after `Function.prototype.bind` as we\n // use it in defining shortcuts.\n var owns = call.bind(ObjectPrototype.hasOwnProperty);\n var toStr = call.bind(ObjectPrototype.toString);\n var arraySlice = call.bind(array_slice);\n var arraySliceApply = apply.bind(array_slice);\n /* globals document */\n if (typeof document === 'object' && document && document.documentElement) {\n try {\n arraySlice(document.documentElement.childNodes);\n } catch (e) {\n var origArraySlice = arraySlice;\n var origArraySliceApply = arraySliceApply;\n arraySlice = function arraySliceIE(arr) {\n var r = [];\n var i = arr.length;\n while (i-- > 0) {\n r[i] = arr[i];\n }\n return origArraySliceApply(r, origArraySlice(arguments, 1));\n };\n arraySliceApply = function arraySliceApplyIE(arr, args) {\n return origArraySliceApply(arraySlice(arr), args);\n };\n }\n }\n var strSlice = call.bind(StringPrototype.slice);\n var strSplit = call.bind(StringPrototype.split);\n var strIndexOf = call.bind(StringPrototype.indexOf);\n var pushCall = call.bind(array_push);\n var isEnum = call.bind(ObjectPrototype.propertyIsEnumerable);\n var arraySort = call.bind(ArrayPrototype.sort);\n\n //\n // Array\n // =====\n //\n\n var isArray = $Array.isArray || function isArray(obj) {\n return toStr(obj) === '[object Array]';\n };\n\n // ES5 15.4.4.12\n // https://es5.github.io/#x15.4.4.13\n // Return len+argCount.\n // [bugfix, ielt8]\n // IE < 8 bug: [].unshift(0) === undefined but should be \"1\"\n var hasUnshiftReturnValueBug = [].unshift(0) !== 1;\n defineProperties(ArrayPrototype, {\n unshift: function () {\n array_unshift.apply(this, arguments);\n return this.length;\n }\n }, hasUnshiftReturnValueBug);\n\n // ES5 15.4.3.2\n // https://es5.github.io/#x15.4.3.2\n // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/isArray\n defineProperties($Array, { isArray: isArray });\n\n // The IsCallable() check in the Array functions\n // has been replaced with a strict check on the\n // internal class of the object to trap cases where\n // the provided function was actually a regular\n // expression literal, which in V8 and\n // JavaScriptCore is a typeof \"function\". Only in\n // V8 are regular expression literals permitted as\n // reduce parameters, so it is desirable in the\n // general case for the shim to match the more\n // strict and common behavior of rejecting regular\n // expressions.\n\n // ES5 15.4.4.18\n // https://es5.github.io/#x15.4.4.18\n // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/array/forEach\n\n // Check failure of by-index access of string characters (IE < 9)\n // and failure of `0 in boxedString` (Rhino)\n var boxedString = $Object('a');\n var splitString = boxedString[0] !== 'a' || !(0 in boxedString);\n\n var properlyBoxesContext = function properlyBoxed(method) {\n // Check node 0.6.21 bug where third parameter is not boxed\n var properlyBoxesNonStrict = true;\n var properlyBoxesStrict = true;\n var threwException = false;\n if (method) {\n try {\n method.call('foo', function (_, __, context) {\n if (typeof context !== 'object') {\n properlyBoxesNonStrict = false;\n }\n });\n\n method.call([1], function () {\n 'use strict';\n\n properlyBoxesStrict = typeof this === 'string';\n }, 'x');\n } catch (e) {\n threwException = true;\n }\n }\n return !!method && !threwException && properlyBoxesNonStrict && properlyBoxesStrict;\n };\n\n defineProperties(ArrayPrototype, {\n forEach: function forEach(callbackfn/*, thisArg*/) {\n var object = ES.ToObject(this);\n var self = splitString && isString(this) ? strSplit(this, '') : object;\n var i = -1;\n var length = ES.ToUint32(self.length);\n var T;\n if (arguments.length > 1) {\n T = arguments[1];\n }\n\n // If no callback function or if callback is not a callable function\n if (!isCallable(callbackfn)) {\n throw new TypeError('Array.prototype.forEach callback must be a function');\n }\n\n while (++i < length) {\n if (i in self) {\n // Invoke the callback function with call, passing arguments:\n // context, property value, property key, thisArg object\n if (typeof T === 'undefined') {\n callbackfn(self[i], i, object);\n } else {\n callbackfn.call(T, self[i], i, object);\n }\n }\n }\n }\n }, !properlyBoxesContext(ArrayPrototype.forEach));\n\n // ES5 15.4.4.19\n // https://es5.github.io/#x15.4.4.19\n // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map\n defineProperties(ArrayPrototype, {\n map: function map(callbackfn/*, thisArg*/) {\n var object = ES.ToObject(this);\n var self = splitString && isString(this) ? strSplit(this, '') : object;\n var length = ES.ToUint32(self.length);\n var result = $Array(length);\n var T;\n if (arguments.length > 1) {\n T = arguments[1];\n }\n\n // If no callback function or if callback is not a callable function\n if (!isCallable(callbackfn)) {\n throw new TypeError('Array.prototype.map callback must be a function');\n }\n\n for (var i = 0; i < length; i++) {\n if (i in self) {\n if (typeof T === 'undefined') {\n result[i] = callbackfn(self[i], i, object);\n } else {\n result[i] = callbackfn.call(T, self[i], i, object);\n }\n }\n }\n return result;\n }\n }, !properlyBoxesContext(ArrayPrototype.map));\n\n // ES5 15.4.4.20\n // https://es5.github.io/#x15.4.4.20\n // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter\n defineProperties(ArrayPrototype, {\n filter: function filter(callbackfn/*, thisArg*/) {\n var object = ES.ToObject(this);\n var self = splitString && isString(this) ? strSplit(this, '') : object;\n var length = ES.ToUint32(self.length);\n var result = [];\n var value;\n var T;\n if (arguments.length > 1) {\n T = arguments[1];\n }\n\n // If no callback function or if callback is not a callable function\n if (!isCallable(callbackfn)) {\n throw new TypeError('Array.prototype.filter callback must be a function');\n }\n\n for (var i = 0; i < length; i++) {\n if (i in self) {\n value = self[i];\n if (typeof T === 'undefined' ? callbackfn(value, i, object) : callbackfn.call(T, value, i, object)) {\n pushCall(result, value);\n }\n }\n }\n return result;\n }\n }, !properlyBoxesContext(ArrayPrototype.filter));\n\n // ES5 15.4.4.16\n // https://es5.github.io/#x15.4.4.16\n // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/every\n defineProperties(ArrayPrototype, {\n every: function every(callbackfn/*, thisArg*/) {\n var object = ES.ToObject(this);\n var self = splitString && isString(this) ? strSplit(this, '') : object;\n var length = ES.ToUint32(self.length);\n var T;\n if (arguments.length > 1) {\n T = arguments[1];\n }\n\n // If no callback function or if callback is not a callable function\n if (!isCallable(callbackfn)) {\n throw new TypeError('Array.prototype.every callback must be a function');\n }\n\n for (var i = 0; i < length; i++) {\n if (i in self && !(typeof T === 'undefined' ? callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) {\n return false;\n }\n }\n return true;\n }\n }, !properlyBoxesContext(ArrayPrototype.every));\n\n // ES5 15.4.4.17\n // https://es5.github.io/#x15.4.4.17\n // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/some\n defineProperties(ArrayPrototype, {\n some: function some(callbackfn/*, thisArg */) {\n var object = ES.ToObject(this);\n var self = splitString && isString(this) ? strSplit(this, '') : object;\n var length = ES.ToUint32(self.length);\n var T;\n if (arguments.length > 1) {\n T = arguments[1];\n }\n\n // If no callback function or if callback is not a callable function\n if (!isCallable(callbackfn)) {\n throw new TypeError('Array.prototype.some callback must be a function');\n }\n\n for (var i = 0; i < length; i++) {\n if (i in self && (typeof T === 'undefined' ? callbackfn(self[i], i, object) : callbackfn.call(T, self[i], i, object))) {\n return true;\n }\n }\n return false;\n }\n }, !properlyBoxesContext(ArrayPrototype.some));\n\n // ES5 15.4.4.21\n // https://es5.github.io/#x15.4.4.21\n // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduce\n var reduceCoercesToObject = false;\n if (ArrayPrototype.reduce) {\n reduceCoercesToObject = typeof ArrayPrototype.reduce.call('es5', function (_, __, ___, list) {\n return list;\n }) === 'object';\n }\n defineProperties(ArrayPrototype, {\n reduce: function reduce(callbackfn/*, initialValue*/) {\n var object = ES.ToObject(this);\n var self = splitString && isString(this) ? strSplit(this, '') : object;\n var length = ES.ToUint32(self.length);\n\n // If no callback function or if callback is not a callable function\n if (!isCallable(callbackfn)) {\n throw new TypeError('Array.prototype.reduce callback must be a function');\n }\n\n // no value to return if no initial value and an empty array\n if (length === 0 && arguments.length === 1) {\n throw new TypeError('reduce of empty array with no initial value');\n }\n\n var i = 0;\n var result;\n if (arguments.length >= 2) {\n result = arguments[1];\n } else {\n do {\n if (i in self) {\n result = self[i++];\n break;\n }\n\n // if array contains no values, no initial value to return\n if (++i >= length) {\n throw new TypeError('reduce of empty array with no initial value');\n }\n } while (true);\n }\n\n for (; i < length; i++) {\n if (i in self) {\n result = callbackfn(result, self[i], i, object);\n }\n }\n\n return result;\n }\n }, !reduceCoercesToObject);\n\n // ES5 15.4.4.22\n // https://es5.github.io/#x15.4.4.22\n // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/reduceRight\n var reduceRightCoercesToObject = false;\n if (ArrayPrototype.reduceRight) {\n reduceRightCoercesToObject = typeof ArrayPrototype.reduceRight.call('es5', function (_, __, ___, list) {\n return list;\n }) === 'object';\n }\n defineProperties(ArrayPrototype, {\n reduceRight: function reduceRight(callbackfn/*, initial*/) {\n var object = ES.ToObject(this);\n var self = splitString && isString(this) ? strSplit(this, '') : object;\n var length = ES.ToUint32(self.length);\n\n // If no callback function or if callback is not a callable function\n if (!isCallable(callbackfn)) {\n throw new TypeError('Array.prototype.reduceRight callback must be a function');\n }\n\n // no value to return if no initial value, empty array\n if (length === 0 && arguments.length === 1) {\n throw new TypeError('reduceRight of empty array with no initial value');\n }\n\n var result;\n var i = length - 1;\n if (arguments.length >= 2) {\n result = arguments[1];\n } else {\n do {\n if (i in self) {\n result = self[i--];\n break;\n }\n\n // if array contains no values, no initial value to return\n if (--i < 0) {\n throw new TypeError('reduceRight of empty array with no initial value');\n }\n } while (true);\n }\n\n if (i < 0) {\n return result;\n }\n\n do {\n if (i in self) {\n result = callbackfn(result, self[i], i, object);\n }\n } while (i--);\n\n return result;\n }\n }, !reduceRightCoercesToObject);\n\n // ES5 15.4.4.14\n // https://es5.github.io/#x15.4.4.14\n // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/indexOf\n var hasFirefox2IndexOfBug = ArrayPrototype.indexOf && [0, 1].indexOf(1, 2) !== -1;\n defineProperties(ArrayPrototype, {\n indexOf: function indexOf(searchElement/*, fromIndex */) {\n var self = splitString && isString(this) ? strSplit(this, '') : ES.ToObject(this);\n var length = ES.ToUint32(self.length);\n\n if (length === 0) {\n return -1;\n }\n\n var i = 0;\n if (arguments.length > 1) {\n i = ES.ToInteger(arguments[1]);\n }\n\n // handle negative indices\n i = i >= 0 ? i : max(0, length + i);\n for (; i < length; i++) {\n if (i in self && self[i] === searchElement) {\n return i;\n }\n }\n return -1;\n }\n }, hasFirefox2IndexOfBug);\n\n // ES5 15.4.4.15\n // https://es5.github.io/#x15.4.4.15\n // https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/lastIndexOf\n var hasFirefox2LastIndexOfBug = ArrayPrototype.lastIndexOf && [0, 1].lastIndexOf(0, -3) !== -1;\n defineProperties(ArrayPrototype, {\n lastIndexOf: function lastIndexOf(searchElement/*, fromIndex */) {\n var self = splitString && isString(this) ? strSplit(this, '') : ES.ToObject(this);\n var length = ES.ToUint32(self.length);\n\n if (length === 0) {\n return -1;\n }\n var i = length - 1;\n if (arguments.length > 1) {\n i = min(i, ES.ToInteger(arguments[1]));\n }\n // handle negative indices\n i = i >= 0 ? i : length - abs(i);\n for (; i >= 0; i--) {\n if (i in self && searchElement === self[i]) {\n return i;\n }\n }\n return -1;\n }\n }, hasFirefox2LastIndexOfBug);\n\n // ES5 15.4.4.12\n // https://es5.github.io/#x15.4.4.12\n var spliceNoopReturnsEmptyArray = (function () {\n var a = [1, 2];\n var result = a.splice();\n return a.length === 2 && isArray(result) && result.length === 0;\n }());\n defineProperties(ArrayPrototype, {\n // Safari 5.0 bug where .splice() returns undefined\n splice: function splice(start, deleteCount) {\n if (arguments.length === 0) {\n return [];\n }\n return array_splice.apply(this, arguments);\n\n }\n }, !spliceNoopReturnsEmptyArray);\n\n var spliceWorksWithEmptyObject = (function () {\n var obj = {};\n ArrayPrototype.splice.call(obj, 0, 0, 1);\n return obj.length === 1;\n }());\n var hasES6Defaults = [0, 1, 2].splice(0).length === 3;\n defineProperties(ArrayPrototype, {\n splice: function splice(start, deleteCount) {\n if (arguments.length === 0) {\n return [];\n }\n var args = arguments;\n this.length = max(ES.ToInteger(this.length), 0);\n if (arguments.length > 0 && typeof deleteCount !== 'number') {\n args = arraySlice(arguments);\n if (args.length < 2) {\n pushCall(args, this.length - start);\n } else {\n args[1] = ES.ToInteger(deleteCount);\n }\n }\n return array_splice.apply(this, args);\n }\n }, !spliceWorksWithEmptyObject || !hasES6Defaults);\n var spliceWorksWithLargeSparseArrays = (function () {\n // Per https://github.com/es-shims/es5-shim/issues/295\n // Safari 7/8 breaks with sparse arrays of size 1e5 or greater\n var arr = new $Array(1e5);\n // note: the index MUST be 8 or larger or the test will false pass\n arr[8] = 'x';\n arr.splice(1, 1);\n // note: this test must be defined *after* the indexOf shim\n // per https://github.com/es-shims/es5-shim/issues/313\n return arr.indexOf('x') === 7;\n }());\n var spliceWorksWithSmallSparseArrays = (function () {\n // Per https://github.com/es-shims/es5-shim/issues/295\n // Opera 12.15 breaks on this, no idea why.\n var n = 256;\n var arr = [];\n arr[n] = 'a';\n arr.splice(n + 1, 0, 'b');\n return arr[n] === 'a';\n }());\n defineProperties(ArrayPrototype, {\n splice: function splice(start, deleteCount) {\n var O = ES.ToObject(this);\n var A = [];\n var len = ES.ToUint32(O.length);\n var relativeStart = ES.ToInteger(start);\n var actualStart = relativeStart < 0 ? max((len + relativeStart), 0) : min(relativeStart, len);\n var actualDeleteCount = arguments.length === 0\n ? 0\n : arguments.length === 1\n ? len - actualStart\n : min(max(ES.ToInteger(deleteCount), 0), len - actualStart);\n\n var k = 0;\n var from;\n while (k < actualDeleteCount) {\n from = $String(actualStart + k);\n if (owns(O, from)) {\n A[k] = O[from];\n }\n k += 1;\n }\n\n var items = arraySlice(arguments, 2);\n var itemCount = items.length;\n var to;\n if (itemCount < actualDeleteCount) {\n k = actualStart;\n var maxK = len - actualDeleteCount;\n while (k < maxK) {\n from = $String(k + actualDeleteCount);\n to = $String(k + itemCount);\n if (owns(O, from)) {\n O[to] = O[from];\n } else {\n delete O[to];\n }\n k += 1;\n }\n k = len;\n var minK = len - actualDeleteCount + itemCount;\n while (k > minK) {\n delete O[k - 1];\n k -= 1;\n }\n } else if (itemCount > actualDeleteCount) {\n k = len - actualDeleteCount;\n while (k > actualStart) {\n from = $String(k + actualDeleteCount - 1);\n to = $String(k + itemCount - 1);\n if (owns(O, from)) {\n O[to] = O[from];\n } else {\n delete O[to];\n }\n k -= 1;\n }\n }\n k = actualStart;\n for (var i = 0; i < items.length; ++i) {\n O[k] = items[i];\n k += 1;\n }\n O.length = len - actualDeleteCount + itemCount;\n\n return A;\n }\n }, !spliceWorksWithLargeSparseArrays || !spliceWorksWithSmallSparseArrays);\n\n var originalJoin = ArrayPrototype.join;\n var hasStringJoinBug;\n try {\n hasStringJoinBug = Array.prototype.join.call('123', ',') !== '1,2,3';\n } catch (e) {\n hasStringJoinBug = true;\n }\n if (hasStringJoinBug) {\n defineProperties(ArrayPrototype, {\n join: function join(separator) {\n var sep = typeof separator === 'undefined' ? ',' : separator;\n return originalJoin.call(isString(this) ? strSplit(this, '') : this, sep);\n }\n }, hasStringJoinBug);\n }\n\n var hasJoinUndefinedBug = [1, 2].join(undefined) !== '1,2';\n if (hasJoinUndefinedBug) {\n defineProperties(ArrayPrototype, {\n join: function join(separator) {\n var sep = typeof separator === 'undefined' ? ',' : separator;\n return originalJoin.call(this, sep);\n }\n }, hasJoinUndefinedBug);\n }\n\n var pushShim = function push(item) {\n var O = ES.ToObject(this);\n var n = ES.ToUint32(O.length);\n var i = 0;\n while (i < arguments.length) {\n O[n + i] = arguments[i];\n i += 1;\n }\n O.length = n + i;\n return n + i;\n };\n\n var pushIsNotGeneric = (function () {\n var obj = {};\n var result = Array.prototype.push.call(obj, undefined);\n return result !== 1 || obj.length !== 1 || typeof obj[0] !== 'undefined' || !owns(obj, 0);\n }());\n defineProperties(ArrayPrototype, {\n push: function push(item) {\n if (isArray(this)) {\n return array_push.apply(this, arguments);\n }\n return pushShim.apply(this, arguments);\n }\n }, pushIsNotGeneric);\n\n // This fixes a very weird bug in Opera 10.6 when pushing `undefined\n var pushUndefinedIsWeird = (function () {\n var arr = [];\n var result = arr.push(undefined);\n return result !== 1 || arr.length !== 1 || typeof arr[0] !== 'undefined' || !owns(arr, 0);\n }());\n defineProperties(ArrayPrototype, { push: pushShim }, pushUndefinedIsWeird);\n\n // ES5 15.2.3.14\n // https://es5.github.io/#x15.4.4.10\n // Fix boxed string bug\n defineProperties(ArrayPrototype, {\n slice: function (start, end) {\n var arr = isString(this) ? strSplit(this, '') : this;\n return arraySliceApply(arr, arguments);\n }\n }, splitString);\n\n var sortIgnoresNonFunctions = (function () {\n try {\n [1, 2].sort(null);\n } catch (e) {\n try {\n [1, 2].sort({});\n } catch (e2) {\n return false;\n }\n }\n return true;\n }());\n var sortThrowsOnRegex = (function () {\n // this is a problem in Firefox 4, in which `typeof /a/ === 'function'`\n try {\n [1, 2].sort(/a/);\n return false;\n } catch (e) {}\n return true;\n }());\n var sortIgnoresUndefined = (function () {\n // applies in IE 8, for one.\n try {\n [1, 2].sort(undefined);\n return true;\n } catch (e) {}\n return false;\n }());\n defineProperties(ArrayPrototype, {\n sort: function sort(compareFn) {\n if (typeof compareFn === 'undefined') {\n return arraySort(this);\n }\n if (!isCallable(compareFn)) {\n throw new TypeError('Array.prototype.sort callback must be a function');\n }\n return arraySort(this, compareFn);\n }\n }, sortIgnoresNonFunctions || !sortIgnoresUndefined || !sortThrowsOnRegex);\n\n //\n // Object\n // ======\n //\n\n // ES5 15.2.3.14\n // https://es5.github.io/#x15.2.3.14\n\n // https://web.archive.org/web/20140727042234/http://whattheheadsaid.com/2010/10/a-safer-object-keys-compatibility-implementation\n // eslint-disable-next-line quote-props\n var hasDontEnumBug = !isEnum({ 'toString': null }, 'toString'); // jscs:ignore disallowQuotedKeysInObjects\n var hasProtoEnumBug = isEnum(function () {}, 'prototype');\n var hasStringEnumBug = !owns('x', '0');\n var equalsConstructorPrototype = function (o) {\n var ctor = o.constructor;\n return ctor && ctor.prototype === o;\n };\n var excludedKeys = {\n $applicationCache: true,\n $console: true,\n $external: true,\n $frame: true,\n $frameElement: true,\n $frames: true,\n $innerHeight: true,\n $innerWidth: true,\n $onmozfullscreenchange: true,\n $onmozfullscreenerror: true,\n $outerHeight: true,\n $outerWidth: true,\n $pageXOffset: true,\n $pageYOffset: true,\n $parent: true,\n $scrollLeft: true,\n $scrollTop: true,\n $scrollX: true,\n $scrollY: true,\n $self: true,\n $webkitIndexedDB: true,\n $webkitStorageInfo: true,\n $window: true,\n\n $width: true,\n $height: true,\n $top: true,\n $localStorage: true\n };\n var hasAutomationEqualityBug = (function () {\n /* globals window */\n if (typeof window === 'undefined') {\n return false;\n }\n for (var k in window) {\n try {\n if (!excludedKeys['$' + k] && owns(window, k) && window[k] !== null && typeof window[k] === 'object') {\n equalsConstructorPrototype(window[k]);\n }\n } catch (e) {\n return true;\n }\n }\n return false;\n }());\n var equalsConstructorPrototypeIfNotBuggy = function (object) {\n if (typeof window === 'undefined' || !hasAutomationEqualityBug) {\n return equalsConstructorPrototype(object);\n }\n try {\n return equalsConstructorPrototype(object);\n } catch (e) {\n return false;\n }\n };\n var dontEnums = [\n 'toString',\n 'toLocaleString',\n 'valueOf',\n 'hasOwnProperty',\n 'isPrototypeOf',\n 'propertyIsEnumerable',\n 'constructor'\n ];\n var dontEnumsLength = dontEnums.length;\n\n // taken directly from https://github.com/ljharb/is-arguments/blob/master/index.js\n // can be replaced with require('is-arguments') if we ever use a build process instead\n var isStandardArguments = function isArguments(value) {\n return toStr(value) === '[object Arguments]';\n };\n var isLegacyArguments = function isArguments(value) {\n return value !== null\n && typeof value === 'object'\n && typeof value.length === 'number'\n && value.length >= 0\n && !isArray(value)\n && isCallable(value.callee);\n };\n var isArguments = isStandardArguments(arguments) ? isStandardArguments : isLegacyArguments;\n\n defineProperties($Object, {\n keys: function keys(object) {\n var isFn = isCallable(object);\n var isArgs = isArguments(object);\n var isObject = object !== null && typeof object === 'object';\n var isStr = isObject && isString(object);\n\n if (!isObject && !isFn && !isArgs) {\n throw new TypeError('Object.keys called on a non-object');\n }\n\n var theKeys = [];\n var skipProto = hasProtoEnumBug && isFn;\n if ((isStr && hasStringEnumBug) || isArgs) {\n for (var i = 0; i < object.length; ++i) {\n pushCall(theKeys, $String(i));\n }\n }\n\n if (!isArgs) {\n for (var name in object) {\n if (!(skipProto && name === 'prototype') && owns(object, name)) {\n pushCall(theKeys, $String(name));\n }\n }\n }\n\n if (hasDontEnumBug) {\n var skipConstructor = equalsConstructorPrototypeIfNotBuggy(object);\n for (var j = 0; j < dontEnumsLength; j++) {\n var dontEnum = dontEnums[j];\n if (!(skipConstructor && dontEnum === 'constructor') && owns(object, dontEnum)) {\n pushCall(theKeys, dontEnum);\n }\n }\n }\n return theKeys;\n }\n });\n\n var keysWorksWithArguments = $Object.keys && (function () {\n // Safari 5.0 bug\n return $Object.keys(arguments).length === 2;\n }(1, 2));\n var keysHasArgumentsLengthBug = $Object.keys && (function () {\n var argKeys = $Object.keys(arguments);\n return arguments.length !== 1 || argKeys.length !== 1 || argKeys[0] !== 1;\n }(1));\n var originalKeys = $Object.keys;\n defineProperties($Object, {\n keys: function keys(object) {\n if (isArguments(object)) {\n return originalKeys(arraySlice(object));\n }\n return originalKeys(object);\n\n }\n }, !keysWorksWithArguments || keysHasArgumentsLengthBug);\n\n //\n // Date\n // ====\n //\n\n var hasNegativeMonthYearBug = new Date(-3509827329600292).getUTCMonth() !== 0;\n var aNegativeTestDate = new Date(-1509842289600292);\n var aPositiveTestDate = new Date(1449662400000);\n var hasToUTCStringFormatBug = aNegativeTestDate.toUTCString() !== 'Mon, 01 Jan -45875 11:59:59 GMT';\n var hasToDateStringFormatBug;\n var hasToStringFormatBug;\n var timeZoneOffset = aNegativeTestDate.getTimezoneOffset();\n if (timeZoneOffset < -720) {\n hasToDateStringFormatBug = aNegativeTestDate.toDateString() !== 'Tue Jan 02 -45875';\n hasToStringFormatBug = !(/^Thu Dec 10 2015 \\d\\d:\\d\\d:\\d\\d GMT[-+]\\d\\d\\d\\d(?: |$)/).test(String(aPositiveTestDate));\n } else {\n hasToDateStringFormatBug = aNegativeTestDate.toDateString() !== 'Mon Jan 01 -45875';\n hasToStringFormatBug = !(/^Wed Dec 09 2015 \\d\\d:\\d\\d:\\d\\d GMT[-+]\\d\\d\\d\\d(?: |$)/).test(String(aPositiveTestDate));\n }\n\n var originalGetFullYear = call.bind(Date.prototype.getFullYear);\n var originalGetMonth = call.bind(Date.prototype.getMonth);\n var originalGetDate = call.bind(Date.prototype.getDate);\n var originalGetUTCFullYear = call.bind(Date.prototype.getUTCFullYear);\n var originalGetUTCMonth = call.bind(Date.prototype.getUTCMonth);\n var originalGetUTCDate = call.bind(Date.prototype.getUTCDate);\n var originalGetUTCDay = call.bind(Date.prototype.getUTCDay);\n var originalGetUTCHours = call.bind(Date.prototype.getUTCHours);\n var originalGetUTCMinutes = call.bind(Date.prototype.getUTCMinutes);\n var originalGetUTCSeconds = call.bind(Date.prototype.getUTCSeconds);\n var originalGetUTCMilliseconds = call.bind(Date.prototype.getUTCMilliseconds);\n var dayName = ['Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'];\n var monthName = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];\n var daysInMonth = function daysInMonth(month, year) {\n return originalGetDate(new Date(year, month, 0));\n };\n\n defineProperties(Date.prototype, {\n getFullYear: function getFullYear() {\n if (!this || !(this instanceof Date)) {\n throw new TypeError('this is not a Date object.');\n }\n var year = originalGetFullYear(this);\n if (year < 0 && originalGetMonth(this) > 11) {\n return year + 1;\n }\n return year;\n },\n getMonth: function getMonth() {\n if (!this || !(this instanceof Date)) {\n throw new TypeError('this is not a Date object.');\n }\n var year = originalGetFullYear(this);\n var month = originalGetMonth(this);\n if (year < 0 && month > 11) {\n return 0;\n }\n return month;\n },\n getDate: function getDate() {\n if (!this || !(this instanceof Date)) {\n throw new TypeError('this is not a Date object.');\n }\n var year = originalGetFullYear(this);\n var month = originalGetMonth(this);\n var date = originalGetDate(this);\n if (year < 0 && month > 11) {\n if (month === 12) {\n return date;\n }\n var days = daysInMonth(0, year + 1);\n return (days - date) + 1;\n }\n return date;\n },\n getUTCFullYear: function getUTCFullYear() {\n if (!this || !(this instanceof Date)) {\n throw new TypeError('this is not a Date object.');\n }\n var year = originalGetUTCFullYear(this);\n if (year < 0 && originalGetUTCMonth(this) > 11) {\n return year + 1;\n }\n return year;\n },\n getUTCMonth: function getUTCMonth() {\n if (!this || !(this instanceof Date)) {\n throw new TypeError('this is not a Date object.');\n }\n var year = originalGetUTCFullYear(this);\n var month = originalGetUTCMonth(this);\n if (year < 0 && month > 11) {\n return 0;\n }\n return month;\n },\n getUTCDate: function getUTCDate() {\n if (!this || !(this instanceof Date)) {\n throw new TypeError('this is not a Date object.');\n }\n var year = originalGetUTCFullYear(this);\n var month = originalGetUTCMonth(this);\n var date = originalGetUTCDate(this);\n if (year < 0 && month > 11) {\n if (month === 12) {\n return date;\n }\n var days = daysInMonth(0, year + 1);\n return (days - date) + 1;\n }\n return date;\n }\n }, hasNegativeMonthYearBug);\n\n defineProperties(Date.prototype, {\n toUTCString: function toUTCString() {\n if (!this || !(this instanceof Date)) {\n throw new TypeError('this is not a Date object.');\n }\n var day = originalGetUTCDay(this);\n var date = originalGetUTCDate(this);\n var month = originalGetUTCMonth(this);\n var year = originalGetUTCFullYear(this);\n var hour = originalGetUTCHours(this);\n var minute = originalGetUTCMinutes(this);\n var second = originalGetUTCSeconds(this);\n return dayName[day] + ', '\n + (date < 10 ? '0' + date : date) + ' '\n + monthName[month] + ' '\n + year + ' '\n + (hour < 10 ? '0' + hour : hour) + ':'\n + (minute < 10 ? '0' + minute : minute) + ':'\n + (second < 10 ? '0' + second : second) + ' GMT';\n }\n }, hasNegativeMonthYearBug || hasToUTCStringFormatBug);\n\n // Opera 12 has `,`\n defineProperties(Date.prototype, {\n toDateString: function toDateString() {\n if (!this || !(this instanceof Date)) {\n throw new TypeError('this is not a Date object.');\n }\n var day = this.getDay();\n var date = this.getDate();\n var month = this.getMonth();\n var year = this.getFullYear();\n return dayName[day] + ' '\n + monthName[month] + ' '\n + (date < 10 ? '0' + date : date) + ' '\n + year;\n }\n }, hasNegativeMonthYearBug || hasToDateStringFormatBug);\n\n // can't use defineProperties here because of toString enumeration issue in IE <= 8\n if (hasNegativeMonthYearBug || hasToStringFormatBug) {\n Date.prototype.toString = function toString() {\n if (!this || !(this instanceof Date)) {\n throw new TypeError('this is not a Date object.');\n }\n var day = this.getDay();\n var date = this.getDate();\n var month = this.getMonth();\n var year = this.getFullYear();\n var hour = this.getHours();\n var minute = this.getMinutes();\n var second = this.getSeconds();\n var timezoneOffset = this.getTimezoneOffset();\n var hoursOffset = floor(abs(timezoneOffset) / 60);\n var minutesOffset = floor(abs(timezoneOffset) % 60);\n return dayName[day] + ' '\n + monthName[month] + ' '\n + (date < 10 ? '0' + date : date) + ' '\n + year + ' '\n + (hour < 10 ? '0' + hour : hour) + ':'\n + (minute < 10 ? '0' + minute : minute) + ':'\n + (second < 10 ? '0' + second : second) + ' GMT'\n + (timezoneOffset > 0 ? '-' : '+')\n + (hoursOffset < 10 ? '0' + hoursOffset : hoursOffset)\n + (minutesOffset < 10 ? '0' + minutesOffset : minutesOffset);\n };\n if (supportsDescriptors) {\n $Object.defineProperty(Date.prototype, 'toString', {\n configurable: true,\n enumerable: false,\n writable: true\n });\n }\n }\n\n // ES5 15.9.5.43\n // https://es5.github.io/#x15.9.5.43\n // This function returns a String value represent the instance in time\n // represented by this Date object. The format of the String is the Date Time\n // string format defined in 15.9.1.15. All fields are present in the String.\n // The time zone is always UTC, denoted by the suffix Z. If the time value of\n // this object is not a finite Number a RangeError exception is thrown.\n var negativeDate = -62198755200000;\n var negativeYearString = '-000001';\n var hasNegativeDateBug = Date.prototype.toISOString && new Date(negativeDate).toISOString().indexOf(negativeYearString) === -1; // eslint-disable-line max-len\n var hasSafari51DateBug = Date.prototype.toISOString && new Date(-1).toISOString() !== '1969-12-31T23:59:59.999Z';\n\n var getTime = call.bind(Date.prototype.getTime);\n\n defineProperties(Date.prototype, {\n toISOString: function toISOString() {\n if (!isFinite(this) || !isFinite(getTime(this))) {\n // Adope Photoshop requires the second check.\n throw new RangeError('Date.prototype.toISOString called on non-finite value.');\n }\n\n var year = originalGetUTCFullYear(this);\n\n var month = originalGetUTCMonth(this);\n // see https://github.com/es-shims/es5-shim/issues/111\n year += floor(month / 12);\n month = ((month % 12) + 12) % 12;\n\n // the date time string format is specified in 15.9.1.15.\n var result = [\n month + 1,\n originalGetUTCDate(this),\n originalGetUTCHours(this),\n originalGetUTCMinutes(this),\n originalGetUTCSeconds(this)\n ];\n year = (\n (year < 0 ? '-' : (year > 9999 ? '+' : ''))\n + strSlice('00000' + abs(year), (0 <= year && year <= 9999) ? -4 : -6)\n );\n\n for (var i = 0; i < result.length; ++i) {\n // pad months, days, hours, minutes, and seconds to have two digits.\n result[i] = strSlice('00' + result[i], -2);\n }\n // pad milliseconds to have three digits.\n return (\n year + '-' + arraySlice(result, 0, 2).join('-')\n + 'T' + arraySlice(result, 2).join(':') + '.'\n + strSlice('000' + originalGetUTCMilliseconds(this), -3) + 'Z'\n );\n }\n }, hasNegativeDateBug || hasSafari51DateBug);\n\n // ES5 15.9.5.44\n // https://es5.github.io/#x15.9.5.44\n // This function provides a String representation of a Date object for use by\n // JSON.stringify (15.12.3).\n var dateToJSONIsSupported = (function () {\n try {\n return Date.prototype.toJSON\n && new Date(NaN).toJSON() === null\n && new Date(negativeDate).toJSON().indexOf(negativeYearString) !== -1\n && Date.prototype.toJSON.call({ // generic\n toISOString: function () { return true; }\n });\n } catch (e) {\n return false;\n }\n }());\n if (!dateToJSONIsSupported) {\n Date.prototype.toJSON = function toJSON(key) {\n // When the toJSON method is called with argument key, the following\n // steps are taken:\n\n // 1. Let O be the result of calling ToObject, giving it the this\n // value as its argument.\n // 2. Let tv be ES.ToPrimitive(O, hint Number).\n var O = $Object(this);\n var tv = ES.ToPrimitive(O);\n // 3. If tv is a Number and is not finite, return null.\n if (typeof tv === 'number' && !isFinite(tv)) {\n return null;\n }\n // 4. Let toISO be the result of calling the [[Get]] internal method of\n // O with argument \"toISOString\".\n var toISO = O.toISOString;\n // 5. If IsCallable(toISO) is false, throw a TypeError exception.\n if (!isCallable(toISO)) {\n throw new TypeError('toISOString property is not callable');\n }\n // 6. Return the result of calling the [[Call]] internal method of\n // toISO with O as the this value and an empty argument list.\n return toISO.call(O);\n\n // NOTE 1 The argument is ignored.\n\n // NOTE 2 The toJSON function is intentionally generic; it does not\n // require that its this value be a Date object. Therefore, it can be\n // transferred to other kinds of objects for use as a method. However,\n // it does require that any such object have a toISOString method. An\n // object is free to use the argument key to filter its\n // stringification.\n };\n }\n\n // ES5 15.9.4.2\n // https://es5.github.io/#x15.9.4.2\n // based on work shared by Daniel Friesen (dantman)\n // https://gist.github.com/303249\n var supportsExtendedYears = Date.parse('+033658-09-27T01:46:40.000Z') === 1e15;\n var acceptsInvalidDates = !isNaN(Date.parse('2012-04-04T24:00:00.500Z')) || !isNaN(Date.parse('2012-11-31T23:59:59.000Z')) || !isNaN(Date.parse('2012-12-31T23:59:60.000Z'));\n var doesNotParseY2KNewYear = isNaN(Date.parse('2000-01-01T00:00:00.000Z'));\n if (doesNotParseY2KNewYear || acceptsInvalidDates || !supportsExtendedYears) {\n // XXX global assignment won't work in embeddings that use\n // an alternate object for the context.\n var maxSafeUnsigned32Bit = pow(2, 31) - 1;\n var hasSafariSignedIntBug = isActualNaN(new Date(1970, 0, 1, 0, 0, 0, maxSafeUnsigned32Bit + 1).getTime());\n // eslint-disable-next-line no-implicit-globals, no-global-assign\n Date = (function (NativeDate) {\n // Date.length === 7\n var DateShim = function Date(Y, M, D, h, m, s, ms) {\n var length = arguments.length;\n var date;\n if (this instanceof NativeDate) {\n var seconds = s;\n var millis = ms;\n if (hasSafariSignedIntBug && length >= 7 && ms > maxSafeUnsigned32Bit) {\n // work around a Safari 8/9 bug where it treats the seconds as signed\n var msToShift = floor(ms / maxSafeUnsigned32Bit) * maxSafeUnsigned32Bit;\n var sToShift = floor(msToShift / 1e3);\n seconds += sToShift;\n millis -= sToShift * 1e3;\n }\n var parsed = DateShim.parse(Y);\n var hasNegTimestampParseBug = isNaN(parsed);\n date = length === 1 && $String(Y) === Y && !hasNegTimestampParseBug // isString(Y)\n // We explicitly pass it through parse:\n ? new NativeDate(parsed)\n // We have to manually make calls depending on argument\n // length here\n : length >= 7 ? new NativeDate(Y, M, D, h, m, seconds, millis)\n : length >= 6 ? new NativeDate(Y, M, D, h, m, seconds)\n : length >= 5 ? new NativeDate(Y, M, D, h, m)\n : length >= 4 ? new NativeDate(Y, M, D, h)\n : length >= 3 ? new NativeDate(Y, M, D)\n : length >= 2 ? new NativeDate(Y, M)\n : length >= 1 ? new NativeDate(Y instanceof NativeDate ? +Y : Y)\n : new NativeDate();\n } else {\n date = NativeDate.apply(this, arguments);\n }\n if (!isPrimitive(date)) {\n // Prevent mixups with unfixed Date object\n defineProperties(date, { constructor: DateShim }, true);\n }\n return date;\n };\n\n // 15.9.1.15 Date Time String Format.\n var isoDateExpression = new RegExp('^'\n + '(\\\\d{4}|[+-]\\\\d{6})' // four-digit year capture or sign + 6-digit extended year\n + '(?:-(\\\\d{2})' // optional month capture\n + '(?:-(\\\\d{2})' // optional day capture\n + '(?:' // capture hours:minutes:seconds.milliseconds\n + 'T(\\\\d{2})' // hours capture\n + ':(\\\\d{2})' // minutes capture\n + '(?:' // optional :seconds.milliseconds\n + ':(\\\\d{2})' // seconds capture\n + '(?:(\\\\.\\\\d{1,}))?' // milliseconds capture\n + ')?'\n + '(' // capture UTC offset component\n + 'Z|' // UTC capture\n + '(?:' // offset specifier +/-hours:minutes\n + '([-+])' // sign capture\n + '(\\\\d{2})' // hours offset capture\n + ':(\\\\d{2})' // minutes offset capture\n + ')'\n + ')?)?)?)?'\n + '$');\n\n var months = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365];\n\n var dayFromMonth = function dayFromMonth(year, month) {\n var t = month > 1 ? 1 : 0;\n return (\n months[month]\n + floor((year - 1969 + t) / 4)\n - floor((year - 1901 + t) / 100)\n + floor((year - 1601 + t) / 400)\n + (365 * (year - 1970))\n );\n };\n\n var toUTC = function toUTC(t) {\n var s = 0;\n var ms = t;\n if (hasSafariSignedIntBug && ms > maxSafeUnsigned32Bit) {\n // work around a Safari 8/9 bug where it treats the seconds as signed\n var msToShift = floor(ms / maxSafeUnsigned32Bit) * maxSafeUnsigned32Bit;\n var sToShift = floor(msToShift / 1e3);\n s += sToShift;\n ms -= sToShift * 1e3;\n }\n return $Number(new NativeDate(1970, 0, 1, 0, 0, s, ms));\n };\n\n // Copy any custom methods a 3rd party library may have added\n for (var key in NativeDate) {\n if (owns(NativeDate, key)) {\n DateShim[key] = NativeDate[key];\n }\n }\n\n // Copy \"native\" methods explicitly; they may be non-enumerable\n defineProperties(DateShim, {\n now: NativeDate.now,\n UTC: NativeDate.UTC\n }, true);\n DateShim.prototype = NativeDate.prototype;\n defineProperties(DateShim.prototype, { constructor: DateShim }, true);\n\n // Upgrade Date.parse to handle simplified ISO 8601 strings\n var parseShim = function parse(string) {\n var match = isoDateExpression.exec(string);\n if (match) {\n // parse months, days, hours, minutes, seconds, and milliseconds\n // provide default values if necessary\n // parse the UTC offset component\n var year = $Number(match[1]),\n month = $Number(match[2] || 1) - 1,\n day = $Number(match[3] || 1) - 1,\n hour = $Number(match[4] || 0),\n minute = $Number(match[5] || 0),\n second = $Number(match[6] || 0),\n millisecond = floor($Number(match[7] || 0) * 1000),\n // When time zone is missed, local offset should be used\n // (ES 5.1 bug)\n // see https://bugs.ecmascript.org/show_bug.cgi?id=112\n isLocalTime = Boolean(match[4] && !match[8]),\n signOffset = match[9] === '-' ? 1 : -1,\n hourOffset = $Number(match[10] || 0),\n minuteOffset = $Number(match[11] || 0),\n result;\n var hasMinutesOrSecondsOrMilliseconds = minute > 0 || second > 0 || millisecond > 0;\n if (\n hour < (hasMinutesOrSecondsOrMilliseconds ? 24 : 25)\n && minute < 60 && second < 60 && millisecond < 1000\n && month > -1 && month < 12 && hourOffset < 24\n && minuteOffset < 60 // detect invalid offsets\n && day > -1\n && day < (dayFromMonth(year, month + 1) - dayFromMonth(year, month))\n ) {\n result = (\n ((dayFromMonth(year, month) + day) * 24)\n + hour\n + (hourOffset * signOffset)\n ) * 60;\n result = ((\n ((result + minute + (minuteOffset * signOffset)) * 60)\n + second\n ) * 1000) + millisecond;\n if (isLocalTime) {\n result = toUTC(result);\n }\n if (-8.64e15 <= result && result <= 8.64e15) {\n return result;\n }\n }\n return NaN;\n }\n return NativeDate.parse.apply(this, arguments);\n };\n defineProperties(DateShim, { parse: parseShim });\n\n return DateShim;\n }(Date));\n }\n\n // ES5 15.9.4.4\n // https://es5.github.io/#x15.9.4.4\n if (!Date.now) {\n Date.now = function now() {\n return new Date().getTime();\n };\n }\n\n //\n // Number\n // ======\n //\n\n // ES5.1 15.7.4.5\n // https://es5.github.io/#x15.7.4.5\n var hasToFixedBugs = NumberPrototype.toFixed && (\n (0.00008).toFixed(3) !== '0.000'\n || (0.9).toFixed(0) !== '1'\n || (1.255).toFixed(2) !== '1.25'\n || (1000000000000000128).toFixed(0) !== '1000000000000000128'\n );\n\n var toFixedHelpers = {\n base: 1e7,\n size: 6,\n data: [0, 0, 0, 0, 0, 0],\n multiply: function multiply(n, c) {\n var i = -1;\n var c2 = c;\n while (++i < toFixedHelpers.size) {\n c2 += n * toFixedHelpers.data[i];\n toFixedHelpers.data[i] = c2 % toFixedHelpers.base;\n c2 = floor(c2 / toFixedHelpers.base);\n }\n },\n divide: function divide(n) {\n var i = toFixedHelpers.size;\n var c = 0;\n while (--i >= 0) {\n c += toFixedHelpers.data[i];\n toFixedHelpers.data[i] = floor(c / n);\n c = (c % n) * toFixedHelpers.base;\n }\n },\n numToString: function numToString() {\n var i = toFixedHelpers.size;\n var s = '';\n while (--i >= 0) {\n if (s !== '' || i === 0 || toFixedHelpers.data[i] !== 0) {\n var t = $String(toFixedHelpers.data[i]);\n if (s === '') {\n s = t;\n } else {\n s += strSlice('0000000', 0, 7 - t.length) + t;\n }\n }\n }\n return s;\n },\n pow: function pow(x, n, acc) {\n return (n === 0 ? acc : (n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc)));\n },\n log: function log(x) {\n var n = 0;\n var x2 = x;\n while (x2 >= 4096) {\n n += 12;\n x2 /= 4096;\n }\n while (x2 >= 2) {\n n += 1;\n x2 /= 2;\n }\n return n;\n }\n };\n\n var toFixedShim = function toFixed(fractionDigits) {\n var f, x, s, m, e, z, j, k;\n\n // Test for NaN and round fractionDigits down\n f = $Number(fractionDigits);\n f = isActualNaN(f) ? 0 : floor(f);\n\n if (f < 0 || f > 20) {\n throw new RangeError('Number.toFixed called with invalid number of decimals');\n }\n\n x = $Number(this);\n\n if (isActualNaN(x)) {\n return 'NaN';\n }\n\n // If it is too big or small, return the string value of the number\n if (x <= -1e21 || x >= 1e21) {\n return $String(x);\n }\n\n s = '';\n\n if (x < 0) {\n s = '-';\n x = -x;\n }\n\n m = '0';\n\n if (x > 1e-21) {\n // 1e-21 < x < 1e21\n // -70 < log2(x) < 70\n e = toFixedHelpers.log(x * toFixedHelpers.pow(2, 69, 1)) - 69;\n z = (e < 0 ? x * toFixedHelpers.pow(2, -e, 1) : x / toFixedHelpers.pow(2, e, 1));\n z *= 0x10000000000000; // pow(2, 52);\n e = 52 - e;\n\n // -18 < e < 122\n // x = z / 2 ^ e\n if (e > 0) {\n toFixedHelpers.multiply(0, z);\n j = f;\n\n while (j >= 7) {\n toFixedHelpers.multiply(1e7, 0);\n j -= 7;\n }\n\n toFixedHelpers.multiply(toFixedHelpers.pow(10, j, 1), 0);\n j = e - 1;\n\n while (j >= 23) {\n toFixedHelpers.divide(1 << 23);\n j -= 23;\n }\n\n toFixedHelpers.divide(1 << j);\n toFixedHelpers.multiply(1, 1);\n toFixedHelpers.divide(2);\n m = toFixedHelpers.numToString();\n } else {\n toFixedHelpers.multiply(0, z);\n toFixedHelpers.multiply(1 << (-e), 0);\n m = toFixedHelpers.numToString() + strSlice('0.00000000000000000000', 2, 2 + f);\n }\n }\n\n if (f > 0) {\n k = m.length;\n\n if (k <= f) {\n m = s + strSlice('0.0000000000000000000', 0, f - k + 2) + m;\n } else {\n m = s + strSlice(m, 0, k - f) + '.' + strSlice(m, k - f);\n }\n } else {\n m = s + m;\n }\n\n return m;\n };\n defineProperties(NumberPrototype, { toFixed: toFixedShim }, hasToFixedBugs);\n\n var hasToExponentialRoundingBug = (function () {\n try {\n return (-6.9e-11).toExponential(4) !== '-6.9000e-11';\n } catch (e) {\n return false;\n }\n }());\n var toExponentialAllowsInfiniteDigits = (function () {\n try {\n (1).toExponential(Infinity);\n (1).toExponential(-Infinity);\n return true;\n } catch (e) {\n return false;\n }\n }());\n var originalToExponential = call.bind(NumberPrototype.toExponential);\n var numberToString = call.bind(NumberPrototype.toString);\n var numberValueOf = call.bind(NumberPrototype.valueOf);\n defineProperties(NumberPrototype, {\n toExponential: function toExponential(fractionDigits) {\n // 1: Let x be this Number value.\n var x = numberValueOf(this);\n\n if (typeof fractionDigits === 'undefined') {\n return originalToExponential(x);\n }\n var f = ES.ToInteger(fractionDigits);\n if (isActualNaN(x)) {\n return 'NaN';\n }\n\n if (f < 0 || f > 20) {\n if (!isFinite(f)) {\n // IE 6 doesn't throw in the native one\n throw new RangeError('toExponential() argument must be between 0 and 20');\n }\n // this will probably have thrown already\n return originalToExponential(x, f);\n }\n\n // only cases left are a finite receiver + in-range fractionDigits\n\n // implementation adapted from https://gist.github.com/SheetJSDev/1100ad56b9f856c95299ed0e068eea08\n\n // 4: Let s be the empty string\n var s = '';\n\n // 5: If x < 0\n if (x < 0) {\n s = '-';\n x = -x;\n }\n\n // 6: If x = +Infinity\n if (x === Infinity) {\n return s + 'Infinity';\n }\n\n // 7: If fractionDigits is not undefined and (f < 0 or f > 20), throw a RangeError exception.\n if (typeof fractionDigits !== 'undefined' && (f < 0 || f > 20)) {\n throw new RangeError('Fraction digits ' + fractionDigits + ' out of range');\n }\n\n var m = '';\n var e = 0;\n var c = '';\n var d = '';\n\n // 8: If x = 0 then\n if (x === 0) {\n e = 0;\n f = 0;\n m = '0';\n } else { // 9: Else, x != 0\n var L = log10(x);\n e = floor(L); // 10 ** e <= x and x < 10 ** (e+1)\n var n = 0;\n if (typeof fractionDigits !== 'undefined') { // eslint-disable-line no-negated-condition\n var w = pow(10, e - f); // x / 10 ** (f+1) < w and w <= x / 10 ** f\n n = round(x / w); // 10 ** f <= n and n < 10 ** (f+1)\n if (2 * x >= (((2 * n) + 1) * w)) {\n n += 1; // pick larger value\n }\n if (n >= pow(10, f + 1)) { // 10e-1 = 1e0\n n /= 10;\n e += 1;\n }\n } else {\n f = 16; // start from Math.ceil(Math.log10(Number.MAX_SAFE_INTEGER)) and loop down\n var guess_n = round(pow(10, L - e + f));\n var target_f = f;\n while (f-- > 0) {\n guess_n = round(pow(10, L - e + f));\n if (\n abs((guess_n * pow(10, e - f)) - x)\n <= abs((n * pow(10, e - target_f)) - x)\n ) {\n target_f = f;\n n = guess_n;\n }\n }\n }\n m = numberToString(n, 10);\n if (typeof fractionDigits === 'undefined') {\n while (strSlice(m, -1) === '0') {\n m = strSlice(m, 0, -1);\n d += 1;\n }\n }\n }\n\n // 10: If f != 0, then\n if (f !== 0) {\n m = strSlice(m, 0, 1) + '.' + strSlice(m, 1);\n }\n\n // 11: If e = 0, then\n if (e === 0) {\n c = '+';\n d = '0';\n } else { // 12: Else\n c = e > 0 ? '+' : '-';\n d = numberToString(abs(e), 10);\n }\n\n // 13: Let m be the concatenation of the four Strings m, \"e\", c, and d.\n m += 'e' + c + d;\n\n // 14: Return the concatenation of the Strings s and m.\n return s + m;\n }\n }, hasToExponentialRoundingBug || toExponentialAllowsInfiniteDigits);\n\n var hasToPrecisionUndefinedBug = (function () {\n try {\n return 1.0.toPrecision(undefined) === '1';\n } catch (e) {\n return true;\n }\n }());\n var originalToPrecision = call.bind(NumberPrototype.toPrecision);\n defineProperties(NumberPrototype, {\n toPrecision: function toPrecision(precision) {\n return typeof precision === 'undefined' ? originalToPrecision(this) : originalToPrecision(this, precision);\n }\n }, hasToPrecisionUndefinedBug);\n\n //\n // String\n // ======\n //\n\n // ES5 15.5.4.14\n // https://es5.github.io/#x15.5.4.14\n\n // [bugfix, IE lt 9, firefox 4, Konqueror, Opera, obscure browsers]\n // Many browsers do not split properly with regular expressions or they\n // do not perform the split correctly under obscure conditions.\n // See https://blog.stevenlevithan.com/archives/cross-browser-split\n // I've tested in many browsers and this seems to cover the deviant ones:\n // 'ab'.split(/(?:ab)*/) should be [\"\", \"\"], not [\"\"]\n // '.'.split(/(.?)(.?)/) should be [\"\", \".\", \"\", \"\"], not [\"\", \"\"]\n // 'tesst'.split(/(s)*/) should be [\"t\", undefined, \"e\", \"s\", \"t\"], not\n // [undefined, \"t\", undefined, \"e\", ...]\n // ''.split(/.?/) should be [], not [\"\"]\n // '.'.split(/()()/) should be [\".\"], not [\"\", \"\", \".\"]\n\n if (\n 'ab'.split(/(?:ab)*/).length !== 2\n || '.'.split(/(.?)(.?)/).length !== 4\n || 'tesst'.split(/(s)*/)[1] === 't'\n || 'test'.split(/(?:)/, -1).length !== 4\n || ''.split(/.?/).length\n || '.'.split(/()()/).length > 1\n ) {\n (function () {\n var compliantExecNpcg = typeof (/()??/).exec('')[1] === 'undefined'; // NPCG: nonparticipating capturing group\n var maxSafe32BitInt = pow(2, 32) - 1;\n\n StringPrototype.split = function split(separator, limit) {\n var string = String(this);\n if (typeof separator === 'undefined' && limit === 0) {\n return [];\n }\n\n // If `separator` is not a regex, use native split\n if (!isRegex(separator)) {\n return strSplit(this, separator, limit);\n }\n\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '')\n + (separator.multiline ? 'm' : '')\n + (separator.unicode ? 'u' : '') // in ES6\n + (separator.sticky ? 'y' : ''), // Firefox 3+ and ES6\n lastLastIndex = 0,\n // Make `global` and avoid `lastIndex` issues by working with a copy\n separator2, match, lastIndex, lastLength;\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n if (!compliantExecNpcg) {\n // Doesn't need flags gy, but they don't hurt\n separator2 = new RegExp('^' + separatorCopy.source + '$(?!\\\\s)', flags);\n }\n /* Values for `limit`, per the spec:\n * If undefined: 4294967295 // maxSafe32BitInt\n * If 0, Infinity, or NaN: 0\n * If positive number: limit = floor(limit); if (limit > 4294967295) limit -= 4294967296;\n * If negative number: 4294967296 - floor(abs(limit))\n * If other: Type-convert, then use the above rules\n */\n var splitLimit = typeof limit === 'undefined' ? maxSafe32BitInt : ES.ToUint32(limit);\n match = separatorCopy.exec(string);\n while (match) {\n // `separatorCopy.lastIndex` is not reliable cross-browser\n lastIndex = match.index + match[0].length;\n if (lastIndex > lastLastIndex) {\n pushCall(output, strSlice(string, lastLastIndex, match.index));\n // Fix browsers whose `exec` methods don't consistently return `undefined` for\n // nonparticipating capturing groups\n if (!compliantExecNpcg && match.length > 1) {\n /* eslint-disable no-loop-func */\n match[0].replace(separator2, function () {\n for (var i = 1; i < arguments.length - 2; i++) {\n if (typeof arguments[i] === 'undefined') {\n match[i] = void 0;\n }\n }\n });\n /* eslint-enable no-loop-func */\n }\n if (match.length > 1 && match.index < string.length) {\n array_push.apply(output, arraySlice(match, 1));\n }\n lastLength = match[0].length;\n lastLastIndex = lastIndex;\n if (output.length >= splitLimit) {\n break;\n }\n }\n if (separatorCopy.lastIndex === match.index) {\n separatorCopy.lastIndex++; // Avoid an infinite loop\n }\n match = separatorCopy.exec(string);\n }\n if (lastLastIndex === string.length) {\n if (lastLength || !separatorCopy.test('')) {\n pushCall(output, '');\n }\n } else {\n pushCall(output, strSlice(string, lastLastIndex));\n }\n return output.length > splitLimit ? arraySlice(output, 0, splitLimit) : output;\n };\n }());\n\n // [bugfix, chrome]\n // If separator is undefined, then the result array contains just one String,\n // which is the this value (converted to a String). If limit is not undefined,\n // then the output array is truncated so that it contains no more than limit\n // elements.\n // \"0\".split(undefined, 0) -> []\n } else if ('0'.split(void 0, 0).length) {\n StringPrototype.split = function split(separator, limit) {\n if (typeof separator === 'undefined' && limit === 0) {\n return [];\n }\n return strSplit(this, separator, limit);\n };\n }\n\n var str_replace = StringPrototype.replace;\n var replaceReportsGroupsCorrectly = (function () {\n var groups = [];\n 'x'.replace(/x(.)?/g, function (match, group) {\n pushCall(groups, group);\n });\n return groups.length === 1 && typeof groups[0] === 'undefined';\n }());\n\n if (!replaceReportsGroupsCorrectly) {\n StringPrototype.replace = function replace(searchValue, replaceValue) {\n var isFn = isCallable(replaceValue);\n var hasCapturingGroups = isRegex(searchValue) && (/\\)[*?]/).test(searchValue.source);\n if (!isFn || !hasCapturingGroups) {\n return str_replace.call(this, searchValue, replaceValue);\n }\n var wrappedReplaceValue = function (match) {\n var length = arguments.length;\n var originalLastIndex = searchValue.lastIndex;\n searchValue.lastIndex = 0; // eslint-disable-line no-param-reassign\n var args = searchValue.exec(match) || [];\n searchValue.lastIndex = originalLastIndex; // eslint-disable-line no-param-reassign\n pushCall(args, arguments[length - 2], arguments[length - 1]);\n return replaceValue.apply(this, args);\n };\n return str_replace.call(this, searchValue, wrappedReplaceValue);\n\n };\n }\n\n // ECMA-262, 3rd B.2.3\n // Not an ECMAScript standard, although ECMAScript 3rd Edition has a\n // non-normative section suggesting uniform semantics and it should be\n // normalized across all browsers\n // [bugfix, IE lt 9] IE < 9 substr() with negative value not working in IE\n var hasNegativeSubstrBug = ''.substr && '0b'.substr(-1) !== 'b';\n var string_substr = hasNegativeSubstrBug && call.bind(StringPrototype.substr);\n defineProperties(StringPrototype, {\n substr: function substr(start, length) {\n var normalizedStart = start;\n if (start < 0) {\n normalizedStart = max(this.length + start, 0);\n }\n return string_substr(this, normalizedStart, length);\n }\n }, hasNegativeSubstrBug);\n\n // ES5 15.5.4.20\n // whitespace from: https://es5.github.io/#x15.5.4.20\n var mvs = '\\u180E';\n var mvsIsWS = (/\\s/).test(mvs);\n var ws = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF'\n .replace(/\\S/g, ''); // remove the mongolian vowel separator (\\u180E) in modern engines\n var zeroWidth = '\\u200b';\n var wsRegexChars = '[' + ws + ']';\n var trimBeginRegexp = new RegExp('^' + wsRegexChars + wsRegexChars + '*');\n var trimEndRegexp = new RegExp(wsRegexChars + wsRegexChars + '*$');\n var hasTrimWhitespaceBug = StringPrototype.trim && (\n ws.trim() !== '' // if ws is not considered whitespace\n || zeroWidth.trim() === '' // if zero-width IS considered whitespace\n || mvs.trim() !== (mvsIsWS ? '' : mvs) // if MVS is either wrongly considered whitespace, or, wrongly considered NOT whitespace\n );\n defineProperties(StringPrototype, {\n // https://blog.stevenlevithan.com/archives/faster-trim-javascript\n // http://perfectionkills.com/whitespace-deviations/\n trim: function trim() {\n 'use strict';\n\n if (typeof this === 'undefined' || this === null) {\n throw new TypeError(\"can't convert \" + this + ' to object');\n }\n return $String(this).replace(trimBeginRegexp, '').replace(trimEndRegexp, '');\n }\n }, hasTrimWhitespaceBug);\n var trim = call.bind(String.prototype.trim);\n\n var hasLastIndexBug = StringPrototype.lastIndexOf && 'abcあい'.lastIndexOf('あい', 2) !== -1;\n defineProperties(StringPrototype, {\n lastIndexOf: function lastIndexOf(searchString) {\n if (typeof this === 'undefined' || this === null) {\n throw new TypeError(\"can't convert \" + this + ' to object');\n }\n var S = $String(this);\n var searchStr = $String(searchString);\n var numPos = arguments.length > 1 ? $Number(arguments[1]) : NaN;\n var pos = isActualNaN(numPos) ? Infinity : ES.ToInteger(numPos);\n var start = min(max(pos, 0), S.length);\n var searchLen = searchStr.length;\n var k = start + searchLen;\n while (k > 0) {\n k = max(0, k - searchLen);\n var index = strIndexOf(strSlice(S, k, start + searchLen), searchStr);\n if (index !== -1) {\n return k + index;\n }\n }\n return -1;\n }\n }, hasLastIndexBug);\n\n var originalLastIndexOf = StringPrototype.lastIndexOf;\n defineProperties(StringPrototype, {\n lastIndexOf: function lastIndexOf(searchString) {\n return originalLastIndexOf.apply(this, arguments);\n }\n }, StringPrototype.lastIndexOf.length !== 1);\n\n var hexRegex = /^[-+]?0[xX]/;\n\n // ES-5 15.1.2.2\n if (\n parseInt(ws + '08') !== 8 // eslint-disable-line radix\n || parseInt(ws + '0x16') !== 22 // eslint-disable-line radix\n || (mvsIsWS ? parseInt(mvs + 1) !== 1 : !isNaN(parseInt(mvs + 1))) // eslint-disable-line radix\n ) {\n // eslint-disable-next-line no-global-assign, no-implicit-globals\n parseInt = (function (origParseInt) {\n return function parseInt(str, radix) {\n if (this instanceof parseInt) { new origParseInt(); } // eslint-disable-line new-cap, no-new, max-statements-per-line\n var string = trim(String(str));\n var defaultedRadix = $Number(radix) || (hexRegex.test(string) ? 16 : 10);\n return origParseInt(string, defaultedRadix);\n };\n }(parseInt));\n }\n // Edge 15-18\n var parseIntFailsToThrowOnBoxedSymbols = (function () {\n if (typeof Symbol !== 'function') {\n return false;\n }\n try {\n // eslint-disable-next-line radix\n parseInt(Object(Symbol.iterator));\n return true;\n } catch (e) { /**/ }\n\n try {\n // eslint-disable-next-line radix\n parseInt(Symbol.iterator);\n return true;\n } catch (e) { /**/ }\n\n return false;\n }());\n if (parseIntFailsToThrowOnBoxedSymbols) {\n var symbolValueOf = Symbol.prototype.valueOf;\n // eslint-disable-next-line no-global-assign, no-implicit-globals\n parseInt = (function (origParseInt) {\n return function parseInt(str, radix) {\n if (this instanceof parseInt) { new origParseInt(); } // eslint-disable-line new-cap, no-new, max-statements-per-line\n var isSym = typeof str === 'symbol';\n if (!isSym && str && typeof str === 'object') {\n try {\n symbolValueOf.call(str);\n isSym = true;\n } catch (e) { /**/ }\n }\n if (isSym) {\n // handle Symbols in node 8.3/8.4\n // eslint-disable-next-line no-implicit-coercion, no-unused-expressions\n '' + str; // jscs:ignore disallowImplicitTypeConversion\n }\n var string = trim(String(str));\n var defaultedRadix = $Number(radix) || (hexRegex.test(string) ? 16 : 10);\n return origParseInt(string, defaultedRadix);\n };\n }(parseInt));\n }\n\n // https://es5.github.io/#x15.1.2.3\n if (1 / parseFloat('-0') !== -Infinity) {\n // eslint-disable-next-line no-global-assign, no-implicit-globals, no-native-reassign\n parseFloat = (function (origParseFloat) {\n return function parseFloat(string) {\n var inputString = trim(String(string));\n var result = origParseFloat(inputString);\n return result === 0 && strSlice(inputString, 0, 1) === '-' ? -0 : result;\n };\n }(parseFloat));\n }\n\n if (String(new RangeError('test')) !== 'RangeError: test') {\n var errorToStringShim = function toString() {\n if (typeof this === 'undefined' || this === null) {\n throw new TypeError(\"can't convert \" + this + ' to object');\n }\n var name = this.name;\n if (typeof name === 'undefined') {\n name = 'Error';\n } else if (typeof name !== 'string') {\n name = $String(name);\n }\n var msg = this.message;\n if (typeof msg === 'undefined') {\n msg = '';\n } else if (typeof msg !== 'string') {\n msg = $String(msg);\n }\n if (!name) {\n return msg;\n }\n if (!msg) {\n return name;\n }\n return name + ': ' + msg;\n };\n // can't use defineProperties here because of toString enumeration issue in IE <= 8\n Error.prototype.toString = errorToStringShim;\n }\n\n if (supportsDescriptors) {\n var ensureNonEnumerable = function (obj, prop) {\n if (isEnum(obj, prop)) {\n var desc = Object.getOwnPropertyDescriptor(obj, prop);\n if (desc.configurable) {\n desc.enumerable = false;\n Object.defineProperty(obj, prop, desc);\n }\n }\n };\n ensureNonEnumerable(Error.prototype, 'message');\n if (Error.prototype.message !== '') {\n Error.prototype.message = '';\n }\n ensureNonEnumerable(Error.prototype, 'name');\n }\n\n if (String(/a/mig) !== '/a/gim') {\n var regexToString = function toString() {\n var str = '/' + this.source + '/';\n if (this.global) {\n str += 'g';\n }\n if (this.ignoreCase) {\n str += 'i';\n }\n if (this.multiline) {\n str += 'm';\n }\n return str;\n };\n // can't use defineProperties here because of toString enumeration issue in IE <= 8\n RegExp.prototype.toString = regexToString;\n }\n}));\n","/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n","/*! https://mths.be/he v1.2.0 by @mathias | MIT license */\n;(function(root) {\n\n\t// Detect free variables `exports`.\n\tvar freeExports = typeof exports == 'object' && exports;\n\n\t// Detect free variable `module`.\n\tvar freeModule = typeof module == 'object' && module &&\n\t\tmodule.exports == freeExports && module;\n\n\t// Detect free variable `global`, from Node.js or Browserified code,\n\t// and use it as `root`.\n\tvar freeGlobal = typeof global == 'object' && global;\n\tif (freeGlobal.global === freeGlobal || freeGlobal.window === freeGlobal) {\n\t\troot = freeGlobal;\n\t}\n\n\t/*--------------------------------------------------------------------------*/\n\n\t// All astral symbols.\n\tvar regexAstralSymbols = /[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g;\n\t// All ASCII symbols (not just printable ASCII) except those listed in the\n\t// first column of the overrides table.\n\t// https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides\n\tvar regexAsciiWhitelist = /[\\x01-\\x7F]/g;\n\t// All BMP symbols that are not ASCII newlines, printable ASCII symbols, or\n\t// code points listed in the first column of the overrides table on\n\t// https://html.spec.whatwg.org/multipage/syntax.html#table-charref-overrides.\n\tvar regexBmpWhitelist = /[\\x01-\\t\\x0B\\f\\x0E-\\x1F\\x7F\\x81\\x8D\\x8F\\x90\\x9D\\xA0-\\uFFFF]/g;\n\n\tvar regexEncodeNonAscii = /<\\u20D2|=\\u20E5|>\\u20D2|\\u205F\\u200A|\\u219D\\u0338|\\u2202\\u0338|\\u2220\\u20D2|\\u2229\\uFE00|\\u222A\\uFE00|\\u223C\\u20D2|\\u223D\\u0331|\\u223E\\u0333|\\u2242\\u0338|\\u224B\\u0338|\\u224D\\u20D2|\\u224E\\u0338|\\u224F\\u0338|\\u2250\\u0338|\\u2261\\u20E5|\\u2264\\u20D2|\\u2265\\u20D2|\\u2266\\u0338|\\u2267\\u0338|\\u2268\\uFE00|\\u2269\\uFE00|\\u226A\\u0338|\\u226A\\u20D2|\\u226B\\u0338|\\u226B\\u20D2|\\u227F\\u0338|\\u2282\\u20D2|\\u2283\\u20D2|\\u228A\\uFE00|\\u228B\\uFE00|\\u228F\\u0338|\\u2290\\u0338|\\u2293\\uFE00|\\u2294\\uFE00|\\u22B4\\u20D2|\\u22B5\\u20D2|\\u22D8\\u0338|\\u22D9\\u0338|\\u22DA\\uFE00|\\u22DB\\uFE00|\\u22F5\\u0338|\\u22F9\\u0338|\\u2933\\u0338|\\u29CF\\u0338|\\u29D0\\u0338|\\u2A6D\\u0338|\\u2A70\\u0338|\\u2A7D\\u0338|\\u2A7E\\u0338|\\u2AA1\\u0338|\\u2AA2\\u0338|\\u2AAC\\uFE00|\\u2AAD\\uFE00|\\u2AAF\\u0338|\\u2AB0\\u0338|\\u2AC5\\u0338|\\u2AC6\\u0338|\\u2ACB\\uFE00|\\u2ACC\\uFE00|\\u2AFD\\u20E5|[\\xA0-\\u0113\\u0116-\\u0122\\u0124-\\u012B\\u012E-\\u014D\\u0150-\\u017E\\u0192\\u01B5\\u01F5\\u0237\\u02C6\\u02C7\\u02D8-\\u02DD\\u0311\\u0391-\\u03A1\\u03A3-\\u03A9\\u03B1-\\u03C9\\u03D1\\u03D2\\u03D5\\u03D6\\u03DC\\u03DD\\u03F0\\u03F1\\u03F5\\u03F6\\u0401-\\u040C\\u040E-\\u044F\\u0451-\\u045C\\u045E\\u045F\\u2002-\\u2005\\u2007-\\u2010\\u2013-\\u2016\\u2018-\\u201A\\u201C-\\u201E\\u2020-\\u2022\\u2025\\u2026\\u2030-\\u2035\\u2039\\u203A\\u203E\\u2041\\u2043\\u2044\\u204F\\u2057\\u205F-\\u2063\\u20AC\\u20DB\\u20DC\\u2102\\u2105\\u210A-\\u2113\\u2115-\\u211E\\u2122\\u2124\\u2127-\\u2129\\u212C\\u212D\\u212F-\\u2131\\u2133-\\u2138\\u2145-\\u2148\\u2153-\\u215E\\u2190-\\u219B\\u219D-\\u21A7\\u21A9-\\u21AE\\u21B0-\\u21B3\\u21B5-\\u21B7\\u21BA-\\u21DB\\u21DD\\u21E4\\u21E5\\u21F5\\u21FD-\\u2205\\u2207-\\u2209\\u220B\\u220C\\u220F-\\u2214\\u2216-\\u2218\\u221A\\u221D-\\u2238\\u223A-\\u2257\\u2259\\u225A\\u225C\\u225F-\\u2262\\u2264-\\u228B\\u228D-\\u229B\\u229D-\\u22A5\\u22A7-\\u22B0\\u22B2-\\u22BB\\u22BD-\\u22DB\\u22DE-\\u22E3\\u22E6-\\u22F7\\u22F9-\\u22FE\\u2305\\u2306\\u2308-\\u2310\\u2312\\u2313\\u2315\\u2316\\u231C-\\u231F\\u2322\\u2323\\u232D\\u232E\\u2336\\u233D\\u233F\\u237C\\u23B0\\u23B1\\u23B4-\\u23B6\\u23DC-\\u23DF\\u23E2\\u23E7\\u2423\\u24C8\\u2500\\u2502\\u250C\\u2510\\u2514\\u2518\\u251C\\u2524\\u252C\\u2534\\u253C\\u2550-\\u256C\\u2580\\u2584\\u2588\\u2591-\\u2593\\u25A1\\u25AA\\u25AB\\u25AD\\u25AE\\u25B1\\u25B3-\\u25B5\\u25B8\\u25B9\\u25BD-\\u25BF\\u25C2\\u25C3\\u25CA\\u25CB\\u25EC\\u25EF\\u25F8-\\u25FC\\u2605\\u2606\\u260E\\u2640\\u2642\\u2660\\u2663\\u2665\\u2666\\u266A\\u266D-\\u266F\\u2713\\u2717\\u2720\\u2736\\u2758\\u2772\\u2773\\u27C8\\u27C9\\u27E6-\\u27ED\\u27F5-\\u27FA\\u27FC\\u27FF\\u2902-\\u2905\\u290C-\\u2913\\u2916\\u2919-\\u2920\\u2923-\\u292A\\u2933\\u2935-\\u2939\\u293C\\u293D\\u2945\\u2948-\\u294B\\u294E-\\u2976\\u2978\\u2979\\u297B-\\u297F\\u2985\\u2986\\u298B-\\u2996\\u299A\\u299C\\u299D\\u29A4-\\u29B7\\u29B9\\u29BB\\u29BC\\u29BE-\\u29C5\\u29C9\\u29CD-\\u29D0\\u29DC-\\u29DE\\u29E3-\\u29E5\\u29EB\\u29F4\\u29F6\\u2A00-\\u2A02\\u2A04\\u2A06\\u2A0C\\u2A0D\\u2A10-\\u2A17\\u2A22-\\u2A27\\u2A29\\u2A2A\\u2A2D-\\u2A31\\u2A33-\\u2A3C\\u2A3F\\u2A40\\u2A42-\\u2A4D\\u2A50\\u2A53-\\u2A58\\u2A5A-\\u2A5D\\u2A5F\\u2A66\\u2A6A\\u2A6D-\\u2A75\\u2A77-\\u2A9A\\u2A9D-\\u2AA2\\u2AA4-\\u2AB0\\u2AB3-\\u2AC8\\u2ACB\\u2ACC\\u2ACF-\\u2ADB\\u2AE4\\u2AE6-\\u2AE9\\u2AEB-\\u2AF3\\u2AFD\\uFB00-\\uFB04]|\\uD835[\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDCCF\\uDD04\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDD6B]/g;\n\tvar encodeMap = {'\\xAD':'shy','\\u200C':'zwnj','\\u200D':'zwj','\\u200E':'lrm','\\u2063':'ic','\\u2062':'it','\\u2061':'af','\\u200F':'rlm','\\u200B':'ZeroWidthSpace','\\u2060':'NoBreak','\\u0311':'DownBreve','\\u20DB':'tdot','\\u20DC':'DotDot','\\t':'Tab','\\n':'NewLine','\\u2008':'puncsp','\\u205F':'MediumSpace','\\u2009':'thinsp','\\u200A':'hairsp','\\u2004':'emsp13','\\u2002':'ensp','\\u2005':'emsp14','\\u2003':'emsp','\\u2007':'numsp','\\xA0':'nbsp','\\u205F\\u200A':'ThickSpace','\\u203E':'oline','_':'lowbar','\\u2010':'dash','\\u2013':'ndash','\\u2014':'mdash','\\u2015':'horbar',',':'comma',';':'semi','\\u204F':'bsemi',':':'colon','\\u2A74':'Colone','!':'excl','\\xA1':'iexcl','?':'quest','\\xBF':'iquest','.':'period','\\u2025':'nldr','\\u2026':'mldr','\\xB7':'middot','\\'':'apos','\\u2018':'lsquo','\\u2019':'rsquo','\\u201A':'sbquo','\\u2039':'lsaquo','\\u203A':'rsaquo','\"':'quot','\\u201C':'ldquo','\\u201D':'rdquo','\\u201E':'bdquo','\\xAB':'laquo','\\xBB':'raquo','(':'lpar',')':'rpar','[':'lsqb',']':'rsqb','{':'lcub','}':'rcub','\\u2308':'lceil','\\u2309':'rceil','\\u230A':'lfloor','\\u230B':'rfloor','\\u2985':'lopar','\\u2986':'ropar','\\u298B':'lbrke','\\u298C':'rbrke','\\u298D':'lbrkslu','\\u298E':'rbrksld','\\u298F':'lbrksld','\\u2990':'rbrkslu','\\u2991':'langd','\\u2992':'rangd','\\u2993':'lparlt','\\u2994':'rpargt','\\u2995':'gtlPar','\\u2996':'ltrPar','\\u27E6':'lobrk','\\u27E7':'robrk','\\u27E8':'lang','\\u27E9':'rang','\\u27EA':'Lang','\\u27EB':'Rang','\\u27EC':'loang','\\u27ED':'roang','\\u2772':'lbbrk','\\u2773':'rbbrk','\\u2016':'Vert','\\xA7':'sect','\\xB6':'para','@':'commat','*':'ast','/':'sol','undefined':null,'&':'amp','#':'num','%':'percnt','\\u2030':'permil','\\u2031':'pertenk','\\u2020':'dagger','\\u2021':'Dagger','\\u2022':'bull','\\u2043':'hybull','\\u2032':'prime','\\u2033':'Prime','\\u2034':'tprime','\\u2057':'qprime','\\u2035':'bprime','\\u2041':'caret','`':'grave','\\xB4':'acute','\\u02DC':'tilde','^':'Hat','\\xAF':'macr','\\u02D8':'breve','\\u02D9':'dot','\\xA8':'die','\\u02DA':'ring','\\u02DD':'dblac','\\xB8':'cedil','\\u02DB':'ogon','\\u02C6':'circ','\\u02C7':'caron','\\xB0':'deg','\\xA9':'copy','\\xAE':'reg','\\u2117':'copysr','\\u2118':'wp','\\u211E':'rx','\\u2127':'mho','\\u2129':'iiota','\\u2190':'larr','\\u219A':'nlarr','\\u2192':'rarr','\\u219B':'nrarr','\\u2191':'uarr','\\u2193':'darr','\\u2194':'harr','\\u21AE':'nharr','\\u2195':'varr','\\u2196':'nwarr','\\u2197':'nearr','\\u2198':'searr','\\u2199':'swarr','\\u219D':'rarrw','\\u219D\\u0338':'nrarrw','\\u219E':'Larr','\\u219F':'Uarr','\\u21A0':'Rarr','\\u21A1':'Darr','\\u21A2':'larrtl','\\u21A3':'rarrtl','\\u21A4':'mapstoleft','\\u21A5':'mapstoup','\\u21A6':'map','\\u21A7':'mapstodown','\\u21A9':'larrhk','\\u21AA':'rarrhk','\\u21AB':'larrlp','\\u21AC':'rarrlp','\\u21AD':'harrw','\\u21B0':'lsh','\\u21B1':'rsh','\\u21B2':'ldsh','\\u21B3':'rdsh','\\u21B5':'crarr','\\u21B6':'cularr','\\u21B7':'curarr','\\u21BA':'olarr','\\u21BB':'orarr','\\u21BC':'lharu','\\u21BD':'lhard','\\u21BE':'uharr','\\u21BF':'uharl','\\u21C0':'rharu','\\u21C1':'rhard','\\u21C2':'dharr','\\u21C3':'dharl','\\u21C4':'rlarr','\\u21C5':'udarr','\\u21C6':'lrarr','\\u21C7':'llarr','\\u21C8':'uuarr','\\u21C9':'rrarr','\\u21CA':'ddarr','\\u21CB':'lrhar','\\u21CC':'rlhar','\\u21D0':'lArr','\\u21CD':'nlArr','\\u21D1':'uArr','\\u21D2':'rArr','\\u21CF':'nrArr','\\u21D3':'dArr','\\u21D4':'iff','\\u21CE':'nhArr','\\u21D5':'vArr','\\u21D6':'nwArr','\\u21D7':'neArr','\\u21D8':'seArr','\\u21D9':'swArr','\\u21DA':'lAarr','\\u21DB':'rAarr','\\u21DD':'zigrarr','\\u21E4':'larrb','\\u21E5':'rarrb','\\u21F5':'duarr','\\u21FD':'loarr','\\u21FE':'roarr','\\u21FF':'hoarr','\\u2200':'forall','\\u2201':'comp','\\u2202':'part','\\u2202\\u0338':'npart','\\u2203':'exist','\\u2204':'nexist','\\u2205':'empty','\\u2207':'Del','\\u2208':'in','\\u2209':'notin','\\u220B':'ni','\\u220C':'notni','\\u03F6':'bepsi','\\u220F':'prod','\\u2210':'coprod','\\u2211':'sum','+':'plus','\\xB1':'pm','\\xF7':'div','\\xD7':'times','<':'lt','\\u226E':'nlt','<\\u20D2':'nvlt','=':'equals','\\u2260':'ne','=\\u20E5':'bne','\\u2A75':'Equal','>':'gt','\\u226F':'ngt','>\\u20D2':'nvgt','\\xAC':'not','|':'vert','\\xA6':'brvbar','\\u2212':'minus','\\u2213':'mp','\\u2214':'plusdo','\\u2044':'frasl','\\u2216':'setmn','\\u2217':'lowast','\\u2218':'compfn','\\u221A':'Sqrt','\\u221D':'prop','\\u221E':'infin','\\u221F':'angrt','\\u2220':'ang','\\u2220\\u20D2':'nang','\\u2221':'angmsd','\\u2222':'angsph','\\u2223':'mid','\\u2224':'nmid','\\u2225':'par','\\u2226':'npar','\\u2227':'and','\\u2228':'or','\\u2229':'cap','\\u2229\\uFE00':'caps','\\u222A':'cup','\\u222A\\uFE00':'cups','\\u222B':'int','\\u222C':'Int','\\u222D':'tint','\\u2A0C':'qint','\\u222E':'oint','\\u222F':'Conint','\\u2230':'Cconint','\\u2231':'cwint','\\u2232':'cwconint','\\u2233':'awconint','\\u2234':'there4','\\u2235':'becaus','\\u2236':'ratio','\\u2237':'Colon','\\u2238':'minusd','\\u223A':'mDDot','\\u223B':'homtht','\\u223C':'sim','\\u2241':'nsim','\\u223C\\u20D2':'nvsim','\\u223D':'bsim','\\u223D\\u0331':'race','\\u223E':'ac','\\u223E\\u0333':'acE','\\u223F':'acd','\\u2240':'wr','\\u2242':'esim','\\u2242\\u0338':'nesim','\\u2243':'sime','\\u2244':'nsime','\\u2245':'cong','\\u2247':'ncong','\\u2246':'simne','\\u2248':'ap','\\u2249':'nap','\\u224A':'ape','\\u224B':'apid','\\u224B\\u0338':'napid','\\u224C':'bcong','\\u224D':'CupCap','\\u226D':'NotCupCap','\\u224D\\u20D2':'nvap','\\u224E':'bump','\\u224E\\u0338':'nbump','\\u224F':'bumpe','\\u224F\\u0338':'nbumpe','\\u2250':'doteq','\\u2250\\u0338':'nedot','\\u2251':'eDot','\\u2252':'efDot','\\u2253':'erDot','\\u2254':'colone','\\u2255':'ecolon','\\u2256':'ecir','\\u2257':'cire','\\u2259':'wedgeq','\\u225A':'veeeq','\\u225C':'trie','\\u225F':'equest','\\u2261':'equiv','\\u2262':'nequiv','\\u2261\\u20E5':'bnequiv','\\u2264':'le','\\u2270':'nle','\\u2264\\u20D2':'nvle','\\u2265':'ge','\\u2271':'nge','\\u2265\\u20D2':'nvge','\\u2266':'lE','\\u2266\\u0338':'nlE','\\u2267':'gE','\\u2267\\u0338':'ngE','\\u2268\\uFE00':'lvnE','\\u2268':'lnE','\\u2269':'gnE','\\u2269\\uFE00':'gvnE','\\u226A':'ll','\\u226A\\u0338':'nLtv','\\u226A\\u20D2':'nLt','\\u226B':'gg','\\u226B\\u0338':'nGtv','\\u226B\\u20D2':'nGt','\\u226C':'twixt','\\u2272':'lsim','\\u2274':'nlsim','\\u2273':'gsim','\\u2275':'ngsim','\\u2276':'lg','\\u2278':'ntlg','\\u2277':'gl','\\u2279':'ntgl','\\u227A':'pr','\\u2280':'npr','\\u227B':'sc','\\u2281':'nsc','\\u227C':'prcue','\\u22E0':'nprcue','\\u227D':'sccue','\\u22E1':'nsccue','\\u227E':'prsim','\\u227F':'scsim','\\u227F\\u0338':'NotSucceedsTilde','\\u2282':'sub','\\u2284':'nsub','\\u2282\\u20D2':'vnsub','\\u2283':'sup','\\u2285':'nsup','\\u2283\\u20D2':'vnsup','\\u2286':'sube','\\u2288':'nsube','\\u2287':'supe','\\u2289':'nsupe','\\u228A\\uFE00':'vsubne','\\u228A':'subne','\\u228B\\uFE00':'vsupne','\\u228B':'supne','\\u228D':'cupdot','\\u228E':'uplus','\\u228F':'sqsub','\\u228F\\u0338':'NotSquareSubset','\\u2290':'sqsup','\\u2290\\u0338':'NotSquareSuperset','\\u2291':'sqsube','\\u22E2':'nsqsube','\\u2292':'sqsupe','\\u22E3':'nsqsupe','\\u2293':'sqcap','\\u2293\\uFE00':'sqcaps','\\u2294':'sqcup','\\u2294\\uFE00':'sqcups','\\u2295':'oplus','\\u2296':'ominus','\\u2297':'otimes','\\u2298':'osol','\\u2299':'odot','\\u229A':'ocir','\\u229B':'oast','\\u229D':'odash','\\u229E':'plusb','\\u229F':'minusb','\\u22A0':'timesb','\\u22A1':'sdotb','\\u22A2':'vdash','\\u22AC':'nvdash','\\u22A3':'dashv','\\u22A4':'top','\\u22A5':'bot','\\u22A7':'models','\\u22A8':'vDash','\\u22AD':'nvDash','\\u22A9':'Vdash','\\u22AE':'nVdash','\\u22AA':'Vvdash','\\u22AB':'VDash','\\u22AF':'nVDash','\\u22B0':'prurel','\\u22B2':'vltri','\\u22EA':'nltri','\\u22B3':'vrtri','\\u22EB':'nrtri','\\u22B4':'ltrie','\\u22EC':'nltrie','\\u22B4\\u20D2':'nvltrie','\\u22B5':'rtrie','\\u22ED':'nrtrie','\\u22B5\\u20D2':'nvrtrie','\\u22B6':'origof','\\u22B7':'imof','\\u22B8':'mumap','\\u22B9':'hercon','\\u22BA':'intcal','\\u22BB':'veebar','\\u22BD':'barvee','\\u22BE':'angrtvb','\\u22BF':'lrtri','\\u22C0':'Wedge','\\u22C1':'Vee','\\u22C2':'xcap','\\u22C3':'xcup','\\u22C4':'diam','\\u22C5':'sdot','\\u22C6':'Star','\\u22C7':'divonx','\\u22C8':'bowtie','\\u22C9':'ltimes','\\u22CA':'rtimes','\\u22CB':'lthree','\\u22CC':'rthree','\\u22CD':'bsime','\\u22CE':'cuvee','\\u22CF':'cuwed','\\u22D0':'Sub','\\u22D1':'Sup','\\u22D2':'Cap','\\u22D3':'Cup','\\u22D4':'fork','\\u22D5':'epar','\\u22D6':'ltdot','\\u22D7':'gtdot','\\u22D8':'Ll','\\u22D8\\u0338':'nLl','\\u22D9':'Gg','\\u22D9\\u0338':'nGg','\\u22DA\\uFE00':'lesg','\\u22DA':'leg','\\u22DB':'gel','\\u22DB\\uFE00':'gesl','\\u22DE':'cuepr','\\u22DF':'cuesc','\\u22E6':'lnsim','\\u22E7':'gnsim','\\u22E8':'prnsim','\\u22E9':'scnsim','\\u22EE':'vellip','\\u22EF':'ctdot','\\u22F0':'utdot','\\u22F1':'dtdot','\\u22F2':'disin','\\u22F3':'isinsv','\\u22F4':'isins','\\u22F5':'isindot','\\u22F5\\u0338':'notindot','\\u22F6':'notinvc','\\u22F7':'notinvb','\\u22F9':'isinE','\\u22F9\\u0338':'notinE','\\u22FA':'nisd','\\u22FB':'xnis','\\u22FC':'nis','\\u22FD':'notnivc','\\u22FE':'notnivb','\\u2305':'barwed','\\u2306':'Barwed','\\u230C':'drcrop','\\u230D':'dlcrop','\\u230E':'urcrop','\\u230F':'ulcrop','\\u2310':'bnot','\\u2312':'profline','\\u2313':'profsurf','\\u2315':'telrec','\\u2316':'target','\\u231C':'ulcorn','\\u231D':'urcorn','\\u231E':'dlcorn','\\u231F':'drcorn','\\u2322':'frown','\\u2323':'smile','\\u232D':'cylcty','\\u232E':'profalar','\\u2336':'topbot','\\u233D':'ovbar','\\u233F':'solbar','\\u237C':'angzarr','\\u23B0':'lmoust','\\u23B1':'rmoust','\\u23B4':'tbrk','\\u23B5':'bbrk','\\u23B6':'bbrktbrk','\\u23DC':'OverParenthesis','\\u23DD':'UnderParenthesis','\\u23DE':'OverBrace','\\u23DF':'UnderBrace','\\u23E2':'trpezium','\\u23E7':'elinters','\\u2423':'blank','\\u2500':'boxh','\\u2502':'boxv','\\u250C':'boxdr','\\u2510':'boxdl','\\u2514':'boxur','\\u2518':'boxul','\\u251C':'boxvr','\\u2524':'boxvl','\\u252C':'boxhd','\\u2534':'boxhu','\\u253C':'boxvh','\\u2550':'boxH','\\u2551':'boxV','\\u2552':'boxdR','\\u2553':'boxDr','\\u2554':'boxDR','\\u2555':'boxdL','\\u2556':'boxDl','\\u2557':'boxDL','\\u2558':'boxuR','\\u2559':'boxUr','\\u255A':'boxUR','\\u255B':'boxuL','\\u255C':'boxUl','\\u255D':'boxUL','\\u255E':'boxvR','\\u255F':'boxVr','\\u2560':'boxVR','\\u2561':'boxvL','\\u2562':'boxVl','\\u2563':'boxVL','\\u2564':'boxHd','\\u2565':'boxhD','\\u2566':'boxHD','\\u2567':'boxHu','\\u2568':'boxhU','\\u2569':'boxHU','\\u256A':'boxvH','\\u256B':'boxVh','\\u256C':'boxVH','\\u2580':'uhblk','\\u2584':'lhblk','\\u2588':'block','\\u2591':'blk14','\\u2592':'blk12','\\u2593':'blk34','\\u25A1':'squ','\\u25AA':'squf','\\u25AB':'EmptyVerySmallSquare','\\u25AD':'rect','\\u25AE':'marker','\\u25B1':'fltns','\\u25B3':'xutri','\\u25B4':'utrif','\\u25B5':'utri','\\u25B8':'rtrif','\\u25B9':'rtri','\\u25BD':'xdtri','\\u25BE':'dtrif','\\u25BF':'dtri','\\u25C2':'ltrif','\\u25C3':'ltri','\\u25CA':'loz','\\u25CB':'cir','\\u25EC':'tridot','\\u25EF':'xcirc','\\u25F8':'ultri','\\u25F9':'urtri','\\u25FA':'lltri','\\u25FB':'EmptySmallSquare','\\u25FC':'FilledSmallSquare','\\u2605':'starf','\\u2606':'star','\\u260E':'phone','\\u2640':'female','\\u2642':'male','\\u2660':'spades','\\u2663':'clubs','\\u2665':'hearts','\\u2666':'diams','\\u266A':'sung','\\u2713':'check','\\u2717':'cross','\\u2720':'malt','\\u2736':'sext','\\u2758':'VerticalSeparator','\\u27C8':'bsolhsub','\\u27C9':'suphsol','\\u27F5':'xlarr','\\u27F6':'xrarr','\\u27F7':'xharr','\\u27F8':'xlArr','\\u27F9':'xrArr','\\u27FA':'xhArr','\\u27FC':'xmap','\\u27FF':'dzigrarr','\\u2902':'nvlArr','\\u2903':'nvrArr','\\u2904':'nvHarr','\\u2905':'Map','\\u290C':'lbarr','\\u290D':'rbarr','\\u290E':'lBarr','\\u290F':'rBarr','\\u2910':'RBarr','\\u2911':'DDotrahd','\\u2912':'UpArrowBar','\\u2913':'DownArrowBar','\\u2916':'Rarrtl','\\u2919':'latail','\\u291A':'ratail','\\u291B':'lAtail','\\u291C':'rAtail','\\u291D':'larrfs','\\u291E':'rarrfs','\\u291F':'larrbfs','\\u2920':'rarrbfs','\\u2923':'nwarhk','\\u2924':'nearhk','\\u2925':'searhk','\\u2926':'swarhk','\\u2927':'nwnear','\\u2928':'toea','\\u2929':'tosa','\\u292A':'swnwar','\\u2933':'rarrc','\\u2933\\u0338':'nrarrc','\\u2935':'cudarrr','\\u2936':'ldca','\\u2937':'rdca','\\u2938':'cudarrl','\\u2939':'larrpl','\\u293C':'curarrm','\\u293D':'cularrp','\\u2945':'rarrpl','\\u2948':'harrcir','\\u2949':'Uarrocir','\\u294A':'lurdshar','\\u294B':'ldrushar','\\u294E':'LeftRightVector','\\u294F':'RightUpDownVector','\\u2950':'DownLeftRightVector','\\u2951':'LeftUpDownVector','\\u2952':'LeftVectorBar','\\u2953':'RightVectorBar','\\u2954':'RightUpVectorBar','\\u2955':'RightDownVectorBar','\\u2956':'DownLeftVectorBar','\\u2957':'DownRightVectorBar','\\u2958':'LeftUpVectorBar','\\u2959':'LeftDownVectorBar','\\u295A':'LeftTeeVector','\\u295B':'RightTeeVector','\\u295C':'RightUpTeeVector','\\u295D':'RightDownTeeVector','\\u295E':'DownLeftTeeVector','\\u295F':'DownRightTeeVector','\\u2960':'LeftUpTeeVector','\\u2961':'LeftDownTeeVector','\\u2962':'lHar','\\u2963':'uHar','\\u2964':'rHar','\\u2965':'dHar','\\u2966':'luruhar','\\u2967':'ldrdhar','\\u2968':'ruluhar','\\u2969':'rdldhar','\\u296A':'lharul','\\u296B':'llhard','\\u296C':'rharul','\\u296D':'lrhard','\\u296E':'udhar','\\u296F':'duhar','\\u2970':'RoundImplies','\\u2971':'erarr','\\u2972':'simrarr','\\u2973':'larrsim','\\u2974':'rarrsim','\\u2975':'rarrap','\\u2976':'ltlarr','\\u2978':'gtrarr','\\u2979':'subrarr','\\u297B':'suplarr','\\u297C':'lfisht','\\u297D':'rfisht','\\u297E':'ufisht','\\u297F':'dfisht','\\u299A':'vzigzag','\\u299C':'vangrt','\\u299D':'angrtvbd','\\u29A4':'ange','\\u29A5':'range','\\u29A6':'dwangle','\\u29A7':'uwangle','\\u29A8':'angmsdaa','\\u29A9':'angmsdab','\\u29AA':'angmsdac','\\u29AB':'angmsdad','\\u29AC':'angmsdae','\\u29AD':'angmsdaf','\\u29AE':'angmsdag','\\u29AF':'angmsdah','\\u29B0':'bemptyv','\\u29B1':'demptyv','\\u29B2':'cemptyv','\\u29B3':'raemptyv','\\u29B4':'laemptyv','\\u29B5':'ohbar','\\u29B6':'omid','\\u29B7':'opar','\\u29B9':'operp','\\u29BB':'olcross','\\u29BC':'odsold','\\u29BE':'olcir','\\u29BF':'ofcir','\\u29C0':'olt','\\u29C1':'ogt','\\u29C2':'cirscir','\\u29C3':'cirE','\\u29C4':'solb','\\u29C5':'bsolb','\\u29C9':'boxbox','\\u29CD':'trisb','\\u29CE':'rtriltri','\\u29CF':'LeftTriangleBar','\\u29CF\\u0338':'NotLeftTriangleBar','\\u29D0':'RightTriangleBar','\\u29D0\\u0338':'NotRightTriangleBar','\\u29DC':'iinfin','\\u29DD':'infintie','\\u29DE':'nvinfin','\\u29E3':'eparsl','\\u29E4':'smeparsl','\\u29E5':'eqvparsl','\\u29EB':'lozf','\\u29F4':'RuleDelayed','\\u29F6':'dsol','\\u2A00':'xodot','\\u2A01':'xoplus','\\u2A02':'xotime','\\u2A04':'xuplus','\\u2A06':'xsqcup','\\u2A0D':'fpartint','\\u2A10':'cirfnint','\\u2A11':'awint','\\u2A12':'rppolint','\\u2A13':'scpolint','\\u2A14':'npolint','\\u2A15':'pointint','\\u2A16':'quatint','\\u2A17':'intlarhk','\\u2A22':'pluscir','\\u2A23':'plusacir','\\u2A24':'simplus','\\u2A25':'plusdu','\\u2A26':'plussim','\\u2A27':'plustwo','\\u2A29':'mcomma','\\u2A2A':'minusdu','\\u2A2D':'loplus','\\u2A2E':'roplus','\\u2A2F':'Cross','\\u2A30':'timesd','\\u2A31':'timesbar','\\u2A33':'smashp','\\u2A34':'lotimes','\\u2A35':'rotimes','\\u2A36':'otimesas','\\u2A37':'Otimes','\\u2A38':'odiv','\\u2A39':'triplus','\\u2A3A':'triminus','\\u2A3B':'tritime','\\u2A3C':'iprod','\\u2A3F':'amalg','\\u2A40':'capdot','\\u2A42':'ncup','\\u2A43':'ncap','\\u2A44':'capand','\\u2A45':'cupor','\\u2A46':'cupcap','\\u2A47':'capcup','\\u2A48':'cupbrcap','\\u2A49':'capbrcup','\\u2A4A':'cupcup','\\u2A4B':'capcap','\\u2A4C':'ccups','\\u2A4D':'ccaps','\\u2A50':'ccupssm','\\u2A53':'And','\\u2A54':'Or','\\u2A55':'andand','\\u2A56':'oror','\\u2A57':'orslope','\\u2A58':'andslope','\\u2A5A':'andv','\\u2A5B':'orv','\\u2A5C':'andd','\\u2A5D':'ord','\\u2A5F':'wedbar','\\u2A66':'sdote','\\u2A6A':'simdot','\\u2A6D':'congdot','\\u2A6D\\u0338':'ncongdot','\\u2A6E':'easter','\\u2A6F':'apacir','\\u2A70':'apE','\\u2A70\\u0338':'napE','\\u2A71':'eplus','\\u2A72':'pluse','\\u2A73':'Esim','\\u2A77':'eDDot','\\u2A78':'equivDD','\\u2A79':'ltcir','\\u2A7A':'gtcir','\\u2A7B':'ltquest','\\u2A7C':'gtquest','\\u2A7D':'les','\\u2A7D\\u0338':'nles','\\u2A7E':'ges','\\u2A7E\\u0338':'nges','\\u2A7F':'lesdot','\\u2A80':'gesdot','\\u2A81':'lesdoto','\\u2A82':'gesdoto','\\u2A83':'lesdotor','\\u2A84':'gesdotol','\\u2A85':'lap','\\u2A86':'gap','\\u2A87':'lne','\\u2A88':'gne','\\u2A89':'lnap','\\u2A8A':'gnap','\\u2A8B':'lEg','\\u2A8C':'gEl','\\u2A8D':'lsime','\\u2A8E':'gsime','\\u2A8F':'lsimg','\\u2A90':'gsiml','\\u2A91':'lgE','\\u2A92':'glE','\\u2A93':'lesges','\\u2A94':'gesles','\\u2A95':'els','\\u2A96':'egs','\\u2A97':'elsdot','\\u2A98':'egsdot','\\u2A99':'el','\\u2A9A':'eg','\\u2A9D':'siml','\\u2A9E':'simg','\\u2A9F':'simlE','\\u2AA0':'simgE','\\u2AA1':'LessLess','\\u2AA1\\u0338':'NotNestedLessLess','\\u2AA2':'GreaterGreater','\\u2AA2\\u0338':'NotNestedGreaterGreater','\\u2AA4':'glj','\\u2AA5':'gla','\\u2AA6':'ltcc','\\u2AA7':'gtcc','\\u2AA8':'lescc','\\u2AA9':'gescc','\\u2AAA':'smt','\\u2AAB':'lat','\\u2AAC':'smte','\\u2AAC\\uFE00':'smtes','\\u2AAD':'late','\\u2AAD\\uFE00':'lates','\\u2AAE':'bumpE','\\u2AAF':'pre','\\u2AAF\\u0338':'npre','\\u2AB0':'sce','\\u2AB0\\u0338':'nsce','\\u2AB3':'prE','\\u2AB4':'scE','\\u2AB5':'prnE','\\u2AB6':'scnE','\\u2AB7':'prap','\\u2AB8':'scap','\\u2AB9':'prnap','\\u2ABA':'scnap','\\u2ABB':'Pr','\\u2ABC':'Sc','\\u2ABD':'subdot','\\u2ABE':'supdot','\\u2ABF':'subplus','\\u2AC0':'supplus','\\u2AC1':'submult','\\u2AC2':'supmult','\\u2AC3':'subedot','\\u2AC4':'supedot','\\u2AC5':'subE','\\u2AC5\\u0338':'nsubE','\\u2AC6':'supE','\\u2AC6\\u0338':'nsupE','\\u2AC7':'subsim','\\u2AC8':'supsim','\\u2ACB\\uFE00':'vsubnE','\\u2ACB':'subnE','\\u2ACC\\uFE00':'vsupnE','\\u2ACC':'supnE','\\u2ACF':'csub','\\u2AD0':'csup','\\u2AD1':'csube','\\u2AD2':'csupe','\\u2AD3':'subsup','\\u2AD4':'supsub','\\u2AD5':'subsub','\\u2AD6':'supsup','\\u2AD7':'suphsub','\\u2AD8':'supdsub','\\u2AD9':'forkv','\\u2ADA':'topfork','\\u2ADB':'mlcp','\\u2AE4':'Dashv','\\u2AE6':'Vdashl','\\u2AE7':'Barv','\\u2AE8':'vBar','\\u2AE9':'vBarv','\\u2AEB':'Vbar','\\u2AEC':'Not','\\u2AED':'bNot','\\u2AEE':'rnmid','\\u2AEF':'cirmid','\\u2AF0':'midcir','\\u2AF1':'topcir','\\u2AF2':'nhpar','\\u2AF3':'parsim','\\u2AFD':'parsl','\\u2AFD\\u20E5':'nparsl','\\u266D':'flat','\\u266E':'natur','\\u266F':'sharp','\\xA4':'curren','\\xA2':'cent','$':'dollar','\\xA3':'pound','\\xA5':'yen','\\u20AC':'euro','\\xB9':'sup1','\\xBD':'half','\\u2153':'frac13','\\xBC':'frac14','\\u2155':'frac15','\\u2159':'frac16','\\u215B':'frac18','\\xB2':'sup2','\\u2154':'frac23','\\u2156':'frac25','\\xB3':'sup3','\\xBE':'frac34','\\u2157':'frac35','\\u215C':'frac38','\\u2158':'frac45','\\u215A':'frac56','\\u215D':'frac58','\\u215E':'frac78','\\uD835\\uDCB6':'ascr','\\uD835\\uDD52':'aopf','\\uD835\\uDD1E':'afr','\\uD835\\uDD38':'Aopf','\\uD835\\uDD04':'Afr','\\uD835\\uDC9C':'Ascr','\\xAA':'ordf','\\xE1':'aacute','\\xC1':'Aacute','\\xE0':'agrave','\\xC0':'Agrave','\\u0103':'abreve','\\u0102':'Abreve','\\xE2':'acirc','\\xC2':'Acirc','\\xE5':'aring','\\xC5':'angst','\\xE4':'auml','\\xC4':'Auml','\\xE3':'atilde','\\xC3':'Atilde','\\u0105':'aogon','\\u0104':'Aogon','\\u0101':'amacr','\\u0100':'Amacr','\\xE6':'aelig','\\xC6':'AElig','\\uD835\\uDCB7':'bscr','\\uD835\\uDD53':'bopf','\\uD835\\uDD1F':'bfr','\\uD835\\uDD39':'Bopf','\\u212C':'Bscr','\\uD835\\uDD05':'Bfr','\\uD835\\uDD20':'cfr','\\uD835\\uDCB8':'cscr','\\uD835\\uDD54':'copf','\\u212D':'Cfr','\\uD835\\uDC9E':'Cscr','\\u2102':'Copf','\\u0107':'cacute','\\u0106':'Cacute','\\u0109':'ccirc','\\u0108':'Ccirc','\\u010D':'ccaron','\\u010C':'Ccaron','\\u010B':'cdot','\\u010A':'Cdot','\\xE7':'ccedil','\\xC7':'Ccedil','\\u2105':'incare','\\uD835\\uDD21':'dfr','\\u2146':'dd','\\uD835\\uDD55':'dopf','\\uD835\\uDCB9':'dscr','\\uD835\\uDC9F':'Dscr','\\uD835\\uDD07':'Dfr','\\u2145':'DD','\\uD835\\uDD3B':'Dopf','\\u010F':'dcaron','\\u010E':'Dcaron','\\u0111':'dstrok','\\u0110':'Dstrok','\\xF0':'eth','\\xD0':'ETH','\\u2147':'ee','\\u212F':'escr','\\uD835\\uDD22':'efr','\\uD835\\uDD56':'eopf','\\u2130':'Escr','\\uD835\\uDD08':'Efr','\\uD835\\uDD3C':'Eopf','\\xE9':'eacute','\\xC9':'Eacute','\\xE8':'egrave','\\xC8':'Egrave','\\xEA':'ecirc','\\xCA':'Ecirc','\\u011B':'ecaron','\\u011A':'Ecaron','\\xEB':'euml','\\xCB':'Euml','\\u0117':'edot','\\u0116':'Edot','\\u0119':'eogon','\\u0118':'Eogon','\\u0113':'emacr','\\u0112':'Emacr','\\uD835\\uDD23':'ffr','\\uD835\\uDD57':'fopf','\\uD835\\uDCBB':'fscr','\\uD835\\uDD09':'Ffr','\\uD835\\uDD3D':'Fopf','\\u2131':'Fscr','\\uFB00':'fflig','\\uFB03':'ffilig','\\uFB04':'ffllig','\\uFB01':'filig','fj':'fjlig','\\uFB02':'fllig','\\u0192':'fnof','\\u210A':'gscr','\\uD835\\uDD58':'gopf','\\uD835\\uDD24':'gfr','\\uD835\\uDCA2':'Gscr','\\uD835\\uDD3E':'Gopf','\\uD835\\uDD0A':'Gfr','\\u01F5':'gacute','\\u011F':'gbreve','\\u011E':'Gbreve','\\u011D':'gcirc','\\u011C':'Gcirc','\\u0121':'gdot','\\u0120':'Gdot','\\u0122':'Gcedil','\\uD835\\uDD25':'hfr','\\u210E':'planckh','\\uD835\\uDCBD':'hscr','\\uD835\\uDD59':'hopf','\\u210B':'Hscr','\\u210C':'Hfr','\\u210D':'Hopf','\\u0125':'hcirc','\\u0124':'Hcirc','\\u210F':'hbar','\\u0127':'hstrok','\\u0126':'Hstrok','\\uD835\\uDD5A':'iopf','\\uD835\\uDD26':'ifr','\\uD835\\uDCBE':'iscr','\\u2148':'ii','\\uD835\\uDD40':'Iopf','\\u2110':'Iscr','\\u2111':'Im','\\xED':'iacute','\\xCD':'Iacute','\\xEC':'igrave','\\xCC':'Igrave','\\xEE':'icirc','\\xCE':'Icirc','\\xEF':'iuml','\\xCF':'Iuml','\\u0129':'itilde','\\u0128':'Itilde','\\u0130':'Idot','\\u012F':'iogon','\\u012E':'Iogon','\\u012B':'imacr','\\u012A':'Imacr','\\u0133':'ijlig','\\u0132':'IJlig','\\u0131':'imath','\\uD835\\uDCBF':'jscr','\\uD835\\uDD5B':'jopf','\\uD835\\uDD27':'jfr','\\uD835\\uDCA5':'Jscr','\\uD835\\uDD0D':'Jfr','\\uD835\\uDD41':'Jopf','\\u0135':'jcirc','\\u0134':'Jcirc','\\u0237':'jmath','\\uD835\\uDD5C':'kopf','\\uD835\\uDCC0':'kscr','\\uD835\\uDD28':'kfr','\\uD835\\uDCA6':'Kscr','\\uD835\\uDD42':'Kopf','\\uD835\\uDD0E':'Kfr','\\u0137':'kcedil','\\u0136':'Kcedil','\\uD835\\uDD29':'lfr','\\uD835\\uDCC1':'lscr','\\u2113':'ell','\\uD835\\uDD5D':'lopf','\\u2112':'Lscr','\\uD835\\uDD0F':'Lfr','\\uD835\\uDD43':'Lopf','\\u013A':'lacute','\\u0139':'Lacute','\\u013E':'lcaron','\\u013D':'Lcaron','\\u013C':'lcedil','\\u013B':'Lcedil','\\u0142':'lstrok','\\u0141':'Lstrok','\\u0140':'lmidot','\\u013F':'Lmidot','\\uD835\\uDD2A':'mfr','\\uD835\\uDD5E':'mopf','\\uD835\\uDCC2':'mscr','\\uD835\\uDD10':'Mfr','\\uD835\\uDD44':'Mopf','\\u2133':'Mscr','\\uD835\\uDD2B':'nfr','\\uD835\\uDD5F':'nopf','\\uD835\\uDCC3':'nscr','\\u2115':'Nopf','\\uD835\\uDCA9':'Nscr','\\uD835\\uDD11':'Nfr','\\u0144':'nacute','\\u0143':'Nacute','\\u0148':'ncaron','\\u0147':'Ncaron','\\xF1':'ntilde','\\xD1':'Ntilde','\\u0146':'ncedil','\\u0145':'Ncedil','\\u2116':'numero','\\u014B':'eng','\\u014A':'ENG','\\uD835\\uDD60':'oopf','\\uD835\\uDD2C':'ofr','\\u2134':'oscr','\\uD835\\uDCAA':'Oscr','\\uD835\\uDD12':'Ofr','\\uD835\\uDD46':'Oopf','\\xBA':'ordm','\\xF3':'oacute','\\xD3':'Oacute','\\xF2':'ograve','\\xD2':'Ograve','\\xF4':'ocirc','\\xD4':'Ocirc','\\xF6':'ouml','\\xD6':'Ouml','\\u0151':'odblac','\\u0150':'Odblac','\\xF5':'otilde','\\xD5':'Otilde','\\xF8':'oslash','\\xD8':'Oslash','\\u014D':'omacr','\\u014C':'Omacr','\\u0153':'oelig','\\u0152':'OElig','\\uD835\\uDD2D':'pfr','\\uD835\\uDCC5':'pscr','\\uD835\\uDD61':'popf','\\u2119':'Popf','\\uD835\\uDD13':'Pfr','\\uD835\\uDCAB':'Pscr','\\uD835\\uDD62':'qopf','\\uD835\\uDD2E':'qfr','\\uD835\\uDCC6':'qscr','\\uD835\\uDCAC':'Qscr','\\uD835\\uDD14':'Qfr','\\u211A':'Qopf','\\u0138':'kgreen','\\uD835\\uDD2F':'rfr','\\uD835\\uDD63':'ropf','\\uD835\\uDCC7':'rscr','\\u211B':'Rscr','\\u211C':'Re','\\u211D':'Ropf','\\u0155':'racute','\\u0154':'Racute','\\u0159':'rcaron','\\u0158':'Rcaron','\\u0157':'rcedil','\\u0156':'Rcedil','\\uD835\\uDD64':'sopf','\\uD835\\uDCC8':'sscr','\\uD835\\uDD30':'sfr','\\uD835\\uDD4A':'Sopf','\\uD835\\uDD16':'Sfr','\\uD835\\uDCAE':'Sscr','\\u24C8':'oS','\\u015B':'sacute','\\u015A':'Sacute','\\u015D':'scirc','\\u015C':'Scirc','\\u0161':'scaron','\\u0160':'Scaron','\\u015F':'scedil','\\u015E':'Scedil','\\xDF':'szlig','\\uD835\\uDD31':'tfr','\\uD835\\uDCC9':'tscr','\\uD835\\uDD65':'topf','\\uD835\\uDCAF':'Tscr','\\uD835\\uDD17':'Tfr','\\uD835\\uDD4B':'Topf','\\u0165':'tcaron','\\u0164':'Tcaron','\\u0163':'tcedil','\\u0162':'Tcedil','\\u2122':'trade','\\u0167':'tstrok','\\u0166':'Tstrok','\\uD835\\uDCCA':'uscr','\\uD835\\uDD66':'uopf','\\uD835\\uDD32':'ufr','\\uD835\\uDD4C':'Uopf','\\uD835\\uDD18':'Ufr','\\uD835\\uDCB0':'Uscr','\\xFA':'uacute','\\xDA':'Uacute','\\xF9':'ugrave','\\xD9':'Ugrave','\\u016D':'ubreve','\\u016C':'Ubreve','\\xFB':'ucirc','\\xDB':'Ucirc','\\u016F':'uring','\\u016E':'Uring','\\xFC':'uuml','\\xDC':'Uuml','\\u0171':'udblac','\\u0170':'Udblac','\\u0169':'utilde','\\u0168':'Utilde','\\u0173':'uogon','\\u0172':'Uogon','\\u016B':'umacr','\\u016A':'Umacr','\\uD835\\uDD33':'vfr','\\uD835\\uDD67':'vopf','\\uD835\\uDCCB':'vscr','\\uD835\\uDD19':'Vfr','\\uD835\\uDD4D':'Vopf','\\uD835\\uDCB1':'Vscr','\\uD835\\uDD68':'wopf','\\uD835\\uDCCC':'wscr','\\uD835\\uDD34':'wfr','\\uD835\\uDCB2':'Wscr','\\uD835\\uDD4E':'Wopf','\\uD835\\uDD1A':'Wfr','\\u0175':'wcirc','\\u0174':'Wcirc','\\uD835\\uDD35':'xfr','\\uD835\\uDCCD':'xscr','\\uD835\\uDD69':'xopf','\\uD835\\uDD4F':'Xopf','\\uD835\\uDD1B':'Xfr','\\uD835\\uDCB3':'Xscr','\\uD835\\uDD36':'yfr','\\uD835\\uDCCE':'yscr','\\uD835\\uDD6A':'yopf','\\uD835\\uDCB4':'Yscr','\\uD835\\uDD1C':'Yfr','\\uD835\\uDD50':'Yopf','\\xFD':'yacute','\\xDD':'Yacute','\\u0177':'ycirc','\\u0176':'Ycirc','\\xFF':'yuml','\\u0178':'Yuml','\\uD835\\uDCCF':'zscr','\\uD835\\uDD37':'zfr','\\uD835\\uDD6B':'zopf','\\u2128':'Zfr','\\u2124':'Zopf','\\uD835\\uDCB5':'Zscr','\\u017A':'zacute','\\u0179':'Zacute','\\u017E':'zcaron','\\u017D':'Zcaron','\\u017C':'zdot','\\u017B':'Zdot','\\u01B5':'imped','\\xFE':'thorn','\\xDE':'THORN','\\u0149':'napos','\\u03B1':'alpha','\\u0391':'Alpha','\\u03B2':'beta','\\u0392':'Beta','\\u03B3':'gamma','\\u0393':'Gamma','\\u03B4':'delta','\\u0394':'Delta','\\u03B5':'epsi','\\u03F5':'epsiv','\\u0395':'Epsilon','\\u03DD':'gammad','\\u03DC':'Gammad','\\u03B6':'zeta','\\u0396':'Zeta','\\u03B7':'eta','\\u0397':'Eta','\\u03B8':'theta','\\u03D1':'thetav','\\u0398':'Theta','\\u03B9':'iota','\\u0399':'Iota','\\u03BA':'kappa','\\u03F0':'kappav','\\u039A':'Kappa','\\u03BB':'lambda','\\u039B':'Lambda','\\u03BC':'mu','\\xB5':'micro','\\u039C':'Mu','\\u03BD':'nu','\\u039D':'Nu','\\u03BE':'xi','\\u039E':'Xi','\\u03BF':'omicron','\\u039F':'Omicron','\\u03C0':'pi','\\u03D6':'piv','\\u03A0':'Pi','\\u03C1':'rho','\\u03F1':'rhov','\\u03A1':'Rho','\\u03C3':'sigma','\\u03A3':'Sigma','\\u03C2':'sigmaf','\\u03C4':'tau','\\u03A4':'Tau','\\u03C5':'upsi','\\u03A5':'Upsilon','\\u03D2':'Upsi','\\u03C6':'phi','\\u03D5':'phiv','\\u03A6':'Phi','\\u03C7':'chi','\\u03A7':'Chi','\\u03C8':'psi','\\u03A8':'Psi','\\u03C9':'omega','\\u03A9':'ohm','\\u0430':'acy','\\u0410':'Acy','\\u0431':'bcy','\\u0411':'Bcy','\\u0432':'vcy','\\u0412':'Vcy','\\u0433':'gcy','\\u0413':'Gcy','\\u0453':'gjcy','\\u0403':'GJcy','\\u0434':'dcy','\\u0414':'Dcy','\\u0452':'djcy','\\u0402':'DJcy','\\u0435':'iecy','\\u0415':'IEcy','\\u0451':'iocy','\\u0401':'IOcy','\\u0454':'jukcy','\\u0404':'Jukcy','\\u0436':'zhcy','\\u0416':'ZHcy','\\u0437':'zcy','\\u0417':'Zcy','\\u0455':'dscy','\\u0405':'DScy','\\u0438':'icy','\\u0418':'Icy','\\u0456':'iukcy','\\u0406':'Iukcy','\\u0457':'yicy','\\u0407':'YIcy','\\u0439':'jcy','\\u0419':'Jcy','\\u0458':'jsercy','\\u0408':'Jsercy','\\u043A':'kcy','\\u041A':'Kcy','\\u045C':'kjcy','\\u040C':'KJcy','\\u043B':'lcy','\\u041B':'Lcy','\\u0459':'ljcy','\\u0409':'LJcy','\\u043C':'mcy','\\u041C':'Mcy','\\u043D':'ncy','\\u041D':'Ncy','\\u045A':'njcy','\\u040A':'NJcy','\\u043E':'ocy','\\u041E':'Ocy','\\u043F':'pcy','\\u041F':'Pcy','\\u0440':'rcy','\\u0420':'Rcy','\\u0441':'scy','\\u0421':'Scy','\\u0442':'tcy','\\u0422':'Tcy','\\u045B':'tshcy','\\u040B':'TSHcy','\\u0443':'ucy','\\u0423':'Ucy','\\u045E':'ubrcy','\\u040E':'Ubrcy','\\u0444':'fcy','\\u0424':'Fcy','\\u0445':'khcy','\\u0425':'KHcy','\\u0446':'tscy','\\u0426':'TScy','\\u0447':'chcy','\\u0427':'CHcy','\\u045F':'dzcy','\\u040F':'DZcy','\\u0448':'shcy','\\u0428':'SHcy','\\u0449':'shchcy','\\u0429':'SHCHcy','\\u044A':'hardcy','\\u042A':'HARDcy','\\u044B':'ycy','\\u042B':'Ycy','\\u044C':'softcy','\\u042C':'SOFTcy','\\u044D':'ecy','\\u042D':'Ecy','\\u044E':'yucy','\\u042E':'YUcy','\\u044F':'yacy','\\u042F':'YAcy','\\u2135':'aleph','\\u2136':'beth','\\u2137':'gimel','\\u2138':'daleth'};\n\n\tvar regexEscape = /[\"&'<>`]/g;\n\tvar escapeMap = {\n\t\t'\"': '"',\n\t\t'&': '&',\n\t\t'\\'': ''',\n\t\t'<': '<',\n\t\t// See https://mathiasbynens.be/notes/ambiguous-ampersands: in HTML, the\n\t\t// following is not strictly necessary unless it’s part of a tag or an\n\t\t// unquoted attribute value. We’re only escaping it to support those\n\t\t// situations, and for XML support.\n\t\t'>': '>',\n\t\t// In Internet Explorer ≤ 8, the backtick character can be used\n\t\t// to break out of (un)quoted attribute values or HTML comments.\n\t\t// See http://html5sec.org/#102, http://html5sec.org/#108, and\n\t\t// http://html5sec.org/#133.\n\t\t'`': '`'\n\t};\n\n\tvar regexInvalidEntity = /&#(?:[xX][^a-fA-F0-9]|[^0-9xX])/;\n\tvar regexInvalidRawCodePoint = /[\\0-\\x08\\x0B\\x0E-\\x1F\\x7F-\\x9F\\uFDD0-\\uFDEF\\uFFFE\\uFFFF]|[\\uD83F\\uD87F\\uD8BF\\uD8FF\\uD93F\\uD97F\\uD9BF\\uD9FF\\uDA3F\\uDA7F\\uDABF\\uDAFF\\uDB3F\\uDB7F\\uDBBF\\uDBFF][\\uDFFE\\uDFFF]|[\\uD800-\\uDBFF](?![\\uDC00-\\uDFFF])|(?:[^\\uD800-\\uDBFF]|^)[\\uDC00-\\uDFFF]/;\n\tvar regexDecode = /&(CounterClockwiseContourIntegral|DoubleLongLeftRightArrow|ClockwiseContourIntegral|NotNestedGreaterGreater|NotSquareSupersetEqual|DiacriticalDoubleAcute|NotRightTriangleEqual|NotSucceedsSlantEqual|NotPrecedesSlantEqual|CloseCurlyDoubleQuote|NegativeVeryThinSpace|DoubleContourIntegral|FilledVerySmallSquare|CapitalDifferentialD|OpenCurlyDoubleQuote|EmptyVerySmallSquare|NestedGreaterGreater|DoubleLongRightArrow|NotLeftTriangleEqual|NotGreaterSlantEqual|ReverseUpEquilibrium|DoubleLeftRightArrow|NotSquareSubsetEqual|NotDoubleVerticalBar|RightArrowLeftArrow|NotGreaterFullEqual|NotRightTriangleBar|SquareSupersetEqual|DownLeftRightVector|DoubleLongLeftArrow|leftrightsquigarrow|LeftArrowRightArrow|NegativeMediumSpace|blacktriangleright|RightDownVectorBar|PrecedesSlantEqual|RightDoubleBracket|SucceedsSlantEqual|NotLeftTriangleBar|RightTriangleEqual|SquareIntersection|RightDownTeeVector|ReverseEquilibrium|NegativeThickSpace|longleftrightarrow|Longleftrightarrow|LongLeftRightArrow|DownRightTeeVector|DownRightVectorBar|GreaterSlantEqual|SquareSubsetEqual|LeftDownVectorBar|LeftDoubleBracket|VerticalSeparator|rightleftharpoons|NotGreaterGreater|NotSquareSuperset|blacktriangleleft|blacktriangledown|NegativeThinSpace|LeftDownTeeVector|NotLessSlantEqual|leftrightharpoons|DoubleUpDownArrow|DoubleVerticalBar|LeftTriangleEqual|FilledSmallSquare|twoheadrightarrow|NotNestedLessLess|DownLeftTeeVector|DownLeftVectorBar|RightAngleBracket|NotTildeFullEqual|NotReverseElement|RightUpDownVector|DiacriticalTilde|NotSucceedsTilde|circlearrowright|NotPrecedesEqual|rightharpoondown|DoubleRightArrow|NotSucceedsEqual|NonBreakingSpace|NotRightTriangle|LessEqualGreater|RightUpTeeVector|LeftAngleBracket|GreaterFullEqual|DownArrowUpArrow|RightUpVectorBar|twoheadleftarrow|GreaterEqualLess|downharpoonright|RightTriangleBar|ntrianglerighteq|NotSupersetEqual|LeftUpDownVector|DiacriticalAcute|rightrightarrows|vartriangleright|UpArrowDownArrow|DiacriticalGrave|UnderParenthesis|EmptySmallSquare|LeftUpVectorBar|leftrightarrows|DownRightVector|downharpoonleft|trianglerighteq|ShortRightArrow|OverParenthesis|DoubleLeftArrow|DoubleDownArrow|NotSquareSubset|bigtriangledown|ntrianglelefteq|UpperRightArrow|curvearrowright|vartriangleleft|NotLeftTriangle|nleftrightarrow|LowerRightArrow|NotHumpDownHump|NotGreaterTilde|rightthreetimes|LeftUpTeeVector|NotGreaterEqual|straightepsilon|LeftTriangleBar|rightsquigarrow|ContourIntegral|rightleftarrows|CloseCurlyQuote|RightDownVector|LeftRightVector|nLeftrightarrow|leftharpoondown|circlearrowleft|SquareSuperset|OpenCurlyQuote|hookrightarrow|HorizontalLine|DiacriticalDot|NotLessGreater|ntriangleright|DoubleRightTee|InvisibleComma|InvisibleTimes|LowerLeftArrow|DownLeftVector|NotSubsetEqual|curvearrowleft|trianglelefteq|NotVerticalBar|TildeFullEqual|downdownarrows|NotGreaterLess|RightTeeVector|ZeroWidthSpace|looparrowright|LongRightArrow|doublebarwedge|ShortLeftArrow|ShortDownArrow|RightVectorBar|GreaterGreater|ReverseElement|rightharpoonup|LessSlantEqual|leftthreetimes|upharpoonright|rightarrowtail|LeftDownVector|Longrightarrow|NestedLessLess|UpperLeftArrow|nshortparallel|leftleftarrows|leftrightarrow|Leftrightarrow|LeftRightArrow|longrightarrow|upharpoonleft|RightArrowBar|ApplyFunction|LeftTeeVector|leftarrowtail|NotEqualTilde|varsubsetneqq|varsupsetneqq|RightTeeArrow|SucceedsEqual|SucceedsTilde|LeftVectorBar|SupersetEqual|hookleftarrow|DifferentialD|VerticalTilde|VeryThinSpace|blacktriangle|bigtriangleup|LessFullEqual|divideontimes|leftharpoonup|UpEquilibrium|ntriangleleft|RightTriangle|measuredangle|shortparallel|longleftarrow|Longleftarrow|LongLeftArrow|DoubleLeftTee|Poincareplane|PrecedesEqual|triangleright|DoubleUpArrow|RightUpVector|fallingdotseq|looparrowleft|PrecedesTilde|NotTildeEqual|NotTildeTilde|smallsetminus|Proportional|triangleleft|triangledown|UnderBracket|NotHumpEqual|exponentiale|ExponentialE|NotLessTilde|HilbertSpace|RightCeiling|blacklozenge|varsupsetneq|HumpDownHump|GreaterEqual|VerticalLine|LeftTeeArrow|NotLessEqual|DownTeeArrow|LeftTriangle|varsubsetneq|Intersection|NotCongruent|DownArrowBar|LeftUpVector|LeftArrowBar|risingdotseq|GreaterTilde|RoundImplies|SquareSubset|ShortUpArrow|NotSuperset|quaternions|precnapprox|backepsilon|preccurlyeq|OverBracket|blacksquare|MediumSpace|VerticalBar|circledcirc|circleddash|CircleMinus|CircleTimes|LessGreater|curlyeqprec|curlyeqsucc|diamondsuit|UpDownArrow|Updownarrow|RuleDelayed|Rrightarrow|updownarrow|RightVector|nRightarrow|nrightarrow|eqslantless|LeftCeiling|Equilibrium|SmallCircle|expectation|NotSucceeds|thickapprox|GreaterLess|SquareUnion|NotPrecedes|NotLessLess|straightphi|succnapprox|succcurlyeq|SubsetEqual|sqsupseteq|Proportion|Laplacetrf|ImaginaryI|supsetneqq|NotGreater|gtreqqless|NotElement|ThickSpace|TildeEqual|TildeTilde|Fouriertrf|rmoustache|EqualTilde|eqslantgtr|UnderBrace|LeftVector|UpArrowBar|nLeftarrow|nsubseteqq|subsetneqq|nsupseteqq|nleftarrow|succapprox|lessapprox|UpTeeArrow|upuparrows|curlywedge|lesseqqgtr|varepsilon|varnothing|RightFloor|complement|CirclePlus|sqsubseteq|Lleftarrow|circledast|RightArrow|Rightarrow|rightarrow|lmoustache|Bernoullis|precapprox|mapstoleft|mapstodown|longmapsto|dotsquare|downarrow|DoubleDot|nsubseteq|supsetneq|leftarrow|nsupseteq|subsetneq|ThinSpace|ngeqslant|subseteqq|HumpEqual|NotSubset|triangleq|NotCupCap|lesseqgtr|heartsuit|TripleDot|Leftarrow|Coproduct|Congruent|varpropto|complexes|gvertneqq|LeftArrow|LessTilde|supseteqq|MinusPlus|CircleDot|nleqslant|NotExists|gtreqless|nparallel|UnionPlus|LeftFloor|checkmark|CenterDot|centerdot|Mellintrf|gtrapprox|bigotimes|OverBrace|spadesuit|therefore|pitchfork|rationals|PlusMinus|Backslash|Therefore|DownBreve|backsimeq|backprime|DownArrow|nshortmid|Downarrow|lvertneqq|eqvparsl|imagline|imagpart|infintie|integers|Integral|intercal|LessLess|Uarrocir|intlarhk|sqsupset|angmsdaf|sqsubset|llcorner|vartheta|cupbrcap|lnapprox|Superset|SuchThat|succnsim|succneqq|angmsdag|biguplus|curlyvee|trpezium|Succeeds|NotTilde|bigwedge|angmsdah|angrtvbd|triminus|cwconint|fpartint|lrcorner|smeparsl|subseteq|urcorner|lurdshar|laemptyv|DDotrahd|approxeq|ldrushar|awconint|mapstoup|backcong|shortmid|triangle|geqslant|gesdotol|timesbar|circledR|circledS|setminus|multimap|naturals|scpolint|ncongdot|RightTee|boxminus|gnapprox|boxtimes|andslope|thicksim|angmsdaa|varsigma|cirfnint|rtriltri|angmsdab|rppolint|angmsdac|barwedge|drbkarow|clubsuit|thetasym|bsolhsub|capbrcup|dzigrarr|doteqdot|DotEqual|dotminus|UnderBar|NotEqual|realpart|otimesas|ulcorner|hksearow|hkswarow|parallel|PartialD|elinters|emptyset|plusacir|bbrktbrk|angmsdad|pointint|bigoplus|angmsdae|Precedes|bigsqcup|varkappa|notindot|supseteq|precneqq|precnsim|profalar|profline|profsurf|leqslant|lesdotor|raemptyv|subplus|notnivb|notnivc|subrarr|zigrarr|vzigzag|submult|subedot|Element|between|cirscir|larrbfs|larrsim|lotimes|lbrksld|lbrkslu|lozenge|ldrdhar|dbkarow|bigcirc|epsilon|simrarr|simplus|ltquest|Epsilon|luruhar|gtquest|maltese|npolint|eqcolon|npreceq|bigodot|ddagger|gtrless|bnequiv|harrcir|ddotseq|equivDD|backsim|demptyv|nsqsube|nsqsupe|Upsilon|nsubset|upsilon|minusdu|nsucceq|swarrow|nsupset|coloneq|searrow|boxplus|napprox|natural|asympeq|alefsym|congdot|nearrow|bigstar|diamond|supplus|tritime|LeftTee|nvinfin|triplus|NewLine|nvltrie|nvrtrie|nwarrow|nexists|Diamond|ruluhar|Implies|supmult|angzarr|suplarr|suphsub|questeq|because|digamma|Because|olcross|bemptyv|omicron|Omicron|rotimes|NoBreak|intprod|angrtvb|orderof|uwangle|suphsol|lesdoto|orslope|DownTee|realine|cudarrl|rdldhar|OverBar|supedot|lessdot|supdsub|topfork|succsim|rbrkslu|rbrksld|pertenk|cudarrr|isindot|planckh|lessgtr|pluscir|gesdoto|plussim|plustwo|lesssim|cularrp|rarrsim|Cayleys|notinva|notinvb|notinvc|UpArrow|Uparrow|uparrow|NotLess|dwangle|precsim|Product|curarrm|Cconint|dotplus|rarrbfs|ccupssm|Cedilla|cemptyv|notniva|quatint|frac35|frac38|frac45|frac56|frac58|frac78|tridot|xoplus|gacute|gammad|Gammad|lfisht|lfloor|bigcup|sqsupe|gbreve|Gbreve|lharul|sqsube|sqcups|Gcedil|apacir|llhard|lmidot|Lmidot|lmoust|andand|sqcaps|approx|Abreve|spades|circeq|tprime|divide|topcir|Assign|topbot|gesdot|divonx|xuplus|timesd|gesles|atilde|solbar|SOFTcy|loplus|timesb|lowast|lowbar|dlcorn|dlcrop|softcy|dollar|lparlt|thksim|lrhard|Atilde|lsaquo|smashp|bigvee|thinsp|wreath|bkarow|lsquor|lstrok|Lstrok|lthree|ltimes|ltlarr|DotDot|simdot|ltrPar|weierp|xsqcup|angmsd|sigmav|sigmaf|zeetrf|Zcaron|zcaron|mapsto|vsupne|thetav|cirmid|marker|mcomma|Zacute|vsubnE|there4|gtlPar|vsubne|bottom|gtrarr|SHCHcy|shchcy|midast|midcir|middot|minusb|minusd|gtrdot|bowtie|sfrown|mnplus|models|colone|seswar|Colone|mstpos|searhk|gtrsim|nacute|Nacute|boxbox|telrec|hairsp|Tcedil|nbumpe|scnsim|ncaron|Ncaron|ncedil|Ncedil|hamilt|Scedil|nearhk|hardcy|HARDcy|tcedil|Tcaron|commat|nequiv|nesear|tcaron|target|hearts|nexist|varrho|scedil|Scaron|scaron|hellip|Sacute|sacute|hercon|swnwar|compfn|rtimes|rthree|rsquor|rsaquo|zacute|wedgeq|homtht|barvee|barwed|Barwed|rpargt|horbar|conint|swarhk|roplus|nltrie|hslash|hstrok|Hstrok|rmoust|Conint|bprime|hybull|hyphen|iacute|Iacute|supsup|supsub|supsim|varphi|coprod|brvbar|agrave|Supset|supset|igrave|Igrave|notinE|Agrave|iiiint|iinfin|copysr|wedbar|Verbar|vangrt|becaus|incare|verbar|inodot|bullet|drcorn|intcal|drcrop|cularr|vellip|Utilde|bumpeq|cupcap|dstrok|Dstrok|CupCap|cupcup|cupdot|eacute|Eacute|supdot|iquest|easter|ecaron|Ecaron|ecolon|isinsv|utilde|itilde|Itilde|curarr|succeq|Bumpeq|cacute|ulcrop|nparsl|Cacute|nprcue|egrave|Egrave|nrarrc|nrarrw|subsup|subsub|nrtrie|jsercy|nsccue|Jsercy|kappav|kcedil|Kcedil|subsim|ulcorn|nsimeq|egsdot|veebar|kgreen|capand|elsdot|Subset|subset|curren|aacute|lacute|Lacute|emptyv|ntilde|Ntilde|lagran|lambda|Lambda|capcap|Ugrave|langle|subdot|emsp13|numero|emsp14|nvdash|nvDash|nVdash|nVDash|ugrave|ufisht|nvHarr|larrfs|nvlArr|larrhk|larrlp|larrpl|nvrArr|Udblac|nwarhk|larrtl|nwnear|oacute|Oacute|latail|lAtail|sstarf|lbrace|odblac|Odblac|lbrack|udblac|odsold|eparsl|lcaron|Lcaron|ograve|Ograve|lcedil|Lcedil|Aacute|ssmile|ssetmn|squarf|ldquor|capcup|ominus|cylcty|rharul|eqcirc|dagger|rfloor|rfisht|Dagger|daleth|equals|origof|capdot|equest|dcaron|Dcaron|rdquor|oslash|Oslash|otilde|Otilde|otimes|Otimes|urcrop|Ubreve|ubreve|Yacute|Uacute|uacute|Rcedil|rcedil|urcorn|parsim|Rcaron|Vdashl|rcaron|Tstrok|percnt|period|permil|Exists|yacute|rbrack|rbrace|phmmat|ccaron|Ccaron|planck|ccedil|plankv|tstrok|female|plusdo|plusdu|ffilig|plusmn|ffllig|Ccedil|rAtail|dfisht|bernou|ratail|Rarrtl|rarrtl|angsph|rarrpl|rarrlp|rarrhk|xwedge|xotime|forall|ForAll|Vvdash|vsupnE|preceq|bigcap|frac12|frac13|frac14|primes|rarrfs|prnsim|frac15|Square|frac16|square|lesdot|frac18|frac23|propto|prurel|rarrap|rangle|puncsp|frac25|Racute|qprime|racute|lesges|frac34|abreve|AElig|eqsim|utdot|setmn|urtri|Equal|Uring|seArr|uring|searr|dashv|Dashv|mumap|nabla|iogon|Iogon|sdote|sdotb|scsim|napid|napos|equiv|natur|Acirc|dblac|erarr|nbump|iprod|erDot|ucirc|awint|esdot|angrt|ncong|isinE|scnap|Scirc|scirc|ndash|isins|Ubrcy|nearr|neArr|isinv|nedot|ubrcy|acute|Ycirc|iukcy|Iukcy|xutri|nesim|caret|jcirc|Jcirc|caron|twixt|ddarr|sccue|exist|jmath|sbquo|ngeqq|angst|ccaps|lceil|ngsim|UpTee|delta|Delta|rtrif|nharr|nhArr|nhpar|rtrie|jukcy|Jukcy|kappa|rsquo|Kappa|nlarr|nlArr|TSHcy|rrarr|aogon|Aogon|fflig|xrarr|tshcy|ccirc|nleqq|filig|upsih|nless|dharl|nlsim|fjlig|ropar|nltri|dharr|robrk|roarr|fllig|fltns|roang|rnmid|subnE|subne|lAarr|trisb|Ccirc|acirc|ccups|blank|VDash|forkv|Vdash|langd|cedil|blk12|blk14|laquo|strns|diams|notin|vDash|larrb|blk34|block|disin|uplus|vdash|vBarv|aelig|starf|Wedge|check|xrArr|lates|lbarr|lBarr|notni|lbbrk|bcong|frasl|lbrke|frown|vrtri|vprop|vnsup|gamma|Gamma|wedge|xodot|bdquo|srarr|doteq|ldquo|boxdl|boxdL|gcirc|Gcirc|boxDl|boxDL|boxdr|boxdR|boxDr|TRADE|trade|rlhar|boxDR|vnsub|npart|vltri|rlarr|boxhd|boxhD|nprec|gescc|nrarr|nrArr|boxHd|boxHD|boxhu|boxhU|nrtri|boxHu|clubs|boxHU|times|colon|Colon|gimel|xlArr|Tilde|nsime|tilde|nsmid|nspar|THORN|thorn|xlarr|nsube|nsubE|thkap|xhArr|comma|nsucc|boxul|boxuL|nsupe|nsupE|gneqq|gnsim|boxUl|boxUL|grave|boxur|boxuR|boxUr|boxUR|lescc|angle|bepsi|boxvh|varpi|boxvH|numsp|Theta|gsime|gsiml|theta|boxVh|boxVH|boxvl|gtcir|gtdot|boxvL|boxVl|boxVL|crarr|cross|Cross|nvsim|boxvr|nwarr|nwArr|sqsup|dtdot|Uogon|lhard|lharu|dtrif|ocirc|Ocirc|lhblk|duarr|odash|sqsub|Hacek|sqcup|llarr|duhar|oelig|OElig|ofcir|boxvR|uogon|lltri|boxVr|csube|uuarr|ohbar|csupe|ctdot|olarr|olcir|harrw|oline|sqcap|omacr|Omacr|omega|Omega|boxVR|aleph|lneqq|lnsim|loang|loarr|rharu|lobrk|hcirc|operp|oplus|rhard|Hcirc|orarr|Union|order|ecirc|Ecirc|cuepr|szlig|cuesc|breve|reals|eDDot|Breve|hoarr|lopar|utrif|rdquo|Umacr|umacr|efDot|swArr|ultri|alpha|rceil|ovbar|swarr|Wcirc|wcirc|smtes|smile|bsemi|lrarr|aring|parsl|lrhar|bsime|uhblk|lrtri|cupor|Aring|uharr|uharl|slarr|rbrke|bsolb|lsime|rbbrk|RBarr|lsimg|phone|rBarr|rbarr|icirc|lsquo|Icirc|emacr|Emacr|ratio|simne|plusb|simlE|simgE|simeq|pluse|ltcir|ltdot|empty|xharr|xdtri|iexcl|Alpha|ltrie|rarrw|pound|ltrif|xcirc|bumpe|prcue|bumpE|asymp|amacr|cuvee|Sigma|sigma|iiint|udhar|iiota|ijlig|IJlig|supnE|imacr|Imacr|prime|Prime|image|prnap|eogon|Eogon|rarrc|mdash|mDDot|cuwed|imath|supne|imped|Amacr|udarr|prsim|micro|rarrb|cwint|raquo|infin|eplus|range|rangd|Ucirc|radic|minus|amalg|veeeq|rAarr|epsiv|ycirc|quest|sharp|quot|zwnj|Qscr|race|qscr|Qopf|qopf|qint|rang|Rang|Zscr|zscr|Zopf|zopf|rarr|rArr|Rarr|Pscr|pscr|prop|prod|prnE|prec|ZHcy|zhcy|prap|Zeta|zeta|Popf|popf|Zdot|plus|zdot|Yuml|yuml|phiv|YUcy|yucy|Yscr|yscr|perp|Yopf|yopf|part|para|YIcy|Ouml|rcub|yicy|YAcy|rdca|ouml|osol|Oscr|rdsh|yacy|real|oscr|xvee|andd|rect|andv|Xscr|oror|ordm|ordf|xscr|ange|aopf|Aopf|rHar|Xopf|opar|Oopf|xopf|xnis|rhov|oopf|omid|xmap|oint|apid|apos|ogon|ascr|Ascr|odot|odiv|xcup|xcap|ocir|oast|nvlt|nvle|nvgt|nvge|nvap|Wscr|wscr|auml|ntlg|ntgl|nsup|nsub|nsim|Nscr|nscr|nsce|Wopf|ring|npre|wopf|npar|Auml|Barv|bbrk|Nopf|nopf|nmid|nLtv|beta|ropf|Ropf|Beta|beth|nles|rpar|nleq|bnot|bNot|nldr|NJcy|rscr|Rscr|Vscr|vscr|rsqb|njcy|bopf|nisd|Bopf|rtri|Vopf|nGtv|ngtr|vopf|boxh|boxH|boxv|nges|ngeq|boxV|bscr|scap|Bscr|bsim|Vert|vert|bsol|bull|bump|caps|cdot|ncup|scnE|ncap|nbsp|napE|Cdot|cent|sdot|Vbar|nang|vBar|chcy|Mscr|mscr|sect|semi|CHcy|Mopf|mopf|sext|circ|cire|mldr|mlcp|cirE|comp|shcy|SHcy|vArr|varr|cong|copf|Copf|copy|COPY|malt|male|macr|lvnE|cscr|ltri|sime|ltcc|simg|Cscr|siml|csub|Uuml|lsqb|lsim|uuml|csup|Lscr|lscr|utri|smid|lpar|cups|smte|lozf|darr|Lopf|Uscr|solb|lopf|sopf|Sopf|lneq|uscr|spar|dArr|lnap|Darr|dash|Sqrt|LJcy|ljcy|lHar|dHar|Upsi|upsi|diam|lesg|djcy|DJcy|leqq|dopf|Dopf|dscr|Dscr|dscy|ldsh|ldca|squf|DScy|sscr|Sscr|dsol|lcub|late|star|Star|Uopf|Larr|lArr|larr|uopf|dtri|dzcy|sube|subE|Lang|lang|Kscr|kscr|Kopf|kopf|KJcy|kjcy|KHcy|khcy|DZcy|ecir|edot|eDot|Jscr|jscr|succ|Jopf|jopf|Edot|uHar|emsp|ensp|Iuml|iuml|eopf|isin|Iscr|iscr|Eopf|epar|sung|epsi|escr|sup1|sup2|sup3|Iota|iota|supe|supE|Iopf|iopf|IOcy|iocy|Escr|esim|Esim|imof|Uarr|QUOT|uArr|uarr|euml|IEcy|iecy|Idot|Euml|euro|excl|Hscr|hscr|Hopf|hopf|TScy|tscy|Tscr|hbar|tscr|flat|tbrk|fnof|hArr|harr|half|fopf|Fopf|tdot|gvnE|fork|trie|gtcc|fscr|Fscr|gdot|gsim|Gscr|gscr|Gopf|gopf|gneq|Gdot|tosa|gnap|Topf|topf|geqq|toea|GJcy|gjcy|tint|gesl|mid|Sfr|ggg|top|ges|gla|glE|glj|geq|gne|gEl|gel|gnE|Gcy|gcy|gap|Tfr|tfr|Tcy|tcy|Hat|Tau|Ffr|tau|Tab|hfr|Hfr|ffr|Fcy|fcy|icy|Icy|iff|ETH|eth|ifr|Ifr|Eta|eta|int|Int|Sup|sup|ucy|Ucy|Sum|sum|jcy|ENG|ufr|Ufr|eng|Jcy|jfr|els|ell|egs|Efr|efr|Jfr|uml|kcy|Kcy|Ecy|ecy|kfr|Kfr|lap|Sub|sub|lat|lcy|Lcy|leg|Dot|dot|lEg|leq|les|squ|div|die|lfr|Lfr|lgE|Dfr|dfr|Del|deg|Dcy|dcy|lne|lnE|sol|loz|smt|Cup|lrm|cup|lsh|Lsh|sim|shy|map|Map|mcy|Mcy|mfr|Mfr|mho|gfr|Gfr|sfr|cir|Chi|chi|nap|Cfr|vcy|Vcy|cfr|Scy|scy|ncy|Ncy|vee|Vee|Cap|cap|nfr|scE|sce|Nfr|nge|ngE|nGg|vfr|Vfr|ngt|bot|nGt|nis|niv|Rsh|rsh|nle|nlE|bne|Bfr|bfr|nLl|nlt|nLt|Bcy|bcy|not|Not|rlm|wfr|Wfr|npr|nsc|num|ocy|ast|Ocy|ofr|xfr|Xfr|Ofr|ogt|ohm|apE|olt|Rho|ape|rho|Rfr|rfr|ord|REG|ang|reg|orv|And|and|AMP|Rcy|amp|Afr|ycy|Ycy|yen|yfr|Yfr|rcy|par|pcy|Pcy|pfr|Pfr|phi|Phi|afr|Acy|acy|zcy|Zcy|piv|acE|acd|zfr|Zfr|pre|prE|psi|Psi|qfr|Qfr|zwj|Or|ge|Gg|gt|gg|el|oS|lt|Lt|LT|Re|lg|gl|eg|ne|Im|it|le|DD|wp|wr|nu|Nu|dd|lE|Sc|sc|pi|Pi|ee|af|ll|Ll|rx|gE|xi|pm|Xi|ic|pr|Pr|in|ni|mp|mu|ac|Mu|or|ap|Gt|GT|ii);|&(Aacute|Agrave|Atilde|Ccedil|Eacute|Egrave|Iacute|Igrave|Ntilde|Oacute|Ograve|Oslash|Otilde|Uacute|Ugrave|Yacute|aacute|agrave|atilde|brvbar|ccedil|curren|divide|eacute|egrave|frac12|frac14|frac34|iacute|igrave|iquest|middot|ntilde|oacute|ograve|oslash|otilde|plusmn|uacute|ugrave|yacute|AElig|Acirc|Aring|Ecirc|Icirc|Ocirc|THORN|Ucirc|acirc|acute|aelig|aring|cedil|ecirc|icirc|iexcl|laquo|micro|ocirc|pound|raquo|szlig|thorn|times|ucirc|Auml|COPY|Euml|Iuml|Ouml|QUOT|Uuml|auml|cent|copy|euml|iuml|macr|nbsp|ordf|ordm|ouml|para|quot|sect|sup1|sup2|sup3|uuml|yuml|AMP|ETH|REG|amp|deg|eth|not|reg|shy|uml|yen|GT|LT|gt|lt)(?!;)([=a-zA-Z0-9]?)|&#([0-9]+)(;?)|&#[xX]([a-fA-F0-9]+)(;?)|&([0-9a-zA-Z]+)/g;\n\tvar decodeMap = {'aacute':'\\xE1','Aacute':'\\xC1','abreve':'\\u0103','Abreve':'\\u0102','ac':'\\u223E','acd':'\\u223F','acE':'\\u223E\\u0333','acirc':'\\xE2','Acirc':'\\xC2','acute':'\\xB4','acy':'\\u0430','Acy':'\\u0410','aelig':'\\xE6','AElig':'\\xC6','af':'\\u2061','afr':'\\uD835\\uDD1E','Afr':'\\uD835\\uDD04','agrave':'\\xE0','Agrave':'\\xC0','alefsym':'\\u2135','aleph':'\\u2135','alpha':'\\u03B1','Alpha':'\\u0391','amacr':'\\u0101','Amacr':'\\u0100','amalg':'\\u2A3F','amp':'&','AMP':'&','and':'\\u2227','And':'\\u2A53','andand':'\\u2A55','andd':'\\u2A5C','andslope':'\\u2A58','andv':'\\u2A5A','ang':'\\u2220','ange':'\\u29A4','angle':'\\u2220','angmsd':'\\u2221','angmsdaa':'\\u29A8','angmsdab':'\\u29A9','angmsdac':'\\u29AA','angmsdad':'\\u29AB','angmsdae':'\\u29AC','angmsdaf':'\\u29AD','angmsdag':'\\u29AE','angmsdah':'\\u29AF','angrt':'\\u221F','angrtvb':'\\u22BE','angrtvbd':'\\u299D','angsph':'\\u2222','angst':'\\xC5','angzarr':'\\u237C','aogon':'\\u0105','Aogon':'\\u0104','aopf':'\\uD835\\uDD52','Aopf':'\\uD835\\uDD38','ap':'\\u2248','apacir':'\\u2A6F','ape':'\\u224A','apE':'\\u2A70','apid':'\\u224B','apos':'\\'','ApplyFunction':'\\u2061','approx':'\\u2248','approxeq':'\\u224A','aring':'\\xE5','Aring':'\\xC5','ascr':'\\uD835\\uDCB6','Ascr':'\\uD835\\uDC9C','Assign':'\\u2254','ast':'*','asymp':'\\u2248','asympeq':'\\u224D','atilde':'\\xE3','Atilde':'\\xC3','auml':'\\xE4','Auml':'\\xC4','awconint':'\\u2233','awint':'\\u2A11','backcong':'\\u224C','backepsilon':'\\u03F6','backprime':'\\u2035','backsim':'\\u223D','backsimeq':'\\u22CD','Backslash':'\\u2216','Barv':'\\u2AE7','barvee':'\\u22BD','barwed':'\\u2305','Barwed':'\\u2306','barwedge':'\\u2305','bbrk':'\\u23B5','bbrktbrk':'\\u23B6','bcong':'\\u224C','bcy':'\\u0431','Bcy':'\\u0411','bdquo':'\\u201E','becaus':'\\u2235','because':'\\u2235','Because':'\\u2235','bemptyv':'\\u29B0','bepsi':'\\u03F6','bernou':'\\u212C','Bernoullis':'\\u212C','beta':'\\u03B2','Beta':'\\u0392','beth':'\\u2136','between':'\\u226C','bfr':'\\uD835\\uDD1F','Bfr':'\\uD835\\uDD05','bigcap':'\\u22C2','bigcirc':'\\u25EF','bigcup':'\\u22C3','bigodot':'\\u2A00','bigoplus':'\\u2A01','bigotimes':'\\u2A02','bigsqcup':'\\u2A06','bigstar':'\\u2605','bigtriangledown':'\\u25BD','bigtriangleup':'\\u25B3','biguplus':'\\u2A04','bigvee':'\\u22C1','bigwedge':'\\u22C0','bkarow':'\\u290D','blacklozenge':'\\u29EB','blacksquare':'\\u25AA','blacktriangle':'\\u25B4','blacktriangledown':'\\u25BE','blacktriangleleft':'\\u25C2','blacktriangleright':'\\u25B8','blank':'\\u2423','blk12':'\\u2592','blk14':'\\u2591','blk34':'\\u2593','block':'\\u2588','bne':'=\\u20E5','bnequiv':'\\u2261\\u20E5','bnot':'\\u2310','bNot':'\\u2AED','bopf':'\\uD835\\uDD53','Bopf':'\\uD835\\uDD39','bot':'\\u22A5','bottom':'\\u22A5','bowtie':'\\u22C8','boxbox':'\\u29C9','boxdl':'\\u2510','boxdL':'\\u2555','boxDl':'\\u2556','boxDL':'\\u2557','boxdr':'\\u250C','boxdR':'\\u2552','boxDr':'\\u2553','boxDR':'\\u2554','boxh':'\\u2500','boxH':'\\u2550','boxhd':'\\u252C','boxhD':'\\u2565','boxHd':'\\u2564','boxHD':'\\u2566','boxhu':'\\u2534','boxhU':'\\u2568','boxHu':'\\u2567','boxHU':'\\u2569','boxminus':'\\u229F','boxplus':'\\u229E','boxtimes':'\\u22A0','boxul':'\\u2518','boxuL':'\\u255B','boxUl':'\\u255C','boxUL':'\\u255D','boxur':'\\u2514','boxuR':'\\u2558','boxUr':'\\u2559','boxUR':'\\u255A','boxv':'\\u2502','boxV':'\\u2551','boxvh':'\\u253C','boxvH':'\\u256A','boxVh':'\\u256B','boxVH':'\\u256C','boxvl':'\\u2524','boxvL':'\\u2561','boxVl':'\\u2562','boxVL':'\\u2563','boxvr':'\\u251C','boxvR':'\\u255E','boxVr':'\\u255F','boxVR':'\\u2560','bprime':'\\u2035','breve':'\\u02D8','Breve':'\\u02D8','brvbar':'\\xA6','bscr':'\\uD835\\uDCB7','Bscr':'\\u212C','bsemi':'\\u204F','bsim':'\\u223D','bsime':'\\u22CD','bsol':'\\\\','bsolb':'\\u29C5','bsolhsub':'\\u27C8','bull':'\\u2022','bullet':'\\u2022','bump':'\\u224E','bumpe':'\\u224F','bumpE':'\\u2AAE','bumpeq':'\\u224F','Bumpeq':'\\u224E','cacute':'\\u0107','Cacute':'\\u0106','cap':'\\u2229','Cap':'\\u22D2','capand':'\\u2A44','capbrcup':'\\u2A49','capcap':'\\u2A4B','capcup':'\\u2A47','capdot':'\\u2A40','CapitalDifferentialD':'\\u2145','caps':'\\u2229\\uFE00','caret':'\\u2041','caron':'\\u02C7','Cayleys':'\\u212D','ccaps':'\\u2A4D','ccaron':'\\u010D','Ccaron':'\\u010C','ccedil':'\\xE7','Ccedil':'\\xC7','ccirc':'\\u0109','Ccirc':'\\u0108','Cconint':'\\u2230','ccups':'\\u2A4C','ccupssm':'\\u2A50','cdot':'\\u010B','Cdot':'\\u010A','cedil':'\\xB8','Cedilla':'\\xB8','cemptyv':'\\u29B2','cent':'\\xA2','centerdot':'\\xB7','CenterDot':'\\xB7','cfr':'\\uD835\\uDD20','Cfr':'\\u212D','chcy':'\\u0447','CHcy':'\\u0427','check':'\\u2713','checkmark':'\\u2713','chi':'\\u03C7','Chi':'\\u03A7','cir':'\\u25CB','circ':'\\u02C6','circeq':'\\u2257','circlearrowleft':'\\u21BA','circlearrowright':'\\u21BB','circledast':'\\u229B','circledcirc':'\\u229A','circleddash':'\\u229D','CircleDot':'\\u2299','circledR':'\\xAE','circledS':'\\u24C8','CircleMinus':'\\u2296','CirclePlus':'\\u2295','CircleTimes':'\\u2297','cire':'\\u2257','cirE':'\\u29C3','cirfnint':'\\u2A10','cirmid':'\\u2AEF','cirscir':'\\u29C2','ClockwiseContourIntegral':'\\u2232','CloseCurlyDoubleQuote':'\\u201D','CloseCurlyQuote':'\\u2019','clubs':'\\u2663','clubsuit':'\\u2663','colon':':','Colon':'\\u2237','colone':'\\u2254','Colone':'\\u2A74','coloneq':'\\u2254','comma':',','commat':'@','comp':'\\u2201','compfn':'\\u2218','complement':'\\u2201','complexes':'\\u2102','cong':'\\u2245','congdot':'\\u2A6D','Congruent':'\\u2261','conint':'\\u222E','Conint':'\\u222F','ContourIntegral':'\\u222E','copf':'\\uD835\\uDD54','Copf':'\\u2102','coprod':'\\u2210','Coproduct':'\\u2210','copy':'\\xA9','COPY':'\\xA9','copysr':'\\u2117','CounterClockwiseContourIntegral':'\\u2233','crarr':'\\u21B5','cross':'\\u2717','Cross':'\\u2A2F','cscr':'\\uD835\\uDCB8','Cscr':'\\uD835\\uDC9E','csub':'\\u2ACF','csube':'\\u2AD1','csup':'\\u2AD0','csupe':'\\u2AD2','ctdot':'\\u22EF','cudarrl':'\\u2938','cudarrr':'\\u2935','cuepr':'\\u22DE','cuesc':'\\u22DF','cularr':'\\u21B6','cularrp':'\\u293D','cup':'\\u222A','Cup':'\\u22D3','cupbrcap':'\\u2A48','cupcap':'\\u2A46','CupCap':'\\u224D','cupcup':'\\u2A4A','cupdot':'\\u228D','cupor':'\\u2A45','cups':'\\u222A\\uFE00','curarr':'\\u21B7','curarrm':'\\u293C','curlyeqprec':'\\u22DE','curlyeqsucc':'\\u22DF','curlyvee':'\\u22CE','curlywedge':'\\u22CF','curren':'\\xA4','curvearrowleft':'\\u21B6','curvearrowright':'\\u21B7','cuvee':'\\u22CE','cuwed':'\\u22CF','cwconint':'\\u2232','cwint':'\\u2231','cylcty':'\\u232D','dagger':'\\u2020','Dagger':'\\u2021','daleth':'\\u2138','darr':'\\u2193','dArr':'\\u21D3','Darr':'\\u21A1','dash':'\\u2010','dashv':'\\u22A3','Dashv':'\\u2AE4','dbkarow':'\\u290F','dblac':'\\u02DD','dcaron':'\\u010F','Dcaron':'\\u010E','dcy':'\\u0434','Dcy':'\\u0414','dd':'\\u2146','DD':'\\u2145','ddagger':'\\u2021','ddarr':'\\u21CA','DDotrahd':'\\u2911','ddotseq':'\\u2A77','deg':'\\xB0','Del':'\\u2207','delta':'\\u03B4','Delta':'\\u0394','demptyv':'\\u29B1','dfisht':'\\u297F','dfr':'\\uD835\\uDD21','Dfr':'\\uD835\\uDD07','dHar':'\\u2965','dharl':'\\u21C3','dharr':'\\u21C2','DiacriticalAcute':'\\xB4','DiacriticalDot':'\\u02D9','DiacriticalDoubleAcute':'\\u02DD','DiacriticalGrave':'`','DiacriticalTilde':'\\u02DC','diam':'\\u22C4','diamond':'\\u22C4','Diamond':'\\u22C4','diamondsuit':'\\u2666','diams':'\\u2666','die':'\\xA8','DifferentialD':'\\u2146','digamma':'\\u03DD','disin':'\\u22F2','div':'\\xF7','divide':'\\xF7','divideontimes':'\\u22C7','divonx':'\\u22C7','djcy':'\\u0452','DJcy':'\\u0402','dlcorn':'\\u231E','dlcrop':'\\u230D','dollar':'$','dopf':'\\uD835\\uDD55','Dopf':'\\uD835\\uDD3B','dot':'\\u02D9','Dot':'\\xA8','DotDot':'\\u20DC','doteq':'\\u2250','doteqdot':'\\u2251','DotEqual':'\\u2250','dotminus':'\\u2238','dotplus':'\\u2214','dotsquare':'\\u22A1','doublebarwedge':'\\u2306','DoubleContourIntegral':'\\u222F','DoubleDot':'\\xA8','DoubleDownArrow':'\\u21D3','DoubleLeftArrow':'\\u21D0','DoubleLeftRightArrow':'\\u21D4','DoubleLeftTee':'\\u2AE4','DoubleLongLeftArrow':'\\u27F8','DoubleLongLeftRightArrow':'\\u27FA','DoubleLongRightArrow':'\\u27F9','DoubleRightArrow':'\\u21D2','DoubleRightTee':'\\u22A8','DoubleUpArrow':'\\u21D1','DoubleUpDownArrow':'\\u21D5','DoubleVerticalBar':'\\u2225','downarrow':'\\u2193','Downarrow':'\\u21D3','DownArrow':'\\u2193','DownArrowBar':'\\u2913','DownArrowUpArrow':'\\u21F5','DownBreve':'\\u0311','downdownarrows':'\\u21CA','downharpoonleft':'\\u21C3','downharpoonright':'\\u21C2','DownLeftRightVector':'\\u2950','DownLeftTeeVector':'\\u295E','DownLeftVector':'\\u21BD','DownLeftVectorBar':'\\u2956','DownRightTeeVector':'\\u295F','DownRightVector':'\\u21C1','DownRightVectorBar':'\\u2957','DownTee':'\\u22A4','DownTeeArrow':'\\u21A7','drbkarow':'\\u2910','drcorn':'\\u231F','drcrop':'\\u230C','dscr':'\\uD835\\uDCB9','Dscr':'\\uD835\\uDC9F','dscy':'\\u0455','DScy':'\\u0405','dsol':'\\u29F6','dstrok':'\\u0111','Dstrok':'\\u0110','dtdot':'\\u22F1','dtri':'\\u25BF','dtrif':'\\u25BE','duarr':'\\u21F5','duhar':'\\u296F','dwangle':'\\u29A6','dzcy':'\\u045F','DZcy':'\\u040F','dzigrarr':'\\u27FF','eacute':'\\xE9','Eacute':'\\xC9','easter':'\\u2A6E','ecaron':'\\u011B','Ecaron':'\\u011A','ecir':'\\u2256','ecirc':'\\xEA','Ecirc':'\\xCA','ecolon':'\\u2255','ecy':'\\u044D','Ecy':'\\u042D','eDDot':'\\u2A77','edot':'\\u0117','eDot':'\\u2251','Edot':'\\u0116','ee':'\\u2147','efDot':'\\u2252','efr':'\\uD835\\uDD22','Efr':'\\uD835\\uDD08','eg':'\\u2A9A','egrave':'\\xE8','Egrave':'\\xC8','egs':'\\u2A96','egsdot':'\\u2A98','el':'\\u2A99','Element':'\\u2208','elinters':'\\u23E7','ell':'\\u2113','els':'\\u2A95','elsdot':'\\u2A97','emacr':'\\u0113','Emacr':'\\u0112','empty':'\\u2205','emptyset':'\\u2205','EmptySmallSquare':'\\u25FB','emptyv':'\\u2205','EmptyVerySmallSquare':'\\u25AB','emsp':'\\u2003','emsp13':'\\u2004','emsp14':'\\u2005','eng':'\\u014B','ENG':'\\u014A','ensp':'\\u2002','eogon':'\\u0119','Eogon':'\\u0118','eopf':'\\uD835\\uDD56','Eopf':'\\uD835\\uDD3C','epar':'\\u22D5','eparsl':'\\u29E3','eplus':'\\u2A71','epsi':'\\u03B5','epsilon':'\\u03B5','Epsilon':'\\u0395','epsiv':'\\u03F5','eqcirc':'\\u2256','eqcolon':'\\u2255','eqsim':'\\u2242','eqslantgtr':'\\u2A96','eqslantless':'\\u2A95','Equal':'\\u2A75','equals':'=','EqualTilde':'\\u2242','equest':'\\u225F','Equilibrium':'\\u21CC','equiv':'\\u2261','equivDD':'\\u2A78','eqvparsl':'\\u29E5','erarr':'\\u2971','erDot':'\\u2253','escr':'\\u212F','Escr':'\\u2130','esdot':'\\u2250','esim':'\\u2242','Esim':'\\u2A73','eta':'\\u03B7','Eta':'\\u0397','eth':'\\xF0','ETH':'\\xD0','euml':'\\xEB','Euml':'\\xCB','euro':'\\u20AC','excl':'!','exist':'\\u2203','Exists':'\\u2203','expectation':'\\u2130','exponentiale':'\\u2147','ExponentialE':'\\u2147','fallingdotseq':'\\u2252','fcy':'\\u0444','Fcy':'\\u0424','female':'\\u2640','ffilig':'\\uFB03','fflig':'\\uFB00','ffllig':'\\uFB04','ffr':'\\uD835\\uDD23','Ffr':'\\uD835\\uDD09','filig':'\\uFB01','FilledSmallSquare':'\\u25FC','FilledVerySmallSquare':'\\u25AA','fjlig':'fj','flat':'\\u266D','fllig':'\\uFB02','fltns':'\\u25B1','fnof':'\\u0192','fopf':'\\uD835\\uDD57','Fopf':'\\uD835\\uDD3D','forall':'\\u2200','ForAll':'\\u2200','fork':'\\u22D4','forkv':'\\u2AD9','Fouriertrf':'\\u2131','fpartint':'\\u2A0D','frac12':'\\xBD','frac13':'\\u2153','frac14':'\\xBC','frac15':'\\u2155','frac16':'\\u2159','frac18':'\\u215B','frac23':'\\u2154','frac25':'\\u2156','frac34':'\\xBE','frac35':'\\u2157','frac38':'\\u215C','frac45':'\\u2158','frac56':'\\u215A','frac58':'\\u215D','frac78':'\\u215E','frasl':'\\u2044','frown':'\\u2322','fscr':'\\uD835\\uDCBB','Fscr':'\\u2131','gacute':'\\u01F5','gamma':'\\u03B3','Gamma':'\\u0393','gammad':'\\u03DD','Gammad':'\\u03DC','gap':'\\u2A86','gbreve':'\\u011F','Gbreve':'\\u011E','Gcedil':'\\u0122','gcirc':'\\u011D','Gcirc':'\\u011C','gcy':'\\u0433','Gcy':'\\u0413','gdot':'\\u0121','Gdot':'\\u0120','ge':'\\u2265','gE':'\\u2267','gel':'\\u22DB','gEl':'\\u2A8C','geq':'\\u2265','geqq':'\\u2267','geqslant':'\\u2A7E','ges':'\\u2A7E','gescc':'\\u2AA9','gesdot':'\\u2A80','gesdoto':'\\u2A82','gesdotol':'\\u2A84','gesl':'\\u22DB\\uFE00','gesles':'\\u2A94','gfr':'\\uD835\\uDD24','Gfr':'\\uD835\\uDD0A','gg':'\\u226B','Gg':'\\u22D9','ggg':'\\u22D9','gimel':'\\u2137','gjcy':'\\u0453','GJcy':'\\u0403','gl':'\\u2277','gla':'\\u2AA5','glE':'\\u2A92','glj':'\\u2AA4','gnap':'\\u2A8A','gnapprox':'\\u2A8A','gne':'\\u2A88','gnE':'\\u2269','gneq':'\\u2A88','gneqq':'\\u2269','gnsim':'\\u22E7','gopf':'\\uD835\\uDD58','Gopf':'\\uD835\\uDD3E','grave':'`','GreaterEqual':'\\u2265','GreaterEqualLess':'\\u22DB','GreaterFullEqual':'\\u2267','GreaterGreater':'\\u2AA2','GreaterLess':'\\u2277','GreaterSlantEqual':'\\u2A7E','GreaterTilde':'\\u2273','gscr':'\\u210A','Gscr':'\\uD835\\uDCA2','gsim':'\\u2273','gsime':'\\u2A8E','gsiml':'\\u2A90','gt':'>','Gt':'\\u226B','GT':'>','gtcc':'\\u2AA7','gtcir':'\\u2A7A','gtdot':'\\u22D7','gtlPar':'\\u2995','gtquest':'\\u2A7C','gtrapprox':'\\u2A86','gtrarr':'\\u2978','gtrdot':'\\u22D7','gtreqless':'\\u22DB','gtreqqless':'\\u2A8C','gtrless':'\\u2277','gtrsim':'\\u2273','gvertneqq':'\\u2269\\uFE00','gvnE':'\\u2269\\uFE00','Hacek':'\\u02C7','hairsp':'\\u200A','half':'\\xBD','hamilt':'\\u210B','hardcy':'\\u044A','HARDcy':'\\u042A','harr':'\\u2194','hArr':'\\u21D4','harrcir':'\\u2948','harrw':'\\u21AD','Hat':'^','hbar':'\\u210F','hcirc':'\\u0125','Hcirc':'\\u0124','hearts':'\\u2665','heartsuit':'\\u2665','hellip':'\\u2026','hercon':'\\u22B9','hfr':'\\uD835\\uDD25','Hfr':'\\u210C','HilbertSpace':'\\u210B','hksearow':'\\u2925','hkswarow':'\\u2926','hoarr':'\\u21FF','homtht':'\\u223B','hookleftarrow':'\\u21A9','hookrightarrow':'\\u21AA','hopf':'\\uD835\\uDD59','Hopf':'\\u210D','horbar':'\\u2015','HorizontalLine':'\\u2500','hscr':'\\uD835\\uDCBD','Hscr':'\\u210B','hslash':'\\u210F','hstrok':'\\u0127','Hstrok':'\\u0126','HumpDownHump':'\\u224E','HumpEqual':'\\u224F','hybull':'\\u2043','hyphen':'\\u2010','iacute':'\\xED','Iacute':'\\xCD','ic':'\\u2063','icirc':'\\xEE','Icirc':'\\xCE','icy':'\\u0438','Icy':'\\u0418','Idot':'\\u0130','iecy':'\\u0435','IEcy':'\\u0415','iexcl':'\\xA1','iff':'\\u21D4','ifr':'\\uD835\\uDD26','Ifr':'\\u2111','igrave':'\\xEC','Igrave':'\\xCC','ii':'\\u2148','iiiint':'\\u2A0C','iiint':'\\u222D','iinfin':'\\u29DC','iiota':'\\u2129','ijlig':'\\u0133','IJlig':'\\u0132','Im':'\\u2111','imacr':'\\u012B','Imacr':'\\u012A','image':'\\u2111','ImaginaryI':'\\u2148','imagline':'\\u2110','imagpart':'\\u2111','imath':'\\u0131','imof':'\\u22B7','imped':'\\u01B5','Implies':'\\u21D2','in':'\\u2208','incare':'\\u2105','infin':'\\u221E','infintie':'\\u29DD','inodot':'\\u0131','int':'\\u222B','Int':'\\u222C','intcal':'\\u22BA','integers':'\\u2124','Integral':'\\u222B','intercal':'\\u22BA','Intersection':'\\u22C2','intlarhk':'\\u2A17','intprod':'\\u2A3C','InvisibleComma':'\\u2063','InvisibleTimes':'\\u2062','iocy':'\\u0451','IOcy':'\\u0401','iogon':'\\u012F','Iogon':'\\u012E','iopf':'\\uD835\\uDD5A','Iopf':'\\uD835\\uDD40','iota':'\\u03B9','Iota':'\\u0399','iprod':'\\u2A3C','iquest':'\\xBF','iscr':'\\uD835\\uDCBE','Iscr':'\\u2110','isin':'\\u2208','isindot':'\\u22F5','isinE':'\\u22F9','isins':'\\u22F4','isinsv':'\\u22F3','isinv':'\\u2208','it':'\\u2062','itilde':'\\u0129','Itilde':'\\u0128','iukcy':'\\u0456','Iukcy':'\\u0406','iuml':'\\xEF','Iuml':'\\xCF','jcirc':'\\u0135','Jcirc':'\\u0134','jcy':'\\u0439','Jcy':'\\u0419','jfr':'\\uD835\\uDD27','Jfr':'\\uD835\\uDD0D','jmath':'\\u0237','jopf':'\\uD835\\uDD5B','Jopf':'\\uD835\\uDD41','jscr':'\\uD835\\uDCBF','Jscr':'\\uD835\\uDCA5','jsercy':'\\u0458','Jsercy':'\\u0408','jukcy':'\\u0454','Jukcy':'\\u0404','kappa':'\\u03BA','Kappa':'\\u039A','kappav':'\\u03F0','kcedil':'\\u0137','Kcedil':'\\u0136','kcy':'\\u043A','Kcy':'\\u041A','kfr':'\\uD835\\uDD28','Kfr':'\\uD835\\uDD0E','kgreen':'\\u0138','khcy':'\\u0445','KHcy':'\\u0425','kjcy':'\\u045C','KJcy':'\\u040C','kopf':'\\uD835\\uDD5C','Kopf':'\\uD835\\uDD42','kscr':'\\uD835\\uDCC0','Kscr':'\\uD835\\uDCA6','lAarr':'\\u21DA','lacute':'\\u013A','Lacute':'\\u0139','laemptyv':'\\u29B4','lagran':'\\u2112','lambda':'\\u03BB','Lambda':'\\u039B','lang':'\\u27E8','Lang':'\\u27EA','langd':'\\u2991','langle':'\\u27E8','lap':'\\u2A85','Laplacetrf':'\\u2112','laquo':'\\xAB','larr':'\\u2190','lArr':'\\u21D0','Larr':'\\u219E','larrb':'\\u21E4','larrbfs':'\\u291F','larrfs':'\\u291D','larrhk':'\\u21A9','larrlp':'\\u21AB','larrpl':'\\u2939','larrsim':'\\u2973','larrtl':'\\u21A2','lat':'\\u2AAB','latail':'\\u2919','lAtail':'\\u291B','late':'\\u2AAD','lates':'\\u2AAD\\uFE00','lbarr':'\\u290C','lBarr':'\\u290E','lbbrk':'\\u2772','lbrace':'{','lbrack':'[','lbrke':'\\u298B','lbrksld':'\\u298F','lbrkslu':'\\u298D','lcaron':'\\u013E','Lcaron':'\\u013D','lcedil':'\\u013C','Lcedil':'\\u013B','lceil':'\\u2308','lcub':'{','lcy':'\\u043B','Lcy':'\\u041B','ldca':'\\u2936','ldquo':'\\u201C','ldquor':'\\u201E','ldrdhar':'\\u2967','ldrushar':'\\u294B','ldsh':'\\u21B2','le':'\\u2264','lE':'\\u2266','LeftAngleBracket':'\\u27E8','leftarrow':'\\u2190','Leftarrow':'\\u21D0','LeftArrow':'\\u2190','LeftArrowBar':'\\u21E4','LeftArrowRightArrow':'\\u21C6','leftarrowtail':'\\u21A2','LeftCeiling':'\\u2308','LeftDoubleBracket':'\\u27E6','LeftDownTeeVector':'\\u2961','LeftDownVector':'\\u21C3','LeftDownVectorBar':'\\u2959','LeftFloor':'\\u230A','leftharpoondown':'\\u21BD','leftharpoonup':'\\u21BC','leftleftarrows':'\\u21C7','leftrightarrow':'\\u2194','Leftrightarrow':'\\u21D4','LeftRightArrow':'\\u2194','leftrightarrows':'\\u21C6','leftrightharpoons':'\\u21CB','leftrightsquigarrow':'\\u21AD','LeftRightVector':'\\u294E','LeftTee':'\\u22A3','LeftTeeArrow':'\\u21A4','LeftTeeVector':'\\u295A','leftthreetimes':'\\u22CB','LeftTriangle':'\\u22B2','LeftTriangleBar':'\\u29CF','LeftTriangleEqual':'\\u22B4','LeftUpDownVector':'\\u2951','LeftUpTeeVector':'\\u2960','LeftUpVector':'\\u21BF','LeftUpVectorBar':'\\u2958','LeftVector':'\\u21BC','LeftVectorBar':'\\u2952','leg':'\\u22DA','lEg':'\\u2A8B','leq':'\\u2264','leqq':'\\u2266','leqslant':'\\u2A7D','les':'\\u2A7D','lescc':'\\u2AA8','lesdot':'\\u2A7F','lesdoto':'\\u2A81','lesdotor':'\\u2A83','lesg':'\\u22DA\\uFE00','lesges':'\\u2A93','lessapprox':'\\u2A85','lessdot':'\\u22D6','lesseqgtr':'\\u22DA','lesseqqgtr':'\\u2A8B','LessEqualGreater':'\\u22DA','LessFullEqual':'\\u2266','LessGreater':'\\u2276','lessgtr':'\\u2276','LessLess':'\\u2AA1','lesssim':'\\u2272','LessSlantEqual':'\\u2A7D','LessTilde':'\\u2272','lfisht':'\\u297C','lfloor':'\\u230A','lfr':'\\uD835\\uDD29','Lfr':'\\uD835\\uDD0F','lg':'\\u2276','lgE':'\\u2A91','lHar':'\\u2962','lhard':'\\u21BD','lharu':'\\u21BC','lharul':'\\u296A','lhblk':'\\u2584','ljcy':'\\u0459','LJcy':'\\u0409','ll':'\\u226A','Ll':'\\u22D8','llarr':'\\u21C7','llcorner':'\\u231E','Lleftarrow':'\\u21DA','llhard':'\\u296B','lltri':'\\u25FA','lmidot':'\\u0140','Lmidot':'\\u013F','lmoust':'\\u23B0','lmoustache':'\\u23B0','lnap':'\\u2A89','lnapprox':'\\u2A89','lne':'\\u2A87','lnE':'\\u2268','lneq':'\\u2A87','lneqq':'\\u2268','lnsim':'\\u22E6','loang':'\\u27EC','loarr':'\\u21FD','lobrk':'\\u27E6','longleftarrow':'\\u27F5','Longleftarrow':'\\u27F8','LongLeftArrow':'\\u27F5','longleftrightarrow':'\\u27F7','Longleftrightarrow':'\\u27FA','LongLeftRightArrow':'\\u27F7','longmapsto':'\\u27FC','longrightarrow':'\\u27F6','Longrightarrow':'\\u27F9','LongRightArrow':'\\u27F6','looparrowleft':'\\u21AB','looparrowright':'\\u21AC','lopar':'\\u2985','lopf':'\\uD835\\uDD5D','Lopf':'\\uD835\\uDD43','loplus':'\\u2A2D','lotimes':'\\u2A34','lowast':'\\u2217','lowbar':'_','LowerLeftArrow':'\\u2199','LowerRightArrow':'\\u2198','loz':'\\u25CA','lozenge':'\\u25CA','lozf':'\\u29EB','lpar':'(','lparlt':'\\u2993','lrarr':'\\u21C6','lrcorner':'\\u231F','lrhar':'\\u21CB','lrhard':'\\u296D','lrm':'\\u200E','lrtri':'\\u22BF','lsaquo':'\\u2039','lscr':'\\uD835\\uDCC1','Lscr':'\\u2112','lsh':'\\u21B0','Lsh':'\\u21B0','lsim':'\\u2272','lsime':'\\u2A8D','lsimg':'\\u2A8F','lsqb':'[','lsquo':'\\u2018','lsquor':'\\u201A','lstrok':'\\u0142','Lstrok':'\\u0141','lt':'<','Lt':'\\u226A','LT':'<','ltcc':'\\u2AA6','ltcir':'\\u2A79','ltdot':'\\u22D6','lthree':'\\u22CB','ltimes':'\\u22C9','ltlarr':'\\u2976','ltquest':'\\u2A7B','ltri':'\\u25C3','ltrie':'\\u22B4','ltrif':'\\u25C2','ltrPar':'\\u2996','lurdshar':'\\u294A','luruhar':'\\u2966','lvertneqq':'\\u2268\\uFE00','lvnE':'\\u2268\\uFE00','macr':'\\xAF','male':'\\u2642','malt':'\\u2720','maltese':'\\u2720','map':'\\u21A6','Map':'\\u2905','mapsto':'\\u21A6','mapstodown':'\\u21A7','mapstoleft':'\\u21A4','mapstoup':'\\u21A5','marker':'\\u25AE','mcomma':'\\u2A29','mcy':'\\u043C','Mcy':'\\u041C','mdash':'\\u2014','mDDot':'\\u223A','measuredangle':'\\u2221','MediumSpace':'\\u205F','Mellintrf':'\\u2133','mfr':'\\uD835\\uDD2A','Mfr':'\\uD835\\uDD10','mho':'\\u2127','micro':'\\xB5','mid':'\\u2223','midast':'*','midcir':'\\u2AF0','middot':'\\xB7','minus':'\\u2212','minusb':'\\u229F','minusd':'\\u2238','minusdu':'\\u2A2A','MinusPlus':'\\u2213','mlcp':'\\u2ADB','mldr':'\\u2026','mnplus':'\\u2213','models':'\\u22A7','mopf':'\\uD835\\uDD5E','Mopf':'\\uD835\\uDD44','mp':'\\u2213','mscr':'\\uD835\\uDCC2','Mscr':'\\u2133','mstpos':'\\u223E','mu':'\\u03BC','Mu':'\\u039C','multimap':'\\u22B8','mumap':'\\u22B8','nabla':'\\u2207','nacute':'\\u0144','Nacute':'\\u0143','nang':'\\u2220\\u20D2','nap':'\\u2249','napE':'\\u2A70\\u0338','napid':'\\u224B\\u0338','napos':'\\u0149','napprox':'\\u2249','natur':'\\u266E','natural':'\\u266E','naturals':'\\u2115','nbsp':'\\xA0','nbump':'\\u224E\\u0338','nbumpe':'\\u224F\\u0338','ncap':'\\u2A43','ncaron':'\\u0148','Ncaron':'\\u0147','ncedil':'\\u0146','Ncedil':'\\u0145','ncong':'\\u2247','ncongdot':'\\u2A6D\\u0338','ncup':'\\u2A42','ncy':'\\u043D','Ncy':'\\u041D','ndash':'\\u2013','ne':'\\u2260','nearhk':'\\u2924','nearr':'\\u2197','neArr':'\\u21D7','nearrow':'\\u2197','nedot':'\\u2250\\u0338','NegativeMediumSpace':'\\u200B','NegativeThickSpace':'\\u200B','NegativeThinSpace':'\\u200B','NegativeVeryThinSpace':'\\u200B','nequiv':'\\u2262','nesear':'\\u2928','nesim':'\\u2242\\u0338','NestedGreaterGreater':'\\u226B','NestedLessLess':'\\u226A','NewLine':'\\n','nexist':'\\u2204','nexists':'\\u2204','nfr':'\\uD835\\uDD2B','Nfr':'\\uD835\\uDD11','nge':'\\u2271','ngE':'\\u2267\\u0338','ngeq':'\\u2271','ngeqq':'\\u2267\\u0338','ngeqslant':'\\u2A7E\\u0338','nges':'\\u2A7E\\u0338','nGg':'\\u22D9\\u0338','ngsim':'\\u2275','ngt':'\\u226F','nGt':'\\u226B\\u20D2','ngtr':'\\u226F','nGtv':'\\u226B\\u0338','nharr':'\\u21AE','nhArr':'\\u21CE','nhpar':'\\u2AF2','ni':'\\u220B','nis':'\\u22FC','nisd':'\\u22FA','niv':'\\u220B','njcy':'\\u045A','NJcy':'\\u040A','nlarr':'\\u219A','nlArr':'\\u21CD','nldr':'\\u2025','nle':'\\u2270','nlE':'\\u2266\\u0338','nleftarrow':'\\u219A','nLeftarrow':'\\u21CD','nleftrightarrow':'\\u21AE','nLeftrightarrow':'\\u21CE','nleq':'\\u2270','nleqq':'\\u2266\\u0338','nleqslant':'\\u2A7D\\u0338','nles':'\\u2A7D\\u0338','nless':'\\u226E','nLl':'\\u22D8\\u0338','nlsim':'\\u2274','nlt':'\\u226E','nLt':'\\u226A\\u20D2','nltri':'\\u22EA','nltrie':'\\u22EC','nLtv':'\\u226A\\u0338','nmid':'\\u2224','NoBreak':'\\u2060','NonBreakingSpace':'\\xA0','nopf':'\\uD835\\uDD5F','Nopf':'\\u2115','not':'\\xAC','Not':'\\u2AEC','NotCongruent':'\\u2262','NotCupCap':'\\u226D','NotDoubleVerticalBar':'\\u2226','NotElement':'\\u2209','NotEqual':'\\u2260','NotEqualTilde':'\\u2242\\u0338','NotExists':'\\u2204','NotGreater':'\\u226F','NotGreaterEqual':'\\u2271','NotGreaterFullEqual':'\\u2267\\u0338','NotGreaterGreater':'\\u226B\\u0338','NotGreaterLess':'\\u2279','NotGreaterSlantEqual':'\\u2A7E\\u0338','NotGreaterTilde':'\\u2275','NotHumpDownHump':'\\u224E\\u0338','NotHumpEqual':'\\u224F\\u0338','notin':'\\u2209','notindot':'\\u22F5\\u0338','notinE':'\\u22F9\\u0338','notinva':'\\u2209','notinvb':'\\u22F7','notinvc':'\\u22F6','NotLeftTriangle':'\\u22EA','NotLeftTriangleBar':'\\u29CF\\u0338','NotLeftTriangleEqual':'\\u22EC','NotLess':'\\u226E','NotLessEqual':'\\u2270','NotLessGreater':'\\u2278','NotLessLess':'\\u226A\\u0338','NotLessSlantEqual':'\\u2A7D\\u0338','NotLessTilde':'\\u2274','NotNestedGreaterGreater':'\\u2AA2\\u0338','NotNestedLessLess':'\\u2AA1\\u0338','notni':'\\u220C','notniva':'\\u220C','notnivb':'\\u22FE','notnivc':'\\u22FD','NotPrecedes':'\\u2280','NotPrecedesEqual':'\\u2AAF\\u0338','NotPrecedesSlantEqual':'\\u22E0','NotReverseElement':'\\u220C','NotRightTriangle':'\\u22EB','NotRightTriangleBar':'\\u29D0\\u0338','NotRightTriangleEqual':'\\u22ED','NotSquareSubset':'\\u228F\\u0338','NotSquareSubsetEqual':'\\u22E2','NotSquareSuperset':'\\u2290\\u0338','NotSquareSupersetEqual':'\\u22E3','NotSubset':'\\u2282\\u20D2','NotSubsetEqual':'\\u2288','NotSucceeds':'\\u2281','NotSucceedsEqual':'\\u2AB0\\u0338','NotSucceedsSlantEqual':'\\u22E1','NotSucceedsTilde':'\\u227F\\u0338','NotSuperset':'\\u2283\\u20D2','NotSupersetEqual':'\\u2289','NotTilde':'\\u2241','NotTildeEqual':'\\u2244','NotTildeFullEqual':'\\u2247','NotTildeTilde':'\\u2249','NotVerticalBar':'\\u2224','npar':'\\u2226','nparallel':'\\u2226','nparsl':'\\u2AFD\\u20E5','npart':'\\u2202\\u0338','npolint':'\\u2A14','npr':'\\u2280','nprcue':'\\u22E0','npre':'\\u2AAF\\u0338','nprec':'\\u2280','npreceq':'\\u2AAF\\u0338','nrarr':'\\u219B','nrArr':'\\u21CF','nrarrc':'\\u2933\\u0338','nrarrw':'\\u219D\\u0338','nrightarrow':'\\u219B','nRightarrow':'\\u21CF','nrtri':'\\u22EB','nrtrie':'\\u22ED','nsc':'\\u2281','nsccue':'\\u22E1','nsce':'\\u2AB0\\u0338','nscr':'\\uD835\\uDCC3','Nscr':'\\uD835\\uDCA9','nshortmid':'\\u2224','nshortparallel':'\\u2226','nsim':'\\u2241','nsime':'\\u2244','nsimeq':'\\u2244','nsmid':'\\u2224','nspar':'\\u2226','nsqsube':'\\u22E2','nsqsupe':'\\u22E3','nsub':'\\u2284','nsube':'\\u2288','nsubE':'\\u2AC5\\u0338','nsubset':'\\u2282\\u20D2','nsubseteq':'\\u2288','nsubseteqq':'\\u2AC5\\u0338','nsucc':'\\u2281','nsucceq':'\\u2AB0\\u0338','nsup':'\\u2285','nsupe':'\\u2289','nsupE':'\\u2AC6\\u0338','nsupset':'\\u2283\\u20D2','nsupseteq':'\\u2289','nsupseteqq':'\\u2AC6\\u0338','ntgl':'\\u2279','ntilde':'\\xF1','Ntilde':'\\xD1','ntlg':'\\u2278','ntriangleleft':'\\u22EA','ntrianglelefteq':'\\u22EC','ntriangleright':'\\u22EB','ntrianglerighteq':'\\u22ED','nu':'\\u03BD','Nu':'\\u039D','num':'#','numero':'\\u2116','numsp':'\\u2007','nvap':'\\u224D\\u20D2','nvdash':'\\u22AC','nvDash':'\\u22AD','nVdash':'\\u22AE','nVDash':'\\u22AF','nvge':'\\u2265\\u20D2','nvgt':'>\\u20D2','nvHarr':'\\u2904','nvinfin':'\\u29DE','nvlArr':'\\u2902','nvle':'\\u2264\\u20D2','nvlt':'<\\u20D2','nvltrie':'\\u22B4\\u20D2','nvrArr':'\\u2903','nvrtrie':'\\u22B5\\u20D2','nvsim':'\\u223C\\u20D2','nwarhk':'\\u2923','nwarr':'\\u2196','nwArr':'\\u21D6','nwarrow':'\\u2196','nwnear':'\\u2927','oacute':'\\xF3','Oacute':'\\xD3','oast':'\\u229B','ocir':'\\u229A','ocirc':'\\xF4','Ocirc':'\\xD4','ocy':'\\u043E','Ocy':'\\u041E','odash':'\\u229D','odblac':'\\u0151','Odblac':'\\u0150','odiv':'\\u2A38','odot':'\\u2299','odsold':'\\u29BC','oelig':'\\u0153','OElig':'\\u0152','ofcir':'\\u29BF','ofr':'\\uD835\\uDD2C','Ofr':'\\uD835\\uDD12','ogon':'\\u02DB','ograve':'\\xF2','Ograve':'\\xD2','ogt':'\\u29C1','ohbar':'\\u29B5','ohm':'\\u03A9','oint':'\\u222E','olarr':'\\u21BA','olcir':'\\u29BE','olcross':'\\u29BB','oline':'\\u203E','olt':'\\u29C0','omacr':'\\u014D','Omacr':'\\u014C','omega':'\\u03C9','Omega':'\\u03A9','omicron':'\\u03BF','Omicron':'\\u039F','omid':'\\u29B6','ominus':'\\u2296','oopf':'\\uD835\\uDD60','Oopf':'\\uD835\\uDD46','opar':'\\u29B7','OpenCurlyDoubleQuote':'\\u201C','OpenCurlyQuote':'\\u2018','operp':'\\u29B9','oplus':'\\u2295','or':'\\u2228','Or':'\\u2A54','orarr':'\\u21BB','ord':'\\u2A5D','order':'\\u2134','orderof':'\\u2134','ordf':'\\xAA','ordm':'\\xBA','origof':'\\u22B6','oror':'\\u2A56','orslope':'\\u2A57','orv':'\\u2A5B','oS':'\\u24C8','oscr':'\\u2134','Oscr':'\\uD835\\uDCAA','oslash':'\\xF8','Oslash':'\\xD8','osol':'\\u2298','otilde':'\\xF5','Otilde':'\\xD5','otimes':'\\u2297','Otimes':'\\u2A37','otimesas':'\\u2A36','ouml':'\\xF6','Ouml':'\\xD6','ovbar':'\\u233D','OverBar':'\\u203E','OverBrace':'\\u23DE','OverBracket':'\\u23B4','OverParenthesis':'\\u23DC','par':'\\u2225','para':'\\xB6','parallel':'\\u2225','parsim':'\\u2AF3','parsl':'\\u2AFD','part':'\\u2202','PartialD':'\\u2202','pcy':'\\u043F','Pcy':'\\u041F','percnt':'%','period':'.','permil':'\\u2030','perp':'\\u22A5','pertenk':'\\u2031','pfr':'\\uD835\\uDD2D','Pfr':'\\uD835\\uDD13','phi':'\\u03C6','Phi':'\\u03A6','phiv':'\\u03D5','phmmat':'\\u2133','phone':'\\u260E','pi':'\\u03C0','Pi':'\\u03A0','pitchfork':'\\u22D4','piv':'\\u03D6','planck':'\\u210F','planckh':'\\u210E','plankv':'\\u210F','plus':'+','plusacir':'\\u2A23','plusb':'\\u229E','pluscir':'\\u2A22','plusdo':'\\u2214','plusdu':'\\u2A25','pluse':'\\u2A72','PlusMinus':'\\xB1','plusmn':'\\xB1','plussim':'\\u2A26','plustwo':'\\u2A27','pm':'\\xB1','Poincareplane':'\\u210C','pointint':'\\u2A15','popf':'\\uD835\\uDD61','Popf':'\\u2119','pound':'\\xA3','pr':'\\u227A','Pr':'\\u2ABB','prap':'\\u2AB7','prcue':'\\u227C','pre':'\\u2AAF','prE':'\\u2AB3','prec':'\\u227A','precapprox':'\\u2AB7','preccurlyeq':'\\u227C','Precedes':'\\u227A','PrecedesEqual':'\\u2AAF','PrecedesSlantEqual':'\\u227C','PrecedesTilde':'\\u227E','preceq':'\\u2AAF','precnapprox':'\\u2AB9','precneqq':'\\u2AB5','precnsim':'\\u22E8','precsim':'\\u227E','prime':'\\u2032','Prime':'\\u2033','primes':'\\u2119','prnap':'\\u2AB9','prnE':'\\u2AB5','prnsim':'\\u22E8','prod':'\\u220F','Product':'\\u220F','profalar':'\\u232E','profline':'\\u2312','profsurf':'\\u2313','prop':'\\u221D','Proportion':'\\u2237','Proportional':'\\u221D','propto':'\\u221D','prsim':'\\u227E','prurel':'\\u22B0','pscr':'\\uD835\\uDCC5','Pscr':'\\uD835\\uDCAB','psi':'\\u03C8','Psi':'\\u03A8','puncsp':'\\u2008','qfr':'\\uD835\\uDD2E','Qfr':'\\uD835\\uDD14','qint':'\\u2A0C','qopf':'\\uD835\\uDD62','Qopf':'\\u211A','qprime':'\\u2057','qscr':'\\uD835\\uDCC6','Qscr':'\\uD835\\uDCAC','quaternions':'\\u210D','quatint':'\\u2A16','quest':'?','questeq':'\\u225F','quot':'\"','QUOT':'\"','rAarr':'\\u21DB','race':'\\u223D\\u0331','racute':'\\u0155','Racute':'\\u0154','radic':'\\u221A','raemptyv':'\\u29B3','rang':'\\u27E9','Rang':'\\u27EB','rangd':'\\u2992','range':'\\u29A5','rangle':'\\u27E9','raquo':'\\xBB','rarr':'\\u2192','rArr':'\\u21D2','Rarr':'\\u21A0','rarrap':'\\u2975','rarrb':'\\u21E5','rarrbfs':'\\u2920','rarrc':'\\u2933','rarrfs':'\\u291E','rarrhk':'\\u21AA','rarrlp':'\\u21AC','rarrpl':'\\u2945','rarrsim':'\\u2974','rarrtl':'\\u21A3','Rarrtl':'\\u2916','rarrw':'\\u219D','ratail':'\\u291A','rAtail':'\\u291C','ratio':'\\u2236','rationals':'\\u211A','rbarr':'\\u290D','rBarr':'\\u290F','RBarr':'\\u2910','rbbrk':'\\u2773','rbrace':'}','rbrack':']','rbrke':'\\u298C','rbrksld':'\\u298E','rbrkslu':'\\u2990','rcaron':'\\u0159','Rcaron':'\\u0158','rcedil':'\\u0157','Rcedil':'\\u0156','rceil':'\\u2309','rcub':'}','rcy':'\\u0440','Rcy':'\\u0420','rdca':'\\u2937','rdldhar':'\\u2969','rdquo':'\\u201D','rdquor':'\\u201D','rdsh':'\\u21B3','Re':'\\u211C','real':'\\u211C','realine':'\\u211B','realpart':'\\u211C','reals':'\\u211D','rect':'\\u25AD','reg':'\\xAE','REG':'\\xAE','ReverseElement':'\\u220B','ReverseEquilibrium':'\\u21CB','ReverseUpEquilibrium':'\\u296F','rfisht':'\\u297D','rfloor':'\\u230B','rfr':'\\uD835\\uDD2F','Rfr':'\\u211C','rHar':'\\u2964','rhard':'\\u21C1','rharu':'\\u21C0','rharul':'\\u296C','rho':'\\u03C1','Rho':'\\u03A1','rhov':'\\u03F1','RightAngleBracket':'\\u27E9','rightarrow':'\\u2192','Rightarrow':'\\u21D2','RightArrow':'\\u2192','RightArrowBar':'\\u21E5','RightArrowLeftArrow':'\\u21C4','rightarrowtail':'\\u21A3','RightCeiling':'\\u2309','RightDoubleBracket':'\\u27E7','RightDownTeeVector':'\\u295D','RightDownVector':'\\u21C2','RightDownVectorBar':'\\u2955','RightFloor':'\\u230B','rightharpoondown':'\\u21C1','rightharpoonup':'\\u21C0','rightleftarrows':'\\u21C4','rightleftharpoons':'\\u21CC','rightrightarrows':'\\u21C9','rightsquigarrow':'\\u219D','RightTee':'\\u22A2','RightTeeArrow':'\\u21A6','RightTeeVector':'\\u295B','rightthreetimes':'\\u22CC','RightTriangle':'\\u22B3','RightTriangleBar':'\\u29D0','RightTriangleEqual':'\\u22B5','RightUpDownVector':'\\u294F','RightUpTeeVector':'\\u295C','RightUpVector':'\\u21BE','RightUpVectorBar':'\\u2954','RightVector':'\\u21C0','RightVectorBar':'\\u2953','ring':'\\u02DA','risingdotseq':'\\u2253','rlarr':'\\u21C4','rlhar':'\\u21CC','rlm':'\\u200F','rmoust':'\\u23B1','rmoustache':'\\u23B1','rnmid':'\\u2AEE','roang':'\\u27ED','roarr':'\\u21FE','robrk':'\\u27E7','ropar':'\\u2986','ropf':'\\uD835\\uDD63','Ropf':'\\u211D','roplus':'\\u2A2E','rotimes':'\\u2A35','RoundImplies':'\\u2970','rpar':')','rpargt':'\\u2994','rppolint':'\\u2A12','rrarr':'\\u21C9','Rrightarrow':'\\u21DB','rsaquo':'\\u203A','rscr':'\\uD835\\uDCC7','Rscr':'\\u211B','rsh':'\\u21B1','Rsh':'\\u21B1','rsqb':']','rsquo':'\\u2019','rsquor':'\\u2019','rthree':'\\u22CC','rtimes':'\\u22CA','rtri':'\\u25B9','rtrie':'\\u22B5','rtrif':'\\u25B8','rtriltri':'\\u29CE','RuleDelayed':'\\u29F4','ruluhar':'\\u2968','rx':'\\u211E','sacute':'\\u015B','Sacute':'\\u015A','sbquo':'\\u201A','sc':'\\u227B','Sc':'\\u2ABC','scap':'\\u2AB8','scaron':'\\u0161','Scaron':'\\u0160','sccue':'\\u227D','sce':'\\u2AB0','scE':'\\u2AB4','scedil':'\\u015F','Scedil':'\\u015E','scirc':'\\u015D','Scirc':'\\u015C','scnap':'\\u2ABA','scnE':'\\u2AB6','scnsim':'\\u22E9','scpolint':'\\u2A13','scsim':'\\u227F','scy':'\\u0441','Scy':'\\u0421','sdot':'\\u22C5','sdotb':'\\u22A1','sdote':'\\u2A66','searhk':'\\u2925','searr':'\\u2198','seArr':'\\u21D8','searrow':'\\u2198','sect':'\\xA7','semi':';','seswar':'\\u2929','setminus':'\\u2216','setmn':'\\u2216','sext':'\\u2736','sfr':'\\uD835\\uDD30','Sfr':'\\uD835\\uDD16','sfrown':'\\u2322','sharp':'\\u266F','shchcy':'\\u0449','SHCHcy':'\\u0429','shcy':'\\u0448','SHcy':'\\u0428','ShortDownArrow':'\\u2193','ShortLeftArrow':'\\u2190','shortmid':'\\u2223','shortparallel':'\\u2225','ShortRightArrow':'\\u2192','ShortUpArrow':'\\u2191','shy':'\\xAD','sigma':'\\u03C3','Sigma':'\\u03A3','sigmaf':'\\u03C2','sigmav':'\\u03C2','sim':'\\u223C','simdot':'\\u2A6A','sime':'\\u2243','simeq':'\\u2243','simg':'\\u2A9E','simgE':'\\u2AA0','siml':'\\u2A9D','simlE':'\\u2A9F','simne':'\\u2246','simplus':'\\u2A24','simrarr':'\\u2972','slarr':'\\u2190','SmallCircle':'\\u2218','smallsetminus':'\\u2216','smashp':'\\u2A33','smeparsl':'\\u29E4','smid':'\\u2223','smile':'\\u2323','smt':'\\u2AAA','smte':'\\u2AAC','smtes':'\\u2AAC\\uFE00','softcy':'\\u044C','SOFTcy':'\\u042C','sol':'/','solb':'\\u29C4','solbar':'\\u233F','sopf':'\\uD835\\uDD64','Sopf':'\\uD835\\uDD4A','spades':'\\u2660','spadesuit':'\\u2660','spar':'\\u2225','sqcap':'\\u2293','sqcaps':'\\u2293\\uFE00','sqcup':'\\u2294','sqcups':'\\u2294\\uFE00','Sqrt':'\\u221A','sqsub':'\\u228F','sqsube':'\\u2291','sqsubset':'\\u228F','sqsubseteq':'\\u2291','sqsup':'\\u2290','sqsupe':'\\u2292','sqsupset':'\\u2290','sqsupseteq':'\\u2292','squ':'\\u25A1','square':'\\u25A1','Square':'\\u25A1','SquareIntersection':'\\u2293','SquareSubset':'\\u228F','SquareSubsetEqual':'\\u2291','SquareSuperset':'\\u2290','SquareSupersetEqual':'\\u2292','SquareUnion':'\\u2294','squarf':'\\u25AA','squf':'\\u25AA','srarr':'\\u2192','sscr':'\\uD835\\uDCC8','Sscr':'\\uD835\\uDCAE','ssetmn':'\\u2216','ssmile':'\\u2323','sstarf':'\\u22C6','star':'\\u2606','Star':'\\u22C6','starf':'\\u2605','straightepsilon':'\\u03F5','straightphi':'\\u03D5','strns':'\\xAF','sub':'\\u2282','Sub':'\\u22D0','subdot':'\\u2ABD','sube':'\\u2286','subE':'\\u2AC5','subedot':'\\u2AC3','submult':'\\u2AC1','subne':'\\u228A','subnE':'\\u2ACB','subplus':'\\u2ABF','subrarr':'\\u2979','subset':'\\u2282','Subset':'\\u22D0','subseteq':'\\u2286','subseteqq':'\\u2AC5','SubsetEqual':'\\u2286','subsetneq':'\\u228A','subsetneqq':'\\u2ACB','subsim':'\\u2AC7','subsub':'\\u2AD5','subsup':'\\u2AD3','succ':'\\u227B','succapprox':'\\u2AB8','succcurlyeq':'\\u227D','Succeeds':'\\u227B','SucceedsEqual':'\\u2AB0','SucceedsSlantEqual':'\\u227D','SucceedsTilde':'\\u227F','succeq':'\\u2AB0','succnapprox':'\\u2ABA','succneqq':'\\u2AB6','succnsim':'\\u22E9','succsim':'\\u227F','SuchThat':'\\u220B','sum':'\\u2211','Sum':'\\u2211','sung':'\\u266A','sup':'\\u2283','Sup':'\\u22D1','sup1':'\\xB9','sup2':'\\xB2','sup3':'\\xB3','supdot':'\\u2ABE','supdsub':'\\u2AD8','supe':'\\u2287','supE':'\\u2AC6','supedot':'\\u2AC4','Superset':'\\u2283','SupersetEqual':'\\u2287','suphsol':'\\u27C9','suphsub':'\\u2AD7','suplarr':'\\u297B','supmult':'\\u2AC2','supne':'\\u228B','supnE':'\\u2ACC','supplus':'\\u2AC0','supset':'\\u2283','Supset':'\\u22D1','supseteq':'\\u2287','supseteqq':'\\u2AC6','supsetneq':'\\u228B','supsetneqq':'\\u2ACC','supsim':'\\u2AC8','supsub':'\\u2AD4','supsup':'\\u2AD6','swarhk':'\\u2926','swarr':'\\u2199','swArr':'\\u21D9','swarrow':'\\u2199','swnwar':'\\u292A','szlig':'\\xDF','Tab':'\\t','target':'\\u2316','tau':'\\u03C4','Tau':'\\u03A4','tbrk':'\\u23B4','tcaron':'\\u0165','Tcaron':'\\u0164','tcedil':'\\u0163','Tcedil':'\\u0162','tcy':'\\u0442','Tcy':'\\u0422','tdot':'\\u20DB','telrec':'\\u2315','tfr':'\\uD835\\uDD31','Tfr':'\\uD835\\uDD17','there4':'\\u2234','therefore':'\\u2234','Therefore':'\\u2234','theta':'\\u03B8','Theta':'\\u0398','thetasym':'\\u03D1','thetav':'\\u03D1','thickapprox':'\\u2248','thicksim':'\\u223C','ThickSpace':'\\u205F\\u200A','thinsp':'\\u2009','ThinSpace':'\\u2009','thkap':'\\u2248','thksim':'\\u223C','thorn':'\\xFE','THORN':'\\xDE','tilde':'\\u02DC','Tilde':'\\u223C','TildeEqual':'\\u2243','TildeFullEqual':'\\u2245','TildeTilde':'\\u2248','times':'\\xD7','timesb':'\\u22A0','timesbar':'\\u2A31','timesd':'\\u2A30','tint':'\\u222D','toea':'\\u2928','top':'\\u22A4','topbot':'\\u2336','topcir':'\\u2AF1','topf':'\\uD835\\uDD65','Topf':'\\uD835\\uDD4B','topfork':'\\u2ADA','tosa':'\\u2929','tprime':'\\u2034','trade':'\\u2122','TRADE':'\\u2122','triangle':'\\u25B5','triangledown':'\\u25BF','triangleleft':'\\u25C3','trianglelefteq':'\\u22B4','triangleq':'\\u225C','triangleright':'\\u25B9','trianglerighteq':'\\u22B5','tridot':'\\u25EC','trie':'\\u225C','triminus':'\\u2A3A','TripleDot':'\\u20DB','triplus':'\\u2A39','trisb':'\\u29CD','tritime':'\\u2A3B','trpezium':'\\u23E2','tscr':'\\uD835\\uDCC9','Tscr':'\\uD835\\uDCAF','tscy':'\\u0446','TScy':'\\u0426','tshcy':'\\u045B','TSHcy':'\\u040B','tstrok':'\\u0167','Tstrok':'\\u0166','twixt':'\\u226C','twoheadleftarrow':'\\u219E','twoheadrightarrow':'\\u21A0','uacute':'\\xFA','Uacute':'\\xDA','uarr':'\\u2191','uArr':'\\u21D1','Uarr':'\\u219F','Uarrocir':'\\u2949','ubrcy':'\\u045E','Ubrcy':'\\u040E','ubreve':'\\u016D','Ubreve':'\\u016C','ucirc':'\\xFB','Ucirc':'\\xDB','ucy':'\\u0443','Ucy':'\\u0423','udarr':'\\u21C5','udblac':'\\u0171','Udblac':'\\u0170','udhar':'\\u296E','ufisht':'\\u297E','ufr':'\\uD835\\uDD32','Ufr':'\\uD835\\uDD18','ugrave':'\\xF9','Ugrave':'\\xD9','uHar':'\\u2963','uharl':'\\u21BF','uharr':'\\u21BE','uhblk':'\\u2580','ulcorn':'\\u231C','ulcorner':'\\u231C','ulcrop':'\\u230F','ultri':'\\u25F8','umacr':'\\u016B','Umacr':'\\u016A','uml':'\\xA8','UnderBar':'_','UnderBrace':'\\u23DF','UnderBracket':'\\u23B5','UnderParenthesis':'\\u23DD','Union':'\\u22C3','UnionPlus':'\\u228E','uogon':'\\u0173','Uogon':'\\u0172','uopf':'\\uD835\\uDD66','Uopf':'\\uD835\\uDD4C','uparrow':'\\u2191','Uparrow':'\\u21D1','UpArrow':'\\u2191','UpArrowBar':'\\u2912','UpArrowDownArrow':'\\u21C5','updownarrow':'\\u2195','Updownarrow':'\\u21D5','UpDownArrow':'\\u2195','UpEquilibrium':'\\u296E','upharpoonleft':'\\u21BF','upharpoonright':'\\u21BE','uplus':'\\u228E','UpperLeftArrow':'\\u2196','UpperRightArrow':'\\u2197','upsi':'\\u03C5','Upsi':'\\u03D2','upsih':'\\u03D2','upsilon':'\\u03C5','Upsilon':'\\u03A5','UpTee':'\\u22A5','UpTeeArrow':'\\u21A5','upuparrows':'\\u21C8','urcorn':'\\u231D','urcorner':'\\u231D','urcrop':'\\u230E','uring':'\\u016F','Uring':'\\u016E','urtri':'\\u25F9','uscr':'\\uD835\\uDCCA','Uscr':'\\uD835\\uDCB0','utdot':'\\u22F0','utilde':'\\u0169','Utilde':'\\u0168','utri':'\\u25B5','utrif':'\\u25B4','uuarr':'\\u21C8','uuml':'\\xFC','Uuml':'\\xDC','uwangle':'\\u29A7','vangrt':'\\u299C','varepsilon':'\\u03F5','varkappa':'\\u03F0','varnothing':'\\u2205','varphi':'\\u03D5','varpi':'\\u03D6','varpropto':'\\u221D','varr':'\\u2195','vArr':'\\u21D5','varrho':'\\u03F1','varsigma':'\\u03C2','varsubsetneq':'\\u228A\\uFE00','varsubsetneqq':'\\u2ACB\\uFE00','varsupsetneq':'\\u228B\\uFE00','varsupsetneqq':'\\u2ACC\\uFE00','vartheta':'\\u03D1','vartriangleleft':'\\u22B2','vartriangleright':'\\u22B3','vBar':'\\u2AE8','Vbar':'\\u2AEB','vBarv':'\\u2AE9','vcy':'\\u0432','Vcy':'\\u0412','vdash':'\\u22A2','vDash':'\\u22A8','Vdash':'\\u22A9','VDash':'\\u22AB','Vdashl':'\\u2AE6','vee':'\\u2228','Vee':'\\u22C1','veebar':'\\u22BB','veeeq':'\\u225A','vellip':'\\u22EE','verbar':'|','Verbar':'\\u2016','vert':'|','Vert':'\\u2016','VerticalBar':'\\u2223','VerticalLine':'|','VerticalSeparator':'\\u2758','VerticalTilde':'\\u2240','VeryThinSpace':'\\u200A','vfr':'\\uD835\\uDD33','Vfr':'\\uD835\\uDD19','vltri':'\\u22B2','vnsub':'\\u2282\\u20D2','vnsup':'\\u2283\\u20D2','vopf':'\\uD835\\uDD67','Vopf':'\\uD835\\uDD4D','vprop':'\\u221D','vrtri':'\\u22B3','vscr':'\\uD835\\uDCCB','Vscr':'\\uD835\\uDCB1','vsubne':'\\u228A\\uFE00','vsubnE':'\\u2ACB\\uFE00','vsupne':'\\u228B\\uFE00','vsupnE':'\\u2ACC\\uFE00','Vvdash':'\\u22AA','vzigzag':'\\u299A','wcirc':'\\u0175','Wcirc':'\\u0174','wedbar':'\\u2A5F','wedge':'\\u2227','Wedge':'\\u22C0','wedgeq':'\\u2259','weierp':'\\u2118','wfr':'\\uD835\\uDD34','Wfr':'\\uD835\\uDD1A','wopf':'\\uD835\\uDD68','Wopf':'\\uD835\\uDD4E','wp':'\\u2118','wr':'\\u2240','wreath':'\\u2240','wscr':'\\uD835\\uDCCC','Wscr':'\\uD835\\uDCB2','xcap':'\\u22C2','xcirc':'\\u25EF','xcup':'\\u22C3','xdtri':'\\u25BD','xfr':'\\uD835\\uDD35','Xfr':'\\uD835\\uDD1B','xharr':'\\u27F7','xhArr':'\\u27FA','xi':'\\u03BE','Xi':'\\u039E','xlarr':'\\u27F5','xlArr':'\\u27F8','xmap':'\\u27FC','xnis':'\\u22FB','xodot':'\\u2A00','xopf':'\\uD835\\uDD69','Xopf':'\\uD835\\uDD4F','xoplus':'\\u2A01','xotime':'\\u2A02','xrarr':'\\u27F6','xrArr':'\\u27F9','xscr':'\\uD835\\uDCCD','Xscr':'\\uD835\\uDCB3','xsqcup':'\\u2A06','xuplus':'\\u2A04','xutri':'\\u25B3','xvee':'\\u22C1','xwedge':'\\u22C0','yacute':'\\xFD','Yacute':'\\xDD','yacy':'\\u044F','YAcy':'\\u042F','ycirc':'\\u0177','Ycirc':'\\u0176','ycy':'\\u044B','Ycy':'\\u042B','yen':'\\xA5','yfr':'\\uD835\\uDD36','Yfr':'\\uD835\\uDD1C','yicy':'\\u0457','YIcy':'\\u0407','yopf':'\\uD835\\uDD6A','Yopf':'\\uD835\\uDD50','yscr':'\\uD835\\uDCCE','Yscr':'\\uD835\\uDCB4','yucy':'\\u044E','YUcy':'\\u042E','yuml':'\\xFF','Yuml':'\\u0178','zacute':'\\u017A','Zacute':'\\u0179','zcaron':'\\u017E','Zcaron':'\\u017D','zcy':'\\u0437','Zcy':'\\u0417','zdot':'\\u017C','Zdot':'\\u017B','zeetrf':'\\u2128','ZeroWidthSpace':'\\u200B','zeta':'\\u03B6','Zeta':'\\u0396','zfr':'\\uD835\\uDD37','Zfr':'\\u2128','zhcy':'\\u0436','ZHcy':'\\u0416','zigrarr':'\\u21DD','zopf':'\\uD835\\uDD6B','Zopf':'\\u2124','zscr':'\\uD835\\uDCCF','Zscr':'\\uD835\\uDCB5','zwj':'\\u200D','zwnj':'\\u200C'};\n\tvar decodeMapLegacy = {'aacute':'\\xE1','Aacute':'\\xC1','acirc':'\\xE2','Acirc':'\\xC2','acute':'\\xB4','aelig':'\\xE6','AElig':'\\xC6','agrave':'\\xE0','Agrave':'\\xC0','amp':'&','AMP':'&','aring':'\\xE5','Aring':'\\xC5','atilde':'\\xE3','Atilde':'\\xC3','auml':'\\xE4','Auml':'\\xC4','brvbar':'\\xA6','ccedil':'\\xE7','Ccedil':'\\xC7','cedil':'\\xB8','cent':'\\xA2','copy':'\\xA9','COPY':'\\xA9','curren':'\\xA4','deg':'\\xB0','divide':'\\xF7','eacute':'\\xE9','Eacute':'\\xC9','ecirc':'\\xEA','Ecirc':'\\xCA','egrave':'\\xE8','Egrave':'\\xC8','eth':'\\xF0','ETH':'\\xD0','euml':'\\xEB','Euml':'\\xCB','frac12':'\\xBD','frac14':'\\xBC','frac34':'\\xBE','gt':'>','GT':'>','iacute':'\\xED','Iacute':'\\xCD','icirc':'\\xEE','Icirc':'\\xCE','iexcl':'\\xA1','igrave':'\\xEC','Igrave':'\\xCC','iquest':'\\xBF','iuml':'\\xEF','Iuml':'\\xCF','laquo':'\\xAB','lt':'<','LT':'<','macr':'\\xAF','micro':'\\xB5','middot':'\\xB7','nbsp':'\\xA0','not':'\\xAC','ntilde':'\\xF1','Ntilde':'\\xD1','oacute':'\\xF3','Oacute':'\\xD3','ocirc':'\\xF4','Ocirc':'\\xD4','ograve':'\\xF2','Ograve':'\\xD2','ordf':'\\xAA','ordm':'\\xBA','oslash':'\\xF8','Oslash':'\\xD8','otilde':'\\xF5','Otilde':'\\xD5','ouml':'\\xF6','Ouml':'\\xD6','para':'\\xB6','plusmn':'\\xB1','pound':'\\xA3','quot':'\"','QUOT':'\"','raquo':'\\xBB','reg':'\\xAE','REG':'\\xAE','sect':'\\xA7','shy':'\\xAD','sup1':'\\xB9','sup2':'\\xB2','sup3':'\\xB3','szlig':'\\xDF','thorn':'\\xFE','THORN':'\\xDE','times':'\\xD7','uacute':'\\xFA','Uacute':'\\xDA','ucirc':'\\xFB','Ucirc':'\\xDB','ugrave':'\\xF9','Ugrave':'\\xD9','uml':'\\xA8','uuml':'\\xFC','Uuml':'\\xDC','yacute':'\\xFD','Yacute':'\\xDD','yen':'\\xA5','yuml':'\\xFF'};\n\tvar decodeMapNumeric = {'0':'\\uFFFD','128':'\\u20AC','130':'\\u201A','131':'\\u0192','132':'\\u201E','133':'\\u2026','134':'\\u2020','135':'\\u2021','136':'\\u02C6','137':'\\u2030','138':'\\u0160','139':'\\u2039','140':'\\u0152','142':'\\u017D','145':'\\u2018','146':'\\u2019','147':'\\u201C','148':'\\u201D','149':'\\u2022','150':'\\u2013','151':'\\u2014','152':'\\u02DC','153':'\\u2122','154':'\\u0161','155':'\\u203A','156':'\\u0153','158':'\\u017E','159':'\\u0178'};\n\tvar invalidReferenceCodePoints = [1,2,3,4,5,6,7,8,11,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,64976,64977,64978,64979,64980,64981,64982,64983,64984,64985,64986,64987,64988,64989,64990,64991,64992,64993,64994,64995,64996,64997,64998,64999,65000,65001,65002,65003,65004,65005,65006,65007,65534,65535,131070,131071,196606,196607,262142,262143,327678,327679,393214,393215,458750,458751,524286,524287,589822,589823,655358,655359,720894,720895,786430,786431,851966,851967,917502,917503,983038,983039,1048574,1048575,1114110,1114111];\n\n\t/*--------------------------------------------------------------------------*/\n\n\tvar stringFromCharCode = String.fromCharCode;\n\n\tvar object = {};\n\tvar hasOwnProperty = object.hasOwnProperty;\n\tvar has = function(object, propertyName) {\n\t\treturn hasOwnProperty.call(object, propertyName);\n\t};\n\n\tvar contains = function(array, value) {\n\t\tvar index = -1;\n\t\tvar length = array.length;\n\t\twhile (++index < length) {\n\t\t\tif (array[index] == value) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t};\n\n\tvar merge = function(options, defaults) {\n\t\tif (!options) {\n\t\t\treturn defaults;\n\t\t}\n\t\tvar result = {};\n\t\tvar key;\n\t\tfor (key in defaults) {\n\t\t\t// A `hasOwnProperty` check is not needed here, since only recognized\n\t\t\t// option names are used anyway. Any others are ignored.\n\t\t\tresult[key] = has(options, key) ? options[key] : defaults[key];\n\t\t}\n\t\treturn result;\n\t};\n\n\t// Modified version of `ucs2encode`; see https://mths.be/punycode.\n\tvar codePointToSymbol = function(codePoint, strict) {\n\t\tvar output = '';\n\t\tif ((codePoint >= 0xD800 && codePoint <= 0xDFFF) || codePoint > 0x10FFFF) {\n\t\t\t// See issue #4:\n\t\t\t// “Otherwise, if the number is in the range 0xD800 to 0xDFFF or is\n\t\t\t// greater than 0x10FFFF, then this is a parse error. Return a U+FFFD\n\t\t\t// REPLACEMENT CHARACTER.”\n\t\t\tif (strict) {\n\t\t\t\tparseError('character reference outside the permissible Unicode range');\n\t\t\t}\n\t\t\treturn '\\uFFFD';\n\t\t}\n\t\tif (has(decodeMapNumeric, codePoint)) {\n\t\t\tif (strict) {\n\t\t\t\tparseError('disallowed character reference');\n\t\t\t}\n\t\t\treturn decodeMapNumeric[codePoint];\n\t\t}\n\t\tif (strict && contains(invalidReferenceCodePoints, codePoint)) {\n\t\t\tparseError('disallowed character reference');\n\t\t}\n\t\tif (codePoint > 0xFFFF) {\n\t\t\tcodePoint -= 0x10000;\n\t\t\toutput += stringFromCharCode(codePoint >>> 10 & 0x3FF | 0xD800);\n\t\t\tcodePoint = 0xDC00 | codePoint & 0x3FF;\n\t\t}\n\t\toutput += stringFromCharCode(codePoint);\n\t\treturn output;\n\t};\n\n\tvar hexEscape = function(codePoint) {\n\t\treturn '&#x' + codePoint.toString(16).toUpperCase() + ';';\n\t};\n\n\tvar decEscape = function(codePoint) {\n\t\treturn '&#' + codePoint + ';';\n\t};\n\n\tvar parseError = function(message) {\n\t\tthrow Error('Parse error: ' + message);\n\t};\n\n\t/*--------------------------------------------------------------------------*/\n\n\tvar encode = function(string, options) {\n\t\toptions = merge(options, encode.options);\n\t\tvar strict = options.strict;\n\t\tif (strict && regexInvalidRawCodePoint.test(string)) {\n\t\t\tparseError('forbidden code point');\n\t\t}\n\t\tvar encodeEverything = options.encodeEverything;\n\t\tvar useNamedReferences = options.useNamedReferences;\n\t\tvar allowUnsafeSymbols = options.allowUnsafeSymbols;\n\t\tvar escapeCodePoint = options.decimal ? decEscape : hexEscape;\n\n\t\tvar escapeBmpSymbol = function(symbol) {\n\t\t\treturn escapeCodePoint(symbol.charCodeAt(0));\n\t\t};\n\n\t\tif (encodeEverything) {\n\t\t\t// Encode ASCII symbols.\n\t\t\tstring = string.replace(regexAsciiWhitelist, function(symbol) {\n\t\t\t\t// Use named references if requested & possible.\n\t\t\t\tif (useNamedReferences && has(encodeMap, symbol)) {\n\t\t\t\t\treturn '&' + encodeMap[symbol] + ';';\n\t\t\t\t}\n\t\t\t\treturn escapeBmpSymbol(symbol);\n\t\t\t});\n\t\t\t// Shorten a few escapes that represent two symbols, of which at least one\n\t\t\t// is within the ASCII range.\n\t\t\tif (useNamedReferences) {\n\t\t\t\tstring = string\n\t\t\t\t\t.replace(/>\\u20D2/g, '>⃒')\n\t\t\t\t\t.replace(/<\\u20D2/g, '<⃒')\n\t\t\t\t\t.replace(/fj/g, 'fj');\n\t\t\t}\n\t\t\t// Encode non-ASCII symbols.\n\t\t\tif (useNamedReferences) {\n\t\t\t\t// Encode non-ASCII symbols that can be replaced with a named reference.\n\t\t\t\tstring = string.replace(regexEncodeNonAscii, function(string) {\n\t\t\t\t\t// Note: there is no need to check `has(encodeMap, string)` here.\n\t\t\t\t\treturn '&' + encodeMap[string] + ';';\n\t\t\t\t});\n\t\t\t}\n\t\t\t// Note: any remaining non-ASCII symbols are handled outside of the `if`.\n\t\t} else if (useNamedReferences) {\n\t\t\t// Apply named character references.\n\t\t\t// Encode `<>\"'&` using named character references.\n\t\t\tif (!allowUnsafeSymbols) {\n\t\t\t\tstring = string.replace(regexEscape, function(string) {\n\t\t\t\t\treturn '&' + encodeMap[string] + ';'; // no need to check `has()` here\n\t\t\t\t});\n\t\t\t}\n\t\t\t// Shorten escapes that represent two symbols, of which at least one is\n\t\t\t// `<>\"'&`.\n\t\t\tstring = string\n\t\t\t\t.replace(/>\\u20D2/g, '>⃒')\n\t\t\t\t.replace(/<\\u20D2/g, '<⃒');\n\t\t\t// Encode non-ASCII symbols that can be replaced with a named reference.\n\t\t\tstring = string.replace(regexEncodeNonAscii, function(string) {\n\t\t\t\t// Note: there is no need to check `has(encodeMap, string)` here.\n\t\t\t\treturn '&' + encodeMap[string] + ';';\n\t\t\t});\n\t\t} else if (!allowUnsafeSymbols) {\n\t\t\t// Encode `<>\"'&` using hexadecimal escapes, now that they’re not handled\n\t\t\t// using named character references.\n\t\t\tstring = string.replace(regexEscape, escapeBmpSymbol);\n\t\t}\n\t\treturn string\n\t\t\t// Encode astral symbols.\n\t\t\t.replace(regexAstralSymbols, function($0) {\n\t\t\t\t// https://mathiasbynens.be/notes/javascript-encoding#surrogate-formulae\n\t\t\t\tvar high = $0.charCodeAt(0);\n\t\t\t\tvar low = $0.charCodeAt(1);\n\t\t\t\tvar codePoint = (high - 0xD800) * 0x400 + low - 0xDC00 + 0x10000;\n\t\t\t\treturn escapeCodePoint(codePoint);\n\t\t\t})\n\t\t\t// Encode any remaining BMP symbols that are not printable ASCII symbols\n\t\t\t// using a hexadecimal escape.\n\t\t\t.replace(regexBmpWhitelist, escapeBmpSymbol);\n\t};\n\t// Expose default options (so they can be overridden globally).\n\tencode.options = {\n\t\t'allowUnsafeSymbols': false,\n\t\t'encodeEverything': false,\n\t\t'strict': false,\n\t\t'useNamedReferences': false,\n\t\t'decimal' : false\n\t};\n\n\tvar decode = function(html, options) {\n\t\toptions = merge(options, decode.options);\n\t\tvar strict = options.strict;\n\t\tif (strict && regexInvalidEntity.test(html)) {\n\t\t\tparseError('malformed character reference');\n\t\t}\n\t\treturn html.replace(regexDecode, function($0, $1, $2, $3, $4, $5, $6, $7, $8) {\n\t\t\tvar codePoint;\n\t\t\tvar semicolon;\n\t\t\tvar decDigits;\n\t\t\tvar hexDigits;\n\t\t\tvar reference;\n\t\t\tvar next;\n\n\t\t\tif ($1) {\n\t\t\t\treference = $1;\n\t\t\t\t// Note: there is no need to check `has(decodeMap, reference)`.\n\t\t\t\treturn decodeMap[reference];\n\t\t\t}\n\n\t\t\tif ($2) {\n\t\t\t\t// Decode named character references without trailing `;`, e.g. `&`.\n\t\t\t\t// This is only a parse error if it gets converted to `&`, or if it is\n\t\t\t\t// followed by `=` in an attribute context.\n\t\t\t\treference = $2;\n\t\t\t\tnext = $3;\n\t\t\t\tif (next && options.isAttributeValue) {\n\t\t\t\t\tif (strict && next == '=') {\n\t\t\t\t\t\tparseError('`&` did not start a character reference');\n\t\t\t\t\t}\n\t\t\t\t\treturn $0;\n\t\t\t\t} else {\n\t\t\t\t\tif (strict) {\n\t\t\t\t\t\tparseError(\n\t\t\t\t\t\t\t'named character reference was not terminated by a semicolon'\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t\t// Note: there is no need to check `has(decodeMapLegacy, reference)`.\n\t\t\t\t\treturn decodeMapLegacy[reference] + (next || '');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif ($4) {\n\t\t\t\t// Decode decimal escapes, e.g. `𝌆`.\n\t\t\t\tdecDigits = $4;\n\t\t\t\tsemicolon = $5;\n\t\t\t\tif (strict && !semicolon) {\n\t\t\t\t\tparseError('character reference was not terminated by a semicolon');\n\t\t\t\t}\n\t\t\t\tcodePoint = parseInt(decDigits, 10);\n\t\t\t\treturn codePointToSymbol(codePoint, strict);\n\t\t\t}\n\n\t\t\tif ($6) {\n\t\t\t\t// Decode hexadecimal escapes, e.g. `𝌆`.\n\t\t\t\thexDigits = $6;\n\t\t\t\tsemicolon = $7;\n\t\t\t\tif (strict && !semicolon) {\n\t\t\t\t\tparseError('character reference was not terminated by a semicolon');\n\t\t\t\t}\n\t\t\t\tcodePoint = parseInt(hexDigits, 16);\n\t\t\t\treturn codePointToSymbol(codePoint, strict);\n\t\t\t}\n\n\t\t\t// If we’re still here, `if ($7)` is implied; it’s an ambiguous\n\t\t\t// ampersand for sure. https://mths.be/notes/ambiguous-ampersands\n\t\t\tif (strict) {\n\t\t\t\tparseError(\n\t\t\t\t\t'named character reference was not terminated by a semicolon'\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn $0;\n\t\t});\n\t};\n\t// Expose default options (so they can be overridden globally).\n\tdecode.options = {\n\t\t'isAttributeValue': false,\n\t\t'strict': false\n\t};\n\n\tvar escape = function(string) {\n\t\treturn string.replace(regexEscape, function($0) {\n\t\t\t// Note: there is no need to check `has(escapeMap, $0)` here.\n\t\t\treturn escapeMap[$0];\n\t\t});\n\t};\n\n\t/*--------------------------------------------------------------------------*/\n\n\tvar he = {\n\t\t'version': '1.2.0',\n\t\t'encode': encode,\n\t\t'decode': decode,\n\t\t'escape': escape,\n\t\t'unescape': decode\n\t};\n\n\t// Some AMD build optimizers, like r.js, check for specific condition patterns\n\t// like the following:\n\tif (\n\t\ttypeof define == 'function' &&\n\t\ttypeof define.amd == 'object' &&\n\t\tdefine.amd\n\t) {\n\t\tdefine(function() {\n\t\t\treturn he;\n\t\t});\n\t}\telse if (freeExports && !freeExports.nodeType) {\n\t\tif (freeModule) { // in Node.js, io.js, or RingoJS v0.8.0+\n\t\t\tfreeModule.exports = he;\n\t\t} else { // in Narwhal or RingoJS v0.7.0-\n\t\t\tfor (var key in he) {\n\t\t\t\thas(he, key) && (freeExports[key] = he[key]);\n\t\t\t}\n\t\t}\n\t} else { // in Rhino or a web browser\n\t\troot.he = he;\n\t}\n\n}(this));\n","if (typeof Object.create === 'function') {\n // implementation from standard node.js 'util' module\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n ctor.prototype = Object.create(superCtor.prototype, {\n constructor: {\n value: ctor,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n };\n} else {\n // old school shim for old browsers\n module.exports = function inherits(ctor, superCtor) {\n ctor.super_ = superCtor\n var TempCtor = function () {}\n TempCtor.prototype = superCtor.prototype\n ctor.prototype = new TempCtor()\n ctor.prototype.constructor = ctor\n }\n}\n","// Generated by CoffeeScript 1.6.3\n(function() {\n var Locale, Locales, app, _ref,\n __slice = [].slice;\n\n app = function(supported, def) {\n if (!(supported instanceof Locales)) {\n supported = new Locales(supported, def);\n supported.index();\n }\n return function(req, res, next) {\n var bestLocale, locales;\n locales = new Locales(req.headers[\"accept-language\"]);\n bestLocale = locales.best(supported);\n req.locale = String(bestLocale);\n req.rawLocale = bestLocale;\n return next();\n };\n };\n\n app.Locale = (function() {\n var serialize;\n\n Locale[\"default\"] = new Locale(process.env.LANG || \"en_US\");\n\n function Locale(str) {\n var country, language, match, normalized;\n if (!(match = str != null ? str.match(/[a-z]+/gi) : void 0)) {\n return;\n }\n language = match[0], country = match[1];\n this.code = str;\n this.language = language.toLowerCase();\n if (country) {\n this.country = country.toUpperCase();\n }\n normalized = [this.language];\n if (this.country) {\n normalized.push(this.country);\n }\n this.normalized = normalized.join(\"_\");\n }\n\n serialize = function() {\n if (this.language) {\n return this.code;\n } else {\n return null;\n }\n };\n\n Locale.prototype.toString = serialize;\n\n Locale.prototype.toJSON = serialize;\n\n return Locale;\n\n })();\n\n app.Locales = (function() {\n var serialize;\n\n Locales.prototype.length = 0;\n\n Locales.prototype._index = null;\n\n Locales.prototype.sort = Array.prototype.sort;\n\n Locales.prototype.push = Array.prototype.push;\n\n function Locales(str, def) {\n var item, locale, q, _i, _len, _ref, _ref1;\n if (def) {\n this[\"default\"] = new Locale(def);\n }\n if (!str) {\n return;\n }\n _ref = (String(str)).split(\",\");\n for (_i = 0, _len = _ref.length; _i < _len; _i++) {\n item = _ref[_i];\n _ref1 = item.split(\";\"), locale = _ref1[0], q = _ref1[1];\n locale = new Locale(locale.trim());\n locale.score = q ? +q.slice(2) || 0 : 1;\n this.push(locale);\n }\n this.sort(function(a, b) {\n return b.score - a.score;\n });\n }\n\n Locales.prototype.index = function() {\n var idx, locale, _i, _len;\n if (!this._index) {\n this._index = {};\n for (idx = _i = 0, _len = this.length; _i < _len; idx = ++_i) {\n locale = this[idx];\n this._index[locale.normalized] = idx;\n }\n }\n return this._index;\n };\n\n Locales.prototype.best = function(locales) {\n var index, item, l, languageIndex, locale, normalizedIndex, setLocale, _i, _j, _len, _len1;\n setLocale = function(l) {\n var r;\n r = l;\n r.defaulted = false;\n return r;\n };\n locale = Locale[\"default\"];\n if (locales && locales[\"default\"]) {\n locale = locales[\"default\"];\n }\n locale.defaulted = true;\n if (!locales) {\n if (this[0]) {\n locale = this[0];\n locale.defaulted = true;\n }\n return locale;\n }\n index = locales.index();\n for (_i = 0, _len = this.length; _i < _len; _i++) {\n item = this[_i];\n normalizedIndex = index[item.normalized];\n languageIndex = index[item.language];\n if (normalizedIndex != null) {\n return setLocale(locales[normalizedIndex]);\n } else if (languageIndex != null) {\n return setLocale(locales[languageIndex]);\n } else {\n for (_j = 0, _len1 = locales.length; _j < _len1; _j++) {\n l = locales[_j];\n if (l.language === item.language) {\n return setLocale(l);\n }\n }\n }\n }\n return locale;\n };\n\n serialize = function() {\n return __slice.call(this);\n };\n\n Locales.prototype.toJSON = serialize;\n\n Locales.prototype.toString = function() {\n return String(this.toJSON());\n };\n\n return Locales;\n\n })();\n\n _ref = module.exports = app, Locale = _ref.Locale, Locales = _ref.Locales;\n\n}).call(this);\n","var _cc = [\n {cardinal:[\"other\"],ordinal:[\"other\"]},\n {cardinal:[\"one\",\"other\"],ordinal:[\"other\"]},\n {cardinal:[\"one\",\"other\"],ordinal:[\"one\",\"other\"]},\n {cardinal:[\"one\",\"two\",\"other\"],ordinal:[\"other\"]}\n];\n\n(function (root, pluralCategories) {\n if (typeof define === 'function' && define.amd) {\n define(pluralCategories);\n } else if (typeof exports === 'object') {\n module.exports = pluralCategories;\n } else {\n root.pluralCategories = pluralCategories;\n }\n}(this, {\naf: _cc[1],\nak: _cc[1],\nam: _cc[1],\nar: {cardinal:[\"zero\",\"one\",\"two\",\"few\",\"many\",\"other\"],ordinal:[\"other\"]},\nars: {cardinal:[\"zero\",\"one\",\"two\",\"few\",\"many\",\"other\"],ordinal:[\"other\"]},\nas: {cardinal:[\"one\",\"other\"],ordinal:[\"one\",\"two\",\"few\",\"many\",\"other\"]},\nasa: _cc[1],\nast: _cc[1],\naz: {cardinal:[\"one\",\"other\"],ordinal:[\"one\",\"few\",\"many\",\"other\"]},\nbe: {cardinal:[\"one\",\"few\",\"many\",\"other\"],ordinal:[\"few\",\"other\"]},\nbem: _cc[1],\nbez: _cc[1],\nbg: _cc[1],\nbh: _cc[1],\nbm: _cc[0],\nbn: {cardinal:[\"one\",\"other\"],ordinal:[\"one\",\"two\",\"few\",\"many\",\"other\"]},\nbo: _cc[0],\nbr: {cardinal:[\"one\",\"two\",\"few\",\"many\",\"other\"],ordinal:[\"other\"]},\nbrx: _cc[1],\nbs: {cardinal:[\"one\",\"few\",\"other\"],ordinal:[\"other\"]},\nca: {cardinal:[\"one\",\"other\"],ordinal:[\"one\",\"two\",\"few\",\"other\"]},\nce: _cc[1],\ncgg: _cc[1],\nchr: _cc[1],\nckb: _cc[1],\ncs: {cardinal:[\"one\",\"few\",\"many\",\"other\"],ordinal:[\"other\"]},\ncy: {cardinal:[\"zero\",\"one\",\"two\",\"few\",\"many\",\"other\"],ordinal:[\"zero\",\"one\",\"two\",\"few\",\"many\",\"other\"]},\nda: _cc[1],\nde: _cc[1],\ndsb: {cardinal:[\"one\",\"two\",\"few\",\"other\"],ordinal:[\"other\"]},\ndv: _cc[1],\ndz: _cc[0],\nee: _cc[1],\nel: _cc[1],\nen: {cardinal:[\"one\",\"other\"],ordinal:[\"one\",\"two\",\"few\",\"other\"]},\neo: _cc[1],\nes: _cc[1],\net: _cc[1],\neu: _cc[1],\nfa: _cc[1],\nff: _cc[1],\nfi: _cc[1],\nfil: _cc[2],\nfo: _cc[1],\nfr: _cc[2],\nfur: _cc[1],\nfy: _cc[1],\nga: {cardinal:[\"one\",\"two\",\"few\",\"many\",\"other\"],ordinal:[\"one\",\"other\"]},\ngd: {cardinal:[\"one\",\"two\",\"few\",\"other\"],ordinal:[\"one\",\"two\",\"few\",\"other\"]},\ngl: _cc[1],\ngsw: _cc[1],\ngu: {cardinal:[\"one\",\"other\"],ordinal:[\"one\",\"two\",\"few\",\"many\",\"other\"]},\nguw: _cc[1],\ngv: {cardinal:[\"one\",\"two\",\"few\",\"many\",\"other\"],ordinal:[\"other\"]},\nha: _cc[1],\nhaw: _cc[1],\nhe: {cardinal:[\"one\",\"two\",\"many\",\"other\"],ordinal:[\"other\"]},\nhi: {cardinal:[\"one\",\"other\"],ordinal:[\"one\",\"two\",\"few\",\"many\",\"other\"]},\nhr: {cardinal:[\"one\",\"few\",\"other\"],ordinal:[\"other\"]},\nhsb: {cardinal:[\"one\",\"two\",\"few\",\"other\"],ordinal:[\"other\"]},\nhu: _cc[2],\nhy: _cc[2],\nia: _cc[1],\nid: _cc[0],\nig: _cc[0],\nii: _cc[0],\n\"in\": _cc[0],\nio: _cc[1],\nis: _cc[1],\nit: {cardinal:[\"one\",\"other\"],ordinal:[\"many\",\"other\"]},\niu: _cc[3],\niw: {cardinal:[\"one\",\"two\",\"many\",\"other\"],ordinal:[\"other\"]},\nja: _cc[0],\njbo: _cc[0],\njgo: _cc[1],\nji: _cc[1],\njmc: _cc[1],\njv: _cc[0],\njw: _cc[0],\nka: {cardinal:[\"one\",\"other\"],ordinal:[\"one\",\"many\",\"other\"]},\nkab: _cc[1],\nkaj: _cc[1],\nkcg: _cc[1],\nkde: _cc[0],\nkea: _cc[0],\nkk: {cardinal:[\"one\",\"other\"],ordinal:[\"many\",\"other\"]},\nkkj: _cc[1],\nkl: _cc[1],\nkm: _cc[0],\nkn: _cc[1],\nko: _cc[0],\nks: _cc[1],\nksb: _cc[1],\nksh: {cardinal:[\"zero\",\"one\",\"other\"],ordinal:[\"other\"]},\nku: _cc[1],\nkw: _cc[3],\nky: _cc[1],\nlag: {cardinal:[\"zero\",\"one\",\"other\"],ordinal:[\"other\"]},\nlb: _cc[1],\nlg: _cc[1],\nlkt: _cc[0],\nln: _cc[1],\nlo: {cardinal:[\"other\"],ordinal:[\"one\",\"other\"]},\nlt: {cardinal:[\"one\",\"few\",\"many\",\"other\"],ordinal:[\"other\"]},\nlv: {cardinal:[\"zero\",\"one\",\"other\"],ordinal:[\"other\"]},\nmas: _cc[1],\nmg: _cc[1],\nmgo: _cc[1],\nmk: {cardinal:[\"one\",\"other\"],ordinal:[\"one\",\"two\",\"many\",\"other\"]},\nml: _cc[1],\nmn: _cc[1],\nmo: {cardinal:[\"one\",\"few\",\"other\"],ordinal:[\"one\",\"other\"]},\nmr: {cardinal:[\"one\",\"other\"],ordinal:[\"one\",\"two\",\"few\",\"other\"]},\nms: {cardinal:[\"other\"],ordinal:[\"one\",\"other\"]},\nmt: {cardinal:[\"one\",\"few\",\"many\",\"other\"],ordinal:[\"other\"]},\nmy: _cc[0],\nnah: _cc[1],\nnaq: _cc[3],\nnb: _cc[1],\nnd: _cc[1],\nne: _cc[2],\nnl: _cc[1],\nnn: _cc[1],\nnnh: _cc[1],\nno: _cc[1],\nnqo: _cc[0],\nnr: _cc[1],\nnso: _cc[1],\nny: _cc[1],\nnyn: _cc[1],\nom: _cc[1],\nor: {cardinal:[\"one\",\"other\"],ordinal:[\"one\",\"two\",\"few\",\"many\",\"other\"]},\nos: _cc[1],\npa: _cc[1],\npap: _cc[1],\npl: {cardinal:[\"one\",\"few\",\"many\",\"other\"],ordinal:[\"other\"]},\nprg: {cardinal:[\"zero\",\"one\",\"other\"],ordinal:[\"other\"]},\nps: _cc[1],\npt: _cc[1],\n\"pt-PT\": _cc[1],\nrm: _cc[1],\nro: {cardinal:[\"one\",\"few\",\"other\"],ordinal:[\"one\",\"other\"]},\nrof: _cc[1],\nroot: _cc[0],\nru: {cardinal:[\"one\",\"few\",\"many\",\"other\"],ordinal:[\"other\"]},\nrwk: _cc[1],\nsah: _cc[0],\nsaq: _cc[1],\nsc: {cardinal:[\"one\",\"other\"],ordinal:[\"many\",\"other\"]},\nscn: {cardinal:[\"one\",\"other\"],ordinal:[\"many\",\"other\"]},\nsd: _cc[1],\nsdh: _cc[1],\nse: _cc[3],\nseh: _cc[1],\nses: _cc[0],\nsg: _cc[0],\nsh: {cardinal:[\"one\",\"few\",\"other\"],ordinal:[\"other\"]},\nshi: {cardinal:[\"one\",\"few\",\"other\"],ordinal:[\"other\"]},\nsi: _cc[1],\nsk: {cardinal:[\"one\",\"few\",\"many\",\"other\"],ordinal:[\"other\"]},\nsl: {cardinal:[\"one\",\"two\",\"few\",\"other\"],ordinal:[\"other\"]},\nsma: _cc[3],\nsmi: _cc[3],\nsmj: _cc[3],\nsmn: _cc[3],\nsms: _cc[3],\nsn: _cc[1],\nso: _cc[1],\nsq: {cardinal:[\"one\",\"other\"],ordinal:[\"one\",\"many\",\"other\"]},\nsr: {cardinal:[\"one\",\"few\",\"other\"],ordinal:[\"other\"]},\nss: _cc[1],\nssy: _cc[1],\nst: _cc[1],\nsv: _cc[2],\nsw: _cc[1],\nsyr: _cc[1],\nta: _cc[1],\nte: _cc[1],\nteo: _cc[1],\nth: _cc[0],\nti: _cc[1],\ntig: _cc[1],\ntk: {cardinal:[\"one\",\"other\"],ordinal:[\"few\",\"other\"]},\ntl: _cc[2],\ntn: _cc[1],\nto: _cc[0],\ntr: _cc[1],\nts: _cc[1],\ntzm: _cc[1],\nug: _cc[1],\nuk: {cardinal:[\"one\",\"few\",\"many\",\"other\"],ordinal:[\"few\",\"other\"]},\nur: _cc[1],\nuz: _cc[1],\nve: _cc[1],\nvi: {cardinal:[\"other\"],ordinal:[\"one\",\"other\"]},\nvo: _cc[1],\nvun: _cc[1],\nwa: _cc[1],\nwae: _cc[1],\nwo: _cc[0],\nxh: _cc[1],\nxog: _cc[1],\nyi: _cc[1],\nyo: _cc[0],\nyue: _cc[0],\nzh: _cc[0],\nzu: _cc[1]\n}));\n","var _cp = [\nfunction(n, ord) {\n if (ord) return 'other';\n return 'other';\n},\nfunction(n, ord) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\nfunction(n, ord) {\n if (ord) return 'other';\n return ((n == 0\n || n == 1)) ? 'one' : 'other';\n},\nfunction(n, ord) {\n var s = String(n).split('.'), v0 = !s[1];\n if (ord) return 'other';\n return (n == 1 && v0) ? 'one' : 'other';\n}\n];\n\n(function (root, plurals) {\n if (typeof define === 'function' && define.amd) {\n define(plurals);\n } else if (typeof exports === 'object') {\n module.exports = plurals;\n } else {\n root.plurals = plurals;\n }\n}(this, {\naf: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nak: function(n, ord\n) {\n if (ord) return 'other';\n return ((n == 0\n || n == 1)) ? 'one' : 'other';\n},\n\nam: function(n, ord\n) {\n if (ord) return 'other';\n return (n >= 0 && n <= 1) ? 'one' : 'other';\n},\n\nar: function(n, ord\n) {\n var s = String(n).split('.'), t0 = Number(s[0]) == n,\n n100 = t0 && s[0].slice(-2);\n if (ord) return 'other';\n return (n == 0) ? 'zero'\n : (n == 1) ? 'one'\n : (n == 2) ? 'two'\n : ((n100 >= 3 && n100 <= 10)) ? 'few'\n : ((n100 >= 11 && n100 <= 99)) ? 'many'\n : 'other';\n},\n\nars: function(n, ord\n) {\n var s = String(n).split('.'), t0 = Number(s[0]) == n,\n n100 = t0 && s[0].slice(-2);\n if (ord) return 'other';\n return (n == 0) ? 'zero'\n : (n == 1) ? 'one'\n : (n == 2) ? 'two'\n : ((n100 >= 3 && n100 <= 10)) ? 'few'\n : ((n100 >= 11 && n100 <= 99)) ? 'many'\n : 'other';\n},\n\nas: function(n, ord\n) {\n if (ord) return ((n == 1 || n == 5 || n == 7 || n == 8 || n == 9\n || n == 10)) ? 'one'\n : ((n == 2\n || n == 3)) ? 'two'\n : (n == 4) ? 'few'\n : (n == 6) ? 'many'\n : 'other';\n return (n >= 0 && n <= 1) ? 'one' : 'other';\n},\n\nasa: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nast: function(n, ord\n) {\n var s = String(n).split('.'), v0 = !s[1];\n if (ord) return 'other';\n return (n == 1 && v0) ? 'one' : 'other';\n},\n\naz: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0], i10 = i.slice(-1),\n i100 = i.slice(-2), i1000 = i.slice(-3);\n if (ord) return ((i10 == 1 || i10 == 2 || i10 == 5 || i10 == 7 || i10 == 8)\n || (i100 == 20 || i100 == 50 || i100 == 70\n || i100 == 80)) ? 'one'\n : ((i10 == 3 || i10 == 4) || (i1000 == 100 || i1000 == 200\n || i1000 == 300 || i1000 == 400 || i1000 == 500 || i1000 == 600 || i1000 == 700\n || i1000 == 800\n || i1000 == 900)) ? 'few'\n : (i == 0 || i10 == 6 || (i100 == 40 || i100 == 60\n || i100 == 90)) ? 'many'\n : 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nbe: function(n, ord\n) {\n var s = String(n).split('.'), t0 = Number(s[0]) == n,\n n10 = t0 && s[0].slice(-1), n100 = t0 && s[0].slice(-2);\n if (ord) return ((n10 == 2\n || n10 == 3) && n100 != 12 && n100 != 13) ? 'few' : 'other';\n return (n10 == 1 && n100 != 11) ? 'one'\n : ((n10 >= 2 && n10 <= 4) && (n100 < 12\n || n100 > 14)) ? 'few'\n : (t0 && n10 == 0 || (n10 >= 5 && n10 <= 9)\n || (n100 >= 11 && n100 <= 14)) ? 'many'\n : 'other';\n},\n\nbem: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nbez: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nbg: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nbh: function(n, ord\n) {\n if (ord) return 'other';\n return ((n == 0\n || n == 1)) ? 'one' : 'other';\n},\n\nbm: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\nbn: function(n, ord\n) {\n if (ord) return ((n == 1 || n == 5 || n == 7 || n == 8 || n == 9\n || n == 10)) ? 'one'\n : ((n == 2\n || n == 3)) ? 'two'\n : (n == 4) ? 'few'\n : (n == 6) ? 'many'\n : 'other';\n return (n >= 0 && n <= 1) ? 'one' : 'other';\n},\n\nbo: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\nbr: function(n, ord\n) {\n var s = String(n).split('.'), t0 = Number(s[0]) == n,\n n10 = t0 && s[0].slice(-1), n100 = t0 && s[0].slice(-2),\n n1000000 = t0 && s[0].slice(-6);\n if (ord) return 'other';\n return (n10 == 1 && n100 != 11 && n100 != 71 && n100 != 91) ? 'one'\n : (n10 == 2 && n100 != 12 && n100 != 72 && n100 != 92) ? 'two'\n : (((n10 == 3 || n10 == 4) || n10 == 9) && (n100 < 10\n || n100 > 19) && (n100 < 70 || n100 > 79) && (n100 < 90\n || n100 > 99)) ? 'few'\n : (n != 0 && t0 && n1000000 == 0) ? 'many'\n : 'other';\n},\n\nbrx: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nbs: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0], f = s[1] || '', v0 = !s[1],\n i10 = i.slice(-1), i100 = i.slice(-2), f10 = f.slice(-1), f100 = f.slice(-2);\n if (ord) return 'other';\n return (v0 && i10 == 1 && i100 != 11\n || f10 == 1 && f100 != 11) ? 'one'\n : (v0 && (i10 >= 2 && i10 <= 4) && (i100 < 12 || i100 > 14)\n || (f10 >= 2 && f10 <= 4) && (f100 < 12\n || f100 > 14)) ? 'few'\n : 'other';\n},\n\nca: function(n, ord\n) {\n var s = String(n).split('.'), v0 = !s[1];\n if (ord) return ((n == 1\n || n == 3)) ? 'one'\n : (n == 2) ? 'two'\n : (n == 4) ? 'few'\n : 'other';\n return (n == 1 && v0) ? 'one' : 'other';\n},\n\nce: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\ncgg: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nchr: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nckb: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\ncs: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0], v0 = !s[1];\n if (ord) return 'other';\n return (n == 1 && v0) ? 'one'\n : ((i >= 2 && i <= 4) && v0) ? 'few'\n : (!v0) ? 'many'\n : 'other';\n},\n\ncy: function(n, ord\n) {\n if (ord) return ((n == 0 || n == 7 || n == 8\n || n == 9)) ? 'zero'\n : (n == 1) ? 'one'\n : (n == 2) ? 'two'\n : ((n == 3\n || n == 4)) ? 'few'\n : ((n == 5\n || n == 6)) ? 'many'\n : 'other';\n return (n == 0) ? 'zero'\n : (n == 1) ? 'one'\n : (n == 2) ? 'two'\n : (n == 3) ? 'few'\n : (n == 6) ? 'many'\n : 'other';\n},\n\nda: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0], t0 = Number(s[0]) == n;\n if (ord) return 'other';\n return (n == 1 || !t0 && (i == 0\n || i == 1)) ? 'one' : 'other';\n},\n\nde: function(n, ord\n) {\n var s = String(n).split('.'), v0 = !s[1];\n if (ord) return 'other';\n return (n == 1 && v0) ? 'one' : 'other';\n},\n\ndsb: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0], f = s[1] || '', v0 = !s[1],\n i100 = i.slice(-2), f100 = f.slice(-2);\n if (ord) return 'other';\n return (v0 && i100 == 1\n || f100 == 1) ? 'one'\n : (v0 && i100 == 2\n || f100 == 2) ? 'two'\n : (v0 && (i100 == 3 || i100 == 4) || (f100 == 3\n || f100 == 4)) ? 'few'\n : 'other';\n},\n\ndv: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\ndz: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\nee: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nel: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nen: function(n, ord\n) {\n var s = String(n).split('.'), v0 = !s[1], t0 = Number(s[0]) == n,\n n10 = t0 && s[0].slice(-1), n100 = t0 && s[0].slice(-2);\n if (ord) return (n10 == 1 && n100 != 11) ? 'one'\n : (n10 == 2 && n100 != 12) ? 'two'\n : (n10 == 3 && n100 != 13) ? 'few'\n : 'other';\n return (n == 1 && v0) ? 'one' : 'other';\n},\n\neo: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nes: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\net: function(n, ord\n) {\n var s = String(n).split('.'), v0 = !s[1];\n if (ord) return 'other';\n return (n == 1 && v0) ? 'one' : 'other';\n},\n\neu: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nfa: function(n, ord\n) {\n if (ord) return 'other';\n return (n >= 0 && n <= 1) ? 'one' : 'other';\n},\n\nff: function(n, ord\n) {\n if (ord) return 'other';\n return (n >= 0 && n < 2) ? 'one' : 'other';\n},\n\nfi: function(n, ord\n) {\n var s = String(n).split('.'), v0 = !s[1];\n if (ord) return 'other';\n return (n == 1 && v0) ? 'one' : 'other';\n},\n\nfil: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0], f = s[1] || '', v0 = !s[1],\n i10 = i.slice(-1), f10 = f.slice(-1);\n if (ord) return (n == 1) ? 'one' : 'other';\n return (v0 && (i == 1 || i == 2 || i == 3)\n || v0 && i10 != 4 && i10 != 6 && i10 != 9\n || !v0 && f10 != 4 && f10 != 6 && f10 != 9) ? 'one' : 'other';\n},\n\nfo: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nfr: function(n, ord\n) {\n if (ord) return (n == 1) ? 'one' : 'other';\n return (n >= 0 && n < 2) ? 'one' : 'other';\n},\n\nfur: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nfy: function(n, ord\n) {\n var s = String(n).split('.'), v0 = !s[1];\n if (ord) return 'other';\n return (n == 1 && v0) ? 'one' : 'other';\n},\n\nga: function(n, ord\n) {\n var s = String(n).split('.'), t0 = Number(s[0]) == n;\n if (ord) return (n == 1) ? 'one' : 'other';\n return (n == 1) ? 'one'\n : (n == 2) ? 'two'\n : ((t0 && n >= 3 && n <= 6)) ? 'few'\n : ((t0 && n >= 7 && n <= 10)) ? 'many'\n : 'other';\n},\n\ngd: function(n, ord\n) {\n var s = String(n).split('.'), t0 = Number(s[0]) == n;\n if (ord) return ((n == 1\n || n == 11)) ? 'one'\n : ((n == 2\n || n == 12)) ? 'two'\n : ((n == 3\n || n == 13)) ? 'few'\n : 'other';\n return ((n == 1\n || n == 11)) ? 'one'\n : ((n == 2\n || n == 12)) ? 'two'\n : (((t0 && n >= 3 && n <= 10)\n || (t0 && n >= 13 && n <= 19))) ? 'few'\n : 'other';\n},\n\ngl: function(n, ord\n) {\n var s = String(n).split('.'), v0 = !s[1];\n if (ord) return 'other';\n return (n == 1 && v0) ? 'one' : 'other';\n},\n\ngsw: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\ngu: function(n, ord\n) {\n if (ord) return (n == 1) ? 'one'\n : ((n == 2\n || n == 3)) ? 'two'\n : (n == 4) ? 'few'\n : (n == 6) ? 'many'\n : 'other';\n return (n >= 0 && n <= 1) ? 'one' : 'other';\n},\n\nguw: function(n, ord\n) {\n if (ord) return 'other';\n return ((n == 0\n || n == 1)) ? 'one' : 'other';\n},\n\ngv: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0], v0 = !s[1], i10 = i.slice(-1),\n i100 = i.slice(-2);\n if (ord) return 'other';\n return (v0 && i10 == 1) ? 'one'\n : (v0 && i10 == 2) ? 'two'\n : (v0 && (i100 == 0 || i100 == 20 || i100 == 40 || i100 == 60\n || i100 == 80)) ? 'few'\n : (!v0) ? 'many'\n : 'other';\n},\n\nha: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nhaw: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nhe: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0], v0 = !s[1], t0 = Number(s[0]) == n,\n n10 = t0 && s[0].slice(-1);\n if (ord) return 'other';\n return (n == 1 && v0) ? 'one'\n : (i == 2 && v0) ? 'two'\n : (v0 && (n < 0\n || n > 10) && t0 && n10 == 0) ? 'many'\n : 'other';\n},\n\nhi: function(n, ord\n) {\n if (ord) return (n == 1) ? 'one'\n : ((n == 2\n || n == 3)) ? 'two'\n : (n == 4) ? 'few'\n : (n == 6) ? 'many'\n : 'other';\n return (n >= 0 && n <= 1) ? 'one' : 'other';\n},\n\nhr: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0], f = s[1] || '', v0 = !s[1],\n i10 = i.slice(-1), i100 = i.slice(-2), f10 = f.slice(-1), f100 = f.slice(-2);\n if (ord) return 'other';\n return (v0 && i10 == 1 && i100 != 11\n || f10 == 1 && f100 != 11) ? 'one'\n : (v0 && (i10 >= 2 && i10 <= 4) && (i100 < 12 || i100 > 14)\n || (f10 >= 2 && f10 <= 4) && (f100 < 12\n || f100 > 14)) ? 'few'\n : 'other';\n},\n\nhsb: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0], f = s[1] || '', v0 = !s[1],\n i100 = i.slice(-2), f100 = f.slice(-2);\n if (ord) return 'other';\n return (v0 && i100 == 1\n || f100 == 1) ? 'one'\n : (v0 && i100 == 2\n || f100 == 2) ? 'two'\n : (v0 && (i100 == 3 || i100 == 4) || (f100 == 3\n || f100 == 4)) ? 'few'\n : 'other';\n},\n\nhu: function(n, ord\n) {\n if (ord) return ((n == 1\n || n == 5)) ? 'one' : 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nhy: function(n, ord\n) {\n if (ord) return (n == 1) ? 'one' : 'other';\n return (n >= 0 && n < 2) ? 'one' : 'other';\n},\n\nia: function(n, ord\n) {\n var s = String(n).split('.'), v0 = !s[1];\n if (ord) return 'other';\n return (n == 1 && v0) ? 'one' : 'other';\n},\n\nid: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\nig: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\nii: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\n\"in\": function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\nio: function(n, ord\n) {\n var s = String(n).split('.'), v0 = !s[1];\n if (ord) return 'other';\n return (n == 1 && v0) ? 'one' : 'other';\n},\n\nis: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0], t0 = Number(s[0]) == n,\n i10 = i.slice(-1), i100 = i.slice(-2);\n if (ord) return 'other';\n return (t0 && i10 == 1 && i100 != 11\n || !t0) ? 'one' : 'other';\n},\n\nit: function(n, ord\n) {\n var s = String(n).split('.'), v0 = !s[1];\n if (ord) return ((n == 11 || n == 8 || n == 80\n || n == 800)) ? 'many' : 'other';\n return (n == 1 && v0) ? 'one' : 'other';\n},\n\niu: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one'\n : (n == 2) ? 'two'\n : 'other';\n},\n\niw: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0], v0 = !s[1], t0 = Number(s[0]) == n,\n n10 = t0 && s[0].slice(-1);\n if (ord) return 'other';\n return (n == 1 && v0) ? 'one'\n : (i == 2 && v0) ? 'two'\n : (v0 && (n < 0\n || n > 10) && t0 && n10 == 0) ? 'many'\n : 'other';\n},\n\nja: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\njbo: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\njgo: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nji: function(n, ord\n) {\n var s = String(n).split('.'), v0 = !s[1];\n if (ord) return 'other';\n return (n == 1 && v0) ? 'one' : 'other';\n},\n\njmc: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\njv: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\njw: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\nka: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0], i100 = i.slice(-2);\n if (ord) return (i == 1) ? 'one'\n : (i == 0 || ((i100 >= 2 && i100 <= 20) || i100 == 40 || i100 == 60\n || i100 == 80)) ? 'many'\n : 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nkab: function(n, ord\n) {\n if (ord) return 'other';\n return (n >= 0 && n < 2) ? 'one' : 'other';\n},\n\nkaj: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nkcg: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nkde: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\nkea: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\nkk: function(n, ord\n) {\n var s = String(n).split('.'), t0 = Number(s[0]) == n,\n n10 = t0 && s[0].slice(-1);\n if (ord) return (n10 == 6 || n10 == 9\n || t0 && n10 == 0 && n != 0) ? 'many' : 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nkkj: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nkl: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nkm: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\nkn: function(n, ord\n) {\n if (ord) return 'other';\n return (n >= 0 && n <= 1) ? 'one' : 'other';\n},\n\nko: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\nks: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nksb: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nksh: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 0) ? 'zero'\n : (n == 1) ? 'one'\n : 'other';\n},\n\nku: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nkw: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one'\n : (n == 2) ? 'two'\n : 'other';\n},\n\nky: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nlag: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0];\n if (ord) return 'other';\n return (n == 0) ? 'zero'\n : ((i == 0\n || i == 1) && n != 0) ? 'one'\n : 'other';\n},\n\nlb: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nlg: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nlkt: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\nln: function(n, ord\n) {\n if (ord) return 'other';\n return ((n == 0\n || n == 1)) ? 'one' : 'other';\n},\n\nlo: function(n, ord\n) {\n if (ord) return (n == 1) ? 'one' : 'other';\n return 'other';\n},\n\nlt: function(n, ord\n) {\n var s = String(n).split('.'), f = s[1] || '', t0 = Number(s[0]) == n,\n n10 = t0 && s[0].slice(-1), n100 = t0 && s[0].slice(-2);\n if (ord) return 'other';\n return (n10 == 1 && (n100 < 11\n || n100 > 19)) ? 'one'\n : ((n10 >= 2 && n10 <= 9) && (n100 < 11\n || n100 > 19)) ? 'few'\n : (f != 0) ? 'many'\n : 'other';\n},\n\nlv: function(n, ord\n) {\n var s = String(n).split('.'), f = s[1] || '', v = f.length,\n t0 = Number(s[0]) == n, n10 = t0 && s[0].slice(-1),\n n100 = t0 && s[0].slice(-2), f100 = f.slice(-2), f10 = f.slice(-1);\n if (ord) return 'other';\n return (t0 && n10 == 0 || (n100 >= 11 && n100 <= 19)\n || v == 2 && (f100 >= 11 && f100 <= 19)) ? 'zero'\n : (n10 == 1 && n100 != 11 || v == 2 && f10 == 1 && f100 != 11\n || v != 2 && f10 == 1) ? 'one'\n : 'other';\n},\n\nmas: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nmg: function(n, ord\n) {\n if (ord) return 'other';\n return ((n == 0\n || n == 1)) ? 'one' : 'other';\n},\n\nmgo: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nmk: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0], f = s[1] || '', v0 = !s[1],\n i10 = i.slice(-1), i100 = i.slice(-2), f10 = f.slice(-1), f100 = f.slice(-2);\n if (ord) return (i10 == 1 && i100 != 11) ? 'one'\n : (i10 == 2 && i100 != 12) ? 'two'\n : ((i10 == 7\n || i10 == 8) && i100 != 17 && i100 != 18) ? 'many'\n : 'other';\n return (v0 && i10 == 1 && i100 != 11\n || f10 == 1 && f100 != 11) ? 'one' : 'other';\n},\n\nml: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nmn: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nmo: function(n, ord\n) {\n var s = String(n).split('.'), v0 = !s[1], t0 = Number(s[0]) == n,\n n100 = t0 && s[0].slice(-2);\n if (ord) return (n == 1) ? 'one' : 'other';\n return (n == 1 && v0) ? 'one'\n : (!v0 || n == 0\n || n != 1 && (n100 >= 1 && n100 <= 19)) ? 'few'\n : 'other';\n},\n\nmr: function(n, ord\n) {\n if (ord) return (n == 1) ? 'one'\n : ((n == 2\n || n == 3)) ? 'two'\n : (n == 4) ? 'few'\n : 'other';\n return (n >= 0 && n <= 1) ? 'one' : 'other';\n},\n\nms: function(n, ord\n) {\n if (ord) return (n == 1) ? 'one' : 'other';\n return 'other';\n},\n\nmt: function(n, ord\n) {\n var s = String(n).split('.'), t0 = Number(s[0]) == n,\n n100 = t0 && s[0].slice(-2);\n if (ord) return 'other';\n return (n == 1) ? 'one'\n : (n == 0\n || (n100 >= 2 && n100 <= 10)) ? 'few'\n : ((n100 >= 11 && n100 <= 19)) ? 'many'\n : 'other';\n},\n\nmy: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\nnah: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nnaq: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one'\n : (n == 2) ? 'two'\n : 'other';\n},\n\nnb: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nnd: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nne: function(n, ord\n) {\n var s = String(n).split('.'), t0 = Number(s[0]) == n;\n if (ord) return ((t0 && n >= 1 && n <= 4)) ? 'one' : 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nnl: function(n, ord\n) {\n var s = String(n).split('.'), v0 = !s[1];\n if (ord) return 'other';\n return (n == 1 && v0) ? 'one' : 'other';\n},\n\nnn: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nnnh: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nno: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nnqo: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\nnr: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nnso: function(n, ord\n) {\n if (ord) return 'other';\n return ((n == 0\n || n == 1)) ? 'one' : 'other';\n},\n\nny: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nnyn: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nom: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nor: function(n, ord\n) {\n var s = String(n).split('.'), t0 = Number(s[0]) == n;\n if (ord) return ((n == 1 || n == 5\n || (t0 && n >= 7 && n <= 9))) ? 'one'\n : ((n == 2\n || n == 3)) ? 'two'\n : (n == 4) ? 'few'\n : (n == 6) ? 'many'\n : 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nos: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\npa: function(n, ord\n) {\n if (ord) return 'other';\n return ((n == 0\n || n == 1)) ? 'one' : 'other';\n},\n\npap: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\npl: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0], v0 = !s[1], i10 = i.slice(-1),\n i100 = i.slice(-2);\n if (ord) return 'other';\n return (n == 1 && v0) ? 'one'\n : (v0 && (i10 >= 2 && i10 <= 4) && (i100 < 12\n || i100 > 14)) ? 'few'\n : (v0 && i != 1 && (i10 == 0 || i10 == 1)\n || v0 && (i10 >= 5 && i10 <= 9)\n || v0 && (i100 >= 12 && i100 <= 14)) ? 'many'\n : 'other';\n},\n\nprg: function(n, ord\n) {\n var s = String(n).split('.'), f = s[1] || '', v = f.length,\n t0 = Number(s[0]) == n, n10 = t0 && s[0].slice(-1),\n n100 = t0 && s[0].slice(-2), f100 = f.slice(-2), f10 = f.slice(-1);\n if (ord) return 'other';\n return (t0 && n10 == 0 || (n100 >= 11 && n100 <= 19)\n || v == 2 && (f100 >= 11 && f100 <= 19)) ? 'zero'\n : (n10 == 1 && n100 != 11 || v == 2 && f10 == 1 && f100 != 11\n || v != 2 && f10 == 1) ? 'one'\n : 'other';\n},\n\nps: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\npt: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0];\n if (ord) return 'other';\n return ((i == 0\n || i == 1)) ? 'one' : 'other';\n},\n\n\"pt-PT\": function(n, ord\n) {\n var s = String(n).split('.'), v0 = !s[1];\n if (ord) return 'other';\n return (n == 1 && v0) ? 'one' : 'other';\n},\n\nrm: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nro: function(n, ord\n) {\n var s = String(n).split('.'), v0 = !s[1], t0 = Number(s[0]) == n,\n n100 = t0 && s[0].slice(-2);\n if (ord) return (n == 1) ? 'one' : 'other';\n return (n == 1 && v0) ? 'one'\n : (!v0 || n == 0\n || n != 1 && (n100 >= 1 && n100 <= 19)) ? 'few'\n : 'other';\n},\n\nrof: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nroot: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\nru: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0], v0 = !s[1], i10 = i.slice(-1),\n i100 = i.slice(-2);\n if (ord) return 'other';\n return (v0 && i10 == 1 && i100 != 11) ? 'one'\n : (v0 && (i10 >= 2 && i10 <= 4) && (i100 < 12\n || i100 > 14)) ? 'few'\n : (v0 && i10 == 0 || v0 && (i10 >= 5 && i10 <= 9)\n || v0 && (i100 >= 11 && i100 <= 14)) ? 'many'\n : 'other';\n},\n\nrwk: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nsah: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\nsaq: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nsc: function(n, ord\n) {\n var s = String(n).split('.'), v0 = !s[1];\n if (ord) return ((n == 11 || n == 8 || n == 80\n || n == 800)) ? 'many' : 'other';\n return (n == 1 && v0) ? 'one' : 'other';\n},\n\nscn: function(n, ord\n) {\n var s = String(n).split('.'), v0 = !s[1];\n if (ord) return ((n == 11 || n == 8 || n == 80\n || n == 800)) ? 'many' : 'other';\n return (n == 1 && v0) ? 'one' : 'other';\n},\n\nsd: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nsdh: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nse: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one'\n : (n == 2) ? 'two'\n : 'other';\n},\n\nseh: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nses: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\nsg: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\nsh: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0], f = s[1] || '', v0 = !s[1],\n i10 = i.slice(-1), i100 = i.slice(-2), f10 = f.slice(-1), f100 = f.slice(-2);\n if (ord) return 'other';\n return (v0 && i10 == 1 && i100 != 11\n || f10 == 1 && f100 != 11) ? 'one'\n : (v0 && (i10 >= 2 && i10 <= 4) && (i100 < 12 || i100 > 14)\n || (f10 >= 2 && f10 <= 4) && (f100 < 12\n || f100 > 14)) ? 'few'\n : 'other';\n},\n\nshi: function(n, ord\n) {\n var s = String(n).split('.'), t0 = Number(s[0]) == n;\n if (ord) return 'other';\n return (n >= 0 && n <= 1) ? 'one'\n : ((t0 && n >= 2 && n <= 10)) ? 'few'\n : 'other';\n},\n\nsi: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0], f = s[1] || '';\n if (ord) return 'other';\n return ((n == 0 || n == 1)\n || i == 0 && f == 1) ? 'one' : 'other';\n},\n\nsk: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0], v0 = !s[1];\n if (ord) return 'other';\n return (n == 1 && v0) ? 'one'\n : ((i >= 2 && i <= 4) && v0) ? 'few'\n : (!v0) ? 'many'\n : 'other';\n},\n\nsl: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0], v0 = !s[1], i100 = i.slice(-2);\n if (ord) return 'other';\n return (v0 && i100 == 1) ? 'one'\n : (v0 && i100 == 2) ? 'two'\n : (v0 && (i100 == 3 || i100 == 4)\n || !v0) ? 'few'\n : 'other';\n},\n\nsma: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one'\n : (n == 2) ? 'two'\n : 'other';\n},\n\nsmi: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one'\n : (n == 2) ? 'two'\n : 'other';\n},\n\nsmj: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one'\n : (n == 2) ? 'two'\n : 'other';\n},\n\nsmn: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one'\n : (n == 2) ? 'two'\n : 'other';\n},\n\nsms: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one'\n : (n == 2) ? 'two'\n : 'other';\n},\n\nsn: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nso: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nsq: function(n, ord\n) {\n var s = String(n).split('.'), t0 = Number(s[0]) == n,\n n10 = t0 && s[0].slice(-1), n100 = t0 && s[0].slice(-2);\n if (ord) return (n == 1) ? 'one'\n : (n10 == 4 && n100 != 14) ? 'many'\n : 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nsr: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0], f = s[1] || '', v0 = !s[1],\n i10 = i.slice(-1), i100 = i.slice(-2), f10 = f.slice(-1), f100 = f.slice(-2);\n if (ord) return 'other';\n return (v0 && i10 == 1 && i100 != 11\n || f10 == 1 && f100 != 11) ? 'one'\n : (v0 && (i10 >= 2 && i10 <= 4) && (i100 < 12 || i100 > 14)\n || (f10 >= 2 && f10 <= 4) && (f100 < 12\n || f100 > 14)) ? 'few'\n : 'other';\n},\n\nss: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nssy: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nst: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nsv: function(n, ord\n) {\n var s = String(n).split('.'), v0 = !s[1], t0 = Number(s[0]) == n,\n n10 = t0 && s[0].slice(-1), n100 = t0 && s[0].slice(-2);\n if (ord) return ((n10 == 1\n || n10 == 2) && n100 != 11 && n100 != 12) ? 'one' : 'other';\n return (n == 1 && v0) ? 'one' : 'other';\n},\n\nsw: function(n, ord\n) {\n var s = String(n).split('.'), v0 = !s[1];\n if (ord) return 'other';\n return (n == 1 && v0) ? 'one' : 'other';\n},\n\nsyr: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nta: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nte: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nteo: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nth: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\nti: function(n, ord\n) {\n if (ord) return 'other';\n return ((n == 0\n || n == 1)) ? 'one' : 'other';\n},\n\ntig: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\ntk: function(n, ord\n) {\n var s = String(n).split('.'), t0 = Number(s[0]) == n,\n n10 = t0 && s[0].slice(-1);\n if (ord) return ((n10 == 6 || n10 == 9)\n || n == 10) ? 'few' : 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\ntl: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0], f = s[1] || '', v0 = !s[1],\n i10 = i.slice(-1), f10 = f.slice(-1);\n if (ord) return (n == 1) ? 'one' : 'other';\n return (v0 && (i == 1 || i == 2 || i == 3)\n || v0 && i10 != 4 && i10 != 6 && i10 != 9\n || !v0 && f10 != 4 && f10 != 6 && f10 != 9) ? 'one' : 'other';\n},\n\ntn: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nto: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\ntr: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nts: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\ntzm: function(n, ord\n) {\n var s = String(n).split('.'), t0 = Number(s[0]) == n;\n if (ord) return 'other';\n return ((n == 0 || n == 1)\n || (t0 && n >= 11 && n <= 99)) ? 'one' : 'other';\n},\n\nug: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nuk: function(n, ord\n) {\n var s = String(n).split('.'), i = s[0], v0 = !s[1], t0 = Number(s[0]) == n,\n n10 = t0 && s[0].slice(-1), n100 = t0 && s[0].slice(-2), i10 = i.slice(-1),\n i100 = i.slice(-2);\n if (ord) return (n10 == 3 && n100 != 13) ? 'few' : 'other';\n return (v0 && i10 == 1 && i100 != 11) ? 'one'\n : (v0 && (i10 >= 2 && i10 <= 4) && (i100 < 12\n || i100 > 14)) ? 'few'\n : (v0 && i10 == 0 || v0 && (i10 >= 5 && i10 <= 9)\n || v0 && (i100 >= 11 && i100 <= 14)) ? 'many'\n : 'other';\n},\n\nur: function(n, ord\n) {\n var s = String(n).split('.'), v0 = !s[1];\n if (ord) return 'other';\n return (n == 1 && v0) ? 'one' : 'other';\n},\n\nuz: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nve: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nvi: function(n, ord\n) {\n if (ord) return (n == 1) ? 'one' : 'other';\n return 'other';\n},\n\nvo: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nvun: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nwa: function(n, ord\n) {\n if (ord) return 'other';\n return ((n == 0\n || n == 1)) ? 'one' : 'other';\n},\n\nwae: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nwo: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\nxh: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nxog: function(n, ord\n) {\n if (ord) return 'other';\n return (n == 1) ? 'one' : 'other';\n},\n\nyi: function(n, ord\n) {\n var s = String(n).split('.'), v0 = !s[1];\n if (ord) return 'other';\n return (n == 1 && v0) ? 'one' : 'other';\n},\n\nyo: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\nyue: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\nzh: function(n, ord\n) {\n if (ord) return 'other';\n return 'other';\n},\n\nzu: function(n, ord\n) {\n if (ord) return 'other';\n return (n >= 0 && n <= 1) ? 'one' : 'other';\n}\n}));\n","var reserved = require('reserved-words');\nvar parse = require('messageformat-parser').parse;\n\n\n/** Creates a new message compiler. Called internally from {@link MessageFormat#compile}.\n *\n * @class\n * @param {MessageFormat} mf - A MessageFormat instance\n * @property {object} locales - The locale identifiers that are used by the compiled functions\n * @property {object} runtime - Names of the core runtime functions that are used by the compiled functions\n * @property {object} formatters - The formatter functions that are used by the compiled functions\n */\nfunction Compiler(mf) {\n this.mf = mf;\n this.lc = null;\n this.locales = {};\n this.runtime = {};\n this.formatters = {};\n}\n\nmodule.exports = Compiler;\n\n\n/** Utility function for quoting an Object's key value if required\n *\n * Quotes the key if it contains invalid characters or is an\n * ECMAScript 3rd Edition reserved word (for IE8).\n */\nCompiler.propname = function(key, obj) {\n if (/^[A-Z_$][0-9A-Z_$]*$/i.test(key) &&\n ['break', 'continue', 'delete', 'else', 'for', 'function', 'if', 'in', 'new',\n 'return', 'this', 'typeof', 'var', 'void', 'while', 'with', 'case', 'catch',\n 'default', 'do', 'finally', 'instanceof', 'switch', 'throw', 'try'].indexOf(key) < 0) {\n return obj ? obj + '.' + key : key;\n } else {\n var jkey = JSON.stringify(key);\n return obj ? obj + '[' + jkey + ']' : jkey;\n }\n}\n\n\n/** Utility function for escaping a function name if required\n */\nCompiler.funcname = function(key) {\n var fn = key.trim().replace(/\\W+/g, '_');\n return reserved.check(fn, 'es2015', true) || /^\\d/.test(fn) ? '_' + fn : fn;\n}\n\n\n/** Utility formatter function for enforcing Bidi Structured Text by using UCC\n *\n * List inlined from data extracted from CLDR v27 & v28\n * To verify/recreate, use the following:\n *\n * git clone https://github.com/unicode-cldr/cldr-misc-full.git\n * cd cldr-misc-full/main/\n * grep characterOrder -r . | tr '\"/' '\\t' | cut -f2,6 | grep -C4 right-to-left\n */\nCompiler.bidiMarkText = function(text, locale) {\n function isLocaleRTL(locale) {\n var rtlLanguages = ['ar', 'ckb', 'fa', 'he', 'ks($|[^bfh])', 'lrc', 'mzn',\n 'pa-Arab', 'ps', 'ug', 'ur', 'uz-Arab', 'yi'];\n return new RegExp('^' + rtlLanguages.join('|^')).test(locale);\n }\n var mark = JSON.stringify(isLocaleRTL(locale) ? '\\u200F' : '\\u200E');\n return mark + ' + ' + text + ' + ' + mark;\n}\n\n\n/** @private */\nCompiler.prototype.cases = function(token, plural) {\n var needOther = token.type === 'select' || !this.mf.hasCustomPluralFuncs;\n var r = token.cases.map(function(c) {\n if (c.key === 'other') needOther = false;\n var s = c.tokens.map(function(tok) { return this.token(tok, plural); }, this);\n return Compiler.propname(c.key) + ': ' + (s.join(' + ') || '\"\"');\n }, this);\n if (needOther) throw new Error(\"No 'other' form found in \" + JSON.stringify(token));\n return '{ ' + r.join(', ') + ' }';\n}\n\n\n/** @private */\nCompiler.prototype.token = function(token, plural) {\n if (typeof token == 'string') return JSON.stringify(token);\n\n var fn, args = [ Compiler.propname(token.arg, 'd') ];\n switch (token.type) {\n case 'argument':\n return this.mf.bidiSupport ? Compiler.bidiMarkText(args[0], this.lc) : args[0];\n\n case 'select':\n fn = 'select';\n args.push(this.cases(token, this.mf.strictNumberSign ? null : plural));\n this.runtime.select = true;\n break;\n\n case 'selectordinal':\n fn = 'plural';\n args.push(0, Compiler.funcname(this.lc), this.cases(token, token), 1);\n this.locales[this.lc] = true;\n this.runtime.plural = true;\n break;\n\n case 'plural':\n fn = 'plural';\n args.push(token.offset || 0, Compiler.funcname(this.lc), this.cases(token, token));\n this.locales[this.lc] = true;\n this.runtime.plural = true;\n break;\n\n case 'function':\n if (this.mf.intlSupport && !(token.key in this.mf.fmt) && (token.key in this.mf.constructor.formatters)) {\n var fmt = this.mf.constructor.formatters[token.key];\n this.mf.fmt[token.key] = (typeof fmt(this.mf) == 'function') ? fmt(this.mf) : fmt;\n }\n if (!this.mf.fmt[token.key]) throw new Error('Formatting function ' + JSON.stringify(token.key) + ' not found!');\n args.push(JSON.stringify(this.lc));\n if (token.params) switch (token.params.length) {\n case 0: break;\n case 1: args.push(JSON.stringify(token.params[0])); break;\n default: args.push(JSON.stringify(token.params)); break;\n }\n fn = Compiler.propname(token.key, 'fmt');\n this.formatters[token.key] = true;\n break;\n\n case 'octothorpe':\n if (!plural) return '\"#\"';\n fn = 'number';\n args = [ Compiler.propname(plural.arg, 'd'), JSON.stringify(plural.arg) ];\n if (plural.offset) args.push(plural.offset);\n this.runtime.number = true;\n break;\n }\n\n if (!fn) throw new Error('Parser error for token ' + JSON.stringify(token));\n return fn + '(' + args.join(', ') + ')';\n};\n\n\n/** Recursively compile a string or a tree of strings to JavaScript function sources\n *\n * If `src` is an object with a key that is also present in `plurals`, the key\n * in question will be used as the locale identifier for its value. To disable\n * the compile-time checks for plural & selectordinal keys while maintaining\n * multi-locale support, use falsy values in `plurals`.\n *\n * @param {string|object} src - the source for which the JS code should be generated\n * @param {string} lc - the default locale\n * @param {object} plurals - a map of pluralization keys for all available locales\n */\nCompiler.prototype.compile = function(src, lc, plurals) {\n if (typeof src != 'object') {\n this.lc = lc;\n var pc = plurals[lc] || { cardinal: [], ordinal: [] };\n var r = parse(src, pc).map(function(token) { return this.token(token); }, this);\n return 'function(d) { return ' + (r.join(' + ') || '\"\"') + '; }';\n } else {\n var result = {};\n for (var key in src) {\n var lcKey = plurals.hasOwnProperty(key) ? key : lc;\n result[key] = this.compile(src[key], lcKey, plurals);\n }\n return result;\n }\n}\n","/** @file messageformat.js - ICU PluralFormat + SelectFormat for JavaScript\n *\n * @author Alex Sexton - @SlexAxton, Eemeli Aro - @eemeli_aro\n * @copyright 2012-2016 Alex Sexton, Eemeli Aro, and Contributors\n * @license To use or fork, MIT. To contribute back, JS Foundation CLA\n */\n\nvar Compiler = require('./compiler');\nvar Runtime = require('./runtime');\n\n\n/** Utility getter/wrapper for pluralization functions from\n * {@link http://github.com/eemeli/make-plural.js make-plural}\n *\n * @private\n */\nfunction getPluralFunc(locale, noPluralKeyChecks) {\n var plurals = require('make-plural/umd/plurals');\n var pluralCategories = require('make-plural/umd/pluralCategories');\n for (var l = locale; l; l = l.replace(/[-_]?[^-_]*$/, '')) {\n var pf = plurals[l];\n if (pf) {\n var pc = noPluralKeyChecks ? { cardinal: [], ordinal: [] } : (pluralCategories[l] || {});\n var fn = function() { return pf.apply(this, arguments); };\n fn.toString = function() { return pf.toString(); };\n fn.cardinal = pc.cardinal;\n fn.ordinal = pc.ordinal;\n return fn;\n }\n }\n throw new Error('Localisation function not found for locale ' + JSON.stringify(locale));\n}\n\n\n/** Create a new message formatter\n *\n * If `locale` is not set, calls to `compile()` will fetch the default locale\n * each time. A string `locale` will create a single-locale MessageFormat\n * instance, with pluralisation rules fetched from the Unicode CLDR using\n * {@link http://github.com/eemeli/make-plural.js make-plural}.\n *\n * Using an array of strings as `locale` will create a MessageFormat object\n * with multi-language support, with pluralisation rules fetched as above. To\n * select which to use, use the second parameter of `compile()`, or use message\n * keys corresponding to your locales.\n *\n * Using an object `locale` with all properties of type `function` allows for\n * the use of custom/externally defined pluralisation rules.\n *\n * @class\n * @param {string|string[]|Object.} [locale] - The locale(s) to use\n */\nfunction MessageFormat(locale) {\n this.pluralFuncs = {};\n if (locale) {\n if (typeof locale == 'string') {\n this.pluralFuncs[locale] = getPluralFunc(locale);\n } else if (Array.isArray(locale)) {\n locale.forEach(function(lc) { this.pluralFuncs[lc] = getPluralFunc(lc); }, this);\n } else if (typeof locale == 'object') {\n for (var lc in locale) if (locale.hasOwnProperty(lc)) {\n if (typeof locale[lc] != 'function') throw new Error('Expected function value for locale ' + JSON.stringify(lc));\n this.pluralFuncs[lc] = locale[lc];\n }\n this.hasCustomPluralFuncs = true;\n }\n }\n this.fmt = {};\n this.runtime = new Runtime(this);\n}\n\n\n/** The default locale\n *\n * Read by `compile()` when no locale has been previously set\n *\n * @memberof MessageFormat\n * @default 'en'\n */\nMessageFormat.defaultLocale = 'en';\n\n\n/** Escape special characaters\n *\n * Prefix the characters `#`, `{`, `}` and `\\` in the input string with a `\\`.\n * This will allow those characters to not be considered as MessageFormat\n * control characters.\n *\n * @param {string} str - The input string\n * @returns {string} The escaped string\n */\nMessageFormat.escape = function(str) {\n return str.replace(/[#{}\\\\]/g, '\\\\$&');\n}\n\n\n/** Default number formatting functions in the style of ICU's\n * {@link http://icu-project.org/apiref/icu4j/com/ibm/icu/text/MessageFormat.html simpleArg syntax}\n * implemented using the\n * {@link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl Intl}\n * object defined by ECMA-402.\n *\n * **Note**: Intl is not defined in default Node until 0.11.15 / 0.12.0, so\n * earlier versions require a {@link https://www.npmjs.com/package/intl polyfill}.\n * Therefore {@link MessageFormat.intlSupport} needs to be true for these default\n * functions to be available for inclusion in the output.\n *\n * @see MessageFormat#setIntlSupport\n *\n * @namespace\n */\nMessageFormat.formatters = {\n\n\n /** Represent a number as an integer, percent or currency value\n *\n * Available in MessageFormat strings as `{VAR, number, integer|percent|currency}`.\n * Internally, calls Intl.NumberFormat with appropriate parameters. `currency` will\n * default to USD; to change, set `MessageFormat#currency` to the appropriate\n * three-letter currency code.\n *\n * @param {number} value - The value to operate on\n * @param {string} type - One of `'integer'`, `'percent'` , or `currency`\n *\n * @example\n * var mf = new MessageFormat('en').setIntlSupport(true);\n * mf.currency = 'EUR'; // needs to be set before first compile() call\n *\n * mf.compile('{N} is almost {N, number, integer}')({ N: 3.14 })\n * // '3.14 is almost 3'\n *\n * mf.compile('{P, number, percent} complete')({ P: 0.99 })\n * // '99% complete'\n *\n * mf.compile('The total is {V, number, currency}.')({ V: 5.5 })\n * // 'The total is €5.50.'\n */\n number: function(self) {\n return new Function(\"v,lc,p\",\n \"return new Intl.NumberFormat(lc,\\n\" +\n \" p=='integer' ? {maximumFractionDigits:0}\\n\" +\n \" : p=='percent' ? {style:'percent'}\\n\" +\n \" : p=='currency' ? {style:'currency', currency:'\" + (self.currency || 'USD') + \"', minimumFractionDigits:2, maximumFractionDigits:2}\\n\" +\n \" : {}).format(v)\"\n );\n },\n\n\n /** Represent a date as a short/default/long/full string\n *\n * The input value needs to be in a form that the\n * {@link https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date Date object}\n * can process using its single-argument form, `new Date(value)`.\n *\n * @param {number|string} value - Either a Unix epoch time in milliseconds, or a string value representing a date\n * @param {string} [type='default'] - One of `'short'`, `'default'`, `'long'` , or `full`\n *\n * @example\n * var mf = new MessageFormat(['en', 'fi']).setIntlSupport(true);\n *\n * mf.compile('Today is {T, date}')({ T: Date.now() })\n * // 'Today is Feb 21, 2016'\n *\n * mf.compile('Tänään on {T, date}', 'fi')({ T: Date.now() })\n * // 'Tänään on 21. helmikuuta 2016'\n *\n * mf.compile('Unix time started on {T, date, full}')({ T: 0 })\n * // 'Unix time started on Thursday, January 1, 1970'\n *\n * var cf = mf.compile('{sys} became operational on {d0, date, short}');\n * cf({ sys: 'HAL 9000', d0: '12 January 1999' })\n * // 'HAL 9000 became operational on 1/12/1999'\n */\n date: function(v,lc,p) {\n var o = {day:'numeric', month:'short', year:'numeric'};\n switch (p) {\n case 'full': o.weekday = 'long';\n case 'long': o.month = 'long'; break;\n case 'short': o.month = 'numeric';\n }\n return (new Date(v)).toLocaleDateString(lc, o)\n },\n\n\n /** Represent a time as a short/default/long string\n *\n * The input value needs to be in a form that the\n * {@link https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date Date object}\n * can process using its single-argument form, `new Date(value)`.\n *\n * @param {number|string} value - Either a Unix epoch time in milliseconds, or a string value representing a date\n * @param {string} [type='default'] - One of `'short'`, `'default'`, `'long'` , or `full`\n *\n * @example\n * var mf = new MessageFormat(['en', 'fi']).setIntlSupport(true);\n *\n * mf.compile('The time is now {T, time}')({ T: Date.now() })\n * // 'The time is now 11:26:35 PM'\n *\n * mf.compile('Kello on nyt {T, time}', 'fi')({ T: Date.now() })\n * // 'Kello on nyt 23.26.35'\n *\n * var cf = mf.compile('The Eagle landed at {T, time, full} on {T, date, full}');\n * cf({ T: '1969-07-20 20:17:40 UTC' })\n * // 'The Eagle landed at 10:17:40 PM GMT+2 on Sunday, July 20, 1969'\n */\n time: function(v,lc,p) {\n var o = {second:'numeric', minute:'numeric', hour:'numeric'};\n switch (p) {\n case 'full': case 'long': o.timeZoneName = 'short'; break;\n case 'short': delete o.second;\n }\n return (new Date(v)).toLocaleTimeString(lc, o)\n }\n};\n\n\n/** Add custom formatter functions to this MessageFormat instance\n *\n * The general syntax for calling a formatting function in MessageFormat is\n * `{var, fn[, args]*}`, where `var` is the variable that will be set by the\n * user code, `fn` determines the formatting function, and `args` is an\n * optional comma-separated list of additional arguments.\n *\n * In JavaScript, each formatting function is called with three parameters;\n * the variable value `v`, the current locale `lc`, and (if set) `args` as a\n * single string, or an array of strings. Formatting functions should not have\n * side effects.\n *\n * @see MessageFormat.formatters\n *\n * @memberof MessageFormat\n * @param {Object.} fmt - A map of formatting functions\n * @returns {MessageFormat} The MessageFormat instance, to allow for chaining\n *\n * @example\n * var mf = new MessageFormat('en-GB');\n * mf.addFormatters({\n * upcase: function(v) { return v.toUpperCase(); },\n * locale: function(v, lc) { return lc; },\n * prop: function(v, lc, p) { return v[p] }\n * });\n *\n * mf.compile('This is {VAR, upcase}.')({ VAR: 'big' })\n * // 'This is BIG.'\n *\n * mf.compile('The current locale is {_, locale}.')({ _: '' })\n * // 'The current locale is en-GB.'\n *\n * mf.compile('Answer: {obj, prop, a}')({ obj: {q: 3, a: 42} })\n * // 'Answer: 42'\n */\nMessageFormat.prototype.addFormatters = function(fmt) {\n for (var name in fmt) if (fmt.hasOwnProperty(name)) {\n this.fmt[name] = fmt[name];\n }\n return this;\n};\n\n\n/** Disable the validation of plural & selectordinal keys\n *\n * Previous versions of messageformat.js allowed the use of plural &\n * selectordinal statements with any keys; now we throw an error when a\n * statement uses a non-numerical key that will never be matched as a\n * pluralization category for the current locale.\n *\n * Use this method to disable the validation and allow usage as previously.\n * To re-enable, you'll need to create a new MessageFormat instance.\n *\n * @returns {MessageFormat} The MessageFormat instance, to allow for chaining\n *\n * @example\n * var mf = new MessageFormat('en');\n * var msg = '{X, plural, zero{no answers} one{an answer} other{# answers}}';\n *\n * mf.compile(msg);\n * // Error: Invalid key `zero` for argument `X`. Valid plural keys for this\n * // locale are `one`, `other`, and explicit keys like `=0`.\n *\n * mf.disablePluralKeyChecks();\n * mf.compile(msg)({ X: 0 });\n * // '0 answers'\n */\nMessageFormat.prototype.disablePluralKeyChecks = function() {\n this.noPluralKeyChecks = true;\n for (var lc in this.pluralFuncs) if (this.pluralFuncs.hasOwnProperty(lc)) {\n this.pluralFuncs[lc].cardinal = [];\n this.pluralFuncs[lc].ordinal = [];\n }\n return this;\n};\n\n\n/** Enable or disable the addition of Unicode control characters to all input\n * to preserve the integrity of the output when mixing LTR and RTL text.\n *\n * @see http://cldr.unicode.org/development/development-process/design-proposals/bidi-handling-of-structured-text\n *\n * @memberof MessageFormat\n * @param {boolean} [enable=true]\n * @returns {MessageFormat} The MessageFormat instance, to allow for chaining\n *\n * @example\n * // upper case stands for RTL characters, output is shown as rendered\n * var mf = new MessageFormat('en');\n *\n * mf.compile('{0} >> {1} >> {2}')(['first', 'SECOND', 'THIRD']);\n * // 'first >> THIRD << SECOND'\n *\n * mf.setBiDiSupport(true);\n * mf.compile('{0} >> {1} >> {2}')(['first', 'SECOND', 'THIRD']);\n * // 'first >> SECOND >> THIRD'\n */\nMessageFormat.prototype.setBiDiSupport = function(enable) {\n this.bidiSupport = !!enable || (typeof enable == 'undefined');\n return this;\n};\n\n\n/** Enable or disable support for the default formatters, which require the\n * `Intl` object. Note that this can't be autodetected, as the environment\n * in which the formatted text is compiled into Javascript functions is not\n * necessarily the same environment in which they will get executed.\n *\n * @see MessageFormat.formatters\n *\n * @memberof MessageFormat\n * @param {boolean} [enable=true]\n * @returns {MessageFormat} The MessageFormat instance, to allow for chaining\n */\nMessageFormat.prototype.setIntlSupport = function(enable) {\n this.intlSupport = !!enable || (typeof enable == 'undefined');\n return this;\n};\n\n\n/** According to the ICU MessageFormat spec, a `#` character directly inside a\n * `plural` or `selectordinal` statement should be replaced by the number\n * matching the surrounding statement. By default, messageformat.js will\n * replace `#` signs with the value of the nearest surrounding `plural` or\n * `selectordinal` statement.\n *\n * Set this to true to follow the stricter ICU MessageFormat spec, and to\n * throw a runtime error if `#` is used with non-numeric input.\n *\n * @memberof MessageFormat\n * @param {boolean} [enable=true]\n * @returns {MessageFormat} The MessageFormat instance, to allow for chaining\n *\n * @example\n * var mf = new MessageFormat('en');\n *\n * var cookieMsg = '#: {X, plural, =0{no cookies} one{a cookie} other{# cookies}}';\n * mf.compile(cookieMsg)({ X: 3 });\n * // '#: 3 cookies'\n *\n * var pastryMsg = '{X, plural, one{{P, select, cookie{a cookie} other{a pie}}} other{{P, select, cookie{# cookies} other{# pies}}}}';\n * mf.compile(pastryMsg)({ X: 3, P: 'pie' });\n * // '3 pies'\n *\n * mf.setStrictNumberSign(true);\n * mf.compile(pastryMsg)({ X: 3, P: 'pie' });\n * // '# pies'\n */\nMessageFormat.prototype.setStrictNumberSign = function(enable) {\n this.strictNumberSign = !!enable || (typeof enable == 'undefined');\n this.runtime.setStrictNumber(this.strictNumberSign);\n return this;\n};\n\n\n/** Compile messages into storable functions\n *\n * If `messages` is a single string including ICU MessageFormat declarations,\n * the result of `compile()` is a function taking a single Object parameter\n * `d` representing each of the input's defined variables.\n *\n * If `messages` is a hierarchical structure of such strings, the output of\n * `compile()` will match that structure, with each string replaced by its\n * corresponding JavaScript function.\n *\n * If the input `messages` -- and therefore the output -- of `compile()` is an\n * object, the output object will have a `toString(global)` method that may be\n * used to store or cache the compiled functions to disk, for later inclusion\n * in any JS environment, without a local MessageFormat instance required. Its\n * `global` parameters sets the name (if any) of the resulting global variable,\n * with special handling for `exports`, `module.exports`, and `export default`.\n * If `global` does not contain a `.`, the output defaults to an UMD pattern.\n *\n * If `locale` is not set, the first locale set in the object's constructor\n * will be used by default; using a key at any depth of `messages` that is a\n * declared locale will set its child elements to use that locale.\n *\n * If `locale` is set, it is used for all messages. If the constructor\n * declared any locales, `locale` needs to be one of them.\n *\n * @memberof MessageFormat\n * @param {string|Object} messages - The input message(s) to be compiled, in ICU MessageFormat\n * @param {string} [locale] - A locale to use for the messages\n * @returns {function|Object} The first match found for the given locale(s)\n *\n * @example\n * var mf = new MessageFormat('en');\n * var cf = mf.compile('A {TYPE} example.');\n *\n * cf({ TYPE: 'simple' })\n * // 'A simple example.'\n *\n * @example\n * var mf = new MessageFormat(['en', 'fi']);\n * var cf = mf.compile({\n * en: { a: 'A {TYPE} example.',\n * b: 'This is the {COUNT, selectordinal, one{#st} two{#nd} few{#rd} other{#th}} example.' },\n * fi: { a: '{TYPE} esimerkki.',\n * b: 'Tämä on {COUNT, selectordinal, other{#.}} esimerkki.' }\n * });\n *\n * cf.en.b({ COUNT: 2 })\n * // 'This is the 2nd example.'\n *\n * cf.fi.b({ COUNT: 2 })\n * // 'Tämä on 2. esimerkki.'\n *\n * @example\n * var fs = require('fs');\n * var mf = new MessageFormat('en').setIntlSupport();\n * var msgSet = {\n * a: 'A {TYPE} example.',\n * b: 'This has {COUNT, plural, one{one member} other{# members}}.',\n * c: 'We have {P, number, percent} code coverage.'\n * };\n * var cfStr = mf.compile(msgSet).toString('module.exports');\n * fs.writeFileSync('messages.js', cfStr);\n * ...\n * var messages = require('./messages');\n *\n * messages.a({ TYPE: 'more complex' })\n * // 'A more complex example.'\n *\n * messages.b({ COUNT: 3 })\n * // 'This has 3 members.'\n */\nMessageFormat.prototype.compile = function(messages, locale) {\n function _stringify(obj, level) {\n if (!level) level = 0;\n if (typeof obj != 'object') return obj;\n var o = [], indent = '';\n for (var i = 0; i < level; ++i) indent += ' ';\n for (var k in obj) o.push('\\n' + indent + ' ' + Compiler.propname(k) + ': ' + _stringify(obj[k], level + 1));\n return '{' + o.join(',') + '\\n' + indent + '}';\n }\n\n var pf;\n if (Object.keys(this.pluralFuncs).length == 0) {\n if (!locale) locale = MessageFormat.defaultLocale;\n pf = {};\n pf[locale] = getPluralFunc(locale, this.noPluralKeyChecks);\n } else if (locale) {\n pf = {};\n pf[locale] = this.pluralFuncs[locale];\n if (!pf[locale]) throw new Error('Locale ' + JSON.stringify(locale) + 'not found in ' + JSON.stringify(this.pluralFuncs) + '!');\n } else {\n pf = this.pluralFuncs;\n locale = Object.keys(pf)[0];\n }\n\n var compiler = new Compiler(this);\n var obj = compiler.compile(messages, locale, pf);\n\n if (typeof messages != 'object') {\n var fn = new Function(\n 'number, plural, select, fmt', Compiler.funcname(locale),\n 'return ' + obj);\n var rt = this.runtime;\n return fn(rt.number, rt.plural, rt.select, this.fmt, pf[locale]);\n }\n\n var rtStr = this.runtime.toString(pf, compiler) + '\\n';\n var objStr = _stringify(obj);\n var result = new Function(rtStr + 'return ' + objStr)();\n if (result.hasOwnProperty('toString')) throw new Error('The top-level message key `toString` is reserved');\n\n result.toString = function(global) {\n switch (global || '') {\n case 'exports':\n var o = [];\n for (var k in obj) o.push(Compiler.propname(k, 'exports') + ' = ' + _stringify(obj[k]));\n return rtStr + o.join(';\\n');\n case 'module.exports':\n return rtStr + 'module.exports = ' + objStr;\n case 'export default':\n return rtStr + 'export default ' + objStr;\n case '':\n return rtStr + 'return ' + objStr;\n default:\n if (global.indexOf('.') > -1) return rtStr + global + ' = ' + objStr;\n return rtStr + [\n '(function (root, G) {',\n ' if (typeof define === \"function\" && define.amd) { define(G); }',\n ' else if (typeof exports === \"object\") { module.exports = G; }',\n ' else { ' + Compiler.propname(global, 'root') + ' = G; }',\n '})(this, ' + objStr + ');'\n ].join('\\n');\n }\n }\n return result;\n}\n\n\nmodule.exports = MessageFormat;\n","var Compiler = require('./compiler');\n\n\n/** A set of utility functions that are called by the compiled Javascript\n * functions, these are included locally in the output of {@link\n * MessageFormat#compile compile()}.\n *\n * @class\n * @param {MessageFormat} mf - A MessageFormat instance\n */\nfunction Runtime(mf) {\n this.mf = mf;\n this.setStrictNumber(mf.strictNumberSign);\n}\n\nmodule.exports = Runtime;\n\n\n/** Utility function for `#` in plural rules\n *\n * Will throw an Error if `value` has a non-numeric value and `offset` is\n * non-zero or {@link MessageFormat#setStrictNumberSign} is set.\n *\n * @function Runtime#number\n * @param {number} value - The value to operate on\n * @param {string} name - The name of the argument, used for error reporting\n * @param {number} [offset=0] - An optional offset, set by the surrounding context\n * @returns {number|string} The result of applying the offset to the input value\n */\nfunction defaultNumber(value, name, offset) {\n if (!offset) return value;\n if (isNaN(value)) throw new Error('Can\\'t apply offset:' + offset + ' to argument `' + name +\n '` with non-numerical value ' + JSON.stringify(value) + '.');\n return value - offset;\n}\n\n\n/** @private */\nfunction strictNumber(value, name, offset) {\n if (isNaN(value)) throw new Error('Argument `' + name + '` has non-numerical value ' + JSON.stringify(value) + '.');\n return value - (offset || 0);\n}\n\n\n/** Set how strictly the {@link number} method parses its input.\n *\n * According to the ICU MessageFormat spec, `#` can only be used to replace a\n * number input of a `plural` statement. By default, messageformat.js does not\n * throw a runtime error if you use non-numeric argument with a `plural` rule,\n * unless rule also includes a non-zero `offset`.\n *\n * This is called by {@link MessageFormat#setStrictNumberSign} to follow the\n * stricter ICU MessageFormat spec.\n *\n * @param {boolean} [enable=false]\n */\nRuntime.prototype.setStrictNumber = function(enable) {\n this.number = enable ? strictNumber : defaultNumber;\n}\n\n\n/** Utility function for `{N, plural|selectordinal, ...}`\n *\n * @param {number} value - The key to use to find a pluralization rule\n * @param {number} offset - An offset to apply to `value`\n * @param {function} lcfunc - A locale function from `pluralFuncs`\n * @param {Object.} data - The object from which results are looked up\n * @param {?boolean} isOrdinal - If true, use ordinal rather than cardinal rules\n * @returns {string} The result of the pluralization\n */\nRuntime.prototype.plural = function(value, offset, lcfunc, data, isOrdinal) {\n if ({}.hasOwnProperty.call(data, value)) return data[value];\n if (offset) value -= offset;\n var key = lcfunc(value, isOrdinal);\n if (key in data) return data[key];\n return data.other;\n}\n\n\n/** Utility function for `{N, select, ...}`\n *\n * @param {number} value - The key to use to find a selection\n * @param {Object.} data - The object from which results are looked up\n * @returns {string} The result of the select statement\n */\nRuntime.prototype.select = function(value, data) {\n if ({}.hasOwnProperty.call(data, value)) return data[value];\n return data.other;\n}\n\n\n/** @private */\nRuntime.prototype.toString = function(pluralFuncs, compiler) {\n function _stringify(o, level) {\n if (typeof o != 'object') {\n var funcStr = o.toString().replace(/^(function )\\w*/, '$1');\n var indent = /([ \\t]*)\\S.*$/.exec(funcStr);\n return indent ? funcStr.replace(new RegExp('^' + indent[1], 'mg'), '') : funcStr;\n }\n var s = [];\n for (var i in o) {\n if (level == 0) s.push('var ' + i + ' = ' + _stringify(o[i], level + 1) + ';\\n');\n else s.push(Compiler.propname(i) + ': ' + _stringify(o[i], level + 1));\n }\n if (level == 0) return s.join('');\n if (s.length == 0) return '{}';\n var indent = ' '; while (--level) indent += ' ';\n return '{\\n' + s.join(',\\n').replace(/^/gm, indent) + '\\n}';\n }\n\n var obj = {};\n Object.keys(compiler.locales).forEach(function(lc) { obj[Compiler.funcname(lc)] = pluralFuncs[lc]; });\n Object.keys(compiler.runtime).forEach(function(fn) { obj[fn] = this[fn]; }, this);\n var fmtKeys = Object.keys(compiler.formatters);\n var fmt = this.mf.fmt;\n if (fmtKeys.length) obj.fmt = fmtKeys.reduce(function(o, key) { o[key] = fmt[key]; return o; }, {});\n return _stringify(obj, 0);\n}\n","/*\n * Generated by PEG.js 0.10.0.\n *\n * http://pegjs.org/\n */\n\n\"use strict\";\n\nfunction peg$subclass(child, parent) {\n function ctor() { this.constructor = child; }\n ctor.prototype = parent.prototype;\n child.prototype = new ctor();\n}\n\nfunction peg$SyntaxError(message, expected, found, location) {\n this.message = message;\n this.expected = expected;\n this.found = found;\n this.location = location;\n this.name = \"SyntaxError\";\n\n if (typeof Error.captureStackTrace === \"function\") {\n Error.captureStackTrace(this, peg$SyntaxError);\n }\n}\n\npeg$subclass(peg$SyntaxError, Error);\n\npeg$SyntaxError.buildMessage = function(expected, found) {\n var DESCRIBE_EXPECTATION_FNS = {\n literal: function(expectation) {\n return \"\\\"\" + literalEscape(expectation.text) + \"\\\"\";\n },\n\n \"class\": function(expectation) {\n var escapedParts = \"\",\n i;\n\n for (i = 0; i < expectation.parts.length; i++) {\n escapedParts += expectation.parts[i] instanceof Array\n ? classEscape(expectation.parts[i][0]) + \"-\" + classEscape(expectation.parts[i][1])\n : classEscape(expectation.parts[i]);\n }\n\n return \"[\" + (expectation.inverted ? \"^\" : \"\") + escapedParts + \"]\";\n },\n\n any: function(expectation) {\n return \"any character\";\n },\n\n end: function(expectation) {\n return \"end of input\";\n },\n\n other: function(expectation) {\n return expectation.description;\n }\n };\n\n function hex(ch) {\n return ch.charCodeAt(0).toString(16).toUpperCase();\n }\n\n function literalEscape(s) {\n return s\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\"/g, '\\\\\"')\n .replace(/\\0/g, '\\\\0')\n .replace(/\\t/g, '\\\\t')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/[\\x00-\\x0F]/g, function(ch) { return '\\\\x0' + hex(ch); })\n .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return '\\\\x' + hex(ch); });\n }\n\n function classEscape(s) {\n return s\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/\\]/g, '\\\\]')\n .replace(/\\^/g, '\\\\^')\n .replace(/-/g, '\\\\-')\n .replace(/\\0/g, '\\\\0')\n .replace(/\\t/g, '\\\\t')\n .replace(/\\n/g, '\\\\n')\n .replace(/\\r/g, '\\\\r')\n .replace(/[\\x00-\\x0F]/g, function(ch) { return '\\\\x0' + hex(ch); })\n .replace(/[\\x10-\\x1F\\x7F-\\x9F]/g, function(ch) { return '\\\\x' + hex(ch); });\n }\n\n function describeExpectation(expectation) {\n return DESCRIBE_EXPECTATION_FNS[expectation.type](expectation);\n }\n\n function describeExpected(expected) {\n var descriptions = new Array(expected.length),\n i, j;\n\n for (i = 0; i < expected.length; i++) {\n descriptions[i] = describeExpectation(expected[i]);\n }\n\n descriptions.sort();\n\n if (descriptions.length > 0) {\n for (i = 1, j = 1; i < descriptions.length; i++) {\n if (descriptions[i - 1] !== descriptions[i]) {\n descriptions[j] = descriptions[i];\n j++;\n }\n }\n descriptions.length = j;\n }\n\n switch (descriptions.length) {\n case 1:\n return descriptions[0];\n\n case 2:\n return descriptions[0] + \" or \" + descriptions[1];\n\n default:\n return descriptions.slice(0, -1).join(\", \")\n + \", or \"\n + descriptions[descriptions.length - 1];\n }\n }\n\n function describeFound(found) {\n return found ? \"\\\"\" + literalEscape(found) + \"\\\"\" : \"end of input\";\n }\n\n return \"Expected \" + describeExpected(expected) + \" but \" + describeFound(found) + \" found.\";\n};\n\nfunction peg$parse(input, options) {\n options = options !== void 0 ? options : {};\n\n var peg$FAILED = {},\n\n peg$startRuleFunctions = { start: peg$parsestart },\n peg$startRuleFunction = peg$parsestart,\n\n peg$c0 = \"#\",\n peg$c1 = peg$literalExpectation(\"#\", false),\n peg$c2 = function() { return { type: 'octothorpe' }; },\n peg$c3 = function(str) { return str.join(''); },\n peg$c4 = \"{\",\n peg$c5 = peg$literalExpectation(\"{\", false),\n peg$c6 = \"}\",\n peg$c7 = peg$literalExpectation(\"}\", false),\n peg$c8 = function(arg) {\n return {\n type: 'argument',\n arg: arg\n };\n },\n peg$c9 = \",\",\n peg$c10 = peg$literalExpectation(\",\", false),\n peg$c11 = \"select\",\n peg$c12 = peg$literalExpectation(\"select\", false),\n peg$c13 = function(arg, cases) {\n return {\n type: 'select',\n arg: arg,\n cases: cases\n };\n },\n peg$c14 = \"plural\",\n peg$c15 = peg$literalExpectation(\"plural\", false),\n peg$c16 = \"selectordinal\",\n peg$c17 = peg$literalExpectation(\"selectordinal\", false),\n peg$c18 = function(arg, type, offset, cases) {\n var ls = ((type === 'selectordinal') ? options.ordinal : options.cardinal)\n || ['zero', 'one', 'two', 'few', 'many', 'other'];\n if (ls && ls.length) cases.forEach(function(c) {\n if (isNaN(c.key) && ls.indexOf(c.key) < 0) throw new Error(\n 'Invalid key `' + c.key + '` for argument `' + arg + '`.' +\n ' Valid ' + type + ' keys for this locale are `' + ls.join('`, `') +\n '`, and explicit keys like `=0`.');\n });\n return {\n type: type,\n arg: arg,\n offset: offset || 0,\n cases: cases\n };\n },\n peg$c19 = function(arg, key, params) {\n return {\n type: 'function',\n arg: arg,\n key: key,\n params: params\n };\n },\n peg$c20 = /^[0-9a-zA-Z$_]/,\n peg$c21 = peg$classExpectation([[\"0\", \"9\"], [\"a\", \"z\"], [\"A\", \"Z\"], \"$\", \"_\"], false, false),\n peg$c22 = /^[^ \\t\\n\\r,.+={}]/,\n peg$c23 = peg$classExpectation([\" \", \"\\t\", \"\\n\", \"\\r\", \",\", \".\", \"+\", \"=\", \"{\", \"}\"], true, false),\n peg$c24 = function(key, tokens) { return { key: key, tokens: tokens }; },\n peg$c25 = function(tokens) { return tokens; },\n peg$c26 = \"offset\",\n peg$c27 = peg$literalExpectation(\"offset\", false),\n peg$c28 = \":\",\n peg$c29 = peg$literalExpectation(\":\", false),\n peg$c30 = function(d) { return d; },\n peg$c31 = \"=\",\n peg$c32 = peg$literalExpectation(\"=\", false),\n peg$c33 = function(p) { return options.strictFunctionParams; },\n peg$c34 = function(p) { return p; },\n peg$c35 = function(p) { return p.replace(/^[ \\t\\n\\r]*|[ \\t\\n\\r]*$/g, ''); },\n peg$c36 = \"''\",\n peg$c37 = peg$literalExpectation(\"''\", false),\n peg$c38 = function() { return \"'\"; },\n peg$c39 = /^[^']/,\n peg$c40 = peg$classExpectation([\"'\"], true, false),\n peg$c41 = \"'{\",\n peg$c42 = peg$literalExpectation(\"'{\", false),\n peg$c43 = \"'\",\n peg$c44 = peg$literalExpectation(\"'\", false),\n peg$c45 = function(str) { return '\\u007B'+str.join(''); },\n peg$c46 = \"'}\",\n peg$c47 = peg$literalExpectation(\"'}\", false),\n peg$c48 = function(str) { return '\\u007D'+str.join(''); },\n peg$c49 = /^[^{}#\\\\\\0-\\x08\\x0E-\\x1F\\x7F]/,\n peg$c50 = peg$classExpectation([\"{\", \"}\", \"#\", \"\\\\\", [\"\\0\", \"\\b\"], [\"\\x0E\", \"\\x1F\"], \"\\x7F\"], true, false),\n peg$c51 = \"\\\\\\\\\",\n peg$c52 = peg$literalExpectation(\"\\\\\\\\\", false),\n peg$c53 = function() { return '\\\\'; },\n peg$c54 = \"\\\\#\",\n peg$c55 = peg$literalExpectation(\"\\\\#\", false),\n peg$c56 = function() { return '#'; },\n peg$c57 = \"\\\\{\",\n peg$c58 = peg$literalExpectation(\"\\\\{\", false),\n peg$c59 = function() { return '\\u007B'; },\n peg$c60 = \"\\\\}\",\n peg$c61 = peg$literalExpectation(\"\\\\}\", false),\n peg$c62 = function() { return '\\u007D'; },\n peg$c63 = \"\\\\u\",\n peg$c64 = peg$literalExpectation(\"\\\\u\", false),\n peg$c65 = function(h1, h2, h3, h4) {\n return String.fromCharCode(parseInt('0x' + h1 + h2 + h3 + h4));\n },\n peg$c66 = /^[^',}]/,\n peg$c67 = peg$classExpectation([\"'\", \",\", \"}\"], true, false),\n peg$c68 = /^[^'}]/,\n peg$c69 = peg$classExpectation([\"'\", \"}\"], true, false),\n peg$c70 = /^[0-9]/,\n peg$c71 = peg$classExpectation([[\"0\", \"9\"]], false, false),\n peg$c72 = /^[0-9a-fA-F]/,\n peg$c73 = peg$classExpectation([[\"0\", \"9\"], [\"a\", \"f\"], [\"A\", \"F\"]], false, false),\n peg$c74 = /^[ \\t\\n\\r]/,\n peg$c75 = peg$classExpectation([\" \", \"\\t\", \"\\n\", \"\\r\"], false, false),\n\n peg$currPos = 0,\n peg$savedPos = 0,\n peg$posDetailsCache = [{ line: 1, column: 1 }],\n peg$maxFailPos = 0,\n peg$maxFailExpected = [],\n peg$silentFails = 0,\n\n peg$result;\n\n if (\"startRule\" in options) {\n if (!(options.startRule in peg$startRuleFunctions)) {\n throw new Error(\"Can't start parsing from rule \\\"\" + options.startRule + \"\\\".\");\n }\n\n peg$startRuleFunction = peg$startRuleFunctions[options.startRule];\n }\n\n function text() {\n return input.substring(peg$savedPos, peg$currPos);\n }\n\n function location() {\n return peg$computeLocation(peg$savedPos, peg$currPos);\n }\n\n function expected(description, location) {\n location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)\n\n throw peg$buildStructuredError(\n [peg$otherExpectation(description)],\n input.substring(peg$savedPos, peg$currPos),\n location\n );\n }\n\n function error(message, location) {\n location = location !== void 0 ? location : peg$computeLocation(peg$savedPos, peg$currPos)\n\n throw peg$buildSimpleError(message, location);\n }\n\n function peg$literalExpectation(text, ignoreCase) {\n return { type: \"literal\", text: text, ignoreCase: ignoreCase };\n }\n\n function peg$classExpectation(parts, inverted, ignoreCase) {\n return { type: \"class\", parts: parts, inverted: inverted, ignoreCase: ignoreCase };\n }\n\n function peg$anyExpectation() {\n return { type: \"any\" };\n }\n\n function peg$endExpectation() {\n return { type: \"end\" };\n }\n\n function peg$otherExpectation(description) {\n return { type: \"other\", description: description };\n }\n\n function peg$computePosDetails(pos) {\n var details = peg$posDetailsCache[pos], p;\n\n if (details) {\n return details;\n } else {\n p = pos - 1;\n while (!peg$posDetailsCache[p]) {\n p--;\n }\n\n details = peg$posDetailsCache[p];\n details = {\n line: details.line,\n column: details.column\n };\n\n while (p < pos) {\n if (input.charCodeAt(p) === 10) {\n details.line++;\n details.column = 1;\n } else {\n details.column++;\n }\n\n p++;\n }\n\n peg$posDetailsCache[pos] = details;\n return details;\n }\n }\n\n function peg$computeLocation(startPos, endPos) {\n var startPosDetails = peg$computePosDetails(startPos),\n endPosDetails = peg$computePosDetails(endPos);\n\n return {\n start: {\n offset: startPos,\n line: startPosDetails.line,\n column: startPosDetails.column\n },\n end: {\n offset: endPos,\n line: endPosDetails.line,\n column: endPosDetails.column\n }\n };\n }\n\n function peg$fail(expected) {\n if (peg$currPos < peg$maxFailPos) { return; }\n\n if (peg$currPos > peg$maxFailPos) {\n peg$maxFailPos = peg$currPos;\n peg$maxFailExpected = [];\n }\n\n peg$maxFailExpected.push(expected);\n }\n\n function peg$buildSimpleError(message, location) {\n return new peg$SyntaxError(message, null, null, location);\n }\n\n function peg$buildStructuredError(expected, found, location) {\n return new peg$SyntaxError(\n peg$SyntaxError.buildMessage(expected, found),\n expected,\n found,\n location\n );\n }\n\n function peg$parsestart() {\n var s0, s1;\n\n s0 = [];\n s1 = peg$parsetoken();\n while (s1 !== peg$FAILED) {\n s0.push(s1);\n s1 = peg$parsetoken();\n }\n\n return s0;\n }\n\n function peg$parsetoken() {\n var s0, s1, s2;\n\n s0 = peg$parseargument();\n if (s0 === peg$FAILED) {\n s0 = peg$parseselect();\n if (s0 === peg$FAILED) {\n s0 = peg$parseplural();\n if (s0 === peg$FAILED) {\n s0 = peg$parsefunction();\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 35) {\n s1 = peg$c0;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c1); }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c2();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = [];\n s2 = peg$parsechar();\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n s2 = peg$parsechar();\n }\n } else {\n s1 = peg$FAILED;\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c3(s1);\n }\n s0 = s1;\n }\n }\n }\n }\n }\n\n return s0;\n }\n\n function peg$parseargument() {\n var s0, s1, s2, s3, s4, s5;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 123) {\n s1 = peg$c4;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c5); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n if (s2 !== peg$FAILED) {\n s3 = peg$parseid();\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 125) {\n s5 = peg$c6;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c7); }\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c8(s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseselect() {\n var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 123) {\n s1 = peg$c4;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c5); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n if (s2 !== peg$FAILED) {\n s3 = peg$parseid();\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s5 = peg$c9;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c10); }\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n if (s6 !== peg$FAILED) {\n if (input.substr(peg$currPos, 6) === peg$c11) {\n s7 = peg$c11;\n peg$currPos += 6;\n } else {\n s7 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c12); }\n }\n if (s7 !== peg$FAILED) {\n s8 = peg$parse_();\n if (s8 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s9 = peg$c9;\n peg$currPos++;\n } else {\n s9 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c10); }\n }\n if (s9 !== peg$FAILED) {\n s10 = peg$parse_();\n if (s10 !== peg$FAILED) {\n s11 = [];\n s12 = peg$parseselectCase();\n if (s12 !== peg$FAILED) {\n while (s12 !== peg$FAILED) {\n s11.push(s12);\n s12 = peg$parseselectCase();\n }\n } else {\n s11 = peg$FAILED;\n }\n if (s11 !== peg$FAILED) {\n s12 = peg$parse_();\n if (s12 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 125) {\n s13 = peg$c6;\n peg$currPos++;\n } else {\n s13 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c7); }\n }\n if (s13 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c13(s3, s11);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseplural() {\n var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10, s11, s12, s13, s14;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 123) {\n s1 = peg$c4;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c5); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n if (s2 !== peg$FAILED) {\n s3 = peg$parseid();\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s5 = peg$c9;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c10); }\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n if (s6 !== peg$FAILED) {\n if (input.substr(peg$currPos, 6) === peg$c14) {\n s7 = peg$c14;\n peg$currPos += 6;\n } else {\n s7 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c15); }\n }\n if (s7 === peg$FAILED) {\n if (input.substr(peg$currPos, 13) === peg$c16) {\n s7 = peg$c16;\n peg$currPos += 13;\n } else {\n s7 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c17); }\n }\n }\n if (s7 !== peg$FAILED) {\n s8 = peg$parse_();\n if (s8 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s9 = peg$c9;\n peg$currPos++;\n } else {\n s9 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c10); }\n }\n if (s9 !== peg$FAILED) {\n s10 = peg$parse_();\n if (s10 !== peg$FAILED) {\n s11 = peg$parseoffset();\n if (s11 === peg$FAILED) {\n s11 = null;\n }\n if (s11 !== peg$FAILED) {\n s12 = [];\n s13 = peg$parsepluralCase();\n if (s13 !== peg$FAILED) {\n while (s13 !== peg$FAILED) {\n s12.push(s13);\n s13 = peg$parsepluralCase();\n }\n } else {\n s12 = peg$FAILED;\n }\n if (s12 !== peg$FAILED) {\n s13 = peg$parse_();\n if (s13 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 125) {\n s14 = peg$c6;\n peg$currPos++;\n } else {\n s14 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c7); }\n }\n if (s14 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c18(s3, s7, s11, s12);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsefunction() {\n var s0, s1, s2, s3, s4, s5, s6, s7, s8, s9, s10;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 123) {\n s1 = peg$c4;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c5); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parse_();\n if (s2 !== peg$FAILED) {\n s3 = peg$parseid();\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s5 = peg$c9;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c10); }\n }\n if (s5 !== peg$FAILED) {\n s6 = peg$parse_();\n if (s6 !== peg$FAILED) {\n s7 = peg$parseid();\n if (s7 !== peg$FAILED) {\n s8 = peg$parse_();\n if (s8 !== peg$FAILED) {\n s9 = peg$parsefunctionParams();\n if (s9 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 125) {\n s10 = peg$c6;\n peg$currPos++;\n } else {\n s10 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c7); }\n }\n if (s10 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c19(s3, s7, s9);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseid() {\n var s0, s1, s2, s3, s4;\n\n s0 = peg$currPos;\n s1 = peg$currPos;\n if (peg$c20.test(input.charAt(peg$currPos))) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c21); }\n }\n if (s2 !== peg$FAILED) {\n s3 = [];\n if (peg$c22.test(input.charAt(peg$currPos))) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c23); }\n }\n while (s4 !== peg$FAILED) {\n s3.push(s4);\n if (peg$c22.test(input.charAt(peg$currPos))) {\n s4 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c23); }\n }\n }\n if (s3 !== peg$FAILED) {\n s2 = [s2, s3];\n s1 = s2;\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n } else {\n peg$currPos = s1;\n s1 = peg$FAILED;\n }\n if (s1 !== peg$FAILED) {\n s0 = input.substring(s0, peg$currPos);\n } else {\n s0 = s1;\n }\n\n return s0;\n }\n\n function peg$parseparamDefault() {\n var s0, s1, s2;\n\n s0 = peg$currPos;\n s1 = [];\n s2 = peg$parseparamcharsDefault();\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n s2 = peg$parseparamcharsDefault();\n }\n } else {\n s1 = peg$FAILED;\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c3(s1);\n }\n s0 = s1;\n\n return s0;\n }\n\n function peg$parseparamStrict() {\n var s0, s1, s2;\n\n s0 = peg$currPos;\n s1 = [];\n s2 = peg$parseparamcharsStrict();\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n s2 = peg$parseparamcharsStrict();\n }\n } else {\n s1 = peg$FAILED;\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c3(s1);\n }\n s0 = s1;\n\n return s0;\n }\n\n function peg$parseselectCase() {\n var s0, s1, s2, s3, s4;\n\n s0 = peg$currPos;\n s1 = peg$parse_();\n if (s1 !== peg$FAILED) {\n s2 = peg$parseid();\n if (s2 !== peg$FAILED) {\n s3 = peg$parse_();\n if (s3 !== peg$FAILED) {\n s4 = peg$parsecaseTokens();\n if (s4 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c24(s2, s4);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsepluralCase() {\n var s0, s1, s2, s3, s4;\n\n s0 = peg$currPos;\n s1 = peg$parse_();\n if (s1 !== peg$FAILED) {\n s2 = peg$parsepluralKey();\n if (s2 !== peg$FAILED) {\n s3 = peg$parse_();\n if (s3 !== peg$FAILED) {\n s4 = peg$parsecaseTokens();\n if (s4 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c24(s2, s4);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsecaseTokens() {\n var s0, s1, s2, s3, s4, s5;\n\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 123) {\n s1 = peg$c4;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c5); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$currPos;\n s3 = peg$parse_();\n if (s3 !== peg$FAILED) {\n s4 = peg$currPos;\n peg$silentFails++;\n if (input.charCodeAt(peg$currPos) === 123) {\n s5 = peg$c4;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c5); }\n }\n peg$silentFails--;\n if (s5 !== peg$FAILED) {\n peg$currPos = s4;\n s4 = void 0;\n } else {\n s4 = peg$FAILED;\n }\n if (s4 !== peg$FAILED) {\n s3 = [s3, s4];\n s2 = s3;\n } else {\n peg$currPos = s2;\n s2 = peg$FAILED;\n }\n } else {\n peg$currPos = s2;\n s2 = peg$FAILED;\n }\n if (s2 === peg$FAILED) {\n s2 = null;\n }\n if (s2 !== peg$FAILED) {\n s3 = [];\n s4 = peg$parsetoken();\n while (s4 !== peg$FAILED) {\n s3.push(s4);\n s4 = peg$parsetoken();\n }\n if (s3 !== peg$FAILED) {\n s4 = peg$parse_();\n if (s4 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 125) {\n s5 = peg$c6;\n peg$currPos++;\n } else {\n s5 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c7); }\n }\n if (s5 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c25(s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parseoffset() {\n var s0, s1, s2, s3, s4, s5, s6, s7;\n\n s0 = peg$currPos;\n s1 = peg$parse_();\n if (s1 !== peg$FAILED) {\n if (input.substr(peg$currPos, 6) === peg$c26) {\n s2 = peg$c26;\n peg$currPos += 6;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c27); }\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$parse_();\n if (s3 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 58) {\n s4 = peg$c28;\n peg$currPos++;\n } else {\n s4 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c29); }\n }\n if (s4 !== peg$FAILED) {\n s5 = peg$parse_();\n if (s5 !== peg$FAILED) {\n s6 = peg$parsedigits();\n if (s6 !== peg$FAILED) {\n s7 = peg$parse_();\n if (s7 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c30(s6);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsepluralKey() {\n var s0, s1, s2;\n\n s0 = peg$parseid();\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.charCodeAt(peg$currPos) === 61) {\n s1 = peg$c31;\n peg$currPos++;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c32); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parsedigits();\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c30(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n\n return s0;\n }\n\n function peg$parsefunctionParams() {\n var s0, s1, s2;\n\n s0 = peg$currPos;\n s1 = [];\n s2 = peg$parsefunctionParamsDefault();\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n s2 = peg$parsefunctionParamsDefault();\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = peg$currPos;\n s2 = peg$c33(s1);\n if (s2) {\n s2 = peg$FAILED;\n } else {\n s2 = void 0;\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c34(s1);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = [];\n s2 = peg$parsefunctionParamsStrict();\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n s2 = peg$parsefunctionParamsStrict();\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = peg$currPos;\n s2 = peg$c33(s1);\n if (s2) {\n s2 = void 0;\n } else {\n s2 = peg$FAILED;\n }\n if (s2 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c34(s1);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n\n return s0;\n }\n\n function peg$parsefunctionParamsStrict() {\n var s0, s1, s2, s3;\n\n s0 = peg$currPos;\n s1 = peg$parse_();\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s2 = peg$c9;\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c10); }\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$parseparamStrict();\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c34(s3);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsefunctionParamsDefault() {\n var s0, s1, s2, s3, s4, s5;\n\n s0 = peg$currPos;\n s1 = peg$parse_();\n if (s1 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 44) {\n s2 = peg$c9;\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c10); }\n }\n if (s2 !== peg$FAILED) {\n s3 = peg$parse_();\n if (s3 !== peg$FAILED) {\n s4 = peg$parseparamDefault();\n if (s4 !== peg$FAILED) {\n s5 = peg$parse_();\n if (s5 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c35(s4);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n\n return s0;\n }\n\n function peg$parsedoubleapos() {\n var s0, s1;\n\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 2) === peg$c36) {\n s1 = peg$c36;\n peg$currPos += 2;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c37); }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c38();\n }\n s0 = s1;\n\n return s0;\n }\n\n function peg$parseinapos() {\n var s0, s1, s2;\n\n s0 = peg$parsedoubleapos();\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = [];\n if (peg$c39.test(input.charAt(peg$currPos))) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c40); }\n }\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n if (peg$c39.test(input.charAt(peg$currPos))) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c40); }\n }\n }\n } else {\n s1 = peg$FAILED;\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c3(s1);\n }\n s0 = s1;\n }\n\n return s0;\n }\n\n function peg$parsequotedCurly() {\n var s0, s1, s2, s3;\n\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 2) === peg$c41) {\n s1 = peg$c41;\n peg$currPos += 2;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c42); }\n }\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$parseinapos();\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$parseinapos();\n }\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 39) {\n s3 = peg$c43;\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c44); }\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c45(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 2) === peg$c46) {\n s1 = peg$c46;\n peg$currPos += 2;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c47); }\n }\n if (s1 !== peg$FAILED) {\n s2 = [];\n s3 = peg$parseinapos();\n while (s3 !== peg$FAILED) {\n s2.push(s3);\n s3 = peg$parseinapos();\n }\n if (s2 !== peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 39) {\n s3 = peg$c43;\n peg$currPos++;\n } else {\n s3 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c44); }\n }\n if (s3 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c48(s2);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n\n return s0;\n }\n\n function peg$parsequotedFunctionParams() {\n var s0;\n\n s0 = peg$parsequotedCurly();\n if (s0 === peg$FAILED) {\n if (input.charCodeAt(peg$currPos) === 39) {\n s0 = peg$c43;\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c44); }\n }\n }\n\n return s0;\n }\n\n function peg$parsechar() {\n var s0, s1, s2, s3, s4, s5;\n\n if (peg$c49.test(input.charAt(peg$currPos))) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c50); }\n }\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 2) === peg$c51) {\n s1 = peg$c51;\n peg$currPos += 2;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c52); }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c53();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 2) === peg$c54) {\n s1 = peg$c54;\n peg$currPos += 2;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c55); }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c56();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 2) === peg$c57) {\n s1 = peg$c57;\n peg$currPos += 2;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c58); }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c59();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 2) === peg$c60) {\n s1 = peg$c60;\n peg$currPos += 2;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c61); }\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c62();\n }\n s0 = s1;\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n if (input.substr(peg$currPos, 2) === peg$c63) {\n s1 = peg$c63;\n peg$currPos += 2;\n } else {\n s1 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c64); }\n }\n if (s1 !== peg$FAILED) {\n s2 = peg$parsehexDigit();\n if (s2 !== peg$FAILED) {\n s3 = peg$parsehexDigit();\n if (s3 !== peg$FAILED) {\n s4 = peg$parsehexDigit();\n if (s4 !== peg$FAILED) {\n s5 = peg$parsehexDigit();\n if (s5 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c65(s2, s3, s4, s5);\n s0 = s1;\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n } else {\n peg$currPos = s0;\n s0 = peg$FAILED;\n }\n }\n }\n }\n }\n }\n\n return s0;\n }\n\n function peg$parseparamcharsCommon() {\n var s0;\n\n s0 = peg$parsedoubleapos();\n if (s0 === peg$FAILED) {\n s0 = peg$parsequotedFunctionParams();\n }\n\n return s0;\n }\n\n function peg$parseparamcharsDefault() {\n var s0, s1, s2;\n\n s0 = peg$parseparamcharsCommon();\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = [];\n if (peg$c66.test(input.charAt(peg$currPos))) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c67); }\n }\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n if (peg$c66.test(input.charAt(peg$currPos))) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c67); }\n }\n }\n } else {\n s1 = peg$FAILED;\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c3(s1);\n }\n s0 = s1;\n }\n\n return s0;\n }\n\n function peg$parseparamcharsStrict() {\n var s0, s1, s2;\n\n s0 = peg$parseparamcharsCommon();\n if (s0 === peg$FAILED) {\n s0 = peg$currPos;\n s1 = [];\n if (peg$c68.test(input.charAt(peg$currPos))) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c69); }\n }\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n if (peg$c68.test(input.charAt(peg$currPos))) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c69); }\n }\n }\n } else {\n s1 = peg$FAILED;\n }\n if (s1 !== peg$FAILED) {\n peg$savedPos = s0;\n s1 = peg$c3(s1);\n }\n s0 = s1;\n }\n\n return s0;\n }\n\n function peg$parsedigits() {\n var s0, s1, s2;\n\n s0 = peg$currPos;\n s1 = [];\n if (peg$c70.test(input.charAt(peg$currPos))) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c71); }\n }\n if (s2 !== peg$FAILED) {\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n if (peg$c70.test(input.charAt(peg$currPos))) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c71); }\n }\n }\n } else {\n s1 = peg$FAILED;\n }\n if (s1 !== peg$FAILED) {\n s0 = input.substring(s0, peg$currPos);\n } else {\n s0 = s1;\n }\n\n return s0;\n }\n\n function peg$parsehexDigit() {\n var s0;\n\n if (peg$c72.test(input.charAt(peg$currPos))) {\n s0 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s0 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c73); }\n }\n\n return s0;\n }\n\n function peg$parse_() {\n var s0, s1, s2;\n\n s0 = peg$currPos;\n s1 = [];\n if (peg$c74.test(input.charAt(peg$currPos))) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c75); }\n }\n while (s2 !== peg$FAILED) {\n s1.push(s2);\n if (peg$c74.test(input.charAt(peg$currPos))) {\n s2 = input.charAt(peg$currPos);\n peg$currPos++;\n } else {\n s2 = peg$FAILED;\n if (peg$silentFails === 0) { peg$fail(peg$c75); }\n }\n }\n if (s1 !== peg$FAILED) {\n s0 = input.substring(s0, peg$currPos);\n } else {\n s0 = s1;\n }\n\n return s0;\n }\n\n peg$result = peg$startRuleFunction();\n\n if (peg$result !== peg$FAILED && peg$currPos === input.length) {\n return peg$result;\n } else {\n if (peg$result !== peg$FAILED && peg$currPos < input.length) {\n peg$fail(peg$endExpectation());\n }\n\n throw peg$buildStructuredError(\n peg$maxFailExpected,\n peg$maxFailPos < input.length ? input.charAt(peg$maxFailPos) : null,\n peg$maxFailPos < input.length\n ? peg$computeLocation(peg$maxFailPos, peg$maxFailPos + 1)\n : peg$computeLocation(peg$maxFailPos, peg$maxFailPos)\n );\n }\n}\n\nmodule.exports = {\n SyntaxError: peg$SyntaxError,\n parse: peg$parse\n};\n","/*\nobject-assign\n(c) Sindre Sorhus\n@license MIT\n*/\n\n'use strict';\n/* eslint-disable no-unused-vars */\nvar getOwnPropertySymbols = Object.getOwnPropertySymbols;\nvar hasOwnProperty = Object.prototype.hasOwnProperty;\nvar propIsEnumerable = Object.prototype.propertyIsEnumerable;\n\nfunction toObject(val) {\n\tif (val === null || val === undefined) {\n\t\tthrow new TypeError('Object.assign cannot be called with null or undefined');\n\t}\n\n\treturn Object(val);\n}\n\nfunction shouldUseNative() {\n\ttry {\n\t\tif (!Object.assign) {\n\t\t\treturn false;\n\t\t}\n\n\t\t// Detect buggy property enumeration order in older V8 versions.\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=4118\n\t\tvar test1 = new String('abc'); // eslint-disable-line no-new-wrappers\n\t\ttest1[5] = 'de';\n\t\tif (Object.getOwnPropertyNames(test1)[0] === '5') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test2 = {};\n\t\tfor (var i = 0; i < 10; i++) {\n\t\t\ttest2['_' + String.fromCharCode(i)] = i;\n\t\t}\n\t\tvar order2 = Object.getOwnPropertyNames(test2).map(function (n) {\n\t\t\treturn test2[n];\n\t\t});\n\t\tif (order2.join('') !== '0123456789') {\n\t\t\treturn false;\n\t\t}\n\n\t\t// https://bugs.chromium.org/p/v8/issues/detail?id=3056\n\t\tvar test3 = {};\n\t\t'abcdefghijklmnopqrst'.split('').forEach(function (letter) {\n\t\t\ttest3[letter] = letter;\n\t\t});\n\t\tif (Object.keys(Object.assign({}, test3)).join('') !==\n\t\t\t\t'abcdefghijklmnopqrst') {\n\t\t\treturn false;\n\t\t}\n\n\t\treturn true;\n\t} catch (err) {\n\t\t// We don't expect any of the above to throw, but better to be safe.\n\t\treturn false;\n\t}\n}\n\nmodule.exports = shouldUseNative() ? Object.assign : function (target, source) {\n\tvar from;\n\tvar to = toObject(target);\n\tvar symbols;\n\n\tfor (var s = 1; s < arguments.length; s++) {\n\t\tfrom = Object(arguments[s]);\n\n\t\tfor (var key in from) {\n\t\t\tif (hasOwnProperty.call(from, key)) {\n\t\t\t\tto[key] = from[key];\n\t\t\t}\n\t\t}\n\n\t\tif (getOwnPropertySymbols) {\n\t\t\tsymbols = getOwnPropertySymbols(from);\n\t\t\tfor (var i = 0; i < symbols.length; i++) {\n\t\t\t\tif (propIsEnumerable.call(from, symbols[i])) {\n\t\t\t\t\tto[symbols[i]] = from[symbols[i]];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\treturn to;\n};\n","// 'path' module extracted from Node.js v8.11.1 (only the posix part)\n// transplited with Babel\n\n// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nfunction assertPath(path) {\n if (typeof path !== 'string') {\n throw new TypeError('Path must be a string. Received ' + JSON.stringify(path));\n }\n}\n\n// Resolves . and .. elements in a path with directory names\nfunction normalizeStringPosix(path, allowAboveRoot) {\n var res = '';\n var lastSegmentLength = 0;\n var lastSlash = -1;\n var dots = 0;\n var code;\n for (var i = 0; i <= path.length; ++i) {\n if (i < path.length)\n code = path.charCodeAt(i);\n else if (code === 47 /*/*/)\n break;\n else\n code = 47 /*/*/;\n if (code === 47 /*/*/) {\n if (lastSlash === i - 1 || dots === 1) {\n // NOOP\n } else if (lastSlash !== i - 1 && dots === 2) {\n if (res.length < 2 || lastSegmentLength !== 2 || res.charCodeAt(res.length - 1) !== 46 /*.*/ || res.charCodeAt(res.length - 2) !== 46 /*.*/) {\n if (res.length > 2) {\n var lastSlashIndex = res.lastIndexOf('/');\n if (lastSlashIndex !== res.length - 1) {\n if (lastSlashIndex === -1) {\n res = '';\n lastSegmentLength = 0;\n } else {\n res = res.slice(0, lastSlashIndex);\n lastSegmentLength = res.length - 1 - res.lastIndexOf('/');\n }\n lastSlash = i;\n dots = 0;\n continue;\n }\n } else if (res.length === 2 || res.length === 1) {\n res = '';\n lastSegmentLength = 0;\n lastSlash = i;\n dots = 0;\n continue;\n }\n }\n if (allowAboveRoot) {\n if (res.length > 0)\n res += '/..';\n else\n res = '..';\n lastSegmentLength = 2;\n }\n } else {\n if (res.length > 0)\n res += '/' + path.slice(lastSlash + 1, i);\n else\n res = path.slice(lastSlash + 1, i);\n lastSegmentLength = i - lastSlash - 1;\n }\n lastSlash = i;\n dots = 0;\n } else if (code === 46 /*.*/ && dots !== -1) {\n ++dots;\n } else {\n dots = -1;\n }\n }\n return res;\n}\n\nfunction _format(sep, pathObject) {\n var dir = pathObject.dir || pathObject.root;\n var base = pathObject.base || (pathObject.name || '') + (pathObject.ext || '');\n if (!dir) {\n return base;\n }\n if (dir === pathObject.root) {\n return dir + base;\n }\n return dir + sep + base;\n}\n\nvar posix = {\n // path.resolve([from ...], to)\n resolve: function resolve() {\n var resolvedPath = '';\n var resolvedAbsolute = false;\n var cwd;\n\n for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) {\n var path;\n if (i >= 0)\n path = arguments[i];\n else {\n if (cwd === undefined)\n cwd = process.cwd();\n path = cwd;\n }\n\n assertPath(path);\n\n // Skip empty entries\n if (path.length === 0) {\n continue;\n }\n\n resolvedPath = path + '/' + resolvedPath;\n resolvedAbsolute = path.charCodeAt(0) === 47 /*/*/;\n }\n\n // At this point the path should be resolved to a full absolute path, but\n // handle relative paths to be safe (might happen when process.cwd() fails)\n\n // Normalize the path\n resolvedPath = normalizeStringPosix(resolvedPath, !resolvedAbsolute);\n\n if (resolvedAbsolute) {\n if (resolvedPath.length > 0)\n return '/' + resolvedPath;\n else\n return '/';\n } else if (resolvedPath.length > 0) {\n return resolvedPath;\n } else {\n return '.';\n }\n },\n\n normalize: function normalize(path) {\n assertPath(path);\n\n if (path.length === 0) return '.';\n\n var isAbsolute = path.charCodeAt(0) === 47 /*/*/;\n var trailingSeparator = path.charCodeAt(path.length - 1) === 47 /*/*/;\n\n // Normalize the path\n path = normalizeStringPosix(path, !isAbsolute);\n\n if (path.length === 0 && !isAbsolute) path = '.';\n if (path.length > 0 && trailingSeparator) path += '/';\n\n if (isAbsolute) return '/' + path;\n return path;\n },\n\n isAbsolute: function isAbsolute(path) {\n assertPath(path);\n return path.length > 0 && path.charCodeAt(0) === 47 /*/*/;\n },\n\n join: function join() {\n if (arguments.length === 0)\n return '.';\n var joined;\n for (var i = 0; i < arguments.length; ++i) {\n var arg = arguments[i];\n assertPath(arg);\n if (arg.length > 0) {\n if (joined === undefined)\n joined = arg;\n else\n joined += '/' + arg;\n }\n }\n if (joined === undefined)\n return '.';\n return posix.normalize(joined);\n },\n\n relative: function relative(from, to) {\n assertPath(from);\n assertPath(to);\n\n if (from === to) return '';\n\n from = posix.resolve(from);\n to = posix.resolve(to);\n\n if (from === to) return '';\n\n // Trim any leading backslashes\n var fromStart = 1;\n for (; fromStart < from.length; ++fromStart) {\n if (from.charCodeAt(fromStart) !== 47 /*/*/)\n break;\n }\n var fromEnd = from.length;\n var fromLen = fromEnd - fromStart;\n\n // Trim any leading backslashes\n var toStart = 1;\n for (; toStart < to.length; ++toStart) {\n if (to.charCodeAt(toStart) !== 47 /*/*/)\n break;\n }\n var toEnd = to.length;\n var toLen = toEnd - toStart;\n\n // Compare paths to find the longest common path from root\n var length = fromLen < toLen ? fromLen : toLen;\n var lastCommonSep = -1;\n var i = 0;\n for (; i <= length; ++i) {\n if (i === length) {\n if (toLen > length) {\n if (to.charCodeAt(toStart + i) === 47 /*/*/) {\n // We get here if `from` is the exact base path for `to`.\n // For example: from='/foo/bar'; to='/foo/bar/baz'\n return to.slice(toStart + i + 1);\n } else if (i === 0) {\n // We get here if `from` is the root\n // For example: from='/'; to='/foo'\n return to.slice(toStart + i);\n }\n } else if (fromLen > length) {\n if (from.charCodeAt(fromStart + i) === 47 /*/*/) {\n // We get here if `to` is the exact base path for `from`.\n // For example: from='/foo/bar/baz'; to='/foo/bar'\n lastCommonSep = i;\n } else if (i === 0) {\n // We get here if `to` is the root.\n // For example: from='/foo'; to='/'\n lastCommonSep = 0;\n }\n }\n break;\n }\n var fromCode = from.charCodeAt(fromStart + i);\n var toCode = to.charCodeAt(toStart + i);\n if (fromCode !== toCode)\n break;\n else if (fromCode === 47 /*/*/)\n lastCommonSep = i;\n }\n\n var out = '';\n // Generate the relative path based on the path difference between `to`\n // and `from`\n for (i = fromStart + lastCommonSep + 1; i <= fromEnd; ++i) {\n if (i === fromEnd || from.charCodeAt(i) === 47 /*/*/) {\n if (out.length === 0)\n out += '..';\n else\n out += '/..';\n }\n }\n\n // Lastly, append the rest of the destination (`to`) path that comes after\n // the common path parts\n if (out.length > 0)\n return out + to.slice(toStart + lastCommonSep);\n else {\n toStart += lastCommonSep;\n if (to.charCodeAt(toStart) === 47 /*/*/)\n ++toStart;\n return to.slice(toStart);\n }\n },\n\n _makeLong: function _makeLong(path) {\n return path;\n },\n\n dirname: function dirname(path) {\n assertPath(path);\n if (path.length === 0) return '.';\n var code = path.charCodeAt(0);\n var hasRoot = code === 47 /*/*/;\n var end = -1;\n var matchedSlash = true;\n for (var i = path.length - 1; i >= 1; --i) {\n code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n if (!matchedSlash) {\n end = i;\n break;\n }\n } else {\n // We saw the first non-path separator\n matchedSlash = false;\n }\n }\n\n if (end === -1) return hasRoot ? '/' : '.';\n if (hasRoot && end === 1) return '//';\n return path.slice(0, end);\n },\n\n basename: function basename(path, ext) {\n if (ext !== undefined && typeof ext !== 'string') throw new TypeError('\"ext\" argument must be a string');\n assertPath(path);\n\n var start = 0;\n var end = -1;\n var matchedSlash = true;\n var i;\n\n if (ext !== undefined && ext.length > 0 && ext.length <= path.length) {\n if (ext.length === path.length && ext === path) return '';\n var extIdx = ext.length - 1;\n var firstNonSlashEnd = -1;\n for (i = path.length - 1; i >= 0; --i) {\n var code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n } else {\n if (firstNonSlashEnd === -1) {\n // We saw the first non-path separator, remember this index in case\n // we need it if the extension ends up not matching\n matchedSlash = false;\n firstNonSlashEnd = i + 1;\n }\n if (extIdx >= 0) {\n // Try to match the explicit extension\n if (code === ext.charCodeAt(extIdx)) {\n if (--extIdx === -1) {\n // We matched the extension, so mark this as the end of our path\n // component\n end = i;\n }\n } else {\n // Extension does not match, so our result is the entire path\n // component\n extIdx = -1;\n end = firstNonSlashEnd;\n }\n }\n }\n }\n\n if (start === end) end = firstNonSlashEnd;else if (end === -1) end = path.length;\n return path.slice(start, end);\n } else {\n for (i = path.length - 1; i >= 0; --i) {\n if (path.charCodeAt(i) === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n start = i + 1;\n break;\n }\n } else if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // path component\n matchedSlash = false;\n end = i + 1;\n }\n }\n\n if (end === -1) return '';\n return path.slice(start, end);\n }\n },\n\n extname: function extname(path) {\n assertPath(path);\n var startDot = -1;\n var startPart = 0;\n var end = -1;\n var matchedSlash = true;\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n var preDotState = 0;\n for (var i = path.length - 1; i >= 0; --i) {\n var code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46 /*.*/) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1)\n startDot = i;\n else if (preDotState !== 1)\n preDotState = 1;\n } else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n\n if (startDot === -1 || end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n return '';\n }\n return path.slice(startDot, end);\n },\n\n format: function format(pathObject) {\n if (pathObject === null || typeof pathObject !== 'object') {\n throw new TypeError('The \"pathObject\" argument must be of type Object. Received type ' + typeof pathObject);\n }\n return _format('/', pathObject);\n },\n\n parse: function parse(path) {\n assertPath(path);\n\n var ret = { root: '', dir: '', base: '', ext: '', name: '' };\n if (path.length === 0) return ret;\n var code = path.charCodeAt(0);\n var isAbsolute = code === 47 /*/*/;\n var start;\n if (isAbsolute) {\n ret.root = '/';\n start = 1;\n } else {\n start = 0;\n }\n var startDot = -1;\n var startPart = 0;\n var end = -1;\n var matchedSlash = true;\n var i = path.length - 1;\n\n // Track the state of characters (if any) we see before our first dot and\n // after any path separator we find\n var preDotState = 0;\n\n // Get non-dir info\n for (; i >= start; --i) {\n code = path.charCodeAt(i);\n if (code === 47 /*/*/) {\n // If we reached a path separator that was not part of a set of path\n // separators at the end of the string, stop now\n if (!matchedSlash) {\n startPart = i + 1;\n break;\n }\n continue;\n }\n if (end === -1) {\n // We saw the first non-path separator, mark this as the end of our\n // extension\n matchedSlash = false;\n end = i + 1;\n }\n if (code === 46 /*.*/) {\n // If this is our first dot, mark it as the start of our extension\n if (startDot === -1) startDot = i;else if (preDotState !== 1) preDotState = 1;\n } else if (startDot !== -1) {\n // We saw a non-dot and non-path separator before our dot, so we should\n // have a good chance at having a non-empty extension\n preDotState = -1;\n }\n }\n\n if (startDot === -1 || end === -1 ||\n // We saw a non-dot character immediately before the dot\n preDotState === 0 ||\n // The (right-most) trimmed path component is exactly '..'\n preDotState === 1 && startDot === end - 1 && startDot === startPart + 1) {\n if (end !== -1) {\n if (startPart === 0 && isAbsolute) ret.base = ret.name = path.slice(1, end);else ret.base = ret.name = path.slice(startPart, end);\n }\n } else {\n if (startPart === 0 && isAbsolute) {\n ret.name = path.slice(1, startDot);\n ret.base = path.slice(1, end);\n } else {\n ret.name = path.slice(startPart, startDot);\n ret.base = path.slice(startPart, end);\n }\n ret.ext = path.slice(startDot, end);\n }\n\n if (startPart > 0) ret.dir = path.slice(0, startPart - 1);else if (isAbsolute) ret.dir = '/';\n\n return ret;\n },\n\n sep: '/',\n delimiter: ':',\n win32: null,\n posix: null\n};\n\nposix.posix = posix;\n\nmodule.exports = posix;\n","// shim for using process in browser\nvar process = module.exports = {};\n\n// cached from whatever global is present so that test runners that stub it\n// don't break things. But we need to wrap it in a try catch in case it is\n// wrapped in strict mode code which doesn't define any globals. It's inside a\n// function because try/catches deoptimize in certain engines.\n\nvar cachedSetTimeout;\nvar cachedClearTimeout;\n\nfunction defaultSetTimout() {\n throw new Error('setTimeout has not been defined');\n}\nfunction defaultClearTimeout () {\n throw new Error('clearTimeout has not been defined');\n}\n(function () {\n try {\n if (typeof setTimeout === 'function') {\n cachedSetTimeout = setTimeout;\n } else {\n cachedSetTimeout = defaultSetTimout;\n }\n } catch (e) {\n cachedSetTimeout = defaultSetTimout;\n }\n try {\n if (typeof clearTimeout === 'function') {\n cachedClearTimeout = clearTimeout;\n } else {\n cachedClearTimeout = defaultClearTimeout;\n }\n } catch (e) {\n cachedClearTimeout = defaultClearTimeout;\n }\n} ())\nfunction runTimeout(fun) {\n if (cachedSetTimeout === setTimeout) {\n //normal enviroments in sane situations\n return setTimeout(fun, 0);\n }\n // if setTimeout wasn't available but was latter defined\n if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {\n cachedSetTimeout = setTimeout;\n return setTimeout(fun, 0);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedSetTimeout(fun, 0);\n } catch(e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedSetTimeout.call(null, fun, 0);\n } catch(e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error\n return cachedSetTimeout.call(this, fun, 0);\n }\n }\n\n\n}\nfunction runClearTimeout(marker) {\n if (cachedClearTimeout === clearTimeout) {\n //normal enviroments in sane situations\n return clearTimeout(marker);\n }\n // if clearTimeout wasn't available but was latter defined\n if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {\n cachedClearTimeout = clearTimeout;\n return clearTimeout(marker);\n }\n try {\n // when when somebody has screwed with setTimeout but no I.E. maddness\n return cachedClearTimeout(marker);\n } catch (e){\n try {\n // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally\n return cachedClearTimeout.call(null, marker);\n } catch (e){\n // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.\n // Some versions of I.E. have different rules for clearTimeout vs setTimeout\n return cachedClearTimeout.call(this, marker);\n }\n }\n\n\n\n}\nvar queue = [];\nvar draining = false;\nvar currentQueue;\nvar queueIndex = -1;\n\nfunction cleanUpNextTick() {\n if (!draining || !currentQueue) {\n return;\n }\n draining = false;\n if (currentQueue.length) {\n queue = currentQueue.concat(queue);\n } else {\n queueIndex = -1;\n }\n if (queue.length) {\n drainQueue();\n }\n}\n\nfunction drainQueue() {\n if (draining) {\n return;\n }\n var timeout = runTimeout(cleanUpNextTick);\n draining = true;\n\n var len = queue.length;\n while(len) {\n currentQueue = queue;\n queue = [];\n while (++queueIndex < len) {\n if (currentQueue) {\n currentQueue[queueIndex].run();\n }\n }\n queueIndex = -1;\n len = queue.length;\n }\n currentQueue = null;\n draining = false;\n runClearTimeout(timeout);\n}\n\nprocess.nextTick = function (fun) {\n var args = new Array(arguments.length - 1);\n if (arguments.length > 1) {\n for (var i = 1; i < arguments.length; i++) {\n args[i - 1] = arguments[i];\n }\n }\n queue.push(new Item(fun, args));\n if (queue.length === 1 && !draining) {\n runTimeout(drainQueue);\n }\n};\n\n// v8 likes predictible objects\nfunction Item(fun, array) {\n this.fun = fun;\n this.array = array;\n}\nItem.prototype.run = function () {\n this.fun.apply(null, this.array);\n};\nprocess.title = 'browser';\nprocess.browser = true;\nprocess.env = {};\nprocess.argv = [];\nprocess.version = ''; // empty string to avoid regexp issues\nprocess.versions = {};\n\nfunction noop() {}\n\nprocess.on = noop;\nprocess.addListener = noop;\nprocess.once = noop;\nprocess.off = noop;\nprocess.removeListener = noop;\nprocess.removeAllListeners = noop;\nprocess.emit = noop;\nprocess.prependListener = noop;\nprocess.prependOnceListener = noop;\n\nprocess.listeners = function (name) { return [] }\n\nprocess.binding = function (name) {\n throw new Error('process.binding is not supported');\n};\n\nprocess.cwd = function () { return '/' };\nprocess.chdir = function (dir) {\n throw new Error('process.chdir is not supported');\n};\nprocess.umask = function() { return 0; };\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\n// If obj.hasOwnProperty has been overridden, then calling\n// obj.hasOwnProperty(prop) will break.\n// See: https://github.com/joyent/node/issues/1707\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n\nmodule.exports = function(qs, sep, eq, options) {\n sep = sep || '&';\n eq = eq || '=';\n var obj = {};\n\n if (typeof qs !== 'string' || qs.length === 0) {\n return obj;\n }\n\n var regexp = /\\+/g;\n qs = qs.split(sep);\n\n var maxKeys = 1000;\n if (options && typeof options.maxKeys === 'number') {\n maxKeys = options.maxKeys;\n }\n\n var len = qs.length;\n // maxKeys <= 0 means that we should not limit keys count\n if (maxKeys > 0 && len > maxKeys) {\n len = maxKeys;\n }\n\n for (var i = 0; i < len; ++i) {\n var x = qs[i].replace(regexp, '%20'),\n idx = x.indexOf(eq),\n kstr, vstr, k, v;\n\n if (idx >= 0) {\n kstr = x.substr(0, idx);\n vstr = x.substr(idx + 1);\n } else {\n kstr = x;\n vstr = '';\n }\n\n k = decodeURIComponent(kstr);\n v = decodeURIComponent(vstr);\n\n if (!hasOwnProperty(obj, k)) {\n obj[k] = v;\n } else if (isArray(obj[k])) {\n obj[k].push(v);\n } else {\n obj[k] = [obj[k], v];\n }\n }\n\n return obj;\n};\n\nvar isArray = Array.isArray || function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]';\n};\n","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\n'use strict';\n\nvar stringifyPrimitive = function(v) {\n switch (typeof v) {\n case 'string':\n return v;\n\n case 'boolean':\n return v ? 'true' : 'false';\n\n case 'number':\n return isFinite(v) ? v : '';\n\n default:\n return '';\n }\n};\n\nmodule.exports = function(obj, sep, eq, name) {\n sep = sep || '&';\n eq = eq || '=';\n if (obj === null) {\n obj = undefined;\n }\n\n if (typeof obj === 'object') {\n return map(objectKeys(obj), function(k) {\n var ks = encodeURIComponent(stringifyPrimitive(k)) + eq;\n if (isArray(obj[k])) {\n return map(obj[k], function(v) {\n return ks + encodeURIComponent(stringifyPrimitive(v));\n }).join(sep);\n } else {\n return ks + encodeURIComponent(stringifyPrimitive(obj[k]));\n }\n }).join(sep);\n\n }\n\n if (!name) return '';\n return encodeURIComponent(stringifyPrimitive(name)) + eq +\n encodeURIComponent(stringifyPrimitive(obj));\n};\n\nvar isArray = Array.isArray || function (xs) {\n return Object.prototype.toString.call(xs) === '[object Array]';\n};\n\nfunction map (xs, f) {\n if (xs.map) return xs.map(f);\n var res = [];\n for (var i = 0; i < xs.length; i++) {\n res.push(f(xs[i], i));\n }\n return res;\n}\n\nvar objectKeys = Object.keys || function (obj) {\n var res = [];\n for (var key in obj) {\n if (Object.prototype.hasOwnProperty.call(obj, key)) res.push(key);\n }\n return res;\n};\n","'use strict';\n\nexports.decode = exports.parse = require('./decode');\nexports.encode = exports.stringify = require('./encode');\n","/**\n * Copyright (c) 2014, Facebook, Inc.\n * All rights reserved.\n *\n * This source code is licensed under the BSD-style license found in the\n * https://raw.github.com/facebook/regenerator/master/LICENSE file. An\n * additional grant of patent rights can be found in the PATENTS file in\n * the same directory.\n */\n\n!(function(global) {\n \"use strict\";\n\n var Op = Object.prototype;\n var hasOwn = Op.hasOwnProperty;\n var undefined; // More compressible than void 0.\n var $Symbol = typeof Symbol === \"function\" ? Symbol : {};\n var iteratorSymbol = $Symbol.iterator || \"@@iterator\";\n var asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\";\n var toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n\n var inModule = typeof module === \"object\";\n var runtime = global.regeneratorRuntime;\n if (runtime) {\n if (inModule) {\n // If regeneratorRuntime is defined globally and we're in a module,\n // make the exports object identical to regeneratorRuntime.\n module.exports = runtime;\n }\n // Don't bother evaluating the rest of this file if the runtime was\n // already defined globally.\n return;\n }\n\n // Define the runtime globally (as expected by generated code) as either\n // module.exports (if we're in a module) or a new, empty object.\n runtime = global.regeneratorRuntime = inModule ? module.exports : {};\n\n function wrap(innerFn, outerFn, self, tryLocsList) {\n // If outerFn provided and outerFn.prototype is a Generator, then outerFn.prototype instanceof Generator.\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator;\n var generator = Object.create(protoGenerator.prototype);\n var context = new Context(tryLocsList || []);\n\n // The ._invoke method unifies the implementations of the .next,\n // .throw, and .return methods.\n generator._invoke = makeInvokeMethod(innerFn, self, context);\n\n return generator;\n }\n runtime.wrap = wrap;\n\n // Try/catch helper to minimize deoptimizations. Returns a completion\n // record like context.tryEntries[i].completion. This interface could\n // have been (and was previously) designed to take a closure to be\n // invoked without arguments, but in all the cases we care about we\n // already have an existing method we want to call, so there's no need\n // to create a new function object. We can even get away with assuming\n // the method takes exactly one argument, since that happens to be true\n // in every case, so we don't have to touch the arguments object. The\n // only additional allocation required is the completion record, which\n // has a stable shape and so hopefully should be cheap to allocate.\n function tryCatch(fn, obj, arg) {\n try {\n return { type: \"normal\", arg: fn.call(obj, arg) };\n } catch (err) {\n return { type: \"throw\", arg: err };\n }\n }\n\n var GenStateSuspendedStart = \"suspendedStart\";\n var GenStateSuspendedYield = \"suspendedYield\";\n var GenStateExecuting = \"executing\";\n var GenStateCompleted = \"completed\";\n\n // Returning this object from the innerFn has the same effect as\n // breaking out of the dispatch switch statement.\n var ContinueSentinel = {};\n\n // Dummy constructor functions that we use as the .constructor and\n // .constructor.prototype properties for functions that return Generator\n // objects. For full spec compliance, you may wish to configure your\n // minifier not to mangle the names of these two functions.\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n\n // This is a polyfill for %IteratorPrototype% for environments that\n // don't natively support it.\n var IteratorPrototype = {};\n IteratorPrototype[iteratorSymbol] = function () {\n return this;\n };\n\n var getProto = Object.getPrototypeOf;\n var NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n if (NativeIteratorPrototype &&\n NativeIteratorPrototype !== Op &&\n hasOwn.call(NativeIteratorPrototype, iteratorSymbol)) {\n // This environment has a native %IteratorPrototype%; use it instead\n // of the polyfill.\n IteratorPrototype = NativeIteratorPrototype;\n }\n\n var Gp = GeneratorFunctionPrototype.prototype =\n Generator.prototype = Object.create(IteratorPrototype);\n GeneratorFunction.prototype = Gp.constructor = GeneratorFunctionPrototype;\n GeneratorFunctionPrototype.constructor = GeneratorFunction;\n GeneratorFunctionPrototype[toStringTagSymbol] =\n GeneratorFunction.displayName = \"GeneratorFunction\";\n\n // Helper for defining the .next, .throw, and .return methods of the\n // Iterator interface in terms of a single ._invoke method.\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function(method) {\n prototype[method] = function(arg) {\n return this._invoke(method, arg);\n };\n });\n }\n\n runtime.isGeneratorFunction = function(genFun) {\n var ctor = typeof genFun === \"function\" && genFun.constructor;\n return ctor\n ? ctor === GeneratorFunction ||\n // For the native GeneratorFunction constructor, the best we can\n // do is to check its .name property.\n (ctor.displayName || ctor.name) === \"GeneratorFunction\"\n : false;\n };\n\n runtime.mark = function(genFun) {\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(genFun, GeneratorFunctionPrototype);\n } else {\n genFun.__proto__ = GeneratorFunctionPrototype;\n if (!(toStringTagSymbol in genFun)) {\n genFun[toStringTagSymbol] = \"GeneratorFunction\";\n }\n }\n genFun.prototype = Object.create(Gp);\n return genFun;\n };\n\n // Within the body of any async function, `await x` is transformed to\n // `yield regeneratorRuntime.awrap(x)`, so that the runtime can test\n // `hasOwn.call(value, \"__await\")` to determine if the yielded value is\n // meant to be awaited.\n runtime.awrap = function(arg) {\n return { __await: arg };\n };\n\n function AsyncIterator(generator) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (record.type === \"throw\") {\n reject(record.arg);\n } else {\n var result = record.arg;\n var value = result.value;\n if (value &&\n typeof value === \"object\" &&\n hasOwn.call(value, \"__await\")) {\n return Promise.resolve(value.__await).then(function(value) {\n invoke(\"next\", value, resolve, reject);\n }, function(err) {\n invoke(\"throw\", err, resolve, reject);\n });\n }\n\n return Promise.resolve(value).then(function(unwrapped) {\n // When a yielded Promise is resolved, its final value becomes\n // the .value of the Promise<{value,done}> result for the\n // current iteration. If the Promise is rejected, however, the\n // result for this iteration will be rejected with the same\n // reason. Note that rejections of yielded Promises are not\n // thrown back into the generator function, as is the case\n // when an awaited Promise is rejected. This difference in\n // behavior between yield and await is important, because it\n // allows the consumer to decide what to do with the yielded\n // rejection (swallow it and continue, manually .throw it back\n // into the generator, abandon iteration, whatever). With\n // await, by contrast, there is no opportunity to examine the\n // rejection reason outside the generator function, so the\n // only option is to throw it from the await expression, and\n // let the generator function handle the exception.\n result.value = unwrapped;\n resolve(result);\n }, reject);\n }\n }\n\n if (typeof global.process === \"object\" && global.process.domain) {\n invoke = global.process.domain.bind(invoke);\n }\n\n var previousPromise;\n\n function enqueue(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new Promise(function(resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n\n return previousPromise =\n // If enqueue has been called before, then we want to wait until\n // all previous Promises have been resolved before calling invoke,\n // so that results are always delivered in the correct order. If\n // enqueue has not been called before, then it is important to\n // call invoke immediately, without waiting on a callback to fire,\n // so that the async generator function has the opportunity to do\n // any necessary setup in a predictable way. This predictability\n // is why the Promise constructor synchronously invokes its\n // executor callback, and why async functions synchronously\n // execute code before the first await. Since we implement simple\n // async functions in terms of async generators, it is especially\n // important to get this right, even though it requires care.\n previousPromise ? previousPromise.then(\n callInvokeWithMethodAndArg,\n // Avoid propagating failures to Promises returned by later\n // invocations of the iterator.\n callInvokeWithMethodAndArg\n ) : callInvokeWithMethodAndArg();\n }\n\n // Define the unified helper method that is used to implement .next,\n // .throw, and .return (see defineIteratorMethods).\n this._invoke = enqueue;\n }\n\n defineIteratorMethods(AsyncIterator.prototype);\n AsyncIterator.prototype[asyncIteratorSymbol] = function () {\n return this;\n };\n runtime.AsyncIterator = AsyncIterator;\n\n // Note that simple async functions are implemented on top of\n // AsyncIterator objects; they just return a Promise for the value of\n // the final result produced by the iterator.\n runtime.async = function(innerFn, outerFn, self, tryLocsList) {\n var iter = new AsyncIterator(\n wrap(innerFn, outerFn, self, tryLocsList)\n );\n\n return runtime.isGeneratorFunction(outerFn)\n ? iter // If outerFn is a generator, return the full iterator.\n : iter.next().then(function(result) {\n return result.done ? result.value : iter.next();\n });\n };\n\n function makeInvokeMethod(innerFn, self, context) {\n var state = GenStateSuspendedStart;\n\n return function invoke(method, arg) {\n if (state === GenStateExecuting) {\n throw new Error(\"Generator is already running\");\n }\n\n if (state === GenStateCompleted) {\n if (method === \"throw\") {\n throw arg;\n }\n\n // Be forgiving, per 25.3.3.3.3 of the spec:\n // https://people.mozilla.org/~jorendorff/es6-draft.html#sec-generatorresume\n return doneResult();\n }\n\n context.method = method;\n context.arg = arg;\n\n while (true) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n\n if (context.method === \"next\") {\n // Setting context._sent for legacy support of Babel's\n // function.sent implementation.\n context.sent = context._sent = context.arg;\n\n } else if (context.method === \"throw\") {\n if (state === GenStateSuspendedStart) {\n state = GenStateCompleted;\n throw context.arg;\n }\n\n context.dispatchException(context.arg);\n\n } else if (context.method === \"return\") {\n context.abrupt(\"return\", context.arg);\n }\n\n state = GenStateExecuting;\n\n var record = tryCatch(innerFn, self, context);\n if (record.type === \"normal\") {\n // If an exception is thrown from innerFn, we leave state ===\n // GenStateExecuting and loop back for another invocation.\n state = context.done\n ? GenStateCompleted\n : GenStateSuspendedYield;\n\n if (record.arg === ContinueSentinel) {\n continue;\n }\n\n return {\n value: record.arg,\n done: context.done\n };\n\n } else if (record.type === \"throw\") {\n state = GenStateCompleted;\n // Dispatch the exception by looping back around to the\n // context.dispatchException(context.arg) call above.\n context.method = \"throw\";\n context.arg = record.arg;\n }\n }\n };\n }\n\n // Call delegate.iterator[context.method](context.arg) and handle the\n // result, either by returning a { value, done } result from the\n // delegate iterator, or by modifying context.method and context.arg,\n // setting context.delegate to null, and returning the ContinueSentinel.\n function maybeInvokeDelegate(delegate, context) {\n var method = delegate.iterator[context.method];\n if (method === undefined) {\n // A .throw or .return when the delegate iterator has no .throw\n // method always terminates the yield* loop.\n context.delegate = null;\n\n if (context.method === \"throw\") {\n if (delegate.iterator.return) {\n // If the delegate iterator has a return method, give it a\n // chance to clean up.\n context.method = \"return\";\n context.arg = undefined;\n maybeInvokeDelegate(delegate, context);\n\n if (context.method === \"throw\") {\n // If maybeInvokeDelegate(context) changed context.method from\n // \"return\" to \"throw\", let that override the TypeError below.\n return ContinueSentinel;\n }\n }\n\n context.method = \"throw\";\n context.arg = new TypeError(\n \"The iterator does not provide a 'throw' method\");\n }\n\n return ContinueSentinel;\n }\n\n var record = tryCatch(method, delegate.iterator, context.arg);\n\n if (record.type === \"throw\") {\n context.method = \"throw\";\n context.arg = record.arg;\n context.delegate = null;\n return ContinueSentinel;\n }\n\n var info = record.arg;\n\n if (! info) {\n context.method = \"throw\";\n context.arg = new TypeError(\"iterator result is not an object\");\n context.delegate = null;\n return ContinueSentinel;\n }\n\n if (info.done) {\n // Assign the result of the finished delegate to the temporary\n // variable specified by delegate.resultName (see delegateYield).\n context[delegate.resultName] = info.value;\n\n // Resume execution at the desired location (see delegateYield).\n context.next = delegate.nextLoc;\n\n // If context.method was \"throw\" but the delegate handled the\n // exception, let the outer generator proceed normally. If\n // context.method was \"next\", forget context.arg since it has been\n // \"consumed\" by the delegate iterator. If context.method was\n // \"return\", allow the original .return call to continue in the\n // outer generator.\n if (context.method !== \"return\") {\n context.method = \"next\";\n context.arg = undefined;\n }\n\n } else {\n // Re-yield the result returned by the delegate method.\n return info;\n }\n\n // The delegate iterator is finished, so forget it and continue with\n // the outer generator.\n context.delegate = null;\n return ContinueSentinel;\n }\n\n // Define Generator.prototype.{next,throw,return} in terms of the\n // unified ._invoke helper method.\n defineIteratorMethods(Gp);\n\n Gp[toStringTagSymbol] = \"Generator\";\n\n // A Generator should always return itself as the iterator object when the\n // @@iterator function is called on it. Some browsers' implementations of the\n // iterator prototype chain incorrectly implement this, causing the Generator\n // object to not be returned from this call. This ensures that doesn't happen.\n // See https://github.com/facebook/regenerator/issues/274 for more details.\n Gp[iteratorSymbol] = function() {\n return this;\n };\n\n Gp.toString = function() {\n return \"[object Generator]\";\n };\n\n function pushTryEntry(locs) {\n var entry = { tryLoc: locs[0] };\n\n if (1 in locs) {\n entry.catchLoc = locs[1];\n }\n\n if (2 in locs) {\n entry.finallyLoc = locs[2];\n entry.afterLoc = locs[3];\n }\n\n this.tryEntries.push(entry);\n }\n\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\";\n delete record.arg;\n entry.completion = record;\n }\n\n function Context(tryLocsList) {\n // The root entry object (effectively a try statement without a catch\n // or a finally block) gives us a place to store values thrown from\n // locations where there is no enclosing try statement.\n this.tryEntries = [{ tryLoc: \"root\" }];\n tryLocsList.forEach(pushTryEntry, this);\n this.reset(true);\n }\n\n runtime.keys = function(object) {\n var keys = [];\n for (var key in object) {\n keys.push(key);\n }\n keys.reverse();\n\n // Rather than returning an object with a next method, we keep\n // things simple and return the next function itself.\n return function next() {\n while (keys.length) {\n var key = keys.pop();\n if (key in object) {\n next.value = key;\n next.done = false;\n return next;\n }\n }\n\n // To avoid creating an additional object, we just hang the .value\n // and .done properties off the next function object itself. This\n // also ensures that the minifier will not anonymize the function.\n next.done = true;\n return next;\n };\n };\n\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) {\n return iteratorMethod.call(iterable);\n }\n\n if (typeof iterable.next === \"function\") {\n return iterable;\n }\n\n if (!isNaN(iterable.length)) {\n var i = -1, next = function next() {\n while (++i < iterable.length) {\n if (hasOwn.call(iterable, i)) {\n next.value = iterable[i];\n next.done = false;\n return next;\n }\n }\n\n next.value = undefined;\n next.done = true;\n\n return next;\n };\n\n return next.next = next;\n }\n }\n\n // Return an iterator with no values.\n return { next: doneResult };\n }\n runtime.values = values;\n\n function doneResult() {\n return { value: undefined, done: true };\n }\n\n Context.prototype = {\n constructor: Context,\n\n reset: function(skipTempReset) {\n this.prev = 0;\n this.next = 0;\n // Resetting context._sent for legacy support of Babel's\n // function.sent implementation.\n this.sent = this._sent = undefined;\n this.done = false;\n this.delegate = null;\n\n this.method = \"next\";\n this.arg = undefined;\n\n this.tryEntries.forEach(resetTryEntry);\n\n if (!skipTempReset) {\n for (var name in this) {\n // Not sure about the optimal order of these conditions:\n if (name.charAt(0) === \"t\" &&\n hasOwn.call(this, name) &&\n !isNaN(+name.slice(1))) {\n this[name] = undefined;\n }\n }\n }\n },\n\n stop: function() {\n this.done = true;\n\n var rootEntry = this.tryEntries[0];\n var rootRecord = rootEntry.completion;\n if (rootRecord.type === \"throw\") {\n throw rootRecord.arg;\n }\n\n return this.rval;\n },\n\n dispatchException: function(exception) {\n if (this.done) {\n throw exception;\n }\n\n var context = this;\n function handle(loc, caught) {\n record.type = \"throw\";\n record.arg = exception;\n context.next = loc;\n\n if (caught) {\n // If the dispatched exception was caught by a catch block,\n // then let that catch block handle the exception normally.\n context.method = \"next\";\n context.arg = undefined;\n }\n\n return !! caught;\n }\n\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n var record = entry.completion;\n\n if (entry.tryLoc === \"root\") {\n // Exception thrown outside of any try block that could handle\n // it, so set the completion value of the entire function to\n // throw the exception.\n return handle(\"end\");\n }\n\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\");\n var hasFinally = hasOwn.call(entry, \"finallyLoc\");\n\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n } else if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) {\n return handle(entry.catchLoc, true);\n }\n\n } else if (hasFinally) {\n if (this.prev < entry.finallyLoc) {\n return handle(entry.finallyLoc);\n }\n\n } else {\n throw new Error(\"try statement without catch or finally\");\n }\n }\n }\n },\n\n abrupt: function(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev &&\n hasOwn.call(entry, \"finallyLoc\") &&\n this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n\n if (finallyEntry &&\n (type === \"break\" ||\n type === \"continue\") &&\n finallyEntry.tryLoc <= arg &&\n arg <= finallyEntry.finallyLoc) {\n // Ignore the finally entry if control is not jumping to a\n // location outside the try/catch block.\n finallyEntry = null;\n }\n\n var record = finallyEntry ? finallyEntry.completion : {};\n record.type = type;\n record.arg = arg;\n\n if (finallyEntry) {\n this.method = \"next\";\n this.next = finallyEntry.finallyLoc;\n return ContinueSentinel;\n }\n\n return this.complete(record);\n },\n\n complete: function(record, afterLoc) {\n if (record.type === \"throw\") {\n throw record.arg;\n }\n\n if (record.type === \"break\" ||\n record.type === \"continue\") {\n this.next = record.arg;\n } else if (record.type === \"return\") {\n this.rval = this.arg = record.arg;\n this.method = \"return\";\n this.next = \"end\";\n } else if (record.type === \"normal\" && afterLoc) {\n this.next = afterLoc;\n }\n\n return ContinueSentinel;\n },\n\n finish: function(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) {\n this.complete(entry.completion, entry.afterLoc);\n resetTryEntry(entry);\n return ContinueSentinel;\n }\n }\n },\n\n \"catch\": function(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (record.type === \"throw\") {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n\n // The context.catch method must only be called with a location\n // argument that corresponds to a known catch block.\n throw new Error(\"illegal catch attempt\");\n },\n\n delegateYield: function(iterable, resultName, nextLoc) {\n this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n };\n\n if (this.method === \"next\") {\n // Deliberately forget the last sent value so that we don't\n // accidentally pass it on to the delegate.\n this.arg = undefined;\n }\n\n return ContinueSentinel;\n }\n };\n})(\n // Among the various tricks for obtaining a reference to the global\n // object, this seems to be the most reliable technique that does not\n // use indirect eval (which violates Content Security Policy).\n typeof global === \"object\" ? global :\n typeof window === \"object\" ? window :\n typeof self === \"object\" ? self : this\n);\n","module.exports = require('./reserved-words');\n","var assert = require('assert');\n\n/**\n * Structure for storing keywords.\n *\n * @typedef {Object.} KeywordsHash\n */\n\n/**\n * ECMAScript dialects.\n *\n * @const\n * @type {Object.} - keys as readable names and values as versions\n */\nvar DIALECTS = {\n es3: 3,\n es5: 5,\n es2015: 6,\n es7: 7,\n\n // aliases\n es6: 6,\n 'default': 5,\n next: 6\n};\n\n/**\n * ECMAScript reserved words.\n *\n * @type {Object.}\n */\nvar KEYWORDS = exports.KEYWORDS = {};\n\n/**\n * Check word for being an reserved word.\n *\n * @param {String} word - word to check\n * @param {String|Number} [dialect] - dialect or version\n * @param {Boolean} [strict] - strict mode\n * @returns {?Boolean}\n */\nexports.check = function check(word, dialect, strict) {\n dialect = dialect || DIALECTS.default;\n var version = DIALECTS[dialect] || dialect;\n\n if (strict && version >= 5) {\n version += '-strict';\n }\n\n assert(KEYWORDS[version], 'Unknown dialect');\n\n return KEYWORDS[version].hasOwnProperty(word);\n};\n\n/**\n * Reserved Words for ES3\n *\n * ECMA-262 3rd: 7.5.1\n * http://www.ecma-international.org/publications/files/ECMA-ST-ARCH/ECMA-262,%203rd%20edition,%20December%201999.pdf\n *\n * @type {KeywordsHash}\n */\nKEYWORDS['3'] = _hash(\n // Keyword, ECMA-262 3rd: 7.5.2\n 'break else new var',\n 'case finally return void',\n 'catch for switch while',\n 'continue function this with',\n 'default if throw',\n 'delete in try',\n 'do instanceof typeof',\n // FutureReservedWord, ECMA-262 3rd 7.5.3\n 'abstract enum int short',\n 'boolean export interface static',\n 'byte extends long super',\n 'char final native synchronized',\n 'class float package throws',\n 'const goto private transient',\n 'debugger implements protected volatile',\n 'double import public',\n // NullLiteral & BooleanLiteral\n 'null true false'\n);\n\n/**\n * Reserved Words for ES5.\n *\n * http://es5.github.io/#x7.6.1\n *\n * @type {KeywordsHash}\n */\nKEYWORDS['5'] = _hash(\n // Keyword\n 'break do instanceof typeof',\n 'case else new var',\n 'catch finally return void',\n 'continue for switch while',\n 'debugger function this with',\n 'default if throw',\n 'delete in try',\n // FutureReservedWord\n 'class enum extends super',\n 'const export import',\n // NullLiteral & BooleanLiteral\n 'null true false'\n);\n\n/**\n * Reserved Words for ES5 in strict mode.\n *\n * @type {KeywordsHash}\n */\nKEYWORDS['5-strict'] = _hash(\n KEYWORDS['5'],\n // FutureReservedWord, strict mode. http://es5.github.io/#x7.6.1.2\n 'implements let private public yield',\n 'interface package protected static'\n);\n\n/**\n * Reserved Words for ES6.\n *\n * 11.6.2\n * http://www.ecma-international.org/ecma-262/6.0/index.html#sec-reserved-words\n *\n * @type {KeywordsHash}\n */\nKEYWORDS['6'] = _hash(\n // Keywords, ES6 11.6.2.1, http://www.ecma-international.org/ecma-262/6.0/index.html#sec-keywords\n 'break do in typeof',\n 'case else instanceof var',\n 'catch export new void',\n 'class extends return while',\n 'const finally super with',\n 'continue for switch yield',\n 'debugger function this',\n 'default if throw',\n 'delete import try',\n // Future Reserved Words, ES6 11.6.2.2\n // http://www.ecma-international.org/ecma-262/6.0/index.html#sec-future-reserved-words\n 'enum await',\n // NullLiteral & BooleanLiteral\n 'null true false'\n);\n\n/**\n * Reserved Words for ES6 in strict mode.\n *\n * @type {KeywordsHash}\n */\nKEYWORDS['6-strict'] = _hash(\n KEYWORDS['6'],\n // Keywords, ES6 11.6.2.1\n 'let static',\n // Future Reserved Words, ES6 11.6.2.2\n 'implements package protected',\n 'interface private public'\n);\n\n/**\n * Generates hash from strings\n *\n * @private\n * @param {...String|KeywordsHash} keywords - Space-delimited string or previous result of _hash\n * @return {KeywordsHash} - Object with keywords in keys and true in values\n */\nfunction _hash() {\n var set = Array.prototype.map.call(arguments, function(v) {\n return typeof v === 'string' ? v : Object.keys(v).join(' ');\n }).join(' ');\n\n return set.split(/\\s+/)\n .reduce(function(res, keyword) {\n res[keyword] = true;\n return res;\n }, {});\n}\n","exports = module.exports = SemVer\n\nvar debug\n/* istanbul ignore next */\nif (typeof process === 'object' &&\n process.env &&\n process.env.NODE_DEBUG &&\n /\\bsemver\\b/i.test(process.env.NODE_DEBUG)) {\n debug = function () {\n var args = Array.prototype.slice.call(arguments, 0)\n args.unshift('SEMVER')\n console.log.apply(console, args)\n }\n} else {\n debug = function () {}\n}\n\n// Note: this is the semver.org version of the spec that it implements\n// Not necessarily the package version of this code.\nexports.SEMVER_SPEC_VERSION = '2.0.0'\n\nvar MAX_LENGTH = 256\nvar MAX_SAFE_INTEGER = Number.MAX_SAFE_INTEGER ||\n /* istanbul ignore next */ 9007199254740991\n\n// Max safe segment length for coercion.\nvar MAX_SAFE_COMPONENT_LENGTH = 16\n\n// The actual regexps go on exports.re\nvar re = exports.re = []\nvar src = exports.src = []\nvar t = exports.tokens = {}\nvar R = 0\n\nfunction tok (n) {\n t[n] = R++\n}\n\n// The following Regular Expressions can be used for tokenizing,\n// validating, and parsing SemVer version strings.\n\n// ## Numeric Identifier\n// A single `0`, or a non-zero digit followed by zero or more digits.\n\ntok('NUMERICIDENTIFIER')\nsrc[t.NUMERICIDENTIFIER] = '0|[1-9]\\\\d*'\ntok('NUMERICIDENTIFIERLOOSE')\nsrc[t.NUMERICIDENTIFIERLOOSE] = '[0-9]+'\n\n// ## Non-numeric Identifier\n// Zero or more digits, followed by a letter or hyphen, and then zero or\n// more letters, digits, or hyphens.\n\ntok('NONNUMERICIDENTIFIER')\nsrc[t.NONNUMERICIDENTIFIER] = '\\\\d*[a-zA-Z-][a-zA-Z0-9-]*'\n\n// ## Main Version\n// Three dot-separated numeric identifiers.\n\ntok('MAINVERSION')\nsrc[t.MAINVERSION] = '(' + src[t.NUMERICIDENTIFIER] + ')\\\\.' +\n '(' + src[t.NUMERICIDENTIFIER] + ')\\\\.' +\n '(' + src[t.NUMERICIDENTIFIER] + ')'\n\ntok('MAINVERSIONLOOSE')\nsrc[t.MAINVERSIONLOOSE] = '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')\\\\.' +\n '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')\\\\.' +\n '(' + src[t.NUMERICIDENTIFIERLOOSE] + ')'\n\n// ## Pre-release Version Identifier\n// A numeric identifier, or a non-numeric identifier.\n\ntok('PRERELEASEIDENTIFIER')\nsrc[t.PRERELEASEIDENTIFIER] = '(?:' + src[t.NUMERICIDENTIFIER] +\n '|' + src[t.NONNUMERICIDENTIFIER] + ')'\n\ntok('PRERELEASEIDENTIFIERLOOSE')\nsrc[t.PRERELEASEIDENTIFIERLOOSE] = '(?:' + src[t.NUMERICIDENTIFIERLOOSE] +\n '|' + src[t.NONNUMERICIDENTIFIER] + ')'\n\n// ## Pre-release Version\n// Hyphen, followed by one or more dot-separated pre-release version\n// identifiers.\n\ntok('PRERELEASE')\nsrc[t.PRERELEASE] = '(?:-(' + src[t.PRERELEASEIDENTIFIER] +\n '(?:\\\\.' + src[t.PRERELEASEIDENTIFIER] + ')*))'\n\ntok('PRERELEASELOOSE')\nsrc[t.PRERELEASELOOSE] = '(?:-?(' + src[t.PRERELEASEIDENTIFIERLOOSE] +\n '(?:\\\\.' + src[t.PRERELEASEIDENTIFIERLOOSE] + ')*))'\n\n// ## Build Metadata Identifier\n// Any combination of digits, letters, or hyphens.\n\ntok('BUILDIDENTIFIER')\nsrc[t.BUILDIDENTIFIER] = '[0-9A-Za-z-]+'\n\n// ## Build Metadata\n// Plus sign, followed by one or more period-separated build metadata\n// identifiers.\n\ntok('BUILD')\nsrc[t.BUILD] = '(?:\\\\+(' + src[t.BUILDIDENTIFIER] +\n '(?:\\\\.' + src[t.BUILDIDENTIFIER] + ')*))'\n\n// ## Full Version String\n// A main version, followed optionally by a pre-release version and\n// build metadata.\n\n// Note that the only major, minor, patch, and pre-release sections of\n// the version string are capturing groups. The build metadata is not a\n// capturing group, because it should not ever be used in version\n// comparison.\n\ntok('FULL')\ntok('FULLPLAIN')\nsrc[t.FULLPLAIN] = 'v?' + src[t.MAINVERSION] +\n src[t.PRERELEASE] + '?' +\n src[t.BUILD] + '?'\n\nsrc[t.FULL] = '^' + src[t.FULLPLAIN] + '$'\n\n// like full, but allows v1.2.3 and =1.2.3, which people do sometimes.\n// also, 1.0.0alpha1 (prerelease without the hyphen) which is pretty\n// common in the npm registry.\ntok('LOOSEPLAIN')\nsrc[t.LOOSEPLAIN] = '[v=\\\\s]*' + src[t.MAINVERSIONLOOSE] +\n src[t.PRERELEASELOOSE] + '?' +\n src[t.BUILD] + '?'\n\ntok('LOOSE')\nsrc[t.LOOSE] = '^' + src[t.LOOSEPLAIN] + '$'\n\ntok('GTLT')\nsrc[t.GTLT] = '((?:<|>)?=?)'\n\n// Something like \"2.*\" or \"1.2.x\".\n// Note that \"x.x\" is a valid xRange identifer, meaning \"any version\"\n// Only the first item is strictly required.\ntok('XRANGEIDENTIFIERLOOSE')\nsrc[t.XRANGEIDENTIFIERLOOSE] = src[t.NUMERICIDENTIFIERLOOSE] + '|x|X|\\\\*'\ntok('XRANGEIDENTIFIER')\nsrc[t.XRANGEIDENTIFIER] = src[t.NUMERICIDENTIFIER] + '|x|X|\\\\*'\n\ntok('XRANGEPLAIN')\nsrc[t.XRANGEPLAIN] = '[v=\\\\s]*(' + src[t.XRANGEIDENTIFIER] + ')' +\n '(?:\\\\.(' + src[t.XRANGEIDENTIFIER] + ')' +\n '(?:\\\\.(' + src[t.XRANGEIDENTIFIER] + ')' +\n '(?:' + src[t.PRERELEASE] + ')?' +\n src[t.BUILD] + '?' +\n ')?)?'\n\ntok('XRANGEPLAINLOOSE')\nsrc[t.XRANGEPLAINLOOSE] = '[v=\\\\s]*(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' +\n '(?:\\\\.(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' +\n '(?:\\\\.(' + src[t.XRANGEIDENTIFIERLOOSE] + ')' +\n '(?:' + src[t.PRERELEASELOOSE] + ')?' +\n src[t.BUILD] + '?' +\n ')?)?'\n\ntok('XRANGE')\nsrc[t.XRANGE] = '^' + src[t.GTLT] + '\\\\s*' + src[t.XRANGEPLAIN] + '$'\ntok('XRANGELOOSE')\nsrc[t.XRANGELOOSE] = '^' + src[t.GTLT] + '\\\\s*' + src[t.XRANGEPLAINLOOSE] + '$'\n\n// Coercion.\n// Extract anything that could conceivably be a part of a valid semver\ntok('COERCE')\nsrc[t.COERCE] = '(^|[^\\\\d])' +\n '(\\\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '})' +\n '(?:\\\\.(\\\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +\n '(?:\\\\.(\\\\d{1,' + MAX_SAFE_COMPONENT_LENGTH + '}))?' +\n '(?:$|[^\\\\d])'\ntok('COERCERTL')\nre[t.COERCERTL] = new RegExp(src[t.COERCE], 'g')\n\n// Tilde ranges.\n// Meaning is \"reasonably at or greater than\"\ntok('LONETILDE')\nsrc[t.LONETILDE] = '(?:~>?)'\n\ntok('TILDETRIM')\nsrc[t.TILDETRIM] = '(\\\\s*)' + src[t.LONETILDE] + '\\\\s+'\nre[t.TILDETRIM] = new RegExp(src[t.TILDETRIM], 'g')\nvar tildeTrimReplace = '$1~'\n\ntok('TILDE')\nsrc[t.TILDE] = '^' + src[t.LONETILDE] + src[t.XRANGEPLAIN] + '$'\ntok('TILDELOOSE')\nsrc[t.TILDELOOSE] = '^' + src[t.LONETILDE] + src[t.XRANGEPLAINLOOSE] + '$'\n\n// Caret ranges.\n// Meaning is \"at least and backwards compatible with\"\ntok('LONECARET')\nsrc[t.LONECARET] = '(?:\\\\^)'\n\ntok('CARETTRIM')\nsrc[t.CARETTRIM] = '(\\\\s*)' + src[t.LONECARET] + '\\\\s+'\nre[t.CARETTRIM] = new RegExp(src[t.CARETTRIM], 'g')\nvar caretTrimReplace = '$1^'\n\ntok('CARET')\nsrc[t.CARET] = '^' + src[t.LONECARET] + src[t.XRANGEPLAIN] + '$'\ntok('CARETLOOSE')\nsrc[t.CARETLOOSE] = '^' + src[t.LONECARET] + src[t.XRANGEPLAINLOOSE] + '$'\n\n// A simple gt/lt/eq thing, or just \"\" to indicate \"any version\"\ntok('COMPARATORLOOSE')\nsrc[t.COMPARATORLOOSE] = '^' + src[t.GTLT] + '\\\\s*(' + src[t.LOOSEPLAIN] + ')$|^$'\ntok('COMPARATOR')\nsrc[t.COMPARATOR] = '^' + src[t.GTLT] + '\\\\s*(' + src[t.FULLPLAIN] + ')$|^$'\n\n// An expression to strip any whitespace between the gtlt and the thing\n// it modifies, so that `> 1.2.3` ==> `>1.2.3`\ntok('COMPARATORTRIM')\nsrc[t.COMPARATORTRIM] = '(\\\\s*)' + src[t.GTLT] +\n '\\\\s*(' + src[t.LOOSEPLAIN] + '|' + src[t.XRANGEPLAIN] + ')'\n\n// this one has to use the /g flag\nre[t.COMPARATORTRIM] = new RegExp(src[t.COMPARATORTRIM], 'g')\nvar comparatorTrimReplace = '$1$2$3'\n\n// Something like `1.2.3 - 1.2.4`\n// Note that these all use the loose form, because they'll be\n// checked against either the strict or loose comparator form\n// later.\ntok('HYPHENRANGE')\nsrc[t.HYPHENRANGE] = '^\\\\s*(' + src[t.XRANGEPLAIN] + ')' +\n '\\\\s+-\\\\s+' +\n '(' + src[t.XRANGEPLAIN] + ')' +\n '\\\\s*$'\n\ntok('HYPHENRANGELOOSE')\nsrc[t.HYPHENRANGELOOSE] = '^\\\\s*(' + src[t.XRANGEPLAINLOOSE] + ')' +\n '\\\\s+-\\\\s+' +\n '(' + src[t.XRANGEPLAINLOOSE] + ')' +\n '\\\\s*$'\n\n// Star ranges basically just allow anything at all.\ntok('STAR')\nsrc[t.STAR] = '(<|>)?=?\\\\s*\\\\*'\n\n// Compile to actual regexp objects.\n// All are flag-free, unless they were created above with a flag.\nfor (var i = 0; i < R; i++) {\n debug(i, src[i])\n if (!re[i]) {\n re[i] = new RegExp(src[i])\n }\n}\n\nexports.parse = parse\nfunction parse (version, options) {\n if (!options || typeof options !== 'object') {\n options = {\n loose: !!options,\n includePrerelease: false\n }\n }\n\n if (version instanceof SemVer) {\n return version\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n if (version.length > MAX_LENGTH) {\n return null\n }\n\n var r = options.loose ? re[t.LOOSE] : re[t.FULL]\n if (!r.test(version)) {\n return null\n }\n\n try {\n return new SemVer(version, options)\n } catch (er) {\n return null\n }\n}\n\nexports.valid = valid\nfunction valid (version, options) {\n var v = parse(version, options)\n return v ? v.version : null\n}\n\nexports.clean = clean\nfunction clean (version, options) {\n var s = parse(version.trim().replace(/^[=v]+/, ''), options)\n return s ? s.version : null\n}\n\nexports.SemVer = SemVer\n\nfunction SemVer (version, options) {\n if (!options || typeof options !== 'object') {\n options = {\n loose: !!options,\n includePrerelease: false\n }\n }\n if (version instanceof SemVer) {\n if (version.loose === options.loose) {\n return version\n } else {\n version = version.version\n }\n } else if (typeof version !== 'string') {\n throw new TypeError('Invalid Version: ' + version)\n }\n\n if (version.length > MAX_LENGTH) {\n throw new TypeError('version is longer than ' + MAX_LENGTH + ' characters')\n }\n\n if (!(this instanceof SemVer)) {\n return new SemVer(version, options)\n }\n\n debug('SemVer', version, options)\n this.options = options\n this.loose = !!options.loose\n\n var m = version.trim().match(options.loose ? re[t.LOOSE] : re[t.FULL])\n\n if (!m) {\n throw new TypeError('Invalid Version: ' + version)\n }\n\n this.raw = version\n\n // these are actually numbers\n this.major = +m[1]\n this.minor = +m[2]\n this.patch = +m[3]\n\n if (this.major > MAX_SAFE_INTEGER || this.major < 0) {\n throw new TypeError('Invalid major version')\n }\n\n if (this.minor > MAX_SAFE_INTEGER || this.minor < 0) {\n throw new TypeError('Invalid minor version')\n }\n\n if (this.patch > MAX_SAFE_INTEGER || this.patch < 0) {\n throw new TypeError('Invalid patch version')\n }\n\n // numberify any prerelease numeric ids\n if (!m[4]) {\n this.prerelease = []\n } else {\n this.prerelease = m[4].split('.').map(function (id) {\n if (/^[0-9]+$/.test(id)) {\n var num = +id\n if (num >= 0 && num < MAX_SAFE_INTEGER) {\n return num\n }\n }\n return id\n })\n }\n\n this.build = m[5] ? m[5].split('.') : []\n this.format()\n}\n\nSemVer.prototype.format = function () {\n this.version = this.major + '.' + this.minor + '.' + this.patch\n if (this.prerelease.length) {\n this.version += '-' + this.prerelease.join('.')\n }\n return this.version\n}\n\nSemVer.prototype.toString = function () {\n return this.version\n}\n\nSemVer.prototype.compare = function (other) {\n debug('SemVer.compare', this.version, this.options, other)\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n return this.compareMain(other) || this.comparePre(other)\n}\n\nSemVer.prototype.compareMain = function (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n return compareIdentifiers(this.major, other.major) ||\n compareIdentifiers(this.minor, other.minor) ||\n compareIdentifiers(this.patch, other.patch)\n}\n\nSemVer.prototype.comparePre = function (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n // NOT having a prerelease is > having one\n if (this.prerelease.length && !other.prerelease.length) {\n return -1\n } else if (!this.prerelease.length && other.prerelease.length) {\n return 1\n } else if (!this.prerelease.length && !other.prerelease.length) {\n return 0\n }\n\n var i = 0\n do {\n var a = this.prerelease[i]\n var b = other.prerelease[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n}\n\nSemVer.prototype.compareBuild = function (other) {\n if (!(other instanceof SemVer)) {\n other = new SemVer(other, this.options)\n }\n\n var i = 0\n do {\n var a = this.build[i]\n var b = other.build[i]\n debug('prerelease compare', i, a, b)\n if (a === undefined && b === undefined) {\n return 0\n } else if (b === undefined) {\n return 1\n } else if (a === undefined) {\n return -1\n } else if (a === b) {\n continue\n } else {\n return compareIdentifiers(a, b)\n }\n } while (++i)\n}\n\n// preminor will bump the version up to the next minor release, and immediately\n// down to pre-release. premajor and prepatch work the same way.\nSemVer.prototype.inc = function (release, identifier) {\n switch (release) {\n case 'premajor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor = 0\n this.major++\n this.inc('pre', identifier)\n break\n case 'preminor':\n this.prerelease.length = 0\n this.patch = 0\n this.minor++\n this.inc('pre', identifier)\n break\n case 'prepatch':\n // If this is already a prerelease, it will bump to the next version\n // drop any prereleases that might already exist, since they are not\n // relevant at this point.\n this.prerelease.length = 0\n this.inc('patch', identifier)\n this.inc('pre', identifier)\n break\n // If the input is a non-prerelease version, this acts the same as\n // prepatch.\n case 'prerelease':\n if (this.prerelease.length === 0) {\n this.inc('patch', identifier)\n }\n this.inc('pre', identifier)\n break\n\n case 'major':\n // If this is a pre-major version, bump up to the same major version.\n // Otherwise increment major.\n // 1.0.0-5 bumps to 1.0.0\n // 1.1.0 bumps to 2.0.0\n if (this.minor !== 0 ||\n this.patch !== 0 ||\n this.prerelease.length === 0) {\n this.major++\n }\n this.minor = 0\n this.patch = 0\n this.prerelease = []\n break\n case 'minor':\n // If this is a pre-minor version, bump up to the same minor version.\n // Otherwise increment minor.\n // 1.2.0-5 bumps to 1.2.0\n // 1.2.1 bumps to 1.3.0\n if (this.patch !== 0 || this.prerelease.length === 0) {\n this.minor++\n }\n this.patch = 0\n this.prerelease = []\n break\n case 'patch':\n // If this is not a pre-release version, it will increment the patch.\n // If it is a pre-release it will bump up to the same patch version.\n // 1.2.0-5 patches to 1.2.0\n // 1.2.0 patches to 1.2.1\n if (this.prerelease.length === 0) {\n this.patch++\n }\n this.prerelease = []\n break\n // This probably shouldn't be used publicly.\n // 1.0.0 \"pre\" would become 1.0.0-0 which is the wrong direction.\n case 'pre':\n if (this.prerelease.length === 0) {\n this.prerelease = [0]\n } else {\n var i = this.prerelease.length\n while (--i >= 0) {\n if (typeof this.prerelease[i] === 'number') {\n this.prerelease[i]++\n i = -2\n }\n }\n if (i === -1) {\n // didn't increment anything\n this.prerelease.push(0)\n }\n }\n if (identifier) {\n // 1.2.0-beta.1 bumps to 1.2.0-beta.2,\n // 1.2.0-beta.fooblz or 1.2.0-beta bumps to 1.2.0-beta.0\n if (this.prerelease[0] === identifier) {\n if (isNaN(this.prerelease[1])) {\n this.prerelease = [identifier, 0]\n }\n } else {\n this.prerelease = [identifier, 0]\n }\n }\n break\n\n default:\n throw new Error('invalid increment argument: ' + release)\n }\n this.format()\n this.raw = this.version\n return this\n}\n\nexports.inc = inc\nfunction inc (version, release, loose, identifier) {\n if (typeof (loose) === 'string') {\n identifier = loose\n loose = undefined\n }\n\n try {\n return new SemVer(version, loose).inc(release, identifier).version\n } catch (er) {\n return null\n }\n}\n\nexports.diff = diff\nfunction diff (version1, version2) {\n if (eq(version1, version2)) {\n return null\n } else {\n var v1 = parse(version1)\n var v2 = parse(version2)\n var prefix = ''\n if (v1.prerelease.length || v2.prerelease.length) {\n prefix = 'pre'\n var defaultResult = 'prerelease'\n }\n for (var key in v1) {\n if (key === 'major' || key === 'minor' || key === 'patch') {\n if (v1[key] !== v2[key]) {\n return prefix + key\n }\n }\n }\n return defaultResult // may be undefined\n }\n}\n\nexports.compareIdentifiers = compareIdentifiers\n\nvar numeric = /^[0-9]+$/\nfunction compareIdentifiers (a, b) {\n var anum = numeric.test(a)\n var bnum = numeric.test(b)\n\n if (anum && bnum) {\n a = +a\n b = +b\n }\n\n return a === b ? 0\n : (anum && !bnum) ? -1\n : (bnum && !anum) ? 1\n : a < b ? -1\n : 1\n}\n\nexports.rcompareIdentifiers = rcompareIdentifiers\nfunction rcompareIdentifiers (a, b) {\n return compareIdentifiers(b, a)\n}\n\nexports.major = major\nfunction major (a, loose) {\n return new SemVer(a, loose).major\n}\n\nexports.minor = minor\nfunction minor (a, loose) {\n return new SemVer(a, loose).minor\n}\n\nexports.patch = patch\nfunction patch (a, loose) {\n return new SemVer(a, loose).patch\n}\n\nexports.compare = compare\nfunction compare (a, b, loose) {\n return new SemVer(a, loose).compare(new SemVer(b, loose))\n}\n\nexports.compareLoose = compareLoose\nfunction compareLoose (a, b) {\n return compare(a, b, true)\n}\n\nexports.compareBuild = compareBuild\nfunction compareBuild (a, b, loose) {\n var versionA = new SemVer(a, loose)\n var versionB = new SemVer(b, loose)\n return versionA.compare(versionB) || versionA.compareBuild(versionB)\n}\n\nexports.rcompare = rcompare\nfunction rcompare (a, b, loose) {\n return compare(b, a, loose)\n}\n\nexports.sort = sort\nfunction sort (list, loose) {\n return list.sort(function (a, b) {\n return exports.compareBuild(a, b, loose)\n })\n}\n\nexports.rsort = rsort\nfunction rsort (list, loose) {\n return list.sort(function (a, b) {\n return exports.compareBuild(b, a, loose)\n })\n}\n\nexports.gt = gt\nfunction gt (a, b, loose) {\n return compare(a, b, loose) > 0\n}\n\nexports.lt = lt\nfunction lt (a, b, loose) {\n return compare(a, b, loose) < 0\n}\n\nexports.eq = eq\nfunction eq (a, b, loose) {\n return compare(a, b, loose) === 0\n}\n\nexports.neq = neq\nfunction neq (a, b, loose) {\n return compare(a, b, loose) !== 0\n}\n\nexports.gte = gte\nfunction gte (a, b, loose) {\n return compare(a, b, loose) >= 0\n}\n\nexports.lte = lte\nfunction lte (a, b, loose) {\n return compare(a, b, loose) <= 0\n}\n\nexports.cmp = cmp\nfunction cmp (a, op, b, loose) {\n switch (op) {\n case '===':\n if (typeof a === 'object')\n a = a.version\n if (typeof b === 'object')\n b = b.version\n return a === b\n\n case '!==':\n if (typeof a === 'object')\n a = a.version\n if (typeof b === 'object')\n b = b.version\n return a !== b\n\n case '':\n case '=':\n case '==':\n return eq(a, b, loose)\n\n case '!=':\n return neq(a, b, loose)\n\n case '>':\n return gt(a, b, loose)\n\n case '>=':\n return gte(a, b, loose)\n\n case '<':\n return lt(a, b, loose)\n\n case '<=':\n return lte(a, b, loose)\n\n default:\n throw new TypeError('Invalid operator: ' + op)\n }\n}\n\nexports.Comparator = Comparator\nfunction Comparator (comp, options) {\n if (!options || typeof options !== 'object') {\n options = {\n loose: !!options,\n includePrerelease: false\n }\n }\n\n if (comp instanceof Comparator) {\n if (comp.loose === !!options.loose) {\n return comp\n } else {\n comp = comp.value\n }\n }\n\n if (!(this instanceof Comparator)) {\n return new Comparator(comp, options)\n }\n\n debug('comparator', comp, options)\n this.options = options\n this.loose = !!options.loose\n this.parse(comp)\n\n if (this.semver === ANY) {\n this.value = ''\n } else {\n this.value = this.operator + this.semver.version\n }\n\n debug('comp', this)\n}\n\nvar ANY = {}\nComparator.prototype.parse = function (comp) {\n var r = this.options.loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]\n var m = comp.match(r)\n\n if (!m) {\n throw new TypeError('Invalid comparator: ' + comp)\n }\n\n this.operator = m[1] !== undefined ? m[1] : ''\n if (this.operator === '=') {\n this.operator = ''\n }\n\n // if it literally is just '>' or '' then allow anything.\n if (!m[2]) {\n this.semver = ANY\n } else {\n this.semver = new SemVer(m[2], this.options.loose)\n }\n}\n\nComparator.prototype.toString = function () {\n return this.value\n}\n\nComparator.prototype.test = function (version) {\n debug('Comparator.test', version, this.options.loose)\n\n if (this.semver === ANY || version === ANY) {\n return true\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n return cmp(version, this.operator, this.semver, this.options)\n}\n\nComparator.prototype.intersects = function (comp, options) {\n if (!(comp instanceof Comparator)) {\n throw new TypeError('a Comparator is required')\n }\n\n if (!options || typeof options !== 'object') {\n options = {\n loose: !!options,\n includePrerelease: false\n }\n }\n\n var rangeTmp\n\n if (this.operator === '') {\n if (this.value === '') {\n return true\n }\n rangeTmp = new Range(comp.value, options)\n return satisfies(this.value, rangeTmp, options)\n } else if (comp.operator === '') {\n if (comp.value === '') {\n return true\n }\n rangeTmp = new Range(this.value, options)\n return satisfies(comp.semver, rangeTmp, options)\n }\n\n var sameDirectionIncreasing =\n (this.operator === '>=' || this.operator === '>') &&\n (comp.operator === '>=' || comp.operator === '>')\n var sameDirectionDecreasing =\n (this.operator === '<=' || this.operator === '<') &&\n (comp.operator === '<=' || comp.operator === '<')\n var sameSemVer = this.semver.version === comp.semver.version\n var differentDirectionsInclusive =\n (this.operator === '>=' || this.operator === '<=') &&\n (comp.operator === '>=' || comp.operator === '<=')\n var oppositeDirectionsLessThan =\n cmp(this.semver, '<', comp.semver, options) &&\n ((this.operator === '>=' || this.operator === '>') &&\n (comp.operator === '<=' || comp.operator === '<'))\n var oppositeDirectionsGreaterThan =\n cmp(this.semver, '>', comp.semver, options) &&\n ((this.operator === '<=' || this.operator === '<') &&\n (comp.operator === '>=' || comp.operator === '>'))\n\n return sameDirectionIncreasing || sameDirectionDecreasing ||\n (sameSemVer && differentDirectionsInclusive) ||\n oppositeDirectionsLessThan || oppositeDirectionsGreaterThan\n}\n\nexports.Range = Range\nfunction Range (range, options) {\n if (!options || typeof options !== 'object') {\n options = {\n loose: !!options,\n includePrerelease: false\n }\n }\n\n if (range instanceof Range) {\n if (range.loose === !!options.loose &&\n range.includePrerelease === !!options.includePrerelease) {\n return range\n } else {\n return new Range(range.raw, options)\n }\n }\n\n if (range instanceof Comparator) {\n return new Range(range.value, options)\n }\n\n if (!(this instanceof Range)) {\n return new Range(range, options)\n }\n\n this.options = options\n this.loose = !!options.loose\n this.includePrerelease = !!options.includePrerelease\n\n // First, split based on boolean or ||\n this.raw = range\n this.set = range.split(/\\s*\\|\\|\\s*/).map(function (range) {\n return this.parseRange(range.trim())\n }, this).filter(function (c) {\n // throw out any that are not relevant for whatever reason\n return c.length\n })\n\n if (!this.set.length) {\n throw new TypeError('Invalid SemVer Range: ' + range)\n }\n\n this.format()\n}\n\nRange.prototype.format = function () {\n this.range = this.set.map(function (comps) {\n return comps.join(' ').trim()\n }).join('||').trim()\n return this.range\n}\n\nRange.prototype.toString = function () {\n return this.range\n}\n\nRange.prototype.parseRange = function (range) {\n var loose = this.options.loose\n range = range.trim()\n // `1.2.3 - 1.2.4` => `>=1.2.3 <=1.2.4`\n var hr = loose ? re[t.HYPHENRANGELOOSE] : re[t.HYPHENRANGE]\n range = range.replace(hr, hyphenReplace)\n debug('hyphen replace', range)\n // `> 1.2.3 < 1.2.5` => `>1.2.3 <1.2.5`\n range = range.replace(re[t.COMPARATORTRIM], comparatorTrimReplace)\n debug('comparator trim', range, re[t.COMPARATORTRIM])\n\n // `~ 1.2.3` => `~1.2.3`\n range = range.replace(re[t.TILDETRIM], tildeTrimReplace)\n\n // `^ 1.2.3` => `^1.2.3`\n range = range.replace(re[t.CARETTRIM], caretTrimReplace)\n\n // normalize spaces\n range = range.split(/\\s+/).join(' ')\n\n // At this point, the range is completely trimmed and\n // ready to be split into comparators.\n\n var compRe = loose ? re[t.COMPARATORLOOSE] : re[t.COMPARATOR]\n var set = range.split(' ').map(function (comp) {\n return parseComparator(comp, this.options)\n }, this).join(' ').split(/\\s+/)\n if (this.options.loose) {\n // in loose mode, throw out any that are not valid comparators\n set = set.filter(function (comp) {\n return !!comp.match(compRe)\n })\n }\n set = set.map(function (comp) {\n return new Comparator(comp, this.options)\n }, this)\n\n return set\n}\n\nRange.prototype.intersects = function (range, options) {\n if (!(range instanceof Range)) {\n throw new TypeError('a Range is required')\n }\n\n return this.set.some(function (thisComparators) {\n return (\n isSatisfiable(thisComparators, options) &&\n range.set.some(function (rangeComparators) {\n return (\n isSatisfiable(rangeComparators, options) &&\n thisComparators.every(function (thisComparator) {\n return rangeComparators.every(function (rangeComparator) {\n return thisComparator.intersects(rangeComparator, options)\n })\n })\n )\n })\n )\n })\n}\n\n// take a set of comparators and determine whether there\n// exists a version which can satisfy it\nfunction isSatisfiable (comparators, options) {\n var result = true\n var remainingComparators = comparators.slice()\n var testComparator = remainingComparators.pop()\n\n while (result && remainingComparators.length) {\n result = remainingComparators.every(function (otherComparator) {\n return testComparator.intersects(otherComparator, options)\n })\n\n testComparator = remainingComparators.pop()\n }\n\n return result\n}\n\n// Mostly just for testing and legacy API reasons\nexports.toComparators = toComparators\nfunction toComparators (range, options) {\n return new Range(range, options).set.map(function (comp) {\n return comp.map(function (c) {\n return c.value\n }).join(' ').trim().split(' ')\n })\n}\n\n// comprised of xranges, tildes, stars, and gtlt's at this point.\n// already replaced the hyphen ranges\n// turn into a set of JUST comparators.\nfunction parseComparator (comp, options) {\n debug('comp', comp, options)\n comp = replaceCarets(comp, options)\n debug('caret', comp)\n comp = replaceTildes(comp, options)\n debug('tildes', comp)\n comp = replaceXRanges(comp, options)\n debug('xrange', comp)\n comp = replaceStars(comp, options)\n debug('stars', comp)\n return comp\n}\n\nfunction isX (id) {\n return !id || id.toLowerCase() === 'x' || id === '*'\n}\n\n// ~, ~> --> * (any, kinda silly)\n// ~2, ~2.x, ~2.x.x, ~>2, ~>2.x ~>2.x.x --> >=2.0.0 <3.0.0\n// ~2.0, ~2.0.x, ~>2.0, ~>2.0.x --> >=2.0.0 <2.1.0\n// ~1.2, ~1.2.x, ~>1.2, ~>1.2.x --> >=1.2.0 <1.3.0\n// ~1.2.3, ~>1.2.3 --> >=1.2.3 <1.3.0\n// ~1.2.0, ~>1.2.0 --> >=1.2.0 <1.3.0\nfunction replaceTildes (comp, options) {\n return comp.trim().split(/\\s+/).map(function (comp) {\n return replaceTilde(comp, options)\n }).join(' ')\n}\n\nfunction replaceTilde (comp, options) {\n var r = options.loose ? re[t.TILDELOOSE] : re[t.TILDE]\n return comp.replace(r, function (_, M, m, p, pr) {\n debug('tilde', comp, _, M, m, p, pr)\n var ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'\n } else if (isX(p)) {\n // ~1.2 == >=1.2.0 <1.3.0\n ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'\n } else if (pr) {\n debug('replaceTilde pr', pr)\n ret = '>=' + M + '.' + m + '.' + p + '-' + pr +\n ' <' + M + '.' + (+m + 1) + '.0'\n } else {\n // ~1.2.3 == >=1.2.3 <1.3.0\n ret = '>=' + M + '.' + m + '.' + p +\n ' <' + M + '.' + (+m + 1) + '.0'\n }\n\n debug('tilde return', ret)\n return ret\n })\n}\n\n// ^ --> * (any, kinda silly)\n// ^2, ^2.x, ^2.x.x --> >=2.0.0 <3.0.0\n// ^2.0, ^2.0.x --> >=2.0.0 <3.0.0\n// ^1.2, ^1.2.x --> >=1.2.0 <2.0.0\n// ^1.2.3 --> >=1.2.3 <2.0.0\n// ^1.2.0 --> >=1.2.0 <2.0.0\nfunction replaceCarets (comp, options) {\n return comp.trim().split(/\\s+/).map(function (comp) {\n return replaceCaret(comp, options)\n }).join(' ')\n}\n\nfunction replaceCaret (comp, options) {\n debug('caret', comp, options)\n var r = options.loose ? re[t.CARETLOOSE] : re[t.CARET]\n return comp.replace(r, function (_, M, m, p, pr) {\n debug('caret', comp, _, M, m, p, pr)\n var ret\n\n if (isX(M)) {\n ret = ''\n } else if (isX(m)) {\n ret = '>=' + M + '.0.0 <' + (+M + 1) + '.0.0'\n } else if (isX(p)) {\n if (M === '0') {\n ret = '>=' + M + '.' + m + '.0 <' + M + '.' + (+m + 1) + '.0'\n } else {\n ret = '>=' + M + '.' + m + '.0 <' + (+M + 1) + '.0.0'\n }\n } else if (pr) {\n debug('replaceCaret pr', pr)\n if (M === '0') {\n if (m === '0') {\n ret = '>=' + M + '.' + m + '.' + p + '-' + pr +\n ' <' + M + '.' + m + '.' + (+p + 1)\n } else {\n ret = '>=' + M + '.' + m + '.' + p + '-' + pr +\n ' <' + M + '.' + (+m + 1) + '.0'\n }\n } else {\n ret = '>=' + M + '.' + m + '.' + p + '-' + pr +\n ' <' + (+M + 1) + '.0.0'\n }\n } else {\n debug('no pr')\n if (M === '0') {\n if (m === '0') {\n ret = '>=' + M + '.' + m + '.' + p +\n ' <' + M + '.' + m + '.' + (+p + 1)\n } else {\n ret = '>=' + M + '.' + m + '.' + p +\n ' <' + M + '.' + (+m + 1) + '.0'\n }\n } else {\n ret = '>=' + M + '.' + m + '.' + p +\n ' <' + (+M + 1) + '.0.0'\n }\n }\n\n debug('caret return', ret)\n return ret\n })\n}\n\nfunction replaceXRanges (comp, options) {\n debug('replaceXRanges', comp, options)\n return comp.split(/\\s+/).map(function (comp) {\n return replaceXRange(comp, options)\n }).join(' ')\n}\n\nfunction replaceXRange (comp, options) {\n comp = comp.trim()\n var r = options.loose ? re[t.XRANGELOOSE] : re[t.XRANGE]\n return comp.replace(r, function (ret, gtlt, M, m, p, pr) {\n debug('xRange', comp, ret, gtlt, M, m, p, pr)\n var xM = isX(M)\n var xm = xM || isX(m)\n var xp = xm || isX(p)\n var anyX = xp\n\n if (gtlt === '=' && anyX) {\n gtlt = ''\n }\n\n // if we're including prereleases in the match, then we need\n // to fix this to -0, the lowest possible prerelease value\n pr = options.includePrerelease ? '-0' : ''\n\n if (xM) {\n if (gtlt === '>' || gtlt === '<') {\n // nothing is allowed\n ret = '<0.0.0-0'\n } else {\n // nothing is forbidden\n ret = '*'\n }\n } else if (gtlt && anyX) {\n // we know patch is an x, because we have any x at all.\n // replace X with 0\n if (xm) {\n m = 0\n }\n p = 0\n\n if (gtlt === '>') {\n // >1 => >=2.0.0\n // >1.2 => >=1.3.0\n // >1.2.3 => >= 1.2.4\n gtlt = '>='\n if (xm) {\n M = +M + 1\n m = 0\n p = 0\n } else {\n m = +m + 1\n p = 0\n }\n } else if (gtlt === '<=') {\n // <=0.7.x is actually <0.8.0, since any 0.7.x should\n // pass. Similarly, <=7.x is actually <8.0.0, etc.\n gtlt = '<'\n if (xm) {\n M = +M + 1\n } else {\n m = +m + 1\n }\n }\n\n ret = gtlt + M + '.' + m + '.' + p + pr\n } else if (xm) {\n ret = '>=' + M + '.0.0' + pr + ' <' + (+M + 1) + '.0.0' + pr\n } else if (xp) {\n ret = '>=' + M + '.' + m + '.0' + pr +\n ' <' + M + '.' + (+m + 1) + '.0' + pr\n }\n\n debug('xRange return', ret)\n\n return ret\n })\n}\n\n// Because * is AND-ed with everything else in the comparator,\n// and '' means \"any version\", just remove the *s entirely.\nfunction replaceStars (comp, options) {\n debug('replaceStars', comp, options)\n // Looseness is ignored here. star is always as loose as it gets!\n return comp.trim().replace(re[t.STAR], '')\n}\n\n// This function is passed to string.replace(re[t.HYPHENRANGE])\n// M, m, patch, prerelease, build\n// 1.2 - 3.4.5 => >=1.2.0 <=3.4.5\n// 1.2.3 - 3.4 => >=1.2.0 <3.5.0 Any 3.4.x will do\n// 1.2 - 3.4 => >=1.2.0 <3.5.0\nfunction hyphenReplace ($0,\n from, fM, fm, fp, fpr, fb,\n to, tM, tm, tp, tpr, tb) {\n if (isX(fM)) {\n from = ''\n } else if (isX(fm)) {\n from = '>=' + fM + '.0.0'\n } else if (isX(fp)) {\n from = '>=' + fM + '.' + fm + '.0'\n } else {\n from = '>=' + from\n }\n\n if (isX(tM)) {\n to = ''\n } else if (isX(tm)) {\n to = '<' + (+tM + 1) + '.0.0'\n } else if (isX(tp)) {\n to = '<' + tM + '.' + (+tm + 1) + '.0'\n } else if (tpr) {\n to = '<=' + tM + '.' + tm + '.' + tp + '-' + tpr\n } else {\n to = '<=' + to\n }\n\n return (from + ' ' + to).trim()\n}\n\n// if ANY of the sets match ALL of its comparators, then pass\nRange.prototype.test = function (version) {\n if (!version) {\n return false\n }\n\n if (typeof version === 'string') {\n try {\n version = new SemVer(version, this.options)\n } catch (er) {\n return false\n }\n }\n\n for (var i = 0; i < this.set.length; i++) {\n if (testSet(this.set[i], version, this.options)) {\n return true\n }\n }\n return false\n}\n\nfunction testSet (set, version, options) {\n for (var i = 0; i < set.length; i++) {\n if (!set[i].test(version)) {\n return false\n }\n }\n\n if (version.prerelease.length && !options.includePrerelease) {\n // Find the set of versions that are allowed to have prereleases\n // For example, ^1.2.3-pr.1 desugars to >=1.2.3-pr.1 <2.0.0\n // That should allow `1.2.3-pr.2` to pass.\n // However, `1.2.4-alpha.notready` should NOT be allowed,\n // even though it's within the range set by the comparators.\n for (i = 0; i < set.length; i++) {\n debug(set[i].semver)\n if (set[i].semver === ANY) {\n continue\n }\n\n if (set[i].semver.prerelease.length > 0) {\n var allowed = set[i].semver\n if (allowed.major === version.major &&\n allowed.minor === version.minor &&\n allowed.patch === version.patch) {\n return true\n }\n }\n }\n\n // Version has a -pre, but it's not one of the ones we like.\n return false\n }\n\n return true\n}\n\nexports.satisfies = satisfies\nfunction satisfies (version, range, options) {\n try {\n range = new Range(range, options)\n } catch (er) {\n return false\n }\n return range.test(version)\n}\n\nexports.maxSatisfying = maxSatisfying\nfunction maxSatisfying (versions, range, options) {\n var max = null\n var maxSV = null\n try {\n var rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach(function (v) {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!max || maxSV.compare(v) === -1) {\n // compare(max, v, true)\n max = v\n maxSV = new SemVer(max, options)\n }\n }\n })\n return max\n}\n\nexports.minSatisfying = minSatisfying\nfunction minSatisfying (versions, range, options) {\n var min = null\n var minSV = null\n try {\n var rangeObj = new Range(range, options)\n } catch (er) {\n return null\n }\n versions.forEach(function (v) {\n if (rangeObj.test(v)) {\n // satisfies(v, range, options)\n if (!min || minSV.compare(v) === 1) {\n // compare(min, v, true)\n min = v\n minSV = new SemVer(min, options)\n }\n }\n })\n return min\n}\n\nexports.minVersion = minVersion\nfunction minVersion (range, loose) {\n range = new Range(range, loose)\n\n var minver = new SemVer('0.0.0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = new SemVer('0.0.0-0')\n if (range.test(minver)) {\n return minver\n }\n\n minver = null\n for (var i = 0; i < range.set.length; ++i) {\n var comparators = range.set[i]\n\n comparators.forEach(function (comparator) {\n // Clone to avoid manipulating the comparator's semver object.\n var compver = new SemVer(comparator.semver.version)\n switch (comparator.operator) {\n case '>':\n if (compver.prerelease.length === 0) {\n compver.patch++\n } else {\n compver.prerelease.push(0)\n }\n compver.raw = compver.format()\n /* fallthrough */\n case '':\n case '>=':\n if (!minver || gt(minver, compver)) {\n minver = compver\n }\n break\n case '<':\n case '<=':\n /* Ignore maximum versions */\n break\n /* istanbul ignore next */\n default:\n throw new Error('Unexpected operation: ' + comparator.operator)\n }\n })\n }\n\n if (minver && range.test(minver)) {\n return minver\n }\n\n return null\n}\n\nexports.validRange = validRange\nfunction validRange (range, options) {\n try {\n // Return '*' instead of '' so that truthiness works.\n // This will throw if it's invalid anyway\n return new Range(range, options).range || '*'\n } catch (er) {\n return null\n }\n}\n\n// Determine if version is less than all the versions possible in the range\nexports.ltr = ltr\nfunction ltr (version, range, options) {\n return outside(version, range, '<', options)\n}\n\n// Determine if version is greater than all the versions possible in the range.\nexports.gtr = gtr\nfunction gtr (version, range, options) {\n return outside(version, range, '>', options)\n}\n\nexports.outside = outside\nfunction outside (version, range, hilo, options) {\n version = new SemVer(version, options)\n range = new Range(range, options)\n\n var gtfn, ltefn, ltfn, comp, ecomp\n switch (hilo) {\n case '>':\n gtfn = gt\n ltefn = lte\n ltfn = lt\n comp = '>'\n ecomp = '>='\n break\n case '<':\n gtfn = lt\n ltefn = gte\n ltfn = gt\n comp = '<'\n ecomp = '<='\n break\n default:\n throw new TypeError('Must provide a hilo val of \"<\" or \">\"')\n }\n\n // If it satisifes the range it is not outside\n if (satisfies(version, range, options)) {\n return false\n }\n\n // From now on, variable terms are as if we're in \"gtr\" mode.\n // but note that everything is flipped for the \"ltr\" function.\n\n for (var i = 0; i < range.set.length; ++i) {\n var comparators = range.set[i]\n\n var high = null\n var low = null\n\n comparators.forEach(function (comparator) {\n if (comparator.semver === ANY) {\n comparator = new Comparator('>=0.0.0')\n }\n high = high || comparator\n low = low || comparator\n if (gtfn(comparator.semver, high.semver, options)) {\n high = comparator\n } else if (ltfn(comparator.semver, low.semver, options)) {\n low = comparator\n }\n })\n\n // If the edge version comparator has a operator then our version\n // isn't outside it\n if (high.operator === comp || high.operator === ecomp) {\n return false\n }\n\n // If the lowest version comparator has an operator and our version\n // is less than it then it isn't higher than the range\n if ((!low.operator || low.operator === comp) &&\n ltefn(version, low.semver)) {\n return false\n } else if (low.operator === ecomp && ltfn(version, low.semver)) {\n return false\n }\n }\n return true\n}\n\nexports.prerelease = prerelease\nfunction prerelease (version, options) {\n var parsed = parse(version, options)\n return (parsed && parsed.prerelease.length) ? parsed.prerelease : null\n}\n\nexports.intersects = intersects\nfunction intersects (r1, r2, options) {\n r1 = new Range(r1, options)\n r2 = new Range(r2, options)\n return r1.intersects(r2)\n}\n\nexports.coerce = coerce\nfunction coerce (version, options) {\n if (version instanceof SemVer) {\n return version\n }\n\n if (typeof version === 'number') {\n version = String(version)\n }\n\n if (typeof version !== 'string') {\n return null\n }\n\n options = options || {}\n\n var match = null\n if (!options.rtl) {\n match = version.match(re[t.COERCE])\n } else {\n // Find the right-most coercible string that does not share\n // a terminus with a more left-ward coercible string.\n // Eg, '1.2.3.4' wants to coerce '2.3.4', not '3.4' or '4'\n //\n // Walk through the string checking with a /g regexp\n // Manually set the index so as to pick up overlapping matches.\n // Stop when we get a match that ends at the string end, since no\n // coercible string can be more right-ward without the same terminus.\n var next\n while ((next = re[t.COERCERTL].exec(version)) &&\n (!match || match.index + match[0].length !== version.length)\n ) {\n if (!match ||\n next.index + next[0].length !== match.index + match[0].length) {\n match = next\n }\n re[t.COERCERTL].lastIndex = next.index + next[1].length + next[2].length\n }\n // leave it in a clean state\n re[t.COERCERTL].lastIndex = -1\n }\n\n if (match === null) {\n return null\n }\n\n return parse(match[2] +\n '.' + (match[3] || '0') +\n '.' + (match[4] || '0'), options)\n}\n","(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :\n typeof define === 'function' && define.amd ? define('underscore', factory) :\n (global = typeof globalThis !== 'undefined' ? globalThis : global || self, (function () {\n var current = global._;\n var exports = global._ = factory();\n exports.noConflict = function () { global._ = current; return exports; };\n }()));\n}(this, (function () {\n // Underscore.js 1.13.6\n // https://underscorejs.org\n // (c) 2009-2022 Jeremy Ashkenas, Julian Gonggrijp, and DocumentCloud and Investigative Reporters & Editors\n // Underscore may be freely distributed under the MIT license.\n\n // Current version.\n var VERSION = '1.13.6';\n\n // Establish the root object, `window` (`self`) in the browser, `global`\n // on the server, or `this` in some virtual machines. We use `self`\n // instead of `window` for `WebWorker` support.\n var root = (typeof self == 'object' && self.self === self && self) ||\n (typeof global == 'object' && global.global === global && global) ||\n Function('return this')() ||\n {};\n\n // Save bytes in the minified (but not gzipped) version:\n var ArrayProto = Array.prototype, ObjProto = Object.prototype;\n var SymbolProto = typeof Symbol !== 'undefined' ? Symbol.prototype : null;\n\n // Create quick reference variables for speed access to core prototypes.\n var push = ArrayProto.push,\n slice = ArrayProto.slice,\n toString = ObjProto.toString,\n hasOwnProperty = ObjProto.hasOwnProperty;\n\n // Modern feature detection.\n var supportsArrayBuffer = typeof ArrayBuffer !== 'undefined',\n supportsDataView = typeof DataView !== 'undefined';\n\n // All **ECMAScript 5+** native function implementations that we hope to use\n // are declared here.\n var nativeIsArray = Array.isArray,\n nativeKeys = Object.keys,\n nativeCreate = Object.create,\n nativeIsView = supportsArrayBuffer && ArrayBuffer.isView;\n\n // Create references to these builtin functions because we override them.\n var _isNaN = isNaN,\n _isFinite = isFinite;\n\n // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed.\n var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString');\n var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString',\n 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString'];\n\n // The largest integer that can be represented exactly.\n var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1;\n\n // Some functions take a variable number of arguments, or a few expected\n // arguments at the beginning and then a variable number of values to operate\n // on. This helper accumulates all remaining arguments past the function’s\n // argument length (or an explicit `startIndex`), into an array that becomes\n // the last argument. Similar to ES6’s \"rest parameter\".\n function restArguments(func, startIndex) {\n startIndex = startIndex == null ? func.length - 1 : +startIndex;\n return function() {\n var length = Math.max(arguments.length - startIndex, 0),\n rest = Array(length),\n index = 0;\n for (; index < length; index++) {\n rest[index] = arguments[index + startIndex];\n }\n switch (startIndex) {\n case 0: return func.call(this, rest);\n case 1: return func.call(this, arguments[0], rest);\n case 2: return func.call(this, arguments[0], arguments[1], rest);\n }\n var args = Array(startIndex + 1);\n for (index = 0; index < startIndex; index++) {\n args[index] = arguments[index];\n }\n args[startIndex] = rest;\n return func.apply(this, args);\n };\n }\n\n // Is a given variable an object?\n function isObject(obj) {\n var type = typeof obj;\n return type === 'function' || (type === 'object' && !!obj);\n }\n\n // Is a given value equal to null?\n function isNull(obj) {\n return obj === null;\n }\n\n // Is a given variable undefined?\n function isUndefined(obj) {\n return obj === void 0;\n }\n\n // Is a given value a boolean?\n function isBoolean(obj) {\n return obj === true || obj === false || toString.call(obj) === '[object Boolean]';\n }\n\n // Is a given value a DOM element?\n function isElement(obj) {\n return !!(obj && obj.nodeType === 1);\n }\n\n // Internal function for creating a `toString`-based type tester.\n function tagTester(name) {\n var tag = '[object ' + name + ']';\n return function(obj) {\n return toString.call(obj) === tag;\n };\n }\n\n var isString = tagTester('String');\n\n var isNumber = tagTester('Number');\n\n var isDate = tagTester('Date');\n\n var isRegExp = tagTester('RegExp');\n\n var isError = tagTester('Error');\n\n var isSymbol = tagTester('Symbol');\n\n var isArrayBuffer = tagTester('ArrayBuffer');\n\n var isFunction = tagTester('Function');\n\n // Optimize `isFunction` if appropriate. Work around some `typeof` bugs in old\n // v8, IE 11 (#1621), Safari 8 (#1929), and PhantomJS (#2236).\n var nodelist = root.document && root.document.childNodes;\n if (typeof /./ != 'function' && typeof Int8Array != 'object' && typeof nodelist != 'function') {\n isFunction = function(obj) {\n return typeof obj == 'function' || false;\n };\n }\n\n var isFunction$1 = isFunction;\n\n var hasObjectTag = tagTester('Object');\n\n // In IE 10 - Edge 13, `DataView` has string tag `'[object Object]'`.\n // In IE 11, the most common among them, this problem also applies to\n // `Map`, `WeakMap` and `Set`.\n var hasStringTagBug = (\n supportsDataView && hasObjectTag(new DataView(new ArrayBuffer(8)))\n ),\n isIE11 = (typeof Map !== 'undefined' && hasObjectTag(new Map));\n\n var isDataView = tagTester('DataView');\n\n // In IE 10 - Edge 13, we need a different heuristic\n // to determine whether an object is a `DataView`.\n function ie10IsDataView(obj) {\n return obj != null && isFunction$1(obj.getInt8) && isArrayBuffer(obj.buffer);\n }\n\n var isDataView$1 = (hasStringTagBug ? ie10IsDataView : isDataView);\n\n // Is a given value an array?\n // Delegates to ECMA5's native `Array.isArray`.\n var isArray = nativeIsArray || tagTester('Array');\n\n // Internal function to check whether `key` is an own property name of `obj`.\n function has$1(obj, key) {\n return obj != null && hasOwnProperty.call(obj, key);\n }\n\n var isArguments = tagTester('Arguments');\n\n // Define a fallback version of the method in browsers (ahem, IE < 9), where\n // there isn't any inspectable \"Arguments\" type.\n (function() {\n if (!isArguments(arguments)) {\n isArguments = function(obj) {\n return has$1(obj, 'callee');\n };\n }\n }());\n\n var isArguments$1 = isArguments;\n\n // Is a given object a finite number?\n function isFinite$1(obj) {\n return !isSymbol(obj) && _isFinite(obj) && !isNaN(parseFloat(obj));\n }\n\n // Is the given value `NaN`?\n function isNaN$1(obj) {\n return isNumber(obj) && _isNaN(obj);\n }\n\n // Predicate-generating function. Often useful outside of Underscore.\n function constant(value) {\n return function() {\n return value;\n };\n }\n\n // Common internal logic for `isArrayLike` and `isBufferLike`.\n function createSizePropertyCheck(getSizeProperty) {\n return function(collection) {\n var sizeProperty = getSizeProperty(collection);\n return typeof sizeProperty == 'number' && sizeProperty >= 0 && sizeProperty <= MAX_ARRAY_INDEX;\n }\n }\n\n // Internal helper to generate a function to obtain property `key` from `obj`.\n function shallowProperty(key) {\n return function(obj) {\n return obj == null ? void 0 : obj[key];\n };\n }\n\n // Internal helper to obtain the `byteLength` property of an object.\n var getByteLength = shallowProperty('byteLength');\n\n // Internal helper to determine whether we should spend extensive checks against\n // `ArrayBuffer` et al.\n var isBufferLike = createSizePropertyCheck(getByteLength);\n\n // Is a given value a typed array?\n var typedArrayPattern = /\\[object ((I|Ui)nt(8|16|32)|Float(32|64)|Uint8Clamped|Big(I|Ui)nt64)Array\\]/;\n function isTypedArray(obj) {\n // `ArrayBuffer.isView` is the most future-proof, so use it when available.\n // Otherwise, fall back on the above regular expression.\n return nativeIsView ? (nativeIsView(obj) && !isDataView$1(obj)) :\n isBufferLike(obj) && typedArrayPattern.test(toString.call(obj));\n }\n\n var isTypedArray$1 = supportsArrayBuffer ? isTypedArray : constant(false);\n\n // Internal helper to obtain the `length` property of an object.\n var getLength = shallowProperty('length');\n\n // Internal helper to create a simple lookup structure.\n // `collectNonEnumProps` used to depend on `_.contains`, but this led to\n // circular imports. `emulatedSet` is a one-off solution that only works for\n // arrays of strings.\n function emulatedSet(keys) {\n var hash = {};\n for (var l = keys.length, i = 0; i < l; ++i) hash[keys[i]] = true;\n return {\n contains: function(key) { return hash[key] === true; },\n push: function(key) {\n hash[key] = true;\n return keys.push(key);\n }\n };\n }\n\n // Internal helper. Checks `keys` for the presence of keys in IE < 9 that won't\n // be iterated by `for key in ...` and thus missed. Extends `keys` in place if\n // needed.\n function collectNonEnumProps(obj, keys) {\n keys = emulatedSet(keys);\n var nonEnumIdx = nonEnumerableProps.length;\n var constructor = obj.constructor;\n var proto = (isFunction$1(constructor) && constructor.prototype) || ObjProto;\n\n // Constructor is a special case.\n var prop = 'constructor';\n if (has$1(obj, prop) && !keys.contains(prop)) keys.push(prop);\n\n while (nonEnumIdx--) {\n prop = nonEnumerableProps[nonEnumIdx];\n if (prop in obj && obj[prop] !== proto[prop] && !keys.contains(prop)) {\n keys.push(prop);\n }\n }\n }\n\n // Retrieve the names of an object's own properties.\n // Delegates to **ECMAScript 5**'s native `Object.keys`.\n function keys(obj) {\n if (!isObject(obj)) return [];\n if (nativeKeys) return nativeKeys(obj);\n var keys = [];\n for (var key in obj) if (has$1(obj, key)) keys.push(key);\n // Ahem, IE < 9.\n if (hasEnumBug) collectNonEnumProps(obj, keys);\n return keys;\n }\n\n // Is a given array, string, or object empty?\n // An \"empty\" object has no enumerable own-properties.\n function isEmpty(obj) {\n if (obj == null) return true;\n // Skip the more expensive `toString`-based type checks if `obj` has no\n // `.length`.\n var length = getLength(obj);\n if (typeof length == 'number' && (\n isArray(obj) || isString(obj) || isArguments$1(obj)\n )) return length === 0;\n return getLength(keys(obj)) === 0;\n }\n\n // Returns whether an object has a given set of `key:value` pairs.\n function isMatch(object, attrs) {\n var _keys = keys(attrs), length = _keys.length;\n if (object == null) return !length;\n var obj = Object(object);\n for (var i = 0; i < length; i++) {\n var key = _keys[i];\n if (attrs[key] !== obj[key] || !(key in obj)) return false;\n }\n return true;\n }\n\n // If Underscore is called as a function, it returns a wrapped object that can\n // be used OO-style. This wrapper holds altered versions of all functions added\n // through `_.mixin`. Wrapped objects may be chained.\n function _$1(obj) {\n if (obj instanceof _$1) return obj;\n if (!(this instanceof _$1)) return new _$1(obj);\n this._wrapped = obj;\n }\n\n _$1.VERSION = VERSION;\n\n // Extracts the result from a wrapped and chained object.\n _$1.prototype.value = function() {\n return this._wrapped;\n };\n\n // Provide unwrapping proxies for some methods used in engine operations\n // such as arithmetic and JSON stringification.\n _$1.prototype.valueOf = _$1.prototype.toJSON = _$1.prototype.value;\n\n _$1.prototype.toString = function() {\n return String(this._wrapped);\n };\n\n // Internal function to wrap or shallow-copy an ArrayBuffer,\n // typed array or DataView to a new view, reusing the buffer.\n function toBufferView(bufferSource) {\n return new Uint8Array(\n bufferSource.buffer || bufferSource,\n bufferSource.byteOffset || 0,\n getByteLength(bufferSource)\n );\n }\n\n // We use this string twice, so give it a name for minification.\n var tagDataView = '[object DataView]';\n\n // Internal recursive comparison function for `_.isEqual`.\n function eq(a, b, aStack, bStack) {\n // Identical objects are equal. `0 === -0`, but they aren't identical.\n // See the [Harmony `egal` proposal](https://wiki.ecmascript.org/doku.php?id=harmony:egal).\n if (a === b) return a !== 0 || 1 / a === 1 / b;\n // `null` or `undefined` only equal to itself (strict comparison).\n if (a == null || b == null) return false;\n // `NaN`s are equivalent, but non-reflexive.\n if (a !== a) return b !== b;\n // Exhaust primitive checks\n var type = typeof a;\n if (type !== 'function' && type !== 'object' && typeof b != 'object') return false;\n return deepEq(a, b, aStack, bStack);\n }\n\n // Internal recursive comparison function for `_.isEqual`.\n function deepEq(a, b, aStack, bStack) {\n // Unwrap any wrapped objects.\n if (a instanceof _$1) a = a._wrapped;\n if (b instanceof _$1) b = b._wrapped;\n // Compare `[[Class]]` names.\n var className = toString.call(a);\n if (className !== toString.call(b)) return false;\n // Work around a bug in IE 10 - Edge 13.\n if (hasStringTagBug && className == '[object Object]' && isDataView$1(a)) {\n if (!isDataView$1(b)) return false;\n className = tagDataView;\n }\n switch (className) {\n // These types are compared by value.\n case '[object RegExp]':\n // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i')\n case '[object String]':\n // Primitives and their corresponding object wrappers are equivalent; thus, `\"5\"` is\n // equivalent to `new String(\"5\")`.\n return '' + a === '' + b;\n case '[object Number]':\n // `NaN`s are equivalent, but non-reflexive.\n // Object(NaN) is equivalent to NaN.\n if (+a !== +a) return +b !== +b;\n // An `egal` comparison is performed for other numeric values.\n return +a === 0 ? 1 / +a === 1 / b : +a === +b;\n case '[object Date]':\n case '[object Boolean]':\n // Coerce dates and booleans to numeric primitive values. Dates are compared by their\n // millisecond representations. Note that invalid dates with millisecond representations\n // of `NaN` are not equivalent.\n return +a === +b;\n case '[object Symbol]':\n return SymbolProto.valueOf.call(a) === SymbolProto.valueOf.call(b);\n case '[object ArrayBuffer]':\n case tagDataView:\n // Coerce to typed array so we can fall through.\n return deepEq(toBufferView(a), toBufferView(b), aStack, bStack);\n }\n\n var areArrays = className === '[object Array]';\n if (!areArrays && isTypedArray$1(a)) {\n var byteLength = getByteLength(a);\n if (byteLength !== getByteLength(b)) return false;\n if (a.buffer === b.buffer && a.byteOffset === b.byteOffset) return true;\n areArrays = true;\n }\n if (!areArrays) {\n if (typeof a != 'object' || typeof b != 'object') return false;\n\n // Objects with different constructors are not equivalent, but `Object`s or `Array`s\n // from different frames are.\n var aCtor = a.constructor, bCtor = b.constructor;\n if (aCtor !== bCtor && !(isFunction$1(aCtor) && aCtor instanceof aCtor &&\n isFunction$1(bCtor) && bCtor instanceof bCtor)\n && ('constructor' in a && 'constructor' in b)) {\n return false;\n }\n }\n // Assume equality for cyclic structures. The algorithm for detecting cyclic\n // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`.\n\n // Initializing stack of traversed objects.\n // It's done here since we only need them for objects and arrays comparison.\n aStack = aStack || [];\n bStack = bStack || [];\n var length = aStack.length;\n while (length--) {\n // Linear search. Performance is inversely proportional to the number of\n // unique nested structures.\n if (aStack[length] === a) return bStack[length] === b;\n }\n\n // Add the first object to the stack of traversed objects.\n aStack.push(a);\n bStack.push(b);\n\n // Recursively compare objects and arrays.\n if (areArrays) {\n // Compare array lengths to determine if a deep comparison is necessary.\n length = a.length;\n if (length !== b.length) return false;\n // Deep compare the contents, ignoring non-numeric properties.\n while (length--) {\n if (!eq(a[length], b[length], aStack, bStack)) return false;\n }\n } else {\n // Deep compare objects.\n var _keys = keys(a), key;\n length = _keys.length;\n // Ensure that both objects contain the same number of properties before comparing deep equality.\n if (keys(b).length !== length) return false;\n while (length--) {\n // Deep compare each member\n key = _keys[length];\n if (!(has$1(b, key) && eq(a[key], b[key], aStack, bStack))) return false;\n }\n }\n // Remove the first object from the stack of traversed objects.\n aStack.pop();\n bStack.pop();\n return true;\n }\n\n // Perform a deep comparison to check if two objects are equal.\n function isEqual(a, b) {\n return eq(a, b);\n }\n\n // Retrieve all the enumerable property names of an object.\n function allKeys(obj) {\n if (!isObject(obj)) return [];\n var keys = [];\n for (var key in obj) keys.push(key);\n // Ahem, IE < 9.\n if (hasEnumBug) collectNonEnumProps(obj, keys);\n return keys;\n }\n\n // Since the regular `Object.prototype.toString` type tests don't work for\n // some types in IE 11, we use a fingerprinting heuristic instead, based\n // on the methods. It's not great, but it's the best we got.\n // The fingerprint method lists are defined below.\n function ie11fingerprint(methods) {\n var length = getLength(methods);\n return function(obj) {\n if (obj == null) return false;\n // `Map`, `WeakMap` and `Set` have no enumerable keys.\n var keys = allKeys(obj);\n if (getLength(keys)) return false;\n for (var i = 0; i < length; i++) {\n if (!isFunction$1(obj[methods[i]])) return false;\n }\n // If we are testing against `WeakMap`, we need to ensure that\n // `obj` doesn't have a `forEach` method in order to distinguish\n // it from a regular `Map`.\n return methods !== weakMapMethods || !isFunction$1(obj[forEachName]);\n };\n }\n\n // In the interest of compact minification, we write\n // each string in the fingerprints only once.\n var forEachName = 'forEach',\n hasName = 'has',\n commonInit = ['clear', 'delete'],\n mapTail = ['get', hasName, 'set'];\n\n // `Map`, `WeakMap` and `Set` each have slightly different\n // combinations of the above sublists.\n var mapMethods = commonInit.concat(forEachName, mapTail),\n weakMapMethods = commonInit.concat(mapTail),\n setMethods = ['add'].concat(commonInit, forEachName, hasName);\n\n var isMap = isIE11 ? ie11fingerprint(mapMethods) : tagTester('Map');\n\n var isWeakMap = isIE11 ? ie11fingerprint(weakMapMethods) : tagTester('WeakMap');\n\n var isSet = isIE11 ? ie11fingerprint(setMethods) : tagTester('Set');\n\n var isWeakSet = tagTester('WeakSet');\n\n // Retrieve the values of an object's properties.\n function values(obj) {\n var _keys = keys(obj);\n var length = _keys.length;\n var values = Array(length);\n for (var i = 0; i < length; i++) {\n values[i] = obj[_keys[i]];\n }\n return values;\n }\n\n // Convert an object into a list of `[key, value]` pairs.\n // The opposite of `_.object` with one argument.\n function pairs(obj) {\n var _keys = keys(obj);\n var length = _keys.length;\n var pairs = Array(length);\n for (var i = 0; i < length; i++) {\n pairs[i] = [_keys[i], obj[_keys[i]]];\n }\n return pairs;\n }\n\n // Invert the keys and values of an object. The values must be serializable.\n function invert(obj) {\n var result = {};\n var _keys = keys(obj);\n for (var i = 0, length = _keys.length; i < length; i++) {\n result[obj[_keys[i]]] = _keys[i];\n }\n return result;\n }\n\n // Return a sorted list of the function names available on the object.\n function functions(obj) {\n var names = [];\n for (var key in obj) {\n if (isFunction$1(obj[key])) names.push(key);\n }\n return names.sort();\n }\n\n // An internal function for creating assigner functions.\n function createAssigner(keysFunc, defaults) {\n return function(obj) {\n var length = arguments.length;\n if (defaults) obj = Object(obj);\n if (length < 2 || obj == null) return obj;\n for (var index = 1; index < length; index++) {\n var source = arguments[index],\n keys = keysFunc(source),\n l = keys.length;\n for (var i = 0; i < l; i++) {\n var key = keys[i];\n if (!defaults || obj[key] === void 0) obj[key] = source[key];\n }\n }\n return obj;\n };\n }\n\n // Extend a given object with all the properties in passed-in object(s).\n var extend = createAssigner(allKeys);\n\n // Assigns a given object with all the own properties in the passed-in\n // object(s).\n // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign)\n var extendOwn = createAssigner(keys);\n\n // Fill in a given object with default properties.\n var defaults = createAssigner(allKeys, true);\n\n // Create a naked function reference for surrogate-prototype-swapping.\n function ctor() {\n return function(){};\n }\n\n // An internal function for creating a new object that inherits from another.\n function baseCreate(prototype) {\n if (!isObject(prototype)) return {};\n if (nativeCreate) return nativeCreate(prototype);\n var Ctor = ctor();\n Ctor.prototype = prototype;\n var result = new Ctor;\n Ctor.prototype = null;\n return result;\n }\n\n // Creates an object that inherits from the given prototype object.\n // If additional properties are provided then they will be added to the\n // created object.\n function create(prototype, props) {\n var result = baseCreate(prototype);\n if (props) extendOwn(result, props);\n return result;\n }\n\n // Create a (shallow-cloned) duplicate of an object.\n function clone(obj) {\n if (!isObject(obj)) return obj;\n return isArray(obj) ? obj.slice() : extend({}, obj);\n }\n\n // Invokes `interceptor` with the `obj` and then returns `obj`.\n // The primary purpose of this method is to \"tap into\" a method chain, in\n // order to perform operations on intermediate results within the chain.\n function tap(obj, interceptor) {\n interceptor(obj);\n return obj;\n }\n\n // Normalize a (deep) property `path` to array.\n // Like `_.iteratee`, this function can be customized.\n function toPath$1(path) {\n return isArray(path) ? path : [path];\n }\n _$1.toPath = toPath$1;\n\n // Internal wrapper for `_.toPath` to enable minification.\n // Similar to `cb` for `_.iteratee`.\n function toPath(path) {\n return _$1.toPath(path);\n }\n\n // Internal function to obtain a nested property in `obj` along `path`.\n function deepGet(obj, path) {\n var length = path.length;\n for (var i = 0; i < length; i++) {\n if (obj == null) return void 0;\n obj = obj[path[i]];\n }\n return length ? obj : void 0;\n }\n\n // Get the value of the (deep) property on `path` from `object`.\n // If any property in `path` does not exist or if the value is\n // `undefined`, return `defaultValue` instead.\n // The `path` is normalized through `_.toPath`.\n function get(object, path, defaultValue) {\n var value = deepGet(object, toPath(path));\n return isUndefined(value) ? defaultValue : value;\n }\n\n // Shortcut function for checking if an object has a given property directly on\n // itself (in other words, not on a prototype). Unlike the internal `has`\n // function, this public version can also traverse nested properties.\n function has(obj, path) {\n path = toPath(path);\n var length = path.length;\n for (var i = 0; i < length; i++) {\n var key = path[i];\n if (!has$1(obj, key)) return false;\n obj = obj[key];\n }\n return !!length;\n }\n\n // Keep the identity function around for default iteratees.\n function identity(value) {\n return value;\n }\n\n // Returns a predicate for checking whether an object has a given set of\n // `key:value` pairs.\n function matcher(attrs) {\n attrs = extendOwn({}, attrs);\n return function(obj) {\n return isMatch(obj, attrs);\n };\n }\n\n // Creates a function that, when passed an object, will traverse that object’s\n // properties down the given `path`, specified as an array of keys or indices.\n function property(path) {\n path = toPath(path);\n return function(obj) {\n return deepGet(obj, path);\n };\n }\n\n // Internal function that returns an efficient (for current engines) version\n // of the passed-in callback, to be repeatedly applied in other Underscore\n // functions.\n function optimizeCb(func, context, argCount) {\n if (context === void 0) return func;\n switch (argCount == null ? 3 : argCount) {\n case 1: return function(value) {\n return func.call(context, value);\n };\n // The 2-argument case is omitted because we’re not using it.\n case 3: return function(value, index, collection) {\n return func.call(context, value, index, collection);\n };\n case 4: return function(accumulator, value, index, collection) {\n return func.call(context, accumulator, value, index, collection);\n };\n }\n return function() {\n return func.apply(context, arguments);\n };\n }\n\n // An internal function to generate callbacks that can be applied to each\n // element in a collection, returning the desired result — either `_.identity`,\n // an arbitrary callback, a property matcher, or a property accessor.\n function baseIteratee(value, context, argCount) {\n if (value == null) return identity;\n if (isFunction$1(value)) return optimizeCb(value, context, argCount);\n if (isObject(value) && !isArray(value)) return matcher(value);\n return property(value);\n }\n\n // External wrapper for our callback generator. Users may customize\n // `_.iteratee` if they want additional predicate/iteratee shorthand styles.\n // This abstraction hides the internal-only `argCount` argument.\n function iteratee(value, context) {\n return baseIteratee(value, context, Infinity);\n }\n _$1.iteratee = iteratee;\n\n // The function we call internally to generate a callback. It invokes\n // `_.iteratee` if overridden, otherwise `baseIteratee`.\n function cb(value, context, argCount) {\n if (_$1.iteratee !== iteratee) return _$1.iteratee(value, context);\n return baseIteratee(value, context, argCount);\n }\n\n // Returns the results of applying the `iteratee` to each element of `obj`.\n // In contrast to `_.map` it returns an object.\n function mapObject(obj, iteratee, context) {\n iteratee = cb(iteratee, context);\n var _keys = keys(obj),\n length = _keys.length,\n results = {};\n for (var index = 0; index < length; index++) {\n var currentKey = _keys[index];\n results[currentKey] = iteratee(obj[currentKey], currentKey, obj);\n }\n return results;\n }\n\n // Predicate-generating function. Often useful outside of Underscore.\n function noop(){}\n\n // Generates a function for a given object that returns a given property.\n function propertyOf(obj) {\n if (obj == null) return noop;\n return function(path) {\n return get(obj, path);\n };\n }\n\n // Run a function **n** times.\n function times(n, iteratee, context) {\n var accum = Array(Math.max(0, n));\n iteratee = optimizeCb(iteratee, context, 1);\n for (var i = 0; i < n; i++) accum[i] = iteratee(i);\n return accum;\n }\n\n // Return a random integer between `min` and `max` (inclusive).\n function random(min, max) {\n if (max == null) {\n max = min;\n min = 0;\n }\n return min + Math.floor(Math.random() * (max - min + 1));\n }\n\n // A (possibly faster) way to get the current timestamp as an integer.\n var now = Date.now || function() {\n return new Date().getTime();\n };\n\n // Internal helper to generate functions for escaping and unescaping strings\n // to/from HTML interpolation.\n function createEscaper(map) {\n var escaper = function(match) {\n return map[match];\n };\n // Regexes for identifying a key that needs to be escaped.\n var source = '(?:' + keys(map).join('|') + ')';\n var testRegexp = RegExp(source);\n var replaceRegexp = RegExp(source, 'g');\n return function(string) {\n string = string == null ? '' : '' + string;\n return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string;\n };\n }\n\n // Internal list of HTML entities for escaping.\n var escapeMap = {\n '&': '&',\n '<': '<',\n '>': '>',\n '\"': '"',\n \"'\": ''',\n '`': '`'\n };\n\n // Function for escaping strings to HTML interpolation.\n var _escape = createEscaper(escapeMap);\n\n // Internal list of HTML entities for unescaping.\n var unescapeMap = invert(escapeMap);\n\n // Function for unescaping strings from HTML interpolation.\n var _unescape = createEscaper(unescapeMap);\n\n // By default, Underscore uses ERB-style template delimiters. Change the\n // following template settings to use alternative delimiters.\n var templateSettings = _$1.templateSettings = {\n evaluate: /<%([\\s\\S]+?)%>/g,\n interpolate: /<%=([\\s\\S]+?)%>/g,\n escape: /<%-([\\s\\S]+?)%>/g\n };\n\n // When customizing `_.templateSettings`, if you don't want to define an\n // interpolation, evaluation or escaping regex, we need one that is\n // guaranteed not to match.\n var noMatch = /(.)^/;\n\n // Certain characters need to be escaped so that they can be put into a\n // string literal.\n var escapes = {\n \"'\": \"'\",\n '\\\\': '\\\\',\n '\\r': 'r',\n '\\n': 'n',\n '\\u2028': 'u2028',\n '\\u2029': 'u2029'\n };\n\n var escapeRegExp = /\\\\|'|\\r|\\n|\\u2028|\\u2029/g;\n\n function escapeChar(match) {\n return '\\\\' + escapes[match];\n }\n\n // In order to prevent third-party code injection through\n // `_.templateSettings.variable`, we test it against the following regular\n // expression. It is intentionally a bit more liberal than just matching valid\n // identifiers, but still prevents possible loopholes through defaults or\n // destructuring assignment.\n var bareIdentifier = /^\\s*(\\w|\\$)+\\s*$/;\n\n // JavaScript micro-templating, similar to John Resig's implementation.\n // Underscore templating handles arbitrary delimiters, preserves whitespace,\n // and correctly escapes quotes within interpolated code.\n // NB: `oldSettings` only exists for backwards compatibility.\n function template(text, settings, oldSettings) {\n if (!settings && oldSettings) settings = oldSettings;\n settings = defaults({}, settings, _$1.templateSettings);\n\n // Combine delimiters into one regular expression via alternation.\n var matcher = RegExp([\n (settings.escape || noMatch).source,\n (settings.interpolate || noMatch).source,\n (settings.evaluate || noMatch).source\n ].join('|') + '|$', 'g');\n\n // Compile the template source, escaping string literals appropriately.\n var index = 0;\n var source = \"__p+='\";\n text.replace(matcher, function(match, escape, interpolate, evaluate, offset) {\n source += text.slice(index, offset).replace(escapeRegExp, escapeChar);\n index = offset + match.length;\n\n if (escape) {\n source += \"'+\\n((__t=(\" + escape + \"))==null?'':_.escape(__t))+\\n'\";\n } else if (interpolate) {\n source += \"'+\\n((__t=(\" + interpolate + \"))==null?'':__t)+\\n'\";\n } else if (evaluate) {\n source += \"';\\n\" + evaluate + \"\\n__p+='\";\n }\n\n // Adobe VMs need the match returned to produce the correct offset.\n return match;\n });\n source += \"';\\n\";\n\n var argument = settings.variable;\n if (argument) {\n // Insure against third-party code injection. (CVE-2021-23358)\n if (!bareIdentifier.test(argument)) throw new Error(\n 'variable is not a bare identifier: ' + argument\n );\n } else {\n // If a variable is not specified, place data values in local scope.\n source = 'with(obj||{}){\\n' + source + '}\\n';\n argument = 'obj';\n }\n\n source = \"var __t,__p='',__j=Array.prototype.join,\" +\n \"print=function(){__p+=__j.call(arguments,'');};\\n\" +\n source + 'return __p;\\n';\n\n var render;\n try {\n render = new Function(argument, '_', source);\n } catch (e) {\n e.source = source;\n throw e;\n }\n\n var template = function(data) {\n return render.call(this, data, _$1);\n };\n\n // Provide the compiled source as a convenience for precompilation.\n template.source = 'function(' + argument + '){\\n' + source + '}';\n\n return template;\n }\n\n // Traverses the children of `obj` along `path`. If a child is a function, it\n // is invoked with its parent as context. Returns the value of the final\n // child, or `fallback` if any child is undefined.\n function result(obj, path, fallback) {\n path = toPath(path);\n var length = path.length;\n if (!length) {\n return isFunction$1(fallback) ? fallback.call(obj) : fallback;\n }\n for (var i = 0; i < length; i++) {\n var prop = obj == null ? void 0 : obj[path[i]];\n if (prop === void 0) {\n prop = fallback;\n i = length; // Ensure we don't continue iterating.\n }\n obj = isFunction$1(prop) ? prop.call(obj) : prop;\n }\n return obj;\n }\n\n // Generate a unique integer id (unique within the entire client session).\n // Useful for temporary DOM ids.\n var idCounter = 0;\n function uniqueId(prefix) {\n var id = ++idCounter + '';\n return prefix ? prefix + id : id;\n }\n\n // Start chaining a wrapped Underscore object.\n function chain(obj) {\n var instance = _$1(obj);\n instance._chain = true;\n return instance;\n }\n\n // Internal function to execute `sourceFunc` bound to `context` with optional\n // `args`. Determines whether to execute a function as a constructor or as a\n // normal function.\n function executeBound(sourceFunc, boundFunc, context, callingContext, args) {\n if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args);\n var self = baseCreate(sourceFunc.prototype);\n var result = sourceFunc.apply(self, args);\n if (isObject(result)) return result;\n return self;\n }\n\n // Partially apply a function by creating a version that has had some of its\n // arguments pre-filled, without changing its dynamic `this` context. `_` acts\n // as a placeholder by default, allowing any combination of arguments to be\n // pre-filled. Set `_.partial.placeholder` for a custom placeholder argument.\n var partial = restArguments(function(func, boundArgs) {\n var placeholder = partial.placeholder;\n var bound = function() {\n var position = 0, length = boundArgs.length;\n var args = Array(length);\n for (var i = 0; i < length; i++) {\n args[i] = boundArgs[i] === placeholder ? arguments[position++] : boundArgs[i];\n }\n while (position < arguments.length) args.push(arguments[position++]);\n return executeBound(func, bound, this, this, args);\n };\n return bound;\n });\n\n partial.placeholder = _$1;\n\n // Create a function bound to a given object (assigning `this`, and arguments,\n // optionally).\n var bind = restArguments(function(func, context, args) {\n if (!isFunction$1(func)) throw new TypeError('Bind must be called on a function');\n var bound = restArguments(function(callArgs) {\n return executeBound(func, bound, context, this, args.concat(callArgs));\n });\n return bound;\n });\n\n // Internal helper for collection methods to determine whether a collection\n // should be iterated as an array or as an object.\n // Related: https://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength\n // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094\n var isArrayLike = createSizePropertyCheck(getLength);\n\n // Internal implementation of a recursive `flatten` function.\n function flatten$1(input, depth, strict, output) {\n output = output || [];\n if (!depth && depth !== 0) {\n depth = Infinity;\n } else if (depth <= 0) {\n return output.concat(input);\n }\n var idx = output.length;\n for (var i = 0, length = getLength(input); i < length; i++) {\n var value = input[i];\n if (isArrayLike(value) && (isArray(value) || isArguments$1(value))) {\n // Flatten current level of array or arguments object.\n if (depth > 1) {\n flatten$1(value, depth - 1, strict, output);\n idx = output.length;\n } else {\n var j = 0, len = value.length;\n while (j < len) output[idx++] = value[j++];\n }\n } else if (!strict) {\n output[idx++] = value;\n }\n }\n return output;\n }\n\n // Bind a number of an object's methods to that object. Remaining arguments\n // are the method names to be bound. Useful for ensuring that all callbacks\n // defined on an object belong to it.\n var bindAll = restArguments(function(obj, keys) {\n keys = flatten$1(keys, false, false);\n var index = keys.length;\n if (index < 1) throw new Error('bindAll must be passed function names');\n while (index--) {\n var key = keys[index];\n obj[key] = bind(obj[key], obj);\n }\n return obj;\n });\n\n // Memoize an expensive function by storing its results.\n function memoize(func, hasher) {\n var memoize = function(key) {\n var cache = memoize.cache;\n var address = '' + (hasher ? hasher.apply(this, arguments) : key);\n if (!has$1(cache, address)) cache[address] = func.apply(this, arguments);\n return cache[address];\n };\n memoize.cache = {};\n return memoize;\n }\n\n // Delays a function for the given number of milliseconds, and then calls\n // it with the arguments supplied.\n var delay = restArguments(function(func, wait, args) {\n return setTimeout(function() {\n return func.apply(null, args);\n }, wait);\n });\n\n // Defers a function, scheduling it to run after the current call stack has\n // cleared.\n var defer = partial(delay, _$1, 1);\n\n // Returns a function, that, when invoked, will only be triggered at most once\n // during a given window of time. Normally, the throttled function will run\n // as much as it can, without ever going more than once per `wait` duration;\n // but if you'd like to disable the execution on the leading edge, pass\n // `{leading: false}`. To disable execution on the trailing edge, ditto.\n function throttle(func, wait, options) {\n var timeout, context, args, result;\n var previous = 0;\n if (!options) options = {};\n\n var later = function() {\n previous = options.leading === false ? 0 : now();\n timeout = null;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n };\n\n var throttled = function() {\n var _now = now();\n if (!previous && options.leading === false) previous = _now;\n var remaining = wait - (_now - previous);\n context = this;\n args = arguments;\n if (remaining <= 0 || remaining > wait) {\n if (timeout) {\n clearTimeout(timeout);\n timeout = null;\n }\n previous = _now;\n result = func.apply(context, args);\n if (!timeout) context = args = null;\n } else if (!timeout && options.trailing !== false) {\n timeout = setTimeout(later, remaining);\n }\n return result;\n };\n\n throttled.cancel = function() {\n clearTimeout(timeout);\n previous = 0;\n timeout = context = args = null;\n };\n\n return throttled;\n }\n\n // When a sequence of calls of the returned function ends, the argument\n // function is triggered. The end of a sequence is defined by the `wait`\n // parameter. If `immediate` is passed, the argument function will be\n // triggered at the beginning of the sequence instead of at the end.\n function debounce(func, wait, immediate) {\n var timeout, previous, args, result, context;\n\n var later = function() {\n var passed = now() - previous;\n if (wait > passed) {\n timeout = setTimeout(later, wait - passed);\n } else {\n timeout = null;\n if (!immediate) result = func.apply(context, args);\n // This check is needed because `func` can recursively invoke `debounced`.\n if (!timeout) args = context = null;\n }\n };\n\n var debounced = restArguments(function(_args) {\n context = this;\n args = _args;\n previous = now();\n if (!timeout) {\n timeout = setTimeout(later, wait);\n if (immediate) result = func.apply(context, args);\n }\n return result;\n });\n\n debounced.cancel = function() {\n clearTimeout(timeout);\n timeout = args = context = null;\n };\n\n return debounced;\n }\n\n // Returns the first function passed as an argument to the second,\n // allowing you to adjust arguments, run code before and after, and\n // conditionally execute the original function.\n function wrap(func, wrapper) {\n return partial(wrapper, func);\n }\n\n // Returns a negated version of the passed-in predicate.\n function negate(predicate) {\n return function() {\n return !predicate.apply(this, arguments);\n };\n }\n\n // Returns a function that is the composition of a list of functions, each\n // consuming the return value of the function that follows.\n function compose() {\n var args = arguments;\n var start = args.length - 1;\n return function() {\n var i = start;\n var result = args[start].apply(this, arguments);\n while (i--) result = args[i].call(this, result);\n return result;\n };\n }\n\n // Returns a function that will only be executed on and after the Nth call.\n function after(times, func) {\n return function() {\n if (--times < 1) {\n return func.apply(this, arguments);\n }\n };\n }\n\n // Returns a function that will only be executed up to (but not including) the\n // Nth call.\n function before(times, func) {\n var memo;\n return function() {\n if (--times > 0) {\n memo = func.apply(this, arguments);\n }\n if (times <= 1) func = null;\n return memo;\n };\n }\n\n // Returns a function that will be executed at most one time, no matter how\n // often you call it. Useful for lazy initialization.\n var once = partial(before, 2);\n\n // Returns the first key on an object that passes a truth test.\n function findKey(obj, predicate, context) {\n predicate = cb(predicate, context);\n var _keys = keys(obj), key;\n for (var i = 0, length = _keys.length; i < length; i++) {\n key = _keys[i];\n if (predicate(obj[key], key, obj)) return key;\n }\n }\n\n // Internal function to generate `_.findIndex` and `_.findLastIndex`.\n function createPredicateIndexFinder(dir) {\n return function(array, predicate, context) {\n predicate = cb(predicate, context);\n var length = getLength(array);\n var index = dir > 0 ? 0 : length - 1;\n for (; index >= 0 && index < length; index += dir) {\n if (predicate(array[index], index, array)) return index;\n }\n return -1;\n };\n }\n\n // Returns the first index on an array-like that passes a truth test.\n var findIndex = createPredicateIndexFinder(1);\n\n // Returns the last index on an array-like that passes a truth test.\n var findLastIndex = createPredicateIndexFinder(-1);\n\n // Use a comparator function to figure out the smallest index at which\n // an object should be inserted so as to maintain order. Uses binary search.\n function sortedIndex(array, obj, iteratee, context) {\n iteratee = cb(iteratee, context, 1);\n var value = iteratee(obj);\n var low = 0, high = getLength(array);\n while (low < high) {\n var mid = Math.floor((low + high) / 2);\n if (iteratee(array[mid]) < value) low = mid + 1; else high = mid;\n }\n return low;\n }\n\n // Internal function to generate the `_.indexOf` and `_.lastIndexOf` functions.\n function createIndexFinder(dir, predicateFind, sortedIndex) {\n return function(array, item, idx) {\n var i = 0, length = getLength(array);\n if (typeof idx == 'number') {\n if (dir > 0) {\n i = idx >= 0 ? idx : Math.max(idx + length, i);\n } else {\n length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1;\n }\n } else if (sortedIndex && idx && length) {\n idx = sortedIndex(array, item);\n return array[idx] === item ? idx : -1;\n }\n if (item !== item) {\n idx = predicateFind(slice.call(array, i, length), isNaN$1);\n return idx >= 0 ? idx + i : -1;\n }\n for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) {\n if (array[idx] === item) return idx;\n }\n return -1;\n };\n }\n\n // Return the position of the first occurrence of an item in an array,\n // or -1 if the item is not included in the array.\n // If the array is large and already in sort order, pass `true`\n // for **isSorted** to use binary search.\n var indexOf = createIndexFinder(1, findIndex, sortedIndex);\n\n // Return the position of the last occurrence of an item in an array,\n // or -1 if the item is not included in the array.\n var lastIndexOf = createIndexFinder(-1, findLastIndex);\n\n // Return the first value which passes a truth test.\n function find(obj, predicate, context) {\n var keyFinder = isArrayLike(obj) ? findIndex : findKey;\n var key = keyFinder(obj, predicate, context);\n if (key !== void 0 && key !== -1) return obj[key];\n }\n\n // Convenience version of a common use case of `_.find`: getting the first\n // object containing specific `key:value` pairs.\n function findWhere(obj, attrs) {\n return find(obj, matcher(attrs));\n }\n\n // The cornerstone for collection functions, an `each`\n // implementation, aka `forEach`.\n // Handles raw objects in addition to array-likes. Treats all\n // sparse array-likes as if they were dense.\n function each(obj, iteratee, context) {\n iteratee = optimizeCb(iteratee, context);\n var i, length;\n if (isArrayLike(obj)) {\n for (i = 0, length = obj.length; i < length; i++) {\n iteratee(obj[i], i, obj);\n }\n } else {\n var _keys = keys(obj);\n for (i = 0, length = _keys.length; i < length; i++) {\n iteratee(obj[_keys[i]], _keys[i], obj);\n }\n }\n return obj;\n }\n\n // Return the results of applying the iteratee to each element.\n function map(obj, iteratee, context) {\n iteratee = cb(iteratee, context);\n var _keys = !isArrayLike(obj) && keys(obj),\n length = (_keys || obj).length,\n results = Array(length);\n for (var index = 0; index < length; index++) {\n var currentKey = _keys ? _keys[index] : index;\n results[index] = iteratee(obj[currentKey], currentKey, obj);\n }\n return results;\n }\n\n // Internal helper to create a reducing function, iterating left or right.\n function createReduce(dir) {\n // Wrap code that reassigns argument variables in a separate function than\n // the one that accesses `arguments.length` to avoid a perf hit. (#1991)\n var reducer = function(obj, iteratee, memo, initial) {\n var _keys = !isArrayLike(obj) && keys(obj),\n length = (_keys || obj).length,\n index = dir > 0 ? 0 : length - 1;\n if (!initial) {\n memo = obj[_keys ? _keys[index] : index];\n index += dir;\n }\n for (; index >= 0 && index < length; index += dir) {\n var currentKey = _keys ? _keys[index] : index;\n memo = iteratee(memo, obj[currentKey], currentKey, obj);\n }\n return memo;\n };\n\n return function(obj, iteratee, memo, context) {\n var initial = arguments.length >= 3;\n return reducer(obj, optimizeCb(iteratee, context, 4), memo, initial);\n };\n }\n\n // **Reduce** builds up a single result from a list of values, aka `inject`,\n // or `foldl`.\n var reduce = createReduce(1);\n\n // The right-associative version of reduce, also known as `foldr`.\n var reduceRight = createReduce(-1);\n\n // Return all the elements that pass a truth test.\n function filter(obj, predicate, context) {\n var results = [];\n predicate = cb(predicate, context);\n each(obj, function(value, index, list) {\n if (predicate(value, index, list)) results.push(value);\n });\n return results;\n }\n\n // Return all the elements for which a truth test fails.\n function reject(obj, predicate, context) {\n return filter(obj, negate(cb(predicate)), context);\n }\n\n // Determine whether all of the elements pass a truth test.\n function every(obj, predicate, context) {\n predicate = cb(predicate, context);\n var _keys = !isArrayLike(obj) && keys(obj),\n length = (_keys || obj).length;\n for (var index = 0; index < length; index++) {\n var currentKey = _keys ? _keys[index] : index;\n if (!predicate(obj[currentKey], currentKey, obj)) return false;\n }\n return true;\n }\n\n // Determine if at least one element in the object passes a truth test.\n function some(obj, predicate, context) {\n predicate = cb(predicate, context);\n var _keys = !isArrayLike(obj) && keys(obj),\n length = (_keys || obj).length;\n for (var index = 0; index < length; index++) {\n var currentKey = _keys ? _keys[index] : index;\n if (predicate(obj[currentKey], currentKey, obj)) return true;\n }\n return false;\n }\n\n // Determine if the array or object contains a given item (using `===`).\n function contains(obj, item, fromIndex, guard) {\n if (!isArrayLike(obj)) obj = values(obj);\n if (typeof fromIndex != 'number' || guard) fromIndex = 0;\n return indexOf(obj, item, fromIndex) >= 0;\n }\n\n // Invoke a method (with arguments) on every item in a collection.\n var invoke = restArguments(function(obj, path, args) {\n var contextPath, func;\n if (isFunction$1(path)) {\n func = path;\n } else {\n path = toPath(path);\n contextPath = path.slice(0, -1);\n path = path[path.length - 1];\n }\n return map(obj, function(context) {\n var method = func;\n if (!method) {\n if (contextPath && contextPath.length) {\n context = deepGet(context, contextPath);\n }\n if (context == null) return void 0;\n method = context[path];\n }\n return method == null ? method : method.apply(context, args);\n });\n });\n\n // Convenience version of a common use case of `_.map`: fetching a property.\n function pluck(obj, key) {\n return map(obj, property(key));\n }\n\n // Convenience version of a common use case of `_.filter`: selecting only\n // objects containing specific `key:value` pairs.\n function where(obj, attrs) {\n return filter(obj, matcher(attrs));\n }\n\n // Return the maximum element (or element-based computation).\n function max(obj, iteratee, context) {\n var result = -Infinity, lastComputed = -Infinity,\n value, computed;\n if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) {\n obj = isArrayLike(obj) ? obj : values(obj);\n for (var i = 0, length = obj.length; i < length; i++) {\n value = obj[i];\n if (value != null && value > result) {\n result = value;\n }\n }\n } else {\n iteratee = cb(iteratee, context);\n each(obj, function(v, index, list) {\n computed = iteratee(v, index, list);\n if (computed > lastComputed || (computed === -Infinity && result === -Infinity)) {\n result = v;\n lastComputed = computed;\n }\n });\n }\n return result;\n }\n\n // Return the minimum element (or element-based computation).\n function min(obj, iteratee, context) {\n var result = Infinity, lastComputed = Infinity,\n value, computed;\n if (iteratee == null || (typeof iteratee == 'number' && typeof obj[0] != 'object' && obj != null)) {\n obj = isArrayLike(obj) ? obj : values(obj);\n for (var i = 0, length = obj.length; i < length; i++) {\n value = obj[i];\n if (value != null && value < result) {\n result = value;\n }\n }\n } else {\n iteratee = cb(iteratee, context);\n each(obj, function(v, index, list) {\n computed = iteratee(v, index, list);\n if (computed < lastComputed || (computed === Infinity && result === Infinity)) {\n result = v;\n lastComputed = computed;\n }\n });\n }\n return result;\n }\n\n // Safely create a real, live array from anything iterable.\n var reStrSymbol = /[^\\ud800-\\udfff]|[\\ud800-\\udbff][\\udc00-\\udfff]|[\\ud800-\\udfff]/g;\n function toArray(obj) {\n if (!obj) return [];\n if (isArray(obj)) return slice.call(obj);\n if (isString(obj)) {\n // Keep surrogate pair characters together.\n return obj.match(reStrSymbol);\n }\n if (isArrayLike(obj)) return map(obj, identity);\n return values(obj);\n }\n\n // Sample **n** random values from a collection using the modern version of the\n // [Fisher-Yates shuffle](https://en.wikipedia.org/wiki/Fisher–Yates_shuffle).\n // If **n** is not specified, returns a single random element.\n // The internal `guard` argument allows it to work with `_.map`.\n function sample(obj, n, guard) {\n if (n == null || guard) {\n if (!isArrayLike(obj)) obj = values(obj);\n return obj[random(obj.length - 1)];\n }\n var sample = toArray(obj);\n var length = getLength(sample);\n n = Math.max(Math.min(n, length), 0);\n var last = length - 1;\n for (var index = 0; index < n; index++) {\n var rand = random(index, last);\n var temp = sample[index];\n sample[index] = sample[rand];\n sample[rand] = temp;\n }\n return sample.slice(0, n);\n }\n\n // Shuffle a collection.\n function shuffle(obj) {\n return sample(obj, Infinity);\n }\n\n // Sort the object's values by a criterion produced by an iteratee.\n function sortBy(obj, iteratee, context) {\n var index = 0;\n iteratee = cb(iteratee, context);\n return pluck(map(obj, function(value, key, list) {\n return {\n value: value,\n index: index++,\n criteria: iteratee(value, key, list)\n };\n }).sort(function(left, right) {\n var a = left.criteria;\n var b = right.criteria;\n if (a !== b) {\n if (a > b || a === void 0) return 1;\n if (a < b || b === void 0) return -1;\n }\n return left.index - right.index;\n }), 'value');\n }\n\n // An internal function used for aggregate \"group by\" operations.\n function group(behavior, partition) {\n return function(obj, iteratee, context) {\n var result = partition ? [[], []] : {};\n iteratee = cb(iteratee, context);\n each(obj, function(value, index) {\n var key = iteratee(value, index, obj);\n behavior(result, value, key);\n });\n return result;\n };\n }\n\n // Groups the object's values by a criterion. Pass either a string attribute\n // to group by, or a function that returns the criterion.\n var groupBy = group(function(result, value, key) {\n if (has$1(result, key)) result[key].push(value); else result[key] = [value];\n });\n\n // Indexes the object's values by a criterion, similar to `_.groupBy`, but for\n // when you know that your index values will be unique.\n var indexBy = group(function(result, value, key) {\n result[key] = value;\n });\n\n // Counts instances of an object that group by a certain criterion. Pass\n // either a string attribute to count by, or a function that returns the\n // criterion.\n var countBy = group(function(result, value, key) {\n if (has$1(result, key)) result[key]++; else result[key] = 1;\n });\n\n // Split a collection into two arrays: one whose elements all pass the given\n // truth test, and one whose elements all do not pass the truth test.\n var partition = group(function(result, value, pass) {\n result[pass ? 0 : 1].push(value);\n }, true);\n\n // Return the number of elements in a collection.\n function size(obj) {\n if (obj == null) return 0;\n return isArrayLike(obj) ? obj.length : keys(obj).length;\n }\n\n // Internal `_.pick` helper function to determine whether `key` is an enumerable\n // property name of `obj`.\n function keyInObj(value, key, obj) {\n return key in obj;\n }\n\n // Return a copy of the object only containing the allowed properties.\n var pick = restArguments(function(obj, keys) {\n var result = {}, iteratee = keys[0];\n if (obj == null) return result;\n if (isFunction$1(iteratee)) {\n if (keys.length > 1) iteratee = optimizeCb(iteratee, keys[1]);\n keys = allKeys(obj);\n } else {\n iteratee = keyInObj;\n keys = flatten$1(keys, false, false);\n obj = Object(obj);\n }\n for (var i = 0, length = keys.length; i < length; i++) {\n var key = keys[i];\n var value = obj[key];\n if (iteratee(value, key, obj)) result[key] = value;\n }\n return result;\n });\n\n // Return a copy of the object without the disallowed properties.\n var omit = restArguments(function(obj, keys) {\n var iteratee = keys[0], context;\n if (isFunction$1(iteratee)) {\n iteratee = negate(iteratee);\n if (keys.length > 1) context = keys[1];\n } else {\n keys = map(flatten$1(keys, false, false), String);\n iteratee = function(value, key) {\n return !contains(keys, key);\n };\n }\n return pick(obj, iteratee, context);\n });\n\n // Returns everything but the last entry of the array. Especially useful on\n // the arguments object. Passing **n** will return all the values in\n // the array, excluding the last N.\n function initial(array, n, guard) {\n return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n)));\n }\n\n // Get the first element of an array. Passing **n** will return the first N\n // values in the array. The **guard** check allows it to work with `_.map`.\n function first(array, n, guard) {\n if (array == null || array.length < 1) return n == null || guard ? void 0 : [];\n if (n == null || guard) return array[0];\n return initial(array, array.length - n);\n }\n\n // Returns everything but the first entry of the `array`. Especially useful on\n // the `arguments` object. Passing an **n** will return the rest N values in the\n // `array`.\n function rest(array, n, guard) {\n return slice.call(array, n == null || guard ? 1 : n);\n }\n\n // Get the last element of an array. Passing **n** will return the last N\n // values in the array.\n function last(array, n, guard) {\n if (array == null || array.length < 1) return n == null || guard ? void 0 : [];\n if (n == null || guard) return array[array.length - 1];\n return rest(array, Math.max(0, array.length - n));\n }\n\n // Trim out all falsy values from an array.\n function compact(array) {\n return filter(array, Boolean);\n }\n\n // Flatten out an array, either recursively (by default), or up to `depth`.\n // Passing `true` or `false` as `depth` means `1` or `Infinity`, respectively.\n function flatten(array, depth) {\n return flatten$1(array, depth, false);\n }\n\n // Take the difference between one array and a number of other arrays.\n // Only the elements present in just the first array will remain.\n var difference = restArguments(function(array, rest) {\n rest = flatten$1(rest, true, true);\n return filter(array, function(value){\n return !contains(rest, value);\n });\n });\n\n // Return a version of the array that does not contain the specified value(s).\n var without = restArguments(function(array, otherArrays) {\n return difference(array, otherArrays);\n });\n\n // Produce a duplicate-free version of the array. If the array has already\n // been sorted, you have the option of using a faster algorithm.\n // The faster algorithm will not work with an iteratee if the iteratee\n // is not a one-to-one function, so providing an iteratee will disable\n // the faster algorithm.\n function uniq(array, isSorted, iteratee, context) {\n if (!isBoolean(isSorted)) {\n context = iteratee;\n iteratee = isSorted;\n isSorted = false;\n }\n if (iteratee != null) iteratee = cb(iteratee, context);\n var result = [];\n var seen = [];\n for (var i = 0, length = getLength(array); i < length; i++) {\n var value = array[i],\n computed = iteratee ? iteratee(value, i, array) : value;\n if (isSorted && !iteratee) {\n if (!i || seen !== computed) result.push(value);\n seen = computed;\n } else if (iteratee) {\n if (!contains(seen, computed)) {\n seen.push(computed);\n result.push(value);\n }\n } else if (!contains(result, value)) {\n result.push(value);\n }\n }\n return result;\n }\n\n // Produce an array that contains the union: each distinct element from all of\n // the passed-in arrays.\n var union = restArguments(function(arrays) {\n return uniq(flatten$1(arrays, true, true));\n });\n\n // Produce an array that contains every item shared between all the\n // passed-in arrays.\n function intersection(array) {\n var result = [];\n var argsLength = arguments.length;\n for (var i = 0, length = getLength(array); i < length; i++) {\n var item = array[i];\n if (contains(result, item)) continue;\n var j;\n for (j = 1; j < argsLength; j++) {\n if (!contains(arguments[j], item)) break;\n }\n if (j === argsLength) result.push(item);\n }\n return result;\n }\n\n // Complement of zip. Unzip accepts an array of arrays and groups\n // each array's elements on shared indices.\n function unzip(array) {\n var length = (array && max(array, getLength).length) || 0;\n var result = Array(length);\n\n for (var index = 0; index < length; index++) {\n result[index] = pluck(array, index);\n }\n return result;\n }\n\n // Zip together multiple lists into a single array -- elements that share\n // an index go together.\n var zip = restArguments(unzip);\n\n // Converts lists into objects. Pass either a single array of `[key, value]`\n // pairs, or two parallel arrays of the same length -- one of keys, and one of\n // the corresponding values. Passing by pairs is the reverse of `_.pairs`.\n function object(list, values) {\n var result = {};\n for (var i = 0, length = getLength(list); i < length; i++) {\n if (values) {\n result[list[i]] = values[i];\n } else {\n result[list[i][0]] = list[i][1];\n }\n }\n return result;\n }\n\n // Generate an integer Array containing an arithmetic progression. A port of\n // the native Python `range()` function. See\n // [the Python documentation](https://docs.python.org/library/functions.html#range).\n function range(start, stop, step) {\n if (stop == null) {\n stop = start || 0;\n start = 0;\n }\n if (!step) {\n step = stop < start ? -1 : 1;\n }\n\n var length = Math.max(Math.ceil((stop - start) / step), 0);\n var range = Array(length);\n\n for (var idx = 0; idx < length; idx++, start += step) {\n range[idx] = start;\n }\n\n return range;\n }\n\n // Chunk a single array into multiple arrays, each containing `count` or fewer\n // items.\n function chunk(array, count) {\n if (count == null || count < 1) return [];\n var result = [];\n var i = 0, length = array.length;\n while (i < length) {\n result.push(slice.call(array, i, i += count));\n }\n return result;\n }\n\n // Helper function to continue chaining intermediate results.\n function chainResult(instance, obj) {\n return instance._chain ? _$1(obj).chain() : obj;\n }\n\n // Add your own custom functions to the Underscore object.\n function mixin(obj) {\n each(functions(obj), function(name) {\n var func = _$1[name] = obj[name];\n _$1.prototype[name] = function() {\n var args = [this._wrapped];\n push.apply(args, arguments);\n return chainResult(this, func.apply(_$1, args));\n };\n });\n return _$1;\n }\n\n // Add all mutator `Array` functions to the wrapper.\n each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) {\n var method = ArrayProto[name];\n _$1.prototype[name] = function() {\n var obj = this._wrapped;\n if (obj != null) {\n method.apply(obj, arguments);\n if ((name === 'shift' || name === 'splice') && obj.length === 0) {\n delete obj[0];\n }\n }\n return chainResult(this, obj);\n };\n });\n\n // Add all accessor `Array` functions to the wrapper.\n each(['concat', 'join', 'slice'], function(name) {\n var method = ArrayProto[name];\n _$1.prototype[name] = function() {\n var obj = this._wrapped;\n if (obj != null) obj = method.apply(obj, arguments);\n return chainResult(this, obj);\n };\n });\n\n // Named Exports\n\n var allExports = {\n __proto__: null,\n VERSION: VERSION,\n restArguments: restArguments,\n isObject: isObject,\n isNull: isNull,\n isUndefined: isUndefined,\n isBoolean: isBoolean,\n isElement: isElement,\n isString: isString,\n isNumber: isNumber,\n isDate: isDate,\n isRegExp: isRegExp,\n isError: isError,\n isSymbol: isSymbol,\n isArrayBuffer: isArrayBuffer,\n isDataView: isDataView$1,\n isArray: isArray,\n isFunction: isFunction$1,\n isArguments: isArguments$1,\n isFinite: isFinite$1,\n isNaN: isNaN$1,\n isTypedArray: isTypedArray$1,\n isEmpty: isEmpty,\n isMatch: isMatch,\n isEqual: isEqual,\n isMap: isMap,\n isWeakMap: isWeakMap,\n isSet: isSet,\n isWeakSet: isWeakSet,\n keys: keys,\n allKeys: allKeys,\n values: values,\n pairs: pairs,\n invert: invert,\n functions: functions,\n methods: functions,\n extend: extend,\n extendOwn: extendOwn,\n assign: extendOwn,\n defaults: defaults,\n create: create,\n clone: clone,\n tap: tap,\n get: get,\n has: has,\n mapObject: mapObject,\n identity: identity,\n constant: constant,\n noop: noop,\n toPath: toPath$1,\n property: property,\n propertyOf: propertyOf,\n matcher: matcher,\n matches: matcher,\n times: times,\n random: random,\n now: now,\n escape: _escape,\n unescape: _unescape,\n templateSettings: templateSettings,\n template: template,\n result: result,\n uniqueId: uniqueId,\n chain: chain,\n iteratee: iteratee,\n partial: partial,\n bind: bind,\n bindAll: bindAll,\n memoize: memoize,\n delay: delay,\n defer: defer,\n throttle: throttle,\n debounce: debounce,\n wrap: wrap,\n negate: negate,\n compose: compose,\n after: after,\n before: before,\n once: once,\n findKey: findKey,\n findIndex: findIndex,\n findLastIndex: findLastIndex,\n sortedIndex: sortedIndex,\n indexOf: indexOf,\n lastIndexOf: lastIndexOf,\n find: find,\n detect: find,\n findWhere: findWhere,\n each: each,\n forEach: each,\n map: map,\n collect: map,\n reduce: reduce,\n foldl: reduce,\n inject: reduce,\n reduceRight: reduceRight,\n foldr: reduceRight,\n filter: filter,\n select: filter,\n reject: reject,\n every: every,\n all: every,\n some: some,\n any: some,\n contains: contains,\n includes: contains,\n include: contains,\n invoke: invoke,\n pluck: pluck,\n where: where,\n max: max,\n min: min,\n shuffle: shuffle,\n sample: sample,\n sortBy: sortBy,\n groupBy: groupBy,\n indexBy: indexBy,\n countBy: countBy,\n partition: partition,\n toArray: toArray,\n size: size,\n pick: pick,\n omit: omit,\n first: first,\n head: first,\n take: first,\n initial: initial,\n last: last,\n rest: rest,\n tail: rest,\n drop: rest,\n compact: compact,\n flatten: flatten,\n without: without,\n uniq: uniq,\n unique: uniq,\n union: union,\n intersection: intersection,\n difference: difference,\n unzip: unzip,\n transpose: unzip,\n zip: zip,\n object: object,\n range: range,\n chunk: chunk,\n mixin: mixin,\n 'default': _$1\n };\n\n // Default Export\n\n // Add all of the Underscore functions to the wrapper object.\n var _ = mixin(allExports);\n // Legacy Node.js API.\n _._ = _;\n\n return _;\n\n})));\n//# sourceMappingURL=underscore-umd.js.map\n","(function (name, context, definition) {\n if (typeof module !== 'undefined' && module.exports) module.exports = definition();\n else if (typeof define === 'function' && define.amd) define(definition);\n else context[name] = definition();\n})('urljoin', this, function () {\n\n function startsWith(str, searchString) {\n return str.substr(0, searchString.length) === searchString;\n }\n\n function normalize (strArray, options) {\n var resultArray = [];\n \n // If the first part is a plain protocol, we combine it with the next part.\n if (strArray[0].match(/^[^/:]+:\\/*$/) && strArray.length > 1) {\n var first = strArray.shift();\n strArray[0] = first + strArray[0];\n }\n\n // There must be two or three slashes in the file protocol, two slashes in anything else.\n if (strArray[0].match(/^file:\\/\\/\\//)) {\n strArray[0] = strArray[0].replace(/^([^/:]+):\\/*/, '$1:///');\n } else {\n strArray[0] = strArray[0].replace(/^([^/:]+):\\/*/, '$1://');\n }\n \n for (var i = 0; i < strArray.length; i++) {\n \n var component = strArray[i];\n\n if (typeof component !== 'string') {\n component = component && component.toString() || '';\n }\n\n if (i > 0) {\n // Removing the starting slashes for each component but the first.\n component = component.replace(/^[\\/]+/, '');\n }\n if (i < strArray.length - 1) {\n // Removing the ending slashes for each component but the last.\n component = component.replace(/[\\/]+$/, '');\n } else {\n // For the last component we will combine multiple slashes to a single one.\n component = component.replace(/[\\/]+$/, '/');\n }\n \n resultArray.push(component);\n \n }\n\n var str = resultArray.join('/');\n // Each input component is now separated by a single slash except the possible first plain protocol part.\n\n // remove trailing slash before parameters or hash\n str = str.replace(/\\/(\\?|&|#[^!])/g, '$1');\n\n // replace ? in parameters with &\n var parts = str.split('?');\n str = parts.shift() + (parts.length > 0 ? '?': '') + parts.join('&');\n\n return str;\n }\n\n return function () {\n var input = arguments;\n var options = {};\n\n if (typeof arguments[0] === 'object') {\n // new syntax with array and options\n input = arguments[0];\n options = arguments[1] || {};\n }\n \n return normalize([].slice.call(input), options);\n };\n\n});\n","module.exports = function isBuffer(arg) {\n return arg && typeof arg === 'object'\n && typeof arg.copy === 'function'\n && typeof arg.fill === 'function'\n && typeof arg.readUInt8 === 'function';\n}","// Copyright Joyent, Inc. and other Node contributors.\n//\n// Permission is hereby granted, free of charge, to any person obtaining a\n// copy of this software and associated documentation files (the\n// \"Software\"), to deal in the Software without restriction, including\n// without limitation the rights to use, copy, modify, merge, publish,\n// distribute, sublicense, and/or sell copies of the Software, and to permit\n// persons to whom the Software is furnished to do so, subject to the\n// following conditions:\n//\n// The above copyright notice and this permission notice shall be included\n// in all copies or substantial portions of the Software.\n//\n// THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS\n// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF\n// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN\n// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,\n// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR\n// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE\n// USE OR OTHER DEALINGS IN THE SOFTWARE.\n\nvar formatRegExp = /%[sdj%]/g;\nexports.format = function(f) {\n if (!isString(f)) {\n var objects = [];\n for (var i = 0; i < arguments.length; i++) {\n objects.push(inspect(arguments[i]));\n }\n return objects.join(' ');\n }\n\n var i = 1;\n var args = arguments;\n var len = args.length;\n var str = String(f).replace(formatRegExp, function(x) {\n if (x === '%%') return '%';\n if (i >= len) return x;\n switch (x) {\n case '%s': return String(args[i++]);\n case '%d': return Number(args[i++]);\n case '%j':\n try {\n return JSON.stringify(args[i++]);\n } catch (_) {\n return '[Circular]';\n }\n default:\n return x;\n }\n });\n for (var x = args[i]; i < len; x = args[++i]) {\n if (isNull(x) || !isObject(x)) {\n str += ' ' + x;\n } else {\n str += ' ' + inspect(x);\n }\n }\n return str;\n};\n\n\n// Mark that a method should not be used.\n// Returns a modified function which warns once by default.\n// If --no-deprecation is set, then it is a no-op.\nexports.deprecate = function(fn, msg) {\n // Allow for deprecating things in the process of starting up.\n if (isUndefined(global.process)) {\n return function() {\n return exports.deprecate(fn, msg).apply(this, arguments);\n };\n }\n\n if (process.noDeprecation === true) {\n return fn;\n }\n\n var warned = false;\n function deprecated() {\n if (!warned) {\n if (process.throwDeprecation) {\n throw new Error(msg);\n } else if (process.traceDeprecation) {\n console.trace(msg);\n } else {\n console.error(msg);\n }\n warned = true;\n }\n return fn.apply(this, arguments);\n }\n\n return deprecated;\n};\n\n\nvar debugs = {};\nvar debugEnviron;\nexports.debuglog = function(set) {\n if (isUndefined(debugEnviron))\n debugEnviron = process.env.NODE_DEBUG || '';\n set = set.toUpperCase();\n if (!debugs[set]) {\n if (new RegExp('\\\\b' + set + '\\\\b', 'i').test(debugEnviron)) {\n var pid = process.pid;\n debugs[set] = function() {\n var msg = exports.format.apply(exports, arguments);\n console.error('%s %d: %s', set, pid, msg);\n };\n } else {\n debugs[set] = function() {};\n }\n }\n return debugs[set];\n};\n\n\n/**\n * Echos the value of a value. Trys to print the value out\n * in the best way possible given the different types.\n *\n * @param {Object} obj The object to print out.\n * @param {Object} opts Optional options object that alters the output.\n */\n/* legacy: obj, showHidden, depth, colors*/\nfunction inspect(obj, opts) {\n // default options\n var ctx = {\n seen: [],\n stylize: stylizeNoColor\n };\n // legacy...\n if (arguments.length >= 3) ctx.depth = arguments[2];\n if (arguments.length >= 4) ctx.colors = arguments[3];\n if (isBoolean(opts)) {\n // legacy...\n ctx.showHidden = opts;\n } else if (opts) {\n // got an \"options\" object\n exports._extend(ctx, opts);\n }\n // set default options\n if (isUndefined(ctx.showHidden)) ctx.showHidden = false;\n if (isUndefined(ctx.depth)) ctx.depth = 2;\n if (isUndefined(ctx.colors)) ctx.colors = false;\n if (isUndefined(ctx.customInspect)) ctx.customInspect = true;\n if (ctx.colors) ctx.stylize = stylizeWithColor;\n return formatValue(ctx, obj, ctx.depth);\n}\nexports.inspect = inspect;\n\n\n// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics\ninspect.colors = {\n 'bold' : [1, 22],\n 'italic' : [3, 23],\n 'underline' : [4, 24],\n 'inverse' : [7, 27],\n 'white' : [37, 39],\n 'grey' : [90, 39],\n 'black' : [30, 39],\n 'blue' : [34, 39],\n 'cyan' : [36, 39],\n 'green' : [32, 39],\n 'magenta' : [35, 39],\n 'red' : [31, 39],\n 'yellow' : [33, 39]\n};\n\n// Don't use 'blue' not visible on cmd.exe\ninspect.styles = {\n 'special': 'cyan',\n 'number': 'yellow',\n 'boolean': 'yellow',\n 'undefined': 'grey',\n 'null': 'bold',\n 'string': 'green',\n 'date': 'magenta',\n // \"name\": intentionally not styling\n 'regexp': 'red'\n};\n\n\nfunction stylizeWithColor(str, styleType) {\n var style = inspect.styles[styleType];\n\n if (style) {\n return '\\u001b[' + inspect.colors[style][0] + 'm' + str +\n '\\u001b[' + inspect.colors[style][1] + 'm';\n } else {\n return str;\n }\n}\n\n\nfunction stylizeNoColor(str, styleType) {\n return str;\n}\n\n\nfunction arrayToHash(array) {\n var hash = {};\n\n array.forEach(function(val, idx) {\n hash[val] = true;\n });\n\n return hash;\n}\n\n\nfunction formatValue(ctx, value, recurseTimes) {\n // Provide a hook for user-specified inspect functions.\n // Check that value is an object with an inspect function on it\n if (ctx.customInspect &&\n value &&\n isFunction(value.inspect) &&\n // Filter out the util module, it's inspect function is special\n value.inspect !== exports.inspect &&\n // Also filter out any prototype objects using the circular check.\n !(value.constructor && value.constructor.prototype === value)) {\n var ret = value.inspect(recurseTimes, ctx);\n if (!isString(ret)) {\n ret = formatValue(ctx, ret, recurseTimes);\n }\n return ret;\n }\n\n // Primitive types cannot have properties\n var primitive = formatPrimitive(ctx, value);\n if (primitive) {\n return primitive;\n }\n\n // Look up the keys of the object.\n var keys = Object.keys(value);\n var visibleKeys = arrayToHash(keys);\n\n if (ctx.showHidden) {\n keys = Object.getOwnPropertyNames(value);\n }\n\n // IE doesn't make error fields non-enumerable\n // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx\n if (isError(value)\n && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {\n return formatError(value);\n }\n\n // Some type of object without properties can be shortcutted.\n if (keys.length === 0) {\n if (isFunction(value)) {\n var name = value.name ? ': ' + value.name : '';\n return ctx.stylize('[Function' + name + ']', 'special');\n }\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n }\n if (isDate(value)) {\n return ctx.stylize(Date.prototype.toString.call(value), 'date');\n }\n if (isError(value)) {\n return formatError(value);\n }\n }\n\n var base = '', array = false, braces = ['{', '}'];\n\n // Make Array say that they are Array\n if (isArray(value)) {\n array = true;\n braces = ['[', ']'];\n }\n\n // Make functions say that they are functions\n if (isFunction(value)) {\n var n = value.name ? ': ' + value.name : '';\n base = ' [Function' + n + ']';\n }\n\n // Make RegExps say that they are RegExps\n if (isRegExp(value)) {\n base = ' ' + RegExp.prototype.toString.call(value);\n }\n\n // Make dates with properties first say the date\n if (isDate(value)) {\n base = ' ' + Date.prototype.toUTCString.call(value);\n }\n\n // Make error with message first say the error\n if (isError(value)) {\n base = ' ' + formatError(value);\n }\n\n if (keys.length === 0 && (!array || value.length == 0)) {\n return braces[0] + base + braces[1];\n }\n\n if (recurseTimes < 0) {\n if (isRegExp(value)) {\n return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');\n } else {\n return ctx.stylize('[Object]', 'special');\n }\n }\n\n ctx.seen.push(value);\n\n var output;\n if (array) {\n output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);\n } else {\n output = keys.map(function(key) {\n return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);\n });\n }\n\n ctx.seen.pop();\n\n return reduceToSingleString(output, base, braces);\n}\n\n\nfunction formatPrimitive(ctx, value) {\n if (isUndefined(value))\n return ctx.stylize('undefined', 'undefined');\n if (isString(value)) {\n var simple = '\\'' + JSON.stringify(value).replace(/^\"|\"$/g, '')\n .replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"') + '\\'';\n return ctx.stylize(simple, 'string');\n }\n if (isNumber(value))\n return ctx.stylize('' + value, 'number');\n if (isBoolean(value))\n return ctx.stylize('' + value, 'boolean');\n // For some reason typeof null is \"object\", so special case here.\n if (isNull(value))\n return ctx.stylize('null', 'null');\n}\n\n\nfunction formatError(value) {\n return '[' + Error.prototype.toString.call(value) + ']';\n}\n\n\nfunction formatArray(ctx, value, recurseTimes, visibleKeys, keys) {\n var output = [];\n for (var i = 0, l = value.length; i < l; ++i) {\n if (hasOwnProperty(value, String(i))) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n String(i), true));\n } else {\n output.push('');\n }\n }\n keys.forEach(function(key) {\n if (!key.match(/^\\d+$/)) {\n output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,\n key, true));\n }\n });\n return output;\n}\n\n\nfunction formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {\n var name, str, desc;\n desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };\n if (desc.get) {\n if (desc.set) {\n str = ctx.stylize('[Getter/Setter]', 'special');\n } else {\n str = ctx.stylize('[Getter]', 'special');\n }\n } else {\n if (desc.set) {\n str = ctx.stylize('[Setter]', 'special');\n }\n }\n if (!hasOwnProperty(visibleKeys, key)) {\n name = '[' + key + ']';\n }\n if (!str) {\n if (ctx.seen.indexOf(desc.value) < 0) {\n if (isNull(recurseTimes)) {\n str = formatValue(ctx, desc.value, null);\n } else {\n str = formatValue(ctx, desc.value, recurseTimes - 1);\n }\n if (str.indexOf('\\n') > -1) {\n if (array) {\n str = str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n').substr(2);\n } else {\n str = '\\n' + str.split('\\n').map(function(line) {\n return ' ' + line;\n }).join('\\n');\n }\n }\n } else {\n str = ctx.stylize('[Circular]', 'special');\n }\n }\n if (isUndefined(name)) {\n if (array && key.match(/^\\d+$/)) {\n return str;\n }\n name = JSON.stringify('' + key);\n if (name.match(/^\"([a-zA-Z_][a-zA-Z_0-9]*)\"$/)) {\n name = name.substr(1, name.length - 2);\n name = ctx.stylize(name, 'name');\n } else {\n name = name.replace(/'/g, \"\\\\'\")\n .replace(/\\\\\"/g, '\"')\n .replace(/(^\"|\"$)/g, \"'\");\n name = ctx.stylize(name, 'string');\n }\n }\n\n return name + ': ' + str;\n}\n\n\nfunction reduceToSingleString(output, base, braces) {\n var numLinesEst = 0;\n var length = output.reduce(function(prev, cur) {\n numLinesEst++;\n if (cur.indexOf('\\n') >= 0) numLinesEst++;\n return prev + cur.replace(/\\u001b\\[\\d\\d?m/g, '').length + 1;\n }, 0);\n\n if (length > 60) {\n return braces[0] +\n (base === '' ? '' : base + '\\n ') +\n ' ' +\n output.join(',\\n ') +\n ' ' +\n braces[1];\n }\n\n return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];\n}\n\n\n// NOTE: These type checking functions intentionally don't use `instanceof`\n// because it is fragile and can be easily faked with `Object.create()`.\nfunction isArray(ar) {\n return Array.isArray(ar);\n}\nexports.isArray = isArray;\n\nfunction isBoolean(arg) {\n return typeof arg === 'boolean';\n}\nexports.isBoolean = isBoolean;\n\nfunction isNull(arg) {\n return arg === null;\n}\nexports.isNull = isNull;\n\nfunction isNullOrUndefined(arg) {\n return arg == null;\n}\nexports.isNullOrUndefined = isNullOrUndefined;\n\nfunction isNumber(arg) {\n return typeof arg === 'number';\n}\nexports.isNumber = isNumber;\n\nfunction isString(arg) {\n return typeof arg === 'string';\n}\nexports.isString = isString;\n\nfunction isSymbol(arg) {\n return typeof arg === 'symbol';\n}\nexports.isSymbol = isSymbol;\n\nfunction isUndefined(arg) {\n return arg === void 0;\n}\nexports.isUndefined = isUndefined;\n\nfunction isRegExp(re) {\n return isObject(re) && objectToString(re) === '[object RegExp]';\n}\nexports.isRegExp = isRegExp;\n\nfunction isObject(arg) {\n return typeof arg === 'object' && arg !== null;\n}\nexports.isObject = isObject;\n\nfunction isDate(d) {\n return isObject(d) && objectToString(d) === '[object Date]';\n}\nexports.isDate = isDate;\n\nfunction isError(e) {\n return isObject(e) &&\n (objectToString(e) === '[object Error]' || e instanceof Error);\n}\nexports.isError = isError;\n\nfunction isFunction(arg) {\n return typeof arg === 'function';\n}\nexports.isFunction = isFunction;\n\nfunction isPrimitive(arg) {\n return arg === null ||\n typeof arg === 'boolean' ||\n typeof arg === 'number' ||\n typeof arg === 'string' ||\n typeof arg === 'symbol' || // ES6 symbol\n typeof arg === 'undefined';\n}\nexports.isPrimitive = isPrimitive;\n\nexports.isBuffer = require('./support/isBuffer');\n\nfunction objectToString(o) {\n return Object.prototype.toString.call(o);\n}\n\n\nfunction pad(n) {\n return n < 10 ? '0' + n.toString(10) : n.toString(10);\n}\n\n\nvar months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',\n 'Oct', 'Nov', 'Dec'];\n\n// 26 Feb 16:19:34\nfunction timestamp() {\n var d = new Date();\n var time = [pad(d.getHours()),\n pad(d.getMinutes()),\n pad(d.getSeconds())].join(':');\n return [d.getDate(), months[d.getMonth()], time].join(' ');\n}\n\n\n// log is just a thin wrapper to console.log that prepends a timestamp\nexports.log = function() {\n console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));\n};\n\n\n/**\n * Inherit the prototype methods from one constructor into another.\n *\n * The Function.prototype.inherits from lang.js rewritten as a standalone\n * function (not on Function.prototype). NOTE: If this file is to be loaded\n * during bootstrapping this function needs to be rewritten using some native\n * functions as prototype setup using normal JavaScript does not work as\n * expected during bootstrapping (see mirror.js in r114903).\n *\n * @param {function} ctor Constructor function which needs to inherit the\n * prototype.\n * @param {function} superCtor Constructor function to inherit prototype from.\n */\nexports.inherits = require('inherits');\n\nexports._extend = function(origin, add) {\n // Don't do anything if add isn't an object\n if (!add || !isObject(add)) return origin;\n\n var keys = Object.keys(add);\n var i = keys.length;\n while (i--) {\n origin[keys[i]] = add[keys[i]];\n }\n return origin;\n};\n\nfunction hasOwnProperty(obj, prop) {\n return Object.prototype.hasOwnProperty.call(obj, prop);\n}\n","require('../../modules/core.regexp.escape');\nmodule.exports = require('../../modules/_core').RegExp.escape;\n","module.exports = function (it) {\n if (typeof it != 'function') throw TypeError(it + ' is not a function!');\n return it;\n};\n","var cof = require('./_cof');\nmodule.exports = function (it, msg) {\n if (typeof it != 'number' && cof(it) != 'Number') throw TypeError(msg);\n return +it;\n};\n","// 22.1.3.31 Array.prototype[@@unscopables]\nvar UNSCOPABLES = require('./_wks')('unscopables');\nvar ArrayProto = Array.prototype;\nif (ArrayProto[UNSCOPABLES] == undefined) require('./_hide')(ArrayProto, UNSCOPABLES, {});\nmodule.exports = function (key) {\n ArrayProto[UNSCOPABLES][key] = true;\n};\n","'use strict';\nvar at = require('./_string-at')(true);\n\n // `AdvanceStringIndex` abstract operation\n// https://tc39.github.io/ecma262/#sec-advancestringindex\nmodule.exports = function (S, index, unicode) {\n return index + (unicode ? at(S, index).length : 1);\n};\n","module.exports = function (it, Constructor, name, forbiddenField) {\n if (!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)) {\n throw TypeError(name + ': incorrect invocation!');\n } return it;\n};\n","var isObject = require('./_is-object');\nmodule.exports = function (it) {\n if (!isObject(it)) throw TypeError(it + ' is not an object!');\n return it;\n};\n","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\n\nmodule.exports = [].copyWithin || function copyWithin(target /* = 0 */, start /* = 0, end = @length */) {\n var O = toObject(this);\n var len = toLength(O.length);\n var to = toAbsoluteIndex(target, len);\n var from = toAbsoluteIndex(start, len);\n var end = arguments.length > 2 ? arguments[2] : undefined;\n var count = Math.min((end === undefined ? len : toAbsoluteIndex(end, len)) - from, len - to);\n var inc = 1;\n if (from < to && to < from + count) {\n inc = -1;\n from += count - 1;\n to += count - 1;\n }\n while (count-- > 0) {\n if (from in O) O[to] = O[from];\n else delete O[to];\n to += inc;\n from += inc;\n } return O;\n};\n","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n var O = toObject(this);\n var length = toLength(O.length);\n var aLen = arguments.length;\n var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);\n var end = aLen > 2 ? arguments[2] : undefined;\n var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n while (endPos > index) O[index++] = value;\n return O;\n};\n","var forOf = require('./_for-of');\n\nmodule.exports = function (iter, ITERATOR) {\n var result = [];\n forOf(iter, false, result.push, result, ITERATOR);\n return result;\n};\n","// false -> Array#indexOf\n// true -> Array#includes\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nmodule.exports = function (IS_INCLUDES) {\n return function ($this, el, fromIndex) {\n var O = toIObject($this);\n var length = toLength(O.length);\n var index = toAbsoluteIndex(fromIndex, length);\n var value;\n // Array#includes uses SameValueZero equality algorithm\n // eslint-disable-next-line no-self-compare\n if (IS_INCLUDES && el != el) while (length > index) {\n value = O[index++];\n // eslint-disable-next-line no-self-compare\n if (value != value) return true;\n // Array#indexOf ignores holes, Array#includes - not\n } else for (;length > index; index++) if (IS_INCLUDES || index in O) {\n if (O[index] === el) return IS_INCLUDES || index || 0;\n } return !IS_INCLUDES && -1;\n };\n};\n","// 0 -> Array#forEach\n// 1 -> Array#map\n// 2 -> Array#filter\n// 3 -> Array#some\n// 4 -> Array#every\n// 5 -> Array#find\n// 6 -> Array#findIndex\nvar ctx = require('./_ctx');\nvar IObject = require('./_iobject');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar asc = require('./_array-species-create');\nmodule.exports = function (TYPE, $create) {\n var IS_MAP = TYPE == 1;\n var IS_FILTER = TYPE == 2;\n var IS_SOME = TYPE == 3;\n var IS_EVERY = TYPE == 4;\n var IS_FIND_INDEX = TYPE == 6;\n var NO_HOLES = TYPE == 5 || IS_FIND_INDEX;\n var create = $create || asc;\n return function ($this, callbackfn, that) {\n var O = toObject($this);\n var self = IObject(O);\n var f = ctx(callbackfn, that, 3);\n var length = toLength(self.length);\n var index = 0;\n var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined;\n var val, res;\n for (;length > index; index++) if (NO_HOLES || index in self) {\n val = self[index];\n res = f(val, index, O);\n if (TYPE) {\n if (IS_MAP) result[index] = res; // map\n else if (res) switch (TYPE) {\n case 3: return true; // some\n case 5: return val; // find\n case 6: return index; // findIndex\n case 2: result.push(val); // filter\n } else if (IS_EVERY) return false; // every\n }\n }\n return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result;\n };\n};\n","var aFunction = require('./_a-function');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar toLength = require('./_to-length');\n\nmodule.exports = function (that, callbackfn, aLen, memo, isRight) {\n aFunction(callbackfn);\n var O = toObject(that);\n var self = IObject(O);\n var length = toLength(O.length);\n var index = isRight ? length - 1 : 0;\n var i = isRight ? -1 : 1;\n if (aLen < 2) for (;;) {\n if (index in self) {\n memo = self[index];\n index += i;\n break;\n }\n index += i;\n if (isRight ? index < 0 : length <= index) {\n throw TypeError('Reduce of empty array with no initial value');\n }\n }\n for (;isRight ? index >= 0 : length > index; index += i) if (index in self) {\n memo = callbackfn(memo, self[index], index, O);\n }\n return memo;\n};\n","var isObject = require('./_is-object');\nvar isArray = require('./_is-array');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (original) {\n var C;\n if (isArray(original)) {\n C = original.constructor;\n // cross-realm fallback\n if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined;\n if (isObject(C)) {\n C = C[SPECIES];\n if (C === null) C = undefined;\n }\n } return C === undefined ? Array : C;\n};\n","// 9.4.2.3 ArraySpeciesCreate(originalArray, length)\nvar speciesConstructor = require('./_array-species-constructor');\n\nmodule.exports = function (original, length) {\n return new (speciesConstructor(original))(length);\n};\n","'use strict';\nvar aFunction = require('./_a-function');\nvar isObject = require('./_is-object');\nvar invoke = require('./_invoke');\nvar arraySlice = [].slice;\nvar factories = {};\n\nvar construct = function (F, len, args) {\n if (!(len in factories)) {\n for (var n = [], i = 0; i < len; i++) n[i] = 'a[' + i + ']';\n // eslint-disable-next-line no-new-func\n factories[len] = Function('F,a', 'return new F(' + n.join(',') + ')');\n } return factories[len](F, args);\n};\n\nmodule.exports = Function.bind || function bind(that /* , ...args */) {\n var fn = aFunction(this);\n var partArgs = arraySlice.call(arguments, 1);\n var bound = function (/* args... */) {\n var args = partArgs.concat(arraySlice.call(arguments));\n return this instanceof bound ? construct(fn, args.length, args) : invoke(fn, args, that);\n };\n if (isObject(fn.prototype)) bound.prototype = fn.prototype;\n return bound;\n};\n","// getting tag from 19.1.3.6 Object.prototype.toString()\nvar cof = require('./_cof');\nvar TAG = require('./_wks')('toStringTag');\n// ES3 wrong here\nvar ARG = cof(function () { return arguments; }()) == 'Arguments';\n\n// fallback for IE11 Script Access Denied error\nvar tryGet = function (it, key) {\n try {\n return it[key];\n } catch (e) { /* empty */ }\n};\n\nmodule.exports = function (it) {\n var O, T, B;\n return it === undefined ? 'Undefined' : it === null ? 'Null'\n // @@toStringTag case\n : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T\n // builtinTag case\n : ARG ? cof(O)\n // ES3 arguments fallback\n : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B;\n};\n","var toString = {}.toString;\n\nmodule.exports = function (it) {\n return toString.call(it).slice(8, -1);\n};\n","'use strict';\nvar dP = require('./_object-dp').f;\nvar create = require('./_object-create');\nvar redefineAll = require('./_redefine-all');\nvar ctx = require('./_ctx');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar $iterDefine = require('./_iter-define');\nvar step = require('./_iter-step');\nvar setSpecies = require('./_set-species');\nvar DESCRIPTORS = require('./_descriptors');\nvar fastKey = require('./_meta').fastKey;\nvar validate = require('./_validate-collection');\nvar SIZE = DESCRIPTORS ? '_s' : 'size';\n\nvar getEntry = function (that, key) {\n // fast case\n var index = fastKey(key);\n var entry;\n if (index !== 'F') return that._i[index];\n // frozen object case\n for (entry = that._f; entry; entry = entry.n) {\n if (entry.k == key) return entry;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = create(null); // index\n that._f = undefined; // first entry\n that._l = undefined; // last entry\n that[SIZE] = 0; // size\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.1.3.1 Map.prototype.clear()\n // 23.2.3.2 Set.prototype.clear()\n clear: function clear() {\n for (var that = validate(this, NAME), data = that._i, entry = that._f; entry; entry = entry.n) {\n entry.r = true;\n if (entry.p) entry.p = entry.p.n = undefined;\n delete data[entry.i];\n }\n that._f = that._l = undefined;\n that[SIZE] = 0;\n },\n // 23.1.3.3 Map.prototype.delete(key)\n // 23.2.3.4 Set.prototype.delete(value)\n 'delete': function (key) {\n var that = validate(this, NAME);\n var entry = getEntry(that, key);\n if (entry) {\n var next = entry.n;\n var prev = entry.p;\n delete that._i[entry.i];\n entry.r = true;\n if (prev) prev.n = next;\n if (next) next.p = prev;\n if (that._f == entry) that._f = next;\n if (that._l == entry) that._l = prev;\n that[SIZE]--;\n } return !!entry;\n },\n // 23.2.3.6 Set.prototype.forEach(callbackfn, thisArg = undefined)\n // 23.1.3.5 Map.prototype.forEach(callbackfn, thisArg = undefined)\n forEach: function forEach(callbackfn /* , that = undefined */) {\n validate(this, NAME);\n var f = ctx(callbackfn, arguments.length > 1 ? arguments[1] : undefined, 3);\n var entry;\n while (entry = entry ? entry.n : this._f) {\n f(entry.v, entry.k, this);\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n }\n },\n // 23.1.3.7 Map.prototype.has(key)\n // 23.2.3.7 Set.prototype.has(value)\n has: function has(key) {\n return !!getEntry(validate(this, NAME), key);\n }\n });\n if (DESCRIPTORS) dP(C.prototype, 'size', {\n get: function () {\n return validate(this, NAME)[SIZE];\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var entry = getEntry(that, key);\n var prev, index;\n // change existing entry\n if (entry) {\n entry.v = value;\n // create new entry\n } else {\n that._l = entry = {\n i: index = fastKey(key, true), // <- index\n k: key, // <- key\n v: value, // <- value\n p: prev = that._l, // <- previous entry\n n: undefined, // <- next entry\n r: false // <- removed\n };\n if (!that._f) that._f = entry;\n if (prev) prev.n = entry;\n that[SIZE]++;\n // add to index\n if (index !== 'F') that._i[index] = entry;\n } return that;\n },\n getEntry: getEntry,\n setStrong: function (C, NAME, IS_MAP) {\n // add .keys, .values, .entries, [@@iterator]\n // 23.1.3.4, 23.1.3.8, 23.1.3.11, 23.1.3.12, 23.2.3.5, 23.2.3.8, 23.2.3.10, 23.2.3.11\n $iterDefine(C, NAME, function (iterated, kind) {\n this._t = validate(iterated, NAME); // target\n this._k = kind; // kind\n this._l = undefined; // previous\n }, function () {\n var that = this;\n var kind = that._k;\n var entry = that._l;\n // revert to the last existing entry\n while (entry && entry.r) entry = entry.p;\n // get next entry\n if (!that._t || !(that._l = entry = entry ? entry.n : that._t._f)) {\n // or finish the iteration\n that._t = undefined;\n return step(1);\n }\n // return step by kind\n if (kind == 'keys') return step(0, entry.k);\n if (kind == 'values') return step(0, entry.v);\n return step(0, [entry.k, entry.v]);\n }, IS_MAP ? 'entries' : 'values', !IS_MAP, true);\n\n // add [@@species], 23.1.2.2, 23.2.2.2\n setSpecies(NAME);\n }\n};\n","// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar classof = require('./_classof');\nvar from = require('./_array-from-iterable');\nmodule.exports = function (NAME) {\n return function toJSON() {\n if (classof(this) != NAME) throw TypeError(NAME + \"#toJSON isn't generic\");\n return from(this);\n };\n};\n","'use strict';\nvar redefineAll = require('./_redefine-all');\nvar getWeak = require('./_meta').getWeak;\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar createArrayMethod = require('./_array-methods');\nvar $has = require('./_has');\nvar validate = require('./_validate-collection');\nvar arrayFind = createArrayMethod(5);\nvar arrayFindIndex = createArrayMethod(6);\nvar id = 0;\n\n// fallback for uncaught frozen keys\nvar uncaughtFrozenStore = function (that) {\n return that._l || (that._l = new UncaughtFrozenStore());\n};\nvar UncaughtFrozenStore = function () {\n this.a = [];\n};\nvar findUncaughtFrozen = function (store, key) {\n return arrayFind(store.a, function (it) {\n return it[0] === key;\n });\n};\nUncaughtFrozenStore.prototype = {\n get: function (key) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) return entry[1];\n },\n has: function (key) {\n return !!findUncaughtFrozen(this, key);\n },\n set: function (key, value) {\n var entry = findUncaughtFrozen(this, key);\n if (entry) entry[1] = value;\n else this.a.push([key, value]);\n },\n 'delete': function (key) {\n var index = arrayFindIndex(this.a, function (it) {\n return it[0] === key;\n });\n if (~index) this.a.splice(index, 1);\n return !!~index;\n }\n};\n\nmodule.exports = {\n getConstructor: function (wrapper, NAME, IS_MAP, ADDER) {\n var C = wrapper(function (that, iterable) {\n anInstance(that, C, NAME, '_i');\n that._t = NAME; // collection type\n that._i = id++; // collection id\n that._l = undefined; // leak store for uncaught frozen objects\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n });\n redefineAll(C.prototype, {\n // 23.3.3.2 WeakMap.prototype.delete(key)\n // 23.4.3.3 WeakSet.prototype.delete(value)\n 'delete': function (key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME))['delete'](key);\n return data && $has(data, this._i) && delete data[this._i];\n },\n // 23.3.3.4 WeakMap.prototype.has(key)\n // 23.4.3.4 WeakSet.prototype.has(value)\n has: function has(key) {\n if (!isObject(key)) return false;\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, NAME)).has(key);\n return data && $has(data, this._i);\n }\n });\n return C;\n },\n def: function (that, key, value) {\n var data = getWeak(anObject(key), true);\n if (data === true) uncaughtFrozenStore(that).set(key, value);\n else data[that._i] = value;\n return that;\n },\n ufstore: uncaughtFrozenStore\n};\n","'use strict';\nvar global = require('./_global');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar redefineAll = require('./_redefine-all');\nvar meta = require('./_meta');\nvar forOf = require('./_for-of');\nvar anInstance = require('./_an-instance');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar $iterDetect = require('./_iter-detect');\nvar setToStringTag = require('./_set-to-string-tag');\nvar inheritIfRequired = require('./_inherit-if-required');\n\nmodule.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) {\n var Base = global[NAME];\n var C = Base;\n var ADDER = IS_MAP ? 'set' : 'add';\n var proto = C && C.prototype;\n var O = {};\n var fixMethod = function (KEY) {\n var fn = proto[KEY];\n redefine(proto, KEY,\n KEY == 'delete' ? function (a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'has' ? function has(a) {\n return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'get' ? function get(a) {\n return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a);\n } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; }\n : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; }\n );\n };\n if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () {\n new C().entries().next();\n }))) {\n // create collection constructor\n C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER);\n redefineAll(C.prototype, methods);\n meta.NEED = true;\n } else {\n var instance = new C();\n // early implementations not supports chaining\n var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance;\n // V8 ~ Chromium 40- weak-collections throws on primitives, but should return false\n var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); });\n // most early implementations doesn't supports iterables, most modern - not close it correctly\n var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new\n // for early implementations -0 and +0 not the same\n var BUGGY_ZERO = !IS_WEAK && fails(function () {\n // V8 ~ Chromium 42- fails only with 5+ elements\n var $instance = new C();\n var index = 5;\n while (index--) $instance[ADDER](index, index);\n return !$instance.has(-0);\n });\n if (!ACCEPT_ITERABLES) {\n C = wrapper(function (target, iterable) {\n anInstance(target, C, NAME);\n var that = inheritIfRequired(new Base(), target, C);\n if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that);\n return that;\n });\n C.prototype = proto;\n proto.constructor = C;\n }\n if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) {\n fixMethod('delete');\n fixMethod('has');\n IS_MAP && fixMethod('get');\n }\n if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER);\n // weak collections should not contains .clear method\n if (IS_WEAK && proto.clear) delete proto.clear;\n }\n\n setToStringTag(C, NAME);\n\n O[NAME] = C;\n $export($export.G + $export.W + $export.F * (C != Base), O);\n\n if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP);\n\n return C;\n};\n","var core = module.exports = { version: '2.6.12' };\nif (typeof __e == 'number') __e = core; // eslint-disable-line no-undef\n","'use strict';\nvar $defineProperty = require('./_object-dp');\nvar createDesc = require('./_property-desc');\n\nmodule.exports = function (object, index, value) {\n if (index in object) $defineProperty.f(object, index, createDesc(0, value));\n else object[index] = value;\n};\n","// optional / simple context binding\nvar aFunction = require('./_a-function');\nmodule.exports = function (fn, that, length) {\n aFunction(fn);\n if (that === undefined) return fn;\n switch (length) {\n case 1: return function (a) {\n return fn.call(that, a);\n };\n case 2: return function (a, b) {\n return fn.call(that, a, b);\n };\n case 3: return function (a, b, c) {\n return fn.call(that, a, b, c);\n };\n }\n return function (/* ...args */) {\n return fn.apply(that, arguments);\n };\n};\n","'use strict';\n// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()\nvar fails = require('./_fails');\nvar getTime = Date.prototype.getTime;\nvar $toISOString = Date.prototype.toISOString;\n\nvar lz = function (num) {\n return num > 9 ? num : '0' + num;\n};\n\n// PhantomJS / old WebKit has a broken implementations\nmodule.exports = (fails(function () {\n return $toISOString.call(new Date(-5e13 - 1)) != '0385-07-25T07:06:39.999Z';\n}) || !fails(function () {\n $toISOString.call(new Date(NaN));\n})) ? function toISOString() {\n if (!isFinite(getTime.call(this))) throw RangeError('Invalid time value');\n var d = this;\n var y = d.getUTCFullYear();\n var m = d.getUTCMilliseconds();\n var s = y < 0 ? '-' : y > 9999 ? '+' : '';\n return s + ('00000' + Math.abs(y)).slice(s ? -6 : -4) +\n '-' + lz(d.getUTCMonth() + 1) + '-' + lz(d.getUTCDate()) +\n 'T' + lz(d.getUTCHours()) + ':' + lz(d.getUTCMinutes()) +\n ':' + lz(d.getUTCSeconds()) + '.' + (m > 99 ? m : '0' + lz(m)) + 'Z';\n} : $toISOString;\n","'use strict';\nvar anObject = require('./_an-object');\nvar toPrimitive = require('./_to-primitive');\nvar NUMBER = 'number';\n\nmodule.exports = function (hint) {\n if (hint !== 'string' && hint !== NUMBER && hint !== 'default') throw TypeError('Incorrect hint');\n return toPrimitive(anObject(this), hint != NUMBER);\n};\n","// 7.2.1 RequireObjectCoercible(argument)\nmodule.exports = function (it) {\n if (it == undefined) throw TypeError(\"Can't call method on \" + it);\n return it;\n};\n","// Thank's IE8 for his funny defineProperty\nmodule.exports = !require('./_fails')(function () {\n return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7;\n});\n","var isObject = require('./_is-object');\nvar document = require('./_global').document;\n// typeof document.createElement is 'object' in old IE\nvar is = isObject(document) && isObject(document.createElement);\nmodule.exports = function (it) {\n return is ? document.createElement(it) : {};\n};\n","// IE 8- don't enum bug keys\nmodule.exports = (\n 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'\n).split(',');\n","// all enumerable object keys, includes symbols\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nmodule.exports = function (it) {\n var result = getKeys(it);\n var getSymbols = gOPS.f;\n if (getSymbols) {\n var symbols = getSymbols(it);\n var isEnum = pIE.f;\n var i = 0;\n var key;\n while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key);\n } return result;\n};\n","var global = require('./_global');\nvar core = require('./_core');\nvar hide = require('./_hide');\nvar redefine = require('./_redefine');\nvar ctx = require('./_ctx');\nvar PROTOTYPE = 'prototype';\n\nvar $export = function (type, name, source) {\n var IS_FORCED = type & $export.F;\n var IS_GLOBAL = type & $export.G;\n var IS_STATIC = type & $export.S;\n var IS_PROTO = type & $export.P;\n var IS_BIND = type & $export.B;\n var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE];\n var exports = IS_GLOBAL ? core : core[name] || (core[name] = {});\n var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {});\n var key, own, out, exp;\n if (IS_GLOBAL) source = name;\n for (key in source) {\n // contains in native\n own = !IS_FORCED && target && target[key] !== undefined;\n // export native or passed\n out = (own ? target : source)[key];\n // bind timers to global for call from export context\n exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out;\n // extend global\n if (target) redefine(target, key, out, type & $export.U);\n // export\n if (exports[key] != out) hide(exports, key, exp);\n if (IS_PROTO && expProto[key] != out) expProto[key] = out;\n }\n};\nglobal.core = core;\n// type bitmap\n$export.F = 1; // forced\n$export.G = 2; // global\n$export.S = 4; // static\n$export.P = 8; // proto\n$export.B = 16; // bind\n$export.W = 32; // wrap\n$export.U = 64; // safe\n$export.R = 128; // real proto method for `library`\nmodule.exports = $export;\n","var MATCH = require('./_wks')('match');\nmodule.exports = function (KEY) {\n var re = /./;\n try {\n '/./'[KEY](re);\n } catch (e) {\n try {\n re[MATCH] = false;\n return !'/./'[KEY](re);\n } catch (f) { /* empty */ }\n } return true;\n};\n","module.exports = function (exec) {\n try {\n return !!exec();\n } catch (e) {\n return true;\n }\n};\n","'use strict';\nrequire('./es6.regexp.exec');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar fails = require('./_fails');\nvar defined = require('./_defined');\nvar wks = require('./_wks');\nvar regexpExec = require('./_regexp-exec');\n\nvar SPECIES = wks('species');\n\nvar REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () {\n // #replace needs built-in support for named groups.\n // #match works fine because it just return the exec results, even if it has\n // a \"grops\" property.\n var re = /./;\n re.exec = function () {\n var result = [];\n result.groups = { a: '7' };\n return result;\n };\n return ''.replace(re, '$') !== '7';\n});\n\nvar SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () {\n // Chrome 51 has a buggy \"split\" implementation when RegExp#exec !== nativeExec\n var re = /(?:)/;\n var originalExec = re.exec;\n re.exec = function () { return originalExec.apply(this, arguments); };\n var result = 'ab'.split(re);\n return result.length === 2 && result[0] === 'a' && result[1] === 'b';\n})();\n\nmodule.exports = function (KEY, length, exec) {\n var SYMBOL = wks(KEY);\n\n var DELEGATES_TO_SYMBOL = !fails(function () {\n // String methods call symbol-named RegEp methods\n var O = {};\n O[SYMBOL] = function () { return 7; };\n return ''[KEY](O) != 7;\n });\n\n var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !fails(function () {\n // Symbol-named RegExp methods call .exec\n var execCalled = false;\n var re = /a/;\n re.exec = function () { execCalled = true; return null; };\n if (KEY === 'split') {\n // RegExp[@@split] doesn't call the regex's exec method, but first creates\n // a new one. We need to return the patched regex when creating the new one.\n re.constructor = {};\n re.constructor[SPECIES] = function () { return re; };\n }\n re[SYMBOL]('');\n return !execCalled;\n }) : undefined;\n\n if (\n !DELEGATES_TO_SYMBOL ||\n !DELEGATES_TO_EXEC ||\n (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) ||\n (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC)\n ) {\n var nativeRegExpMethod = /./[SYMBOL];\n var fns = exec(\n defined,\n SYMBOL,\n ''[KEY],\n function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) {\n if (regexp.exec === regexpExec) {\n if (DELEGATES_TO_SYMBOL && !forceStringMethod) {\n // The native String method already delegates to @@method (this\n // polyfilled function), leasing to infinite recursion.\n // We avoid it by directly calling the native @@method method.\n return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) };\n }\n return { done: true, value: nativeMethod.call(str, regexp, arg2) };\n }\n return { done: false };\n }\n );\n var strfn = fns[0];\n var rxfn = fns[1];\n\n redefine(String.prototype, KEY, strfn);\n hide(RegExp.prototype, SYMBOL, length == 2\n // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue)\n // 21.2.5.11 RegExp.prototype[@@split](string, limit)\n ? function (string, arg) { return rxfn.call(string, this, arg); }\n // 21.2.5.6 RegExp.prototype[@@match](string)\n // 21.2.5.9 RegExp.prototype[@@search](string)\n : function (string) { return rxfn.call(string, this); }\n );\n }\n};\n","'use strict';\n// 21.2.5.3 get RegExp.prototype.flags\nvar anObject = require('./_an-object');\nmodule.exports = function () {\n var that = anObject(this);\n var result = '';\n if (that.global) result += 'g';\n if (that.ignoreCase) result += 'i';\n if (that.multiline) result += 'm';\n if (that.unicode) result += 'u';\n if (that.sticky) result += 'y';\n return result;\n};\n","'use strict';\n// https://tc39.github.io/proposal-flatMap/#sec-FlattenIntoArray\nvar isArray = require('./_is-array');\nvar isObject = require('./_is-object');\nvar toLength = require('./_to-length');\nvar ctx = require('./_ctx');\nvar IS_CONCAT_SPREADABLE = require('./_wks')('isConcatSpreadable');\n\nfunction flattenIntoArray(target, original, source, sourceLen, start, depth, mapper, thisArg) {\n var targetIndex = start;\n var sourceIndex = 0;\n var mapFn = mapper ? ctx(mapper, thisArg, 3) : false;\n var element, spreadable;\n\n while (sourceIndex < sourceLen) {\n if (sourceIndex in source) {\n element = mapFn ? mapFn(source[sourceIndex], sourceIndex, original) : source[sourceIndex];\n\n spreadable = false;\n if (isObject(element)) {\n spreadable = element[IS_CONCAT_SPREADABLE];\n spreadable = spreadable !== undefined ? !!spreadable : isArray(element);\n }\n\n if (spreadable && depth > 0) {\n targetIndex = flattenIntoArray(target, original, element, toLength(element.length), targetIndex, depth - 1) - 1;\n } else {\n if (targetIndex >= 0x1fffffffffffff) throw TypeError();\n target[targetIndex] = element;\n }\n\n targetIndex++;\n }\n sourceIndex++;\n }\n return targetIndex;\n}\n\nmodule.exports = flattenIntoArray;\n","var ctx = require('./_ctx');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar getIterFn = require('./core.get-iterator-method');\nvar BREAK = {};\nvar RETURN = {};\nvar exports = module.exports = function (iterable, entries, fn, that, ITERATOR) {\n var iterFn = ITERATOR ? function () { return iterable; } : getIterFn(iterable);\n var f = ctx(fn, that, entries ? 2 : 1);\n var index = 0;\n var length, step, iterator, result;\n if (typeof iterFn != 'function') throw TypeError(iterable + ' is not iterable!');\n // fast case for arrays with default iterator\n if (isArrayIter(iterFn)) for (length = toLength(iterable.length); length > index; index++) {\n result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]);\n if (result === BREAK || result === RETURN) return result;\n } else for (iterator = iterFn.call(iterable); !(step = iterator.next()).done;) {\n result = call(iterator, f, step.value, entries);\n if (result === BREAK || result === RETURN) return result;\n }\n};\nexports.BREAK = BREAK;\nexports.RETURN = RETURN;\n","module.exports = require('./_shared')('native-function-to-string', Function.toString);\n","// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028\nvar global = module.exports = typeof window != 'undefined' && window.Math == Math\n ? window : typeof self != 'undefined' && self.Math == Math ? self\n // eslint-disable-next-line no-new-func\n : Function('return this')();\nif (typeof __g == 'number') __g = global; // eslint-disable-line no-undef\n","var hasOwnProperty = {}.hasOwnProperty;\nmodule.exports = function (it, key) {\n return hasOwnProperty.call(it, key);\n};\n","var dP = require('./_object-dp');\nvar createDesc = require('./_property-desc');\nmodule.exports = require('./_descriptors') ? function (object, key, value) {\n return dP.f(object, key, createDesc(1, value));\n} : function (object, key, value) {\n object[key] = value;\n return object;\n};\n","var document = require('./_global').document;\nmodule.exports = document && document.documentElement;\n","module.exports = !require('./_descriptors') && !require('./_fails')(function () {\n return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7;\n});\n","var isObject = require('./_is-object');\nvar setPrototypeOf = require('./_set-proto').set;\nmodule.exports = function (that, target, C) {\n var S = target.constructor;\n var P;\n if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) {\n setPrototypeOf(that, P);\n } return that;\n};\n","// fast apply, http://jsperf.lnkit.com/fast-apply/5\nmodule.exports = function (fn, args, that) {\n var un = that === undefined;\n switch (args.length) {\n case 0: return un ? fn()\n : fn.call(that);\n case 1: return un ? fn(args[0])\n : fn.call(that, args[0]);\n case 2: return un ? fn(args[0], args[1])\n : fn.call(that, args[0], args[1]);\n case 3: return un ? fn(args[0], args[1], args[2])\n : fn.call(that, args[0], args[1], args[2]);\n case 4: return un ? fn(args[0], args[1], args[2], args[3])\n : fn.call(that, args[0], args[1], args[2], args[3]);\n } return fn.apply(that, args);\n};\n","// fallback for non-array-like ES3 and non-enumerable old V8 strings\nvar cof = require('./_cof');\n// eslint-disable-next-line no-prototype-builtins\nmodule.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) {\n return cof(it) == 'String' ? it.split('') : Object(it);\n};\n","// check on default Array iterator\nvar Iterators = require('./_iterators');\nvar ITERATOR = require('./_wks')('iterator');\nvar ArrayProto = Array.prototype;\n\nmodule.exports = function (it) {\n return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it);\n};\n","// 7.2.2 IsArray(argument)\nvar cof = require('./_cof');\nmodule.exports = Array.isArray || function isArray(arg) {\n return cof(arg) == 'Array';\n};\n","// 20.1.2.3 Number.isInteger(number)\nvar isObject = require('./_is-object');\nvar floor = Math.floor;\nmodule.exports = function isInteger(it) {\n return !isObject(it) && isFinite(it) && floor(it) === it;\n};\n","module.exports = function (it) {\n return typeof it === 'object' ? it !== null : typeof it === 'function';\n};\n","// 7.2.8 IsRegExp(argument)\nvar isObject = require('./_is-object');\nvar cof = require('./_cof');\nvar MATCH = require('./_wks')('match');\nmodule.exports = function (it) {\n var isRegExp;\n return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp');\n};\n","// call something on iterator step with safe closing on error\nvar anObject = require('./_an-object');\nmodule.exports = function (iterator, fn, value, entries) {\n try {\n return entries ? fn(anObject(value)[0], value[1]) : fn(value);\n // 7.4.6 IteratorClose(iterator, completion)\n } catch (e) {\n var ret = iterator['return'];\n if (ret !== undefined) anObject(ret.call(iterator));\n throw e;\n }\n};\n","'use strict';\nvar create = require('./_object-create');\nvar descriptor = require('./_property-desc');\nvar setToStringTag = require('./_set-to-string-tag');\nvar IteratorPrototype = {};\n\n// 25.1.2.1.1 %IteratorPrototype%[@@iterator]()\nrequire('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; });\n\nmodule.exports = function (Constructor, NAME, next) {\n Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) });\n setToStringTag(Constructor, NAME + ' Iterator');\n};\n","'use strict';\nvar LIBRARY = require('./_library');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar $iterCreate = require('./_iter-create');\nvar setToStringTag = require('./_set-to-string-tag');\nvar getPrototypeOf = require('./_object-gpo');\nvar ITERATOR = require('./_wks')('iterator');\nvar BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next`\nvar FF_ITERATOR = '@@iterator';\nvar KEYS = 'keys';\nvar VALUES = 'values';\n\nvar returnThis = function () { return this; };\n\nmodule.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) {\n $iterCreate(Constructor, NAME, next);\n var getMethod = function (kind) {\n if (!BUGGY && kind in proto) return proto[kind];\n switch (kind) {\n case KEYS: return function keys() { return new Constructor(this, kind); };\n case VALUES: return function values() { return new Constructor(this, kind); };\n } return function entries() { return new Constructor(this, kind); };\n };\n var TAG = NAME + ' Iterator';\n var DEF_VALUES = DEFAULT == VALUES;\n var VALUES_BUG = false;\n var proto = Base.prototype;\n var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT];\n var $default = $native || getMethod(DEFAULT);\n var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined;\n var $anyNative = NAME == 'Array' ? proto.entries || $native : $native;\n var methods, key, IteratorPrototype;\n // Fix native\n if ($anyNative) {\n IteratorPrototype = getPrototypeOf($anyNative.call(new Base()));\n if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) {\n // Set @@toStringTag to native iterators\n setToStringTag(IteratorPrototype, TAG, true);\n // fix for some old engines\n if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis);\n }\n }\n // fix Array#{values, @@iterator}.name in V8 / FF\n if (DEF_VALUES && $native && $native.name !== VALUES) {\n VALUES_BUG = true;\n $default = function values() { return $native.call(this); };\n }\n // Define iterator\n if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) {\n hide(proto, ITERATOR, $default);\n }\n // Plug for library\n Iterators[NAME] = $default;\n Iterators[TAG] = returnThis;\n if (DEFAULT) {\n methods = {\n values: DEF_VALUES ? $default : getMethod(VALUES),\n keys: IS_SET ? $default : getMethod(KEYS),\n entries: $entries\n };\n if (FORCED) for (key in methods) {\n if (!(key in proto)) redefine(proto, key, methods[key]);\n } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods);\n }\n return methods;\n};\n","var ITERATOR = require('./_wks')('iterator');\nvar SAFE_CLOSING = false;\n\ntry {\n var riter = [7][ITERATOR]();\n riter['return'] = function () { SAFE_CLOSING = true; };\n // eslint-disable-next-line no-throw-literal\n Array.from(riter, function () { throw 2; });\n} catch (e) { /* empty */ }\n\nmodule.exports = function (exec, skipClosing) {\n if (!skipClosing && !SAFE_CLOSING) return false;\n var safe = false;\n try {\n var arr = [7];\n var iter = arr[ITERATOR]();\n iter.next = function () { return { done: safe = true }; };\n arr[ITERATOR] = function () { return iter; };\n exec(arr);\n } catch (e) { /* empty */ }\n return safe;\n};\n","module.exports = function (done, value) {\n return { value: value, done: !!done };\n};\n","module.exports = {};\n","module.exports = false;\n","// 20.2.2.14 Math.expm1(x)\nvar $expm1 = Math.expm1;\nmodule.exports = (!$expm1\n // Old FF bug\n || $expm1(10) > 22025.465794806719 || $expm1(10) < 22025.4657948067165168\n // Tor Browser bug\n || $expm1(-2e-17) != -2e-17\n) ? function expm1(x) {\n return (x = +x) == 0 ? x : x > -1e-6 && x < 1e-6 ? x + x * x / 2 : Math.exp(x) - 1;\n} : $expm1;\n","// 20.2.2.16 Math.fround(x)\nvar sign = require('./_math-sign');\nvar pow = Math.pow;\nvar EPSILON = pow(2, -52);\nvar EPSILON32 = pow(2, -23);\nvar MAX32 = pow(2, 127) * (2 - EPSILON32);\nvar MIN32 = pow(2, -126);\n\nvar roundTiesToEven = function (n) {\n return n + 1 / EPSILON - 1 / EPSILON;\n};\n\nmodule.exports = Math.fround || function fround(x) {\n var $abs = Math.abs(x);\n var $sign = sign(x);\n var a, result;\n if ($abs < MIN32) return $sign * roundTiesToEven($abs / MIN32 / EPSILON32) * MIN32 * EPSILON32;\n a = (1 + EPSILON32 / EPSILON) * $abs;\n result = a - (a - $abs);\n // eslint-disable-next-line no-self-compare\n if (result > MAX32 || result != result) return $sign * Infinity;\n return $sign * result;\n};\n","// 20.2.2.20 Math.log1p(x)\nmodule.exports = Math.log1p || function log1p(x) {\n return (x = +x) > -1e-8 && x < 1e-8 ? x - x * x / 2 : Math.log(1 + x);\n};\n","// https://rwaldron.github.io/proposal-math-extensions/\nmodule.exports = Math.scale || function scale(x, inLow, inHigh, outLow, outHigh) {\n if (\n arguments.length === 0\n // eslint-disable-next-line no-self-compare\n || x != x\n // eslint-disable-next-line no-self-compare\n || inLow != inLow\n // eslint-disable-next-line no-self-compare\n || inHigh != inHigh\n // eslint-disable-next-line no-self-compare\n || outLow != outLow\n // eslint-disable-next-line no-self-compare\n || outHigh != outHigh\n ) return NaN;\n if (x === Infinity || x === -Infinity) return x;\n return (x - inLow) * (outHigh - outLow) / (inHigh - inLow) + outLow;\n};\n","// 20.2.2.28 Math.sign(x)\nmodule.exports = Math.sign || function sign(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) == 0 || x != x ? x : x < 0 ? -1 : 1;\n};\n","var META = require('./_uid')('meta');\nvar isObject = require('./_is-object');\nvar has = require('./_has');\nvar setDesc = require('./_object-dp').f;\nvar id = 0;\nvar isExtensible = Object.isExtensible || function () {\n return true;\n};\nvar FREEZE = !require('./_fails')(function () {\n return isExtensible(Object.preventExtensions({}));\n});\nvar setMeta = function (it) {\n setDesc(it, META, { value: {\n i: 'O' + ++id, // object ID\n w: {} // weak collections IDs\n } });\n};\nvar fastKey = function (it, create) {\n // return primitive with prefix\n if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it;\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return 'F';\n // not necessary to add metadata\n if (!create) return 'E';\n // add missing metadata\n setMeta(it);\n // return object ID\n } return it[META].i;\n};\nvar getWeak = function (it, create) {\n if (!has(it, META)) {\n // can't set metadata to uncaught frozen object\n if (!isExtensible(it)) return true;\n // not necessary to add metadata\n if (!create) return false;\n // add missing metadata\n setMeta(it);\n // return hash weak collections IDs\n } return it[META].w;\n};\n// add metadata on freeze-family methods calling\nvar onFreeze = function (it) {\n if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it);\n return it;\n};\nvar meta = module.exports = {\n KEY: META,\n NEED: false,\n fastKey: fastKey,\n getWeak: getWeak,\n onFreeze: onFreeze\n};\n","var Map = require('./es6.map');\nvar $export = require('./_export');\nvar shared = require('./_shared')('metadata');\nvar store = shared.store || (shared.store = new (require('./es6.weak-map'))());\n\nvar getOrCreateMetadataMap = function (target, targetKey, create) {\n var targetMetadata = store.get(target);\n if (!targetMetadata) {\n if (!create) return undefined;\n store.set(target, targetMetadata = new Map());\n }\n var keyMetadata = targetMetadata.get(targetKey);\n if (!keyMetadata) {\n if (!create) return undefined;\n targetMetadata.set(targetKey, keyMetadata = new Map());\n } return keyMetadata;\n};\nvar ordinaryHasOwnMetadata = function (MetadataKey, O, P) {\n var metadataMap = getOrCreateMetadataMap(O, P, false);\n return metadataMap === undefined ? false : metadataMap.has(MetadataKey);\n};\nvar ordinaryGetOwnMetadata = function (MetadataKey, O, P) {\n var metadataMap = getOrCreateMetadataMap(O, P, false);\n return metadataMap === undefined ? undefined : metadataMap.get(MetadataKey);\n};\nvar ordinaryDefineOwnMetadata = function (MetadataKey, MetadataValue, O, P) {\n getOrCreateMetadataMap(O, P, true).set(MetadataKey, MetadataValue);\n};\nvar ordinaryOwnMetadataKeys = function (target, targetKey) {\n var metadataMap = getOrCreateMetadataMap(target, targetKey, false);\n var keys = [];\n if (metadataMap) metadataMap.forEach(function (_, key) { keys.push(key); });\n return keys;\n};\nvar toMetaKey = function (it) {\n return it === undefined || typeof it == 'symbol' ? it : String(it);\n};\nvar exp = function (O) {\n $export($export.S, 'Reflect', O);\n};\n\nmodule.exports = {\n store: store,\n map: getOrCreateMetadataMap,\n has: ordinaryHasOwnMetadata,\n get: ordinaryGetOwnMetadata,\n set: ordinaryDefineOwnMetadata,\n keys: ordinaryOwnMetadataKeys,\n key: toMetaKey,\n exp: exp\n};\n","var global = require('./_global');\nvar macrotask = require('./_task').set;\nvar Observer = global.MutationObserver || global.WebKitMutationObserver;\nvar process = global.process;\nvar Promise = global.Promise;\nvar isNode = require('./_cof')(process) == 'process';\n\nmodule.exports = function () {\n var head, last, notify;\n\n var flush = function () {\n var parent, fn;\n if (isNode && (parent = process.domain)) parent.exit();\n while (head) {\n fn = head.fn;\n head = head.next;\n try {\n fn();\n } catch (e) {\n if (head) notify();\n else last = undefined;\n throw e;\n }\n } last = undefined;\n if (parent) parent.enter();\n };\n\n // Node.js\n if (isNode) {\n notify = function () {\n process.nextTick(flush);\n };\n // browsers with MutationObserver, except iOS Safari - https://github.com/zloirock/core-js/issues/339\n } else if (Observer && !(global.navigator && global.navigator.standalone)) {\n var toggle = true;\n var node = document.createTextNode('');\n new Observer(flush).observe(node, { characterData: true }); // eslint-disable-line no-new\n notify = function () {\n node.data = toggle = !toggle;\n };\n // environments with maybe non-completely correct, but existent Promise\n } else if (Promise && Promise.resolve) {\n // Promise.resolve without an argument throws an error in LG WebOS 2\n var promise = Promise.resolve(undefined);\n notify = function () {\n promise.then(flush);\n };\n // for other environments - macrotask based on:\n // - setImmediate\n // - MessageChannel\n // - window.postMessag\n // - onreadystatechange\n // - setTimeout\n } else {\n notify = function () {\n // strange IE + webpack dev server bug - use .call(global)\n macrotask.call(global, flush);\n };\n }\n\n return function (fn) {\n var task = { fn: fn, next: undefined };\n if (last) last.next = task;\n if (!head) {\n head = task;\n notify();\n } last = task;\n };\n};\n","'use strict';\n// 25.4.1.5 NewPromiseCapability(C)\nvar aFunction = require('./_a-function');\n\nfunction PromiseCapability(C) {\n var resolve, reject;\n this.promise = new C(function ($$resolve, $$reject) {\n if (resolve !== undefined || reject !== undefined) throw TypeError('Bad Promise constructor');\n resolve = $$resolve;\n reject = $$reject;\n });\n this.resolve = aFunction(resolve);\n this.reject = aFunction(reject);\n}\n\nmodule.exports.f = function (C) {\n return new PromiseCapability(C);\n};\n","'use strict';\n// 19.1.2.1 Object.assign(target, source, ...)\nvar DESCRIPTORS = require('./_descriptors');\nvar getKeys = require('./_object-keys');\nvar gOPS = require('./_object-gops');\nvar pIE = require('./_object-pie');\nvar toObject = require('./_to-object');\nvar IObject = require('./_iobject');\nvar $assign = Object.assign;\n\n// should work with symbols and should have deterministic property order (V8 bug)\nmodule.exports = !$assign || require('./_fails')(function () {\n var A = {};\n var B = {};\n // eslint-disable-next-line no-undef\n var S = Symbol();\n var K = 'abcdefghijklmnopqrst';\n A[S] = 7;\n K.split('').forEach(function (k) { B[k] = k; });\n return $assign({}, A)[S] != 7 || Object.keys($assign({}, B)).join('') != K;\n}) ? function assign(target, source) { // eslint-disable-line no-unused-vars\n var T = toObject(target);\n var aLen = arguments.length;\n var index = 1;\n var getSymbols = gOPS.f;\n var isEnum = pIE.f;\n while (aLen > index) {\n var S = IObject(arguments[index++]);\n var keys = getSymbols ? getKeys(S).concat(getSymbols(S)) : getKeys(S);\n var length = keys.length;\n var j = 0;\n var key;\n while (length > j) {\n key = keys[j++];\n if (!DESCRIPTORS || isEnum.call(S, key)) T[key] = S[key];\n }\n } return T;\n} : $assign;\n","// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\nvar anObject = require('./_an-object');\nvar dPs = require('./_object-dps');\nvar enumBugKeys = require('./_enum-bug-keys');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar Empty = function () { /* empty */ };\nvar PROTOTYPE = 'prototype';\n\n// Create object with fake `null` prototype: use iframe Object with cleared prototype\nvar createDict = function () {\n // Thrash, waste and sodomy: IE GC bug\n var iframe = require('./_dom-create')('iframe');\n var i = enumBugKeys.length;\n var lt = '<';\n var gt = '>';\n var iframeDocument;\n iframe.style.display = 'none';\n require('./_html').appendChild(iframe);\n iframe.src = 'javascript:'; // eslint-disable-line no-script-url\n // createDict = iframe.contentWindow.Object;\n // html.removeChild(iframe);\n iframeDocument = iframe.contentWindow.document;\n iframeDocument.open();\n iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt);\n iframeDocument.close();\n createDict = iframeDocument.F;\n while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]];\n return createDict();\n};\n\nmodule.exports = Object.create || function create(O, Properties) {\n var result;\n if (O !== null) {\n Empty[PROTOTYPE] = anObject(O);\n result = new Empty();\n Empty[PROTOTYPE] = null;\n // add \"__proto__\" for Object.getPrototypeOf polyfill\n result[IE_PROTO] = O;\n } else result = createDict();\n return Properties === undefined ? result : dPs(result, Properties);\n};\n","var anObject = require('./_an-object');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar toPrimitive = require('./_to-primitive');\nvar dP = Object.defineProperty;\n\nexports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) {\n anObject(O);\n P = toPrimitive(P, true);\n anObject(Attributes);\n if (IE8_DOM_DEFINE) try {\n return dP(O, P, Attributes);\n } catch (e) { /* empty */ }\n if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!');\n if ('value' in Attributes) O[P] = Attributes.value;\n return O;\n};\n","var dP = require('./_object-dp');\nvar anObject = require('./_an-object');\nvar getKeys = require('./_object-keys');\n\nmodule.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) {\n anObject(O);\n var keys = getKeys(Properties);\n var length = keys.length;\n var i = 0;\n var P;\n while (length > i) dP.f(O, P = keys[i++], Properties[P]);\n return O;\n};\n","'use strict';\n// Forced replacement prototype accessors methods\nmodule.exports = require('./_library') || !require('./_fails')(function () {\n var K = Math.random();\n // In FF throws only define methods\n // eslint-disable-next-line no-undef, no-useless-call\n __defineSetter__.call(null, K, function () { /* empty */ });\n delete require('./_global')[K];\n});\n","var pIE = require('./_object-pie');\nvar createDesc = require('./_property-desc');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar has = require('./_has');\nvar IE8_DOM_DEFINE = require('./_ie8-dom-define');\nvar gOPD = Object.getOwnPropertyDescriptor;\n\nexports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) {\n O = toIObject(O);\n P = toPrimitive(P, true);\n if (IE8_DOM_DEFINE) try {\n return gOPD(O, P);\n } catch (e) { /* empty */ }\n if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]);\n};\n","// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window\nvar toIObject = require('./_to-iobject');\nvar gOPN = require('./_object-gopn').f;\nvar toString = {}.toString;\n\nvar windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames\n ? Object.getOwnPropertyNames(window) : [];\n\nvar getWindowNames = function (it) {\n try {\n return gOPN(it);\n } catch (e) {\n return windowNames.slice();\n }\n};\n\nmodule.exports.f = function getOwnPropertyNames(it) {\n return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it));\n};\n","// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O)\nvar $keys = require('./_object-keys-internal');\nvar hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype');\n\nexports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) {\n return $keys(O, hiddenKeys);\n};\n","exports.f = Object.getOwnPropertySymbols;\n","// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O)\nvar has = require('./_has');\nvar toObject = require('./_to-object');\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\nvar ObjectProto = Object.prototype;\n\nmodule.exports = Object.getPrototypeOf || function (O) {\n O = toObject(O);\n if (has(O, IE_PROTO)) return O[IE_PROTO];\n if (typeof O.constructor == 'function' && O instanceof O.constructor) {\n return O.constructor.prototype;\n } return O instanceof Object ? ObjectProto : null;\n};\n","var has = require('./_has');\nvar toIObject = require('./_to-iobject');\nvar arrayIndexOf = require('./_array-includes')(false);\nvar IE_PROTO = require('./_shared-key')('IE_PROTO');\n\nmodule.exports = function (object, names) {\n var O = toIObject(object);\n var i = 0;\n var result = [];\n var key;\n for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key);\n // Don't enum bug & hidden keys\n while (names.length > i) if (has(O, key = names[i++])) {\n ~arrayIndexOf(result, key) || result.push(key);\n }\n return result;\n};\n","// 19.1.2.14 / 15.2.3.14 Object.keys(O)\nvar $keys = require('./_object-keys-internal');\nvar enumBugKeys = require('./_enum-bug-keys');\n\nmodule.exports = Object.keys || function keys(O) {\n return $keys(O, enumBugKeys);\n};\n","exports.f = {}.propertyIsEnumerable;\n","// most Object methods by ES6 should accept primitives\nvar $export = require('./_export');\nvar core = require('./_core');\nvar fails = require('./_fails');\nmodule.exports = function (KEY, exec) {\n var fn = (core.Object || {})[KEY] || Object[KEY];\n var exp = {};\n exp[KEY] = exec(fn);\n $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp);\n};\n","var DESCRIPTORS = require('./_descriptors');\nvar getKeys = require('./_object-keys');\nvar toIObject = require('./_to-iobject');\nvar isEnum = require('./_object-pie').f;\nmodule.exports = function (isEntries) {\n return function (it) {\n var O = toIObject(it);\n var keys = getKeys(O);\n var length = keys.length;\n var i = 0;\n var result = [];\n var key;\n while (length > i) {\n key = keys[i++];\n if (!DESCRIPTORS || isEnum.call(O, key)) {\n result.push(isEntries ? [key, O[key]] : O[key]);\n }\n }\n return result;\n };\n};\n","// all object keys, includes non-enumerable and symbols\nvar gOPN = require('./_object-gopn');\nvar gOPS = require('./_object-gops');\nvar anObject = require('./_an-object');\nvar Reflect = require('./_global').Reflect;\nmodule.exports = Reflect && Reflect.ownKeys || function ownKeys(it) {\n var keys = gOPN.f(anObject(it));\n var getSymbols = gOPS.f;\n return getSymbols ? keys.concat(getSymbols(it)) : keys;\n};\n","var $parseFloat = require('./_global').parseFloat;\nvar $trim = require('./_string-trim').trim;\n\nmodule.exports = 1 / $parseFloat(require('./_string-ws') + '-0') !== -Infinity ? function parseFloat(str) {\n var string = $trim(String(str), 3);\n var result = $parseFloat(string);\n return result === 0 && string.charAt(0) == '-' ? -0 : result;\n} : $parseFloat;\n","var $parseInt = require('./_global').parseInt;\nvar $trim = require('./_string-trim').trim;\nvar ws = require('./_string-ws');\nvar hex = /^[-+]?0[xX]/;\n\nmodule.exports = $parseInt(ws + '08') !== 8 || $parseInt(ws + '0x16') !== 22 ? function parseInt(str, radix) {\n var string = $trim(String(str), 3);\n return $parseInt(string, (radix >>> 0) || (hex.test(string) ? 16 : 10));\n} : $parseInt;\n","module.exports = function (exec) {\n try {\n return { e: false, v: exec() };\n } catch (e) {\n return { e: true, v: e };\n }\n};\n","var anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar newPromiseCapability = require('./_new-promise-capability');\n\nmodule.exports = function (C, x) {\n anObject(C);\n if (isObject(x) && x.constructor === C) return x;\n var promiseCapability = newPromiseCapability.f(C);\n var resolve = promiseCapability.resolve;\n resolve(x);\n return promiseCapability.promise;\n};\n","module.exports = function (bitmap, value) {\n return {\n enumerable: !(bitmap & 1),\n configurable: !(bitmap & 2),\n writable: !(bitmap & 4),\n value: value\n };\n};\n","var redefine = require('./_redefine');\nmodule.exports = function (target, src, safe) {\n for (var key in src) redefine(target, key, src[key], safe);\n return target;\n};\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar has = require('./_has');\nvar SRC = require('./_uid')('src');\nvar $toString = require('./_function-to-string');\nvar TO_STRING = 'toString';\nvar TPL = ('' + $toString).split(TO_STRING);\n\nrequire('./_core').inspectSource = function (it) {\n return $toString.call(it);\n};\n\n(module.exports = function (O, key, val, safe) {\n var isFunction = typeof val == 'function';\n if (isFunction) has(val, 'name') || hide(val, 'name', key);\n if (O[key] === val) return;\n if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key)));\n if (O === global) {\n O[key] = val;\n } else if (!safe) {\n delete O[key];\n hide(O, key, val);\n } else if (O[key]) {\n O[key] = val;\n } else {\n hide(O, key, val);\n }\n// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative\n})(Function.prototype, TO_STRING, function toString() {\n return typeof this == 'function' && this[SRC] || $toString.call(this);\n});\n","'use strict';\n\nvar classof = require('./_classof');\nvar builtinExec = RegExp.prototype.exec;\n\n // `RegExpExec` abstract operation\n// https://tc39.github.io/ecma262/#sec-regexpexec\nmodule.exports = function (R, S) {\n var exec = R.exec;\n if (typeof exec === 'function') {\n var result = exec.call(R, S);\n if (typeof result !== 'object') {\n throw new TypeError('RegExp exec method returned something other than an Object or null');\n }\n return result;\n }\n if (classof(R) !== 'RegExp') {\n throw new TypeError('RegExp#exec called on incompatible receiver');\n }\n return builtinExec.call(R, S);\n};\n","'use strict';\n\nvar regexpFlags = require('./_flags');\n\nvar nativeExec = RegExp.prototype.exec;\n// This always refers to the native implementation, because the\n// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js,\n// which loads this file before patching the method.\nvar nativeReplace = String.prototype.replace;\n\nvar patchedExec = nativeExec;\n\nvar LAST_INDEX = 'lastIndex';\n\nvar UPDATES_LAST_INDEX_WRONG = (function () {\n var re1 = /a/,\n re2 = /b*/g;\n nativeExec.call(re1, 'a');\n nativeExec.call(re2, 'a');\n return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0;\n})();\n\n// nonparticipating capturing group, copied from es5-shim's String#split patch.\nvar NPCG_INCLUDED = /()??/.exec('')[1] !== undefined;\n\nvar PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED;\n\nif (PATCH) {\n patchedExec = function exec(str) {\n var re = this;\n var lastIndex, reCopy, match, i;\n\n if (NPCG_INCLUDED) {\n reCopy = new RegExp('^' + re.source + '$(?!\\\\s)', regexpFlags.call(re));\n }\n if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX];\n\n match = nativeExec.call(re, str);\n\n if (UPDATES_LAST_INDEX_WRONG && match) {\n re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex;\n }\n if (NPCG_INCLUDED && match && match.length > 1) {\n // Fix browsers whose `exec` methods don't consistently return `undefined`\n // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/\n // eslint-disable-next-line no-loop-func\n nativeReplace.call(match[0], reCopy, function () {\n for (i = 1; i < arguments.length - 2; i++) {\n if (arguments[i] === undefined) match[i] = undefined;\n }\n });\n }\n\n return match;\n };\n}\n\nmodule.exports = patchedExec;\n","module.exports = function (regExp, replace) {\n var replacer = replace === Object(replace) ? function (part) {\n return replace[part];\n } : replace;\n return function (it) {\n return String(it).replace(regExp, replacer);\n };\n};\n","// 7.2.9 SameValue(x, y)\nmodule.exports = Object.is || function is(x, y) {\n // eslint-disable-next-line no-self-compare\n return x === y ? x !== 0 || 1 / x === 1 / y : x != x && y != y;\n};\n","'use strict';\n// https://tc39.github.io/proposal-setmap-offrom/\nvar $export = require('./_export');\nvar aFunction = require('./_a-function');\nvar ctx = require('./_ctx');\nvar forOf = require('./_for-of');\n\nmodule.exports = function (COLLECTION) {\n $export($export.S, COLLECTION, { from: function from(source /* , mapFn, thisArg */) {\n var mapFn = arguments[1];\n var mapping, A, n, cb;\n aFunction(this);\n mapping = mapFn !== undefined;\n if (mapping) aFunction(mapFn);\n if (source == undefined) return new this();\n A = [];\n if (mapping) {\n n = 0;\n cb = ctx(mapFn, arguments[2], 2);\n forOf(source, false, function (nextItem) {\n A.push(cb(nextItem, n++));\n });\n } else {\n forOf(source, false, A.push, A);\n }\n return new this(A);\n } });\n};\n","'use strict';\n// https://tc39.github.io/proposal-setmap-offrom/\nvar $export = require('./_export');\n\nmodule.exports = function (COLLECTION) {\n $export($export.S, COLLECTION, { of: function of() {\n var length = arguments.length;\n var A = new Array(length);\n while (length--) A[length] = arguments[length];\n return new this(A);\n } });\n};\n","// Works with __proto__ only. Old v8 can't work with null proto objects.\n/* eslint-disable no-proto */\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\nvar check = function (O, proto) {\n anObject(O);\n if (!isObject(proto) && proto !== null) throw TypeError(proto + \": can't set as prototype!\");\n};\nmodule.exports = {\n set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line\n function (test, buggy, set) {\n try {\n set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2);\n set(test, []);\n buggy = !(test instanceof Array);\n } catch (e) { buggy = true; }\n return function setPrototypeOf(O, proto) {\n check(O, proto);\n if (buggy) O.__proto__ = proto;\n else set(O, proto);\n return O;\n };\n }({}, false) : undefined),\n check: check\n};\n","'use strict';\nvar global = require('./_global');\nvar dP = require('./_object-dp');\nvar DESCRIPTORS = require('./_descriptors');\nvar SPECIES = require('./_wks')('species');\n\nmodule.exports = function (KEY) {\n var C = global[KEY];\n if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, {\n configurable: true,\n get: function () { return this; }\n });\n};\n","var def = require('./_object-dp').f;\nvar has = require('./_has');\nvar TAG = require('./_wks')('toStringTag');\n\nmodule.exports = function (it, tag, stat) {\n if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag });\n};\n","var shared = require('./_shared')('keys');\nvar uid = require('./_uid');\nmodule.exports = function (key) {\n return shared[key] || (shared[key] = uid(key));\n};\n","var core = require('./_core');\nvar global = require('./_global');\nvar SHARED = '__core-js_shared__';\nvar store = global[SHARED] || (global[SHARED] = {});\n\n(module.exports = function (key, value) {\n return store[key] || (store[key] = value !== undefined ? value : {});\n})('versions', []).push({\n version: core.version,\n mode: require('./_library') ? 'pure' : 'global',\n copyright: '© 2020 Denis Pushkarev (zloirock.ru)'\n});\n","// 7.3.20 SpeciesConstructor(O, defaultConstructor)\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar SPECIES = require('./_wks')('species');\nmodule.exports = function (O, D) {\n var C = anObject(O).constructor;\n var S;\n return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S);\n};\n","'use strict';\nvar fails = require('./_fails');\n\nmodule.exports = function (method, arg) {\n return !!method && fails(function () {\n // eslint-disable-next-line no-useless-call\n arg ? method.call(null, function () { /* empty */ }, 1) : method.call(null);\n });\n};\n","var toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n// true -> String#at\n// false -> String#codePointAt\nmodule.exports = function (TO_STRING) {\n return function (that, pos) {\n var s = String(defined(that));\n var i = toInteger(pos);\n var l = s.length;\n var a, b;\n if (i < 0 || i >= l) return TO_STRING ? '' : undefined;\n a = s.charCodeAt(i);\n return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff\n ? TO_STRING ? s.charAt(i) : a\n : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000;\n };\n};\n","// helper for String#{startsWith, endsWith, includes}\nvar isRegExp = require('./_is-regexp');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, searchString, NAME) {\n if (isRegExp(searchString)) throw TypeError('String#' + NAME + \" doesn't accept regex!\");\n return String(defined(that));\n};\n","var $export = require('./_export');\nvar fails = require('./_fails');\nvar defined = require('./_defined');\nvar quot = /\"/g;\n// B.2.3.2.1 CreateHTML(string, tag, attribute, value)\nvar createHTML = function (string, tag, attribute, value) {\n var S = String(defined(string));\n var p1 = '<' + tag;\n if (attribute !== '') p1 += ' ' + attribute + '=\"' + String(value).replace(quot, '"') + '\"';\n return p1 + '>' + S + '';\n};\nmodule.exports = function (NAME, exec) {\n var O = {};\n O[NAME] = exec(createHTML);\n $export($export.P + $export.F * fails(function () {\n var test = ''[NAME]('\"');\n return test !== test.toLowerCase() || test.split('\"').length > 3;\n }), 'String', O);\n};\n","// https://github.com/tc39/proposal-string-pad-start-end\nvar toLength = require('./_to-length');\nvar repeat = require('./_string-repeat');\nvar defined = require('./_defined');\n\nmodule.exports = function (that, maxLength, fillString, left) {\n var S = String(defined(that));\n var stringLength = S.length;\n var fillStr = fillString === undefined ? ' ' : String(fillString);\n var intMaxLength = toLength(maxLength);\n if (intMaxLength <= stringLength || fillStr == '') return S;\n var fillLen = intMaxLength - stringLength;\n var stringFiller = repeat.call(fillStr, Math.ceil(fillLen / fillStr.length));\n if (stringFiller.length > fillLen) stringFiller = stringFiller.slice(0, fillLen);\n return left ? stringFiller + S : S + stringFiller;\n};\n","'use strict';\nvar toInteger = require('./_to-integer');\nvar defined = require('./_defined');\n\nmodule.exports = function repeat(count) {\n var str = String(defined(this));\n var res = '';\n var n = toInteger(count);\n if (n < 0 || n == Infinity) throw RangeError(\"Count can't be negative\");\n for (;n > 0; (n >>>= 1) && (str += str)) if (n & 1) res += str;\n return res;\n};\n","var $export = require('./_export');\nvar defined = require('./_defined');\nvar fails = require('./_fails');\nvar spaces = require('./_string-ws');\nvar space = '[' + spaces + ']';\nvar non = '\\u200b\\u0085';\nvar ltrim = RegExp('^' + space + space + '*');\nvar rtrim = RegExp(space + space + '*$');\n\nvar exporter = function (KEY, exec, ALIAS) {\n var exp = {};\n var FORCE = fails(function () {\n return !!spaces[KEY]() || non[KEY]() != non;\n });\n var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY];\n if (ALIAS) exp[ALIAS] = fn;\n $export($export.P + $export.F * FORCE, 'String', exp);\n};\n\n// 1 -> String#trimLeft\n// 2 -> String#trimRight\n// 3 -> String#trim\nvar trim = exporter.trim = function (string, TYPE) {\n string = String(defined(string));\n if (TYPE & 1) string = string.replace(ltrim, '');\n if (TYPE & 2) string = string.replace(rtrim, '');\n return string;\n};\n\nmodule.exports = exporter;\n","module.exports = '\\x09\\x0A\\x0B\\x0C\\x0D\\x20\\xA0\\u1680\\u180E\\u2000\\u2001\\u2002\\u2003' +\n '\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF';\n","var ctx = require('./_ctx');\nvar invoke = require('./_invoke');\nvar html = require('./_html');\nvar cel = require('./_dom-create');\nvar global = require('./_global');\nvar process = global.process;\nvar setTask = global.setImmediate;\nvar clearTask = global.clearImmediate;\nvar MessageChannel = global.MessageChannel;\nvar Dispatch = global.Dispatch;\nvar counter = 0;\nvar queue = {};\nvar ONREADYSTATECHANGE = 'onreadystatechange';\nvar defer, channel, port;\nvar run = function () {\n var id = +this;\n // eslint-disable-next-line no-prototype-builtins\n if (queue.hasOwnProperty(id)) {\n var fn = queue[id];\n delete queue[id];\n fn();\n }\n};\nvar listener = function (event) {\n run.call(event.data);\n};\n// Node.js 0.9+ & IE10+ has setImmediate, otherwise:\nif (!setTask || !clearTask) {\n setTask = function setImmediate(fn) {\n var args = [];\n var i = 1;\n while (arguments.length > i) args.push(arguments[i++]);\n queue[++counter] = function () {\n // eslint-disable-next-line no-new-func\n invoke(typeof fn == 'function' ? fn : Function(fn), args);\n };\n defer(counter);\n return counter;\n };\n clearTask = function clearImmediate(id) {\n delete queue[id];\n };\n // Node.js 0.8-\n if (require('./_cof')(process) == 'process') {\n defer = function (id) {\n process.nextTick(ctx(run, id, 1));\n };\n // Sphere (JS game engine) Dispatch API\n } else if (Dispatch && Dispatch.now) {\n defer = function (id) {\n Dispatch.now(ctx(run, id, 1));\n };\n // Browsers with MessageChannel, includes WebWorkers\n } else if (MessageChannel) {\n channel = new MessageChannel();\n port = channel.port2;\n channel.port1.onmessage = listener;\n defer = ctx(port.postMessage, port, 1);\n // Browsers with postMessage, skip WebWorkers\n // IE8 has postMessage, but it's sync & typeof its postMessage is 'object'\n } else if (global.addEventListener && typeof postMessage == 'function' && !global.importScripts) {\n defer = function (id) {\n global.postMessage(id + '', '*');\n };\n global.addEventListener('message', listener, false);\n // IE8-\n } else if (ONREADYSTATECHANGE in cel('script')) {\n defer = function (id) {\n html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function () {\n html.removeChild(this);\n run.call(id);\n };\n };\n // Rest old browsers\n } else {\n defer = function (id) {\n setTimeout(ctx(run, id, 1), 0);\n };\n }\n}\nmodule.exports = {\n set: setTask,\n clear: clearTask\n};\n","var toInteger = require('./_to-integer');\nvar max = Math.max;\nvar min = Math.min;\nmodule.exports = function (index, length) {\n index = toInteger(index);\n return index < 0 ? max(index + length, 0) : min(index, length);\n};\n","// https://tc39.github.io/ecma262/#sec-toindex\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nmodule.exports = function (it) {\n if (it === undefined) return 0;\n var number = toInteger(it);\n var length = toLength(number);\n if (number !== length) throw RangeError('Wrong length!');\n return length;\n};\n","// 7.1.4 ToInteger\nvar ceil = Math.ceil;\nvar floor = Math.floor;\nmodule.exports = function (it) {\n return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it);\n};\n","// to indexed object, toObject with fallback for non-array-like ES3 strings\nvar IObject = require('./_iobject');\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return IObject(defined(it));\n};\n","// 7.1.15 ToLength\nvar toInteger = require('./_to-integer');\nvar min = Math.min;\nmodule.exports = function (it) {\n return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991\n};\n","// 7.1.13 ToObject(argument)\nvar defined = require('./_defined');\nmodule.exports = function (it) {\n return Object(defined(it));\n};\n","// 7.1.1 ToPrimitive(input [, PreferredType])\nvar isObject = require('./_is-object');\n// instead of the ES6 spec version, we didn't implement @@toPrimitive case\n// and the second argument - flag - preferred type is a string\nmodule.exports = function (it, S) {\n if (!isObject(it)) return it;\n var fn, val;\n if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val;\n if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val;\n throw TypeError(\"Can't convert object to primitive value\");\n};\n","'use strict';\nif (require('./_descriptors')) {\n var LIBRARY = require('./_library');\n var global = require('./_global');\n var fails = require('./_fails');\n var $export = require('./_export');\n var $typed = require('./_typed');\n var $buffer = require('./_typed-buffer');\n var ctx = require('./_ctx');\n var anInstance = require('./_an-instance');\n var propertyDesc = require('./_property-desc');\n var hide = require('./_hide');\n var redefineAll = require('./_redefine-all');\n var toInteger = require('./_to-integer');\n var toLength = require('./_to-length');\n var toIndex = require('./_to-index');\n var toAbsoluteIndex = require('./_to-absolute-index');\n var toPrimitive = require('./_to-primitive');\n var has = require('./_has');\n var classof = require('./_classof');\n var isObject = require('./_is-object');\n var toObject = require('./_to-object');\n var isArrayIter = require('./_is-array-iter');\n var create = require('./_object-create');\n var getPrototypeOf = require('./_object-gpo');\n var gOPN = require('./_object-gopn').f;\n var getIterFn = require('./core.get-iterator-method');\n var uid = require('./_uid');\n var wks = require('./_wks');\n var createArrayMethod = require('./_array-methods');\n var createArrayIncludes = require('./_array-includes');\n var speciesConstructor = require('./_species-constructor');\n var ArrayIterators = require('./es6.array.iterator');\n var Iterators = require('./_iterators');\n var $iterDetect = require('./_iter-detect');\n var setSpecies = require('./_set-species');\n var arrayFill = require('./_array-fill');\n var arrayCopyWithin = require('./_array-copy-within');\n var $DP = require('./_object-dp');\n var $GOPD = require('./_object-gopd');\n var dP = $DP.f;\n var gOPD = $GOPD.f;\n var RangeError = global.RangeError;\n var TypeError = global.TypeError;\n var Uint8Array = global.Uint8Array;\n var ARRAY_BUFFER = 'ArrayBuffer';\n var SHARED_BUFFER = 'Shared' + ARRAY_BUFFER;\n var BYTES_PER_ELEMENT = 'BYTES_PER_ELEMENT';\n var PROTOTYPE = 'prototype';\n var ArrayProto = Array[PROTOTYPE];\n var $ArrayBuffer = $buffer.ArrayBuffer;\n var $DataView = $buffer.DataView;\n var arrayForEach = createArrayMethod(0);\n var arrayFilter = createArrayMethod(2);\n var arraySome = createArrayMethod(3);\n var arrayEvery = createArrayMethod(4);\n var arrayFind = createArrayMethod(5);\n var arrayFindIndex = createArrayMethod(6);\n var arrayIncludes = createArrayIncludes(true);\n var arrayIndexOf = createArrayIncludes(false);\n var arrayValues = ArrayIterators.values;\n var arrayKeys = ArrayIterators.keys;\n var arrayEntries = ArrayIterators.entries;\n var arrayLastIndexOf = ArrayProto.lastIndexOf;\n var arrayReduce = ArrayProto.reduce;\n var arrayReduceRight = ArrayProto.reduceRight;\n var arrayJoin = ArrayProto.join;\n var arraySort = ArrayProto.sort;\n var arraySlice = ArrayProto.slice;\n var arrayToString = ArrayProto.toString;\n var arrayToLocaleString = ArrayProto.toLocaleString;\n var ITERATOR = wks('iterator');\n var TAG = wks('toStringTag');\n var TYPED_CONSTRUCTOR = uid('typed_constructor');\n var DEF_CONSTRUCTOR = uid('def_constructor');\n var ALL_CONSTRUCTORS = $typed.CONSTR;\n var TYPED_ARRAY = $typed.TYPED;\n var VIEW = $typed.VIEW;\n var WRONG_LENGTH = 'Wrong length!';\n\n var $map = createArrayMethod(1, function (O, length) {\n return allocate(speciesConstructor(O, O[DEF_CONSTRUCTOR]), length);\n });\n\n var LITTLE_ENDIAN = fails(function () {\n // eslint-disable-next-line no-undef\n return new Uint8Array(new Uint16Array([1]).buffer)[0] === 1;\n });\n\n var FORCED_SET = !!Uint8Array && !!Uint8Array[PROTOTYPE].set && fails(function () {\n new Uint8Array(1).set({});\n });\n\n var toOffset = function (it, BYTES) {\n var offset = toInteger(it);\n if (offset < 0 || offset % BYTES) throw RangeError('Wrong offset!');\n return offset;\n };\n\n var validate = function (it) {\n if (isObject(it) && TYPED_ARRAY in it) return it;\n throw TypeError(it + ' is not a typed array!');\n };\n\n var allocate = function (C, length) {\n if (!(isObject(C) && TYPED_CONSTRUCTOR in C)) {\n throw TypeError('It is not a typed array constructor!');\n } return new C(length);\n };\n\n var speciesFromList = function (O, list) {\n return fromList(speciesConstructor(O, O[DEF_CONSTRUCTOR]), list);\n };\n\n var fromList = function (C, list) {\n var index = 0;\n var length = list.length;\n var result = allocate(C, length);\n while (length > index) result[index] = list[index++];\n return result;\n };\n\n var addGetter = function (it, key, internal) {\n dP(it, key, { get: function () { return this._d[internal]; } });\n };\n\n var $from = function from(source /* , mapfn, thisArg */) {\n var O = toObject(source);\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var iterFn = getIterFn(O);\n var i, length, values, result, step, iterator;\n if (iterFn != undefined && !isArrayIter(iterFn)) {\n for (iterator = iterFn.call(O), values = [], i = 0; !(step = iterator.next()).done; i++) {\n values.push(step.value);\n } O = values;\n }\n if (mapping && aLen > 2) mapfn = ctx(mapfn, arguments[2], 2);\n for (i = 0, length = toLength(O.length), result = allocate(this, length); length > i; i++) {\n result[i] = mapping ? mapfn(O[i], i) : O[i];\n }\n return result;\n };\n\n var $of = function of(/* ...items */) {\n var index = 0;\n var length = arguments.length;\n var result = allocate(this, length);\n while (length > index) result[index] = arguments[index++];\n return result;\n };\n\n // iOS Safari 6.x fails here\n var TO_LOCALE_BUG = !!Uint8Array && fails(function () { arrayToLocaleString.call(new Uint8Array(1)); });\n\n var $toLocaleString = function toLocaleString() {\n return arrayToLocaleString.apply(TO_LOCALE_BUG ? arraySlice.call(validate(this)) : validate(this), arguments);\n };\n\n var proto = {\n copyWithin: function copyWithin(target, start /* , end */) {\n return arrayCopyWithin.call(validate(this), target, start, arguments.length > 2 ? arguments[2] : undefined);\n },\n every: function every(callbackfn /* , thisArg */) {\n return arrayEvery(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n fill: function fill(value /* , start, end */) { // eslint-disable-line no-unused-vars\n return arrayFill.apply(validate(this), arguments);\n },\n filter: function filter(callbackfn /* , thisArg */) {\n return speciesFromList(this, arrayFilter(validate(this), callbackfn,\n arguments.length > 1 ? arguments[1] : undefined));\n },\n find: function find(predicate /* , thisArg */) {\n return arrayFind(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n findIndex: function findIndex(predicate /* , thisArg */) {\n return arrayFindIndex(validate(this), predicate, arguments.length > 1 ? arguments[1] : undefined);\n },\n forEach: function forEach(callbackfn /* , thisArg */) {\n arrayForEach(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n indexOf: function indexOf(searchElement /* , fromIndex */) {\n return arrayIndexOf(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n includes: function includes(searchElement /* , fromIndex */) {\n return arrayIncludes(validate(this), searchElement, arguments.length > 1 ? arguments[1] : undefined);\n },\n join: function join(separator) { // eslint-disable-line no-unused-vars\n return arrayJoin.apply(validate(this), arguments);\n },\n lastIndexOf: function lastIndexOf(searchElement /* , fromIndex */) { // eslint-disable-line no-unused-vars\n return arrayLastIndexOf.apply(validate(this), arguments);\n },\n map: function map(mapfn /* , thisArg */) {\n return $map(validate(this), mapfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n reduce: function reduce(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduce.apply(validate(this), arguments);\n },\n reduceRight: function reduceRight(callbackfn /* , initialValue */) { // eslint-disable-line no-unused-vars\n return arrayReduceRight.apply(validate(this), arguments);\n },\n reverse: function reverse() {\n var that = this;\n var length = validate(that).length;\n var middle = Math.floor(length / 2);\n var index = 0;\n var value;\n while (index < middle) {\n value = that[index];\n that[index++] = that[--length];\n that[length] = value;\n } return that;\n },\n some: function some(callbackfn /* , thisArg */) {\n return arraySome(validate(this), callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n },\n sort: function sort(comparefn) {\n return arraySort.call(validate(this), comparefn);\n },\n subarray: function subarray(begin, end) {\n var O = validate(this);\n var length = O.length;\n var $begin = toAbsoluteIndex(begin, length);\n return new (speciesConstructor(O, O[DEF_CONSTRUCTOR]))(\n O.buffer,\n O.byteOffset + $begin * O.BYTES_PER_ELEMENT,\n toLength((end === undefined ? length : toAbsoluteIndex(end, length)) - $begin)\n );\n }\n };\n\n var $slice = function slice(start, end) {\n return speciesFromList(this, arraySlice.call(validate(this), start, end));\n };\n\n var $set = function set(arrayLike /* , offset */) {\n validate(this);\n var offset = toOffset(arguments[1], 1);\n var length = this.length;\n var src = toObject(arrayLike);\n var len = toLength(src.length);\n var index = 0;\n if (len + offset > length) throw RangeError(WRONG_LENGTH);\n while (index < len) this[offset + index] = src[index++];\n };\n\n var $iterators = {\n entries: function entries() {\n return arrayEntries.call(validate(this));\n },\n keys: function keys() {\n return arrayKeys.call(validate(this));\n },\n values: function values() {\n return arrayValues.call(validate(this));\n }\n };\n\n var isTAIndex = function (target, key) {\n return isObject(target)\n && target[TYPED_ARRAY]\n && typeof key != 'symbol'\n && key in target\n && String(+key) == String(key);\n };\n var $getDesc = function getOwnPropertyDescriptor(target, key) {\n return isTAIndex(target, key = toPrimitive(key, true))\n ? propertyDesc(2, target[key])\n : gOPD(target, key);\n };\n var $setDesc = function defineProperty(target, key, desc) {\n if (isTAIndex(target, key = toPrimitive(key, true))\n && isObject(desc)\n && has(desc, 'value')\n && !has(desc, 'get')\n && !has(desc, 'set')\n // TODO: add validation descriptor w/o calling accessors\n && !desc.configurable\n && (!has(desc, 'writable') || desc.writable)\n && (!has(desc, 'enumerable') || desc.enumerable)\n ) {\n target[key] = desc.value;\n return target;\n } return dP(target, key, desc);\n };\n\n if (!ALL_CONSTRUCTORS) {\n $GOPD.f = $getDesc;\n $DP.f = $setDesc;\n }\n\n $export($export.S + $export.F * !ALL_CONSTRUCTORS, 'Object', {\n getOwnPropertyDescriptor: $getDesc,\n defineProperty: $setDesc\n });\n\n if (fails(function () { arrayToString.call({}); })) {\n arrayToString = arrayToLocaleString = function toString() {\n return arrayJoin.call(this);\n };\n }\n\n var $TypedArrayPrototype$ = redefineAll({}, proto);\n redefineAll($TypedArrayPrototype$, $iterators);\n hide($TypedArrayPrototype$, ITERATOR, $iterators.values);\n redefineAll($TypedArrayPrototype$, {\n slice: $slice,\n set: $set,\n constructor: function () { /* noop */ },\n toString: arrayToString,\n toLocaleString: $toLocaleString\n });\n addGetter($TypedArrayPrototype$, 'buffer', 'b');\n addGetter($TypedArrayPrototype$, 'byteOffset', 'o');\n addGetter($TypedArrayPrototype$, 'byteLength', 'l');\n addGetter($TypedArrayPrototype$, 'length', 'e');\n dP($TypedArrayPrototype$, TAG, {\n get: function () { return this[TYPED_ARRAY]; }\n });\n\n // eslint-disable-next-line max-statements\n module.exports = function (KEY, BYTES, wrapper, CLAMPED) {\n CLAMPED = !!CLAMPED;\n var NAME = KEY + (CLAMPED ? 'Clamped' : '') + 'Array';\n var GETTER = 'get' + KEY;\n var SETTER = 'set' + KEY;\n var TypedArray = global[NAME];\n var Base = TypedArray || {};\n var TAC = TypedArray && getPrototypeOf(TypedArray);\n var FORCED = !TypedArray || !$typed.ABV;\n var O = {};\n var TypedArrayPrototype = TypedArray && TypedArray[PROTOTYPE];\n var getter = function (that, index) {\n var data = that._d;\n return data.v[GETTER](index * BYTES + data.o, LITTLE_ENDIAN);\n };\n var setter = function (that, index, value) {\n var data = that._d;\n if (CLAMPED) value = (value = Math.round(value)) < 0 ? 0 : value > 0xff ? 0xff : value & 0xff;\n data.v[SETTER](index * BYTES + data.o, value, LITTLE_ENDIAN);\n };\n var addElement = function (that, index) {\n dP(that, index, {\n get: function () {\n return getter(this, index);\n },\n set: function (value) {\n return setter(this, index, value);\n },\n enumerable: true\n });\n };\n if (FORCED) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME, '_d');\n var index = 0;\n var offset = 0;\n var buffer, byteLength, length, klass;\n if (!isObject(data)) {\n length = toIndex(data);\n byteLength = length * BYTES;\n buffer = new $ArrayBuffer(byteLength);\n } else if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n buffer = data;\n offset = toOffset($offset, BYTES);\n var $len = data.byteLength;\n if ($length === undefined) {\n if ($len % BYTES) throw RangeError(WRONG_LENGTH);\n byteLength = $len - offset;\n if (byteLength < 0) throw RangeError(WRONG_LENGTH);\n } else {\n byteLength = toLength($length) * BYTES;\n if (byteLength + offset > $len) throw RangeError(WRONG_LENGTH);\n }\n length = byteLength / BYTES;\n } else if (TYPED_ARRAY in data) {\n return fromList(TypedArray, data);\n } else {\n return $from.call(TypedArray, data);\n }\n hide(that, '_d', {\n b: buffer,\n o: offset,\n l: byteLength,\n e: length,\n v: new $DataView(buffer)\n });\n while (index < length) addElement(that, index++);\n });\n TypedArrayPrototype = TypedArray[PROTOTYPE] = create($TypedArrayPrototype$);\n hide(TypedArrayPrototype, 'constructor', TypedArray);\n } else if (!fails(function () {\n TypedArray(1);\n }) || !fails(function () {\n new TypedArray(-1); // eslint-disable-line no-new\n }) || !$iterDetect(function (iter) {\n new TypedArray(); // eslint-disable-line no-new\n new TypedArray(null); // eslint-disable-line no-new\n new TypedArray(1.5); // eslint-disable-line no-new\n new TypedArray(iter); // eslint-disable-line no-new\n }, true)) {\n TypedArray = wrapper(function (that, data, $offset, $length) {\n anInstance(that, TypedArray, NAME);\n var klass;\n // `ws` module bug, temporarily remove validation length for Uint8Array\n // https://github.com/websockets/ws/pull/645\n if (!isObject(data)) return new Base(toIndex(data));\n if (data instanceof $ArrayBuffer || (klass = classof(data)) == ARRAY_BUFFER || klass == SHARED_BUFFER) {\n return $length !== undefined\n ? new Base(data, toOffset($offset, BYTES), $length)\n : $offset !== undefined\n ? new Base(data, toOffset($offset, BYTES))\n : new Base(data);\n }\n if (TYPED_ARRAY in data) return fromList(TypedArray, data);\n return $from.call(TypedArray, data);\n });\n arrayForEach(TAC !== Function.prototype ? gOPN(Base).concat(gOPN(TAC)) : gOPN(Base), function (key) {\n if (!(key in TypedArray)) hide(TypedArray, key, Base[key]);\n });\n TypedArray[PROTOTYPE] = TypedArrayPrototype;\n if (!LIBRARY) TypedArrayPrototype.constructor = TypedArray;\n }\n var $nativeIterator = TypedArrayPrototype[ITERATOR];\n var CORRECT_ITER_NAME = !!$nativeIterator\n && ($nativeIterator.name == 'values' || $nativeIterator.name == undefined);\n var $iterator = $iterators.values;\n hide(TypedArray, TYPED_CONSTRUCTOR, true);\n hide(TypedArrayPrototype, TYPED_ARRAY, NAME);\n hide(TypedArrayPrototype, VIEW, true);\n hide(TypedArrayPrototype, DEF_CONSTRUCTOR, TypedArray);\n\n if (CLAMPED ? new TypedArray(1)[TAG] != NAME : !(TAG in TypedArrayPrototype)) {\n dP(TypedArrayPrototype, TAG, {\n get: function () { return NAME; }\n });\n }\n\n O[NAME] = TypedArray;\n\n $export($export.G + $export.W + $export.F * (TypedArray != Base), O);\n\n $export($export.S, NAME, {\n BYTES_PER_ELEMENT: BYTES\n });\n\n $export($export.S + $export.F * fails(function () { Base.of.call(TypedArray, 1); }), NAME, {\n from: $from,\n of: $of\n });\n\n if (!(BYTES_PER_ELEMENT in TypedArrayPrototype)) hide(TypedArrayPrototype, BYTES_PER_ELEMENT, BYTES);\n\n $export($export.P, NAME, proto);\n\n setSpecies(NAME);\n\n $export($export.P + $export.F * FORCED_SET, NAME, { set: $set });\n\n $export($export.P + $export.F * !CORRECT_ITER_NAME, NAME, $iterators);\n\n if (!LIBRARY && TypedArrayPrototype.toString != arrayToString) TypedArrayPrototype.toString = arrayToString;\n\n $export($export.P + $export.F * fails(function () {\n new TypedArray(1).slice();\n }), NAME, { slice: $slice });\n\n $export($export.P + $export.F * (fails(function () {\n return [1, 2].toLocaleString() != new TypedArray([1, 2]).toLocaleString();\n }) || !fails(function () {\n TypedArrayPrototype.toLocaleString.call([1, 2]);\n })), NAME, { toLocaleString: $toLocaleString });\n\n Iterators[NAME] = CORRECT_ITER_NAME ? $nativeIterator : $iterator;\n if (!LIBRARY && !CORRECT_ITER_NAME) hide(TypedArrayPrototype, ITERATOR, $iterator);\n };\n} else module.exports = function () { /* empty */ };\n","'use strict';\nvar global = require('./_global');\nvar DESCRIPTORS = require('./_descriptors');\nvar LIBRARY = require('./_library');\nvar $typed = require('./_typed');\nvar hide = require('./_hide');\nvar redefineAll = require('./_redefine-all');\nvar fails = require('./_fails');\nvar anInstance = require('./_an-instance');\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nvar toIndex = require('./_to-index');\nvar gOPN = require('./_object-gopn').f;\nvar dP = require('./_object-dp').f;\nvar arrayFill = require('./_array-fill');\nvar setToStringTag = require('./_set-to-string-tag');\nvar ARRAY_BUFFER = 'ArrayBuffer';\nvar DATA_VIEW = 'DataView';\nvar PROTOTYPE = 'prototype';\nvar WRONG_LENGTH = 'Wrong length!';\nvar WRONG_INDEX = 'Wrong index!';\nvar $ArrayBuffer = global[ARRAY_BUFFER];\nvar $DataView = global[DATA_VIEW];\nvar Math = global.Math;\nvar RangeError = global.RangeError;\n// eslint-disable-next-line no-shadow-restricted-names\nvar Infinity = global.Infinity;\nvar BaseBuffer = $ArrayBuffer;\nvar abs = Math.abs;\nvar pow = Math.pow;\nvar floor = Math.floor;\nvar log = Math.log;\nvar LN2 = Math.LN2;\nvar BUFFER = 'buffer';\nvar BYTE_LENGTH = 'byteLength';\nvar BYTE_OFFSET = 'byteOffset';\nvar $BUFFER = DESCRIPTORS ? '_b' : BUFFER;\nvar $LENGTH = DESCRIPTORS ? '_l' : BYTE_LENGTH;\nvar $OFFSET = DESCRIPTORS ? '_o' : BYTE_OFFSET;\n\n// IEEE754 conversions based on https://github.com/feross/ieee754\nfunction packIEEE754(value, mLen, nBytes) {\n var buffer = new Array(nBytes);\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var rt = mLen === 23 ? pow(2, -24) - pow(2, -77) : 0;\n var i = 0;\n var s = value < 0 || value === 0 && 1 / value < 0 ? 1 : 0;\n var e, m, c;\n value = abs(value);\n // eslint-disable-next-line no-self-compare\n if (value != value || value === Infinity) {\n // eslint-disable-next-line no-self-compare\n m = value != value ? 1 : 0;\n e = eMax;\n } else {\n e = floor(log(value) / LN2);\n if (value * (c = pow(2, -e)) < 1) {\n e--;\n c *= 2;\n }\n if (e + eBias >= 1) {\n value += rt / c;\n } else {\n value += rt * pow(2, 1 - eBias);\n }\n if (value * c >= 2) {\n e++;\n c /= 2;\n }\n if (e + eBias >= eMax) {\n m = 0;\n e = eMax;\n } else if (e + eBias >= 1) {\n m = (value * c - 1) * pow(2, mLen);\n e = e + eBias;\n } else {\n m = value * pow(2, eBias - 1) * pow(2, mLen);\n e = 0;\n }\n }\n for (; mLen >= 8; buffer[i++] = m & 255, m /= 256, mLen -= 8);\n e = e << mLen | m;\n eLen += mLen;\n for (; eLen > 0; buffer[i++] = e & 255, e /= 256, eLen -= 8);\n buffer[--i] |= s * 128;\n return buffer;\n}\nfunction unpackIEEE754(buffer, mLen, nBytes) {\n var eLen = nBytes * 8 - mLen - 1;\n var eMax = (1 << eLen) - 1;\n var eBias = eMax >> 1;\n var nBits = eLen - 7;\n var i = nBytes - 1;\n var s = buffer[i--];\n var e = s & 127;\n var m;\n s >>= 7;\n for (; nBits > 0; e = e * 256 + buffer[i], i--, nBits -= 8);\n m = e & (1 << -nBits) - 1;\n e >>= -nBits;\n nBits += mLen;\n for (; nBits > 0; m = m * 256 + buffer[i], i--, nBits -= 8);\n if (e === 0) {\n e = 1 - eBias;\n } else if (e === eMax) {\n return m ? NaN : s ? -Infinity : Infinity;\n } else {\n m = m + pow(2, mLen);\n e = e - eBias;\n } return (s ? -1 : 1) * m * pow(2, e - mLen);\n}\n\nfunction unpackI32(bytes) {\n return bytes[3] << 24 | bytes[2] << 16 | bytes[1] << 8 | bytes[0];\n}\nfunction packI8(it) {\n return [it & 0xff];\n}\nfunction packI16(it) {\n return [it & 0xff, it >> 8 & 0xff];\n}\nfunction packI32(it) {\n return [it & 0xff, it >> 8 & 0xff, it >> 16 & 0xff, it >> 24 & 0xff];\n}\nfunction packF64(it) {\n return packIEEE754(it, 52, 8);\n}\nfunction packF32(it) {\n return packIEEE754(it, 23, 4);\n}\n\nfunction addGetter(C, key, internal) {\n dP(C[PROTOTYPE], key, { get: function () { return this[internal]; } });\n}\n\nfunction get(view, bytes, index, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = store.slice(start, start + bytes);\n return isLittleEndian ? pack : pack.reverse();\n}\nfunction set(view, bytes, index, conversion, value, isLittleEndian) {\n var numIndex = +index;\n var intIndex = toIndex(numIndex);\n if (intIndex + bytes > view[$LENGTH]) throw RangeError(WRONG_INDEX);\n var store = view[$BUFFER]._b;\n var start = intIndex + view[$OFFSET];\n var pack = conversion(+value);\n for (var i = 0; i < bytes; i++) store[start + i] = pack[isLittleEndian ? i : bytes - i - 1];\n}\n\nif (!$typed.ABV) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer, ARRAY_BUFFER);\n var byteLength = toIndex(length);\n this._b = arrayFill.call(new Array(byteLength), 0);\n this[$LENGTH] = byteLength;\n };\n\n $DataView = function DataView(buffer, byteOffset, byteLength) {\n anInstance(this, $DataView, DATA_VIEW);\n anInstance(buffer, $ArrayBuffer, DATA_VIEW);\n var bufferLength = buffer[$LENGTH];\n var offset = toInteger(byteOffset);\n if (offset < 0 || offset > bufferLength) throw RangeError('Wrong offset!');\n byteLength = byteLength === undefined ? bufferLength - offset : toLength(byteLength);\n if (offset + byteLength > bufferLength) throw RangeError(WRONG_LENGTH);\n this[$BUFFER] = buffer;\n this[$OFFSET] = offset;\n this[$LENGTH] = byteLength;\n };\n\n if (DESCRIPTORS) {\n addGetter($ArrayBuffer, BYTE_LENGTH, '_l');\n addGetter($DataView, BUFFER, '_b');\n addGetter($DataView, BYTE_LENGTH, '_l');\n addGetter($DataView, BYTE_OFFSET, '_o');\n }\n\n redefineAll($DataView[PROTOTYPE], {\n getInt8: function getInt8(byteOffset) {\n return get(this, 1, byteOffset)[0] << 24 >> 24;\n },\n getUint8: function getUint8(byteOffset) {\n return get(this, 1, byteOffset)[0];\n },\n getInt16: function getInt16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return (bytes[1] << 8 | bytes[0]) << 16 >> 16;\n },\n getUint16: function getUint16(byteOffset /* , littleEndian */) {\n var bytes = get(this, 2, byteOffset, arguments[1]);\n return bytes[1] << 8 | bytes[0];\n },\n getInt32: function getInt32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1]));\n },\n getUint32: function getUint32(byteOffset /* , littleEndian */) {\n return unpackI32(get(this, 4, byteOffset, arguments[1])) >>> 0;\n },\n getFloat32: function getFloat32(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 4, byteOffset, arguments[1]), 23, 4);\n },\n getFloat64: function getFloat64(byteOffset /* , littleEndian */) {\n return unpackIEEE754(get(this, 8, byteOffset, arguments[1]), 52, 8);\n },\n setInt8: function setInt8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setUint8: function setUint8(byteOffset, value) {\n set(this, 1, byteOffset, packI8, value);\n },\n setInt16: function setInt16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setUint16: function setUint16(byteOffset, value /* , littleEndian */) {\n set(this, 2, byteOffset, packI16, value, arguments[2]);\n },\n setInt32: function setInt32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setUint32: function setUint32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packI32, value, arguments[2]);\n },\n setFloat32: function setFloat32(byteOffset, value /* , littleEndian */) {\n set(this, 4, byteOffset, packF32, value, arguments[2]);\n },\n setFloat64: function setFloat64(byteOffset, value /* , littleEndian */) {\n set(this, 8, byteOffset, packF64, value, arguments[2]);\n }\n });\n} else {\n if (!fails(function () {\n $ArrayBuffer(1);\n }) || !fails(function () {\n new $ArrayBuffer(-1); // eslint-disable-line no-new\n }) || fails(function () {\n new $ArrayBuffer(); // eslint-disable-line no-new\n new $ArrayBuffer(1.5); // eslint-disable-line no-new\n new $ArrayBuffer(NaN); // eslint-disable-line no-new\n return $ArrayBuffer.name != ARRAY_BUFFER;\n })) {\n $ArrayBuffer = function ArrayBuffer(length) {\n anInstance(this, $ArrayBuffer);\n return new BaseBuffer(toIndex(length));\n };\n var ArrayBufferProto = $ArrayBuffer[PROTOTYPE] = BaseBuffer[PROTOTYPE];\n for (var keys = gOPN(BaseBuffer), j = 0, key; keys.length > j;) {\n if (!((key = keys[j++]) in $ArrayBuffer)) hide($ArrayBuffer, key, BaseBuffer[key]);\n }\n if (!LIBRARY) ArrayBufferProto.constructor = $ArrayBuffer;\n }\n // iOS Safari 7.x bug\n var view = new $DataView(new $ArrayBuffer(2));\n var $setInt8 = $DataView[PROTOTYPE].setInt8;\n view.setInt8(0, 2147483648);\n view.setInt8(1, 2147483649);\n if (view.getInt8(0) || !view.getInt8(1)) redefineAll($DataView[PROTOTYPE], {\n setInt8: function setInt8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n },\n setUint8: function setUint8(byteOffset, value) {\n $setInt8.call(this, byteOffset, value << 24 >> 24);\n }\n }, true);\n}\nsetToStringTag($ArrayBuffer, ARRAY_BUFFER);\nsetToStringTag($DataView, DATA_VIEW);\nhide($DataView[PROTOTYPE], $typed.VIEW, true);\nexports[ARRAY_BUFFER] = $ArrayBuffer;\nexports[DATA_VIEW] = $DataView;\n","var global = require('./_global');\nvar hide = require('./_hide');\nvar uid = require('./_uid');\nvar TYPED = uid('typed_array');\nvar VIEW = uid('view');\nvar ABV = !!(global.ArrayBuffer && global.DataView);\nvar CONSTR = ABV;\nvar i = 0;\nvar l = 9;\nvar Typed;\n\nvar TypedArrayConstructors = (\n 'Int8Array,Uint8Array,Uint8ClampedArray,Int16Array,Uint16Array,Int32Array,Uint32Array,Float32Array,Float64Array'\n).split(',');\n\nwhile (i < l) {\n if (Typed = global[TypedArrayConstructors[i++]]) {\n hide(Typed.prototype, TYPED, true);\n hide(Typed.prototype, VIEW, true);\n } else CONSTR = false;\n}\n\nmodule.exports = {\n ABV: ABV,\n CONSTR: CONSTR,\n TYPED: TYPED,\n VIEW: VIEW\n};\n","var id = 0;\nvar px = Math.random();\nmodule.exports = function (key) {\n return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36));\n};\n","var global = require('./_global');\nvar navigator = global.navigator;\n\nmodule.exports = navigator && navigator.userAgent || '';\n","var isObject = require('./_is-object');\nmodule.exports = function (it, TYPE) {\n if (!isObject(it) || it._t !== TYPE) throw TypeError('Incompatible receiver, ' + TYPE + ' required!');\n return it;\n};\n","var global = require('./_global');\nvar core = require('./_core');\nvar LIBRARY = require('./_library');\nvar wksExt = require('./_wks-ext');\nvar defineProperty = require('./_object-dp').f;\nmodule.exports = function (name) {\n var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {});\n if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) });\n};\n","exports.f = require('./_wks');\n","var store = require('./_shared')('wks');\nvar uid = require('./_uid');\nvar Symbol = require('./_global').Symbol;\nvar USE_SYMBOL = typeof Symbol == 'function';\n\nvar $exports = module.exports = function (name) {\n return store[name] || (store[name] =\n USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name));\n};\n\n$exports.store = store;\n","var classof = require('./_classof');\nvar ITERATOR = require('./_wks')('iterator');\nvar Iterators = require('./_iterators');\nmodule.exports = require('./_core').getIteratorMethod = function (it) {\n if (it != undefined) return it[ITERATOR]\n || it['@@iterator']\n || Iterators[classof(it)];\n};\n","// https://github.com/benjamingr/RexExp.escape\nvar $export = require('./_export');\nvar $re = require('./_replacer')(/[\\\\^$*+?.()|[\\]{}]/g, '\\\\$&');\n\n$export($export.S, 'RegExp', { escape: function escape(it) { return $re(it); } });\n","// 22.1.3.3 Array.prototype.copyWithin(target, start, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { copyWithin: require('./_array-copy-within') });\n\nrequire('./_add-to-unscopables')('copyWithin');\n","'use strict';\nvar $export = require('./_export');\nvar $every = require('./_array-methods')(4);\n\n$export($export.P + $export.F * !require('./_strict-method')([].every, true), 'Array', {\n // 22.1.3.5 / 15.4.4.16 Array.prototype.every(callbackfn [, thisArg])\n every: function every(callbackfn /* , thisArg */) {\n return $every(this, callbackfn, arguments[1]);\n }\n});\n","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { fill: require('./_array-fill') });\n\nrequire('./_add-to-unscopables')('fill');\n","'use strict';\nvar $export = require('./_export');\nvar $filter = require('./_array-methods')(2);\n\n$export($export.P + $export.F * !require('./_strict-method')([].filter, true), 'Array', {\n // 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg])\n filter: function filter(callbackfn /* , thisArg */) {\n return $filter(this, callbackfn, arguments[1]);\n }\n});\n","'use strict';\n// 22.1.3.9 Array.prototype.findIndex(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(6);\nvar KEY = 'findIndex';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n findIndex: function findIndex(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","'use strict';\n// 22.1.3.8 Array.prototype.find(predicate, thisArg = undefined)\nvar $export = require('./_export');\nvar $find = require('./_array-methods')(5);\nvar KEY = 'find';\nvar forced = true;\n// Shouldn't skip holes\nif (KEY in []) Array(1)[KEY](function () { forced = false; });\n$export($export.P + $export.F * forced, 'Array', {\n find: function find(callbackfn /* , that = undefined */) {\n return $find(this, callbackfn, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\nrequire('./_add-to-unscopables')(KEY);\n","'use strict';\nvar $export = require('./_export');\nvar $forEach = require('./_array-methods')(0);\nvar STRICT = require('./_strict-method')([].forEach, true);\n\n$export($export.P + $export.F * !STRICT, 'Array', {\n // 22.1.3.10 / 15.4.4.18 Array.prototype.forEach(callbackfn [, thisArg])\n forEach: function forEach(callbackfn /* , thisArg */) {\n return $forEach(this, callbackfn, arguments[1]);\n }\n});\n","'use strict';\nvar ctx = require('./_ctx');\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar call = require('./_iter-call');\nvar isArrayIter = require('./_is-array-iter');\nvar toLength = require('./_to-length');\nvar createProperty = require('./_create-property');\nvar getIterFn = require('./core.get-iterator-method');\n\n$export($export.S + $export.F * !require('./_iter-detect')(function (iter) { Array.from(iter); }), 'Array', {\n // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined)\n from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) {\n var O = toObject(arrayLike);\n var C = typeof this == 'function' ? this : Array;\n var aLen = arguments.length;\n var mapfn = aLen > 1 ? arguments[1] : undefined;\n var mapping = mapfn !== undefined;\n var index = 0;\n var iterFn = getIterFn(O);\n var length, result, step, iterator;\n if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2);\n // if object isn't iterable or it's array with default iterator - use simple case\n if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) {\n for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) {\n createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value);\n }\n } else {\n length = toLength(O.length);\n for (result = new C(length); length > index; index++) {\n createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]);\n }\n }\n result.length = index;\n return result;\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar $indexOf = require('./_array-includes')(false);\nvar $native = [].indexOf;\nvar NEGATIVE_ZERO = !!$native && 1 / [1].indexOf(1, -0) < 0;\n\n$export($export.P + $export.F * (NEGATIVE_ZERO || !require('./_strict-method')($native)), 'Array', {\n // 22.1.3.11 / 15.4.4.14 Array.prototype.indexOf(searchElement [, fromIndex])\n indexOf: function indexOf(searchElement /* , fromIndex = 0 */) {\n return NEGATIVE_ZERO\n // convert -0 to +0\n ? $native.apply(this, arguments) || 0\n : $indexOf(this, searchElement, arguments[1]);\n }\n});\n","// 22.1.2.2 / 15.4.3.2 Array.isArray(arg)\nvar $export = require('./_export');\n\n$export($export.S, 'Array', { isArray: require('./_is-array') });\n","'use strict';\nvar addToUnscopables = require('./_add-to-unscopables');\nvar step = require('./_iter-step');\nvar Iterators = require('./_iterators');\nvar toIObject = require('./_to-iobject');\n\n// 22.1.3.4 Array.prototype.entries()\n// 22.1.3.13 Array.prototype.keys()\n// 22.1.3.29 Array.prototype.values()\n// 22.1.3.30 Array.prototype[@@iterator]()\nmodule.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) {\n this._t = toIObject(iterated); // target\n this._i = 0; // next index\n this._k = kind; // kind\n// 22.1.5.2.1 %ArrayIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var kind = this._k;\n var index = this._i++;\n if (!O || index >= O.length) {\n this._t = undefined;\n return step(1);\n }\n if (kind == 'keys') return step(0, index);\n if (kind == 'values') return step(0, O[index]);\n return step(0, [index, O[index]]);\n}, 'values');\n\n// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7)\nIterators.Arguments = Iterators.Array;\n\naddToUnscopables('keys');\naddToUnscopables('values');\naddToUnscopables('entries');\n","'use strict';\n// 22.1.3.13 Array.prototype.join(separator)\nvar $export = require('./_export');\nvar toIObject = require('./_to-iobject');\nvar arrayJoin = [].join;\n\n// fallback for not array-like strings\n$export($export.P + $export.F * (require('./_iobject') != Object || !require('./_strict-method')(arrayJoin)), 'Array', {\n join: function join(separator) {\n return arrayJoin.call(toIObject(this), separator === undefined ? ',' : separator);\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar toIObject = require('./_to-iobject');\nvar toInteger = require('./_to-integer');\nvar toLength = require('./_to-length');\nvar $native = [].lastIndexOf;\nvar NEGATIVE_ZERO = !!$native && 1 / [1].lastIndexOf(1, -0) < 0;\n\n$export($export.P + $export.F * (NEGATIVE_ZERO || !require('./_strict-method')($native)), 'Array', {\n // 22.1.3.14 / 15.4.4.15 Array.prototype.lastIndexOf(searchElement [, fromIndex])\n lastIndexOf: function lastIndexOf(searchElement /* , fromIndex = @[*-1] */) {\n // convert -0 to +0\n if (NEGATIVE_ZERO) return $native.apply(this, arguments) || 0;\n var O = toIObject(this);\n var length = toLength(O.length);\n var index = length - 1;\n if (arguments.length > 1) index = Math.min(index, toInteger(arguments[1]));\n if (index < 0) index = length + index;\n for (;index >= 0; index--) if (index in O) if (O[index] === searchElement) return index || 0;\n return -1;\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar $map = require('./_array-methods')(1);\n\n$export($export.P + $export.F * !require('./_strict-method')([].map, true), 'Array', {\n // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg])\n map: function map(callbackfn /* , thisArg */) {\n return $map(this, callbackfn, arguments[1]);\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar createProperty = require('./_create-property');\n\n// WebKit Array.of isn't generic\n$export($export.S + $export.F * require('./_fails')(function () {\n function F() { /* empty */ }\n return !(Array.of.call(F) instanceof F);\n}), 'Array', {\n // 22.1.2.3 Array.of( ...items)\n of: function of(/* ...args */) {\n var index = 0;\n var aLen = arguments.length;\n var result = new (typeof this == 'function' ? this : Array)(aLen);\n while (aLen > index) createProperty(result, index, arguments[index++]);\n result.length = aLen;\n return result;\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar $reduce = require('./_array-reduce');\n\n$export($export.P + $export.F * !require('./_strict-method')([].reduceRight, true), 'Array', {\n // 22.1.3.19 / 15.4.4.22 Array.prototype.reduceRight(callbackfn [, initialValue])\n reduceRight: function reduceRight(callbackfn /* , initialValue */) {\n return $reduce(this, callbackfn, arguments.length, arguments[1], true);\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar $reduce = require('./_array-reduce');\n\n$export($export.P + $export.F * !require('./_strict-method')([].reduce, true), 'Array', {\n // 22.1.3.18 / 15.4.4.21 Array.prototype.reduce(callbackfn [, initialValue])\n reduce: function reduce(callbackfn /* , initialValue */) {\n return $reduce(this, callbackfn, arguments.length, arguments[1], false);\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar html = require('./_html');\nvar cof = require('./_cof');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nvar arraySlice = [].slice;\n\n// fallback for not array-like ES3 strings and DOM objects\n$export($export.P + $export.F * require('./_fails')(function () {\n if (html) arraySlice.call(html);\n}), 'Array', {\n slice: function slice(begin, end) {\n var len = toLength(this.length);\n var klass = cof(this);\n end = end === undefined ? len : end;\n if (klass == 'Array') return arraySlice.call(this, begin, end);\n var start = toAbsoluteIndex(begin, len);\n var upTo = toAbsoluteIndex(end, len);\n var size = toLength(upTo - start);\n var cloned = new Array(size);\n var i = 0;\n for (; i < size; i++) cloned[i] = klass == 'String'\n ? this.charAt(start + i)\n : this[start + i];\n return cloned;\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar $some = require('./_array-methods')(3);\n\n$export($export.P + $export.F * !require('./_strict-method')([].some, true), 'Array', {\n // 22.1.3.23 / 15.4.4.17 Array.prototype.some(callbackfn [, thisArg])\n some: function some(callbackfn /* , thisArg */) {\n return $some(this, callbackfn, arguments[1]);\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar aFunction = require('./_a-function');\nvar toObject = require('./_to-object');\nvar fails = require('./_fails');\nvar $sort = [].sort;\nvar test = [1, 2, 3];\n\n$export($export.P + $export.F * (fails(function () {\n // IE8-\n test.sort(undefined);\n}) || !fails(function () {\n // V8 bug\n test.sort(null);\n // Old WebKit\n}) || !require('./_strict-method')($sort)), 'Array', {\n // 22.1.3.25 Array.prototype.sort(comparefn)\n sort: function sort(comparefn) {\n return comparefn === undefined\n ? $sort.call(toObject(this))\n : $sort.call(toObject(this), aFunction(comparefn));\n }\n});\n","require('./_set-species')('Array');\n","// 20.3.3.1 / 15.9.4.4 Date.now()\nvar $export = require('./_export');\n\n$export($export.S, 'Date', { now: function () { return new Date().getTime(); } });\n","// 20.3.4.36 / 15.9.5.43 Date.prototype.toISOString()\nvar $export = require('./_export');\nvar toISOString = require('./_date-to-iso-string');\n\n// PhantomJS / old WebKit has a broken implementations\n$export($export.P + $export.F * (Date.prototype.toISOString !== toISOString), 'Date', {\n toISOString: toISOString\n});\n","'use strict';\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar toPrimitive = require('./_to-primitive');\n\n$export($export.P + $export.F * require('./_fails')(function () {\n return new Date(NaN).toJSON() !== null\n || Date.prototype.toJSON.call({ toISOString: function () { return 1; } }) !== 1;\n}), 'Date', {\n // eslint-disable-next-line no-unused-vars\n toJSON: function toJSON(key) {\n var O = toObject(this);\n var pv = toPrimitive(O);\n return typeof pv == 'number' && !isFinite(pv) ? null : O.toISOString();\n }\n});\n","var TO_PRIMITIVE = require('./_wks')('toPrimitive');\nvar proto = Date.prototype;\n\nif (!(TO_PRIMITIVE in proto)) require('./_hide')(proto, TO_PRIMITIVE, require('./_date-to-primitive'));\n","var DateProto = Date.prototype;\nvar INVALID_DATE = 'Invalid Date';\nvar TO_STRING = 'toString';\nvar $toString = DateProto[TO_STRING];\nvar getTime = DateProto.getTime;\nif (new Date(NaN) + '' != INVALID_DATE) {\n require('./_redefine')(DateProto, TO_STRING, function toString() {\n var value = getTime.call(this);\n // eslint-disable-next-line no-self-compare\n return value === value ? $toString.call(this) : INVALID_DATE;\n });\n}\n","// 19.2.3.2 / 15.3.4.5 Function.prototype.bind(thisArg, args...)\nvar $export = require('./_export');\n\n$export($export.P, 'Function', { bind: require('./_bind') });\n","'use strict';\nvar isObject = require('./_is-object');\nvar getPrototypeOf = require('./_object-gpo');\nvar HAS_INSTANCE = require('./_wks')('hasInstance');\nvar FunctionProto = Function.prototype;\n// 19.2.3.6 Function.prototype[@@hasInstance](V)\nif (!(HAS_INSTANCE in FunctionProto)) require('./_object-dp').f(FunctionProto, HAS_INSTANCE, { value: function (O) {\n if (typeof this != 'function' || !isObject(O)) return false;\n if (!isObject(this.prototype)) return O instanceof this;\n // for environment w/o native `@@hasInstance` logic enough `instanceof`, but add this:\n while (O = getPrototypeOf(O)) if (this.prototype === O) return true;\n return false;\n} });\n","var dP = require('./_object-dp').f;\nvar FProto = Function.prototype;\nvar nameRE = /^\\s*function ([^ (]*)/;\nvar NAME = 'name';\n\n// 19.2.4.2 name\nNAME in FProto || require('./_descriptors') && dP(FProto, NAME, {\n configurable: true,\n get: function () {\n try {\n return ('' + this).match(nameRE)[1];\n } catch (e) {\n return '';\n }\n }\n});\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar MAP = 'Map';\n\n// 23.1 Map Objects\nmodule.exports = require('./_collection')(MAP, function (get) {\n return function Map() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.1.3.6 Map.prototype.get(key)\n get: function get(key) {\n var entry = strong.getEntry(validate(this, MAP), key);\n return entry && entry.v;\n },\n // 23.1.3.9 Map.prototype.set(key, value)\n set: function set(key, value) {\n return strong.def(validate(this, MAP), key === 0 ? 0 : key, value);\n }\n}, strong, true);\n","// 20.2.2.3 Math.acosh(x)\nvar $export = require('./_export');\nvar log1p = require('./_math-log1p');\nvar sqrt = Math.sqrt;\nvar $acosh = Math.acosh;\n\n$export($export.S + $export.F * !($acosh\n // V8 bug: https://code.google.com/p/v8/issues/detail?id=3509\n && Math.floor($acosh(Number.MAX_VALUE)) == 710\n // Tor Browser bug: Math.acosh(Infinity) -> NaN\n && $acosh(Infinity) == Infinity\n), 'Math', {\n acosh: function acosh(x) {\n return (x = +x) < 1 ? NaN : x > 94906265.62425156\n ? Math.log(x) + Math.LN2\n : log1p(x - 1 + sqrt(x - 1) * sqrt(x + 1));\n }\n});\n","// 20.2.2.5 Math.asinh(x)\nvar $export = require('./_export');\nvar $asinh = Math.asinh;\n\nfunction asinh(x) {\n return !isFinite(x = +x) || x == 0 ? x : x < 0 ? -asinh(-x) : Math.log(x + Math.sqrt(x * x + 1));\n}\n\n// Tor Browser bug: Math.asinh(0) -> -0\n$export($export.S + $export.F * !($asinh && 1 / $asinh(0) > 0), 'Math', { asinh: asinh });\n","// 20.2.2.7 Math.atanh(x)\nvar $export = require('./_export');\nvar $atanh = Math.atanh;\n\n// Tor Browser bug: Math.atanh(-0) -> 0\n$export($export.S + $export.F * !($atanh && 1 / $atanh(-0) < 0), 'Math', {\n atanh: function atanh(x) {\n return (x = +x) == 0 ? x : Math.log((1 + x) / (1 - x)) / 2;\n }\n});\n","// 20.2.2.9 Math.cbrt(x)\nvar $export = require('./_export');\nvar sign = require('./_math-sign');\n\n$export($export.S, 'Math', {\n cbrt: function cbrt(x) {\n return sign(x = +x) * Math.pow(Math.abs(x), 1 / 3);\n }\n});\n","// 20.2.2.11 Math.clz32(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n clz32: function clz32(x) {\n return (x >>>= 0) ? 31 - Math.floor(Math.log(x + 0.5) * Math.LOG2E) : 32;\n }\n});\n","// 20.2.2.12 Math.cosh(x)\nvar $export = require('./_export');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n cosh: function cosh(x) {\n return (exp(x = +x) + exp(-x)) / 2;\n }\n});\n","// 20.2.2.14 Math.expm1(x)\nvar $export = require('./_export');\nvar $expm1 = require('./_math-expm1');\n\n$export($export.S + $export.F * ($expm1 != Math.expm1), 'Math', { expm1: $expm1 });\n","// 20.2.2.16 Math.fround(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { fround: require('./_math-fround') });\n","// 20.2.2.17 Math.hypot([value1[, value2[, … ]]])\nvar $export = require('./_export');\nvar abs = Math.abs;\n\n$export($export.S, 'Math', {\n hypot: function hypot(value1, value2) { // eslint-disable-line no-unused-vars\n var sum = 0;\n var i = 0;\n var aLen = arguments.length;\n var larg = 0;\n var arg, div;\n while (i < aLen) {\n arg = abs(arguments[i++]);\n if (larg < arg) {\n div = larg / arg;\n sum = sum * div * div + 1;\n larg = arg;\n } else if (arg > 0) {\n div = arg / larg;\n sum += div * div;\n } else sum += arg;\n }\n return larg === Infinity ? Infinity : larg * Math.sqrt(sum);\n }\n});\n","// 20.2.2.18 Math.imul(x, y)\nvar $export = require('./_export');\nvar $imul = Math.imul;\n\n// some WebKit versions fails with big numbers, some has wrong arity\n$export($export.S + $export.F * require('./_fails')(function () {\n return $imul(0xffffffff, 5) != -5 || $imul.length != 2;\n}), 'Math', {\n imul: function imul(x, y) {\n var UINT16 = 0xffff;\n var xn = +x;\n var yn = +y;\n var xl = UINT16 & xn;\n var yl = UINT16 & yn;\n return 0 | xl * yl + ((UINT16 & xn >>> 16) * yl + xl * (UINT16 & yn >>> 16) << 16 >>> 0);\n }\n});\n","// 20.2.2.21 Math.log10(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log10: function log10(x) {\n return Math.log(x) * Math.LOG10E;\n }\n});\n","// 20.2.2.20 Math.log1p(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { log1p: require('./_math-log1p') });\n","// 20.2.2.22 Math.log2(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n log2: function log2(x) {\n return Math.log(x) / Math.LN2;\n }\n});\n","// 20.2.2.28 Math.sign(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { sign: require('./_math-sign') });\n","// 20.2.2.30 Math.sinh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n// V8 near Chromium 38 has a problem with very small numbers\n$export($export.S + $export.F * require('./_fails')(function () {\n return !Math.sinh(-2e-17) != -2e-17;\n}), 'Math', {\n sinh: function sinh(x) {\n return Math.abs(x = +x) < 1\n ? (expm1(x) - expm1(-x)) / 2\n : (exp(x - 1) - exp(-x - 1)) * (Math.E / 2);\n }\n});\n","// 20.2.2.33 Math.tanh(x)\nvar $export = require('./_export');\nvar expm1 = require('./_math-expm1');\nvar exp = Math.exp;\n\n$export($export.S, 'Math', {\n tanh: function tanh(x) {\n var a = expm1(x = +x);\n var b = expm1(-x);\n return a == Infinity ? 1 : b == Infinity ? -1 : (a - b) / (exp(x) + exp(-x));\n }\n});\n","// 20.2.2.34 Math.trunc(x)\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n trunc: function trunc(it) {\n return (it > 0 ? Math.floor : Math.ceil)(it);\n }\n});\n","'use strict';\nvar global = require('./_global');\nvar has = require('./_has');\nvar cof = require('./_cof');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar toPrimitive = require('./_to-primitive');\nvar fails = require('./_fails');\nvar gOPN = require('./_object-gopn').f;\nvar gOPD = require('./_object-gopd').f;\nvar dP = require('./_object-dp').f;\nvar $trim = require('./_string-trim').trim;\nvar NUMBER = 'Number';\nvar $Number = global[NUMBER];\nvar Base = $Number;\nvar proto = $Number.prototype;\n// Opera ~12 has broken Object#toString\nvar BROKEN_COF = cof(require('./_object-create')(proto)) == NUMBER;\nvar TRIM = 'trim' in String.prototype;\n\n// 7.1.3 ToNumber(argument)\nvar toNumber = function (argument) {\n var it = toPrimitive(argument, false);\n if (typeof it == 'string' && it.length > 2) {\n it = TRIM ? it.trim() : $trim(it, 3);\n var first = it.charCodeAt(0);\n var third, radix, maxCode;\n if (first === 43 || first === 45) {\n third = it.charCodeAt(2);\n if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix\n } else if (first === 48) {\n switch (it.charCodeAt(1)) {\n case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i\n case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i\n default: return +it;\n }\n for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) {\n code = digits.charCodeAt(i);\n // parseInt parses a string to a first unavailable symbol\n // but ToNumber should return NaN if a string contains unavailable symbols\n if (code < 48 || code > maxCode) return NaN;\n } return parseInt(digits, radix);\n }\n } return +it;\n};\n\nif (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) {\n $Number = function Number(value) {\n var it = arguments.length < 1 ? 0 : value;\n var that = this;\n return that instanceof $Number\n // check on 1..constructor(foo) case\n && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER)\n ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it);\n };\n for (var keys = require('./_descriptors') ? gOPN(Base) : (\n // ES3:\n 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' +\n // ES6 (in case, if modules with ES6 Number statics required before):\n 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' +\n 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger'\n ).split(','), j = 0, key; keys.length > j; j++) {\n if (has(Base, key = keys[j]) && !has($Number, key)) {\n dP($Number, key, gOPD(Base, key));\n }\n }\n $Number.prototype = proto;\n proto.constructor = $Number;\n require('./_redefine')(global, NUMBER, $Number);\n}\n","// 20.1.2.1 Number.EPSILON\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { EPSILON: Math.pow(2, -52) });\n","// 20.1.2.2 Number.isFinite(number)\nvar $export = require('./_export');\nvar _isFinite = require('./_global').isFinite;\n\n$export($export.S, 'Number', {\n isFinite: function isFinite(it) {\n return typeof it == 'number' && _isFinite(it);\n }\n});\n","// 20.1.2.3 Number.isInteger(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { isInteger: require('./_is-integer') });\n","// 20.1.2.4 Number.isNaN(number)\nvar $export = require('./_export');\n\n$export($export.S, 'Number', {\n isNaN: function isNaN(number) {\n // eslint-disable-next-line no-self-compare\n return number != number;\n }\n});\n","// 20.1.2.5 Number.isSafeInteger(number)\nvar $export = require('./_export');\nvar isInteger = require('./_is-integer');\nvar abs = Math.abs;\n\n$export($export.S, 'Number', {\n isSafeInteger: function isSafeInteger(number) {\n return isInteger(number) && abs(number) <= 0x1fffffffffffff;\n }\n});\n","// 20.1.2.6 Number.MAX_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MAX_SAFE_INTEGER: 0x1fffffffffffff });\n","// 20.1.2.10 Number.MIN_SAFE_INTEGER\nvar $export = require('./_export');\n\n$export($export.S, 'Number', { MIN_SAFE_INTEGER: -0x1fffffffffffff });\n","var $export = require('./_export');\nvar $parseFloat = require('./_parse-float');\n// 20.1.2.12 Number.parseFloat(string)\n$export($export.S + $export.F * (Number.parseFloat != $parseFloat), 'Number', { parseFloat: $parseFloat });\n","var $export = require('./_export');\nvar $parseInt = require('./_parse-int');\n// 20.1.2.13 Number.parseInt(string, radix)\n$export($export.S + $export.F * (Number.parseInt != $parseInt), 'Number', { parseInt: $parseInt });\n","'use strict';\nvar $export = require('./_export');\nvar toInteger = require('./_to-integer');\nvar aNumberValue = require('./_a-number-value');\nvar repeat = require('./_string-repeat');\nvar $toFixed = 1.0.toFixed;\nvar floor = Math.floor;\nvar data = [0, 0, 0, 0, 0, 0];\nvar ERROR = 'Number.toFixed: incorrect invocation!';\nvar ZERO = '0';\n\nvar multiply = function (n, c) {\n var i = -1;\n var c2 = c;\n while (++i < 6) {\n c2 += n * data[i];\n data[i] = c2 % 1e7;\n c2 = floor(c2 / 1e7);\n }\n};\nvar divide = function (n) {\n var i = 6;\n var c = 0;\n while (--i >= 0) {\n c += data[i];\n data[i] = floor(c / n);\n c = (c % n) * 1e7;\n }\n};\nvar numToString = function () {\n var i = 6;\n var s = '';\n while (--i >= 0) {\n if (s !== '' || i === 0 || data[i] !== 0) {\n var t = String(data[i]);\n s = s === '' ? t : s + repeat.call(ZERO, 7 - t.length) + t;\n }\n } return s;\n};\nvar pow = function (x, n, acc) {\n return n === 0 ? acc : n % 2 === 1 ? pow(x, n - 1, acc * x) : pow(x * x, n / 2, acc);\n};\nvar log = function (x) {\n var n = 0;\n var x2 = x;\n while (x2 >= 4096) {\n n += 12;\n x2 /= 4096;\n }\n while (x2 >= 2) {\n n += 1;\n x2 /= 2;\n } return n;\n};\n\n$export($export.P + $export.F * (!!$toFixed && (\n 0.00008.toFixed(3) !== '0.000' ||\n 0.9.toFixed(0) !== '1' ||\n 1.255.toFixed(2) !== '1.25' ||\n 1000000000000000128.0.toFixed(0) !== '1000000000000000128'\n) || !require('./_fails')(function () {\n // V8 ~ Android 4.3-\n $toFixed.call({});\n})), 'Number', {\n toFixed: function toFixed(fractionDigits) {\n var x = aNumberValue(this, ERROR);\n var f = toInteger(fractionDigits);\n var s = '';\n var m = ZERO;\n var e, z, j, k;\n if (f < 0 || f > 20) throw RangeError(ERROR);\n // eslint-disable-next-line no-self-compare\n if (x != x) return 'NaN';\n if (x <= -1e21 || x >= 1e21) return String(x);\n if (x < 0) {\n s = '-';\n x = -x;\n }\n if (x > 1e-21) {\n e = log(x * pow(2, 69, 1)) - 69;\n z = e < 0 ? x * pow(2, -e, 1) : x / pow(2, e, 1);\n z *= 0x10000000000000;\n e = 52 - e;\n if (e > 0) {\n multiply(0, z);\n j = f;\n while (j >= 7) {\n multiply(1e7, 0);\n j -= 7;\n }\n multiply(pow(10, j, 1), 0);\n j = e - 1;\n while (j >= 23) {\n divide(1 << 23);\n j -= 23;\n }\n divide(1 << j);\n multiply(1, 1);\n divide(2);\n m = numToString();\n } else {\n multiply(0, z);\n multiply(1 << -e, 0);\n m = numToString() + repeat.call(ZERO, f);\n }\n }\n if (f > 0) {\n k = m.length;\n m = s + (k <= f ? '0.' + repeat.call(ZERO, f - k) + m : m.slice(0, k - f) + '.' + m.slice(k - f));\n } else {\n m = s + m;\n } return m;\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar $fails = require('./_fails');\nvar aNumberValue = require('./_a-number-value');\nvar $toPrecision = 1.0.toPrecision;\n\n$export($export.P + $export.F * ($fails(function () {\n // IE7-\n return $toPrecision.call(1, undefined) !== '1';\n}) || !$fails(function () {\n // V8 ~ Android 4.3-\n $toPrecision.call({});\n})), 'Number', {\n toPrecision: function toPrecision(precision) {\n var that = aNumberValue(this, 'Number#toPrecision: incorrect invocation!');\n return precision === undefined ? $toPrecision.call(that) : $toPrecision.call(that, precision);\n }\n});\n","// 19.1.3.1 Object.assign(target, source)\nvar $export = require('./_export');\n\n$export($export.S + $export.F, 'Object', { assign: require('./_object-assign') });\n","var $export = require('./_export');\n// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties])\n$export($export.S, 'Object', { create: require('./_object-create') });\n","var $export = require('./_export');\n// 19.1.2.3 / 15.2.3.7 Object.defineProperties(O, Properties)\n$export($export.S + $export.F * !require('./_descriptors'), 'Object', { defineProperties: require('./_object-dps') });\n","var $export = require('./_export');\n// 19.1.2.4 / 15.2.3.6 Object.defineProperty(O, P, Attributes)\n$export($export.S + $export.F * !require('./_descriptors'), 'Object', { defineProperty: require('./_object-dp').f });\n","// 19.1.2.5 Object.freeze(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('freeze', function ($freeze) {\n return function freeze(it) {\n return $freeze && isObject(it) ? $freeze(meta(it)) : it;\n };\n});\n","// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\nvar toIObject = require('./_to-iobject');\nvar $getOwnPropertyDescriptor = require('./_object-gopd').f;\n\nrequire('./_object-sap')('getOwnPropertyDescriptor', function () {\n return function getOwnPropertyDescriptor(it, key) {\n return $getOwnPropertyDescriptor(toIObject(it), key);\n };\n});\n","// 19.1.2.7 Object.getOwnPropertyNames(O)\nrequire('./_object-sap')('getOwnPropertyNames', function () {\n return require('./_object-gopn-ext').f;\n});\n","// 19.1.2.9 Object.getPrototypeOf(O)\nvar toObject = require('./_to-object');\nvar $getPrototypeOf = require('./_object-gpo');\n\nrequire('./_object-sap')('getPrototypeOf', function () {\n return function getPrototypeOf(it) {\n return $getPrototypeOf(toObject(it));\n };\n});\n","// 19.1.2.11 Object.isExtensible(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isExtensible', function ($isExtensible) {\n return function isExtensible(it) {\n return isObject(it) ? $isExtensible ? $isExtensible(it) : true : false;\n };\n});\n","// 19.1.2.12 Object.isFrozen(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isFrozen', function ($isFrozen) {\n return function isFrozen(it) {\n return isObject(it) ? $isFrozen ? $isFrozen(it) : false : true;\n };\n});\n","// 19.1.2.13 Object.isSealed(O)\nvar isObject = require('./_is-object');\n\nrequire('./_object-sap')('isSealed', function ($isSealed) {\n return function isSealed(it) {\n return isObject(it) ? $isSealed ? $isSealed(it) : false : true;\n };\n});\n","// 19.1.3.10 Object.is(value1, value2)\nvar $export = require('./_export');\n$export($export.S, 'Object', { is: require('./_same-value') });\n","// 19.1.2.14 Object.keys(O)\nvar toObject = require('./_to-object');\nvar $keys = require('./_object-keys');\n\nrequire('./_object-sap')('keys', function () {\n return function keys(it) {\n return $keys(toObject(it));\n };\n});\n","// 19.1.2.15 Object.preventExtensions(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('preventExtensions', function ($preventExtensions) {\n return function preventExtensions(it) {\n return $preventExtensions && isObject(it) ? $preventExtensions(meta(it)) : it;\n };\n});\n","// 19.1.2.17 Object.seal(O)\nvar isObject = require('./_is-object');\nvar meta = require('./_meta').onFreeze;\n\nrequire('./_object-sap')('seal', function ($seal) {\n return function seal(it) {\n return $seal && isObject(it) ? $seal(meta(it)) : it;\n };\n});\n","// 19.1.3.19 Object.setPrototypeOf(O, proto)\nvar $export = require('./_export');\n$export($export.S, 'Object', { setPrototypeOf: require('./_set-proto').set });\n","'use strict';\n// 19.1.3.6 Object.prototype.toString()\nvar classof = require('./_classof');\nvar test = {};\ntest[require('./_wks')('toStringTag')] = 'z';\nif (test + '' != '[object z]') {\n require('./_redefine')(Object.prototype, 'toString', function toString() {\n return '[object ' + classof(this) + ']';\n }, true);\n}\n","var $export = require('./_export');\nvar $parseFloat = require('./_parse-float');\n// 18.2.4 parseFloat(string)\n$export($export.G + $export.F * (parseFloat != $parseFloat), { parseFloat: $parseFloat });\n","var $export = require('./_export');\nvar $parseInt = require('./_parse-int');\n// 18.2.5 parseInt(string, radix)\n$export($export.G + $export.F * (parseInt != $parseInt), { parseInt: $parseInt });\n","'use strict';\nvar LIBRARY = require('./_library');\nvar global = require('./_global');\nvar ctx = require('./_ctx');\nvar classof = require('./_classof');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar aFunction = require('./_a-function');\nvar anInstance = require('./_an-instance');\nvar forOf = require('./_for-of');\nvar speciesConstructor = require('./_species-constructor');\nvar task = require('./_task').set;\nvar microtask = require('./_microtask')();\nvar newPromiseCapabilityModule = require('./_new-promise-capability');\nvar perform = require('./_perform');\nvar userAgent = require('./_user-agent');\nvar promiseResolve = require('./_promise-resolve');\nvar PROMISE = 'Promise';\nvar TypeError = global.TypeError;\nvar process = global.process;\nvar versions = process && process.versions;\nvar v8 = versions && versions.v8 || '';\nvar $Promise = global[PROMISE];\nvar isNode = classof(process) == 'process';\nvar empty = function () { /* empty */ };\nvar Internal, newGenericPromiseCapability, OwnPromiseCapability, Wrapper;\nvar newPromiseCapability = newGenericPromiseCapability = newPromiseCapabilityModule.f;\n\nvar USE_NATIVE = !!function () {\n try {\n // correct subclassing with @@species support\n var promise = $Promise.resolve(1);\n var FakePromise = (promise.constructor = {})[require('./_wks')('species')] = function (exec) {\n exec(empty, empty);\n };\n // unhandled rejections tracking support, NodeJS Promise without it fails @@species test\n return (isNode || typeof PromiseRejectionEvent == 'function')\n && promise.then(empty) instanceof FakePromise\n // v8 6.6 (Node 10 and Chrome 66) have a bug with resolving custom thenables\n // https://bugs.chromium.org/p/chromium/issues/detail?id=830565\n // we can't detect it synchronously, so just check versions\n && v8.indexOf('6.6') !== 0\n && userAgent.indexOf('Chrome/66') === -1;\n } catch (e) { /* empty */ }\n}();\n\n// helpers\nvar isThenable = function (it) {\n var then;\n return isObject(it) && typeof (then = it.then) == 'function' ? then : false;\n};\nvar notify = function (promise, isReject) {\n if (promise._n) return;\n promise._n = true;\n var chain = promise._c;\n microtask(function () {\n var value = promise._v;\n var ok = promise._s == 1;\n var i = 0;\n var run = function (reaction) {\n var handler = ok ? reaction.ok : reaction.fail;\n var resolve = reaction.resolve;\n var reject = reaction.reject;\n var domain = reaction.domain;\n var result, then, exited;\n try {\n if (handler) {\n if (!ok) {\n if (promise._h == 2) onHandleUnhandled(promise);\n promise._h = 1;\n }\n if (handler === true) result = value;\n else {\n if (domain) domain.enter();\n result = handler(value); // may throw\n if (domain) {\n domain.exit();\n exited = true;\n }\n }\n if (result === reaction.promise) {\n reject(TypeError('Promise-chain cycle'));\n } else if (then = isThenable(result)) {\n then.call(result, resolve, reject);\n } else resolve(result);\n } else reject(value);\n } catch (e) {\n if (domain && !exited) domain.exit();\n reject(e);\n }\n };\n while (chain.length > i) run(chain[i++]); // variable length - can't use forEach\n promise._c = [];\n promise._n = false;\n if (isReject && !promise._h) onUnhandled(promise);\n });\n};\nvar onUnhandled = function (promise) {\n task.call(global, function () {\n var value = promise._v;\n var unhandled = isUnhandled(promise);\n var result, handler, console;\n if (unhandled) {\n result = perform(function () {\n if (isNode) {\n process.emit('unhandledRejection', value, promise);\n } else if (handler = global.onunhandledrejection) {\n handler({ promise: promise, reason: value });\n } else if ((console = global.console) && console.error) {\n console.error('Unhandled promise rejection', value);\n }\n });\n // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should\n promise._h = isNode || isUnhandled(promise) ? 2 : 1;\n } promise._a = undefined;\n if (unhandled && result.e) throw result.v;\n });\n};\nvar isUnhandled = function (promise) {\n return promise._h !== 1 && (promise._a || promise._c).length === 0;\n};\nvar onHandleUnhandled = function (promise) {\n task.call(global, function () {\n var handler;\n if (isNode) {\n process.emit('rejectionHandled', promise);\n } else if (handler = global.onrejectionhandled) {\n handler({ promise: promise, reason: promise._v });\n }\n });\n};\nvar $reject = function (value) {\n var promise = this;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n promise._v = value;\n promise._s = 2;\n if (!promise._a) promise._a = promise._c.slice();\n notify(promise, true);\n};\nvar $resolve = function (value) {\n var promise = this;\n var then;\n if (promise._d) return;\n promise._d = true;\n promise = promise._w || promise; // unwrap\n try {\n if (promise === value) throw TypeError(\"Promise can't be resolved itself\");\n if (then = isThenable(value)) {\n microtask(function () {\n var wrapper = { _w: promise, _d: false }; // wrap\n try {\n then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1));\n } catch (e) {\n $reject.call(wrapper, e);\n }\n });\n } else {\n promise._v = value;\n promise._s = 1;\n notify(promise, false);\n }\n } catch (e) {\n $reject.call({ _w: promise, _d: false }, e); // wrap\n }\n};\n\n// constructor polyfill\nif (!USE_NATIVE) {\n // 25.4.3.1 Promise(executor)\n $Promise = function Promise(executor) {\n anInstance(this, $Promise, PROMISE, '_h');\n aFunction(executor);\n Internal.call(this);\n try {\n executor(ctx($resolve, this, 1), ctx($reject, this, 1));\n } catch (err) {\n $reject.call(this, err);\n }\n };\n // eslint-disable-next-line no-unused-vars\n Internal = function Promise(executor) {\n this._c = []; // <- awaiting reactions\n this._a = undefined; // <- checked in isUnhandled reactions\n this._s = 0; // <- state\n this._d = false; // <- done\n this._v = undefined; // <- value\n this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled\n this._n = false; // <- notify\n };\n Internal.prototype = require('./_redefine-all')($Promise.prototype, {\n // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected)\n then: function then(onFulfilled, onRejected) {\n var reaction = newPromiseCapability(speciesConstructor(this, $Promise));\n reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true;\n reaction.fail = typeof onRejected == 'function' && onRejected;\n reaction.domain = isNode ? process.domain : undefined;\n this._c.push(reaction);\n if (this._a) this._a.push(reaction);\n if (this._s) notify(this, false);\n return reaction.promise;\n },\n // 25.4.5.1 Promise.prototype.catch(onRejected)\n 'catch': function (onRejected) {\n return this.then(undefined, onRejected);\n }\n });\n OwnPromiseCapability = function () {\n var promise = new Internal();\n this.promise = promise;\n this.resolve = ctx($resolve, promise, 1);\n this.reject = ctx($reject, promise, 1);\n };\n newPromiseCapabilityModule.f = newPromiseCapability = function (C) {\n return C === $Promise || C === Wrapper\n ? new OwnPromiseCapability(C)\n : newGenericPromiseCapability(C);\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Promise: $Promise });\nrequire('./_set-to-string-tag')($Promise, PROMISE);\nrequire('./_set-species')(PROMISE);\nWrapper = require('./_core')[PROMISE];\n\n// statics\n$export($export.S + $export.F * !USE_NATIVE, PROMISE, {\n // 25.4.4.5 Promise.reject(r)\n reject: function reject(r) {\n var capability = newPromiseCapability(this);\n var $$reject = capability.reject;\n $$reject(r);\n return capability.promise;\n }\n});\n$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, {\n // 25.4.4.6 Promise.resolve(x)\n resolve: function resolve(x) {\n return promiseResolve(LIBRARY && this === Wrapper ? $Promise : this, x);\n }\n});\n$export($export.S + $export.F * !(USE_NATIVE && require('./_iter-detect')(function (iter) {\n $Promise.all(iter)['catch'](empty);\n})), PROMISE, {\n // 25.4.4.1 Promise.all(iterable)\n all: function all(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var resolve = capability.resolve;\n var reject = capability.reject;\n var result = perform(function () {\n var values = [];\n var index = 0;\n var remaining = 1;\n forOf(iterable, false, function (promise) {\n var $index = index++;\n var alreadyCalled = false;\n values.push(undefined);\n remaining++;\n C.resolve(promise).then(function (value) {\n if (alreadyCalled) return;\n alreadyCalled = true;\n values[$index] = value;\n --remaining || resolve(values);\n }, reject);\n });\n --remaining || resolve(values);\n });\n if (result.e) reject(result.v);\n return capability.promise;\n },\n // 25.4.4.4 Promise.race(iterable)\n race: function race(iterable) {\n var C = this;\n var capability = newPromiseCapability(C);\n var reject = capability.reject;\n var result = perform(function () {\n forOf(iterable, false, function (promise) {\n C.resolve(promise).then(capability.resolve, reject);\n });\n });\n if (result.e) reject(result.v);\n return capability.promise;\n }\n});\n","// 26.1.1 Reflect.apply(target, thisArgument, argumentsList)\nvar $export = require('./_export');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar rApply = (require('./_global').Reflect || {}).apply;\nvar fApply = Function.apply;\n// MS Edge argumentsList argument is optional\n$export($export.S + $export.F * !require('./_fails')(function () {\n rApply(function () { /* empty */ });\n}), 'Reflect', {\n apply: function apply(target, thisArgument, argumentsList) {\n var T = aFunction(target);\n var L = anObject(argumentsList);\n return rApply ? rApply(T, thisArgument, L) : fApply.call(T, thisArgument, L);\n }\n});\n","// 26.1.2 Reflect.construct(target, argumentsList [, newTarget])\nvar $export = require('./_export');\nvar create = require('./_object-create');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar fails = require('./_fails');\nvar bind = require('./_bind');\nvar rConstruct = (require('./_global').Reflect || {}).construct;\n\n// MS Edge supports only 2 arguments and argumentsList argument is optional\n// FF Nightly sets third argument as `new.target`, but does not create `this` from it\nvar NEW_TARGET_BUG = fails(function () {\n function F() { /* empty */ }\n return !(rConstruct(function () { /* empty */ }, [], F) instanceof F);\n});\nvar ARGS_BUG = !fails(function () {\n rConstruct(function () { /* empty */ });\n});\n\n$export($export.S + $export.F * (NEW_TARGET_BUG || ARGS_BUG), 'Reflect', {\n construct: function construct(Target, args /* , newTarget */) {\n aFunction(Target);\n anObject(args);\n var newTarget = arguments.length < 3 ? Target : aFunction(arguments[2]);\n if (ARGS_BUG && !NEW_TARGET_BUG) return rConstruct(Target, args, newTarget);\n if (Target == newTarget) {\n // w/o altered newTarget, optimization for 0-4 arguments\n switch (args.length) {\n case 0: return new Target();\n case 1: return new Target(args[0]);\n case 2: return new Target(args[0], args[1]);\n case 3: return new Target(args[0], args[1], args[2]);\n case 4: return new Target(args[0], args[1], args[2], args[3]);\n }\n // w/o altered newTarget, lot of arguments case\n var $args = [null];\n $args.push.apply($args, args);\n return new (bind.apply(Target, $args))();\n }\n // with altered newTarget, not support built-in constructors\n var proto = newTarget.prototype;\n var instance = create(isObject(proto) ? proto : Object.prototype);\n var result = Function.apply.call(Target, instance, args);\n return isObject(result) ? result : instance;\n }\n});\n","// 26.1.3 Reflect.defineProperty(target, propertyKey, attributes)\nvar dP = require('./_object-dp');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar toPrimitive = require('./_to-primitive');\n\n// MS Edge has broken Reflect.defineProperty - throwing instead of returning false\n$export($export.S + $export.F * require('./_fails')(function () {\n // eslint-disable-next-line no-undef\n Reflect.defineProperty(dP.f({}, 1, { value: 1 }), 1, { value: 2 });\n}), 'Reflect', {\n defineProperty: function defineProperty(target, propertyKey, attributes) {\n anObject(target);\n propertyKey = toPrimitive(propertyKey, true);\n anObject(attributes);\n try {\n dP.f(target, propertyKey, attributes);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.4 Reflect.deleteProperty(target, propertyKey)\nvar $export = require('./_export');\nvar gOPD = require('./_object-gopd').f;\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n deleteProperty: function deleteProperty(target, propertyKey) {\n var desc = gOPD(anObject(target), propertyKey);\n return desc && !desc.configurable ? false : delete target[propertyKey];\n }\n});\n","'use strict';\n// 26.1.5 Reflect.enumerate(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar Enumerate = function (iterated) {\n this._t = anObject(iterated); // target\n this._i = 0; // next index\n var keys = this._k = []; // keys\n var key;\n for (key in iterated) keys.push(key);\n};\nrequire('./_iter-create')(Enumerate, 'Object', function () {\n var that = this;\n var keys = that._k;\n var key;\n do {\n if (that._i >= keys.length) return { value: undefined, done: true };\n } while (!((key = keys[that._i++]) in that._t));\n return { value: key, done: false };\n});\n\n$export($export.S, 'Reflect', {\n enumerate: function enumerate(target) {\n return new Enumerate(target);\n }\n});\n","// 26.1.7 Reflect.getOwnPropertyDescriptor(target, propertyKey)\nvar gOPD = require('./_object-gopd');\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n getOwnPropertyDescriptor: function getOwnPropertyDescriptor(target, propertyKey) {\n return gOPD.f(anObject(target), propertyKey);\n }\n});\n","// 26.1.8 Reflect.getPrototypeOf(target)\nvar $export = require('./_export');\nvar getProto = require('./_object-gpo');\nvar anObject = require('./_an-object');\n\n$export($export.S, 'Reflect', {\n getPrototypeOf: function getPrototypeOf(target) {\n return getProto(anObject(target));\n }\n});\n","// 26.1.6 Reflect.get(target, propertyKey [, receiver])\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar isObject = require('./_is-object');\nvar anObject = require('./_an-object');\n\nfunction get(target, propertyKey /* , receiver */) {\n var receiver = arguments.length < 3 ? target : arguments[2];\n var desc, proto;\n if (anObject(target) === receiver) return target[propertyKey];\n if (desc = gOPD.f(target, propertyKey)) return has(desc, 'value')\n ? desc.value\n : desc.get !== undefined\n ? desc.get.call(receiver)\n : undefined;\n if (isObject(proto = getPrototypeOf(target))) return get(proto, propertyKey, receiver);\n}\n\n$export($export.S, 'Reflect', { get: get });\n","// 26.1.9 Reflect.has(target, propertyKey)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', {\n has: function has(target, propertyKey) {\n return propertyKey in target;\n }\n});\n","// 26.1.10 Reflect.isExtensible(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $isExtensible = Object.isExtensible;\n\n$export($export.S, 'Reflect', {\n isExtensible: function isExtensible(target) {\n anObject(target);\n return $isExtensible ? $isExtensible(target) : true;\n }\n});\n","// 26.1.11 Reflect.ownKeys(target)\nvar $export = require('./_export');\n\n$export($export.S, 'Reflect', { ownKeys: require('./_own-keys') });\n","// 26.1.12 Reflect.preventExtensions(target)\nvar $export = require('./_export');\nvar anObject = require('./_an-object');\nvar $preventExtensions = Object.preventExtensions;\n\n$export($export.S, 'Reflect', {\n preventExtensions: function preventExtensions(target) {\n anObject(target);\n try {\n if ($preventExtensions) $preventExtensions(target);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.14 Reflect.setPrototypeOf(target, proto)\nvar $export = require('./_export');\nvar setProto = require('./_set-proto');\n\nif (setProto) $export($export.S, 'Reflect', {\n setPrototypeOf: function setPrototypeOf(target, proto) {\n setProto.check(target, proto);\n try {\n setProto.set(target, proto);\n return true;\n } catch (e) {\n return false;\n }\n }\n});\n","// 26.1.13 Reflect.set(target, propertyKey, V [, receiver])\nvar dP = require('./_object-dp');\nvar gOPD = require('./_object-gopd');\nvar getPrototypeOf = require('./_object-gpo');\nvar has = require('./_has');\nvar $export = require('./_export');\nvar createDesc = require('./_property-desc');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\n\nfunction set(target, propertyKey, V /* , receiver */) {\n var receiver = arguments.length < 4 ? target : arguments[3];\n var ownDesc = gOPD.f(anObject(target), propertyKey);\n var existingDescriptor, proto;\n if (!ownDesc) {\n if (isObject(proto = getPrototypeOf(target))) {\n return set(proto, propertyKey, V, receiver);\n }\n ownDesc = createDesc(0);\n }\n if (has(ownDesc, 'value')) {\n if (ownDesc.writable === false || !isObject(receiver)) return false;\n if (existingDescriptor = gOPD.f(receiver, propertyKey)) {\n if (existingDescriptor.get || existingDescriptor.set || existingDescriptor.writable === false) return false;\n existingDescriptor.value = V;\n dP.f(receiver, propertyKey, existingDescriptor);\n } else dP.f(receiver, propertyKey, createDesc(0, V));\n return true;\n }\n return ownDesc.set === undefined ? false : (ownDesc.set.call(receiver, V), true);\n}\n\n$export($export.S, 'Reflect', { set: set });\n","var global = require('./_global');\nvar inheritIfRequired = require('./_inherit-if-required');\nvar dP = require('./_object-dp').f;\nvar gOPN = require('./_object-gopn').f;\nvar isRegExp = require('./_is-regexp');\nvar $flags = require('./_flags');\nvar $RegExp = global.RegExp;\nvar Base = $RegExp;\nvar proto = $RegExp.prototype;\nvar re1 = /a/g;\nvar re2 = /a/g;\n// \"new\" creates a new object, old webkit buggy here\nvar CORRECT_NEW = new $RegExp(re1) !== re1;\n\nif (require('./_descriptors') && (!CORRECT_NEW || require('./_fails')(function () {\n re2[require('./_wks')('match')] = false;\n // RegExp constructor can alter flags and IsRegExp works correct with @@match\n return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i';\n}))) {\n $RegExp = function RegExp(p, f) {\n var tiRE = this instanceof $RegExp;\n var piRE = isRegExp(p);\n var fiU = f === undefined;\n return !tiRE && piRE && p.constructor === $RegExp && fiU ? p\n : inheritIfRequired(CORRECT_NEW\n ? new Base(piRE && !fiU ? p.source : p, f)\n : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f)\n , tiRE ? this : proto, $RegExp);\n };\n var proxy = function (key) {\n key in $RegExp || dP($RegExp, key, {\n configurable: true,\n get: function () { return Base[key]; },\n set: function (it) { Base[key] = it; }\n });\n };\n for (var keys = gOPN(Base), i = 0; keys.length > i;) proxy(keys[i++]);\n proto.constructor = $RegExp;\n $RegExp.prototype = proto;\n require('./_redefine')(global, 'RegExp', $RegExp);\n}\n\nrequire('./_set-species')('RegExp');\n","'use strict';\nvar regexpExec = require('./_regexp-exec');\nrequire('./_export')({\n target: 'RegExp',\n proto: true,\n forced: regexpExec !== /./.exec\n}, {\n exec: regexpExec\n});\n","// 21.2.5.3 get RegExp.prototype.flags()\nif (require('./_descriptors') && /./g.flags != 'g') require('./_object-dp').f(RegExp.prototype, 'flags', {\n configurable: true,\n get: require('./_flags')\n});\n","'use strict';\n\nvar anObject = require('./_an-object');\nvar toLength = require('./_to-length');\nvar advanceStringIndex = require('./_advance-string-index');\nvar regExpExec = require('./_regexp-exec-abstract');\n\n// @@match logic\nrequire('./_fix-re-wks')('match', 1, function (defined, MATCH, $match, maybeCallNative) {\n return [\n // `String.prototype.match` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.match\n function match(regexp) {\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[MATCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O));\n },\n // `RegExp.prototype[@@match]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match\n function (regexp) {\n var res = maybeCallNative($match, regexp, this);\n if (res.done) return res.value;\n var rx = anObject(regexp);\n var S = String(this);\n if (!rx.global) return regExpExec(rx, S);\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n var A = [];\n var n = 0;\n var result;\n while ((result = regExpExec(rx, S)) !== null) {\n var matchStr = String(result[0]);\n A[n] = matchStr;\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n n++;\n }\n return n === 0 ? null : A;\n }\n ];\n});\n","'use strict';\n\nvar anObject = require('./_an-object');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar toInteger = require('./_to-integer');\nvar advanceStringIndex = require('./_advance-string-index');\nvar regExpExec = require('./_regexp-exec-abstract');\nvar max = Math.max;\nvar min = Math.min;\nvar floor = Math.floor;\nvar SUBSTITUTION_SYMBOLS = /\\$([$&`']|\\d\\d?|<[^>]*>)/g;\nvar SUBSTITUTION_SYMBOLS_NO_NAMED = /\\$([$&`']|\\d\\d?)/g;\n\nvar maybeToString = function (it) {\n return it === undefined ? it : String(it);\n};\n\n// @@replace logic\nrequire('./_fix-re-wks')('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) {\n return [\n // `String.prototype.replace` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.replace\n function replace(searchValue, replaceValue) {\n var O = defined(this);\n var fn = searchValue == undefined ? undefined : searchValue[REPLACE];\n return fn !== undefined\n ? fn.call(searchValue, O, replaceValue)\n : $replace.call(String(O), searchValue, replaceValue);\n },\n // `RegExp.prototype[@@replace]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace\n function (regexp, replaceValue) {\n var res = maybeCallNative($replace, regexp, this, replaceValue);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var functionalReplace = typeof replaceValue === 'function';\n if (!functionalReplace) replaceValue = String(replaceValue);\n var global = rx.global;\n if (global) {\n var fullUnicode = rx.unicode;\n rx.lastIndex = 0;\n }\n var results = [];\n while (true) {\n var result = regExpExec(rx, S);\n if (result === null) break;\n results.push(result);\n if (!global) break;\n var matchStr = String(result[0]);\n if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode);\n }\n var accumulatedResult = '';\n var nextSourcePosition = 0;\n for (var i = 0; i < results.length; i++) {\n result = results[i];\n var matched = String(result[0]);\n var position = max(min(toInteger(result.index), S.length), 0);\n var captures = [];\n // NOTE: This is equivalent to\n // captures = result.slice(1).map(maybeToString)\n // but for some reason `nativeSlice.call(result, 1, result.length)` (called in\n // the slice polyfill when slicing native arrays) \"doesn't work\" in safari 9 and\n // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it.\n for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j]));\n var namedCaptures = result.groups;\n if (functionalReplace) {\n var replacerArgs = [matched].concat(captures, position, S);\n if (namedCaptures !== undefined) replacerArgs.push(namedCaptures);\n var replacement = String(replaceValue.apply(undefined, replacerArgs));\n } else {\n replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue);\n }\n if (position >= nextSourcePosition) {\n accumulatedResult += S.slice(nextSourcePosition, position) + replacement;\n nextSourcePosition = position + matched.length;\n }\n }\n return accumulatedResult + S.slice(nextSourcePosition);\n }\n ];\n\n // https://tc39.github.io/ecma262/#sec-getsubstitution\n function getSubstitution(matched, str, position, captures, namedCaptures, replacement) {\n var tailPos = position + matched.length;\n var m = captures.length;\n var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED;\n if (namedCaptures !== undefined) {\n namedCaptures = toObject(namedCaptures);\n symbols = SUBSTITUTION_SYMBOLS;\n }\n return $replace.call(replacement, symbols, function (match, ch) {\n var capture;\n switch (ch.charAt(0)) {\n case '$': return '$';\n case '&': return matched;\n case '`': return str.slice(0, position);\n case \"'\": return str.slice(tailPos);\n case '<':\n capture = namedCaptures[ch.slice(1, -1)];\n break;\n default: // \\d\\d?\n var n = +ch;\n if (n === 0) return match;\n if (n > m) {\n var f = floor(n / 10);\n if (f === 0) return match;\n if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1);\n return match;\n }\n capture = captures[n - 1];\n }\n return capture === undefined ? '' : capture;\n });\n }\n});\n","'use strict';\n\nvar anObject = require('./_an-object');\nvar sameValue = require('./_same-value');\nvar regExpExec = require('./_regexp-exec-abstract');\n\n// @@search logic\nrequire('./_fix-re-wks')('search', 1, function (defined, SEARCH, $search, maybeCallNative) {\n return [\n // `String.prototype.search` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.search\n function search(regexp) {\n var O = defined(this);\n var fn = regexp == undefined ? undefined : regexp[SEARCH];\n return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[SEARCH](String(O));\n },\n // `RegExp.prototype[@@search]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@search\n function (regexp) {\n var res = maybeCallNative($search, regexp, this);\n if (res.done) return res.value;\n var rx = anObject(regexp);\n var S = String(this);\n var previousLastIndex = rx.lastIndex;\n if (!sameValue(previousLastIndex, 0)) rx.lastIndex = 0;\n var result = regExpExec(rx, S);\n if (!sameValue(rx.lastIndex, previousLastIndex)) rx.lastIndex = previousLastIndex;\n return result === null ? -1 : result.index;\n }\n ];\n});\n","'use strict';\n\nvar isRegExp = require('./_is-regexp');\nvar anObject = require('./_an-object');\nvar speciesConstructor = require('./_species-constructor');\nvar advanceStringIndex = require('./_advance-string-index');\nvar toLength = require('./_to-length');\nvar callRegExpExec = require('./_regexp-exec-abstract');\nvar regexpExec = require('./_regexp-exec');\nvar fails = require('./_fails');\nvar $min = Math.min;\nvar $push = [].push;\nvar $SPLIT = 'split';\nvar LENGTH = 'length';\nvar LAST_INDEX = 'lastIndex';\nvar MAX_UINT32 = 0xffffffff;\n\n// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError\nvar SUPPORTS_Y = !fails(function () { RegExp(MAX_UINT32, 'y'); });\n\n// @@split logic\nrequire('./_fix-re-wks')('split', 2, function (defined, SPLIT, $split, maybeCallNative) {\n var internalSplit;\n if (\n 'abbc'[$SPLIT](/(b)*/)[1] == 'c' ||\n 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 ||\n 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 ||\n '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 ||\n '.'[$SPLIT](/()()/)[LENGTH] > 1 ||\n ''[$SPLIT](/.?/)[LENGTH]\n ) {\n // based on es5-shim implementation, need to rework it\n internalSplit = function (separator, limit) {\n var string = String(this);\n if (separator === undefined && limit === 0) return [];\n // If `separator` is not a regex, use native split\n if (!isRegExp(separator)) return $split.call(string, separator, limit);\n var output = [];\n var flags = (separator.ignoreCase ? 'i' : '') +\n (separator.multiline ? 'm' : '') +\n (separator.unicode ? 'u' : '') +\n (separator.sticky ? 'y' : '');\n var lastLastIndex = 0;\n var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0;\n // Make `global` and avoid `lastIndex` issues by working with a copy\n var separatorCopy = new RegExp(separator.source, flags + 'g');\n var match, lastIndex, lastLength;\n while (match = regexpExec.call(separatorCopy, string)) {\n lastIndex = separatorCopy[LAST_INDEX];\n if (lastIndex > lastLastIndex) {\n output.push(string.slice(lastLastIndex, match.index));\n if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1));\n lastLength = match[0][LENGTH];\n lastLastIndex = lastIndex;\n if (output[LENGTH] >= splitLimit) break;\n }\n if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop\n }\n if (lastLastIndex === string[LENGTH]) {\n if (lastLength || !separatorCopy.test('')) output.push('');\n } else output.push(string.slice(lastLastIndex));\n return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output;\n };\n // Chakra, V8\n } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) {\n internalSplit = function (separator, limit) {\n return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit);\n };\n } else {\n internalSplit = $split;\n }\n\n return [\n // `String.prototype.split` method\n // https://tc39.github.io/ecma262/#sec-string.prototype.split\n function split(separator, limit) {\n var O = defined(this);\n var splitter = separator == undefined ? undefined : separator[SPLIT];\n return splitter !== undefined\n ? splitter.call(separator, O, limit)\n : internalSplit.call(String(O), separator, limit);\n },\n // `RegExp.prototype[@@split]` method\n // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split\n //\n // NOTE: This cannot be properly polyfilled in engines that don't support\n // the 'y' flag.\n function (regexp, limit) {\n var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split);\n if (res.done) return res.value;\n\n var rx = anObject(regexp);\n var S = String(this);\n var C = speciesConstructor(rx, RegExp);\n\n var unicodeMatching = rx.unicode;\n var flags = (rx.ignoreCase ? 'i' : '') +\n (rx.multiline ? 'm' : '') +\n (rx.unicode ? 'u' : '') +\n (SUPPORTS_Y ? 'y' : 'g');\n\n // ^(? + rx + ) is needed, in combination with some S slicing, to\n // simulate the 'y' flag.\n var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags);\n var lim = limit === undefined ? MAX_UINT32 : limit >>> 0;\n if (lim === 0) return [];\n if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : [];\n var p = 0;\n var q = 0;\n var A = [];\n while (q < S.length) {\n splitter.lastIndex = SUPPORTS_Y ? q : 0;\n var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q));\n var e;\n if (\n z === null ||\n (e = $min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p\n ) {\n q = advanceStringIndex(S, q, unicodeMatching);\n } else {\n A.push(S.slice(p, q));\n if (A.length === lim) return A;\n for (var i = 1; i <= z.length - 1; i++) {\n A.push(z[i]);\n if (A.length === lim) return A;\n }\n q = p = e;\n }\n }\n A.push(S.slice(p));\n return A;\n }\n ];\n});\n","'use strict';\nrequire('./es6.regexp.flags');\nvar anObject = require('./_an-object');\nvar $flags = require('./_flags');\nvar DESCRIPTORS = require('./_descriptors');\nvar TO_STRING = 'toString';\nvar $toString = /./[TO_STRING];\n\nvar define = function (fn) {\n require('./_redefine')(RegExp.prototype, TO_STRING, fn, true);\n};\n\n// 21.2.5.14 RegExp.prototype.toString()\nif (require('./_fails')(function () { return $toString.call({ source: 'a', flags: 'b' }) != '/a/b'; })) {\n define(function toString() {\n var R = anObject(this);\n return '/'.concat(R.source, '/',\n 'flags' in R ? R.flags : !DESCRIPTORS && R instanceof RegExp ? $flags.call(R) : undefined);\n });\n// FF44- RegExp#toString has a wrong name\n} else if ($toString.name != TO_STRING) {\n define(function toString() {\n return $toString.call(this);\n });\n}\n","'use strict';\nvar strong = require('./_collection-strong');\nvar validate = require('./_validate-collection');\nvar SET = 'Set';\n\n// 23.2 Set Objects\nmodule.exports = require('./_collection')(SET, function (get) {\n return function Set() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.2.3.1 Set.prototype.add(value)\n add: function add(value) {\n return strong.def(validate(this, SET), value = value === 0 ? 0 : value, value);\n }\n}, strong);\n","'use strict';\n// B.2.3.2 String.prototype.anchor(name)\nrequire('./_string-html')('anchor', function (createHTML) {\n return function anchor(name) {\n return createHTML(this, 'a', 'name', name);\n };\n});\n","'use strict';\n// B.2.3.3 String.prototype.big()\nrequire('./_string-html')('big', function (createHTML) {\n return function big() {\n return createHTML(this, 'big', '', '');\n };\n});\n","'use strict';\n// B.2.3.4 String.prototype.blink()\nrequire('./_string-html')('blink', function (createHTML) {\n return function blink() {\n return createHTML(this, 'blink', '', '');\n };\n});\n","'use strict';\n// B.2.3.5 String.prototype.bold()\nrequire('./_string-html')('bold', function (createHTML) {\n return function bold() {\n return createHTML(this, 'b', '', '');\n };\n});\n","'use strict';\nvar $export = require('./_export');\nvar $at = require('./_string-at')(false);\n$export($export.P, 'String', {\n // 21.1.3.3 String.prototype.codePointAt(pos)\n codePointAt: function codePointAt(pos) {\n return $at(this, pos);\n }\n});\n","// 21.1.3.6 String.prototype.endsWith(searchString [, endPosition])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar ENDS_WITH = 'endsWith';\nvar $endsWith = ''[ENDS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(ENDS_WITH), 'String', {\n endsWith: function endsWith(searchString /* , endPosition = @length */) {\n var that = context(this, searchString, ENDS_WITH);\n var endPosition = arguments.length > 1 ? arguments[1] : undefined;\n var len = toLength(that.length);\n var end = endPosition === undefined ? len : Math.min(toLength(endPosition), len);\n var search = String(searchString);\n return $endsWith\n ? $endsWith.call(that, search, end)\n : that.slice(end - search.length, end) === search;\n }\n});\n","'use strict';\n// B.2.3.6 String.prototype.fixed()\nrequire('./_string-html')('fixed', function (createHTML) {\n return function fixed() {\n return createHTML(this, 'tt', '', '');\n };\n});\n","'use strict';\n// B.2.3.7 String.prototype.fontcolor(color)\nrequire('./_string-html')('fontcolor', function (createHTML) {\n return function fontcolor(color) {\n return createHTML(this, 'font', 'color', color);\n };\n});\n","'use strict';\n// B.2.3.8 String.prototype.fontsize(size)\nrequire('./_string-html')('fontsize', function (createHTML) {\n return function fontsize(size) {\n return createHTML(this, 'font', 'size', size);\n };\n});\n","var $export = require('./_export');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar fromCharCode = String.fromCharCode;\nvar $fromCodePoint = String.fromCodePoint;\n\n// length should be 1, old FF problem\n$export($export.S + $export.F * (!!$fromCodePoint && $fromCodePoint.length != 1), 'String', {\n // 21.1.2.2 String.fromCodePoint(...codePoints)\n fromCodePoint: function fromCodePoint(x) { // eslint-disable-line no-unused-vars\n var res = [];\n var aLen = arguments.length;\n var i = 0;\n var code;\n while (aLen > i) {\n code = +arguments[i++];\n if (toAbsoluteIndex(code, 0x10ffff) !== code) throw RangeError(code + ' is not a valid code point');\n res.push(code < 0x10000\n ? fromCharCode(code)\n : fromCharCode(((code -= 0x10000) >> 10) + 0xd800, code % 0x400 + 0xdc00)\n );\n } return res.join('');\n }\n});\n","// 21.1.3.7 String.prototype.includes(searchString, position = 0)\n'use strict';\nvar $export = require('./_export');\nvar context = require('./_string-context');\nvar INCLUDES = 'includes';\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(INCLUDES), 'String', {\n includes: function includes(searchString /* , position = 0 */) {\n return !!~context(this, searchString, INCLUDES)\n .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n","'use strict';\n// B.2.3.9 String.prototype.italics()\nrequire('./_string-html')('italics', function (createHTML) {\n return function italics() {\n return createHTML(this, 'i', '', '');\n };\n});\n","'use strict';\nvar $at = require('./_string-at')(true);\n\n// 21.1.3.27 String.prototype[@@iterator]()\nrequire('./_iter-define')(String, 'String', function (iterated) {\n this._t = String(iterated); // target\n this._i = 0; // next index\n// 21.1.5.2.1 %StringIteratorPrototype%.next()\n}, function () {\n var O = this._t;\n var index = this._i;\n var point;\n if (index >= O.length) return { value: undefined, done: true };\n point = $at(O, index);\n this._i += point.length;\n return { value: point, done: false };\n});\n","'use strict';\n// B.2.3.10 String.prototype.link(url)\nrequire('./_string-html')('link', function (createHTML) {\n return function link(url) {\n return createHTML(this, 'a', 'href', url);\n };\n});\n","var $export = require('./_export');\nvar toIObject = require('./_to-iobject');\nvar toLength = require('./_to-length');\n\n$export($export.S, 'String', {\n // 21.1.2.4 String.raw(callSite, ...substitutions)\n raw: function raw(callSite) {\n var tpl = toIObject(callSite.raw);\n var len = toLength(tpl.length);\n var aLen = arguments.length;\n var res = [];\n var i = 0;\n while (len > i) {\n res.push(String(tpl[i++]));\n if (i < aLen) res.push(String(arguments[i]));\n } return res.join('');\n }\n});\n","var $export = require('./_export');\n\n$export($export.P, 'String', {\n // 21.1.3.13 String.prototype.repeat(count)\n repeat: require('./_string-repeat')\n});\n","'use strict';\n// B.2.3.11 String.prototype.small()\nrequire('./_string-html')('small', function (createHTML) {\n return function small() {\n return createHTML(this, 'small', '', '');\n };\n});\n","// 21.1.3.18 String.prototype.startsWith(searchString [, position ])\n'use strict';\nvar $export = require('./_export');\nvar toLength = require('./_to-length');\nvar context = require('./_string-context');\nvar STARTS_WITH = 'startsWith';\nvar $startsWith = ''[STARTS_WITH];\n\n$export($export.P + $export.F * require('./_fails-is-regexp')(STARTS_WITH), 'String', {\n startsWith: function startsWith(searchString /* , position = 0 */) {\n var that = context(this, searchString, STARTS_WITH);\n var index = toLength(Math.min(arguments.length > 1 ? arguments[1] : undefined, that.length));\n var search = String(searchString);\n return $startsWith\n ? $startsWith.call(that, search, index)\n : that.slice(index, index + search.length) === search;\n }\n});\n","'use strict';\n// B.2.3.12 String.prototype.strike()\nrequire('./_string-html')('strike', function (createHTML) {\n return function strike() {\n return createHTML(this, 'strike', '', '');\n };\n});\n","'use strict';\n// B.2.3.13 String.prototype.sub()\nrequire('./_string-html')('sub', function (createHTML) {\n return function sub() {\n return createHTML(this, 'sub', '', '');\n };\n});\n","'use strict';\n// B.2.3.14 String.prototype.sup()\nrequire('./_string-html')('sup', function (createHTML) {\n return function sup() {\n return createHTML(this, 'sup', '', '');\n };\n});\n","'use strict';\n// 21.1.3.25 String.prototype.trim()\nrequire('./_string-trim')('trim', function ($trim) {\n return function trim() {\n return $trim(this, 3);\n };\n});\n","'use strict';\n// ECMAScript 6 symbols shim\nvar global = require('./_global');\nvar has = require('./_has');\nvar DESCRIPTORS = require('./_descriptors');\nvar $export = require('./_export');\nvar redefine = require('./_redefine');\nvar META = require('./_meta').KEY;\nvar $fails = require('./_fails');\nvar shared = require('./_shared');\nvar setToStringTag = require('./_set-to-string-tag');\nvar uid = require('./_uid');\nvar wks = require('./_wks');\nvar wksExt = require('./_wks-ext');\nvar wksDefine = require('./_wks-define');\nvar enumKeys = require('./_enum-keys');\nvar isArray = require('./_is-array');\nvar anObject = require('./_an-object');\nvar isObject = require('./_is-object');\nvar toObject = require('./_to-object');\nvar toIObject = require('./_to-iobject');\nvar toPrimitive = require('./_to-primitive');\nvar createDesc = require('./_property-desc');\nvar _create = require('./_object-create');\nvar gOPNExt = require('./_object-gopn-ext');\nvar $GOPD = require('./_object-gopd');\nvar $GOPS = require('./_object-gops');\nvar $DP = require('./_object-dp');\nvar $keys = require('./_object-keys');\nvar gOPD = $GOPD.f;\nvar dP = $DP.f;\nvar gOPN = gOPNExt.f;\nvar $Symbol = global.Symbol;\nvar $JSON = global.JSON;\nvar _stringify = $JSON && $JSON.stringify;\nvar PROTOTYPE = 'prototype';\nvar HIDDEN = wks('_hidden');\nvar TO_PRIMITIVE = wks('toPrimitive');\nvar isEnum = {}.propertyIsEnumerable;\nvar SymbolRegistry = shared('symbol-registry');\nvar AllSymbols = shared('symbols');\nvar OPSymbols = shared('op-symbols');\nvar ObjectProto = Object[PROTOTYPE];\nvar USE_NATIVE = typeof $Symbol == 'function' && !!$GOPS.f;\nvar QObject = global.QObject;\n// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173\nvar setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild;\n\n// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687\nvar setSymbolDesc = DESCRIPTORS && $fails(function () {\n return _create(dP({}, 'a', {\n get: function () { return dP(this, 'a', { value: 7 }).a; }\n })).a != 7;\n}) ? function (it, key, D) {\n var protoDesc = gOPD(ObjectProto, key);\n if (protoDesc) delete ObjectProto[key];\n dP(it, key, D);\n if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc);\n} : dP;\n\nvar wrap = function (tag) {\n var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]);\n sym._k = tag;\n return sym;\n};\n\nvar isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) {\n return typeof it == 'symbol';\n} : function (it) {\n return it instanceof $Symbol;\n};\n\nvar $defineProperty = function defineProperty(it, key, D) {\n if (it === ObjectProto) $defineProperty(OPSymbols, key, D);\n anObject(it);\n key = toPrimitive(key, true);\n anObject(D);\n if (has(AllSymbols, key)) {\n if (!D.enumerable) {\n if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {}));\n it[HIDDEN][key] = true;\n } else {\n if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false;\n D = _create(D, { enumerable: createDesc(0, false) });\n } return setSymbolDesc(it, key, D);\n } return dP(it, key, D);\n};\nvar $defineProperties = function defineProperties(it, P) {\n anObject(it);\n var keys = enumKeys(P = toIObject(P));\n var i = 0;\n var l = keys.length;\n var key;\n while (l > i) $defineProperty(it, key = keys[i++], P[key]);\n return it;\n};\nvar $create = function create(it, P) {\n return P === undefined ? _create(it) : $defineProperties(_create(it), P);\n};\nvar $propertyIsEnumerable = function propertyIsEnumerable(key) {\n var E = isEnum.call(this, key = toPrimitive(key, true));\n if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false;\n return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true;\n};\nvar $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) {\n it = toIObject(it);\n key = toPrimitive(key, true);\n if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return;\n var D = gOPD(it, key);\n if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true;\n return D;\n};\nvar $getOwnPropertyNames = function getOwnPropertyNames(it) {\n var names = gOPN(toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key);\n } return result;\n};\nvar $getOwnPropertySymbols = function getOwnPropertySymbols(it) {\n var IS_OP = it === ObjectProto;\n var names = gOPN(IS_OP ? OPSymbols : toIObject(it));\n var result = [];\n var i = 0;\n var key;\n while (names.length > i) {\n if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]);\n } return result;\n};\n\n// 19.4.1.1 Symbol([description])\nif (!USE_NATIVE) {\n $Symbol = function Symbol() {\n if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!');\n var tag = uid(arguments.length > 0 ? arguments[0] : undefined);\n var $set = function (value) {\n if (this === ObjectProto) $set.call(OPSymbols, value);\n if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false;\n setSymbolDesc(this, tag, createDesc(1, value));\n };\n if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set });\n return wrap(tag);\n };\n redefine($Symbol[PROTOTYPE], 'toString', function toString() {\n return this._k;\n });\n\n $GOPD.f = $getOwnPropertyDescriptor;\n $DP.f = $defineProperty;\n require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames;\n require('./_object-pie').f = $propertyIsEnumerable;\n $GOPS.f = $getOwnPropertySymbols;\n\n if (DESCRIPTORS && !require('./_library')) {\n redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true);\n }\n\n wksExt.f = function (name) {\n return wrap(wks(name));\n };\n}\n\n$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol });\n\nfor (var es6Symbols = (\n // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14\n 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'\n).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]);\n\nfor (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]);\n\n$export($export.S + $export.F * !USE_NATIVE, 'Symbol', {\n // 19.4.2.1 Symbol.for(key)\n 'for': function (key) {\n return has(SymbolRegistry, key += '')\n ? SymbolRegistry[key]\n : SymbolRegistry[key] = $Symbol(key);\n },\n // 19.4.2.5 Symbol.keyFor(sym)\n keyFor: function keyFor(sym) {\n if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!');\n for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key;\n },\n useSetter: function () { setter = true; },\n useSimple: function () { setter = false; }\n});\n\n$export($export.S + $export.F * !USE_NATIVE, 'Object', {\n // 19.1.2.2 Object.create(O [, Properties])\n create: $create,\n // 19.1.2.4 Object.defineProperty(O, P, Attributes)\n defineProperty: $defineProperty,\n // 19.1.2.3 Object.defineProperties(O, Properties)\n defineProperties: $defineProperties,\n // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P)\n getOwnPropertyDescriptor: $getOwnPropertyDescriptor,\n // 19.1.2.7 Object.getOwnPropertyNames(O)\n getOwnPropertyNames: $getOwnPropertyNames,\n // 19.1.2.8 Object.getOwnPropertySymbols(O)\n getOwnPropertySymbols: $getOwnPropertySymbols\n});\n\n// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives\n// https://bugs.chromium.org/p/v8/issues/detail?id=3443\nvar FAILS_ON_PRIMITIVES = $fails(function () { $GOPS.f(1); });\n\n$export($export.S + $export.F * FAILS_ON_PRIMITIVES, 'Object', {\n getOwnPropertySymbols: function getOwnPropertySymbols(it) {\n return $GOPS.f(toObject(it));\n }\n});\n\n// 24.3.2 JSON.stringify(value [, replacer [, space]])\n$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () {\n var S = $Symbol();\n // MS Edge converts symbol values to JSON as {}\n // WebKit converts symbol values to JSON as null\n // V8 throws on boxed symbols\n return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}';\n})), 'JSON', {\n stringify: function stringify(it) {\n var args = [it];\n var i = 1;\n var replacer, $replacer;\n while (arguments.length > i) args.push(arguments[i++]);\n $replacer = replacer = args[1];\n if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined\n if (!isArray(replacer)) replacer = function (key, value) {\n if (typeof $replacer == 'function') value = $replacer.call(this, key, value);\n if (!isSymbol(value)) return value;\n };\n args[1] = replacer;\n return _stringify.apply($JSON, args);\n }\n});\n\n// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint)\n$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf);\n// 19.4.3.5 Symbol.prototype[@@toStringTag]\nsetToStringTag($Symbol, 'Symbol');\n// 20.2.1.9 Math[@@toStringTag]\nsetToStringTag(Math, 'Math', true);\n// 24.3.3 JSON[@@toStringTag]\nsetToStringTag(global.JSON, 'JSON', true);\n","'use strict';\nvar $export = require('./_export');\nvar $typed = require('./_typed');\nvar buffer = require('./_typed-buffer');\nvar anObject = require('./_an-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nvar isObject = require('./_is-object');\nvar ArrayBuffer = require('./_global').ArrayBuffer;\nvar speciesConstructor = require('./_species-constructor');\nvar $ArrayBuffer = buffer.ArrayBuffer;\nvar $DataView = buffer.DataView;\nvar $isView = $typed.ABV && ArrayBuffer.isView;\nvar $slice = $ArrayBuffer.prototype.slice;\nvar VIEW = $typed.VIEW;\nvar ARRAY_BUFFER = 'ArrayBuffer';\n\n$export($export.G + $export.W + $export.F * (ArrayBuffer !== $ArrayBuffer), { ArrayBuffer: $ArrayBuffer });\n\n$export($export.S + $export.F * !$typed.CONSTR, ARRAY_BUFFER, {\n // 24.1.3.1 ArrayBuffer.isView(arg)\n isView: function isView(it) {\n return $isView && $isView(it) || isObject(it) && VIEW in it;\n }\n});\n\n$export($export.P + $export.U + $export.F * require('./_fails')(function () {\n return !new $ArrayBuffer(2).slice(1, undefined).byteLength;\n}), ARRAY_BUFFER, {\n // 24.1.4.3 ArrayBuffer.prototype.slice(start, end)\n slice: function slice(start, end) {\n if ($slice !== undefined && end === undefined) return $slice.call(anObject(this), start); // FF fix\n var len = anObject(this).byteLength;\n var first = toAbsoluteIndex(start, len);\n var fin = toAbsoluteIndex(end === undefined ? len : end, len);\n var result = new (speciesConstructor(this, $ArrayBuffer))(toLength(fin - first));\n var viewS = new $DataView(this);\n var viewT = new $DataView(result);\n var index = 0;\n while (first < fin) {\n viewT.setUint8(index++, viewS.getUint8(first++));\n } return result;\n }\n});\n\nrequire('./_set-species')(ARRAY_BUFFER);\n","var $export = require('./_export');\n$export($export.G + $export.W + $export.F * !require('./_typed').ABV, {\n DataView: require('./_typed-buffer').DataView\n});\n","require('./_typed-array')('Float32', 4, function (init) {\n return function Float32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Float64', 8, function (init) {\n return function Float64Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Int16', 2, function (init) {\n return function Int16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Int32', 4, function (init) {\n return function Int32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Int8', 1, function (init) {\n return function Int8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint16', 2, function (init) {\n return function Uint16Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint32', 4, function (init) {\n return function Uint32Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8Array(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n});\n","require('./_typed-array')('Uint8', 1, function (init) {\n return function Uint8ClampedArray(data, byteOffset, length) {\n return init(this, data, byteOffset, length);\n };\n}, true);\n","'use strict';\nvar global = require('./_global');\nvar each = require('./_array-methods')(0);\nvar redefine = require('./_redefine');\nvar meta = require('./_meta');\nvar assign = require('./_object-assign');\nvar weak = require('./_collection-weak');\nvar isObject = require('./_is-object');\nvar validate = require('./_validate-collection');\nvar NATIVE_WEAK_MAP = require('./_validate-collection');\nvar IS_IE11 = !global.ActiveXObject && 'ActiveXObject' in global;\nvar WEAK_MAP = 'WeakMap';\nvar getWeak = meta.getWeak;\nvar isExtensible = Object.isExtensible;\nvar uncaughtFrozenStore = weak.ufstore;\nvar InternalMap;\n\nvar wrapper = function (get) {\n return function WeakMap() {\n return get(this, arguments.length > 0 ? arguments[0] : undefined);\n };\n};\n\nvar methods = {\n // 23.3.3.3 WeakMap.prototype.get(key)\n get: function get(key) {\n if (isObject(key)) {\n var data = getWeak(key);\n if (data === true) return uncaughtFrozenStore(validate(this, WEAK_MAP)).get(key);\n return data ? data[this._i] : undefined;\n }\n },\n // 23.3.3.5 WeakMap.prototype.set(key, value)\n set: function set(key, value) {\n return weak.def(validate(this, WEAK_MAP), key, value);\n }\n};\n\n// 23.3 WeakMap Objects\nvar $WeakMap = module.exports = require('./_collection')(WEAK_MAP, wrapper, methods, weak, true, true);\n\n// IE11 WeakMap frozen keys fix\nif (NATIVE_WEAK_MAP && IS_IE11) {\n InternalMap = weak.getConstructor(wrapper, WEAK_MAP);\n assign(InternalMap.prototype, methods);\n meta.NEED = true;\n each(['delete', 'has', 'get', 'set'], function (key) {\n var proto = $WeakMap.prototype;\n var method = proto[key];\n redefine(proto, key, function (a, b) {\n // store frozen objects on internal weakmap shim\n if (isObject(a) && !isExtensible(a)) {\n if (!this._f) this._f = new InternalMap();\n var result = this._f[key](a, b);\n return key == 'set' ? this : result;\n // store all the rest on native weakmap\n } return method.call(this, a, b);\n });\n });\n}\n","'use strict';\nvar weak = require('./_collection-weak');\nvar validate = require('./_validate-collection');\nvar WEAK_SET = 'WeakSet';\n\n// 23.4 WeakSet Objects\nrequire('./_collection')(WEAK_SET, function (get) {\n return function WeakSet() { return get(this, arguments.length > 0 ? arguments[0] : undefined); };\n}, {\n // 23.4.3.1 WeakSet.prototype.add(value)\n add: function add(value) {\n return weak.def(validate(this, WEAK_SET), value, true);\n }\n}, weak, false, true);\n","'use strict';\n// https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatMap\nvar $export = require('./_export');\nvar flattenIntoArray = require('./_flatten-into-array');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar aFunction = require('./_a-function');\nvar arraySpeciesCreate = require('./_array-species-create');\n\n$export($export.P, 'Array', {\n flatMap: function flatMap(callbackfn /* , thisArg */) {\n var O = toObject(this);\n var sourceLen, A;\n aFunction(callbackfn);\n sourceLen = toLength(O.length);\n A = arraySpeciesCreate(O, 0);\n flattenIntoArray(A, O, O, sourceLen, 0, 1, callbackfn, arguments[1]);\n return A;\n }\n});\n\nrequire('./_add-to-unscopables')('flatMap');\n","'use strict';\n// https://tc39.github.io/proposal-flatMap/#sec-Array.prototype.flatten\nvar $export = require('./_export');\nvar flattenIntoArray = require('./_flatten-into-array');\nvar toObject = require('./_to-object');\nvar toLength = require('./_to-length');\nvar toInteger = require('./_to-integer');\nvar arraySpeciesCreate = require('./_array-species-create');\n\n$export($export.P, 'Array', {\n flatten: function flatten(/* depthArg = 1 */) {\n var depthArg = arguments[0];\n var O = toObject(this);\n var sourceLen = toLength(O.length);\n var A = arraySpeciesCreate(O, 0);\n flattenIntoArray(A, O, O, sourceLen, 0, depthArg === undefined ? 1 : toInteger(depthArg));\n return A;\n }\n});\n\nrequire('./_add-to-unscopables')('flatten');\n","'use strict';\n// https://github.com/tc39/Array.prototype.includes\nvar $export = require('./_export');\nvar $includes = require('./_array-includes')(true);\n\n$export($export.P, 'Array', {\n includes: function includes(el /* , fromIndex = 0 */) {\n return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined);\n }\n});\n\nrequire('./_add-to-unscopables')('includes');\n","// https://github.com/rwaldron/tc39-notes/blob/master/es6/2014-09/sept-25.md#510-globalasap-for-enqueuing-a-microtask\nvar $export = require('./_export');\nvar microtask = require('./_microtask')();\nvar process = require('./_global').process;\nvar isNode = require('./_cof')(process) == 'process';\n\n$export($export.G, {\n asap: function asap(fn) {\n var domain = isNode && process.domain;\n microtask(domain ? domain.bind(fn) : fn);\n }\n});\n","// https://github.com/ljharb/proposal-is-error\nvar $export = require('./_export');\nvar cof = require('./_cof');\n\n$export($export.S, 'Error', {\n isError: function isError(it) {\n return cof(it) === 'Error';\n }\n});\n","// https://github.com/tc39/proposal-global\nvar $export = require('./_export');\n\n$export($export.G, { global: require('./_global') });\n","// https://tc39.github.io/proposal-setmap-offrom/#sec-map.from\nrequire('./_set-collection-from')('Map');\n","// https://tc39.github.io/proposal-setmap-offrom/#sec-map.of\nrequire('./_set-collection-of')('Map');\n","// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar $export = require('./_export');\n\n$export($export.P + $export.R, 'Map', { toJSON: require('./_collection-to-json')('Map') });\n","// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n clamp: function clamp(x, lower, upper) {\n return Math.min(upper, Math.max(lower, x));\n }\n});\n","// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { DEG_PER_RAD: Math.PI / 180 });\n","// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = require('./_export');\nvar RAD_PER_DEG = 180 / Math.PI;\n\n$export($export.S, 'Math', {\n degrees: function degrees(radians) {\n return radians * RAD_PER_DEG;\n }\n});\n","// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = require('./_export');\nvar scale = require('./_math-scale');\nvar fround = require('./_math-fround');\n\n$export($export.S, 'Math', {\n fscale: function fscale(x, inLow, inHigh, outLow, outHigh) {\n return fround(scale(x, inLow, inHigh, outLow, outHigh));\n }\n});\n","// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n iaddh: function iaddh(x0, x1, y0, y1) {\n var $x0 = x0 >>> 0;\n var $x1 = x1 >>> 0;\n var $y0 = y0 >>> 0;\n return $x1 + (y1 >>> 0) + (($x0 & $y0 | ($x0 | $y0) & ~($x0 + $y0 >>> 0)) >>> 31) | 0;\n }\n});\n","// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n imulh: function imulh(u, v) {\n var UINT16 = 0xffff;\n var $u = +u;\n var $v = +v;\n var u0 = $u & UINT16;\n var v0 = $v & UINT16;\n var u1 = $u >> 16;\n var v1 = $v >> 16;\n var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);\n return u1 * v1 + (t >> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >> 16);\n }\n});\n","// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n isubh: function isubh(x0, x1, y0, y1) {\n var $x0 = x0 >>> 0;\n var $x1 = x1 >>> 0;\n var $y0 = y0 >>> 0;\n return $x1 - (y1 >>> 0) - ((~$x0 & $y0 | ~($x0 ^ $y0) & $x0 - $y0 >>> 0) >>> 31) | 0;\n }\n});\n","// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { RAD_PER_DEG: 180 / Math.PI });\n","// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = require('./_export');\nvar DEG_PER_RAD = Math.PI / 180;\n\n$export($export.S, 'Math', {\n radians: function radians(degrees) {\n return degrees * DEG_PER_RAD;\n }\n});\n","// https://rwaldron.github.io/proposal-math-extensions/\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { scale: require('./_math-scale') });\n","// http://jfbastien.github.io/papers/Math.signbit.html\nvar $export = require('./_export');\n\n$export($export.S, 'Math', { signbit: function signbit(x) {\n // eslint-disable-next-line no-self-compare\n return (x = +x) != x ? x : x == 0 ? 1 / x == Infinity : x > 0;\n} });\n","// https://gist.github.com/BrendanEich/4294d5c212a6d2254703\nvar $export = require('./_export');\n\n$export($export.S, 'Math', {\n umulh: function umulh(u, v) {\n var UINT16 = 0xffff;\n var $u = +u;\n var $v = +v;\n var u0 = $u & UINT16;\n var v0 = $v & UINT16;\n var u1 = $u >>> 16;\n var v1 = $v >>> 16;\n var t = (u1 * v0 >>> 0) + (u0 * v0 >>> 16);\n return u1 * v1 + (t >>> 16) + ((u0 * v1 >>> 0) + (t & UINT16) >>> 16);\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar aFunction = require('./_a-function');\nvar $defineProperty = require('./_object-dp');\n\n// B.2.2.2 Object.prototype.__defineGetter__(P, getter)\nrequire('./_descriptors') && $export($export.P + require('./_object-forced-pam'), 'Object', {\n __defineGetter__: function __defineGetter__(P, getter) {\n $defineProperty.f(toObject(this), P, { get: aFunction(getter), enumerable: true, configurable: true });\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar aFunction = require('./_a-function');\nvar $defineProperty = require('./_object-dp');\n\n// B.2.2.3 Object.prototype.__defineSetter__(P, setter)\nrequire('./_descriptors') && $export($export.P + require('./_object-forced-pam'), 'Object', {\n __defineSetter__: function __defineSetter__(P, setter) {\n $defineProperty.f(toObject(this), P, { set: aFunction(setter), enumerable: true, configurable: true });\n }\n});\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $entries = require('./_object-to-array')(true);\n\n$export($export.S, 'Object', {\n entries: function entries(it) {\n return $entries(it);\n }\n});\n","// https://github.com/tc39/proposal-object-getownpropertydescriptors\nvar $export = require('./_export');\nvar ownKeys = require('./_own-keys');\nvar toIObject = require('./_to-iobject');\nvar gOPD = require('./_object-gopd');\nvar createProperty = require('./_create-property');\n\n$export($export.S, 'Object', {\n getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) {\n var O = toIObject(object);\n var getDesc = gOPD.f;\n var keys = ownKeys(O);\n var result = {};\n var i = 0;\n var key, desc;\n while (keys.length > i) {\n desc = getDesc(O, key = keys[i++]);\n if (desc !== undefined) createProperty(result, key, desc);\n }\n return result;\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar toPrimitive = require('./_to-primitive');\nvar getPrototypeOf = require('./_object-gpo');\nvar getOwnPropertyDescriptor = require('./_object-gopd').f;\n\n// B.2.2.4 Object.prototype.__lookupGetter__(P)\nrequire('./_descriptors') && $export($export.P + require('./_object-forced-pam'), 'Object', {\n __lookupGetter__: function __lookupGetter__(P) {\n var O = toObject(this);\n var K = toPrimitive(P, true);\n var D;\n do {\n if (D = getOwnPropertyDescriptor(O, K)) return D.get;\n } while (O = getPrototypeOf(O));\n }\n});\n","'use strict';\nvar $export = require('./_export');\nvar toObject = require('./_to-object');\nvar toPrimitive = require('./_to-primitive');\nvar getPrototypeOf = require('./_object-gpo');\nvar getOwnPropertyDescriptor = require('./_object-gopd').f;\n\n// B.2.2.5 Object.prototype.__lookupSetter__(P)\nrequire('./_descriptors') && $export($export.P + require('./_object-forced-pam'), 'Object', {\n __lookupSetter__: function __lookupSetter__(P) {\n var O = toObject(this);\n var K = toPrimitive(P, true);\n var D;\n do {\n if (D = getOwnPropertyDescriptor(O, K)) return D.set;\n } while (O = getPrototypeOf(O));\n }\n});\n","// https://github.com/tc39/proposal-object-values-entries\nvar $export = require('./_export');\nvar $values = require('./_object-to-array')(false);\n\n$export($export.S, 'Object', {\n values: function values(it) {\n return $values(it);\n }\n});\n","'use strict';\n// https://github.com/zenparsing/es-observable\nvar $export = require('./_export');\nvar global = require('./_global');\nvar core = require('./_core');\nvar microtask = require('./_microtask')();\nvar OBSERVABLE = require('./_wks')('observable');\nvar aFunction = require('./_a-function');\nvar anObject = require('./_an-object');\nvar anInstance = require('./_an-instance');\nvar redefineAll = require('./_redefine-all');\nvar hide = require('./_hide');\nvar forOf = require('./_for-of');\nvar RETURN = forOf.RETURN;\n\nvar getMethod = function (fn) {\n return fn == null ? undefined : aFunction(fn);\n};\n\nvar cleanupSubscription = function (subscription) {\n var cleanup = subscription._c;\n if (cleanup) {\n subscription._c = undefined;\n cleanup();\n }\n};\n\nvar subscriptionClosed = function (subscription) {\n return subscription._o === undefined;\n};\n\nvar closeSubscription = function (subscription) {\n if (!subscriptionClosed(subscription)) {\n subscription._o = undefined;\n cleanupSubscription(subscription);\n }\n};\n\nvar Subscription = function (observer, subscriber) {\n anObject(observer);\n this._c = undefined;\n this._o = observer;\n observer = new SubscriptionObserver(this);\n try {\n var cleanup = subscriber(observer);\n var subscription = cleanup;\n if (cleanup != null) {\n if (typeof cleanup.unsubscribe === 'function') cleanup = function () { subscription.unsubscribe(); };\n else aFunction(cleanup);\n this._c = cleanup;\n }\n } catch (e) {\n observer.error(e);\n return;\n } if (subscriptionClosed(this)) cleanupSubscription(this);\n};\n\nSubscription.prototype = redefineAll({}, {\n unsubscribe: function unsubscribe() { closeSubscription(this); }\n});\n\nvar SubscriptionObserver = function (subscription) {\n this._s = subscription;\n};\n\nSubscriptionObserver.prototype = redefineAll({}, {\n next: function next(value) {\n var subscription = this._s;\n if (!subscriptionClosed(subscription)) {\n var observer = subscription._o;\n try {\n var m = getMethod(observer.next);\n if (m) return m.call(observer, value);\n } catch (e) {\n try {\n closeSubscription(subscription);\n } finally {\n throw e;\n }\n }\n }\n },\n error: function error(value) {\n var subscription = this._s;\n if (subscriptionClosed(subscription)) throw value;\n var observer = subscription._o;\n subscription._o = undefined;\n try {\n var m = getMethod(observer.error);\n if (!m) throw value;\n value = m.call(observer, value);\n } catch (e) {\n try {\n cleanupSubscription(subscription);\n } finally {\n throw e;\n }\n } cleanupSubscription(subscription);\n return value;\n },\n complete: function complete(value) {\n var subscription = this._s;\n if (!subscriptionClosed(subscription)) {\n var observer = subscription._o;\n subscription._o = undefined;\n try {\n var m = getMethod(observer.complete);\n value = m ? m.call(observer, value) : undefined;\n } catch (e) {\n try {\n cleanupSubscription(subscription);\n } finally {\n throw e;\n }\n } cleanupSubscription(subscription);\n return value;\n }\n }\n});\n\nvar $Observable = function Observable(subscriber) {\n anInstance(this, $Observable, 'Observable', '_f')._f = aFunction(subscriber);\n};\n\nredefineAll($Observable.prototype, {\n subscribe: function subscribe(observer) {\n return new Subscription(observer, this._f);\n },\n forEach: function forEach(fn) {\n var that = this;\n return new (core.Promise || global.Promise)(function (resolve, reject) {\n aFunction(fn);\n var subscription = that.subscribe({\n next: function (value) {\n try {\n return fn(value);\n } catch (e) {\n reject(e);\n subscription.unsubscribe();\n }\n },\n error: reject,\n complete: resolve\n });\n });\n }\n});\n\nredefineAll($Observable, {\n from: function from(x) {\n var C = typeof this === 'function' ? this : $Observable;\n var method = getMethod(anObject(x)[OBSERVABLE]);\n if (method) {\n var observable = anObject(method.call(x));\n return observable.constructor === C ? observable : new C(function (observer) {\n return observable.subscribe(observer);\n });\n }\n return new C(function (observer) {\n var done = false;\n microtask(function () {\n if (!done) {\n try {\n if (forOf(x, false, function (it) {\n observer.next(it);\n if (done) return RETURN;\n }) === RETURN) return;\n } catch (e) {\n if (done) throw e;\n observer.error(e);\n return;\n } observer.complete();\n }\n });\n return function () { done = true; };\n });\n },\n of: function of() {\n for (var i = 0, l = arguments.length, items = new Array(l); i < l;) items[i] = arguments[i++];\n return new (typeof this === 'function' ? this : $Observable)(function (observer) {\n var done = false;\n microtask(function () {\n if (!done) {\n for (var j = 0; j < items.length; ++j) {\n observer.next(items[j]);\n if (done) return;\n } observer.complete();\n }\n });\n return function () { done = true; };\n });\n }\n});\n\nhide($Observable.prototype, OBSERVABLE, function () { return this; });\n\n$export($export.G, { Observable: $Observable });\n\nrequire('./_set-species')('Observable');\n","// https://github.com/tc39/proposal-promise-finally\n'use strict';\nvar $export = require('./_export');\nvar core = require('./_core');\nvar global = require('./_global');\nvar speciesConstructor = require('./_species-constructor');\nvar promiseResolve = require('./_promise-resolve');\n\n$export($export.P + $export.R, 'Promise', { 'finally': function (onFinally) {\n var C = speciesConstructor(this, core.Promise || global.Promise);\n var isFunction = typeof onFinally == 'function';\n return this.then(\n isFunction ? function (x) {\n return promiseResolve(C, onFinally()).then(function () { return x; });\n } : onFinally,\n isFunction ? function (e) {\n return promiseResolve(C, onFinally()).then(function () { throw e; });\n } : onFinally\n );\n} });\n","'use strict';\n// https://github.com/tc39/proposal-promise-try\nvar $export = require('./_export');\nvar newPromiseCapability = require('./_new-promise-capability');\nvar perform = require('./_perform');\n\n$export($export.S, 'Promise', { 'try': function (callbackfn) {\n var promiseCapability = newPromiseCapability.f(this);\n var result = perform(callbackfn);\n (result.e ? promiseCapability.reject : promiseCapability.resolve)(result.v);\n return promiseCapability.promise;\n} });\n","var metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar toMetaKey = metadata.key;\nvar ordinaryDefineOwnMetadata = metadata.set;\n\nmetadata.exp({ defineMetadata: function defineMetadata(metadataKey, metadataValue, target, targetKey) {\n ordinaryDefineOwnMetadata(metadataKey, metadataValue, anObject(target), toMetaKey(targetKey));\n} });\n","var metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar toMetaKey = metadata.key;\nvar getOrCreateMetadataMap = metadata.map;\nvar store = metadata.store;\n\nmetadata.exp({ deleteMetadata: function deleteMetadata(metadataKey, target /* , targetKey */) {\n var targetKey = arguments.length < 3 ? undefined : toMetaKey(arguments[2]);\n var metadataMap = getOrCreateMetadataMap(anObject(target), targetKey, false);\n if (metadataMap === undefined || !metadataMap['delete'](metadataKey)) return false;\n if (metadataMap.size) return true;\n var targetMetadata = store.get(target);\n targetMetadata['delete'](targetKey);\n return !!targetMetadata.size || store['delete'](target);\n} });\n","var Set = require('./es6.set');\nvar from = require('./_array-from-iterable');\nvar metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar getPrototypeOf = require('./_object-gpo');\nvar ordinaryOwnMetadataKeys = metadata.keys;\nvar toMetaKey = metadata.key;\n\nvar ordinaryMetadataKeys = function (O, P) {\n var oKeys = ordinaryOwnMetadataKeys(O, P);\n var parent = getPrototypeOf(O);\n if (parent === null) return oKeys;\n var pKeys = ordinaryMetadataKeys(parent, P);\n return pKeys.length ? oKeys.length ? from(new Set(oKeys.concat(pKeys))) : pKeys : oKeys;\n};\n\nmetadata.exp({ getMetadataKeys: function getMetadataKeys(target /* , targetKey */) {\n return ordinaryMetadataKeys(anObject(target), arguments.length < 2 ? undefined : toMetaKey(arguments[1]));\n} });\n","var metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar getPrototypeOf = require('./_object-gpo');\nvar ordinaryHasOwnMetadata = metadata.has;\nvar ordinaryGetOwnMetadata = metadata.get;\nvar toMetaKey = metadata.key;\n\nvar ordinaryGetMetadata = function (MetadataKey, O, P) {\n var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);\n if (hasOwn) return ordinaryGetOwnMetadata(MetadataKey, O, P);\n var parent = getPrototypeOf(O);\n return parent !== null ? ordinaryGetMetadata(MetadataKey, parent, P) : undefined;\n};\n\nmetadata.exp({ getMetadata: function getMetadata(metadataKey, target /* , targetKey */) {\n return ordinaryGetMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2]));\n} });\n","var metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar ordinaryOwnMetadataKeys = metadata.keys;\nvar toMetaKey = metadata.key;\n\nmetadata.exp({ getOwnMetadataKeys: function getOwnMetadataKeys(target /* , targetKey */) {\n return ordinaryOwnMetadataKeys(anObject(target), arguments.length < 2 ? undefined : toMetaKey(arguments[1]));\n} });\n","var metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar ordinaryGetOwnMetadata = metadata.get;\nvar toMetaKey = metadata.key;\n\nmetadata.exp({ getOwnMetadata: function getOwnMetadata(metadataKey, target /* , targetKey */) {\n return ordinaryGetOwnMetadata(metadataKey, anObject(target)\n , arguments.length < 3 ? undefined : toMetaKey(arguments[2]));\n} });\n","var metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar getPrototypeOf = require('./_object-gpo');\nvar ordinaryHasOwnMetadata = metadata.has;\nvar toMetaKey = metadata.key;\n\nvar ordinaryHasMetadata = function (MetadataKey, O, P) {\n var hasOwn = ordinaryHasOwnMetadata(MetadataKey, O, P);\n if (hasOwn) return true;\n var parent = getPrototypeOf(O);\n return parent !== null ? ordinaryHasMetadata(MetadataKey, parent, P) : false;\n};\n\nmetadata.exp({ hasMetadata: function hasMetadata(metadataKey, target /* , targetKey */) {\n return ordinaryHasMetadata(metadataKey, anObject(target), arguments.length < 3 ? undefined : toMetaKey(arguments[2]));\n} });\n","var metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar ordinaryHasOwnMetadata = metadata.has;\nvar toMetaKey = metadata.key;\n\nmetadata.exp({ hasOwnMetadata: function hasOwnMetadata(metadataKey, target /* , targetKey */) {\n return ordinaryHasOwnMetadata(metadataKey, anObject(target)\n , arguments.length < 3 ? undefined : toMetaKey(arguments[2]));\n} });\n","var $metadata = require('./_metadata');\nvar anObject = require('./_an-object');\nvar aFunction = require('./_a-function');\nvar toMetaKey = $metadata.key;\nvar ordinaryDefineOwnMetadata = $metadata.set;\n\n$metadata.exp({ metadata: function metadata(metadataKey, metadataValue) {\n return function decorator(target, targetKey) {\n ordinaryDefineOwnMetadata(\n metadataKey, metadataValue,\n (targetKey !== undefined ? anObject : aFunction)(target),\n toMetaKey(targetKey)\n );\n };\n} });\n","// https://tc39.github.io/proposal-setmap-offrom/#sec-set.from\nrequire('./_set-collection-from')('Set');\n","// https://tc39.github.io/proposal-setmap-offrom/#sec-set.of\nrequire('./_set-collection-of')('Set');\n","// https://github.com/DavidBruant/Map-Set.prototype.toJSON\nvar $export = require('./_export');\n\n$export($export.P + $export.R, 'Set', { toJSON: require('./_collection-to-json')('Set') });\n","'use strict';\n// https://github.com/mathiasbynens/String.prototype.at\nvar $export = require('./_export');\nvar $at = require('./_string-at')(true);\nvar $fails = require('./_fails');\n\nvar FORCED = $fails(function () {\n return '𠮷'.at(0) !== '𠮷';\n});\n\n$export($export.P + $export.F * FORCED, 'String', {\n at: function at(pos) {\n return $at(this, pos);\n }\n});\n","'use strict';\n// https://tc39.github.io/String.prototype.matchAll/\nvar $export = require('./_export');\nvar defined = require('./_defined');\nvar toLength = require('./_to-length');\nvar isRegExp = require('./_is-regexp');\nvar getFlags = require('./_flags');\nvar RegExpProto = RegExp.prototype;\n\nvar $RegExpStringIterator = function (regexp, string) {\n this._r = regexp;\n this._s = string;\n};\n\nrequire('./_iter-create')($RegExpStringIterator, 'RegExp String', function next() {\n var match = this._r.exec(this._s);\n return { value: match, done: match === null };\n});\n\n$export($export.P, 'String', {\n matchAll: function matchAll(regexp) {\n defined(this);\n if (!isRegExp(regexp)) throw TypeError(regexp + ' is not a regexp!');\n var S = String(this);\n var flags = 'flags' in RegExpProto ? String(regexp.flags) : getFlags.call(regexp);\n var rx = new RegExp(regexp.source, ~flags.indexOf('g') ? flags : 'g' + flags);\n rx.lastIndex = toLength(regexp.lastIndex);\n return new $RegExpStringIterator(rx, S);\n }\n});\n","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\nvar WEBKIT_BUG = /Version\\/10\\.\\d+(\\.\\d+)?( Mobile\\/\\w+)? Safari\\//.test(userAgent);\n\n$export($export.P + $export.F * WEBKIT_BUG, 'String', {\n padEnd: function padEnd(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, false);\n }\n});\n","'use strict';\n// https://github.com/tc39/proposal-string-pad-start-end\nvar $export = require('./_export');\nvar $pad = require('./_string-pad');\nvar userAgent = require('./_user-agent');\n\n// https://github.com/zloirock/core-js/issues/280\nvar WEBKIT_BUG = /Version\\/10\\.\\d+(\\.\\d+)?( Mobile\\/\\w+)? Safari\\//.test(userAgent);\n\n$export($export.P + $export.F * WEBKIT_BUG, 'String', {\n padStart: function padStart(maxLength /* , fillString = ' ' */) {\n return $pad(this, maxLength, arguments.length > 1 ? arguments[1] : undefined, true);\n }\n});\n","'use strict';\n// https://github.com/sebmarkbage/ecmascript-string-left-right-trim\nrequire('./_string-trim')('trimLeft', function ($trim) {\n return function trimLeft() {\n return $trim(this, 1);\n };\n}, 'trimStart');\n","'use strict';\n// https://github.com/sebmarkbage/ecmascript-string-left-right-trim\nrequire('./_string-trim')('trimRight', function ($trim) {\n return function trimRight() {\n return $trim(this, 2);\n };\n}, 'trimEnd');\n","require('./_wks-define')('asyncIterator');\n","require('./_wks-define')('observable');\n","// https://github.com/tc39/proposal-global\nvar $export = require('./_export');\n\n$export($export.S, 'System', { global: require('./_global') });\n","// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.from\nrequire('./_set-collection-from')('WeakMap');\n","// https://tc39.github.io/proposal-setmap-offrom/#sec-weakmap.of\nrequire('./_set-collection-of')('WeakMap');\n","// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.from\nrequire('./_set-collection-from')('WeakSet');\n","// https://tc39.github.io/proposal-setmap-offrom/#sec-weakset.of\nrequire('./_set-collection-of')('WeakSet');\n","var $iterators = require('./es6.array.iterator');\nvar getKeys = require('./_object-keys');\nvar redefine = require('./_redefine');\nvar global = require('./_global');\nvar hide = require('./_hide');\nvar Iterators = require('./_iterators');\nvar wks = require('./_wks');\nvar ITERATOR = wks('iterator');\nvar TO_STRING_TAG = wks('toStringTag');\nvar ArrayValues = Iterators.Array;\n\nvar DOMIterables = {\n CSSRuleList: true, // TODO: Not spec compliant, should be false.\n CSSStyleDeclaration: false,\n CSSValueList: false,\n ClientRectList: false,\n DOMRectList: false,\n DOMStringList: false,\n DOMTokenList: true,\n DataTransferItemList: false,\n FileList: false,\n HTMLAllCollection: false,\n HTMLCollection: false,\n HTMLFormElement: false,\n HTMLSelectElement: false,\n MediaList: true, // TODO: Not spec compliant, should be false.\n MimeTypeArray: false,\n NamedNodeMap: false,\n NodeList: true,\n PaintRequestList: false,\n Plugin: false,\n PluginArray: false,\n SVGLengthList: false,\n SVGNumberList: false,\n SVGPathSegList: false,\n SVGPointList: false,\n SVGStringList: false,\n SVGTransformList: false,\n SourceBufferList: false,\n StyleSheetList: true, // TODO: Not spec compliant, should be false.\n TextTrackCueList: false,\n TextTrackList: false,\n TouchList: false\n};\n\nfor (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) {\n var NAME = collections[i];\n var explicit = DOMIterables[NAME];\n var Collection = global[NAME];\n var proto = Collection && Collection.prototype;\n var key;\n if (proto) {\n if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues);\n if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME);\n Iterators[NAME] = ArrayValues;\n if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true);\n }\n}\n","var $export = require('./_export');\nvar $task = require('./_task');\n$export($export.G + $export.B, {\n setImmediate: $task.set,\n clearImmediate: $task.clear\n});\n","// ie9- setTimeout & setInterval additional parameters fix\nvar global = require('./_global');\nvar $export = require('./_export');\nvar userAgent = require('./_user-agent');\nvar slice = [].slice;\nvar MSIE = /MSIE .\\./.test(userAgent); // <- dirty ie9- check\nvar wrap = function (set) {\n return function (fn, time /* , ...args */) {\n var boundArgs = arguments.length > 2;\n var args = boundArgs ? slice.call(arguments, 2) : false;\n return set(boundArgs ? function () {\n // eslint-disable-next-line no-new-func\n (typeof fn == 'function' ? fn : Function(fn)).apply(this, args);\n } : fn, time);\n };\n};\n$export($export.G + $export.B + $export.F * MSIE, {\n setTimeout: wrap(global.setTimeout),\n setInterval: wrap(global.setInterval)\n});\n","require('./modules/es6.symbol');\nrequire('./modules/es6.object.create');\nrequire('./modules/es6.object.define-property');\nrequire('./modules/es6.object.define-properties');\nrequire('./modules/es6.object.get-own-property-descriptor');\nrequire('./modules/es6.object.get-prototype-of');\nrequire('./modules/es6.object.keys');\nrequire('./modules/es6.object.get-own-property-names');\nrequire('./modules/es6.object.freeze');\nrequire('./modules/es6.object.seal');\nrequire('./modules/es6.object.prevent-extensions');\nrequire('./modules/es6.object.is-frozen');\nrequire('./modules/es6.object.is-sealed');\nrequire('./modules/es6.object.is-extensible');\nrequire('./modules/es6.object.assign');\nrequire('./modules/es6.object.is');\nrequire('./modules/es6.object.set-prototype-of');\nrequire('./modules/es6.object.to-string');\nrequire('./modules/es6.function.bind');\nrequire('./modules/es6.function.name');\nrequire('./modules/es6.function.has-instance');\nrequire('./modules/es6.parse-int');\nrequire('./modules/es6.parse-float');\nrequire('./modules/es6.number.constructor');\nrequire('./modules/es6.number.to-fixed');\nrequire('./modules/es6.number.to-precision');\nrequire('./modules/es6.number.epsilon');\nrequire('./modules/es6.number.is-finite');\nrequire('./modules/es6.number.is-integer');\nrequire('./modules/es6.number.is-nan');\nrequire('./modules/es6.number.is-safe-integer');\nrequire('./modules/es6.number.max-safe-integer');\nrequire('./modules/es6.number.min-safe-integer');\nrequire('./modules/es6.number.parse-float');\nrequire('./modules/es6.number.parse-int');\nrequire('./modules/es6.math.acosh');\nrequire('./modules/es6.math.asinh');\nrequire('./modules/es6.math.atanh');\nrequire('./modules/es6.math.cbrt');\nrequire('./modules/es6.math.clz32');\nrequire('./modules/es6.math.cosh');\nrequire('./modules/es6.math.expm1');\nrequire('./modules/es6.math.fround');\nrequire('./modules/es6.math.hypot');\nrequire('./modules/es6.math.imul');\nrequire('./modules/es6.math.log10');\nrequire('./modules/es6.math.log1p');\nrequire('./modules/es6.math.log2');\nrequire('./modules/es6.math.sign');\nrequire('./modules/es6.math.sinh');\nrequire('./modules/es6.math.tanh');\nrequire('./modules/es6.math.trunc');\nrequire('./modules/es6.string.from-code-point');\nrequire('./modules/es6.string.raw');\nrequire('./modules/es6.string.trim');\nrequire('./modules/es6.string.iterator');\nrequire('./modules/es6.string.code-point-at');\nrequire('./modules/es6.string.ends-with');\nrequire('./modules/es6.string.includes');\nrequire('./modules/es6.string.repeat');\nrequire('./modules/es6.string.starts-with');\nrequire('./modules/es6.string.anchor');\nrequire('./modules/es6.string.big');\nrequire('./modules/es6.string.blink');\nrequire('./modules/es6.string.bold');\nrequire('./modules/es6.string.fixed');\nrequire('./modules/es6.string.fontcolor');\nrequire('./modules/es6.string.fontsize');\nrequire('./modules/es6.string.italics');\nrequire('./modules/es6.string.link');\nrequire('./modules/es6.string.small');\nrequire('./modules/es6.string.strike');\nrequire('./modules/es6.string.sub');\nrequire('./modules/es6.string.sup');\nrequire('./modules/es6.date.now');\nrequire('./modules/es6.date.to-json');\nrequire('./modules/es6.date.to-iso-string');\nrequire('./modules/es6.date.to-string');\nrequire('./modules/es6.date.to-primitive');\nrequire('./modules/es6.array.is-array');\nrequire('./modules/es6.array.from');\nrequire('./modules/es6.array.of');\nrequire('./modules/es6.array.join');\nrequire('./modules/es6.array.slice');\nrequire('./modules/es6.array.sort');\nrequire('./modules/es6.array.for-each');\nrequire('./modules/es6.array.map');\nrequire('./modules/es6.array.filter');\nrequire('./modules/es6.array.some');\nrequire('./modules/es6.array.every');\nrequire('./modules/es6.array.reduce');\nrequire('./modules/es6.array.reduce-right');\nrequire('./modules/es6.array.index-of');\nrequire('./modules/es6.array.last-index-of');\nrequire('./modules/es6.array.copy-within');\nrequire('./modules/es6.array.fill');\nrequire('./modules/es6.array.find');\nrequire('./modules/es6.array.find-index');\nrequire('./modules/es6.array.species');\nrequire('./modules/es6.array.iterator');\nrequire('./modules/es6.regexp.constructor');\nrequire('./modules/es6.regexp.exec');\nrequire('./modules/es6.regexp.to-string');\nrequire('./modules/es6.regexp.flags');\nrequire('./modules/es6.regexp.match');\nrequire('./modules/es6.regexp.replace');\nrequire('./modules/es6.regexp.search');\nrequire('./modules/es6.regexp.split');\nrequire('./modules/es6.promise');\nrequire('./modules/es6.map');\nrequire('./modules/es6.set');\nrequire('./modules/es6.weak-map');\nrequire('./modules/es6.weak-set');\nrequire('./modules/es6.typed.array-buffer');\nrequire('./modules/es6.typed.data-view');\nrequire('./modules/es6.typed.int8-array');\nrequire('./modules/es6.typed.uint8-array');\nrequire('./modules/es6.typed.uint8-clamped-array');\nrequire('./modules/es6.typed.int16-array');\nrequire('./modules/es6.typed.uint16-array');\nrequire('./modules/es6.typed.int32-array');\nrequire('./modules/es6.typed.uint32-array');\nrequire('./modules/es6.typed.float32-array');\nrequire('./modules/es6.typed.float64-array');\nrequire('./modules/es6.reflect.apply');\nrequire('./modules/es6.reflect.construct');\nrequire('./modules/es6.reflect.define-property');\nrequire('./modules/es6.reflect.delete-property');\nrequire('./modules/es6.reflect.enumerate');\nrequire('./modules/es6.reflect.get');\nrequire('./modules/es6.reflect.get-own-property-descriptor');\nrequire('./modules/es6.reflect.get-prototype-of');\nrequire('./modules/es6.reflect.has');\nrequire('./modules/es6.reflect.is-extensible');\nrequire('./modules/es6.reflect.own-keys');\nrequire('./modules/es6.reflect.prevent-extensions');\nrequire('./modules/es6.reflect.set');\nrequire('./modules/es6.reflect.set-prototype-of');\nrequire('./modules/es7.array.includes');\nrequire('./modules/es7.array.flat-map');\nrequire('./modules/es7.array.flatten');\nrequire('./modules/es7.string.at');\nrequire('./modules/es7.string.pad-start');\nrequire('./modules/es7.string.pad-end');\nrequire('./modules/es7.string.trim-left');\nrequire('./modules/es7.string.trim-right');\nrequire('./modules/es7.string.match-all');\nrequire('./modules/es7.symbol.async-iterator');\nrequire('./modules/es7.symbol.observable');\nrequire('./modules/es7.object.get-own-property-descriptors');\nrequire('./modules/es7.object.values');\nrequire('./modules/es7.object.entries');\nrequire('./modules/es7.object.define-getter');\nrequire('./modules/es7.object.define-setter');\nrequire('./modules/es7.object.lookup-getter');\nrequire('./modules/es7.object.lookup-setter');\nrequire('./modules/es7.map.to-json');\nrequire('./modules/es7.set.to-json');\nrequire('./modules/es7.map.of');\nrequire('./modules/es7.set.of');\nrequire('./modules/es7.weak-map.of');\nrequire('./modules/es7.weak-set.of');\nrequire('./modules/es7.map.from');\nrequire('./modules/es7.set.from');\nrequire('./modules/es7.weak-map.from');\nrequire('./modules/es7.weak-set.from');\nrequire('./modules/es7.global');\nrequire('./modules/es7.system.global');\nrequire('./modules/es7.error.is-error');\nrequire('./modules/es7.math.clamp');\nrequire('./modules/es7.math.deg-per-rad');\nrequire('./modules/es7.math.degrees');\nrequire('./modules/es7.math.fscale');\nrequire('./modules/es7.math.iaddh');\nrequire('./modules/es7.math.isubh');\nrequire('./modules/es7.math.imulh');\nrequire('./modules/es7.math.rad-per-deg');\nrequire('./modules/es7.math.radians');\nrequire('./modules/es7.math.scale');\nrequire('./modules/es7.math.umulh');\nrequire('./modules/es7.math.signbit');\nrequire('./modules/es7.promise.finally');\nrequire('./modules/es7.promise.try');\nrequire('./modules/es7.reflect.define-metadata');\nrequire('./modules/es7.reflect.delete-metadata');\nrequire('./modules/es7.reflect.get-metadata');\nrequire('./modules/es7.reflect.get-metadata-keys');\nrequire('./modules/es7.reflect.get-own-metadata');\nrequire('./modules/es7.reflect.get-own-metadata-keys');\nrequire('./modules/es7.reflect.has-metadata');\nrequire('./modules/es7.reflect.has-own-metadata');\nrequire('./modules/es7.reflect.metadata');\nrequire('./modules/es7.asap');\nrequire('./modules/es7.observable');\nrequire('./modules/web.timers');\nrequire('./modules/web.immediate');\nrequire('./modules/web.dom.iterable');\nmodule.exports = require('./modules/_core');\n","module.exports={\n \"ru\": {\n \"name\": \"русский\"\n },\n \"ru-RU\": {\n \"name\": \"русский\"\n },\n \"ar\": {\n \"name\": \"\"\n },\n \"he\": {\n \"name\": \"\"\n },\n \"zh-Hans\": {\n \"name\": \"中文(简体)\"\n },\n \"zh-CN\": {\n \"name\": \"中文(简体)\"\n },\n \"zh-SG\": {\n \"name\": \"中文(简体)\"\n },\n \"zh-Hant\": {\n \"name\": \"中文(繁體)\"\n },\n \"zh-HK\": {\n \"name\": \"中文(繁體)\"\n },\n \"zh-MO\": {\n \"name\": \"中文(繁體)\"\n },\n \"zh-TW\": {\n \"name\": \"中文(繁體)\"\n },\n \"ja\": {\n \"name\": \"日本語\"\n },\n \"ja-JP\": {\n \"name\": \"日本語\"\n },\n \"ta\": {\n \"name\": \"மொழி\"\n }\n}\n","module.exports={\n \"advantage\": { \"enabled\": true, \"testable\": true },\n \"autocomplete\": { \"enabled\": true, \"testable\": true },\n \"redis-cache\": {\n \"enabled\": true,\n \"_comment\": \"this feature cannot be testable, and cannot use the featureManager\"\n },\n \"content-holds\": { \"enabled\": true, \"testable\": true },\n \"backToMainCollectionLink\": { \"enabled\": true, \"testable\": true },\n \"libbyTout\": { \"enabled\": true, \"testable\": true },\n \"promoteLibby\": { \"enabled\": true, \"testable\": true },\n \"switchToLibby\": { \"enabled\": true, \"testable\": true },\n \"readingHistory\": {\n \"enabled\": true,\n \"testable\": true,\n \"_comment\": \"LHTNG-1809\"\n },\n \"atosLevels\": { \"enabled\": true, \"testable\": true },\n \"lexileScores\": { \"enabled\": true, \"testable\": true },\n \"gradeLevels\": { \"enabled\": true, \"testable\": true },\n \"interestLevels\": { \"enabled\": true, \"testable\": true },\n \"bannerIsSecondaryColor\": {\n \"enabled\": true,\n \"testable\": true,\n \"_comment\": \"this feature makes the banner the secondary color and the toast darker\"\n },\n \"kindleFooter\": {\n \"enabled\": true,\n \"testable\": true,\n \"_comment\": \"LHTNG-2315 - kindle footer\"\n },\n \"kindleNav\": {\n \"enabled\": true,\n \"testable\": true,\n \"_comment\": \"LHTNG-2315 - kindle nav promotion\"\n },\n \"kindleLoanFormatLimit\": {\n \"enabled\": true,\n \"testable\": true,\n \"_comment\": \"LHTNG-2315 - kindle loans format limit\"\n },\n \"kindleSearchOffer\": {\n \"enabled\": true,\n \"testable\": true,\n \"_comment\": \"LHTNG-2315 - offer to set from search\"\n },\n \"kindleLoanOffer\": {\n \"enabled\": true,\n \"testable\": true,\n \"_comment\": \"LHTNG-2315 - offer to set from fulfill\"\n },\n \"getACard\": {\n \"enabled\": true,\n \"testable\": true,\n \"_comment\": \"LHTNG-2479 - get a card promotion modal\"\n },\n \"enhancedLibbyPromo\": { \"enabled\": true, \"testable\": true },\n \"showLibbyIntercept\": { \"enabled\": false, \"testable\": true },\n \"enhancedSeries\": { \"enabled\": false, \"testable\": true },\n \"sampleOnlyMode\": { \"enabled\": true, \"testable\": true },\n \"reciprocalLending\": { \"enabled\": true, \"testable\": true },\n \"LHTNG-2863\": { \"enabled\": false, \"testable\": true },\n \"disableOdAppAccess\": { \"enabled\": false, \"testable\": true }\n}\n","module.exports={\n \"codes\": [\n \"BH\",\n \"CY\",\n \"EG\",\n \"IQ\",\n \"IR\",\n \"IL\",\n \"JO\",\n \"KW\",\n \"LB\",\n \"OM\",\n \"PS\",\n \"QA\",\n \"SA\",\n \"SY\",\n \"KW\",\n \"LY\",\n \"MR\",\n \"MA\",\n \"SD\",\n \"TN\",\n \"TR\",\n \"AE\",\n \"YE\"\n ]\n}\n","module.exports={\n \"237\": { \"url\": \"http://princewilliam-ng.libraryreserve.com/\" },\n \"100501\": { \"url\": \"http://qaintegration-ng.libraryreserve.com/\" }\n}\n","module.exports={\n \"supportedLanguages\": [\n {\n \"languageCodes\": [\n \"en\",\n \"en-029\",\n \"en-AU\",\n \"en-BZ\",\n \"en-CA\",\n \"en-GB\",\n \"en-IE\",\n \"en-IN\",\n \"en-JM\",\n \"en-MY\",\n \"en-NZ\",\n \"en-PH\",\n \"en-SG\",\n \"en-TT\",\n \"en-US\",\n \"en-ZA\",\n \"en-ZW\"\n ],\n \"defaultLanguageCode\": \"en\",\n \"nativeDisplayName\": \"English\",\n \"displayName\": \"English\"\n },\n {\n \"languageCodes\": [\n \"es\",\n \"es-AR\",\n \"es-BO\",\n \"es-CL\",\n \"es-CO\",\n \"es-CR\",\n \"es-DO\",\n \"es-EC\",\n \"es-ES\",\n \"es-GT\",\n \"es-HN\",\n \"es-MX\",\n \"es-NI\",\n \"es-PA\",\n \"es-PE\",\n \"es-PR\",\n \"es-PY\",\n \"es-SV\",\n \"es-US\",\n \"es-UY\",\n \"es-VE\"\n ],\n \"defaultLanguageCode\": \"es\",\n \"nativeDisplayName\": \"Español\",\n \"displayName\": \"Spanish\"\n },\n {\n \"languageCodes\": [\n \"fr-CA\",\n \"fr\"\n ],\n \"defaultLanguageCode\": \"fr-CA\",\n \"nativeDisplayName\": \"Français (Canada)\",\n \"displayName\": \"French (Canadian)\"\n },\n {\n \"languageCodes\": [\n \"zh-CN\",\n \"zh-Hans\",\n \"zh-SG\",\n \"zh\"\n ],\n \"defaultLanguageCode\": \"zh-Hans\",\n \"nativeDisplayName\": \"中文(简体)\",\n \"displayName\": \"Chinese (Simplified)\"\n },\n {\n \"languageCodes\": [\n \"zh-Hant\",\n \"zh-HK\",\n \"zh-MO\",\n \"zh-TW\"\n ],\n \"defaultLanguageCode\": \"zh-Hant\",\n \"nativeDisplayName\": \"中文(繁體)\",\n \"displayName\": \"Chinese (Traditional)\"\n },\n {\n \"languageCodes\": [\n \"ja\",\n \"ja-JP\"\n ],\n \"defaultLanguageCode\": \"ja\",\n \"nativeDisplayName\": \"日本語\",\n \"displayName\": \"Japanese\"\n },\n {\n \"languageCodes\": [\n \"ms\",\n \"ms-BN\",\n \"ms-MY\"\n ],\n \"defaultLanguageCode\": \"ms\",\n \"nativeDisplayName\": \"Bahasa Melayu\",\n \"displayName\": \"Malay\"\n },\n {\n \"languageCodes\": [\n \"ru\",\n \"ru-RU\"\n ],\n \"defaultLanguageCode\": \"ru\",\n \"nativeDisplayName\": \"Русский\",\n \"displayName\": \"Russian\"\n },\n {\n \"languageCodes\": [\n \"sv\",\n \"sv-FI\",\n \"sv-SE\"\n ],\n \"defaultLanguageCode\": \"sv\",\n \"nativeDisplayName\": \"Svenska\",\n \"displayName\": \"Swedish\"\n },\n {\n \"languageCodes\": [\n \"fi\",\n \"fi-FI\"\n ],\n \"defaultLanguageCode\": \"fi\",\n \"nativeDisplayName\": \"Suomi\",\n \"displayName\": \"Finnish\"\n },\n {\n \"languageCodes\": [\n \"it\",\n \"it-CH\",\n \"it-IT\"\n ],\n \"defaultLanguageCode\": \"it\",\n \"nativeDisplayName\": \"Italiano\",\n \"displayName\": \"Italian\"\n },\n {\n \"languageCodes\": [\n \"de\",\n \"de-AT\",\n \"de-CH\",\n \"de-DE\",\n \"de-LI\",\n \"de-LU\"\n ],\n \"defaultLanguageCode\": \"de\",\n \"nativeDisplayName\": \"Deutsch\",\n \"displayName\": \"German\"\n },\n {\n \"languageCodes\": [\n \"da\",\n \"da-DK\"\n ],\n \"defaultLanguageCode\": \"da\",\n \"nativeDisplayName\": \"Dansk\",\n \"displayName\": \"Danish\"\n },\n {\n \"languageCodes\": [\n \"tr\",\n \"tr-TR\"\n ],\n \"defaultLanguageCode\": \"tr\",\n \"nativeDisplayName\": \"Türkçe\",\n \"displayName\": \"Turkish\"\n },\n {\n \"languageCodes\": [\n \"ko\",\n \"ko-KR\"\n ],\n \"defaultLanguageCode\": \"ko\",\n \"nativeDisplayName\": \"한국어\",\n \"displayName\": \"Korean\"\n },\n {\n \"languageCodes\": [\n \"nl\",\n \"nl-BE\",\n \"nl-NL\"\n ],\n \"defaultLanguageCode\": \"nl\",\n \"nativeDisplayName\": \"Nederlands\",\n \"displayName\": \"Dutch\"\n },\n {\n \"languageCodes\": [\n \"ta\",\n \"ta-IN\"\n ],\n \"defaultLanguageCode\": \"ta\",\n \"nativeDisplayName\": \"தமிழ்\",\n \"displayName\": \"Tamil\"\n },\n {\n \"languageCodes\": [\n \"is\",\n \"is-IS\"\n ],\n \"defaultLanguageCode\": \"is\",\n \"nativeDisplayName\": \"Íslenska\",\n \"displayName\": \"Icelandic\"\n }\n ]\n}\n","'use strict';\nconst _ = require('underscore');\n\nclass AccountLimits {\n constructor(props) {\n this.loansLimit = 0;\n this.loansCount = 0;\n this.holdsLimit = 0;\n this.holdsCount = 0;\n this.renewalDayLimit = 3;\n // This is an accepted constant value, but it not provided via the thunder interface at this time - etung:20161123\n this.wishlistLimit = 5000;\n this.wishlistCount = 0;\n this.totalItemsCountedTowardsCheckoutLimit = 0;\n\n _.extend(this, props);\n }\n\n get loansRemaining() {\n return this.loansLimit - this.totalItemsCountedTowardsCheckoutLimit;\n }\n\n get holdsRemaining() {\n return this.holdsLimit - this.holdsCount;\n }\n\n get wishlistRemaining() {\n return this.wishlistLimit - this.wishlistCount;\n }\n\n static parseFromThunder(card, loans, holds, wishlist) {\n let accountLimits = new AccountLimits();\n\n accountLimits.holdsCount = holds.totalItems;\n accountLimits.holdsLimit = card.holdLimit;\n\n accountLimits.loansCount = loans.totalItems;\n accountLimits.totalItemsCountedTowardsCheckoutLimit =\n loans.totalItemsCountedTowardsCheckoutLimit;\n\n if (card.checkoutLimitsByMediaType) {\n var c = card.checkoutLimitsByMediaType;\n accountLimits.loansLimit =\n c.ebook || c.audiobook || c.video || accountLimits.loansLimit;\n }\n\n accountLimits.wishlistCount = wishlist.totalItems;\n return accountLimits;\n }\n}\n\nmodule.exports = AccountLimits;\n","var _ = require('underscore');\nconst semver = require('semver');\n\n// View model for loans page. I'm not really sure where this belongs in our project structure. A good name also eludes me.\n//\n// I tried putting this logic in the swig and ran into some frustrating limitations.\n\n\nclass LoanTitle {\n constructor(title, limitDisplayFormats, preferKindle, isInODApp, isMac, macOsAudioDownloadsDisabled, macOSAudioDownloadReenabledPreCatalina,\n isPreCatalinaMac, restrictVideo, hideDisabledFormats, odAppSunset, fixMagazineDisplay, odreadFulfillmentFirst) {\n this.limitDisplayFormats = limitDisplayFormats;\n this.preferKindle = preferKindle;\n this.isInODApp = isInODApp;\n this.isMac = isMac;\n this.macOsAudioDownloadsDisabled = macOsAudioDownloadsDisabled; // feature flag for LHTNG-3702 'noAudiobooksForMacOS'\n this.macOSAudioDownloadReenabledPreCatalina = macOSAudioDownloadReenabledPreCatalina; // feature flag for LHTNG-3789\n this.isPreCatalinaMac = isPreCatalinaMac;\n this.restrictVideo = restrictVideo; // feature flag for LHTNG-4042\n this.hideDisabledFormats = hideDisabledFormats; // feature flag for LHTNG-4218\n this.odAppSunset = odAppSunset; // feature flag for LHTNG-4191\n this.fixMagazineDisplay = fixMagazineDisplay; // feature flag for LHTNG-4278\n this.odreadFulfillmentFirst = odreadFulfillmentFirst; // feature flag for LHTNG-4437\n Object.assign(this, title);\n }\n\n get alternativeToKindle() {\n let alternativeFormat = '';\n if (this.hasOverdriveFormat) {\n alternativeFormat = 'odread';\n }\n else if (this.hasNonKindleNonReadFormat) {\n alternativeFormat = this.nonKindleNonReadFormats[0].id;\n }\n return alternativeFormat;\n }\n \n get showKindleTroubleAccordian() {\n return !this.showNonKindleNonReadFormats && !this.showODFormatButton && !(this.restrictedFormats && this.restrictedFormats.length > 0);\n }\n\n get isLockedOnKindle() {\n return this.isFormatLockedIn && this.otherFormats != null && this.otherFormats.length > 0 && this.otherFormats[0].id === 'ebook-kindle';\n }\n\n get isEbook() {\n return this.type.id === 'ebook';\n }\n\n get isAudiobook() {\n return this.type.id === 'audiobook';\n }\n\n get isVideo() {\n return this.type.id === 'video';\n }\n\n get isMagazine() {\n return this.type.id === 'magazine';\n }\n\n get hasReadalong() {\n return !!(this.overDriveFormat && this.overDriveFormat.hasAudioSynchronizedText);\n }\n\n get hasKindleFormat() {\n return this.hideDisabledFormats\n ? this.formats.findIndex((format) => format.id === 'ebook-kindle') !== -1 \n : this.otherFormats.findIndex((format) => format.id === 'ebook-kindle') !== -1;\n }\n\n get hasMp3Format() {\n return this.formats.findIndex((format) => format.id === 'audiobook-mp3') !== -1 || this.otherFormats.findIndex((format) => format.id === 'audiobook-mp3') !== -1;\n }\n\n get hasMediaDoFormat() {\n return this.formats.findIndex((format) => format.id === 'ebook-media-do') !== -1 || this.otherFormats.findIndex((format) => format.id === 'ebook-media-do') !== -1;\n }\n\n get hasNonKindleNonReadFormat(){\n return this.nonKindleNonReadFormats.length > 0;\n }\n\n get kindleFormat() {\n return this.otherFormats.find((format) => format.id === 'ebook-kindle');\n }\n\n get showNonKindleButtonAboveDivider() {\n return this.showNonKindleDownloadButton\n && !this.hasKindleFormat\n && ((this.odreadFulfillmentFirst && !this.showODFormatButton) || (!this.odreadFulfillmentFirst && this.showODFormatButton)) \n && !this.showNoKindleMessage\n && !this.showOnlyOverDriveFormat;\n }\n\n get showNonKindleButtonBelowDivider(){\n return this.showNonKindleDownloadButton && !this.showNonKindleButtonAboveDivider && !this.showOnlyOverDriveFormat;\n }\n\n get showNonKindleDownloadButton() {\n return this.showNonKindleNonReadFormats\n && this.nonKindleNonReadFormats.length === 1;\n }\n\n get showDownloadDropdown() {\n return this.isEbook\n && this.showNonKindleNonReadFormats\n && this.nonKindleNonReadFormats.length > 1;\n }\n\n get showNonKindleNonReadFormats() {\n return (this.isEbook || (this.isAudiobook && this.odreadFulfillmentFirst)) && !this.isFormatLockedIn\n && this.nonKindleNonReadFormats\n && this.nonKindleNonReadFormats.length > 0\n && (!this.preferKindle || !this.limitDisplayFormats || !this.hasKindleFormat);\n }\n\n get showNoKindleMessage() {\n return !this.isFormatLockedIn && !this.hasKindleFormat && this.preferKindle && this.isEbook;\n }\n\n get nonKindleFormats() {\n return this.formats.filter((format) => format.id !== 'ebook-kindle' && format.id !== 'ebook-kobo');\n }\n\n get nonKindleNonReadFormats() {\n return this.hideDisabledFormats\n ? this.formats.filter((format) => format.id !== 'ebook-kindle'\n && format.id !== 'ebook-kobo'\n && format.id !== 'ebook-overdrive'\n && format.id !== 'audiobook-overdrive'\n && format.id !== 'video-streaming'\n && !(this.fixMagazineDisplay && format.id === 'magazine-overdrive')\n )\n : this.otherFormats.filter((format) => format.id !== 'ebook-kindle' && format.id !== 'ebook-kobo');\n }\n\n get tolinoSupportedDropdownFormats() {\n return this.nonKindleNonReadFormats.filter((format) => format.id !== 'audiobook-mp3');\n }\n\n get hasOverdriveFormat() {\n return !!(this.overDriveFormat && this.overDriveFormat.id != null);\n }\n\n get showOnlyOverDriveFormat() {\n return this.hideDisabledFormats && \n ((this.isFormatLockedIn && (!this.odreadFulfillmentFirst || !this.isLockedOnKindle) && this.nonKindleNonReadFormats.length === 0) ||\n ((this.isEbook && !this.hasKindleFormat && this.nonKindleFormats.length === 1 && this.nonKindleFormats[0].id === \"ebook-overdrive\")\n || (this.isAudiobook && this.formats.length === 1 && this.formats[0].id === \"audiobook-overdrive\")));\n }\n\n get showODFormatButton() {\n return this.hasOverdriveFormat && this.overdriveFormatAllowed && !this.videoIsRestricted &&\n (!this.hasKindleFormat || !this.preferKindle || this.overDriveFormat.hasAudioSynchronizedText);\n }\n\n get suppressAudiobookDownloadButton() {\n // This is somewhat odd. In the case where you're on a Mac but there is also a Listen format available, we render the mp3\n // download button server side so that the client-side code to replace it with a format warning will continue to work\n // This is obviously not very maintainable, but we have plans to completely replace this page with client-side\n // rendered backbone components, so I feel a kludge is justified under the circumstances.\n return this.isAudiobook && this.isMac && this.hasMp3Format && this.hasOverdriveFormat && this.overdriveFormatAllowed && this.macOsAudioDownloadsDisabled\n && (!this.macOSAudioDownloadReenabledPreCatalina || !this.isPreCatalinaMac);\n }\n\n get overdriveFormatAllowed(){\n // The OD Read format is generally suppressed in the app but there are a few exceptions\n if (this.otherFormats && this.otherFormats.length === 1 && this.isInODApp &&\n (this.otherFormats[0].id === 'ebook-pdf-adobe' || this.otherFormats[0].id === 'ebook-pdf-open' || this.otherFormats[0].id === 'ebook-kindle')) {\n return true;\n } else if (this.overDriveFormat && this.overDriveFormat.hasAudioSynchronizedText) {\n return true;\n } else {\n return !(this.isInODApp && this.otherFormats && this.otherFormats.length > 0) || (this.isInODApp && this.showOnlyOverDriveFormat);\n }\n }\n\n get firstButtonSlotOccupied() {\n return (this.isEbook && ((this.isFormatLockedIn && !this.showOnlyOverDriveFormat) \n || this.hasKindleFormat \n || this.showNoKindleMessage \n || (this.odreadFulfillmentFirst && !this.hasKindleFormat && this.showODFormatButton) \n || this.showNonKindleButtonAboveDivider))\n || (!this.isEbook && this.hasNonKindleNonReadFormat && !this.suppressAudiobookDownloadButton);\n }\n\n get secondButtonSlotOccupied() {\n return (this.showODFormatButton && !this.odreadFulfillmentFirst) \n || (this.odreadFulfillmentFirst && this.showODFormatButton && !this.showOnlyOverDriveFormat) \n || (this.showNonKindleNonReadFormats && !this.showNonKindleButtonAboveDivider);\n }\n\n get showDivider() {\n return (this.firstButtonSlotOccupied && this.secondButtonSlotOccupied) || (this.isAudiobook && !this.isInODApp && this.odAppSunset && this.showODFormatButton && this.hideDisabledFormats);\n }\n\n get useFirstPlayText() {\n return this.constraints && this.constraints.watchExpirationHours;\n }\n\n get videoIsRestricted() {\n return this.isVideo && this.restrictVideo; \n }\n\n get isPdfOnly() {\n let nonPdfFormats = this.formats.filter(format => !format.id.includes(\"pdf\") && !format.id.includes(\"kobo\"));\n return nonPdfFormats.length === 0;\n }\n}\n\nmodule.exports = LoanTitle;\n","class AppPromoManager {\n constructor() {\n this.APPLICATIONS = {\n LIBBY: 'libby',\n SORA: 'sora',\n KINDLE: 'kindle',\n KINDLEPREF: 'kindle-preference',\n };\n }\n\n /**\n * App Promotion Manager, check for Tolino Device Status\n * @param req - Express object representing the server request object\n * @param res - Express object representing the server response object\n */\n checkIfTolino(req) {\n let userAgent = req.headers['user-agent'];\n let tolinoCookieOverride = req.cookies['is-tolino-device'] == 1;\n let isTolinoPreviewWebsite =\n req.library &&\n req.library.websiteId &&\n req.intTolinoSites &&\n req.intTolinoSites.includes(String(req.library.websiteId));\n return (\n this.featureManager &&\n (this.featureManager.isEnabled('tolino') ||\n isTolinoPreviewWebsite) &&\n (tolinoCookieOverride ||\n /tolino/i.test(userAgent) ||\n /eReader/i.test(userAgent))\n );\n }\n\n /**\n * Create App Promotion Manager (Server)\n * @param req - Express object representing the server request object\n * @param res - Express object representing the server response object\n * @param featureManager - Express object representing the server side featureManager\n */\n static createServer(req, res, featureManager) {\n let instance = new this();\n instance.featureManager = featureManager;\n instance.settings = res.locals;\n instance.settings.isTolinoDevice = instance.checkIfTolino(req);\n return instance;\n }\n\n /**\n * Create App Promotion Manager (Client)\n * @param featureManager\n * @param window - client window object that we get needed information from\n * @private\n */\n static createClient(window) {\n let instance = new this();\n instance.featureManager = window.featureManager;\n instance.settings = window.OverDrive;\n return instance;\n }\n\n /**\n * Method for determining whether or not to show Application Promotions\n * @method\n * @param {string} application - application to check. Use Application property off FeatureManager\n * @returns {boolean}\n */\n isAppPromoEnabled(application) {\n switch (application) {\n case this.APPLICATIONS.LIBBY:\n return (\n !this.settings.isTolinoDevice &&\n this.featureManager.isEnabled('promoteLibby') &&\n this.settings.enabledPlatforms.includes('libby')\n );\n case this.APPLICATIONS.SORA:\n return (\n !this.settings.isTolinoDevice &&\n this.settings.enabledPlatforms.includes('sora')\n );\n case this.APPLICATIONS.KINDLE:\n return (\n this.settings.hasLinkedCards &&\n this.settings.isAuthenticated &&\n !this.settings.isTolinoDevice\n );\n case this.KINDLEPREF:\n return (\n !this.settings.isTolinoDevice &&\n this.featureManager.isEnabled('kindleLoanOffer')\n );\n }\n }\n}\n\nmodule.exports = AppPromoManager;\n","const numbers = require('./numbers');\n\nmodule.exports = {\n hideLibbyIntercept: {\n name: 'hideLibbyIntercept',\n durationMS: numbers.dayInMilliSeconds * 56,\n sliding: true,\n },\n hideLibbyInterceptLong: {\n name: 'hideLibbyInterceptLong',\n durationMS: numbers.yearInMilliseconds,\n sliding: true,\n },\n hideLoansPageLibbyPromo: {\n name: 'hideLoansPageLibbyPromo',\n durationMS: numbers.dayInMilliSeconds * 14,\n sliding: true,\n },\n odTrack: {\n name: 'od_track',\n durationMS: numbers.yearInMilliseconds * 10,\n sliding: true,\n domain: 'overdrive.com',\n httpOnly: false,\n },\n visitedFeatures: {\n name: 'visitedFeatures',\n durationMS: numbers.yearInMilliseconds * 10,\n sliding: true,\n },\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.FeatureManager = void 0;\nvar clone_ts_1 = require(\"./utility/clone-ts\");\n/**\n * Feature manager\n */\nvar FeatureManager = /** @class */ (function () {\n /**\n * Creates a new instance of the FeatureManager.\n * @param {FeatureMap} feats - A set of features and whether or not they are enabled and/or testable.\n * @param {LibraryFeatureMap} libraryConfigurations - A set of features enabled for a library.\n * @param {number} tenant - The tenant id.\n * @param {AllFeatures} allFeatures - The allFeatures secret cookie value. This should be '0' for off or '1' for on.\n * @param {array} dynamicConfigurationFunctions - A set of functions to reconfigure features for this manager.\n */\n function FeatureManager(feats, libraryConfigurations, tenant, allFeatures, dynamicConfigurationFunctions) {\n this.libraryConfigurations = libraryConfigurations;\n this.useTestable = this.shouldUseTestable(tenant, allFeatures);\n var features = (0, clone_ts_1.lightClone)(feats);\n dynamicConfigurationFunctions &&\n dynamicConfigurationFunctions.forEach(function (item) {\n features = item.configureDynamicFeature(features, libraryConfigurations, tenant, allFeatures);\n });\n this.features = features;\n }\n /**\n * Feature manager method for determining whether or not to show a feature.\n * This is the single source of truth for permissions.\n * @method\n * @param {FeatureName} feature - The feature in question\n * @returns {boolean}\n */\n FeatureManager.prototype.isEnabled = function (feature) {\n return !!(this.isOkForLibrary(feature) &&\n (this.useTestable\n ? this.isStrictlyTestable(feature)\n : this.isStrictlyEnabled(feature)));\n };\n /**\n * Feature manager method returning the strictly `enabled` value.\n * Note: due to dynamic configurations, this should not be assumed to be\n * the config/features.json `enabled` value, though that is the default.\n * @param {FeatureName} feature - The feature to lookup\n * @returns {boolean}\n */\n FeatureManager.prototype.isStrictlyEnabled = function (feature) {\n return this.features[feature] && this.features[feature].enabled;\n };\n /**\n * Feature manager method returning the strictly `testable` value.\n * Note: due to dynamic configurations, this should not be assumed to be\n * the config/features.json `enabled` value, though that is the default.\n * @param {FeatureName} feature - The feature to lookup\n * @returns {boolean}\n */\n FeatureManager.prototype.isStrictlyTestable = function (feature) {\n return this.features[feature] && this.features[feature].testable;\n };\n /**\n * Private method returning whether libraryConfigurations permits this feature.\n * @param {FeatureName} feature - The feature in question\n * @returns {boolean}\n */\n FeatureManager.prototype.isOkForLibrary = function (feature) {\n var libFeat = this.libraryConfigurations[feature];\n return !libFeat || libFeat.enabled || false;\n };\n /**\n * Private method returning whether to use the config/features.json\n * `enabled` or `testable` value.\n * @param {number} tenant - The tenant id\n * @param {string} allFeatures - The allFeatures secret cookie value\n * @returns {boolean}\n */\n FeatureManager.prototype.shouldUseTestable = function (tenant, allFeatures) {\n return (tenant === 100501 ||\n tenant === 100300 ||\n (tenant >= 800000 && tenant < 900000) ||\n allFeatures === '1');\n };\n return FeatureManager;\n}());\nexports.FeatureManager = FeatureManager;\n\n//# sourceMappingURL=featureManager-ts.js.map\n\n//# sourceMappingURL=featureManager-ts.js.map\n","const FeatureManager = require('./featureManager-ts.js').FeatureManager;\n\nmodule.exports = FeatureManager;\n","var _ = require('underscore');\nvar features = require('lightning-common/lib/configuration/features.json');\nvar reversePreviewSites = require('lightning-common/lib/configuration/reversePreviewSites.json');\nvar FeatureManager = require('./featureManager');\n\n/**\n * Function for getting configured features for reverse-preview\n * which is a dynamic feature from config/features.json.\n * @param {number} tenant - The tenant id\n * @param {string} allFeatures - The allFeatures secret cookie value\n */\nvar getFeaturesConfiguredForReversePreview = function(feats, libraryConfiguration, tenant) {\n var returnFeatures = _.extend({}, feats);\n var reversePreviewSite = reversePreviewSites && reversePreviewSites[tenant];\n var isReversePreviewEnabled = (reversePreviewSite && reversePreviewSite.url);\n\n returnFeatures['reverse-preview'] = {enabled: isReversePreviewEnabled, testable: isReversePreviewEnabled};\n return returnFeatures;\n};\n\nvar buildFeatureManager = function(libraryConfigurations, tenant, allFeatures, apiFeatures) {\n if (!!apiFeatures) {\n features = apiFeatures;\n }\n return new FeatureManager(features, libraryConfigurations, tenant, allFeatures, [\n {configureDynamicFeature: _.partial(getFeaturesConfiguredForReversePreview)}\n ]);\n};\n\nmodule.exports = buildFeatureManager;\n","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getTitleFulfillmentButtonLayout = exports.getApiFulfillmentButtonLayout = exports.getFulfillmentButtonLayout = void 0;\nvar meCountryCodes_json_1 = __importDefault(require(\"lightning-common/lib/configuration/meCountryCodes.json\"));\nvar getFormatForLayout = function (media) {\n if (media.isFormatLockedIn &&\n media.otherFormats &&\n media.otherFormats.length > 0) {\n return media.otherFormats[0].id;\n }\n else if (media.hasNonKindleNonReadFormat &&\n media.nonKindleNonReadFormats != undefined &&\n media.nonKindleNonReadFormats.length > 0) {\n return media.nonKindleNonReadFormats[0].id;\n }\n else if (media.formats != undefined && media.formats.length > 0) {\n return media.formats[0].id;\n }\n return undefined;\n};\nvar setMainButtonFormat = function (buttonLayout, media, featureManager) {\n if (featureManager.isEnabled('sunset-audiobook-rewrite')) {\n if (buttonLayout.mainButton == 'other' ||\n buttonLayout.mainButton == 'unsupported' ||\n buttonLayout.mainButton == 'download' ||\n buttonLayout.mainButton == 'audiobook' ||\n buttonLayout.showOtherButtonBelowDivider ||\n buttonLayout.subButton == 'audiobook') {\n buttonLayout.formatID = getFormatForLayout(media);\n }\n }\n else if (buttonLayout.mainButton == 'other' ||\n buttonLayout.mainButton == 'unsupported' ||\n buttonLayout.showOtherButtonBelowDivider ||\n buttonLayout.subButton == 'audiobook') {\n buttonLayout.formatID = getFormatForLayout(media);\n }\n return buttonLayout;\n};\nvar setAudiobookMainButtonLayout = function (currentLayout, showODFormatButton, isAudiobookAfterSunset) {\n if (showODFormatButton) {\n currentLayout.mainButton = 'odread';\n }\n else if (isAudiobookAfterSunset) {\n currentLayout.mainButton = 'audiobook';\n }\n else {\n currentLayout.mainButton = 'download';\n }\n return currentLayout;\n};\nvar setAudiobookSubButtonLayout = function (currentLayout, media, isAudiobookAfterSunset, showDivider) {\n if (isAudiobookAfterSunset && currentLayout.mainButton != 'audiobook') {\n return ['audiobook', true, false];\n }\n else if (media.isAudiobook &&\n media.isFormatLockedIn &&\n currentLayout.mainButton != 'audiobook' &&\n currentLayout.mainButton != 'download' &&\n media.hasMp3Format) {\n return [\n isAudiobookAfterSunset ? 'audiobook' : 'download',\n true,\n isAudiobookAfterSunset ? false : true,\n ];\n }\n else {\n return [undefined, showDivider, false];\n }\n};\nvar getCleanMacWarningDisplay = function (preCleanLayout, media, featureManager) {\n if (media.isAudiobook) {\n preCleanLayout.formatID = 'audiobook-mp3';\n }\n if (preCleanLayout.showMacOsAudiobookSuppressionStyle == 'warn' &&\n preCleanLayout.subButton == 'mp3Only') {\n preCleanLayout.mainButton = 'download';\n preCleanLayout.subButton = undefined;\n return setMainButtonFormat(preCleanLayout, media, featureManager);\n }\n else if (preCleanLayout.showMacOsAudiobookSuppressionStyle == undefined ||\n preCleanLayout.showMacOsAudiobookSuppressionStyle == 'warn') {\n return setMainButtonFormat(preCleanLayout, media, featureManager);\n }\n var mainButton;\n if (preCleanLayout.mainButton == 'odread' ||\n preCleanLayout.subButton == 'odread') {\n mainButton = 'odread';\n }\n else if (preCleanLayout.subButton == 'mp3Only' ||\n (media.hasMp3Format && !media.hasOverdriveFormat)) {\n mainButton = 'unsupported';\n }\n var newLayout = {\n mainButton: mainButton,\n mainDropdownListItems: [],\n showDivider: false,\n showDownloadDropdownBelowDivider: false,\n showMacOsAudiobookSuppressionStyle: preCleanLayout.showMacOsAudiobookSuppressionStyle,\n showNoKindleWarning: false,\n showOtherButtonBelowDivider: false,\n subButton: undefined,\n subDropdownListItems: undefined,\n suppressAudiobookButton: media.suppressAudiobookDownloadButton,\n };\n if (media.isAudiobook) {\n newLayout.formatID = 'audiobook-mp3';\n }\n return setMainButtonFormat(newLayout, media, featureManager);\n};\nvar getCleanNonDownloadFormats = function (media, layout, featureManager, enabledPlatforms) {\n if (featureManager.isEnabled('LHTNG-5681')) {\n // only retain download formats if no other platforms are enabled\n if ((enabledPlatforms === null || enabledPlatforms === void 0 ? void 0 : enabledPlatforms.includes('libby')) ||\n (enabledPlatforms === null || enabledPlatforms === void 0 ? void 0 : enabledPlatforms.includes('sora')) ||\n (enabledPlatforms === null || enabledPlatforms === void 0 ? void 0 : enabledPlatforms.includes('elrond'))) {\n if (media.isAudiobook && layout.mainButton === 'download') {\n layout.mainButton = 'unsupported';\n }\n if (layout.subButton === 'audiobook') {\n layout.subButton = undefined;\n }\n if (layout.showOtherButtonBelowDivider) {\n layout.showOtherButtonBelowDivider = false;\n layout.showPdfEpubDownloadMessage = true;\n }\n }\n }\n return layout;\n};\nvar getFulfillmentMainButtonLayout = function (featureManager, media, omc, isAudiobookAfterSunset) {\n var layout = {\n mainButton: undefined,\n mainDropdownListItems: [],\n showNoKindleWarning: false,\n };\n if (media.isFormatLockedIn) {\n if (media.otherFormats == null) {\n return layout;\n }\n if (media.hasKindleFormat && media.isLockedOnKindle) {\n layout.mainButton = 'kindle';\n }\n else if (featureManager.isEnabled('sunset-audiobook-rewrite') &&\n media.isAudiobook) {\n return setAudiobookMainButtonLayout(layout, media.showODFormatButton, isAudiobookAfterSunset);\n }\n else if (media.isAudiobook &&\n !omc &&\n featureManager.isEnabled('odapp-sunset')) {\n if (media.showODFormatButton) {\n layout.mainButton = 'odread';\n }\n }\n else if (!media.suppressAudiobookDownloadButton &&\n !media.showOnlyOverDriveFormat) {\n layout.mainButton = 'other';\n }\n return layout;\n }\n if (media.isEbook) {\n if (media.hasKindleFormat) {\n layout.mainButton = 'kindle';\n }\n else if (media.showNoKindleMessage) {\n layout.showNoKindleWarning = true;\n }\n else if (media.showODFormatButton &&\n featureManager.isEnabled('odread-fulfillment-first')) {\n layout.mainButton = 'odread';\n }\n else if (media.showNonKindleButtonAboveDivider) {\n layout.mainButton = 'other';\n }\n return layout;\n }\n if (featureManager.isEnabled('sunset-audiobook-rewrite') &&\n media.isAudiobook) {\n return setAudiobookMainButtonLayout(layout, media.showODFormatButton, isAudiobookAfterSunset);\n }\n else if (media.isAudiobook &&\n !omc &&\n featureManager.isEnabled('odapp-sunset')) {\n if (media.showODFormatButton) {\n layout.mainButton = 'odread';\n }\n return layout;\n }\n if (!media.isMagazine && !media.showOnlyOverDriveFormat) {\n if (media.showODFormatButton &&\n featureManager.isEnabled('odread-fulfillment-first')) {\n layout.mainButton = 'odread';\n }\n else if (!!media.otherFormats &&\n media.otherFormats.length === 1 &&\n media.hasNonKindleNonReadFormat &&\n !media.suppressAudiobookDownloadButton) {\n layout.mainButton = 'other';\n }\n else if (!!media.otherFormats && media.otherFormats.length > 1) {\n layout.mainButton = 'download';\n layout.mainDropdownListItems = media.nonKindleNonReadFormats || [];\n }\n }\n return layout;\n};\nvar getApiFulfillmentMainButtonLayout = function (featureManager, media, isAudiobookAfterSunset) {\n var layout = {\n mainButton: undefined,\n mainDropdownListItems: [],\n showNoKindleWarning: false,\n };\n if (media.isFormatLockedIn) {\n // curious why we're missing adobe check here that's in Title Fulfillment?\n if (media.otherFormats != null) {\n if (media.hasKindleFormat && media.isLockedOnKindle) {\n layout.mainButton = 'kindle';\n }\n else if (featureManager.isEnabled('sunset-audiobook-rewrite') &&\n media.isAudiobook) {\n return setAudiobookMainButtonLayout(layout, media.showODFormatButton, isAudiobookAfterSunset);\n }\n else if (media.isAudiobook) {\n if (media.showODFormatButton) {\n layout.mainButton = 'odread';\n }\n }\n else if (!media.suppressAudiobookDownloadButton &&\n !media.showOnlyOverDriveFormat) {\n layout.mainButton = 'download';\n layout.mainDropdownListItems = media.otherFormats || [];\n }\n }\n return layout;\n }\n if (media.isEbook) {\n if (media.hasKindleFormat) {\n layout.mainButton = 'kindle';\n }\n else if (media.showODFormatButton &&\n featureManager.isEnabled('odread-fulfillment-first')) {\n layout.mainButton = 'odread';\n }\n else if (media.showNonKindleButtonAboveDivider) {\n layout.mainButton = 'download';\n }\n return layout;\n }\n if (featureManager.isEnabled('sunset-audiobook-rewrite') &&\n media.isAudiobook) {\n return setAudiobookMainButtonLayout(layout, media.showODFormatButton, isAudiobookAfterSunset);\n }\n else if (media.isAudiobook && media.hasOverdriveFormat) {\n if (media.showODFormatButton) {\n layout.mainButton = 'odread';\n }\n return layout;\n }\n if (!(media.hasMp3Format && !media.hasOverdriveFormat) &&\n !media.isMagazine &&\n !media.showOnlyOverDriveFormat) {\n if (!!media.otherFormats &&\n media.otherFormats.length === 1 &&\n media.hasNonKindleNonReadFormat &&\n !media.suppressAudiobookDownloadButton) {\n layout.mainButton = 'download';\n }\n else if (!!media.otherFormats && media.otherFormats.length > 1) {\n layout.mainButton = 'download';\n layout.mainDropdownListItems = media.nonKindleNonReadFormats || [];\n }\n }\n return layout;\n};\nvar getTitleFulfillmentMainButtonLayout = function (featureManager, media, isIpad, isAudiobookAfterSunset, inApp, suppressAudiobookButton) {\n var layout = {\n mainButton: undefined,\n mainDropdownListItems: [],\n showMainDropdown: false,\n showNoKindleWarning: false,\n };\n //Format locked in should never happen for Title Fulfillment.\n if (media.isFormatLockedIn &&\n !featureManager.isEnabled('sunset-audiobook-rewrite')) {\n if (media.otherFormats &&\n media.otherFormats[0].id === 'ebook-epub-adobe') {\n layout.mainButton = 'kindle';\n }\n else if (isAudiobookAfterSunset) {\n if (media.showODFormatButton) {\n layout.mainButton = 'odread';\n }\n }\n else if (!featureManager.isEnabled('hide-disabled-formats') ||\n media.hasNonKindleNonReadFormat) {\n layout.mainButton = 'other';\n }\n return layout;\n }\n if (media.isEbook) {\n if (media.hasKindleFormat) {\n layout.mainButton = 'kindle';\n }\n else if (media.showNoKindleMessage) {\n layout.showNoKindleWarning = true;\n }\n else if (media.showODFormatButton &&\n featureManager.isEnabled('odread-fulfillment-first')) {\n layout.mainButton = 'odread';\n }\n else if (media.showNonKindleButtonAboveDivider) {\n layout.mainButton = 'download';\n }\n return layout;\n }\n if (media.isAudiobook) {\n if (isIpad && media.hasMp3Format) {\n // 😬\n if (!!media.otherFormats) {\n media.otherFormats.push({\n name: 'MP3 audiobook',\n id: 'audiobook-mp3',\n });\n }\n }\n if (featureManager.isEnabled('sunset-audiobook-rewrite')) {\n return setAudiobookMainButtonLayout(layout, media.showODFormatButton, isAudiobookAfterSunset);\n }\n else if (isAudiobookAfterSunset) {\n if (media.showODFormatButton) {\n layout.mainButton = 'odread';\n }\n }\n else if (media.showODFormatButton &&\n featureManager.isEnabled('odread-fulfillment-first')) {\n layout.mainButton = 'odread';\n }\n else if (!media.showOnlyOverDriveFormat) {\n layout.mainButton = 'download';\n }\n return layout;\n }\n if (!media.isMagazine) {\n if (!!media.otherFormats &&\n (media.otherFormats.length === 1 ||\n (media.otherFormats.length === 1 && inApp)) &&\n !suppressAudiobookButton) {\n layout.mainButton = 'download';\n }\n else if (!!media.otherFormats && media.otherFormats.length > 1) {\n layout.showMainDropdown = true;\n layout.mainDropdownListItems = media.nonKindleNonReadFormats || [];\n }\n }\n return layout;\n};\nvar isTolinoUnsupportedButtonType = function (button) {\n return (button === 'audiobook' || button === 'kindle' || button === 'mp3Only');\n};\nvar isUnsupportedTolinoFormat = function (format) {\n if (format === undefined)\n return true;\n var formatParts = format.split('-');\n return format.indexOf('ebook') > -1 && formatParts.length >= 2\n ? ['kobo', 'media', 'kindle'].includes(formatParts[1])\n : true;\n};\nvar modifyButtonsForTolino = function (media, featureManager, currentLayout) {\n if (currentLayout.showMainDropdown) {\n currentLayout.mainDropdownListItems =\n media.tolinoSupportedDropdownFormats || [];\n currentLayout.showMainDropdown =\n currentLayout.mainDropdownListItems.length > 0;\n }\n if (currentLayout.showDownloadDropdownBelowDivider) {\n currentLayout.subDropdownListItems =\n media.tolinoSupportedDropdownFormats || [];\n currentLayout.showDownloadDropdownBelowDivider =\n currentLayout.subDropdownListItems.length > 0;\n }\n currentLayout.showOtherButtonBelowDivider =\n currentLayout.showOtherButtonBelowDivider\n ? !isUnsupportedTolinoFormat(getFormatForLayout(media))\n : false;\n if (isTolinoUnsupportedButtonType(currentLayout.mainButton) ||\n currentLayout.mainButton === undefined ||\n (currentLayout.mainButton === 'odread' && media.isAudiobook) ||\n ((currentLayout.mainButton === 'other' ||\n currentLayout.mainButton === 'download') &&\n isUnsupportedTolinoFormat(getFormatForLayout(media)))) {\n if (currentLayout.subButton === 'odread') {\n currentLayout.mainButton = 'odread';\n currentLayout.subButton = undefined;\n }\n else if (currentLayout.showOtherButtonBelowDivider) {\n currentLayout.mainButton == 'download';\n currentLayout.subButton = undefined;\n currentLayout.showOtherButtonBelowDivider = false;\n }\n else if (currentLayout.showDownloadDropdownBelowDivider) {\n currentLayout.mainButton = currentLayout.subButton = undefined;\n currentLayout.showDivider = false;\n }\n else {\n currentLayout.mainButton = 'unsupported';\n }\n }\n else if (currentLayout.subButton != undefined &&\n isTolinoUnsupportedButtonType(currentLayout.subButton)) {\n currentLayout.subButton = undefined;\n }\n currentLayout.showDivider =\n currentLayout.showOtherButtonBelowDivider ||\n currentLayout.showDownloadDropdownBelowDivider;\n return currentLayout;\n};\n/**\n * Generates the layout of the fulfillment buttons for the given media.\n * @param {FeatureManager} featureManager Feature manager\n * @param {Media} media Book metadata\n * @param {*} options Includes additional context information for the media title\n * @returns A map of what fulfillment buttons to display to the user\n */\nvar getFulfillmentButtonLayout = function (featureManager, media, options) {\n var _a;\n var isAudiobookAfterSunset = !options.omc &&\n media.isAudiobook &&\n (featureManager.isEnabled('disableOdAppAccess') ||\n featureManager.isEnabled('promoteLibby'));\n var mainButtonLayout = getFulfillmentMainButtonLayout(featureManager, media, options.omc, isAudiobookAfterSunset);\n var subButton;\n var showDivider = media.showDivider;\n var showOtherButtonBelowDivider = false;\n if (featureManager.isEnabled('sunset-audiobook-rewrite')) {\n if (media.showODFormatButton &&\n mainButtonLayout.mainButton != 'odread') {\n subButton = 'odread';\n }\n else if (media.isAudiobook) {\n _a = setAudiobookSubButtonLayout(mainButtonLayout, media, isAudiobookAfterSunset, showDivider), subButton = _a[0], showDivider = _a[1], showOtherButtonBelowDivider = _a[2];\n }\n }\n else {\n if (media.isAudiobook &&\n !options.omc &&\n featureManager.isEnabled('odapp-sunset')) {\n subButton = 'audiobook';\n }\n else if (media.showODFormatButton &&\n mainButtonLayout.mainButton != 'odread') {\n subButton = 'odread';\n }\n }\n var showDownloadDropdownBelowDivider = false;\n var subDropdownListItems = [];\n if (media.showNonKindleButtonBelowDivider && subButton != 'audiobook') {\n showOtherButtonBelowDivider = true;\n }\n else if (media.showDownloadDropdown) {\n showDownloadDropdownBelowDivider = true;\n subDropdownListItems = media.nonKindleNonReadFormats || [];\n }\n if (options.isTolinoDevice) {\n var newLayout = modifyButtonsForTolino(media, featureManager, {\n mainButton: mainButtonLayout.mainButton,\n showMainDropdown: mainButtonLayout.showMainDropdown,\n mainDropdownListItems: mainButtonLayout.mainDropdownListItems,\n showDivider: showDivider,\n showDownloadDropdownBelowDivider: showDownloadDropdownBelowDivider,\n showOtherButtonBelowDivider: showOtherButtonBelowDivider,\n subButton: subButton,\n subDropdownListItems: subDropdownListItems,\n });\n mainButtonLayout.mainButton = newLayout.mainButton;\n subButton = newLayout.subButton;\n showDivider = newLayout.showDivider;\n showDownloadDropdownBelowDivider =\n newLayout.showDownloadDropdownBelowDivider;\n subDropdownListItems = newLayout.subDropdownListItems || [];\n showOtherButtonBelowDivider = newLayout.showOtherButtonBelowDivider;\n mainButtonLayout.mainDropdownListItems =\n newLayout.mainDropdownListItems || [];\n mainButtonLayout.showMainDropdown = newLayout.showMainDropdown;\n }\n var showMacOsAudiobookSuppressionStyle;\n if (media.isMac &&\n media.isAudiobook &&\n featureManager.isEnabled('macOSAudiobookMessaging') &&\n !options.inApp) {\n showMacOsAudiobookSuppressionStyle = !media.isPreCatalinaMac\n ? 'suppress'\n : 'warn';\n }\n var macCleanLayout = getCleanMacWarningDisplay({\n mainButton: mainButtonLayout.mainButton,\n mainDropdownListItems: mainButtonLayout.mainDropdownListItems,\n showDivider: showDivider,\n showDownloadDropdownBelowDivider: showDownloadDropdownBelowDivider,\n showMacOsAudiobookSuppressionStyle: showMacOsAudiobookSuppressionStyle,\n showNoKindleWarning: mainButtonLayout.showNoKindleWarning,\n showOtherButtonBelowDivider: showOtherButtonBelowDivider,\n subButton: subButton,\n subDropdownListItems: subDropdownListItems,\n suppressAudiobookButton: showMacOsAudiobookSuppressionStyle !== undefined,\n }, media, featureManager);\n if (media.isAudiobook &&\n macCleanLayout.mainButton === 'odread' &&\n macCleanLayout.subButton === 'audiobook' &&\n media.hasNonKindleNonReadFormat &&\n !featureManager.isEnabled('promoteLibby')) {\n macCleanLayout.showDivider = false;\n macCleanLayout.showOtherButtonBelowDivider = false;\n }\n var audiobookAndNotInApp = media.isAudiobook &&\n featureManager.isEnabled('mp3-in-app-only') &&\n !options.inApp;\n var showMp3DesktopMessage = featureManager.isEnabled('disableOdAppAccess') &&\n featureManager.isEnabled('show-od-desktop-message');\n if (audiobookAndNotInApp &&\n (showMp3DesktopMessage || macCleanLayout.subButton === undefined)) {\n macCleanLayout.showDivider = false;\n macCleanLayout.showOtherButtonBelowDivider = false;\n }\n if (media.isAudiobook &&\n macCleanLayout.subButton === undefined &&\n !options.inApp) {\n macCleanLayout.showOtherButtonBelowDivider = false;\n }\n macCleanLayout.suppressAudiobookButton =\n media.suppressAudiobookDownloadButton;\n return macCleanLayout;\n};\nexports.getFulfillmentButtonLayout = getFulfillmentButtonLayout;\nvar getApiFulfillmentButtonLayout = function (featureManager, media, options) {\n var _a;\n var isAudiobookAfterSunset = !options.inApp &&\n media.isAudiobook &&\n (featureManager.isEnabled('disableOdAppAccess') ||\n featureManager.isEnabled('promoteLibby'));\n var mainButtonLayout = getApiFulfillmentMainButtonLayout(featureManager, media, isAudiobookAfterSunset);\n var subButton;\n var showDivider = media.showDivider;\n var showOtherButtonBelowDivider = false;\n if (featureManager.isEnabled('sunset-audiobook-rewrite')) {\n if (media.showODFormatButton &&\n mainButtonLayout.mainButton != 'odread') {\n subButton = 'odread';\n }\n else if (mainButtonLayout.mainButton == 'audiobook' &&\n options.appName !== 'OverDrive' &&\n !options.inApp) {\n mainButtonLayout.mainButton = undefined;\n subButton = 'mp3Only';\n }\n else if (media.isAudiobook) {\n _a = setAudiobookSubButtonLayout(mainButtonLayout, media, isAudiobookAfterSunset, showDivider), subButton = _a[0], showDivider = _a[1], showOtherButtonBelowDivider = _a[2];\n }\n }\n else {\n if (media.isAudiobook) {\n if (options.countryCode &&\n (meCountryCodes_json_1.default.codes.indexOf(options.countryCode) > -1 ||\n options.countryCode === 'CN')) {\n subButton = 'download';\n }\n else {\n if (media.hasMp3Format &&\n !media.hasOverdriveFormat &&\n options.appName !== 'OverDrive') {\n subButton = 'mp3Only';\n }\n else if (options.appName !== 'OverDrive' &&\n options.appName !== 'Sora') {\n subButton = 'audiobook';\n }\n else if (options.appName !== 'Sora') {\n subButton = 'download';\n }\n }\n }\n else if (media.showODFormatButton &&\n mainButtonLayout.mainButton != 'odread') {\n subButton = 'odread';\n }\n }\n var showMacOsAudiobookSuppressionStyle;\n if (media.isMac &&\n media.isAudiobook &&\n featureManager.isEnabled('macOSAudiobookMessaging') &&\n !options.inApp) {\n showMacOsAudiobookSuppressionStyle = !media.isPreCatalinaMac\n ? 'suppress'\n : 'warn';\n }\n var showDownloadDropdownBelowDivider = false;\n var subDropdownListItems = [];\n if (media.showNonKindleButtonBelowDivider && subButton != 'audiobook') {\n showOtherButtonBelowDivider = true;\n }\n else if (media.showDownloadDropdown) {\n showDownloadDropdownBelowDivider = true;\n subDropdownListItems = media.nonKindleNonReadFormats || [];\n }\n if (options.isTolinoDevice) {\n var newLayout = modifyButtonsForTolino(media, featureManager, {\n mainButton: mainButtonLayout.mainButton,\n showMainDropdown: mainButtonLayout.showMainDropdown,\n mainDropdownListItems: mainButtonLayout.mainDropdownListItems,\n showDivider: showDivider,\n showDownloadDropdownBelowDivider: showDownloadDropdownBelowDivider,\n showOtherButtonBelowDivider: showOtherButtonBelowDivider,\n subButton: subButton,\n subDropdownListItems: subDropdownListItems,\n });\n mainButtonLayout.mainButton = newLayout.mainButton;\n subButton = newLayout.subButton;\n showDivider = newLayout.showDivider;\n showDownloadDropdownBelowDivider =\n newLayout.showDownloadDropdownBelowDivider;\n subDropdownListItems = newLayout.subDropdownListItems || [];\n showOtherButtonBelowDivider = newLayout.showOtherButtonBelowDivider;\n mainButtonLayout.mainDropdownListItems =\n newLayout.mainDropdownListItems || [];\n mainButtonLayout.showMainDropdown = newLayout.showMainDropdown;\n }\n var macCleanLayout = getCleanMacWarningDisplay({\n mainButton: mainButtonLayout.mainButton,\n mainDropdownListItems: mainButtonLayout.mainDropdownListItems,\n showDivider: showDivider,\n showDownloadDropdownBelowDivider: showDownloadDropdownBelowDivider,\n showMacOsAudiobookSuppressionStyle: showMacOsAudiobookSuppressionStyle,\n showNoKindleWarning: mainButtonLayout.showNoKindleWarning,\n showOtherButtonBelowDivider: showOtherButtonBelowDivider,\n subButton: subButton,\n subDropdownListItems: subDropdownListItems,\n suppressAudiobookButton: showMacOsAudiobookSuppressionStyle !== undefined,\n }, media, featureManager);\n var downloadCleanLayout = getCleanNonDownloadFormats(media, macCleanLayout, featureManager, options.enabledPlatforms);\n return downloadCleanLayout;\n};\nexports.getApiFulfillmentButtonLayout = getApiFulfillmentButtonLayout;\nvar getTitleFulfillmentButtonLayout = function (featureManager, media, options) {\n var _a;\n var _b;\n var isIpad = featureManager.isEnabled('stop-treating-ipad-like-mac') &&\n options.isIpadUserAgent;\n var ipadWithRestrictedMp3Format = isIpad &&\n !!media.restrictedFormats &&\n media.restrictedFormats.length === 1 &&\n media.restrictedFormats[0].id === 'audiobook-mp3';\n var ipadWithMP3Format = isIpad && media.hasMp3Format;\n var isAudiobookAfterSunset = !options.inApp &&\n media.isAudiobook &&\n (featureManager.isEnabled('disableOdAppAccess') ||\n featureManager.isEnabled('promoteLibby'));\n var mainButtonLayout = getTitleFulfillmentMainButtonLayout(featureManager, media, isIpad, isAudiobookAfterSunset, options.inApp, options.suppressAudiobookButton);\n var showDivider = !options.suppressAudiobookButton &&\n media.showDivider &&\n !options.kindleOnly;\n var subButton;\n var showOtherButtonBelowDivider = false;\n if (featureManager.isEnabled('sunset-audiobook-rewrite')) {\n if (media.showODFormatButton &&\n !options.kindleOnly &&\n !ipadWithMP3Format &&\n !isAudiobookAfterSunset &&\n mainButtonLayout.mainButton != 'odread') {\n subButton = 'odread';\n }\n else if (media.isAudiobook) {\n _a = setAudiobookSubButtonLayout(mainButtonLayout, media, isAudiobookAfterSunset, showDivider), subButton = _a[0], showDivider = _a[1], showOtherButtonBelowDivider = _a[2];\n }\n }\n else {\n if (media.showODFormatButton &&\n !options.kindleOnly &&\n !ipadWithMP3Format &&\n !isAudiobookAfterSunset &&\n mainButtonLayout.mainButton != 'odread') {\n subButton = 'odread';\n }\n else if (isAudiobookAfterSunset) {\n subButton = 'audiobook';\n }\n }\n if (media.showNonKindleButtonBelowDivider && subButton != 'audiobook') {\n showOtherButtonBelowDivider = true;\n }\n var showDownloadDropdownBelowDivider = !media.showNonKindleButtonBelowDivider && media.showDownloadDropdown;\n if (options.isTolinoDevice) {\n var newLayout = modifyButtonsForTolino(media, featureManager, {\n mainButton: mainButtonLayout.mainButton,\n showMainDropdown: mainButtonLayout.showMainDropdown,\n mainDropdownListItems: mainButtonLayout.mainDropdownListItems,\n showDivider: showDivider,\n showDownloadDropdownBelowDivider: showDownloadDropdownBelowDivider,\n showOtherButtonBelowDivider: showOtherButtonBelowDivider,\n subButton: subButton,\n });\n mainButtonLayout.mainButton = newLayout.mainButton;\n subButton = newLayout.subButton;\n showDivider = newLayout.showDivider;\n showDownloadDropdownBelowDivider =\n newLayout.showDownloadDropdownBelowDivider;\n showOtherButtonBelowDivider = newLayout.showOtherButtonBelowDivider;\n mainButtonLayout.mainDropdownListItems =\n newLayout.mainDropdownListItems || [];\n mainButtonLayout.showMainDropdown = newLayout.showMainDropdown;\n }\n var showRestrictedVideoWarning = media.videoIsRestricted;\n var showRestrictedFormatWarning = !ipadWithRestrictedMp3Format &&\n !!media.restrictedFormats &&\n media.restrictedFormats.length > 0 &&\n !media.hasNonKindleNonReadFormat &&\n !media.preferKindle;\n var showMacOsAudiobookSuppressionStyle;\n if (media.isMac &&\n media.isAudiobook &&\n featureManager.isEnabled('macOSAudiobookMessaging') &&\n !options.inApp) {\n showMacOsAudiobookSuppressionStyle = !media.isPreCatalinaMac\n ? 'suppress'\n : 'warn';\n }\n var layout = __assign(__assign({}, getCleanMacWarningDisplay({\n mainButton: mainButtonLayout.mainButton,\n mainDropdownListItems: mainButtonLayout.mainDropdownListItems,\n showDivider: showDivider,\n subButton: subButton,\n showMacOsAudiobookSuppressionStyle: showMacOsAudiobookSuppressionStyle,\n showDownloadDropdownBelowDivider: showDownloadDropdownBelowDivider,\n showNoKindleWarning: mainButtonLayout.showNoKindleWarning,\n showOtherButtonBelowDivider: showOtherButtonBelowDivider,\n }, media, featureManager)), { showMainDropdown: showMacOsAudiobookSuppressionStyle == 'suppress'\n ? false\n : (_b = mainButtonLayout.showMainDropdown) !== null && _b !== void 0 ? _b : false, showRestrictedVideoWarning: showMacOsAudiobookSuppressionStyle == 'suppress'\n ? false\n : showRestrictedVideoWarning, showRestrictedFormatWarning: showMacOsAudiobookSuppressionStyle == 'suppress'\n ? false\n : showRestrictedFormatWarning });\n var audiobookAndNotInApp = media.isAudiobook &&\n featureManager.isEnabled('mp3-in-app-only') &&\n !options.inApp &&\n media.hasNonKindleNonReadFormat;\n var mainButtonIsAudiobook = layout.mainButton === 'odread' && layout.subButton === 'audiobook';\n if (audiobookAndNotInApp &&\n (mainButtonIsAudiobook || layout.subButton === undefined)) {\n layout.showOtherButtonBelowDivider = false;\n layout.showDivider = false;\n }\n if (media.isAudiobook && layout.subButton === undefined && !options.inApp) {\n layout.showOtherButtonBelowDivider = false;\n }\n return layout;\n};\nexports.getTitleFulfillmentButtonLayout = getTitleFulfillmentButtonLayout;\n\n//# sourceMappingURL=fulfillment-ts.js.map\n\n//# sourceMappingURL=fulfillment-ts.js.map\n","\"use strict\";\nvar __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n}));\nvar __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n});\nvar __importStar = (this && this.__importStar) || function (mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.getOptimizedCovers = void 0;\nvar _ = __importStar(require(\"underscore\"));\nfunction getOptimizedCovers(covers, desiredSize) {\n // coversBySize is now an array of covers, from smallest to largest\n var coversBySize = _.sortBy(covers, 'width');\n // Start with the biggest cover\n // Copy object with Object.assign() so we dont damage reference\n var optimizedCover = Object.assign({}, _.last(coversBySize));\n if (optimizedCover && optimizedCover.href) {\n var legacyToOptimizedImageHostsMap = {\n 'https://img1.od-cdn.com/': 'https://ic.od-cdn.com/resize',\n 'https://images.overdrivechina.cn/': 'https://images.overdrivechina.cn/resize'\n };\n var hostMapKey = _.find(Object.keys(legacyToOptimizedImageHostsMap), function (legacy) { return optimizedCover.href.startsWith(legacy); });\n if (hostMapKey) {\n // look up the corresponding optimized root, e.g. https://img1.od-cdn.com/ -> https://ic.od-cdn.com/resize\n var optimizedImageHost = legacyToOptimizedImageHostsMap[hostMapKey];\n var optimizations = 'type=auto'; // format = auto -> use webp if the device supports it\n var path = '';\n if (typeof document === 'undefined') {\n // node.js usage should be fine with the URL api\n var url = new URL(optimizedCover.href);\n path = url.pathname;\n }\n else {\n // hack to get url pathname since IE doesn't support the URL api. I didn't want to add a polyfill\n var a = document.createElement('a');\n a.href = optimizedCover.href;\n path = a.pathname;\n if (!path.startsWith('/')) { // browsers are inconsistent about whether the pathname includes a leading slash, but the cachefly api requires exactly one on the url param\n path = \"/\".concat(path);\n }\n }\n var encodedSrcUrl = encodeURIComponent(path);\n var coverHrefWithoutSize = \"\".concat(optimizedImageHost, \"?\").concat(optimizations, \"&url=\").concat(encodedSrcUrl, \"&stripmeta=true\");\n optimizedCover.href = \"\".concat(coverHrefWithoutSize, \"&width=\").concat(desiredSize);\n optimizedCover.srcset = \"\".concat(coverHrefWithoutSize, \"&width=\").concat(Math.floor(desiredSize * 2), \" 2x, \") +\n \"\".concat(coverHrefWithoutSize, \"&width=\").concat(Math.floor(desiredSize * 1.5), \" 1.5x, \") +\n \"\".concat(coverHrefWithoutSize, \"&width=\").concat(desiredSize, \" 1x\");\n return optimizedCover;\n }\n }\n return _.find(coversBySize, function (cover) { return cover.width >= desiredSize; }) ||\n _.last(coversBySize); // finds the first cover that is big enough\n}\nexports.getOptimizedCovers = getOptimizedCovers;\n\n//# sourceMappingURL=getOptimizedCover-ts.js.map\n\n//# sourceMappingURL=getOptimizedCover-ts.js.map\n","\n/* eslint-env browser */\n\nvar Translater = require('../translater');\nvar utility = require('../utility');\n\nvar _logger = function(level, message, args) {\n try {\n var error = level && level.toLowerCase() === 'error';\n\n if (error && window.NREUM) {\n var errorMessage = message + ' ' + window.JSON.stringify(args);\n window.NREUM.noticeError(errorMessage);\n }\n\n if (window && window.console) {\n if (error && window.console.error) {\n window.console.error(message, args);\n } else {\n window.console.log(message, args);\n }\n }\n } catch (e) {\n // ¯\\_(ツ)_/¯\n }\n};\n\nvar _getLocale = function() {\n if (window.OverDrive && window.OverDrive._locale) {\n return window.OverDrive._locale;\n } else {\n return 'en';\n }\n};\n\nvar _translaterSingleton = new Translater(window.OverDrive.translations, _logger, window.OverDrive.tenant);\n\nvar _text = function(expectHtml, key, args) {\n var locale = _getLocale();\n var options = utility.getTranslationOptions(locale, expectHtml);\n\n return _translaterSingleton.translate(key, locale, args, options);\n};\n\n/**\n * @param {string} key - The key to find the translation\n * @param {object} args - The arguments to use for the template\n */\nvar html = _text.bind(null, true);\n\n/**\n * @param {string} key - The key to find the translation\n * @param {object} args - The arguments to use for the template\n */\nvar text = _text.bind(null, false);\n\nmodule.exports = {\n html,\n text\n};\n","\nvar MessageFormat = require('messageformat');\n\nvar compileTemplate = function(template, locale) {\n locale = locale || 'en';\n\n return new MessageFormat(locale).setIntlSupport(true).compile(template);\n};\n\nmodule.exports = {\n compileTemplate\n};\n","\nvar messageformat = require('./messageformat');\nvar utility = require('./utility');\n\n/**\n * @param {Translations} translations - The translations configuration object\n * @param {Logger} logger - An optional object-logger\n */\nfunction Translater(translations, logger, websiteId=0) {\n // template text -> locale -> templateFunction\n // NOTE: We map using the template text to reduce cache key uniqueness errors\n // NOTE: We include the locale in the cache as the same text can be used for multiple locales;\n // for example the following would cache the first locale to use it: {x, number}.\n this._compiledTemplates = {};\n\n // key (-> subkey)* -> (english template | locale -> template)\n this._translations = translations;\n\n // (level: string, message: string, args: string -> object): void\n this._logger = logger;\n\n this.websiteId = websiteId;\n}\n\nTranslater.prototype.translate = function(key, locale, args, options, requestUrl) {\n locale = locale || 'en';\n args = args || {};\n options = options || {};\n\n // Sould never be valid, but also guard against later code trying keys\n // that append strings onto nothing, which could be false positives.\n if (!key) {\n var keyDescription = key === '' ? '(empty string)' : key === null ? '(null)' : '(undefined)';\n this._log('error', 'Expected a non-empty key', {keyDescription, requestUrl});\n\n return null;\n }\n\n var result = null;\n\n try {\n result = this._translate(key, locale, args, options, requestUrl);\n } catch (e) {\n // already logged; just gotta give them nothing for now\n }\n\n if (result) {\n // result should already be formatted\n return result;\n } else {\n // still gotta format nothing for all the logic to work out\n return utility.formatLocalizedText(key, result, options);\n }\n};\n\nTranslater.prototype._translate = function(requestKey, locale, args, options, requestUrl) {\n var keysToTry = this._getKeysToTry(requestKey);\n\n for (var key of keysToTry) {\n var translation = this._tryGetTranslation(key);\n\n if (translation != null) {\n var templateFunction = this._compileTemplate(key, locale, translation, requestUrl);\n\n if (templateFunction != null) {\n var translated = templateFunction(args);\n var result = utility.formatLocalizedText(key, translated, options);\n\n return result;\n }\n }\n }\n\n // no keys could produce a result\n this._log('error', 'Could not find a translation for any of the following keys', {websiteId: this.websiteId, keysToTry, key: requestKey, locale, args, requestUrl});\n\n return null;\n};\n\nTranslater.prototype._compileTemplate = function(key, rawLocale, translation, requestUrl) {\n var localesToTry = this._getLocalesToTry(rawLocale);\n\n for (var locale of localesToTry) {\n var template = translation[locale];\n\n if (template != null) {\n if (this._compiledTemplates[template] == null) {\n this._compiledTemplates[template] = {};\n }\n\n if (this._compiledTemplates[template][locale] == null) {\n this._compiledTemplates[template][locale] = messageformat.compileTemplate(template, locale);\n }\n\n return this._compiledTemplates[template][locale];\n }\n }\n \n this._log('error', 'Found a translation but no template for any of the following locales', {translation, localesToTry, rawLocale, key, requestUrl});\n\n return null;\n};\n\nTranslater.prototype._tryGetTranslation = function(key) {\n var parts = key.split('.');\n var cursor = this._translations;\n for (var part of parts) {\n cursor = cursor[part];\n\n if (cursor == null) {\n return null;\n }\n }\n\n var translation = cursor;\n\n // If the translation mapping is just a string, treat it as a mapping\n // of english to that string.\n if (typeof translation === 'string') {\n translation = {en: translation};\n }\n\n return translation;\n};\n\nTranslater.prototype._getLocalesToTry = function(locale) {\n if (locale && locale !== 'en') {\n var dashIndex = locale.indexOf('-');\n\n if (dashIndex === -1) {\n return [locale, 'en'];\n } else {\n var language = locale.substr(0, dashIndex);\n\n if (language.toLowerCase() === 'en') {\n return [locale, 'en'];\n } else {\n return [locale, language, 'en'];\n }\n }\n } else {\n return ['en'];\n }\n};\n\nTranslater.prototype._getKeysToTry = function(key) {\n return [key + 'Html', key];\n};\n\nTranslater.prototype._log = function(level, message, args) {\n if (this._logger) {\n this._logger(level, message, args);\n }\n};\n\nmodule.exports = Translater;\n","var escapeHtml = require('escape-html');\nvar _ = require('underscore');\nvar locale = require('locale');\nconst AppPromoManager = require('../appPromoManager');\n\nvar allLocales =\n require('lightning-common/lib/configuration/supportedLanguages.json').supportedLanguages;\n\nvar _htmlEscape = function (text, shouldEscapeHtml) {\n if (shouldEscapeHtml && text) {\n return escapeHtml(text);\n } else {\n return text;\n }\n};\n\nvar _wrap = function (text, shouldWrap) {\n if (shouldWrap) {\n if (text == null) {\n return 'X (MISSING TEMPLATE) X';\n } else {\n return '✓ ' + text + ' ✓';\n }\n } else {\n return text;\n }\n};\n\nvar _isHtmlTranslation = function (key) {\n return key && key.toLowerCase().endsWith('html');\n};\n\nvar formatLocalizedText = function (key, text, options) {\n options = options || {};\n\n var shouldEscapeHtml = options.expectHtml && !_isHtmlTranslation(key);\n var shouldWrap = !!options.wrap;\n\n var possiblyHtmlEscaped = _htmlEscape(text, shouldEscapeHtml);\n var possiblyWrapped = _wrap(possiblyHtmlEscaped, shouldWrap);\n\n return possiblyWrapped || '';\n};\n\nvar getLanguageHeaderLocale = function (req, libraryPrimaryLocale) {\n // Get all supported languages\n var supportedLanguages = new locale.Locales(\n _.flatten(_.pluck(allLocales, 'defaultLanguageCode')),\n libraryPrimaryLocale\n );\n const acceptLanguageHeader = req.headers['accept-language'];\n var locales = new locale.Locales(acceptLanguageHeader);\n var bestLanguage = locales.best(supportedLanguages).toString();\n\n if (bestLanguage === 'zh-Hans') {\n // LHTNG-4198 zh-Hans is returned as best even when zh-Hant is preferred & the library doesn't support zh-Hans\n var zhHantPreferred =\n locales.length > 0 &&\n (locales[0].code == 'zh-TW' ||\n locales[0].code == 'zh-HK' ||\n locales[0].code == 'zh-MO' ||\n locales[0].code == 'zh-Hant');\n\n if (zhHantPreferred && req.library && req.library.supportedLanguages) {\n var zhHansExists = false;\n\n req.library.supportedLanguages.forEach((language) => {\n if (language.defaultLanguageCode == 'zh-Hans') {\n zhHansExists = true;\n }\n });\n\n if (!zhHansExists) {\n return 'zh-Hant';\n }\n }\n\n if (\n acceptLanguageHeader &&\n acceptLanguageHeader.toLowerCase().includes('zh') &&\n (libraryPrimaryLocale === 'zh-Hans' ||\n libraryPrimaryLocale === 'zh-Hant')\n ) {\n bestLanguage = libraryPrimaryLocale;\n }\n }\n\n return bestLanguage;\n};\n\nconst parseUserAgentSystemInformation = function (userAgent) {\n const firstOpenParen = userAgent.indexOf('(');\n const firstCloseParen = userAgent.indexOf(')');\n if (firstOpenParen === -1 || firstCloseParen === -1) {\n return [];\n }\n const systemInfo = userAgent.substring(\n firstOpenParen + 1,\n firstCloseParen - 1\n );\n return systemInfo.split(';').map((info) => info.trim());\n};\n\nconst getTolinoLocale = function (req) {\n // Tolino devices don't send over the correct accept-language header, but we can pull this value off of the system information.\n // The system information contains the language code followed by a hypen (e.g.: `de-`, `en-`, `es-`, etc)\n const userAgent = req.headers['user-agent'];\n const systemInfo = parseUserAgentSystemInformation(userAgent);\n const lang = systemInfo\n .filter((l) => l.endsWith('-'))\n .map((l) => l.substr(0, l.length - 1))[0];\n return lang || 'en';\n};\n\nvar getLocale = function (req, res, libraryPrimaryLocale) {\n const appPromoManager = AppPromoManager.createServer(\n req,\n res,\n req.featureManager\n );\n\n if (req.query && req.query._locale) {\n return req.query._locale;\n } else if (\n req.profile &&\n req.profile.settings &&\n req.profile.settings['language-selection']\n ) {\n return req.profile.settings['language-selection'];\n } else if (req.cookies && req.cookies['language-selection']) {\n return req.cookies['language-selection'];\n } else if (appPromoManager.settings.isTolinoDevice) {\n return getTolinoLocale(req);\n } else if (req.headers['accept-language']) {\n return getLanguageHeaderLocale(req, libraryPrimaryLocale);\n } else if (libraryPrimaryLocale) {\n return libraryPrimaryLocale;\n } else {\n return 'en';\n }\n};\n\n// eslint-disable-next-line no-shadow\nvar getTranslationOptions = function (locale, expectHtml) {\n return {\n expectHtml: expectHtml,\n wrap: locale && locale.toLowerCase() === 'en-qa',\n };\n};\n\n// eslint-disable-next-line no-shadow\nvar isRtl = function (locale) {\n switch (locale.toLowerCase()) {\n case 'en-rtl':\n return true;\n default:\n return false;\n }\n};\n\nmodule.exports = {\n formatLocalizedText,\n getLocale,\n getTranslationOptions,\n getLanguageHeaderLocale,\n isRtl,\n};\n","var _ = require('underscore');\n\nvar urlJoin = require('url-join');\nvar routes = require('../../routes/routing-configuration').routes;\n\n// Converts nested route map into flattened route hash table\nvar mapRoutePaths = function(routeMap) {\n var response = {};\n\n var mapRoutes = function(currentRouteMap, targetObject) {\n _.each(currentRouteMap, function(route) {\n if (_.isObject(route)) {\n mapRoutes(route, targetObject);\n }\n else {\n targetObject[route] = true;\n }\n });\n };\n\n mapRoutes(routeMap, response);\n\n return response;\n};\n\n\n// These routes should not be prefixed with advantage keys.\nvar _unprefixedRoutes = [routes.accountSignIn, routes.accountLinkLibraryCardComplete, routes.assets.css.colors, routes.assets.css.versionedColors, routes.accountSignInComplete, routes.ozone.accountSignoutComplete];\n\nvar _caseInsensitiveLookup = function (obj, keyLookup) {\n if (obj != null && keyLookup != null) {\n for (var prop in obj) {\n if (keyLookup.toLowerCase() == prop.toLowerCase()) {\n return {key: prop, value: obj[prop]};\n }\n }\n }\n\n return null;\n};\n\nvar routeReverseLoopkup = mapRoutePaths(routes);\n\nvar _generateUrlWithParameters = function (pathTemplate, originalParameterDictionary) {\n if (pathTemplate == null) {\n return null;\n }\n\n // Check to see if the route passed in is in our routing-configuration\n if (!routeReverseLoopkup[pathTemplate]) {\n return null;\n }\n\n // make a shallow clone of the parameter dictionary\n var parameterDictionary = {};\n for (var originalKey in originalParameterDictionary) {\n if ({}.hasOwnProperty.call(originalParameterDictionary, originalKey)) {\n parameterDictionary[originalKey] = originalParameterDictionary[originalKey];\n }\n }\n\n var satisfiedAllParameters = true;\n var path = pathTemplate.replace(/:\\w+\\??/g, function (match) {\n var isOptional = match[match.length - 1] === '?';\n\n // the length of the key is one less than the match because of the colon prefix\n var keyLength = match.length - 1;\n if (isOptional) {\n // and one less if optional to not include the question mark\n --keyLength;\n }\n\n // start from 1 to skip the colon prefix\n var key = match.substr(1, keyLength);\n\n var tuple = _caseInsensitiveLookup(parameterDictionary, key);\n\n if (tuple == null || tuple.value == null) {\n if (isOptional) {\n delete parameterDictionary[key]; // remove it so it's not in the querystring\n\n return '';\n } else {\n satisfiedAllParameters = false;\n\n return null;\n }\n } else {\n delete parameterDictionary[tuple.key]; // remove it so it's not in the querystring\n\n return tuple.value;\n }\n });\n\n // TODO: log? error?\n if (!satisfiedAllParameters) {\n return null;\n }\n\n // url-join will trim off a trailing slash ONLY when there's a querystring; we'd\n // rather be consistent and just always trim it ourselves to avoid confusion\n // NOTE: the index path is the only case where ending in a slash isn't trailing\n var lastPathChar = path[path.length - 1];\n if (lastPathChar === '/' && path !== '/') {\n path = path.substr(0, path.length - 1);\n }\n\n // TODO: Support arrays as querystring values\n // TODO: Convert non-strings to strings\n var queryParts = [];\n for (var key in parameterDictionary) {\n if ({}.hasOwnProperty.call(parameterDictionary, key)) {\n queryParts.push(key + '=' + encodeURIComponent(parameterDictionary[key]));\n }\n }\n var query = queryParts.length === 0 ? '' : '?' + queryParts.join('&');\n\n return path + query;\n};\n\nvar _prependRoot = function (req, route) {\n var baseUrl = req.baseUrl || '/';\n if (baseUrl === '/') {\n return route;\n } else if (route === '/') {\n return baseUrl;\n } else {\n return urlJoin(baseUrl, route);\n }\n};\n\nvar getRouteUrl = function (req, route, parameters) {\n var fullRoute = _generateUrlWithParameters(route, parameters || {});\n if (fullRoute != null) {\n var isPrefixed = _unprefixedRoutes.indexOf(route) === -1;\n if (isPrefixed) {\n return _prependRoot(req, fullRoute);\n } else {\n return fullRoute;\n }\n } else {\n // probably log here\n return null;\n }\n};\n\nmodule.exports = {\n routes: routes,\n getRouteUrl: getRouteUrl,\n\n _caseInsensitiveLookup: _caseInsensitiveLookup\n};\n","module.exports = {\n yearInSeconds: 365 * 24 * 60 * 60,\n yearInMilliseconds: 365 * 24 * 60 * 60 * 1000,\n minuteInMilliseconds: 60 * 1000,\n dayInMilliSeconds: 24 * 60 * 60 * 1000\n};\n","var SimpleHash = {\n hash: function(toHash) {\n var hash = 0, i, chr, len = toHash.length;\n if (toHash.length === 0) {\n return hash;\n }\n for (i = 0; i < len; i++) {\n chr = toHash.charCodeAt(i);\n hash = ((hash << 5) - hash) + chr;\n hash |= 0; // Convert to 32bit integer\n }\n return hash;\n\n }\n};\n\nmodule.exports = SimpleHash;\n","var querystring = require('querystring');\n\nvar supportUrl = function(preferredLang, article, params) {\n var language = preferredLang || 'en';\n var url = 'https://help.overdrive.com';\n if (language === 'fr' || language === 'fr-CA') {\n url += '/customer/fr/portal/articles/';\n if (!!article) {\n url += article;\n }\n } else if (!!article) {\n url += '/customer/portal/articles/' + article;\n }\n if (!!params) {\n var queryString = querystring.stringify(params);\n if (queryString) {\n url += '?' + queryString;\n }\n }\n return url;\n};\n\nmodule.exports = supportUrl;\n","/**\n* Flips the value of a bit at the index\n* @param index - index of bit to flip. 0 is the LSB\n* @param flagString - Encoded string, bits are represented by base 10 integer\n* @return flagString - the updated and encoded string\n*/\nvar bitFlip = function(index, flagString) {\n var pow = Math.pow(2, index);\n return (parseInt(flagString, 10) ^ pow).toString();\n};\n\n/**\n* Returns the value of a bit at the index specified from the encoded flagString\n* @param index - index of bit flag. 0 is the LSB\n* @param flagString - Encoded string, bits are represented by base 10 integer\n* @return boolean value at index\n*/\nvar bitDecode = function(index, flagString) {\n var pow = Math.pow(2, index);\n return (parseInt(flagString,10) & pow) === pow;\n};\n\n/**\n* Encodes the bit at the index on/off into a flagString\n* @param value - value to be encoded (true/false)\n* @param index - index of bit to set. 0 is the LSB\n* @param flagString - optional if updating existing flagString\n* @return the encoded string of bits\n*/\nvar bitEncode = function(value, index, flagString = '0') {\n return bitDecode(index, flagString) === value ? flagString : bitFlip(index, flagString);\n};\n\nmodule.exports = {\n bitFlip: bitFlip,\n bitDecode: bitDecode,\n bitEncode: bitEncode\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.lightClone = exports.jsonClone = void 0;\n/**\n * Returns a shallow-ish clone of param.\n * Uses json parse, stringify so no support for\n * es6 structures (symbols, sets, maps, etc), dates, functions, undefined\n * @param {obj|array|string|number|null} obj - The thing to be cloned\n * @return {obj|array|string|number|null} A cloned thing\n */\nvar jsonClone = function (obj) {\n return JSON.parse(JSON.stringify(obj));\n};\nexports.jsonClone = jsonClone;\n/**\n * Returns a shallow-ish clone of param\n * Currently no support for es6 structures (symbols, sets, maps, etc),\n * dates, functions\n * @param {obj|array|string|number|null|undefined} obj - The thing to be cloned\n * @return {obj|array|string|number|null|undefined} A cloned thing\n */\nvar lightClone = function (obj) {\n return obj === void 0 ? obj : (0, exports.jsonClone)(obj);\n};\nexports.lightClone = lightClone;\n\n//# sourceMappingURL=clone-ts.js.map\n\n//# sourceMappingURL=clone-ts.js.map\n","// Original: https://jira.hq.overdrive.com/browse/LHTNG-3809 Relocation: https://jira.hq.overdrive.com/browse/LHTNG-3862\n\nconst MacmillanMessage = function(model) {\n let badPublisher = parseInt(model.get(\"publisherAccount\").id, 10) === 6222;\n let today = new Date();\n let releaseDate = new Date(model.get(\"estimatedReleaseDate\"));\n let macmillanLicensingChangeInEffect = releaseDate >= new Date(2019, 10, 1);\n let releaseDatePlus8Weeks = new Date(releaseDate);\n releaseDatePlus8Weeks.setDate(releaseDate.getDate() + (8 * 7));\n let releaseDateWithinEightWeeks = (releaseDate < today) && (today < releaseDatePlus8Weeks);\n\n return window.featureManager.isEnabled('macmillanMessaging')\n && macmillanLicensingChangeInEffect\n && badPublisher\n && (releaseDateWithinEightWeeks || (macmillanLicensingChangeInEffect && model.get(\"isPrereleaseTitle\")))\n ? html('macmillanMessage', {date : releaseDatePlus8Weeks })\n : '';\n}\n\nexport default MacmillanMessage;\n","\nlet bitFlag = require('../lib/utility/bitFlag.js');\n\nmodule.exports = class HighlightedFeatureState {\n\n constructor(flags, featureManager, hasPartnerLibraries) {\n this.featureManager = featureManager;\n this.hasPartnerLibraries = hasPartnerLibraries;\n\n if (flags){\n this.flags = flags;\n }\n else {\n this.flags = 0;\n }\n }\n\n get features() {\n return {\n partnerLibrariesMenu: {flagBit: 0, active: this.featureManager.isEnabled('reciprocalLending') && this.hasPartnerLibraries}\n };\n }\n\n wasVisited(featureName){\n if (!this.features.hasOwnProperty(featureName)){\n throw new Error(`'${featureName}' is not a known feature.`);\n }\n\n return bitFlag.bitDecode(this.features[featureName].flagBit, this.flags);\n }\n\n visit(featureName){\n if (!this.features.hasOwnProperty(featureName)){\n throw new Error(`'${featureName}' is not a known feature.`);\n }\n this.flags = bitFlag.bitEncode(true, this.features[featureName].flagBit, this.flags);\n }\n\n visitAllActiveFeatures(){\n let activeFeatureNames = Object.getOwnPropertyNames(this.features).filter((featureName => this.features[featureName].active));\n activeFeatureNames.forEach((featureName) => this.visit(featureName));\n }\n\n get unvisitedFeaturePresent() {\n let activeFeatureNames = Object.getOwnPropertyNames(this.features).filter((featureName => this.features[featureName].active));\n return activeFeatureNames.length !== 0 && activeFeatureNames.some((featureName) => !this.wasVisited(featureName));\n }\n};\n","\nlet bitFlag = require('../lib/utility/bitFlag.js');\n\nmodule.exports = class OdTrack {\n\n constructor(flags, isGdprCoutnry) {\n if (flags){\n this.flags = flags;\n }\n else {\n // defaults\n this.flags = 0;\n if (!isGdprCoutnry){\n this.perfTrackingEnabled = true;\n this.analyticsTrackingEnabled = true;\n }\n else {\n this.perfTrackingEnabled = false;\n this.analyticsTrackingEnabled = false;\n }\n }\n }\n\n get perfTrackingEnabled(){\n return bitFlag.bitDecode(0, this.flags);\n }\n\n set perfTrackingEnabled(enabled){\n this.flags = bitFlag.bitEncode(enabled, 0, this.flags);\n }\n\n get analyticsTrackingEnabled(){\n return bitFlag.bitDecode(1, this.flags);\n }\n\n set analyticsTrackingEnabled(enabled){\n this.flags = bitFlag.bitEncode(enabled, 1, this.flags);\n }\n\n}\n","const _ = require('underscore');\n\n/**\n * Defines all the available input parameters for the media endpoint\n * @class MediaParameters\n * ref: https://thunder.api.test.overdrive.com/docs/ui/index#!/Media/V2Media_IndexMedia\n */\nmodule.exports = class MediaParameters {\n\n constructor() {\n this.query = '';\n this.mediaType = '';\n this.mediaTypes = '';\n this.title = '';\n this.series = '';\n this.publisherId = '';\n this.publisherEntityId = null;\n this.imprintId = '';\n this.identifier = '';\n this.creator = '';\n this.creatorId = null;\n this.addedDate = '';\n this.availableFirst = null;\n this.showOnlyAvailable = false;\n this.showOnlyPrerelease = false;\n this.showOnlyLuckyDayAvailable = false;\n this.hasAudioSynchronizedText = null;\n this.collectionId = 0;\n\n // All of the following arrays are string arrays\n this.format = [];\n this.subject = [];\n this.bisacCode = [];\n this.maturityLevel = [];\n this.language = [];\n this.atosLevel = [];\n this.lexileScore = [];\n this.interestLevel = [];\n this.gradeLevel = [];\n this.includedFacets = [];\n\n this.sortBy = 'relevance';\n this.show = 'owned';\n this.page = 1;\n this.perPage = 24;\n this.includeFacets = true;\n this.includeNoFormatTitles = false;\n this.filterCpcTitles = false;\n this.maxItems = 0;\n\n Object.assign(this, ...arguments);\n }\n\n applyRoomFiltersAndUserPrefs(roomFilters, userPreferences) {\n if (roomFilters) {\n // Note that the names don't match up so we can't just extend\n if (roomFilters.maturityLevels) {\n this.maturityLevel = roomFilters.maturityLevels;\n }\n if (roomFilters.subjects) {\n this.subject = roomFilters.subjects;\n }\n if (roomFilters.language) {\n this.language = roomFilters.language;\n }\n if (roomFilters.mediaType) {\n this.mediaType = roomFilters.mediaType;\n this.mediaTypes = roomFilters.mediaType;\n }\n }\n\n if (userPreferences) {\n // There may be more user prefs to apply besides audience-settings but this\n // was the immediate need. We can add more as they come up.\n if (userPreferences['audience-setting'] && this.maturityLevel.length === 0) {\n let audience = userPreferences['audience-setting'];\n let maturityLevels = [];\n _.each(_.keys(audience), function(key) {\n if (audience[key] && key !== 'all') {\n maturityLevels.push(key);\n }\n });\n if (maturityLevels.length > 0) {\n this.maturityLevel = maturityLevels;\n }\n }\n }\n }\n\n serialize() {\n let response = _.extend({}, this);\n\n // Remove all properties that do not have a value set\n Object.keys(response).forEach((key) => {\n !this._hasValue(response[key]) && delete response[key];\n });\n\n return response;\n }\n\n _hasValue(value) {\n return !((_(value).isObject() && _(value).isEmpty()) || !value) || value === false;\n }\n};\n","// import when we move more to modules\nexport default window.Backbone.Collection;\n","import { Modal } from '../common/modal';\n\nconst { html } = window;\n\nexport default class HoldCancelModal extends Modal {\n\n constructor() {\n super({\n title : html('cancelHoldModal.removeHold'),\n content : `\n

${ html('cancelHoldModal.removeConfirm') }

\n
`\n });\n\n this.$buttonConfirm = $(`\n `)\n .on('click keydown', (e) => { this.isSelectEvent(e) && this.trigger('confirm', this); });\n\n this.$buttonCancel = $(`\n `\n )\n .on('click keydown', (e) => { this.isSelectEvent(e) && this.trigger('cancel', this); });\n\n this.$content.find('.button-container').append([\n this.$buttonConfirm,\n this.$buttonCancel\n ]);\n }\n}\n","import Popover from '../../components/popover/popover';\n\nexport default class MacOSAudiobookSupportPopover{\n \n constructor(el) {\n this.template = `

${html(\"macOsAudiobookSuppression.supportedVersions\")}

`;\n\n this.el = el;\n }\n\n render(){\n return new Popover({\n target: this.el,\n contents: this.template,\n width: 375\n });\n }\n}\n","import template from './RemoveSuspendHoldModalTemplate.html';\nimport {Modal} from '../common/modal';\nconst { html } = window;\n\nexport default class SuspendHoldModal extends Backbone.View {\n constructor(model, isNotification = false){\n super(...arguments);\n this.model = model;\n this.isNotification = isNotification;\n this.render();\n }\n\n render(){\n let modalContents = {\n title: html('removeSuspensionModal.heading'),\n autoShow: false,\n classes: ['small', 'remove-suspension-modal'],\n content: template(this.model.get('title'), this.model.get(\"ownedCopies\") === 0 ? html(\"holdRedelivery.removeSuspensionLapsedMA\") : html(\"holdRedelivery.removeSuspension\"))\n };\n\n this.modal = new Modal(modalContents);\n this.attachEvents(this.modal.$el);\n this.modal.show();\n }\n \n attachEvents(modal){\n modal.find(\"#remove-suspend\").on('click', () => {\n featureManager.isEnabled(\"holdRedelivery\") ? window.removeSuspension(this.model.get('id')) : window.removeSuspendedHold(this.model.get('id'));\n window.globalEvents.trigger(\"title:suspend:cancelled\", { titleModel: this.model, context: { isNotification: this.isNotification }});\n });\n\n modal.find(\".cancel\").on('click', () => { \n modal.find('.close-reveal-modal').click();\n });\n }\n}\n","const { html } = window;\nexport default (title, text) => `\n
\n
\n

${title}

\n

${text}

\n \n ${html('holdRedelivery.areYouSure')}\n
\n
\n\n
\n \n \n
\n
\n `;\n","import template from './SuspendHoldModalTemplate.html';\nimport { Modal } from '../common/modal';\nimport RemoveSuspendedHoldModal from '../RemoveSuspendedHoldModal/RemoveSuspendHoldModal';\nimport SuspendHoldSuccessModal from '../SuspendHoldSuccessModal/SuspendHoldSuccessModal';\nimport addDays from '../../util/dates/addDays';\nconst { html } = window;\n\n// There are 3 possible states for this which affect copy:\n// Suspended and never delivered --> Standard Suspend Hold modal\n// Suspended and has been delievered before --> Gets some dynamic date updates and a new label\n// Available --> Same as the option above (with a new label), but also comes with a new dropdown option\n\nexport default class SuspendHoldModal extends Backbone.View {\n constructor(model, redelivery, isNotification = false) {\n super(...arguments);\n this.model = model;\n this.redelivery = redelivery;\n this.isAvailable = model.get('isAvailable');\n // Checks for if a suspended title has become available to the user at any point\n this.deliveredPreviously =\n model.get('suspensionFlag') &&\n (model.get('isAvailable') ||\n model.get('redeliveriesAutomatedCount') > 0 ||\n model.get('redeliveriesRequestedCount') > 0);\n this.isNotification = isNotification;\n this.render();\n }\n\n render() {\n let modalContents = {\n title: this._getTitle(),\n autoShow: false,\n classes: ['small', 'suspension-modal', 'version-two'],\n content: template(\n this.model.attributes,\n '',\n '',\n '',\n this.isAvailable,\n this.deliveredPreviously,\n this.model.get('suspensionFlag')\n ),\n };\n\n if (window.featureManager.isEnabled('suspend-modal-data-adjustment')) {\n let cover = this.model.getCover(150);\n modalContents.content = template(\n null,\n cover && cover.href,\n this.model.get('title'),\n this.model.get('firstCreatorName'),\n this.isAvailable,\n this.deliveredPreviously,\n this.model.get('suspensionFlag')\n );\n }\n\n this.modal = new Modal(modalContents);\n this._renderText(this.modal.$el);\n this.attachEvents(this.modal.$el);\n this.modal.show();\n }\n\n attachEvents(modal) {\n modal.find('#suspend-hold').on('click', () => {\n let days = modal.find('#select-suspension').val();\n\n if (days > 0) {\n this._suspendHold(days);\n } else {\n this._removeSuspension(this.model.get('id'));\n }\n });\n\n modal.find('.remove-suspension-button').on('click', () => {\n new RemoveSuspendedHoldModal(this.model, this.isNotification);\n });\n\n modal.find('.cancel').on('click', () => {\n modal.find('.close-reveal-modal').click();\n });\n\n modal.find('#select-suspension').on('change', () => {\n this._renderText(modal);\n });\n }\n\n _getTitle() {\n if (this.isAvailable) {\n return html('suspendHoldModal.availableTitle');\n } else if (this.deliveredPreviously) {\n return html('suspendHoldModal.previouslyDeliveredTitle');\n } else {\n return html('suspendHoldModal.heading');\n }\n }\n\n _renderText(modal) {\n const description = modal.find('#suspend-description');\n description.empty();\n\n let days = modal.find('#select-suspension').val();\n let text = '';\n\n if (days > 0) {\n let date = addDays(days);\n this.isAvailable || this.deliveredPreviously\n ? (text = html('holdRedelivery.suspendHoldText', {\n expirationDate: html('date-long', { d: date }),\n }))\n : (text = html('suspendHoldModal.explanationDynamic', {\n expirationDate: html('date-long', { d: date }),\n }));\n } else {\n text = html('holdRedelivery.suspendHoldRemoveText');\n }\n\n description.append(text);\n }\n\n _suspendHold(days) {\n window.suspendHold(this.model.get('id'), days);\n\n var model = this.model;\n var numberOfDays = days;\n var isRedelivery = this.isAvailable;\n var isSuspended = this.model.get('suspensionFlag');\n var context = {\n numOfDays: numberOfDays,\n isRedelivery: isRedelivery,\n isSuspended: isSuspended,\n isNotification: this.isNotification,\n };\n window.globalEvents.trigger('title:suspend', {\n titleModel: model,\n context,\n });\n\n if (this.isAvailable || this.deliveredPreviously) {\n new SuspendHoldSuccessModal(this.model, addDays(days));\n } else {\n this.modal.$el.find('.close-reveal-modal').click();\n }\n }\n\n _removeSuspension = function (mediaId) {\n let promise = window.callToRemoveSuspension(mediaId);\n\n promise\n .then(() => {\n window.globalEvents.trigger('title:suspend:cancelled', {\n titleModel: this.model,\n context: { isNotification: this.isNotification },\n });\n new SuspendHoldSuccessModal(this.model, 'today');\n })\n .catch((err) => {\n window.Logger.log('error', 'Error removing hold suspension', {\n message: err.statusText || err,\n });\n if (toaster) {\n toaster.push(window.text('errorOccurred'), 'error');\n }\n this.modal.$el.find('.close-reveal-modal').click();\n });\n };\n}\n","const { html } = window;\nexport default (atts, cover, title, author, isAvailable, deliveredPreviously, isSuspended) => `\n\n
\n ${ window.featureManager.isEnabled('suspend-modal-data-adjustment') ? \n `\n
${title}
\n

${author}

`\n :\n `\n
${atts.title}
\n

${atts.firstCreatorName}

`\n }\n
\n\n
\n
\n ${isAvailable || deliveredPreviously ? \n ``\n : ''\n }\n \n
\n
\n\n
\n

\n
\n\n
\n \n ${isAvailable || deliveredPreviously || !isSuspended ?\n '' : \n ``}\n \n
\n`;\n","import template from './SuspendHoldSuccessModalTemplate.html';\nimport {Modal} from '../common/modal';\nconst { html, globalEvents } = window;\n\nexport default class SuspendHoldSuccessModal extends Backbone.View {\n constructor(model, expirationDate) {\n super(...arguments);\n this.model = model;\n this.expirationDate = expirationDate;\n this.bus = globalEvents;\n this.render();\n }\n\n render(){\n let modalContents = {\n title: html('suspendHoldModal.headingSuccess'),\n autoShow: false,\n classes: ['small', 'suspension-modal', 'version-two'],\n content: template(this.model.attributes, \"\", \"\", \"\", this.expirationDate)\n };\n\n if(window.featureManager.isEnabled('suspend-modal-data-adjustment')){\n let cover = this.model.getCover(150);\n modalContents.content = template(null, cover && cover.href, this.model.get('title'), this.model.get('firstCreatorName'), this.expirationDate);\n }\n\n this.modal = new Modal(modalContents);\n this.attachEvents(this.modal.$el);\n this.modal.show();\n }\n\n attachEvents(modal){\n modal.find(\".cancel\").on('click', () => {\n modal.find('.close-reveal-modal').click();\n });\n\n this.modal.on('close cancel', () => this.bus.trigger('hold:suspend:completed'));\n }\n}\n","const { html } = window;\nexport default (atts, cover, title, author, expirationDate) => `\n\n
\n ${ window.featureManager.isEnabled('suspend-modal-data-adjustment') ? \n `\n
${title}
\n

${author}

`\n :\n `\n
${atts.title}
\n

${atts.firstCreatorName}

`\n }\n
\n\n
\n

\n ${expirationDate === 'today' ?\n `${html('holdRedelivery.suspendHoldRemoveConfirmationHtml')}` :\n `${html('holdRedelivery.suspendHoldConfirmationHtml', {expirationDate: html('date-long', {d: expirationDate})})}`\n }\n

\n
\n\n
\n \n
\n`;","const Backbone = window.Backbone;\nconst text = window.text;\nconst url = window.url;\nconst acceptableTypes = ['ebook', 'audiobook', 'video', 'magazine'];\n\nimport { Modal } from '../common/modal';\nimport TitleFormatBadge from '../media/views/TitleInfo/TitleFormatBadge';\nimport Cover from '../media/Cover';\nimport KindlePreference from '../kindle_preference_modal/KindlePreference';\nimport DownloadWarningModal from '../media/views/DownloadWarningModal';\nimport { getTitleFulfillmentButtonLayout } from '../../../../lib/fulfillment-ts.js';\nimport MacOSAudiobookSupportPopover from '../MacOSAudiobookSupportPopover/MacOSAudiobookSupportPopover';\nimport { toStaticUrl } from '../../../../lib/assetMapper';\n\nexport default class TitleFulfillmentModal extends Backbone.View {\n constructor({\n loan,\n title,\n bus,\n featureManager,\n patronSettings,\n accountLimits,\n isRenewal = false,\n formatLock = null,\n }) {\n super(...arguments);\n this.loan = loan;\n this.title = title;\n this.bus = bus;\n this.featureManager = featureManager;\n this.patronSettings = patronSettings;\n this.accountLimits = accountLimits;\n this.isRenewal = isRenewal;\n this.formatLock = formatLock;\n this._views = [];\n\n let inApp = window.OverDrive.inApp;\n this.allowMp3AudiobookDownloads = !(\n this.featureManager.isEnabled('mp3-in-app-only') && !inApp\n );\n this.showNoMP3LibbyPromo =\n this.loan.isAudiobook &&\n this.loan.hasMp3Format &&\n this.featureManager.isEnabled('mp3-in-app-only') &&\n !inApp &&\n this.featureManager.isEnabled('promoteLibby');\n this._views.push(\n (this.cover = new Cover({\n model: this.title,\n coverWidths: { mobile: 250, tablet: 250, desktop: 250 },\n }))\n );\n this._views.push(\n (this.formatBadge = new TitleFormatBadge({\n typeId: this.title.get('type').id,\n }))\n );\n }\n\n render() {\n if (acceptableTypes.includes(this.loan.type.id)) {\n this.formatBadge.render();\n\n let html = this.renderTemplate();\n\n let modalContents = {\n title: text('genericSuccess'),\n autoShow: false,\n classes: ['large', 'TitleFulfillmentModal'],\n content: html,\n };\n\n this.modal = new Modal(modalContents);\n this.attachEvents(this.modal.$el);\n this.modal.show();\n } else {\n window.Logger.log('error', 'Title has unexpected media type', {\n source: 'fulfillment modal',\n title: this.loan.title,\n id: this.loan.id,\n type: this.loan.type,\n });\n if (toaster) {\n toaster.push(text('genericError'), 'error');\n }\n }\n }\n\n attachEvents(node) {\n let titleModel = this.title;\n node.find('.kindleFulfillmentButton').click((evt) => {\n let formatId = $(evt.currentTarget).attr('data-format-id');\n\n if (\n window.appPromoManager.isAppPromoEnabled(\n window.appPromoManager.APPLICATIONS.KINDLEPREF\n ) &&\n !(\n Cookies.get('kindleFulfillmentAppOverride') &&\n Cookies.get('kindleFulfillmentAppOverride') === '1'\n ) &&\n window.globalPreferences.get('kindleFulfillment') == null\n ) {\n // don't follow the href on the kindle button since we need to show a modal sequence first.\n evt.preventDefault();\n\n let fulfillTarget = url(window.routes.mediaDownload, {\n format: formatId,\n mediaId: this.loan.id,\n });\n\n new KindlePreference({\n bus: this.bus,\n globalPreferences: window.globalPreferences,\n source: 'content_fulfillment',\n completionTargetUrl: fulfillTarget,\n }).run();\n }\n this.bus.trigger('title:download', {\n titleModel,\n context: { formatId },\n });\n });\n\n node.find('.od-format-button').click((evt) => {\n let formatId = $(evt.currentTarget).attr('data-format-id');\n this.bus.trigger('title:download', {\n titleModel,\n context: { formatId },\n });\n });\n\n node.find('.loan-button-nonkindle, .Loans-bundledButton').click(\n (evt) => {\n new DownloadWarningModal($(evt.currentTarget));\n let formatId = $(evt.currentTarget).attr('data-format-id');\n this.bus.trigger('title:download', {\n titleModel,\n context: { formatId },\n });\n }\n );\n\n let popoverElm = node.find('.macOSAudiobookDownloadSupport');\n if (popoverElm) {\n new MacOSAudiobookSupportPopover(popoverElm).render();\n }\n\n node.find('.unable-to-download').click(() =>\n this.onUnableToDownloadClick()\n );\n }\n\n get suppressAudiobookButton() {\n const isMac = !!(\n window.navigator.userAgent.match(/Mac/) && !bowser.ios\n );\n return (\n this.loan.isAudiobook &&\n this.featureManager.isEnabled('noAudiobooksForMacOS') &&\n isMac &&\n !bowser.ios &&\n (!this.featureManager.isEnabled(\n 'reenableMp3DownloadMacOSPreCatalina'\n ) ||\n !window.OverDrive.isPreCatalinaMac) &&\n !(\n this.featureManager.isEnabled('stop-treating-ipad-like-mac') &&\n window.navigator.userAgent.match(\n /App Store OverDrive Media Console/\n )\n )\n );\n }\n\n get isAudiobookOnMac() {\n const isMac = !!(\n window.navigator.userAgent.match(/Mac/) && !bowser.ios\n );\n const isIpad =\n this.featureManager.isEnabled('stop-treating-ipad-like-mac') &&\n window.navigator.userAgent.match(\n /App Store OverDrive Media Console/\n );\n return (\n this.loan.isAudiobook &&\n this.featureManager.isEnabled('noAudiobooksForMacOS') &&\n isMac &&\n !bowser.ios &&\n !isIpad\n );\n }\n\n onUnableToDownloadClick() {\n const modal = this.modal.$el;\n const modalBackdrop = this.modal.$el.data('reveal-init').bg;\n\n modal.addClass('TitleFulfillmentModal--no-z-index');\n modalBackdrop.hide();\n\n window.windowsAppDownloadMessage.update({\n onClose: () => {\n window.windowsAppDownloadMessage.update({\n onClose: window.hideWindowsAppDownloadMessage,\n open: false,\n });\n\n modalBackdrop.show();\n modal.removeClass('TitleFulfillmentModal--no-z-index');\n },\n open: true,\n isAudiobook: this.loan.isAudiobook,\n isEbook: this.loan.isEbook,\n displayReadNowInBrowser: !!(\n this.loan.showODFormatButton || this.loan.hasMediaDoFormat\n ),\n });\n }\n\n renderTemplate() {\n const kindleOnly = this.isRenewal && this.formatLock === 'ebook-kindle';\n const buttons = this.getButtonsHtml(kindleOnly);\n return this.renderFullTemplate(buttons, kindleOnly);\n }\n\n getButtonsHtml(kindleOnly) {\n this.filterRestrictedFormats();\n\n let buttonLayout = {};\n let firstButton = '';\n buttonLayout = getTitleFulfillmentButtonLayout(\n this.featureManager,\n this.loan,\n {\n inApp: window.OverDrive.inApp,\n isAudiobookOnMac: this.isAudiobookOnMac,\n isIpadUserAgent: window.navigator.userAgent.match(\n /App Store OverDrive Media Console/\n ),\n isTolinoDevice: window.OverDrive.isTolinoDevice,\n kindleOnly,\n suppressAudiobookButton: this.suppressAudiobookButton,\n }\n );\n\n return `\n ${firstButton}\n ${\n buttonLayout.mainButton === 'kindle'\n ? this.renderKindleButton()\n : ''\n }\n ${\n buttonLayout.mainButton === 'download'\n ? this.renderDownloadButton(buttonLayout.formatID)\n : ''\n }\n ${\n buttonLayout.mainButton === 'unsupported'\n ? this.renderDownloadButton(buttonLayout.formatID, true)\n : ''\n }\n ${\n buttonLayout.mainButton === 'odread'\n ? this.renderODReadButton()\n : ''\n }\n ${\n this.allowMp3AudiobookDownloads &&\n buttonLayout.showMacOsAudiobookSuppressionStyle === 'suppress'\n ? this.renderMacOSSuppression()\n : ''\n }\n ${\n buttonLayout.showNoKindleWarning\n ? `
${text(\n 'accountLoans.kindleFulfillment.noneAvailable'\n )}
`\n : ''\n }\n ${\n buttonLayout.showMainDropdown\n ? this.renderDownloadDropdown()\n : ''\n }\n ${\n buttonLayout.showDivider && !this.showNoMP3LibbyPromo\n ? this.renderButtonDivider()\n : ''\n }\n ${this.showNoMP3LibbyPromo ? this.renderNoMP3LibbyPromo() : ''}\n ${\n buttonLayout.subButton === 'odread'\n ? this.renderODReadButton()\n : ''\n }\n ${\n buttonLayout.audiobookAfterSunset ||\n buttonLayout.subButton === 'audiobook' ||\n (buttonLayout.mainButton === 'audiobook' &&\n this.featureManager.isEnabled(\n 'sunset-audiobook-rewrite'\n )) ||\n (buttonLayout.formatID === 'audiobook-mp3' &&\n buttonLayout.mainButton === 'odread')\n ? this.renderAudiobookAccordion()\n : ''\n }\n ${\n buttonLayout.showOtherButtonBelowDivider\n ? this.renderDownloadButton()\n : ''\n }\n ${\n buttonLayout.showDownloadDropdownBelowDivider\n ? this.renderDownloadDropdown()\n : ''\n }\n ${\n buttonLayout.showRestrictedVideoWarning\n ? this.renderStreamingVideoWarning()\n : ''\n }\n ${\n buttonLayout.showRestrictedFormatWarning\n ? this.renderRestrictedFormatWarning(\n this.loan.restrictedFormats\n )\n : ''\n }\n ${\n this.allowMp3AudiobookDownloads &&\n buttonLayout.showMacOsAudiobookSuppressionStyle === 'warn'\n ? this.renderAudiobookWarning()\n : ''\n }\n ${this.renderWindowsAppDownloadMessage()}\n `;\n }\n\n renderNoMP3LibbyPromo() {\n if (this.showNoMP3LibbyPromo) {\n return `
\n
\n
\n \"Logo
\n
\n

${text(\n 'fulfillmentView.getLibbyAudiobook'\n )}

\n
\n
\n
`;\n }\n }\n\n renderAudiobookWarning() {\n return `\n
\n
${html(\n 'macOsAudiobookSuppression.supportedVersions'\n )}
\n
\n `;\n }\n\n renderMacOSSuppression() {\n return `\n
\n
\n

${html('macOsAudiobookSuppression.aboutMacOS')}

\n
\n
\n `;\n }\n\n renderFullTemplate(buttonStack, kindleOnly) {\n let titleSpan = `${this.title.get('title')}`;\n let loansRemaining = this.accountLimits.loansRemaining;\n\n let youCanBorrowText = '';\n if (loansRemaining > 0) {\n if (this.loan.isMagazine) {\n youCanBorrowText = text(\n 'accountLoans.magazinesDontCountAgainstCheckout',\n { loans: loansRemaining }\n );\n } else {\n youCanBorrowText = text('accountLoans.youCanBorrowMoreTitles', {\n loans: loansRemaining,\n });\n }\n } else if (\n !(\n this.featureManager.isEnabled(\n 'fix-titlemodal-magazine-display'\n ) && this.loan.isMagazine\n )\n ) {\n youCanBorrowText = text('accountLoans.youCanBorrowNoMoreTitles');\n }\n\n return `\n
`;\n }\n\n renderButtonDivider() {\n // If we're showing the divider usually there are two fulfillment options being presented. The exception is the case\n // where the first slot is filled by the \"kindle not available\" message.\n return `
\n
\n ${\n !this.loan.showNoKindleMessage\n ? `\n \n ${html('or')}\n `\n : ''\n }\n
`;\n }\n\n renderKindleButton() {\n return `\n ${text('kindleFulfillment.readNow', {\n Kindle: ``,\n })}\n \n
\n ${text(\n 'accountLoans.kindleFulfillment.kindleReadOn'\n )}\n \n \n \n \n \n
\n ${\n this.loan.showKindleTroubleAccordian\n ? this.renderKindleTroubleAccordion()\n : ''\n }\n `;\n }\n\n renderKindleTroubleAccordion() {\n let embeddedButton = '';\n if (this.loan.hasOverdriveFormat) {\n embeddedButton = this.renderODReadButton();\n }\n\n return ``;\n }\n\n renderAudiobookAccordion() {\n if (\n !this.featureManager.isEnabled('disableOdAppAccess') &&\n !this.featureManager.isEnabled('promoteLibby') &&\n this.featureManager.isEnabled('keep-od-app-fulfillment') &&\n this.allowMp3AudiobookDownloads\n ) {\n return `
\n ${\n this.loan.hasNonKindleNonReadFormat\n ? `
\n ${this.buildAudiobookAccordionComponent()}\n
`\n : ''\n }\n
`;\n }\n\n if (\n !this.featureManager.isEnabled('promoteLibby') &&\n this.allowMp3AudiobookDownloads &&\n !this.suppressAudiobookButton\n ) {\n return ``;\n }\n\n return `
\n ${\n this.featureManager.isEnabled('promoteLibby')\n ? this.buildAudiobookAccordionLibbyPromo()\n : ''\n }\n \n ${\n this.loan.hasNonKindleNonReadFormat\n ? this.buildAudiobookAccordionComponent()\n : ''\n }\n
`;\n }\n\n buildAudiobookAccordionLibbyPromo() {\n if (!this.showNoMP3LibbyPromo) {\n if (this.featureManager.isEnabled('download-libby-modal')) {\n return `

${text(\n 'accountLoans.DownloadInApp'\n )}

\n \n ${text('accountLoans.GetLibby')}\n `;\n } else {\n return `\n ${text('accountLoans.GetLibby')}\n `;\n }\n } else {\n return '';\n }\n }\n\n buildAudiobookAccordionComponent() {\n let dropdownText = window.featureManager.isEnabled('disableOdAppAccess')\n ? text('accountLoans.Mp3FulfillmentWarning')\n : text('accountLoans.OdAppInstalled');\n let dropdownElement =\n this.allowMp3AudiobookDownloads && !this.suppressAudiobookButton\n ? this.renderDownloadButton()\n : '';\n\n if (\n this.featureManager.isEnabled('show-od-desktop-message') &&\n !this.allowMp3AudiobookDownloads\n ) {\n dropdownText = text('accountLoans.Mp3FulfillmentWarning');\n dropdownElement = `

\n ${text('accountLoans.downloadAudiobooksWithLibby')}

`;\n }\n\n if (dropdownElement !== '') {\n return ``;\n } else {\n return '';\n }\n }\n\n renderDownloadButton(\n formatId = this.loan.nonKindleNonReadFormats[0].id,\n unsupportedFormat = false\n ) {\n if (unsupportedFormat) {\n return `\n
${window.text(\n `formats.${formatId}`\n )}
\n ${window.text('accountLoans.unsupportedFormat', {\n formats: 1,\n })}\n
\n `;\n } else if (!this.featureManager.isEnabled('tolino-other-button')) {\n const unsupportedTolinoFormatDetails =\n this._hideUnsupportedDownloadOptionsForTolino(formatId);\n if (unsupportedTolinoFormatDetails.hide) {\n return `\n
${\n unsupportedTolinoFormatDetails.format\n }
\n ${window.text('accountLoans.unsupportedFormat', {\n formats: 1,\n })}\n
\n `;\n }\n }\n\n return `\n ${\n formatId === 'ebook-media-do'\n ? html('readNow')\n : this.isRenewal && !!this.formatLock\n ? html('renewal.downloadAgain')\n : html('accountLoans.download')\n }
\n ${html(`formats.${formatId}`)}\n
`;\n }\n\n renderODReadButton() {\n let btnSubText = '';\n let btnActionName = '';\n\n if (this.loan.isEbook || this.loan.isMagazine) {\n btnActionName = text('readNow');\n } else if (this.loan.isVideo) {\n btnActionName = window.OverDrive.inApp\n ? text('addToBookshelf')\n : text('watchNow');\n } else if (this.loan.isAudiobook) {\n btnActionName = text('listenNow');\n }\n\n if (this.loan.hasReadalong) {\n btnSubText = `
${html(\n 'narratedModal.heading'\n )}`;\n }\n\n return ` ${btnActionName}${btnSubText}\n `;\n }\n\n renderDownloadDropdown() {\n let options = '';\n\n this.loan.nonKindleNonReadFormats.forEach((format) => {\n options = `${options}\n
  • \n ${html(`formats.${format.id}`)}\n
  • `;\n });\n\n let content = `\n
      \n ${options}\n
    `;\n return content;\n }\n\n renderBundledContent() {\n let bundledButtons = '';\n let restrictedBundle = [];\n this.loan.bundledContent.forEach((subcontent) => {\n let format = subcontent.otherFormats[0];\n let label = '';\n switch (format.id) {\n case 'ebook-overdrive':\n case 'magazine-overdrive':\n label = html('readNow');\n break;\n case 'audiobook-overdrive':\n label = html('listenNow');\n break;\n case 'video-streaming':\n label = html('watchNow');\n break;\n default:\n label = `${html(`formats.${format.id}`)} ${html(\n 'accountLoans.download'\n )}`;\n }\n if (this.isRestricted(format)) {\n restrictedBundle.push(format);\n } else if (subcontent.id) {\n bundledButtons += `
  • \n ${\n subcontent.type\n ? ``\n : ''\n }\n ${label}
  • `;\n }\n // Thunder isn't passing us the bundled content ID's yet, so we have to use a \"Go to loans\" button for now\n else {\n bundledButtons = `
  • ${text(\n 'goToLoans'\n )}
  • `;\n }\n });\n\n return `\n \n \n
      \n
    • ${html(\n 'accountLoans.bundledLabel'\n )}
    • \n ${bundledButtons}\n ${\n restrictedBundle.length > 0\n ? `
    • ${this.renderRestrictedFormatWarning(\n restrictedBundle\n )}
    • `\n : ''\n }\n
    \n `;\n }\n\n renderRestrictedFormatWarning(formats) {\n let formatNames = [];\n formats.forEach((format) => {\n formatNames.push(format.name);\n });\n let formatsText = formatNames.join(' | ');\n return `
    \n ${formatsText}\n ${window.text('accountLoans.unsupportedFormat', {\n formats: formats.length,\n })}\n
    `;\n }\n\n renderStreamingVideoWarning() {\n return `
    \n ${window.text('formats.video-streaming')}\n ${window.text(\n 'accountLoans.updateForVideo'\n )}\n
    `;\n }\n\n renderWindowsAppDownloadMessage() {\n let isWindows = window.OverDrive.isWindows;\n let inApp = window.OverDrive.inApp;\n let isEbookOrAudiobook = this.loan.isEbook || this.loan.isAudiobook;\n\n if (\n isWindows &&\n inApp &&\n isEbookOrAudiobook &&\n this.featureManager.isEnabled('windows-app-download-message')\n ) {\n return `\n
    \n
    \n \n
    \n `;\n }\n return '';\n }\n\n remove() {\n this._views.forEach((view) => view.remove());\n super.remove();\n }\n\n filterRestrictedFormats() {\n this.loan.restrictedFormats = [];\n if (this.formatLock) {\n this.loan.otherFormats = this.loan.otherFormats.filter(\n (format) => format.id === this.formatLock\n );\n }\n this.loan.otherFormats = this.loan.otherFormats.filter((format) => {\n let isRestricted = this.isRestricted(format);\n if (isRestricted) {\n this.loan.restrictedFormats.push(format);\n }\n return !isRestricted;\n });\n }\n\n isRestricted(format) {\n let device = window.bowser;\n let isChromebook = !!window.navigator.userAgent.match(/CrOS/);\n let isWindows =\n window.navigator.platform.match(/Win/) && !device.windowsphone;\n let inApp = window.OverDrive.inApp;\n let isMac = window.navigator.userAgent.match(/Mac/) && !device.ios;\n let isIpad =\n this.featureManager.isEnabled('stop-treating-ipad-like-mac') &&\n window.navigator.userAgent.match(\n /App Store OverDrive Media Console/\n );\n\n switch (format.id) {\n case 'ebook-pdf-adobe':\n return (\n device.ios ||\n device.android ||\n device.windowsphone ||\n device.blackberry ||\n isChromebook ||\n (isWindows && inApp) ||\n isIpad\n );\n case 'ebook-epub-adobe':\n return isChromebook && !inApp;\n case 'ebook-pdf-open':\n return (\n ((device.ios ||\n device.android ||\n isWindows ||\n isChromebook) &&\n inApp) ||\n device.windowsphone ||\n device.blackberry ||\n isIpad\n );\n case 'audiobook-mp3':\n return (\n (isChromebook && !inApp) ||\n (isMac &&\n (this.title.get('formats').length === 1 ||\n (inApp &&\n this.title.get('formats').length === 2)) &&\n this.featureManager.isEnabled('noAudiobooksForMacOS') &&\n (!this.featureManager.isEnabled(\n 'reenableMp3DownloadMacOSPreCatalina'\n ) ||\n !window.OverDrive.isPreCatalinaMac))\n );\n default:\n return false;\n }\n }\n\n _hideUnsupportedDownloadOptionsForTolino(formatId) {\n if (!window.OverDrive.isTolinoDevice) {\n return { hide: false, format: '' };\n }\n\n if (formatId === 'ebook-media-do') {\n return { hide: true, format: window.text(`formats.${formatId}`) };\n }\n\n return { hide: false, format: '' };\n }\n}\n","import { Modal } from '../../common/modal';\n\nexport default class ImportFromRatedCompleteModal extends Backbone.View {\n titlesImportedTemplate = (importedTitleCount) =>\n `

     ${html(\n 'readingHistory.addRatedTitlesSuccess',\n { count: importedTitleCount }\n )}

    `;\n\n noTitlesImportedTemplate = () => `\n

    ${html('readingHistory.allRatedTitlesAdded')}

    \n

    ${window.text('readingHistory.ifYoudLike', {\n link: ` ${window.text(\n 'readingHistory.manuallyAdd'\n )}`,\n })}\n

    `;\n\n noTitlesRatedTemplate = () => `\n

    ${html('readingHistory.noneRated')}

    \n `;\n\n constructor(importedTitleCount, patronHasRatedTitles) {\n super();\n\n this._render(importedTitleCount, patronHasRatedTitles);\n\n let title = '';\n if (importedTitleCount > 0) {\n title = html('genericSuccess');\n } else {\n title = html('readingHistory.addRatedTitlesFailure');\n }\n\n let modalContents = {\n autoShow: false,\n title: title,\n classes: ['small'],\n content: this.$el,\n };\n\n this.modal = new Modal(modalContents);\n this.modal.show();\n }\n\n _render(importedTitleCount, patronHasRatedTitles) {\n if (importedTitleCount > 0) {\n this.$el.append(this.titlesImportedTemplate(importedTitleCount));\n } else if (!!patronHasRatedTitles) {\n this.$el.append(this.noTitlesImportedTemplate(importedTitleCount));\n } else {\n this.$el.append(this.noTitlesRatedTemplate());\n }\n }\n}\n","import { toStaticUrl } from '../../../../lib/assetMapper';\n\nconst getLocaleWithoutSubtag = (locale) => {\n const subtagIndex = locale.indexOf('-');\n return subtagIndex > 0 ? locale.substr(0, subtagIndex) : locale;\n};\n\nconst getLocaleSpecificUrl = (locale, urlHandler) =>\n urlHandler(locale) ||\n urlHandler(getLocaleWithoutSubtag(locale)) ||\n urlHandler('en');\n\nconst getStaticUrlHandler = (urlResolver) => (locale) => {\n const url = toStaticUrl(urlResolver(locale));\n return url.endsWith('undefined') ? undefined : url;\n};\n\nconst getLocaleStaticUrl = (locale, urlResolver) =>\n getLocaleSpecificUrl(locale, getStaticUrlHandler(urlResolver));\n\nconst appBadge = ({ alt, href, id, src }) => `\n\n \"${alt}\"\n\n`;\n\nexport const appleAppStoreBadge = ({\n highContrast,\n href,\n id,\n userLanguageCode,\n}) => {\n const src = highContrast\n ? getLocaleStaticUrl(\n userLanguageCode,\n (locale) => `img/apple-app-store/badges/${locale}-hcm.svg`\n )\n : getLocaleStaticUrl(\n userLanguageCode,\n (locale) => `img/apple-app-store/badges/${locale}.svg`\n );\n return appBadge({\n alt: html('apps.badges.appleAppStore'),\n href,\n id,\n src,\n });\n};\n\nexport const googlePlayStoreBadge = ({\n highContrast,\n href,\n id,\n userLanguageCode,\n}) => {\n const src = highContrast\n ? getLocaleStaticUrl(\n userLanguageCode,\n (locale) => `img/google-play-store/badges/${locale}-hcm.svg`\n )\n : getLocaleStaticUrl(\n userLanguageCode,\n (locale) => `img/google-play-store/badges/${locale}.svg`\n );\n return appBadge({\n alt: html('apps.badges.googlePlayStore'),\n href,\n id,\n src,\n });\n};\n","import HistoryEventListener from '../history_event_tracker/HistoryEventListener';\nexport default class AutoScroll extends HistoryEventListener {\n constructor(tracker) {\n super(tracker);\n this._cancelLoop = false;\n }\n\n onLoad(states) {\n this._checkAgain();\n this._startLoopTimer();\n }\n\n onUnload() {\n this._setScrollCookie();\n }\n\n\n /**\n * Scrolls the user down the page based on the param\n */\n _scrollUser() {\n if ($(window) && $(window).scrollTop && this.getTracker().getData(0) && this.getTracker().wasBackButtonHit() &&\n this.getTracker().getData(0).scroll) {\n $(window).scrollTop(this.getTracker().getData(0).scroll);\n }\n }\n\n /**\n * Checks if the dynamic content has been shown yet\n */\n _checkDynamicContentState() {\n var dynamicContent = $('.js-dynamic-content');\n var dynamicParent = $('.js-dynamic-parent'); // Necessary for dynamically appended content\n\n if ((dynamicParent.length || dynamicContent.length) && !dynamicContent.is(':visible') && !this._cancelLoop) {\n this._checkAgain();\n } else {\n clearTimeout(this.loopTimer);\n this._scrollUser();\n }\n }\n\n /**\n * Loop back to check for visible dynamic content\n * If requestAnimationFrame is supported check for visible content on the next frame.\n * Otherwise fallback to setTimeout\n */\n _checkAgain() {\n return !!requestAnimationFrame ?\n requestAnimationFrame(this._checkDynamicContentState.bind(this)) :\n setTimeout(this._checkDynamicContentState.bind(this), 50);\n }\n\n /**\n * Exit the loop if content does not appear within 30 seconds\n * Starts the timer to cancel the loop\n */\n _startLoopTimer() {\n this.looptimer = setTimeout(() => {\n this._cancelLoop = true;\n }, 30000);\n }\n\n _setScrollCookie() {\n if ($(window) && $(window).scrollTop) {\n this.getTracker().addDataToLatest('scroll', $(window).scrollTop());\n }\n }\n}\n","import HistoryEventListener from '../history_event_tracker/HistoryEventListener';\n/**\n * class to implement proper behavior to exit sticky rooms when the back button is hit\n * the non-cached logic is in sticky-room.js\n */\nexport default class BackButtonRedirect extends HistoryEventListener {\n constructor(tracker) {\n super(tracker);\n this._cacheFallback();\n }\n\n onLoad(states) {\n if (window.OverDrive.currentRoom) {\n this.getTracker().addDataToLatest('roomKey', window.OverDrive.currentRoom.urlPath);\n }\n else {\n this.getTracker().addDataToLatest('roomKey', 'site-default');\n }\n }\n\n\n /**\n * Delete persistent room cookie if user ends up on main site while having a preferred room\n * Only applicable when the user hits the browser's back button and the page is loaded by browser cache\n */\n _cacheFallback() {\n window.hasPreferredRoom = !!Cookies.get('preferred-room');\n if (!window.OverDrive.currentRoom && window.hasPreferredRoom) {\n Cookies.remove('preferred-room', {path: '/', domain: location.hostname});\n window.hasPreferredRoom = false;\n }\n }\n}\n","export default class Checkbox extends Backbone.View {\n template({className, name, label, ariaLabel}) {\n return `\n `;\n }\n\n get events() {\n return {\n 'change [type=checkbox]': (e) => {\n this.trigger('change', e.currentTarget.checked);\n }\n };\n }\n\n constructor({ className, name, label, ariaLabel}) {\n super(...arguments);\n\n _.extend(this, arguments[0]);\n }\n\n render() {\n this.$el.empty().append(this.template(this));\n\n this.$checkbox = this.$el.find('[type=checkbox]:first');\n\n return this;\n }\n\n set(checked) {\n this.$checkbox.prop('checked', checked).change();\n }\n}\n","import QueryString from 'querystring';\n\nexport default class HashManager {\n\n static parse() {\n let hashObject = QueryString.parse(location.hash.substr(1));\n\n _.keys(hashObject).forEach((key) => {\n hashObject[key] = _.flatten([hashObject[key] || []]);\n });\n\n return hashObject;\n }\n\n static update(object) {\n let newHash = QueryString.stringify(object);\n if (newHash !== '&'){\n location.hash = newHash;\n }\n }\n\n static get(key) {\n let response = this.parse();\n\n if (_.isString(key)) {\n return response[key];\n }\n\n return response;\n }\n\n static set(key, value) {\n let hash = this.parse();\n\n hash[key] = _.flatten([value]);\n\n this.update(hash);\n }\n\n static push(key, value) {\n let hash = this.parse();\n\n hash[key] = hash[key] || [];\n hash[key].push(value);\n\n this.update(hash);\n }\n\n static remove(key) {\n let hash = this.parse();\n\n hash[key] && delete hash[key];\n\n this.update(hash);\n }\n}\n","export default class RadioButton extends Backbone.View {\n template({value, checked, className, name, label, ariaLabel, rid}) {\n return `\n `;\n }\n\n get events() {\n return {\n 'change [type=radio]': (e) => {\n this.trigger('change', e.currentTarget.checked);\n }\n };\n }\n\n constructor({ className, name, label, ariaLabel, rid}) {\n super(...arguments);\n\n _.extend(this, arguments[0]);\n }\n\n render() {\n this.$el.empty().append(this.template(this));\n\n this.$radio = this.$el.find('[type=radio]:first');\n\n return this;\n }\n\n set(checked) {\n this.$radio.prop('checked', checked).change();\n }\n}\n","import { Modal } from './modal';\n\nclass ConfirmDialog extends Modal {\n constructor(options) {\n super(options);\n\n this.$el.append($(this.buttonTemplate));\n\n this.$buttonSubmit = this.$el.find('.button.submit');\n this.$buttonCancel = this.$el.find('.button.cancel');\n\n this.bindEvents();\n\n this._render();\n }\n\n // We dont actually want to use the Foundation modal events since they get weird fast...\n // lets use our own so consumers dont have to know its foundation\n bindEvents() {\n this.$buttonSubmit.on('click', () => {\n this.trigger('submit', this);\n this.trigger('close');\n });\n\n this.$buttonCancel.on('click', (e) => {\n this.trigger('cancel', this);\n this.trigger('close');\n }).on('keydown', (e) => e.stopPropagation);\n }\n\n get buttonTemplate() {\n return $(`\n
    \n \n \n
    \n `);\n }\n}\n\nexport default ConfirmDialog;\n","import keys from '../../util/keycodes';\nimport ModalTemplate from './templates/modal.html';\n\nclass Modal extends Backbone.View {\n\n get defaults() {\n // When the flag is enabled, closeOnEsc must always be FALSE\n // to ensure that the ESC key behavior defined in _bindEvents() executes properly.\n // Do not modify this value when calling a new modal.\n var closeModalOnEsc = window.featureManager.isEnabled('close-dropdowns-on-esc') ? false : true;\n\n return {\n autoShow : true,\n autoRender : true,\n closeOnEsc : closeModalOnEsc,\n closeOnBlur : true,\n\n id : '',\n classes : ['small'],\n buttonAlign : 'right',\n title : 'Title',\n hiddenTitle : false,\n content : 'Some Content',\n submitText : html('ok'),\n cancelText : html('cancel'),\n attachToDocument : true,\n defaultButtonBehaviour : true,\n showCloseButton : true\n };\n }\n\n initialize(options) {\n _.extend(this, this.defaults, options);\n\n this.tpl = ModalTemplate;\n this.setElement(this.tpl(this));\n\n if (this.id.length) {\n this.$el.attr('id', this.id);\n }\n\n this.$content = this.$el.find('.modal-container');\n\n this.$content.empty().append(this.content);\n\n this.$el.addClass(this.classes.join(' '));\n\n this.$title = this.$el.find('.modal-title');\n\n if (this.hiddenTitle) {\n this.$title.css(\"opacity\", \"0\");\n }\n\n if (this.autoRender) {\n this._render();\n }\n\n this._bindEvents();\n }\n\n _render() {\n if (this.attachToDocument) {\n // For Foundation to work as expected we need to have the element attached to the DOM before calling .foundation('reveal', 'open')\n $('body').append(this.el);\n }\n\n if (this.autoShow) {\n this.show();\n }\n\n return this;\n }\n\n isSelectEvent = (e) => (e.type === 'click' || e.which === 13 || e.which === 32) && (e.preventDefault() || true);\n\n // We dont actually want to use the Foundation modal events since they get weird fast...\n // lets use our own so consumers dont have to know its foundation\n _bindEvents() {\n this.$el.on('click keydown', '.js-close', (e) => {\n this.isSelectEvent(e) && this.trigger('cancel', this);\n });\n\n if (this.defaultButtonBehaviour) {\n this.on('close cancel', () => { this.close(); });\n }\n\n this.$el.on('keypress', '*', (e) => {\n if (e.which === keys.TAB) {\n this._keepFocus(e);\n }\n });\n\n if(window.featureManager.isEnabled('close-dropdowns-on-esc')) {\n // Prevent ESC from closing modal when \n ${lendingPeriods.map(\n (lendingPeriod) =>\n ``\n )}\n `,\n }\n )\n : isLuckyDayRestricted\n ? isLuckyDayHoldable\n ? window.html('luckyDay.restrictedAllowHolds', {\n days: luckyDayLendingPeriod,\n })\n : title.get('isOnHold')\n ? window.html('luckyDay.restrictedOnHold', {\n days: luckyDayLendingPeriod,\n })\n : window.html('luckyDay.restricted', {\n days: luckyDayLendingPeriod,\n })\n : lendingPeriods.first().label\n }\n \n \n \n \n
    \n ${classifications\n .map(\n (classification) =>\n `
    \n ${classification.ratingImageAlt}\n \n
    \n `\n )\n .join('')}\n
    \n
    \n ${\n showRemoveHoldOption\n ? `
    \n
    \n
    \n
    `\n : ''\n }\n ${\n removingHold\n ? `
    ${window.html(\n 'luckyDay.yourHoldRemoved'\n )}
    `\n : ''\n }\n
    \n \n
    \n ${\n isLuckyDayHoldable\n ? `
    \n \n
    `\n : ''\n }\n
    \n \n
    \n
    \n
    \n`;\n","import { Modal } from '../common/modal';\nimport PatronTitleLendingPeriods from './PatronTitleLendingPeriods';\nimport Cover from '../media/Cover';\nimport RadioButton from '../../components/common/RadioButton';\n\nimport LendingPeriodModalTemplate from './LendingPeriodModal.html';\n\nexport default class LendingPeriodModal extends Backbone.View {\n constructor({ bus, action, onError, isRenewal = false }) {\n super(...arguments);\n\n this.bus = bus;\n this.action = action || (() => {});\n this.onError = onError || (() => {});\n this.isRenewal = isRenewal;\n\n this.cover = new Cover({ model: this.model });\n // Expects a Title object as its model\n this.patronTitleLendingPeriods = new PatronTitleLendingPeriods({\n mediaId: this.model.get('id'),\n });\n this.patronTitleLendingPeriods\n .fetchData()\n .then(() => {\n const lendingPeriods =\n this.patronTitleLendingPeriods.get('lendingPeriods');\n this.model.set(\n 'titleState',\n this.isRenewal ? 'renew' : 'borrow'\n );\n this._openModal(lendingPeriods);\n })\n .catch((error) => {\n this.onError(error);\n });\n }\n\n _openModal(lendingPeriods) {\n let maybeCheckHoldStatus = new Promise((resolve) => {\n if (this.model.get('isOnHold')) {\n $.ajax({\n url: window.url(window.routes.getSingleHold, {\n mediaId: this.model.get('id'),\n }),\n type: 'GET',\n })\n .done((response) => {\n this.model.set('isReleasedHold', response.isAvailable);\n })\n .always(() => {\n resolve();\n });\n } else {\n resolve();\n }\n });\n\n maybeCheckHoldStatus.then(() => {\n let isLuckyDayRestricted =\n this.model.isLuckyDayCheckout &&\n !!window.OverDrive.LuckyDayLendingPeriodsByFormat &&\n !!window.OverDrive.LuckyDayLendingPeriodsByFormat[\n this.model.get('type').id\n ] &&\n !this.isRenewal;\n\n let isLuckyDayHoldable =\n isLuckyDayRestricted &&\n this.model.canPlaceHold &&\n !this.model.allCopiesAreLuckyDay;\n\n let luckyDayLendingPeriod;\n if (isLuckyDayRestricted) {\n luckyDayLendingPeriod =\n window.OverDrive.LuckyDayLendingPeriodsByFormat[\n this.model.get('type').id\n ];\n }\n\n let showRemoveHoldOption =\n this.model.isLuckyDayCheckout &&\n this.model.get('isOnHold') &&\n !this.model.get('isReleasedHold') &&\n isLuckyDayRestricted;\n\n let removeHold =\n this.model.isLuckyDayCheckout &&\n !showRemoveHoldOption &&\n this.model.get('isOnHold');\n\n let modalTitle;\n if (this.isRenewal) {\n modalTitle = window.html('renewal.renewHeading');\n } else if (isLuckyDayRestricted) {\n modalTitle = window.html('luckyDay.xDayLoan', {\n days: luckyDayLendingPeriod,\n });\n } else {\n modalTitle = window.html('borrow');\n }\n\n const classifications = [];\n let titleRatings = this.model.attributes.classifications;\n if (window.OverDrive.classifierIds && titleRatings) {\n for (const id of window.OverDrive.classifierIds) {\n if (titleRatings[id]) {\n const newClassification = {};\n newClassification.ratingText = window.html(\n `maturityRatings.${id}.${titleRatings[id].label} Header`\n );\n newClassification.titleRated = window.html(\n `maturityRatings.${id}.titleRated`\n );\n newClassification.ratingImage =\n titleRatings[id].imagePath;\n newClassification.ratingImageAlt = window.html(\n `maturityRatings.${id}.screenReaderRating`,\n {\n category: window.html(\n `maturityRatings.${id}.${titleRatings[id].label}`\n ),\n }\n );\n classifications.push(newClassification);\n }\n }\n }\n\n const modalContents = {\n classes: ['LendingPeriodModal', 'small'],\n title: modalTitle,\n hiddenTitle: !isLuckyDayRestricted,\n content: LendingPeriodModalTemplate({\n title: this.model,\n cover: this.cover,\n lendingPeriods: isLuckyDayRestricted ? [] : lendingPeriods,\n isRenewal: this.isRenewal,\n showRemoveHoldOption,\n removingHold: removeHold,\n isLuckyDayRestricted,\n isLuckyDayHoldable,\n luckyDayLendingPeriod,\n classifications,\n }),\n };\n this.modal = new Modal(modalContents);\n const $modalEl = this.modal.$el;\n\n if (showRemoveHoldOption) {\n new RadioButton({\n value: true,\n checked: true,\n el: '.removeHold',\n className: 'removeHoldOption',\n name: 'removeHoldOption',\n label: window.html('accountHolds.removeHoldLabel'),\n rid: 0,\n }).render();\n\n new RadioButton({\n value: false,\n el: '.stayOnHold',\n className: 'removeHoldOption',\n name: 'removeHoldOption',\n label: window.html('accountHolds.stayOnHold'),\n rid: 0,\n }).render();\n }\n\n $modalEl.on('click', '.cancel-button', () => {\n this.modal.close();\n });\n\n $modalEl.on('click', '.borrow-button', () => {\n let selectedLendingPeriod;\n if (isLuckyDayRestricted) {\n selectedLendingPeriod = {\n units: 'days',\n isPreferredLendingPeriod: false,\n lendingPeriod: luckyDayLendingPeriod,\n };\n } else {\n selectedLendingPeriod =\n lendingPeriods.length > 1\n ? lendingPeriods\n .get(\n $modalEl\n .find('.lending-period-select')\n .val()\n )\n .toJSON()\n : lendingPeriods.first().toJSON();\n }\n\n this.model.set('lendingPeriod', selectedLendingPeriod);\n\n $modalEl\n .find('.borrow-button')\n .addClass('waiting')\n .append('
    ');\n\n this.action(this.modal);\n });\n\n $modalEl.on('click', '.hold-button', () => {\n this.model.trigger('title:action', {\n action: 'hold',\n model: this.model,\n });\n $modalEl\n .find('.hold-button')\n .addClass('waiting')\n .append('
    ');\n this.bus.on('title:hold:end', () => {\n this.modal.close();\n });\n });\n\n $modalEl.on('change', '.removeHoldOption', (event) => {\n removeHold = event.target.value === 'true';\n });\n });\n }\n}\n","import '../../util/Promise';\nimport LendingPeriodCollection from './LendingPeriodCollection';\n\nconst { Logger, url, routes } = window;\n\nexport default class PatronTitleLendingPeriods extends Backbone.Model {\n defaults() {\n return {\n mediaId: 0,\n lendingPeriods: new LendingPeriodCollection()\n };\n }\n\n fetchData() {\n return Promise.ajax({\n method: 'GET',\n url: url(routes.patronLendingPeriod, {mediaId: this.get('mediaId')}),\n timeout: 10000\n })\n // Set our model but pass the data along in case the caller wants to use it for something else\n .then((response) => {\n this.get('lendingPeriods').set(response);\n return response;\n })\n // Catch errors, log them, and then let the call fail\n .catch((error) => {\n Logger.log('error', 'Failure fetching patron lending periods for title', {mediaId: this.get('mediaId'), error});\n throw error;\n });\n }\n}\n","import { toStaticUrl } from '../../../../lib/assetMapper';\n\nconst awardBadge = ({ alt, src }) =>\n `\"${alt}\"`;\n\nconst appleAppStoreAwardBadge = (highContrast) => {\n const src = highContrast\n ? 'img/apple-app-store/app-of-the-day--white.svg'\n : 'img/apple-app-store/app-of-the-day--black.svg';\n return awardBadge({ alt: html('libby.awardAppleAppStore'), src });\n};\n\nconst googlePlayStoreAwardBadge = (highContrast) => {\n const src = highContrast\n ? 'img/google-play-store/editors-choice--white.svg'\n : 'img/google-play-store/editors-choice--black.svg';\n return awardBadge({ alt: html('libby.awardGooglePlayStore'), src });\n};\n\nexport const awards = (highContrast) => `\n
    \n
    \n ${appleAppStoreAwardBadge(highContrast)}\n ${googlePlayStoreAwardBadge(highContrast)}\n
    \n
    \n`;\n","import { toStaticUrl } from '../../../../lib/assetMapper';\nimport { appleAppStoreBadge, googlePlayStoreBadge } from '../app-badge/app-badge.html';\nimport { awards } from './app-store-awards.html';\n\nconst html = (key) => window.html(key);\nconst text = (key) => window.text(key);\n\nconst getLocale = () => ((window.OverDrive && window.OverDrive._locale) || 'en').toLowerCase();\n\nconst appStoreLinks = (appleAppStoreHref, googlePlayStoreHref, highContrast) => `\n
    \n
    \n
    \n
    \n \"${html('libby.libbyIcon')}\"\n\n \n ${text('libby.libbyHeadline')}\n \n \n ${text('libby.libbyTagline')}\n \n
    \n\n \n
    \n
    \n
    \n`;\n\nconst kindleFire = ({ isKindle }) =>\n isKindle ? '' :\n `\n`;\n\nexport const libbyAppGroup = ({\n appleAppStoreHref, googlePlayStoreHref, highContrast, showAwards, showKindleFireLink, isKindle\n}) => `\n
    \n ${appStoreLinks(appleAppStoreHref, googlePlayStoreHref, highContrast)}\n ${showAwards ? awards(highContrast) : ''}\n ${showKindleFireLink ? kindleFire({ isKindle }) : ''}\n
    \n`;\n","import ContextMenuTemplate from './templates/ContextMenu.html';\nconst { featureManager, url, routes, OverDrive, text, html } = window;\n\nexport default class ContextMenu extends Backbone.View {\n template = ContextMenuTemplate;\n\n constructor() {\n super(...arguments);\n\n this.rid = Math.random().toString(36).substring(7);\n\n this.listenTo(this.model, 'change:isInHistory', () => this.render());\n\n this.render();\n }\n\n events() {\n let events = {\n 'click .js-historyAction': '_handleClick',\n 'keydown .js-historyAction': '_handleKeyHistory',\n 'keydown .js-context-button': 'toggle',\n };\n\n if (featureManager.isEnabled('cleanupContextMenuToggle')) {\n events['keyup .js-context-drop'] = '_handleKeyUpContainer';\n }\n return events;\n }\n\n _handleKeyUpContainer(e) {\n if (e.keyCode === 27 /*ESC*/) {\n this.close();\n }\n }\n\n _handleClick() {\n this.model.trigger('title:action', {\n action: 'history',\n model: this.model,\n });\n }\n\n _handleKeyHistory(e) {\n if (!window.featureManager.isEnabled('cleanupContextMenuToggle')) {\n e.stopImmediatePropagation();\n }\n\n if (e.keyCode === 13 || e.keyCode === 32) {\n if (window.featureManager.isEnabled('cleanupContextMenuToggle')) {\n e.stopImmediatePropagation();\n }\n this.model.trigger('title:action', {\n action: 'history',\n model: this.model,\n });\n }\n }\n\n get viewModel() {\n let seriesSearchUrl = '';\n if (\n !(\n this.model.isMagazine &&\n featureManager.isEnabled('magazine-rollup')\n )\n ) {\n if (\n featureManager.isEnabled('enhancedSeries') &&\n this.model.get('detailedSeries')\n ) {\n seriesSearchUrl = url(routes.searchByType, {\n type: 'seriesId',\n query: this.model.get('detailedSeries').seriesId,\n sortBy: 'readingOrder',\n });\n } else if (this.model.get('series')) {\n seriesSearchUrl = url(routes.searchByType, {\n type: 'series',\n query: this.model.get('series'),\n sortBy: 'newlyadded',\n });\n }\n }\n\n let hasMediaDoFormat = false;\n this.model.get('formats').forEach((format) => {\n if (format.id === 'ebook-media-do') {\n hasMediaDoFormat = true;\n }\n });\n\n let maturityLevel = this.model.attributes.ratings.maturityLevel.id;\n\n const relatedTitlesPageUrl = `${window.url(\n window.routes.mediaRelatedId,\n {\n id: this.model.get('id'),\n }\n )}${maturityLevel ? `?maturityLevel=${maturityLevel}` : ''}`;\n\n return {\n isOwned: this.model.get('isOwned'),\n relatedTitlesPageUrl,\n id: this.model.id,\n rid: this.rid,\n title: this.model.get('title'),\n typeId: this.model.get('type').id,\n sampleHref: this.model.get('sample').href || '',\n sampleText: this._getSampleText(),\n alignment: 'bottom',\n historyActionLabel: this._getHistoryActionLabel(),\n historyActionText: this._getHistoryActionText(),\n historyEnabled:\n OverDrive.showHistoryFeature &&\n !this.model.get('isPreReleaseTitle'),\n gaHistoryAction: this.model.get('isInHistory')\n ? 'history-remove'\n : 'history-add',\n seriesSearchUrl,\n hasMediaDoFormat,\n };\n }\n\n _getSampleText() {\n const type = this.model.get('type').id;\n\n if (type === 'audiobook' || type === 'music') {\n return text('sampleListen');\n } else if (type === 'video') {\n return text('sampleWatch');\n }\n\n return text('sampleRead');\n }\n\n _getHistoryActionLabel() {\n const title = this.model.get('title');\n if (this.model.get('isInHistory')) {\n return html('readingHistory.removeTitle', { title });\n } else {\n return html('readingHistory.addTitle', { title });\n }\n }\n\n _getHistoryActionText() {\n if (this.model.get('isInHistory')) {\n return html('readingHistory.remove');\n } else {\n return html('readingHistory.add');\n }\n }\n\n render() {\n this.$el.empty().append(this.template(this.viewModel));\n\n return this;\n }\n\n isKeyboardSelectEvent = (e) =>\n (e.which === 13 || e.which === 32) && (e.preventDefault() || true);\n\n close() {\n window.Foundation.libs.dropdown.close(\n this.$el.find('.js-context-drop')\n );\n }\n\n toggle(e) {\n if (this.isKeyboardSelectEvent(e)) {\n window.Foundation.libs.dropdown.toggle(\n this.$el.find('.js-context-button')\n );\n }\n }\n}\n","import CoverTemplate from './templates/Cover.html';\nimport NoCoverTemplate from './templates/NoCover.html';\nimport { toStaticUrl } from '../../../../lib/assetMapper';\n\nexport default class Cover extends Backbone.View {\n constructor({ coverWidths, isInHero, isTitleHistory = false }) {\n super(...arguments);\n\n this.coverWidths = _.extend(\n { mobile: 145, tablet: 160, desktop: 190 },\n coverWidths\n );\n this.isInHero = isInHero;\n this.isTitleHistory = isTitleHistory;\n\n this.listenTo(this.model, 'change', this._render);\n this._render();\n }\n\n remove() {\n $(window).off(`resize.${this.model.id}`);\n }\n\n _render() {\n const media = this.model.toJSON();\n const coverWidth = bowser.mobile\n ? this.coverWidths.mobile\n : bowser.tablet\n ? this.coverWidths.tablet\n : this.coverWidths.desktop;\n const cover = this.model.getCover(coverWidth);\n\n if (this.model.isPlaceholder) {\n let $cover = `
    `;\n this.$el.empty().append($cover);\n } else if (cover && cover.href) {\n let $cover = $(\n CoverTemplate({\n media,\n coverColor:\n (cover &&\n cover.primaryColor &&\n cover.primaryColor.hex) ||\n 'inherit',\n src: cover && cover.href,\n href: this.model.titleDetailsUrl,\n label: window.text('cover.coverImageLabel', {\n title: media.title,\n creator: media.firstCreatorName,\n }),\n noSampleClass:\n media.sample.href == null ? 'is-noSample' : '',\n srcset: cover && cover.srcset,\n })\n );\n\n // LHTNG-2105: In the event that an image fails to load, wipe out the href's and update the model to trigger a render()\n $cover.find('img').on('error', () => {\n let imagesRemoved = JSON.parse(\n JSON.stringify(this.model.attributes.covers)\n );\n\n _(imagesRemoved).each((image) => {\n delete image.href;\n });\n\n this.model.set({ covers: imagesRemoved });\n });\n\n this.$el.empty().append($cover);\n } else if (this.isTitleHistory) {\n this.$el.empty().append(\n `\n \"${window.html('coverImageForTitle',\n `\n );\n } else {\n let creatorText = this.model.isMagazine\n ? this.model.get('edition')\n : this.model.get('firstCreatorName');\n this.$el.empty().append(\n NoCoverTemplate({\n media,\n href: this.model.titleDetailsUrl,\n isInHero: this.isInHero,\n coverWidth: coverWidth,\n coverHeight: (coverWidth * 293) / 220,\n creatorText: creatorText,\n })\n );\n $(window).on(\n `resize.${this.model.id}`,\n _.bind(\n this._manageOverflow,\n this,\n '.CoverImageContainer .noCoverAvailable .title',\n this.model.get('title')\n )\n );\n $(window).on(\n `resize.${this.model.id}`,\n _.bind(\n this._manageOverflow,\n this,\n '.CoverImageContainer .noCoverAvailable .author',\n creatorText\n )\n );\n $(window).on(\n `resize.${this.model.id}`,\n _.bind(this._resizeClearImage, this)\n );\n\n // timeout gives browser chance to draw and set innerHTML values used\n setTimeout(() => {\n this._manageOverflow(\n '.CoverImageContainer .noCoverAvailable .title',\n this.model.get('title')\n );\n this._manageOverflow(\n '.CoverImageContainer .noCoverAvailable .author',\n creatorText\n );\n this._resizeClearImage();\n }, 1);\n }\n\n return this;\n }\n\n _resizeClearImage() {\n const image = this.el.querySelector('img');\n if (image) {\n $(image).height(($(image).parent().width() * 293) / 220);\n }\n }\n _manageOverflow(selector, resetText) {\n const element = this.el.querySelector(selector);\n if (element) {\n element.innerHTML = resetText;\n if (selector.indexOf('.title') !== -1) {\n if ($(element).width() < 100) {\n $(element).css('font-size', '14px');\n } else if (\n $(element).width() < 125 &&\n $(element).width() >= 100\n ) {\n $(element).css('font-size', '16px');\n } else if (\n $(element).width() < 150 &&\n $(element).width() >= 125\n ) {\n $(element).css('font-size', '18px');\n } else if ($(element).width() >= 150) {\n $(element).css('font-size', '20px');\n }\n } else if (selector.indexOf('.author') !== -1) {\n if ($(element).width() < 110) {\n $(element).css('font-size', '10px');\n } else if (\n $(element).width() < 135 &&\n $(element).width() >= 110\n ) {\n $(element).css('font-size', '12px');\n } else if (\n $(element).width() < 160 &&\n $(element).width() >= 135\n ) {\n $(element).css('font-size', '14px');\n } else if ($(element).width() >= 160) {\n $(element).css('font-size', '16px');\n }\n }\n if (\n element.scrollHeight > 0 &&\n element.scrollHeight > element.clientHeight\n ) {\n let text = element.innerHTML;\n text = `${text.replace(/\\W+$/g, '')}...`; // remove trailing special characters and add ellipsis\n while (\n text !== '...' &&\n element.scrollHeight > element.clientHeight\n ) {\n text = text.replace(/\\W*\\w\\W*(\\.{3})$/g, '$1'); // remove a non-ellipsis character and unwanted characters around itΩ\n element.innerHTML = text;\n }\n // todo: put a min width an height on this! We know what the heights are for particular screen widths\n }\n }\n }\n}\n","import MediaParameters from '../../../../models/dao/MediaParameters';\nimport TitleCollection from './models/TitleCollection';\n\nexport default class MediaInterface {\n\n constructor() {\n _.extend(this, Backbone.Events);\n\n this.items = new TitleCollection();\n this.facets = {};\n this.sortOptions = [];\n }\n\n quickSearch(term, options) {\n return this._fetch(_.extend({}, { query: term }, options));\n }\n\n search(parameters, options) {\n return this._fetch(_.extend({}, parameters, options));\n }\n\n fetchCollectionById(id, options) {\n return this._fetch(_.extend({}, { collectionId: id }, options));\n }\n\n fetchCollectionByParameters(collectionFilters, options) {\n return this._fetch(_.extend({}, collectionFilters, options));\n }\n\n /** Utility function to simulate a data call, but deliberatley return an empty result set */\n fetchEmptyResponse() {\n this.trigger('sync:start', this, { mediaParameters: null });\n\n let emptyResponse = {\n items : [],\n facets : {},\n sortOptions : []\n };\n\n this._fetchDone(emptyResponse, 'synthetic');\n\n this.trigger('sync:end', this);\n\n return Promise.resolve(emptyResponse);\n }\n\n /**\n * @param {MediaParameters} parameters\n * @memberof MediaInterface\n */\n _fetch(parameters) {\n\n if (!parameters){\n parameters = {};\n }\n\n // if a title id is specificed then no facets will be calculated regardless of the params sent.\n if (!parameters.includedFacets && !parameters.titleId){\n parameters.includedFacets = window.OverDrive.supportedFacets;\n }\n\n if (window.featureManager.isEnabled('LuckyDay') && parameters.shuffle){\n const sorts = ['mostpopular', 'releasedate', 'title', 'author', 'newlyadded', 'lowcirculating', 'mostpopular-site'];\n parameters.sortBy = sorts[Math.floor(Math.random() * sorts.length)];\n }\n\n let mediaParameters = new MediaParameters(parameters);\n\n if (!!window.OverDrive.showOnlyAvailable) {\n mediaParameters.showOnlyAvailable = true;\n }\n\n this.trigger('sync:start', this, { mediaParameters });\n\n return new Promise((resolve, reject) => {\n $.ajax({\n url: window.url(window.routes.rest.media.index),\n method : 'POST',\n dataType: 'json',\n contentType: 'application/json; charset=utf-8',\n data : JSON.stringify(mediaParameters.serialize()),\n timeout: 10000\n })\n .done((data, textStatus, jqXHR) => {\n if (window.featureManager.isEnabled('LuckyDay') && parameters.shuffle){\n data.items = data.items && _.shuffle(data.items);\n }\n if (window.featureManager.isEnabled('only-show-owned-content') && data.items) {\n data.items = data.items.filter((x) => x.isOwned === true);\n }\n this._fetchDone(data, textStatus, jqXHR);\n this.trigger('sync:end', this);\n resolve(data);\n })\n .fail((jqXHR, textStatus, errorThrown) => {\n this._fetchFail(jqXHR, textStatus, errorThrown);\n this.trigger('sync:end', this);\n reject(jqXHR);\n });\n });\n }\n\n _fetchDone(data, textStatus, jqXHR) {\n this.items.reset(data.items);\n this.trigger('sync:success', this, { data, textStatus, jqXHR });\n }\n\n _fetchFail(jqXHR, textStatus, errorThrown) {\n this.trigger('sync:fail', this, { jqXHR, textStatus, errorThrown });\n }\n}\n","export default class TitleActionButton extends Backbone.View {\n constructor({ type = 'link', action, style }) {\n super(...arguments);\n\n this.type = type;\n\n this.hasCustomAction = false;\n if (!!action) {\n this.action = action;\n this.hasCustomAction = true;\n }\n\n this.style = style;\n\n this.$button = $('\n
    \n`;\n","const { html } = window;\n\nexport default({heading, src, isLuckyDay}) => `\n
    \n
    ${heading}\n ${isLuckyDay ?\n `
    \n
    \n \n
    \n
    `\n : ''}\n
    \n
    \n\n
    \n \"${html('coverImage')}\"/\n
    \n\n
    \n \n \n
    \n`;\n","export default ({ seeMoreLink }) => `\n
    ${window.html(\n 'holdSuccessModal.wantToBorrowSubheading'\n )}
    \n\n
    \n\n \n`;\n","\nconst { html, text, url, routes } = window;\n\nexport default ({successMessageTextKey, manageHoldsUrl, email, titleModel, creatorSearchUrl, holdsInfo, ownedCopies, macmillanMessage}) => `\n

    ${titleModel.title}

    \n
    \n ${text('byLine', {creator: `${titleModel.firstCreatorName}`})}\n
    \n
    \n ${holdsInfo}\n
    \n
    \n ${ ownedCopies !== 0\n ? html(successMessageTextKey, {email: email, manageHoldsLink: `${window.html('holdSuccessModal.manageHolds')}`}) \n : ``}\n
    \n ${(macmillanMessage && macmillanMessage.length > 0) ? `

    ${macmillanMessage}

    ` :``}\n
    \n
    \n
    `;\n","import { toStaticUrl } from '../../../../../lib/assetMapper';\n\nexport default ({ media, href, isInHero, coverWidth, coverHeight, creatorText }) => `\n\n\n`;\n","const { html, text } = window;\n\nexport default ({ title, type, coverSrc, id, isPreReleaseTitle, prereleaseDate, ownedCopies, libraryName, isRequestAgain }) => `\n
    \n

    ${ title }

    \n ${ html(type.id) }\n
    \n\n
    \n \"${\n
    \n\n
    \n
    \n ${(!isPreReleaseTitle ? '' :\n `

    ${ text('prereleaseLabel', { prereleaseDate }) }

    `\n )}\n

    \n ${(ownedCopies === 0\n ? html('holdsRatioHelpModal.noCopiesText')\n : isRequestAgain ?\n html('requestAgainModal.requestAgainDesc', { libraryName }) :\n html('dynamicHoldModal.placeHoldDesc', { libraryName })\n )}\n

    \n\n \n ${ html('emailRequiredError') }\n\n \n ${ html('emailsMustMatchError') }\n
    \n
    \n\n
    \n \n \n
    \n
    \n`;\n","export default ({text, ariaLabel, removeButton, cancelButton}) => `\n

    ${text}

    \n \n
    \n \n \n
    \n`;\n","export default ({ geoIdcClass }) => `\n
    \n
    \n\n
    \n\n
    \n
    \n\n
    \n\n
    \n
    \n\n
    \n
    `;\n","export default ({typeId}) => `\n${typeId ? `\n ${window.html(typeId)}\n` : '' }\n`;\n","export default ({ titleId, title, href, ariaLabel }) => `

    \n \n ${ title }\n \n

    `;\n","export default ({ga, contrastClass, ariaLabel, iconClass, text, iconAnimationClasses}) => `\n`;\n","import { Modal } from '../../common/modal';\nimport DownloadWarningTemplate from '../templates/DownloadWarningModal.html';\n\nlet featureManager = window.featureManager;\n\nconst { _locale, supportArticles } = window.OverDrive;\nconst { Cookies } = window;\n\nconst isIpadInApp = !!(\n featureManager.isEnabled('stop-treating-ipad-like-mac') &&\n window.navigator.userAgent.match(/App Store OverDrive Media Console/)\n);\nconst isMac = !!(\n window.navigator.userAgent.match(/Mac/) &&\n !bowser.ios &&\n !isIpadInApp\n);\nconst isWindows =\n !!(window.navigator.userAgent.match(/Win/) && !bowser.windowsphone) &&\n !window.OverDrive.isTolinoDevice;\nconst isWindows8AndUp = !!window.navigator.userAgent.match(\n /(Windows 10.0|Windows NT 10.0|Windows 8.1|Windows NT 6.3|Windows 8|Windows NT 6.2)/\n);\nconst inApp = Cookies.get('omcbrowse') !== undefined;\nconst isWindowsPhone10AndUp = !!(\n bowser.windowsphone && parseInt(bowser.osversion, 10) >= 10.0\n);\nconst isWindowsPhone8 = !!(\n bowser.windowsphone && parseInt(bowser.osversion, 10) < 10.0\n);\n\nexport default class DownloadWarningModal extends Backbone.View {\n initialize(el) {\n let format = el.data('format-id');\n let mediaId = el.data('mediaId');\n\n let warning = this.getWarning(format);\n let downloadUrl = window.url(window.routes.mediaDownload, {\n format,\n mediaId,\n });\n\n if (warning !== '' && !this.isWarningCookieSet(warning)) {\n let viewData = { message: this.warningText(warning), downloadUrl };\n\n const content = $(DownloadWarningTemplate(viewData));\n\n this.modal = new Modal({\n title: html('downloadWarningModal.heading'),\n content: content,\n });\n\n this.modal.show();\n\n this.modal.$el.find('.cancel').on('click', () => {\n this.modal.close();\n });\n this.modal.$el.find('.confirm').on('click', () => {\n this.setWarningCookie(warning);\n this.modal.close();\n });\n } else if (format === 'ebook-media-do') {\n if (inApp) {\n window.location.href = downloadUrl;\n } else {\n window.open(downloadUrl, '_blank', 'noreferrer');\n }\n } else {\n // if no warning needs displayed, download title\n window.location.href = downloadUrl;\n }\n }\n\n warningText(warning) {\n switch (warning) {\n case 'ODapp':\n return html('downloadWarningModal.required', {\n link:\n '' +\n html('overdriveApp') +\n '',\n });\n case 'ADE':\n return html('downloadWarningModal.required', {\n link:\n 'Adobe Digital Editions',\n });\n case 'ODapp-epub':\n return html('downloadWarningModal.epubRequired', {\n link:\n '' +\n html('overdriveApp') +\n '',\n });\n case 'video':\n return html('downloadWarningModal.youMayNeedOdApp', {\n link:\n '' +\n html('overdriveApp') +\n '',\n });\n case 'msedge':\n return html('downloadWarningModal.mayWorkOnDiffBrowser', {\n link1:\n 'Internet Explorer',\n link2:\n 'Chrome',\n });\n case 'ODread':\n return html('downloadWarningModal.messageForODRead');\n case 'Libby':\n return html('downloadWarningModal.libbyRequired', {\n link:\n '' +\n html('libby.libbyApp') +\n '',\n });\n case 'notSupported':\n return html('downloadWarningModal.notSupported', {\n link:\n '' +\n html('narratedModal.learnMore') +\n '',\n });\n }\n }\n\n getWarning(format) {\n let warning = '';\n if (format === 'ebook-epub-adobe') {\n if (isMac) {\n warning = 'ADE';\n } else if (isWindows && !inApp) {\n warning = 'ADE';\n } else if (\n (bowser.ios ||\n (bowser.android && !window.OverDrive.isTolinoDevice)) &&\n !inApp\n ) {\n warning = 'ODapp';\n } else if (isWindowsPhone10AndUp && !inApp) {\n warning = 'Libby';\n } else if (isWindowsPhone8 && !inApp) {\n warning = 'notSupported';\n }\n } else if (\n format === 'ebook-pdf-adobe' &&\n (isMac || (isWindows && !inApp))\n ) {\n warning = 'ADE';\n } else if (format === 'ebook-epub-open') {\n if (isMac) {\n warning = 'ADE';\n } else if (isWindows && !inApp) {\n warning = 'ADE';\n } else if (\n (bowser.ios ||\n (bowser.android && !window.OverDrive.isTolinoDevice)) &&\n !inApp\n ) {\n warning = 'ODapp-epub';\n } else if (isWindowsPhone10AndUp && !inApp) {\n warning = 'Libby';\n } else if (isWindowsPhone8 && !inApp) {\n warning = 'notSupported';\n }\n } else if (\n format === 'audiobook-mp3' &&\n !(featureManager.isEnabled('odapp-sunset') && !inApp)\n ) {\n if (\n ((bowser.ios || bowser.android) && !inApp) ||\n isMac ||\n (isWindows && !inApp)\n ) {\n warning = 'ODapp';\n } else if (isWindowsPhone10AndUp && !inApp) {\n warning = 'Libby';\n } else if (isWindowsPhone8 && !inApp) {\n warning = 'notSupported';\n }\n }\n return warning;\n }\n\n isWarningCookieSet(warning) {\n const cookie = Cookies.get('no-device-warning');\n if (cookie === undefined) {\n return false;\n } else {\n let arr = cookie.split(';');\n return arr.indexOf(warning) > -1;\n }\n }\n\n setWarningCookie(warning) {\n let cookie = Cookies.get('no-device-warning');\n if (cookie === undefined) {\n Cookies.set('no-device-warning', warning + ';', {\n path: '/',\n expires: 365,\n overwrite: true,\n });\n } else {\n Cookies.set('no-device-warning', cookie + warning + ';', {\n path: '/',\n expires: 365,\n overwrite: true,\n });\n }\n }\n}\n","const Backbone = window.Backbone;\n\nimport { Modal } from '../../common/modal';\nimport TitleActionButton from '../TitleActionButton';\nimport HoldConflictPanel from '../templates/HoldConflictPanel.html';\nimport Popover from '../../../components/popover/popover';\n\nconst HoldConflictModal = Backbone.View.extend({\n initialize(bus, titleModel, options = {}) {\n this.bus = bus;\n\n const viewData = {\n heading: window.html(!!options.isLuckyDay ? 'nowUnavailableModal.luckyDayNotAvailableHtml' :\n 'nowUnavailableModal.isNotCurrentlyAvailableHtml',\n {span: `${titleModel.get('title')}`}),\n src: titleModel.getCoverSrc(510),\n isLuckyDay: !!options.isLuckyDay\n };\n\n let modalContents = {\n autoShow: false,\n title: window.html('nowUnavailableModal.heading'),\n classes: ['now-unavailable-modal'],\n content: HoldConflictPanel(viewData),\n id: 'now-unavailable-modal',\n labelledBy: 'now-unavailable-modal-title'\n };\n this.modal = new Modal(modalContents);\n\n this.modal.$('.js-cancel').on('click', () => {\n this.modal.close();\n });\n\n this.listenTo(this.bus, 'title:hold:fail', () => {\n this.modal.close ();\n });\n\n this.titleActionButton = new TitleActionButton({ model: titleModel, type: 'button', el: this.modal.$('.TitleAction'), style: 'fill' });\n\n this.modal.show();\n\n if (options.isLuckyDay){\n this.ldtooltip = new Popover({\n target: this.modal.$el.find('#luckyDayTooltip'),\n contents: `

    ${html('nonHoldConflictModal.luckyDayInfo')}

    `\n });\n }\n }\n});\n\nmodule.exports = HoldConflictModal;\n","import { Modal } from '../../common/modal';\nimport PlaceHoldPanel from './PlaceHoldPanel';\n\nexport default class HoldModal extends Backbone.View {\n constructor({ bus, titleModel, context }) {\n super(...arguments);\n this.bus = bus;\n\n this.placeHoldPanel = new PlaceHoldPanel({ bus, titleModel, context, isRequestAgain: !!context.isRequestAgain });\n\n this.modal = new Modal({\n autoShow : false,\n title : window.html('dynamicHoldModal.placeAHold'),\n classes : ['small', 'HoldModal'],\n content : this.placeHoldPanel.$el,\n firstFocus : this.placeHoldPanel.$el.find('.js-first-focus')\n });\n\n this.modal.show();\n\n this.listenTo(this.bus, 'title:hold:end', () => { this.modal.close(); });\n }\n}\n","import TitleCard from '../TitleCard';\nimport TitleCollection from '../models/TitleCollection';\nimport TitleCollectionView from '../TitleCollectionView';\nimport HoldInformation from '../../holdInformation/views/HoldInformation';\nimport ContainerTemplate from '../templates/HoldSuccessTemplate.html';\nimport { Modal } from '../../common/modal';\n\nconst { featureManager, text } = window;\nconst fs = require('fs');\nconst path = require('path');\nconst containerTemplateHtml = fs.readFileSync(\n path.join(__dirname, '../templates/HoldSuccess.html'),\n 'utf8'\n);\nimport relatedTitlesTemplate from '../templates/HoldSuccessRelatedTitles.html';\nimport MacmillanMessage from '../../../../../lib/utility/macmillanMessage';\n\nexport default class HoldSuccessModal extends Backbone.View {\n topLevelTemplate = featureManager.isEnabled('fixHtmlTagsInCopy')\n ? ContainerTemplate\n : _.template(containerTemplateHtml);\n\n constructor({ bus, titleModel, email, autoCheckoutEnabled }) {\n super();\n this.bus = bus;\n this.titleModel = titleModel;\n this.email = email;\n this.autoCheckoutEnabled = autoCheckoutEnabled;\n this.collection = new TitleCollection();\n this.maturityLevel = titleModel.attributes.ratings.maturityLevel.id;\n\n this.collection.url = `${window.url(\n window.routes.rest.media.availableRelated,\n { id: titleModel.id }\n )}?max=4${\n this.maturityLevel ? `&maturityLevel=${this.maturityLevel}` : ''\n }`;\n this.collection.parse = (response) => {\n let collectionTitles = response.titles;\n if (\n window.featureManager.isEnabled('only-show-owned-content') &&\n response.titles\n ) {\n collectionTitles = response.titles.filter(\n (x) => x.isOwned === true\n );\n }\n return _.values(collectionTitles);\n };\n this.ownedCopies = this.titleModel.get('ownedCopies') || 0;\n this.macmillanMessage = MacmillanMessage(this.titleModel);\n\n this.renderContainer();\n this.$titleContainer = this.$('.relatedTitlesContainer');\n\n const waypoint = new window.Waypoint.Inview({\n element: this.$titleContainer,\n enter: () => {\n waypoint.destroy();\n this.fetchRelatedTitles();\n },\n });\n\n let modalContents = {\n autoShow: false,\n title: html('genericSuccess'),\n classes: ['large, HoldSuccessModal'],\n content: this.$el,\n };\n\n this.modal = new Modal(modalContents);\n this.modal.show();\n }\n\n fetchRelatedTitles() {\n this.collection\n .fetch()\n .then((res) => {\n if (_(res.titles).isEmpty()) {\n this.$titleContainer.empty();\n return;\n }\n this.renderRelatedTitles();\n })\n .fail(() => {\n this.$titleContainer.empty();\n });\n }\n\n getHoldInfoHtml() {\n if (featureManager.isEnabled('LHTNG-2863')) {\n let note = null;\n let isExpired = featureManager.isEnabled('dont-mark-su-as-expired')\n ? this.titleModel.isExpired\n : this.titleModel.get('isOwned') &&\n !this.titleModel.get('ownedCopies');\n\n if (isExpired) {\n note = `${text(\n 'holdsRatioHelpModal.noCopiesOnPlaceHold'\n )}${text(\n 'holdSuccessModal.manageHolds'\n )}`;\n } else if (this.titleModel.get('isFastlane')) {\n note = text('expectedWaitTime.advantageCaveat');\n } else if (window.OverDrive.isVisitor) {\n note = text('expectedWaitTime.rlaCaveat');\n }\n\n return `

    \n ${text(\n 'expectedWaitTime.holdPositionLabel'\n )}\n ${text('accountHolds.holdListPosition', {\n holdListPosition:\n this.titleModel.get('holdListPosition'),\n ownedCopies: this.titleModel.get('ownedCopies'),\n })}\n

    \n ${\n note\n ? `

    ${text(\n 'note'\n )}${note}

    `\n : ''\n }`;\n } else {\n let info = new HoldInformation({\n model: this.titleModel,\n type: 'successPosition',\n }).render();\n return info.$el.html();\n }\n }\n\n renderRelatedTitles() {\n this.$titleContainer.empty();\n\n const seeMoreLink = `${window.url(window.routes.mediaRelatedId, {\n id: this.titleModel.attributes.id,\n })}${this.maturityLevel ? `?maturityLevel=${this.maturityLevel}` : ''}`;\n\n this.$titleContainer.append(relatedTitlesTemplate({ seeMoreLink }));\n\n this.titleCollectionView = new TitleCollectionView({\n el: this.$titleContainer.find('.relatedTitles'),\n bus: this.bus,\n View: TitleCard,\n attributes: {\n class: 'titleContainer small-block-grid-2 medium-block-grid-4 large-block-grid-4',\n },\n collection: this.collection,\n coverWidths: { mobile: 150, tablet: 185, desktop: 220 },\n });\n }\n\n renderContainer() {\n let searchByCreatorUrl = window.url(window.routes.searchByType, {\n type: 'creatorId',\n query: this.titleModel.get('firstCreatorId'),\n sortBy: 'newlyadded',\n });\n\n this.$el.append(\n this.topLevelTemplate({\n successMessageTextKey:\n this.autoCheckoutEnabled &&\n !featureManager.isEnabled('holdRedelivery')\n ? 'toasts.holdSuccessAutoCheckoutHtml'\n : 'toasts.holdSuccessHtml',\n manageHoldsUrl: window.url(window.routes.accountHolds),\n email: this.email,\n titleModel: this.titleModel.attributes,\n creatorSearchUrl: searchByCreatorUrl,\n holdsInfo: this.getHoldInfoHtml(),\n ownedCopies: this.ownedCopies,\n macmillanMessage: this.macmillanMessage,\n })\n );\n }\n}\n","const Backbone = window.Backbone;\n\nimport ConfirmDialog from '../../common/confirmDialog';\nimport { toStaticUrl } from '../../../../../lib/assetMapper';\n\nconst fs = require('fs');\nconst path = require('path');\nconst NookEulaTemplate = fs.readFileSync(path.join(__dirname, '../templates/NookEula.html'), 'utf8');\n\nconst NookEulaModal = Backbone.View.extend({\n template: _.template(NookEulaTemplate),\n\n initialize(bus, titleModel) {\n this.bus = bus;\n\n const viewData = {\n bnLogoUrl: toStaticUrl('img/bn-logo.jpg'),\n html: window.html,\n text: window.text\n };\n\n this.$el.html(this.template(viewData));\n\n let modalContents = {\n autoShow: false,\n submitText: window.html('nookEULAModal.acceptToContinue'),\n title: window.html('sendToNook'),\n classes: ['small', 'NookEulaModal'],\n content: this.$el\n };\n\n this.modal = new ConfirmDialog(modalContents);\n\n this.modal.show();\n\n this.modal.on('submit', () => this.bus.trigger('title:nook:eula-accepted', { title: titleModel }));\n\n this.listenTo(this.bus, 'title:nook:end', () => { this.modal.close(); });\n }\n});\n\nmodule.exports = NookEulaModal;\n","import TitleActionButton from '../TitleActionButton';\nimport PlaceHoldPanelTemplate from '../templates/PlaceHoldPanel.html';\n\nexport default class PlaceHoldPanel extends Backbone.View {\n template = PlaceHoldPanelTemplate\n\n constructor({ bus, titleModel, context, isRequestAgain = false }) {\n super(...arguments);\n\n this.titleModel = titleModel;\n this.context = context;\n this.bus = bus;\n this.card = window.card;\n this.isRequestAgain = isRequestAgain;\n\n this.card._fetch.then(() => {\n this.render();\n this._bindEvents();\n });\n }\n\n render() {\n const viewData = {\n title : this.titleModel.get('title'),\n type : this.titleModel.get('type'),\n coverSrc : this.titleModel.getCoverSrc(510),\n id : this.titleModel.id,\n isPreReleaseTitle : this.titleModel.get('isPreReleaseTitle'),\n prereleaseDate : this.titleModel.get('estimatedReleaseDate'),\n ownedCopies : this.titleModel.get('ownedCopies'),\n //Should fix the issue with the apostrophe's not properly encoding. \n libraryName : String(window.OverDrive.libraryName).replace(''', '\\''),\n html : window.html,\n text : window.text,\n isRequestAgain : this.isRequestAgain\n };\n\n this.$el.html(this.template(viewData));\n\n this.$form = this.$el.find('form');\n\n if (this.titleModel.isLuckyDayCheckout) {\n this.titleModel.set('titleState', 'hold');\n }\n\n this.titleActionButton = new TitleActionButton({\n model : this.titleModel,\n type : 'button',\n el : this.$form.find('.TitleAction'),\n action : () => this.$form.submit()\n });\n }\n\n _bindEvents() {\n this.$form\n .foundation('abide', 'reflow')\n .on('valid.fndtn.abide', () => {\n this.card.setHoldEmail(this.$el.find('input[type=\"email\"]:first').val().trim());\n this.bus.trigger('title:hold', this.titleModel, this.context);\n });\n }\n}\n","import { Modal } from '../../common/modal';\nimport RemoveHistoryModalTemplate from '../templates/RemoveHistory.html';\n\nexport default class RemoveHistoryModal extends Backbone.View {\n initialize({bus, title, action}) {\n this.bus = bus;\n this.action = action || (() => {});\n\n const viewData = {\n text : window.html('readingHistory.removeWarning'),\n ariaLabel : window.html('readingHistory.removeTitle', { title: title.attributes.title }),\n removeButton : window.html('readingHistory.remove'),\n cancelButton : window.html('cancel')\n };\n\n const content = $(RemoveHistoryModalTemplate(viewData));\n\n let modalContents = {\n autoShow: false,\n title: window.html('readingHistory.remove'),\n content: content,\n id: 'removeHistoryModal'\n };\n\n this.modal = new Modal(modalContents);\n\n this.modal.$el.find('.js-cancel').on('click', () => {\n this.modal.close();\n });\n\n this.modal.$el.find('.js-remove-history').on('click', () => {\n this.action();\n this.modal.close();\n });\n\n this.modal.show();\n }\n}\n","import ContextMenu from '../ContextMenu';\nimport TitleAuthor from './TitleInfo/TitleAuthor';\nimport TitleEdition from './TitleInfo/TitleEdition';\nimport TitleName from './TitleInfo/TitleName';\nimport TitleFormatBadge from './TitleInfo/TitleFormatBadge';\n\nexport default class TitleInfo extends Backbone.View {\n get className() {\n return 'title-info';\n }\n\n constructor() {\n super(...arguments);\n this._views = [];\n\n this.render();\n }\n\n _reset() {\n this._views.forEach((view) => view.remove());\n this._views = [];\n }\n\n remove() {\n this._reset();\n super.remove();\n }\n\n render() {\n this._reset();\n\n this._views.push(\n (this.titleName = new TitleName({ model: this.model }))\n );\n\n if (!window.featureManager.isEnabled('geo-idc')) {\n this._views.push(\n (this.contextMenu = new ContextMenu({ model: this.model }))\n );\n this.contextMenu.$el.addClass('text-right');\n }\n if (this.model.isMagazine) {\n this._views.push(\n (this.titleEdition = new TitleEdition({ model: this.model }))\n );\n } else if (!window.featureManager.isEnabled('geo-idc')) {\n this._views.push(\n (this.titleAuthor = new TitleAuthor({ model: this.model }))\n );\n }\n\n this._views.push(\n (this.titleFormatBadge = new TitleFormatBadge({\n typeId: this.model.get('type').id,\n }))\n );\n\n this.$el.empty();\n this.$el.append(...this._views.map((view) => view.$el));\n }\n}\n","const Backbone = window.Backbone;\nconst featureManager = window.featureManager;\n\nconst fs = require('fs');\nconst path = require('path');\nconst TitleAuthorTemplate = fs.readFileSync(path.join(__dirname, '../../templates/TitleAuthor.html'), 'utf8');\n\nconst TitleAuthor = Backbone.View.extend({\n template: _.template(TitleAuthorTemplate),\n\n className: 'title-author',\n\n tagName: 'p',\n\n initialize() {\n if (this.model.get('type').id !== 'periodicals') {\n this.render();\n }\n },\n\n render() {\n let title = this.model.toJSON();\n\n if (title.firstCreatorName != null && !_.isEmpty(title.firstCreatorName)) {\n let creatorName = featureManager.isEnabled('fixHtmlTagsInCopy') ? title.firstCreatorName : _.escape(title.firstCreatorName);\n\n const viewData = {\n href : window.url(window.routes.searchByType, { type: 'creatorId', query: title.firstCreatorId, sortBy: 'newlyadded' }),\n label : window.text('cover.searchByAuthor', { author: creatorName }),\n text : creatorName\n };\n\n this.$el.html(window.text('byLine', { creator: this.template(viewData) }));\n }else{\n if(!featureManager.isEnabled('no-author-fix')){\n this.$el.html(window.html('cover.noAuthorAvailable'));\n }\n }\n }\n\n});\n\nexport default TitleAuthor;\n","\nexport default class TitleEdition extends Backbone.View {\n constructor() {\n super(...arguments);\n this.render();\n }\n\n render() {\n let node = $(`
    ${this.model.get('edition')}
    `);\n this.setElement(node);\n }\n}\n","import TitleFormatBadgeTemplate from '../../templates/TitleFormatBadge.html';\n\nconst TitleFormatBadge = Backbone.View.extend({\n initialize({typeId}) {\n this.typeId = typeId;\n this.render();\n },\n\n render() {\n this.setElement($(TitleFormatBadgeTemplate({typeId: this.typeId})));\n }\n});\n\nexport default TitleFormatBadge;\n","import TitleNameTemplate from '../../templates/TitleName.html';\n\nexport default class TitleName extends Backbone.View {\n constructor() {\n super(...arguments);\n\n this.template = TitleNameTemplate;\n this.render();\n }\n\n _assembleLabel() {\n let labelParts = [];\n\n labelParts.push(this.model.get('title'));\n\n if (!!this.model.get('firstCreatorName')) {\n labelParts.push(window.html('byLine', {creator: this.model.isMagazine ? this.model.get('publisher').name : this.model.get('firstCreatorName')}));\n }\n\n labelParts.push(this.model.availabilityText());\n\n labelParts.push(this.model.get('type').name);\n\n return labelParts.join(' ');\n }\n\n render() {\n const viewData = {\n titleId : this.model.id,\n href : this.model.titleDetailsUrl,\n ariaLabel : _.escape(this._assembleLabel()),\n title : this.model.get('title')\n };\n \n this.setElement($(this.template(viewData)));\n }\n}\n\n","import AccountMenuMobileView from './views/account_menu_mobile';\n\nconst createComponent = ({el}) => {\n const view = new AccountMenuMobileView({el}); // eslint-disable-line no-unused-vars\n window.AccountMenuMobileView = view;\n};\n\nexport default createComponent;\n","import BaseView from '../../../views/base';\n\nconst AccountMenuMobileView = BaseView.extend({\n events: {\n 'click .js-account-menu-link': 'toggleAccountDropdown'\n },\n initialize({el}) {\n this.el = el;\n this.$accountMenuLink = $('.js-account-menu-link');\n this.$accountMenuContent = $('.js-account-menu-mobile');\n },\n open() {\n $('.icon-account.mobile').addClass('secondary-color');\n this.$accountMenuLink.add(this.$accountMenuContent[0]).addClass('is-open');\n\n // Close all open foundation dropdowns. hopefully we can kill this eventually.\n $(document).foundation('dropdown', 'close', $('[data-dropdown-content]'));\n if (toaster) toaster._stickToast();\n },\n close() {\n $('.icon-account.mobile').removeClass('secondary-color');\n this.$accountMenuLink.add(this.$accountMenuContent[0]).removeClass('is-open');\n if (toaster) toaster._stickToast();\n },\n toggleAccountDropdown() {\n if (this.$accountMenuLink.hasClass('is-open')) {\n this.close();\n } else {\n this.open();\n }\n }\n});\n\nexport default AccountMenuMobileView;\n","import { Modal } from '../common/modal';\nimport template from './NonHoldConlictModal.html';\nimport TitleCard from '../media/TitleCard';\nimport TitleCollection from '../media/models/TitleCollection';\nimport TitleCollectionView from '../media/TitleCollectionView';\nimport relatedTitlesTemplate from '../media/templates/HoldSuccessRelatedTitles.html';\nimport Popover from '../../components/popover/popover';\n\nconst { html } = window;\n\nexport default class NonHoldConflictModal extends Modal {\n constructor(titleModel, options = {}) {\n const message = html(\n options.isLuckyDay\n ? 'nonHoldConflictModal.luckyDayMessageHtml'\n : 'nonHoldConflictModal.messageHtml',\n {\n title: `${titleModel.get(\n 'title'\n )}`,\n }\n );\n\n const modalContents = {\n classes: ['nonHoldConflictModal'],\n title: html('nonHoldConflictModal.heading'),\n content: template({ titleModel, options, message }),\n };\n\n super(modalContents);\n\n this.collection = new TitleCollection();\n this.collection.url = `${window.url(\n window.routes.rest.media.availableRelated,\n { id: titleModel.id }\n )}?max=4`;\n this.collection.parse = (response) => {\n return _.values(response.titles);\n };\n this.$titleContainer = this.$('.relatedTitlesContainer');\n this.titleModel = titleModel;\n this.fetchRelatedTitles();\n\n if (options.isLuckyDay) {\n this.ldtooltip = new Popover({\n target: this.$el.find('#luckyDayTooltip'),\n contents: `

    ${html('nonHoldConflictModal.luckyDayInfo')}

    `,\n });\n }\n }\n\n fetchRelatedTitles() {\n this.collection\n .fetch()\n .then((res) => {\n if (_(res.titles).isEmpty()) {\n this.$titleContainer.empty();\n return;\n }\n\n this.renderRelatedTitles();\n })\n .fail(() => {\n this.$titleContainer.empty();\n });\n }\n\n renderRelatedTitles() {\n this.$titleContainer.empty();\n this.$titleContainer.append(\n relatedTitlesTemplate({ titleModel: this.titleModel.attributes })\n );\n\n this.titleCollectionView = new TitleCollectionView({\n el: this.$titleContainer.find('.relatedTitles'),\n bus: this.bus,\n View: TitleCard,\n attributes: {\n class: 'titleContainer small-block-grid-2 medium-block-grid-4 large-block-grid-4',\n },\n collection: this.collection,\n coverWidths: { mobile: 150, tablet: 185, desktop: 220 },\n });\n }\n}\n","export default({titleModel, options, message}) => `\n
    \n
    \n ${message}\n ${options.isLuckyDay && !titleModel.get('isOnHold') ?\n `
    \n
    \n \n
    \n
    `\n : '' }\n ${titleModel.get('isOnHold') ? `\n

    ${window.html('nonHoldConflictModal.stillOnHold', {title: titleModel.title})}

    \n ` : ''}\n
    \n
    \n
    \n
    \n
    \n`;\n","import svgLoader from '../../util/svgLoader';\nimport NotificationItem from './NotificationsItem';\nimport keys from '../../util/keycodes';\nconst { text, url } = window;\n\nexport default class NotificationDrawer extends Backbone.View {\n constructor() {\n super(...arguments);\n this.$triggerEl = $('.js-notificationsButton');\n this.isOpen = false;\n this.PAGE_SIZE = 5;\n this.totalNotifications = 0;\n this.pageNum = 0;\n this.notifications = [];\n\n this.renderShell();\n this.loadPage();\n\n this.$el.on('click', (e) => {\n // clicks inside the container are trapped so they can't trigger the close handler.\n e.stopPropagation();\n });\n\n $('body').on('click', (e) => this.tryClose(e));\n this.$triggerEl.on('click', (e) => this.toggle(e));\n\n this.$el.on('keyup', (e) => {\n if (e.which === keys.ESC) {\n this.tryClose(e);\n }\n });\n }\n\n close() {\n this.$el.detach();\n this.isOpen = false;\n }\n\n tryClose(e) {\n if (this.isOpen && e && !e.originalEvent.isDrawerOpenClick) {\n this.close();\n }\n }\n\n open(e) {\n if (!this.isOpen) {\n e.originalEvent.isDrawerOpenClick = true;\n // There are two potential click targets: one for the mobile nav and one for the desktop nav\n $(e.currentTarget)\n .siblings('.Notifications-Dropdown')\n .append(this.$el);\n this.isOpen = true;\n $('.icon-notification').removeClass('ring');\n svgLoader();\n\n this.$el.find(':focusable:visible').first().focus();\n\n this.$el.on('keydown', (ev) => {\n if (ev.which === keys.TAB) {\n this.keepFocus(ev);\n }\n });\n }\n }\n\n toggle(e) {\n if (this.isOpen) {\n this.tryClose(e);\n e.stopPropagation();\n } else {\n this.open(e);\n }\n }\n\n keepFocus(e) {\n const activeElem = $(document.activeElement);\n const firstFocusable =\n this.$('.Notification-item')[0] ||\n this.$el.find(':focusable:visible').first();\n const lastFocusable = this.$el.find(':focusable:visible:tabbable')[\n this.$el.find(':focusable:visible:tabbable').length - 1\n ];\n\n if (\n activeElem.is(firstFocusable) &&\n e.which === keys.TAB &&\n e.shiftKey\n ) {\n e.preventDefault();\n lastFocusable.focus();\n } else if (\n $(activeElem).is(lastFocusable) &&\n e.which === keys.TAB &&\n !e.shiftKey\n ) {\n e.preventDefault();\n firstFocusable.focus();\n }\n }\n\n startSpinner(target) {\n target.append(this.$spinner);\n }\n\n stopSpinner() {\n this.$spinner.detach();\n }\n\n startNagging(resultCount) {\n $('.notificationDotContainer').css('display', 'block');\n $('.notificationDotContainer.mobile').css('display', 'inline-block');\n $('.js-notificationsButton').attr(\n 'aria-label',\n text('notifications.activeNotificationsLabel', { num: resultCount })\n );\n $('.js-notificationsButton').attr('role', 'button alert');\n $('.icon-notification').addClass('ring');\n }\n\n renderShell() {\n this.$el.empty();\n this.$el.append(`
    \n
    \n
    \n
    \n
    \n
    \n
    \n
    `);\n this.$spinner = this.$el.find('.spinnerBox');\n this.$mainContainer = this.$el.find('.NotificationsContainer');\n this.$caret = this.$el.find('.NotificationsCaret');\n }\n\n get hasMorePages() {\n return this.pageNum < this.numPages - 1;\n }\n\n loadPage() {\n this.getNotifications()\n .then((res) => {\n if (this.pageNum === 0) {\n this.totalNotifications = res.totalResultCount;\n this.numPages = Math.ceil(\n this.totalNotifications / this.PAGE_SIZE\n );\n }\n\n // It's possible for invalid notiifications to be pruned from the response before it reaches the client.\n // There is an edge case wehre an entire page of results may be empty because all of the items were pruned, but\n // there are still more pages available. In this case we will automatically advance to the next page without further\n // user interaction.\n if (\n res &&\n res.items &&\n res.items.length === 0 &&\n this.hasMorePages\n ) {\n this.pageNum += 1;\n return this.loadPage();\n }\n\n this.stopSpinner();\n if (res && typeof res.items !== 'undefined') {\n let newNotifications = [];\n res.items.forEach((n) => {\n let item = new NotificationItem(n);\n item.registerDismissCallback(() =>\n this.notificationDismissed()\n );\n newNotifications.push(item);\n });\n this.notifications =\n this.notifications.concat(newNotifications);\n this.renderPage(newNotifications);\n }\n })\n .catch((error) => {\n this.stopSpinner();\n window.Logger.log('error', 'Failed to show notifications', {\n message: error.statusText || error,\n });\n if (this.pageNum === 0) {\n this.$mainContainer\n .empty()\n .append(\n $(\n `

    ${text(\n 'notifications.fetchingError',\n { link: this.getContactSupportLink() }\n )}

    `\n )\n );\n } else {\n this.$loadMoreBox\n .empty()\n .append(\n ``\n );\n this.$loadMoreBox\n .find('.Notifications-loadMore')\n .on('click', (e) => this.loadMoreClick(e));\n }\n });\n }\n\n getNotifications() {\n return new Promise((resolve, reject) =>\n $.ajax({\n method: 'GET',\n url: window.url(window.routes.rest.patronNotifications.get),\n data: {\n pageNumber: this.pageNum,\n pageSize: this.PAGE_SIZE,\n },\n timeout: 10000,\n })\n .done((response) => resolve(response))\n .fail((xhr, status, err) => reject(err))\n );\n }\n\n renderPage(notifications) {\n if (\n this.pageNum === 0 &&\n (!notifications || notifications.length === 0)\n ) {\n this.displayNoNotificationsMessage();\n } else if (this.notifications.length > 0) {\n if (this.pageNum === 0) {\n this.$mainContainer\n .append(`
    \n
    \n
      \n
      `);\n\n this.$notificationContainer =\n this.$mainContainer.find('.NotificationsList');\n this.$countContainer = this.$mainContainer.find(\n '.NotificationsCountItem'\n );\n if (this.totalNotifications > 0) {\n this.startNagging(this.totalNotifications);\n }\n }\n\n this.updateCount();\n this.updateCaret();\n\n if (this.$loadMoreBox) {\n this.$loadMoreBox.remove();\n }\n\n notifications.forEach((n) => {\n this.$notificationContainer.append(n.render());\n });\n\n if (this.hasMorePages) {\n this.$loadMoreBox = $(`
    • \n \n
    • `);\n this.$notificationContainer.append(this.$loadMoreBox);\n this.$loadMoreBox\n .find('.Notifications-loadMore')\n .on('click', (e) => this.loadMoreClick(e));\n }\n\n if (this.pageNum !== 0) {\n $('.Notification-item')[this.pageNum * this.PAGE_SIZE].focus();\n }\n\n this.pageNum += 1;\n }\n }\n\n displayNoNotificationsMessage() {\n this.$mainContainer.empty()\n .append(`
      \n
      \n
      ${text(\n 'notifications.noNotificationsLabel'\n )}
      \n

      ${text('notifications.noNotifications')}

      \n
      `);\n }\n\n loadMoreClick() {\n this.$loadMoreBox.empty();\n this.startSpinner(this.$loadMoreBox);\n this.loadPage();\n }\n\n updateCaret() {\n if (this.notifications.length > 0) {\n this.$caret.removeClass('white');\n } else if (!this.$caret.hasClass('white')) {\n this.$caret.addClass('white');\n }\n }\n\n updateCount() {\n this.$countContainer.empty();\n this.$countContainer.append(\n `

      ${text('notifications.notificationCount', {\n num: this.notifications.length,\n total: this.totalNotifications,\n })}

      `\n );\n }\n\n notificationDismissed() {\n this.totalNotifications -= 1;\n this.notifications = this.notifications.filter((x) => !x.isDismissed);\n\n if (this.totalNotifications < 1) {\n this.displayNoNotificationsMessage();\n }\n\n this.updateCount();\n }\n\n getContactSupportLink() {\n let link = '';\n if (window.OverDrive.librarySupportUrl !== '') {\n link = window.OverDrive.librarySupportUrl;\n } else if (window.OverDrive.librarySupportEmail !== '') {\n link = window.OverDrive.librarySupportEmail;\n } else {\n link = url(window.routes.supportMembers);\n }\n return `${text(\n 'contactSupport'\n ).toLowerCase()}`;\n }\n}\n","import TitleActionButton from '../../components/media/TitleActionButton';\nimport Title from '../media/models/Title';\nimport SuspensionModal from '../SuspendHoldModal/SuspendHoldModal';\nimport HoldCancelModal from '../HoldCancelModal/HoldCancelModal';\nimport Borrow from '../../title-actions/borrow/Borrow';\n\nconst { text } = window;\n\nexport default class NotificationsItem extends Backbone.View{\n constructor({id, titleId, type, timeUTC, data, isNotification = true}){\n super(...arguments);\n this.id = id;\n this.titleId = titleId;\n this.type = type;\n this.time = timeUTC;\n this.data = data || {};\n this.model = new Title(data);\n this.system = type === \"SiteMessage\";\n this.bus = window.globalEvents;\n this.isNotification = isNotification;\n this.dismissed = false;\n this.dismissCallbacks = [];\n\n this.setStateOfTitle();\n }\n\n render(){\n this.$el = this.template();\n this.addActionbuttons(this.$el);\n this.attachDismissHandlers();\n this.$el.find('.ClearNotification').on('click', () => this.dismissNotification());\n return this.$el;\n }\n\n setStateOfTitle(){\n if([\"HoldSuspendedAuto\", \"HoldReady\", \"HoldSuspendedManual\", \"HoldSuspendedManual\"].includes(this.type)){\n /*The usual method for updating the title's state through the PatronTitleStatus component is overkill \n here since we can infer these are holds by the notification type. However, the logic for performing \n actions on holds will not function correctly without this property set.*/\n this.model.set('isOnHold', true);\n }\n }\n\n registerDismissCallback(callback){\n this.dismissCallbacks.push(callback);\n }\n\n dismissNotification(){\n this.remove(); // we hide the notification regardless of whether the dismiss call succeeds, so we may as well make it snappy\n $.ajax({\n url: window.url(window.routes.rest.patronNotifications.dismiss, {id: this.id}),\n type: 'DELETE'\n })\n .done(() => {\n this.triggerDismissEvent();\n }).fail((xhr, status, err) => {\n window.Logger.log('error', 'Error dismissing notification', {message: err.statusText || err});\n });\n }\n\n remove(){\n this.isDismissed = true;\n this.$el.find('.Notification').addClass('notificationDisappear'); // fade\n this.$el.addClass('notificationShut'); // collapse\n setTimeout(() => { this.$el.hide(); }, 450); // vanish\n this.dismissCallbacks.forEach((callback) => {\n callback();\n });\n }\n\n triggerDismissEvent() {\n switch(this.type) {\n case \"HoldSuspendedAuto\":\n this.bus.trigger('title:suspend:dismiss', {titleModel: this.model, context: { isNotification: this.isNotification }});\n break;\n case \"HoldLapsed\":\n this.bus.trigger('title:hold-lapsed:dismiss', {titleModel: this.model, context: { isNotification: this.isNotification }});\n break;\n default:\n // Nothing to trigger\n }\n }\n\n getDateOfNotification(){\n return new Date(this.time);\n }\n\n getTitleImage(){\n if(this.data){\n return this.model.getCoverSrc(150);\n }\n }\n\n getNotificationText(titleName){\n switch (this.type) {\n case \"HoldReady\":{\n let expDate = new Date(this.model.get(\"expireDate\"));\n let now = new Date();\n let header = \"\";\n let hoursLeft = Math.floor((expDate.getTime() - now.getTime()) / 3.6e+6);\n if (hoursLeft >= 25) { //display days\n let daysLeft = Math.floor((expDate.getTime() - now.getTime()) / 8.64e+7);\n header = text(\"notifications.HoldReady.header.days\", {title: titleName, time: daysLeft});\n }\n else if (hoursLeft >= 1){ //display hours\n header = text(\"notifications.HoldReady.header.hours\", {title: titleName, time: hoursLeft});\n } else { //display min\n let minutesLeft = Math.floor((expDate.getTime() - now.getTime()) / 60000);\n header = text(\"notifications.HoldReady.header.mins\", {title: titleName, time: minutesLeft});\n }\n return {\n header : header,\n mainText : text(\"notifications.HoldReady.mainText\")\n };\n }\n case \"HoldSuspendedAuto\":{\n return {\n header : text(\"notifications.HoldSuspendedAuto.header\", {title: titleName, date: this.model.get(\"suspensionEnd\")}),\n mainText : text(\"notifications.HoldSuspendedAuto.mainText\", {date: this.model.get(\"suspensionEnd\")})\n };\n }\n case \"HoldLapsed\":{\n return {\n header: text(\"notifications.HoldLapsed.header\", {title: titleName}),\n mainText : text(\"notifications.HoldLapsed.mainText\")\n };\n }\n default:{\n return {\n header : `${titleName} is ready for some action. Do something with it.`,\n mainText : \"Look at the buttons below and pick the appropriate action to dismiss this notification.\"\n };\n }\n }\n }\n\n isDismissable(){\n return this.system || this.type === \"HoldSuspendedAuto\" || this.type === \"HoldLapsed\";\n }\n\n template(){\n let notificationDate = text(\"notifications.date\" ,{date: this.getDateOfNotification()});\n let titleImage = this.getTitleImage();\n let coverLink = this.model.titleDetailsUrl;\n let titleName = this.model.get(\"title\");\n\n let textObj = this.getNotificationText(titleName);\n let header = textObj.header;\n let mainText = textObj.mainText;\n\n return $(`\n
    • \n
      \n
      \n
      \n
      \n \"${titleName}\"\n
      \n
      \n

      ${notificationDate}

      \n
      \n

      ${header}

      \n

      ${mainText}

      \n
      \n
      \n ${this.isDismissable()\n ?\n `` : ''}\n
      \n\n ${!this.system\n ? `
      \n
      ` : ''}\n
      \n\n
      \n\n
      \n
      \n
      \n
      \n \"${titleName}\"\n
      \n
      \n

      ${notificationDate}

      \n
      \n

      ${header}

      \n
      \n
      \n ${this.isDismissable()\n ? `
      \n \n
      ` : ''}\n
      \n
      \n

      ${mainText}

      \n ${!this.system ? '
      ' : ''}\n
      \n\n
      \n\n
      \n
    • \n `);\n }\n\n attachDismissHandlers() {\n let borrowAction = 'title:borrow:success';\n let cancelHoldAction = 'title:hold-cancel:success';\n let removeSuspensionAction = 'title:suspend:cancelled';\n let suspendHoldAction = 'title:suspend'; // this includes editing a suspension as well as adding a new one\n let placeHoldAction = 'title:hold:success';\n\n let dismissActions = [];\n switch (this.type) {\n case 'HoldReady':\n dismissActions = [borrowAction, suspendHoldAction, cancelHoldAction];\n break;\n case 'HoldLapsed':\n dismissActions = [placeHoldAction];\n break;\n case 'HoldSuspendedAuto':\n dismissActions = [cancelHoldAction, suspendHoldAction, removeSuspensionAction];\n break;\n default:\n throw new Error(`Notification type '${this.type} is not currently supported.`);\n }\n\n let dismissIfTitleMatches = ({titleModel}) => {\n if (titleModel && titleModel.get('id') === this.model.get('id')){\n this.dismissNotification();\n }\n };\n\n dismissActions.forEach((action) => {\n this.bus.on(action, dismissIfTitleMatches);\n });\n }\n\n\n addActionbuttons(template){\n let buttonsContainer = template.find(\".actionButtons\");\n let titleId = this.model.get(\"id\");\n let titleName = this.model.get(\"title\");\n if(buttonsContainer.length > 0){\n switch (this.type) {\n case \"HoldReady\":\n buttonsContainer.append(this.borrowButton(titleId, titleName));\n buttonsContainer.append(this.suspendHoldButton(titleId, titleName));\n buttonsContainer.append(this.cancelHoldButton(titleId, titleName));\n break;\n\n case \"HoldLapsed\":\n buttonsContainer.append(this.placeHoldButton(titleId, titleName));\n break;\n case \"HoldSuspendedAuto\":\n buttonsContainer.append(this.dismissNotificationButton());\n buttonsContainer.append(this.suspendHoldButton(titleId, titleName, text(\"notifications.editDeliveryDate\")));\n buttonsContainer.append(this.cancelHoldButton(titleId, titleName));\n break;\n default:\n throw new Error(`Notification type '${this.type} is not currently supported.`);\n }\n }\n }\n\n dismissNotificationButton(){\n let template = $(``);\n template.on('click', () => this.dismissNotification());\n return template;\n }\n\n borrowButton(titleId, titleName){\n let template = $(``);\n\n template.on(\"click\", (e) => {\n new Borrow(this.bus).borrowTitle(this.model, { isNotification: this.isNotification });\n });\n\n return template;\n }\n\n cancelHoldButton(titleId, titleName){\n let template = $(``);\n\n\n template.on(\"click\", () => {\n (new HoldCancelModal()).on('confirm', (modal) => {\n // ... because old code\n this.bus.trigger('title:hold-cancel', this.model, { isNotification: this.isNotification });\n modal.close();\n });\n });\n\n return template;\n }\n\n suspendHoldButton(titleId, titleName, words=\"\"){\n let copyToUse = words === \"\" ? text(\"notifications.deliverLater\") : words;\n let template = $(``);\n\n template.on(\"click\", () => {\n new SuspensionModal(this.model, false, this.isNotification);\n });\n\n return template;\n }\n\n placeHoldButton(titleId, titleName){\n let template = $(``);\n\n template.on(\"click\", (e) => {\n this.bus.trigger('title:hold', this.model, { isNotification: this.isNotification });\n });\n\n return template;\n }\n\n renewTitleButton(titleName){\n let template = $(``);\n return template;\n }\n\n returnButton(titleName){\n let template = $(``);\n return template;\n }\n\n returnEarlyButton(titleName){\n let template = $(``);\n return template;\n }\n\n requestAgainButton(titleName){\n let template = $(``);\n return template;\n }\n}\n","const { url, routes } = window;\n\nexport default class NotificationsEventTracker {\n constructor(bus) {\n\n this.bus = bus;\n this._websiteId = window.OverDrive.tenant;\n\n this.bus\n .on('title:borrow:success', (params) => this.pushDismissalNotification(params, 'borrow'))\n .on('title:hold:success', (params) => this.pushDismissalNotification(params, 'hold'))\n .on('title:hold-cancel:success', (params) => this.pushDismissalNotification(params, 'cancel-hold'))\n .on('title:suspend', (params) => this.pushDismissalNotification(params, 'suspend-hold'))\n .on('title:suspend:cancelled', (params) => this.pushDismissalNotification(params, 'cancel-suspended-hold'))\n ;\n }\n\n pushDismissalNotification({titleModel, context}, event){\n new Promise((resolve, reject) =>\n $.ajax({\n url: url(routes.rest.patronNotifications.dismissByAction),\n type: 'POST',\n data: {\n action: event,\n websiteId: this._websiteId,\n titleId: titleModel.id\n }\n })\n .done((response) => resolve(response))\n .fail((xhr, status, err) => reject(err)))\n .catch((error) => {\n window.Logger.log('error', 'Failed to send dismiss-by-circ-action notification', {message: error.statusText || error});\n });\n }\n}","import svgLoader from '../../util/svgLoader';\n\nexport default class Popover extends Backbone.View {\n\n constructor(opts){\n super(...arguments);\n\n if(!opts.target){\n throw new Error('you must specify a target');\n }\n\n this.contents = opts.contents;\n this.target = opts.target;\n this.enabled = false;\n this.className = opts.className;\n this.requestedWidth = opts.width || 300;\n this.renderSvgOnToggle = opts.renderSvgOnToggle || false;\n this.actions = opts.actions;\n this.hideActions = opts.hideActions;\n\n this.target.on('click', (e) => {\n this.toggle();\n e.stopPropagation();\n });\n }\n\n getParams() {\n let topMargin = 6;\n let sideMargin = 5;\n let caretSpacer = 4;\n let targetOffset = this.target.offset();\n let targetWidth = this.target.width();\n targetOffset.right = targetOffset.left + targetWidth;\n let targetHeight = this.target.height();\n let viewportWidth = $(window).width();\n let viewportHeight = $(window).height();\n let width = Math.min(this.requestedWidth - (2 * sideMargin), viewportWidth);\n let xOverlap = width - targetWidth;\n let spaceToLeft = targetOffset.left;\n let spaceToRight = viewportWidth - targetOffset.right;\n let leftHasRoom = spaceToLeft >= (xOverlap / 2);\n let rightHasRoom = spaceToRight >= (xOverlap / 2);\n\n\n // prefer centering on the target. This is different than the foundation popovers but much easier to reason about.\n let left, right, top, bottom, caretLeft, caretRight, alignmentClass;\n\n if (leftHasRoom && rightHasRoom){\n // horizontally centered on the target element\n left = targetOffset.left - (xOverlap / 2);\n right = viewportWidth - targetOffset.right - (xOverlap / 2);\n caretLeft = width / 2;\n alignmentClass = 'popoverCenter';\n } else if (spaceToRight >= xOverlap){\n // align the left edge to the target's left edge\n left = targetOffset.left;\n right = viewportWidth - targetOffset.right - xOverlap;\n caretLeft = caretSpacer;\n alignmentClass = 'popoverLeft';\n } else if (spaceToLeft >= xOverlap){\n // align the right edge to the target's right edge\n left = targetOffset.left - xOverlap;\n right = viewportWidth - targetOffset.right;\n caretRight = caretSpacer;\n alignmentClass = 'popoverRight';\n } else {\n // the viewport is narrower than the desired popover width. Fill the available space.\n left = 0;\n right = 0;\n caretLeft = targetOffset.left + (targetWidth / 2);\n alignmentClass = 'popoverFit';\n }\n\n let openUp = ((this.target[0].getBoundingClientRect().top + (targetHeight / 2)) / viewportHeight) > 0.666666;\n if (!openUp){\n top = targetOffset.top + topMargin + targetHeight;\n } else {\n bottom = viewportHeight - targetOffset.top + topMargin;\n }\n\n return {\n main: {\n top,\n bottom,\n left,\n right\n },\n caret: {\n left: caretLeft,\n right: caretRight\n },\n directionClass: openUp ? 'popoverUp' : 'popoverDown',\n alignmentClass\n };\n }\n\n\n render() {\n let params = this.getParams();\n\n this.$el.empty();\n this.$el = $(`\n
      \n
      \n
      \n
      \n
      \n ${this.contents}\n
      \n
      \n `);\n\n $('body').append(this.$el);\n $('body').click(() => this.hide());\n }\n\n hide() {\n this.$el.remove();\n this.enabled = false;\n }\n\n show(){\n this.render();\n if(this.renderSvgOnToggle){\n svgLoader();\n }\n if(this.actions){\n this.actions();\n }\n this.enabled = true;\n }\n\n toggle(){\n if (this.enabled){\n if(this.hideActions){\n this.hideActions();\n }\n this.hide();\n }\n else {\n this.show();\n }\n }\n}\n","import BaseCollection from '../../../collections/base';\nimport AutocompletionModel from '../models/autocompletion';\nimport {decodeEntities} from '../../../util/text';\nimport ensureSimpleRequest from '../../../util/requests/ensureSimpleRequest';\n\nconst AutocompletionsCollection = BaseCollection.extend({\n\n model: AutocompletionModel,\n\n url() {\n return `${OverDrive.autocompleteHost}/autocomplete`;\n },\n\n initialize(models, {query, count = 15, sortBy = 'score'}) {\n this.query = query;\n this.count = count;\n this.sortBy = sortBy;\n this.apiKey = OverDrive.autocompleteApiKey;\n\n this.mediaType = this._getSupportedMediaTypes();\n\n this.listenTo(this.query, 'change:text', this.textChangeHandler.bind(this));\n this.on('sync', this.smartSyncTrigger);\n },\n\n textChangeHandler() {\n if (this.query.isValidForAutocomplete()) {\n // Try to cancel the previous XHR request if it has not already resolved, otherwise noop\n this._lastFetch && this._lastFetch.abort();\n\n this._lastFetch = this.fetch();\n } else {\n this.reset();\n }\n },\n\n queryParams() {\n let params = {query: this.query.get('text'), maxSize: this.count, categorySize: this.count, sortBy: this.sortBy, mediaType: this.mediaType};\n if (OverDrive.autocompleteHost !== OverDrive.thunderHost) {\n params['api-key'] = this.apiKey;\n }\n\n let result = window.featureManager.isEnabled('filter-out-ntc') ? $.param(params, true) : $.param(params);\n return result;\n },\n\n fetch() {\n const data = this.queryParams();\n return ensureSimpleRequest(BaseCollection.prototype.fetch.bind(this, {data}));\n },\n\n smartSyncTrigger(collection, response, options) {\n if (options.data === this.queryParams()) {\n this.trigger('smartsync');\n }\n },\n\n parse(response) {\n const mapped = _.map(response.items, (item, index) => ({text: decodeEntities(item.text), field: item.field, index}));\n return _.uniq(mapped, (item) => item.text.toUpperCase());\n },\n\n _getSupportedMediaTypes() {\n let mediaType = [];\n\n const supportedFormats = window.OverDrive.supportedFormats;\n if (supportedFormats && _.isArray(supportedFormats)) {\n // Rooms only have the format class, so we're doing something gross and\n // stripping the format class off of each format based on string convention\n mediaType = supportedFormats.map((format) => {\n let formatClass = format.id;\n const classEndIndex = formatClass.indexOf('-');\n if (classEndIndex !== -1) {\n formatClass = formatClass.substring(0, classEndIndex);\n }\n return formatClass;\n });\n mediaType = mediaType.filter((value, index) => mediaType.indexOf(value) === index);\n }\n\n const room = window.OverDrive.currentRoom;\n const roomFormats = room && room.filters && room.filters.mediaType;\n if (roomFormats) {\n mediaType = _(mediaType).intersection(roomFormats);\n }\n\n if(window.featureManager.isEnabled('filter-out-ntc')) {\n var whitelistedMediaTypes = window.OverDrive.whitelistedMediaTypes.split(',');\n mediaType = mediaType.filter(type => whitelistedMediaTypes.includes(type));\n }\n\n return mediaType;\n }\n});\n\nexport default AutocompletionsCollection;\n","import QuickSearchModel from './models/quick_search';\nimport AutocompletionsCollection from './collections/autocompletions';\nimport SearchBarView from './views/search_bar';\nimport SearchBarAutocompleteView from './views/search_bar_autocomplete';\nimport AutocompletionsView from './views/autocompletions';\nconst Backbone = window.Backbone;\n\nconst createComponent = ({searchEl, autocompletionsEl, toggleSearchEl, options}) => {\n const query = new QuickSearchModel();\n const featureManager = window.featureManager;\n\n // Disable autocomplete for rooms\n if (featureManager.isEnabled('autocomplete')) {\n const autocompleteBus = _.extend({}, Backbone.Events);\n const searchBarAutocomplete = new SearchBarAutocompleteView({el: searchEl, toggleSearchEl, query, autocompleteBus}); // eslint-disable-line no-unused-vars\n const autocompletions = new AutocompletionsCollection(null, {query});\n const viewOptions = {\n query,\n autocompleteBus,\n el: autocompletionsEl,\n collection: autocompletions,\n options\n };\n const autocompletionsView = new AutocompletionsView(viewOptions); // eslint-disable-line no-unused-vars\n } else {\n const searchBar = new SearchBarView({el: searchEl, query, options: {$toggleSearch: toggleSearchEl}}); // eslint-disable-line no-unused-vars\n }\n};\n\nexport default createComponent;\n","import BaseModel from '../../../models/base';\n\nconst Autocompletion = BaseModel.extend({\n\n defaults() {\n return {\n text: '',\n active: false\n };\n },\n\n parse(result) {\n result.text = this.replaceHtml(result.text);\n return result;\n },\n\n replaceHtml(text) {\n return text.replace('TM', '™');\n }\n});\n\nexport default Autocompletion;\n","import BaseModel from '../../../models/base';\n\nconst AUTOCOMPLETE_MINIMUM = 1;\nconst SEARCH_MINIMUM = 1;\n\nconst QuickSearchModel = BaseModel.extend({\n defaults() {\n return {\n text: '',\n };\n },\n\n isValidForAutocomplete() {\n const query = this.get('text');\n const queryIsOnlySpaces = query.replace(/\\s/g, '').length === 0;\n const queryMeetsAutoCompleteMin =\n this.get('text').length >= AUTOCOMPLETE_MINIMUM;\n\n return !queryIsOnlySpaces && queryMeetsAutoCompleteMin;\n },\n\n isValidForSearch() {\n return this.get('text').length >= SEARCH_MINIMUM;\n },\n});\n\nexport default QuickSearchModel;\n","import BaseView from '../../../views/base';\nimport {surroundSubtext} from '../../../util/text';\nconst fs = require('fs');\nconst path = require('path');\nconst template = fs.readFileSync(path.join(__dirname, '/../templates/autocompletion.html'), 'utf8');\n\nconst Autocompletion = BaseView.extend({\n\n template: _.template(template, {variable: 'data'}),\n\n initialize({model, query}) {\n this.model = model;\n this.query = query;\n this.listenTo(this.model, 'change:active', this.render);\n },\n\n deleteViewAndModel() {\n this.model.destroy();\n this.deleteView();\n },\n\n deleteView() {\n this.remove();\n this.unbind();\n },\n\n getTemplateData() {\n const href = window.url(window.routes.search, {\n query: this.model.get('text')\n });\n\n return _.extend({}, this.model.attributes, {\n href,\n resultText: surroundSubtext({\n text: this.model.get('text'),\n matcher: this.query.get('text'),\n tag: 'b',\n ignoreCase: true\n }),\n field: window.html('autoComplete.' + this.model.get('field'))\n });\n }\n});\n\nexport default Autocompletion;\n","import CollectionView from '../../../views/collection';\nimport AutocompleteView from './autocompletion';\nconst fs = require('fs');\nconst path = require('path');\nconst template = fs.readFileSync(path.join(__dirname, '/../templates/autocompletions.html'), 'utf8');\n\nconst Autocompletions = CollectionView.extend({\n\n template: _.template(template),\n\n initialize({el, query, collection, autocompleteBus, options = {}}) {\n this.el = el;\n this.collection = collection;\n this.query = query;\n this.autocompleteBus = autocompleteBus;\n this.options = options;\n this.$advancedSearch = $('.js-desktopAdvancedSearch');\n this.$iconClear = $('.icon-clear');\n this.listenTo(this.collection, 'reset', this.emptyElAndClearActive);\n this.listenTo(this.collection, 'smartsync', this.smartRender);\n this.listenTo(autocompleteBus, 'quicksearch:blur', this.emptyElAndClearActive);\n this.listenTo(autocompleteBus, 'quicksearch:focus', this.smartRender);\n this.listenTo(autocompleteBus, 'quicksearch:highlightItem', this.highlightItem);\n },\n\n emptyElAndClearActive() {\n if (this.options.desktop) {\n this.$advancedSearch.show();\n }\n // Hack until all the logic is moved into views\n if (this.options.mobile) {\n this.resetMobileSearchBar();\n }\n this.collection.invoke('set', {active: false});\n this.emptyEl();\n this.highlightedItemIndex = null;\n },\n\n resetMobileSearchBar() {\n // Mess of jquery until navbar can be systematically refactored\n $('.account-dropdown-mobile a').removeClass('hideMeImportant');\n $('.toggle-topbar.search').addClass('invisible');\n $('.toggle-topbar.menu-icon').removeClass('invisible');\n $('.toggle-topbar.browse').removeClass('invisible');\n },\n\n highlightItem(direction) {\n if (this.collection.models.length === 0) {\n return;\n }\n if (this.highlightedItemIndex == null) {\n this.highlightedItemIndex = direction > 0 ? 0 : direction;\n } else {\n this.highlightedItemIndex += direction;\n }\n if (this.highlightedItemIndex < 0) {\n this.highlightedItemIndex = this.views.length - 1;\n } else if (this.highlightedItemIndex >= this.collection.models.length) {\n this.highlightedItemIndex = 0;\n }\n const model = this.collection.models[this.highlightedItemIndex];\n this.collection.invoke('set', {active: false});\n model.set('active', true);\n this.autocompleteBus.trigger('quicksearch:fill', model.get('text'));\n },\n\n appendItems() {\n const className = '.js-autocompletionsList';\n this.$(className).append(this.temp);\n },\n\n smartRender() {\n this.highlightedItemIndex = null;\n if (this.query.get('text').length && this.collection.models.length) {\n this.render();\n this.$advancedSearch.hide();\n } else {\n this.emptyEl();\n }\n },\n\n createItemView({model}) {\n return new AutocompleteView({\n model,\n query: this.query\n });\n }\n\n});\n\nexport default Autocompletions;\n","import BaseView from '../../../views/base';\nimport keycodes from '../../../util/keycodes';\n\nconst _ = window._;\n\nconst SearchBar = BaseView.extend({\n\n events: {\n 'click .js-doQuickSearch': 'submitForm',\n 'keyup .js-quickSearchInput': 'keyup',\n 'change .js-quickSearchInput': 'change',\n 'input .js-quickSearchInput': 'input',\n 'click .js-clearSearch': 'clearSearch'\n },\n\n initialize({el, query, options}) {\n this._injectCustomFunctioanlity();\n\n this.setElement(el);\n this.delegateEvents();\n this.query = query;\n\n this.$input = this.$el.find('.js-quickSearchInput');\n this.$form = this.$el.find('.js-quickSearchForm');\n this.$toggleSearch = this.$el.find('.js-toggleSearch');\n this.$clearSearch = this.$el.find('.js-clearSearch');\n\n // LHTNG-1215 - Sync any input provided staticaly from the form markup\n this.query.set('text', this.$input.val());\n\n _.extend(this, (options || {}));\n\n this.$toggleSearch.on('click keypress', (ev) => { this.toggleSearch(ev); });\n },\n\n _injectCustomFunctioanlity() {\n $.fn.setCursorToTextEnd = function() {\n const $initialVal = this.val();\n this.val('').val($initialVal);\n };\n },\n\n submitForm(ev) {\n if (this.query.isValidForSearch()) {\n this.$form.submit();\n } else {\n ev.stopPropagation();\n ev.preventDefault();\n }\n },\n\n keyup(ev) {\n this.toggleClearIcon();\n\n if (this.keyupMap.has(ev.which)) {\n this.keyupMap.get(ev.which)(this);\n } else {\n this.query.set('text', ev.target.value);\n ev.stopPropagation();\n ev.preventDefault();\n }\n },\n\n input(ev) {\n this.toggleClearIcon();\n this.query.set('text', ev.target.value);\n ev.stopPropagation();\n ev.preventDefault();\n },\n\n toggleClearIcon() {\n if (this.$input.val()) {\n this.$clearSearch.show();\n } else {\n this.$clearSearch.hide();\n }\n },\n\n clearSearch() {\n this.$input.val('').focus();\n this.$clearSearch.hide();\n },\n\n keyupMap: new Map([\n [keycodes.ENTER, (self) => self.submitForm()]\n ]),\n\n toggleSearch(ev) {\n if (ev.which === keycodes.SPACE || ev.which === keycodes.ENTER || ev.type === 'click') {\n this.$el.toggleClass('hideMe');\n this.$input.focus().setCursorToTextEnd();\n }\n\n this.toggleClearIcon();\n\n if (toaster) toaster._stickToast();\n }\n\n});\n\nexport default SearchBar;\n","import SearchBar from './search_bar';\nimport keycodes from '../../../util/keycodes';\n\nconst AutocompleteSearchBar = SearchBar.extend({\n\n events() {\n return _.extend({}, _.result(SearchBar.prototype, 'events'), {\n 'blur .js-quickSearchInput': 'blur',\n 'focus .js-quickSearchInput': 'focus',\n 'keydown .js-quickSearchInput': 'keydown'\n });\n },\n\n initialize({el, toggleSearchEl, query, autocompleteBus}) {\n let options = {};\n if (toggleSearchEl) {\n options.$toggleSearch = toggleSearchEl;\n }\n\n SearchBar.prototype.initialize.call(this, {el, query, options});\n this.autocompleteBus = autocompleteBus;\n this.listenTo(this.autocompleteBus, 'quicksearch:fill', this.updateText);\n },\n\n updateText(text) {\n this.$input.val(text);\n },\n\n shouldTriggerBlur(ev) {\n const classes = ['js-autocompletionItem', 'js-quickSearchIcon', 'js-mobileSearchIcon', 'js-mobileSearch'];\n const targetViaDocument = document.activeElement;\n const targetViaEvent = ev.relatedTarget;\n return classes.every((itemClass) =>\n !(targetViaDocument.classList.contains(itemClass)\n || (targetViaEvent && !targetViaEvent.classList.contains(itemClass)))\n ) || false;\n },\n\n keydown(ev) {\n if (ev.which === keycodes.UP || ev.which === keycodes.DOWN) {\n return false;\n }\n if (ev.which === keycodes.TAB) {\n this.blurAutocomplete();\n }\n return void 0;\n },\n\n blurAutocomplete() {\n this.autocompleteBus.trigger('quicksearch:blur');\n },\n\n blur(ev) {\n setTimeout(() => {\n if (this.shouldTriggerBlur(ev)) {\n this.blurAutocomplete();\n }\n }, 1);\n },\n\n focus() {\n this.autocompleteBus.trigger('quicksearch:focus');\n },\n\n keyupMap: new Map([\n [keycodes.UP, (self) => self.autocompleteBus.trigger('quicksearch:highlightItem', -1)],\n [keycodes.DOWN, (self) => self.autocompleteBus.trigger('quicksearch:highlightItem', 1)],\n [...SearchBar.prototype.keyupMap]\n ])\n\n});\n\nexport default AutocompleteSearchBar;\n","export default ({signInUrl, stillTroubleText}) => `\n
      \n

      ${ html('reauthenticateModal.textBody') }

      \n\n

      ${stillTroubleText}

      \n\n
      \n \n ${ html('signIn') }\n \n \n
      \n
      \n`;\n","import { Modal } from '../common/modal';\nimport SessionExpiredModalTemplate from './SessionExpiredModal.html';\nconst { text } = window;\n\nexport default class SessionExpiredModal extends Modal {\n constructor(forwardUrl) {\n let supportUrl = window.routes.supportMembers;\n let signInUrl = `${window.routes.accountInvalidCard}${\n forwardUrl ? `?forward=${encodeURIComponent(forwardUrl)}` : ''\n }`;\n\n let followTheseStepsLink = `${text(\n 'pleaseContactSupport'\n )}`;\n let stillTroubleText = text('sessionExpiredModal.stillHavingTrouble', {\n followTheseSteps: followTheseStepsLink,\n });\n const modalContents = {\n classes: ['SessionExpiredModal'],\n title: text('reauthenticateModal.heading'),\n content: SessionExpiredModalTemplate({\n signInUrl,\n stillTroubleText,\n }),\n };\n\n super(modalContents);\n this.$el.find('.cancel').on('click', () => {\n this.close();\n });\n }\n}\n","import TitleActionHandler from '../../title-actions/TitleActionHandler';\nimport SharedActions from '../../title-actions/shared/SharedActions';\nimport BorrowActions from '../../title-actions/borrow/BorrowActions';\nimport HoldActions from '../../title-actions/holds/HoldActions';\nimport NookActions from '../../title-actions/nook/NookActions';\nimport StarRatingActions from '../../title-actions/ratings/StarRatingActions';\nimport ReadingHistoryActions from '../../title-actions/history/ReadingHistoryActions';\n\nimport TrackingCirculation from './ga/TrackingCirculation';\nimport TrackingKindleFulfill from './ga/TrackingKindleFulfillment';\nimport TrackingPublicApiFulfillment from './ga/TrackingPublicAPIFulfillment';\nimport TrackingSignInForms from './ga/TrackingSignInForms';\nimport NotificationsEventTracker from '../notifications_event_tracker/NotificationsEventTracker';\n\nclass EventBridge {\n constructor({\n bus,\n card,\n patronSettings,\n featureManager,\n globalPreferences,\n }) {\n this.bus = bus;\n this.card = card;\n this.patronSettings = patronSettings;\n this.featureManager = featureManager;\n this.globalPreferences = globalPreferences;\n\n this.registerTitleAction();\n this.registerSharedActionHandlers();\n this.registerAnalyticsIntegrations();\n }\n\n registerTitleAction() {\n void new TitleActionHandler(this.bus, this.card, this.patronSettings);\n void new BorrowActions(\n this.bus,\n this.featureManager,\n this.globalPreferences\n );\n void new HoldActions(this.bus);\n void new NookActions(this.bus);\n void new StarRatingActions(this.bus);\n void new ReadingHistoryActions(this.bus);\n\n if (this.featureManager.isEnabled('Notifications')) {\n void new NotificationsEventTracker(this.bus);\n }\n }\n\n registerSharedActionHandlers() {\n void new SharedActions(this.bus);\n }\n\n registerAnalyticsIntegrations() {\n void (window.OverDrive.gaEventLogger = new TrackingCirculation(\n this.bus\n ));\n void new TrackingKindleFulfill(this.bus);\n void new TrackingSignInForms(this.bus);\n void new TrackingPublicApiFulfillment(this.bus);\n }\n}\n\nmodule.exports = EventBridge;\n","const { url, routes } = window;\n\nexport default class TrackingCirculation {\n get isDebug() {\n return _(window.ga).isEmpty();\n }\n\n get debugInstance() {\n return {\n push: ({ event, content, isNotification }) => {\n // eslint-disable-next-line no-console\n console.log(`ga:log(\"${event}\"):`, {\n event,\n content,\n isNotification,\n });\n },\n };\n }\n\n constructor(bus) {\n this.bus = bus;\n\n this._dataLayer = window.dataLayer || this.debugInstance;\n this._websiteId = window.OverDrive.tenant;\n\n this.bus\n .on('title:borrow:success', (params) =>\n this.pushEvent(params, 'titleBorrow')\n )\n .on('title:hold:success', (params) =>\n this.pushEvent(params, 'titleHold')\n )\n .on('title:hold-cancel:success', (params) =>\n this.pushEvent(params, 'titleHoldCancel')\n )\n .on('title:hold-lapsed:dismiss', (params) =>\n this.pushEvent(params, 'titleHoldLapsedDismiss')\n )\n .on('title:wishlist:success', (params) =>\n this.pushEvent(params, 'titleWishlist')\n )\n .on('title:history:add:success', (params) =>\n this.pushEvent(params, 'titleHistory')\n )\n .on('title:download', (params) =>\n this.pushEvent(params, 'titleDownload')\n )\n .on('title:suspend', (params) =>\n this.pushEvent(params, 'titleSuspend')\n )\n .on('title:suspend:cancelled', (params) =>\n this.pushEvent(params, 'titleSuspendCancelled')\n )\n .on('title:suspend:dismiss', (params) =>\n this.pushEvent(params, 'titleSuspendDismiss')\n );\n }\n\n pushEvent({ titleModel, context }, event) {\n let content = _.extend(\n {},\n this.getTitleProps(titleModel),\n this.getCollectionProps(\n context ? context.collectionDefinition : {}\n ),\n this.getCampaignProps(\n titleModel.context ? titleModel.context.campaign : {}\n ),\n context && context.formatId ? { formatId: context.formatId } : {},\n window.featureManager.isEnabled('holdRedelivery')\n ? this.getSuspendTitleProps(context, titleModel, event)\n : {}\n );\n\n // Renew and request again aren't distinct events as far as lightning's api are concerned, but we\n // want to report them as distinct events.\n if (event === 'titleBorrow' && context.isRenewal) {\n event = 'titleRenew';\n } else if (event === 'titleHold' && context.isRequestAgain) {\n event = 'titleRequestAgain';\n }\n\n let isNotification;\n context\n ? (isNotification = context.isNotification)\n : (isNotification = false);\n\n this._dataLayer.push({ event, content, isNotification });\n }\n\n getTitleProps(titleModel) {\n let t = titleModel.attributes;\n\n return {\n mediaID: t.id,\n titleName: t.title,\n author: t.firstCreatorName,\n formatClass: (t.type && t.type.id) || 'unknown',\n };\n }\n\n getStrategy(context) {\n if (context && context.strategy) {\n return { strategy: context.strategy };\n }\n return {};\n }\n\n getCollectionProps(collectionDefinition) {\n if (_(collectionDefinition).isEmpty()) {\n return {};\n }\n\n let c = collectionDefinition;\n return {\n listID: c.attributes.id,\n listName: c.attributes.name,\n listUrl: url(routes.collectionById, {\n collectionId: c.attributes.id,\n }),\n // LHTNG-2199 - This is currently the only place in the code where these are defined as strings,\n // additionnally we have to be consistent with case sensitivity otherwise we will messup Google Analytics\n listType: c.isCurated ? 'Curated' : 'Generated',\n isLuckyDay: c.attributes.showOnlyLuckyDayAvailable,\n };\n }\n\n getCampaignProps(campaign) {\n if (_(campaign).isEmpty()) {\n return {};\n }\n\n return {\n campaignId: campaign.id,\n campaignName: campaign.name,\n };\n }\n\n getSuspendTitleProps(context, titleModel, event) {\n if (\n event === 'titleSuspend' &&\n !_(context).isEmpty() &&\n context.numOfDays\n ) {\n return {\n suspendDays: context.numOfDays,\n isRedelivered: context.isRedelivery,\n isSuspended: context.isSuspended,\n autoRedeliveriesCount: titleModel.get(\n 'redeliveriesAutomatedCount'\n ),\n requestedRedeliveryCount: titleModel.get(\n 'redeliveriesRequestedCount'\n ),\n };\n } else if (event === 'titleSuspendCancelled') {\n return {\n autoRedeliveriesCount: titleModel.get(\n 'redeliveriesAutomatedCount'\n ),\n requestedRedeliveryCount: titleModel.get(\n 'redeliveriesRequestedCount'\n ),\n };\n } else {\n return {};\n }\n }\n}\n","\nexport default class TrackingKindleFulfillment {\n get isDebug() {\n return _(window.ga).isEmpty();\n }\n\n get debugInstance() {\n return {\n push: ({ event, content }) => {\n console.log(`ga:log(\"${event}\"):`, content); // eslint-disable-line no-console\n }\n };\n }\n\n constructor(bus) {\n this.bus = bus;\n\n this._dataLayer = window.dataLayer || this.debugInstance;\n\n this.bus\n .on('preferences:global:update:success',({context, source}) => this.pushEvent({context, source}));\n }\n\n pushEvent({context, source}) {\n if (_(Object.keys(context.changed)).contains('kindleFulfillment')) {\n this._dataLayer.push({\n event: 'kindleFulfillment',\n content: {\n source, // settings_page, results_filter, or content_fulfillment\n value: context.changed.kindleFulfillment\n }\n });\n }\n }\n}\n","\nexport default class TrackingPublicApiFulfillment {\n get isDebug() {\n return _(window.ga).isEmpty();\n }\n\n get debugInstance() {\n return {\n push: ({ event, content }) => {\n console.log(`ga:log(\"${event}\"):`, content); // eslint-disable-line no-console\n }\n };\n }\n\n constructor(bus) {\n this.bus = bus;\n\n this._dataLayer = window.dataLayer || this.debugInstance;\n\n this.bus\n .on('apifulfillment:render', (params) => this.pushEvent(params, \"lhtngAPIPlutoRender\"))\n .on('apifulfillment:fulfill', (params) => this.pushEvent(params, \"lhtngAPIPlutoFulfill\"))\n .on('apifulfillment:appStore', (params) => this.pushEvent(params, \"lhtngAPIPlutoAppStore\"))\n .on('apifulfillment:textGen', (params) => this.pushEvent(params, \"lhtngAPIPlutoTextGen\"))\n .on('apifulfillment:textDone', (params) => this.pushEvent(params, \"lhtngAPIPlutoTextDone\"))\n .on('apifulfillment:errors', (params) => this.pushEvent(params, 'lhtngAPIPlutoErrors'))\n }\n\n pushEvent(context, eventName) {\n this._dataLayer.push({\n event: eventName,\n content: context\n });\n }\n}\n","export default class TrackingSignInForms {\n constructor(bus) {\n this.bus = bus;\n\n this._dataLayer = window.dataLayer || this.debugInstance;\n\n this.bus\n .on('signIn:library', (params) =>\n this.pushSignInEvent(params, 'Library Card Sign In')\n )\n .on('signIn:external', (params) =>\n this.pushSignInEvent(params, 'External Sign In')\n )\n .on('signIn.email', (params) =>\n this.pushSignInEvent(params, 'Email Sign In')\n )\n .on('signIn:mobileNum', (params) =>\n this.pushSignInEvent(params, 'Mobile Number Sign In')\n )\n .on('signIn:geo', (params) =>\n this.pushSignInEvent(params, 'Geo Sign In')\n )\n .on('mobile:code:verified', (params) =>\n this.pushSignInEvent(params, 'Mobile Number Code Verified')\n )\n .on('mobile:code:sent', (params) =>\n this.pushSignInEvent(params, 'Send Mobile Verification Code')\n )\n .on('mobile:code:resent', (params) =>\n this.pushSignInEvent(params, 'Resend Mobile Verification Code')\n )\n .on('email:code:sent', (params) =>\n this.pushSignInEvent(params, 'Send Email Verification Code')\n )\n .on('email:code:resent', (params) =>\n this.pushSignInEvent(params, 'Resend Email Verification Code')\n )\n .on('email:code:verified', (params) =>\n this.pushSignInEvent(params, 'Email Code Verified')\n )\n\n .on('mobile:register:code:sent', () =>\n this.pushRegisterEvent('Send Mobile verification code')\n )\n .on('mobile:register:code:resent', () =>\n this.pushRegisterEvent('Resend Mobile verification code')\n )\n .on('mobile:register:code:verified', () =>\n this.pushRegisterEvent('Mobile Number Code Verified')\n )\n .on('mobile:register:submit', () =>\n this.pushRegisterEvent('Form submit')\n )\n\n .on('geo:register:view', () =>\n this.pushRegisterEvent('View geo login page')\n )\n .on('geo:register:accept:start', () =>\n this.pushRegisterEvent('Initiated geo auth')\n )\n .on('geo:register:accept:success', () =>\n this.pushRegisterEvent('Geo auth success')\n )\n .on('geo:register:accept:fail', () =>\n this.pushRegisterEvent('Geo auth failure')\n );\n }\n\n get debugInstance() {\n return {\n push: ({ event, content }) => {\n console.log(`ga:log(\"${event}\"):`, { event, content }); // eslint-disable-line no-console\n },\n };\n }\n\n pushSignInEvent(selectedILS, action) {\n let content = {\n event: 'auth',\n eventCategory: 'Authentication',\n eventAction: action,\n eventLabel: selectedILS,\n };\n\n this._dataLayer.push(content);\n }\n\n pushRegisterEvent(action) {\n let content = {\n event: 'register',\n eventCategory: 'Sign up',\n eventAction: 'Get a card',\n eventLabel: action,\n };\n\n this._dataLayer.push(content);\n }\n}\n","import { toStaticUrl } from '../../../../lib/assetMapper';\n\nexport default () => `\n
      \n \n

      ${text('tlsWarning.noAccess')}

      \n

      ${text('tlsWarning.description')}

      \n

      ${text(\n 'tlsWarning.learnMore'\n )}

      \n \n
      \n`;\n","import { Modal } from '../common/modal';\nimport template from './tlsWarningModal.html';\nimport keys from '../../util/keycodes';\n\nexport default class TlsWarningModal extends Modal {\n constructor() {\n let content = template();\n let modalContents = {\n classes: ['small', 'tlsWarningModal'],\n title: window.html('tlsWarning.title'),\n hiddenTitle: true,\n content\n };\n\n super(modalContents);\n }\n\n close() {\n this.setCookie();\n super.close();\n }\n\n setCookie() {\n Cookies.remove('tls-final-warning', {path: '/'});\n Cookies.set('tls-final-warning', 'dismissed', {path: '/', expires: 14});\n }\n}","import BaseView from '../../views/base.js';\nimport { standardToast } from './toaster.html';\nconst fs = require('fs');\nconst path = require('path');\nconst template = fs.readFileSync(\n path.join(__dirname, '/templates/toaster.html'),\n 'utf8'\n);\n\nconst APPLE_APP_STORE_HREF =\n 'https://itunes.apple.com/us/app/libby-by-overdrive-labs/id1076402606?pt=211483&ct=meetLibby&mt=8&utm_medium=pop_up&utm_source=overdrive_app&utm_campaign=switch_to_libby&utm_content=odapp_popup_apple_store';\nconst GOOGLE_PLAY_STORE_HREF =\n 'https://play.google.com/store/apps/details?id=com.overdrive.mobile.android.libby&referrer=utm_source%3Dmeet_libby&utm_medium=pop_up&utm_source=overdrive_app&utm_campaign=switch_to_libby&utm_content=odapp_popup_google_play';\n\nconst Toaster = BaseView.extend({\n className: 'Toaster js-toasterContent',\n\n timeout: null,\n\n line: null,\n\n loaf: [],\n\n staleLoaf: [],\n\n currentToast: {},\n\n hooks: {\n timer: '.js-toastTimer',\n message: '.js-toastMessage',\n toast: '.js-toast',\n close: '.js-closeToast',\n },\n\n toasterTypes: {\n message: '',\n system: 'is-system',\n error: 'is-burnt',\n userAction: 'is-userAction',\n },\n\n template: _.template(template),\n\n events() {\n return {\n [`click ${this.hooks.close}`]: 'closeToast',\n };\n },\n\n initialize({ target }) {\n this.target = target;\n },\n\n closeToast() {\n const $element = this.$(this.hooks.message);\n const breadId = $element.attr('id');\n\n const keys = {\n 'auto-checkout-toast': { name: 'auto-checkout-toast', value: '1' },\n };\n const value = keys[breadId];\n if (value) {\n Cookies.remove(value.name, { path: '/' });\n Cookies.set(value.name, value.value, { path: '/', expires: 365 });\n }\n\n if (breadId === 'system-toast') {\n const messageId = parseInt($element.attr('data-message-id'), 10);\n const cookie = Cookies.get('system-messaging');\n let newCookie = {};\n\n if (cookie) {\n const cookieJSON = JSON.parse(cookie);\n\n // If the cookie has an attribute, the cookie is valid JSON\n if (cookieJSON.oldest || cookieJSON.newest) {\n newCookie = {\n oldest: cookieJSON.oldest,\n newest: cookieJSON.newest,\n };\n\n if (parseInt(cookieJSON.oldest, 10) > messageId) {\n newCookie.oldest = messageId;\n }\n\n if (parseInt(cookieJSON.newest, 10) < messageId) {\n newCookie.newest = messageId;\n }\n } else {\n // User has old cookie value that was only an integer\n // Setting this way to get the form of the proper cookie\n newCookie = {\n oldest: messageId,\n newest: messageId,\n };\n }\n } else {\n // User does not have system-messaging cookie set\n newCookie = {\n oldest: messageId,\n newest: messageId,\n };\n }\n\n Cookies.remove('system-messaging', { path: '/' });\n Cookies.set('system-messaging', newCookie, {\n path: '/',\n expires: 365,\n });\n }\n\n if (breadId == 'tls-warning') {\n Cookies.remove('tls-warning', { path: '/' });\n Cookies.set('tls-warning', 'dismissed', { path: '/', expires: 14 });\n }\n\n this.pop();\n // If there was a toast displaying already when the just closed toast was pushed, display that toast\n if (this.staleLoaf.length > 0) {\n this.loaf.push(this.staleLoaf.pop());\n }\n this.currentToast = {};\n this.showNextToast();\n },\n\n /*\n * Ensures newly generated toast is visible.\n */\n ensureVisibility() {\n this.ensureOnTop();\n this.ensureInViewport();\n this.setPlaceholderHeight();\n },\n\n /*\n * Show newly popped toast on top of modal background\n */\n ensureOnTop() {\n if ($('.reveal-modal.open').hasClass('HoldSuccessModal')) {\n this.$el.css({\n 'z-index': '99999',\n '-webkit-transform': 'translate3d(0,0,1px)',\n transform: 'translate3d(0,0,1px)',\n position: 'fixed',\n top: '0!important',\n });\n } else {\n this.$el.css({\n position: 'inherit',\n });\n }\n },\n\n /*\n * Automatically scroll to top of page on earlier android devices.\n * (They do not support position:fixed well).\n */\n ensureInViewport() {\n if (bowser && bowser.android) {\n const androidVersion = parseInt(bowser.osversion, 10);\n if (androidVersion < 3) {\n $(window).scrollTop(0);\n }\n }\n },\n\n // Set height of toast placeholder so the page doesn't jump\n setPlaceholderHeight() {\n $('.js-toastPlaceholder').css('height', this.$el.height());\n },\n\n /*\n * Generate a success toast message\n * @param {string} bread The message to place in the toast\n * @param {string} toasterType Type of toast\n * @param {string} id Id of the toast\n * @param {int} messageId Message id of system toasts. Needed only for system toasts\n */\n push(message, toasterType = 'message', id = '', messageId = 0) {\n if (message && message !== '') {\n this.loaf.push({ message, toasterType, id, messageId });\n }\n this.showNextToast();\n },\n\n /*\n * Push array of system messages to loaf\n * @param msgArr Array of system messages\n */\n bulkSystemMsgPush(msgArr) {\n let messages = msgArr;\n\n this.loaf = this.loaf.concat(messages);\n this.showNextToast();\n },\n\n /*\n * Show next message in loaf\n */\n showNextToast() {\n if (this.loaf.length > 0) {\n const nextToast = this.loaf.pop();\n nextToast.toasterType =\n this.toasterTypes[nextToast.toasterType] ||\n nextToast.toasterType;\n // Do not stack user action (borrow, hold, wishlist) toasts\n if (\n !_.isEmpty(this.currentToast) &&\n this.currentToast.toasterType !== this.toasterTypes.userAction\n ) {\n this.staleLoaf.push(this.currentToast);\n }\n this.generateToast(nextToast);\n this.currentToast = nextToast;\n this.ensureVisibility();\n } else {\n // Stop showing toast placeholder\n $('.js-toastPlaceholder').hide();\n $(window).unbind('scroll.toast');\n }\n },\n\n /*\n * Generate toast UI\n * @param data Toast object\n */\n generateToast(data) {\n if (\n featureManager.isEnabled('Notifications') &&\n window.notificationDrawer &&\n window.notificationDrawer.isOpen\n ) {\n window.notificationDrawer.close();\n }\n\n const defaultTemplateData = {\n appleAppStoreHref: APPLE_APP_STORE_HREF,\n googlePlayStoreHref: GOOGLE_PLAY_STORE_HREF,\n highContrast: window.OverDrive.highContrast,\n hooks: this.hooks,\n messageId: 0,\n toasterType: this.toasterTypes.message,\n };\n const templateData = _.extend({}, defaultTemplateData, data);\n this.pop();\n\n this.template = standardToast;\n\n this.render({ templateData });\n\n this._stickToast();\n $(window).on('orientationchange', () => {\n this._stickToast();\n });\n $(window).on('resize', () => {\n this._stickToast();\n });\n\n this.$(this.hooks.message).focus();\n },\n\n /*\n * Remove the currently displayed toast message\n */\n pop() {\n const toast = this.$(this.hooks.toast);\n toast.removeClass('animated fadeIn').addClass('animated fadeOut');\n toast.one(\n 'webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend',\n toast.remove()\n );\n },\n\n /*\n * Make the toast message sticky\n * @private\n */\n _stickToast() {\n const width = $(window).width();\n const scrollTop =\n $(window).scrollTop() - $('.js-toaster').outerHeight(true);\n const toast = this.$el;\n const skipHeight = $('div.skip-links').is(':visible')\n ? $('div.skip-links').outerHeight(true)\n : 0;\n const mobileNavHeight = $('.js-mobileNav').outerHeight(true);\n const navMenuHeight = $('.js-nav').is(':visible')\n ? $('.js-nav').outerHeight(true)\n : 0;\n const expandedSearchHeight = $('.js-nav-search-drop').is(':visible')\n ? $('.js-nav-search-drop').outerHeight(true)\n : 0;\n let navHeight = 0;\n\n // Mobile toaster logic\n if (width <= 870) {\n navHeight = navMenuHeight + mobileNavHeight + skipHeight;\n } else if (width > 870) {\n // Desktop toaster logic\n navHeight = navMenuHeight + expandedSearchHeight + skipHeight;\n }\n\n // If the hold success modal is open, take special action with toast\n // Otherwise, handle toast as normal\n if ($('.reveal-modal.open').hasClass('js-holdSuccessModal')) {\n // Sets position to fixed and top to 0\n toast.addClass('sticky');\n } else {\n this.$el.css({\n position: 'inherit',\n 'z-index': '998',\n });\n\n toast.css('top', navHeight);\n if (scrollTop >= navHeight) {\n toast.addClass('sticky');\n $('.js-toastPlaceholder').show();\n } else {\n toast.removeClass('sticky');\n $('.js-toastPlaceholder').hide();\n }\n\n $(window).on('scroll.toast', () => {\n toast.toggleClass('sticky', $(window).scrollTop() > navHeight);\n if (toast.hasClass('sticky')) {\n $('.js-toastPlaceholder').show();\n } else {\n $('.js-toastPlaceholder').hide();\n }\n });\n }\n },\n});\n\nexport default new Toaster({ target: '.js-toaster' });\n","import { toStaticUrl } from '../../../../lib/assetMapper';\nimport { libbyAppGroup } from '../libby-app-group/libby-app-group.html';\n\nconst html = (key) => window.html(key);\n\nconst toast = ({\n columns = 10,\n id,\n message,\n messageId,\n showDismissButton,\n toasterType,\n}) => `\n
      \n
      \n
      \n
      \n
      \n ${message}\n
      \n \n ${\n showDismissButton\n ? `\n \n `\n : ''\n }\n
      \n
      \n
      \n
      \n`;\n\nexport const standardToast = ({ id, message, messageId, toasterType }) =>\n toast({ id, message, messageId, showDismissButton: true, toasterType });\n","import { Modal } from '../common/modal';\n\nconst { text } = window;\n\nexport default class VisitorActionDisallowedModal extends Modal {\n constructor(action) {\n let actionText = text(`visitorActionDisallowedModal.${action.trim().toLowerCase()}`);\n if (!actionText) {\n throw new Error(`'${action}' is not a supported action`);\n }\n let message = text('visitorActionDisallowedModal.message', {libraryName: window.OverDrive.libraryName, action: actionText});\n const modalContents = {\n classes: ['VisitorActionDisallowedModal'],\n title: text('visitorActionDisallowedModal.heading'),\n content: `

      ${message}

      \n
      \n \n
      `\n };\n\n super(modalContents);\n\n this.$el.find('.confirm-button').on('click', () => {\n this.close();\n });\n }\n}\n","import createComponentQuickSearchComponent from './components/quick_search/main.js';\nimport createHoldsRatioModalComponent from './components/holdInformation/main.js';\nimport createLanguageSelectionComponent from './components/language_selection/main.js';\nimport createMobileAccountMenuComponent from './components/mobile_account_menu/main.js';\nimport expensiveDomTraversalForDyslexicIfCookiePleaseDoNotUse from './util/dyslexic/expensiveDomTraversalForDyslexicIfCookiePleaseDoNotUse.js';\nimport { removeCarouselFunctionForOldAndroid } from './util/compatibility/removeCarouselFunctionality.js';\nimport HistoryEventTracker from './components/history_event_tracker/HistoryEventTracker';\nimport svgLoader from './util/svgLoader';\nimport CookieSettingsModal from './components/cookie_settings_modal/cookieSettingsModal';\nimport NotificationDrawer from './components/notifications_drawer/NotificationsDrawer';\nimport keys from '../ecmascript/util/keycodes';\nimport TlsWarningModal from './components/tls-warning-modal/tlsWarningModal.js';\n\n/*\n * A function full of functions to be run on document ready\n */\nconst onDocumentReady = function () {\n if (!window.OverDrive.isMinimalLayout) {\n createLanguageSelectionComponent({\n el: document.querySelector('.js-languageSelection'),\n footerEl: document.querySelector('.js-languageSelectionFooter'),\n mobileEl: document.querySelector('.js-languageMobileSelection'),\n mobileFooterEl: document.querySelector(\n '.js-languageMobileSelectionFooter'\n ),\n });\n\n // Create and attach holds ratio help modal\n createHoldsRatioModalComponent({\n el: document.querySelector('body'),\n });\n\n // Create and attach desktop autocomplete component\n createComponentQuickSearchComponent({\n searchEl: document.querySelector('.js-desktopSearchContainer'),\n autocompletionsEl: document.querySelector(\n '.js-quickSearchAutocompletionsDesktop'\n ),\n toggleSearchEl: $('.desktop .js-toggleSearch'),\n options: { desktop: true },\n });\n\n // Create and attach mobile autocomplete component\n createComponentQuickSearchComponent({\n searchEl: document.querySelector('.js-mobileSearchContainer'),\n autocompletionsEl: document.querySelector(\n '.js-quickSearchAutocompletionsMobile'\n ),\n toggleSearchEl: $('.desktop .js-toggleSearch'),\n options: { mobile: true },\n });\n\n createMobileAccountMenuComponent({\n el: document.querySelector('.nav-container'),\n });\n\n // Do expensive traversal for dyslexic if cookie set\n expensiveDomTraversalForDyslexicIfCookiePleaseDoNotUse();\n\n // Remove carousel functionality on old androids\n removeCarouselFunctionForOldAndroid(bowser);\n\n // new history tracker using cookies for auto scroll and back button redirect\n new HistoryEventTracker();\n\n svgLoader();\n\n if (window.OverDrive.showCookieSettingsModal) {\n new CookieSettingsModal({ isDismissable: false }).render();\n }\n\n $('.cookieSettingsButton').on('click', () => {\n new CookieSettingsModal({ isDismissable: true }).render();\n });\n\n if (\n window.featureManager.isEnabled('Notifications') &&\n window.OverDrive.isAuthenticated\n ) {\n // We don't want to attach this to both the mobile and desktop nav targets simultaneously.\n window.notificationDrawer = new NotificationDrawer();\n }\n }\n\n if (\n toaster &&\n window.OverDrive.insufficientTls &&\n window.featureManager.isEnabled('show-tls-version-warning') &&\n !Cookies.get('tls-warning')\n ) {\n var link = `${window.html(\n 'tlsWarning.learnMore'\n )} >`;\n toaster.push(\n `${window.html('tlsWarning.noAccess')} ${link}`,\n 'error',\n 'tls-warning'\n );\n }\n\n if (window.OverDrive.showTlsWarningModal) {\n new TlsWarningModal();\n }\n\n // Close foundation dropdowns with ESC and return focus to parent\n $(document).keyup(function (e) {\n if (\n window.featureManager.isEnabled('close-dropdowns-on-esc') &&\n e.which === keys.ESC &&\n $('.f-open-dropdown').length > 0\n ) {\n var id = $('.f-open-dropdown').attr('id');\n $(document).foundation('dropdown', 'closeall');\n $(`[data-dropdown=${id}]`).focus();\n }\n });\n};\n\nexport default onDocumentReady;\n","import onDocumentReady from './document_ready';\nimport onWindowPageshow from './window_pageshow';\n\n// ****** Bindings To Native Events On Window ******\n$(window).bind('pageshow', onWindowPageshow);\n\n// ****** Bindings To Native Events On Document ******\n$(document).ready(onDocumentReady);\n\nif (window.OverDrive.features.isEnabled('ajax-error-reporting')) {\n $.ajaxPrefilter((_, __, jqXhr) => {\n jqXhr._callStack = new Error().stack;\n });\n\n $(document).ajaxError((event, jqXhr, settings) => {\n try {\n // No need to report if the ajaxError endpoint is also failing (will calls an infinite loop)\n if (settings.url === '/api/reporting/ajaxError') {\n return;\n }\n\n $.post(window.url(window.routes.api.reporting.ajaxError), {\n callStack: jqXhr._callStack,\n eventType: event.type,\n pageHref: window.location.href,\n requestDataType: settings.dataType,\n requestMethod: settings.type,\n requestUrl: settings.url,\n responseStatusCode: jqXhr.status,\n responseText: jqXhr.responseText\n });\n } catch (err) { }\n });\n}\n","// Remove all of these ASAP\n// TODO: The number of accesses to ambient function bits seems to be mounting, trying to decide if there is a better way to reference these\n// Idea! - Make a class that is an aggregate of all the .locals functions and expose it such that the front and back end can import it\n\n// Imports for Global Namespace Purposes\nimport { removeQueryParam } from './util/query.js';\nimport { url, routes } from './util/routes.js';\nimport { html, text } from '../../lib/i18n/browser';\nimport stripNoLinkedCardQuery from './util/url/stripNoLinkedCardQuery.js';\nimport getCookieExplanation from './util/toast/getCookieExplanation.js';\nimport rfc3986EncodeURIComponent from './util/encoding/rfc3986EncodeURIComponent.js';\nimport scrollCarousel from './util/carousel/scrollCarousel.js';\nimport hideCarouselArrowsForEl from './util/carousel/hideCarouselArrows.js';\nimport hideArrowsOnEndOfScrollForEl from './util/carousel/hideArrowsOnEndOfScroll.js';\nimport arrowTabAccountMenu from './util/account/arrowTabAccountMenu.js';\nimport arrowTabMenu from './util/compatibility/arrowTabMenu.js';\nimport onunload from './util/compatibility/onunload.js';\nimport getQueryParams from './util/url/getQueryParams.js';\nimport addDays from './util/dates/addDays.js';\nimport replaceQueryParam from './util/url/replaceQueryParam.js';\nimport addQueryParam from './util/url/addQueryParam.js';\nimport componentToHex from './util/colors/componentToHex.js';\nimport rgbToHex from './util/colors/rgbToHex.js';\nimport processInstantForwardActions from './util/title-actions/processInstantForwardActions.js';\nimport setUserStarRating from './util/title-actions/setUserStarRating.js';\nimport fillStars from './util/title-actions/fillStars.js';\nimport selectStarRating from './util/title-actions/selectStarRating.js';\nimport openHoldConflictModal from './util/title-actions/openHoldConflictModal.js';\nimport handleForwardActionHold from './util/title-actions/handleForwardActionHold.js';\nimport noCard from './util/noCard.js';\nimport findFormatId from './util/findFormatId.js';\nimport toaster from './components/toaster/app.js';\nimport Title from './components/media/models/Title.js';\nimport buildFeatureManager from '../../lib/featureManagerBuilder';\nimport supportUrl from '../../lib/supportUrl';\nimport AppPromoManager from '../../lib/appPromoManager';\nimport './polyfills/custom-event';\n\n// Attaching Functions to Global Namespace\nwindow.featureManager = buildFeatureManager(\n OverDrive.libraryConfigurations,\n OverDrive.tenant,\n OverDrive.allFeatures,\n OverDrive.features\n);\nwindow.Title = Title;\nwindow.removeQueryParam = removeQueryParam;\nwindow.routes = routes;\nwindow.url = url;\nwindow.supportUrl = supportUrl;\nwindow.html = html;\nwindow.text = text;\nwindow.stripNoLinkedCardQuery = stripNoLinkedCardQuery;\nwindow.getCookieExplanation = getCookieExplanation;\nwindow.rfc3986EncodeURIComponent = rfc3986EncodeURIComponent;\nwindow.scrollCarousel = scrollCarousel;\nwindow.hideCarouselArrows = hideCarouselArrowsForEl;\nwindow.hideArrowsOnEndOfScroll = hideArrowsOnEndOfScrollForEl;\nwindow.arrowTabAccountMenu = arrowTabAccountMenu;\nwindow.arrowTabMenu = arrowTabMenu;\nwindow.onunload = onunload;\nwindow.getQueryParams = getQueryParams;\nwindow.addDays = addDays;\nwindow.replaceQueryParam = replaceQueryParam;\nwindow.addQueryParam = addQueryParam;\nwindow.componentToHex = componentToHex;\nwindow.rgbToHex = rgbToHex;\nwindow.processInstantForwardActions = processInstantForwardActions;\nwindow.setUserStarRating = setUserStarRating;\nwindow.fillStars = fillStars;\nwindow.selectStarRating = selectStarRating;\nwindow.openHoldConflictModal = openHoldConflictModal;\nwindow.handleForwardActionHold = handleForwardActionHold;\nwindow.noCard = noCard;\nwindow.findFormatId = findFormatId;\nwindow.toaster = window.OverDrive.isTolinoDevice ? undefined : toaster;\nwindow.appPromoManager = AppPromoManager.createClient(window);\n\n/**\n * Global event handler\n * Used for consuming component level events that are better\n * handled at the global level\n * Do not go attaching events to this all willy nilly!\n */\nwindow.globalEvents = _.clone(window.Backbone.Events);\n\ndocument.dispatchEvent(new CustomEvent('global-bootstrapping-ready'));\n","const routes = window.routes;\nconst Cookies = window.Cookies;\nconst numbers = require('../../../lib/numbers');\n\nexport default class Card extends Backbone.Model {\n url = routes.rest.account.get;\n\n defaults() {\n return {\n holdLimit: 0,\n accounts: [],\n lastHoldEmail: '',\n bestLibraryKey: '',\n displayName: '',\n email: '',\n canPlaceHolds: true,\n isVisitingCard: false,\n\n checkoutLimitsByMediaType: {\n periodical: 0,\n video: 0,\n audiobook: 0,\n ebook: 0,\n },\n };\n }\n\n // 'Client Account Cookie' - AuthUtility is aware of this cookie and clears is on SignOut\n _key = '_cac';\n\n constructor() {\n super(...arguments);\n\n if (\n window.OverDrive.isAuthenticated &&\n window.OverDrive.hasLinkedCards\n ) {\n if (this._hasCachedModel) {\n this.set(this._cacheGet());\n\n // _fetch should only be used for async syncing and not for raw data access\n this._fetch = Promise.resolve();\n } else {\n this._fetch = this.fetch();\n this._fetch.then(() => this._cacheSet(this.attributes));\n }\n }\n }\n\n setHoldEmail(email) {\n this.set({ lastHoldEmail: email });\n\n this._cacheSet(this.attributes);\n }\n\n get preferredHoldEmail() {\n return this.get('lastHoldEmail') || this.get('this.email') || '';\n }\n\n get _hasCachedModel() {\n return !_(this._cacheGet()).isEmpty();\n }\n\n get canPlaceHolds() {\n return this.get('canPlaceHolds');\n }\n\n get isVisitingCard() {\n return this.get('isVisitingCard');\n }\n\n setAllowReadingHistory(allow) {\n this.set('allowReadingHistory', !!allow);\n this._cacheSet(this.attributes);\n }\n\n _cacheGet() {\n return JSON.parse(Cookies.get(this._key) || '{}');\n }\n\n cacheReset() {\n if (\n window.OverDrive.isAuthenticated &&\n window.OverDrive.hasLinkedCards\n ) {\n Cookies.remove(this._key);\n this._fetch = this.fetch();\n return this._fetch.then(() => this._cacheSet(this.attributes));\n }\n return Promise.resolve();\n }\n\n _cacheSet(model) {\n Cookies.set(this._key, JSON.stringify(model), {\n expires: new Date(\n new Date().getTime() + 10 * numbers.minuteInMilliseconds\n ),\n });\n }\n}\n","import numbers from '../../../lib/numbers';\n\nconst { url, routes, Cookies } = window;\n\n// Fakeing in the path for now ...\nroutes.rest.preferences = { global: { index:'/rest/preferences/global/' } };\n\nexport default class GlobalPreferences extends Backbone.Model {\n\n // Cookie Cache Key: 'Global Account Preferences'\n _key = '_gap'\n\n url() { return url(routes.rest.preferences.global.index); }\n isNew() { return false; }\n\n defaults() {\n return {\n kindleFulfillment: null\n };\n }\n\n constructor(attributes, { bus }) {\n super(...arguments);\n this.bus = bus;\n\n this._initCache();\n }\n\n setKindleFulfillmentPreference(enabled = true, source) {\n return new Promise((resolve, reject) => {\n this.save({ kindleFulfillment: !!enabled }, {\n patch : true,\n wait : true,\n success : (context) => {\n this.bus.trigger('preferences:global:update:success', { context, source });\n this._cacheSet(this.attributes);\n resolve();\n },\n error : (error) => {\n reject(error);\n }\n });\n });\n }\n\n\n // -- Caching Functionality -----------------------------------------------\n _initCache() {\n if (window.OverDrive.isAuthenticated && window.OverDrive.hasLinkedCards) {\n if (this._hasCachedModel) {\n this.set(this._cacheGet());\n\n // _fetch should only be used for async syncing and not for raw data access\n this._fetch = Promise.resolve();\n } else {\n this._fetch = this.fetch();\n this._fetch.then(() => {\n this._cacheSet(this.attributes);\n });\n }\n }\n }\n\n _cacheGet() {\n return JSON.parse(Cookies.get(this._key) || '{}');\n }\n\n _cacheSet(model) {\n Cookies.set(this._key, JSON.stringify(model), {\n expires: new Date(new Date().getTime() + 10 * numbers.minuteInMilliseconds)\n });\n }\n\n get _hasCachedModel() {\n return !_(this._cacheGet()).isEmpty();\n }\n}\n","// import when we move more to modules\nexport default window.Backbone.Model;\n","/* node-env browser */\n\nimport BaseModel from './base';\n\nconst toJSONMapper = {\n automaticHoldCheckout: 'auto-checkout-setting',\n audience: 'audience-setting',\n highContrast: 'high-contrast',\n dyslexic: 'dyslexic',\n languageSelection: 'language-selection',\n kindleFulfillment: 'kindleFulfillment',\n};\n\nconst PreferencesModel = BaseModel.extend({\n initialize() {\n this.on('change:automaticHoldCheckout', this.updateHolds.bind(this));\n },\n\n url() {\n return window.url(window.routes.preferences);\n },\n\n isNew() {\n return false;\n },\n\n getParsedAudience(audience) {\n return _.filter(\n _.map(_.pairs(audience), (item) => item[1] === true && item[0])\n );\n },\n\n parseBootstrappedData({\n audience,\n highContrast,\n automaticHoldCheckout,\n dyslexic,\n languageSelection,\n kindleFulfillment,\n }) {\n this.set(\n _.extend(\n { audience: this.getParsedAudience(audience) },\n {\n automaticHoldCheckout: !!automaticHoldCheckout,\n highContrast: !!highContrast,\n dyslexic: !!dyslexic,\n languageSelection,\n kindleFulfillment,\n }\n ),\n { silent: true }\n );\n },\n\n getPatchData() {\n const changedAttributes = _.keys(this.changedAttributes());\n const toJSON = this.toJSON();\n const data = {};\n\n changedAttributes.forEach((item) => {\n data[toJSONMapper[item]] = toJSON[toJSONMapper[item]];\n });\n\n return _.omit(data, (value) => value === void 0);\n },\n\n toJSON() {\n const toJSON = {\n [toJSONMapper.audience]: this.get('audience'),\n [toJSONMapper.automaticHoldCheckout]: this.get(\n 'automaticHoldCheckout'\n ),\n [toJSONMapper.highContrast]: this.get('highContrast'),\n [toJSONMapper.dyslexic]: this.get('dyslexic'),\n [toJSONMapper.languageSelection]: this.get('languageSelection'),\n [toJSONMapper.kindleFulfillment]: this.get('kindleFulfillment'),\n };\n return _.omit(toJSON, (value) => value === void 0);\n },\n\n updateHolds() {\n // Updates all previously held items to match new autocheckout setting\n const autoCheckout = this.get('automaticHoldCheckout');\n $.ajax({\n url: window.url(window.routes.updateHoldSettings),\n contentType: 'application/json',\n type: 'POST',\n data: JSON.stringify({ shouldAutoCheckout: autoCheckout }),\n });\n },\n});\n\nexport default PreferencesModel;\n","import 'es5-shim';\nimport 'babel-polyfill';\n\nimport _onlyForBootstrapping from '../global_bootstrapping.js';\nimport _onlyForBindings from '../global_bindings.js';\n\nimport Logger from '../util/logging/logger';\nimport EventBridge from '../components/site/EventBridge';\nimport Card from '../models/Card';\nimport GlobalPreferences from '../models/GlobalPreferences';\nimport HighlightedFeatureState from '../../../models/HighlightedFeatureState';\nimport FeatureHighlightManager from '../util/FeatureHighlightManager';\nimport CookieConfig from '../../../lib/cookieConfig';\n\nwindow.Logger = Logger;\n\nvoid (_onlyForBootstrapping, _onlyForBindings);\n\nwindow.globalPreferences = new GlobalPreferences({}, { bus: window.globalEvents });\nwindow.card = new Card();\n\nvoid (new EventBridge({\n bus : window.globalEvents,\n card : window.card,\n patronSettings : window.patronSettings,\n featureManager : window.featureManager,\n globalPreferences : window.globalPreferences\n}));\n\nwindow.OverDrive.highlightedFeatureState = new HighlightedFeatureState(Cookies.get(CookieConfig.visitedFeatures.name) || '0', window.featureManager, window.OverDrive.hasPartnerLibraries);\nwindow.OverDrive.featureHighlightManager = new FeatureHighlightManager(window.OverDrive.highlightedFeatureState);\n","(() => {\n if (typeof window.CustomEvent === 'function') {\n return false;\n }\n\n const CustomEvent = (type, eventInitDict) => {\n const event = document.createEvent('CustomEvent');\n if (eventInitDict) {\n event.initCustomEvent(type, eventInitDict.bubbles, eventInitDict.cancelable, eventInitDict.detail);\n } else {\n event.initCustomEvent(type);\n }\n return event;\n };\n\n CustomEvent.prototype = window.Event.prototype;\n window.CustomEvent = CustomEvent;\n})();\n","import { Modal } from '../components/common/modal';\n\nexport default class Preview {\n constructor(bus) {\n this.bus = bus;\n }\n\n giveSample(titleModel){ \n let opts = {\n autoShow: false,\n title: titleModel.get('title'),\n content: ``,\n classes: ['sample-modal'],\n closeOnEsc : true,\n closeOnBlur : true,\n showCloseButton: true\n };\n this.modal = new Modal(opts);\n this.modal.show();\n }\n}\n","import Borrow from './borrow/Borrow';\nimport Wishlist from './wishlist/Wishlist';\nimport Hold from './holds/Hold';\nimport Nook from './nook/Nook';\nimport StarRating from './ratings/StarRating';\nimport ReadingHistory from './history/ReadingHistory';\n\nimport LanguageMismatch from './checks/LanguageMismatch/LanguageMismatch';\nimport LanguageMismatchModal from './checks/LanguageMismatch/LanguageMismatchModal';\nimport Preview from './Preview';\n\nexport default class TitleActionHandler {\n constructor(bus, card, patronSettings) {\n this.bus = bus;\n this.card = card;\n this.patronSettings = patronSettings;\n\n this._borrow = new Borrow(this.bus);\n this._hold = new Hold(this.bus, this.card);\n this._wishlist = new Wishlist(this.bus);\n this._nook = new Nook(this.bus);\n this._rating = new StarRating(this.bus);\n this._history = new ReadingHistory(this.bus);\n this._preview = new Preview(this.bus);\n\n this.bus\n .on('title:borrow', (title, context) =>\n this.perform('borrow', title, context)\n )\n .on('title:hold', (title, context) =>\n this.perform('hold', title, context)\n )\n .on('title:hold-cancel', (title, context) =>\n this.perform('holdCancel', title, context)\n )\n .on('title:wishlist', (title, context) =>\n this.perform('wish', title, context)\n )\n .on('title:nook', (title, context) =>\n this.perform('nook', title, context)\n )\n .on('title:rating', (title, context) =>\n this.perform('rating', title, context)\n )\n .on('title:history', (title, context) =>\n this.perform('history', title, context)\n )\n .on('title:preview', (title, context) =>\n this.perform('preview', title, context)\n )\n .on('title:renew', (title, context) =>\n this.perform('renew', title, context)\n )\n .on('title:requestAgain', (title, context) =>\n this.perform('requestAgain', title, context)\n );\n }\n\n perform(action, titleModel, context) {\n if (!window.OverDrive.isAuthenticated && action !== 'preview') {\n this._redirectToAuth(\n action,\n titleModel.id,\n titleModel.get('tempStarRating')\n );\n } else if (\n !window.OverDrive.hasLinkedCards &&\n !window.featureManager.isEnabled('sampleOnlyMode')\n ) {\n let titleAction = titleModel.get('titleState');\n if (action === 'rating') {\n titleAction = `rating~${titleModel.get('tempStarRating')}`;\n }\n this.bus.trigger('user:card:none', { action: titleAction });\n } else if (typeof this._actions[`${action}`] === 'function') {\n this._executeAction(action, titleModel, context);\n }\n\n return;\n }\n\n _redirectToAuth(action, id, rating) {\n let actionStr = `${action}~${id}`;\n if (rating) {\n actionStr += `~${rating}`;\n }\n window.location = window.url(window.routes.accountSignIn, {\n forward:\n window.location.pathname +\n window.location.search +\n '#action=' +\n actionStr,\n });\n }\n\n _executeAction(action, title, context) {\n this._languageCheck(action, title, () =>\n this._actions[`${action}`](title, context)\n );\n }\n\n _languageCheck(action, title, successCallback) {\n let shouldCheck = false;\n if (_(['borrow', 'hold', 'preview']).contains(action)) {\n shouldCheck = true;\n } else if (action === 'wish') {\n shouldCheck = title.get('wishlistState') === 'wishlistAdd';\n } else if (action === 'history') {\n shouldCheck = !title.get('isInHistory');\n }\n\n if (shouldCheck) {\n let fetchLanguageData = !title.get('languages')\n ? title.getMissingAttribute('languages')\n : Promise.resolve();\n fetchLanguageData.then(() => {\n if (\n this._checkLanguageMatch(title) ||\n (Cookies.get('language-mismatch-setting') &&\n Cookies.get('language-mismatch-setting') === '1')\n ) {\n successCallback();\n } else {\n window.Logger.log(\n 'warn',\n 'launching language mismatch modal',\n {\n patronLanguage:\n window.patronSettings['language-selection'],\n titleLanguages: title.get('languages'),\n }\n );\n const mismatchModal = new LanguageMismatchModal({\n model: new LanguageMismatch({\n languages: title.get('languages'),\n action,\n }),\n });\n mismatchModal.$el\n .find('.confirm-button')\n .on('click', () => {\n mismatchModal.close();\n if (\n mismatchModal.$el\n .find('.no-show-checkbox')\n .is(':checked')\n ) {\n const millisecondsInYear =\n 1000 * 60 * 60 * 24 * 365;\n const expireDate = new Date(\n Date.now() + millisecondsInYear\n );\n Cookies.set('language-mismatch-setting', '1', {\n httpOnly: false,\n expires: expireDate,\n });\n }\n successCallback();\n });\n mismatchModal.$el.find('.cancel-button').on('click', () => {\n mismatchModal.close();\n title.trigger('change:wishlistState');\n });\n }\n });\n } else {\n successCallback();\n }\n }\n\n _checkLanguageMatch(title) {\n const titleLanguages = title.get('languages');\n const titleLanguageIds =\n (titleLanguages && titleLanguages.map((language) => language.id)) ||\n [];\n let patronLanguage = window.patronSettings['language-selection'];\n if (!!patronLanguage) {\n const varietyIndex = patronLanguage.indexOf('-');\n if (varietyIndex !== -1) {\n patronLanguage = patronLanguage.substring(0, varietyIndex);\n }\n if (!titleLanguageIds.includes(patronLanguage)) {\n return false;\n }\n }\n return true;\n }\n\n get _actions() {\n let that = this;\n return {\n borrow(title, context) {\n that._borrow.borrowTitle(title, context);\n },\n\n hold(title, context) {\n that._hold.holdTitle(title, context);\n },\n\n holdCancel(title, context) {\n that._hold.holdCancel(title, context);\n },\n\n wish(title, context) {\n that._wishlist.wishlistAction(title, context);\n },\n\n nook(title, context) {\n that._nook.sendToNook(title, context);\n },\n\n rating(title, context) {\n that._rating.handlingRating(title, context);\n },\n\n history(title, context) {\n that._history.readingHistoryAction(title, context);\n },\n\n preview(title) {\n that._preview.giveSample(title);\n },\n\n renew(title, context) {\n context.isRenewal = true;\n context.formatLock = null;\n if (title.attributes.isFormatLockedIn) {\n context.formatLock =\n title.attributes.otherFormats.length &&\n title.attributes.otherFormats[0].id;\n }\n that._borrow.borrowTitle(title, context);\n },\n\n requestAgain(title, context) {\n context.isRequestAgain = true;\n that._hold.holdTitle(title, context);\n },\n };\n }\n}\n","export default class TitleActions {\n constructor({ bus, context }) {\n this.bus = bus;\n\n this.context = {\n room: undefined,\n collectionDefinition: undefined,\n };\n\n _.extend(this.context, context);\n }\n\n perform(action, titleModel) {\n if (typeof this[`_${action}`] === 'function') {\n this[`_${action}`](titleModel);\n }\n }\n\n _borrow(titleModel) {\n this.bus.trigger('title:borrow', titleModel, this.context);\n }\n\n _hold(titleModel) {\n this.bus.trigger('title:hold', titleModel, this.context);\n }\n\n _wish(titleModel) {\n this.bus.trigger('title:wishlist', titleModel, this.context);\n }\n\n _nook(titleModel) {\n this.bus.trigger('title:nook', titleModel, this.context);\n }\n\n _rating(titleModel) {\n this.bus.trigger('title:rating', titleModel, this.context);\n }\n\n _history(titleModel) {\n this.bus.trigger('title:history', titleModel, this.context);\n }\n\n _download(titleModel) {\n this.bus.trigger('title:download', titleModel, this.context);\n }\n\n _preview(titleModel) {\n this.bus.trigger('title:preview', titleModel, this.context);\n }\n\n _renew(titleModel) {\n this.bus.trigger('title:renew', titleModel, this.context);\n }\n\n _requestAgain(titleModel) {\n this.bus.trigger('title:requestAgain', titleModel, this.context);\n }\n\n setContextRoom(room) {\n if (_(room).isEmpty()) {\n delete this.context.room;\n } else {\n this.context.room = room;\n }\n\n return this;\n }\n\n setContextCollection(titleCollection) {\n if (_(titleCollection).isEmpty()) {\n delete this.context.titleCollection;\n } else {\n this.context.titleCollection = titleCollection;\n }\n\n return this;\n }\n}\n","class TitleState {\n static getState(media, patronItems) {\n const featureManager = window.featureManager;\n\n if (featureManager.isEnabled('sampleOnlyMode')) {\n return 'preview';\n }\n\n let mediaId = media.id;\n\n let isOnHold = patronItems && patronItems.onHolds.indexOf(mediaId) > -1;\n let isOnCheckouts =\n patronItems && patronItems.onCheckouts.indexOf(mediaId) > -1;\n let isAvailable =\n media.isAvailable ||\n (featureManager.isEnabled('LuckyDay') &&\n media.luckyDayAvailableCopies > 0);\n\n if (\n /account\\/loans/.test(window.location.href) &&\n media.isRenewable &&\n featureManager.isEnabled('content-holds')\n ) {\n if (isOnHold) {\n return 'requested';\n } else if (\n media.holdsCount <= 0 &&\n media.ownedCopies >= 0 &&\n !(\n featureManager.isEnabled('LuckyDay') &&\n media.isLuckyDayCheckout\n )\n ) {\n return 'renew';\n }\n return 'requestAgain';\n }\n\n if (isOnCheckouts) {\n return 'borrowed';\n }\n\n if (isOnHold && !isAvailable) {\n return 'onHold';\n }\n\n if (isAvailable) {\n if (media.type.id === 'periodicals') {\n return 'nook';\n }\n\n return 'borrow';\n }\n\n if (media.isHoldable && featureManager.isEnabled('content-holds')) {\n return 'hold';\n }\n\n return 'unavailable';\n }\n\n static isOnWishlist(media, patronItems) {\n return patronItems && patronItems.onWishlist.indexOf(media.id) > -1;\n }\n\n static isOnReadingHistory(media, patronItems) {\n return (\n patronItems && patronItems.onReadingHistory.indexOf(media.id) > -1\n );\n }\n\n static starRating(media, patronItems) {\n // Returns 0 if not rated\n return (\n (patronItems &&\n patronItems.starRatings &&\n patronItems.starRatings[media.id]) ||\n 0\n );\n }\n}\n\nexport default TitleState;\n","import LendingPeriodModal from '../../components/lending_period_modal/LendingPeriodModal';\nimport VisitorActionDisallowedModal from '../../components/visitor_action_disallowed_modal/VisitorActionDisallowedModal';\n\nclass Borrow {\n constructor(bus) {\n this.bus = bus;\n }\n\n borrowTitle(titleModel, context) {\n let borrow = () => {\n if (!context.isRenewal) {\n titleModel.set('titleState', 'waiting');\n }\n\n void new LendingPeriodModal({\n model: titleModel,\n bus: this.bus,\n isRenewal: !!context.isRenewal,\n action: (modal) => {\n this._borrowAjax(titleModel, context).always(() => {\n modal.close();\n });\n },\n onError: (error) => {\n this._borrowFailure(titleModel, {}, '', error);\n },\n });\n };\n\n if (window.featureManager.isEnabled('LHTNG-3387')) {\n if (titleModel.isAvailable || !!context.isRenewal) {\n borrow();\n } else if (window.OverDrive.isVisitor) {\n new VisitorActionDisallowedModal('borrow');\n }\n } else {\n borrow();\n }\n }\n\n _borrowAjax(titleModel, context) {\n this.bus.trigger('title:borrow:start', { titleModel, context });\n\n let { mobile, tablet } = bowser;\n\n const lendingPeriod = titleModel.get('lendingPeriod');\n return $.post(\n window.url(window.routes.mediaBorrow, { mediaId: titleModel.id }),\n {\n lendingPeriod: lendingPeriod.lendingPeriod,\n units: lendingPeriod.units,\n isMobile: mobile || tablet,\n returnFullLoanObject: true,\n isRenewal: !!context.isRenewal,\n isLuckyDayCheckout:\n titleModel.isLuckyDayCheckout && !context.isRenewal,\n }\n )\n .done((response) =>\n this._borrowSuccess(titleModel, response, context)\n )\n .fail((jqXHR, textStatus, errorThrown) =>\n this._borrowFailure(titleModel, jqXHR, textStatus, errorThrown)\n )\n .always(() => {\n this.bus.trigger('title:borrow:end', titleModel);\n });\n }\n\n _borrowSuccess(titleModel, response, context) {\n if (!!context.isRenewal) {\n titleModel.set('titleState', 'renewed');\n } else {\n titleModel.set('titleState', 'borrowed');\n }\n\n this.bus.trigger('title:borrow:success', {\n expires: response.expires,\n loan: response,\n titleModel,\n context,\n });\n\n titleModel.set('isInHistory', true);\n }\n\n _borrowFailure(titleModel, jqXHR, textStatus, errorThrown, context) {\n if (!/account\\/loans/.test(window.location.href)) {\n titleModel.set('titleState', 'borrow');\n }\n\n this.bus.trigger('title:borrow:fail', {\n jqXHR,\n textStatus,\n errorThrown,\n titleModel,\n context,\n });\n }\n}\n\nexport default Borrow;\n","var semver = require('semver');\n\nimport HoldConflictModal from '../../components/media/views/HoldConflictModal.js';\nimport TitleFulfillmentModal from '../../components/TitleFulfillmentModal/TitleFulfillmentModal.js';\nimport LoanTitle from '../../../../business-objects/loan-title';\nimport AccountLimits from '../../../../business-objects/account-limits';\nimport VisitorActionDisallowedModal from '../../components/visitor_action_disallowed_modal/VisitorActionDisallowedModal';\nimport NonHoldConflictModal from '../../components/non_hold_conflict_modal/NonHoldConflictModal';\nimport { Modal } from '../../components/common/modal.js';\n\nclass BorrowActions {\n constructor(bus, featureManager, globalPreferences) {\n this.bus = bus;\n this.featureManager = featureManager;\n this.globalPreferences = globalPreferences;\n\n this.bus\n .on('title:borrow:success', (data) => this.borrowSuccess(data))\n .on('title:borrow:fail', (data) => this.borrowFail(data))\n .on('title:borrow:conflict', (data) =>\n this._openConflictModal(data.titleModel)\n );\n }\n\n borrowSuccess(data) {\n const exp = window.html('date-full', { d: data.expires });\n const linkUrl = window.url(window.routes.accountLoans);\n const loans = window.html('loans');\n const limitsUrl = window.url(window.routes.rest.account.limits);\n\n $.ajax(limitsUrl).then((result) => {\n let accountLimits = new AccountLimits(result.data);\n let limitFormats = this.featureManager.isEnabled(\n 'kindleLoanFormatLimit'\n );\n let preferKindle =\n (Cookies.get('kindleFulfillmentAppOverride') &&\n Cookies.get('kindleFulfillmentAppOverride') === '1') ||\n (this.globalPreferences &&\n this.globalPreferences.get('kindleFulfillment'));\n let inApp = Cookies.get('omcbrowse') !== undefined;\n let restrictVideo =\n this.featureManager.isEnabled('streaming-update-message') &&\n inApp &&\n semver.satisfies(\n semver.coerce(window.OverDrive.appVersion),\n '<3.8.6'\n );\n\n let loan = new LoanTitle(\n data.loan,\n limitFormats,\n preferKindle,\n inApp,\n window.bowser.mac,\n this.featureManager.isEnabled('noAudiobooksForMacOS'),\n this.featureManager.isEnabled(\n 'reenableMp3DownloadMacOSPreCatalina'\n ),\n window.OverDrive.isPreCatalinaMac,\n restrictVideo,\n this.featureManager.isEnabled('hide-disabled-formats'),\n this.featureManager.isEnabled('odapp-sunset'),\n this.featureManager.isEnabled(\n 'fix-titlemodal-magazine-display'\n ),\n this.featureManager.isEnabled('odread-fulfillment-first')\n );\n\n let modal = new TitleFulfillmentModal({\n loan: loan,\n title: data.titleModel,\n bus: this.bus,\n featureManager: this.featureManager,\n globalPreferences: this.globalPreferences,\n accountLimits: accountLimits,\n isRenewal: !!data.context.isRenewal,\n formatLock: data.context.formatLock || null,\n });\n modal.render();\n });\n }\n\n borrowFail(data) {\n const response = JSON.parse(data.jqXHR.responseText || '{}');\n if (response.errorCode === 'PatronCardFailedAuthentication') {\n this.bus.trigger('user:card:invalid');\n } else if (response.sessionExpired) {\n this.bus.trigger('user:session:expired', {\n action: `borrow~${data.titleModel.id}`,\n });\n } else if (\n response.errorCode === 'CostPerCircAvailabilityFastLaneOnly' ||\n response.errorCode === 'TitleNoLongerAvailable'\n ) {\n this._openConflictModal(data.titleModel);\n } else if (response.errorCode === 'CostPerCircNoBudget') {\n this._openConflictModal(data.titleModel);\n } else if (\n response.errorCode === 'RenewalFailed' ||\n response.errorCode === 'HoldsPreventRenewal'\n ) {\n this._openConflictModal(data.titleModel);\n } else if (\n response.errorCode === 'PatronExceededLuckyDayLimit' &&\n this.featureManager.isEnabled('LuckyDay')\n ) {\n this._openConflictModal(data.titleModel, { isLuckyDay: true });\n } else if (\n response.errorCode === 'PatronExceededCostPerCircCheckoutLimit'\n ) {\n if (window.location.href.match('account') !== null) {\n if (toaster)\n toaster.push(`${window.text('errorCPCLimit')}`, 'error');\n } else {\n this._openConflictModal(data.titleModel);\n }\n } else if (response.errorCode === 'CheckoutNotAllowedForVisitor') {\n new VisitorActionDisallowedModal('borrow');\n if (window.featureManager.isEnabled('LHTNG-3387')) {\n data.titleModel.set({\n titleState: 'unavailable',\n availableCopies: 0,\n isAvailable: false,\n });\n }\n } else if (response.errorCode === 'LendingPeriodInvalid') {\n new Modal({\n title: window.text('genericError'),\n content: `

      ${window.html('error.defaultError')}

      `,\n });\n } else {\n this._defaultError(response.errorCode, data.titleModel);\n }\n }\n\n _defaultError(errorCode, titleModel) {\n let href = '';\n let linkText = '';\n\n if (\n errorCode === 'PatronExceededCheckoutLimit' ||\n errorCode === 'LoanAlreadyExists'\n ) {\n href = window.url(window.routes.accountLoans);\n linkText = window.html('loans');\n } else if (\n errorCode === 'PatronExceededChurningLimit' ||\n errorCode === 'PatronTypeRestrictedFromTitle'\n ) {\n href = window.url(window.routes.supportMembers);\n linkText = window.html('pleaseContactSupport');\n }\n\n if (toaster) {\n const link = `${linkText}`;\n if (\n errorCode === 'PatronExceededCheckoutLimit' &&\n this.featureManager.isEnabled('holdRedelivery') &&\n titleModel.get('holdListPosition') === 1\n ) {\n toaster.push(\n `${window.text(`holdRedelivery.loansLimit`, { link })}`,\n 'error'\n );\n } else {\n toaster.push(\n `${window.html(\n 'genericError'\n )} ${window.text(`error.${errorCode}`, { link })}`,\n 'error'\n );\n }\n }\n }\n\n _openConflictModal(titleModel, options = {}) {\n // We make some assumptions about the title state here because at this point\n // the data returned by thunder is not trustworthy. IE: It will return available copies when there are none\n if (!titleModel.canPlaceHold) {\n new NonHoldConflictModal(titleModel, options);\n titleModel.set({\n titleState: titleModel.get('isOnHold')\n ? 'onHold'\n : 'unavailable',\n availableCopies: 0,\n isAvailable: false,\n });\n } else {\n let isRequestAgain = /account\\/loans/.test(window.location.href);\n titleModel.set({\n titleState: isRequestAgain ? 'requestAgain' : 'hold',\n availableCopies: 0,\n isAvailable: false,\n });\n new HoldConflictModal(this.bus, titleModel, options);\n }\n }\n}\n\nexport default BorrowActions;\n","const { html } = window;\n\nexport default class LanguageMismatch extends Backbone.Model {\n get languageText() {\n const languageCodes = this.get('languages').map(\n (language) => language.id && language.id.split('-')[0]\n );\n const translations = languageCodes.map(\n (code) => code && html(`languages.code-${code}`)\n );\n return html('languageMismatch.inLanguage', {\n language: translations.join(', '),\n });\n }\n\n get areYouSureText() {\n switch (this.get('action')) {\n case 'borrow':\n return html('languageMismatch.areYouSure.borrow');\n case 'hold':\n return html('languageMismatch.areYouSure.hold');\n case 'wish':\n return html('languageMismatch.areYouSure.wish');\n case 'history':\n return html('languageMismatch.areYouSure.history');\n default:\n return '';\n }\n }\n\n get actionText() {\n switch (this.get('action')) {\n case 'borrow':\n return html('borrow');\n case 'hold':\n return html('placeHold');\n case 'wish':\n return html('addToWishList');\n case 'history':\n return html('readingHistory.add');\n default:\n return html('confirm');\n }\n }\n}\n","export default ({languageText, areYouSureText, actionText}) => `\n \n
      \n \n \n
      \n`;\n","import { Modal } from '../../../components/common/modal';\nimport LanguageMismatchModalTemplate from './LanguageMismatchModal.html';\n\nexport default class LanguageMismatchModal extends Modal {\n constructor({model}) {\n const modalContents = {\n classes: ['LanguageMismatchModal'],\n title: window.html('languageMismatch.languageConfirmation'),\n content: LanguageMismatchModalTemplate({\n languageText: model.languageText,\n areYouSureText: model.areYouSureText,\n actionText: model.actionText\n })\n };\n super(modalContents);\n }\n}\n","import RemoveHistoryModal from '../../components/media/views/RemoveHistoryModal.js';\n\nclass ReadingHistory {\n constructor(bus) {\n this.bus = bus;\n }\n\n importFromRated() {\n this.bus.trigger('history:importFromRated:start');\n\n return $.post(window.url(window.routes.rest.readingHistory.index))\n .done((...params) => this.bus.trigger('history:importFromRated:success', ...params))\n .fail((...params) => this.bus.trigger('history:importFromRated:fail', ...params))\n .always(() => this.bus.trigger('history:importFromRated:end'));\n }\n\n readingHistoryAction(titleModel, context) {\n let action = titleModel.get('isInHistory') ? 'remove' : 'add';\n\n this.bus.trigger('title:history:start', { titleModel, action });\n\n let response = new Promise((resolve, reject) => {\n if (action === 'remove') {\n new RemoveHistoryModal({\n bus : this.bus,\n title : titleModel,\n action: () => {\n this._historyRemoveAjax(titleModel, context).then(resolve).fail(reject);\n }\n });\n } else {\n this._historyAddAjax(titleModel, context).then(resolve).fail(reject);\n }\n });\n\n return response\n .then((...params) => this.bus.trigger('title:history:success', { titleModel, action, context }, ...params))\n .catch((...params) => this.bus.trigger('title:history:fail', { titleModel, action, context }, ...params))\n .then(() => this.bus.trigger('title:history:end', { titleModel, action, context }));\n }\n\n _historyAddAjax(titleModel, context) {\n this.bus.trigger('title:history:add:start', { titleModel, context });\n\n let response = $.ajax({\n url: window.url(window.routes.rest.readingHistory.title, {id: titleModel.get('id')}),\n type: 'PUT'\n });\n\n response\n .done(() => {\n titleModel.set('isInHistory', !titleModel.get('isInHistory'));\n this.bus.trigger('title:history:add:success', { titleModel, context });\n })\n .fail((...params) => this.bus.trigger('title:history:add:fail', { titleModel, context }, ...params))\n .always(() => this.bus.trigger('title:history:add:end', { titleModel, context }));\n\n return response;\n }\n\n _historyRemoveAjax(titleModel, context) {\n this.bus.trigger('title:history:remove:start', { titleModel, context });\n\n let response = $.ajax({\n url: window.url(window.routes.rest.readingHistory.title, {id: titleModel.get('id')}),\n type: 'DELETE'\n });\n\n response\n .done(() => {\n titleModel.set('isInHistory', !titleModel.get('isInHistory'));\n this.bus.trigger('title:history:remove:success', { titleModel, context });\n })\n .fail((...params) => this.bus.trigger('title:history:remove:fail', { titleModel, context }, ...params))\n .always(() => this.bus.trigger('title:history:remove:end', { titleModel, context }));\n\n return response;\n }\n}\n\nexport default ReadingHistory;\n","import ImportRatedCompleteModal from '../../components/account_history/views/ImportFromRatedCompleteModal';\n\nexport default class ReadingHistoryActions {\n constructor(bus) {\n this.bus = bus;\n\n this.bus\n .on('history:importFromRated:success', (...params) => this.importFromRatingsSuccess(...params))\n .on('title:history:fail', (...params) => this.historyFailure(...params));\n\n }\n\n importFromRatingsSuccess(data) {\n new ImportRatedCompleteModal(data.importedTitleCount, data.patronHasRatedTitles);\n }\n\n historyFailure({ titleModel }, jqXHR, textStatus, errorThrown) {\n let response = JSON.parse(jqXHR.responseText || '{}');\n\n if (response.sessionExpired) {\n this.bus.trigger('user:session:expired');\n } else if (toaster) {\n toaster.push(window.html('error.defaultErrorHtml'), 'error');\n }\n }\n}\n","import VisitorActionDisallowedModal from '../../components/visitor_action_disallowed_modal/VisitorActionDisallowedModal';\n\nexport default class Hold {\n constructor(bus, card) {\n this.bus = bus;\n this.card = card;\n }\n\n holdTitle(titleModel, context) {\n if (\n window.featureManager.isEnabled('LHTNG-3387') &&\n window.OverDrive.isVisitor &&\n (!window.featureManager.isEnabled('content-holds') ||\n !titleModel.get('isHoldable'))\n ) {\n new VisitorActionDisallowedModal('hold');\n } else if (this.card.preferredHoldEmail.length) {\n // LHTNG-1584 - Dont re-check availability, causes UI loops\n this._holdAjax(titleModel, context);\n } else {\n this.card._fetch.then(() => {\n if (this.card.preferredHoldEmail.length) {\n this._holdAjax(titleModel, context);\n } else {\n this.bus.trigger('title:hold:request-email', {\n titleModel,\n context,\n });\n }\n });\n }\n }\n\n holdCancel(titleModel, context) {\n return $.ajax({\n type: 'DELETE',\n url: window.url(window.routes.mediaRemoveHold, {\n mediaId: titleModel.id,\n }),\n })\n .done((response) => {\n titleModel.set('titleState', 'hold');\n this.bus.trigger('title:hold-cancel:success', {\n titleModel,\n context,\n });\n })\n .fail((jqXHR, textStatus, errorThrown) => {\n titleModel.set('titleState', 'onHold');\n this.bus.trigger('title:hold-cancel:fail', {\n jqXHR,\n textStatus,\n errorThrown,\n titleModel,\n context,\n });\n })\n .complete(() => {\n this.bus.trigger('title:hold-cancel:end', {\n titleModel,\n context,\n });\n });\n }\n\n _holdAjax(titleModel, context) {\n this.bus.trigger('title:hold:start', {\n titleModel,\n email: this.card.preferredHoldEmail,\n context,\n });\n\n if (!context.isRequestAgain) {\n titleModel.set('titleState', 'waiting');\n }\n\n let { mobile, tablet } = bowser;\n\n return $.ajax({\n url: window.url(window.routes.mediaPlaceHold),\n type: 'POST',\n data: {\n mediaId: titleModel.id,\n email: this.card.preferredHoldEmail,\n isMobile: mobile || tablet,\n languageCode:\n window.patronSettings['language-selection'] ||\n window.Cookies.get('language-selection') ||\n $('html').attr('lang') ||\n 'en',\n },\n })\n .done((response) => {\n let isRequestAgain =\n !!context.isRequestAgain ||\n /account\\/loans/.test(window.location.href);\n titleModel.set(\n 'titleState',\n isRequestAgain ? 'requested' : 'onHold'\n );\n this.bus.trigger('title:hold:success', { titleModel, context });\n })\n .fail((jqXHR, textStatus, errorThrown) => {\n if (!context.isRequestAgain) {\n titleModel.set('titleState', 'hold');\n }\n this.bus.trigger('title:hold:fail', {\n jqXHR,\n textStatus,\n errorThrown,\n titleModel,\n context,\n });\n })\n .complete(() => {\n this.bus.trigger('title:hold:end', { titleModel, context });\n });\n }\n}\n","import HoldModal from '../../components/media/views/HoldModal';\nimport HoldSuccessModal from '../../components/media/views/HoldSuccessModal';\nimport VisitorActionDisallowedModal from '../../components/visitor_action_disallowed_modal/VisitorActionDisallowedModal';\n\nexport default class HoldActions {\n constructor(bus) {\n this.bus = bus;\n\n this.bus\n .on('title:hold:success', (data) => this.holdSuccess(data))\n .on('title:hold:fail', (data) => this.holdFail(data))\n .on('title:hold:request-email', (data) => this._openHoldModal(data))\n .on('title:hold:conflict', (data) => this._openConflictModal(data.titleModel))\n .on('title:hold-cancel:fail', (data) => this.holdCancelFail(data));\n\n this.featureManager = window.featureManager;\n }\n\n holdSuccess(data) {\n window.ajax.getHold(data.titleModel.get('id')).done((holdData) => {\n data.titleModel.set({\n holdsRatio: holdData.holdsRatio,\n holdsCount: holdData.holdsCount,\n holdListPosition: holdData.holdListPosition\n });\n new HoldSuccessModal({bus:this.bus,\n titleModel: data.titleModel,\n email: window.card.preferredHoldEmail,\n autoCheckoutEnabled: window.patronSettings['auto-checkout-setting'] === 1});\n });\n }\n\n holdFail({ jqXHR, titleModel }) {\n const response = JSON.parse(jqXHR.responseText);\n\n if (response.errorCode === 'PatronCardFailedAuthentication') {\n this.bus.trigger('user:card:invalid');\n } else if (response.sessionExpired) {\n this.bus.trigger('user:session:expired', { action: `hold~${titleModel.id}` });\n } else if (response.errorCode === 'HoldAlreadyExists' || response.errorCode === 'PatronExceededHoldLimit') {\n let link = `${window.html('holds')}`;\n this._errorToast(link, response.errorCode);\n } else if (response.errorCode === 'PatronTypeRestrictedFromTitle' || response.errorCode === 'PatronHasHoldsDisabled') {\n let link = `${window.html('pleaseContactSupport')}`;\n this._errorToast(link, response.errorCode);\n } else if (response.errorCode === 'HoldNotAllowedForVisitor'){\n new VisitorActionDisallowedModal('hold');\n } else if (response.errorCode) {\n this._errorToast('', response.errorCode);\n } else if (toaster) {\n toaster.push(`${window.html('genericError')}`, 'error');\n }\n }\n\n holdCancelFail({ jqXHR, textStatus, errorThrown, titleModel, context }) {\n let response = JSON.parse(jqXHR.responseText);\n if(response.sessionExpired){\n this.bus.trigger('user:session:expired');\n } else if (toaster) {\n toaster.push(`${window.html('genericError')} ${window.html('error.' + response.errorCode)}`, 'error');\n }\n\n }\n\n _errorToast(pageLink, errorCode) {\n if (toaster) toaster.push(`${window.html('genericError')} ${window.text(`error.${errorCode}`, {link: pageLink})}`, 'error');\n }\n\n _openHoldModal({ titleModel, context }) {\n if (window.featureManager.isEnabled('LHTNG-3387')){\n if (window.OverDrive.isVisitor && !this.featureManager.isEnabled(\"content-holds\")) {\n new VisitorActionDisallowedModal('hold');\n } else {\n new HoldModal({\n bus: this.bus,\n titleModel,\n context\n });\n }\n } else {\n new HoldModal({bus: this.bus, titleModel, context});\n }\n\n\n }\n}\n","class Nook {\n constructor(bus) {\n this.bus = bus;\n\n this.bus.on('title:nook:eula-accepted', (data) => this._setEulaCookie(data.title));\n }\n\n sendToNook(title) {\n if (Cookies.get('nook-eula-setting') === '1') {\n this._nookAjax(title);\n } else {\n this.bus.trigger('title:nook:request-eula', { titleModel: title });\n }\n }\n\n _nookAjax(title) {\n title.set('titleState', 'waiting');\n this.bus.trigger('title:nook:start', title);\n\n return $.ajax({\n url: window.url(window.routes.mediaBorrow, {\n mediaId: title.id\n }),\n type: 'POST'\n })\n .done((response) => this._nookSuccess(title, response))\n .fail((jqXHR, textStatus, errorThrown) => this._nookFailure(title, jqXHR, textStatus, errorThrown))\n .complete(() => { this.bus.trigger('title:nook:end', title); });\n }\n\n _nookSuccess(title) {\n title.set('titleState', 'borrowed');\n this.bus.trigger('title:nook:success', {titleModel: title});\n }\n\n _nookFailure(title, jqXHR, textStatus, errorThrown) {\n title.set('titleState', 'nook');\n\n this.bus.trigger('title:nook:fail', {jqXHR, textStatus, errorThrown, titleModel: title});\n }\n\n _setEulaCookie(titleModel) {\n Cookies.set('nook-eula-setting', '1');\n this._nookAjax(titleModel);\n }\n}\n\nexport default Nook;\n","import NookModal from '../../components/media/views/NookEulaModal';\n\nclass NookActions {\n constructor(bus) {\n this.bus = bus;\n\n this.bus\n .on('title:nook:success', (data) => this.nookSuccess(data))\n .on('title:nook:fail', (data) => this.nookFail(data))\n .on('title:nook:request-eula', (data) => this._openNookEulaModal(data.titleModel));\n }\n\n nookSuccess(data) {\n window.location.href = window.url(window.routes.mediaDownload, {format: 'periodicals-nook', mediaId: data.titleModel.id});\n }\n\n nookFail(data) {\n const response = JSON.parse(data.jqXHR.responseText);\n\n if (response.errorCode === 'PatronCardFailedAuthentication') {\n this.bus.trigger('user:card:invalid');\n }\n else if (response.errorCode === 'PatronExceededPeriodicalsCheckoutLimit') {\n const href = window.url(window.routes.accountLoans);\n const linkText = window.html('loans');\n const link = `${linkText}`;\n if (toaster) toaster.push(`${window.html('genericError')} ${window.text(`error.${response.errorCode}`, {link})}`, 'error');\n }\n else if (response.sessionExpired) {\n this.bus.trigger('user:session:expired');\n }\n }\n\n _openNookEulaModal(titleModel) {\n new NookModal(this.bus, titleModel);\n }\n}\n\nexport default NookActions;\n","\nclass StarRating {\n constructor(bus) {\n this.bus = bus;\n }\n\n handlingRating(model) {\n if (model.get('userStarRating') > 0) {\n // User is adding rating\n this._rateTitleAjax(model);\n } else {\n // User is removing rating\n this._deleteRatingAjax(model);\n }\n }\n\n _rateTitleAjax(model) {\n return $.ajax({\n url: window.url(window.routes.patronMediaStarRatings, {titleId: model.get('id')}),\n type: 'PUT',\n data: {rating: model.get('userStarRating')},\n timeout: 0\n })\n .fail((jqXHR, textStatus, errorThrown) => this.ratingFailure(model, jqXHR, textStatus, errorThrown));\n }\n\n _deleteRatingAjax(model) {\n return $.ajax({\n url: window.url(window.routes.patronMediaStarRatings, {titleId: model.get('id')}),\n type: 'DELETE',\n timeout: 0\n })\n .fail((jqXHR, textStatus, errorThrown) => this.ratingFailure(model, jqXHR, textStatus, errorThrown));\n }\n\n ratingFailure(model, jqXHR, textStatus, errorThrown) {\n this.bus.trigger('title:rating:fail', {model, jqXHR, textStatus, errorThrown});\n }\n}\n\nexport default StarRating;\n","\nclass StarRatingActions {\n constructor(bus) {\n this.bus = bus;\n\n this.bus.on('title:rating:fail', (data) => this.ratingFail(data));\n }\n\n ratingFail(data) {\n let response;\n try {\n response = JSON.parse(data.jqXHR.responseText);\n } catch (ex){\n response = {};\n }\n\n if (response.sessionExpired){\n this.bus.trigger('user:session:expired');\n } else {\n let link = `${window.html('pleaseContactSupport')}`;\n toaster.push(`${window.html('genericError')} ${window.text('error.errorContactSupport', {link})}`, 'error');\n }\n }\n}\n\nexport default StarRatingActions;\n","import SessionExpiredModal from '../../components/session_expired_modal/SessionExpiredModal';\n\nexport default class SharedActions {\n constructor(bus) {\n this.bus = bus;\n\n this.bus\n .on('user:session:expired', (data) => this._sessionExpired(data))\n .on('user:card:invalid', () => this._patronCardFailedAuthentication())\n .on('user:card:none', (data) => this._noLinkedCards(data.action));\n }\n\n _sessionExpired(data) {\n let forwardUrl = window.location.pathname + window.location.search;\n if (data && data.action){\n forwardUrl += `#action=${encodeURIComponent(data.action)}`;\n }\n new SessionExpiredModal(forwardUrl);\n }\n\n _noLinkedCards(action) {\n if (!window.featureManager.isEnabled('sampleOnlyMode')){\n const forwardUrl = window.location.pathname + window.location.search.replace(/(&|\\?)no-linked-card(=true|\\=false)/, '');\n const initiateCardLinkUrl = window.url(window.routes.accountStartCardLink, {forward: forwardUrl, action});\n $('#add-card-button').attr('href', initiateCardLinkUrl);\n $('#link-card-modal').foundation('reveal', 'open');\n }\n }\n\n _patronCardFailedAuthentication() {\n if (window.OverDrive.authType === 'library' || window.featureManager.isEnabled('OzoneAuthentication')) {\n new SessionExpiredModal();\n } else {\n // the user's card is no longer valid. Direct them to the link a card flow so that they may resolve any issues.\n $('.js-card-error-modal').foundation('reveal', 'open');\n }\n }\n}\n","class Wishlist {\n constructor(bus) {\n this.bus = bus;\n }\n\n wishlistAction(titleModel, context) {\n let action = titleModel.get('wishlistState') === 'wishlistAdd' ? 'add' : 'remove';\n\n this.bus.trigger('title:wishlist:start', { titleModel, action });\n\n let request = new Promise((resolve, reject) => {\n if (titleModel.get('wishlistState') === 'wishlistAdd') {\n this._wishlistAddAjax(titleModel)\n .then(resolve)\n .fail((jqXHR) => reject({ jqXHR, titleModel }));\n } else {\n this._wishlistRemoveAjax(titleModel)\n .then(resolve)\n .fail((jqXHR) => reject({ jqXHR, titleModel }));\n }\n });\n\n request\n .then((...params) => this.bus.trigger('title:wishlist:success', { titleModel, action, context }, ...params))\n .catch((...params) => {\n let { jqXHR } = (params.length && params || [{}])[0];\n\n this._wishlistFailure(titleModel, jqXHR);\n this.bus.trigger('title:wishlist:fail', { titleModel, action, context }, ...params);\n })\n .then(() => this.bus.trigger('title:wishlist:end', { titleModel, action, context }));\n\n return request;\n }\n\n _wishlistAddAjax(titleModel, context) {\n this.bus.trigger('title:wishlist:add:start', { titleModel, context });\n\n let response = $.ajax({\n url: window.url(window.routes.accountWishlistAdd, {mediaId: titleModel.id}),\n type: 'PUT'\n });\n\n response\n .done(() => {\n titleModel.set('wishlistState', 'wishlistRemove');\n this.bus.trigger('title:wishlist:add:success', { titleModel, context });\n })\n .fail((...params) => this.bus.trigger('title:wishlist:add:fail', { titleModel, context }, ...params))\n .always(() => this.bus.trigger('title:wishlist:add:end', { titleModel, context }));\n\n return response;\n }\n\n _wishlistRemoveAjax(titleModel, context) {\n this.bus.trigger('title:wishlist:remove:start', { titleModel, context });\n\n let response = $.ajax({\n url: window.url(window.routes.accountWishlistRemove, {mediaId: titleModel.id}),\n type: 'DELETE'\n });\n\n response\n .done(() => {\n titleModel.set('wishlistState', 'wishlistAdd');\n this.bus.trigger('title:wishlist:remove:success', { titleModel, context });\n })\n .fail((...params) => this.bus.trigger('title:wishlist:remove:fail', { titleModel, context }, ...params))\n .always(() => this.bus.trigger('title:wishlist:remove:end', { titleModel, context }));\n\n return response;\n }\n\n _wishlistFailure(titleModel, jqXHR) {\n if (jqXHR.responseText && JSON.parse(jqXHR.responseText).sessionExpired) {\n this.bus.trigger('user:session:expired');\n } else {\n toaster.push(window.html('error.defaultErrorHtml'), 'error');\n }\n }\n}\n\nexport default Wishlist;\n","import cookieConfig from '../../../lib/cookieConfig';\n\nexport default class FeatureHighlightManager {\n constructor(highlightedFeatureState){\n this.highlightedFeatureState = highlightedFeatureState;\n\n $('.highlightedFeature.notVisited .highlightedFeatureTriggerElement').on('click', (e) => this.highlightedFeatureClicked(e));\n $('.visitAllFeaturesTriggerElement').on('click', () => this.allFeaturesVisited());\n }\n\n allFeaturesVisited() {\n this.highlightedFeatureState.visitAllActiveFeatures();\n this.save();\n }\n\n highlightedFeatureClicked (e){\n let featureName = this.getFeatureName(e.currentTarget);\n\n if (!this.highlightedFeatureState.wasVisited(featureName)){\n this.highlightedFeatureState.visit(featureName);\n this.save();\n }\n\n this.clearFeatureHighlight(featureName);\n this.updatedHamburgerDot(); // yummy\n }\n\n getFeatureName(element){\n let parent = this.getFeatureRootElement(element);\n return parent.attributes['data-feature-name'].value;\n }\n\n clearFeatureHighlight(featureName){\n $(`[data-feature-name=\"${featureName}\"]`).removeClass('notVisited');\n }\n\n getFeatureRootElement(currentElement){\n if ($(currentElement).hasClass('highlightedFeature')) {\n return currentElement;\n }\n else {\n let featureParent = $(currentElement).closest('.highlightedFeature').first();\n if (!featureParent || featureParent.length === 0){\n throw new Error('Found no ancestor with class \"highlightedFeature\"');\n }\n return featureParent[0];\n }\n }\n\n updatedHamburgerDot(){\n if (!this.highlightedFeatureState.unvisitedFeaturePresent) {\n $('.MobileNav-accountMenu').removeClass('highlightedFeaturePresent');\n }\n }\n\n save() {\n let cookieInfo = cookieConfig.visitedFeatures;\n Cookies.set(cookieInfo.name, this.highlightedFeatureState.flags, { expires: new Date(Date.now() + cookieInfo.durationMS)});\n\n if(window.OverDrive.isAuthenticated) {\n $.ajax({\n url: window.url(window.routes.preferences),\n type: 'PATCH',\n contentType : 'application/json',\n data: JSON.stringify({ visitedFeatures: this.highlightedFeatureState.flags}),\n error(jqXHR, textStatus, errorThrown) {\n window.Logger.log('error', 'failed to save visitedFeatures flags to user preferences',{status: textStatus, error: errorThrown});\n }\n });\n }\n }\n}\n","// ES6 version of settle\nPromise.settle = function(promises) {\n class PromiseInspection {\n constructor(fulfilled, value) {\n this.fulfilled = fulfilled;\n this.value = value;\n }\n }\n\n return Promise.all(promises.map((p) =>\n // make sure any values are wrapped in a promise\n Promise.resolve(p).then((val) => new PromiseInspection(true, val)).catch((err) => new PromiseInspection(false, err))));\n};\n\n// wrapping Promise notation around an ajax call\nPromise.ajax = function(options) {\n return new Promise((resolve, reject) =>\n $.ajax(options)\n .done((response) => resolve(response))\n .fail((xhr, status, err) => reject(err))\n );\n};\n","import keyCodes from '../keycodes.js';\n/*\n * Force account menu to be navigable with arrow keys\n * @param {object} e event object\n */\nconst arrowTabAccountMenu = function(e) {\n if (e.which === keyCodes.DOWN) {\n e.preventDefault();\n if ($(e.target).is('ul')) {\n $('ul#dropAccount li:first-child a').focus();\n } else {\n $(e.target).emulateTab();\n }\n }\n if (e.which === keyCodes.UP) {\n e.preventDefault();\n $(e.target).emulateTab(-1);\n }\n\n e.stopPropagation();\n};\n\nexport default arrowTabAccountMenu;\n","const hideArrowsOnEndOfScroll = function(e, el) {\n const media = $(el).children('.js-carouselItem');\n const elemWidth = $(el)[0].getBoundingClientRect().width;\n const mediaWidth = media[0].getBoundingClientRect().width;\n const mediaAmount = media.length;\n\n if ($(el).scrollLeft() === 0) {\n $(el).parent().siblings('.js-carouselArrowLeft').css('visibility', 'hidden');\n } else {\n $(el).parent().siblings('.js-carouselArrowLeft').css('visibility', 'visible');\n }\n\n if ($(el).scrollLeft() + elemWidth >= (mediaWidth * mediaAmount) + (mediaAmount * 3.3)) {\n $(el).parent().siblings('.js-carouselArrowRight').css('visibility', 'hidden');\n\n // Stop scrolling past content in Firefox\n if (window.scrollAmt === 0) {\n window.scrollAmt = $(el).scrollLeft();\n } else {\n $(el).scrollLeft(window.scrollAmt);\n window.scrollAmt = 0;\n }\n } else {\n $(el).parent().siblings('.js-carouselArrowRight').css('visibility', 'visible');\n }\n};\n\nexport default hideArrowsOnEndOfScroll;\n","const hideCarouselArrowsForEl = function(el) {\n const media = $(el).children('.js-carouselItem');\n const mediaAmount = media.length;\n const mediaWidth = media[0].getBoundingClientRect().width;\n const elemWidth = $(el)[0].getBoundingClientRect().width;\n\n $(el).parent().siblings('.js-carouselArrowRight').css('visibility', 'visible');\n\n if ((mediaAmount * mediaWidth) <= elemWidth) {\n $(el).parent().siblings('.js-carouselArrowLeft').css('visibility', 'hidden');\n $(el).parent().siblings('.js-carouselArrowRight').css('visibility', 'hidden');\n }\n};\n\nexport default hideCarouselArrowsForEl;\n","/*\n * Snap to nearest cover\n */\nconst roundScroll = function(n, direction, width) {\n if (direction === 'left') {\n return Math.ceil(n / width) * width;\n }\n return Math.floor(n / width) * width;\n};\n\nexport default roundScroll;\n","import roundScroll from './roundScroll.js';\n\n/*\n * Scroll a media carousel to the right or left\n * @param {string} direction The direction the carousel should scroll\n * @param {string} elem Selector to indicate the carousel element to be scrolled\n */\nconst scrollCarousel = function(direction, elem) {\n const media = $(elem).children('.js-carouselItem');\n const elemWidth = elem[0].getBoundingClientRect().width;\n const mediaWidth = media[0].getBoundingClientRect().width;\n const mediaAmount = media.length;\n\n // Calculate # of titles to left\n const totalLeft = Math.ceil(elem.scrollLeft() / mediaWidth);\n\n // Calculate number of 4px gaps between titles to compensate\n const gapTotalLeft = (totalLeft + 4) * 4;\n\n if (direction === 'right') {\n if (elem.scrollLeft() + elemWidth < (mediaWidth * mediaAmount)) {\n const a = roundScroll(elem.scrollLeft(), 'right', mediaWidth);\n const b = roundScroll(elemWidth, 'right', mediaWidth);\n const scrollLeft = a + b + gapTotalLeft;\n elem.animate({scrollLeft});\n }\n } else {\n // Check for obscured cover and if greater or less than 50% shown\n let modifier = 0;\n if (roundScroll(elem.scrollLeft(), 'left', mediaWidth) - elem.scrollLeft() > 100) {\n modifier += mediaWidth;\n }\n const a = roundScroll(elem.scrollLeft(), 'left', mediaWidth);\n const b = -elemWidth;\n const c = gapTotalLeft;\n const d = -24;\n const e = -modifier;\n const scrollLeft = a + b + c + d + e;\n elem.animate({scrollLeft});\n }\n};\n\nexport default scrollCarousel;\n","const componentToHex = function(c) {\n const hex = c.toString(16);\n return hex.length === 1 ? `0${hex}` : hex;\n};\n\nexport default componentToHex;\n","import componentToHex from './componentToHex.js';\n\nconst rgbToHex = function(r, g, b) {\n return `#${componentToHex(r)}${componentToHex(g)}${componentToHex(b)}`;\n};\n\nexport default rgbToHex;\n","import keyCodes from '../keycodes.js';\n\n/*\n * Some all expression\n */\nconst someLongThing = function($target) {\n return (\n !$target.is('h2')\n && $target.closest('li').is(':first-child')\n && (\n (\n $target.closest('ul').hasClass('popular-links')\n && $target.closest('ul').closest('li').is(':first-child')\n )\n || $target.closest('ul').hasClass('featured-links')\n )\n );\n};\n\n/*\n * Force nav menu to be navigable with arrow keys in all browsers\n * @param {object} e Event object\n */\nconst arrowTabMenu = function(e) {\n let id = '';\n const $target = $(e.target);\n if (e.which === keyCodes.DOWN) {\n e.preventDefault();\n // focus on next available element\n if ($target.hasClass('f-dropdown')) {\n $target.children('div.featured').find('h2:first').focus();\n } else if ($target.is('h2')) {\n $target.next('ul').find('a:first').focus();\n } else if ($target.hasClass('browse-all')) {\n if ($target.parents('div').hasClass('featured')) {\n if ($target.parents('.featured').next('div').hasClass('popular')) {\n $target.parents('.featured').next('div.popular').find('h2:first').focus();\n } else {\n id = $target.closest('ul').attr('id');\n $(`li[data-dropdown=\"${id}\"] a`).focus();\n }\n } else {\n id = $target.closest('ul').attr('id');\n $(`li[data-dropdown=\"${id}\"]`).focus();\n }\n } else {\n $target.emulateTab();\n }\n } else if (e.which === keyCodes.UP) {\n e.preventDefault();\n if (someLongThing($target)) {\n $target.closest('div').find('h2').focus();\n } else if ($target.hasClass('browse-all')) {\n $target.prev('ul').find('li:last-child a').focus();\n } else if ($target.is('h2')) {\n if ($target.closest('div').hasClass('popular')) {\n $target.closest('div.popular').prev('div.featured').find('a.browse-all').focus();\n } else {\n id = $target.closest('ul').attr('id');\n $(`li[data-dropdown=\"${id}\"] a`).focus();\n }\n } else {\n $target.emulateTab(-1);\n }\n }\n e.stopPropagation();\n};\n\nexport default arrowTabMenu;\n","// Force a full page reload for devices that try\n// to draw from a back/forward cache.\nconst forceRealPageReload = (event) => {\n if (event.originalEvent.persisted) {\n window.location.reload();\n }\n};\n\nexport default forceRealPageReload;\n","// Force firefox to reload page when hitting back button.\n// Allows document ready event to fire.\nconst onunload = function() {}; // eslint-disable-line no-empty-function\nexport default onunload;\n","/*\n * Remove carousel functionality\n */\nconst removeCarouselFunctionality = function () {\n const vertOrientation = Math.abs(window.orientation) !== 90;\n // Delete all but 3 in carousels\n $('.carousel.loaded').each((index, el) => {\n let children = $(el).children();\n for (let x = 3; x < children.length; x++) {\n $(children[x]).remove();\n }\n\n children = children.slice(0, 3);\n children.addClass('text-left');\n $(el).addClass('text-center').css('overflow-x', 'hidden');\n\n if (vertOrientation) {\n children.last().hide();\n }\n });\n $('.js-carouselArrow').remove(); // Remove arrows\n};\n\n/*\n * On orientation change, ensure carousel has no functionality\n */\nconst persistRemovalOfCarouselFunctionality = function () {\n window.onorientationchange = function () {\n $('.carousel.loaded').each((index, el) =>\n $(el).children().last().hide()\n );\n };\n};\n\n/*\n * Display titles without a carousel n old Android (< v. 3.0) devices\n * @param device - Bowser object\n */\nconst removeCarouselFunctionForOldAndroid = function (device) {\n const semver = require('semver');\n let thisVersion = semver.coerce(device.osversion);\n const is2genKindle =\n device.android &&\n semver.satisfies(thisVersion, '>=4.0.3') &&\n !!window.navigator.userAgent.match(/KFTT/);\n const isOldAndroid = device.android && parseInt(device.osversion, 10) < 3;\n\n if (is2genKindle || isOldAndroid) {\n removeCarouselFunctionality();\n persistRemovalOfCarouselFunctionality();\n }\n};\n\nexport { removeCarouselFunctionForOldAndroid };\n","const addDays = function(days) {\n const d = new Date();\n d.setTime(d.getTime() + days * 24 * 60 * 60 * 1000);\n return d.toISOString();\n};\n\nexport default addDays;\n","import expensiveDomTraversalForDyslexicPleaseDoNotUse from './expensiveDomTraversalForDyslexicPleaseDoNotUse.js';\n\n/*\n * Do the expensive DOM traversal if cookie set.\n */\nconst expensiveDomTraversalForDyslexicIfCookiePleaseDoNotUse = function() {\n if (window.Cookies && window.Cookies.get('dyslexic-setting') === '1') {\n expensiveDomTraversalForDyslexicPleaseDoNotUse('open-dyslexic', -1);\n }\n};\n\nexport default expensiveDomTraversalForDyslexicIfCookiePleaseDoNotUse;\n","const expensiveDomTraversalForDyslexicPleaseDoNotUse = (font, fontsizeOffset) => {\n $(':not(\"i\"):not(\".menu-icon\"):not(\"style\"):not(\"script\"):not(.icon-search-nav)').each((index, el) => {\n el.style.setProperty('font-family', font, 'important');\n const $el = $(el);\n if ($el.children().length === 0 || ($el.children().length === 1 && $el.children('i').length >= 1)) {\n const fontsize = parseInt($el.css('font-size'), 10);\n $el.css('font-size', `${fontsize + fontsizeOffset}px`);\n }\n });\n};\n\nexport default expensiveDomTraversalForDyslexicPleaseDoNotUse;\n","/*\n * Encode a string\n * @param {string} str String to be encoded\n * @returns {string}\n */\nconst rfc3986EncodeURIComponent = function(str) {\n return encodeURIComponent(str).replace(/[&!'()*]/g, escape);\n};\n\nexport default rfc3986EncodeURIComponent;\n","/*\n * @param formats\n * @returns {string} The format ID or null\n */\nconst findFormatId = function(formats) {\n if (formats != null) {\n for (let x = 0; x < formats.length; x++) {\n const val = formats[x];\n if (val.id === 'ebook-epub-adobe'\n || val.id === 'ebook-epub-open'\n || val.id === 'audiobook-mp3'\n || val.id === 'video-streaming') {\n return val.id;\n }\n }\n }\n return null;\n};\n\nexport default findFormatId;\n","const keys = Object.freeze({\n TAB: 9,\n ENTER: 13,\n LEFT: 37,\n UP: 38,\n RIGHT: 39,\n DOWN: 40,\n SPACE: 32,\n ESC: 27\n});\nexport default keys;\n","const { _ } = window;\n\nconst logger = {\n log(level, message, fields) {\n const body = {\n level: level || 'info',\n message: message || 'No message specified',\n fields: {\n path: window.location.pathname\n }\n };\n\n if (level === 'error') {\n body.fields.stackTrace = new Error().stack;\n }\n\n if (!_(fields).isEmpty()) {\n Object.assign(body.fields, fields);\n }\n\n // TODO: remove LHTNG-2598 test code\n console.log(body);\n\n const requestData = JSON.stringify(body);\n\n let request = new XMLHttpRequest();\n request.open('POST', '/log', true);\n request.setRequestHeader('Content-Type', 'application/json');\n request.send(requestData);\n }\n};\n\nexport default Object.freeze(logger);\n","const noCard = function(action, mediaId, stub) {\n // TODO: This logic is completely buggy and wrong\n const forwardUrl = stub.replace(encodeURIComponent('?no-linked-card=true'), '').replace(/(&|\\?)no-linked-card(=true|\\=false)/, '');\n const cardLinkUrl = window.url(window.routes.accountStartCardLink, {forward: forwardUrl, action: [action, mediaId].join('~')});\n $('#add-card-button').attr('href', cardLinkUrl);\n};\n\nexport default noCard;\n","const mandatory = () => {\n throw new Error('Missing parameter');\n};\n\nexport {\n mandatory\n};\n","import querystring from 'querystring';\n\nconst removeQueryParam = (qs, param) => {\n let newqs = qs.toLowerCase();\n if (qs[0] === '?') {\n newqs = qs.substr(1); // Remove starting '?'\n }\n const queryObj = querystring.parse(newqs);\n delete queryObj[param];\n return `?${querystring.stringify(queryObj)}`; // Reappend '?'\n};\n\nexport {\n removeQueryParam\n};\n","export default function(requestFn) {\n const headers = $.ajaxSettings.headers;\n delete $.ajaxSettings.headers;\n const promise = requestFn();\n $.ajaxSettings.headers = headers;\n return promise;\n}\n","import routing from '../../../lib/internal/routing.js';\n\nconst routes = routing.routes;\n\nconst url = function(route, parameters) {\n const result = routing.getRouteUrl({baseUrl: window.OverDrive._baseUrl}, route, parameters);\n\n if (!result) {\n try {\n let message = `Failed to route ${route}`;\n if (parameters != null) {\n const parametersJSON = JSON.stringify(parameters);\n message += ` with parameters ${parametersJSON}`;\n }\n\n const error = new Error(message);\n\n if (window.NREUM && window.NREUM.noticeError) {\n window.NREUM.noticeError(error);\n } else if (window.console && window.console.error) {\n window.console.error(error);\n }\n } catch (e) {\n // ¯\\_(ツ)_/¯\n }\n }\n return result;\n};\n\nexport {\n url,\n routes\n};\n","import { toStaticUrl } from '../../../lib/assetMapper';\n\n// LHTNG-1817 - Dynamic SVG Loader\nexport default () => {\n $(() => {\n try {\n delete $.ajaxSettings.headers['csrf-token'];\n\n $('.svg.dynamic-loader').each((i, el) => {\n let $elm = $(el);\n let src = $elm.attr('data-src');\n\n if (!_(src).isEmpty() && !$elm.html()) {\n $.get(toStaticUrl(`img/${src}`)).then((response) => {\n if (!$elm.html()) {\n $elm.append($('svg', response));\n }\n });\n }\n });\n }\n finally {\n $.ajaxSetup({\n headers: {'csrf-token': $('#csrf').val() || OverDrive._csrf}\n });\n }\n });\n};\n","import { mandatory } from './parameters';\n\nconst createOpeningTag = (tag) => `<${tag}>`;\n\nconst createClosingTag = (tag) => ``;\n\nconst decodeEntities = (encodedString) => {\n const textArea = document.createElement('textarea');\n textArea.innerHTML = encodedString;\n return textArea.value;\n};\n\nconst specialChar = [\n 's',\n ',',\n '.',\n '+',\n '-',\n ' ',\n '(',\n ')',\n '|',\n '{',\n '}',\n '[',\n ']',\n '?',\n '*',\n];\n\nconst getCleanMatcher = (matcher) => {\n let cleanMatcher = matcher;\n specialChar.forEach((sc) => {\n const pattern = new RegExp(`\\\\${sc}`, 'g');\n cleanMatcher = cleanMatcher.replace(pattern, '');\n });\n return cleanMatcher;\n};\n\nconst getMatchSpecialCharString = () => {\n let specialCharList = '';\n specialChar.forEach((sc) => {\n if (specialCharList === '') {\n specialCharList = `\\\\${sc}`;\n } else {\n specialCharList = `${specialCharList}|\\\\${sc}`;\n }\n });\n return `(${specialCharList})*`;\n};\n\nconst surroundSubtext = ({\n text = mandatory(),\n matcher = mandatory(),\n tag = mandatory(),\n ignoreCase = false,\n global = false,\n}) => {\n // Makes users input of special characters be disregard\n const cleanMatcher = getCleanMatcher(matcher);\n // Makes users input match those with special characters\n const pattern = `(${cleanMatcher\n .split('')\n .join(getMatchSpecialCharString())})`;\n const flags = `${ignoreCase ? 'i' : ''}${global ? 'g' : ''}`;\n const regexp = new RegExp(pattern, flags);\n const newSubstring = `${createOpeningTag(tag)}$1${createClosingTag(tag)}`;\n return text.replace(regexp, newSubstring);\n};\n\nconst createRegex = ({\n text = mandatory(),\n ignoreCase = false,\n global = false,\n ignoreWhitespace = false,\n}) => {\n const pattern = ignoreWhitespace\n ? `(${text.split('').join('(\\\\s|\\\\n)*')})`\n : text;\n const flags = `${ignoreCase ? 'i' : ''}${global ? 'g' : ''}`;\n const regexp = new RegExp(pattern, flags);\n return regexp;\n};\n\nexport {\n createOpeningTag,\n createClosingTag,\n decodeEntities,\n surroundSubtext,\n createRegex,\n};\n","const fillStars = function($container, stars, options) {\n stars = stars || 0;\n options = options || {};\n let children = $container.children('.icon-star');\n\n children.removeClass('filled');\n if (!options.isHover) { // If the user is actually setting the rating\n children.each((i, el) => {\n let ratingCopy = window.html('starRating.unratedLabel', {number: i + 1, currentRating: stars});\n if (options.setRating) {\n ratingCopy = window.html('starRating.ratedLabelLong', {number: i + 1, currentRating: stars});\n }\n $(el).attr('aria-label', ratingCopy);\n });\n }\n\n children = children.filter((i) => (i + 1) <= Math.round(stars))\n .addClass('filled');\n\n if (options.setRating) {\n children\n .last()\n .attr('aria-label', window.html('starRating.removeRating', {stars}));\n }\n};\n\nexport default fillStars;\n","import {html} from '../../../../lib/i18n/browser';\nimport {toStaticUrl} from '../../../../lib/assetMapper';\n\nconst handleForwardActionHold = function(data, titleId) {\n $.when(ajax.getPatronEmail()).done((emailResp) => {\n if (emailResp === '') {\n const title = data.title;\n const typeId = data.type.id;\n const typeName = data.type.name;\n const artwork = data.covers.cover300Wide.href == null ? toStaticUrl('img/no-cover_en_US.jpg') : data.covers.cover300Wide.href;\n const prereleaseDate = html('date-full', {d: data.estimatedReleaseDate});\n const isPrerelease = data.isPreReleaseTitle;\n const mediaId = titleId;\n\n const modal = $('#hold-dynamic-modal');\n $('[data-id=\"title\"]').html(title);\n $('[data-id=\"format-icon\"]').removeClass().addClass(`icon-${typeId}`);\n $('[data-id=\"format-name\"]').html(typeName);\n $('[data-id=\"cover-image\"]').attr('src', artwork);\n if (prereleaseDate != null && isPrerelease) {\n $('[data-id=\"pre-release-label\"]').text(window.text('accountHolds.prereleaseExpected', {date: prereleaseDate})).removeClass('hideMe');\n } else {\n $('[data-id=\"pre-release-label\"]').text('').addClass('hideMe');\n }\n\n $('form#hold-dynamic-form').attr({'data-media-id': mediaId, 'data-from-ajax': 'true'});\n\n // Disney publisher ids are 98146 - 98155\n if (data.publisher.id >= 98146 && data.publisher.id <= 98155 && Cookies.get('disney-eula-setting') !== '1') {\n $('#disney-eula-modal').foundation('reveal', 'open');\n } else {\n modal.foundation('reveal', 'open');\n }\n } else {\n ajax.placeHold(titleId, emailResp, $('body'));\n }\n });\n};\n\nexport default handleForwardActionHold;\n","/*\n * Handle opening the hold conflict modal\n */\nconst openHoldConflictModal = function(mediaData) {\n const originalHTMLContents = $(`.primary-action[data-media-id=\"${mediaData.id}\"]`).html();\n\n $('.modal').foundation('reveal', 'close');\n\n const dataType = mediaData.typeId;\n const holdButton = $('.now-unavailable-button-container a:not([data-cancel])');\n\n $(`.primary-action[data-id=\"${mediaData.id}\"]`).html(originalHTMLContents);\n $('[data-id=\"title\"]').html(mediaData.title);\n $('[data-id=\"cover-image\"]').attr('src', mediaData.cover);\n\n holdButton.attr('data-title', mediaData.title).attr('data-artwork', mediaData.cover)\n .attr('data-type', dataType).attr('data-type-name', dataType.toUpperCase()).attr('data-pre-release', mediaData.prerelease);\n\n loading.changeButtonState(holdButton, 'hold');\n\n holdButton.attr('data-media-id', mediaData.id).attr('href', 'javascript:void(0)').attr('data-action', 'hold');\n $('#now-unavailable-modal').foundation('reveal', 'open');\n};\n\n\nexport default openHoldConflictModal;\n","import HashManager from '../../components/common/HashManager';\nimport Title from '../../components/media/models/Title';\nimport TitleActions from '../../title-actions/TitleActions';\n\nexport default class ProcessForwardedAction {\n constructor(collection, bus, model) {\n let hash = HashManager.get('action')[0];\n this.actionArr = hash ? hash.split('~') : [];\n this.action = this.actionArr[0] || null;\n this.mediaId = this.actionArr[1] || null;\n this.rating = this.actionArr[2] || 0;\n this.model = model || null;\n this.collection = collection.models;\n this.bus = bus;\n }\n\n // Execute user forwarded action\n executeAction() {\n if (!this.action || !this.mediaId) {\n return;\n }\n\n if (\n !this.model ||\n (this.model && this.model.get('id') !== this.mediaId)\n ) {\n this.model = _.find(\n this.collection,\n (model) => model.id === this.mediaId\n );\n }\n\n let titleActions = new TitleActions({ bus: this.bus });\n\n if (this.model) {\n // Title model is on page\n HashManager.remove('action');\n this.model.set('userStarRating', this.rating);\n titleActions.perform(this.action, this.model);\n } else {\n // Title model is not on page, fetch async\n let title = new Title();\n let promise = new Promise((resolve, reject) => {\n title.getTitleAsync(this.mediaId, resolve, reject);\n });\n\n promise.then(() => {\n this.model && this.model.set('userStarRating', this.rating);\n titleActions.perform(this.action, title);\n HashManager.remove('action');\n });\n }\n }\n}\n","import getQueryParams from '../url/getQueryParams.js';\nimport { removeQueryParam } from '../query.js';\nimport selectStarRating from './selectStarRating';\nimport { html } from '../../../../lib/i18n/browser';\nconst openHoldConflictModal = './openHoldConflictModal.js';\nconst handleForwardActionHold = './handleForwardActionHold.js';\n\nconst processInstantForwardActions = function (stub) {\n const theStub =\n stub ||\n window.location.pathname +\n (window.location.search ? window.location.search : '');\n let action = getQueryParams(window.location.search).action;\n const once = $('body').attr('data-action-processed');\n const qs = removeQueryParam(window.location.search, 'action');\n\n if (\n action &&\n !once &&\n action.indexOf('~') > -1 &&\n $('body').attr('no-linked-cards') === 'false'\n ) {\n history.replaceState(null, null, window.location.pathname + qs);\n\n action = action.split('~');\n const titleId = action[1];\n const actionElem = $(\n `[data-action=\"wishlist-add\"][data-media-id=\"${titleId}\"]`\n );\n const titleElem = $(`div.wishlist[data-id=\"${titleId}\"] a`);\n const rating = parseInt(action[2], 10);\n const actionButton = $(\n `[data-action][data-media-id=\"${titleId}\"]`\n ).first(); // Action button\n const titleCardLink = $(\n `a.primary-action[data-media-id=\"${titleId}\"], .TitleAction-button[data-media-id=\"${titleId}\"]`\n ).first(); // Link on bottom of title card\n let elem = null;\n let possibleAction = ''; // the action currently attached to the button\n\n switch (action[0]) {\n case 'wish':\n case 'wishlist-add':\n case 'wishlist-remove':\n // If already added ot the wishlist break.\n if (\n $(\n `[data-action=\"wishlist-remove\"][data-media-id=\"${titleId}\"]`\n ).length ||\n $(\n `div.wishlist[data-id=\"${titleId}\"] i.icon-wish-list-added`\n ).length\n ) {\n break;\n }\n\n // Check if item exists on page if it does: click element else: take action manually.\n if (actionElem.length) {\n // Action button exists\n actionElem.click();\n } else if (titleElem.length) {\n // Grid / carousel item exists\n titleElem.click();\n } else {\n // Fallback: get media info\n ajax.wishListAdd(titleId, $('body'));\n $.ajax({\n url: window.url(window.routes.mediaInfoId, {\n id: titleId,\n }),\n type: 'GET',\n });\n }\n break;\n case 'star':\n // Needs to happen last in the queue after media status\n $('body').on('userStarRatingSet', () => {\n selectStarRating(\n $(\n `.star-ratings-container[data-media-id=\"${titleId}\"]`\n ),\n rating\n );\n });\n break;\n default: // borrow and hold\n if (\n actionButton.length &&\n (actionButton.is(':visible') ||\n Cookies.get('media-view-preference') === 'list')\n ) {\n elem = actionButton;\n possibleAction = elem.attr('data-action');\n if (possibleAction === 'borrow-simple') {\n possibleAction = 'borrow';\n }\n } else if (titleCardLink.length) {\n elem = titleCardLink;\n if (\n (elem.attr('onclick') &&\n elem\n .attr('onclick')\n .toLowerCase()\n .indexOf('borrow') > -1) ||\n elem.hasClass('js-borrow')\n ) {\n possibleAction = 'borrow';\n } else if (\n (elem.attr('onclick') &&\n elem.attr('onclick').toLowerCase().indexOf('hold') >\n -1) ||\n elem.hasClass('js-hold')\n ) {\n possibleAction = 'hold';\n }\n }\n\n if (elem) {\n if (action[0] === possibleAction || action[0] === 'nook') {\n // the desired action button is visible, click it\n elem.click();\n } else if (possibleAction === 'hold') {\n openHoldConflictModal(titleId, elem);\n }\n } else {\n // Fallback: Get media details\n $.ajax({\n url: window.url(window.routes.mediaInfoId, {\n id: titleId,\n }),\n type: 'GET',\n success(data) {\n if (\n action[0] === 'borrow' ||\n action[0] === 'borrow-simple'\n ) {\n ajax.borrow(titleId, false, $('body'));\n $(document)\n .on(\n 'borrowSuccess',\n (e, eventElem, expDate) => {\n // eBook should be properly capitalized, but other types should be lowercase\n const type =\n data.type.id === 'ebook'\n ? data.type.name\n : data.type.id;\n ajax.borrowSuccessToast(\n expDate,\n type\n );\n }\n )\n .on(\n 'borrowFailure',\n (e, innerElem, response) => {\n const parsedResponse = JSON.parse(\n response.jqXHR.responseText\n );\n\n // Only execute if the title can be placed on hold and the target was the body\n if (\n parsedResponse.errorCode ===\n 'TitleNoLongerAvailable' &&\n innerElem.context.tagName ===\n 'BODY'\n ) {\n const fakeElem = $('', {\n 'data-title': data.title,\n 'data-type': data.type.id,\n 'data-artwork':\n data.covers.cover300Wide\n .href == null\n ? 'img/no-cover_en_US.jpg'\n : data.covers\n .cover300Wide\n .href,\n 'data-prerelease': html(\n 'date-full',\n {\n d: data.estimatedReleaseDate,\n }\n ),\n });\n openHoldConflictModal(\n titleId,\n fakeElem\n );\n } else if (\n parsedResponse.errorCode\n ) {\n let href = '';\n let linkText = '';\n if (\n parsedResponse.errorCode ===\n 'PatronExceededCheckoutLimit' ||\n parsedResponse.errorCode ===\n 'LoanAlreadyExists'\n ) {\n href = window.url(\n window.routes\n .accountLoans\n );\n linkText =\n window.html('loans');\n } else if (\n parsedResponse.errorCode ===\n 'PatronExceededChurningLimit' ||\n parsedResponse.errorCode ===\n 'PatronTypeRestrictedFromTitle'\n ) {\n href = window.url(\n window.routes\n .supportMembers\n );\n linkText = window.html(\n 'pleaseContactSupport'\n );\n }\n\n if (toaster) {\n const link = `${linkText}`;\n toaster.push(\n `${window.html(\n 'genericError'\n )} ${window.text(\n `error.${parsedResponse.errorCode}`,\n { link }\n )}`,\n 'error'\n );\n }\n }\n }\n );\n } else if (action[0] === 'hold') {\n $.when(ajax.getAvailability(titleId))\n .done((innerData) => {\n if (innerData.availableCopies > 0) {\n const fakeElem = $('', {\n 'data-title': innerData.title,\n 'data-type': innerData.type.id,\n 'data-artwork':\n innerData.covers\n .cover300Wide.href ==\n null\n ? 'img/no-cover_en_US.jpg'\n : innerData.covers\n .cover300Wide\n .href,\n 'data-prerelease': html(\n 'date-full',\n {\n d: innerData.estimatedReleaseDate,\n }\n ),\n });\n } else {\n handleForwardActionHold(\n innerData,\n titleId\n );\n }\n })\n .fail(() => {\n handleForwardActionHold(data, titleId);\n });\n }\n },\n });\n }\n break;\n }\n\n $('body').attr('data-action-processed', true);\n } else if (\n action &&\n !once &&\n $('body').attr('no-linked-cards') === 'true'\n ) {\n action = action.split('~');\n const titleId = action[1];\n\n // TODO: This logic is completely buggy and wrong\n const forwardUrl = theStub\n .replace(encodeURIComponent('?no-linked-card=true'), '')\n .replace(/(&|\\?)no-linked-card(=true|\\=false)/, '');\n const cardLinkUrl = window.url(window.routes.accountStartCardLink, {\n forward: forwardUrl,\n action: [action[0], titleId].join('~'),\n });\n\n $('#add-card-button').attr('data-fwd-action', cardLinkUrl);\n }\n};\n\nexport default processInstantForwardActions;\n","import fillStars from './fillStars.js';\nimport setUserStarRating from './setUserStarRating.js';\n\n/*\n * Handles a user selecting a rating\n * */\nconst selectStarRating = function($container, selectedRating, isHover) {\n const mediaId = $container.data('media-id');\n const existingRating = $container.data('user-rating');\n\n let isReset = false;\n if (existingRating != null && existingRating === selectedRating) {\n isReset = true;\n }\n const rating = isReset ? 0 : selectedRating;\n if (isReset) {\n $container.data('user-rating', null);\n $container.removeClass('user-rating');\n fillStars($container, $container.data('global-rating'), {setRating: false, isHover});\n } else {\n setUserStarRating($container, rating, {setRating: true, isHover});\n }\n\n if ($container.hasClass('js-no-auth')) {\n // TODO: This will break on pages that need their querystring?\n const forwardUrl = window.location.pathname;\n const action = ['star', mediaId, rating].join('~');\n window.location = window.url(window.routes.accountSignIn, {forward: forwardUrl, action});\n } else if (isReset) {\n ajax.deleteStarRating(mediaId);\n } else {\n ajax.setStarRating(mediaId, rating);\n }\n};\n\nexport default selectStarRating;\n","import fillStars from './fillStars.js';\n\n/*\n * Forces a user star rating to be displayed; doesn't persist\n */\nconst setUserStarRating = function($container, rating, options) {\n $container.data('user-rating', rating);\n $container.removeClass('user-rating').addClass('user-rating');\n fillStars($container, rating, options);\n};\n\nexport default setUserStarRating;\n","/*\n * Append copy to toast explaining cookies to the user\n */\nconst getCookieExplanation = function () {\n const privacyPolicy = window.html('privacyPolicyClickHere');\n const exitSite = window.html('exitSite');\n const cookieToast = window.html('cookieToast', {\n link: `${privacyPolicy}`,\n });\n const cookieToastExit = window.html('cookieToastExit', {\n link: `${exitSite}`,\n });\n $('#eu-notify-toast').html(\n // eslint-disable-line prefer-template\n `${cookieToast}\n

      \n \n ${cookieToastExit}\n `\n );\n};\n\nexport default getCookieExplanation;\n","/*\n * Add the provided query parameter and navigate to the new URL\n * @param {string} name Name of the query parameter to add\n * @param {string} value The new value of the query parameter to add\n */\nconst addQueryParam = function(name, value) {\n const path = window.location.pathname;\n let queryString = window.location.search;\n\n if (queryString) {\n queryString += `&${name}=${value}`;\n } else {\n queryString += `?${name}=${value}`;\n }\n\n window.location.href = path + queryString;\n};\n\nexport default addQueryParam;\n","/**\n * Get all query parameters\n * @param {string} qs The current query string provided by window.location.search\n * @returns {object} A JSON object containing the query string name and values\n */\nconst getQueryParams = function (qs) {\n const qsReplaced = qs.split('+').join(' ');\n\n const params = {};\n const re = /[?&]?([^=]+)=([^&]*)/g;\n let tokens = re.exec(qsReplaced);\n\n while (tokens) {\n params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]);\n tokens = re.exec(qsReplaced);\n }\n\n return params;\n};\n\nexport default getQueryParams;\n","import getQueryParams from './getQueryParams';\n/*\n * Replace the provided query parameter with a different one and navigate to the new URL\n * @param {string} name Name of the query parameter to replace\n * @param {string} value The new value of the query parameter to replace\n */\nconst replaceQueryParam = function(name, value) {\n const path = window.location.pathname;\n let queryString = window.location.search.replace(/&page=\\d+/g, '&page=1').replace(/\\?page=\\d+/g, '?page=1');\n const query = getQueryParams(queryString);\n\n if (queryString) {\n if (query[name]) {\n queryString = queryString.replace(`${name}=${query[name]}`, `${name}=${value}`);\n } else {\n queryString += `&${name}=${value}`;\n }\n } else {\n queryString = `?${name}=${value}`;\n }\n\n window.location.href = path + queryString;\n};\n\nexport default replaceQueryParam;\n","/*\n * Strip the noLinkedCard parameter from the url if the user has linked cards\n * @param {array} qs\n * @returns {*}\n */\nconst stripNoLinkedCardQuery = function(qs) {\n const arr = qs.split('&');\n\n if (arr.length === 1 && arr[0].indexOf('no-linked-card') < 0) {\n return qs;\n }\n\n let newQS = '';\n for (let x = 0; x < arr.length; x++) {\n if (arr[x].indexOf('no-linked-card') > -1) {\n arr[x] = '';\n } else if (x > 0 && x < arr.length) {\n newQS += '&';\n }\n newQS += arr[x];\n }\n\n return newQS;\n};\n\nexport default stripNoLinkedCardQuery;\n","// import when we move more to modules\nconst Backbone = window.Backbone;\nconst fs = require('fs');\nconst path = require('path');\nconst loaderTemplate = _.template(fs.readFileSync(path.join(__dirname, '/../templates/loader.html'), 'utf8'));\n\nconst BaseView = Backbone.View.extend({\n\n close() {\n this.trigger('close');\n this.remove();\n this.unbind();\n this.stopListening();\n // Views should define this in their extend declaration\n this.onClose && this.onClose();\n return this;\n },\n\n getHtml({templateData} = {}) {\n const globals = {\n html: window.html,\n text: window.text\n };\n const data = templateData || this.getTemplateData();\n return this.template(_.extend({}, data, globals));\n },\n\n buildElement(options) {\n return this.$el.html(this.getHtml(options));\n },\n\n doRender(options) {\n this.buildElement(options);\n if (this.target && !this.attached) {\n this.beforeAttach && this.beforeAttach();\n this.attach();\n this.attached = true;\n }\n },\n\n attach() {\n if (!(this.$target instanceof Backbone.$)) {\n this.$target = Backbone.$(this.target);\n }\n this.$target.append(this.$el);\n },\n\n render(options) {\n this.clearLoader();\n\n if (this.beforeRender) {\n this.beforeRender();\n }\n this.doRender(options);\n if (this.afterRender) {\n this.afterRender();\n }\n return this;\n },\n\n getTemplateData() {\n return this.model && this.model.toJSON() || {};\n },\n\n renderLoader() {\n const elem = $(this.target).length ? $(this.target) : this.$el;\n elem.empty().append(loaderTemplate({html: window.html}));\n },\n\n clearLoader() {\n // Clear loader if it exists\n const $loader = $('.js-es6loader');\n if ($loader.length) {\n $loader.remove();\n }\n }\n\n});\n\nexport default BaseView;\n","import BaseView from './base';\n\nconst CollectionView = BaseView.extend({\n\n views: [],\n\n temp: document.createElement('div'),\n\n destroyItems() {\n while (this.views.length > 0) {\n this.views[0].deleteView();\n delete this.views[0];\n this.views.shift();\n }\n },\n\n emptyEl() {\n this.destroyItems();\n this.$el.empty();\n this.temp.innerHtml = '';\n },\n\n beforeRender() {\n this.emptyEl();\n },\n\n doRender() {\n this.template && BaseView.prototype.doRender.call(this);\n this.buildAndAppendItems();\n },\n\n buildAndAppendItems() {\n this.buildItems();\n this.appendItems();\n },\n\n buildItems() {\n this.collection.each(this.assignOne, this);\n },\n\n appendItems() {\n this.$el.append(this.temp);\n },\n\n assignOne(model, index) {\n const view = this.createItemView({model});\n this.beforeAppend && this.beforeAppend({view, model, index});\n const html = view.render().el;\n this.appendItem({html, view, model, index});\n this.views.push(view);\n },\n\n appendItem({html}) {\n this.temp.appendChild(html);\n },\n\n getTemplateData() {\n return this.collection && this.collection.models || [];\n }\n\n});\n\nexport default CollectionView;\n","import forceRealPageReload from './util/compatibility/force_real_page_reload';\n\nconst onWindowPageshow = function(event) {\n\n forceRealPageReload(event);\n\n};\n\nexport default onWindowPageshow;\n","/**\n * @fileOverview\n * app.js\n * Global JS file that applies to all views.\n * @type {NodeList}\n */\n\n$(document).ready(function () {\n $('form').on('valid invalid', function (e) {\n if (e.type != 'valid.fndtn.abide') {\n e.preventDefault();\n }\n });\n\n //Prevent form submit when errors are showing\n $('form').submit(function (e) {\n if ($(this).find('small.error').is(':visible')) {\n e.preventDefault();\n }\n });\n\n if (typeof lazyload === 'function') {\n var lzld = lazyload({ src: 'data-aload' });\n\n $('img[data-aload]')\n // add dimensions\n .addClass('broken')\n // add blank image so it doesn't look broken (this is smaller than clear.gif)\n .attr(\n 'src',\n 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=='\n )\n // remove the placeholder stuff when the image is load for real\n .on('load', function () {\n if (this.getAttribute('data-lzled')) {\n $(this)\n .removeAttr('broken data-aload')\n .removeClass('broken');\n }\n })\n // register the lazy loader watcher\n .each(function () {\n lzld(this);\n });\n } else {\n $('img[data-aload]').attr('src', function () {\n return $(this).attr('data-aload');\n });\n }\n\n $('[data-forward]').attr(\n 'href',\n $('[data-forward]').attr('href') +\n '?forward=' +\n window.location.pathname +\n stripNoLinkedCardQuery(location.search) +\n location.hash.replace('#', '&action=')\n );\n\n var isWindows =\n window.navigator.platform.match(/Win/) && !bowser.windowsphone\n ? true\n : false;\n var isWindows8AndUp = window.navigator.userAgent.match(\n /(Windows 10.0|Windows NT 10.0|Windows 8.1|Windows NT 6.3|Windows 8|Windows NT 6.2)/\n )\n ? true\n : false;\n var inApp = Cookies.get('omcbrowse') != undefined;\n\n if (isWindows && isWindows8AndUp && inApp) {\n var elems = $(\n 'li.read-sample a, a.sample, a.sample-circle-icon, a.sample-button'\n );\n elems.each(function () {\n if ($(this).attr('data-href')) {\n $(this)\n .attr('data-metro', 'true')\n .attr('href', $(this).attr('data-href'))\n .attr('target', '_blank')\n .attr('rel', 'noreferrer')\n .removeAttr('data-reveal-id');\n }\n });\n }\n\n if (\n $('.more-actions-drop:not(.list-view)')\n .first()\n .find('.js-contextLink')\n .text().length > 105\n ) {\n $('.more-actions-drop').addClass('is-wide');\n }\n\n // LHTNG-1431,1432,1804 - adding sort options to holds, wishlist, and rated titles\n // I thought about creating a separate script file account-related stuff rather\n // then shoving this in here, but etung encouraged me to use this catch-all file since\n // the account area is going to be redone in the near future.\n var sortByElem = $('.js-accountSortByOptions');\n sortByElem.on('change', function () {\n window.replaceQueryParam('sortBy', $(this).val());\n });\n});\n\n/**\n * Close a modal when the cancel button is clicked\n */\n$('[data-cancel]').on('click', function () {\n $(this).foundation('reveal', 'close');\n});\n\nwindow.scrollAmt = 0;\n\n/**\n * Hide carousel arrows when reaching the end of a carousel\n */\n$('.carousel.loaded').on('scroll', function (e) {\n hideArrowsOnEndOfScroll(e, this);\n});\n\n/**\n * Reset scrollAmt to detect end of new carousel\n */\n$('.carousel.loaded').on({\n mouseleave: function () {\n window.scrollAmt = 0;\n },\n});\n\n$('.carousel.loaded').each(function () {\n hideCarouselArrows(this);\n});\n\nif (!bowser.mobile && !bowser.tablet) {\n $('.carousel.loaded').each(function () {\n Ps.initialize($(this)[0], { suppressScrollY: true });\n });\n}\n\n$('i[data-scroll=\"right\"]').on('click', function () {\n var elem = $(this)\n .siblings('.js-carousel')\n .children('div[data-scroll-container]');\n scrollCarousel('right', elem);\n});\n\n$('i[data-scroll=\"left\"]').on('click', function () {\n var elem = $(this)\n .siblings('.js-carousel')\n .children('div[data-scroll-container]');\n scrollCarousel('left', elem);\n});\n\n/**\n * Actions to perform when a dropdown is closed\n */\n$('.drop').on('closed.fndtn.dropdown', function () {\n $(this).find('a').attr('tabindex', '-1');\n $(this).find('h2').attr('tabindex', '-1');\n var elem = $('li[data-dropdown=\"' + $(this).attr('id') + '\"] > a');\n elem.attr('aria-expanded', 'false');\n});\n\n$('[data-last-link]').on('focusout', function () {\n var nextItem = $(this).parents('.content.f-dropdown').next('li');\n nextItem.children('a').focus();\n});\n\n$('ul.drop.content.f-dropdown')\n .on('keydown', function (e) {\n arrowTabMenu(e);\n })\n .on('keydown', '*', function (e) {\n arrowTabMenu(e);\n });\n\n$('ul#dropAccount')\n .on('keydown', function (e) {\n arrowTabAccountMenu(e);\n })\n .on('keydown', '*', function (e) {\n arrowTabAccountMenu(e);\n });\n\n// Fix for select elements in IOS app view\n$(document).ready(function () {\n $(document).on('popupbeforeposition', function () {\n $.mobile.hashListeningEnabled = false;\n });\n $(document).on('popupafterclose', function () {\n $.mobile.hashListeningEnabled = true;\n });\n});\n\n$('#link-card-modal').on('opened.fndtn.reveal', function () {\n var button = $('#add-card-button');\n if (button.attr('data-fwd-action')) {\n button.attr('href', button.attr('data-fwd-action'));\n button.removeAttr('data-fwd-action');\n }\n});\n\n$(window).resize(function () {\n clearTimeout(this.id);\n this.id = setTimeout(function () {}, 500); // Do not run constantly on resize\n});\n\n// Detect if user is scrolling or not\nvar scrolling = false;\n$('body')\n .on('touchmove', function () {\n scrolling = true;\n })\n .on('touchend', function () {\n scrolling = false;\n });\n\n/**\n * Used to automatically redirect links in collections menu on iOS\n * Sometimes they just like to hover instead of click. Because Apple.\n */\n$('.js-link').on('click touchend', function (e) {\n if (scrolling) {\n scrolling = false;\n return;\n }\n window.location = $(this).attr('href');\n});\n\n// Custom jquery filter to select focusable elements\n// Wasn't sure where else to put this for the time being\n$.extend($.expr[':'], {\n focusable: function (el, index, selector) {\n return $(el).is('a, button, :input, [tabindex]');\n },\n});\n\ntry {\n window.console &&\n window.console.log &&\n window.console.log(\n 'Hi there! This site is powered by OverDrive and our vision is a world enlightened by reading. Maybe a curious cat like you can help https://company.overdrive.com/company/careers/open-positions/'\n );\n} catch (e) {}\n","/* eslint-disable no-invalid-this */\nwindow.ajax = {\n bus: window.globalEvents,\n // Ajax request to borrow a title\n borrow: function (mediaId, lendingPeriod, elements, units) {\n elements.each(function () {\n $(this).trigger('borrowRequest');\n });\n\n return $.post(\n window.url(window.routes.mediaBorrow, { mediaId: mediaId }),\n {\n lendingPeriod: lendingPeriod,\n units: units,\n isMobile: bowser.mobile || bowser.tablet,\n }\n )\n .done(function (data) {\n elements.each(function (i, el) {\n var $elm = $(el);\n\n if ($elm.attr('data-type') === 'periodicals') {\n $(document).trigger('nookSuccess', [$elm, data]);\n\n if ($elm.context.tagName === 'BODY') {\n $elm.removeAttr('data-type').remove(\n 'data-media-id'\n ); // Remove temporary data type attribute\n }\n } else {\n $(document).trigger('borrowSuccess', [$elm, data]);\n }\n });\n })\n .fail(function (jqXHR, textStatus, errorThrown) {\n elements.each(function (i, el) {\n var $elm = $(el);\n $elm.trigger('borrowFailure', [\n $elm,\n {\n jqXHR: jqXHR,\n textStatus: textStatus,\n errorThrown: errorThrown,\n },\n ]);\n });\n });\n },\n\n returnTitle: function (mediaId) {\n var self = this;\n $.ajax({\n url: window.url(window.routes.mediaReturn, {\n mediaId: parseInt(mediaId, 10),\n }),\n type: 'DELETE',\n success: function () {\n window.location = window.location.pathname;\n },\n error: function (jqXHR, textStatus, errorThrown) {\n var response = JSON.parse(jqXHR.responseText);\n if (response.sessionExpired) {\n self.bus.trigger('user:session:expired');\n } else if (toaster) {\n var link = '';\n if (response.errorCode === 'TitleCannotBeEarlyReturned') {\n link = `${window.html(\n 'learnAboutReturning'\n )}`;\n } else if (\n response.errorCode ===\n 'CannotEarlyReturnWhenFulfilledOnKindle'\n ) {\n link = `${window.html(\n 'amazonsSite'\n )}`;\n }\n\n toaster.push(\n '' +\n window.html('genericError') +\n ' ' +\n window.text('error.' + response.errorCode, {\n link: link,\n }),\n 'error'\n );\n }\n\n $('.reveal-modal').foundation('reveal', 'close');\n },\n });\n },\n\n //Ajax request for placing a hold\n placeHold: function (mediaId, email, elements) {\n elements.each(function () {\n if (!$(this).hasClass('primary-action')) {\n $(this).trigger('holdRequest', $(this));\n }\n });\n\n $.ajax({\n url: window.url(window.routes.mediaPlaceHold),\n type: 'POST',\n data: {\n email: email,\n mediaId: mediaId,\n isMobile: bowser.mobile || bowser.tablet,\n languageCode:\n window.patronSettings['language-selection'] ||\n window.Cookies.get('language-selection') ||\n $('html').attr('lang') ||\n 'en',\n },\n success: function (data, textStatus, xhr) {\n elements.each(function () {\n // If status is 303: hold failed because title has already been placed on hold.\n if (xhr.status === 303) {\n var message = { responseText: data };\n $(this).trigger('holdFailure', [$(this), message]);\n } else {\n $(this).trigger('holdSuccess', [$(this), data]);\n }\n });\n },\n error: function (response) {\n elements.each(function () {\n $(this).trigger('holdFailure', [$(this), response]);\n });\n },\n });\n },\n\n //Ajax request for retrieving a single hold\n getHold: function (mediaId) {\n return $.ajax({\n url: window.url(window.routes.getSingleHold, {\n mediaId: parseInt(mediaId),\n }),\n type: 'GET',\n });\n },\n\n //Ajax request for retrieving a single media item\n getMediaItem: function (mediaId) {\n return $.ajax({\n url: window.url(window.routes.mediaInfoId, {\n mediaId: parseInt(mediaId),\n }),\n type: 'GET',\n });\n },\n\n removeHold: function (elem, mediaId) {\n $.ajax({\n url: window.url(window.routes.mediaRemoveHold, {\n mediaId: mediaId,\n forward: 'account',\n }),\n type: 'DELETE',\n success: function () {\n window.location.reload();\n },\n error: function (jqXHR, textStatus, errorThrown) {\n var response = JSON.parse(jqXHR.responseText);\n if (toaster) {\n toaster.push(\n '' +\n window.html('genericError') +\n ' ' +\n window.html('error.' + response.errorCode),\n 'error'\n );\n }\n $('.modal').foundation('reveal', 'close');\n },\n });\n },\n\n //Ajax request for adding to wish list\n wishListAdd: function (mediaId, elements) {\n $(elements).each(function () {\n $(this).trigger('wishListAddRequest');\n });\n\n $.ajax({\n url: window.url(window.routes.accountWishlistAdd, {\n mediaId: mediaId,\n }),\n type: 'PUT',\n success: function (data) {\n $(elements).each(function () {\n $(this).trigger('wishListAddSuccess', data);\n });\n },\n error: function (jqXHR, textStatus, errorThrown) {\n $(elements).each(function () {\n $(this).trigger(\n 'wishListAddFailure',\n jqXHR,\n textStatus,\n errorThrown\n );\n });\n },\n });\n },\n\n //Ajax request for removing from wish list\n wishListRemove: function (mediaId, elements, reload) {\n $(elements).each(function () {\n $(this).trigger('wishListRemoveRequest', elements);\n });\n\n var self = this;\n\n $.ajax({\n url: window.url(window.routes.accountWishlistRemove, {\n mediaId: mediaId,\n }),\n type: 'DELETE',\n success: function (data) {\n if (reload) {\n // Reload wishlist account page\n window.location.reload();\n } else {\n $(elements).each(function () {\n $(this).trigger('wishListRemoveSuccess', data);\n });\n }\n },\n error: function (jqXHR, textStatus, errorThrown) {\n var response = JSON.parse(jqXHR.responseText);\n if (response.sessionExpired) {\n self.bus.trigger('user:session:expired');\n } else {\n $(elements).each(function () {\n $(this).trigger(\n 'wishListRemoveFailure',\n jqXHR,\n textStatus,\n errorThrown\n );\n });\n }\n },\n });\n },\n\n getMediaStatus: function (items) {\n if (\n items &&\n items.length &&\n window.OverDrive.isAuthenticated &&\n window.OverDrive.hasLinkedCards\n ) {\n $('body').trigger('mediaStatusRequest');\n\n $.ajax({\n url: window.url(window.routes.mediaInfo),\n type: 'POST',\n contentType: 'application/json',\n timeout: 10000,\n data: JSON.stringify({ titleIds: items }),\n success: function (data) {\n $('body').trigger('mediaStatusSuccess', data);\n },\n error: function (jqXHR, textStatus, errorThrown) {\n $('body').trigger(\n 'mediaStatusFailure',\n jqXHR,\n textStatus,\n errorThrown,\n items\n );\n },\n });\n }\n },\n\n getLendingPeriods: function (mediaId, elements, callback) {\n if (mediaId == '' || mediaId == null) {\n return;\n }\n\n $(elements).each(function () {\n $(this).trigger('lendingPeriodsRequest');\n });\n\n var self = this;\n $.ajax({\n url: window.url(window.routes.patronLendingPeriod, {\n mediaId: mediaId,\n }),\n type: 'GET',\n timeout: 0,\n success: function (data) {\n $(elements).each(function () {\n $(this).trigger('lendingPeriodsRetrieved', { items: data });\n });\n\n if (callback != null) {\n callback(data);\n }\n },\n\n error: function (data) {\n // Using new event bus for future-proofing\n self.bus.trigger('lendingPeriods:fetch:fail');\n },\n });\n },\n\n getAvailability: function (mediaId) {\n return $.ajax({\n url: window.url(window.routes.mediaAvailabilityId, { id: mediaId }),\n type: 'GET',\n timeout: 0,\n });\n },\n\n getStarRating: function (mediaId, elements) {\n $.ajax({\n url: window.url(window.routes.patronMediaStarRatings, {\n titleId: mediaId,\n }),\n type: 'GET',\n timeout: 0,\n success: function (data) {\n $(elements).each(function () {\n $(this).trigger('starRatingsRetrieved', data);\n });\n },\n\n error: function (data) {\n $(this).trigger('starRatingsGetError', data);\n },\n });\n },\n\n setStarRating: function (mediaId, rating) {\n var self = this;\n $.ajax({\n url: window.url(window.routes.patronMediaStarRatings, {\n titleId: mediaId,\n }),\n type: 'PUT',\n data: { rating: rating },\n timeout: 0,\n\n error: function (data) {\n $(this).trigger('starRatingsSetError', data);\n\n // Using new event bus for future-proofing\n self.bus.trigger('rating:set:fail');\n },\n });\n },\n\n deleteStarRating: function (mediaId) {\n var self = this;\n $.ajax({\n url: window.url(window.routes.patronMediaStarRatings, {\n titleId: mediaId,\n }),\n type: 'delete',\n timeout: 0,\n\n error: function (data) {\n $(this).trigger('starRatingsSetError', data);\n\n // Using new event bus for future-proofing\n self.bus.trigger('rating:delete:fail');\n },\n });\n },\n\n getPatronEmail: function (callback) {\n return $.ajax({\n url: window.url(window.routes.patronEmail),\n type: 'GET',\n timeout: 0,\n });\n },\n\n borrowSuccessToast: function (expires, mediaTypeName) {\n var exp = window.html('date-full', { d: expires });\n var toastCopyKey = 'toasts.borrowSuccessHtml';\n if (exp.match(/invalid/i)) {\n toastCopyKey = 'toasts.borrowSuccessNoExpHtml';\n }\n var linkUrl = window.url(window.routes.accountLoans);\n var loans = window.html('loans');\n if (toaster) {\n toaster.push(\n window.html(toastCopyKey, {\n mediaTypeName: mediaTypeName,\n exp: exp,\n link:\n '' +\n loans +\n '',\n }),\n 'userAction'\n );\n }\n },\n};\n","var focused = $(':focus');\n\n/**\n * Actions to take when opening modals\n */\n$('.reveal-modal').each(function() {\n /* Capture element that opened the modal, so it can be re-focused when the modal closes */\n $(this).on('open.fndtn.reveal', function() {\n focused = document.activeElement;\n });\n\n $(this).on('opened.fndtn.reveal', function() {\n var modal = this;\n\n $(modal).attr('aria-hidden', false);\n $('.container').attr('aria-hidden', 'true');\n $('.row.footer').attr('aria-hidden', 'true');\n $('.nav-container').attr('aria-hidden', 'true');\n\n //Place initial focus inside of modal\n $(modal).find('.js-first-focus').focus();\n\n }).on('closed.fndtn.reveal', function() {\n $(this).attr('aria-hidden', true);\n $('.container').attr('aria-hidden', 'false');\n $('.row.footer').attr('aria-hidden', 'false');\n $('.nav-container').attr('aria-hidden', 'false');\n //Restore focus to last focused element outside of modal\n focused.focus();\n });\n});\n\n/**\n * Keep focus inside the modal. If the user tabs past the last element, re-focus\n * on the first element (js-first-focus). If the user shift-tabs on the first\n * element, focus on the last element (js-last-focus).\n */\n$(document).on('keydown', '.reveal-modal', function(e) {\n var activeElem = document.activeElement;\n\n if ($(activeElem).hasClass('js-first-focus') && e.which === 9 && e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n $(this).find('.js-last-focus').focus();\n } else if ($(activeElem).hasClass('js-last-focus') && e.which === 9 && !e.shiftKey) {\n e.preventDefault();\n e.stopPropagation();\n $(this).find('.js-first-focus').focus();\n }\n});\n\n//Close modal when enter pressed on close button\n$('a.close-reveal-modal').keydown(function(e) {\n if (e.which == 13) {\n $(this).click();\n }\n});\n\n//Stop spinners when borrow or holds related modal is closed\n$('#hold-dynamic-modal, #now-available-modal, #now-unavailable-modal').on('closed.fndtn.reveal', function() {\n\n //Put title elements back to original state.\n $('a.primary-action img:visible').each(function() {\n var container = $(this).closest('a.primary-action');\n container.html(container.attr('data-original-text'));\n });\n});\n","import { KanopyMenuAdView } from '../../ecmascript/components/kanopy-menu-ad/kanopy-menu-ad-view';\n\n/* eslint no-invalid-this: \"off\" */\n/* eslint func-style: \"off\" */\nvar openMenu = 'main';\n\nvar trimOutsideForwardSlashes = function (s) {\n if (s) {\n return s.replace(/^\\/?(.*?)\\/?$/, '$1');\n } else {\n return s;\n }\n};\n\nvar getFormWidth = function ($elem) {\n return (\n $('.js-mobileSearchContainer').width() -\n $('.js-mobileNavSearchIcon').width() -\n $elem.width() -\n 30\n );\n};\n\nconst renderKanopyAd = () => {\n const menuAdEl = $('.kanopy-menu-ad-container');\n if (window.featureManager.isEnabled('kanopy-promo') && menuAdEl) {\n new KanopyMenuAdView({\n el: menuAdEl,\n highContrast: window.OverDrive.highContrast,\n isTolinoDevice: window.OverDrive.isTolinoDevice,\n kanopySignUpUrl: window.OverDrive.kanopySignUpUrl,\n });\n }\n};\n\n$(document).ready(function () {\n // Don't submit a blank search\n $(document).on('keyup', 'input[data-search]', function (e) {\n if (e.which == 13) {\n if ($(this).val() != '') {\n $(this).parents('form').submit();\n } else {\n e.preventDefault();\n return false;\n }\n }\n });\n\n // if the user is not on the home page...\n var currentPath = trimOutsideForwardSlashes(location.pathname);\n var homePath = trimOutsideForwardSlashes(window.url(window.routes.home));\n if (currentPath !== homePath) {\n // ...then underline the nav link of the current page if it exists\n // TODO: Refactor away these general selectors and do it more cleanly\n $('a[href*=\"' + currentPath + '\"]').addClass('selected');\n $('a[href*=\"' + currentPath + '\"] li span').addClass('selected');\n }\n\n if ($(document).width() > 870) {\n $('.js-toggleRow').removeClass('row');\n }\n\n // Fit mobile search to container\n $('.js-mobileSearchForm').css(\n 'width',\n getFormWidth($('.js-mobileNavIconContainer')) + 'px'\n );\n});\n\n$('.js-mobileSearchInput')\n .on('touchstart click', function () {\n setTimeout(function () {\n if (!$('.js-advancedSearchContainer').is(':visible')) {\n $('.js-advancedSearchContainer').toggle();\n if (window.toaster) window.toaster._stickToast();\n }\n\n if ($('.js-account-menu-mobile').hasClass('is-open')) {\n window.AccountMenuMobileView.close();\n if (window.toaster) window.toaster._stickToast();\n }\n }, 1);\n })\n .on('focusout', function () {\n setTimeout(function () {\n var focused = $(document.activeElement);\n if (\n !focused.hasClass('js-advancedSearchLink') &&\n $('.js-advancedSearchContainer').css('display') == 'block' &&\n !focused.hasClass('js-mobileSearchInput')\n ) {\n if (window.toaster) window.toaster._stickToast();\n }\n }, 1);\n });\n\n$(\n '.js-notificationsButton, .MobileNav-bookshelfLink, .js-mobileMenu, .js-advancedSearchContainer, .js-mobileSearchInput'\n).on('focusout', function () {\n setTimeout(function () {\n var focused = $(document.activeElement);\n if (\n !focused.hasClass('js-notificationsButton') &&\n !focused.hasClass('MobileNav-bookshelfLink') &&\n !focused.hasClass('js-mobileMenu') &&\n !focused.hasClass('js-advancedSearchLink') &&\n !focused.hasClass('js-mobileSearchInput')\n ) {\n $('.js-advancedSearchContainer').hide();\n }\n }, 1);\n});\n\n// Handle mobile nav menu\n$('.js-mobileMenu').on(\n 'tap click',\n _.debounce(function (e) {\n e.preventDefault();\n e.stopPropagation();\n\n // LHTNG-3938 - this is a last ditch hack. The notification drawer uses a click handler on to close itself, but\n // this menu doesn't play nice with that pattern. I tried to clean that up and allow the click to propagate but that\n // revealed a huge mess of issues that we can't tackle now.\n if (\n window.featureManager.isEnabled('Notifications') &&\n window.notificationDrawer\n ) {\n window.notificationDrawer.close();\n }\n\n renderKanopyAd();\n\n setTimeout(function () {\n if (window.toaster) window.toaster._stickToast();\n }, 0);\n\n if ($('.icon-search-nav').hasClass('expanded')) {\n $('.icon-search-nav')\n .removeClass('expanded')\n .addClass('unexpanded');\n }\n\n $(\n '#mobile-nav-foundation-dropdown[data-menu=\"' + openMenu + '\"]'\n ).toggle();\n\n if ($('.js-account-menu-mobile').hasClass('is-open')) {\n window.AccountMenuMobileView.close();\n }\n\n if ($(this).attr('id') == 'hamburger') {\n if ($(this).attr('aria-expanded') == 'false') {\n $(this).attr('aria-expanded', 'true');\n } else {\n $(this).attr('aria-expanded', 'false');\n }\n }\n return false;\n }, 350)\n);\n\n// Advantage tout\n$('div#dropAccount.large')\n .on('opened.fndtn.dropdown', function () {\n $('.top-bar').css('overflow', 'visible');\n var link = $(this).find('a');\n $(this).find('p').attr('tabindex', link.attr('data-tab'));\n link.attr('tabindex', link.attr('data-tab'));\n })\n .on('closed.fndtn.dropdown', function () {\n $(this).find('p').attr('tabindex', -1);\n $(this).find('a').attr('tabindex', -1);\n });\n\n$(window).resize(function () {\n var width = $(document).width();\n if (width <= 855) {\n $('.js-toggleRow').addClass('row');\n\n var searchForm = $('.js-mobileSearchForm');\n if (searchForm.hasClass('is-expanded')) {\n searchForm.css(\n 'width',\n getFormWidth($('.js-searchControlContainer')) + 'px'\n );\n } else {\n searchForm.css(\n 'width',\n getFormWidth($('.js-mobileNavIconContainer')) + 'px'\n );\n }\n } else {\n $('.js-toggleRow').removeClass('row');\n }\n});\n\nfunction exitSearchMode() {\n $('.js-searchControlContainer').addClass('u-hideMe');\n var iconContainer = $('.js-mobileNavIconContainer');\n iconContainer.removeClass('u-hideMe');\n $('.js-mobileSearchForm')\n .removeClass('is-expanded')\n .addClass('is-unexpanded')\n .css('width', getFormWidth(iconContainer) + 'px');\n}\n\nfunction enterSearchMode() {\n var searchContainer = $('.js-searchControlContainer');\n searchContainer.removeClass('u-hideMe');\n $('.js-mobileNavIconContainer').addClass('u-hideMe');\n $('.js-mobileSearchForm')\n .addClass('is-expanded')\n .removeClass('is-unexpanded')\n .css('width', getFormWidth(searchContainer) + 'px');\n}\n\n// Close mobile search bar\n$('.js-clearMobileSearch').on('tap click', function () {\n $('.js-mobileSearchInput').val('').trigger('keyup').focus();\n exitSearchMode();\n $('.js-advancedSearchContainer').show();\n\n //Hacks until I move all this logic to backbone views\n $('.js-quickSearchInput', '.js-quickSearchMobile').trigger('keyup');\n $('.js-quickSearchInput', '.js-quickSearchMobile').trigger('focusout');\n});\n\n$('.js-mobileSearchInput')\n .on('keyup', function () {\n enterSearchMode();\n\n if ($(this).val().length === 0) {\n exitSearchMode();\n $('.js-advancedSearchContainer').show();\n }\n })\n .on('click focus', function () {\n if ($(this).val().length > 0) {\n enterSearchMode();\n }\n $('.js-advancedSearchContainer').show();\n })\n .on('blur', function () {\n // When mobile search input loses focus, unhide mobile account menu\n $('.js-account-menu-link, .js-account-menu-mobile').removeClass(\n 'hideMeImportant'\n );\n });\n\n$(document).click(function (e) {\n if (!$(e.target).parent().parent().hasClass('js-mobileSearchContainer')) {\n exitSearchMode();\n }\n});\n\n$('.js-doQuickSearch').on('touchstart click', function (e) {\n if ($('.js-mobileSearchInput').val() !== '') {\n $('#search-form-mobile').submit();\n }\n});\n\n//Toggle foundation accordion\n$('.accordion.top-nav li, span.nav-panel-icon').on(\n 'tap click',\n 'a:eq(0), a:eq(1), span',\n function (e) {\n e.stopPropagation();\n\n var li_parent = $(this).parent();\n\n if (li_parent.hasClass('active') && li_parent.hasClass('top-nav')) {\n li_parent.removeClass('active');\n $('.accordion.top-nav li div.content:visible').toggle();\n } else if (li_parent.hasClass('top-nav')) {\n $('.accordion-navigation.top-nav').removeClass('active');\n li_parent.addClass('active');\n $('.accordion.top-nav li div.content:visible').toggle();\n $(this).parent().find('.content').toggle();\n }\n\n if (window.toaster) window.toaster._stickToast();\n }\n);\n\n// Remove desktop view searchbar autofocus on mobile devices\nvar mobile = bowser.mobile;\nvar tablet = bowser.tablet;\n\nif (mobile || tablet) {\n $('.search-input').removeAttr('autofocus');\n} else {\n $('.search-input').focus();\n}\n\n// TODO: Evaluate if this is still needed - MD\nwindow.onorientationchange = function () {\n if (\n $('.search-input-mobile').css('display') != 'none' &&\n $('.search-input').css('display') == 'none' &&\n $('input:focus').length > 0 &&\n Math.abs(window.orientation) != 90\n ) {\n $('.js-mobileSearchInput').trigger('click');\n } else if (\n Math.abs(window.orientation) === 90 &&\n $('input:focus').length > 0\n ) {\n $('.search-input').trigger('click');\n } else if ($('input:focus').length > 0) {\n $('.js-mobileSearchInput').trigger('click');\n }\n};\n\n$('input[data-search]').click(function (e) {\n if (!$('input[data-search]').is(':focus')) {\n document.activeElement.blur();\n $(this).blur();\n var temp = $(this).val();\n $('input[data-search]').val(temp);\n $(this).focus();\n e.preventDefault();\n }\n});\n\nif ($('.js-mobileLibraryLogo').attr('src') == '') {\n showAltLogoMobile();\n}\n\nif ($('h1#logo-desktop a img').attr('src') == '') {\n showAltLogoDesktop();\n}\n\n/**\n * Set tab indices for nav menu\n */\n\nvar resized = false;\n$('ul#drop-collections')\n .on('opened.fndtn.dropdown', function (event) {\n $(this).find('a, h2').attr('tabindex', 0);\n // $(this).find('h2:first').focus();\n if (!resized) {\n // Determine size of navigation based on # of columns\n var nav = $('ul#drop-collections');\n var columns = nav.find('ul:first-child').children('li');\n var columnCount = columns.length;\n var columnWidth = (1 / columnCount) * 100 + '%';\n\n columns.css('width', columnWidth);\n\n if (columnCount === 3) {\n columns.last().css('width', '200px');\n }\n\n nav.addClass('nav-' + columnCount + '-columns');\n resized = true;\n }\n })\n .on('closed.fndtn.dropdown', function () {\n $(this).find('a, h2').attr('tabindex', -1);\n });\n\n$('.Nav-collectionsLink').on('click', function (event) {\n event.stopPropagation();\n event.preventDefault();\n window.Foundation.libs.dropdown.toggle($(this));\n\n renderKanopyAd();\n});\n\n$('.Nav-collectionsLink').on('keyup', function (event) {\n event.stopPropagation();\n event.preventDefault();\n if (event.which === 13) {\n window.Foundation.libs.dropdown.toggle($(this));\n\n renderKanopyAd();\n }\n});\n\n$('ul#language-dropdown')\n .on('opened.fndtn.dropdown', function () {\n $(this).find('a').attr('tabindex', 0);\n $(this).find('a:first');\n $(this).attr('tabindex', 0).focus();\n })\n .on('closed.fndtn.dropdown', function () {\n $(this).find('a').attr('tabindex', -1);\n $(this).attr('tabindex', -1);\n });\n\n// Close nav when account dropdown is opened\n$('#dropAccount').on('opened.fndtn.dropdown', function (e) {\n window.Foundation.libs.dropdown.close($('#drop-collections'));\n});\n\n$('.js-closeAdvantageTout').on('click tap', function () {\n Cookies.set('advantage-dismissed', '1', { path: '/', expires: 1 });\n\n var accountSignInUrl = window.url(window.routes.accountSignIn);\n\n $('.js-advantageTout').hide();\n if (window.toaster) window.toaster._stickToast();\n $('a#account-holder-name, [data-dropdown=\"dropAccountMobile\"]')\n .removeAttr('aria-haspopup data-options aria-controls')\n .attr({ href: accountSignInUrl, 'data-forward': '' });\n $(\n '#account-holder-name, li.account-dropdown-mobile a i.icon-account, [data-dropdown=\"dropAccountMobile\"]'\n ).on('click', function (e) {\n e.stopPropagation();\n });\n});\n","$('.sample-modal').on('closed.fndtn.reveal', function (e) {\n $('iframe#sample-dynamic-iframe').attr('src', 'about:blank');\n});\n\n$(() => {\n if (!window.featureManager.isEnabled('cleanupContextMenuToggle')) {\n $('body').on('click keyup', '.js-context-button', function (e) {\n e.stopImmediatePropagation();\n\n if (e.type === 'click' || e.which === 32 || e.which === 13) {\n //If menu is already open close it\n var dropdown = $(this).attr('data-dropdown');\n\n if ($('ul#' + dropdown).offset().left > 0) {\n Foundation.libs.dropdown.close(\n $('#' + dropdown),\n $(\n '.js-context-button[data-dropdown=\"' +\n $('#' + dropdown).attr('id') +\n '\"]'\n )\n );\n $('ul#' + dropdown + ' li a').attr('tabindex', -1);\n } else {\n $(document).foundation('dropdown', 'closeall');\n $('ul#' + dropdown + ' li a').attr('tabindex', 0);\n Foundation.libs.dropdown.open(\n $('#' + dropdown),\n $(\n '.js-context-button[data-dropdown=\"' +\n $('#' + dropdown).attr('id') +\n '\"]'\n )\n );\n $(this).focus();\n }\n }\n });\n }\n});\n\n$('body').on('closed.fndtn.dropdown', '.js-context-drop', function (e) {\n $(e.target).find('a').attr('tabindex', '-1');\n});\n\n$('body').on('opened.fndtn.dropdown', '.js-context-drop', function (e) {\n $(e.target).find('a').attr('tabindex', '0');\n});\n\n$('body').on(\n 'click',\n 'li.read-sample a, .button.sample, .js-details-cover-sample',\n function (e) {\n let signInUrl = window.url(window.routes.accountSignIn, {\n forward: window.location.href,\n });\n let performSampleSignInRedirect =\n window.featureManager.isEnabled('sample-signin-redirect') &&\n !window.OverDrive.isAuthenticated &&\n !window.OverDrive.allowAnonymousSampling;\n if (performSampleSignInRedirect) {\n e.stopImmediatePropagation();\n window.location.assign(signInUrl);\n } else {\n // If in mobile or in-app open sample link in new window. Else open in modal.\n var inApp = Cookies.get('omcbrowse') !== undefined;\n var target = $(e.target).closest('a');\n var isMediaDoTitle = false;\n\n //for samples on the home page\n if (target.attr('media-do-format')) {\n isMediaDoTitle =\n target.attr('media-do-format') === 'true' ? true : false;\n }\n\n if (isMediaDoTitle === false && window.OverDrive.mediaItems) {\n var title =\n window.OverDrive.mediaItems[target.attr('data-media-id')];\n var formats = title['formats'];\n formats.forEach((ele) => {\n if (ele['id'] === 'ebook-media-do') {\n isMediaDoTitle = true;\n }\n });\n }\n\n if (\n $(document).width() <= 640 ||\n target.attr('data-type') === 'video' ||\n target.attr('data-metro') ||\n inApp ||\n isMediaDoTitle\n ) {\n target\n .attr({\n target: '_blank',\n rel: 'noreferrer',\n href: target.attr('data-href'),\n })\n .removeAttr('data-reveal-id');\n } else {\n target.attr('data-reveal-id', 'sample-dynamic-modal');\n\n if (target.attr('data-href')) {\n $('iframe#sample-dynamic-iframe').attr(\n 'src',\n target.attr('data-href')\n );\n $('.modal-title[data-sample-title]').html(\n target.attr('data-title')\n );\n $(document).foundation('reveal', 'reflow');\n }\n }\n }\n }\n);\n","/**\n * Holds functions\n * @type {{holdPlaced: holds.holdPlaced, revealHoldModal: holds.revealHoldModal}}\n */\nwindow.holds = {\n holdPlaced: function (elements) {\n window.ajax.placeHold(\n elements.attr('data-media-id'),\n $('.patron-hold-email-dynamic').val(),\n elements\n );\n },\n\n /**\n * Reveal the place a hold modal\n */\n revealHoldModal: function (elem) {\n if (!elem.hasClass('disabled')) {\n var title,\n typeId,\n typeName,\n artwork,\n prereleaseDate,\n isPrerelease,\n mediaId;\n\n title = elem.attr('data-title');\n typeId = elem.attr('data-type');\n typeName = elem.attr('data-type-name');\n artwork = elem.attr('data-artwork');\n prereleaseDate = elem.attr('data-prerelease-date');\n isPrerelease = elem.attr('data-prerelease-date') != '';\n mediaId = elem.attr('data-media-id');\n\n var modal = $('#hold-dynamic-modal');\n $('[data-id=\"title\"]').html(title);\n $('[data-id=\"format-icon\"]')\n .removeClass()\n .addClass('icon-' + typeId);\n $('[data-id=\"format-name\"]').html(typeName);\n $('[data-id=\"cover-image\"]').attr('src', artwork);\n\n var labelCopy = window.html('dynamicHoldModal.placeHoldDesc', {\n libraryName: window.OverDrive.libraryName,\n });\n if (window.OverDrive.mediaItems[mediaId].ownedCopies === 0) {\n labelCopy = window.html('holdsRatioHelpModal.noCopiesText');\n }\n $('.js-hold-modal-label').html(labelCopy);\n\n if (prereleaseDate != undefined && isPrerelease) {\n $('[data-id=\"pre-release-label\"]')\n .text(\n window.text('prereleaseLabel', {\n prereleaseDate: prereleaseDate,\n })\n )\n .removeClass('hideMe');\n } else {\n $('[data-id=\"pre-release-label\"]').text('').addClass('hideMe');\n }\n\n $('form#hold-dynamic-form').attr('data-media-id', mediaId);\n\n if (\n elem.attr('data-publisher') >= '98146' &&\n elem.attr('data-publisher') <= '98155' &&\n Cookies.get('disney-eula-setting') != '1'\n ) {\n // Disney publisher ids are 98146 - 98155\n $('#disney-eula-modal').foundation('reveal', 'open');\n } else {\n modal.foundation('reveal', 'open');\n }\n }\n },\n};\n\n/**\n * Functions for managing action button states\n */\nwindow.loading = {\n spinners: {},\n\n animateIcon: function (elem, animation) {\n elem.removeClass('animated bounceIn bounceOut pulse infinite').addClass(\n 'animated ' + animation\n );\n },\n\n changeButtonState: function (elem, action, onStatusReq) {\n elem = elem.attr('data-action')\n ? elem\n : elem.closest(\n '[data-action]:not([data-action=\"main-navigation\"])'\n );\n var inner = '';\n var type = elem.data('type');\n var mediaId = elem.data('media-id');\n var formats = elem.data('formats');\n var buttonText = '';\n var inApp = Cookies.get('omcbrowse') != undefined;\n var formatId = findFormatId(formats);\n var isChromebook = window.navigator.userAgent.match(/CrOS/)\n ? true\n : false;\n var overdriveFormat = '';\n\n var isAndroid41AndUp =\n bowser.android && parseInt(bowser.osversion, 10) >= 4.1\n ? true\n : false;\n var isAndroidStock =\n window.navigator.userAgent.match(/Version\\/\\d\\.\\d/) &&\n bowser.android\n ? true\n : false;\n var isDolphin = window.navigator.userAgent.match(/Dolfin/)\n ? true\n : false;\n var isNook =\n window.navigator.userAgent.match(/(BNTV|BNRV)/g) && !bowser.chrome\n ? true\n : false;\n var isSilk = /\\bSilk\\/([0-9._-]+)\\b/.exec(navigator.userAgent)\n ? true\n : false;\n var isListenIncompatible =\n (!isAndroid41AndUp && (isAndroidStock || isDolphin || isSilk)) ||\n isNook\n ? true\n : false;\n\n var removeClassList =\n 'secondary primary place-a-hold radius radius-left lending-options';\n\n var banner = $(\n 'div.title-header-bar[data-media-id=\"' +\n elem.attr('data-media-id') +\n '\"] a'\n );\n\n if (formats) {\n for (var i = 0; i < formats.length; i++) {\n if (\n formats[i]['id'] == 'video-streaming' ||\n formats[i]['id'] == 'ebook-overdrive' ||\n formats[i]['id'] == 'audiobook-overdrive'\n ) {\n overdriveFormat = formats[i]['id'];\n }\n }\n }\n\n switch (action) {\n case 'borrow':\n //User has not yet borrowed a title Show borrow button\n var lendingPeriod = $('input#lending-period-' + mediaId).val();\n if (type == 'periodicals') {\n inner = window.html('day');\n elem.addClass('secondary radius').removeClass(\n 'lending-options radius-left'\n );\n\n //$('button.lending-period-dropdown').hide();\n\n if (Cookies.get('nook-eula-setting') == '1') {\n elem.removeAttr('data-reveal-id');\n }\n } else if (lendingPeriod > 0) {\n inner =\n '' +\n window.html('borrow') +\n '
      ' +\n window.html('forXDays', {\n lendingPeriod: lendingPeriod,\n }) +\n '';\n } else {\n inner = '' + window.html('borrow') + '';\n elem.css('line-height', '21px'); // Align text with other buttons\n }\n elem.removeClass(removeClassList)\n .addClass(\n 'secondary radius-left lending-options js-statusUpdated'\n )\n .attr('href', 'javascript:void(0)');\n\n $('.lending-period-dropdown')\n .addClass('secondary')\n .removeClass('disabled');\n break;\n\n case 'borrow-simple':\n //User has not yet borrowed a title Show borrow button\n if (type == 'periodicals') {\n inner = '' + window.html('sendToNook') + '';\n elem.addClass('secondary radius').removeClass(\n 'lending-options radius-left'\n );\n\n //$('button.lending-period-dropdown').hide();\n\n if (Cookies.get('nook-eula-setting') == '1') {\n elem.removeAttr('data-reveal-id');\n }\n } else {\n inner =\n '' +\n window.html('borrow') +\n '';\n }\n elem.removeClass(removeClassList)\n .addClass('secondary radius js-statusUpdated')\n .attr('href', 'javascript:void(0)');\n\n elem.removeClass('place-a-hold');\n break;\n\n case 'hold':\n //User has not yet placed this title on hold show hold button\n inner = '' + window.html('placeAHold') + '';\n elem.removeClass(removeClassList)\n .addClass('place-a-hold radius js-statusUpdated')\n .attr('href', 'javascript:void(0)');\n break;\n\n case 'borrowed':\n var isios6Incompatible =\n bowser.ios && bowser.osversion[0] === '6';\n\n //User has already borrowed this title. Show GO TO LOANS\n\n // This is temporary to disable the add to app copy. This will be refactored out soon..\n var showAddToApp = false;\n\n var plainText = window.html('goToLoans');\n buttonText = '' + plainText + '';\n\n elem.attr('href', window.url(window.routes.accountLoans))\n .attr('tabindex', '0')\n .html(window.html('goToLoans'))\n .addClass('u-allCaps');\n\n inner = buttonText\n ? buttonText\n : '' + window.html('goToLoans') + '';\n elem.addClass('secondary radius').removeClass(\n 'lending-options radius-left'\n );\n elem.removeClass('place-a-hold');\n\n if (elem.attr('data-type') == 'periodicals') {\n elem.removeAttr('data-reveal-id');\n }\n\n elem.attr('data-action', 'borrowed')\n .removeClass(removeClassList)\n .addClass('secondary radius js-statusUpdated');\n if (!elem.parent().hasClass('list-view')) {\n elem.addClass('wider-button');\n if (plainText.length > 21) {\n elem.addClass('decreased-padding');\n }\n } else {\n if (plainText.length > 22) {\n elem.addClass('decreased-padding-listview-small');\n }\n\n if (plainText.length > 19) {\n elem.addClass('decreased-padding-listview');\n }\n }\n\n banner.text(window.html('availabilityBorrowed'));\n banner\n .closest('.title-header-bar')\n .addClass('available-title secondary-background')\n .removeClass('unavailable-title');\n\n break;\n\n case 'held':\n //User has already placed this title on hold. Show GO TO HOLDS\n inner = '' + window.html('goToHolds') + '';\n\n elem.attr(\n 'href',\n window.url(window.routes.accountHolds)\n ).removeAttr('onclick');\n elem.removeClass(removeClassList).addClass('primary radius');\n if (!elem.parent().hasClass('list-view')) {\n elem.addClass('wider-button');\n // Account for Tamil\n if (inner.length > 30) {\n elem.addClass('increased-height');\n }\n\n if (inner.length > 24) {\n elem.addClass('decreased-padding');\n }\n } else {\n // Account for Tamil\n if (inner.length > 30) {\n elem.addClass('increased-height-listview');\n }\n\n if (inner.length > 25) {\n elem.addClass('decreased-padding-listview-small');\n }\n\n if (inner.length > 22) {\n elem.addClass('decreased-padding-listview');\n }\n }\n elem.attr('data-action', 'held').addClass('.js-statusUpdated');\n banner.text(window.html('onHold'));\n banner\n .closest('.title-header-bar')\n .removeClass('available-title secondary-background')\n .addClass('unavailable-title')\n .addClass('u-allCaps');\n // Account for Tamil\n if (banner.text().length > 16) {\n elem.parent()\n .siblings('.title-description')\n .addClass('is-top-padded');\n }\n break;\n\n case 'wishlist-add':\n inner =\n '' +\n window.html('addToWishList') +\n '';\n elem.addClass('add js-statusUpdated')\n .removeClass('remove')\n .attr('data-action', 'wishlist-add');\n elem.closest('.js-wishlist-button')\n .addClass('is-add')\n .removeClass('is-remove');\n elem.removeClass('place-a-hold');\n break;\n\n case 'wishlist-remove':\n inner =\n '' +\n window.html('removeFromWishList') +\n '';\n elem.addClass('remove js-statusUpdated')\n .removeClass('add')\n .attr('data-action', 'wishlist-remove');\n elem.closest('.js-wishlist-button')\n .addClass('is-remove')\n .removeClass('is-add');\n elem.removeClass('place-a-hold');\n\n elem.attr('data-action', 'wishlist-remove');\n break;\n\n case 'special':\n inner =\n '' +\n window.html('removeFromWishList') +\n '';\n elem.addClass('remove js-statusUpdated')\n .removeClass('add')\n .attr('data-action', 'wishlist-remove');\n elem.removeClass('place-a-hold');\n break;\n\n case null:\n case false:\n elem.children('div').remove();\n inner = elem.html();\n action = 'default';\n break;\n\n default:\n elem.children('div').remove();\n inner = elem.html();\n action = 'default';\n break;\n }\n\n elem.attr('aria-busy', 'false')\n .removeClass('disabled')\n .removeAttr('disabled');\n elem.next('button.lending-period-dropdown').removeClass('disabled');\n\n if (action != 'default') {\n elem.attr('data-action', action);\n }\n\n if (action != 'borrow' && elem.attr('data-type') != 'periodicals') {\n elem.addClass('radius')\n .removeClass('lending-options')\n .css('position', 'relative');\n elem.next('button.lending-period-dropdown').hide();\n }\n\n elem.html(inner).addClass('u-allCaps');\n\n processInstantForwardActions(\n window.location.pathname +\n (window.location.search ? window.location.search : '')\n );\n },\n\n updateCoverAlt: function (mediaId, text) {\n var coverImage = $('.title-header-bar[data-media-id=\"' + mediaId + '\"]')\n .next('a')\n .children('img');\n if (coverImage.length) {\n var re = new RegExp(\n '(' +\n window.html('availabilityBorrowed') +\n ')|(' +\n window.html('held') +\n ')|(' +\n window.html('onHold') +\n ')|(' +\n window.html('availabilityAvailable') +\n ')|(' +\n window.html('availabilityWaitList') +\n ')|(' +\n window.html('availabilityComingSoon') +\n ')',\n 'gi'\n );\n coverImage.attr('alt', coverImage.attr('alt').replace(re, text));\n }\n },\n};\n\n/**\n * For redirecting when a user's card becomes invalid\n */\nwindow.handleInvalidCard = function () {\n window.globalEvents.trigger('user:card:invalid');\n};\n\n/**\n * BORROW EVENT LISTENERS\n */\n$(function () {\n var selector =\n '[data-action=\"borrow\"]:not([data-no-linked-cards]), [data-action=\"borrow-simple\"]:not([data-no-linked-cards])';\n $(document).on('click', selector, function (e) {\n var elem =\n $(e.target).is('[data-action=\"borrow\"]') ||\n $(e.target).is('[data-action=\"borrow-simple\"]')\n ? $(e.target)\n : $(e.target).closest('[data-action=\"borrow\"]').length\n ? $(e.target).closest('[data-action=\"borrow\"]')\n : $(e.target).closest('[data-action=\"borrow-simple\"]');\n var mediaId = elem.attr('data-media-id');\n\n if (elem.attr('data-type') != 'periodicals') {\n var lendingPeriodInput = $('#lending-period-modal-' + mediaId)\n .length\n ? $('#lending-period-modal-' + mediaId)\n : $('#lending-period-' + mediaId);\n window.ajax.borrow(mediaId, lendingPeriodInput.val(), elem);\n\n //Remove event handler to prevent re-triggering event\n elem.off('click');\n } else if (\n elem.attr('data-type') == 'periodicals' &&\n Cookies.get('nook-eula-setting') != '1'\n ) {\n $('a#accept-nook-dynamic').attr('data-media-id', mediaId);\n } else {\n // Periodical and Nook EULA accepted\n elem.attr('data-action', 'nook').click();\n }\n });\n\n //For borrow and nook buttons\n $(document).on('borrowSuccess nookSuccess', function (e, elem, data) {\n var mediaId = elem.attr('data-media-id');\n var actionButton = $(\n '[data-action=\"borrow-simple\"][data-media-id=\"' +\n mediaId +\n '\"], [data-action=\"nook\"][data-media-id=\"' +\n mediaId +\n '\"]'\n );\n\n //Remove loading gif and action button from title elements\n $('.primary-action[data-media-id=\"' + mediaId + '\"]').css(\n 'visibility',\n 'hidden'\n );\n });\n\n //For borrow buttons only\n $(document)\n .on('borrowSuccess', function (e, elem, data) {\n var mediaId = elem.attr('data-media-id');\n var actionButton = $(\n '[data-action=\"borrow-simple\"][data-media-id=\"' + mediaId + '\"]'\n );\n\n //Update banners\n var copy = window.html('availabilityBorrowed').toUpperCase();\n $('.title-header-bar[data-media-id=\"' + mediaId + '\"] a')\n .html(\n copy +\n ' '\n )\n .attr('href', window.url(window.routes.accountLoans));\n\n //Update action buttons\n window.loading.changeButtonState(actionButton, 'borrowed');\n\n //Show toast\n if (\n actionButton.attr('data-type') !== 'periodicals' &&\n !data.sessionExpired\n ) {\n window.ajax.borrowSuccessToast(\n data,\n elem.attr('data-type-name')\n );\n }\n\n // Hide modal\n $('.modal').foundation('reveal', 'close');\n })\n .on('borrowRequest', function (e) {\n // Show spinner\n if ($(e.target).context.tagName !== 'BODY') {\n }\n })\n .on('borrowFailure', function (e, elem, response) {\n response = JSON.parse(response.jqXHR.responseText);\n var target = elem;\n var mediaId = target.attr('data-media-id');\n\n // If the user's card is invalid prompt them to link a card\n // If there's an error besides the title is out of copies, pop a toast\n // If the borrowFailure is on the body, this means an forwarded action happened and the title wasn't on the page\n // -- Do nothing in this handler; check borrowFailure in utility handler\n if (response.errorCode === 'PatronCardFailedAuthentication') {\n if (window.OverDrive.authType === 'library') {\n window.handleInvalidCard();\n } else {\n // the user's card is no longer valid. Direct them to the link a card flow so that they may resolve any issues.\n $('.js-card-error-modal').foundation('reveal', 'open');\n $('.primary-action[data-media-id=\"' + mediaId + '\"]').html(\n $(\n '.primary-action[data-media-id=\"' + mediaId + '\"]'\n ).attr('data-original-text')\n );\n }\n } else if (response.sessionExpired) {\n var forwardUrl = window.location.pathname;\n if (window.location.search) {\n forwardUrl += window.location.search + '&borrow~' + mediaId;\n } else {\n forwardUrl += '?borrow~' + mediaId;\n }\n $('.js-reauthenticate').attr(\n 'href',\n window.url(window.routes.accountSignIn, {\n forward: forwardUrl,\n })\n );\n $('#authenticate-modal').foundation('reveal', 'open');\n $('.primary-action[data-media-id=\"' + mediaId + '\"]').html(\n $('.primary-action[data-media-id=\"' + mediaId + '\"]').attr(\n 'data-original-text'\n )\n );\n } else if (response.errorCode !== 'TitleNoLongerAvailable') {\n var href = '';\n var linkText = '';\n if (\n response.errorCode === 'PatronExceededCheckoutLimit' ||\n response.errorCode === 'LoanAlreadyExists'\n ) {\n href = window.url(window.routes.accountLoans);\n linkText = window.html('loans');\n } else if (\n response.errorCode === 'PatronExceededChurningLimit' ||\n response.errorCode === 'PatronTypeRestrictedFromTitle'\n ) {\n href = window.url(window.routes.supportMembers);\n linkText = window.html('pleaseContactSupport');\n }\n var link =\n '' +\n linkText +\n '';\n if (window.toaster)\n window.toaster.push(\n '' +\n window.html('genericError') +\n ' ' +\n window.text('error.' + response.errorCode, {\n link: link,\n }),\n 'error'\n );\n $('.primary-action[data-media-id=\"' + mediaId + '\"]').html(\n $('.primary-action[data-media-id=\"' + mediaId + '\"]').attr(\n 'data-original-text'\n )\n );\n } else if (elem.context.tagName !== 'BODY') {\n var mediaData = {\n id: mediaId,\n title: target.attr('data-title'),\n cover: target.attr('artwork'),\n typeId: target.attr('data-type'),\n prerelease: target.attr('data-pre-release'),\n };\n\n openHoldConflictModal(mediaData);\n }\n });\n\n //For Nook buttons only\n //After accepting nook modal\n $(document).on(\n 'click tap',\n '[data-action=\"nook\"]:not([data-no-linked-cards])',\n function (e) {\n var elem = $(e.target).is('[data-action=\"nook\"]')\n ? $(e.target)\n : $(e.target).closest('[data-action=\"nook\"]');\n var id =\n elem.attr('id') == 'accept-nook-dynamic' ||\n Cookies.get('nook-eula-setting') == '1';\n\n if (id) {\n elem = $(\n 'a[data-action=\"nook\"][data-media-id=\"' +\n elem.attr('data-media-id') +\n '\"]'\n ); // Find original element\n window.ajax.borrow(elem.attr('data-media-id'), null, elem);\n } else {\n $('a#accept-nook-dynamic').attr(\n 'data-media-id',\n elem.attr('data-media-id')\n );\n }\n }\n );\n\n //Update dynamic nook modal mediaID\n $('.primary-action[data-type=\"periodicals\"]').on('click', function () {\n $('#accept-nook-dynamic').attr({\n 'data-media-id': $(this).attr('data-media-id'),\n 'data-type': $(this).attr('data-type'),\n });\n });\n});\n\nwindow.borrowFromTitleElem = function (mediaId) {\n var elem = $('.primary-action[data-media-id=\"' + mediaId + '\"]:first');\n elem.attr('data-original-text', elem.html());\n elem.html(primaryActionLoadingGif);\n ajax.borrow(mediaId, null, elem);\n};\n\n/**\n * HOLD EVENT LISTENERS -- from the big ol' buttons\n */\n$(function () {\n var selector = '[data-action=\"hold\"]:not([data-no-linked-cards])';\n $(document)\n .on('click', selector, function (e) {\n var target = $(e.target).closest(selector);\n var mediaId = target.attr('data-media-id');\n\n // LHTNG-1584\n window.handleHold(target, mediaId);\n\n $('form#hold-dynamic-form').removeAttr('data-from-title');\n\n //Remove event handler to prevent re-triggering event\n $($(e.target)).off('click');\n })\n .on('holdSuccess', function (e, elem, data) {\n var mediaId = elem.attr('data-media-id');\n var holdsUrl = window.url(window.routes.accountHolds);\n\n // Get the user's new wait list position in order to update holds ratio modals.\n window.ajax.getHold(mediaId).done(function (media) {\n window.setDynamicHoldsRatioModals(media);\n });\n\n var email = $('.patron-hold-email-dynamic').val();\n\n // Open Success modal\n var title = new window.Title(window.OverDrive.mediaItems[mediaId]);\n window.globalEvents.trigger('title:hold:success', {\n titleModel: title,\n });\n\n $('.primary-action[data-media-id=\"' + mediaId + '\"]').css(\n 'visibility',\n 'hidden'\n );\n\n var link =\n '' + window.html('holds') + '';\n $('p.pre-release-explanation').html(\n window.html('prereleaseExplanation', { link: link })\n );\n\n if (\n $(this).parents('.now-unavailable-button-container').length < 0\n ) {\n $(this).attr('data-action', 'held');\n }\n window.loading.changeButtonState(\n $(\n 'a[data-action=\"hold\"][data-media-id=\"' +\n mediaId +\n '\"], a[data-action=\"borrow\"][data-media-id=\"' +\n mediaId +\n '\"], a[data-action=\"borrow-simple\"][data-media-id=\"' +\n mediaId +\n '\"], a[data-action=\"held\"][data-media-id=\"' +\n mediaId +\n '\"]'\n ),\n 'held'\n );\n\n //Change grid items to match\n $('.title-header-bar[data-media-id=\"' + mediaId + '\"] a')\n .html(\n window.html('onHold') +\n ' '\n )\n .attr('href', holdsUrl)\n .addClass('u-allCaps');\n window.loading.updateCoverAlt(mediaId, window.text('onHold'));\n\n // Update holds ratio help tip class\n $('.js-holds-ratio-not-held[data-media-id=\"' + mediaId + '\"]')\n .addClass('js-holds-ratio-held')\n .removeClass('js-holds-ratio-not-held');\n\n // Update prerelease tip\n $('.js-prerelease[data-media-id=\"' + mediaId + '\"]').addClass(\n 'is-held'\n );\n })\n .on('holdFailure', function (e, elem, response) {\n window.loading.changeButtonState(elem, 'hold');\n\n response = JSON.parse(response.responseText);\n var link = '';\n var mediaId = elem.attr('data-media-id');\n\n function errorToast(pageLink) {\n window.toaster.push(\n '' +\n window.html('genericError') +\n ' ' +\n window.text('error.' + response.errorCode, {\n link: pageLink,\n }),\n 'error'\n );\n }\n\n if (response.sessionExpired) {\n window.gloablEvents.trigger('user:session:expired', {\n action: 'hold~' + mediaId,\n });\n } else if (\n response.errorCode === 'PatronCardFailedAuthentication'\n ) {\n $('#hold-dynamic-modal').foundation('reveal', 'close');\n window.handleInvalidCard();\n } else if (\n response.errorCode === 'HoldAlreadyExists' ||\n response.errorCode === 'PatronExceededHoldLimit'\n ) {\n $('#hold-dynamic-modal').foundation('reveal', 'close');\n link =\n '' +\n window.html('holds') +\n '';\n if (window.toaster) errorToast(link);\n } else if (\n response.errorCode === 'PatronTypeRestrictedFromTitle' ||\n response.errorCode === 'PatronHasHoldsDisabled'\n ) {\n $('#hold-dynamic-modal').foundation('reveal', 'close');\n link =\n '' +\n window.html('pleaseContactSupport') +\n '';\n if (window.toaster) errorToast(link);\n } else {\n $('#hold-dynamic-modal').foundation('reveal', 'close');\n if (window.toaster) errorToast('');\n }\n\n $(\n '.primary-action[data-media-id=\"' +\n elem.attr('data-media-id') +\n '\"]'\n ).html(elem.attr('data-original-text'));\n });\n\n /**\n * Place a hold on a title when form validates\n */\n $('form#hold-dynamic-form').on('valid.fndtn.abide', function (e) {\n var elem = $(\n '[data-action=\"hold\"][data-media-id=\"' +\n $(this).attr('data-media-id') +\n '\"]'\n ).first();\n\n //Check if hold was placed from title elem or action button\n if ($('form#hold-dynamic-form').attr('data-from-title')) {\n window.holdFromTitleElem(\n $('form#hold-dynamic-form').attr('data-media-id'),\n $('form#hold-dynamic-form [data-id=\"title\"]').text()\n );\n } else if ($('form#hold-dynamic-form').attr('data-from-ajax')) {\n window.ajax.placeHold(\n $('form#hold-dynamic-form').attr('data-media-id'),\n $('.patron-hold-email-dynamic').val(),\n $('body')\n );\n } else {\n window.holds.holdPlaced(elem);\n }\n });\n});\n\nwindow.handleHold = function (target, mediaId) {\n function revealHoldModal() {\n $('#hold-dynamic-modal h2[data-id=\"title\"]').html(\n $('[data-id=\"title\"]').attr('data-title')\n );\n if (target.attr('data-artwork')) {\n $('[data-id=\"cover-image\"]').attr(\n 'src',\n target.attr('data-artwork')\n );\n } else {\n var art = $('div.title[data-title-id=\"' + mediaId + '\"] img').attr(\n 'src'\n );\n if (typeof art == 'undefined') {\n art = $('div.modal-container img[data-id=\"cover-image\"]').attr(\n 'src'\n );\n }\n $('[data-id=\"cover-image\"]').attr('src', art);\n }\n window.holds.revealHoldModal(target);\n }\n\n window.ajax\n .getPatronEmail()\n .done(function (email) {\n if (email != '') {\n $('input#email-dynamic, input#email-conf-dynamic').val(email);\n $(\n '.primary-action, [data-action]:not([data-action=\"main-navigation\"])'\n ).addClass('valid-email');\n window.holds.holdPlaced(target);\n } else {\n revealHoldModal();\n }\n })\n .fail(function () {\n revealHoldModal();\n });\n};\n\n/**\n * HOLD FROM TITLE ELEMENT -- e.g. that little link under the cover in a carousel or grid view\n */\nfunction openHoldFromTitleElem(\n title,\n typeId,\n typeName,\n artwork,\n mediaId,\n prereleaseDate,\n isPrerelease\n) {\n var modal = $('#hold-dynamic-modal');\n $('form#hold-dynamic-form').attr('data-from-title', true);\n var button = $('.primary-action[data-media-id=\"' + mediaId + '\"]:first');\n\n button.attr('data-original-text', button.text());\n button.html(primaryActionLoadingGif);\n\n $.when(window.ajax.getAvailability(mediaId), window.ajax.getPatronEmail())\n .done(function (availabilityResp, emailResp) {\n var availabilityData = availabilityResp[0];\n var email = emailResp[0];\n\n if (email != '' || availabilityData.availableCopies > 0) {\n $('input#email-dynamic, input#email-conf-dynamic').val(email);\n $(\n '.primary-action, [data-action]:not([data-action=\"main-navigation\"])'\n ).addClass('valid-email');\n $('form#hold-dynamic-form').attr('data-media-id', mediaId);\n window.holdFromTitleElem(\n mediaId,\n availabilityData.availableCopies > 0\n );\n } else {\n $('[data-id=\"title\"]').html(title);\n $('[data-id=\"format-icon\"]')\n .removeClass()\n .addClass('icon-' + typeId);\n $('[data-id=\"format-name\"]').html(typeName);\n $('[data-id=\"cover-image\"]').attr('src', artwork);\n if (prereleaseDate != undefined && isPrerelease) {\n $('[data-id=\"pre-release-label\"]')\n .text('Pre-release: Expected ' + prereleaseDate)\n .removeClass('hideMe');\n } else {\n $('[data-id=\"pre-release-label\"]')\n .text('')\n .addClass('hideMe');\n }\n\n var labelCopy = window.html('dynamicHoldModal.placeHoldDesc', {\n libraryName: window.OverDrive.libraryName,\n });\n if (window.OverDrive.mediaItems[mediaId].ownedCopies === 0) {\n labelCopy = window.html('holdsRatioHelpModal.noCopiesText');\n }\n $('.js-hold-modal-label').html(labelCopy);\n\n $('form#hold-dynamic-form').attr('data-media-id', mediaId);\n\n if (\n button.attr('data-publisher') >= '98146' &&\n button.attr('data-publisher') <= '98155' &&\n Cookies.get('disney-eula-setting') != '1'\n ) {\n // Disney publisher ids are 98146 - 98155\n $('#disney-eula-modal').foundation('reveal', 'open');\n } else {\n modal.foundation('reveal', 'open');\n }\n }\n })\n .fail(function () {\n window.handleHold(button, mediaId);\n });\n}\n\nwindow.holdFromTitleElem = function (mediaId, availableCopies) {\n var elem = $('.primary-action[data-media-id=\"' + mediaId + '\"]');\n\n var originalHTMLContents = $(\n '.primary-action[data-media-id=\"' + mediaId + '\"]'\n ).html();\n elem.html(window.primaryActionLoadingGif);\n $(\n '.primary-action, [data-action]:not([data-action=\"main-navigation\"])'\n ).addClass('valid-email');\n\n window.ajax.placeHold(\n mediaId,\n encodeURIComponent($('.patron-hold-email-dynamic').val()),\n elem\n );\n};\n\nwindow.openHoldSuccessModal = function (params) {\n var modal = $('#js-HoldSuccessModal');\n var linkUrl = window.url(window.routes.accountHolds);\n var manageHolds =\n '' +\n window.html('holdSuccessModal.manageHolds') +\n '';\n var successCopy;\n if (params.autoCheckoutSetting == 1) {\n successCopy = window.html('toasts.holdSuccessAutoCheckoutHtml', {\n email: params.email,\n manageHoldsLink: manageHolds,\n });\n } else {\n successCopy = window.html('toasts.holdSuccessHtml', {\n email: params.email,\n manageHoldsLink: manageHolds,\n });\n }\n modal.find('[data-id=\"loading-container\"]').html(primaryActionLoadingGif);\n $.get(\n window.url(window.routes.mediaRelatedForHoldSuccess, {\n mediaId: params.mediaId,\n }),\n function (res) {\n $('.js-holdSuccessContent').html(res);\n modal.find('[data-id=\"success-message\"]').html(successCopy);\n var lzld = lazyload({ src: 'data-aload' });\n $('img[data-aload]')\n // add dimensions\n .addClass('broken')\n // add blank image so it doesn't look broken (this is smaller than clear.gif)\n .attr(\n 'src',\n 'data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw=='\n )\n // remove the placeholder stuff when the image is load for real\n .on('load', function () {\n if (this.getAttribute('data-lzled')) {\n $(this)\n .removeAttr('broken data-aload')\n .removeClass('broken');\n }\n })\n // register the lazy loader watcher\n .each(function () {\n lzld(this);\n });\n modal.find('[data-id=\"loading-container\"]').html('');\n modal.foundation('reveal', 'open');\n if (typeof params.onLoad == 'function') params.onLoad();\n }\n );\n};\n\n// Hold success modal events\n$('#js-HoldSuccessModal').on('closed.fndtn.reveal', function (e) {\n // Don't clear content if the modal needs to be reopened or the dropdown is closed\n if (\n $('.js-holds-ratio-help-modal').attr('data-holdSuccess') !== 'true' &&\n !$(e.target).hasClass('js-context-drop')\n ) {\n $('.js-holdSuccessContent').html('');\n }\n if (window.toaster) window.toaster._stickToast();\n});\n\n$('.js-holdSuccessContent').on('click tap', function (e) {\n if ($(e.target).hasClass('js-holds-ratio-help-icon')) {\n $('.js-holds-ratio-help-modal').attr('data-holdSuccess', true);\n }\n});\n\n$('.js-holds-ratio-help-modal').on('closed.fndtn.reveal', function () {\n if ($(this).attr('data-holdSuccess') === 'true') {\n $('#js-HoldSuccessModal').foundation('reveal', 'open');\n $(this).attr('data-holdSuccess', false);\n }\n});\n\n/**\n * Edit a holds email address\n */\n$(document).on('valid.fndtn.abide', '#hold-email-form', function () {\n var mediaId = $('#mediaId').val();\n\n $.ajax({\n url: window.url(window.routes.mediaEditHold, { mediaId: mediaId }),\n type: 'PUT',\n data: {\n email: $('.patron-hold-email').val(),\n autoCheckout: window.patronSettings['auto-checkout-setting'] == 1,\n },\n success: function (data) {\n var email = $('.patron-hold-email').val();\n\n // Update the email on the Card manager instance\n window.card && window.card.setHoldEmail(email);\n $('#edit-hold-email-modal').foundation('reveal', 'close');\n },\n error: function (jqXHR, textStatus, errorThrown) {\n $('#edit-hold-email-modal').foundation('reveal', 'close');\n if (window.toaster)\n window.toaster.push(\n '' +\n window.html('genericError') +\n ' ' +\n jqXHR.responseText,\n 'error'\n );\n },\n });\n});\n\n/**\n * WISH LIST EVENT LISTENERS\n */\n$(function () {\n var elemAdd = '[data-action=\"wishlist-add\"]:not([data-no-linked-cards])';\n\n $('body')\n .on('click', elemAdd, function (e) {\n window.ajax.wishListAdd(\n $(e.target).closest('a').attr('data-media-id'),\n $(e.target).closest('a')\n );\n })\n .on('wishListAddRequest', elemAdd, function (e) {\n var icon = $(e.target).closest('div').children('i');\n window.loading.animateIcon(icon, 'bounceOut');\n })\n .on('wishListAddSuccess', elemAdd, function (e, data) {\n var icon = $(e.target).closest('div').children('i');\n icon.removeClass('icon-wish-list').addClass('icon-wish-list-added');\n var mediaId = $(e.target).closest('a').attr('data-media-id');\n window.loading.changeButtonState(\n $(e.target).closest('a'),\n 'wishlist-remove'\n );\n window.loading.animateIcon(icon, 'bounceIn');\n\n //Change state of any grid view items with same media id\n var gridIcon = $(\n 'div.wishlist[data-media-id=\"' + mediaId + '\"]'\n ).find('i');\n gridIcon.hasClass('icon-wish-list')\n ? gridIcon\n .removeClass('icon-wish-list')\n .addClass('icon-wish-list-added')\n : gridIcon\n .removeClass('icon-wish-list-added')\n .addClass('icon-wish-list');\n });\n\n var elemRemove = '[data-action=\"wishlist-remove\"]';\n $('body')\n .on('click', elemRemove, function (e) {\n window.ajax.wishListRemove(\n $(e.target).closest('a').attr('data-media-id'),\n $(e.target).closest('a'),\n false\n );\n })\n .on('wishListRemoveRequest', elemRemove, function (e) {\n var icon = $(e.target).closest('div').children('i');\n window.loading.animateIcon(icon, 'bounceOut');\n })\n .on('wishListRemoveSuccess', elemRemove, function (e, data) {\n var icon = $(e.target).closest('div').children('i');\n icon.removeClass('icon-wish-list-added').addClass('icon-wish-list');\n var mediaId = $(e.target).closest('a').attr('data-media-id');\n $(e.target).closest('a').attr('data-action', 'wishlist-add');\n window.loading.changeButtonState(\n $(e.target).closest('a'),\n 'wishlist-add'\n );\n window.loading.animateIcon(icon, 'bounceIn');\n\n //Change state of any grid view items with same media id\n var gridIcon = $('div.wishlist[data-id=\"' + mediaId + '\"]').find(\n 'i'\n );\n gridIcon.hasClass('icon-wish-list')\n ? gridIcon\n .removeClass('icon-wish-list')\n .addClass('icon-wish-list-added')\n : gridIcon\n .removeClass('icon-wish-list-added')\n .addClass('icon-wish-list');\n });\n});\n\n/**\n * WISH LIST FROM TITLE ELEMENT\n */\nwindow.wishlistOnTitleElem = function (mediaId, elem) {\n var wishlistUrl = window.url(window.routes.accountWishlist);\n var icon = $(elem).children(':first');\n var titleName = $(\n '.title-name[data-media-id=\"' + mediaId + '\"] a:first'\n ).text();\n $(icon).addClass('bounceOut');\n\n if ($(icon).hasClass('icon-wish-list')) {\n // Add to wish list\n window.ajax.wishListAdd(mediaId, elem);\n\n $(document)\n .on('wishListAddSuccess', elem, function () {\n $(icon)\n .removeClass('icon-wish-list')\n .addClass('icon-wish-list-added')\n .removeClass('bounceOut')\n .addClass('bounceIn');\n $(elem).attr(\n 'aria-label',\n window.html('removeTitleFromWishList', { title: titleName })\n );\n\n //Update any list view items to match\n var mediaId = $(elem)\n .closest('div.wishlist')\n .attr('data-media-id');\n var listElem = $(\n 'a[data-action=\"wishlist-add\"][data-media-id=\"' +\n mediaId +\n '\"]'\n );\n var listIcon = listElem.prev('i');\n listElem.attr('data-action', 'wishlist-remove');\n listIcon\n .removeClass('icon-wish-list')\n .addClass('icon-wish-list-added');\n window.loading.animateIcon(listIcon, 'bounceIn');\n window.loading.changeButtonState(listElem, 'wishlist-remove');\n\n $(document).off('wishListAddSuccess');\n })\n .on(\n 'wishListAddFailure',\n elem,\n function (e, jqXHR, textStatus, errorThrown) {\n console.log(errorThrown);\n var mediaId = $(elem)\n .closest('div.wishlist')\n .attr('data-media-id');\n\n if (\n jqXHR.responseText &&\n JSON.parse(jqXHR.responseText)['sessionExpired']\n ) {\n var forwardUrl = window.location.pathname;\n if (window.location.search) {\n forwardUrl +=\n window.location.search + '&wish~' + mediaId;\n } else {\n forwardUrl += '?wish~' + mediaId;\n }\n $('.js-reauthenticate').attr(\n 'href',\n window.url(window.routes.accountSignIn, {\n forward: forwardUrl,\n })\n );\n $('#authenticate-modal').foundation('reveal', 'open');\n } else {\n if (window.toaster)\n window.toaster.push(\n window.html('error.defaultErrorHtml'),\n 'error'\n );\n }\n\n var icon = $(elem).children('i');\n window.loading.animateIcon(icon, 'bounceIn');\n\n $(document).off('wishListAddFailure');\n }\n );\n } else if ($(icon).hasClass('icon-wish-list-added')) {\n // Remove from wish list\n window.ajax.wishListRemove(mediaId, elem, false);\n\n $(document)\n .on('wishListRemoveSuccess', elem, function () {\n $(icon)\n .removeClass('icon-wish-list-added')\n .addClass('icon-wish-list')\n .removeClass('bounceOut')\n .addClass('bounceIn');\n $(elem).attr(\n 'aria-label',\n window.html('addTitleToWishList', { title: titleName })\n );\n\n //Update any list view items to match\n var mediaId = $(elem).closest('div.wishlist').attr('data-id');\n var listElem = $(\n 'a[data-action=\"wishlist-remove\"][data-media-id=\"' +\n mediaId +\n '\"]'\n );\n var listIcon = listElem.prev('i');\n listElem.attr('data-action', 'wishlist-add');\n listIcon\n .removeClass('icon-wish-list-added')\n .addClass('icon-wish-list');\n window.loading.animateIcon(listIcon, 'bounceIn');\n window.loading.changeButtonState(listElem, 'wishlist-add');\n\n $(document).off('wishListRemoveSuccess');\n })\n .on(\n 'wishListRemoveFailure',\n elem,\n function (e, jqXHR, textStatus, errorThrown) {\n var mediaId = $(elem)\n .closest('div.wishlist')\n .attr('data-id');\n console.log(errorThrown);\n\n if (\n jqXHR.responseText &&\n JSON.parse(jqXHR.responseText)['sessionExpired']\n ) {\n var forwardUrl =\n window.location.pathname + window.location.search;\n $('.js-reauthenticate').attr(\n 'href',\n window.url(window.routes.accountSignIn, {\n forward: forwardUrl,\n })\n );\n $('#authenticate-modal').foundation('reveal', 'open');\n } else {\n if (window.toaster)\n window.toaster.push(\n window.html('error.defaultErrorHtml'),\n 'error'\n );\n }\n\n var icon = $(elem).children('i');\n window.loading.animateIcon(icon, 'bounceIn');\n\n $(document).off('wishListRemoveFailure');\n }\n );\n }\n};\n\n/**\n * PATRON MEDIA STATUS EVENT LISTENERS\n */\n$(function () {\n var items = [];\n var wishListItems = [];\n\n $('body')\n .on('mediaStatusRequest', function () {\n $(\n '[data-action]:not([data-no-linked-cards]):not(.js-statusUpdated)'\n ).each(function () {\n var action = $(this).attr('data-action');\n if (action == 'wishlist-add' || action == 'wishlist-remove') {\n var icon = $(this).closest('div').children('i');\n window.loading.animateIcon(icon, 'bounceOut');\n }\n });\n })\n .on('mediaStatusSuccess', function (e, data) {\n var elem;\n\n // TODO: Remove\n // $('.media-container.loading').css('display', 'none');\n // if (typeof toggleListViewFeature == 'function') {\n // toggleListViewFeature();\n // }\n\n async.parallel(\n [\n function (callback) {\n //LOOP ALL BORROWED TITLES\n if (data.onCheckouts != null) {\n for (var x = 0; x < data.onCheckouts.length; x++) {\n var titleId = data.onCheckouts[x];\n items.splice(items.indexOf(+titleId), 1);\n\n //Handle grid view items\n $(\n '.title-header-bar[data-media-id=\"' +\n titleId +\n '\"] a'\n )\n .html(\n window.html('borrowed') +\n ' '\n )\n .attr(\n 'href',\n window.url(window.routes.accountLoans)\n )\n .addClass('u-allCaps');\n window.loading.updateCoverAlt(\n titleId,\n window.text('borrowed')\n );\n $(\n '.primary-action[data-media-id=\"' +\n titleId +\n '\"]'\n ).addClass('invisible js-statusUpdated');\n\n //Handle list view items\n elem = $(\n '[data-action=\"borrow\"][data-media-id=\"' +\n titleId +\n '\"], [data-action=\"borrow-simple\"][data-media-id=\"' +\n titleId +\n '\"], [data-action=\"hold\"][data-media-id=\"' +\n titleId +\n '\"], [data-action=\"nook\"][data-media-id=\"' +\n titleId +\n '\"]'\n );\n window.loading.changeButtonState(\n elem,\n 'borrowed',\n true\n );\n //Change banner text\n $(\n '[data-banner][data-media-id=\"' +\n titleId +\n '\"]'\n ).text(\n window\n .html('availabilityBorrowed')\n .toUpperCase()\n );\n }\n }\n\n callback();\n },\n function (callback) {\n //LOOP ALL HELD TITLES\n if (data.onHolds != null) {\n for (var y = 0; y < data.onHolds.length; y++) {\n //If title is already borrowed do not take action\n if (\n data.onCheckouts.indexOf(data.onHolds[y]) ==\n -1\n ) {\n var titleId = data.onHolds[y];\n items.splice(items.indexOf(+titleId), 1);\n\n $(\n '.title-header-bar[data-media-id=\"' +\n titleId +\n '\"] a'\n )\n .html(\n window.html('onHold') +\n ' '\n )\n .attr(\n 'href',\n window.url(\n window.routes.accountHolds\n )\n )\n .addClass('u-allCaps');\n window.loading.updateCoverAlt(\n titleId,\n window.text('onHold')\n );\n\n $(\n '.primary-action[data-media-id=\"' +\n titleId +\n '\"]'\n ).addClass('invisible js-statusUpdated');\n\n //Handle list view items\n elem = $(\n '[data-action=\"hold\"][data-media-id=\"' +\n titleId +\n '\"], [data-action=\"borrow\"][data-media-id=\"' +\n titleId +\n '\"]'\n );\n window.loading.changeButtonState(\n elem,\n 'held'\n );\n\n //Change banner text\n $(\n '[data-banner][data-media-id=\"' +\n titleId +\n '\"]'\n ).text(window.text('onHold'));\n\n // Update holds ratio help tip class\n $(\n '.js-holds-ratio-not-held[data-media-id=\"' +\n titleId +\n '\"]'\n )\n .addClass('js-holds-ratio-held')\n .removeClass('js-holds-ratio-not-held');\n\n // Update prerelease tip\n $(\n '.js-prerelease[data-media-id=\"' +\n titleId +\n '\"]'\n ).addClass('is-held');\n }\n }\n }\n\n callback();\n },\n function (callback) {\n //LOOP ALL TITLES ON WISH LIST\n if (data.onWishlist != null) {\n for (var z = 0; z < data.onWishlist.length; z++) {\n var titleId = data.onWishlist[z];\n var titleName = $(\n '.title-name[data-media-id=\"' +\n titleId +\n '\"] a:first'\n ).text();\n\n $(\n '.wishlist[data-media-id=\"' +\n titleId +\n '\"] i'\n )\n .removeClass('icon-wish-list')\n .addClass(\n 'icon-wish-list-added js-statusUpdated'\n );\n $(\n '.wishlist[data-media-id=\"' +\n titleId +\n '\"] a'\n ).attr(\n 'aria-label',\n window.html('removeTitleFromWishList', {\n title: titleName,\n })\n );\n\n //Handle list view items\n elem = $(\n '[data-action=\"wishlist-add\"][data-media-id=\"' +\n titleId +\n '\"]'\n );\n var icon = elem.closest('div').children('i');\n window.loading.animateIcon(icon, 'bounceIn');\n window.loading.changeButtonState(\n elem,\n 'wishlist-remove'\n );\n icon.removeClass('icon-wish-list').addClass(\n 'icon-wish-list-added'\n );\n }\n }\n\n callback();\n },\n ],\n function (err, results) {\n //Stop spinner and change state on remaining items\n for (var i = 0; i < items.length; i++) {\n var elem = $(\n '[data-action][data-media-id=\"' +\n items[i] +\n '\"]:not(.lending-options)'\n );\n\n elem.each(function () {\n window.loading.changeButtonState(\n $(this),\n $(this).attr('data-action'),\n true\n );\n });\n }\n\n //Get remaining wish list items\n for (var j = 0; j < wishListItems.length; j++) {\n var elem = $(\n '[data-action=\"wishlist-add\"][data-media-id=\"' +\n wishListItems[j] +\n '\"]'\n );\n\n var icon = elem.closest('div').children('i');\n window.loading.animateIcon(icon, 'bounceIn');\n window.loading.changeButtonState(\n $(this),\n $(this).attr('data-action'),\n true\n );\n }\n }\n );\n\n var location = window.location.toString();\n\n //Only process here if not on the details page\n if (location.indexOf('/media/') == -1) {\n processInstantForwardActions(\n window.location.pathname +\n (window.location.search ? window.location.search : '')\n );\n }\n\n $('.carousel.loaded').each(function () {\n if (!bowser.mobile && !bowser.tablet) {\n Ps.update(this);\n hideCarouselArrows(this);\n }\n });\n\n $('.media-container.loading').css('display', 'none');\n $('.media-container.loaded')\n .css('display', 'block')\n .promise()\n .done(function () {\n $(document).trigger('mediaItemsLoaded');\n });\n\n $('[data-action]:not([data-action=\"main-navigation\"])').removeClass(\n 'disabled'\n );\n })\n .on('mediaStatusFailure', function (e, jqXHR) {\n $('[data-action]:not([data-action=\"main-navigation\"])').each(\n function () {\n if (\n $(this).attr('data-action') == 'wishlist-add' ||\n $(this).attr('data-action') == 'wishlist-remove'\n ) {\n window.loading.animateIcon(\n $(this).closest('div').children('i'),\n 'bounceIn'\n );\n }\n window.loading.changeButtonState(\n $(this),\n $(this).attr('data-action'),\n true\n );\n }\n );\n\n $('.carousel.loaded').each(function () {\n if (!bowser.mobile && !bowser.tablet) {\n Ps.update(this);\n hideCarouselArrows(this);\n }\n });\n });\n\n var location = window.location.toString();\n if (\n $('body').attr('authenticated') != 'false' &&\n location.indexOf('/holds') == -1\n ) {\n $(\n '[data-action]:not([data-action=\"main-navigation\"]), .primary-action, .js-banner-link[data-banner], [data-media-id]'\n ).each(function () {\n var mediaId =\n typeof $(this).attr('data-media-id') === 'undefined'\n ? $(this).attr('data-id')\n : $(this).attr('data-media-id');\n if (items.indexOf(+mediaId) < 0 && mediaId) {\n items.push(+mediaId);\n wishListItems.push(+mediaId);\n }\n });\n //hack to get rid of extra call on media details page since the button was refactored to not use title-actions\n if (\n (items.length === 1 && location.indexOf('media/' + items[0]) < 0) ||\n items.length > 1\n ) {\n window.ajax.getMediaStatus(items);\n }\n } else {\n $('[data-action]:not([data-action=\"main-navigation\"])').each(\n function () {\n window.loading.changeButtonState(\n $(this),\n $(this).attr('data-action'),\n true\n );\n }\n );\n\n $('.media-container.loading').css('display', 'none');\n $('.media-container.loaded').css('display', 'block');\n $('.media-container.loaded.grid-view').css('display', 'block');\n\n if ($('body').attr('no-linked-cards') === 'true') {\n $(document).ready(function () {\n setTimeout(function () {\n $(document).trigger('mediaStatusNoCard');\n }, 200);\n });\n }\n\n $('.carousel.loaded').each(function () {\n if (!bowser.mobile && !bowser.tablet) {\n Ps.update(this);\n hideCarouselArrows(this);\n }\n });\n }\n});\n\n/**\n * LENDING PERIOD OPTIONS EVENT LISTENERS\n */\n$(function () {\n $('[data-lending-period-dropdown]')\n .on('lendingPeriodsRetrieved', function (e, data) {\n var lendingPeriodList = $('.js-lending-period-list');\n lendingPeriodList.empty(); // Clear any remaining options\n for (var i = 0; i < data.items.length; i++) {\n var days;\n if (data.items[i].units == 'days') {\n days = data.items[i].lendingPeriod;\n } else {\n // minutes\n days = data.items[i].lendingPeriod / 1440;\n }\n var selectedClass = data.items[i].isPreferredLendingPeriod\n ? 'is-checked default'\n : '';\n var selectedAria = data.items[i].isPreferredLendingPeriod\n ? 'aria-selected=\"true\"'\n : 'aria-selected=\"false\"';\n var selectedLabel = data.items[i].isPreferredLendingPeriod\n ? window.html('selected')\n : '';\n\n var content =\n '
    • ' +\n window.html('xDays', { lendingPeriod: days }) +\n '
    • ';\n\n lendingPeriodList.append(content);\n\n if (data.items[i].isPreferredLendingPeriod) {\n var that = this;\n setTimeout(\n function (that, days) {\n $(that)\n .prev(\n 'a[data-media-id=\"' +\n $(that).attr('data-media-id') +\n '\"]'\n )\n .children('.borrow-sub-text')\n .text(\n window.text('forXDays', {\n lendingPeriod: days,\n })\n );\n },\n 0,\n that,\n days\n );\n $(\n 'input#lending-period-' + $(this).attr('data-media-id')\n ).val(days);\n }\n }\n\n window.loading.changeButtonState(\n $(this).prev('[data-action=\"borrow\"]'),\n 'borrow'\n );\n\n //If on the details page: execute forwarded action after lending periods retrieved\n var location = window.location.toString();\n if (location.indexOf('/media/') > -1) {\n processInstantForwardActions(\n window.location.pathname +\n (window.location.search ? window.location.search : '')\n );\n }\n })\n .each(function () {\n //Only check media status if button has display other than none\n if (\n ($(this).parents('.now-available-button-container').length ==\n 0 &&\n !$(this).closest('.action-buttons').length) ||\n ($(this).closest('.action-buttons').length &&\n getComputedStyle(\n $(this).closest('.action-buttons')[0],\n null\n ).display != 'none') ||\n $('.media-container.grid-view').length\n ) {\n if (\n $('body').attr('authenticated') == 'false' &&\n $('body').attr('no-linked-cards') == 'false'\n ) {\n var mediaId = $(this).attr('data-media-id');\n var forwardUrl = window.url(window.routes.mediaId, {\n id: mediaId,\n });\n var signInUrl = window.url(window.routes.accountSignIn, {\n forward: forwardUrl,\n });\n var signInLink =\n '' +\n window.html('signIn') +\n '';\n var content = window.html(\n 'lendingPeriodTextNoAuthWithLinkHtml',\n { link: signInLink }\n );\n $(\n 'ul#lending-period-options-' +\n $(this).attr('data-media-id')\n ).append(content);\n } else {\n //If no linked cards populate lending period dropdown\n var attr = $(this).attr('data-no-linked-cards');\n if (typeof attr !== 'undefined' && attr !== false) {\n var addCardLink =\n '' +\n window.html('addACard') +\n '';\n var content = window.html(\n 'lendingPeriodTextNoCardWithLinkHtml',\n { link: addCardLink }\n );\n $(\n 'ul#lending-period-options-' +\n $(this).attr('data-media-id')\n ).append(content);\n } else {\n window.ajax.getLendingPeriods(\n $(this).attr('data-media-id'),\n $(this)\n );\n }\n }\n }\n });\n\n window.globalEvents.on('lendingPeriods:fetch:fail', function () {\n $('.js-lending-period-list').html(\n '' + window.html('error.errorTryAgain') + ''\n );\n });\n\n /*\n * Change lending period options and control focus with keyboard\n */\n $('body').on('click keydown', '[data-lending-ul] li a', function (e) {\n if (e.type == 'click' || e.which == 13 || e.which == 32) {\n e.preventDefault();\n\n var dropdownButton = $(e.target)\n .closest('ul')\n .prev('[data-lending-period-dropdown]');\n var mediaId = dropdownButton.attr('data-media-id');\n\n var lendingDropdown = $(\n 'ul#lending-period-options-modal-' + mediaId\n ).length\n ? 'ul#lending-period-options-modal-' + mediaId\n : 'ul#lending-period-options-' + mediaId;\n $(lendingDropdown + ' li a').each(function () {\n $(this)\n .removeClass('checked is-checked')\n .attr({\n 'aria-selected': 'false',\n 'aria-label': $(this).attr('aria-label')\n ? $(this)\n .attr('aria-label')\n .replace(window.html('selected'), '')\n : '',\n });\n });\n\n $(\n lendingDropdown +\n ' li a[data-days=\"' +\n $(this).data('days') +\n '\"]'\n )\n .addClass('checked is-checked')\n .attr({\n 'aria-selected': 'true',\n 'aria-label': window.html('borrowButtonLabel', {\n days: $(this).data('days'),\n }),\n });\n\n dropdownButton\n .prev('[data-action=\"borrow\"]')\n .find('span.borrow-sub-text')\n .text($(this).data('text'));\n\n var lendingPeriodInput = $('#lending-period-modal-' + mediaId)\n .length\n ? $('#lending-period-modal-' + mediaId)\n : $('#lending-period-' + mediaId);\n\n lendingPeriodInput.val($(this).data('days'));\n\n if (!$(this).hasClass('default')) {\n dropdownButton\n .prev('[data-action=\"borrow\"]')\n .addClass('changed');\n } else {\n dropdownButton\n .prev('[data-action=\"borrow\"]')\n .removeClass('changed');\n }\n\n //$('.js-lending-period-option').attr('tabindex', -1);\n $('.js-lending-period-list').hide();\n $('.js-lending-period-dropdown-button').focus();\n } else if (e.which == 40) {\n //Down arrow pressed move focus forward\n e.preventDefault();\n $(this).closest('li').next('li').children('a').focus();\n } else if (e.which == 38) {\n //Up arrow pressed move focus back\n e.preventDefault();\n\n //If first item in list go back to dropdown button\n if ($(this).closest('li').is(':first-child')) {\n $(this).closest('ul').prev('button.dropdown').focus();\n } else {\n $(this).closest('li').prev('li').children('a').focus();\n }\n }\n });\n\n $('.lending-period-dropdown').on('keydown', function (e) {\n if (e.which == 40) {\n //Down arrow pressed move focus to first item\n e.preventDefault();\n var dropDown = $(this).data('dropdown');\n $('ul#' + dropDown)\n .children('li')\n .first()\n .children('a')\n .focus();\n }\n });\n\n //Control lending period dropdown tabindex\n $('[data-lending-ul], ul.signin-dropdown')\n .on('opened.fndtn.dropdown', function () {\n $(this).find('a').attr('tabindex', '0');\n })\n .on('closed.fndtn.dropdown', function () {\n var mediaId = $(this).attr('data-media-id');\n $(this).find('a').attr('tabindex', '-1');\n $('input#lending-period-' + mediaId).trigger('change');\n });\n\n //Focus on borrow button after selecting new lending period\n $('[data-lending-period-input]').on('change', function () {\n $(this).prev('[data-action=\"borrow\"]').focus();\n });\n});\n\n/**\n * Handle star ratings. Star ratings event listeners\n */\n$(function () {\n //Action on star click (Set rating)\n $('.star-ratings-container.editable.is-old').on(\n 'click',\n '.icon-star',\n function (e) {\n var $target = $(e.target);\n var $container = $target.closest('.star-ratings-container');\n var rating = $target.data('index');\n\n selectStarRating($container, rating, false);\n }\n );\n\n //Retrieve all star ratings\n $('body').on('mediaStatusSuccess', function (e, data) {\n for (var mediaId in data.starRatings) {\n var $container = $(\n '.star-ratings-container.is-old[data-media-id=\"' +\n mediaId +\n '\"]'\n );\n var rating = data.starRatings[mediaId];\n\n setUserStarRating($container, rating, {\n setRating: true,\n isHover: false,\n });\n }\n $(this).trigger('userStarRatingSet'); // Allow forwarded star action to be processed\n });\n\n //Control hover state\n $('.star-ratings-container.editable.is-old .icon-star').hover(function (e) {\n var $this = $(this);\n var $container = $this.closest('.star-ratings-container');\n var userRating = $container.data('user-rating');\n\n $container.addClass('user-rating');\n\n var hypotheticalRating = $this.data('index');\n fillStars($container, hypotheticalRating, {\n setRating: false,\n isHover: true,\n });\n });\n\n $('.star-ratings-container.editable.is-old').on('mouseleave', function () {\n var $this = $(this);\n var $container = $this.closest('.star-ratings-container');\n var userRating = $container.data('user-rating');\n var hasUserRating = userRating > 0;\n\n if (!hasUserRating) {\n $container.removeClass('user-rating');\n\n fillStars($container, $container.data('global-rating'), {\n setRating: false,\n isHover: true,\n });\n } else {\n fillStars($container, userRating, {\n setRating: false,\n isHover: true,\n });\n }\n });\n\n window.globalEvents.on('rating:set:fail', function () {\n var link =\n '' +\n window.html('pleaseContactSupport') +\n '';\n if (window.toaster)\n window.toaster.push(\n '' +\n window.html('genericError') +\n ' ' +\n window.text('error.errorContactSupport', { link: link }),\n 'error'\n );\n });\n\n window.globalEvents.on('rating:delete:fail', function () {\n var link =\n '' +\n window.html('pleaseContactSupport') +\n '';\n if (window.toaster)\n window.toaster.push(\n '' +\n window.html('genericError') +\n ' ' +\n window.text('error.errorContactSupport', { link: link }),\n 'error'\n );\n });\n});\n\n$(document).on('click', 'a[data-reveal-id]', function (e) {\n e.preventDefault();\n});\n\n$(document).ready(function () {\n $(document).on(\n 'click',\n '[data-action][data-no-linked-cards], .icon-star[data-no-linked-cards]',\n function () {\n var strippedQuerystring = window.location.search.replace(\n /([?&]no-linked-card=(?:true|false)&?)/i,\n function (match) {\n var lastChar = match[match.length - 1];\n if (lastChar === '&') {\n // there's more after us; when we're removed we need to use our beginning seperator to replace the ampersand\n return match[0];\n } else {\n // nothing after us; can just replace with nothing\n return '';\n }\n }\n );\n\n var forwardUrl =\n window.location.pathname +\n window.location.search.replace(\n /(&|\\?)no-linked-card(=true|\\=false)/,\n ''\n );\n var action = '';\n if ($(this).hasClass('icon-star')) {\n action =\n 'star~' +\n $(this).parent().attr('data-media-id') +\n '~' +\n $(this).data('index'); // Add star rating\n } else {\n action =\n $(this).attr('data-action') +\n '~' +\n $(this).attr('data-media-id');\n }\n var initiateCardLinkUrl = window.url(\n window.routes.accountStartCardLink,\n { forward: forwardUrl, action: action }\n );\n $('#add-card-button').attr('href', initiateCardLinkUrl);\n $('#link-card-modal').foundation('reveal', 'open');\n }\n );\n\n /* Reset star rating when user has no linked card and close link a car modal */\n $('.link-card-modal').on('close.fndtn.reveal', function () {\n var container = $('.star-ratings-container');\n container.data('user-rating', null).removeClass('user-rating');\n fillStars(container, Math.round(container.data('global-rating')));\n });\n});\n\n//Click on link when clicking wishlist icon\n$(document).on('click', '.wishlist-container i', function () {\n $(this).next('a').click();\n});\n\nwindow.setDynamicHoldsRatioModals = function (media) {\n media = media || {};\n $('a#holds-explanation').each(function () {\n if ($(this).attr('data-holdListPosition') != '') {\n $(this).attr(\n 'onclick',\n 'dynamicHoldsRatioModal(' +\n $(this).attr('data-holdsCount') +\n ', ' +\n $(this).attr('data-ownedCopies') +\n ', ' +\n $(this).attr('data-holdsRatio') +\n ', ' +\n $(this).attr('data-holdListPosition') +\n ');'\n );\n }\n\n if (\n $(this).attr('data-ownedCopies') == '' ||\n $(this).attr('data-ownedCopies') == 0\n ) {\n $('#help-hold-label').addClass('hideMe');\n $('#close-ratio-help').attr(\n 'aria-labelledby',\n 'hold-help-label-noCopies'\n );\n }\n });\n\n $('a#holds-explanation-details').attr(\n 'onclick',\n 'dynamicHoldsRatioModal(' +\n media.holdsCount +\n ', ' +\n media.ownedCopies +\n ', ' +\n media.holdsRatio +\n ', ' +\n media.holdListPosition +\n ');'\n );\n};\n","// Released under MIT license: http://www.opensource.org/licenses/mit-license.php\n\nif (bowser && bowser.msie) {\n (function ($) {\n 'use strict';\n $(function () {\n $('[placeholder]')\n .focus(function () {\n var input = $(this);\n if (input.val() === input.attr('placeholder')) {\n input.val('').removeClass('placeholder');\n }\n })\n .blur(function () {\n var input = $(this);\n if (\n input.val() === '' ||\n input.val() === input.attr('placeholder')\n ) {\n input\n .addClass('placeholder')\n .val(input.attr('placeholder'));\n }\n })\n .blur()\n .parents('form')\n .submit(function () {\n $(this)\n .find('[placeholder]')\n .each(function () {\n var input = $(this);\n if (input.val() === input.attr('placeholder')) {\n input.val('');\n }\n });\n });\n });\n })(jQuery);\n}\n","const { routes } = require('./index_');\n\nmodule.exports = {\n routes: Object.freeze(routes)\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.routes = void 0;\nexports.routes = {\n home: '/',\n browse: '/browse',\n search: '/search',\n searchByType: '/search/:type',\n advancedSearch: '/advanced-search',\n collectionById: '/collection/:collectionId',\n featuredCollection: '/collections/featured/:viewId',\n mediaId: '/media/:id',\n mediaInfoId: '/media/info/:id',\n mediaRelatedId: '/media/related/:id',\n mediaRelatedForHoldSuccess: '/media/relatedforholdsuccess/:mediaId',\n mediaInfo: '/media/info',\n mediaAvailabilityId: '/media/availability/:id',\n mediaDownload: '/media/download/:format/:mediaId',\n mediaBorrow: '/media/borrow/:mediaId',\n mediaBorrowStatus: '/media/loans/:mediaId/:libraryKey',\n mediaReturn: '/media/return/:mediaId',\n patronMediaStarRatings: '/patron/media/star-rating/:titleId',\n mediaHoldStatus: '/media/holds/status/:mediaId',\n getSingleHold: '/media/hold/:mediaId',\n mediaPlaceHold: '/media/hold',\n mediaEditHold: '/media/holds/edit/:mediaId',\n mediaSuspendHold: '/media/holds/suspend/:mediaId',\n mediaRemoveHoldSuspension: '/media/holds/suspend/remove/:mediaId',\n mediaRemoveHold: '/media/holds/remove/:mediaId',\n accountSettings: '/account/settings',\n accountWishlist: '/account/lists/wishlist',\n accountWishlistStatus: '/account/lists/wishlist/status/:mediaId/:libraryKey',\n accountWishlistRemove: '/account/lists/wishlist/remove/:mediaId',\n accountWishlistAdd: '/account/lists/wishlist/add/:mediaId',\n supportMembers: '/support/members',\n supportCard: '/support/card',\n accountHolds: '/account/holds',\n accountInvalidCard: '/account/card/invalid',\n accountLoans: '/account/loans',\n accountLinkCard: '/account/linkcard',\n accountGetACard: '/account/sign-in?intent=gac',\n accountRatings: '/account/ratings',\n accountStartCardLink: '/account/initiate-card-link',\n accountSignIn: '/account/sign-in',\n accountSignInComplete: '/account/sign-in/complete',\n accountSignout: '/account/sign-out',\n appAuthenticate: '/account/app-authenticate',\n ozone: {\n signIn: '/account/ozone/sign-in',\n authenticate: '/account/signInOzone',\n accountSignoutComplete: '/account/sign-out/complete',\n external: '/account/ozone/external',\n },\n accountVerifyLinkedCards: '/account/verify-linked-card',\n accountLinkLibraryCardComplete: '/account/link-library-card/complete',\n patronEmail: '/patron/email',\n patronLendingPeriod: '/patron/media/lendingPeriods/:mediaId',\n goBack: '/goback',\n dlrRoom: '/dlr-room',\n dlrAuthenticate: '/BANGAuthenticate.dll',\n dlrMediaId: '/ContentDetails.htm',\n seriesbyTitle: '/series-by-title/:mediaId',\n updateHoldSettings: '/media/holds/settings',\n getBranches: '/branches',\n preferences: '/preferences',\n lendingSettings: '/lending-settings',\n reviews: '/media/reviews/:mediaId',\n relatedCarousel: '/media/relatedTitlesCarousel/:id',\n accountHistory: '/account/history',\n rest: {\n account: {\n get: '/rest/account/',\n limits: '/rest/account/limits',\n authLocal: '/rest/account/authenticate/local',\n },\n collections: {\n getById: '/rest/collections/:id',\n },\n media: {\n index: '/rest/media',\n related: '/rest/media/:id/relatedTitles',\n relatedTitlesPage: '/rest/media/:id/relatedTitlesPage',\n availableRelated: '/rest/media/:id/availableRelatedTitles',\n recentIssues: '/rest/media/recentIssues/:id',\n },\n subjects: {\n getGroupedByParent: '/rest/subjects/byparent',\n getCountByMediaType: '/rest/subjects/countby/mediatype',\n },\n search: {\n collectionMetadata: '/rest/search/collectionMetadata',\n },\n readingHistory: {\n index: '/rest/readingHistory',\n title: '/rest/readingHistory/title/:id',\n settings: '/rest/readingHistory/settings',\n export: '/rest/readingHistory/export',\n },\n rooms: {\n get: '/rest/rooms/:roomId',\n },\n campaigns: {\n get: '/rest/campaigns/:campaignId',\n getFirstDisplayable: '/rest/campaign/firstDisplayable/:roomId',\n },\n preferences: {\n global: {\n index: '/rest/preferences/global/',\n },\n },\n idc: {\n phone: {\n sendCode: '/rest/idc/phone/send-code',\n signUp: '/rest/idc/phone/sign-up',\n verifyCode: '/rest/idc/phone/verify-code',\n },\n geo: {\n authorize: '/rest/idc/geo/authorize',\n },\n email: {\n sendCode: '/rest/idc/email/send-code',\n verifyCode: '/rest/idc/email/verify-code',\n },\n signUp: '/rest/idc/sign-up',\n },\n patronNotifications: {\n get: '/rest/notifications/',\n dismiss: '/rest/notifications/:id',\n dismissByAction: '/rest/notifications/circ-action',\n },\n },\n assets: {\n css: {\n versionedColors: '/assets/v2/css/:version/colors.css',\n },\n },\n fulfillmentError: '/fulfillmentError',\n libbyIntercept: '/libbyPromo',\n mergedSite: '/merged',\n odAppSunset: '/odAppSunset',\n terminatedSite: '/terminated',\n tlsSite: '/tls',\n publicApiFulfillment: {\n index: '/fulfillment/:reserveId',\n sms: '/fulfillment-sms/:key',\n getDownloadLink: '/download/:format/:mediaId',\n getDownloadRedirect: '/fulfillment/download-redirect/:format/:mediaId',\n getMedia: '/fulfillment/media/:format/:mediaId',\n },\n api: {\n library: '/api/library',\n reporting: {\n ajaxError: '/api/reporting/ajaxError',\n },\n patron: {\n checkouts: '/api/libraries/:libraryKey/patrons/me/cards/:cardId/checkouts',\n checkout: '/api/libraries/:libraryKey/patrons/me/cards/:cardId/checkouts/:reserveId',\n },\n },\n kanopy: {\n noSubscription: '/kanopy/no-subscription',\n promo: '/getkanopy',\n },\n ntc: {\n detail: '/extras/:slug',\n faq: '/extras/faq',\n index: '/extras',\n api: {\n provider: '/api/extras/providers/:slug',\n providers: '/api/extras/providers',\n auth: '/api/extras/auth',\n autoRedirect: '/api/extras/auth/redirect',\n autoPostForms: '/api/extras/auth/autoPost',\n },\n signIn: '/extras/sign-in',\n },\n};\n\n//# sourceMappingURL=index_.js.map\n\n//# sourceMappingURL=index_.js.map\n"],"preExistingComment":"//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy55YXJuL2NhY2hlL2Jyb3dzZXItcGFjay1ucG0tNi4xLjAtNjc1NTdlMDExYi05ZTU5OTNkM2VlLnppcC9ub2RlX21vZHVsZXMvYnJvd3Nlci1wYWNrL19wcmVsdWRlLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvYXNzZXJ0LW5wbS0xLjUuMC0zMzAzYjk3ZTA0LTliZTQ4NDM1ZjcuemlwL25vZGVfbW9kdWxlcy9hc3NlcnQvYXNzZXJ0LmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvYmFiZWwtcG9seWZpbGwtbnBtLTYuMjYuMC00ZmQ4ODcxN2M5LTZmYjFhM2MwYmYuemlwL25vZGVfbW9kdWxlcy9iYWJlbC1wb2x5ZmlsbC9saWIvaW5kZXguanMiLCIuLi8uLi8ueWFybi9jYWNoZS9lczUtc2hpbS1ucG0tNC42LjctY2ZiYzgyMDU0My1mMmY2MGNmM2Q5LnppcC9ub2RlX21vZHVsZXMvZXM1LXNoaW0vZXM1LXNoaW0uanMiLCIuLi8uLi8ueWFybi9jYWNoZS9lc2NhcGUtaHRtbC1ucG0tMS4wLjMtMzc2YzIyZWU3NC02MjEzY2E5YWUwLnppcC9ub2RlX21vZHVsZXMvZXNjYXBlLWh0bWwvaW5kZXguanMiLCIuLi8uLi8ueWFybi9jYWNoZS9oZS1ucG0tMS4yLjAtM2I3M2EyZmYwNy0zZDRkNmJhYmNjLnppcC9ub2RlX21vZHVsZXMvaGUvaGUuanMiLCIuLi8uLi8ueWFybi9jYWNoZS9pbmhlcml0cy1ucG0tMi4wLjEtMDAxMTU1NGMwMy02NTM2YjkzNzcyLnppcC9ub2RlX21vZHVsZXMvaW5oZXJpdHMvaW5oZXJpdHNfYnJvd3Nlci5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL2xvY2FsZS1ucG0tMC4xLjAtNmM3ZmRjNTg5MS00MmFmNDQzMmJjLnppcC9ub2RlX21vZHVsZXMvbG9jYWxlL2xpYi9pbmRleC5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL21ha2UtcGx1cmFsLW5wbS00LjMuMC1hMDEyYjY4YTlmLTE3MDI1NTZlOTguemlwL25vZGVfbW9kdWxlcy9tYWtlLXBsdXJhbC91bWQvcGx1cmFsQ2F0ZWdvcmllcy5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL21ha2UtcGx1cmFsLW5wbS00LjMuMC1hMDEyYjY4YTlmLTE3MDI1NTZlOTguemlwL25vZGVfbW9kdWxlcy9tYWtlLXBsdXJhbC91bWQvcGx1cmFscy5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL21lc3NhZ2Vmb3JtYXQtbnBtLTEuMS4xLTM1NjBlOWIyZmYtMGE3ZGQyMDY1Ni56aXAvbm9kZV9tb2R1bGVzL21lc3NhZ2Vmb3JtYXQvbGliL2NvbXBpbGVyLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbWVzc2FnZWZvcm1hdC1ucG0tMS4xLjEtMzU2MGU5YjJmZi0wYTdkZDIwNjU2LnppcC9ub2RlX21vZHVsZXMvbWVzc2FnZWZvcm1hdC9saWIvaW5kZXguanMiLCIuLi8uLi8ueWFybi9jYWNoZS9tZXNzYWdlZm9ybWF0LW5wbS0xLjEuMS0zNTYwZTliMmZmLTBhN2RkMjA2NTYuemlwL25vZGVfbW9kdWxlcy9tZXNzYWdlZm9ybWF0L2xpYi9ydW50aW1lLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvbWVzc2FnZWZvcm1hdC1wYXJzZXItbnBtLTEuMS4wLTQ2OTdmMDE5NzUtM2FmMDhlNjQyMS56aXAvbm9kZV9tb2R1bGVzL21lc3NhZ2Vmb3JtYXQtcGFyc2VyL3BhcnNlci5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL29iamVjdC1hc3NpZ24tbnBtLTQuMS4xLTEwMDRhZDZkZWMtZmNjNmU0ZWE4Yy56aXAvbm9kZV9tb2R1bGVzL29iamVjdC1hc3NpZ24vaW5kZXguanMiLCIuLi8uLi8ueWFybi9jYWNoZS9wYXRoLWJyb3dzZXJpZnktbnBtLTEuMC4xLWY5NzVkOTlhOTktYzZkN2ZhMzc2NC56aXAvbm9kZV9tb2R1bGVzL3BhdGgtYnJvd3NlcmlmeS9pbmRleC5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL3Byb2Nlc3MtbnBtLTAuMTEuMTAtYWViM2I2NDFhZS1iZmNjZTQ5ODE0LnppcC9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvcXVlcnlzdHJpbmctZXMzLW5wbS0wLjIuMS1mNDYzMmYyNzYwLTY5MWU4ZDZiOGIuemlwL25vZGVfbW9kdWxlcy9xdWVyeXN0cmluZy1lczMvZGVjb2RlLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvcXVlcnlzdHJpbmctZXMzLW5wbS0wLjIuMS1mNDYzMmYyNzYwLTY5MWU4ZDZiOGIuemlwL25vZGVfbW9kdWxlcy9xdWVyeXN0cmluZy1lczMvZW5jb2RlLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvcXVlcnlzdHJpbmctZXMzLW5wbS0wLjIuMS1mNDYzMmYyNzYwLTY5MWU4ZDZiOGIuemlwL25vZGVfbW9kdWxlcy9xdWVyeXN0cmluZy1lczMvaW5kZXguanMiLCIuLi8uLi8ueWFybi9jYWNoZS9yZWdlbmVyYXRvci1ydW50aW1lLW5wbS0wLjEwLjUtODNmNjI3YWYwYy0zNWIzM2RiZTUzLnppcC9ub2RlX21vZHVsZXMvcmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lLmpzIiwiLi4vLi4vLnlhcm4vY2FjaGUvcmVzZXJ2ZWQtd29yZHMtbnBtLTAuMS4yLWVlZDRiMTZjYTktNzJlODBmNzFkYy56aXAvbm9kZV9tb2R1bGVzL3Jlc2VydmVkLXdvcmRzL2xpYi9pbmRleC5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL3Jlc2VydmVkLXdvcmRzLW5wbS0wLjEuMi1lZWQ0YjE2Y2E5LTcyZTgwZjcxZGMuemlwL25vZGVfbW9kdWxlcy9yZXNlcnZlZC13b3Jkcy9saWIvcmVzZXJ2ZWQtd29yZHMuanMiLCIuLi8uLi8ueWFybi9jYWNoZS9zZW12ZXItbnBtLTYuMy4wLWIzZWFjZThiZmQtMWIyNmVjZjZkYi56aXAvbm9kZV9tb2R1bGVzL3NlbXZlci9zZW12ZXIuanMiLCIuLi8uLi8ueWFybi9jYWNoZS91bmRlcnNjb3JlLW5wbS0xLjEzLjYtM2ViZTlkOTJmYi1kNWNlZGQxNGE5LnppcC9ub2RlX21vZHVsZXMvdW5kZXJzY29yZS91bmRlcnNjb3JlLXVtZC5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL3VybC1qb2luLW5wbS0zLjAuMC01MWJmZDk2M2M5LTNiYmFiZWIzYmUuemlwL25vZGVfbW9kdWxlcy91cmwtam9pbi9saWIvdXJsLWpvaW4uanMiLCIuLi8uLi8ueWFybi9jYWNoZS91dGlsLW5wbS0wLjEwLjMtZjQzZGU1Y2NiYi1iZDgwMGY1ZDIzLnppcC9ub2RlX21vZHVsZXMvdXRpbC9zdXBwb3J0L2lzQnVmZmVyQnJvd3Nlci5qcyIsIi4uLy4uLy55YXJuL2NhY2hlL3V0aWwtbnBtLTAuMTAuMy1mNDNkZTVjY2JiLWJkODAwZjVkMjMuemlwL25vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvZm4vcmVnZXhwL2VzY2FwZS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hLWZ1bmN0aW9uLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2EtbnVtYmVyLXZhbHVlLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FkZC10by11bnNjb3BhYmxlcy5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hZHZhbmNlLXN0cmluZy1pbmRleC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hbi1pbnN0YW5jZS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hbi1vYmplY3QuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktY29weS13aXRoaW4uanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktZmlsbC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hcnJheS1mcm9tLWl0ZXJhYmxlLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FycmF5LWluY2x1ZGVzLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FycmF5LW1ldGhvZHMuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktcmVkdWNlLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FycmF5LXNwZWNpZXMtY29uc3RydWN0b3IuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktc3BlY2llcy1jcmVhdGUuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYmluZC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jbGFzc29mLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NvZi5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb2xsZWN0aW9uLXN0cm9uZy5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jb2xsZWN0aW9uLXRvLWpzb24uanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29sbGVjdGlvbi13ZWFrLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NvbGxlY3Rpb24uanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29yZS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jcmVhdGUtcHJvcGVydHkuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY3R4LmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RhdGUtdG8taXNvLXN0cmluZy5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kYXRlLXRvLXByaW1pdGl2ZS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZWZpbmVkLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2Rlc2NyaXB0b3JzLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZW51bS1idWcta2V5cy5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19lbnVtLWtleXMuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZXhwb3J0LmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ZhaWxzLWlzLXJlZ2V4cC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mYWlscy5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19maXgtcmUtd2tzLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ZsYWdzLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ZsYXR0ZW4taW50by1hcnJheS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mb3Itb2YuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZnVuY3Rpb24tdG8tc3RyaW5nLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2dsb2JhbC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oYXMuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faGlkZS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19odG1sLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2llOC1kb20tZGVmaW5lLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2luaGVyaXQtaWYtcmVxdWlyZWQuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faW52b2tlLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lvYmplY3QuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXMtYXJyYXktaXRlci5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1hcnJheS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1pbnRlZ2VyLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLW9iamVjdC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1yZWdleHAuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1jYWxsLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItY3JlYXRlLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItZGVmaW5lLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItZGV0ZWN0LmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItc3RlcC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyYXRvcnMuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbGlicmFyeS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19tYXRoLWV4cG0xLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX21hdGgtZnJvdW5kLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX21hdGgtbG9nMXAuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbWF0aC1zY2FsZS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19tYXRoLXNpZ24uanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbWV0YS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19tZXRhZGF0YS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19taWNyb3Rhc2suanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbmV3LXByb21pc2UtY2FwYWJpbGl0eS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtYXNzaWduLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1jcmVhdGUuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWRwLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcHMuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWZvcmNlZC1wYW0uanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcGQuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdvcG4tZXh0LmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1nb3BuLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1nb3BzLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1ncG8uanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LXBpZS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qtc2FwLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC10by1hcnJheS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vd24ta2V5cy5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19wYXJzZS1mbG9hdC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19wYXJzZS1pbnQuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcGVyZm9ybS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19wcm9taXNlLXJlc29sdmUuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcHJvcGVydHktZGVzYy5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS1hbGwuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcmVkZWZpbmUuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcmVnZXhwLWV4ZWMtYWJzdHJhY3QuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcmVnZXhwLWV4ZWMuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcmVwbGFjZXIuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2FtZS12YWx1ZS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zZXQtY29sbGVjdGlvbi1mcm9tLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC1jb2xsZWN0aW9uLW9mLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC1wcm90by5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zZXQtc3BlY2llcy5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zZXQtdG8tc3RyaW5nLXRhZy5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zaGFyZWQta2V5LmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NoYXJlZC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zcGVjaWVzLWNvbnN0cnVjdG9yLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3N0cmljdC1tZXRob2QuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLWF0LmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1jb250ZXh0LmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1odG1sLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1wYWQuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3RyaW5nLXJlcGVhdC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctdHJpbS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctd3MuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdGFzay5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1hYnNvbHV0ZS1pbmRleC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pbmRleC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pbnRlZ2VyLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWlvYmplY3QuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLW9iamVjdC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1wcmltaXRpdmUuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdHlwZWQtYXJyYXkuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdHlwZWQtYnVmZmVyLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3R5cGVkLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3VpZC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL191c2VyLWFnZW50LmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3ZhbGlkYXRlLWNvbGxlY3Rpb24uanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fd2tzLWRlZmluZS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL193a3MtZXh0LmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3drcy5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2NvcmUucmVnZXhwLmVzY2FwZS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5jb3B5LXdpdGhpbi5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5ldmVyeS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maWxsLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZpbHRlci5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5maW5kLWluZGV4LmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LmZpbmQuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZm9yLWVhY2guanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuZnJvbS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pbmRleC1vZi5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pcy1hcnJheS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5qb2luLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lmxhc3QtaW5kZXgtb2YuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkubWFwLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5Lm9mLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnJlZHVjZS1yaWdodC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5yZWR1Y2UuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc2xpY2UuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuc29tZS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5zb3J0LmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmFycmF5LnNwZWNpZXMuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS5ub3cuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuZGF0ZS50by1pc28tc3RyaW5nLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmRhdGUudG8tanNvbi5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5kYXRlLnRvLXByaW1pdGl2ZS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5kYXRlLnRvLXN0cmluZy5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5mdW5jdGlvbi5iaW5kLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LmZ1bmN0aW9uLmhhcy1pbnN0YW5jZS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5mdW5jdGlvbi5uYW1lLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hcC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmFjb3NoLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguYXNpbmguanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5hdGFuaC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmNicnQuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5jbHozMi5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmNvc2guanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5leHBtMS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmZyb3VuZC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmh5cG90LmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguaW11bC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLmxvZzEwLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgubG9nMXAuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC5sb2cyLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGguc2lnbi5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5tYXRoLnNpbmguanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubWF0aC50YW5oLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm1hdGgudHJ1bmMuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmNvbnN0cnVjdG9yLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5lcHNpbG9uLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5pcy1maW5pdGUuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLWludGVnZXIuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYubnVtYmVyLmlzLW5hbi5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIuaXMtc2FmZS1pbnRlZ2VyLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5tYXgtc2FmZS1pbnRlZ2VyLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5taW4tc2FmZS1pbnRlZ2VyLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci5wYXJzZS1mbG9hdC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIucGFyc2UtaW50LmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm51bWJlci50by1maXhlZC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5udW1iZXIudG8tcHJlY2lzaW9uLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5hc3NpZ24uanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmNyZWF0ZS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZGVmaW5lLXByb3BlcnRpZXMuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0eS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuZnJlZXplLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3IuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktbmFtZXMuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLWV4dGVuc2libGUuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYub2JqZWN0LmlzLWZyb3plbi5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QuaXMtc2VhbGVkLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5pcy5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3Qua2V5cy5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QucHJldmVudC1leHRlbnNpb25zLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5zZWFsLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC5zZXQtcHJvdG90eXBlLW9mLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucGFyc2UtZmxvYXQuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucGFyc2UtaW50LmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnByb21pc2UuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5hcHBseS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmNvbnN0cnVjdC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmRlZmluZS1wcm9wZXJ0eS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmRlbGV0ZS1wcm9wZXJ0eS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmVudW1lcmF0ZS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvci5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1wcm90b3R5cGUtb2YuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5nZXQuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5oYXMuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5pcy1leHRlbnNpYmxlLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3Qub3duLWtleXMuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5wcmV2ZW50LWV4dGVuc2lvbnMuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVmbGVjdC5zZXQtcHJvdG90eXBlLW9mLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZmxlY3Quc2V0LmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5jb25zdHJ1Y3Rvci5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuZXhlYy5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5yZWdleHAuZmxhZ3MuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLm1hdGNoLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5yZXBsYWNlLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC5zZWFyY2guanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucmVnZXhwLnNwbGl0LmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnJlZ2V4cC50by1zdHJpbmcuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc2V0LmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5hbmNob3IuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmJpZy5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuYmxpbmsuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmJvbGQuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmNvZGUtcG9pbnQtYXQuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmVuZHMtd2l0aC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZml4ZWQuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZvbnRjb2xvci5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuZm9udHNpemUuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLmZyb20tY29kZS1wb2ludC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuaW5jbHVkZXMuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLml0YWxpY3MuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5saW5rLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5yYXcuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnJlcGVhdC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc21hbGwuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN0YXJ0cy13aXRoLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5zdHJpa2UuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLnN1Yi5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5zdHJpbmcuc3VwLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy50cmltLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN5bWJvbC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5hcnJheS1idWZmZXIuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuZGF0YS12aWV3LmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLmZsb2F0MzItYXJyYXkuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQuZmxvYXQ2NC1hcnJheS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5pbnQxNi1hcnJheS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5pbnQzMi1hcnJheS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC5pbnQ4LWFycmF5LmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQxNi1hcnJheS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi50eXBlZC51aW50MzItYXJyYXkuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQudWludDgtYXJyYXkuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYudHlwZWQudWludDgtY2xhbXBlZC1hcnJheS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi53ZWFrLW1hcC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi53ZWFrLXNldC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5hcnJheS5mbGF0LW1hcC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5hcnJheS5mbGF0dGVuLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LmFycmF5LmluY2x1ZGVzLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LmFzYXAuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuZXJyb3IuaXMtZXJyb3IuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuZ2xvYmFsLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hcC5mcm9tLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hcC5vZi5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXAudG8tanNvbi5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmNsYW1wLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGguZGVnLXBlci1yYWQuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5kZWdyZWVzLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGguZnNjYWxlLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGguaWFkZGguanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5pbXVsaC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5tYXRoLmlzdWJoLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGgucmFkLXBlci1kZWcuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5yYWRpYW5zLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGguc2NhbGUuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcubWF0aC5zaWduYml0LmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3Lm1hdGgudW11bGguanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmRlZmluZS1nZXR0ZXIuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmRlZmluZS1zZXR0ZXIuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmVudHJpZXMuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcnMuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0Lmxvb2t1cC1nZXR0ZXIuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0Lmxvb2t1cC1zZXR0ZXIuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcub2JqZWN0LnZhbHVlcy5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5vYnNlcnZhYmxlLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnByb21pc2UuZmluYWxseS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5wcm9taXNlLnRyeS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmRlZmluZS1tZXRhZGF0YS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmRlbGV0ZS1tZXRhZGF0YS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1tZXRhZGF0YS1rZXlzLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW1ldGFkYXRhLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YS1rZXlzLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnJlZmxlY3QuZ2V0LW93bi1tZXRhZGF0YS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0Lmhhcy1tZXRhZGF0YS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5yZWZsZWN0Lmhhcy1vd24tbWV0YWRhdGEuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcucmVmbGVjdC5tZXRhZGF0YS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5zZXQuZnJvbS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5zZXQub2YuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc2V0LnRvLWpzb24uanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLmF0LmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy5tYXRjaC1hbGwuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1lbmQuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1zdGFydC5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5zdHJpbmcudHJpbS1sZWZ0LmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnN0cmluZy50cmltLXJpZ2h0LmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LnN5bWJvbC5hc3luYy1pdGVyYXRvci5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5zeW1ib2wub2JzZXJ2YWJsZS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy5zeXN0ZW0uZ2xvYmFsLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM3LndlYWstbWFwLmZyb20uanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcud2Vhay1tYXAub2YuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczcud2Vhay1zZXQuZnJvbS5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNy53ZWFrLXNldC5vZi5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL3dlYi5kb20uaXRlcmFibGUuanMiLCIuLi8uLi8ueWFybi91bnBsdWdnZWQvY29yZS1qcy1ucG0tMi42LjEyLTBiOTNkNzdkMzEvbm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuaW1tZWRpYXRlLmpzIiwiLi4vLi4vLnlhcm4vdW5wbHVnZ2VkL2NvcmUtanMtbnBtLTIuNi4xMi0wYjkzZDc3ZDMxL25vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLnRpbWVycy5qcyIsIi4uLy4uLy55YXJuL3VucGx1Z2dlZC9jb3JlLWpzLW5wbS0yLjYuMTItMGI5M2Q3N2QzMS9ub2RlX21vZHVsZXMvY29yZS1qcy9zaGltLmpzIiwiLi4vY29tbW9uL2xpYi9jb25maWd1cmF0aW9uL2R5c2xleGljQmxhY2tsaXN0Lmpzb24iLCIuLi9jb21tb24vbGliL2NvbmZpZ3VyYXRpb24vZmVhdHVyZXMuanNvbiIsIi4uL2NvbW1vbi9saWIvY29uZmlndXJhdGlvbi9tZUNvdW50cnlDb2Rlcy5qc29uIiwiLi4vY29tbW9uL2xpYi9jb25maWd1cmF0aW9uL3JldmVyc2VQcmV2aWV3U2l0ZXMuanNvbiIsIi4uL2NvbW1vbi9saWIvY29uZmlndXJhdGlvbi9zdXBwb3J0ZWRMYW5ndWFnZXMuanNvbiIsImJ1c2luZXNzLW9iamVjdHMvYWNjb3VudC1saW1pdHMuanMiLCJidXNpbmVzcy1vYmplY3RzL2xvYW4tdGl0bGUuanMiLCJsaWIvYXBwUHJvbW9NYW5hZ2VyLmpzIiwibGliL2Nvb2tpZUNvbmZpZy5qcyIsImxpYi9mZWF0dXJlTWFuYWdlci10cy5qcyIsImxpYi9mZWF0dXJlTWFuYWdlci5qcyIsImxpYi9mZWF0dXJlTWFuYWdlckJ1aWxkZXIuanMiLCJsaWIvZnVsZmlsbG1lbnQtdHMuanMiLCJsaWIvZ2V0T3B0aW1pemVkQ292ZXItdHMuanMiLCJsaWIvaTE4bi9icm93c2VyL2luZGV4LmpzIiwibGliL2kxOG4vbWVzc2FnZWZvcm1hdC5qcyIsImxpYi9pMThuL3RyYW5zbGF0ZXIuanMiLCJsaWIvaTE4bi91dGlsaXR5LmpzIiwibGliL2ludGVybmFsL3JvdXRpbmcuanMiLCJsaWIvbnVtYmVycy5qcyIsImxpYi9zaW1wbGVIYXNoLmpzIiwibGliL3N1cHBvcnRVcmwuanMiLCJsaWIvdXRpbGl0eS9iaXRGbGFnLmpzIiwibGliL3V0aWxpdHkvY2xvbmUtdHMuanMiLCJsaWIvdXRpbGl0eS9tYWNtaWxsYW5NZXNzYWdlLmpzIiwibW9kZWxzL0hpZ2hsaWdodGVkRmVhdHVyZVN0YXRlLmpzIiwibW9kZWxzL09kVHJhY2suanMiLCJtb2RlbHMvZGFvL01lZGlhUGFyYW1ldGVycy5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbGxlY3Rpb25zL2Jhc2UuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL0hvbGRDYW5jZWxNb2RhbC9Ib2xkQ2FuY2VsTW9kYWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL01hY09TQXVkaW9ib29rU3VwcG9ydFBvcG92ZXIvTWFjT1NBdWRpb2Jvb2tTdXBwb3J0UG9wb3Zlci5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvUmVtb3ZlU3VzcGVuZGVkSG9sZE1vZGFsL1JlbW92ZVN1c3BlbmRIb2xkTW9kYWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL1JlbW92ZVN1c3BlbmRlZEhvbGRNb2RhbC9SZW1vdmVTdXNwZW5kSG9sZE1vZGFsVGVtcGxhdGUuaHRtbC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvU3VzcGVuZEhvbGRNb2RhbC9TdXNwZW5kSG9sZE1vZGFsLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9TdXNwZW5kSG9sZE1vZGFsL1N1c3BlbmRIb2xkTW9kYWxUZW1wbGF0ZS5odG1sLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9TdXNwZW5kSG9sZFN1Y2Nlc3NNb2RhbC9TdXNwZW5kSG9sZFN1Y2Nlc3NNb2RhbC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvU3VzcGVuZEhvbGRTdWNjZXNzTW9kYWwvU3VzcGVuZEhvbGRTdWNjZXNzTW9kYWxUZW1wbGF0ZS5odG1sLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9UaXRsZUZ1bGZpbGxtZW50TW9kYWwvVGl0bGVGdWxmaWxsbWVudE1vZGFsLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9hY2NvdW50X2hpc3Rvcnkvdmlld3MvSW1wb3J0RnJvbVJhdGVkQ29tcGxldGVNb2RhbC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvYXBwLWJhZGdlL2FwcC1iYWRnZS5odG1sLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9hdXRvX3Njcm9sbC9hdXRvU2Nyb2xsLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9iYWNrX2J1dHRvbl9yZWRpcmVjdC9CYWNrQnV0dG9uUmVkaXJlY3QuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL2NvbW1vbi9DaGVja2JveC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvY29tbW9uL0hhc2hNYW5hZ2VyLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9jb21tb24vUmFkaW9CdXR0b24uanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL2NvbW1vbi9jb25maXJtRGlhbG9nLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9jb21tb24vbW9kYWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL2NvbW1vbi90ZW1wbGF0ZXMvbW9kYWwuaHRtbC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvY29va2llX3NldHRpbmdzX21vZGFsL2Nvb2tpZVNldHRpbmdzTW9kYWwuaHRtbC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvY29va2llX3NldHRpbmdzX21vZGFsL2Nvb2tpZVNldHRpbmdzTW9kYWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL2hpc3RvcnlfZXZlbnRfdHJhY2tlci9IaXN0b3J5RXZlbnRMaXN0ZW5lci5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvaGlzdG9yeV9ldmVudF90cmFja2VyL0hpc3RvcnlFdmVudFRyYWNrZXIuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL2hvbGRJbmZvcm1hdGlvbi9tYWluLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9ob2xkSW5mb3JtYXRpb24vdGVtcGxhdGVzL0hvbGRJbmZvcm1hdGlvbi5odG1sLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9ob2xkSW5mb3JtYXRpb24vdmlld3MvSG9sZEluZm9ybWF0aW9uLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9ob2xkSW5mb3JtYXRpb24vdmlld3MvSG9sZEluZm9ybWF0aW9uTW9kYWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL2hvbGRJbmZvcm1hdGlvblYyL0hvbGRJbmZvcm1hdGlvbk1vZGFsVjIuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL2hvbGRJbmZvcm1hdGlvblYyL0hvbGRJbmZvcm1hdGlvblYyLmh0bWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL2hvbGRJbmZvcm1hdGlvblYyL0hvbGRJbmZvcm1hdGlvblYyLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9rYW5vcHktbWVudS1hZC9rYW5vcHktbWVudS1hZC12aWV3Lmh0bWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL2thbm9weS1tZW51LWFkL2thbm9weS1tZW51LWFkLXZpZXcuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL2tpbmRsZV9wcmVmZXJlbmNlX21vZGFsL0tpbmRsZVByZWZlcmVuY2UuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL2tpbmRsZV9wcmVmZXJlbmNlX21vZGFsL3RlbXBsYXRlcy9LaW5kbGVQcmVmZXJlbmNlTW9kYWwuaHRtbC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMva2luZGxlX3ByZWZlcmVuY2VfbW9kYWwvdGVtcGxhdGVzL0tpbmRsZVByZWZlcmVuY2VSZXN1bHRNb2RhbC5odG1sLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9raW5kbGVfcHJlZmVyZW5jZV9tb2RhbC92aWV3cy9LaW5kbGVQcmVmZXJlbmNlTW9kYWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL2tpbmRsZV9wcmVmZXJlbmNlX21vZGFsL3ZpZXdzL0tpbmRsZVByZWZlcmVuY2VSZXN1bHRNb2RhbC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvbGFuZ3VhZ2Vfc2VsZWN0aW9uL21haW4uanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL2xhbmd1YWdlX3NlbGVjdGlvbi92aWV3cy9sYW5ndWFnZV9zZWxlY3Rpb24uanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL2xlbmRpbmdfcGVyaW9kX21vZGFsL0xlbmRpbmdQZXJpb2RDb2xsZWN0aW9uLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9sZW5kaW5nX3BlcmlvZF9tb2RhbC9MZW5kaW5nUGVyaW9kTW9kYWwuaHRtbC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvbGVuZGluZ19wZXJpb2RfbW9kYWwvTGVuZGluZ1BlcmlvZE1vZGFsLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9sZW5kaW5nX3BlcmlvZF9tb2RhbC9QYXRyb25UaXRsZUxlbmRpbmdQZXJpb2RzLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9saWJieS1hcHAtZ3JvdXAvYXBwLXN0b3JlLWF3YXJkcy5odG1sLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9saWJieS1hcHAtZ3JvdXAvbGliYnktYXBwLWdyb3VwLmh0bWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL21lZGlhL0NvbnRleHRNZW51LmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9tZWRpYS9Db3Zlci5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvbWVkaWEvTWVkaWFJbnRlcmZhY2UuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL21lZGlhL1RpdGxlQWN0aW9uQnV0dG9uLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9tZWRpYS9UaXRsZUNhcmQuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL21lZGlhL1RpdGxlQ29sbGVjdGlvblZpZXcuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL21lZGlhL1RpdGxlSGVhZGVyQmFyLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9tZWRpYS9XaXNoTGlzdEJ1dHRvbi5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvbWVkaWEvbW9kZWxzL0xlbmRpbmdQZXJpb2QuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL21lZGlhL21vZGVscy9UaXRsZS5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvbWVkaWEvbW9kZWxzL1RpdGxlQ29sbGVjdGlvbi5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvbWVkaWEvdGVtcGxhdGVzL0NvbnRleHRNZW51Lmh0bWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL21lZGlhL3RlbXBsYXRlcy9Db3Zlci5odG1sLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9tZWRpYS90ZW1wbGF0ZXMvRG93bmxvYWRXYXJuaW5nTW9kYWwuaHRtbC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvbWVkaWEvdGVtcGxhdGVzL0hvbGRDb25mbGljdFBhbmVsLmh0bWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL21lZGlhL3RlbXBsYXRlcy9Ib2xkU3VjY2Vzc1JlbGF0ZWRUaXRsZXMuaHRtbC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvbWVkaWEvdGVtcGxhdGVzL0hvbGRTdWNjZXNzVGVtcGxhdGUuaHRtbC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvbWVkaWEvdGVtcGxhdGVzL05vQ292ZXIuaHRtbC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvbWVkaWEvdGVtcGxhdGVzL1BsYWNlSG9sZFBhbmVsLmh0bWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL21lZGlhL3RlbXBsYXRlcy9SZW1vdmVIaXN0b3J5Lmh0bWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL21lZGlhL3RlbXBsYXRlcy9UaXRsZUNhcmQuaHRtbC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvbWVkaWEvdGVtcGxhdGVzL1RpdGxlRm9ybWF0QmFkZ2UuaHRtbC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvbWVkaWEvdGVtcGxhdGVzL1RpdGxlTmFtZS5odG1sLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9tZWRpYS90ZW1wbGF0ZXMvV2lzaExpc3RCdXR0b24uaHRtbC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvbWVkaWEvdmlld3MvRG93bmxvYWRXYXJuaW5nTW9kYWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL21lZGlhL3ZpZXdzL0hvbGRDb25mbGljdE1vZGFsLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9tZWRpYS92aWV3cy9Ib2xkTW9kYWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL21lZGlhL3ZpZXdzL0hvbGRTdWNjZXNzTW9kYWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL21lZGlhL3ZpZXdzL05vb2tFdWxhTW9kYWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL21lZGlhL3ZpZXdzL1BsYWNlSG9sZFBhbmVsLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9tZWRpYS92aWV3cy9SZW1vdmVIaXN0b3J5TW9kYWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL21lZGlhL3ZpZXdzL1RpdGxlSW5mby5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvbWVkaWEvdmlld3MvVGl0bGVJbmZvL1RpdGxlQXV0aG9yLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9tZWRpYS92aWV3cy9UaXRsZUluZm8vVGl0bGVFZGl0aW9uLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9tZWRpYS92aWV3cy9UaXRsZUluZm8vVGl0bGVGb3JtYXRCYWRnZS5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvbWVkaWEvdmlld3MvVGl0bGVJbmZvL1RpdGxlTmFtZS5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvbW9iaWxlX2FjY291bnRfbWVudS9tYWluLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9tb2JpbGVfYWNjb3VudF9tZW51L3ZpZXdzL2FjY291bnRfbWVudV9tb2JpbGUuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL25vbl9ob2xkX2NvbmZsaWN0X21vZGFsL05vbkhvbGRDb25mbGljdE1vZGFsLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9ub25faG9sZF9jb25mbGljdF9tb2RhbC9Ob25Ib2xkQ29ubGljdE1vZGFsLmh0bWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL25vdGlmaWNhdGlvbnNfZHJhd2VyL05vdGlmaWNhdGlvbnNEcmF3ZXIuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL25vdGlmaWNhdGlvbnNfZHJhd2VyL05vdGlmaWNhdGlvbnNJdGVtLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9ub3RpZmljYXRpb25zX2V2ZW50X3RyYWNrZXIvTm90aWZpY2F0aW9uc0V2ZW50VHJhY2tlci5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvcG9wb3Zlci9wb3BvdmVyLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9xdWlja19zZWFyY2gvY29sbGVjdGlvbnMvYXV0b2NvbXBsZXRpb25zLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9xdWlja19zZWFyY2gvbWFpbi5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvcXVpY2tfc2VhcmNoL21vZGVscy9hdXRvY29tcGxldGlvbi5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvcXVpY2tfc2VhcmNoL21vZGVscy9xdWlja19zZWFyY2guanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL3F1aWNrX3NlYXJjaC92aWV3cy9hdXRvY29tcGxldGlvbi5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvcXVpY2tfc2VhcmNoL3ZpZXdzL2F1dG9jb21wbGV0aW9ucy5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvcXVpY2tfc2VhcmNoL3ZpZXdzL3NlYXJjaF9iYXIuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL3F1aWNrX3NlYXJjaC92aWV3cy9zZWFyY2hfYmFyX2F1dG9jb21wbGV0ZS5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvc2Vzc2lvbl9leHBpcmVkX21vZGFsL1Nlc3Npb25FeHBpcmVkTW9kYWwuaHRtbC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvc2Vzc2lvbl9leHBpcmVkX21vZGFsL1Nlc3Npb25FeHBpcmVkTW9kYWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL3NpdGUvRXZlbnRCcmlkZ2UuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL3NpdGUvZ2EvVHJhY2tpbmdDaXJjdWxhdGlvbi5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvc2l0ZS9nYS9UcmFja2luZ0tpbmRsZUZ1bGZpbGxtZW50LmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy9zaXRlL2dhL1RyYWNraW5nUHVibGljQVBJRnVsZmlsbG1lbnQuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL3NpdGUvZ2EvVHJhY2tpbmdTaWduSW5Gb3Jtcy5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvdGxzLXdhcm5pbmctbW9kYWwvdGxzV2FybmluZ01vZGFsLmh0bWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL3Rscy13YXJuaW5nLW1vZGFsL3Rsc1dhcm5pbmdNb2RhbC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2NvbXBvbmVudHMvdG9hc3Rlci9hcHAuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9jb21wb25lbnRzL3RvYXN0ZXIvdG9hc3Rlci5odG1sLmpzIiwicHVibGljL2VjbWFzY3JpcHQvY29tcG9uZW50cy92aXNpdG9yX2FjdGlvbl9kaXNhbGxvd2VkX21vZGFsL1Zpc2l0b3JBY3Rpb25EaXNhbGxvd2VkTW9kYWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9kb2N1bWVudF9yZWFkeS5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2dsb2JhbF9iaW5kaW5ncy5qcyIsInB1YmxpYy9lY21hc2NyaXB0L2dsb2JhbF9ib290c3RyYXBwaW5nLmpzIiwicHVibGljL2VjbWFzY3JpcHQvbW9kZWxzL0NhcmQuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9tb2RlbHMvR2xvYmFsUHJlZmVyZW5jZXMuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC9tb2RlbHMvYmFzZS5qcyIsInB1YmxpYy9lY21hc2NyaXB0L21vZGVscy9wcmVmZXJlbmNlcy5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3BhZ2VzL2FsbC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3BvbHlmaWxscy9jdXN0b20tZXZlbnQuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC90aXRsZS1hY3Rpb25zL1ByZXZpZXcuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC90aXRsZS1hY3Rpb25zL1RpdGxlQWN0aW9uSGFuZGxlci5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3RpdGxlLWFjdGlvbnMvVGl0bGVBY3Rpb25zLmpzIiwicHVibGljL2VjbWFzY3JpcHQvdGl0bGUtYWN0aW9ucy9UaXRsZVN0YXRlLmpzIiwicHVibGljL2VjbWFzY3JpcHQvdGl0bGUtYWN0aW9ucy9ib3Jyb3cvQm9ycm93LmpzIiwicHVibGljL2VjbWFzY3JpcHQvdGl0bGUtYWN0aW9ucy9ib3Jyb3cvQm9ycm93QWN0aW9ucy5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3RpdGxlLWFjdGlvbnMvY2hlY2tzL0xhbmd1YWdlTWlzbWF0Y2gvTGFuZ3VhZ2VNaXNtYXRjaC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3RpdGxlLWFjdGlvbnMvY2hlY2tzL0xhbmd1YWdlTWlzbWF0Y2gvTGFuZ3VhZ2VNaXNtYXRjaE1vZGFsLmh0bWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC90aXRsZS1hY3Rpb25zL2NoZWNrcy9MYW5ndWFnZU1pc21hdGNoL0xhbmd1YWdlTWlzbWF0Y2hNb2RhbC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3RpdGxlLWFjdGlvbnMvaGlzdG9yeS9SZWFkaW5nSGlzdG9yeS5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3RpdGxlLWFjdGlvbnMvaGlzdG9yeS9SZWFkaW5nSGlzdG9yeUFjdGlvbnMuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC90aXRsZS1hY3Rpb25zL2hvbGRzL0hvbGQuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC90aXRsZS1hY3Rpb25zL2hvbGRzL0hvbGRBY3Rpb25zLmpzIiwicHVibGljL2VjbWFzY3JpcHQvdGl0bGUtYWN0aW9ucy9ub29rL05vb2suanMiLCJwdWJsaWMvZWNtYXNjcmlwdC90aXRsZS1hY3Rpb25zL25vb2svTm9va0FjdGlvbnMuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC90aXRsZS1hY3Rpb25zL3JhdGluZ3MvU3RhclJhdGluZy5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3RpdGxlLWFjdGlvbnMvcmF0aW5ncy9TdGFyUmF0aW5nQWN0aW9ucy5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3RpdGxlLWFjdGlvbnMvc2hhcmVkL1NoYXJlZEFjdGlvbnMuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC90aXRsZS1hY3Rpb25zL3dpc2hsaXN0L1dpc2hsaXN0LmpzIiwicHVibGljL2VjbWFzY3JpcHQvdXRpbC9GZWF0dXJlSGlnaGxpZ2h0TWFuYWdlci5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3V0aWwvUHJvbWlzZS5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3V0aWwvYWNjb3VudC9hcnJvd1RhYkFjY291bnRNZW51LmpzIiwicHVibGljL2VjbWFzY3JpcHQvdXRpbC9jYXJvdXNlbC9oaWRlQXJyb3dzT25FbmRPZlNjcm9sbC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3V0aWwvY2Fyb3VzZWwvaGlkZUNhcm91c2VsQXJyb3dzLmpzIiwicHVibGljL2VjbWFzY3JpcHQvdXRpbC9jYXJvdXNlbC9yb3VuZFNjcm9sbC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3V0aWwvY2Fyb3VzZWwvc2Nyb2xsQ2Fyb3VzZWwuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC91dGlsL2NvbG9ycy9jb21wb25lbnRUb0hleC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3V0aWwvY29sb3JzL3JnYlRvSGV4LmpzIiwicHVibGljL2VjbWFzY3JpcHQvdXRpbC9jb21wYXRpYmlsaXR5L2Fycm93VGFiTWVudS5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3V0aWwvY29tcGF0aWJpbGl0eS9mb3JjZV9yZWFsX3BhZ2VfcmVsb2FkLmpzIiwicHVibGljL2VjbWFzY3JpcHQvdXRpbC9jb21wYXRpYmlsaXR5L29udW5sb2FkLmpzIiwicHVibGljL2VjbWFzY3JpcHQvdXRpbC9jb21wYXRpYmlsaXR5L3JlbW92ZUNhcm91c2VsRnVuY3Rpb25hbGl0eS5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3V0aWwvZGF0ZXMvYWRkRGF5cy5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3V0aWwvZHlzbGV4aWMvZXhwZW5zaXZlRG9tVHJhdmVyc2FsRm9yRHlzbGV4aWNJZkNvb2tpZVBsZWFzZURvTm90VXNlLmpzIiwicHVibGljL2VjbWFzY3JpcHQvdXRpbC9keXNsZXhpYy9leHBlbnNpdmVEb21UcmF2ZXJzYWxGb3JEeXNsZXhpY1BsZWFzZURvTm90VXNlLmpzIiwicHVibGljL2VjbWFzY3JpcHQvdXRpbC9lbmNvZGluZy9yZmMzOTg2RW5jb2RlVVJJQ29tcG9uZW50LmpzIiwicHVibGljL2VjbWFzY3JpcHQvdXRpbC9maW5kRm9ybWF0SWQuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC91dGlsL2tleWNvZGVzLmpzIiwicHVibGljL2VjbWFzY3JpcHQvdXRpbC9sb2dnaW5nL2xvZ2dlci5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3V0aWwvbm9DYXJkLmpzIiwicHVibGljL2VjbWFzY3JpcHQvdXRpbC9wYXJhbWV0ZXJzLmpzIiwicHVibGljL2VjbWFzY3JpcHQvdXRpbC9xdWVyeS5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3V0aWwvcmVxdWVzdHMvZW5zdXJlU2ltcGxlUmVxdWVzdC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3V0aWwvcm91dGVzLmpzIiwicHVibGljL2VjbWFzY3JpcHQvdXRpbC9zdmdMb2FkZXIuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC91dGlsL3RleHQuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC91dGlsL3RpdGxlLWFjdGlvbnMvZmlsbFN0YXJzLmpzIiwicHVibGljL2VjbWFzY3JpcHQvdXRpbC90aXRsZS1hY3Rpb25zL2hhbmRsZUZvcndhcmRBY3Rpb25Ib2xkLmpzIiwicHVibGljL2VjbWFzY3JpcHQvdXRpbC90aXRsZS1hY3Rpb25zL29wZW5Ib2xkQ29uZmxpY3RNb2RhbC5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3V0aWwvdGl0bGUtYWN0aW9ucy9wcm9jZXNzRm9yd2FyZGVkQWN0aW9uLmpzIiwicHVibGljL2VjbWFzY3JpcHQvdXRpbC90aXRsZS1hY3Rpb25zL3Byb2Nlc3NJbnN0YW50Rm9yd2FyZEFjdGlvbnMuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC91dGlsL3RpdGxlLWFjdGlvbnMvc2VsZWN0U3RhclJhdGluZy5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3V0aWwvdGl0bGUtYWN0aW9ucy9zZXRVc2VyU3RhclJhdGluZy5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3V0aWwvdG9hc3QvZ2V0Q29va2llRXhwbGFuYXRpb24uanMiLCJwdWJsaWMvZWNtYXNjcmlwdC91dGlsL3VybC9hZGRRdWVyeVBhcmFtLmpzIiwicHVibGljL2VjbWFzY3JpcHQvdXRpbC91cmwvZ2V0UXVlcnlQYXJhbXMuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC91dGlsL3VybC9yZXBsYWNlUXVlcnlQYXJhbS5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3V0aWwvdXJsL3N0cmlwTm9MaW5rZWRDYXJkUXVlcnkuanMiLCJwdWJsaWMvZWNtYXNjcmlwdC92aWV3cy9iYXNlLmpzIiwicHVibGljL2VjbWFzY3JpcHQvdmlld3MvY29sbGVjdGlvbi5qcyIsInB1YmxpYy9lY21hc2NyaXB0L3dpbmRvd19wYWdlc2hvdy5qcyIsInB1YmxpYy9qcy9hcHAuanMiLCJwdWJsaWMvanMvYXBwL2FjdGlvbnMuanMiLCJwdWJsaWMvanMvYXBwL21vZGFsLmpzIiwicHVibGljL2pzL2FwcC9uYXYuanMiLCJwdWJsaWMvanMvYXBwL3NhbXBsZS5qcyIsInB1YmxpYy9qcy9hcHAvdGl0bGUtYWN0aW9ucy5qcyIsInB1YmxpYy9qcy9wbGFjZWhvbGRlci5qcyIsInJvdXRlcy9yb3V0aW5nLWNvbmZpZ3VyYXRpb24vaW5kZXguanMiLCJyb3V0ZXMvcm91dGluZy1jb25maWd1cmF0aW9uL2luZGV4Xy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDMWZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbHlFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDOUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDelZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2pLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaE9BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6bERBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2S0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3eURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMxRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2poQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4TEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNodUJBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2pMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUM1akRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzEvREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMxa0JBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckZBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBOztBQ0RBO0FBQ0E7O0FDREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25EQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaGVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0UEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25CQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7O0FDREE7QUFDQTs7QUNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7O0FDRkE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RNQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwTkE7Ozs7OztBQUNBLElBQU0sSUFBSSxRQUFRLFlBQVIsQ0FBVjs7SUFFTSxhO0FBQ0YsMkJBQVksS0FBWixFQUFtQjtBQUFBOztBQUNmLGFBQUssVUFBTCxHQUFrQixDQUFsQjtBQUNBLGFBQUssVUFBTCxHQUFrQixDQUFsQjtBQUNBLGFBQUssVUFBTCxHQUFrQixDQUFsQjtBQUNBLGFBQUssVUFBTCxHQUFrQixDQUFsQjtBQUNBLGFBQUssZUFBTCxHQUF1QixDQUF2QjtBQUNBO0FBQ0EsYUFBSyxhQUFMLEdBQXFCLElBQXJCO0FBQ0EsYUFBSyxhQUFMLEdBQXFCLENBQXJCO0FBQ0EsYUFBSyxxQ0FBTCxHQUE2QyxDQUE3Qzs7QUFFQSxVQUFFLE1BQUYsQ0FBUyxJQUFULEVBQWUsS0FBZjtBQUNIOzs7OzRCQUVvQjtBQUNqQixtQkFBTyxLQUFLLFVBQUwsR0FBa0IsS0FBSyxxQ0FBOUI7QUFDSDs7OzRCQUVvQjtBQUNqQixtQkFBTyxLQUFLLFVBQUwsR0FBa0IsS0FBSyxVQUE5QjtBQUNIOzs7NEJBRXVCO0FBQ3BCLG1CQUFPLEtBQUssYUFBTCxHQUFxQixLQUFLLGFBQWpDO0FBQ0g7Ozt5Q0FFdUIsSSxFQUFNLEssRUFBTyxLLEVBQU8sUSxFQUFVO0FBQ2xELGdCQUFJLGdCQUFnQixJQUFJLGFBQUosRUFBcEI7O0FBRUEsMEJBQWMsVUFBZCxHQUEyQixNQUFNLFVBQWpDO0FBQ0EsMEJBQWMsVUFBZCxHQUEyQixLQUFLLFNBQWhDOztBQUVBLDBCQUFjLFVBQWQsR0FBMkIsTUFBTSxVQUFqQztBQUNBLDBCQUFjLHFDQUFkLEdBQ0ksTUFBTSxxQ0FEVjs7QUFHQSxnQkFBSSxLQUFLLHlCQUFULEVBQW9DO0FBQ2hDLG9CQUFJLElBQUksS0FBSyx5QkFBYjtBQUNBLDhCQUFjLFVBQWQsR0FDSSxFQUFFLEtBQUYsSUFBVyxFQUFFLFNBQWIsSUFBMEIsRUFBRSxLQUE1QixJQUFxQyxjQUFjLFVBRHZEO0FBRUg7O0FBRUQsMEJBQWMsYUFBZCxHQUE4QixTQUFTLFVBQXZDO0FBQ0EsbUJBQU8sYUFBUDtBQUNIOzs7Ozs7QUFHTCxPQUFPLE9BQVAsR0FBaUIsYUFBakI7Ozs7Ozs7OztBQ25EQSxJQUFJLElBQUksUUFBUSxZQUFSLENBQVI7QUFDQSxJQUFNLFNBQVMsUUFBUSxRQUFSLENBQWY7O0FBRUE7QUFDQTtBQUNBOzs7SUFHTSxTO0FBQ0YsdUJBQVksS0FBWixFQUFtQixtQkFBbkIsRUFBd0MsWUFBeEMsRUFBc0QsU0FBdEQsRUFBaUUsS0FBakUsRUFBd0UsMkJBQXhFLEVBQXFHLHNDQUFyRyxFQUNJLGdCQURKLEVBQ3NCLGFBRHRCLEVBQ3FDLG1CQURyQyxFQUMwRCxXQUQxRCxFQUN1RSxrQkFEdkUsRUFDMkYsc0JBRDNGLEVBQ21IO0FBQUE7O0FBQy9HLGFBQUssbUJBQUwsR0FBMkIsbUJBQTNCO0FBQ0EsYUFBSyxZQUFMLEdBQW9CLFlBQXBCO0FBQ0EsYUFBSyxTQUFMLEdBQWlCLFNBQWpCO0FBQ0EsYUFBSyxLQUFMLEdBQWEsS0FBYjtBQUNBLGFBQUssMkJBQUwsR0FBbUMsMkJBQW5DLENBTCtHLENBSy9DO0FBQ2hFLGFBQUssc0NBQUwsR0FBOEMsc0NBQTlDLENBTitHLENBTXhCO0FBQ3ZGLGFBQUssZ0JBQUwsR0FBd0IsZ0JBQXhCO0FBQ0EsYUFBSyxhQUFMLEdBQXFCLGFBQXJCLENBUitHLENBUTNFO0FBQ3BDLGFBQUssbUJBQUwsR0FBMkIsbUJBQTNCLENBVCtHLENBUy9EO0FBQ2hELGFBQUssV0FBTCxHQUFtQixXQUFuQixDQVYrRyxDQVUvRTtBQUNoQyxhQUFLLGtCQUFMLEdBQTBCLGtCQUExQixDQVgrRyxDQVdqRTtBQUM5QyxhQUFLLHNCQUFMLEdBQThCLHNCQUE5QixDQVorRyxDQVl6RDtBQUN0RCxlQUFPLE1BQVAsQ0FBYyxJQUFkLEVBQW9CLEtBQXBCO0FBQ0g7Ozs7NEJBRXlCO0FBQ3RCLGdCQUFJLG9CQUFvQixFQUF4QjtBQUNBLGdCQUFJLEtBQUssa0JBQVQsRUFBNkI7QUFDekIsb0NBQW9CLFFBQXBCO0FBQ0gsYUFGRCxNQUdLLElBQUksS0FBSyx5QkFBVCxFQUFvQztBQUNyQyxvQ0FBb0IsS0FBSyx1QkFBTCxDQUE2QixDQUE3QixFQUFnQyxFQUFwRDtBQUNIO0FBQ0QsbUJBQU8saUJBQVA7QUFDSDs7OzRCQUVnQztBQUM3QixtQkFBTyxDQUFDLEtBQUssMkJBQU4sSUFBcUMsQ0FBQyxLQUFLLGtCQUEzQyxJQUFpRSxFQUFFLEtBQUssaUJBQUwsSUFBMEIsS0FBSyxpQkFBTCxDQUF1QixNQUF2QixHQUFnQyxDQUE1RCxDQUF4RTtBQUNIOzs7NEJBRXNCO0FBQ25CLG1CQUFPLEtBQUssZ0JBQUwsSUFBeUIsS0FBSyxZQUFMLElBQXFCLElBQTlDLElBQXNELEtBQUssWUFBTCxDQUFrQixNQUFsQixHQUEyQixDQUFqRixJQUFzRixLQUFLLFlBQUwsQ0FBa0IsQ0FBbEIsRUFBcUIsRUFBckIsS0FBNEIsY0FBekg7QUFDSDs7OzRCQUVhO0FBQ1YsbUJBQU8sS0FBSyxJQUFMLENBQVUsRUFBVixLQUFpQixPQUF4QjtBQUNIOzs7NEJBRWlCO0FBQ2QsbUJBQU8sS0FBSyxJQUFMLENBQVUsRUFBVixLQUFpQixXQUF4QjtBQUNIOzs7NEJBRWE7QUFDVixtQkFBTyxLQUFLLElBQUwsQ0FBVSxFQUFWLEtBQWlCLE9BQXhCO0FBQ0g7Ozs0QkFFZ0I7QUFDYixtQkFBTyxLQUFLLElBQUwsQ0FBVSxFQUFWLEtBQWlCLFVBQXhCO0FBQ0g7Ozs0QkFFa0I7QUFDZixtQkFBTyxDQUFDLEVBQUUsS0FBSyxlQUFMLElBQXdCLEtBQUssZUFBTCxDQUFxQix3QkFBL0MsQ0FBUjtBQUNIOzs7NEJBRXFCO0FBQ2xCLG1CQUFPLEtBQUssbUJBQUwsR0FDRCxLQUFLLE9BQUwsQ0FBYSxTQUFiLENBQXVCLFVBQUMsTUFBRDtBQUFBLHVCQUFZLE9BQU8sRUFBUCxLQUFjLGNBQTFCO0FBQUEsYUFBdkIsTUFBcUUsQ0FBQyxDQURyRSxHQUVELEtBQUssWUFBTCxDQUFrQixTQUFsQixDQUE0QixVQUFDLE1BQUQ7QUFBQSx1QkFBWSxPQUFPLEVBQVAsS0FBYyxjQUExQjtBQUFBLGFBQTVCLE1BQTBFLENBQUMsQ0FGakY7QUFHSDs7OzRCQUVrQjtBQUNmLG1CQUFRLEtBQUssT0FBTCxDQUFhLFNBQWIsQ0FBdUIsVUFBQyxNQUFEO0FBQUEsdUJBQVksT0FBTyxFQUFQLEtBQWMsZUFBMUI7QUFBQSxhQUF2QixNQUFzRSxDQUFDLENBQXZFLElBQTRFLEtBQUssWUFBTCxDQUFrQixTQUFsQixDQUE0QixVQUFDLE1BQUQ7QUFBQSx1QkFBWSxPQUFPLEVBQVAsS0FBYyxlQUExQjtBQUFBLGFBQTVCLE1BQTJFLENBQUMsQ0FBaEs7QUFDSDs7OzRCQUVzQjtBQUNuQixtQkFBUSxLQUFLLE9BQUwsQ0FBYSxTQUFiLENBQXVCLFVBQUMsTUFBRDtBQUFBLHVCQUFZLE9BQU8sRUFBUCxLQUFjLGdCQUExQjtBQUFBLGFBQXZCLE1BQXVFLENBQUMsQ0FBeEUsSUFBNkUsS0FBSyxZQUFMLENBQWtCLFNBQWxCLENBQTRCLFVBQUMsTUFBRDtBQUFBLHVCQUFZLE9BQU8sRUFBUCxLQUFjLGdCQUExQjtBQUFBLGFBQTVCLE1BQTRFLENBQUMsQ0FBbEs7QUFDSDs7OzRCQUU4QjtBQUMzQixtQkFBTyxLQUFLLHVCQUFMLENBQTZCLE1BQTdCLEdBQXNDLENBQTdDO0FBQ0g7Ozs0QkFFa0I7QUFDZixtQkFBTyxLQUFLLFlBQUwsQ0FBa0IsSUFBbEIsQ0FBdUIsVUFBQyxNQUFEO0FBQUEsdUJBQVksT0FBTyxFQUFQLEtBQWMsY0FBMUI7QUFBQSxhQUF2QixDQUFQO0FBQ0g7Ozs0QkFFcUM7QUFDbEMsbUJBQU8sS0FBSywyQkFBTCxJQUNBLENBQUMsS0FBSyxlQUROLEtBRUUsS0FBSyxzQkFBTCxJQUErQixDQUFDLEtBQUssa0JBQXRDLElBQThELENBQUMsS0FBSyxzQkFBTixJQUFnQyxLQUFLLGtCQUZwRyxLQUdBLENBQUMsS0FBSyxtQkFITixJQUlBLENBQUMsS0FBSyx1QkFKYjtBQUtIOzs7NEJBRW9DO0FBQ2pDLG1CQUFPLEtBQUssMkJBQUwsSUFBb0MsQ0FBQyxLQUFLLCtCQUExQyxJQUE2RSxDQUFDLEtBQUssdUJBQTFGO0FBQ0g7Ozs0QkFFaUM7QUFDOUIsbUJBQU8sS0FBSywyQkFBTCxJQUNBLEtBQUssdUJBQUwsQ0FBNkIsTUFBN0IsS0FBd0MsQ0FEL0M7QUFFSDs7OzRCQUUwQjtBQUN2QixtQkFBTyxLQUFLLE9BQUwsSUFDQSxLQUFLLDJCQURMLElBRUEsS0FBSyx1QkFBTCxDQUE2QixNQUE3QixHQUFzQyxDQUY3QztBQUdIOzs7NEJBRWlDO0FBQzlCLG1CQUFPLENBQUMsS0FBSyxPQUFMLElBQWlCLEtBQUssV0FBTCxJQUFvQixLQUFLLHNCQUEzQyxLQUF1RSxDQUFDLEtBQUssZ0JBQTdFLElBQ0EsS0FBSyx1QkFETCxJQUVBLEtBQUssdUJBQUwsQ0FBNkIsTUFBN0IsR0FBc0MsQ0FGdEMsS0FHQyxDQUFDLEtBQUssWUFBTixJQUFzQixDQUFDLEtBQUssbUJBQTVCLElBQW1ELENBQUMsS0FBSyxlQUgxRCxDQUFQO0FBSUg7Ozs0QkFFeUI7QUFDdEIsbUJBQU8sQ0FBQyxLQUFLLGdCQUFOLElBQTBCLENBQUMsS0FBSyxlQUFoQyxJQUFtRCxLQUFLLFlBQXhELElBQXdFLEtBQUssT0FBcEY7QUFDSDs7OzRCQUVzQjtBQUNuQixtQkFBTyxLQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CLFVBQUMsTUFBRDtBQUFBLHVCQUFZLE9BQU8sRUFBUCxLQUFjLGNBQWQsSUFBZ0MsT0FBTyxFQUFQLEtBQWMsWUFBMUQ7QUFBQSxhQUFwQixDQUFQO0FBQ0g7Ozs0QkFFNkI7QUFBQTs7QUFDMUIsbUJBQU8sS0FBSyxtQkFBTCxHQUNELEtBQUssT0FBTCxDQUFhLE1BQWIsQ0FBb0IsVUFBQyxNQUFEO0FBQUEsdUJBQVksT0FBTyxFQUFQLEtBQWMsY0FBZCxJQUM3QixPQUFPLEVBQVAsS0FBYyxZQURlLElBRTdCLE9BQU8sRUFBUCxLQUFjLGlCQUZlLElBRzdCLE9BQU8sRUFBUCxLQUFjLHFCQUhlLElBSTdCLE9BQU8sRUFBUCxLQUFjLGlCQUplLElBSzdCLEVBQUUsTUFBSyxrQkFBTCxJQUEyQixPQUFPLEVBQVAsS0FBYyxvQkFBM0MsQ0FMaUI7QUFBQSxhQUFwQixDQURDLEdBUUQsS0FBSyxZQUFMLENBQWtCLE1BQWxCLENBQXlCLFVBQUMsTUFBRDtBQUFBLHVCQUFZLE9BQU8sRUFBUCxLQUFjLGNBQWQsSUFBZ0MsT0FBTyxFQUFQLEtBQWMsWUFBMUQ7QUFBQSxhQUF6QixDQVJOO0FBU0g7Ozs0QkFFb0M7QUFDakMsbUJBQU8sS0FBSyx1QkFBTCxDQUE2QixNQUE3QixDQUFvQyxVQUFDLE1BQUQ7QUFBQSx1QkFBWSxPQUFPLEVBQVAsS0FBYyxlQUExQjtBQUFBLGFBQXBDLENBQVA7QUFDSDs7OzRCQUV3QjtBQUNyQixtQkFBTyxDQUFDLEVBQUUsS0FBSyxlQUFMLElBQXdCLEtBQUssZUFBTCxDQUFxQixFQUFyQixJQUEyQixJQUFyRCxDQUFSO0FBQ0g7Ozs0QkFFNkI7QUFDMUIsbUJBQU8sS0FBSyxtQkFBTCxLQUNELEtBQUssZ0JBQUwsS0FBMEIsQ0FBQyxLQUFLLHNCQUFOLElBQWdDLENBQUMsS0FBSyxnQkFBaEUsS0FBcUYsS0FBSyx1QkFBTCxDQUE2QixNQUE3QixLQUF3QyxDQUE5SCxJQUNDLEtBQUssT0FBTCxJQUFnQixDQUFDLEtBQUssZUFBdEIsSUFBeUMsS0FBSyxnQkFBTCxDQUFzQixNQUF0QixLQUFpQyxDQUExRSxJQUErRSxLQUFLLGdCQUFMLENBQXNCLENBQXRCLEVBQXlCLEVBQXpCLEtBQWdDLGlCQUFoSCxJQUNHLEtBQUssV0FBTCxJQUFvQixLQUFLLE9BQUwsQ0FBYSxNQUFiLEtBQXdCLENBQTVDLElBQWlELEtBQUssT0FBTCxDQUFhLENBQWIsRUFBZ0IsRUFBaEIsS0FBdUIscUJBSHpFLENBQVA7QUFJSDs7OzRCQUV3QjtBQUNyQixtQkFBTyxLQUFLLGtCQUFMLElBQTJCLEtBQUssc0JBQWhDLElBQTBELENBQUMsS0FBSyxpQkFBaEUsS0FDRixDQUFDLEtBQUssZUFBTixJQUF5QixDQUFDLEtBQUssWUFBL0IsSUFBK0MsS0FBSyxlQUFMLENBQXFCLHdCQURsRSxDQUFQO0FBRUg7Ozs0QkFFcUM7QUFDbEM7QUFDQTtBQUNBO0FBQ0E7QUFDQSxtQkFBTyxLQUFLLFdBQUwsSUFBb0IsS0FBSyxLQUF6QixJQUFrQyxLQUFLLFlBQXZDLElBQXVELEtBQUssa0JBQTVELElBQW1GLEtBQUssc0JBQXhGLElBQWtILEtBQUssMkJBQXZILEtBQ0ssQ0FBQyxLQUFLLHNDQUFOLElBQWdELENBQUMsS0FBSyxnQkFEM0QsQ0FBUDtBQUVIOzs7NEJBRTJCO0FBQ3hCO0FBQ0EsZ0JBQUksS0FBSyxZQUFMLElBQXFCLEtBQUssWUFBTCxDQUFrQixNQUFsQixLQUE2QixDQUFsRCxJQUF1RCxLQUFLLFNBQTVELEtBQ0MsS0FBSyxZQUFMLENBQWtCLENBQWxCLEVBQXFCLEVBQXJCLEtBQTRCLGlCQUE1QixJQUFpRCxLQUFLLFlBQUwsQ0FBa0IsQ0FBbEIsRUFBcUIsRUFBckIsS0FBNEIsZ0JBQTdFLElBQWlHLEtBQUssWUFBTCxDQUFrQixDQUFsQixFQUFxQixFQUFyQixLQUE0QixjQUQ5SCxDQUFKLEVBQ21KO0FBQy9JLHVCQUFPLElBQVA7QUFDSCxhQUhELE1BR08sSUFBSSxLQUFLLGVBQUwsSUFBd0IsS0FBSyxlQUFMLENBQXFCLHdCQUFqRCxFQUEyRTtBQUM5RSx1QkFBUSxJQUFSO0FBQ0gsYUFGTSxNQUVBO0FBQ0gsdUJBQU8sRUFBRSxLQUFLLFNBQUwsSUFBa0IsS0FBSyxZQUF2QixJQUF1QyxLQUFLLFlBQUwsQ0FBa0IsTUFBbEIsR0FBMkIsQ0FBcEUsS0FBMkUsS0FBSyxTQUFMLElBQWtCLEtBQUssdUJBQXpHO0FBQ0g7QUFDSjs7OzRCQUU2QjtBQUMxQixtQkFBUSxLQUFLLE9BQUwsS0FBa0IsS0FBSyxnQkFBTCxJQUF5QixDQUFDLEtBQUssdUJBQWhDLElBQ2QsS0FBSyxlQURTLElBRWQsS0FBSyxtQkFGUyxJQUdiLEtBQUssc0JBQUwsSUFBK0IsQ0FBQyxLQUFLLGVBQXJDLElBQXdELEtBQUssa0JBSGhELElBSWQsS0FBSywrQkFKUixDQUFELElBS0MsQ0FBQyxLQUFLLE9BQU4sSUFBaUIsS0FBSyx5QkFBdEIsSUFBbUQsQ0FBQyxLQUFLLCtCQUxqRTtBQU1IOzs7NEJBRThCO0FBQzNCLG1CQUFRLEtBQUssa0JBQUwsSUFBMkIsQ0FBQyxLQUFLLHNCQUFsQyxJQUNDLEtBQUssc0JBQUwsSUFBK0IsS0FBSyxrQkFBcEMsSUFBMEQsQ0FBQyxLQUFLLHVCQURqRSxJQUVDLEtBQUssMkJBQUwsSUFBb0MsQ0FBQyxLQUFLLCtCQUZsRDtBQUdIOzs7NEJBRWlCO0FBQ2QsbUJBQVEsS0FBSyx1QkFBTCxJQUFnQyxLQUFLLHdCQUF0QyxJQUFvRSxLQUFLLFdBQUwsSUFBb0IsQ0FBQyxLQUFLLFNBQTFCLElBQXVDLEtBQUssV0FBNUMsSUFBMkQsS0FBSyxrQkFBaEUsSUFBc0YsS0FBSyxtQkFBdEs7QUFDSDs7OzRCQUVzQjtBQUNuQixtQkFBTyxLQUFLLFdBQUwsSUFBb0IsS0FBSyxXQUFMLENBQWlCLG9CQUE1QztBQUNIOzs7NEJBRXVCO0FBQ3BCLG1CQUFPLEtBQUssT0FBTCxJQUFnQixLQUFLLGFBQTVCO0FBQ0g7Ozs0QkFFZTtBQUNaLGdCQUFJLGdCQUFnQixLQUFLLE9BQUwsQ0FBYSxNQUFiLENBQW9CO0FBQUEsdUJBQVUsQ0FBQyxPQUFPLEVBQVAsQ0FBVSxRQUFWLENBQW1CLEtBQW5CLENBQUQsSUFBOEIsQ0FBQyxPQUFPLEVBQVAsQ0FBVSxRQUFWLENBQW1CLE1BQW5CLENBQXpDO0FBQUEsYUFBcEIsQ0FBcEI7QUFDQSxtQkFBTyxjQUFjLE1BQWQsS0FBeUIsQ0FBaEM7QUFDSDs7Ozs7O0FBR0wsT0FBTyxPQUFQLEdBQWlCLFNBQWpCOzs7Ozs7Ozs7SUNuTk0sZTtBQUNGLCtCQUFjO0FBQUE7O0FBQ1YsYUFBSyxZQUFMLEdBQW9CO0FBQ2hCLG1CQUFPLE9BRFM7QUFFaEIsa0JBQU0sTUFGVTtBQUdoQixvQkFBUSxRQUhRO0FBSWhCLHdCQUFZO0FBSkksU0FBcEI7QUFNSDs7QUFFRDs7Ozs7Ozs7O3NDQUtjLEcsRUFBSztBQUNmLGdCQUFJLFlBQVksSUFBSSxPQUFKLENBQVksWUFBWixDQUFoQjtBQUNBLGdCQUFJLHVCQUF1QixJQUFJLE9BQUosQ0FBWSxrQkFBWixLQUFtQyxDQUE5RDtBQUNBLGdCQUFJLHlCQUNBLElBQUksT0FBSixJQUNBLElBQUksT0FBSixDQUFZLFNBRFosSUFFQSxJQUFJLGNBRkosSUFHQSxJQUFJLGNBQUosQ0FBbUIsUUFBbkIsQ0FBNEIsT0FBTyxJQUFJLE9BQUosQ0FBWSxTQUFuQixDQUE1QixDQUpKO0FBS0EsbUJBQ0ksS0FBSyxjQUFMLEtBQ0MsS0FBSyxjQUFMLENBQW9CLFNBQXBCLENBQThCLFFBQTlCLEtBQ0csc0JBRkosTUFHQyx3QkFDRyxVQUFVLElBQVYsQ0FBZSxTQUFmLENBREgsSUFFRyxXQUFXLElBQVgsQ0FBZ0IsU0FBaEIsQ0FMSixDQURKO0FBUUg7O0FBRUQ7Ozs7Ozs7Ozs7O0FBMkJBOzs7Ozs7MENBTWtCLFcsRUFBYTtBQUMzQixvQkFBUSxXQUFSO0FBQ0kscUJBQUssS0FBSyxZQUFMLENBQWtCLEtBQXZCO0FBQ0ksMkJBQ0ksQ0FBQyxLQUFLLFFBQUwsQ0FBYyxjQUFmLElBQ0EsS0FBSyxjQUFMLENBQW9CLFNBQXBCLENBQThCLGNBQTlCLENBREEsSUFFQSxLQUFLLFFBQUwsQ0FBYyxnQkFBZCxDQUErQixRQUEvQixDQUF3QyxPQUF4QyxDQUhKO0FBS0oscUJBQUssS0FBSyxZQUFMLENBQWtCLElBQXZCO0FBQ0ksMkJBQ0ksQ0FBQyxLQUFLLFFBQUwsQ0FBYyxjQUFmLElBQ0EsS0FBSyxRQUFMLENBQWMsZ0JBQWQsQ0FBK0IsUUFBL0IsQ0FBd0MsTUFBeEMsQ0FGSjtBQUlKLHFCQUFLLEtBQUssWUFBTCxDQUFrQixNQUF2QjtBQUNJLDJCQUNJLEtBQUssUUFBTCxDQUFjLGNBQWQsSUFDQSxLQUFLLFFBQUwsQ0FBYyxlQURkLElBRUEsQ0FBQyxLQUFLLFFBQUwsQ0FBYyxjQUhuQjtBQUtKLHFCQUFLLEtBQUssVUFBVjtBQUNJLDJCQUNJLENBQUMsS0FBSyxRQUFMLENBQWMsY0FBZixJQUNBLEtBQUssY0FBTCxDQUFvQixTQUFwQixDQUE4QixpQkFBOUIsQ0FGSjtBQW5CUjtBQXdCSDs7O3FDQXBEbUIsRyxFQUFLLEcsRUFBSyxjLEVBQWdCO0FBQzFDLGdCQUFJLFdBQVcsSUFBSSxJQUFKLEVBQWY7QUFDQSxxQkFBUyxjQUFULEdBQTBCLGNBQTFCO0FBQ0EscUJBQVMsUUFBVCxHQUFvQixJQUFJLE1BQXhCO0FBQ0EscUJBQVMsUUFBVCxDQUFrQixjQUFsQixHQUFtQyxTQUFTLGFBQVQsQ0FBdUIsR0FBdkIsQ0FBbkM7QUFDQSxtQkFBTyxRQUFQO0FBQ0g7O0FBRUQ7Ozs7Ozs7OztxQ0FNb0IsTSxFQUFRO0FBQ3hCLGdCQUFJLFdBQVcsSUFBSSxJQUFKLEVBQWY7QUFDQSxxQkFBUyxjQUFULEdBQTBCLE9BQU8sY0FBakM7QUFDQSxxQkFBUyxRQUFULEdBQW9CLE9BQU8sU0FBM0I7QUFDQSxtQkFBTyxRQUFQO0FBQ0g7Ozs7OztBQW9DTCxPQUFPLE9BQVAsR0FBaUIsZUFBakI7Ozs7O0FDOUZBLElBQU0sVUFBVSxRQUFRLFdBQVIsQ0FBaEI7O0FBRUEsT0FBTyxPQUFQLEdBQWlCO0FBQ2Isd0JBQW9CO0FBQ2hCLGNBQU0sb0JBRFU7QUFFaEIsb0JBQVksUUFBUSxpQkFBUixHQUE0QixFQUZ4QjtBQUdoQixpQkFBUztBQUhPLEtBRFA7QUFNYiw0QkFBd0I7QUFDcEIsY0FBTSx3QkFEYztBQUVwQixvQkFBWSxRQUFRLGtCQUZBO0FBR3BCLGlCQUFTO0FBSFcsS0FOWDtBQVdiLDZCQUF5QjtBQUNyQixjQUFNLHlCQURlO0FBRXJCLG9CQUFZLFFBQVEsaUJBQVIsR0FBNEIsRUFGbkI7QUFHckIsaUJBQVM7QUFIWSxLQVhaO0FBZ0JiLGFBQVM7QUFDTCxjQUFNLFVBREQ7QUFFTCxvQkFBWSxRQUFRLGtCQUFSLEdBQTZCLEVBRnBDO0FBR0wsaUJBQVMsSUFISjtBQUlMLGdCQUFRLGVBSkg7QUFLTCxrQkFBVTtBQUxMLEtBaEJJO0FBdUJiLHFCQUFpQjtBQUNiLGNBQU0saUJBRE87QUFFYixvQkFBWSxRQUFRLGtCQUFSLEdBQTZCLEVBRjVCO0FBR2IsaUJBQVM7QUFISTtBQXZCSixDQUFqQjs7O0FDRkE7O0FBQ0EsT0FBTyxjQUFQLENBQXNCLE9BQXRCLEVBQStCLFlBQS9CLEVBQTZDLEVBQUUsT0FBTyxJQUFULEVBQTdDO0FBQ0EsUUFBUSxjQUFSLEdBQXlCLEtBQUssQ0FBOUI7QUFDQSxJQUFJLGFBQWEsUUFBUSxvQkFBUixDQUFqQjtBQUNBOzs7QUFHQSxJQUFJLGlCQUFpQixhQUFlLFlBQVk7QUFDNUM7Ozs7Ozs7O0FBUUEsYUFBUyxjQUFULENBQXdCLEtBQXhCLEVBQStCLHFCQUEvQixFQUFzRCxNQUF0RCxFQUE4RCxXQUE5RCxFQUEyRSw2QkFBM0UsRUFBMEc7QUFDdEcsYUFBSyxxQkFBTCxHQUE2QixxQkFBN0I7QUFDQSxhQUFLLFdBQUwsR0FBbUIsS0FBSyxpQkFBTCxDQUF1QixNQUF2QixFQUErQixXQUEvQixDQUFuQjtBQUNBLFlBQUksV0FBVyxDQUFDLEdBQUcsV0FBVyxVQUFmLEVBQTJCLEtBQTNCLENBQWY7QUFDQSx5Q0FDSSw4QkFBOEIsT0FBOUIsQ0FBc0MsVUFBVSxJQUFWLEVBQWdCO0FBQ2xELHVCQUFXLEtBQUssdUJBQUwsQ0FBNkIsUUFBN0IsRUFBdUMscUJBQXZDLEVBQThELE1BQTlELEVBQXNFLFdBQXRFLENBQVg7QUFDSCxTQUZELENBREo7QUFJQSxhQUFLLFFBQUwsR0FBZ0IsUUFBaEI7QUFDSDtBQUNEOzs7Ozs7O0FBT0EsbUJBQWUsU0FBZixDQUF5QixTQUF6QixHQUFxQyxVQUFVLE9BQVYsRUFBbUI7QUFDcEQsZUFBTyxDQUFDLEVBQUUsS0FBSyxjQUFMLENBQW9CLE9BQXBCLE1BQ0wsS0FBSyxXQUFMLEdBQ0ssS0FBSyxrQkFBTCxDQUF3QixPQUF4QixDQURMLEdBRUssS0FBSyxpQkFBTCxDQUF1QixPQUF2QixDQUhBLENBQUYsQ0FBUjtBQUlILEtBTEQ7QUFNQTs7Ozs7OztBQU9BLG1CQUFlLFNBQWYsQ0FBeUIsaUJBQXpCLEdBQTZDLFVBQVUsT0FBVixFQUFtQjtBQUM1RCxlQUFPLEtBQUssUUFBTCxDQUFjLE9BQWQsS0FBMEIsS0FBSyxRQUFMLENBQWMsT0FBZCxFQUF1QixPQUF4RDtBQUNILEtBRkQ7QUFHQTs7Ozs7OztBQU9BLG1CQUFlLFNBQWYsQ0FBeUIsa0JBQXpCLEdBQThDLFVBQVUsT0FBVixFQUFtQjtBQUM3RCxlQUFPLEtBQUssUUFBTCxDQUFjLE9BQWQsS0FBMEIsS0FBSyxRQUFMLENBQWMsT0FBZCxFQUF1QixRQUF4RDtBQUNILEtBRkQ7QUFHQTs7Ozs7QUFLQSxtQkFBZSxTQUFmLENBQXlCLGNBQXpCLEdBQTBDLFVBQVUsT0FBVixFQUFtQjtBQUN6RCxZQUFJLFVBQVUsS0FBSyxxQkFBTCxDQUEyQixPQUEzQixDQUFkO0FBQ0EsZUFBTyxDQUFDLE9BQUQsSUFBWSxRQUFRLE9BQXBCLElBQStCLEtBQXRDO0FBQ0gsS0FIRDtBQUlBOzs7Ozs7O0FBT0EsbUJBQWUsU0FBZixDQUF5QixpQkFBekIsR0FBNkMsVUFBVSxNQUFWLEVBQWtCLFdBQWxCLEVBQStCO0FBQ3hFLGVBQVEsV0FBVyxNQUFYLElBQ0osV0FBVyxNQURQLElBRUgsVUFBVSxNQUFWLElBQW9CLFNBQVMsTUFGMUIsSUFHSixnQkFBZ0IsR0FIcEI7QUFJSCxLQUxEO0FBTUEsV0FBTyxjQUFQO0FBQ0gsQ0EzRW1DLEVBQXBDO0FBNEVBLFFBQVEsY0FBUixHQUF5QixjQUF6Qjs7QUFFQTs7QUFFQTs7Ozs7QUN2RkEsSUFBTSxpQkFBaUIsUUFBUSx3QkFBUixFQUFrQyxjQUF6RDs7QUFFQSxPQUFPLE9BQVAsR0FBaUIsY0FBakI7Ozs7O0FDRkEsSUFBSSxJQUFJLFFBQVEsWUFBUixDQUFSO0FBQ0EsSUFBSSxXQUFXLFFBQVEsa0RBQVIsQ0FBZjtBQUNBLElBQUksc0JBQXNCLFFBQVEsNkRBQVIsQ0FBMUI7QUFDQSxJQUFJLGlCQUFpQixRQUFRLGtCQUFSLENBQXJCOztBQUVBOzs7Ozs7QUFNQSxJQUFJLHlDQUF5QyxTQUF6QyxzQ0FBeUMsQ0FBUyxLQUFULEVBQWdCLG9CQUFoQixFQUFzQyxNQUF0QyxFQUE4QztBQUN2RixRQUFJLGlCQUFpQixFQUFFLE1BQUYsQ0FBUyxFQUFULEVBQWEsS0FBYixDQUFyQjtBQUNBLFFBQUkscUJBQXFCLHVCQUF1QixvQkFBb0IsTUFBcEIsQ0FBaEQ7QUFDQSxRQUFJLDBCQUEyQixzQkFBc0IsbUJBQW1CLEdBQXhFOztBQUVBLG1CQUFlLGlCQUFmLElBQW9DLEVBQUMsU0FBUyx1QkFBVixFQUFtQyxVQUFVLHVCQUE3QyxFQUFwQztBQUNBLFdBQU8sY0FBUDtBQUNILENBUEQ7O0FBU0EsSUFBSSxzQkFBc0IsU0FBdEIsbUJBQXNCLENBQVMscUJBQVQsRUFBZ0MsTUFBaEMsRUFBd0MsV0FBeEMsRUFBcUQsV0FBckQsRUFBa0U7QUFDeEYsUUFBSSxDQUFDLENBQUMsV0FBTixFQUFtQjtBQUNmLG1CQUFXLFdBQVg7QUFDSDtBQUNELFdBQU8sSUFBSSxjQUFKLENBQW1CLFFBQW5CLEVBQTZCLHFCQUE3QixFQUFvRCxNQUFwRCxFQUE0RCxXQUE1RCxFQUF5RSxDQUM1RSxFQUFDLHlCQUF5QixFQUFFLE9BQUYsQ0FBVSxzQ0FBVixDQUExQixFQUQ0RSxDQUF6RSxDQUFQO0FBR0gsQ0FQRDs7QUFTQSxPQUFPLE9BQVAsR0FBaUIsbUJBQWpCOzs7QUM3QkE7O0FBQ0EsSUFBSSxXQUFZLGFBQVEsVUFBSyxRQUFkLElBQTJCLFlBQVk7QUFDbEQsZUFBVyxPQUFPLE1BQVAsSUFBaUIsVUFBUyxDQUFULEVBQVk7QUFDcEMsYUFBSyxJQUFJLENBQUosRUFBTyxJQUFJLENBQVgsRUFBYyxJQUFJLFVBQVUsTUFBakMsRUFBeUMsSUFBSSxDQUE3QyxFQUFnRCxHQUFoRCxFQUFxRDtBQUNqRCxnQkFBSSxVQUFVLENBQVYsQ0FBSjtBQUNBLGlCQUFLLElBQUksQ0FBVCxJQUFjLENBQWQ7QUFBaUIsb0JBQUksT0FBTyxTQUFQLENBQWlCLGNBQWpCLENBQWdDLElBQWhDLENBQXFDLENBQXJDLEVBQXdDLENBQXhDLENBQUosRUFDYixFQUFFLENBQUYsSUFBTyxFQUFFLENBQUYsQ0FBUDtBQURKO0FBRUg7QUFDRCxlQUFPLENBQVA7QUFDSCxLQVBEO0FBUUEsV0FBTyxTQUFTLEtBQVQsQ0FBZSxJQUFmLEVBQXFCLFNBQXJCLENBQVA7QUFDSCxDQVZEO0FBV0EsSUFBSSxrQkFBbUIsYUFBUSxVQUFLLGVBQWQsSUFBa0MsVUFBVSxHQUFWLEVBQWU7QUFDbkUsV0FBUSxPQUFPLElBQUksVUFBWixHQUEwQixHQUExQixHQUFnQyxFQUFFLFdBQVcsR0FBYixFQUF2QztBQUNILENBRkQ7QUFHQSxPQUFPLGNBQVAsQ0FBc0IsT0FBdEIsRUFBK0IsWUFBL0IsRUFBNkMsRUFBRSxPQUFPLElBQVQsRUFBN0M7QUFDQSxRQUFRLCtCQUFSLEdBQTBDLFFBQVEsNkJBQVIsR0FBd0MsUUFBUSwwQkFBUixHQUFxQyxLQUFLLENBQTVIO0FBQ0EsSUFBSSx3QkFBd0IsZ0JBQWdCLFFBQVEsd0RBQVIsQ0FBaEIsQ0FBNUI7QUFDQSxJQUFJLHFCQUFxQixTQUFyQixrQkFBcUIsQ0FBVSxLQUFWLEVBQWlCO0FBQ3RDLFFBQUksTUFBTSxnQkFBTixJQUNBLE1BQU0sWUFETixJQUVBLE1BQU0sWUFBTixDQUFtQixNQUFuQixHQUE0QixDQUZoQyxFQUVtQztBQUMvQixlQUFPLE1BQU0sWUFBTixDQUFtQixDQUFuQixFQUFzQixFQUE3QjtBQUNILEtBSkQsTUFLSyxJQUFJLE1BQU0seUJBQU4sSUFDTCxNQUFNLHVCQUFOLElBQWlDLFNBRDVCLElBRUwsTUFBTSx1QkFBTixDQUE4QixNQUE5QixHQUF1QyxDQUZ0QyxFQUV5QztBQUMxQyxlQUFPLE1BQU0sdUJBQU4sQ0FBOEIsQ0FBOUIsRUFBaUMsRUFBeEM7QUFDSCxLQUpJLE1BS0EsSUFBSSxNQUFNLE9BQU4sSUFBaUIsU0FBakIsSUFBOEIsTUFBTSxPQUFOLENBQWMsTUFBZCxHQUF1QixDQUF6RCxFQUE0RDtBQUM3RCxlQUFPLE1BQU0sT0FBTixDQUFjLENBQWQsRUFBaUIsRUFBeEI7QUFDSDtBQUNELFdBQU8sU0FBUDtBQUNILENBZkQ7QUFnQkEsSUFBSSxzQkFBc0IsU0FBdEIsbUJBQXNCLENBQVUsWUFBVixFQUF3QixLQUF4QixFQUErQixjQUEvQixFQUErQztBQUNyRSxRQUFJLGVBQWUsU0FBZixDQUF5QiwwQkFBekIsQ0FBSixFQUEwRDtBQUN0RCxZQUFJLGFBQWEsVUFBYixJQUEyQixPQUEzQixJQUNBLGFBQWEsVUFBYixJQUEyQixhQUQzQixJQUVBLGFBQWEsVUFBYixJQUEyQixVQUYzQixJQUdBLGFBQWEsVUFBYixJQUEyQixXQUgzQixJQUlBLGFBQWEsMkJBSmIsSUFLQSxhQUFhLFNBQWIsSUFBMEIsV0FMOUIsRUFLMkM7QUFDdkMseUJBQWEsUUFBYixHQUF3QixtQkFBbUIsS0FBbkIsQ0FBeEI7QUFDSDtBQUNKLEtBVEQsTUFVSyxJQUFJLGFBQWEsVUFBYixJQUEyQixPQUEzQixJQUNMLGFBQWEsVUFBYixJQUEyQixhQUR0QixJQUVMLGFBQWEsMkJBRlIsSUFHTCxhQUFhLFNBQWIsSUFBMEIsV0FIekIsRUFHc0M7QUFDdkMscUJBQWEsUUFBYixHQUF3QixtQkFBbUIsS0FBbkIsQ0FBeEI7QUFDSDtBQUNELFdBQU8sWUFBUDtBQUNILENBbEJEO0FBbUJBLElBQUksK0JBQStCLFNBQS9CLDRCQUErQixDQUFVLGFBQVYsRUFBeUIsa0JBQXpCLEVBQTZDLHNCQUE3QyxFQUFxRTtBQUNwRyxRQUFJLGtCQUFKLEVBQXdCO0FBQ3BCLHNCQUFjLFVBQWQsR0FBMkIsUUFBM0I7QUFDSCxLQUZELE1BR0ssSUFBSSxzQkFBSixFQUE0QjtBQUM3QixzQkFBYyxVQUFkLEdBQTJCLFdBQTNCO0FBQ0gsS0FGSSxNQUdBO0FBQ0Qsc0JBQWMsVUFBZCxHQUEyQixVQUEzQjtBQUNIO0FBQ0QsV0FBTyxhQUFQO0FBQ0gsQ0FYRDtBQVlBLElBQUksOEJBQThCLFNBQTlCLDJCQUE4QixDQUFVLGFBQVYsRUFBeUIsS0FBekIsRUFBZ0Msc0JBQWhDLEVBQXdELFdBQXhELEVBQXFFO0FBQ25HLFFBQUksMEJBQTBCLGNBQWMsVUFBZCxJQUE0QixXQUExRCxFQUF1RTtBQUNuRSxlQUFPLENBQUMsV0FBRCxFQUFjLElBQWQsRUFBb0IsS0FBcEIsQ0FBUDtBQUNILEtBRkQsTUFHSyxJQUFJLE1BQU0sV0FBTixJQUNMLE1BQU0sZ0JBREQsSUFFTCxjQUFjLFVBQWQsSUFBNEIsV0FGdkIsSUFHTCxjQUFjLFVBQWQsSUFBNEIsVUFIdkIsSUFJTCxNQUFNLFlBSkwsRUFJbUI7QUFDcEIsZUFBTyxDQUNILHlCQUF5QixXQUF6QixHQUF1QyxVQURwQyxFQUVILElBRkcsRUFHSCx5QkFBeUIsS0FBekIsR0FBaUMsSUFIOUIsQ0FBUDtBQUtILEtBVkksTUFXQTtBQUNELGVBQU8sQ0FBQyxTQUFELEVBQVksV0FBWixFQUF5QixLQUF6QixDQUFQO0FBQ0g7QUFDSixDQWxCRDtBQW1CQSxJQUFJLDRCQUE0QixTQUE1Qix5QkFBNEIsQ0FBVSxjQUFWLEVBQTBCLEtBQTFCLEVBQWlDLGNBQWpDLEVBQWlEO0FBQzdFLFFBQUksTUFBTSxXQUFWLEVBQXVCO0FBQ25CLHVCQUFlLFFBQWYsR0FBMEIsZUFBMUI7QUFDSDtBQUNELFFBQUksZUFBZSxrQ0FBZixJQUFxRCxNQUFyRCxJQUNBLGVBQWUsU0FBZixJQUE0QixTQURoQyxFQUMyQztBQUN2Qyx1QkFBZSxVQUFmLEdBQTRCLFVBQTVCO0FBQ0EsdUJBQWUsU0FBZixHQUEyQixTQUEzQjtBQUNBLGVBQU8sb0JBQW9CLGNBQXBCLEVBQW9DLEtBQXBDLEVBQTJDLGNBQTNDLENBQVA7QUFDSCxLQUxELE1BTUssSUFBSSxlQUFlLGtDQUFmLElBQXFELFNBQXJELElBQ0wsZUFBZSxrQ0FBZixJQUFxRCxNQURwRCxFQUM0RDtBQUM3RCxlQUFPLG9CQUFvQixjQUFwQixFQUFvQyxLQUFwQyxFQUEyQyxjQUEzQyxDQUFQO0FBQ0g7QUFDRCxRQUFJLFVBQUo7QUFDQSxRQUFJLGVBQWUsVUFBZixJQUE2QixRQUE3QixJQUNBLGVBQWUsU0FBZixJQUE0QixRQURoQyxFQUMwQztBQUN0QyxxQkFBYSxRQUFiO0FBQ0gsS0FIRCxNQUlLLElBQUksZUFBZSxTQUFmLElBQTRCLFNBQTVCLElBQ0osTUFBTSxZQUFOLElBQXNCLENBQUMsTUFBTSxrQkFEN0IsRUFDa0Q7QUFDbkQscUJBQWEsYUFBYjtBQUNIO0FBQ0QsUUFBSSxZQUFZO0FBQ1osb0JBQVksVUFEQTtBQUVaLCtCQUF1QixFQUZYO0FBR1oscUJBQWEsS0FIRDtBQUlaLDBDQUFrQyxLQUp0QjtBQUtaLDRDQUFvQyxlQUFlLGtDQUx2QztBQU1aLDZCQUFxQixLQU5UO0FBT1oscUNBQTZCLEtBUGpCO0FBUVosbUJBQVcsU0FSQztBQVNaLDhCQUFzQixTQVRWO0FBVVosaUNBQXlCLE1BQU07QUFWbkIsS0FBaEI7QUFZQSxRQUFJLE1BQU0sV0FBVixFQUF1QjtBQUNuQixrQkFBVSxRQUFWLEdBQXFCLGVBQXJCO0FBQ0g7QUFDRCxXQUFPLG9CQUFvQixTQUFwQixFQUErQixLQUEvQixFQUFzQyxjQUF0QyxDQUFQO0FBQ0gsQ0F2Q0Q7QUF3Q0EsSUFBSSw2QkFBNkIsU0FBN0IsMEJBQTZCLENBQVUsS0FBVixFQUFpQixNQUFqQixFQUF5QixjQUF6QixFQUF5QyxnQkFBekMsRUFBMkQ7QUFDeEYsUUFBSSxlQUFlLFNBQWYsQ0FBeUIsWUFBekIsQ0FBSixFQUE0QztBQUN4QztBQUNBLFlBQUksQ0FBQyxxQkFBcUIsSUFBckIsSUFBNkIscUJBQXFCLEtBQUssQ0FBdkQsR0FBMkQsS0FBSyxDQUFoRSxHQUFvRSxpQkFBaUIsUUFBakIsQ0FBMEIsT0FBMUIsQ0FBckUsTUFDQyxxQkFBcUIsSUFBckIsSUFBNkIscUJBQXFCLEtBQUssQ0FBdkQsR0FBMkQsS0FBSyxDQUFoRSxHQUFvRSxpQkFBaUIsUUFBakIsQ0FBMEIsTUFBMUIsQ0FEckUsTUFFQyxxQkFBcUIsSUFBckIsSUFBNkIscUJBQXFCLEtBQUssQ0FBdkQsR0FBMkQsS0FBSyxDQUFoRSxHQUFvRSxpQkFBaUIsUUFBakIsQ0FBMEIsUUFBMUIsQ0FGckUsQ0FBSixFQUUrRztBQUMzRyxnQkFBSSxNQUFNLFdBQU4sSUFBcUIsT0FBTyxVQUFQLEtBQXNCLFVBQS9DLEVBQTJEO0FBQ3ZELHVCQUFPLFVBQVAsR0FBb0IsYUFBcEI7QUFDSDtBQUNELGdCQUFJLE9BQU8sU0FBUCxLQUFxQixXQUF6QixFQUFzQztBQUNsQyx1QkFBTyxTQUFQLEdBQW1CLFNBQW5CO0FBQ0g7QUFDRCxnQkFBSSxPQUFPLDJCQUFYLEVBQXdDO0FBQ3BDLHVCQUFPLDJCQUFQLEdBQXFDLEtBQXJDO0FBQ0EsdUJBQU8sMEJBQVAsR0FBb0MsSUFBcEM7QUFDSDtBQUNKO0FBQ0o7QUFDRCxXQUFPLE1BQVA7QUFDSCxDQW5CRDtBQW9CQSxJQUFJLGlDQUFpQyxTQUFqQyw4QkFBaUMsQ0FBVSxjQUFWLEVBQTBCLEtBQTFCLEVBQWlDLEdBQWpDLEVBQXNDLHNCQUF0QyxFQUE4RDtBQUMvRixRQUFJLFNBQVM7QUFDVCxvQkFBWSxTQURIO0FBRVQsK0JBQXVCLEVBRmQ7QUFHVCw2QkFBcUI7QUFIWixLQUFiO0FBS0EsUUFBSSxNQUFNLGdCQUFWLEVBQTRCO0FBQ3hCLFlBQUksTUFBTSxZQUFOLElBQXNCLElBQTFCLEVBQWdDO0FBQzVCLG1CQUFPLE1BQVA7QUFDSDtBQUNELFlBQUksTUFBTSxlQUFOLElBQXlCLE1BQU0sZ0JBQW5DLEVBQXFEO0FBQ2pELG1CQUFPLFVBQVAsR0FBb0IsUUFBcEI7QUFDSCxTQUZELE1BR0ssSUFBSSxlQUFlLFNBQWYsQ0FBeUIsMEJBQXpCLEtBQ0wsTUFBTSxXQURMLEVBQ2tCO0FBQ25CLG1CQUFPLDZCQUE2QixNQUE3QixFQUFxQyxNQUFNLGtCQUEzQyxFQUErRCxzQkFBL0QsQ0FBUDtBQUNILFNBSEksTUFJQSxJQUFJLE1BQU0sV0FBTixJQUNMLENBQUMsR0FESSxJQUVMLGVBQWUsU0FBZixDQUF5QixjQUF6QixDQUZDLEVBRXlDO0FBQzFDLGdCQUFJLE1BQU0sa0JBQVYsRUFBOEI7QUFDMUIsdUJBQU8sVUFBUCxHQUFvQixRQUFwQjtBQUNIO0FBQ0osU0FOSSxNQU9BLElBQUksQ0FBQyxNQUFNLCtCQUFQLElBQ0wsQ0FBQyxNQUFNLHVCQUROLEVBQytCO0FBQ2hDLG1CQUFPLFVBQVAsR0FBb0IsT0FBcEI7QUFDSDtBQUNELGVBQU8sTUFBUDtBQUNIO0FBQ0QsUUFBSSxNQUFNLE9BQVYsRUFBbUI7QUFDZixZQUFJLE1BQU0sZUFBVixFQUEyQjtBQUN2QixtQkFBTyxVQUFQLEdBQW9CLFFBQXBCO0FBQ0gsU0FGRCxNQUdLLElBQUksTUFBTSxtQkFBVixFQUErQjtBQUNoQyxtQkFBTyxtQkFBUCxHQUE2QixJQUE3QjtBQUNILFNBRkksTUFHQSxJQUFJLE1BQU0sa0JBQU4sSUFDTCxlQUFlLFNBQWYsQ0FBeUIsMEJBQXpCLENBREMsRUFDcUQ7QUFDdEQsbUJBQU8sVUFBUCxHQUFvQixRQUFwQjtBQUNILFNBSEksTUFJQSxJQUFJLE1BQU0sK0JBQVYsRUFBMkM7QUFDNUMsbUJBQU8sVUFBUCxHQUFvQixPQUFwQjtBQUNIO0FBQ0QsZUFBTyxNQUFQO0FBQ0g7QUFDRCxRQUFJLGVBQWUsU0FBZixDQUF5QiwwQkFBekIsS0FDQSxNQUFNLFdBRFYsRUFDdUI7QUFDbkIsZUFBTyw2QkFBNkIsTUFBN0IsRUFBcUMsTUFBTSxrQkFBM0MsRUFBK0Qsc0JBQS9ELENBQVA7QUFDSCxLQUhELE1BSUssSUFBSSxNQUFNLFdBQU4sSUFDTCxDQUFDLEdBREksSUFFTCxlQUFlLFNBQWYsQ0FBeUIsY0FBekIsQ0FGQyxFQUV5QztBQUMxQyxZQUFJLE1BQU0sa0JBQVYsRUFBOEI7QUFDMUIsbUJBQU8sVUFBUCxHQUFvQixRQUFwQjtBQUNIO0FBQ0QsZUFBTyxNQUFQO0FBQ0g7QUFDRCxRQUFJLENBQUMsTUFBTSxVQUFQLElBQXFCLENBQUMsTUFBTSx1QkFBaEMsRUFBeUQ7QUFDckQsWUFBSSxNQUFNLGtCQUFOLElBQ0EsZUFBZSxTQUFmLENBQXlCLDBCQUF6QixDQURKLEVBQzBEO0FBQ3RELG1CQUFPLFVBQVAsR0FBb0IsUUFBcEI7QUFDSCxTQUhELE1BSUssSUFBSSxDQUFDLENBQUMsTUFBTSxZQUFSLElBQ0wsTUFBTSxZQUFOLENBQW1CLE1BQW5CLEtBQThCLENBRHpCLElBRUwsTUFBTSx5QkFGRCxJQUdMLENBQUMsTUFBTSwrQkFITixFQUd1QztBQUN4QyxtQkFBTyxVQUFQLEdBQW9CLE9BQXBCO0FBQ0gsU0FMSSxNQU1BLElBQUksQ0FBQyxDQUFDLE1BQU0sWUFBUixJQUF3QixNQUFNLFlBQU4sQ0FBbUIsTUFBbkIsR0FBNEIsQ0FBeEQsRUFBMkQ7QUFDNUQsbUJBQU8sVUFBUCxHQUFvQixVQUFwQjtBQUNBLG1CQUFPLHFCQUFQLEdBQStCLE1BQU0sdUJBQU4sSUFBaUMsRUFBaEU7QUFDSDtBQUNKO0FBQ0QsV0FBTyxNQUFQO0FBQ0gsQ0EzRUQ7QUE0RUEsSUFBSSxvQ0FBb0MsU0FBcEMsaUNBQW9DLENBQVUsY0FBVixFQUEwQixLQUExQixFQUFpQyxzQkFBakMsRUFBeUQ7QUFDN0YsUUFBSSxTQUFTO0FBQ1Qsb0JBQVksU0FESDtBQUVULCtCQUF1QixFQUZkO0FBR1QsNkJBQXFCO0FBSFosS0FBYjtBQUtBLFFBQUksTUFBTSxnQkFBVixFQUE0QjtBQUN4QjtBQUNBLFlBQUksTUFBTSxZQUFOLElBQXNCLElBQTFCLEVBQWdDO0FBQzVCLGdCQUFJLE1BQU0sZUFBTixJQUF5QixNQUFNLGdCQUFuQyxFQUFxRDtBQUNqRCx1QkFBTyxVQUFQLEdBQW9CLFFBQXBCO0FBQ0gsYUFGRCxNQUdLLElBQUksZUFBZSxTQUFmLENBQXlCLDBCQUF6QixLQUNMLE1BQU0sV0FETCxFQUNrQjtBQUNuQix1QkFBTyw2QkFBNkIsTUFBN0IsRUFBcUMsTUFBTSxrQkFBM0MsRUFBK0Qsc0JBQS9ELENBQVA7QUFDSCxhQUhJLE1BSUEsSUFBSSxNQUFNLFdBQVYsRUFBdUI7QUFDeEIsb0JBQUksTUFBTSxrQkFBVixFQUE4QjtBQUMxQiwyQkFBTyxVQUFQLEdBQW9CLFFBQXBCO0FBQ0g7QUFDSixhQUpJLE1BS0EsSUFBSSxDQUFDLE1BQU0sK0JBQVAsSUFDTCxDQUFDLE1BQU0sdUJBRE4sRUFDK0I7QUFDaEMsdUJBQU8sVUFBUCxHQUFvQixVQUFwQjtBQUNBLHVCQUFPLHFCQUFQLEdBQStCLE1BQU0sWUFBTixJQUFzQixFQUFyRDtBQUNIO0FBQ0o7QUFDRCxlQUFPLE1BQVA7QUFDSDtBQUNELFFBQUksTUFBTSxPQUFWLEVBQW1CO0FBQ2YsWUFBSSxNQUFNLGVBQVYsRUFBMkI7QUFDdkIsbUJBQU8sVUFBUCxHQUFvQixRQUFwQjtBQUNILFNBRkQsTUFHSyxJQUFJLE1BQU0sa0JBQU4sSUFDTCxlQUFlLFNBQWYsQ0FBeUIsMEJBQXpCLENBREMsRUFDcUQ7QUFDdEQsbUJBQU8sVUFBUCxHQUFvQixRQUFwQjtBQUNILFNBSEksTUFJQSxJQUFJLE1BQU0sK0JBQVYsRUFBMkM7QUFDNUMsbUJBQU8sVUFBUCxHQUFvQixVQUFwQjtBQUNIO0FBQ0QsZUFBTyxNQUFQO0FBQ0g7QUFDRCxRQUFJLGVBQWUsU0FBZixDQUF5QiwwQkFBekIsS0FDQSxNQUFNLFdBRFYsRUFDdUI7QUFDbkIsZUFBTyw2QkFBNkIsTUFBN0IsRUFBcUMsTUFBTSxrQkFBM0MsRUFBK0Qsc0JBQS9ELENBQVA7QUFDSCxLQUhELE1BSUssSUFBSSxNQUFNLFdBQU4sSUFBcUIsTUFBTSxrQkFBL0IsRUFBbUQ7QUFDcEQsWUFBSSxNQUFNLGtCQUFWLEVBQThCO0FBQzFCLG1CQUFPLFVBQVAsR0FBb0IsUUFBcEI7QUFDSDtBQUNELGVBQU8sTUFBUDtBQUNIO0FBQ0QsUUFBSSxFQUFFLE1BQU0sWUFBTixJQUFzQixDQUFDLE1BQU0sa0JBQS9CLEtBQ0EsQ0FBQyxNQUFNLFVBRFAsSUFFQSxDQUFDLE1BQU0sdUJBRlgsRUFFb0M7QUFDaEMsWUFBSSxDQUFDLENBQUMsTUFBTSxZQUFSLElBQ0EsTUFBTSxZQUFOLENBQW1CLE1BQW5CLEtBQThCLENBRDlCLElBRUEsTUFBTSx5QkFGTixJQUdBLENBQUMsTUFBTSwrQkFIWCxFQUc0QztBQUN4QyxtQkFBTyxVQUFQLEdBQW9CLFVBQXBCO0FBQ0gsU0FMRCxNQU1LLElBQUksQ0FBQyxDQUFDLE1BQU0sWUFBUixJQUF3QixNQUFNLFlBQU4sQ0FBbUIsTUFBbkIsR0FBNEIsQ0FBeEQsRUFBMkQ7QUFDNUQsbUJBQU8sVUFBUCxHQUFvQixVQUFwQjtBQUNBLG1CQUFPLHFCQUFQLEdBQStCLE1BQU0sdUJBQU4sSUFBaUMsRUFBaEU7QUFDSDtBQUNKO0FBQ0QsV0FBTyxNQUFQO0FBQ0gsQ0FuRUQ7QUFvRUEsSUFBSSxzQ0FBc0MsU0FBdEMsbUNBQXNDLENBQVUsY0FBVixFQUEwQixLQUExQixFQUFpQyxNQUFqQyxFQUF5QyxzQkFBekMsRUFBaUUsS0FBakUsRUFBd0UsdUJBQXhFLEVBQWlHO0FBQ3ZJLFFBQUksU0FBUztBQUNULG9CQUFZLFNBREg7QUFFVCwrQkFBdUIsRUFGZDtBQUdULDBCQUFrQixLQUhUO0FBSVQsNkJBQXFCO0FBSlosS0FBYjtBQU1BO0FBQ0EsUUFBSSxNQUFNLGdCQUFOLElBQ0EsQ0FBQyxlQUFlLFNBQWYsQ0FBeUIsMEJBQXpCLENBREwsRUFDMkQ7QUFDdkQsWUFBSSxNQUFNLFlBQU4sSUFDQSxNQUFNLFlBQU4sQ0FBbUIsQ0FBbkIsRUFBc0IsRUFBdEIsS0FBNkIsa0JBRGpDLEVBQ3FEO0FBQ2pELG1CQUFPLFVBQVAsR0FBb0IsUUFBcEI7QUFDSCxTQUhELE1BSUssSUFBSSxzQkFBSixFQUE0QjtBQUM3QixnQkFBSSxNQUFNLGtCQUFWLEVBQThCO0FBQzFCLHVCQUFPLFVBQVAsR0FBb0IsUUFBcEI7QUFDSDtBQUNKLFNBSkksTUFLQSxJQUFJLENBQUMsZUFBZSxTQUFmLENBQXlCLHVCQUF6QixDQUFELElBQ0wsTUFBTSx5QkFETCxFQUNnQztBQUNqQyxtQkFBTyxVQUFQLEdBQW9CLE9BQXBCO0FBQ0g7QUFDRCxlQUFPLE1BQVA7QUFDSDtBQUNELFFBQUksTUFBTSxPQUFWLEVBQW1CO0FBQ2YsWUFBSSxNQUFNLGVBQVYsRUFBMkI7QUFDdkIsbUJBQU8sVUFBUCxHQUFvQixRQUFwQjtBQUNILFNBRkQsTUFHSyxJQUFJLE1BQU0sbUJBQVYsRUFBK0I7QUFDaEMsbUJBQU8sbUJBQVAsR0FBNkIsSUFBN0I7QUFDSCxTQUZJLE1BR0EsSUFBSSxNQUFNLGtCQUFOLElBQ0wsZUFBZSxTQUFmLENBQXlCLDBCQUF6QixDQURDLEVBQ3FEO0FBQ3RELG1CQUFPLFVBQVAsR0FBb0IsUUFBcEI7QUFDSCxTQUhJLE1BSUEsSUFBSSxNQUFNLCtCQUFWLEVBQTJDO0FBQzVDLG1CQUFPLFVBQVAsR0FBb0IsVUFBcEI7QUFDSDtBQUNELGVBQU8sTUFBUDtBQUNIO0FBQ0QsUUFBSSxNQUFNLFdBQVYsRUFBdUI7QUFDbkIsWUFBSSxVQUFVLE1BQU0sWUFBcEIsRUFBa0M7QUFDOUI7QUFDQSxnQkFBSSxDQUFDLENBQUMsTUFBTSxZQUFaLEVBQTBCO0FBQ3RCLHNCQUFNLFlBQU4sQ0FBbUIsSUFBbkIsQ0FBd0I7QUFDcEIsMEJBQU0sZUFEYztBQUVwQix3QkFBSTtBQUZnQixpQkFBeEI7QUFJSDtBQUNKO0FBQ0QsWUFBSSxlQUFlLFNBQWYsQ0FBeUIsMEJBQXpCLENBQUosRUFBMEQ7QUFDdEQsbUJBQU8sNkJBQTZCLE1BQTdCLEVBQXFDLE1BQU0sa0JBQTNDLEVBQStELHNCQUEvRCxDQUFQO0FBQ0gsU0FGRCxNQUdLLElBQUksc0JBQUosRUFBNEI7QUFDN0IsZ0JBQUksTUFBTSxrQkFBVixFQUE4QjtBQUMxQix1QkFBTyxVQUFQLEdBQW9CLFFBQXBCO0FBQ0g7QUFDSixTQUpJLE1BS0EsSUFBSSxNQUFNLGtCQUFOLElBQ0wsZUFBZSxTQUFmLENBQXlCLDBCQUF6QixDQURDLEVBQ3FEO0FBQ3RELG1CQUFPLFVBQVAsR0FBb0IsUUFBcEI7QUFDSCxTQUhJLE1BSUEsSUFBSSxDQUFDLE1BQU0sdUJBQVgsRUFBb0M7QUFDckMsbUJBQU8sVUFBUCxHQUFvQixVQUFwQjtBQUNIO0FBQ0QsZUFBTyxNQUFQO0FBQ0g7QUFDRCxRQUFJLENBQUMsTUFBTSxVQUFYLEVBQXVCO0FBQ25CLFlBQUksQ0FBQyxDQUFDLE1BQU0sWUFBUixLQUNDLE1BQU0sWUFBTixDQUFtQixNQUFuQixLQUE4QixDQUE5QixJQUNJLE1BQU0sWUFBTixDQUFtQixNQUFuQixLQUE4QixDQUE5QixJQUFtQyxLQUZ4QyxLQUdBLENBQUMsdUJBSEwsRUFHOEI7QUFDMUIsbUJBQU8sVUFBUCxHQUFvQixVQUFwQjtBQUNILFNBTEQsTUFNSyxJQUFJLENBQUMsQ0FBQyxNQUFNLFlBQVIsSUFBd0IsTUFBTSxZQUFOLENBQW1CLE1BQW5CLEdBQTRCLENBQXhELEVBQTJEO0FBQzVELG1CQUFPLGdCQUFQLEdBQTBCLElBQTFCO0FBQ0EsbUJBQU8scUJBQVAsR0FBK0IsTUFBTSx1QkFBTixJQUFpQyxFQUFoRTtBQUNIO0FBQ0o7QUFDRCxXQUFPLE1BQVA7QUFDSCxDQWpGRDtBQWtGQSxJQUFJLGdDQUFnQyxTQUFoQyw2QkFBZ0MsQ0FBVSxNQUFWLEVBQWtCO0FBQ2xELFdBQVEsV0FBVyxXQUFYLElBQTBCLFdBQVcsUUFBckMsSUFBaUQsV0FBVyxTQUFwRTtBQUNILENBRkQ7QUFHQSxJQUFJLDRCQUE0QixTQUE1Qix5QkFBNEIsQ0FBVSxNQUFWLEVBQWtCO0FBQzlDLFFBQUksV0FBVyxTQUFmLEVBQ0ksT0FBTyxJQUFQO0FBQ0osUUFBSSxjQUFjLE9BQU8sS0FBUCxDQUFhLEdBQWIsQ0FBbEI7QUFDQSxXQUFPLE9BQU8sT0FBUCxDQUFlLE9BQWYsSUFBMEIsQ0FBQyxDQUEzQixJQUFnQyxZQUFZLE1BQVosSUFBc0IsQ0FBdEQsR0FDRCxDQUFDLE1BQUQsRUFBUyxPQUFULEVBQWtCLFFBQWxCLEVBQTRCLFFBQTVCLENBQXFDLFlBQVksQ0FBWixDQUFyQyxDQURDLEdBRUQsSUFGTjtBQUdILENBUEQ7QUFRQSxJQUFJLHlCQUF5QixTQUF6QixzQkFBeUIsQ0FBVSxLQUFWLEVBQWlCLGNBQWpCLEVBQWlDLGFBQWpDLEVBQWdEO0FBQ3pFLFFBQUksY0FBYyxnQkFBbEIsRUFBb0M7QUFDaEMsc0JBQWMscUJBQWQsR0FDSSxNQUFNLDhCQUFOLElBQXdDLEVBRDVDO0FBRUEsc0JBQWMsZ0JBQWQsR0FDSSxjQUFjLHFCQUFkLENBQW9DLE1BQXBDLEdBQTZDLENBRGpEO0FBRUg7QUFDRCxRQUFJLGNBQWMsZ0NBQWxCLEVBQW9EO0FBQ2hELHNCQUFjLG9CQUFkLEdBQ0ksTUFBTSw4QkFBTixJQUF3QyxFQUQ1QztBQUVBLHNCQUFjLGdDQUFkLEdBQ0ksY0FBYyxvQkFBZCxDQUFtQyxNQUFuQyxHQUE0QyxDQURoRDtBQUVIO0FBQ0Qsa0JBQWMsMkJBQWQsR0FDSSxjQUFjLDJCQUFkLEdBQ00sQ0FBQywwQkFBMEIsbUJBQW1CLEtBQW5CLENBQTFCLENBRFAsR0FFTSxLQUhWO0FBSUEsUUFBSSw4QkFBOEIsY0FBYyxVQUE1QyxLQUNBLGNBQWMsVUFBZCxLQUE2QixTQUQ3QixJQUVDLGNBQWMsVUFBZCxLQUE2QixRQUE3QixJQUF5QyxNQUFNLFdBRmhELElBR0MsQ0FBQyxjQUFjLFVBQWQsS0FBNkIsT0FBN0IsSUFDRSxjQUFjLFVBQWQsS0FBNkIsVUFEaEMsS0FFRywwQkFBMEIsbUJBQW1CLEtBQW5CLENBQTFCLENBTFIsRUFLK0Q7QUFDM0QsWUFBSSxjQUFjLFNBQWQsS0FBNEIsUUFBaEMsRUFBMEM7QUFDdEMsMEJBQWMsVUFBZCxHQUEyQixRQUEzQjtBQUNBLDBCQUFjLFNBQWQsR0FBMEIsU0FBMUI7QUFDSCxTQUhELE1BSUssSUFBSSxjQUFjLDJCQUFsQixFQUErQztBQUNoRCwwQkFBYyxVQUFkLElBQTRCLFVBQTVCO0FBQ0EsMEJBQWMsU0FBZCxHQUEwQixTQUExQjtBQUNBLDBCQUFjLDJCQUFkLEdBQTRDLEtBQTVDO0FBQ0gsU0FKSSxNQUtBLElBQUksY0FBYyxnQ0FBbEIsRUFBb0Q7QUFDckQsMEJBQWMsVUFBZCxHQUEyQixjQUFjLFNBQWQsR0FBMEIsU0FBckQ7QUFDQSwwQkFBYyxXQUFkLEdBQTRCLEtBQTVCO0FBQ0gsU0FISSxNQUlBO0FBQ0QsMEJBQWMsVUFBZCxHQUEyQixhQUEzQjtBQUNIO0FBQ0osS0F0QkQsTUF1QkssSUFBSSxjQUFjLFNBQWQsSUFBMkIsU0FBM0IsSUFDTCw4QkFBOEIsY0FBYyxTQUE1QyxDQURDLEVBQ3VEO0FBQ3hELHNCQUFjLFNBQWQsR0FBMEIsU0FBMUI7QUFDSDtBQUNELGtCQUFjLFdBQWQsR0FDSSxjQUFjLDJCQUFkLElBQ0ksY0FBYyxnQ0FGdEI7QUFHQSxXQUFPLGFBQVA7QUFDSCxDQWhERDtBQWlEQTs7Ozs7OztBQU9BLElBQUksNkJBQTZCLFNBQTdCLDBCQUE2QixDQUFVLGNBQVYsRUFBMEIsS0FBMUIsRUFBaUMsT0FBakMsRUFBMEM7QUFDdkUsUUFBSSxFQUFKO0FBQ0EsUUFBSSx5QkFBeUIsQ0FBQyxRQUFRLEdBQVQsSUFDekIsTUFBTSxXQURtQixLQUV4QixlQUFlLFNBQWYsQ0FBeUIsb0JBQXpCLEtBQ0csZUFBZSxTQUFmLENBQXlCLGNBQXpCLENBSHFCLENBQTdCO0FBSUEsUUFBSSxtQkFBbUIsK0JBQStCLGNBQS9CLEVBQStDLEtBQS9DLEVBQXNELFFBQVEsR0FBOUQsRUFBbUUsc0JBQW5FLENBQXZCO0FBQ0EsUUFBSSxTQUFKO0FBQ0EsUUFBSSxjQUFjLE1BQU0sV0FBeEI7QUFDQSxRQUFJLDhCQUE4QixLQUFsQztBQUNBLFFBQUksZUFBZSxTQUFmLENBQXlCLDBCQUF6QixDQUFKLEVBQTBEO0FBQ3RELFlBQUksTUFBTSxrQkFBTixJQUNBLGlCQUFpQixVQUFqQixJQUErQixRQURuQyxFQUM2QztBQUN6Qyx3QkFBWSxRQUFaO0FBQ0gsU0FIRCxNQUlLLElBQUksTUFBTSxXQUFWLEVBQXVCO0FBQ3hCLGlCQUFLLDRCQUE0QixnQkFBNUIsRUFBOEMsS0FBOUMsRUFBcUQsc0JBQXJELEVBQTZFLFdBQTdFLENBQUwsRUFBZ0csWUFBWSxHQUFHLENBQUgsQ0FBNUcsRUFBbUgsY0FBYyxHQUFHLENBQUgsQ0FBakksRUFBd0ksOEJBQThCLEdBQUcsQ0FBSCxDQUF0SztBQUNIO0FBQ0osS0FSRCxNQVNLO0FBQ0QsWUFBSSxNQUFNLFdBQU4sSUFDQSxDQUFDLFFBQVEsR0FEVCxJQUVBLGVBQWUsU0FBZixDQUF5QixjQUF6QixDQUZKLEVBRThDO0FBQzFDLHdCQUFZLFdBQVo7QUFDSCxTQUpELE1BS0ssSUFBSSxNQUFNLGtCQUFOLElBQ0wsaUJBQWlCLFVBQWpCLElBQStCLFFBRDlCLEVBQ3dDO0FBQ3pDLHdCQUFZLFFBQVo7QUFDSDtBQUNKO0FBQ0QsUUFBSSxtQ0FBbUMsS0FBdkM7QUFDQSxRQUFJLHVCQUF1QixFQUEzQjtBQUNBLFFBQUksTUFBTSwrQkFBTixJQUF5QyxhQUFhLFdBQTFELEVBQXVFO0FBQ25FLHNDQUE4QixJQUE5QjtBQUNILEtBRkQsTUFHSyxJQUFJLE1BQU0sb0JBQVYsRUFBZ0M7QUFDakMsMkNBQW1DLElBQW5DO0FBQ0EsK0JBQXVCLE1BQU0sdUJBQU4sSUFBaUMsRUFBeEQ7QUFDSDtBQUNELFFBQUksUUFBUSxjQUFaLEVBQTRCO0FBQ3hCLFlBQUksWUFBWSx1QkFBdUIsS0FBdkIsRUFBOEIsY0FBOUIsRUFBOEM7QUFDMUQsd0JBQVksaUJBQWlCLFVBRDZCO0FBRTFELDhCQUFrQixpQkFBaUIsZ0JBRnVCO0FBRzFELG1DQUF1QixpQkFBaUIscUJBSGtCO0FBSTFELHlCQUFhLFdBSjZDO0FBSzFELDhDQUFrQyxnQ0FMd0I7QUFNMUQseUNBQTZCLDJCQU42QjtBQU8xRCx1QkFBVyxTQVArQztBQVExRCxrQ0FBc0I7QUFSb0MsU0FBOUMsQ0FBaEI7QUFVQSx5QkFBaUIsVUFBakIsR0FBOEIsVUFBVSxVQUF4QztBQUNBLG9CQUFZLFVBQVUsU0FBdEI7QUFDQSxzQkFBYyxVQUFVLFdBQXhCO0FBQ0EsMkNBQ0ksVUFBVSxnQ0FEZDtBQUVBLCtCQUF1QixVQUFVLG9CQUFWLElBQWtDLEVBQXpEO0FBQ0Esc0NBQThCLFVBQVUsMkJBQXhDO0FBQ0EseUJBQWlCLHFCQUFqQixHQUNJLFVBQVUscUJBQVYsSUFBbUMsRUFEdkM7QUFFQSx5QkFBaUIsZ0JBQWpCLEdBQW9DLFVBQVUsZ0JBQTlDO0FBQ0g7QUFDRCxRQUFJLGtDQUFKO0FBQ0EsUUFBSSxNQUFNLEtBQU4sSUFDQSxNQUFNLFdBRE4sSUFFQSxlQUFlLFNBQWYsQ0FBeUIseUJBQXpCLENBRkEsSUFHQSxDQUFDLFFBQVEsS0FIYixFQUdvQjtBQUNoQiw2Q0FBcUMsQ0FBQyxNQUFNLGdCQUFQLEdBQy9CLFVBRCtCLEdBRS9CLE1BRk47QUFHSDtBQUNELFFBQUksaUJBQWlCLDBCQUEwQjtBQUMzQyxvQkFBWSxpQkFBaUIsVUFEYztBQUUzQywrQkFBdUIsaUJBQWlCLHFCQUZHO0FBRzNDLHFCQUFhLFdBSDhCO0FBSTNDLDBDQUFrQyxnQ0FKUztBQUszQyw0Q0FBb0Msa0NBTE87QUFNM0MsNkJBQXFCLGlCQUFpQixtQkFOSztBQU8zQyxxQ0FBNkIsMkJBUGM7QUFRM0MsbUJBQVcsU0FSZ0M7QUFTM0MsOEJBQXNCLG9CQVRxQjtBQVUzQyxpQ0FBeUIsdUNBQXVDO0FBVnJCLEtBQTFCLEVBV2xCLEtBWGtCLEVBV1gsY0FYVyxDQUFyQjtBQVlBLFFBQUksTUFBTSxXQUFOLElBQ0EsZUFBZSxVQUFmLEtBQThCLFFBRDlCLElBRUEsZUFBZSxTQUFmLEtBQTZCLFdBRjdCLElBR0EsTUFBTSx5QkFITixJQUlBLENBQUMsZUFBZSxTQUFmLENBQXlCLGNBQXpCLENBSkwsRUFJK0M7QUFDM0MsdUJBQWUsV0FBZixHQUE2QixLQUE3QjtBQUNBLHVCQUFlLDJCQUFmLEdBQTZDLEtBQTdDO0FBQ0g7QUFDRCxRQUFJLHVCQUF1QixNQUFNLFdBQU4sSUFDdkIsZUFBZSxTQUFmLENBQXlCLGlCQUF6QixDQUR1QixJQUV2QixDQUFDLFFBQVEsS0FGYjtBQUdBLFFBQUksd0JBQXdCLGVBQWUsU0FBZixDQUF5QixvQkFBekIsS0FDeEIsZUFBZSxTQUFmLENBQXlCLHlCQUF6QixDQURKO0FBRUEsUUFBSSx5QkFDQyx5QkFBeUIsZUFBZSxTQUFmLEtBQTZCLFNBRHZELENBQUosRUFDdUU7QUFDbkUsdUJBQWUsV0FBZixHQUE2QixLQUE3QjtBQUNBLHVCQUFlLDJCQUFmLEdBQTZDLEtBQTdDO0FBQ0g7QUFDRCxRQUFJLE1BQU0sV0FBTixJQUNBLGVBQWUsU0FBZixLQUE2QixTQUQ3QixJQUVBLENBQUMsUUFBUSxLQUZiLEVBRW9CO0FBQ2hCLHVCQUFlLDJCQUFmLEdBQTZDLEtBQTdDO0FBQ0g7QUFDRCxtQkFBZSx1QkFBZixHQUNJLE1BQU0sK0JBRFY7QUFFQSxXQUFPLGNBQVA7QUFDSCxDQTVHRDtBQTZHQSxRQUFRLDBCQUFSLEdBQXFDLDBCQUFyQztBQUNBLElBQUksZ0NBQWdDLFNBQWhDLDZCQUFnQyxDQUFVLGNBQVYsRUFBMEIsS0FBMUIsRUFBaUMsT0FBakMsRUFBMEM7QUFDMUUsUUFBSSxFQUFKO0FBQ0EsUUFBSSx5QkFBeUIsQ0FBQyxRQUFRLEtBQVQsSUFDekIsTUFBTSxXQURtQixLQUV4QixlQUFlLFNBQWYsQ0FBeUIsb0JBQXpCLEtBQ0csZUFBZSxTQUFmLENBQXlCLGNBQXpCLENBSHFCLENBQTdCO0FBSUEsUUFBSSxtQkFBbUIsa0NBQWtDLGNBQWxDLEVBQWtELEtBQWxELEVBQXlELHNCQUF6RCxDQUF2QjtBQUNBLFFBQUksU0FBSjtBQUNBLFFBQUksY0FBYyxNQUFNLFdBQXhCO0FBQ0EsUUFBSSw4QkFBOEIsS0FBbEM7QUFDQSxRQUFJLGVBQWUsU0FBZixDQUF5QiwwQkFBekIsQ0FBSixFQUEwRDtBQUN0RCxZQUFJLE1BQU0sa0JBQU4sSUFDQSxpQkFBaUIsVUFBakIsSUFBK0IsUUFEbkMsRUFDNkM7QUFDekMsd0JBQVksUUFBWjtBQUNILFNBSEQsTUFJSyxJQUFJLGlCQUFpQixVQUFqQixJQUErQixXQUEvQixJQUNMLFFBQVEsT0FBUixLQUFvQixXQURmLElBRUwsQ0FBQyxRQUFRLEtBRlIsRUFFZTtBQUNoQiw2QkFBaUIsVUFBakIsR0FBOEIsU0FBOUI7QUFDQSx3QkFBWSxTQUFaO0FBQ0gsU0FMSSxNQU1BLElBQUksTUFBTSxXQUFWLEVBQXVCO0FBQ3hCLGlCQUFLLDRCQUE0QixnQkFBNUIsRUFBOEMsS0FBOUMsRUFBcUQsc0JBQXJELEVBQTZFLFdBQTdFLENBQUwsRUFBZ0csWUFBWSxHQUFHLENBQUgsQ0FBNUcsRUFBbUgsY0FBYyxHQUFHLENBQUgsQ0FBakksRUFBd0ksOEJBQThCLEdBQUcsQ0FBSCxDQUF0SztBQUNIO0FBQ0osS0FkRCxNQWVLO0FBQ0QsWUFBSSxNQUFNLFdBQVYsRUFBdUI7QUFDbkIsZ0JBQUksUUFBUSxXQUFSLEtBQ0MsaUNBQThCLEtBQTlCLENBQW9DLE9BQXBDLENBQTRDLFFBQVEsV0FBcEQsSUFBbUUsQ0FBQyxDQUFwRSxJQUNHLFFBQVEsV0FBUixLQUF3QixJQUY1QixDQUFKLEVBRXVDO0FBQ25DLDRCQUFZLFVBQVo7QUFDSCxhQUpELE1BS0s7QUFDRCxvQkFBSSxNQUFNLFlBQU4sSUFDQSxDQUFDLE1BQU0sa0JBRFAsSUFFQSxRQUFRLE9BQVIsS0FBb0IsV0FGeEIsRUFFcUM7QUFDakMsZ0NBQVksU0FBWjtBQUNILGlCQUpELE1BS0ssSUFBSSxRQUFRLE9BQVIsS0FBb0IsV0FBcEIsSUFDTCxRQUFRLE9BQVIsS0FBb0IsTUFEbkIsRUFDMkI7QUFDNUIsZ0NBQVksV0FBWjtBQUNILGlCQUhJLE1BSUEsSUFBSSxRQUFRLE9BQVIsS0FBb0IsTUFBeEIsRUFBZ0M7QUFDakMsZ0NBQVksVUFBWjtBQUNIO0FBQ0o7QUFDSixTQXBCRCxNQXFCSyxJQUFJLE1BQU0sa0JBQU4sSUFDTCxpQkFBaUIsVUFBakIsSUFBK0IsUUFEOUIsRUFDd0M7QUFDekMsd0JBQVksUUFBWjtBQUNIO0FBQ0o7QUFDRCxRQUFJLGtDQUFKO0FBQ0EsUUFBSSxNQUFNLEtBQU4sSUFDQSxNQUFNLFdBRE4sSUFFQSxlQUFlLFNBQWYsQ0FBeUIseUJBQXpCLENBRkEsSUFHQSxDQUFDLFFBQVEsS0FIYixFQUdvQjtBQUNoQiw2Q0FBcUMsQ0FBQyxNQUFNLGdCQUFQLEdBQy9CLFVBRCtCLEdBRS9CLE1BRk47QUFHSDtBQUNELFFBQUksbUNBQW1DLEtBQXZDO0FBQ0EsUUFBSSx1QkFBdUIsRUFBM0I7QUFDQSxRQUFJLE1BQU0sK0JBQU4sSUFBeUMsYUFBYSxXQUExRCxFQUF1RTtBQUNuRSxzQ0FBOEIsSUFBOUI7QUFDSCxLQUZELE1BR0ssSUFBSSxNQUFNLG9CQUFWLEVBQWdDO0FBQ2pDLDJDQUFtQyxJQUFuQztBQUNBLCtCQUF1QixNQUFNLHVCQUFOLElBQWlDLEVBQXhEO0FBQ0g7QUFDRCxRQUFJLFFBQVEsY0FBWixFQUE0QjtBQUN4QixZQUFJLFlBQVksdUJBQXVCLEtBQXZCLEVBQThCLGNBQTlCLEVBQThDO0FBQzFELHdCQUFZLGlCQUFpQixVQUQ2QjtBQUUxRCw4QkFBa0IsaUJBQWlCLGdCQUZ1QjtBQUcxRCxtQ0FBdUIsaUJBQWlCLHFCQUhrQjtBQUkxRCx5QkFBYSxXQUo2QztBQUsxRCw4Q0FBa0MsZ0NBTHdCO0FBTTFELHlDQUE2QiwyQkFONkI7QUFPMUQsdUJBQVcsU0FQK0M7QUFRMUQsa0NBQXNCO0FBUm9DLFNBQTlDLENBQWhCO0FBVUEseUJBQWlCLFVBQWpCLEdBQThCLFVBQVUsVUFBeEM7QUFDQSxvQkFBWSxVQUFVLFNBQXRCO0FBQ0Esc0JBQWMsVUFBVSxXQUF4QjtBQUNBLDJDQUNJLFVBQVUsZ0NBRGQ7QUFFQSwrQkFBdUIsVUFBVSxvQkFBVixJQUFrQyxFQUF6RDtBQUNBLHNDQUE4QixVQUFVLDJCQUF4QztBQUNBLHlCQUFpQixxQkFBakIsR0FDSSxVQUFVLHFCQUFWLElBQW1DLEVBRHZDO0FBRUEseUJBQWlCLGdCQUFqQixHQUFvQyxVQUFVLGdCQUE5QztBQUNIO0FBQ0QsUUFBSSxpQkFBaUIsMEJBQTBCO0FBQzNDLG9CQUFZLGlCQUFpQixVQURjO0FBRTNDLCtCQUF1QixpQkFBaUIscUJBRkc7QUFHM0MscUJBQWEsV0FIOEI7QUFJM0MsMENBQWtDLGdDQUpTO0FBSzNDLDRDQUFvQyxrQ0FMTztBQU0zQyw2QkFBcUIsaUJBQWlCLG1CQU5LO0FBTzNDLHFDQUE2QiwyQkFQYztBQVEzQyxtQkFBVyxTQVJnQztBQVMzQyw4QkFBc0Isb0JBVHFCO0FBVTNDLGlDQUF5Qix1Q0FBdUM7QUFWckIsS0FBMUIsRUFXbEIsS0FYa0IsRUFXWCxjQVhXLENBQXJCO0FBWUEsUUFBSSxzQkFBc0IsMkJBQTJCLEtBQTNCLEVBQWtDLGNBQWxDLEVBQWtELGNBQWxELEVBQWtFLFFBQVEsZ0JBQTFFLENBQTFCO0FBQ0EsV0FBTyxtQkFBUDtBQUNILENBMUdEO0FBMkdBLFFBQVEsNkJBQVIsR0FBd0MsNkJBQXhDO0FBQ0EsSUFBSSxrQ0FBa0MsU0FBbEMsK0JBQWtDLENBQVUsY0FBVixFQUEwQixLQUExQixFQUFpQyxPQUFqQyxFQUEwQztBQUM1RSxRQUFJLEVBQUo7QUFDQSxRQUFJLEVBQUo7QUFDQSxRQUFJLFNBQVMsZUFBZSxTQUFmLENBQXlCLDZCQUF6QixLQUNULFFBQVEsZUFEWjtBQUVBLFFBQUksOEJBQThCLFVBQzlCLENBQUMsQ0FBQyxNQUFNLGlCQURzQixJQUU5QixNQUFNLGlCQUFOLENBQXdCLE1BQXhCLEtBQW1DLENBRkwsSUFHOUIsTUFBTSxpQkFBTixDQUF3QixDQUF4QixFQUEyQixFQUEzQixLQUFrQyxlQUh0QztBQUlBLFFBQUksb0JBQW9CLFVBQVUsTUFBTSxZQUF4QztBQUNBLFFBQUkseUJBQXlCLENBQUMsUUFBUSxLQUFULElBQ3pCLE1BQU0sV0FEbUIsS0FFeEIsZUFBZSxTQUFmLENBQXlCLG9CQUF6QixLQUNHLGVBQWUsU0FBZixDQUF5QixjQUF6QixDQUhxQixDQUE3QjtBQUlBLFFBQUksbUJBQW1CLG9DQUFvQyxjQUFwQyxFQUFvRCxLQUFwRCxFQUEyRCxNQUEzRCxFQUFtRSxzQkFBbkUsRUFBMkYsUUFBUSxLQUFuRyxFQUEwRyxRQUFRLHVCQUFsSCxDQUF2QjtBQUNBLFFBQUksY0FBYyxDQUFDLFFBQVEsdUJBQVQsSUFDZCxNQUFNLFdBRFEsSUFFZCxDQUFDLFFBQVEsVUFGYjtBQUdBLFFBQUksU0FBSjtBQUNBLFFBQUksOEJBQThCLEtBQWxDO0FBQ0EsUUFBSSxlQUFlLFNBQWYsQ0FBeUIsMEJBQXpCLENBQUosRUFBMEQ7QUFDdEQsWUFBSSxNQUFNLGtCQUFOLElBQ0EsQ0FBQyxRQUFRLFVBRFQsSUFFQSxDQUFDLGlCQUZELElBR0EsQ0FBQyxzQkFIRCxJQUlBLGlCQUFpQixVQUFqQixJQUErQixRQUpuQyxFQUk2QztBQUN6Qyx3QkFBWSxRQUFaO0FBQ0gsU0FORCxNQU9LLElBQUksTUFBTSxXQUFWLEVBQXVCO0FBQ3hCLGlCQUFLLDRCQUE0QixnQkFBNUIsRUFBOEMsS0FBOUMsRUFBcUQsc0JBQXJELEVBQTZFLFdBQTdFLENBQUwsRUFBZ0csWUFBWSxHQUFHLENBQUgsQ0FBNUcsRUFBbUgsY0FBYyxHQUFHLENBQUgsQ0FBakksRUFBd0ksOEJBQThCLEdBQUcsQ0FBSCxDQUF0SztBQUNIO0FBQ0osS0FYRCxNQVlLO0FBQ0QsWUFBSSxNQUFNLGtCQUFOLElBQ0EsQ0FBQyxRQUFRLFVBRFQsSUFFQSxDQUFDLGlCQUZELElBR0EsQ0FBQyxzQkFIRCxJQUlBLGlCQUFpQixVQUFqQixJQUErQixRQUpuQyxFQUk2QztBQUN6Qyx3QkFBWSxRQUFaO0FBQ0gsU0FORCxNQU9LLElBQUksc0JBQUosRUFBNEI7QUFDN0Isd0JBQVksV0FBWjtBQUNIO0FBQ0o7QUFDRCxRQUFJLE1BQU0sK0JBQU4sSUFBeUMsYUFBYSxXQUExRCxFQUF1RTtBQUNuRSxzQ0FBOEIsSUFBOUI7QUFDSDtBQUNELFFBQUksbUNBQW1DLENBQUMsTUFBTSwrQkFBUCxJQUEwQyxNQUFNLG9CQUF2RjtBQUNBLFFBQUksUUFBUSxjQUFaLEVBQTRCO0FBQ3hCLFlBQUksWUFBWSx1QkFBdUIsS0FBdkIsRUFBOEIsY0FBOUIsRUFBOEM7QUFDMUQsd0JBQVksaUJBQWlCLFVBRDZCO0FBRTFELDhCQUFrQixpQkFBaUIsZ0JBRnVCO0FBRzFELG1DQUF1QixpQkFBaUIscUJBSGtCO0FBSTFELHlCQUFhLFdBSjZDO0FBSzFELDhDQUFrQyxnQ0FMd0I7QUFNMUQseUNBQTZCLDJCQU42QjtBQU8xRCx1QkFBVztBQVArQyxTQUE5QyxDQUFoQjtBQVNBLHlCQUFpQixVQUFqQixHQUE4QixVQUFVLFVBQXhDO0FBQ0Esb0JBQVksVUFBVSxTQUF0QjtBQUNBLHNCQUFjLFVBQVUsV0FBeEI7QUFDQSwyQ0FDSSxVQUFVLGdDQURkO0FBRUEsc0NBQThCLFVBQVUsMkJBQXhDO0FBQ0EseUJBQWlCLHFCQUFqQixHQUNJLFVBQVUscUJBQVYsSUFBbUMsRUFEdkM7QUFFQSx5QkFBaUIsZ0JBQWpCLEdBQW9DLFVBQVUsZ0JBQTlDO0FBQ0g7QUFDRCxRQUFJLDZCQUE2QixNQUFNLGlCQUF2QztBQUNBLFFBQUksOEJBQThCLENBQUMsMkJBQUQsSUFDOUIsQ0FBQyxDQUFDLE1BQU0saUJBRHNCLElBRTlCLE1BQU0saUJBQU4sQ0FBd0IsTUFBeEIsR0FBaUMsQ0FGSCxJQUc5QixDQUFDLE1BQU0seUJBSHVCLElBSTlCLENBQUMsTUFBTSxZQUpYO0FBS0EsUUFBSSxrQ0FBSjtBQUNBLFFBQUksTUFBTSxLQUFOLElBQ0EsTUFBTSxXQUROLElBRUEsZUFBZSxTQUFmLENBQXlCLHlCQUF6QixDQUZBLElBR0EsQ0FBQyxRQUFRLEtBSGIsRUFHb0I7QUFDaEIsNkNBQXFDLENBQUMsTUFBTSxnQkFBUCxHQUMvQixVQUQrQixHQUUvQixNQUZOO0FBR0g7QUFDRCxRQUFJLFNBQVMsU0FBUyxTQUFTLEVBQVQsRUFBYSwwQkFBMEI7QUFDekQsb0JBQVksaUJBQWlCLFVBRDRCO0FBRXpELCtCQUF1QixpQkFBaUIscUJBRmlCO0FBR3pELHFCQUFhLFdBSDRDO0FBSXpELG1CQUFXLFNBSjhDO0FBS3pELDRDQUFvQyxrQ0FMcUI7QUFNekQsMENBQWtDLGdDQU51QjtBQU96RCw2QkFBcUIsaUJBQWlCLG1CQVBtQjtBQVF6RCxxQ0FBNkI7QUFSNEIsS0FBMUIsRUFTaEMsS0FUZ0MsRUFTekIsY0FUeUIsQ0FBYixDQUFULEVBU2UsRUFBRSxrQkFBa0Isc0NBQXNDLFVBQXRDLEdBQ3RDLEtBRHNDLEdBRXRDLENBQUMsS0FBSyxpQkFBaUIsZ0JBQXZCLE1BQTZDLElBQTdDLElBQXFELE9BQU8sS0FBSyxDQUFqRSxHQUFxRSxFQUFyRSxHQUEwRSxLQUZ4RCxFQUUrRCw0QkFBNEIsc0NBQXNDLFVBQXRDLEdBQzdHLEtBRDZHLEdBRTdHLDBCQUprQixFQUlVLDZCQUE2QixzQ0FBc0MsVUFBdEMsR0FDekQsS0FEeUQsR0FFekQsMkJBTmtCLEVBVGYsQ0FBYjtBQWdCQSxRQUFJLHVCQUF1QixNQUFNLFdBQU4sSUFDdkIsZUFBZSxTQUFmLENBQXlCLGlCQUF6QixDQUR1QixJQUV2QixDQUFDLFFBQVEsS0FGYyxJQUd2QixNQUFNLHlCQUhWO0FBSUEsUUFBSSx3QkFBd0IsT0FBTyxVQUFQLEtBQXNCLFFBQXRCLElBQWtDLE9BQU8sU0FBUCxLQUFxQixXQUFuRjtBQUNBLFFBQUkseUJBQ0MseUJBQXlCLE9BQU8sU0FBUCxLQUFxQixTQUQvQyxDQUFKLEVBQytEO0FBQzNELGVBQU8sMkJBQVAsR0FBcUMsS0FBckM7QUFDQSxlQUFPLFdBQVAsR0FBcUIsS0FBckI7QUFDSDtBQUNELFFBQUksTUFBTSxXQUFOLElBQXFCLE9BQU8sU0FBUCxLQUFxQixTQUExQyxJQUF1RCxDQUFDLFFBQVEsS0FBcEUsRUFBMkU7QUFDdkUsZUFBTywyQkFBUCxHQUFxQyxLQUFyQztBQUNIO0FBQ0QsV0FBTyxNQUFQO0FBQ0gsQ0FqSEQ7QUFrSEEsUUFBUSwrQkFBUixHQUEwQywrQkFBMUM7O0FBRUE7O0FBRUE7OztBQ3J3QkE7O0FBQ0EsSUFBSSxrQkFBbUIsYUFBUSxVQUFLLGVBQWQsS0FBbUMsT0FBTyxNQUFQLEdBQWlCLFVBQVMsQ0FBVCxFQUFZLENBQVosRUFBZSxDQUFmLEVBQWtCLEVBQWxCLEVBQXNCO0FBQzVGLFFBQUksT0FBTyxTQUFYLEVBQXNCLEtBQUssQ0FBTDtBQUN0QixRQUFJLE9BQU8sT0FBTyx3QkFBUCxDQUFnQyxDQUFoQyxFQUFtQyxDQUFuQyxDQUFYO0FBQ0EsUUFBSSxDQUFDLElBQUQsS0FBVSxTQUFTLElBQVQsR0FBZ0IsQ0FBQyxFQUFFLFVBQW5CLEdBQWdDLEtBQUssUUFBTCxJQUFpQixLQUFLLFlBQWhFLENBQUosRUFBbUY7QUFDakYsZUFBTyxFQUFFLFlBQVksSUFBZCxFQUFvQixLQUFLLGVBQVc7QUFBRSx1QkFBTyxFQUFFLENBQUYsQ0FBUDtBQUFjLGFBQXBELEVBQVA7QUFDRDtBQUNELFdBQU8sY0FBUCxDQUFzQixDQUF0QixFQUF5QixFQUF6QixFQUE2QixJQUE3QjtBQUNILENBUHdELEdBT25ELFVBQVMsQ0FBVCxFQUFZLENBQVosRUFBZSxDQUFmLEVBQWtCLEVBQWxCLEVBQXNCO0FBQ3hCLFFBQUksT0FBTyxTQUFYLEVBQXNCLEtBQUssQ0FBTDtBQUN0QixNQUFFLEVBQUYsSUFBUSxFQUFFLENBQUYsQ0FBUjtBQUNILENBVnFCLENBQXRCO0FBV0EsSUFBSSxxQkFBc0IsYUFBUSxVQUFLLGtCQUFkLEtBQXNDLE9BQU8sTUFBUCxHQUFpQixVQUFTLENBQVQsRUFBWSxDQUFaLEVBQWU7QUFDM0YsV0FBTyxjQUFQLENBQXNCLENBQXRCLEVBQXlCLFNBQXpCLEVBQW9DLEVBQUUsWUFBWSxJQUFkLEVBQW9CLE9BQU8sQ0FBM0IsRUFBcEM7QUFDSCxDQUY4RCxHQUUxRCxVQUFTLENBQVQsRUFBWSxDQUFaLEVBQWU7QUFDaEIsTUFBRSxTQUFGLElBQWUsQ0FBZjtBQUNILENBSndCLENBQXpCO0FBS0EsSUFBSSxlQUFnQixhQUFRLFVBQUssWUFBZCxJQUErQixVQUFVLEdBQVYsRUFBZTtBQUM3RCxRQUFJLE9BQU8sSUFBSSxVQUFmLEVBQTJCLE9BQU8sR0FBUDtBQUMzQixRQUFJLFNBQVMsRUFBYjtBQUNBLFFBQUksT0FBTyxJQUFYLEVBQWlCLEtBQUssSUFBSSxDQUFULElBQWMsR0FBZDtBQUFtQixZQUFJLE1BQU0sU0FBTixJQUFtQixPQUFPLFNBQVAsQ0FBaUIsY0FBakIsQ0FBZ0MsSUFBaEMsQ0FBcUMsR0FBckMsRUFBMEMsQ0FBMUMsQ0FBdkIsRUFBcUUsZ0JBQWdCLE1BQWhCLEVBQXdCLEdBQXhCLEVBQTZCLENBQTdCO0FBQXhGLEtBQ2pCLG1CQUFtQixNQUFuQixFQUEyQixHQUEzQjtBQUNBLFdBQU8sTUFBUDtBQUNILENBTkQ7QUFPQSxPQUFPLGNBQVAsQ0FBc0IsT0FBdEIsRUFBK0IsWUFBL0IsRUFBNkMsRUFBRSxPQUFPLElBQVQsRUFBN0M7QUFDQSxRQUFRLGtCQUFSLEdBQTZCLEtBQUssQ0FBbEM7QUFDQSxJQUFJLElBQUksYUFBYSxRQUFRLFlBQVIsQ0FBYixDQUFSO0FBQ0EsU0FBUyxrQkFBVCxDQUE0QixNQUE1QixFQUFvQyxXQUFwQyxFQUFpRDtBQUM3QztBQUNBLFFBQUksZUFBZSxFQUFFLE1BQUYsQ0FBUyxNQUFULEVBQWlCLE9BQWpCLENBQW5CO0FBQ0E7QUFDQTtBQUNBLFFBQUksaUJBQWlCLE9BQU8sTUFBUCxDQUFjLEVBQWQsRUFBa0IsRUFBRSxJQUFGLENBQU8sWUFBUCxDQUFsQixDQUFyQjtBQUNBLFFBQUksa0JBQWtCLGVBQWUsSUFBckMsRUFBMkM7QUFDdkMsWUFBSSxpQ0FBaUM7QUFDakMsd0NBQTRCLDhCQURLO0FBRWpDLGlEQUFxQztBQUZKLFNBQXJDO0FBSUEsWUFBSSxhQUFhLEVBQUUsSUFBRixDQUFPLE9BQU8sSUFBUCxDQUFZLDhCQUFaLENBQVAsRUFBb0QsVUFBVSxNQUFWLEVBQWtCO0FBQUUsbUJBQU8sZUFBZSxJQUFmLENBQW9CLFVBQXBCLENBQStCLE1BQS9CLENBQVA7QUFBZ0QsU0FBeEgsQ0FBakI7QUFDQSxZQUFJLFVBQUosRUFBZ0I7QUFDWjtBQUNBLGdCQUFJLHFCQUFxQiwrQkFBK0IsVUFBL0IsQ0FBekI7QUFDQSxnQkFBSSxnQkFBZ0IsV0FBcEIsQ0FIWSxDQUdxQjtBQUNqQyxnQkFBSSxPQUFPLEVBQVg7QUFDQSxnQkFBSSxPQUFPLFFBQVAsS0FBb0IsV0FBeEIsRUFBcUM7QUFDakM7QUFDQSxvQkFBSSxNQUFNLElBQUksR0FBSixDQUFRLGVBQWUsSUFBdkIsQ0FBVjtBQUNBLHVCQUFPLElBQUksUUFBWDtBQUNILGFBSkQsTUFLSztBQUNEO0FBQ0Esb0JBQUksSUFBSSxTQUFTLGFBQVQsQ0FBdUIsR0FBdkIsQ0FBUjtBQUNBLGtCQUFFLElBQUYsR0FBUyxlQUFlLElBQXhCO0FBQ0EsdUJBQU8sRUFBRSxRQUFUO0FBQ0Esb0JBQUksQ0FBQyxLQUFLLFVBQUwsQ0FBZ0IsR0FBaEIsQ0FBTCxFQUEyQjtBQUFFO0FBQ3pCLDJCQUFPLElBQUksTUFBSixDQUFXLElBQVgsQ0FBUDtBQUNIO0FBQ0o7QUFDRCxnQkFBSSxnQkFBZ0IsbUJBQW1CLElBQW5CLENBQXBCO0FBQ0EsZ0JBQUksdUJBQXVCLEdBQUcsTUFBSCxDQUFVLGtCQUFWLEVBQThCLEdBQTlCLEVBQW1DLE1BQW5DLENBQTBDLGFBQTFDLEVBQXlELE9BQXpELEVBQWtFLE1BQWxFLENBQXlFLGFBQXpFLEVBQXdGLGlCQUF4RixDQUEzQjtBQUNBLDJCQUFlLElBQWYsR0FBc0IsR0FBRyxNQUFILENBQVUsb0JBQVYsRUFBZ0MsU0FBaEMsRUFBMkMsTUFBM0MsQ0FBa0QsV0FBbEQsQ0FBdEI7QUFDQSwyQkFBZSxNQUFmLEdBQXdCLEdBQUcsTUFBSCxDQUFVLG9CQUFWLEVBQWdDLFNBQWhDLEVBQTJDLE1BQTNDLENBQWtELEtBQUssS0FBTCxDQUFXLGNBQWMsQ0FBekIsQ0FBbEQsRUFBK0UsT0FBL0UsSUFDcEIsR0FBRyxNQUFILENBQVUsb0JBQVYsRUFBZ0MsU0FBaEMsRUFBMkMsTUFBM0MsQ0FBa0QsS0FBSyxLQUFMLENBQVcsY0FBYyxHQUF6QixDQUFsRCxFQUFpRixTQUFqRixDQURvQixHQUVwQixHQUFHLE1BQUgsQ0FBVSxvQkFBVixFQUFnQyxTQUFoQyxFQUEyQyxNQUEzQyxDQUFrRCxXQUFsRCxFQUErRCxLQUEvRCxDQUZKO0FBR0EsbUJBQU8sY0FBUDtBQUNIO0FBQ0o7QUFDRCxXQUFPLEVBQUUsSUFBRixDQUFPLFlBQVAsRUFBcUIsVUFBVSxLQUFWLEVBQWlCO0FBQUUsZUFBTyxNQUFNLEtBQU4sSUFBZSxXQUF0QjtBQUFvQyxLQUE1RSxLQUNILEVBQUUsSUFBRixDQUFPLFlBQVAsQ0FESixDQXhDNkMsQ0F5Q25CO0FBQzdCO0FBQ0QsUUFBUSxrQkFBUixHQUE2QixrQkFBN0I7O0FBRUE7O0FBRUE7Ozs7O0FDekVBOztBQUVBLElBQUksYUFBYSxRQUFRLGVBQVIsQ0FBakI7QUFDQSxJQUFJLFVBQVUsUUFBUSxZQUFSLENBQWQ7O0FBRUEsSUFBSSxVQUFVLFNBQVYsT0FBVSxDQUFTLEtBQVQsRUFBZ0IsT0FBaEIsRUFBeUIsSUFBekIsRUFBK0I7QUFDekMsUUFBSTtBQUNBLFlBQUksUUFBUSxTQUFTLE1BQU0sV0FBTixPQUF3QixPQUE3Qzs7QUFFQSxZQUFJLFNBQVMsT0FBTyxLQUFwQixFQUEyQjtBQUN2QixnQkFBSSxlQUFlLFVBQVUsR0FBVixHQUFnQixPQUFPLElBQVAsQ0FBWSxTQUFaLENBQXNCLElBQXRCLENBQW5DO0FBQ0EsbUJBQU8sS0FBUCxDQUFhLFdBQWIsQ0FBeUIsWUFBekI7QUFDSDs7QUFFRCxZQUFJLFVBQVUsT0FBTyxPQUFyQixFQUE4QjtBQUMxQixnQkFBSSxTQUFTLE9BQU8sT0FBUCxDQUFlLEtBQTVCLEVBQW1DO0FBQy9CLHVCQUFPLE9BQVAsQ0FBZSxLQUFmLENBQXFCLE9BQXJCLEVBQThCLElBQTlCO0FBQ0gsYUFGRCxNQUVPO0FBQ0gsdUJBQU8sT0FBUCxDQUFlLEdBQWYsQ0FBbUIsT0FBbkIsRUFBNEIsSUFBNUI7QUFDSDtBQUNKO0FBQ0osS0FmRCxDQWVFLE9BQU8sQ0FBUCxFQUFVO0FBQ1I7QUFDSDtBQUNKLENBbkJEOztBQXFCQSxJQUFJLGFBQWEsU0FBYixVQUFhLEdBQVc7QUFDeEIsUUFBSSxPQUFPLFNBQVAsSUFBb0IsT0FBTyxTQUFQLENBQWlCLE9BQXpDLEVBQWtEO0FBQzlDLGVBQU8sT0FBTyxTQUFQLENBQWlCLE9BQXhCO0FBQ0gsS0FGRCxNQUVPO0FBQ0gsZUFBTyxJQUFQO0FBQ0g7QUFDSixDQU5EOztBQVFBLElBQUksdUJBQXVCLElBQUksVUFBSixDQUFlLE9BQU8sU0FBUCxDQUFpQixZQUFoQyxFQUE4QyxPQUE5QyxFQUF1RCxPQUFPLFNBQVAsQ0FBaUIsTUFBeEUsQ0FBM0I7O0FBRUEsSUFBSSxRQUFRLFNBQVIsS0FBUSxDQUFTLFVBQVQsRUFBcUIsR0FBckIsRUFBMEIsSUFBMUIsRUFBZ0M7QUFDeEMsUUFBSSxTQUFTLFlBQWI7QUFDQSxRQUFJLFVBQVUsUUFBUSxxQkFBUixDQUE4QixNQUE5QixFQUFzQyxVQUF0QyxDQUFkOztBQUVBLFdBQU8scUJBQXFCLFNBQXJCLENBQStCLEdBQS9CLEVBQW9DLE1BQXBDLEVBQTRDLElBQTVDLEVBQWtELE9BQWxELENBQVA7QUFDSCxDQUxEOztBQU9BOzs7O0FBSUEsSUFBSSxPQUFPLE1BQU0sSUFBTixDQUFXLElBQVgsRUFBaUIsSUFBakIsQ0FBWDs7QUFFQTs7OztBQUlBLElBQUksT0FBTyxNQUFNLElBQU4sQ0FBVyxJQUFYLEVBQWlCLEtBQWpCLENBQVg7O0FBRUEsT0FBTyxPQUFQLEdBQWlCO0FBQ2IsY0FEYTtBQUViO0FBRmEsQ0FBakI7Ozs7O0FDdkRBLElBQUksZ0JBQWdCLFFBQVEsZUFBUixDQUFwQjs7QUFFQSxJQUFJLGtCQUFrQixTQUFsQixlQUFrQixDQUFTLFFBQVQsRUFBbUIsTUFBbkIsRUFBMkI7QUFDN0MsYUFBUyxVQUFVLElBQW5COztBQUVBLFdBQU8sSUFBSSxhQUFKLENBQWtCLE1BQWxCLEVBQTBCLGNBQTFCLENBQXlDLElBQXpDLEVBQStDLE9BQS9DLENBQXVELFFBQXZELENBQVA7QUFDSCxDQUpEOztBQU1BLE9BQU8sT0FBUCxHQUFpQjtBQUNiO0FBRGEsQ0FBakI7Ozs7O0FDUkEsSUFBSSxnQkFBZ0IsUUFBUSxpQkFBUixDQUFwQjtBQUNBLElBQUksVUFBVSxRQUFRLFdBQVIsQ0FBZDs7QUFFQTs7OztBQUlBLFNBQVMsVUFBVCxDQUFvQixZQUFwQixFQUFrQyxNQUFsQyxFQUF1RDtBQUFBLFFBQWIsU0FBYSx1RUFBSCxDQUFHOztBQUNuRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLFNBQUssa0JBQUwsR0FBMEIsRUFBMUI7O0FBRUE7QUFDQSxTQUFLLGFBQUwsR0FBcUIsWUFBckI7O0FBRUE7QUFDQSxTQUFLLE9BQUwsR0FBZSxNQUFmOztBQUVBLFNBQUssU0FBTCxHQUFpQixTQUFqQjtBQUNIOztBQUVELFdBQVcsU0FBWCxDQUFxQixTQUFyQixHQUFpQyxVQUFTLEdBQVQsRUFBYyxNQUFkLEVBQXNCLElBQXRCLEVBQTRCLE9BQTVCLEVBQXFDLFVBQXJDLEVBQWlEO0FBQzlFLGFBQVMsVUFBVSxJQUFuQjtBQUNBLFdBQU8sUUFBUSxFQUFmO0FBQ0EsY0FBVSxXQUFXLEVBQXJCOztBQUVBO0FBQ0E7QUFDQSxRQUFJLENBQUMsR0FBTCxFQUFVO0FBQ04sWUFBSSxpQkFBaUIsUUFBUSxFQUFSLEdBQWEsZ0JBQWIsR0FBZ0MsUUFBUSxJQUFSLEdBQWUsUUFBZixHQUEwQixhQUEvRTtBQUNBLGFBQUssSUFBTCxDQUFVLE9BQVYsRUFBbUIsMEJBQW5CLEVBQStDLEVBQUMsOEJBQUQsRUFBaUIsc0JBQWpCLEVBQS9DOztBQUVBLGVBQU8sSUFBUDtBQUNIOztBQUVELFFBQUksU0FBUyxJQUFiOztBQUVBLFFBQUk7QUFDQSxpQkFBUyxLQUFLLFVBQUwsQ0FBZ0IsR0FBaEIsRUFBcUIsTUFBckIsRUFBNkIsSUFBN0IsRUFBbUMsT0FBbkMsRUFBNEMsVUFBNUMsQ0FBVDtBQUNILEtBRkQsQ0FFRSxPQUFPLENBQVAsRUFBVTtBQUNSO0FBQ0g7O0FBRUQsUUFBSSxNQUFKLEVBQVk7QUFDUjtBQUNBLGVBQU8sTUFBUDtBQUNILEtBSEQsTUFHTztBQUNIO0FBQ0EsZUFBTyxRQUFRLG1CQUFSLENBQTRCLEdBQTVCLEVBQWlDLE1BQWpDLEVBQXlDLE9BQXpDLENBQVA7QUFDSDtBQUNKLENBN0JEOztBQStCQSxXQUFXLFNBQVgsQ0FBcUIsVUFBckIsR0FBa0MsVUFBUyxVQUFULEVBQXFCLE1BQXJCLEVBQTZCLElBQTdCLEVBQW1DLE9BQW5DLEVBQTRDLFVBQTVDLEVBQXdEO0FBQ3RGLFFBQUksWUFBWSxLQUFLLGFBQUwsQ0FBbUIsVUFBbkIsQ0FBaEI7O0FBRHNGO0FBQUE7QUFBQTs7QUFBQTtBQUd0Riw2QkFBZ0IsU0FBaEIsOEhBQTJCO0FBQUEsZ0JBQWxCLEdBQWtCOztBQUN2QixnQkFBSSxjQUFjLEtBQUssa0JBQUwsQ0FBd0IsR0FBeEIsQ0FBbEI7O0FBRUEsZ0JBQUksZUFBZSxJQUFuQixFQUF5QjtBQUNyQixvQkFBSSxtQkFBbUIsS0FBSyxnQkFBTCxDQUFzQixHQUF0QixFQUEyQixNQUEzQixFQUFtQyxXQUFuQyxFQUFnRCxVQUFoRCxDQUF2Qjs7QUFFQSxvQkFBSSxvQkFBb0IsSUFBeEIsRUFBOEI7QUFDMUIsd0JBQUksYUFBYSxpQkFBaUIsSUFBakIsQ0FBakI7QUFDQSx3QkFBSSxTQUFTLFFBQVEsbUJBQVIsQ0FBNEIsR0FBNUIsRUFBaUMsVUFBakMsRUFBNkMsT0FBN0MsQ0FBYjs7QUFFQSwyQkFBTyxNQUFQO0FBQ0g7QUFDSjtBQUNKOztBQUVEO0FBbEJzRjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQW1CdEYsU0FBSyxJQUFMLENBQVUsT0FBVixFQUFtQiw0REFBbkIsRUFBaUYsRUFBQyxXQUFXLEtBQUssU0FBakIsRUFBNEIsb0JBQTVCLEVBQXVDLEtBQUssVUFBNUMsRUFBd0QsY0FBeEQsRUFBZ0UsVUFBaEUsRUFBc0Usc0JBQXRFLEVBQWpGOztBQUVBLFdBQU8sSUFBUDtBQUNILENBdEJEOztBQXdCQSxXQUFXLFNBQVgsQ0FBcUIsZ0JBQXJCLEdBQXdDLFVBQVMsR0FBVCxFQUFjLFNBQWQsRUFBeUIsV0FBekIsRUFBc0MsVUFBdEMsRUFBa0Q7QUFDdEYsUUFBSSxlQUFlLEtBQUssZ0JBQUwsQ0FBc0IsU0FBdEIsQ0FBbkI7O0FBRHNGO0FBQUE7QUFBQTs7QUFBQTtBQUd0Riw4QkFBbUIsWUFBbkIsbUlBQWlDO0FBQUEsZ0JBQXhCLE1BQXdCOztBQUM3QixnQkFBSSxXQUFXLFlBQVksTUFBWixDQUFmOztBQUVBLGdCQUFJLFlBQVksSUFBaEIsRUFBc0I7QUFDbEIsb0JBQUksS0FBSyxrQkFBTCxDQUF3QixRQUF4QixLQUFxQyxJQUF6QyxFQUErQztBQUMzQyx5QkFBSyxrQkFBTCxDQUF3QixRQUF4QixJQUFvQyxFQUFwQztBQUNIOztBQUVELG9CQUFJLEtBQUssa0JBQUwsQ0FBd0IsUUFBeEIsRUFBa0MsTUFBbEMsS0FBNkMsSUFBakQsRUFBdUQ7QUFDbkQseUJBQUssa0JBQUwsQ0FBd0IsUUFBeEIsRUFBa0MsTUFBbEMsSUFBNEMsY0FBYyxlQUFkLENBQThCLFFBQTlCLEVBQXdDLE1BQXhDLENBQTVDO0FBQ0g7O0FBRUQsdUJBQU8sS0FBSyxrQkFBTCxDQUF3QixRQUF4QixFQUFrQyxNQUFsQyxDQUFQO0FBQ0g7QUFDSjtBQWpCcUY7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTs7QUFtQnRGLFNBQUssSUFBTCxDQUFVLE9BQVYsRUFBbUIsc0VBQW5CLEVBQTJGLEVBQUMsd0JBQUQsRUFBYywwQkFBZCxFQUE0QixvQkFBNUIsRUFBdUMsUUFBdkMsRUFBNEMsc0JBQTVDLEVBQTNGOztBQUVBLFdBQU8sSUFBUDtBQUNILENBdEJEOztBQXdCQSxXQUFXLFNBQVgsQ0FBcUIsa0JBQXJCLEdBQTBDLFVBQVMsR0FBVCxFQUFjO0FBQ3BELFFBQUksUUFBUSxJQUFJLEtBQUosQ0FBVSxHQUFWLENBQVo7QUFDQSxRQUFJLFNBQVMsS0FBSyxhQUFsQjtBQUZvRDtBQUFBO0FBQUE7O0FBQUE7QUFHcEQsOEJBQWlCLEtBQWpCLG1JQUF3QjtBQUFBLGdCQUFmLElBQWU7O0FBQ3BCLHFCQUFTLE9BQU8sSUFBUCxDQUFUOztBQUVBLGdCQUFJLFVBQVUsSUFBZCxFQUFvQjtBQUNoQix1QkFBTyxJQUFQO0FBQ0g7QUFDSjtBQVRtRDtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBOztBQVdwRCxRQUFJLGNBQWMsTUFBbEI7O0FBRUE7QUFDQTtBQUNBLFFBQUksT0FBTyxXQUFQLEtBQXVCLFFBQTNCLEVBQXFDO0FBQ2pDLHNCQUFjLEVBQUMsSUFBSSxXQUFMLEVBQWQ7QUFDSDs7QUFFRCxXQUFPLFdBQVA7QUFDSCxDQXBCRDs7QUFzQkEsV0FBVyxTQUFYLENBQXFCLGdCQUFyQixHQUF3QyxVQUFTLE1BQVQsRUFBaUI7QUFDckQsUUFBSSxVQUFVLFdBQVcsSUFBekIsRUFBK0I7QUFDM0IsWUFBSSxZQUFZLE9BQU8sT0FBUCxDQUFlLEdBQWYsQ0FBaEI7O0FBRUEsWUFBSSxjQUFjLENBQUMsQ0FBbkIsRUFBc0I7QUFDbEIsbUJBQU8sQ0FBQyxNQUFELEVBQVMsSUFBVCxDQUFQO0FBQ0gsU0FGRCxNQUVPO0FBQ0gsZ0JBQUksV0FBVyxPQUFPLE1BQVAsQ0FBYyxDQUFkLEVBQWlCLFNBQWpCLENBQWY7O0FBRUEsZ0JBQUksU0FBUyxXQUFULE9BQTJCLElBQS9CLEVBQXFDO0FBQ2pDLHVCQUFPLENBQUMsTUFBRCxFQUFTLElBQVQsQ0FBUDtBQUNILGFBRkQsTUFFTztBQUNILHVCQUFPLENBQUMsTUFBRCxFQUFTLFFBQVQsRUFBbUIsSUFBbkIsQ0FBUDtBQUNIO0FBQ0o7QUFDSixLQWRELE1BY087QUFDSCxlQUFPLENBQUMsSUFBRCxDQUFQO0FBQ0g7QUFDSixDQWxCRDs7QUFvQkEsV0FBVyxTQUFYLENBQXFCLGFBQXJCLEdBQXFDLFVBQVMsR0FBVCxFQUFjO0FBQy9DLFdBQU8sQ0FBQyxNQUFNLE1BQVAsRUFBZSxHQUFmLENBQVA7QUFDSCxDQUZEOztBQUlBLFdBQVcsU0FBWCxDQUFxQixJQUFyQixHQUE0QixVQUFTLEtBQVQsRUFBZ0IsT0FBaEIsRUFBeUIsSUFBekIsRUFBK0I7QUFDdkQsUUFBSSxLQUFLLE9BQVQsRUFBa0I7QUFDZCxhQUFLLE9BQUwsQ0FBYSxLQUFiLEVBQW9CLE9BQXBCLEVBQTZCLElBQTdCO0FBQ0g7QUFDSixDQUpEOztBQU1BLE9BQU8sT0FBUCxHQUFpQixVQUFqQjs7Ozs7QUMzSkEsSUFBSSxhQUFhLFFBQVEsYUFBUixDQUFqQjtBQUNBLElBQUksSUFBSSxRQUFRLFlBQVIsQ0FBUjtBQUNBLElBQUksU0FBUyxRQUFRLFFBQVIsQ0FBYjtBQUNBLElBQU0sa0JBQWtCLFFBQVEsb0JBQVIsQ0FBeEI7O0FBRUEsSUFBSSxhQUNBLFFBQVEsNERBQVIsRUFBc0Usa0JBRDFFOztBQUdBLElBQUksY0FBYyxTQUFkLFdBQWMsQ0FBVSxJQUFWLEVBQWdCLGdCQUFoQixFQUFrQztBQUNoRCxRQUFJLG9CQUFvQixJQUF4QixFQUE4QjtBQUMxQixlQUFPLFdBQVcsSUFBWCxDQUFQO0FBQ0gsS0FGRCxNQUVPO0FBQ0gsZUFBTyxJQUFQO0FBQ0g7QUFDSixDQU5EOztBQVFBLElBQUksUUFBUSxTQUFSLEtBQVEsQ0FBVSxJQUFWLEVBQWdCLFVBQWhCLEVBQTRCO0FBQ3BDLFFBQUksVUFBSixFQUFnQjtBQUNaLFlBQUksUUFBUSxJQUFaLEVBQWtCO0FBQ2QsbUJBQU8sd0JBQVA7QUFDSCxTQUZELE1BRU87QUFDSCxtQkFBTyxPQUFPLElBQVAsR0FBYyxJQUFyQjtBQUNIO0FBQ0osS0FORCxNQU1PO0FBQ0gsZUFBTyxJQUFQO0FBQ0g7QUFDSixDQVZEOztBQVlBLElBQUkscUJBQXFCLFNBQXJCLGtCQUFxQixDQUFVLEdBQVYsRUFBZTtBQUNwQyxXQUFPLE9BQU8sSUFBSSxXQUFKLEdBQWtCLFFBQWxCLENBQTJCLE1BQTNCLENBQWQ7QUFDSCxDQUZEOztBQUlBLElBQUksc0JBQXNCLFNBQXRCLG1CQUFzQixDQUFVLEdBQVYsRUFBZSxJQUFmLEVBQXFCLE9BQXJCLEVBQThCO0FBQ3BELGNBQVUsV0FBVyxFQUFyQjs7QUFFQSxRQUFJLG1CQUFtQixRQUFRLFVBQVIsSUFBc0IsQ0FBQyxtQkFBbUIsR0FBbkIsQ0FBOUM7QUFDQSxRQUFJLGFBQWEsQ0FBQyxDQUFDLFFBQVEsSUFBM0I7O0FBRUEsUUFBSSxzQkFBc0IsWUFBWSxJQUFaLEVBQWtCLGdCQUFsQixDQUExQjtBQUNBLFFBQUksa0JBQWtCLE1BQU0sbUJBQU4sRUFBMkIsVUFBM0IsQ0FBdEI7O0FBRUEsV0FBTyxtQkFBbUIsRUFBMUI7QUFDSCxDQVZEOztBQVlBLElBQUksMEJBQTBCLFNBQTFCLHVCQUEwQixDQUFVLEdBQVYsRUFBZSxvQkFBZixFQUFxQztBQUMvRDtBQUNBLFFBQUkscUJBQXFCLElBQUksT0FBTyxPQUFYLENBQ3JCLEVBQUUsT0FBRixDQUFVLEVBQUUsS0FBRixDQUFRLFVBQVIsRUFBb0IscUJBQXBCLENBQVYsQ0FEcUIsRUFFckIsb0JBRnFCLENBQXpCO0FBSUEsUUFBTSx1QkFBdUIsSUFBSSxPQUFKLENBQVksaUJBQVosQ0FBN0I7QUFDQSxRQUFJLFVBQVUsSUFBSSxPQUFPLE9BQVgsQ0FBbUIsb0JBQW5CLENBQWQ7QUFDQSxRQUFJLGVBQWUsUUFBUSxJQUFSLENBQWEsa0JBQWIsRUFBaUMsUUFBakMsRUFBbkI7O0FBRUEsUUFBSSxpQkFBaUIsU0FBckIsRUFBZ0M7QUFDNUI7QUFDQSxZQUFJLGtCQUNBLFFBQVEsTUFBUixHQUFpQixDQUFqQixLQUNDLFFBQVEsQ0FBUixFQUFXLElBQVgsSUFBbUIsT0FBbkIsSUFDRyxRQUFRLENBQVIsRUFBVyxJQUFYLElBQW1CLE9BRHRCLElBRUcsUUFBUSxDQUFSLEVBQVcsSUFBWCxJQUFtQixPQUZ0QixJQUdHLFFBQVEsQ0FBUixFQUFXLElBQVgsSUFBbUIsU0FKdkIsQ0FESjs7QUFPQSxZQUFJLG1CQUFtQixJQUFJLE9BQXZCLElBQWtDLElBQUksT0FBSixDQUFZLGtCQUFsRCxFQUFzRTtBQUNsRSxnQkFBSSxlQUFlLEtBQW5COztBQUVBLGdCQUFJLE9BQUosQ0FBWSxrQkFBWixDQUErQixPQUEvQixDQUF1QyxVQUFDLFFBQUQsRUFBYztBQUNqRCxvQkFBSSxTQUFTLG1CQUFULElBQWdDLFNBQXBDLEVBQStDO0FBQzNDLG1DQUFlLElBQWY7QUFDSDtBQUNKLGFBSkQ7O0FBTUEsZ0JBQUksQ0FBQyxZQUFMLEVBQW1CO0FBQ2YsdUJBQU8sU0FBUDtBQUNIO0FBQ0o7O0FBRUQsWUFDSSx3QkFDQSxxQkFBcUIsV0FBckIsR0FBbUMsUUFBbkMsQ0FBNEMsSUFBNUMsQ0FEQSxLQUVDLHlCQUF5QixTQUF6QixJQUNHLHlCQUF5QixTQUg3QixDQURKLEVBS0U7QUFDRSwyQkFBZSxvQkFBZjtBQUNIO0FBQ0o7O0FBRUQsV0FBTyxZQUFQO0FBQ0gsQ0E1Q0Q7O0FBOENBLElBQU0sa0NBQWtDLFNBQWxDLCtCQUFrQyxDQUFVLFNBQVYsRUFBcUI7QUFDekQsUUFBTSxpQkFBaUIsVUFBVSxPQUFWLENBQWtCLEdBQWxCLENBQXZCO0FBQ0EsUUFBTSxrQkFBa0IsVUFBVSxPQUFWLENBQWtCLEdBQWxCLENBQXhCO0FBQ0EsUUFBSSxtQkFBbUIsQ0FBQyxDQUFwQixJQUF5QixvQkFBb0IsQ0FBQyxDQUFsRCxFQUFxRDtBQUNqRCxlQUFPLEVBQVA7QUFDSDtBQUNELFFBQU0sYUFBYSxVQUFVLFNBQVYsQ0FDZixpQkFBaUIsQ0FERixFQUVmLGtCQUFrQixDQUZILENBQW5CO0FBSUEsV0FBTyxXQUFXLEtBQVgsQ0FBaUIsR0FBakIsRUFBc0IsR0FBdEIsQ0FBMEIsVUFBQyxJQUFEO0FBQUEsZUFBVSxLQUFLLElBQUwsRUFBVjtBQUFBLEtBQTFCLENBQVA7QUFDSCxDQVhEOztBQWFBLElBQU0sa0JBQWtCLFNBQWxCLGVBQWtCLENBQVUsR0FBVixFQUFlO0FBQ25DO0FBQ0E7QUFDQSxRQUFNLFlBQVksSUFBSSxPQUFKLENBQVksWUFBWixDQUFsQjtBQUNBLFFBQU0sYUFBYSxnQ0FBZ0MsU0FBaEMsQ0FBbkI7QUFDQSxRQUFNLE9BQU8sV0FDUixNQURRLENBQ0QsVUFBQyxDQUFEO0FBQUEsZUFBTyxFQUFFLFFBQUYsQ0FBVyxHQUFYLENBQVA7QUFBQSxLQURDLEVBRVIsR0FGUSxDQUVKLFVBQUMsQ0FBRDtBQUFBLGVBQU8sRUFBRSxNQUFGLENBQVMsQ0FBVCxFQUFZLEVBQUUsTUFBRixHQUFXLENBQXZCLENBQVA7QUFBQSxLQUZJLEVBRThCLENBRjlCLENBQWI7QUFHQSxXQUFPLFFBQVEsSUFBZjtBQUNILENBVEQ7O0FBV0EsSUFBSSxZQUFZLFNBQVosU0FBWSxDQUFVLEdBQVYsRUFBZSxHQUFmLEVBQW9CLG9CQUFwQixFQUEwQztBQUN0RCxRQUFNLGtCQUFrQixnQkFBZ0IsWUFBaEIsQ0FDcEIsR0FEb0IsRUFFcEIsR0FGb0IsRUFHcEIsSUFBSSxjQUhnQixDQUF4Qjs7QUFNQSxRQUFJLElBQUksS0FBSixJQUFhLElBQUksS0FBSixDQUFVLE9BQTNCLEVBQW9DO0FBQ2hDLGVBQU8sSUFBSSxLQUFKLENBQVUsT0FBakI7QUFDSCxLQUZELE1BRU8sSUFDSCxJQUFJLE9BQUosSUFDQSxJQUFJLE9BQUosQ0FBWSxRQURaLElBRUEsSUFBSSxPQUFKLENBQVksUUFBWixDQUFxQixvQkFBckIsQ0FIRyxFQUlMO0FBQ0UsZUFBTyxJQUFJLE9BQUosQ0FBWSxRQUFaLENBQXFCLG9CQUFyQixDQUFQO0FBQ0gsS0FOTSxNQU1BLElBQUksSUFBSSxPQUFKLElBQWUsSUFBSSxPQUFKLENBQVksb0JBQVosQ0FBbkIsRUFBc0Q7QUFDekQsZUFBTyxJQUFJLE9BQUosQ0FBWSxvQkFBWixDQUFQO0FBQ0gsS0FGTSxNQUVBLElBQUksZ0JBQWdCLFFBQWhCLENBQXlCLGNBQTdCLEVBQTZDO0FBQ2hELGVBQU8sZ0JBQWdCLEdBQWhCLENBQVA7QUFDSCxLQUZNLE1BRUEsSUFBSSxJQUFJLE9BQUosQ0FBWSxpQkFBWixDQUFKLEVBQW9DO0FBQ3ZDLGVBQU8sd0JBQXdCLEdBQXhCLEVBQTZCLG9CQUE3QixDQUFQO0FBQ0gsS0FGTSxNQUVBLElBQUksb0JBQUosRUFBMEI7QUFDN0IsZUFBTyxvQkFBUDtBQUNILEtBRk0sTUFFQTtBQUNILGVBQU8sSUFBUDtBQUNIO0FBQ0osQ0ExQkQ7O0FBNEJBO0FBQ0EsSUFBSSx3QkFBd0IsU0FBeEIscUJBQXdCLENBQVUsTUFBVixFQUFrQixVQUFsQixFQUE4QjtBQUN0RCxXQUFPO0FBQ0gsb0JBQVksVUFEVDtBQUVILGNBQU0sVUFBVSxPQUFPLFdBQVAsT0FBeUI7QUFGdEMsS0FBUDtBQUlILENBTEQ7O0FBT0E7QUFDQSxJQUFJLFFBQVEsU0FBUixLQUFRLENBQVUsTUFBVixFQUFrQjtBQUMxQixZQUFRLE9BQU8sV0FBUCxFQUFSO0FBQ0ksYUFBSyxRQUFMO0FBQ0ksbUJBQU8sSUFBUDtBQUNKO0FBQ0ksbUJBQU8sS0FBUDtBQUpSO0FBTUgsQ0FQRDs7QUFTQSxPQUFPLE9BQVAsR0FBaUI7QUFDYiw0Q0FEYTtBQUViLHdCQUZhO0FBR2IsZ0RBSGE7QUFJYixvREFKYTtBQUtiO0FBTGEsQ0FBakI7Ozs7O0FDaEtBLElBQUksSUFBSSxRQUFRLFlBQVIsQ0FBUjs7QUFFQSxJQUFJLFVBQVUsUUFBUSxVQUFSLENBQWQ7QUFDQSxJQUFJLFNBQVMsUUFBUSxvQ0FBUixFQUE4QyxNQUEzRDs7QUFFQTtBQUNBLElBQUksZ0JBQWdCLFNBQWhCLGFBQWdCLENBQVMsUUFBVCxFQUFtQjtBQUNuQyxRQUFJLFdBQVcsRUFBZjs7QUFFQSxRQUFJLFlBQVksU0FBWixTQUFZLENBQVMsZUFBVCxFQUEwQixZQUExQixFQUF3QztBQUNwRCxVQUFFLElBQUYsQ0FBTyxlQUFQLEVBQXdCLFVBQVMsS0FBVCxFQUFnQjtBQUNwQyxnQkFBSSxFQUFFLFFBQUYsQ0FBVyxLQUFYLENBQUosRUFBdUI7QUFDbkIsMEJBQVUsS0FBVixFQUFpQixZQUFqQjtBQUNILGFBRkQsTUFHSztBQUNELDZCQUFhLEtBQWIsSUFBc0IsSUFBdEI7QUFDSDtBQUNKLFNBUEQ7QUFRSCxLQVREOztBQVdBLGNBQVUsUUFBVixFQUFvQixRQUFwQjs7QUFFQSxXQUFPLFFBQVA7QUFDSCxDQWpCRDs7QUFvQkE7QUFDQSxJQUFJLG9CQUFvQixDQUFDLE9BQU8sYUFBUixFQUF1QixPQUFPLDhCQUE5QixFQUE4RCxPQUFPLE1BQVAsQ0FBYyxHQUFkLENBQWtCLE1BQWhGLEVBQXdGLE9BQU8sTUFBUCxDQUFjLEdBQWQsQ0FBa0IsZUFBMUcsRUFBMkgsT0FBTyxxQkFBbEksRUFBeUosT0FBTyxLQUFQLENBQWEsc0JBQXRLLENBQXhCOztBQUVBLElBQUkseUJBQXlCLFNBQXpCLHNCQUF5QixDQUFVLEdBQVYsRUFBZSxTQUFmLEVBQTBCO0FBQ25ELFFBQUksT0FBTyxJQUFQLElBQWUsYUFBYSxJQUFoQyxFQUFzQztBQUNsQyxhQUFLLElBQUksSUFBVCxJQUFpQixHQUFqQixFQUFzQjtBQUNsQixnQkFBSSxVQUFVLFdBQVYsTUFBMkIsS0FBSyxXQUFMLEVBQS9CLEVBQW1EO0FBQy9DLHVCQUFPLEVBQUMsS0FBSyxJQUFOLEVBQVksT0FBTyxJQUFJLElBQUosQ0FBbkIsRUFBUDtBQUNIO0FBQ0o7QUFDSjs7QUFFRCxXQUFPLElBQVA7QUFDSCxDQVZEOztBQVlBLElBQUksc0JBQXNCLGNBQWMsTUFBZCxDQUExQjs7QUFFQSxJQUFJLDZCQUE2QixTQUE3QiwwQkFBNkIsQ0FBVSxZQUFWLEVBQXdCLDJCQUF4QixFQUFxRDtBQUNsRixRQUFJLGdCQUFnQixJQUFwQixFQUEwQjtBQUN0QixlQUFPLElBQVA7QUFDSDs7QUFFRDtBQUNBLFFBQUksQ0FBQyxvQkFBb0IsWUFBcEIsQ0FBTCxFQUF3QztBQUNwQyxlQUFPLElBQVA7QUFDSDs7QUFFRDtBQUNBLFFBQUksc0JBQXNCLEVBQTFCO0FBQ0EsU0FBSyxJQUFJLFdBQVQsSUFBd0IsMkJBQXhCLEVBQXFEO0FBQ2pELFlBQUksR0FBRyxjQUFILENBQWtCLElBQWxCLENBQXVCLDJCQUF2QixFQUFvRCxXQUFwRCxDQUFKLEVBQXNFO0FBQ2xFLGdDQUFvQixXQUFwQixJQUFtQyw0QkFBNEIsV0FBNUIsQ0FBbkM7QUFDSDtBQUNKOztBQUVELFFBQUkseUJBQXlCLElBQTdCO0FBQ0EsUUFBSSxPQUFPLGFBQWEsT0FBYixDQUFxQixVQUFyQixFQUFpQyxVQUFVLEtBQVYsRUFBaUI7QUFDekQsWUFBSSxhQUFhLE1BQU0sTUFBTSxNQUFOLEdBQWUsQ0FBckIsTUFBNEIsR0FBN0M7O0FBRUE7QUFDQSxZQUFJLFlBQVksTUFBTSxNQUFOLEdBQWUsQ0FBL0I7QUFDQSxZQUFJLFVBQUosRUFBZ0I7QUFDWjtBQUNBLGNBQUUsU0FBRjtBQUNIOztBQUVEO0FBQ0EsWUFBSSxNQUFNLE1BQU0sTUFBTixDQUFhLENBQWIsRUFBZ0IsU0FBaEIsQ0FBVjs7QUFFQSxZQUFJLFFBQVEsdUJBQXVCLG1CQUF2QixFQUE0QyxHQUE1QyxDQUFaOztBQUVBLFlBQUksU0FBUyxJQUFULElBQWlCLE1BQU0sS0FBTixJQUFlLElBQXBDLEVBQTBDO0FBQ3RDLGdCQUFJLFVBQUosRUFBZ0I7QUFDWix1QkFBTyxvQkFBb0IsR0FBcEIsQ0FBUCxDQURZLENBQ3NCOztBQUVsQyx1QkFBTyxFQUFQO0FBQ0gsYUFKRCxNQUlPO0FBQ0gseUNBQXlCLEtBQXpCOztBQUVBLHVCQUFPLElBQVA7QUFDSDtBQUNKLFNBVkQsTUFVTztBQUNILG1CQUFPLG9CQUFvQixNQUFNLEdBQTFCLENBQVAsQ0FERyxDQUNxQzs7QUFFeEMsbUJBQU8sTUFBTSxLQUFiO0FBQ0g7QUFDSixLQTlCVSxDQUFYOztBQWdDQTtBQUNBLFFBQUksQ0FBQyxzQkFBTCxFQUE2QjtBQUN6QixlQUFPLElBQVA7QUFDSDs7QUFFRDtBQUNBO0FBQ0E7QUFDQSxRQUFJLGVBQWUsS0FBSyxLQUFLLE1BQUwsR0FBYyxDQUFuQixDQUFuQjtBQUNBLFFBQUksaUJBQWlCLEdBQWpCLElBQXdCLFNBQVMsR0FBckMsRUFBMEM7QUFDdEMsZUFBTyxLQUFLLE1BQUwsQ0FBWSxDQUFaLEVBQWUsS0FBSyxNQUFMLEdBQWMsQ0FBN0IsQ0FBUDtBQUNIOztBQUVEO0FBQ0E7QUFDQSxRQUFJLGFBQWEsRUFBakI7QUFDQSxTQUFLLElBQUksR0FBVCxJQUFnQixtQkFBaEIsRUFBcUM7QUFDakMsWUFBSSxHQUFHLGNBQUgsQ0FBa0IsSUFBbEIsQ0FBdUIsbUJBQXZCLEVBQTRDLEdBQTVDLENBQUosRUFBc0Q7QUFDbEQsdUJBQVcsSUFBWCxDQUFnQixNQUFNLEdBQU4sR0FBWSxtQkFBbUIsb0JBQW9CLEdBQXBCLENBQW5CLENBQTVCO0FBQ0g7QUFDSjtBQUNELFFBQUksUUFBUSxXQUFXLE1BQVgsS0FBc0IsQ0FBdEIsR0FBMEIsRUFBMUIsR0FBK0IsTUFBTSxXQUFXLElBQVgsQ0FBZ0IsR0FBaEIsQ0FBakQ7O0FBRUEsV0FBTyxPQUFPLEtBQWQ7QUFDSCxDQTNFRDs7QUE2RUEsSUFBSSxlQUFlLFNBQWYsWUFBZSxDQUFVLEdBQVYsRUFBZSxLQUFmLEVBQXNCO0FBQ3JDLFFBQUksVUFBVSxJQUFJLE9BQUosSUFBZSxHQUE3QjtBQUNBLFFBQUksWUFBWSxHQUFoQixFQUFxQjtBQUNqQixlQUFPLEtBQVA7QUFDSCxLQUZELE1BRU8sSUFBSSxVQUFVLEdBQWQsRUFBbUI7QUFDdEIsZUFBTyxPQUFQO0FBQ0gsS0FGTSxNQUVBO0FBQ0gsZUFBTyxRQUFRLE9BQVIsRUFBaUIsS0FBakIsQ0FBUDtBQUNIO0FBQ0osQ0FURDs7QUFXQSxJQUFJLGNBQWMsU0FBZCxXQUFjLENBQVUsR0FBVixFQUFlLEtBQWYsRUFBc0IsVUFBdEIsRUFBa0M7QUFDaEQsUUFBSSxZQUFZLDJCQUEyQixLQUEzQixFQUFrQyxjQUFjLEVBQWhELENBQWhCO0FBQ0EsUUFBSSxhQUFhLElBQWpCLEVBQXVCO0FBQ25CLFlBQUksYUFBYSxrQkFBa0IsT0FBbEIsQ0FBMEIsS0FBMUIsTUFBcUMsQ0FBQyxDQUF2RDtBQUNBLFlBQUksVUFBSixFQUFnQjtBQUNaLG1CQUFPLGFBQWEsR0FBYixFQUFrQixTQUFsQixDQUFQO0FBQ0gsU0FGRCxNQUVPO0FBQ0gsbUJBQU8sU0FBUDtBQUNIO0FBQ0osS0FQRCxNQU9PO0FBQ0g7QUFDQSxlQUFPLElBQVA7QUFDSDtBQUNKLENBYkQ7O0FBZUEsT0FBTyxPQUFQLEdBQWlCO0FBQ2IsWUFBUSxNQURLO0FBRWIsaUJBQWEsV0FGQTs7QUFJYiw0QkFBd0I7QUFKWCxDQUFqQjs7Ozs7QUNsSkEsT0FBTyxPQUFQLEdBQWlCO0FBQ2IsbUJBQWUsTUFBTSxFQUFOLEdBQVcsRUFBWCxHQUFnQixFQURsQjtBQUViLHdCQUFvQixNQUFNLEVBQU4sR0FBVyxFQUFYLEdBQWdCLEVBQWhCLEdBQXFCLElBRjVCO0FBR2IsMEJBQXNCLEtBQUssSUFIZDtBQUliLHVCQUFtQixLQUFLLEVBQUwsR0FBVSxFQUFWLEdBQWU7QUFKckIsQ0FBakI7Ozs7O0FDQUEsSUFBSSxhQUFhO0FBQ2IsVUFBTSxjQUFTLE1BQVQsRUFBaUI7QUFDbkIsWUFBSSxPQUFPLENBQVg7QUFBQSxZQUFjLENBQWQ7QUFBQSxZQUFpQixHQUFqQjtBQUFBLFlBQXNCLE1BQU0sT0FBTyxNQUFuQztBQUNBLFlBQUksT0FBTyxNQUFQLEtBQWtCLENBQXRCLEVBQXlCO0FBQ3JCLG1CQUFPLElBQVA7QUFDSDtBQUNELGFBQUssSUFBSSxDQUFULEVBQVksSUFBSSxHQUFoQixFQUFxQixHQUFyQixFQUEwQjtBQUN0QixrQkFBUSxPQUFPLFVBQVAsQ0FBa0IsQ0FBbEIsQ0FBUjtBQUNBLG1CQUFTLENBQUMsUUFBUSxDQUFULElBQWMsSUFBZixHQUF1QixHQUEvQjtBQUNBLG9CQUFRLENBQVIsQ0FIc0IsQ0FHWDtBQUNkO0FBQ0QsZUFBTyxJQUFQO0FBRUg7QUFiWSxDQUFqQjs7QUFnQkEsT0FBTyxPQUFQLEdBQWlCLFVBQWpCOzs7OztBQ2hCQSxJQUFJLGNBQWMsUUFBUSxhQUFSLENBQWxCOztBQUVBLElBQUksYUFBYSxTQUFiLFVBQWEsQ0FBUyxhQUFULEVBQXdCLE9BQXhCLEVBQWlDLE1BQWpDLEVBQXlDO0FBQ3RELFFBQUksV0FBVyxpQkFBaUIsSUFBaEM7QUFDQSxRQUFJLE1BQU0sNEJBQVY7QUFDQSxRQUFJLGFBQWEsSUFBYixJQUFxQixhQUFhLE9BQXRDLEVBQStDO0FBQzNDLGVBQU8sK0JBQVA7QUFDQSxZQUFJLENBQUMsQ0FBQyxPQUFOLEVBQWU7QUFDWCxtQkFBTyxPQUFQO0FBQ0g7QUFDSixLQUxELE1BS08sSUFBSSxDQUFDLENBQUMsT0FBTixFQUFlO0FBQ2xCLGVBQU8sK0JBQStCLE9BQXRDO0FBQ0g7QUFDRCxRQUFJLENBQUMsQ0FBQyxNQUFOLEVBQWM7QUFDVixZQUFJLGNBQWMsWUFBWSxTQUFaLENBQXNCLE1BQXRCLENBQWxCO0FBQ0EsWUFBSSxXQUFKLEVBQWlCO0FBQ2IsbUJBQU8sTUFBTSxXQUFiO0FBQ0g7QUFDSjtBQUNELFdBQU8sR0FBUDtBQUNILENBbEJEOztBQW9CQSxPQUFPLE9BQVAsR0FBaUIsVUFBakI7Ozs7O0FDdEJBOzs7Ozs7QUFNQSxJQUFJLFVBQVUsU0FBVixPQUFVLENBQVMsS0FBVCxFQUFnQixVQUFoQixFQUE0QjtBQUN0QyxRQUFJLE1BQU0sS0FBSyxHQUFMLENBQVMsQ0FBVCxFQUFZLEtBQVosQ0FBVjtBQUNBLFdBQU8sQ0FBQyxTQUFTLFVBQVQsRUFBcUIsRUFBckIsSUFBMkIsR0FBNUIsRUFBaUMsUUFBakMsRUFBUDtBQUNILENBSEQ7O0FBS0E7Ozs7OztBQU1BLElBQUksWUFBWSxTQUFaLFNBQVksQ0FBUyxLQUFULEVBQWdCLFVBQWhCLEVBQTRCO0FBQ3hDLFFBQUksTUFBTSxLQUFLLEdBQUwsQ0FBUyxDQUFULEVBQVksS0FBWixDQUFWO0FBQ0EsV0FBTyxDQUFDLFNBQVMsVUFBVCxFQUFvQixFQUFwQixJQUEwQixHQUEzQixNQUFvQyxHQUEzQztBQUNILENBSEQ7O0FBS0E7Ozs7Ozs7QUFPQSxJQUFJLFlBQVksU0FBWixTQUFZLENBQVMsS0FBVCxFQUFnQixLQUFoQixFQUF5QztBQUFBLFFBQWxCLFVBQWtCLHVFQUFMLEdBQUs7O0FBQ3JELFdBQU8sVUFBVSxLQUFWLEVBQWlCLFVBQWpCLE1BQWlDLEtBQWpDLEdBQXlDLFVBQXpDLEdBQXNELFFBQVEsS0FBUixFQUFlLFVBQWYsQ0FBN0Q7QUFDSCxDQUZEOztBQUlBLE9BQU8sT0FBUCxHQUFpQjtBQUNiLGFBQVMsT0FESTtBQUViLGVBQVcsU0FGRTtBQUdiLGVBQVc7QUFIRSxDQUFqQjs7O0FDakNBOztBQUNBLE9BQU8sY0FBUCxDQUFzQixPQUF0QixFQUErQixZQUEvQixFQUE2QyxFQUFFLE9BQU8sSUFBVCxFQUE3QztBQUNBLFFBQVEsVUFBUixHQUFxQixRQUFRLFNBQVIsR0FBb0IsS0FBSyxDQUE5QztBQUNBOzs7Ozs7O0FBT0EsSUFBSSxZQUFZLFNBQVosU0FBWSxDQUFVLEdBQVYsRUFBZTtBQUMzQixTQUFPLEtBQUssS0FBTCxDQUFXLEtBQUssU0FBTCxDQUFlLEdBQWYsQ0FBWCxDQUFQO0FBQ0gsQ0FGRDtBQUdBLFFBQVEsU0FBUixHQUFvQixTQUFwQjtBQUNBOzs7Ozs7O0FBT0EsSUFBSSxhQUFhLFNBQWIsVUFBYSxDQUFVLEdBQVYsRUFBZTtBQUM1QixTQUFPLFFBQVEsS0FBSyxDQUFiLEdBQWlCLEdBQWpCLEdBQXVCLENBQUMsR0FBRyxRQUFRLFNBQVosRUFBdUIsR0FBdkIsQ0FBOUI7QUFDSCxDQUZEO0FBR0EsUUFBUSxVQUFSLEdBQXFCLFVBQXJCOztBQUVBOztBQUVBOzs7Ozs7OztBQzVCQTs7QUFFQSxJQUFNLG1CQUFtQixTQUFuQixnQkFBbUIsQ0FBUyxLQUFULEVBQWdCO0FBQ3JDLFFBQUksZUFBZSxTQUFTLE1BQU0sR0FBTixDQUFVLGtCQUFWLEVBQThCLEVBQXZDLEVBQTJDLEVBQTNDLE1BQW1ELElBQXRFO0FBQ0EsUUFBSSxRQUFRLElBQUksSUFBSixFQUFaO0FBQ0EsUUFBSSxjQUFjLElBQUksSUFBSixDQUFTLE1BQU0sR0FBTixDQUFVLHNCQUFWLENBQVQsQ0FBbEI7QUFDQSxRQUFJLG1DQUFtQyxlQUFlLElBQUksSUFBSixDQUFTLElBQVQsRUFBZSxFQUFmLEVBQW1CLENBQW5CLENBQXREO0FBQ0EsUUFBSSx3QkFBd0IsSUFBSSxJQUFKLENBQVMsV0FBVCxDQUE1QjtBQUNBLDBCQUFzQixPQUF0QixDQUE4QixZQUFZLE9BQVosS0FBeUIsSUFBSSxDQUEzRDtBQUNBLFFBQUksOEJBQStCLGNBQWMsS0FBZixJQUEwQixRQUFRLHFCQUFwRTs7QUFFQSxXQUFPLE9BQU8sY0FBUCxDQUFzQixTQUF0QixDQUFnQyxvQkFBaEMsS0FDSSxnQ0FESixJQUVJLFlBRkosS0FHSywrQkFBZ0Msb0NBQW9DLE1BQU0sR0FBTixDQUFVLG1CQUFWLENBSHpFLElBSUQsS0FBSyxrQkFBTCxFQUF5QixFQUFDLE1BQU8scUJBQVIsRUFBekIsQ0FKQyxHQUtELEVBTE47QUFNSCxDQWZEOztxQkFpQmUsZ0I7Ozs7Ozs7OztBQ2xCZixJQUFJLFVBQVUsUUFBUSwyQkFBUixDQUFkOztBQUVBLE9BQU8sT0FBUDtBQUVJLHFDQUFZLEtBQVosRUFBbUIsY0FBbkIsRUFBbUMsbUJBQW5DLEVBQXdEO0FBQUE7O0FBQ3BELGFBQUssY0FBTCxHQUFzQixjQUF0QjtBQUNBLGFBQUssbUJBQUwsR0FBMkIsbUJBQTNCOztBQUVBLFlBQUksS0FBSixFQUFVO0FBQ04saUJBQUssS0FBTCxHQUFhLEtBQWI7QUFDSCxTQUZELE1BR0s7QUFDRCxpQkFBSyxLQUFMLEdBQWEsQ0FBYjtBQUNIO0FBQ0o7O0FBWkw7QUFBQTtBQUFBLG1DQW9CZSxXQXBCZixFQW9CMkI7QUFDbkIsZ0JBQUksQ0FBQyxLQUFLLFFBQUwsQ0FBYyxjQUFkLENBQTZCLFdBQTdCLENBQUwsRUFBK0M7QUFDM0Msc0JBQU0sSUFBSSxLQUFKLFFBQWMsV0FBZCxnQ0FBTjtBQUNIOztBQUVELG1CQUFPLFFBQVEsU0FBUixDQUFrQixLQUFLLFFBQUwsQ0FBYyxXQUFkLEVBQTJCLE9BQTdDLEVBQXNELEtBQUssS0FBM0QsQ0FBUDtBQUNIO0FBMUJMO0FBQUE7QUFBQSw4QkE0QlUsV0E1QlYsRUE0QnNCO0FBQ2QsZ0JBQUksQ0FBQyxLQUFLLFFBQUwsQ0FBYyxjQUFkLENBQTZCLFdBQTdCLENBQUwsRUFBK0M7QUFDM0Msc0JBQU0sSUFBSSxLQUFKLFFBQWMsV0FBZCxnQ0FBTjtBQUNIO0FBQ0QsaUJBQUssS0FBTCxHQUFhLFFBQVEsU0FBUixDQUFrQixJQUFsQixFQUF3QixLQUFLLFFBQUwsQ0FBYyxXQUFkLEVBQTJCLE9BQW5ELEVBQTRELEtBQUssS0FBakUsQ0FBYjtBQUNIO0FBakNMO0FBQUE7QUFBQSxpREFtQzRCO0FBQUE7O0FBQ3BCLGdCQUFJLHFCQUFxQixPQUFPLG1CQUFQLENBQTJCLEtBQUssUUFBaEMsRUFBMEMsTUFBMUMsQ0FBa0Q7QUFBQSx1QkFBZSxNQUFLLFFBQUwsQ0FBYyxXQUFkLEVBQTJCLE1BQTFDO0FBQUEsYUFBbEQsQ0FBekI7QUFDQSwrQkFBbUIsT0FBbkIsQ0FBMkIsVUFBQyxXQUFEO0FBQUEsdUJBQWlCLE1BQUssS0FBTCxDQUFXLFdBQVgsQ0FBakI7QUFBQSxhQUEzQjtBQUNIO0FBdENMO0FBQUE7QUFBQSw0QkFjbUI7QUFDWCxtQkFBTztBQUNILHNDQUFzQixFQUFDLFNBQVMsQ0FBVixFQUFhLFFBQVEsS0FBSyxjQUFMLENBQW9CLFNBQXBCLENBQThCLG1CQUE5QixLQUFzRCxLQUFLLG1CQUFoRjtBQURuQixhQUFQO0FBR0g7QUFsQkw7QUFBQTtBQUFBLDRCQXdDa0M7QUFBQTs7QUFDMUIsZ0JBQUkscUJBQXFCLE9BQU8sbUJBQVAsQ0FBMkIsS0FBSyxRQUFoQyxFQUEwQyxNQUExQyxDQUFrRDtBQUFBLHVCQUFlLE9BQUssUUFBTCxDQUFjLFdBQWQsRUFBMkIsTUFBMUM7QUFBQSxhQUFsRCxDQUF6QjtBQUNBLG1CQUFPLG1CQUFtQixNQUFuQixLQUE4QixDQUE5QixJQUFtQyxtQkFBbUIsSUFBbkIsQ0FBd0IsVUFBQyxXQUFEO0FBQUEsdUJBQWlCLENBQUMsT0FBSyxVQUFMLENBQWdCLFdBQWhCLENBQWxCO0FBQUEsYUFBeEIsQ0FBMUM7QUFDSDtBQTNDTDs7QUFBQTtBQUFBOzs7Ozs7Ozs7QUNGQSxJQUFJLFVBQVUsUUFBUSwyQkFBUixDQUFkOztBQUVBLE9BQU8sT0FBUDtBQUVJLHFCQUFZLEtBQVosRUFBbUIsYUFBbkIsRUFBa0M7QUFBQTs7QUFDOUIsWUFBSSxLQUFKLEVBQVU7QUFDTixpQkFBSyxLQUFMLEdBQWEsS0FBYjtBQUNILFNBRkQsTUFHSztBQUNEO0FBQ0EsaUJBQUssS0FBTCxHQUFhLENBQWI7QUFDQSxnQkFBSSxDQUFDLGFBQUwsRUFBbUI7QUFDZixxQkFBSyxtQkFBTCxHQUEyQixJQUEzQjtBQUNBLHFCQUFLLHdCQUFMLEdBQWdDLElBQWhDO0FBQ0gsYUFIRCxNQUlLO0FBQ0QscUJBQUssbUJBQUwsR0FBMkIsS0FBM0I7QUFDQSxxQkFBSyx3QkFBTCxHQUFnQyxLQUFoQztBQUNIO0FBQ0o7QUFDSjs7QUFsQkw7QUFBQTtBQUFBLDRCQW9CNkI7QUFDckIsbUJBQU8sUUFBUSxTQUFSLENBQWtCLENBQWxCLEVBQXFCLEtBQUssS0FBMUIsQ0FBUDtBQUNILFNBdEJMO0FBQUEsMEJBd0I0QixPQXhCNUIsRUF3Qm9DO0FBQzVCLGlCQUFLLEtBQUwsR0FBYSxRQUFRLFNBQVIsQ0FBa0IsT0FBbEIsRUFBMkIsQ0FBM0IsRUFBOEIsS0FBSyxLQUFuQyxDQUFiO0FBQ0g7QUExQkw7QUFBQTtBQUFBLDRCQTRCa0M7QUFDMUIsbUJBQU8sUUFBUSxTQUFSLENBQWtCLENBQWxCLEVBQXFCLEtBQUssS0FBMUIsQ0FBUDtBQUNILFNBOUJMO0FBQUEsMEJBZ0NpQyxPQWhDakMsRUFnQ3lDO0FBQ2pDLGlCQUFLLEtBQUwsR0FBYSxRQUFRLFNBQVIsQ0FBa0IsT0FBbEIsRUFBMkIsQ0FBM0IsRUFBOEIsS0FBSyxLQUFuQyxDQUFiO0FBQ0g7QUFsQ0w7O0FBQUE7QUFBQTs7Ozs7Ozs7O0FDSEEsSUFBTSxDQUFBLEdBQUksT0FBQSxDQUFRLFlBQVIsQ0FBVixDQUFBOzs7Ozs7O0FBT0EsTUFBQSxDQUFPLE9BQVAsR0FBQSxZQUFBO0lBRUksU0FBQSxlQUFBLEdBQWM7UUFBQSxlQUFBLENBQUEsSUFBQSxFQUFBLGVBQUEsQ0FBQSxDQUFBOztRQUNWLElBQUEsQ0FBSyxLQUFMLEdBQWtDLEVBQWxDLENBQUE7UUFDQSxJQUFBLENBQUssU0FBTCxHQUFrQyxFQUFsQyxDQUFBO1FBQ0EsSUFBQSxDQUFLLFVBQUwsR0FBa0MsRUFBbEMsQ0FBQTtRQUNBLElBQUEsQ0FBSyxLQUFMLEdBQWtDLEVBQWxDLENBQUE7UUFDQSxJQUFBLENBQUssTUFBTCxHQUFrQyxFQUFsQyxDQUFBO1FBQ0EsSUFBQSxDQUFLLFdBQUwsR0FBa0MsRUFBbEMsQ0FBQTtRQUNBLElBQUEsQ0FBSyxpQkFBTCxHQUFrQyxJQUFsQyxDQUFBO1FBQ0EsSUFBQSxDQUFLLFNBQUwsR0FBa0MsRUFBbEMsQ0FBQTtRQUNBLElBQUEsQ0FBSyxVQUFMLEdBQWtDLEVBQWxDLENBQUE7UUFDQSxJQUFBLENBQUssT0FBTCxHQUFrQyxFQUFsQyxDQUFBO1FBQ0EsSUFBQSxDQUFLLFNBQUwsR0FBa0MsSUFBbEMsQ0FBQTtRQUNBLElBQUEsQ0FBSyxTQUFMLEdBQWtDLEVBQWxDLENBQUE7UUFDQSxJQUFBLENBQUssY0FBTCxHQUFrQyxJQUFsQyxDQUFBO1FBQ0EsSUFBQSxDQUFLLGlCQUFMLEdBQWtDLEtBQWxDLENBQUE7UUFDQSxJQUFBLENBQUssa0JBQUwsR0FBa0MsS0FBbEMsQ0FBQTtRQUNBLElBQUEsQ0FBSyx5QkFBTCxHQUFrQyxLQUFsQyxDQUFBO1FBQ0EsSUFBQSxDQUFLLHdCQUFMLEdBQWtDLElBQWxDLENBQUE7UUFDQSxJQUFBLENBQUssWUFBTCxHQUFrQyxDQUFsQyxDQUFBOzs7UUFHQSxJQUFBLENBQUssTUFBTCxHQUFrQyxFQUFsQyxDQUFBO1FBQ0EsSUFBQSxDQUFLLE9BQUwsR0FBa0MsRUFBbEMsQ0FBQTtRQUNBLElBQUEsQ0FBSyxTQUFMLEdBQWtDLEVBQWxDLENBQUE7UUFDQSxJQUFBLENBQUssYUFBTCxHQUFrQyxFQUFsQyxDQUFBO1FBQ0EsSUFBQSxDQUFLLFFBQUwsR0FBa0MsRUFBbEMsQ0FBQTtRQUNBLElBQUEsQ0FBSyxTQUFMLEdBQWtDLEVBQWxDLENBQUE7UUFDQSxJQUFBLENBQUssV0FBTCxHQUFrQyxFQUFsQyxDQUFBO1FBQ0EsSUFBQSxDQUFLLGFBQUwsR0FBa0MsRUFBbEMsQ0FBQTtRQUNBLElBQUEsQ0FBSyxVQUFMLEdBQWtDLEVBQWxDLENBQUE7UUFDQSxJQUFBLENBQUssY0FBTCxHQUFrQyxFQUFsQyxDQUFBOztRQUVBLElBQUEsQ0FBSyxNQUFMLEdBQWtDLFdBQWxDLENBQUE7UUFDQSxJQUFBLENBQUssSUFBTCxHQUFrQyxPQUFsQyxDQUFBO1FBQ0EsSUFBQSxDQUFLLElBQUwsR0FBa0MsQ0FBbEMsQ0FBQTtRQUNBLElBQUEsQ0FBSyxPQUFMLEdBQWtDLEVBQWxDLENBQUE7UUFDQSxJQUFBLENBQUssYUFBTCxHQUFrQyxJQUFsQyxDQUFBO1FBQ0EsSUFBQSxDQUFLLHFCQUFMLEdBQWtDLEtBQWxDLENBQUE7UUFDQSxJQUFBLENBQUssZUFBTCxHQUFrQyxLQUFsQyxDQUFBO1FBQ0EsSUFBQSxDQUFLLFFBQUwsR0FBa0MsQ0FBbEMsQ0FBQTs7UUFFQSxNQUFBLENBQU8sTUFBUCxDQUFBLEtBQUEsQ0FBQSxNQUFBLEVBQUEsQ0FBYyxJQUFkLENBQUEsQ0FBQSxNQUFBLENBQUEsS0FBQSxDQUFBLFNBQUEsQ0FBQSxLQUFBLENBQUEsSUFBQSxDQUF1QixTQUF2QixDQUFBLENBQUEsQ0FBQSxDQUFBO0tBQ0g7O0lBNUNMLFlBQUEsQ0FBQSxlQUFBLEVBQUEsQ0FBQTtRQUFBLEdBQUEsRUFBQSw4QkFBQTtRQUFBLEtBQUEsRUFBQSxTQUFBLDRCQUFBLENBOENpQyxXQTlDakMsRUE4QzhDLGVBOUM5QyxFQThDK0Q7WUFDdkQsSUFBSSxXQUFKLEVBQWlCOztnQkFFYixJQUFJLFdBQUEsQ0FBWSxjQUFoQixFQUFnQztvQkFDNUIsSUFBQSxDQUFLLGFBQUwsR0FBcUIsV0FBQSxDQUFZLGNBQWpDLENBQUE7aUJBQ0g7Z0JBQ0QsSUFBSSxXQUFBLENBQVksUUFBaEIsRUFBMEI7b0JBQ3RCLElBQUEsQ0FBSyxPQUFMLEdBQWUsV0FBQSxDQUFZLFFBQTNCLENBQUE7aUJBQ0g7Z0JBQ0QsSUFBSSxXQUFBLENBQVksUUFBaEIsRUFBMEI7b0JBQ3RCLElBQUEsQ0FBSyxRQUFMLEdBQWdCLFdBQUEsQ0FBWSxRQUE1QixDQUFBO2lCQUNIO2dCQUNELElBQUksV0FBQSxDQUFZLFNBQWhCLEVBQTJCO29CQUN2QixJQUFBLENBQUssU0FBTCxHQUFpQixXQUFBLENBQVksU0FBN0IsQ0FBQTtvQkFDQSxJQUFBLENBQUssVUFBTCxHQUFrQixXQUFBLENBQVksU0FBOUIsQ0FBQTtpQkFDSDthQUNKOztZQUVELElBQUksZUFBSixFQUFxQjs7O2dCQUdqQixJQUFJLGVBQUEsQ0FBZ0Isa0JBQWhCLENBQUEsSUFBdUMsSUFBQSxDQUFLLGFBQUwsQ0FBbUIsTUFBbkIsS0FBOEIsQ0FBekUsRUFBNEU7b0JBQ3hFLElBQUksUUFBQSxHQUFXLGVBQUEsQ0FBZ0Isa0JBQWhCLENBQWYsQ0FBQTtvQkFDQSxJQUFJLGNBQUEsR0FBaUIsRUFBckIsQ0FBQTtvQkFDQSxDQUFBLENBQUUsSUFBRixDQUFPLENBQUEsQ0FBRSxJQUFGLENBQU8sUUFBUCxDQUFQLEVBQXlCLFVBQVMsR0FBVCxFQUFjO3dCQUNuQyxJQUFJLFFBQUEsQ0FBUyxHQUFULENBQUEsSUFBaUIsR0FBQSxLQUFRLEtBQTdCLEVBQW9DOzRCQUNoQyxjQUFBLENBQWUsSUFBZixDQUFvQixHQUFwQixDQUFBLENBQUE7eUJBQ0g7cUJBSEwsQ0FBQSxDQUFBO29CQUtBLElBQUksY0FBQSxDQUFlLE1BQWYsR0FBd0IsQ0FBNUIsRUFBK0I7d0JBQzNCLElBQUEsQ0FBSyxhQUFMLEdBQXFCLGNBQXJCLENBQUE7cUJBQ0g7aUJBQ0o7YUFDSjtTQUNKO0tBaEZMLEVBQUE7UUFBQSxHQUFBLEVBQUEsV0FBQTtRQUFBLEtBQUEsRUFBQSxTQUFBLFNBQUEsR0FrRmdCO1lBQUEsSUFBQSxLQUFBLEdBQUEsSUFBQSxDQUFBOztZQUNSLElBQUksUUFBQSxHQUFXLENBQUEsQ0FBRSxNQUFGLENBQVMsRUFBVCxFQUFhLElBQWIsQ0FBZixDQUFBOzs7WUFHQSxNQUFBLENBQU8sSUFBUCxDQUFZLFFBQVosQ0FBQSxDQUFzQixPQUF0QixDQUE4QixVQUFDLEdBQUQsRUFBUztnQkFDbkMsQ0FBQyxLQUFBLENBQUssU0FBTCxDQUFlLFFBQUEsQ0FBUyxHQUFULENBQWYsQ0FBRCxJQUFrQyxPQUFPLFFBQUEsQ0FBUyxHQUFULENBQXpDLENBQUE7YUFESixDQUFBLENBQUE7O1lBSUEsT0FBTyxRQUFQLENBQUE7U0FDSDtLQTNGTCxFQUFBO1FBQUEsR0FBQSxFQUFBLFdBQUE7UUFBQSxLQUFBLEVBQUEsU0FBQSxTQUFBLENBNkZjLEtBN0ZkLEVBNkZxQjtZQUNiLE9BQU8sRUFBRyxDQUFBLENBQUUsS0FBRixDQUFBLENBQVMsUUFBVCxFQUFBLElBQXVCLENBQUEsQ0FBRSxLQUFGLENBQUEsQ0FBUyxPQUFULEVBQXhCLElBQStDLENBQUMsS0FBbEQsQ0FBQSxJQUE0RCxLQUFBLEtBQVUsS0FBN0UsQ0FBQTtTQUNIO0tBL0ZMLENBQUEsQ0FBQSxDQUFBOztJQUFBLE9BQUEsZUFBQSxDQUFBO0NBQUEsRUFBQSxDQUFBOzs7Ozs7Ozs7QUNQQTtxQkFDZSxPQUFPLFFBQVAsQ0FBZ0IsVTs7Ozs7Ozs7O0FDRC9COzs7Ozs7OztjQUVpQixNO0lBQVQsSSxXQUFBLEk7O0lBRWEsZTs7O0FBRWpCLCtCQUFjO0FBQUE7O0FBQUEsc0lBQ0o7QUFDRixtQkFBVSxLQUFLLDRCQUFMLENBRFI7QUFFRiwrQ0FDVSxLQUFLLCtCQUFMLENBRFY7QUFGRSxTQURJOztBQVFWLGNBQUssY0FBTCxHQUFzQix5Q0FDSyxLQUFLLGtDQUFMLENBREwsbUZBRVgsS0FBSyw0QkFBTCxDQUZXLDhCQUlqQixFQUppQixDQUlkLGVBSmMsRUFJRyxVQUFDLENBQUQsRUFBTztBQUFFLGtCQUFLLGFBQUwsQ0FBbUIsQ0FBbkIsS0FBeUIsTUFBSyxPQUFMLENBQWEsU0FBYixRQUF6QjtBQUF5RCxTQUpyRSxDQUF0Qjs7QUFNQSxjQUFLLGFBQUwsR0FBc0IsOEZBQzBELEtBQUssUUFBTCxDQUQxRCxnQkFHakIsRUFIaUIsQ0FHZCxlQUhjLEVBR0csVUFBQyxDQUFELEVBQU87QUFBRSxrQkFBSyxhQUFMLENBQW1CLENBQW5CLEtBQXlCLE1BQUssT0FBTCxDQUFhLFFBQWIsUUFBekI7QUFBd0QsU0FIcEUsQ0FBdEI7O0FBS0EsY0FBSyxRQUFMLENBQWMsSUFBZCxDQUFtQixtQkFBbkIsRUFBd0MsTUFBeEMsQ0FBK0MsQ0FDM0MsTUFBSyxjQURzQyxFQUUzQyxNQUFLLGFBRnNDLENBQS9DO0FBbkJVO0FBdUJiOzs7RUF6QndDLFk7O3FCQUF4QixlOzs7Ozs7Ozs7OztBQ0pyQjs7Ozs7Ozs7SUFFcUIsNEI7QUFFakIsMENBQVksRUFBWixFQUFnQjtBQUFBOztBQUNaLGFBQUssUUFBTCxXQUFzQixLQUFLLDZDQUFMLENBQXRCOztBQUVBLGFBQUssRUFBTCxHQUFVLEVBQVY7QUFDSDs7OztpQ0FFTztBQUNKLG1CQUFPLElBQUksb0JBQUosQ0FBWTtBQUNmLHdCQUFRLEtBQUssRUFERTtBQUVmLDBCQUFVLEtBQUssUUFGQTtBQUdmLHVCQUFPO0FBSFEsYUFBWixDQUFQO0FBS0g7Ozs7OztxQkFkZ0IsNEI7Ozs7Ozs7Ozs7O0FDRnJCOzs7O0FBQ0E7Ozs7Ozs7Ozs7Y0FDaUIsTTtJQUFULEksV0FBQSxJOztJQUVhLGdCOzs7QUFDakIsOEJBQVksS0FBWixFQUEwQztBQUFBLFlBQXZCLGNBQXVCLHVFQUFOLEtBQU07O0FBQUE7O0FBQUEseUlBQzdCLFNBRDZCOztBQUV0QyxjQUFLLEtBQUwsR0FBYSxLQUFiO0FBQ0EsY0FBSyxjQUFMLEdBQXNCLGNBQXRCO0FBQ0EsY0FBSyxNQUFMO0FBSnNDO0FBS3pDOzs7O2lDQUVPO0FBQ0osZ0JBQUksZ0JBQWdCO0FBQ2hCLHVCQUFPLEtBQUssK0JBQUwsQ0FEUztBQUVoQiwwQkFBVSxLQUZNO0FBR2hCLHlCQUFTLENBQUMsT0FBRCxFQUFVLHlCQUFWLENBSE87QUFJaEIseUJBQVMsaURBQVMsS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLE9BQWYsQ0FBVCxFQUFrQyxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsYUFBZixNQUFrQyxDQUFsQyxHQUFzQyxLQUFLLHlDQUFMLENBQXRDLEdBQXdGLEtBQUssaUNBQUwsQ0FBMUg7QUFKTyxhQUFwQjs7QUFPQSxpQkFBSyxLQUFMLEdBQWEsSUFBSSxZQUFKLENBQVUsYUFBVixDQUFiO0FBQ0EsaUJBQUssWUFBTCxDQUFrQixLQUFLLEtBQUwsQ0FBVyxHQUE3QjtBQUNBLGlCQUFLLEtBQUwsQ0FBVyxJQUFYO0FBQ0g7OztxQ0FFWSxLLEVBQU07QUFBQTs7QUFDZixrQkFBTSxJQUFOLENBQVcsaUJBQVgsRUFBOEIsRUFBOUIsQ0FBaUMsT0FBakMsRUFBMEMsWUFBTTtBQUM1QywrQkFBZSxTQUFmLENBQXlCLGdCQUF6QixJQUE2QyxPQUFPLGdCQUFQLENBQXdCLE9BQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxJQUFmLENBQXhCLENBQTdDLEdBQTZGLE9BQU8sbUJBQVAsQ0FBMkIsT0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLElBQWYsQ0FBM0IsQ0FBN0Y7QUFDQSx1QkFBTyxZQUFQLENBQW9CLE9BQXBCLENBQTRCLHlCQUE1QixFQUF1RCxFQUFFLFlBQVksT0FBSyxLQUFuQixFQUEwQixTQUFTLEVBQUUsZ0JBQWdCLE9BQUssY0FBdkIsRUFBbkMsRUFBdkQ7QUFDSCxhQUhEOztBQUtBLGtCQUFNLElBQU4sQ0FBVyxTQUFYLEVBQXNCLEVBQXRCLENBQXlCLE9BQXpCLEVBQWtDLFlBQU07QUFDcEMsc0JBQU0sSUFBTixDQUFXLHFCQUFYLEVBQWtDLEtBQWxDO0FBQ0gsYUFGRDtBQUdIOzs7O0VBOUJ5QyxTQUFTLEk7O3FCQUFsQyxnQjs7Ozs7Ozs7Y0NKSixNO0lBQVQsSSxXQUFBLEk7O3FCQUNPLFVBQUMsS0FBRCxFQUFRLElBQVI7QUFBQSw2TEFHZ0MsS0FIaEMsMkRBSStCLElBSi9CLHVFQU1ELEtBQUssMkJBQUwsQ0FOQyw2TkFXK0gsS0FBSyw4QkFBTCxDQVgvSCw4QkFZTSxLQUFLLDhCQUFMLENBWk4sbUxBY21JLEtBQUssUUFBTCxDQWRuSTtBQUFBLEM7Ozs7Ozs7Ozs7O0FDRGY7Ozs7QUFDQTs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7OztjQUNpQixNO0lBQVQsSSxXQUFBLEk7O0FBRVI7QUFDQTtBQUNBO0FBQ0E7O0lBRXFCLGdCOzs7QUFDakIsOEJBQVksS0FBWixFQUFtQixVQUFuQixFQUF1RDtBQUFBLFlBQXhCLGNBQXdCLHVFQUFQLEtBQU87O0FBQUE7O0FBQUEseUlBQzFDLFNBRDBDOztBQUFBLGNBb0l2RCxpQkFwSXVELEdBb0luQyxVQUFVLE9BQVYsRUFBbUI7QUFBQTs7QUFDbkMsZ0JBQUksVUFBVSxPQUFPLHNCQUFQLENBQThCLE9BQTlCLENBQWQ7O0FBRUEsb0JBQ0ssSUFETCxDQUNVLFlBQU07QUFDUix1QkFBTyxZQUFQLENBQW9CLE9BQXBCLENBQTRCLHlCQUE1QixFQUF1RDtBQUNuRCxnQ0FBWSxPQUFLLEtBRGtDO0FBRW5ELDZCQUFTLEVBQUUsZ0JBQWdCLE9BQUssY0FBdkI7QUFGMEMsaUJBQXZEO0FBSUEsb0JBQUksb0NBQUosQ0FBNEIsT0FBSyxLQUFqQyxFQUF3QyxPQUF4QztBQUNILGFBUEwsV0FRVyxVQUFDLEdBQUQsRUFBUztBQUNaLHVCQUFPLE1BQVAsQ0FBYyxHQUFkLENBQWtCLE9BQWxCLEVBQTJCLGdDQUEzQixFQUE2RDtBQUN6RCw2QkFBUyxJQUFJLFVBQUosSUFBa0I7QUFEOEIsaUJBQTdEO0FBR0Esb0JBQUksT0FBSixFQUFhO0FBQ1QsNEJBQVEsSUFBUixDQUFhLE9BQU8sSUFBUCxDQUFZLGVBQVosQ0FBYixFQUEyQyxPQUEzQztBQUNIO0FBQ0QsdUJBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxJQUFmLENBQW9CLHFCQUFwQixFQUEyQyxLQUEzQztBQUNILGFBaEJMO0FBaUJILFNBeEpzRDs7QUFFbkQsY0FBSyxLQUFMLEdBQWEsS0FBYjtBQUNBLGNBQUssVUFBTCxHQUFrQixVQUFsQjtBQUNBLGNBQUssV0FBTCxHQUFtQixNQUFNLEdBQU4sQ0FBVSxhQUFWLENBQW5CO0FBQ0E7QUFDQSxjQUFLLG1CQUFMLEdBQ0ksTUFBTSxHQUFOLENBQVUsZ0JBQVYsTUFDQyxNQUFNLEdBQU4sQ0FBVSxhQUFWLEtBQ0csTUFBTSxHQUFOLENBQVUsNEJBQVYsSUFBMEMsQ0FEN0MsSUFFRyxNQUFNLEdBQU4sQ0FBVSw0QkFBVixJQUEwQyxDQUg5QyxDQURKO0FBS0EsY0FBSyxjQUFMLEdBQXNCLGNBQXRCO0FBQ0EsY0FBSyxNQUFMO0FBWm1EO0FBYXREOzs7O2lDQUVRO0FBQ0wsZ0JBQUksZ0JBQWdCO0FBQ2hCLHVCQUFPLEtBQUssU0FBTCxFQURTO0FBRWhCLDBCQUFVLEtBRk07QUFHaEIseUJBQVMsQ0FBQyxPQUFELEVBQVUsa0JBQVYsRUFBOEIsYUFBOUIsQ0FITztBQUloQix5QkFBUywyQ0FDTCxLQUFLLEtBQUwsQ0FBVyxVQUROLEVBRUwsRUFGSyxFQUdMLEVBSEssRUFJTCxFQUpLLEVBS0wsS0FBSyxXQUxBLEVBTUwsS0FBSyxtQkFOQSxFQU9MLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxnQkFBZixDQVBLO0FBSk8sYUFBcEI7O0FBZUEsZ0JBQUksT0FBTyxjQUFQLENBQXNCLFNBQXRCLENBQWdDLCtCQUFoQyxDQUFKLEVBQXNFO0FBQ2xFLG9CQUFJLFFBQVEsS0FBSyxLQUFMLENBQVcsUUFBWCxDQUFvQixHQUFwQixDQUFaO0FBQ0EsOEJBQWMsT0FBZCxHQUF3QiwyQ0FDcEIsSUFEb0IsRUFFcEIsU0FBUyxNQUFNLElBRkssRUFHcEIsS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLE9BQWYsQ0FIb0IsRUFJcEIsS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLGtCQUFmLENBSm9CLEVBS3BCLEtBQUssV0FMZSxFQU1wQixLQUFLLG1CQU5lLEVBT3BCLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxnQkFBZixDQVBvQixDQUF4QjtBQVNIOztBQUVELGlCQUFLLEtBQUwsR0FBYSxJQUFJLFlBQUosQ0FBVSxhQUFWLENBQWI7QUFDQSxpQkFBSyxXQUFMLENBQWlCLEtBQUssS0FBTCxDQUFXLEdBQTVCO0FBQ0EsaUJBQUssWUFBTCxDQUFrQixLQUFLLEtBQUwsQ0FBVyxHQUE3QjtBQUNBLGlCQUFLLEtBQUwsQ0FBVyxJQUFYO0FBQ0g7OztxQ0FFWSxLLEVBQU87QUFBQTs7QUFDaEIsa0JBQU0sSUFBTixDQUFXLGVBQVgsRUFBNEIsRUFBNUIsQ0FBK0IsT0FBL0IsRUFBd0MsWUFBTTtBQUMxQyxvQkFBSSxPQUFPLE1BQU0sSUFBTixDQUFXLG9CQUFYLEVBQWlDLEdBQWpDLEVBQVg7O0FBRUEsb0JBQUksT0FBTyxDQUFYLEVBQWM7QUFDViwyQkFBSyxZQUFMLENBQWtCLElBQWxCO0FBQ0gsaUJBRkQsTUFFTztBQUNILDJCQUFLLGlCQUFMLENBQXVCLE9BQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxJQUFmLENBQXZCO0FBQ0g7QUFDSixhQVJEOztBQVVBLGtCQUFNLElBQU4sQ0FBVywyQkFBWCxFQUF3QyxFQUF4QyxDQUEyQyxPQUEzQyxFQUFvRCxZQUFNO0FBQ3RELG9CQUFJLG1DQUFKLENBQTZCLE9BQUssS0FBbEMsRUFBeUMsT0FBSyxjQUE5QztBQUNILGFBRkQ7O0FBSUEsa0JBQU0sSUFBTixDQUFXLFNBQVgsRUFBc0IsRUFBdEIsQ0FBeUIsT0FBekIsRUFBa0MsWUFBTTtBQUNwQyxzQkFBTSxJQUFOLENBQVcscUJBQVgsRUFBa0MsS0FBbEM7QUFDSCxhQUZEOztBQUlBLGtCQUFNLElBQU4sQ0FBVyxvQkFBWCxFQUFpQyxFQUFqQyxDQUFvQyxRQUFwQyxFQUE4QyxZQUFNO0FBQ2hELHVCQUFLLFdBQUwsQ0FBaUIsS0FBakI7QUFDSCxhQUZEO0FBR0g7OztvQ0FFVztBQUNSLGdCQUFJLEtBQUssV0FBVCxFQUFzQjtBQUNsQix1QkFBTyxLQUFLLGlDQUFMLENBQVA7QUFDSCxhQUZELE1BRU8sSUFBSSxLQUFLLG1CQUFULEVBQThCO0FBQ2pDLHVCQUFPLEtBQUssMkNBQUwsQ0FBUDtBQUNILGFBRk0sTUFFQTtBQUNILHVCQUFPLEtBQUssMEJBQUwsQ0FBUDtBQUNIO0FBQ0o7OztvQ0FFVyxLLEVBQU87QUFDZixnQkFBTSxjQUFjLE1BQU0sSUFBTixDQUFXLHNCQUFYLENBQXBCO0FBQ0Esd0JBQVksS0FBWjs7QUFFQSxnQkFBSSxPQUFPLE1BQU0sSUFBTixDQUFXLG9CQUFYLEVBQWlDLEdBQWpDLEVBQVg7QUFDQSxnQkFBSSxPQUFPLEVBQVg7O0FBRUEsZ0JBQUksT0FBTyxDQUFYLEVBQWM7QUFDVixvQkFBSSxPQUFPLDBCQUFRLElBQVIsQ0FBWDtBQUNBLHFCQUFLLFdBQUwsSUFBb0IsS0FBSyxtQkFBekIsR0FDTyxPQUFPLEtBQUssZ0NBQUwsRUFBdUM7QUFDM0Msb0NBQWdCLEtBQUssV0FBTCxFQUFrQixFQUFFLEdBQUcsSUFBTCxFQUFsQjtBQUQyQixpQkFBdkMsQ0FEZCxHQUlPLE9BQU8sS0FBSyxxQ0FBTCxFQUE0QztBQUNoRCxvQ0FBZ0IsS0FBSyxXQUFMLEVBQWtCLEVBQUUsR0FBRyxJQUFMLEVBQWxCO0FBRGdDLGlCQUE1QyxDQUpkO0FBT0gsYUFURCxNQVNPO0FBQ0gsdUJBQU8sS0FBSyxzQ0FBTCxDQUFQO0FBQ0g7O0FBRUQsd0JBQVksTUFBWixDQUFtQixJQUFuQjtBQUNIOzs7cUNBRVksSSxFQUFNO0FBQ2YsbUJBQU8sV0FBUCxDQUFtQixLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsSUFBZixDQUFuQixFQUF5QyxJQUF6Qzs7QUFFQSxnQkFBSSxRQUFRLEtBQUssS0FBakI7QUFDQSxnQkFBSSxlQUFlLElBQW5CO0FBQ0EsZ0JBQUksZUFBZSxLQUFLLFdBQXhCO0FBQ0EsZ0JBQUksY0FBYyxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsZ0JBQWYsQ0FBbEI7QUFDQSxnQkFBSSxVQUFVO0FBQ1YsMkJBQVcsWUFERDtBQUVWLDhCQUFjLFlBRko7QUFHViw2QkFBYSxXQUhIO0FBSVYsZ0NBQWdCLEtBQUs7QUFKWCxhQUFkO0FBTUEsbUJBQU8sWUFBUCxDQUFvQixPQUFwQixDQUE0QixlQUE1QixFQUE2QztBQUN6Qyw0QkFBWSxLQUQ2QjtBQUV6QztBQUZ5QyxhQUE3Qzs7QUFLQSxnQkFBSSxLQUFLLFdBQUwsSUFBb0IsS0FBSyxtQkFBN0IsRUFBa0Q7QUFDOUMsb0JBQUksb0NBQUosQ0FBNEIsS0FBSyxLQUFqQyxFQUF3QywwQkFBUSxJQUFSLENBQXhDO0FBQ0gsYUFGRCxNQUVPO0FBQ0gscUJBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxJQUFmLENBQW9CLHFCQUFwQixFQUEyQyxLQUEzQztBQUNIO0FBQ0o7Ozs7RUFuSXlDLFNBQVMsSTs7cUJBQWxDLGdCOzs7Ozs7OztjQ1pKLE07SUFBVCxJLFdBQUEsSTs7cUJBQ08sVUFBQyxJQUFELEVBQU8sS0FBUCxFQUFjLEtBQWQsRUFBcUIsTUFBckIsRUFBNkIsV0FBN0IsRUFBMEMsbUJBQTFDLEVBQStELFdBQS9EO0FBQUEscUdBR1IsT0FBTyxjQUFQLENBQXNCLFNBQXRCLENBQWdDLCtCQUFoQyxtQkFDYyxLQURkLG1FQUU2QixLQUY3Qix1REFHMEIsTUFIMUIsMkJBS2MsS0FBSyxNQUFMLENBQVksWUFBWixDQUF5QixJQUx2QyxtRUFNNkIsS0FBSyxLQU5sQyx1REFPMEIsS0FBSyxnQkFQL0IsU0FIUSw2R0FnQkwsZUFBZSxtQkFBZiw0Q0FDeUMsS0FBSyw0Q0FBTCxDQUR6QyxnQkFFSSxFQWxCQyxtRkFxQkQsc0RBQ2dDLEtBQUssb0NBQUwsQ0FEaEMsaUJBRUksRUF2QkgsMENBeUJpQixzQkFBc0IsRUFBdEIsR0FBMkIsVUF6QjVDLFdBeUIwRCxlQUFlLG1CQUFmLEdBQXFDLEtBQUssbUNBQUwsRUFBMEMsRUFBQyxLQUFLLENBQU4sRUFBMUMsQ0FBckMsR0FBMkYsS0FBSyxpQ0FBTCxFQUF3QyxFQUFDLEtBQUssQ0FBTixFQUF4QyxDQXpCckosb0RBMEJrQixlQUFlLG1CQUFmLEdBQXFDLEtBQUssbUNBQUwsRUFBMEMsRUFBQyxLQUFLLEVBQU4sRUFBMUMsQ0FBckMsR0FBNEYsS0FBSyxpQ0FBTCxFQUF3QyxFQUFDLEtBQUssRUFBTixFQUF4QyxDQTFCOUcsb0RBMkJrQixlQUFlLG1CQUFmLEdBQXFDLEtBQUssbUNBQUwsRUFBMEMsRUFBQyxLQUFLLEVBQU4sRUFBMUMsQ0FBckMsR0FBNEYsS0FBSyxpQ0FBTCxFQUF3QyxFQUFDLEtBQUssRUFBTixFQUF4QyxDQTNCOUcsb0RBNEJrQixlQUFlLG1CQUFmLEdBQXFDLEtBQUssbUNBQUwsRUFBMEMsRUFBQyxLQUFLLEVBQU4sRUFBMUMsQ0FBckMsR0FBNEYsS0FBSyxpQ0FBTCxFQUF3QyxFQUFDLEtBQUssRUFBTixFQUF4QyxDQTVCOUcsb0RBNkJrQixlQUFlLG1CQUFmLEdBQXFDLEtBQUssbUNBQUwsRUFBMEMsRUFBQyxLQUFLLEVBQU4sRUFBMUMsQ0FBckMsR0FBNEYsS0FBSyxpQ0FBTCxFQUF3QyxFQUFDLEtBQUssRUFBTixFQUF4QyxDQTdCOUcsb0RBOEJrQixlQUFlLG1CQUFmLEdBQXFDLEtBQUssbUNBQUwsRUFBMEMsRUFBQyxLQUFLLEVBQU4sRUFBMUMsQ0FBckMsR0FBNEYsS0FBSyxpQ0FBTCxFQUF3QyxFQUFDLEtBQUssRUFBTixFQUF4QyxDQTlCOUcscURBK0JtQixlQUFlLG1CQUFmLEdBQXFDLEtBQUssbUNBQUwsRUFBMEMsRUFBQyxLQUFLLEdBQU4sRUFBMUMsQ0FBckMsR0FBNkYsS0FBSyxpQ0FBTCxFQUF3QyxFQUFDLEtBQUssR0FBTixFQUF4QyxDQS9CaEgsNlNBeUM0RCxlQUFlLG1CQUFmLEdBQXFDLEtBQUssU0FBTCxDQUFyQyxHQUF1RCxLQUFLLDBCQUFMLENBekNuSCxnR0EyQ0MsZUFBZSxtQkFBZixHQUFxQyxLQUFLLFNBQUwsQ0FBckMsR0FBdUQsS0FBSywwQkFBTCxDQTNDeEQsc0NBNkNULGVBQWUsbUJBQWYsSUFBc0MsQ0FBQyxXQUF2QyxHQUNHLEVBREgsMktBR2UsS0FBSyxnQ0FBTCxDQUhmLCtCQTdDUyxnSUFrRHlHLEtBQUssUUFBTCxDQWxEekc7QUFBQSxDOzs7Ozs7Ozs7OztBQ0RmOzs7O0FBQ0E7Ozs7Ozs7Ozs7Y0FDK0IsTTtJQUF2QixJLFdBQUEsSTtJQUFNLFksV0FBQSxZOztJQUVPLHVCOzs7QUFDakIscUNBQVksS0FBWixFQUFtQixjQUFuQixFQUFtQztBQUFBOztBQUFBLHVKQUN0QixTQURzQjs7QUFFL0IsY0FBSyxLQUFMLEdBQWEsS0FBYjtBQUNBLGNBQUssY0FBTCxHQUFzQixjQUF0QjtBQUNBLGNBQUssR0FBTCxHQUFXLFlBQVg7QUFDQSxjQUFLLE1BQUw7QUFMK0I7QUFNbEM7Ozs7aUNBRU87QUFDSixnQkFBSSxnQkFBZ0I7QUFDaEIsdUJBQU8sS0FBSyxpQ0FBTCxDQURTO0FBRWhCLDBCQUFVLEtBRk07QUFHaEIseUJBQVMsQ0FBQyxPQUFELEVBQVUsa0JBQVYsRUFBOEIsYUFBOUIsQ0FITztBQUloQix5QkFBUyxrREFBUyxLQUFLLEtBQUwsQ0FBVyxVQUFwQixFQUFnQyxFQUFoQyxFQUFvQyxFQUFwQyxFQUF3QyxFQUF4QyxFQUE0QyxLQUFLLGNBQWpEO0FBSk8sYUFBcEI7O0FBT0EsZ0JBQUcsT0FBTyxjQUFQLENBQXNCLFNBQXRCLENBQWdDLCtCQUFoQyxDQUFILEVBQW9FO0FBQ2hFLG9CQUFJLFFBQVEsS0FBSyxLQUFMLENBQVcsUUFBWCxDQUFvQixHQUFwQixDQUFaO0FBQ0EsOEJBQWMsT0FBZCxHQUF3QixrREFBUyxJQUFULEVBQWUsU0FBUyxNQUFNLElBQTlCLEVBQW9DLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxPQUFmLENBQXBDLEVBQTZELEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxrQkFBZixDQUE3RCxFQUFpRyxLQUFLLGNBQXRHLENBQXhCO0FBQ0g7O0FBRUQsaUJBQUssS0FBTCxHQUFhLElBQUksWUFBSixDQUFVLGFBQVYsQ0FBYjtBQUNBLGlCQUFLLFlBQUwsQ0FBa0IsS0FBSyxLQUFMLENBQVcsR0FBN0I7QUFDQSxpQkFBSyxLQUFMLENBQVcsSUFBWDtBQUNIOzs7cUNBRVksSyxFQUFNO0FBQUE7O0FBQ2Ysa0JBQU0sSUFBTixDQUFXLFNBQVgsRUFBc0IsRUFBdEIsQ0FBeUIsT0FBekIsRUFBa0MsWUFBTTtBQUNwQyxzQkFBTSxJQUFOLENBQVcscUJBQVgsRUFBa0MsS0FBbEM7QUFDSCxhQUZEOztBQUlBLGlCQUFLLEtBQUwsQ0FBVyxFQUFYLENBQWMsY0FBZCxFQUE4QjtBQUFBLHVCQUFNLE9BQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsd0JBQWpCLENBQU47QUFBQSxhQUE5QjtBQUNIOzs7O0VBakNnRCxTQUFTLEk7O3FCQUF6Qyx1Qjs7Ozs7Ozs7Y0NKSixNO0lBQVQsSSxXQUFBLEk7O3FCQUNPLFVBQUMsSUFBRCxFQUFPLEtBQVAsRUFBYyxLQUFkLEVBQXFCLE1BQXJCLEVBQTZCLGNBQTdCO0FBQUEscUdBR1IsT0FBTyxjQUFQLENBQXNCLFNBQXRCLENBQWdDLCtCQUFoQyxtQkFDYyxLQURkLG1FQUU2QixLQUY3Qix1REFHMEIsTUFIMUIsMkJBS2MsS0FBSyxNQUFMLENBQVksWUFBWixDQUF5QixJQUx2QyxtRUFNNkIsS0FBSyxLQU5sQyx1REFPMEIsS0FBSyxnQkFQL0IsU0FIUSxzSkFnQkwsbUJBQW1CLE9BQW5CLFFBQ0ssS0FBSyxrREFBTCxDQURMLFFBRUssS0FBSyw0Q0FBTCxFQUFtRCxFQUFDLGdCQUFnQixLQUFLLFdBQUwsRUFBa0IsRUFBQyxHQUFHLGNBQUosRUFBbEIsQ0FBakIsRUFBbkQsQ0FsQkEsb0xBd0J5RyxLQUFLLE9BQUwsQ0F4QnpHO0FBQUEsQzs7Ozs7Ozs7Ozs7OztBQ0lmOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7OztBQVpBLElBQU0sV0FBVyxPQUFPLFFBQXhCO0FBQ0EsSUFBTSxPQUFPLE9BQU8sSUFBcEI7QUFDQSxJQUFNLE1BQU0sT0FBTyxHQUFuQjtBQUNBLElBQU0sa0JBQWtCLENBQUMsT0FBRCxFQUFVLFdBQVYsRUFBdUIsT0FBdkIsRUFBZ0MsVUFBaEMsQ0FBeEI7O0lBV3FCLHFCOzs7QUFDakIseUNBU0c7QUFBQSxZQVJDLElBUUQsUUFSQyxJQVFEO0FBQUEsWUFQQyxLQU9ELFFBUEMsS0FPRDtBQUFBLFlBTkMsR0FNRCxRQU5DLEdBTUQ7QUFBQSxZQUxDLGNBS0QsUUFMQyxjQUtEO0FBQUEsWUFKQyxjQUlELFFBSkMsY0FJRDtBQUFBLFlBSEMsYUFHRCxRQUhDLGFBR0Q7QUFBQSxrQ0FGQyxTQUVEO0FBQUEsWUFGQyxTQUVELGtDQUZhLEtBRWI7QUFBQSxtQ0FEQyxVQUNEO0FBQUEsWUFEQyxVQUNELG1DQURjLElBQ2Q7O0FBQUE7O0FBQUEsbUpBQ1UsU0FEVjs7QUFFQyxjQUFLLElBQUwsR0FBWSxJQUFaO0FBQ0EsY0FBSyxLQUFMLEdBQWEsS0FBYjtBQUNBLGNBQUssR0FBTCxHQUFXLEdBQVg7QUFDQSxjQUFLLGNBQUwsR0FBc0IsY0FBdEI7QUFDQSxjQUFLLGNBQUwsR0FBc0IsY0FBdEI7QUFDQSxjQUFLLGFBQUwsR0FBcUIsYUFBckI7QUFDQSxjQUFLLFNBQUwsR0FBaUIsU0FBakI7QUFDQSxjQUFLLFVBQUwsR0FBa0IsVUFBbEI7QUFDQSxjQUFLLE1BQUwsR0FBYyxFQUFkOztBQUVBLFlBQUksUUFBUSxPQUFPLFNBQVAsQ0FBaUIsS0FBN0I7QUFDQSxjQUFLLDBCQUFMLEdBQWtDLEVBQzlCLE1BQUssY0FBTCxDQUFvQixTQUFwQixDQUE4QixpQkFBOUIsS0FBb0QsQ0FBQyxLQUR2QixDQUFsQztBQUdBLGNBQUssbUJBQUwsR0FDSSxNQUFLLElBQUwsQ0FBVSxXQUFWLElBQ0EsTUFBSyxJQUFMLENBQVUsWUFEVixJQUVBLE1BQUssY0FBTCxDQUFvQixTQUFwQixDQUE4QixpQkFBOUIsQ0FGQSxJQUdBLENBQUMsS0FIRCxJQUlBLE1BQUssY0FBTCxDQUFvQixTQUFwQixDQUE4QixjQUE5QixDQUxKO0FBTUEsY0FBSyxNQUFMLENBQVksSUFBWixDQUNLLE1BQUssS0FBTCxHQUFhLElBQUksa0JBQUosQ0FBVTtBQUNwQixtQkFBTyxNQUFLLEtBRFE7QUFFcEIseUJBQWEsRUFBRSxRQUFRLEdBQVYsRUFBZSxRQUFRLEdBQXZCLEVBQTRCLFNBQVMsR0FBckM7QUFGTyxTQUFWLENBRGxCO0FBTUEsY0FBSyxNQUFMLENBQVksSUFBWixDQUNLLE1BQUssV0FBTCxHQUFtQixJQUFJLDZCQUFKLENBQXFCO0FBQ3JDLG9CQUFRLE1BQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxNQUFmLEVBQXVCO0FBRE0sU0FBckIsQ0FEeEI7QUE1QkQ7QUFpQ0Y7Ozs7aUNBRVE7QUFDTCxnQkFBSSxnQkFBZ0IsUUFBaEIsQ0FBeUIsS0FBSyxJQUFMLENBQVUsSUFBVixDQUFlLEVBQXhDLENBQUosRUFBaUQ7QUFDN0MscUJBQUssV0FBTCxDQUFpQixNQUFqQjs7QUFFQSxvQkFBSSxRQUFPLEtBQUssY0FBTCxFQUFYOztBQUVBLG9CQUFJLGdCQUFnQjtBQUNoQiwyQkFBTyxLQUFLLGdCQUFMLENBRFM7QUFFaEIsOEJBQVUsS0FGTTtBQUdoQiw2QkFBUyxDQUFDLE9BQUQsRUFBVSx1QkFBVixDQUhPO0FBSWhCLDZCQUFTO0FBSk8saUJBQXBCOztBQU9BLHFCQUFLLEtBQUwsR0FBYSxJQUFJLFlBQUosQ0FBVSxhQUFWLENBQWI7QUFDQSxxQkFBSyxZQUFMLENBQWtCLEtBQUssS0FBTCxDQUFXLEdBQTdCO0FBQ0EscUJBQUssS0FBTCxDQUFXLElBQVg7QUFDSCxhQWZELE1BZU87QUFDSCx1QkFBTyxNQUFQLENBQWMsR0FBZCxDQUFrQixPQUFsQixFQUEyQixpQ0FBM0IsRUFBOEQ7QUFDMUQsNEJBQVEsbUJBRGtEO0FBRTFELDJCQUFPLEtBQUssSUFBTCxDQUFVLEtBRnlDO0FBRzFELHdCQUFJLEtBQUssSUFBTCxDQUFVLEVBSDRDO0FBSTFELDBCQUFNLEtBQUssSUFBTCxDQUFVO0FBSjBDLGlCQUE5RDtBQU1BLG9CQUFJLE9BQUosRUFBYTtBQUNULDRCQUFRLElBQVIsQ0FBYSxLQUFLLGNBQUwsQ0FBYixFQUFtQyxPQUFuQztBQUNIO0FBQ0o7QUFDSjs7O3FDQUVZLEksRUFBTTtBQUFBOztBQUNmLGdCQUFJLGFBQWEsS0FBSyxLQUF0QjtBQUNBLGlCQUFLLElBQUwsQ0FBVSwwQkFBVixFQUFzQyxLQUF0QyxDQUE0QyxVQUFDLEdBQUQsRUFBUztBQUNqRCxvQkFBSSxXQUFXLEVBQUUsSUFBSSxhQUFOLEVBQXFCLElBQXJCLENBQTBCLGdCQUExQixDQUFmOztBQUVBLG9CQUNJLE9BQU8sZUFBUCxDQUF1QixpQkFBdkIsQ0FDSSxPQUFPLGVBQVAsQ0FBdUIsWUFBdkIsQ0FBb0MsVUFEeEMsS0FHQSxFQUNJLFFBQVEsR0FBUixDQUFZLDhCQUFaLEtBQ0EsUUFBUSxHQUFSLENBQVksOEJBQVosTUFBZ0QsR0FGcEQsQ0FIQSxJQU9BLE9BQU8saUJBQVAsQ0FBeUIsR0FBekIsQ0FBNkIsbUJBQTdCLEtBQXFELElBUnpELEVBU0U7QUFDRTtBQUNBLHdCQUFJLGNBQUo7O0FBRUEsd0JBQUksZ0JBQWdCLElBQUksT0FBTyxNQUFQLENBQWMsYUFBbEIsRUFBaUM7QUFDakQsZ0NBQVEsUUFEeUM7QUFFakQsaUNBQVMsT0FBSyxJQUFMLENBQVU7QUFGOEIscUJBQWpDLENBQXBCOztBQUtBLHdCQUFJLDZCQUFKLENBQXFCO0FBQ2pCLDZCQUFLLE9BQUssR0FETztBQUVqQiwyQ0FBbUIsT0FBTyxpQkFGVDtBQUdqQixnQ0FBUSxxQkFIUztBQUlqQiw2Q0FBcUI7QUFKSixxQkFBckIsRUFLRyxHQUxIO0FBTUg7QUFDRCx1QkFBSyxHQUFMLENBQVMsT0FBVCxDQUFpQixnQkFBakIsRUFBbUM7QUFDL0IsMENBRCtCO0FBRS9CLDZCQUFTLEVBQUUsa0JBQUY7QUFGc0IsaUJBQW5DO0FBSUgsYUFoQ0Q7O0FBa0NBLGlCQUFLLElBQUwsQ0FBVSxtQkFBVixFQUErQixLQUEvQixDQUFxQyxVQUFDLEdBQUQsRUFBUztBQUMxQyxvQkFBSSxXQUFXLEVBQUUsSUFBSSxhQUFOLEVBQXFCLElBQXJCLENBQTBCLGdCQUExQixDQUFmO0FBQ0EsdUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsZ0JBQWpCLEVBQW1DO0FBQy9CLDBDQUQrQjtBQUUvQiw2QkFBUyxFQUFFLGtCQUFGO0FBRnNCLGlCQUFuQztBQUlILGFBTkQ7O0FBUUEsaUJBQUssSUFBTCxDQUFVLDhDQUFWLEVBQTBELEtBQTFELENBQ0ksVUFBQyxHQUFELEVBQVM7QUFDTCxvQkFBSSxpQ0FBSixDQUF5QixFQUFFLElBQUksYUFBTixDQUF6QjtBQUNBLG9CQUFJLFdBQVcsRUFBRSxJQUFJLGFBQU4sRUFBcUIsSUFBckIsQ0FBMEIsZ0JBQTFCLENBQWY7QUFDQSx1QkFBSyxHQUFMLENBQVMsT0FBVCxDQUFpQixnQkFBakIsRUFBbUM7QUFDL0IsMENBRCtCO0FBRS9CLDZCQUFTLEVBQUUsa0JBQUY7QUFGc0IsaUJBQW5DO0FBSUgsYUFSTDs7QUFXQSxnQkFBSSxhQUFhLEtBQUssSUFBTCxDQUFVLGdDQUFWLENBQWpCO0FBQ0EsZ0JBQUksVUFBSixFQUFnQjtBQUNaLG9CQUFJLHlDQUFKLENBQWlDLFVBQWpDLEVBQTZDLE1BQTdDO0FBQ0g7O0FBRUQsaUJBQUssSUFBTCxDQUFVLHFCQUFWLEVBQWlDLEtBQWpDLENBQXVDO0FBQUEsdUJBQ25DLE9BQUssdUJBQUwsRUFEbUM7QUFBQSxhQUF2QztBQUdIOzs7a0RBMEN5QjtBQUN0QixnQkFBTSxRQUFRLEtBQUssS0FBTCxDQUFXLEdBQXpCO0FBQ0EsZ0JBQU0sZ0JBQWdCLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxJQUFmLENBQW9CLGFBQXBCLEVBQW1DLEVBQXpEOztBQUVBLGtCQUFNLFFBQU4sQ0FBZSxtQ0FBZjtBQUNBLDBCQUFjLElBQWQ7O0FBRUEsbUJBQU8seUJBQVAsQ0FBaUMsTUFBakMsQ0FBd0M7QUFDcEMseUJBQVMsbUJBQU07QUFDWCwyQkFBTyx5QkFBUCxDQUFpQyxNQUFqQyxDQUF3QztBQUNwQyxpQ0FBUyxPQUFPLDZCQURvQjtBQUVwQyw4QkFBTTtBQUY4QixxQkFBeEM7O0FBS0Esa0NBQWMsSUFBZDtBQUNBLDBCQUFNLFdBQU4sQ0FBa0IsbUNBQWxCO0FBQ0gsaUJBVG1DO0FBVXBDLHNCQUFNLElBVjhCO0FBV3BDLDZCQUFhLEtBQUssSUFBTCxDQUFVLFdBWGE7QUFZcEMseUJBQVMsS0FBSyxJQUFMLENBQVUsT0FaaUI7QUFhcEMseUNBQXlCLENBQUMsRUFDdEIsS0FBSyxJQUFMLENBQVUsa0JBQVYsSUFBZ0MsS0FBSyxJQUFMLENBQVUsZ0JBRHBCO0FBYlUsYUFBeEM7QUFpQkg7Ozt5Q0FFZ0I7QUFDYixnQkFBTSxhQUFhLEtBQUssU0FBTCxJQUFrQixLQUFLLFVBQUwsS0FBb0IsY0FBekQ7QUFDQSxnQkFBTSxVQUFVLEtBQUssY0FBTCxDQUFvQixVQUFwQixDQUFoQjtBQUNBLG1CQUFPLEtBQUssa0JBQUwsQ0FBd0IsT0FBeEIsRUFBaUMsVUFBakMsQ0FBUDtBQUNIOzs7dUNBRWMsVSxFQUFZO0FBQ3ZCLGlCQUFLLHVCQUFMOztBQUVBLGdCQUFJLGVBQWUsRUFBbkI7QUFDQSxnQkFBSSxjQUFjLEVBQWxCO0FBQ0EsMkJBQWUsb0RBQ1gsS0FBSyxjQURNLEVBRVgsS0FBSyxJQUZNLEVBR1g7QUFDSSx1QkFBTyxPQUFPLFNBQVAsQ0FBaUIsS0FENUI7QUFFSSxrQ0FBa0IsS0FBSyxnQkFGM0I7QUFHSSxpQ0FBaUIsT0FBTyxTQUFQLENBQWlCLFNBQWpCLENBQTJCLEtBQTNCLENBQ2IsbUNBRGEsQ0FIckI7QUFNSSxnQ0FBZ0IsT0FBTyxTQUFQLENBQWlCLGNBTnJDO0FBT0ksc0NBUEo7QUFRSSx5Q0FBeUIsS0FBSztBQVJsQyxhQUhXLENBQWY7O0FBZUEsc0NBQ00sV0FETix1QkFHUSxhQUFhLFVBQWIsS0FBNEIsUUFBNUIsR0FDTSxLQUFLLGtCQUFMLEVBRE4sR0FFTSxFQUxkLHdCQVFRLGFBQWEsVUFBYixLQUE0QixVQUE1QixHQUNNLEtBQUssb0JBQUwsQ0FBMEIsYUFBYSxRQUF2QyxDQUROLEdBRU0sRUFWZCx3QkFhUSxhQUFhLFVBQWIsS0FBNEIsYUFBNUIsR0FDTSxLQUFLLG9CQUFMLENBQTBCLGFBQWEsUUFBdkMsRUFBaUQsSUFBakQsQ0FETixHQUVNLEVBZmQsd0JBa0JRLGFBQWEsVUFBYixLQUE0QixRQUE1QixHQUNNLEtBQUssa0JBQUwsRUFETixHQUVNLEVBcEJkLHdCQXVCUSxLQUFLLDBCQUFMLElBQ0EsYUFBYSxrQ0FBYixLQUFvRCxVQURwRCxHQUVNLEtBQUssc0JBQUwsRUFGTixHQUdNLEVBMUJkLHdCQTZCUSxhQUFhLG1CQUFiLHlDQUN3QyxLQUM5Qiw4Q0FEOEIsQ0FEeEMsY0FJTSxFQWpDZCx3QkFvQ1EsYUFBYSxnQkFBYixHQUNNLEtBQUssc0JBQUwsRUFETixHQUVNLEVBdENkLHdCQXlDUSxhQUFhLFdBQWIsSUFBNEIsQ0FBQyxLQUFLLG1CQUFsQyxHQUNNLEtBQUssbUJBQUwsRUFETixHQUVNLEVBM0NkLHdCQTZDTSxLQUFLLG1CQUFMLEdBQTJCLEtBQUsscUJBQUwsRUFBM0IsR0FBMEQsRUE3Q2hFLHdCQStDUSxhQUFhLFNBQWIsS0FBMkIsUUFBM0IsR0FDTSxLQUFLLGtCQUFMLEVBRE4sR0FFTSxFQWpEZCx3QkFvRFEsYUFBYSxvQkFBYixJQUNBLGFBQWEsU0FBYixLQUEyQixXQUQzQixJQUVDLGFBQWEsVUFBYixLQUE0QixXQUE1QixJQUNHLEtBQUssY0FBTCxDQUFvQixTQUFwQixDQUNJLDBCQURKLENBSEosSUFNQyxhQUFhLFFBQWIsS0FBMEIsZUFBMUIsSUFDRyxhQUFhLFVBQWIsS0FBNEIsUUFQaEMsR0FRTSxLQUFLLHdCQUFMLEVBUk4sR0FTTSxFQTdEZCx3QkFnRVEsYUFBYSwyQkFBYixHQUNNLEtBQUssb0JBQUwsRUFETixHQUVNLEVBbEVkLHdCQXFFUSxhQUFhLGdDQUFiLEdBQ00sS0FBSyxzQkFBTCxFQUROLEdBRU0sRUF2RWQsd0JBMEVRLGFBQWEsMEJBQWIsR0FDTSxLQUFLLDJCQUFMLEVBRE4sR0FFTSxFQTVFZCx3QkErRVEsYUFBYSwyQkFBYixHQUNNLEtBQUssNkJBQUwsQ0FDSSxLQUFLLElBQUwsQ0FBVSxpQkFEZCxDQUROLEdBSU0sRUFuRmQsd0JBc0ZRLEtBQUssMEJBQUwsSUFDQSxhQUFhLGtDQUFiLEtBQW9ELE1BRHBELEdBRU0sS0FBSyxzQkFBTCxFQUZOLEdBR00sRUF6RmQsdUJBMkZNLEtBQUssK0JBQUwsRUEzRk47QUE2Rkg7OztnREFFdUI7QUFDcEIsZ0JBQUksS0FBSyxtQkFBVCxFQUE4QjtBQUMxQixtUEFHcUQsOEJBQzdCLDhCQUQ2QixDQUhyRCwySEFPeUIsS0FDRCxtQ0FEQyxDQVB6QjtBQWFIO0FBQ0o7OztpREFFd0I7QUFDckIsa0hBRXFDLEtBQzdCLDZDQUQ2QixDQUZyQztBQU9IOzs7aURBRXdCO0FBQ3JCLDJKQUdhLEtBQUssc0NBQUwsQ0FIYjtBQU9IOzs7MkNBRWtCLFcsRUFBYSxVLEVBQVk7QUFDeEMsZ0JBQUksdUNBQW1DLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxPQUFmLENBQW5DLFlBQUo7QUFDQSxnQkFBSSxpQkFBaUIsS0FBSyxhQUFMLENBQW1CLGNBQXhDOztBQUVBLGdCQUFJLG1CQUFtQixFQUF2QjtBQUNBLGdCQUFJLGlCQUFpQixDQUFyQixFQUF3QjtBQUNwQixvQkFBSSxLQUFLLElBQUwsQ0FBVSxVQUFkLEVBQTBCO0FBQ3RCLHVDQUFtQixLQUNmLGdEQURlLEVBRWYsRUFBRSxPQUFPLGNBQVQsRUFGZSxDQUFuQjtBQUlILGlCQUxELE1BS087QUFDSCx1Q0FBbUIsS0FBSyxxQ0FBTCxFQUE0QztBQUMzRCwrQkFBTztBQURvRCxxQkFBNUMsQ0FBbkI7QUFHSDtBQUNKLGFBWEQsTUFXTyxJQUNILEVBQ0ksS0FBSyxjQUFMLENBQW9CLFNBQXBCLENBQ0ksaUNBREosS0FFSyxLQUFLLElBQUwsQ0FBVSxVQUhuQixDQURHLEVBTUw7QUFDRSxtQ0FBbUIsS0FBSyx1Q0FBTCxDQUFuQjtBQUNIOztBQUVELHFJQUd1QyxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsSUFBZixFQUh2QywrSkFPb0IsS0FBSyxJQUFMLENBQVUsZ0JBQVYsR0FDTSxLQUNJLHlDQURKLEVBRUk7QUFDSSxzQkFBTSxLQUFLLElBQUwsQ0FBVSxPQURwQjtBQUVJLHVCQUFPLFNBRlg7QUFHSSx1QkFBTyxLQUFLLElBQUwsQ0FBVSxXQUFWLENBQ0Y7QUFKVCxhQUZKLENBRE4sR0FVTSxLQUFLLFNBQUwsR0FDQSxLQUFLLHlCQUFMLEVBQWdDO0FBQzVCLHVCQUFPLFNBRHFCO0FBRTVCLGdDQUFnQixLQUFLLElBQUwsQ0FBVTtBQUZFLGFBQWhDLENBREEsR0FLQSxLQUFLLGdDQUFMLEVBQXVDO0FBQ25DLHNCQUFNLEtBQUssSUFBTCxDQUFVLE9BRG1CO0FBRW5DLHVCQUFPO0FBRjRCLGFBQXZDLENBdEIxQiwwQ0E0Qm9CLEtBQUssU0FBTCxHQUNNLEVBRE4sdUNBRXNDLGdCQUZ0QyxXQTVCcEIsNERBa0NnQixLQUFLLElBQUwsQ0FBVSxjQUFWLENBQXlCLE1BQXpCLEdBQWtDLENBQWxDLEdBQ00sS0FBSyxvQkFBTCxFQUROLEdBRU0sRUFwQ3RCLGtHQXdDb0IsS0FBSyxTQUFMLElBQWtCLENBQUMsQ0FBQyxLQUFLLFVBQXpCLEdBQ00sMkRBQ2dELEtBQ3hDLDBDQUR3QyxDQURoRCwwT0FLOEksS0FDeEksa0RBRHdJLENBTDlJLCtFQVE0QixLQUN0Qiw0Q0FEc0IsQ0FSNUIsc0ZBWW9DLEtBQzVCLDJCQUQ0QixDQVpwQyxXQUROLEdBZ0JNLEVBeEQxQixtQ0EwRGtCLFdBMURsQiwrS0FrRVksS0FBSyxTQUFMLElBQWtCLENBQUMsQ0FBQyxLQUFLLFVBQXpCLEdBQ00sMkRBQ2dELEtBQ3hDLDBDQUR3QyxDQURoRCwwTkFLOEksS0FDeEksa0RBRHdJLENBTDlJLHVFQVE0QixLQUN0Qiw0Q0FEc0IsQ0FSNUIsOEVBWW9DLEtBQzVCLDJCQUQ0QixDQVpwQyxXQUROLEdBZ0JNLEVBbEZsQiwyQkFvRlUsV0FwRlY7QUF1Rkg7Ozs4Q0FFcUI7QUFDbEI7QUFDQTtBQUNBLDZJQUdnQixDQUFDLEtBQUssSUFBTCxDQUFVLG1CQUFYLDZGQUdFLEtBQUssSUFBTCxDQUhGLHFDQUtNLEVBUnRCO0FBV0g7Ozs2Q0FFb0I7QUFDakIsa0VBQW9ELElBQ2hELE9BQU8sTUFBUCxDQUFjLGFBRGtDLEVBRWhEO0FBQ0ksd0JBQVEsS0FBSyxJQUFMLENBQVUsWUFBVixDQUF1QixFQURuQztBQUVJLHlCQUFTLEtBQUssSUFBTCxDQUFVO0FBRnZCLGFBRmdELENBQXBELDJKQVNnQixLQUFLLElBQUwsQ0FBVSxZQUFWLENBQXVCLEVBVHZDLHlCQVVnQyxLQUFLLElBQUwsQ0FBVSxFQVYxQyxpREFXZ0Msa0JBQ0wsS0FBSyxJQUFMLENBQVUsWUFBVixDQUF1QixFQURsQixDQVhoQyx1Q0FjcUIsS0FBSywyQkFBTCxFQUFrQztBQUN2QyxxRUFBbUQsS0FDL0MsMEJBRCtDLENBQW5EO0FBRHVDLGFBQWxDLENBZHJCLGlIQXFCb0IsS0FDSiw2Q0FESSxDQXJCcEIsc1RBK0JZLEtBQUssSUFBTCxDQUFVLDBCQUFWLEdBQ00sS0FBSyw0QkFBTCxFQUROLEdBRU0sRUFqQ2xCO0FBb0NIOzs7dURBRThCO0FBQzNCLGdCQUFJLGlCQUFpQixFQUFyQjtBQUNBLGdCQUFJLEtBQUssSUFBTCxDQUFVLGtCQUFkLEVBQWtDO0FBQzlCLGlDQUFpQixLQUFLLGtCQUFMLEVBQWpCO0FBQ0g7O0FBRUQsNE5BR29CLEtBQUssSUFBTCxDQUFVLEVBSDlCLHNJQU1tRSxLQUN2Qyw0QkFEdUMsQ0FObkUsMlZBZW9CLEtBQUssSUFBTCxDQUFVLEVBZjlCLHdEQWlCc0IsY0FqQnRCO0FBcUJIOzs7bURBRTBCO0FBQ3ZCLGdCQUNJLENBQUMsS0FBSyxjQUFMLENBQW9CLFNBQXBCLENBQThCLG9CQUE5QixDQUFELElBQ0EsQ0FBQyxLQUFLLGNBQUwsQ0FBb0IsU0FBcEIsQ0FBOEIsY0FBOUIsQ0FERCxJQUVBLEtBQUssY0FBTCxDQUFvQixTQUFwQixDQUE4Qix5QkFBOUIsQ0FGQSxJQUdBLEtBQUssMEJBSlQsRUFLRTtBQUNFLDhFQUVJLEtBQUssSUFBTCxDQUFVLHlCQUFWLHVEQUVVLEtBQUssZ0NBQUwsRUFGVixvQ0FJTSxFQU5WO0FBU0g7O0FBRUQsZ0JBQ0ksQ0FBQyxLQUFLLGNBQUwsQ0FBb0IsU0FBcEIsQ0FBOEIsY0FBOUIsQ0FBRCxJQUNBLEtBQUssMEJBREwsSUFFQSxDQUFDLEtBQUssdUJBSFYsRUFJRTtBQUNFLHNGQUVZLEtBQUssSUFBTCxDQUFVLHlCQUFWLG9OQUlRLEtBQUssSUFBTCxDQUFVLEVBSmxCLHlMQVNvQixLQUFLLGNBQUwsQ0FBb0IsU0FBcEIsQ0FDSSxvQkFESixJQUdNLEtBQ0ksb0NBREosQ0FITixHQU1NLEtBQ0ksNkJBREosQ0FmMUIsMFpBMEJRLEtBQUssSUFBTCxDQUFVLEVBMUJsQiw0REE0QlUsS0FBSyxvQkFBTCxFQTVCVixzR0FnQ00sRUFsQ2xCO0FBcUNIOztBQUVELGtGQUVnQixLQUFLLGNBQUwsQ0FBb0IsU0FBcEIsQ0FBOEIsY0FBOUIsSUFDTSxLQUFLLGlDQUFMLEVBRE4sR0FFTSxFQUp0QixzREFRZ0IsS0FBSyxJQUFMLENBQVUseUJBQVYsR0FDTSxLQUFLLGdDQUFMLEVBRE4sR0FFTSxFQVZ0QjtBQWFIOzs7NERBRW1DO0FBQ2hDLGdCQUFJLENBQUMsS0FBSyxtQkFBVixFQUErQjtBQUMzQixvQkFBSSxLQUFLLGNBQUwsQ0FBb0IsU0FBcEIsQ0FBOEIsc0JBQTlCLENBQUosRUFBMkQ7QUFDdkQsd0RBQWtDLEtBQzlCLDRCQUQ4QixDQUFsQyw0TEFJYyxLQUFLLHVCQUFMLENBSmQ7QUFNSCxpQkFQRCxNQU9PO0FBQ0gsZ0tBQ00sS0FBSyx1QkFBTCxDQUROO0FBR0g7QUFDSixhQWJELE1BYU87QUFDSCx1QkFBTyxFQUFQO0FBQ0g7QUFDSjs7OzJEQUVrQztBQUMvQixnQkFBSSxlQUFlLE9BQU8sY0FBUCxDQUFzQixTQUF0QixDQUFnQyxvQkFBaEMsSUFDYixLQUFLLG9DQUFMLENBRGEsR0FFYixLQUFLLDZCQUFMLENBRk47QUFHQSxnQkFBSSxrQkFDQSxLQUFLLDBCQUFMLElBQW1DLENBQUMsS0FBSyx1QkFBekMsR0FDTSxLQUFLLG9CQUFMLEVBRE4sR0FFTSxFQUhWOztBQUtBLGdCQUNJLEtBQUssY0FBTCxDQUFvQixTQUFwQixDQUE4Qix5QkFBOUIsS0FDQSxDQUFDLEtBQUssMEJBRlYsRUFHRTtBQUNFLCtCQUFlLEtBQUssb0NBQUwsQ0FBZjtBQUNBLHlGQUNFLEtBQUssMENBQUwsQ0FERjtBQUVIOztBQUVELGdCQUFJLG9CQUFvQixFQUF4QixFQUE0QjtBQUN4QixnT0FFa0UsS0FBSyxJQUFMLENBQVUsRUFGNUUsNEtBSzBCLFlBTDFCLDZYQVl5QyxLQUFLLElBQUwsQ0FBVSxFQVpuRCx3REFha0IsZUFibEI7QUFpQkgsYUFsQkQsTUFrQk87QUFDSCx1QkFBTyxFQUFQO0FBQ0g7QUFDSjs7OytDQUtDO0FBQUEsZ0JBRkUsUUFFRix1RUFGYSxLQUFLLElBQUwsQ0FBVSx1QkFBVixDQUFrQyxDQUFsQyxFQUFxQyxFQUVsRDtBQUFBLGdCQURFLGlCQUNGLHVFQURzQixLQUN0Qjs7QUFDRSxnQkFBSSxpQkFBSixFQUF1QjtBQUNuQixtRkFDMkMsT0FBTyxJQUFQLGNBQ3hCLFFBRHdCLENBRDNDLDJDQUlrQixPQUFPLElBQVAsQ0FBWSxnQ0FBWixFQUE4QztBQUNwRCw2QkFBUztBQUQyQyxpQkFBOUMsQ0FKbEI7QUFTSCxhQVZELE1BVU8sSUFBSSxDQUFDLEtBQUssY0FBTCxDQUFvQixTQUFwQixDQUE4QixxQkFBOUIsQ0FBTCxFQUEyRDtBQUM5RCxvQkFBTSxpQ0FDRixLQUFLLHdDQUFMLENBQThDLFFBQTlDLENBREo7QUFFQSxvQkFBSSwrQkFBK0IsSUFBbkMsRUFBeUM7QUFDckMsdUZBRUksK0JBQStCLE1BRm5DLDJDQUljLE9BQU8sSUFBUCxDQUFZLGdDQUFaLEVBQThDO0FBQ3BELGlDQUFTO0FBRDJDLHFCQUE5QyxDQUpkO0FBU0g7QUFDSjs7QUFFRCxxTUFFOEIsUUFGOUIseUJBRTBELEtBQUssSUFBTCxDQUFVLEVBRnBFLGlEQUdnQyxrQkFBZ0IsUUFBaEIsQ0FIaEMsb0NBS2dCLGFBQWEsZ0JBQWIsR0FDTSxLQUFLLFNBQUwsQ0FETixHQUVNLEtBQUssU0FBTCxJQUFrQixDQUFDLENBQUMsS0FBSyxVQUF6QixHQUNBLEtBQUssdUJBQUwsQ0FEQSxHQUVBLEtBQUssdUJBQUwsQ0FUdEIsOERBV29DLGtCQUFnQixRQUFoQixDQVhwQztBQWFIOzs7NkNBRW9CO0FBQ2pCLGdCQUFJLGFBQWEsRUFBakI7QUFDQSxnQkFBSSxnQkFBZ0IsRUFBcEI7O0FBRUEsZ0JBQUksS0FBSyxJQUFMLENBQVUsT0FBVixJQUFxQixLQUFLLElBQUwsQ0FBVSxVQUFuQyxFQUErQztBQUMzQyxnQ0FBZ0IsS0FBSyxTQUFMLENBQWhCO0FBQ0gsYUFGRCxNQUVPLElBQUksS0FBSyxJQUFMLENBQVUsT0FBZCxFQUF1QjtBQUMxQixnQ0FBZ0IsT0FBTyxTQUFQLENBQWlCLEtBQWpCLEdBQ1YsS0FBSyxnQkFBTCxDQURVLEdBRVYsS0FBSyxVQUFMLENBRk47QUFHSCxhQUpNLE1BSUEsSUFBSSxLQUFLLElBQUwsQ0FBVSxXQUFkLEVBQTJCO0FBQzlCLGdDQUFnQixLQUFLLFdBQUwsQ0FBaEI7QUFDSDs7QUFFRCxnQkFBSSxLQUFLLElBQUwsQ0FBVSxZQUFkLEVBQTRCO0FBQ3hCLDhEQUE0QyxLQUN4Qyx1QkFEd0MsQ0FBNUM7QUFHSDs7QUFFRCw0QkFDSSxLQUFLLElBQUwsQ0FBVSxlQUFWLENBQTBCLEVBQTFCLEtBQWlDLGlCQUFqQyxHQUNNLHNCQUROLEdBRU0sRUFIVixrQ0FLaUIsSUFBSSxPQUFPLE1BQVAsQ0FBYyxhQUFsQixFQUFpQztBQUN0Qyx3QkFBUSxLQUFLLElBQUwsQ0FBVSxlQUFWLENBQTBCLEVBREk7QUFFdEMseUJBQVMsS0FBSyxJQUFMLENBQVU7QUFGbUIsYUFBakMsQ0FMakIsa01BWTBCLEtBQUssSUFBTCxDQUFVLGVBQVYsQ0FBMEIsRUFacEQsMENBY1ksS0FBSyxJQUFMLENBQVUsRUFkdEIsZUFla0IsYUFmbEIsWUFlc0MsVUFmdEM7QUFpQkg7OztpREFFd0I7QUFBQTs7QUFDckIsZ0JBQUksVUFBVSxFQUFkOztBQUVBLGlCQUFLLElBQUwsQ0FBVSx1QkFBVixDQUFrQyxPQUFsQyxDQUEwQyxVQUFDLE1BQUQsRUFBWTtBQUNsRCwwQkFBYSxPQUFiLHVJQUVxRSxrQkFDdEMsT0FBTyxFQUQrQixDQUZyRSwwQkFJc0MsT0FBTyxFQUo3QyxzREFLaUMsT0FBSyxJQUFMLENBQVUsRUFMM0Msc0JBSzhELEtBQzFELHlCQUQwRCxFQUUxRCxFQUFFLFFBQVEsa0JBQWdCLE9BQU8sRUFBdkIsQ0FBVixFQUYwRCxDQUw5RCx3Q0FVb0IsT0FBSyxJQUFMLENBQVUsWUFBVixDQUF1QixDQUF2QixFQUEwQixFQUExQixLQUFpQyxjQUFqQyxHQUNNLGtDQUROLEdBRU0sRUFaMUIseUZBZXdCLElBQUksT0FBTyxNQUFQLENBQWMsYUFBbEIsRUFBaUM7QUFDckMsNEJBQVEsT0FBTyxFQURzQjtBQUVyQyw2QkFBUyxPQUFLLElBQUwsQ0FBVTtBQUZrQixpQkFBakMsQ0FmeEIsVUFrQnVCLGtCQUFnQixPQUFPLEVBQXZCLENBbEJ2QjtBQW9CSCxhQXJCRDs7QUF1QkEsZ0JBQUksNERBQ0EsS0FBSyxJQUFMLENBQVUsRUFEVixtRUFJd0IsS0FBSyxJQUFMLENBQVUsRUFKbEMsNElBTTBFLEtBQ2xELHVCQURrRCxDQU4xRSxxRUFVZ0IsS0FBSyxJQUFMLENBQVUsRUFWMUIsZ0tBWWtCLE9BWmxCLHFDQUFKO0FBY0EsbUJBQU8sT0FBUDtBQUNIOzs7K0NBRXNCO0FBQUE7O0FBQ25CLGdCQUFJLGlCQUFpQixFQUFyQjtBQUNBLGdCQUFJLG1CQUFtQixFQUF2QjtBQUNBLGlCQUFLLElBQUwsQ0FBVSxjQUFWLENBQXlCLE9BQXpCLENBQWlDLFVBQUMsVUFBRCxFQUFnQjtBQUM3QyxvQkFBSSxTQUFTLFdBQVcsWUFBWCxDQUF3QixDQUF4QixDQUFiO0FBQ0Esb0JBQUksUUFBUSxFQUFaO0FBQ0Esd0JBQVEsT0FBTyxFQUFmO0FBQ0kseUJBQUssaUJBQUw7QUFDQSx5QkFBSyxvQkFBTDtBQUNJLGdDQUFRLEtBQUssU0FBTCxDQUFSO0FBQ0E7QUFDSix5QkFBSyxxQkFBTDtBQUNJLGdDQUFRLEtBQUssV0FBTCxDQUFSO0FBQ0E7QUFDSix5QkFBSyxpQkFBTDtBQUNJLGdDQUFRLEtBQUssVUFBTCxDQUFSO0FBQ0E7QUFDSjtBQUNJLGdDQUFXLGtCQUFnQixPQUFPLEVBQXZCLENBQVgsZUFBaUQsS0FDN0MsdUJBRDZDLENBQWpEO0FBWlI7QUFnQkEsb0JBQUksT0FBSyxZQUFMLENBQWtCLE1BQWxCLENBQUosRUFBK0I7QUFDM0IscUNBQWlCLElBQWpCLENBQXNCLE1BQXRCO0FBQ0gsaUJBRkQsTUFFTyxJQUFJLFdBQVcsRUFBZixFQUFtQjtBQUN0QixnSkFDSSxXQUFXLEVBRGYsMkJBR0ksT0FBTyxFQUFQLElBQWEsV0FBVyxlQUFYLENBQTJCLEVBSDVDLDZDQU1tQixXQUFXLElBQVgsdUJBQ3dCLFdBQVcsSUFBWCxDQUFnQixFQUR4QyxzQ0FFTSxFQVJ6QiwwQ0FVaUIsS0FWakI7QUFXSDtBQUNEO0FBYk8scUJBY0Y7QUFDRCxvS0FBMEksS0FDdEksV0FEc0ksQ0FBMUk7QUFHSDtBQUNKLGFBeENEOztBQTBDQSxrRkFDSSxLQUFLLElBQUwsQ0FBVSxFQURkLG9DQUdJLEtBQUssSUFBTCxDQUFVLEVBSGQsNENBSXVDLEtBQ25DLDJCQURtQyxDQUp2QywrSkFVWSxLQUFLLElBQUwsQ0FBVSxFQVZ0QixrS0FZNkMsS0FDN0IsMkJBRDZCLENBWjdDLG1DQWVjLGNBZmQsK0JBaUJnQixpQkFBaUIsTUFBakIsR0FBMEIsQ0FBMUIseUNBQzBDLEtBQUssNkJBQUwsQ0FDaEMsZ0JBRGdDLENBRDFDLGFBSU0sRUFyQnRCO0FBeUJIOzs7c0RBRTZCLE8sRUFBUztBQUNuQyxnQkFBSSxjQUFjLEVBQWxCO0FBQ0Esb0JBQVEsT0FBUixDQUFnQixVQUFDLE1BQUQsRUFBWTtBQUN4Qiw0QkFBWSxJQUFaLENBQWlCLE9BQU8sSUFBeEI7QUFDSCxhQUZEO0FBR0EsZ0JBQUksY0FBYyxZQUFZLElBQVosQ0FBaUIsS0FBakIsQ0FBbEI7QUFDQSx5RkFDb0IsV0FEcEIsNkNBRXNCLE9BQU8sSUFBUCxDQUFZLGdDQUFaLEVBQThDO0FBQ3BELHlCQUFTLFFBQVE7QUFEbUMsYUFBOUMsQ0FGdEI7QUFNSDs7O3NEQUU2QjtBQUMxQix5RkFDb0IsT0FBTyxJQUFQLENBQVkseUJBQVosQ0FEcEIsNkNBRXNCLE9BQU8sSUFBUCxDQUNOLDZCQURNLENBRnRCO0FBTUg7OzswREFFaUM7QUFDOUIsZ0JBQUksWUFBWSxPQUFPLFNBQVAsQ0FBaUIsU0FBakM7QUFDQSxnQkFBSSxRQUFRLE9BQU8sU0FBUCxDQUFpQixLQUE3QjtBQUNBLGdCQUFJLHFCQUFxQixLQUFLLElBQUwsQ0FBVSxPQUFWLElBQXFCLEtBQUssSUFBTCxDQUFVLFdBQXhEOztBQUVBLGdCQUNJLGFBQ0EsS0FEQSxJQUVBLGtCQUZBLElBR0EsS0FBSyxjQUFMLENBQW9CLFNBQXBCLENBQThCLDhCQUE5QixDQUpKLEVBS0U7QUFDRSxrSkFFb0QsOEJBQ3hDLDZCQUR3QyxDQUZwRCxvRUFLOEMsS0FDbEMsb0NBRGtDLENBTDlDO0FBVUg7QUFDRCxtQkFBTyxFQUFQO0FBQ0g7OztpQ0FFUTtBQUNMLGlCQUFLLE1BQUwsQ0FBWSxPQUFaLENBQW9CLFVBQUMsSUFBRDtBQUFBLHVCQUFVLEtBQUssTUFBTCxFQUFWO0FBQUEsYUFBcEI7QUFDQTtBQUNIOzs7a0RBRXlCO0FBQUE7O0FBQ3RCLGlCQUFLLElBQUwsQ0FBVSxpQkFBVixHQUE4QixFQUE5QjtBQUNBLGdCQUFJLEtBQUssVUFBVCxFQUFxQjtBQUNqQixxQkFBSyxJQUFMLENBQVUsWUFBVixHQUF5QixLQUFLLElBQUwsQ0FBVSxZQUFWLENBQXVCLE1BQXZCLENBQ3JCLFVBQUMsTUFBRDtBQUFBLDJCQUFZLE9BQU8sRUFBUCxLQUFjLE9BQUssVUFBL0I7QUFBQSxpQkFEcUIsQ0FBekI7QUFHSDtBQUNELGlCQUFLLElBQUwsQ0FBVSxZQUFWLEdBQXlCLEtBQUssSUFBTCxDQUFVLFlBQVYsQ0FBdUIsTUFBdkIsQ0FBOEIsVUFBQyxNQUFELEVBQVk7QUFDL0Qsb0JBQUksZUFBZSxPQUFLLFlBQUwsQ0FBa0IsTUFBbEIsQ0FBbkI7QUFDQSxvQkFBSSxZQUFKLEVBQWtCO0FBQ2QsMkJBQUssSUFBTCxDQUFVLGlCQUFWLENBQTRCLElBQTVCLENBQWlDLE1BQWpDO0FBQ0g7QUFDRCx1QkFBTyxDQUFDLFlBQVI7QUFDSCxhQU53QixDQUF6QjtBQU9IOzs7cUNBRVksTSxFQUFRO0FBQ2pCLGdCQUFJLFNBQVMsT0FBTyxNQUFwQjtBQUNBLGdCQUFJLGVBQWUsQ0FBQyxDQUFDLE9BQU8sU0FBUCxDQUFpQixTQUFqQixDQUEyQixLQUEzQixDQUFpQyxNQUFqQyxDQUFyQjtBQUNBLGdCQUFJLFlBQ0EsT0FBTyxTQUFQLENBQWlCLFFBQWpCLENBQTBCLEtBQTFCLENBQWdDLEtBQWhDLEtBQTBDLENBQUMsT0FBTyxZQUR0RDtBQUVBLGdCQUFJLFFBQVEsT0FBTyxTQUFQLENBQWlCLEtBQTdCO0FBQ0EsZ0JBQUksUUFBUSxPQUFPLFNBQVAsQ0FBaUIsU0FBakIsQ0FBMkIsS0FBM0IsQ0FBaUMsS0FBakMsS0FBMkMsQ0FBQyxPQUFPLEdBQS9EO0FBQ0EsZ0JBQUksU0FDQSxLQUFLLGNBQUwsQ0FBb0IsU0FBcEIsQ0FBOEIsNkJBQTlCLEtBQ0EsT0FBTyxTQUFQLENBQWlCLFNBQWpCLENBQTJCLEtBQTNCLENBQ0ksbUNBREosQ0FGSjs7QUFNQSxvQkFBUSxPQUFPLEVBQWY7QUFDSSxxQkFBSyxpQkFBTDtBQUNJLDJCQUNJLE9BQU8sR0FBUCxJQUNBLE9BQU8sT0FEUCxJQUVBLE9BQU8sWUFGUCxJQUdBLE9BQU8sVUFIUCxJQUlBLFlBSkEsSUFLQyxhQUFhLEtBTGQsSUFNQSxNQVBKO0FBU0oscUJBQUssa0JBQUw7QUFDSSwyQkFBTyxnQkFBZ0IsQ0FBQyxLQUF4QjtBQUNKLHFCQUFLLGdCQUFMO0FBQ0ksMkJBQ0ssQ0FBQyxPQUFPLEdBQVAsSUFDRSxPQUFPLE9BRFQsSUFFRSxTQUZGLElBR0UsWUFISCxLQUlHLEtBSkosSUFLQSxPQUFPLFlBTFAsSUFNQSxPQUFPLFVBTlAsSUFPQSxNQVJKO0FBVUoscUJBQUssZUFBTDtBQUNJLDJCQUNLLGdCQUFnQixDQUFDLEtBQWxCLElBQ0MsVUFDSSxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsU0FBZixFQUEwQixNQUExQixLQUFxQyxDQUFyQyxJQUNJLFNBQ0csS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLFNBQWYsRUFBMEIsTUFBMUIsS0FBcUMsQ0FIaEQsS0FJRyxLQUFLLGNBQUwsQ0FBb0IsU0FBcEIsQ0FBOEIsc0JBQTlCLENBSkgsS0FLSSxDQUFDLEtBQUssY0FBTCxDQUFvQixTQUFwQixDQUNFLHFDQURGLENBQUQsSUFHRyxDQUFDLE9BQU8sU0FBUCxDQUFpQixnQkFSekIsQ0FGTDtBQVlKO0FBQ0ksMkJBQU8sS0FBUDtBQXRDUjtBQXdDSDs7O2lFQUV3QyxRLEVBQVU7QUFDL0MsZ0JBQUksQ0FBQyxPQUFPLFNBQVAsQ0FBaUIsY0FBdEIsRUFBc0M7QUFDbEMsdUJBQU8sRUFBRSxNQUFNLEtBQVIsRUFBZSxRQUFRLEVBQXZCLEVBQVA7QUFDSDs7QUFFRCxnQkFBSSxhQUFhLGdCQUFqQixFQUFtQztBQUMvQix1QkFBTyxFQUFFLE1BQU0sSUFBUixFQUFjLFFBQVEsT0FBTyxJQUFQLGNBQXVCLFFBQXZCLENBQXRCLEVBQVA7QUFDSDs7QUFFRCxtQkFBTyxFQUFFLE1BQU0sS0FBUixFQUFlLFFBQVEsRUFBdkIsRUFBUDtBQUNIOzs7NEJBOTNCNkI7QUFDMUIsZ0JBQU0sUUFBUSxDQUFDLEVBQ1gsT0FBTyxTQUFQLENBQWlCLFNBQWpCLENBQTJCLEtBQTNCLENBQWlDLEtBQWpDLEtBQTJDLENBQUMsT0FBTyxHQUR4QyxDQUFmO0FBR0EsbUJBQ0ksS0FBSyxJQUFMLENBQVUsV0FBVixJQUNBLEtBQUssY0FBTCxDQUFvQixTQUFwQixDQUE4QixzQkFBOUIsQ0FEQSxJQUVBLEtBRkEsSUFHQSxDQUFDLE9BQU8sR0FIUixLQUlDLENBQUMsS0FBSyxjQUFMLENBQW9CLFNBQXBCLENBQ0UscUNBREYsQ0FBRCxJQUdHLENBQUMsT0FBTyxTQUFQLENBQWlCLGdCQVB0QixLQVFBLEVBQ0ksS0FBSyxjQUFMLENBQW9CLFNBQXBCLENBQThCLDZCQUE5QixLQUNBLE9BQU8sU0FBUCxDQUFpQixTQUFqQixDQUEyQixLQUEzQixDQUNJLG1DQURKLENBRkosQ0FUSjtBQWdCSDs7OzRCQUVzQjtBQUNuQixnQkFBTSxRQUFRLENBQUMsRUFDWCxPQUFPLFNBQVAsQ0FBaUIsU0FBakIsQ0FBMkIsS0FBM0IsQ0FBaUMsS0FBakMsS0FBMkMsQ0FBQyxPQUFPLEdBRHhDLENBQWY7QUFHQSxnQkFBTSxTQUNGLEtBQUssY0FBTCxDQUFvQixTQUFwQixDQUE4Qiw2QkFBOUIsS0FDQSxPQUFPLFNBQVAsQ0FBaUIsU0FBakIsQ0FBMkIsS0FBM0IsQ0FDSSxtQ0FESixDQUZKO0FBS0EsbUJBQ0ksS0FBSyxJQUFMLENBQVUsV0FBVixJQUNBLEtBQUssY0FBTCxDQUFvQixTQUFwQixDQUE4QixzQkFBOUIsQ0FEQSxJQUVBLEtBRkEsSUFHQSxDQUFDLE9BQU8sR0FIUixJQUlBLENBQUMsTUFMTDtBQU9IOzs7O0VBakw4QyxTQUFTLEk7O3FCQUF2QyxxQjs7Ozs7Ozs7Ozs7QUNkckI7Ozs7Ozs7O0lBRXFCLDRCOzs7QUFvQmpCLDBDQUFZLGtCQUFaLEVBQWdDLG9CQUFoQyxFQUFzRDtBQUFBOztBQUFBOztBQUFBOztBQUdsRCxjQUFLLE9BQUwsQ0FBYSxrQkFBYixFQUFpQyxvQkFBakM7O0FBRUEsWUFBSSxRQUFRLEVBQVo7QUFDQSxZQUFJLHFCQUFxQixDQUF6QixFQUE0QjtBQUN4QixvQkFBUSxLQUFLLGdCQUFMLENBQVI7QUFDSCxTQUZELE1BRU87QUFDSCxvQkFBUSxLQUFLLHNDQUFMLENBQVI7QUFDSDs7QUFFRCxZQUFJLGdCQUFnQjtBQUNoQixzQkFBVSxLQURNO0FBRWhCLG1CQUFPLEtBRlM7QUFHaEIscUJBQVMsQ0FBQyxPQUFELENBSE87QUFJaEIscUJBQVMsTUFBSztBQUpFLFNBQXBCOztBQU9BLGNBQUssS0FBTCxHQUFhLElBQUksWUFBSixDQUFVLGFBQVYsQ0FBYjtBQUNBLGNBQUssS0FBTCxDQUFXLElBQVg7QUFwQmtEO0FBcUJyRDs7OztnQ0FFTyxrQixFQUFvQixvQixFQUFzQjtBQUM5QyxnQkFBSSxxQkFBcUIsQ0FBekIsRUFBNEI7QUFDeEIscUJBQUssR0FBTCxDQUFTLE1BQVQsQ0FBZ0IsS0FBSyxzQkFBTCxDQUE0QixrQkFBNUIsQ0FBaEI7QUFDSCxhQUZELE1BRU8sSUFBSSxDQUFDLENBQUMsb0JBQU4sRUFBNEI7QUFDL0IscUJBQUssR0FBTCxDQUFTLE1BQVQsQ0FBZ0IsS0FBSyx3QkFBTCxDQUE4QixrQkFBOUIsQ0FBaEI7QUFDSCxhQUZNLE1BRUE7QUFDSCxxQkFBSyxHQUFMLENBQVMsTUFBVCxDQUFnQixLQUFLLHFCQUFMLEVBQWhCO0FBQ0g7QUFDSjs7OztFQW5EcUQsU0FBUyxJOzs7U0FDL0Qsc0IsR0FBeUIsVUFBQyxrQkFBRDtBQUFBLHVEQUNpQixLQUNsQyxzQ0FEa0MsRUFFbEMsRUFBRSxPQUFPLGtCQUFULEVBRmtDLENBRGpCO0FBQUEsSzs7U0FNekIsd0IsR0FBMkI7QUFBQSxpQ0FDbEIsS0FBSyxvQ0FBTCxDQURrQix5QkFFbEIsT0FBTyxJQUFQLENBQVksMkJBQVosRUFBeUM7QUFDMUMsK0hBQWlILE9BQU8sSUFBUCxDQUM3Ryw0QkFENkcsQ0FBakg7QUFEMEMsU0FBekMsQ0FGa0I7QUFBQSxLOztTQVMzQixxQixHQUF3QjtBQUFBLGlDQUNmLEtBQUssMEJBQUwsQ0FEZTtBQUFBLEs7OztxQkFoQlAsNEI7Ozs7Ozs7Ozs7QUNGckI7O0FBRUEsSUFBTSx5QkFBeUIsU0FBekIsc0JBQXlCLENBQUMsTUFBRCxFQUFZO0FBQ3ZDLFFBQU0sY0FBYyxPQUFPLE9BQVAsQ0FBZSxHQUFmLENBQXBCO0FBQ0EsV0FBTyxjQUFjLENBQWQsR0FBa0IsT0FBTyxNQUFQLENBQWMsQ0FBZCxFQUFpQixXQUFqQixDQUFsQixHQUFrRCxNQUF6RDtBQUNILENBSEQ7O0FBS0EsSUFBTSx1QkFBdUIsU0FBdkIsb0JBQXVCLENBQUMsTUFBRCxFQUFTLFVBQVQ7QUFBQSxXQUN6QixXQUFXLE1BQVgsS0FDQSxXQUFXLHVCQUF1QixNQUF2QixDQUFYLENBREEsSUFFQSxXQUFXLElBQVgsQ0FIeUI7QUFBQSxDQUE3Qjs7QUFLQSxJQUFNLHNCQUFzQixTQUF0QixtQkFBc0IsQ0FBQyxXQUFEO0FBQUEsV0FBaUIsVUFBQyxNQUFELEVBQVk7QUFDckQsWUFBTSxNQUFNLDhCQUFZLFlBQVksTUFBWixDQUFaLENBQVo7QUFDQSxlQUFPLElBQUksUUFBSixDQUFhLFdBQWIsSUFBNEIsU0FBNUIsR0FBd0MsR0FBL0M7QUFDSCxLQUgyQjtBQUFBLENBQTVCOztBQUtBLElBQU0scUJBQXFCLFNBQXJCLGtCQUFxQixDQUFDLE1BQUQsRUFBUyxXQUFUO0FBQUEsV0FDdkIscUJBQXFCLE1BQXJCLEVBQTZCLG9CQUFvQixXQUFwQixDQUE3QixDQUR1QjtBQUFBLENBQTNCOztBQUdBLElBQU0sV0FBVyxTQUFYLFFBQVc7QUFBQSxRQUFHLEdBQUgsUUFBRyxHQUFIO0FBQUEsUUFBUSxJQUFSLFFBQVEsSUFBUjtBQUFBLFFBQWMsRUFBZCxRQUFjLEVBQWQ7QUFBQSxRQUFrQixHQUFsQixRQUFrQixHQUFsQjtBQUFBLDZEQUVOLElBRk0sbUVBS0QsR0FMQyw2REFPUCxjQUFZLEVBQVosU0FBb0IsRUFQYix3QkFRRixHQVJFO0FBQUEsQ0FBakI7O0FBWU8sSUFBTSxrREFBcUIsU0FBckIsa0JBQXFCLFFBSzVCO0FBQUEsUUFKRixZQUlFLFNBSkYsWUFJRTtBQUFBLFFBSEYsSUFHRSxTQUhGLElBR0U7QUFBQSxRQUZGLEVBRUUsU0FGRixFQUVFO0FBQUEsUUFERixnQkFDRSxTQURGLGdCQUNFOztBQUNGLFFBQU0sTUFBTSxlQUNOLG1CQUNJLGdCQURKLEVBRUksVUFBQyxNQUFEO0FBQUEsK0NBQTBDLE1BQTFDO0FBQUEsS0FGSixDQURNLEdBS04sbUJBQ0ksZ0JBREosRUFFSSxVQUFDLE1BQUQ7QUFBQSwrQ0FBMEMsTUFBMUM7QUFBQSxLQUZKLENBTE47QUFTQSxXQUFPLFNBQVM7QUFDWixhQUFLLEtBQUssMkJBQUwsQ0FETztBQUVaLGtCQUZZO0FBR1osY0FIWTtBQUlaO0FBSlksS0FBVCxDQUFQO0FBTUgsQ0FyQk07O0FBdUJBLElBQU0sc0RBQXVCLFNBQXZCLG9CQUF1QixRQUs5QjtBQUFBLFFBSkYsWUFJRSxTQUpGLFlBSUU7QUFBQSxRQUhGLElBR0UsU0FIRixJQUdFO0FBQUEsUUFGRixFQUVFLFNBRkYsRUFFRTtBQUFBLFFBREYsZ0JBQ0UsU0FERixnQkFDRTs7QUFDRixRQUFNLE1BQU0sZUFDTixtQkFDSSxnQkFESixFQUVJLFVBQUMsTUFBRDtBQUFBLGlEQUE0QyxNQUE1QztBQUFBLEtBRkosQ0FETSxHQUtOLG1CQUNJLGdCQURKLEVBRUksVUFBQyxNQUFEO0FBQUEsaURBQTRDLE1BQTVDO0FBQUEsS0FGSixDQUxOO0FBU0EsV0FBTyxTQUFTO0FBQ1osYUFBSyxLQUFLLDZCQUFMLENBRE87QUFFWixrQkFGWTtBQUdaLGNBSFk7QUFJWjtBQUpZLEtBQVQsQ0FBUDtBQU1ILENBckJNOzs7Ozs7Ozs7OztBQ3ZEUDs7Ozs7Ozs7Ozs7O0lBQ3FCLFU7OztBQUNqQix3QkFBWSxPQUFaLEVBQXFCO0FBQUE7O0FBQUEsNEhBQ1gsT0FEVzs7QUFFakIsY0FBSyxXQUFMLEdBQW1CLEtBQW5CO0FBRmlCO0FBR3BCOzs7OytCQUVNLE0sRUFBUTtBQUNYLGlCQUFLLFdBQUw7QUFDQSxpQkFBSyxlQUFMO0FBQ0g7OzttQ0FFVTtBQUNQLGlCQUFLLGdCQUFMO0FBQ0g7O0FBR0Q7Ozs7OztzQ0FHYztBQUNWLGdCQUFJLEVBQUUsTUFBRixLQUFhLEVBQUUsTUFBRixFQUFVLFNBQXZCLElBQW9DLEtBQUssVUFBTCxHQUFrQixPQUFsQixDQUEwQixDQUExQixDQUFwQyxJQUFvRSxLQUFLLFVBQUwsR0FBa0IsZ0JBQWxCLEVBQXBFLElBQ0EsS0FBSyxVQUFMLEdBQWtCLE9BQWxCLENBQTBCLENBQTFCLEVBQTZCLE1BRGpDLEVBQ3lDO0FBQ3JDLGtCQUFFLE1BQUYsRUFBVSxTQUFWLENBQW9CLEtBQUssVUFBTCxHQUFrQixPQUFsQixDQUEwQixDQUExQixFQUE2QixNQUFqRDtBQUNIO0FBQ0o7O0FBRUQ7Ozs7OztvREFHNEI7QUFDeEIsZ0JBQUksaUJBQWlCLEVBQUUscUJBQUYsQ0FBckI7QUFDQSxnQkFBSSxnQkFBZ0IsRUFBRSxvQkFBRixDQUFwQixDQUZ3QixDQUVxQjs7QUFFN0MsZ0JBQUksQ0FBQyxjQUFjLE1BQWQsSUFBd0IsZUFBZSxNQUF4QyxLQUFtRCxDQUFDLGVBQWUsRUFBZixDQUFrQixVQUFsQixDQUFwRCxJQUFxRixDQUFDLEtBQUssV0FBL0YsRUFBNEc7QUFDeEcscUJBQUssV0FBTDtBQUNILGFBRkQsTUFFTztBQUNILDZCQUFhLEtBQUssU0FBbEI7QUFDQSxxQkFBSyxXQUFMO0FBQ0g7QUFDSjs7QUFFRDs7Ozs7Ozs7c0NBS2M7QUFDVixtQkFBTyxDQUFDLENBQUMscUJBQUYsR0FDSCxzQkFBc0IsS0FBSyx5QkFBTCxDQUErQixJQUEvQixDQUFvQyxJQUFwQyxDQUF0QixDQURHLEdBRUgsV0FBVyxLQUFLLHlCQUFMLENBQStCLElBQS9CLENBQW9DLElBQXBDLENBQVgsRUFBc0QsRUFBdEQsQ0FGSjtBQUdIOztBQUVEOzs7Ozs7OzBDQUlrQjtBQUFBOztBQUNkLGlCQUFLLFNBQUwsR0FBaUIsV0FBVyxZQUFNO0FBQzlCLHVCQUFLLFdBQUwsR0FBbUIsSUFBbkI7QUFDSCxhQUZnQixFQUVkLEtBRmMsQ0FBakI7QUFHSDs7OzJDQUVrQjtBQUNmLGdCQUFJLEVBQUUsTUFBRixLQUFhLEVBQUUsTUFBRixFQUFVLFNBQTNCLEVBQXNDO0FBQ2xDLHFCQUFLLFVBQUwsR0FBa0IsZUFBbEIsQ0FBa0MsUUFBbEMsRUFBNEMsRUFBRSxNQUFGLEVBQVUsU0FBVixFQUE1QztBQUNIO0FBQ0o7Ozs7RUFsRW1DLGlDOztxQkFBbkIsVTs7Ozs7Ozs7Ozs7QUNEckI7Ozs7Ozs7Ozs7OztBQUNBOzs7O0lBSXFCLGtCOzs7QUFDakIsZ0NBQVksT0FBWixFQUFxQjtBQUFBOztBQUFBLDRJQUNYLE9BRFc7O0FBRWpCLGNBQUssY0FBTDtBQUZpQjtBQUdwQjs7OzsrQkFFTSxNLEVBQVE7QUFDWCxnQkFBSSxPQUFPLFNBQVAsQ0FBaUIsV0FBckIsRUFBa0M7QUFDOUIscUJBQUssVUFBTCxHQUFrQixlQUFsQixDQUFrQyxTQUFsQyxFQUE2QyxPQUFPLFNBQVAsQ0FBaUIsV0FBakIsQ0FBNkIsT0FBMUU7QUFDSCxhQUZELE1BR0s7QUFDRCxxQkFBSyxVQUFMLEdBQWtCLGVBQWxCLENBQWtDLFNBQWxDLEVBQTZDLGNBQTdDO0FBQ0g7QUFDSjs7QUFHRDs7Ozs7Ozt5Q0FJaUI7QUFDYixtQkFBTyxnQkFBUCxHQUEwQixDQUFDLENBQUMsUUFBUSxHQUFSLENBQVksZ0JBQVosQ0FBNUI7QUFDQSxnQkFBSSxDQUFDLE9BQU8sU0FBUCxDQUFpQixXQUFsQixJQUFpQyxPQUFPLGdCQUE1QyxFQUE4RDtBQUMxRCx3QkFBUSxNQUFSLENBQWUsZ0JBQWYsRUFBaUMsRUFBQyxNQUFNLEdBQVAsRUFBWSxRQUFRLFNBQVMsUUFBN0IsRUFBakM7QUFDQSx1QkFBTyxnQkFBUCxHQUEwQixLQUExQjtBQUNIO0FBQ0o7Ozs7RUExQjJDLGlDOztxQkFBM0Isa0I7Ozs7Ozs7Ozs7Ozs7Ozs7O0lDTEEsUTs7Ozs7dUNBQzZCO0FBQUEsZ0JBQXBDLFNBQW9DLFFBQXBDLFNBQW9DO0FBQUEsZ0JBQXpCLElBQXlCLFFBQXpCLElBQXlCO0FBQUEsZ0JBQW5CLEtBQW1CLFFBQW5CLEtBQW1CO0FBQUEsZ0JBQVosU0FBWSxRQUFaLFNBQVk7O0FBQzFDLHlIQUV1QyxJQUZ2QyxtQkFFdUQsU0FGdkQsd0JBRWlGLFNBRmpGLHlLQUt1QyxLQUx2QztBQVFIOzs7NEJBRVk7QUFBQTs7QUFDVCxtQkFBTztBQUNILDBDQUEwQiw0QkFBQyxDQUFELEVBQU87QUFDN0IsMkJBQUssT0FBTCxDQUFhLFFBQWIsRUFBdUIsRUFBRSxhQUFGLENBQWdCLE9BQXZDO0FBQ0g7QUFIRSxhQUFQO0FBS0g7OztBQUVELDZCQUFrRDtBQUFBLFlBQXBDLFNBQW9DLFNBQXBDLFNBQW9DO0FBQUEsWUFBekIsSUFBeUIsU0FBekIsSUFBeUI7QUFBQSxZQUFuQixLQUFtQixTQUFuQixLQUFtQjtBQUFBLFlBQVosU0FBWSxTQUFaLFNBQVk7O0FBQUE7O0FBQUEseUhBQ3JDLFNBRHFDOztBQUc5QyxVQUFFLE1BQUYsUUFBZSxVQUFVLENBQVYsQ0FBZjtBQUg4QztBQUlqRDs7OztpQ0FFUTtBQUNMLGlCQUFLLEdBQUwsQ0FBUyxLQUFULEdBQWlCLE1BQWpCLENBQXdCLEtBQUssUUFBTCxDQUFjLElBQWQsQ0FBeEI7O0FBRUEsaUJBQUssU0FBTCxHQUFpQixLQUFLLEdBQUwsQ0FBUyxJQUFULENBQWMsdUJBQWQsQ0FBakI7O0FBRUEsbUJBQU8sSUFBUDtBQUNIOzs7NEJBRUcsTyxFQUFTO0FBQ1QsaUJBQUssU0FBTCxDQUFlLElBQWYsQ0FBb0IsU0FBcEIsRUFBK0IsT0FBL0IsRUFBd0MsTUFBeEM7QUFDSDs7OztFQXBDaUMsU0FBUyxJOztxQkFBMUIsUTs7Ozs7Ozs7Ozs7QUNBckI7Ozs7Ozs7O0lBRXFCLFc7Ozs7Ozs7Z0NBRUY7QUFDWCxnQkFBSSxhQUFhLHlCQUFZLEtBQVosQ0FBa0IsU0FBUyxJQUFULENBQWMsTUFBZCxDQUFxQixDQUFyQixDQUFsQixDQUFqQjs7QUFFQSxjQUFFLElBQUYsQ0FBTyxVQUFQLEVBQW1CLE9BQW5CLENBQTJCLFVBQUMsR0FBRCxFQUFTO0FBQ2hDLDJCQUFXLEdBQVgsSUFBa0IsRUFBRSxPQUFGLENBQVUsQ0FBQyxXQUFXLEdBQVgsS0FBbUIsRUFBcEIsQ0FBVixDQUFsQjtBQUNILGFBRkQ7O0FBSUEsbUJBQU8sVUFBUDtBQUNIOzs7K0JBRWEsTSxFQUFRO0FBQ2xCLGdCQUFJLFVBQVUseUJBQVksU0FBWixDQUFzQixNQUF0QixDQUFkO0FBQ0EsZ0JBQUksWUFBWSxHQUFoQixFQUFvQjtBQUNoQix5QkFBUyxJQUFULEdBQWdCLE9BQWhCO0FBQ0g7QUFDSjs7OzRCQUVVLEcsRUFBSztBQUNaLGdCQUFJLFdBQVcsS0FBSyxLQUFMLEVBQWY7O0FBRUEsZ0JBQUksRUFBRSxRQUFGLENBQVcsR0FBWCxDQUFKLEVBQXFCO0FBQ2pCLHVCQUFPLFNBQVMsR0FBVCxDQUFQO0FBQ0g7O0FBRUQsbUJBQU8sUUFBUDtBQUNIOzs7NEJBRVUsRyxFQUFLLEssRUFBTztBQUNuQixnQkFBSSxPQUFPLEtBQUssS0FBTCxFQUFYOztBQUVBLGlCQUFLLEdBQUwsSUFBWSxFQUFFLE9BQUYsQ0FBVSxDQUFDLEtBQUQsQ0FBVixDQUFaOztBQUVBLGlCQUFLLE1BQUwsQ0FBWSxJQUFaO0FBQ0g7Ozs2QkFFVyxHLEVBQUssSyxFQUFPO0FBQ3BCLGdCQUFJLE9BQU8sS0FBSyxLQUFMLEVBQVg7O0FBRUEsaUJBQUssR0FBTCxJQUFZLEtBQUssR0FBTCxLQUFhLEVBQXpCO0FBQ0EsaUJBQUssR0FBTCxFQUFVLElBQVYsQ0FBZSxLQUFmOztBQUVBLGlCQUFLLE1BQUwsQ0FBWSxJQUFaO0FBQ0g7OzsrQkFFYSxHLEVBQUs7QUFDZixnQkFBSSxPQUFPLEtBQUssS0FBTCxFQUFYOztBQUVBLGlCQUFLLEdBQUwsS0FBYSxPQUFPLEtBQUssR0FBTCxDQUFwQjs7QUFFQSxpQkFBSyxNQUFMLENBQVksSUFBWjtBQUNIOzs7Ozs7cUJBcERnQixXOzs7Ozs7Ozs7Ozs7Ozs7OztJQ0ZBLFc7Ozs7O3VDQUNrRDtBQUFBLGdCQUF6RCxLQUF5RCxRQUF6RCxLQUF5RDtBQUFBLGdCQUFsRCxPQUFrRCxRQUFsRCxPQUFrRDtBQUFBLGdCQUF6QyxTQUF5QyxRQUF6QyxTQUF5QztBQUFBLGdCQUE5QixJQUE4QixRQUE5QixJQUE4QjtBQUFBLGdCQUF4QixLQUF3QixRQUF4QixLQUF3QjtBQUFBLGdCQUFqQixTQUFpQixRQUFqQixTQUFpQjtBQUFBLGdCQUFOLEdBQU0sUUFBTixHQUFNOztBQUMvRCw4S0FHeUMsS0FIekMsa0JBR3lELElBSHpELFNBR2lFLEdBSGpFLG1CQUdnRixTQUhoRix3QkFHMEcsU0FIMUcsWUFHd0gsVUFBVSxTQUFWLEdBQXNCLEVBSDlJLGlRQVFjLEtBUmQ7QUFXSDs7OzRCQUVZO0FBQUE7O0FBQ1QsbUJBQU87QUFDSCx1Q0FBdUIseUJBQUMsQ0FBRCxFQUFPO0FBQzFCLDJCQUFLLE9BQUwsQ0FBYSxRQUFiLEVBQXVCLEVBQUUsYUFBRixDQUFnQixPQUF2QztBQUNIO0FBSEUsYUFBUDtBQUtIOzs7QUFFRCxnQ0FBdUQ7QUFBQSxZQUF6QyxTQUF5QyxTQUF6QyxTQUF5QztBQUFBLFlBQTlCLElBQThCLFNBQTlCLElBQThCO0FBQUEsWUFBeEIsS0FBd0IsU0FBeEIsS0FBd0I7QUFBQSxZQUFqQixTQUFpQixTQUFqQixTQUFpQjtBQUFBLFlBQU4sR0FBTSxTQUFOLEdBQU07O0FBQUE7O0FBQUEsK0hBQzFDLFNBRDBDOztBQUduRCxVQUFFLE1BQUYsUUFBZSxVQUFVLENBQVYsQ0FBZjtBQUhtRDtBQUl0RDs7OztpQ0FFUTtBQUNMLGlCQUFLLEdBQUwsQ0FBUyxLQUFULEdBQWlCLE1BQWpCLENBQXdCLEtBQUssUUFBTCxDQUFjLElBQWQsQ0FBeEI7O0FBRUEsaUJBQUssTUFBTCxHQUFjLEtBQUssR0FBTCxDQUFTLElBQVQsQ0FBYyxvQkFBZCxDQUFkOztBQUVBLG1CQUFPLElBQVA7QUFDSDs7OzRCQUVHLE8sRUFBUztBQUNULGlCQUFLLE1BQUwsQ0FBWSxJQUFaLENBQWlCLFNBQWpCLEVBQTRCLE9BQTVCLEVBQXFDLE1BQXJDO0FBQ0g7Ozs7RUF2Q29DLFNBQVMsSTs7cUJBQTdCLFc7Ozs7Ozs7Ozs7O0FDQXJCOzs7Ozs7OztJQUVNLGE7OztBQUNGLDJCQUFZLE9BQVosRUFBcUI7QUFBQTs7QUFBQSxrSUFDWCxPQURXOztBQUdqQixjQUFLLEdBQUwsQ0FBUyxNQUFULENBQWdCLEVBQUUsTUFBSyxjQUFQLENBQWhCOztBQUVBLGNBQUssYUFBTCxHQUFzQixNQUFLLEdBQUwsQ0FBUyxJQUFULENBQWMsZ0JBQWQsQ0FBdEI7QUFDQSxjQUFLLGFBQUwsR0FBc0IsTUFBSyxHQUFMLENBQVMsSUFBVCxDQUFjLGdCQUFkLENBQXRCOztBQUVBLGNBQUssVUFBTDs7QUFFQSxjQUFLLE9BQUw7QUFWaUI7QUFXcEI7O0FBRUQ7QUFDQTs7Ozs7cUNBQ2E7QUFBQTs7QUFDVCxpQkFBSyxhQUFMLENBQW1CLEVBQW5CLENBQXNCLE9BQXRCLEVBQStCLFlBQU07QUFDakMsdUJBQUssT0FBTCxDQUFhLFFBQWIsRUFBdUIsTUFBdkI7QUFDQSx1QkFBSyxPQUFMLENBQWEsT0FBYjtBQUNILGFBSEQ7O0FBS0EsaUJBQUssYUFBTCxDQUFtQixFQUFuQixDQUFzQixPQUF0QixFQUErQixVQUFDLENBQUQsRUFBTztBQUNsQyx1QkFBSyxPQUFMLENBQWEsUUFBYixFQUF1QixNQUF2QjtBQUNBLHVCQUFLLE9BQUwsQ0FBYSxPQUFiO0FBQ0gsYUFIRCxFQUdHLEVBSEgsQ0FHTSxTQUhOLEVBR2lCLFVBQUMsQ0FBRDtBQUFBLHVCQUFPLEVBQUUsZUFBVDtBQUFBLGFBSGpCO0FBSUg7Ozs0QkFFb0I7QUFDakIsbUJBQU8sbURBQzRCLEtBQUssV0FBTCxJQUFvQixPQURoRCxpSEFFdUYsS0FBSyxVQUY1RiwwSEFHMEYsS0FBSyxVQUgvRiw2Q0FBUDtBQU1IOzs7O0VBbkN1QixZOztxQkFzQ2IsYTs7Ozs7Ozs7Ozs7O0FDeENmLElBQUEsU0FBQSxHQUFBLE9BQUEsQ0FBQSxxQkFBQSxDQUFBLENBQUE7Ozs7QUFDQSxJQUFBLE1BQUEsR0FBQSxPQUFBLENBQUEsd0JBQUEsQ0FBQSxDQUFBOzs7Ozs7Ozs7Ozs7SUFFTTs7Ozs7Ozs7Ozs7Ozs7d0xBc0VGLGdCQUFnQixVQUFDLENBQUQsRUFBQTtZQUFBLE9BQU8sQ0FBQyxDQUFBLENBQUUsSUFBRixLQUFXLE9BQVgsSUFBc0IsQ0FBQSxDQUFFLEtBQUYsS0FBWSxFQUFsQyxJQUF3QyxDQUFBLENBQUUsS0FBRixLQUFZLEVBQXJELE1BQTZELENBQUEsQ0FBRSxjQUFGLEVBQUEsSUFBc0IsSUFBbkYsQ0FBUCxDQUFBOzs7Ozs7bUNBMUNMLFNBQVM7WUFDaEIsQ0FBQSxDQUFFLE1BQUYsQ0FBUyxJQUFULEVBQWUsSUFBQSxDQUFLLFFBQXBCLEVBQThCLE9BQTlCLENBQUEsQ0FBQTs7WUFFQSxJQUFBLENBQUssR0FBTCxHQUFXLE9BQUEsQ0FBQSxTQUFBLENBQVgsQ0FBQTtZQUNBLElBQUEsQ0FBSyxVQUFMLENBQWdCLElBQUEsQ0FBSyxHQUFMLENBQVMsSUFBVCxDQUFoQixDQUFBLENBQUE7O1lBRUEsSUFBSSxJQUFBLENBQUssRUFBTCxDQUFRLE1BQVosRUFBb0I7Z0JBQ2hCLElBQUEsQ0FBSyxHQUFMLENBQVMsSUFBVCxDQUFjLElBQWQsRUFBb0IsSUFBQSxDQUFLLEVBQXpCLENBQUEsQ0FBQTthQUNIOztZQUVELElBQUEsQ0FBSyxRQUFMLEdBQWdCLElBQUEsQ0FBSyxHQUFMLENBQVMsSUFBVCxDQUFjLGtCQUFkLENBQWhCLENBQUE7O1lBRUEsSUFBQSxDQUFLLFFBQUwsQ0FBYyxLQUFkLEVBQUEsQ0FBc0IsTUFBdEIsQ0FBNkIsSUFBQSxDQUFLLE9BQWxDLENBQUEsQ0FBQTs7WUFFQSxJQUFBLENBQUssR0FBTCxDQUFTLFFBQVQsQ0FBa0IsSUFBQSxDQUFLLE9BQUwsQ0FBYSxJQUFiLENBQWtCLEdBQWxCLENBQWxCLENBQUEsQ0FBQTs7WUFFQSxJQUFBLENBQUssTUFBTCxHQUFjLElBQUEsQ0FBSyxHQUFMLENBQVMsSUFBVCxDQUFjLGNBQWQsQ0FBZCxDQUFBOztZQUVBLElBQUksSUFBQSxDQUFLLFdBQVQsRUFBc0I7Z0JBQ2xCLElBQUEsQ0FBSyxNQUFMLENBQVksR0FBWixDQUFnQixTQUFoQixFQUEyQixHQUEzQixDQUFBLENBQUE7YUFDSDs7WUFFRCxJQUFJLElBQUEsQ0FBSyxVQUFULEVBQXFCO2dCQUNqQixJQUFBLENBQUssT0FBTCxFQUFBLENBQUE7YUFDSDs7WUFFRCxJQUFBLENBQUssV0FBTCxFQUFBLENBQUE7U0FDSDs7O2tDQUVTO1lBQ04sSUFBSSxJQUFBLENBQUssZ0JBQVQsRUFBMkI7O2dCQUV2QixDQUFBLENBQUUsTUFBRixDQUFBLENBQVUsTUFBVixDQUFpQixJQUFBLENBQUssRUFBdEIsQ0FBQSxDQUFBO2FBQ0g7O1lBRUQsSUFBSSxJQUFBLENBQUssUUFBVCxFQUFtQjtnQkFDZixJQUFBLENBQUssSUFBTCxFQUFBLENBQUE7YUFDSDs7WUFFRCxPQUFPLElBQVAsQ0FBQTtTQUNIOzs7Ozs7O3NDQU1hO1lBQUEsSUFBQSxNQUFBLEdBQUEsSUFBQSxDQUFBOztZQUNWLElBQUEsQ0FBSyxHQUFMLENBQVMsRUFBVCxDQUFZLGVBQVosRUFBNkIsV0FBN0IsRUFBMEMsVUFBQyxDQUFELEVBQU87Z0JBQzdDLE1BQUEsQ0FBSyxhQUFMLENBQW1CLENBQW5CLENBQUEsSUFBeUIsTUFBQSxDQUFLLE9BQUwsQ0FBYSxRQUFiLEVBQXVCLE1BQXZCLENBQXpCLENBQUE7YUFESixDQUFBLENBQUE7O1lBSUEsSUFBSSxJQUFBLENBQUssc0JBQVQsRUFBaUM7Z0JBQzdCLElBQUEsQ0FBSyxFQUFMLENBQVEsY0FBUixFQUF3QixZQUFNO29CQUFFLE1BQUEsQ0FBSyxLQUFMLEVBQUEsQ0FBQTtpQkFBaEMsQ0FBQSxDQUFBO2FBQ0g7O1lBRUQsSUFBQSxDQUFLLEdBQUwsQ0FBUyxFQUFULENBQVksVUFBWixFQUF3QixHQUF4QixFQUE2QixVQUFDLENBQUQsRUFBTztnQkFDaEMsSUFBSSxDQUFBLENBQUUsS0FBRixLQUFZLFVBQUEsQ0FBQSxTQUFBLENBQUEsQ0FBSyxHQUFyQixFQUEwQjtvQkFDdEIsTUFBQSxDQUFLLFVBQUwsQ0FBZ0IsQ0FBaEIsQ0FBQSxDQUFBO2lCQUNIO2FBSEwsQ0FBQSxDQUFBOztZQU1BLElBQUcsTUFBQSxDQUFPLGNBQVAsQ0FBc0IsU0FBdEIsQ0FBZ0Msd0JBQWhDLENBQUgsRUFBOEQ7O2dCQUUxRCxJQUFBLENBQUssR0FBTCxDQUFTLEVBQVQsQ0FBWSxxQkFBWixFQUFtQyxRQUFuQyxFQUE2QyxVQUFTLENBQVQsRUFBWTtvQkFDckQsSUFBSSxnQkFBQSxHQUFtQixDQUFBLENBQUUsSUFBRixLQUFXLE9BQVgsSUFBc0IsQ0FBQSxDQUFFLEtBQUYsS0FBWSxVQUFBLENBQUEsU0FBQSxDQUFBLENBQUssS0FBdkMsSUFBZ0QsQ0FBQSxDQUFFLEtBQUYsS0FBWSxVQUFBLENBQUEsU0FBQSxDQUFBLENBQUssR0FBeEYsQ0FBQTtvQkFDQSxJQUFHLENBQUMsZ0JBQUosRUFBc0IsT0FBQTs7b0JBRXRCLElBQUksVUFBQSxHQUFhLENBQUEsQ0FBRSxJQUFGLENBQUEsQ0FBUSxJQUFSLENBQWEsV0FBYixDQUFqQixDQUFBOztvQkFFQSxJQUFHLFVBQUEsS0FBZSxNQUFsQixFQUEwQjt3QkFDdEIsQ0FBQSxDQUFFLElBQUYsQ0FBQSxDQUFRLElBQVIsQ0FBYSxXQUFiLEVBQTBCLE9BQTFCLENBQUEsQ0FBQTt3QkFDQSxDQUFBLENBQUUsZUFBRixFQUFBLENBQUE7cUJBQ0g7O29CQUVELElBQUcsQ0FBQyxVQUFBLEtBQWUsT0FBZixJQUEwQixVQUFBLElBQWMsSUFBekMsS0FBa0QsQ0FBQSxDQUFFLEtBQUYsS0FBWSxVQUFBLENBQUEsU0FBQSxDQUFBLENBQUssR0FBdEUsRUFBMkU7d0JBQ3ZFLENBQUEsQ0FBRSxJQUFGLENBQUEsQ0FBUSxJQUFSLENBQWEsV0FBYixFQUEwQixNQUExQixDQUFBLENBQUE7cUJBQ0g7aUJBYkwsQ0FBQSxDQUFBOztnQkFnQkEsSUFBQSxDQUFLLEdBQUwsQ0FBUyxFQUFULENBQVksTUFBWixFQUFvQixRQUFwQixFQUE4QixZQUFXO29CQUNyQyxDQUFBLENBQUUsSUFBRixDQUFBLENBQVEsSUFBUixDQUFhLFdBQWIsRUFBMEIsT0FBMUIsQ0FBQSxDQUFBO2lCQURKLENBQUEsQ0FBQTs7O2dCQUtBLElBQUEsQ0FBSyxHQUFMLENBQVMsRUFBVCxDQUFZLE9BQVosRUFBcUIsVUFBQyxDQUFELEVBQU87b0JBQ3hCLElBQUksZUFBQSxHQUFrQixDQUFDLENBQUEsQ0FBRSxRQUFGLENBQUEsQ0FBWSxFQUFaLENBQWUsUUFBZixDQUFELElBQTZCLENBQUEsQ0FBRSxRQUFGLENBQUEsQ0FBWSxJQUFaLENBQWlCLFdBQWpCLENBQUEsS0FBa0MsTUFBckYsQ0FBQTtvQkFDQSxJQUFJLENBQUEsQ0FBRSxLQUFGLEtBQVksVUFBQSxDQUFBLFNBQUEsQ0FBQSxDQUFLLEdBQWpCLElBQXdCLGVBQXhCLElBQTJDLENBQUEsQ0FBRSxrQkFBRixDQUFBLENBQXNCLE1BQXRCLEtBQWlDLENBQWhGLEVBQW1GO3dCQUMvRSxNQUFBLENBQUssT0FBTCxDQUFhLFFBQWIsRUFBdUIsTUFBdkIsQ0FBQSxDQUFBO3FCQUNIO2lCQUpMLENBQUEsQ0FBQTthQU1IO1NBQ0o7OzsrQkFFTTtZQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7WUFDSCxJQUFBLENBQUssV0FBTCxFQUFBLENBQUE7WUFDQSxJQUFBLENBQUssR0FBTCxDQUFTLFVBQVQsQ0FBb0IsUUFBcEIsRUFBOEIsTUFBOUIsQ0FBQSxDQUFBO1lBQ0EsSUFBQSxDQUFLLE9BQUwsQ0FBYSxNQUFiLEVBQXFCLElBQXJCLENBQUEsQ0FBQTs7WUFFQSxJQUFBLENBQUssR0FBTCxDQUFTLEVBQVQsQ0FBWSxTQUFaLEVBQXVCLFVBQUMsQ0FBRCxFQUFPO2dCQUMxQixNQUFBLENBQUssVUFBTCxDQUFnQixDQUFoQixDQUFBLENBQUE7YUFESixDQUFBLENBQUE7OztZQUtBLElBQUEsQ0FBSyxHQUFMLENBQVMsRUFBVCxDQUFZLHFCQUFaLEVBQW1DLFlBQUE7Z0JBQUEsT0FBTSxNQUFBLENBQUssVUFBTCxFQUFOLENBQUE7YUFBbkMsQ0FBQSxDQUFBOzs7WUFHQSxJQUFBLENBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxRQUFiLENBQUEsQ0FBQTs7O1lBR0EsSUFBQSxDQUFLLEdBQUwsQ0FBUyxFQUFULENBQVksb0JBQVosRUFBa0MsWUFBTTtnQkFDcEMsTUFBQSxDQUFLLEdBQUwsQ0FBUyxHQUFULENBQWEsb0JBQWIsQ0FBQSxDQUFBO2dCQUNBLE1BQUEsQ0FBSyxPQUFMLENBQWEsT0FBYixDQUFBLENBQUE7YUFGSixDQUFBLENBQUE7U0FJSDs7O3NDQUVhO1lBQ1YsSUFBQSxDQUFLLE9BQUwsR0FBZSxDQUFBLENBQUUsUUFBQSxDQUFTLGFBQVgsQ0FBZixDQUFBO1NBQ0g7OztxQ0FFWTtZQUNULElBQUEsQ0FBSyxHQUFMLENBQVMsSUFBVCxDQUFjLGFBQWQsRUFBNkIsS0FBN0IsQ0FBQSxDQUFBO1lBQ0EsQ0FBQSxDQUFFLFlBQUYsQ0FBQSxDQUFnQixJQUFoQixDQUFxQixhQUFyQixFQUFvQyxNQUFwQyxDQUFBLENBQUE7WUFDQSxDQUFBLENBQUUsYUFBRixDQUFBLENBQWlCLElBQWpCLENBQXNCLGFBQXRCLEVBQXFDLE1BQXJDLENBQUEsQ0FBQTtZQUNBLENBQUEsQ0FBRSxnQkFBRixDQUFBLENBQW9CLElBQXBCLENBQXlCLGFBQXpCLEVBQXdDLE1BQXhDLENBQUEsQ0FBQTs7WUFFQSxJQUFBLENBQUssTUFBTCxDQUFZLEtBQVosRUFBQSxDQUFBO1lBQ0EsSUFBQSxDQUFLLFVBQUwsRUFBQSxDQUFBO1NBQ0g7OztxQ0FFWTtZQUNULElBQUksTUFBQSxHQUFTLE1BQUEsQ0FBTyxXQUFQLEdBQXFCLFFBQUEsQ0FBUyxJQUFBLENBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYSxLQUFiLENBQUEsQ0FBb0IsS0FBcEIsQ0FBMEIsQ0FBMUIsRUFBNkIsQ0FBQyxDQUE5QixDQUFULEVBQTJDLEVBQTNDLENBQWxDLENBRFM7WUFFVCxJQUFJLE1BQUEsQ0FBTyxXQUFQLEdBQXFCLElBQUEsQ0FBSyxFQUFMLENBQVEsWUFBUixHQUF1QixNQUFoRCxFQUF3RDs7Z0JBQ3BELE1BQUEsR0FBUyxJQUFBLENBQUssR0FBTCxDQUFTLElBQUEsQ0FBSyxFQUFMLENBQVEsWUFBUixHQUF1QixNQUFBLENBQU8sV0FBOUIsR0FBNEMsRUFBckQsRUFBeUQsQ0FBQyxDQUExRCxDQUFULENBQUE7YUFESixNQUdLLElBQUksTUFBQSxDQUFPLFVBQVAsR0FBb0IsR0FBeEIsRUFBNkI7O2dCQUM5QixNQUFBLElBQVUsQ0FBVixDQUFBO2FBQ0g7WUFDRCxJQUFBLENBQUssRUFBTCxDQUFRLGNBQVIsRUFBQSxDQVJTO1lBU1QsTUFBQSxDQUFPLFFBQVAsQ0FBZ0IsQ0FBaEIsRUFBbUIsTUFBbkIsQ0FBQSxDQVRTO1NBVVo7OzttQ0FFVSxHQUFHO1lBQ1YsSUFBTSxVQUFBLEdBQWEsQ0FBQSxDQUFFLFFBQUEsQ0FBUyxhQUFYLENBQW5CLENBQUE7WUFDQSxJQUFNLGNBQUEsR0FBaUIsSUFBQSxDQUFLLE1BQUwsSUFBZSxJQUFBLENBQUssR0FBTCxDQUFTLElBQVQsQ0FBYyxvQkFBZCxDQUFBLENBQW9DLEtBQXBDLEVBQXRDLENBQUE7WUFDQSxJQUFNLGFBQUEsR0FBZ0IsSUFBQSxDQUFLLEdBQUwsQ0FBUyxJQUFULENBQWMsb0JBQWQsQ0FBQSxDQUFvQyxJQUFwQyxFQUF0QixDQUFBOztZQUVBLElBQUksVUFBQSxDQUFXLEVBQVgsQ0FBYyxjQUFkLENBQUEsSUFBaUMsQ0FBQSxDQUFFLEtBQUYsS0FBWSxVQUFBLENBQUEsU0FBQSxDQUFBLENBQUssR0FBbEQsSUFBeUQsQ0FBQSxDQUFFLFFBQS9ELEVBQXlFO2dCQUNyRSxDQUFBLENBQUUsY0FBRixFQUFBLENBQUE7Z0JBQ0EsYUFBQSxDQUFjLEtBQWQsRUFBQSxDQUFBO2FBRkosTUFHTyxJQUFJLENBQUEsQ0FBRSxVQUFGLENBQUEsQ0FBYyxFQUFkLENBQWlCLGFBQWpCLENBQUEsSUFBbUMsQ0FBQSxDQUFFLEtBQUYsS0FBWSxVQUFBLENBQUEsU0FBQSxDQUFBLENBQUssR0FBcEQsSUFBMkQsQ0FBQyxDQUFBLENBQUUsUUFBbEUsRUFBNEU7Z0JBQy9FLENBQUEsQ0FBRSxjQUFGLEVBQUEsQ0FBQTtnQkFDQSxjQUFBLENBQWUsS0FBZixFQUFBLENBQUE7YUFDSDtTQUNKOzs7K0JBRU07WUFDSCxJQUFBLENBQUssR0FBTCxDQUFTLFVBQVQsQ0FBb0IsUUFBcEIsRUFBOEIsT0FBOUIsQ0FBQSxDQUFBO1lBQ0EsSUFBQSxDQUFLLE9BQUwsQ0FBYSxNQUFiLEVBQXFCLElBQXJCLENBQUEsQ0FBQTtZQUNBLENBQUEsQ0FBRSxZQUFGLENBQUEsQ0FBZ0IsSUFBaEIsQ0FBcUIsYUFBckIsRUFBb0MsT0FBcEMsQ0FBQSxDQUFBO1lBQ0EsQ0FBQSxDQUFFLGFBQUYsQ0FBQSxDQUFpQixJQUFqQixDQUFzQixhQUF0QixFQUFxQyxPQUFyQyxDQUFBLENBQUE7WUFDQSxDQUFBLENBQUUsZ0JBQUYsQ0FBQSxDQUFvQixJQUFwQixDQUF5QixhQUF6QixFQUF3QyxPQUF4QyxDQUFBLENBQUE7WUFDQSxJQUFBLENBQUssT0FBTCxDQUFhLEtBQWIsRUFBQSxDQUFBO1NBQ0g7OztnQ0FFTztZQUNKLElBQUEsQ0FBSyxJQUFMLEVBQUEsQ0FBQTtZQUNBLElBQUEsQ0FBSyxNQUFMLEVBQUEsQ0FBQTtTQUNIOzs7NEJBak1jOzs7O1lBSVgsSUFBSSxlQUFBLEdBQWtCLE1BQUEsQ0FBTyxjQUFQLENBQXNCLFNBQXRCLENBQWdDLHdCQUFoQyxDQUFBLEdBQTRELEtBQTVELEdBQW9FLElBQTFGLENBQUE7O1lBRUEsT0FBTztnQkFDSCxRQUFBLEVBQTBCLElBRHZCO2dCQUVILFVBQUEsRUFBMEIsSUFGdkI7Z0JBR0gsVUFBQSxFQUEwQixlQUh2QjtnQkFJSCxXQUFBLEVBQTBCLElBSnZCOztnQkFNSCxFQUFBLEVBQTBCLEVBTnZCO2dCQU9ILE9BQUEsRUFBMEIsQ0FBQyxPQUFELENBUHZCO2dCQVFILFdBQUEsRUFBMEIsT0FSdkI7Z0JBU0gsS0FBQSxFQUEwQixPQVR2QjtnQkFVSCxXQUFBLEVBQTBCLEtBVnZCO2dCQVdILE9BQUEsRUFBMEIsY0FYdkI7Z0JBWUgsVUFBQSxFQUEwQixJQUFBLENBQUssSUFBTCxDQVp2QjtnQkFhSCxVQUFBLEVBQTBCLElBQUEsQ0FBSyxRQUFMLENBYnZCO2dCQWNILGdCQUFBLEVBQTBCLElBZHZCO2dCQWVILHNCQUFBLEVBQTBCLElBZnZCO2dCQWdCSCxlQUFBLEVBQTBCLElBQUE7YUFoQjlCLENBQUE7U0FrQkg7Ozs7RUExQmUsUUFBQSxDQUFTOztRQXNNcEIsUUFBQTs7Ozs7Ozs7OztxQkN6TU07QUFBQSxRQUFFLEtBQUYsUUFBRSxLQUFGO0FBQUEsUUFBUyxVQUFULFFBQVMsVUFBVDtBQUFBLFFBQXFCLFdBQXJCLFFBQXFCLFdBQXJCO0FBQUEsUUFBa0MsZUFBbEMsUUFBa0MsZUFBbEM7QUFBQSxrSEFBNkosVUFBN0osbUNBQXVNLFdBQXZNLHdHQUUrQyxLQUYvQyx3QkFHTCx3RkFBdUYsT0FBTyxJQUFQLENBQVksT0FBWixDQUF2RixpQ0FBMEksRUFIckk7QUFBQSxDOzs7Ozs7Ozs7cUJDbUJBLFlBQVk7QUFDdkIsUUFBTSx3QkFBd0IsMkJBQTlCOztBQUVBLDJCQUNPLEtBQUssNEJBQUwsQ0FEUCwySEFJa0MsS0FDMUIsb0NBRDBCLENBSmxDLGtFQU9pRCxLQUN6QyxpQ0FEeUMsQ0FQakQscUpBYWlDLEtBQ3pCLG9DQUR5QixDQWJqQywwSkFtQmlDLEtBQ3pCLGtDQUR5QixDQW5CakMsa0dBeUJNLEtBQUssNkJBQUwsRUFBb0M7QUFDbEMscUlBQTJILHFCQUEzSCxVQUFxSixLQUNqSixtQkFEaUosQ0FBckosU0FEa0M7QUFJbEMsdUlBQTZILHFCQUE3SCxVQUF1SixLQUNuSixxQkFEbUosQ0FBdko7QUFKa0MsS0FBcEMsQ0F6Qk4saUdBb0NxRSxLQUNqRSw0QkFEaUUsQ0FwQ3JFO0FBeUNILEM7O2NBL0RnQixNO0lBQVQsSSxXQUFBLEk7OztBQUVSLElBQU0sNEJBQTRCLFNBQTVCLHlCQUE0QixHQUFNO0FBQUEsNEJBQ0QsT0FBTyxTQUROO0FBQUEsUUFDNUIsWUFENEIscUJBQzVCLFlBRDRCO0FBQUEsUUFDZCxRQURjLHFCQUNkLFFBRGM7O0FBRXBDLFFBQU0sd0JBQXdCLEVBQTlCO0FBQ0EsUUFBSSxZQUFKLEVBQWtCO0FBQ2QsOEJBQXNCLElBQXRCLENBQTJCLGlCQUEzQjtBQUNIO0FBQ0QsUUFBSSxRQUFKLEVBQWM7QUFDViw4QkFBc0IsSUFBdEIsQ0FBMkIsWUFBM0I7QUFDSDs7QUFFRCxRQUFJLHNCQUFzQixNQUF0QixLQUFpQyxDQUFyQyxFQUF3QztBQUNwQyxlQUFPLEVBQVA7QUFDSDs7QUFFRCxpQkFBVyxzQkFBc0IsSUFBdEIsQ0FBMkIsR0FBM0IsQ0FBWDtBQUNILENBZkQ7Ozs7Ozs7Ozs7O0FDRkE7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7OztjQUUrQixNO0lBQXZCLE8sV0FBQSxPO0lBQVMsUyxXQUFBLFM7Z0JBQ0UsUTtJQUFYLE0sYUFBQSxNO0lBQ0EsTyxHQUFZLHlCLENBQVosTzs7SUFFYSxtQjs7O0FBSWpCLGlDQUFZLElBQVosRUFBaUI7QUFBQTs7QUFBQSw4SUFDUCxJQURPOztBQUFBLGNBRmpCLFdBRWlCLEdBRkgsVUFFRzs7O0FBR2IsY0FBSyxPQUFMLEdBQWUsSUFBSSxvQkFBSixDQUFZLFFBQVEsR0FBUixDQUFZLE1BQUssV0FBakIsQ0FBWixFQUEyQyxVQUFVLGFBQXJELENBQWY7QUFDQSxjQUFLLGFBQUwsR0FBcUIsS0FBSyxhQUExQjtBQUphO0FBS2hCOzs7O2lDQUVRO0FBQUE7O0FBRUwsaUJBQUssR0FBTCxDQUFTLEtBQVQsR0FBaUIsTUFBakIsQ0FBd0IsdUNBQXhCOztBQUVBLGlCQUFLLGtCQUFMLEdBQTBCLElBQUkscUJBQUosQ0FBYTtBQUNuQyxvQkFBSSxLQUFLLEdBQUwsQ0FBUyxJQUFULENBQWMscUJBQWQsQ0FEK0I7QUFFbkMsdUJBQU8sS0FBSyx1Q0FBTCxDQUY0QjtBQUduQywyQkFBVyxLQUFLLHVDQUFMO0FBSHdCLGFBQWIsRUFJdkIsTUFKdUIsRUFBMUI7QUFLQSxpQkFBSyxrQkFBTCxDQUF3QixHQUF4QixDQUE0QixLQUFLLE9BQUwsQ0FBYSxtQkFBekM7QUFDQSxpQkFBSyxrQkFBTCxDQUF3QixFQUF4QixDQUEyQixRQUEzQixFQUFxQyxVQUFDLEdBQUQsRUFBUztBQUMxQyx1QkFBSyxPQUFMLENBQWEsbUJBQWIsR0FBbUMsR0FBbkM7QUFDSCxhQUZEOztBQUlBLGlCQUFLLHVCQUFMLEdBQStCLElBQUkscUJBQUosQ0FBYTtBQUN4QyxvQkFBSSxLQUFLLEdBQUwsQ0FBUyxJQUFULENBQWMsMEJBQWQsQ0FEb0M7QUFFeEMsdUJBQU8sS0FBSyxxQ0FBTCxDQUZpQztBQUd4QywyQkFBVyxLQUFLLHFDQUFMO0FBSDZCLGFBQWIsRUFJNUIsTUFKNEIsRUFBL0I7QUFLQSxpQkFBSyx1QkFBTCxDQUE2QixHQUE3QixDQUFpQyxLQUFLLE9BQUwsQ0FBYSx3QkFBOUM7QUFDQSxpQkFBSyx1QkFBTCxDQUE2QixFQUE3QixDQUFnQyxRQUFoQyxFQUEwQyxVQUFDLEdBQUQsRUFBUztBQUMvQyx1QkFBSyxPQUFMLENBQWEsd0JBQWIsR0FBd0MsR0FBeEM7QUFDSCxhQUZEOztBQUtBLGlCQUFLLEdBQUwsQ0FBUyxJQUFULENBQWMsVUFBZCxFQUEwQixFQUExQixDQUE2QixPQUE3QixFQUFzQztBQUFBLHVCQUFNLE9BQUssT0FBTCxFQUFOO0FBQUEsYUFBdEM7O0FBRUEsZ0JBQUksT0FBTztBQUNQLDBCQUFVLEtBREg7QUFFUCx1QkFBTyxLQUFLLDBCQUFMLENBRkE7QUFHUCx5QkFBUyxLQUFLLEdBSFA7QUFJUCx5QkFBUyxDQUFDLHFCQUFELENBSkY7QUFLUCw0QkFBYSxLQUFLLGFBTFg7QUFNUCw2QkFBYyxLQUFLLGFBTlo7QUFPUCxpQ0FBaUIsS0FBSztBQVBmLGFBQVg7O0FBV0EsaUJBQUssR0FBTCxDQUFTLElBQVQsQ0FBYyxjQUFkLEVBQThCLElBQTlCLENBQW1DLFVBQUMsQ0FBRCxFQUFJLElBQUosRUFBYTtBQUM1QyxvQkFBSSxRQUFRLEVBQUUsSUFBRixDQUFPLElBQVAsRUFBYSxLQUFiLENBQW1CLEVBQW5CLENBQVo7QUFDQSxrQ0FBZ0IsTUFBTSxJQUFOLENBQVcsZUFBWCxDQUFoQjtBQUNILGFBSEQ7O0FBS0EsaUJBQUssS0FBTCxHQUFhLElBQUksWUFBSixDQUFVLElBQVYsQ0FBYjtBQUNBLGlCQUFLLEtBQUwsQ0FBVyxJQUFYO0FBQ0g7OztrQ0FFUTtBQUNMLG9CQUFRLEdBQVIsQ0FBWSxRQUFRLElBQXBCLEVBQTBCLEtBQUssT0FBTCxDQUFhLEtBQXZDLEVBQTZDO0FBQ3pDLHdCQUFRLE9BQU8sU0FBUCxDQUFpQixPQUFqQixHQUEyQixnQkFBM0IsR0FBOEMsUUFBUSxNQURyQjtBQUV6Qyx5QkFBUyxJQUFJLElBQUosQ0FBUyxLQUFLLEdBQUwsS0FBYSxRQUFRLFVBQTlCO0FBRmdDLGFBQTdDO0FBSUEsaUJBQUssS0FBTCxDQUFXLElBQVg7O0FBRUE7QUFDQSxxQkFBUyxNQUFUO0FBQ0g7Ozs7RUFuRTRDLFNBQVMsSTs7cUJBQXJDLG1COzs7Ozs7Ozs7Ozs7O0lDVkEscUI7QUFDakIsbUNBQVksT0FBWixFQUFxQjtBQUFBOztBQUNqQixhQUFLLFFBQUwsR0FBZ0IsT0FBaEI7QUFDSDs7OzsrQkFFTSxNLEVBQVE7QUFDWDtBQUNIOzs7bUNBRVU7QUFDUDtBQUNIOzs7cUNBRVk7QUFDVCxtQkFBTyxLQUFLLFFBQVo7QUFDSDs7Ozs7O3FCQWZnQixxQjs7Ozs7Ozs7Ozs7QUNBckI7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7OztJQUVxQixvQjtBQUNqQixvQ0FBYztBQUFBOztBQUNWLGFBQUssWUFBTCxHQUFvQixLQUFwQjtBQUNBLGFBQUssVUFBTCxHQUFrQixDQUFsQjtBQUNBLGFBQUssZ0JBQUwsQ0FBc0IsQ0FBQyxJQUFJLHVCQUFKLENBQWUsSUFBZixDQUFELEVBQXVCLElBQUksK0JBQUosQ0FBdUIsSUFBdkIsQ0FBdkIsQ0FBdEI7QUFHSDs7Ozt5Q0FFZ0IsUyxFQUFXO0FBQ3hCLGdCQUFJLHNCQUFzQixRQUFRLEdBQVIsQ0FBWSxZQUFaLENBQTFCO0FBQ0EsZ0JBQUksU0FBUyxzQkFBc0IsS0FBSyxLQUFMLENBQVcsbUJBQVgsQ0FBdEIsR0FBd0QsRUFBckU7QUFDQSxtQkFBTyxPQUFPLE1BQVAsR0FBZ0IsS0FBSyxVQUFMLEdBQWtCLENBQXpDLEVBQTRDO0FBQ3hDLHVCQUFPLEtBQVA7QUFDSDtBQUNELGdCQUFNLFdBQVcsT0FBTyxRQUFQLENBQWdCLFFBQWhCLEdBQTJCLE9BQU8sUUFBUCxDQUFnQixRQUEzQyxHQUFzRCxHQUF2RTtBQUNBLGdCQUFNLFNBQVMsT0FBTyxRQUFQLENBQWdCLE1BQWhCLEdBQXlCLE9BQU8sUUFBUCxDQUFnQixNQUF6QyxHQUFrRCxFQUFqRTtBQUNBLGdCQUFNLE9BQU8sT0FBTyxRQUFQLENBQWdCLElBQWhCLEdBQXVCLE9BQU8sUUFBUCxDQUFnQixJQUF2QyxHQUE4QyxFQUEzRDtBQUNBLGdCQUFNLFFBQVEsV0FBVyxNQUFYLEdBQW9CLElBQWxDO0FBQ0EsbUJBQU8sSUFBUCxDQUFZLEtBQUssU0FBTCxDQUFlLEVBQUUsU0FBUyx3QkFBVyxJQUFYLENBQWdCLEtBQWhCLENBQVgsRUFBZixDQUFaO0FBQ0Esb0JBQVEsR0FBUixDQUFZLFlBQVosRUFBMEIsTUFBMUIsRUFBa0MsRUFBRSxNQUFNLEdBQVIsRUFBbEM7QUFDQSxpQkFBSyxrQkFBTCxDQUF3QixTQUF4QixFQUFtQyxNQUFuQztBQUVIOzs7MkNBRWtCO0FBQ2YsZ0JBQUksU0FBUyxLQUFLLE9BQUwsRUFBYjtBQUNBLGdCQUFJLE9BQU8sTUFBUCxHQUFnQixDQUFwQixFQUF1QjtBQUNuQix1QkFBTyxLQUFQO0FBQ0g7QUFDRCxnQkFBTSx1QkFBdUIsT0FBTyxPQUFPLE1BQVAsR0FBZ0IsQ0FBdkIsRUFBMEIsS0FBdkQ7QUFDQSxnQkFBTSxtQkFBbUIsT0FBTyxPQUFPLE1BQVAsR0FBZ0IsQ0FBdkIsRUFBMEIsS0FBbkQ7QUFDQSxnQkFBTSxnQkFBZ0IsT0FBTyxPQUFPLE1BQVAsR0FBZ0IsQ0FBdkIsRUFBMEIsS0FBaEQ7QUFDQSxtQkFBUSxPQUFPLE1BQVAsSUFBaUIsQ0FBakIsSUFBc0IseUJBQXlCLGFBQS9DLElBQWdFLGtCQUFrQixnQkFBMUY7QUFDSDs7O3dDQUVlLEksRUFBTSxLLEVBQU87QUFDekIsZ0JBQUksc0JBQXNCLFFBQVEsR0FBUixDQUFZLFlBQVosQ0FBMUI7QUFDQSxnQkFBSSx3QkFBd0IsU0FBNUIsRUFBdUM7QUFDbkMsb0JBQUksU0FBUyxLQUFLLEtBQUwsQ0FBVyxtQkFBWCxDQUFiO0FBQ0E7QUFDQSxvQkFBSSxRQUFRLE9BQU8sT0FBTyxPQUFPLE1BQVAsR0FBZ0IsQ0FBdkIsQ0FBUCxLQUFxQyxRQUFyQyxHQUFnRCxLQUFLLEtBQUwsQ0FBVyxPQUFPLE9BQU8sTUFBUCxHQUFnQixDQUF2QixDQUFYLENBQWhELEdBQXdGLE9BQU8sT0FBTyxNQUFQLEdBQWdCLENBQXZCLENBQXBHO0FBQ0Esc0JBQU0sSUFBTixJQUFlLEtBQWY7QUFDQSx1QkFBTyxPQUFPLE1BQVAsR0FBZ0IsQ0FBdkIsSUFBNEIsS0FBNUI7QUFDQSx3QkFBUSxHQUFSLENBQVksWUFBWixFQUEwQixLQUFLLFNBQUwsQ0FBZSxNQUFmLENBQTFCLEVBQWtELEVBQUUsTUFBTSxHQUFSLEVBQWxEO0FBQ0g7QUFDSjs7O2dDQUVPLEssRUFBTztBQUNYLGdCQUFJLFFBQVEsR0FBUixDQUFZLFlBQVosQ0FBSixFQUErQjtBQUMzQixvQkFBSSxzQkFBc0IsUUFBUSxHQUFSLENBQVksWUFBWixDQUExQjtBQUNBLG9CQUFJLFNBQVMsS0FBSyxLQUFMLENBQVcsbUJBQVgsQ0FBYjtBQUNBLHFCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksT0FBTyxNQUEzQixFQUFtQyxHQUFuQyxFQUF3QztBQUNwQywyQkFBTyxDQUFQLElBQVksT0FBTyxPQUFPLENBQVAsQ0FBUCxLQUFxQixRQUFyQixHQUFnQyxLQUFLLEtBQUwsQ0FBVyxPQUFPLENBQVAsQ0FBWCxDQUFoQyxHQUF3RCxPQUFPLENBQVAsQ0FBcEU7QUFDSDtBQUNELG9CQUFJLFFBQVEsQ0FBQyxDQUFULElBQWMsT0FBTyxLQUFQLENBQWxCLEVBQWlDO0FBQzdCLDJCQUFPLE9BQU8sS0FBUCxDQUFQO0FBQ0gsaUJBRkQsTUFHSyxJQUFJLENBQUMsS0FBTCxFQUFZO0FBQ2IsMkJBQU8sTUFBUDtBQUNIO0FBQ0o7QUFDRCxtQkFBTyxFQUFQO0FBQ0g7OzsyQ0FFa0IsUyxFQUFXLE0sRUFBUTtBQUFBOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBQUEsd0JBQ3pCLFFBRHlCOztBQUU5Qiw2QkFBUyxNQUFULENBQWdCLE1BQWhCO0FBQ0E7QUFDQSwyQkFBTyxnQkFBUCxDQUF3QixjQUF4QixFQUF3QyxZQUFNO0FBQzFDLDRCQUFJLENBQUMsTUFBSyxZQUFWLEVBQXdCO0FBQ3BCLHFDQUFTLFFBQVQ7QUFDQSxrQ0FBSyxZQUFMLEdBQW9CLElBQXBCO0FBQ0g7QUFDSixxQkFMRCxFQUtHLEtBTEg7O0FBT0E7QUFDQSwyQkFBTyxnQkFBUCxDQUF3QixVQUF4QixFQUFvQyxZQUFNO0FBQ3RDLDRCQUFJLENBQUMsTUFBSyxZQUFWLEVBQXdCO0FBQ3BCLHFDQUFTLFFBQVQ7QUFDQSxrQ0FBSyxZQUFMLEdBQW9CLElBQXBCO0FBQ0g7QUFDSixxQkFMRCxFQUtHLEtBTEg7QUFaOEI7O0FBQ2xDLHFDQUFxQixTQUFyQiw4SEFBZ0M7QUFBQTtBQWlCL0I7QUFsQmlDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFtQnJDOzs7Ozs7cUJBcEZnQixvQjs7Ozs7Ozs7O0FDSnJCOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7QUFFQSxJQUFNLGlDQUFpQyxTQUFqQyw4QkFBaUMsT0FBVTtBQUFBLFFBQVIsRUFBUSxRQUFSLEVBQVE7O0FBQzdDO0FBQ0E7QUFDQSxNQUFFLFFBQUYsRUFBWSxFQUFaLENBQWUsT0FBZixFQUF3QixrREFBeEIsRUFBNEUsVUFBQyxDQUFELEVBQU87QUFDL0UsWUFBTSxpQkFBaUIsSUFBSSwyQkFBSixFQUF2Qjs7QUFFQSxZQUFNLFVBQVUsRUFBRSxFQUFFLE1BQUosRUFBWSxPQUFaLENBQW9CLGtEQUFwQixDQUFoQjtBQUNBLFlBQU0sVUFBVSxRQUFRLElBQVIsQ0FBYSxVQUFiLENBQWhCOztBQUVBLHVCQUFlLE1BQWYsQ0FBc0IsRUFBQyxTQUFTLE9BQVYsRUFBdEIsRUFBMEMsSUFBMUMsQ0FBK0MsVUFBQyxRQUFELEVBQWM7QUFDekQsZ0JBQU0sUUFBUSxJQUFJLGtCQUFKLENBQVUsUUFBVixDQUFkOztBQUVBO0FBQ0Esa0JBQU0sR0FBTixDQUFVLEVBQUMsWUFBWSxRQUFiLEVBQVY7O0FBRUEsbUJBQU8sSUFBUCxDQUFZLE9BQVosQ0FBb0IsTUFBTSxHQUFOLENBQVUsSUFBVixDQUFwQixFQUFxQyxJQUFyQyxDQUEwQyxVQUFDLFFBQUQsRUFBYztBQUFFO0FBQ3RELHNCQUFNLEdBQU4sQ0FBVTtBQUNOLGdDQUFZLFNBQVMsVUFEZjtBQUVOLGdDQUFZLFNBQVMsVUFGZjtBQUdOLHNDQUFrQixTQUFTO0FBSHJCLGlCQUFWOztBQU1BLG9CQUFJLE9BQU8sY0FBUCxDQUFzQixTQUF0QixDQUFnQyxZQUFoQyxDQUFKLEVBQWtEO0FBQzlDLHdCQUFJLGtDQUFKLENBQTJCLEVBQUMsWUFBRCxFQUFRLGVBQWUsSUFBdkIsRUFBNkIsTUFBN0IsRUFBM0I7QUFDSCxpQkFGRCxNQUVPO0FBQ0gsd0JBQUksaUNBQUosQ0FBeUIsRUFBQyxZQUFELEVBQVEsTUFBTSxlQUFkLEVBQStCLE1BQS9CLEVBQXpCO0FBQ0g7QUFFSixhQWJEO0FBY0gsU0FwQkQ7QUFxQkgsS0EzQkQ7QUE0QkgsQ0EvQkQ7O3FCQWlDZSw4Qjs7Ozs7Ozs7O3FCQ3RDQTtBQUFBLFFBQUcsaUJBQUgsUUFBRyxpQkFBSDtBQUFBLFFBQXNCLFdBQXRCLFFBQXNCLFdBQXRCO0FBQUEsUUFBbUMsT0FBbkMsUUFBbUMsT0FBbkM7QUFBQSxRQUE0QyxJQUE1QyxRQUE0QyxJQUE1QztBQUFBLHVCQUNULGtCQUFrQixNQUFsQixHQUEyQixDQUEzQix3Q0FBZ0UsaUJBQWhFLFlBQTBGLEVBRGpGLGdCQUVULFlBQVksTUFBWixHQUFxQixDQUFyQixpQ0FBbUQsV0FBbkQsWUFBdUUsRUFGOUQsZUFHVCxRQUFRLEdBQVIsQ0FBWSxVQUFDLE1BQUQ7QUFBQSx3Q0FBaUMsTUFBakM7QUFBQSxLQUFaLEVBQTJELElBQTNELENBQWdFLEVBQWhFLENBSFMsZUFJVCxLQUFLLE1BQUwsR0FBYyxDQUFkLDBCQUFxQyxJQUFyQyxZQUFrRCxFQUp6QztBQUFBLEM7Ozs7Ozs7Ozs7O0FDQWY7Ozs7Ozs7Ozs7OztjQUU4QixNO0lBQXRCLEksV0FBQSxJO0lBQU0sRyxXQUFBLEc7SUFBSyxNLFdBQUEsTTs7SUFFRSxlOzs7Ozs0QkFDTztBQUNwQixnQkFBTSxtQkFBbUIsS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLFNBQWYsS0FBNkIsQ0FBQyxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsYUFBZixDQUF2RDtBQUNBLGdCQUFJLGdCQUFKLEVBQXNCO0FBQ2xCLG9CQUFJLEtBQUssSUFBTCxLQUFjLGlCQUFsQixFQUFxQztBQUNqQywyQkFBVSxLQUFLLHlDQUFMLENBQVYsbURBQW9HLElBQUksT0FBTyxZQUFYLENBQXBHLFdBQWlJLEtBQUssOEJBQUwsQ0FBakk7QUFDSCxpQkFGRCxNQUVPLElBQUksT0FBTyxjQUFQLENBQXNCLFNBQXRCLENBQWdDLG1CQUFoQyxJQUF1RCxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsVUFBZixDQUF2RCxHQUFvRixLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsWUFBZixNQUFpQyxRQUF6SCxFQUFtSTtBQUN0SSwyQkFBTyxLQUFLLHNDQUFMLENBQVA7QUFDSDtBQUNELHVCQUFPLEtBQUssa0NBQUwsQ0FBUDtBQUNIO0FBQ0QsbUJBQU8sRUFBUDtBQUNIOzs7NEJBRWlCO0FBQ2QsZ0JBQU0sYUFBYSxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsWUFBZixDQUFuQjtBQUNBLGdCQUFNLG1CQUFtQixLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsa0JBQWYsS0FBc0MsQ0FBL0Q7O0FBRUEsZ0JBQUksS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLG1CQUFmLEtBQXVDLHFCQUFxQixDQUFoRSxFQUFtRTtBQUMvRCx1QkFBTyxLQUFLLG1DQUFMLENBQVA7QUFDSDs7QUFFRCxvQkFBUSxLQUFLLElBQWI7QUFDSSxxQkFBSyxPQUFMO0FBQ0ksd0JBQUksVUFBSixFQUFnQjtBQUNaLCtCQUFPLGNBQWMsQ0FBZCxHQUNELEtBQUssc0NBQUwsRUFBNkMsRUFBRSxZQUFZLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxZQUFmLENBQWQsRUFBN0MsQ0FEQyxHQUVELEtBQUssbUNBQUwsQ0FGTjtBQUdIO0FBQ0QsMkJBQU8sRUFBUDtBQUNKLHFCQUFLLGVBQUw7QUFDQSxxQkFBSyxpQkFBTDtBQUNBLHFCQUFLLE9BQUw7QUFDQTtBQUNJLDJCQUFPLEVBQVA7QUFaUjtBQWNIOzs7NEJBRWE7QUFDVixnQkFBTSxhQUFhLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxZQUFmLEtBQWdDLENBQW5EO0FBQ0EsZ0JBQU0sY0FBYyxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsYUFBZixLQUFpQyxDQUFyRDtBQUNBLGdCQUFNLG1CQUFtQixLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsa0JBQWYsS0FBc0MsQ0FBL0Q7QUFDQSxvQkFBUSxLQUFLLElBQWI7QUFDSSxxQkFBSyxlQUFMO0FBQ0EscUJBQUssaUJBQUw7QUFDSSwyQkFBTyxDQUNILEtBQUssMkNBQUwsRUFBa0QsRUFBRSxrQ0FBRixFQUFvQixzQkFBcEIsRUFBbEQsQ0FERyxFQUVILEtBQUssbUNBQUwsRUFBMEMsRUFBRSx3QkFBRixFQUExQyxDQUZHLENBQVA7QUFJSixxQkFBSyxPQUFMO0FBQ0EscUJBQUssT0FBTDtBQUNBO0FBQ0ksMkJBQU8sQ0FDSCxLQUFLLG9DQUFMLEVBQTJDLEVBQUUsc0JBQUYsRUFBM0MsQ0FERyxFQUVILEtBQUssbUNBQUwsRUFBMEMsRUFBRSx3QkFBRixFQUExQyxDQUZHLENBQVA7QUFWUjtBQWVIOzs7NEJBRVU7QUFDUCxtQkFBTyxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsWUFBZixJQUErQixLQUFLLHVCQUFMLENBQS9CLEdBQStELEVBQXRFO0FBQ0g7OztBQUVELG1DQUFzQjtBQUFBLFlBQVIsSUFBUSxRQUFSLElBQVE7O0FBQUE7O0FBQUEsdUlBQ1QsU0FEUzs7QUFFbEIsY0FBSyxFQUFMLEdBQVUsTUFBSyxFQUFMLElBQVcsU0FBUyxhQUFULENBQXVCLEtBQXZCLENBQXJCO0FBQ0EsY0FBSyxFQUFMLENBQVEsU0FBUixHQUF1QixNQUFLLEVBQUwsQ0FBUSxTQUEvQjtBQUNBLGNBQUssSUFBTCxHQUFZLFFBQVEsT0FBcEI7QUFKa0I7QUFLckI7Ozs7aUNBRVE7QUFDTCxnQkFBTSxPQUFPLGtDQUF3QjtBQUNqQyxtQ0FBbUIsS0FBSyxpQkFEUztBQUVqQyw2QkFBYSxLQUFLLFdBRmU7QUFHakMseUJBQVMsS0FBSyxPQUhtQjtBQUlqQyxzQkFBTSxLQUFLO0FBSnNCLGFBQXhCLENBQWI7QUFNQSxpQkFBSyxHQUFMLENBQVMsS0FBVCxHQUFpQixNQUFqQixDQUF3QixJQUF4Qjs7QUFFQSxtQkFBTyxJQUFQO0FBQ0g7Ozs7RUFoRndDLFNBQVMsSTs7cUJBQWpDLGU7Ozs7Ozs7OztBQ0pyQjs7QUFDQTs7Ozs7Ozs7Ozs7O0lBRXFCLG9COzs7QUFDakIsd0NBQTZCO0FBQUEsWUFBZixLQUFlLFFBQWYsS0FBZTtBQUFBLFlBQVIsSUFBUSxRQUFSLElBQVE7O0FBQUE7O0FBQ3pCLFlBQU0sY0FBYyxJQUFJLDRCQUFKLENBQW9CLEVBQUUsWUFBRixFQUFTLFVBQVQsRUFBcEIsRUFBcUMsTUFBckMsRUFBcEI7QUFDQSxZQUFNLGdCQUFnQjtBQUNsQixxQkFBUyxDQUFDLHNCQUFELENBRFM7QUFFbEIsbUJBQU8sT0FBTyxJQUFQLENBQVksNkJBQVosQ0FGVztBQUdsQixxQkFBUyxZQUFZO0FBSEgsU0FBdEI7QUFGeUIsMklBT25CLGFBUG1CO0FBUTVCOzs7RUFUNkMsWTs7cUJBQTdCLG9COzs7Ozs7Ozs7QUNIckI7O0FBQ0E7Ozs7Ozs7Ozs7OztJQUVxQixzQjs7O0FBQ2pCLDBDQUE2QztBQUFBLFlBQS9CLEtBQStCLFFBQS9CLEtBQStCO0FBQUEsc0NBQXhCLGFBQXdCO0FBQUEsWUFBeEIsYUFBd0Isc0NBQVIsS0FBUTs7QUFBQTs7QUFDekMsWUFBTSxjQUFjLElBQUksNkJBQUosQ0FBc0IsRUFBQyxZQUFELEVBQVEsNEJBQVIsRUFBdUIsV0FBVyxPQUFPLFNBQVAsQ0FBaUIsU0FBbkQsRUFBdEIsRUFBcUYsTUFBckYsRUFBcEI7QUFDQSxZQUFNLGdCQUFnQjtBQUNsQixxQkFBUyxDQUFDLHdCQUFELENBRFM7QUFFbEIsbUJBQU8sT0FBTyxJQUFQLENBQVksNkJBQVosQ0FGVztBQUdsQixxQkFBUyxZQUFZO0FBSEgsU0FBdEI7QUFGeUMsK0lBT25DLGFBUG1DO0FBUTVDOzs7RUFUK0MsWTs7cUJBQS9CLHNCOzs7Ozs7OztjQ0hFLE07SUFBZixJLFdBQUEsSTtJQUFNLEksV0FBQSxJOztxQkFDQztBQUFBLFFBQUcsV0FBSCxRQUFHLFdBQUg7QUFBQSxRQUFnQixPQUFoQixRQUFnQixPQUFoQjtBQUFBLFFBQXlCLElBQXpCLFFBQXlCLElBQXpCO0FBQUEsUUFBK0IsZ0JBQS9CLFFBQStCLGdCQUEvQjtBQUFBLHVCQUNULGVBQWUsWUFBWSxNQUFaLEdBQXFCLENBQXBDLGlDQUFrRSxXQUFsRSxZQUFzRixFQUQ3RSxnQkFFVCxXQUFXLFFBQVEsR0FBUixDQUFZLFVBQUMsTUFBRDtBQUFBLHNFQUE2RCxPQUFPLEtBQXBFLHVCQUEyRixPQUFPLEtBQWxHO0FBQUEsS0FBWixFQUFrSSxJQUFsSSxDQUF1SSxFQUF2SSxDQUZGLGdCQUdULFFBQVEsS0FBSyxNQUFMLEdBQWMsQ0FBdEIsMEJBQTZDLElBQTdDLFlBQTBELEVBSGpELGdCQUlULG9CQUFvQixpQkFBaUIsTUFBakIsR0FBMEIsQ0FBOUMsb0NBQWlGLGdCQUFqRixZQUEwRyxFQUpqRztBQUFBLEM7Ozs7Ozs7Ozs7O0FDRGY7Ozs7QUFDQTs7Ozs7Ozs7Ozs7O2NBQ2lCLE07SUFBVCxJLFdBQUEsSTs7SUFFYSxpQjs7O0FBQ2pCLHFDQUEwRDtBQUFBLHNDQUE1QyxhQUE0QztBQUFBLFlBQTVDLGFBQTRDLHNDQUE1QixLQUE0QjtBQUFBLGtDQUFyQixTQUFxQjtBQUFBLFlBQXJCLFNBQXFCLGtDQUFULEtBQVM7O0FBQUE7O0FBQUEsMklBQzdDLFNBRDZDOztBQUV0RCxjQUFLLEVBQUwsR0FBVSxNQUFLLEVBQUwsSUFBVyxTQUFTLGFBQVQsQ0FBdUIsS0FBdkIsQ0FBckI7QUFDQSxjQUFLLGFBQUwsR0FBcUIsYUFBckI7QUFDQSxjQUFLLFNBQUwsR0FBaUIsU0FBakI7QUFDQSxjQUFLLHVCQUFMLEdBQStCLENBQS9CO0FBQ0EsY0FBSyxzQkFBTCxHQUE4QixFQUE5QjtBQUNBLGNBQUssUUFBTCxDQUFjLE1BQUssS0FBbkIsRUFBMEIsbUJBQTFCLEVBQStDLE1BQUssY0FBcEQ7QUFQc0Q7QUFRekQ7Ozs7aUNBRVE7QUFDTCxnQkFBTSxPQUFPLG1DQUF3QjtBQUNqQyw2QkFBYSxLQUFLLFdBRGU7QUFFakMseUJBQVMsS0FBSyxPQUZtQjtBQUdqQyxzQkFBTSxLQUFLLElBSHNCO0FBSWpDLGtDQUFrQixLQUFLO0FBSlUsYUFBeEIsQ0FBYjtBQU1BLGlCQUFLLEdBQUwsQ0FBUyxLQUFULEdBQWlCLE1BQWpCLENBQXdCLElBQXhCOztBQUVBLG1CQUFPLElBQVA7QUFDSDs7O3lDQUVnQjtBQUNiLGdCQUFJLEtBQUssWUFBVCxFQUF1QjtBQUNuQixxQkFBSyxHQUFMLENBQVMsSUFBVDtBQUNIO0FBQ0o7Ozs0QkFFaUI7QUFDZCxnQkFBSSxLQUFLLGlCQUFULEVBQTRCO0FBQ3hCLHVCQUFPLEtBQUssdUNBQUwsQ0FBUDtBQUNILGFBRkQsTUFFTyxJQUFJLEtBQUssY0FBVCxFQUF5QjtBQUM1QixvQkFBSSxVQUFVLEVBQWQ7QUFDQSxvQkFBSSxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsWUFBZixNQUFpQyxRQUFyQyxFQUErQztBQUMzQyw4QkFBVSxLQUFLLHlDQUFMLENBQVY7QUFDSCxpQkFGRCxNQUVPO0FBQ0gsOEJBQVUsS0FBSyxrQ0FBTCxDQUFWO0FBQ0g7QUFDRCx1QkFBTyxLQUFLLGFBQUwsR0FDRCxPQURDLGNBRVEsT0FGUiwwRkFFb0csS0FDakcsOEJBRGlHLENBRnBHLGdCQUFQO0FBS0gsYUFaTSxNQVlBLElBQ0gsS0FBSyxLQUFMLENBQVcsb0JBQVgsSUFDQSxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsWUFBZixNQUFpQyxRQUY5QixFQUdMO0FBQ0Usb0JBQUksYUFBYSxPQUFPLEdBQVAsQ0FBVyxPQUFPLE1BQVAsQ0FBYyxPQUF6QixFQUFrQztBQUMvQyx3QkFBSSxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsSUFBZjtBQUQyQyxpQkFBbEMsQ0FBakI7QUFHQSxvQkFBSSwrREFBNkQsVUFBN0QsVUFBNEUsS0FDNUUsdUNBRDRFLENBQTVFLFNBQUo7QUFHQSx1QkFBTyxLQUFLLCtCQUFMLEVBQXNDLEVBQUUsTUFBTSxXQUFSLEVBQXRDLENBQVA7QUFDSCxhQVhNLE1BV0EsSUFBSSxLQUFLLGVBQVQsRUFBMEI7QUFDN0IsdUJBQU8sS0FBSyxrQ0FBTCxDQUFQO0FBQ0gsYUFGTSxNQUVBLElBQUksS0FBSyxTQUFULEVBQW9CO0FBQ3ZCLHVCQUFPLEtBQUssNEJBQUwsQ0FBUDtBQUNIO0FBQ0QsbUJBQU8sRUFBUDtBQUNIOzs7NEJBRWE7QUFDVixnQkFBSSxVQUFVLEVBQWQ7QUFDQSxnQkFBSSxDQUFDLEtBQUssdUJBQU4sSUFBaUMsQ0FBQyxLQUFLLFlBQTNDLEVBQXlEO0FBQ3JELHdCQUFRLElBQVIsQ0FBYTtBQUNULDJCQUFPLEtBQUssMkJBQUwsQ0FERTtBQUVULDJCQUFPLEtBQUs7QUFGSCxpQkFBYjtBQUlIOztBQUVELGdCQUFJLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxrQkFBZixDQUFKLEVBQXdDO0FBQ3BDLHdCQUFRLElBQVIsQ0FBYTtBQUNULDJCQUFPLEtBQUssOEJBQUwsQ0FERTtBQUVULDJCQUFPLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxrQkFBZjtBQUZFLGlCQUFiO0FBSUg7O0FBRUQsZ0JBQUksY0FBYyxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsYUFBZixLQUFpQyxDQUFuRDtBQUNBLGdCQUFJLGFBQWEsS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLFlBQWYsS0FBZ0MsQ0FBakQ7O0FBRUEsb0JBQVEsSUFBUixDQUFhO0FBQ1QsdUJBQU8sS0FBSyxnQ0FBTCxDQURFO0FBRVQsdUJBQU87QUFGRSxhQUFiOztBQUtBLGdCQUFJLGNBQWMsQ0FBbEIsRUFBcUI7QUFDakIsb0JBQUksYUFDQSxlQUFlLFVBQWYsR0FBNEIsYUFBYSxXQUF6QyxHQUF1RCxDQUQzRDtBQUVBLG9CQUFJLG9CQUNBLGFBQWEsQ0FBYixJQUFrQixhQUFhLENBQS9CLEdBQ00sS0FETixHQUVNLEtBQUssS0FBTCxDQUFXLFVBQVgsQ0FIVjtBQUlBLHdCQUFRLElBQVIsQ0FBYTtBQUNULDJCQUFPLEtBQUsscUNBQUwsQ0FERTtBQUVULDJCQUFPO0FBRkUsaUJBQWI7QUFJQSx3QkFBUSxJQUFSLENBQWE7QUFDVCwyQkFBTyxLQUFLLHVDQUFMLENBREU7QUFFVCwyQkFBTztBQUZFLGlCQUFiO0FBSUgsYUFmRCxNQWVPO0FBQ0gsd0JBQVEsSUFBUixDQUFhO0FBQ1QsMkJBQU8sS0FBSyxnQ0FBTCxDQURFO0FBRVQsMkJBQU87QUFGRSxpQkFBYjtBQUlIO0FBQ0QsbUJBQU8sT0FBUDtBQUNIOzs7NEJBRWtCO0FBQ2YsZ0JBQUksT0FBTyxFQUFYO0FBQ0EsZ0JBQUksQ0FBQyxLQUFLLFlBQVYsRUFBd0I7QUFDcEIsd0RBQW9DLE9BQU8sSUFBUCxDQUNoQywyQkFEZ0MsQ0FBcEMsVUFFTSxLQUFLLFlBRlg7QUFHSDtBQUNELG1CQUFPLElBQVA7QUFDSDs7OzRCQUVrQjtBQUNmLGdCQUFJLGVBQWUsRUFBbkI7O0FBRUEsZ0JBQUksQ0FBQyxLQUFLLFlBQVYsRUFBd0I7QUFDcEIsb0JBQUksS0FBSyx1QkFBVCxFQUFrQztBQUM5QixtQ0FBZSxLQUFLLCtCQUFMLENBQWY7QUFDSCxpQkFGRCxNQUVPO0FBQ0gsd0JBQUksb0JBQW9CLE9BQ3BCLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxtQkFBZixDQURvQixDQUF4QjtBQUdBLHdCQUFJLHFCQUFxQixDQUF6QixFQUE0QjtBQUN4Qix1Q0FBZSxLQUFLLGdDQUFMLENBQWY7QUFDSCxxQkFGRCxNQUVPLElBQ0gsb0JBQ0EsSUFBSSxLQUFLLHNCQUZOLEVBR0w7QUFDRSx1Q0FBZSxLQUFLLDhCQUFMLEVBQXFDO0FBQ2hELG1DQUFPLEtBQUssSUFBTCxDQUFVLG9CQUFvQixDQUE5QjtBQUR5Qyx5QkFBckMsQ0FBZjtBQUdILHFCQVBNLE1BT0E7QUFDSDtBQUNBLHVDQUFlLEtBQUssaUNBQUwsRUFBd0M7QUFDbkQsb0NBQVEsS0FBSyxHQUFMLENBQ0osS0FBSyxJQUFMLENBQVUsb0JBQW9CLEVBQTlCLENBREksRUFFSixLQUFLLHVCQUZEO0FBRDJDLHlCQUF4QyxDQUFmO0FBTUg7QUFDSjtBQUNKOztBQUVELG1CQUFPLFlBQVA7QUFDSDs7OzRCQUU2QjtBQUMxQixtQkFDSSxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsbUJBQWYsTUFBd0MsU0FBeEMsSUFDQSxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsbUJBQWYsTUFBd0MsSUFEeEMsSUFFQSxLQUFLLGlCQUZMLElBR0EsS0FBSyxTQUhMLElBSUEsS0FBSyxjQUxUO0FBT0g7Ozs0QkFFa0I7QUFDZixtQkFDSSxLQUFLLGVBQUwsSUFDQSxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsWUFBZixNQUFpQyxRQURqQyxLQUVDLE9BQU8sY0FBUCxDQUFzQixTQUF0QixDQUFnQyxtQkFBaEMsSUFDSyxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsWUFBZixDQURMLEdBRUssS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLFlBQWYsTUFBaUMsVUFKdkMsQ0FESjtBQU9IOzs7NEJBRW9CO0FBQ2pCLG1CQUFPLE9BQU8sY0FBUCxDQUFzQixTQUF0QixDQUFnQyx5QkFBaEMsSUFDRCxLQUFLLEtBQUwsQ0FBVyxTQURWLEdBRUQsS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLFNBQWYsS0FDSSxDQUFDLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxhQUFmLENBREwsSUFFSSxDQUFDLEtBQUssS0FBTCxDQUFXLG9CQUp0QjtBQUtIOzs7NEJBRXFCO0FBQ2xCLG1CQUFPLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxZQUFmLENBQVA7QUFDSDs7OzRCQUV1QjtBQUNwQixtQkFBTyxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsbUJBQWYsQ0FBUDtBQUNIOzs7NEJBRVU7QUFDUCxtQkFBTyxFQUFQO0FBQ0g7Ozs0QkFFc0I7QUFDbkIsbUJBQU8sbUNBQWlCLEtBQUssS0FBdEIsQ0FBUDtBQUNIOzs7O0VBck0wQyxTQUFTLEk7O3FCQUFuQyxpQjs7Ozs7Ozs7OztBQ0pyQjs7QUFFQSxJQUFNLG1CQUFtQixTQUFuQixnQkFBbUI7QUFBQSxRQUFHLEdBQUgsUUFBRyxHQUFIO0FBQUEsZ0RBQ08sR0FEUDtBQUFBLENBQXpCOztBQUlPLElBQU0sc0RBQXVCLFNBQXZCLG9CQUF1QjtBQUFBLFFBQ2hDLGVBRGdDLFNBQ2hDLGVBRGdDO0FBQUEsUUFFaEMsYUFGZ0MsU0FFaEMsYUFGZ0M7QUFBQSxRQUdoQyxVQUhnQyxTQUdoQyxVQUhnQztBQUFBLFFBSWhDLGVBSmdDLFNBSWhDLGVBSmdDO0FBQUEsUUFLaEMsWUFMZ0MsU0FLaEMsWUFMZ0M7QUFBQSxxTkFXdEIsT0FBTyxJQUFQLENBQVksdUJBQVosQ0FYc0Isb0ZBZXRCLE9BQU8sSUFBUCxDQUFZLDBCQUFaLENBZnNCLHlJQXFCaEIsZ0JBQWdCLGVBQWhCLEdBQWtDLE9BQU8sTUFBUCxDQUFjLE1BQWQsQ0FBcUIsS0FyQnZDLGlKQTJCaEIsZ0JBQ00sT0FBTyxJQUFQLENBQVksMkJBQVosQ0FETixHQUVNLE9BQU8sSUFBUCxDQUFZLDBCQUFaLENBN0JVLDRHQXFDeEIsaUZBR0UsYUFBYSxHQUFiLENBQWlCLFVBQUMsR0FBRDtBQUFBLGVBQVMsaUJBQWlCLEVBQUUsUUFBRixFQUFqQixDQUFUO0FBQUEsS0FBakIsRUFBcUQsSUFBckQsQ0FBMEQsRUFBMUQsQ0FIRix1RkFNRSxnQkFBZ0IsR0FBaEIsQ0FBb0IsVUFBQyxHQUFEO0FBQUEsZUFBUyxpQkFBaUIsRUFBRSxRQUFGLEVBQWpCLENBQVQ7QUFBQSxLQUFwQixFQUF3RCxJQUF4RCxDQUE2RCxFQUE3RCxDQU5GLGtDQVNNLEVBOUNrQix1RkFtRGhCLEtBQUssZUFBTCxDQW5EZ0IsNkJBb0RqQiw4QkFBWSxrQ0FBWixDQXBEaUI7QUFBQSxDQUE3Qjs7Ozs7Ozs7Ozs7O0FDTlA7O0FBQ0E7Ozs7Ozs7O2NBRW1CLE07SUFBWCxNLFdBQUEsTTs7SUFFSyxnQixXQUFBLGdCOzs7QUFLVCxvQ0FBK0Q7QUFBQSxZQUFqRCxZQUFpRCxRQUFqRCxZQUFpRDtBQUFBLFlBQW5DLGNBQW1DLFFBQW5DLGNBQW1DO0FBQUEsWUFBbkIsZUFBbUIsUUFBbkIsZUFBbUI7O0FBQUE7O0FBQUEseUlBQ2xELFNBRGtEOztBQUczRCxjQUFLLFlBQUwsR0FBb0IsWUFBcEI7QUFDQSxjQUFLLGNBQUwsR0FBc0IsY0FBdEI7QUFDQSxjQUFLLGVBQUwsR0FBdUIsZUFBdkI7O0FBRUEsY0FBSyxNQUFMO0FBUDJEO0FBUTlEOzs7O2lDQUVRO0FBQ0wsZ0JBQU0sZUFBZSxFQUFyQjtBQUNBLGdCQUFNLGtCQUFrQixFQUF4Qjs7QUFFQSxpQkFBSyxJQUFJLFFBQVEsQ0FBakIsRUFBb0IsU0FBUyxFQUE3QixFQUFpQyxPQUFqQyxFQUEwQztBQUN0QyxvQkFBTSxXQUFXLGlFQUNvQixLQURwQixXQUFqQjtBQUdBLG9CQUFJLFNBQVMsQ0FBYixFQUFnQjtBQUNaLGlDQUFhLElBQWIsQ0FBa0IsUUFBbEI7QUFDSCxpQkFGRCxNQUVPO0FBQ0gsb0NBQWdCLElBQWhCLENBQXFCLFFBQXJCO0FBQ0g7QUFDSjs7QUFiSSxnQkFlRyxNQWZILEdBZXNCLE1BZnRCLENBZUcsTUFmSDtBQUFBLGdCQWVXLE1BZlgsR0Flc0IsTUFmdEIsQ0FlVyxNQWZYOztBQWdCTCxnQkFBTSxnQkFDRixDQUFDLE1BQUQsSUFBVyxDQUFDLE1BQVosSUFBc0IsQ0FBQyxLQUFLLEtBQTVCLElBQXFDLENBQUMsS0FBSyxjQUQvQztBQUVBLGdCQUFNLGtCQUFrQixnQkFDbEIsS0FBSyxlQURhLEdBRWxCLHdCQUZOOztBQUlBLGdCQUFNLE9BQU8sNENBQXFCO0FBQzlCLGdEQUQ4QjtBQUU5Qiw0Q0FGOEI7QUFHOUIsNEJBQ0ksQ0FBQyxLQUFLLGNBQU4sSUFDQSxDQUFDLEtBQUssWUFETixJQUVBLENBQUMsT0FBTyxjQUFQLENBQXNCLFNBQXRCLENBQWdDLG9CQUFoQyxDQU55QjtBQU85QixnREFQOEI7QUFROUI7QUFSOEIsYUFBckIsQ0FBYjtBQVVBLGlCQUFLLEdBQUwsQ0FBUyxLQUFULEdBQWlCLE1BQWpCLENBQXdCLElBQXhCO0FBQ0g7Ozs7RUFoRGlDLFNBQVMsSTs7Ozs7Ozs7Ozs7QUNML0M7Ozs7QUFDQTs7Ozs7Ozs7Y0FFd0IsTTtJQUFoQixHLFdBQUEsRztJQUFLLE0sV0FBQSxNOztJQUVRLGdCO0FBQ2pCLG9DQUFtRTtBQUFBLFlBQXRELEdBQXNELFFBQXRELEdBQXNEO0FBQUEsWUFBakQsaUJBQWlELFFBQWpELGlCQUFpRDtBQUFBLFlBQTlCLE1BQThCLFFBQTlCLE1BQThCO0FBQUEsWUFBdEIsbUJBQXNCLFFBQXRCLG1CQUFzQjs7QUFBQTs7QUFDL0QsYUFBSyxHQUFMLEdBQVcsR0FBWDtBQUNBLGFBQUssTUFBTCxHQUFjLE1BQWQ7QUFDQSxhQUFLLGlCQUFMLEdBQXlCLGlCQUF6QjtBQUNBLGFBQUssbUJBQUwsR0FBMkIsbUJBQTNCO0FBQ0g7Ozs7OEJBRUs7QUFBQTs7QUFDRixpQkFBSyxlQUFMLEdBQXVCLElBQUksa0NBQUosQ0FBMEIsS0FBSyxtQkFBL0IsQ0FBdkI7O0FBRUEsaUJBQUssZUFBTCxDQUFxQixHQUFyQixDQUF5QixJQUF6QixDQUE4QixpQkFBOUIsRUFBaUQsRUFBakQsQ0FBb0QsT0FBcEQsRUFBNkQsWUFBTTtBQUMvRCxvQkFBTSxtQkFBbUIsTUFBSyxNQUFMLEtBQWdCLHFCQUFoQixHQUF3QyxLQUFLLHlDQUFMLENBQXhDLEdBQTBGLEtBQUssSUFBTCxDQUFuSDtBQUNBLG9CQUFJLGFBQWEsTUFBSyxpQkFBTCxDQUF1QixJQUF2QixFQUE2QixJQUE3QixDQUFrQyxZQUFNO0FBQ3JELDBCQUFLLGVBQUwsQ0FBcUIsS0FBckI7QUFDQSwwQkFBSyxXQUFMLEdBQW1CLElBQUksd0NBQUosQ0FBZ0MsRUFBQyxnQkFBZ0IsSUFBakIsRUFBdUIsZUFBZSxJQUF0QyxFQUE0QyxZQUFZLGdCQUF4RCxFQUEwRSxtQkFBbUIsTUFBSyxtQkFBbEcsRUFBaEMsQ0FBbkI7QUFDSCxpQkFIZ0IsV0FHUixZQUFNO0FBQ1gsMEJBQUssZUFBTCxDQUFxQixLQUFyQjtBQUNBLDBCQUFLLFdBQUwsR0FBbUIsSUFBSSx3Q0FBSixDQUFnQyxFQUFDLGdCQUFnQixJQUFqQixFQUF1QixlQUFlLEtBQXRDLEVBQTZDLFlBQVksZ0JBQXpELEVBQTJFLG1CQUFtQixNQUFLLG1CQUFuRyxFQUFoQyxDQUFuQjtBQUNILGlCQU5nQixDQUFqQjtBQU9ILGFBVEQ7O0FBV0EsaUJBQUssZUFBTCxDQUFxQixHQUFyQixDQUF5QixJQUF6QixDQUE4QixjQUE5QixFQUE4QyxFQUE5QyxDQUFpRCxPQUFqRCxFQUEwRCxZQUFNO0FBQzVELHNCQUFLLGlCQUFMLENBQXVCLEtBQXZCLEVBQThCLElBQTlCLENBQW1DLFlBQU07QUFDckMsMEJBQUssZUFBTCxDQUFxQixLQUFyQjtBQUNILGlCQUZELFdBRVMsWUFBTTtBQUNYLDBCQUFLLGVBQUwsQ0FBcUIsS0FBckI7QUFDSCxpQkFKRDtBQUtILGFBTkQ7QUFPSDs7OzBDQUVpQixHLEVBQUs7QUFDbkIsbUJBQU8sS0FBSyxpQkFBTCxDQUF1Qiw4QkFBdkIsQ0FBc0QsR0FBdEQsRUFBMkQsS0FBSyxNQUFoRSxDQUFQO0FBQ0g7Ozs7OztxQkFqQ2dCLGdCOzs7Ozs7OztjQ0xKLE07SUFBVCxJLFdBQUEsSTs7cUJBRU8sVUFBQyxpQkFBRDtBQUFBLG1FQUdMLEtBQUssc0NBQUwsQ0FISyxrQkFJTCxLQUFLLCtDQUFMLEVBQXNEO0FBQ3BELHNCQUFjLEtBQUssVUFBTDtBQURzQyxLQUF0RCxDQUpLLG1FQVdQLGlDQUNpQixpQkFEakIsbUlBQzBKLEtBQ2hKLFVBRGdKLENBRDFKLDhIQUlrSCxLQUN4RyxVQUR3RyxDQUpsSCxjQVhPLDBIQW9CNEYsS0FDbkcsd0NBRG1HLENBcEI1RiwwQkF5QlAsaUNBQ2lCLGlCQURqQixrSUFDeUosS0FDL0ksVUFEK0ksQ0FEekosNkhBSWlILEtBQ3ZHLFVBRHVHLENBSmpILGNBekJPO0FBQUEsQzs7Ozs7Ozs7Y0NGZSxNO0lBQXRCLEksV0FBQSxJO0lBQU0sRyxXQUFBLEc7SUFBSyxNLFdBQUEsTTs7cUJBRUo7QUFBQSxRQUFHLGFBQUgsUUFBRyxhQUFIO0FBQUEsUUFBa0IsVUFBbEIsUUFBa0IsVUFBbEI7QUFBQSxRQUE4QixpQkFBOUIsUUFBOEIsaUJBQTlCO0FBQUEsdURBR1Asa0NBRUssS0FBSyxrREFBTCxDQUZMLG9DQUtLLEtBQUssOENBQUwsRUFBcUQ7QUFDdEQsNENBQWlDLElBQzdCLE9BQU8sZUFEc0IsQ0FBakMsV0FFTSxLQUFLLGlDQUFMLENBRk47QUFEc0QsS0FBckQsQ0FMTCxlQUhPLDBEQWtCUCxpQ0FDaUIsaUJBRGpCLGtKQUVVLFVBRlYsMEpBS1UsVUFMViwyQkFsQk87QUFBQSxDOzs7Ozs7Ozs7QUNGZjs7QUFDQTs7Ozs7Ozs7Ozs7O0lBRXFCLHFCOzs7QUFDakIsbUNBQVksaUJBQVosRUFBK0I7QUFBQTs7QUFDM0IsWUFBTSxnQkFBZ0I7QUFDbEIscUJBQVMsQ0FBQyx1QkFBRCxDQURTO0FBRWxCLG1CQUFPLE9BQU8sSUFBUCxDQUFZLHdDQUFaLENBRlc7QUFHbEIscUJBQVMsd0NBQThCLGlCQUE5QixDQUhTO0FBSWxCLHdCQUFZLEtBSk07QUFLbEIseUJBQWE7QUFMSyxTQUF0Qjs7QUFEMkIsa0pBUXJCLGFBUnFCOztBQVUzQixZQUFJLDRIQUFxSCxLQUFLLDBCQUFMLENBQXJILGdCQUFKO0FBQ0EsY0FBSyxNQUFMLENBQVksTUFBWixDQUFtQixVQUFuQjs7QUFFQSxjQUFLLEdBQUwsQ0FBUyxJQUFULENBQWMscUJBQWQsRUFBcUMsTUFBckM7QUFiMkI7QUFjOUI7OztFQWY4QyxZOztxQkFBOUIscUI7Ozs7Ozs7OztBQ0hyQjs7QUFDQTs7Ozs7Ozs7Ozs7O0lBRXFCLDRCOzs7QUFDakIsZ0RBQThEO0FBQUEsWUFBaEQsYUFBZ0QsUUFBaEQsYUFBZ0Q7QUFBQSxZQUFqQyxVQUFpQyxRQUFqQyxVQUFpQztBQUFBLFlBQXJCLGlCQUFxQixRQUFyQixpQkFBcUI7O0FBQUE7O0FBQzFELFlBQU0sZ0JBQWdCO0FBQ2xCLHFCQUFTLENBQUMsNkJBQUQsQ0FEUztBQUVsQixtQkFBTyxnQkFBZ0IsT0FBTyxJQUFQLENBQVksZ0JBQVosQ0FBaEIsR0FBZ0QsT0FBTyxJQUFQLENBQVksY0FBWixDQUZyQztBQUdsQixxQkFBUyw4Q0FBb0MsRUFBQyw0QkFBRCxFQUFnQixzQkFBaEIsRUFBNEIsb0NBQTVCLEVBQXBDO0FBSFMsU0FBdEI7O0FBRDBELGdLQU1wRCxhQU5vRDs7QUFRMUQsWUFBSSw0SEFBcUgsS0FBSywwQkFBTCxDQUFySCxnQkFBSjtBQUNBLGNBQUssTUFBTCxDQUFZLE1BQVosQ0FBbUIsVUFBbkI7O0FBRUEsY0FBSyxHQUFMLENBQVMsSUFBVCxDQUFjLGtCQUFkLEVBQWtDLEVBQWxDLENBQXFDLE9BQXJDLEVBQThDLFlBQU07QUFDaEQsa0JBQUssT0FBTCxDQUFhLE9BQWI7QUFDSCxTQUZEO0FBWDBEO0FBYzdEOzs7RUFmcUQsWTs7cUJBQXJDLDRCOzs7Ozs7Ozs7QUNIckI7Ozs7QUFDQTs7Ozs7O0FBRUEsSUFBTSxrQkFBa0IsU0FBbEIsZUFBa0IsT0FBOEM7QUFBQSxRQUE1QyxFQUE0QyxRQUE1QyxFQUE0QztBQUFBLFFBQXhDLFFBQXdDLFFBQXhDLFFBQXdDO0FBQUEsUUFBOUIsUUFBOEIsUUFBOUIsUUFBOEI7QUFBQSxRQUFwQixjQUFvQixRQUFwQixjQUFvQjs7QUFDbEUsUUFBTSxtQkFBbUIsSUFBSSx3QkFBSixFQUF6QjtBQUNBLHFCQUFpQixxQkFBakIsQ0FBdUMsU0FBdkM7QUFDQSxRQUFNLGdCQUFnQixJQUFJLCtCQUFKLENBQTBCLEVBQUMsTUFBRCxFQUFLLGtDQUFMLEVBQTFCLENBQXRCLENBSGtFLENBR087QUFDekUsUUFBTSxhQUFhLElBQUksK0JBQUosQ0FBMEIsRUFBQyxJQUFJLFFBQUwsRUFBZSxrQ0FBZixFQUExQixDQUFuQixDQUprRSxDQUljO0FBQ2hGLFFBQU0sYUFBYSxJQUFJLCtCQUFKLENBQTBCLEVBQUMsSUFBSSxRQUFMLEVBQWUsa0NBQWYsRUFBMUIsQ0FBbkIsQ0FMa0UsQ0FLYztBQUNoRixRQUFNLG1CQUFtQixJQUFJLCtCQUFKLENBQTBCLEVBQUMsSUFBSSxjQUFMLEVBQXFCLGtDQUFyQixFQUExQixDQUF6QixDQU5rRSxDQU0wQjtBQUMvRixDQVBEOztxQkFTZSxlOzs7Ozs7Ozs7QUNaZixJQUFBLGtCQUFBLEdBQUEsT0FBQSxDQUFBLDJEQUFBLENBQUEsQ0FBQTs7OztBQUNBLElBQUEsS0FBQSxHQUFBLE9BQUEsQ0FBQSxxQkFBQSxDQUFBLENBQUE7Ozs7QUFDQSxJQUFBLFNBQUEsR0FBQSxPQUFBLENBQUEsd0JBQUEsQ0FBQSxDQUFBOzs7Ozs7QUFDQSxJQUFNLE9BQUEsR0FBVSxPQUFBLENBQVEsK0JBQVIsQ0FBaEIsQ0FBQTs7QUFFQSxJQUFNLHFCQUFBLEdBQXdCLE1BQUEsQ0FBQSxTQUFBLENBQUEsQ0FBUyxNQUFULENBQWdCO0lBQzFDLE1BQUEsRUFBUTtRQUNKLHdCQUFBLEVBQTBCLHFCQUR0QjtRQUVKLDJCQUFBLEVBQTZCLHFCQUFBO0tBSFM7SUFLMUMsVUFMMEMsRUFBQSxTQUFBLFVBQUEsQ0FBQSxJQUFBLEVBS1g7UUFBQSxJQUFuQixnQkFBbUIsR0FBQSxJQUFBLENBQW5CLGdCQUFtQixDQUFBOztRQUMzQixJQUFBLENBQUssS0FBTCxHQUFhLGdCQUFiLENBQUE7UUFDQSxJQUFBLENBQUssUUFBTCxDQUFjLElBQUEsQ0FBSyxLQUFuQixFQUEwQixRQUExQixFQUFvQyxJQUFBLENBQUssU0FBekMsQ0FBQSxDQUFBO1FBQ0EsSUFBTSxnQkFBQSxHQUFtQixJQUFBLENBQUssR0FBTCxDQUFTLElBQVQsQ0FBYywyQkFBZCxDQUF6QixDQUFBO1FBQ0EsSUFBTSxnQkFBQSxHQUFtQixnQkFBQSxDQUFpQixJQUFqQixFQUF6QixDQUFBO1FBQ0EsSUFBTSxZQUFBLEdBQWUsSUFBQSxDQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsbUJBQWYsQ0FBckIsQ0FBQTtRQUNBLElBQUksZ0JBQUosRUFBc0I7WUFDbEIsSUFBQSxDQUFLLEdBQUwsQ0FBUyxJQUFULENBQWMscUJBQWQsQ0FBQSxDQUFxQyxJQUFyQyxDQUEwQyxnQkFBMUMsQ0FBQSxDQUFBO1NBQ0g7OztRQUdELElBQUksT0FBQSxDQUFRLEdBQVIsQ0FBWSxvQkFBWixDQUFBLElBQXFDLFlBQUEsS0FBaUIsT0FBQSxDQUFRLEdBQVIsQ0FBWSxvQkFBWixDQUExRCxFQUE2RjtZQUN6RixJQUFBLENBQUssd0JBQUwsQ0FBOEIsT0FBQSxDQUFRLEdBQVIsQ0FBWSxvQkFBWixDQUE5QixFQUFpRSxLQUFqRSxDQUFBLENBQUE7U0FDSDtLQWxCcUM7SUFvQjFDLG1CQXBCMEMsRUFBQSxTQUFBLG1CQUFBLENBb0J0QixDQXBCc0IsRUFvQm5CO1FBQ25CLElBQUEsQ0FBSyx3QkFBTCxDQUE4QixDQUFBLENBQUUsQ0FBQSxDQUFFLGFBQUosQ0FBQSxDQUFtQixJQUFuQixDQUF3QixNQUF4QixDQUE5QixFQUErRCxJQUEvRCxDQUFBLENBQUE7S0FyQnNDO0lBdUIxQyxtQkF2QjBDLEVBQUEsU0FBQSxtQkFBQSxDQXVCdEIsQ0F2QnNCLEVBdUJuQjtRQUNuQixJQUFJLENBQUEsQ0FBRSxPQUFGLEtBQWMsVUFBQSxDQUFBLFNBQUEsQ0FBQSxDQUFTLEtBQTNCLEVBQWtDO1lBQzlCLElBQUEsQ0FBSyx3QkFBTCxDQUE4QixDQUFBLENBQUUsQ0FBQSxDQUFFLGFBQUosQ0FBQSxDQUFtQixJQUFuQixDQUF3QixNQUF4QixDQUE5QixFQUErRCxJQUEvRCxDQUFBLENBQUE7U0FDSDtLQTFCcUM7SUE0QjFDLHdCQTVCMEMsRUFBQSxTQUFBLHdCQUFBLENBNEJqQixJQTVCaUIsRUE0QlgsT0E1QlcsRUE0QkY7UUFBQSxJQUFBLEtBQUEsR0FBQSxJQUFBLENBQUE7O1FBQ3BDLElBQU0sWUFBQSxHQUFlO1lBQ2pCLGlCQUFBLEVBQW1CLElBQUE7U0FEdkIsQ0FBQTs7O1FBS0EsSUFBSSxtQkFBQSxDQUFBLFNBQUEsQ0FBQSxDQUFrQixJQUFsQixDQUFKLEVBQTZCO1lBQ3pCLElBQUksT0FBQSxDQUFRLEdBQVIsQ0FBWSxrQkFBWixDQUFKLEVBQXFDOzs7O2dCQUlqQyxJQUFBLENBQUssS0FBTCxDQUFXLFVBQVgsQ0FBc0IsUUFBdEIsR0FBaUMsSUFBakMsQ0FBQTthQUNIOztZQUVELE9BQUEsQ0FBUSxNQUFSLENBQWUsa0JBQWYsRUFBbUMsRUFBQyxJQUFBLEVBQU0sR0FBUCxFQUFuQyxDQUFBLENBQUE7WUFDQSxZQUFBLENBQWEsUUFBYixHQUF3QixLQUF4QixDQUFBO1NBQ0g7O1FBRUQsSUFBQSxDQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsWUFBZixDQUFBLENBQUE7O1FBRUEsSUFBSSxNQUFBLENBQU8sU0FBUCxDQUFpQixlQUFyQixFQUFzQztZQUNsQyxJQUFBLENBQUssS0FBTCxDQUFXLElBQVgsQ0FBZ0IsSUFBQSxDQUFLLEtBQUwsQ0FBVyxZQUFYLEVBQWhCLEVBQTJDO2dCQUN2QyxLQUFBLEVBQU8sSUFEZ0MsRUFDMUIsT0FBQSxFQUFTLFNBQUEsT0FBQSxHQUFNO29CQUN4QixLQUFBLENBQUssbUJBQUwsQ0FBeUIsSUFBekIsRUFBK0IsT0FBL0IsQ0FBQSxDQUFBO2lCQUNIO2FBSEwsQ0FBQSxDQUFBO1NBREosTUFNTztZQUNILElBQUEsQ0FBSyxtQkFBTCxDQUF5QixJQUF6QixFQUErQixPQUEvQixDQUFBLENBQUE7U0FDSDtLQXhEcUM7SUEwRDFDLG1CQTFEMEMsRUFBQSxTQUFBLG1CQUFBLENBMER0QixzQkExRHNCLEVBMERFLE9BMURGLEVBMERXOztRQUVqRCxPQUFBLENBQVEsTUFBUixDQUFlLG9CQUFmLEVBQXFDLEVBQUMsSUFBQSxFQUFNLEdBQVAsRUFBckMsQ0FBQSxDQUFBOztRQUVBLElBQUksTUFBQSxHQUFTLE1BQUEsQ0FBTyxRQUFQLENBQWdCLFFBQWhCLElBQTRCLGVBQXpDLENBQUE7UUFDQSxNQUFBLEdBQVMsR0FBQSxHQUFNLE1BQUEsQ0FBTyxLQUFQLENBQWEsR0FBYixDQUFBLENBQWtCLE1BQWxCLENBQXlCLENBQUMsQ0FBMUIsQ0FBQSxDQUE2QixJQUE3QixDQUFrQyxHQUFsQyxDQUFmLENBTGlEOztRQU9qRCxPQUFBLENBQVEsR0FBUixDQUFZLG9CQUFaLEVBQWtDLHNCQUFsQyxFQUNJO1lBQ0ksUUFBQSxFQUFVLEtBRGQ7WUFFSSxPQUFBLEVBQVMsSUFBSSxJQUFKLENBQVMsSUFBQSxDQUFLLEdBQUwsRUFBQSxHQUFhLE9BQUEsQ0FBUSxrQkFBOUIsQ0FGYjtZQUdJLE1BQUEsRUFBUSxNQUhaO1lBSUksU0FBQSxFQUFXLElBSmY7WUFLSSxJQUFBLEVBQU0sR0FBQTtTQU5kLENBQUEsQ0FBQTs7O1FBV0EsSUFBSSxNQUFBLENBQU8sU0FBUCxDQUFpQixRQUFqQixLQUE4QixPQUE5QixJQUF5QyxPQUE3QyxFQUFzRDtZQUNsRCxNQUFBLENBQU8sUUFBUCxDQUFnQixNQUFoQixFQUFBLENBQUE7U0FDSDtLQUNKO0NBL0V5QixDQUE5QixDQUFBOztxQkFrRmU7Ozs7Ozs7Ozs7OztBQ3ZGZjs7Ozs7Ozs7Ozs7O0lBRXFCLHVCOzs7Ozs7Ozs7Ozs0QkFDTDtBQUNSLG1CQUFPLDBCQUFQO0FBQ0g7Ozs7RUFIZ0QsU0FBUyxVOztxQkFBekMsdUI7Ozs7Ozs7OztxQkNGTjtBQUFBLFFBQ1gsS0FEVyxRQUNYLEtBRFc7QUFBQSxRQUVYLEtBRlcsUUFFWCxLQUZXO0FBQUEsUUFHWCxjQUhXLFFBR1gsY0FIVztBQUFBLFFBSVgsU0FKVyxRQUlYLFNBSlc7QUFBQSxRQUtYLG9CQUxXLFFBS1gsb0JBTFc7QUFBQSxRQU1YLFlBTlcsUUFNWCxZQU5XO0FBQUEsUUFPWCxvQkFQVyxRQU9YLG9CQVBXO0FBQUEsUUFRWCxrQkFSVyxRQVFYLGtCQVJXO0FBQUEsUUFTWCxxQkFUVyxRQVNYLHFCQVRXO0FBQUEsUUFVWCxlQVZXLFFBVVgsZUFWVztBQUFBLCtIQWVELE1BQU0sR0FBTixDQUFVLElBQVYsRUFmQywrSkFtQnVDLE1BQU0sR0FBTixDQUFVLE9BQVYsQ0FuQnZDLGlDQXFCSyxNQUFNLEdBQU4sQ0FBVSxRQUFWLEtBQXVCLENBQUMsTUFBTSxVQUE5Qix3Q0FDdUMsTUFBTSxHQUFOLENBQzdCLFFBRDZCLENBRHZDLGNBSU0sRUF6QlgsNEJBNEJLLE1BQU0sVUFBTixJQUFvQixNQUFNLEdBQU4sQ0FBVSxTQUFWLENBQXBCLHdDQUN1QyxNQUFNLEdBQU4sQ0FDN0IsU0FENkIsQ0FEdkMsY0FJTSxFQWhDWCw2RkFtQ0ssTUFBTSxHQUFOLENBQVUsTUFBVixFQUFrQixFQW5DdkIsY0FvQ1UsT0FBTyxJQUFQLENBQVksTUFBTSxHQUFOLENBQVUsTUFBVixFQUFrQixFQUE5QixDQXBDVixzR0F1Q1MsZUFBZSxNQUFmLEdBQXdCLENBQXhCLEdBQ00sT0FBTyxJQUFQLENBQ0ksWUFDTSwwQkFETixHQUVNLG1CQUhWLEVBSUk7QUFDSSw0S0FFUixlQUFlLEdBQWYsQ0FDRSxVQUFDLGFBQUQ7QUFBQSx3Q0FDc0IsY0FBYyxHQURwQyxZQUVRLGNBQWMsR0FBZCxDQUNJLDBCQURKLElBR00sVUFITixHQUlNLEVBTmQsZ0RBUU0sT0FBTyxJQUFQLENBQVksMEJBQVosRUFBd0M7QUFDdEMsc0JBQU0sY0FBYyxNQUFkLENBQXFCO0FBRFcsYUFBeEMsQ0FSTjtBQUFBLFNBREYsQ0FGUTtBQURKLEtBSkosQ0FETixHQXlCTSx1QkFDQSxxQkFDSSxPQUFPLElBQVAsQ0FBWSwrQkFBWixFQUE2QztBQUN6QyxjQUFNO0FBRG1DLEtBQTdDLENBREosR0FJSSxNQUFNLEdBQU4sQ0FBVSxVQUFWLElBQ0EsT0FBTyxJQUFQLENBQVksMkJBQVosRUFBeUM7QUFDckMsY0FBTTtBQUQrQixLQUF6QyxDQURBLEdBSUEsT0FBTyxJQUFQLENBQVkscUJBQVosRUFBbUM7QUFDL0IsY0FBTTtBQUR5QixLQUFuQyxDQVRKLEdBWUEsZUFBZSxLQUFmLEdBQXVCLEtBNUV0QyxxSUFtRkwsZ0JBQ0csR0FESCxDQUVNLFVBQUMsY0FBRDtBQUFBLDhGQUVvQixlQUFlLFdBRm5DLGlCQUV3RCxlQUFlLGNBRnZFLG1GQUdrRCxlQUFlLFVBSGpFLHVIQUt3RCxlQUFlLFVBTHZFO0FBQUEsS0FGTixFQVNHLElBVEgsQ0FTUSxFQVRSLENBbkZLLDREQWdHUCxnTkFLTSxFQXJHQyxnQkF3R1AscURBQzBDLE9BQU8sSUFBUCxDQUNoQywwQkFEZ0MsQ0FEMUMsY0FJTSxFQTVHQyxnR0FnSEgsdUJBQ00sRUFETixxQkFFcUIsT0FBTyxJQUFQLENBQ1gsWUFBWSxvQkFBWixHQUFtQyxhQUR4QixFQUVYLEVBQUUsT0FBTyxNQUFNLEdBQU4sQ0FBVSxPQUFWLENBQVQsRUFGVyxDQUZyQixPQWhIRyw0RkF3SEMsWUFDTSxPQUFPLElBQVAsQ0FBWSxlQUFaLENBRE4sR0FFTSx1QkFDQSxPQUFPLElBQVAsQ0FBWSxvQkFBWixFQUFrQztBQUM5QixjQUFNO0FBRHdCLEtBQWxDLENBREEsR0FJQSxPQUFPLElBQVAsQ0FBWSxRQUFaLENBOUhQLCtDQW1JUCxzTEFHVSxPQUFPLElBQVAsQ0FBWSxXQUFaLENBSFYsK0NBTU0sRUF6SUMsNEdBNEk2QixPQUFPLElBQVAsQ0FDaEMsUUFEZ0MsQ0E1STdCLHNGQStJRCxPQUFPLElBQVAsQ0FBWSxRQUFaLENBL0lDO0FBQUEsQzs7Ozs7Ozs7Ozs7QUNBZjs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFFQTs7Ozs7Ozs7Ozs7O0lBRXFCLGtCOzs7QUFDakIsc0NBQXlEO0FBQUEsWUFBM0MsR0FBMkMsUUFBM0MsR0FBMkM7QUFBQSxZQUF0QyxNQUFzQyxRQUF0QyxNQUFzQztBQUFBLFlBQTlCLE9BQThCLFFBQTlCLE9BQThCO0FBQUEsa0NBQXJCLFNBQXFCO0FBQUEsWUFBckIsU0FBcUIsa0NBQVQsS0FBUzs7QUFBQTs7QUFBQSw2SUFDNUMsU0FENEM7O0FBR3JELGNBQUssR0FBTCxHQUFXLEdBQVg7QUFDQSxjQUFLLE1BQUwsR0FBYyxVQUFXLFlBQU0sQ0FBRSxDQUFqQztBQUNBLGNBQUssT0FBTCxHQUFlLFdBQVksWUFBTSxDQUFFLENBQW5DO0FBQ0EsY0FBSyxTQUFMLEdBQWlCLFNBQWpCOztBQUVBLGNBQUssS0FBTCxHQUFhLElBQUksa0JBQUosQ0FBVSxFQUFFLE9BQU8sTUFBSyxLQUFkLEVBQVYsQ0FBYjtBQUNBO0FBQ0EsY0FBSyx5QkFBTCxHQUFpQyxJQUFJLHNDQUFKLENBQThCO0FBQzNELHFCQUFTLE1BQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxJQUFmO0FBRGtELFNBQTlCLENBQWpDO0FBR0EsY0FBSyx5QkFBTCxDQUNLLFNBREwsR0FFSyxJQUZMLENBRVUsWUFBTTtBQUNSLGdCQUFNLGlCQUNGLE1BQUsseUJBQUwsQ0FBK0IsR0FBL0IsQ0FBbUMsZ0JBQW5DLENBREo7QUFFQSxrQkFBSyxLQUFMLENBQVcsR0FBWCxDQUNJLFlBREosRUFFSSxNQUFLLFNBQUwsR0FBaUIsT0FBakIsR0FBMkIsUUFGL0I7QUFJQSxrQkFBSyxVQUFMLENBQWdCLGNBQWhCO0FBQ0gsU0FWTCxXQVdXLFVBQUMsS0FBRCxFQUFXO0FBQ2Qsa0JBQUssT0FBTCxDQUFhLEtBQWI7QUFDSCxTQWJMO0FBYnFEO0FBMkJ4RDs7OzttQ0FFVSxjLEVBQWdCO0FBQUE7O0FBQ3ZCLGdCQUFJLHVCQUF1QixJQUFJLE9BQUosQ0FBWSxVQUFDLE9BQUQsRUFBYTtBQUNoRCxvQkFBSSxPQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsVUFBZixDQUFKLEVBQWdDO0FBQzVCLHNCQUFFLElBQUYsQ0FBTztBQUNILDZCQUFLLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLGFBQXpCLEVBQXdDO0FBQ3pDLHFDQUFTLE9BQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxJQUFmO0FBRGdDLHlCQUF4QyxDQURGO0FBSUgsOEJBQU07QUFKSCxxQkFBUCxFQU1LLElBTkwsQ0FNVSxVQUFDLFFBQUQsRUFBYztBQUNoQiwrQkFBSyxLQUFMLENBQVcsR0FBWCxDQUFlLGdCQUFmLEVBQWlDLFNBQVMsV0FBMUM7QUFDSCxxQkFSTCxFQVNLLE1BVEwsQ0FTWSxZQUFNO0FBQ1Y7QUFDSCxxQkFYTDtBQVlILGlCQWJELE1BYU87QUFDSDtBQUNIO0FBQ0osYUFqQjBCLENBQTNCOztBQW1CQSxpQ0FBcUIsSUFBckIsQ0FBMEIsWUFBTTtBQUM1QixvQkFBSSx1QkFDQSxPQUFLLEtBQUwsQ0FBVyxrQkFBWCxJQUNBLENBQUMsQ0FBQyxPQUFPLFNBQVAsQ0FBaUIsOEJBRG5CLElBRUEsQ0FBQyxDQUFDLE9BQU8sU0FBUCxDQUFpQiw4QkFBakIsQ0FDRSxPQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsTUFBZixFQUF1QixFQUR6QixDQUZGLElBS0EsQ0FBQyxPQUFLLFNBTlY7O0FBUUEsb0JBQUkscUJBQ0Esd0JBQ0EsT0FBSyxLQUFMLENBQVcsWUFEWCxJQUVBLENBQUMsT0FBSyxLQUFMLENBQVcsb0JBSGhCOztBQUtBLG9CQUFJLDhCQUFKO0FBQ0Esb0JBQUksb0JBQUosRUFBMEI7QUFDdEIsNENBQ0ksT0FBTyxTQUFQLENBQWlCLDhCQUFqQixDQUNJLE9BQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxNQUFmLEVBQXVCLEVBRDNCLENBREo7QUFJSDs7QUFFRCxvQkFBSSx1QkFDQSxPQUFLLEtBQUwsQ0FBVyxrQkFBWCxJQUNBLE9BQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxVQUFmLENBREEsSUFFQSxDQUFDLE9BQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxnQkFBZixDQUZELElBR0Esb0JBSko7O0FBTUEsb0JBQUksYUFDQSxPQUFLLEtBQUwsQ0FBVyxrQkFBWCxJQUNBLENBQUMsb0JBREQsSUFFQSxPQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsVUFBZixDQUhKOztBQUtBLG9CQUFJLG1CQUFKO0FBQ0Esb0JBQUksT0FBSyxTQUFULEVBQW9CO0FBQ2hCLGlDQUFhLE9BQU8sSUFBUCxDQUFZLHNCQUFaLENBQWI7QUFDSCxpQkFGRCxNQUVPLElBQUksb0JBQUosRUFBMEI7QUFDN0IsaUNBQWEsT0FBTyxJQUFQLENBQVksbUJBQVosRUFBaUM7QUFDMUMsOEJBQU07QUFEb0MscUJBQWpDLENBQWI7QUFHSCxpQkFKTSxNQUlBO0FBQ0gsaUNBQWEsT0FBTyxJQUFQLENBQVksUUFBWixDQUFiO0FBQ0g7O0FBRUQsb0JBQU0sa0JBQWtCLEVBQXhCO0FBQ0Esb0JBQUksZUFBZSxPQUFLLEtBQUwsQ0FBVyxVQUFYLENBQXNCLGVBQXpDO0FBQ0Esb0JBQUksT0FBTyxTQUFQLENBQWlCLGFBQWpCLElBQWtDLFlBQXRDLEVBQW9EO0FBQUE7QUFBQTtBQUFBOztBQUFBO0FBQ2hELDZDQUFpQixPQUFPLFNBQVAsQ0FBaUIsYUFBbEMsOEhBQWlEO0FBQUEsZ0NBQXRDLEVBQXNDOztBQUM3QyxnQ0FBSSxhQUFhLEVBQWIsQ0FBSixFQUFzQjtBQUNsQixvQ0FBTSxvQkFBb0IsRUFBMUI7QUFDQSxrREFBa0IsVUFBbEIsR0FBK0IsT0FBTyxJQUFQLHNCQUNSLEVBRFEsU0FDRixhQUFhLEVBQWIsRUFBaUIsS0FEZixhQUEvQjtBQUdBLGtEQUFrQixVQUFsQixHQUErQixPQUFPLElBQVAsc0JBQ1IsRUFEUSxpQkFBL0I7QUFHQSxrREFBa0IsV0FBbEIsR0FDSSxhQUFhLEVBQWIsRUFBaUIsU0FEckI7QUFFQSxrREFBa0IsY0FBbEIsR0FBbUMsT0FBTyxJQUFQLHNCQUNaLEVBRFksMEJBRS9CO0FBQ0ksOENBQVUsT0FBTyxJQUFQLHNCQUNhLEVBRGIsU0FDbUIsYUFBYSxFQUFiLEVBQWlCLEtBRHBDO0FBRGQsaUNBRitCLENBQW5DO0FBUUEsZ0RBQWdCLElBQWhCLENBQXFCLGlCQUFyQjtBQUNIO0FBQ0o7QUF0QitDO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUF1Qm5EOztBQUVELG9CQUFNLGdCQUFnQjtBQUNsQiw2QkFBUyxDQUFDLG9CQUFELEVBQXVCLE9BQXZCLENBRFM7QUFFbEIsMkJBQU8sVUFGVztBQUdsQixpQ0FBYSxDQUFDLG9CQUhJO0FBSWxCLDZCQUFTLHFDQUEyQjtBQUNoQywrQkFBTyxPQUFLLEtBRG9CO0FBRWhDLCtCQUFPLE9BQUssS0FGb0I7QUFHaEMsd0NBQWdCLHVCQUF1QixFQUF2QixHQUE0QixjQUhaO0FBSWhDLG1DQUFXLE9BQUssU0FKZ0I7QUFLaEMsa0VBTGdDO0FBTWhDLHNDQUFjLFVBTmtCO0FBT2hDLGtFQVBnQztBQVFoQyw4REFSZ0M7QUFTaEMsb0VBVGdDO0FBVWhDO0FBVmdDLHFCQUEzQjtBQUpTLGlCQUF0QjtBQWlCQSx1QkFBSyxLQUFMLEdBQWEsSUFBSSxZQUFKLENBQVUsYUFBVixDQUFiO0FBQ0Esb0JBQU0sV0FBVyxPQUFLLEtBQUwsQ0FBVyxHQUE1Qjs7QUFFQSxvQkFBSSxvQkFBSixFQUEwQjtBQUN0Qix3QkFBSSx3QkFBSixDQUFnQjtBQUNaLCtCQUFPLElBREs7QUFFWixpQ0FBUyxJQUZHO0FBR1osNEJBQUksYUFIUTtBQUlaLG1DQUFXLGtCQUpDO0FBS1osOEJBQU0sa0JBTE07QUFNWiwrQkFBTyxPQUFPLElBQVAsQ0FBWSw4QkFBWixDQU5LO0FBT1osNkJBQUs7QUFQTyxxQkFBaEIsRUFRRyxNQVJIOztBQVVBLHdCQUFJLHdCQUFKLENBQWdCO0FBQ1osK0JBQU8sS0FESztBQUVaLDRCQUFJLGFBRlE7QUFHWixtQ0FBVyxrQkFIQztBQUlaLDhCQUFNLGtCQUpNO0FBS1osK0JBQU8sT0FBTyxJQUFQLENBQVkseUJBQVosQ0FMSztBQU1aLDZCQUFLO0FBTk8scUJBQWhCLEVBT0csTUFQSDtBQVFIOztBQUVELHlCQUFTLEVBQVQsQ0FBWSxPQUFaLEVBQXFCLGdCQUFyQixFQUF1QyxZQUFNO0FBQ3pDLDJCQUFLLEtBQUwsQ0FBVyxLQUFYO0FBQ0gsaUJBRkQ7O0FBSUEseUJBQVMsRUFBVCxDQUFZLE9BQVosRUFBcUIsZ0JBQXJCLEVBQXVDLFlBQU07QUFDekMsd0JBQUksOEJBQUo7QUFDQSx3QkFBSSxvQkFBSixFQUEwQjtBQUN0QixnREFBd0I7QUFDcEIsbUNBQU8sTUFEYTtBQUVwQixzREFBMEIsS0FGTjtBQUdwQiwyQ0FBZTtBQUhLLHlCQUF4QjtBQUtILHFCQU5ELE1BTU87QUFDSCxnREFDSSxlQUFlLE1BQWYsR0FBd0IsQ0FBeEIsR0FDTSxlQUNLLEdBREwsQ0FFUSxTQUNLLElBREwsQ0FDVSx3QkFEVixFQUVLLEdBRkwsRUFGUixFQU1LLE1BTkwsRUFETixHQVFNLGVBQWUsS0FBZixHQUF1QixNQUF2QixFQVRWO0FBVUg7O0FBRUQsMkJBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxlQUFmLEVBQWdDLHFCQUFoQzs7QUFFQSw2QkFDSyxJQURMLENBQ1UsZ0JBRFYsRUFFSyxRQUZMLENBRWMsU0FGZCxFQUdLLE1BSEwsQ0FHWSw2QkFIWjs7QUFLQSwyQkFBSyxNQUFMLENBQVksT0FBSyxLQUFqQjtBQUNILGlCQTdCRDs7QUErQkEseUJBQVMsRUFBVCxDQUFZLE9BQVosRUFBcUIsY0FBckIsRUFBcUMsWUFBTTtBQUN2QywyQkFBSyxLQUFMLENBQVcsT0FBWCxDQUFtQixjQUFuQixFQUFtQztBQUMvQixnQ0FBUSxNQUR1QjtBQUUvQiwrQkFBTyxPQUFLO0FBRm1CLHFCQUFuQztBQUlBLDZCQUNLLElBREwsQ0FDVSxjQURWLEVBRUssUUFGTCxDQUVjLFNBRmQsRUFHSyxNQUhMLENBR1ksNkJBSFo7QUFJQSwyQkFBSyxHQUFMLENBQVMsRUFBVCxDQUFZLGdCQUFaLEVBQThCLFlBQU07QUFDaEMsK0JBQUssS0FBTCxDQUFXLEtBQVg7QUFDSCxxQkFGRDtBQUdILGlCQVpEOztBQWNBLHlCQUFTLEVBQVQsQ0FBWSxRQUFaLEVBQXNCLG1CQUF0QixFQUEyQyxVQUFDLEtBQUQsRUFBVztBQUNsRCxpQ0FBYSxNQUFNLE1BQU4sQ0FBYSxLQUFiLEtBQXVCLE1BQXBDO0FBQ0gsaUJBRkQ7QUFHSCxhQXBLRDtBQXFLSDs7OztFQXZOMkMsU0FBUyxJOztxQkFBcEMsa0I7Ozs7Ozs7Ozs7O0FDUHJCOztBQUNBOzs7Ozs7Ozs7Ozs7Y0FFZ0MsTTtJQUF4QixNLFdBQUEsTTtJQUFRLEcsV0FBQSxHO0lBQUssTSxXQUFBLE07O0lBRUEseUI7Ozs7Ozs7Ozs7O21DQUNOO0FBQ1AsbUJBQU87QUFDSCx5QkFBUyxDQUROO0FBRUgsZ0NBQWdCLElBQUksb0NBQUo7QUFGYixhQUFQO0FBSUg7OztvQ0FFVztBQUFBOztBQUNSLG1CQUFPLFFBQVEsSUFBUixDQUFhO0FBQ2hCLHdCQUFRLEtBRFE7QUFFaEIscUJBQUssSUFBSSxPQUFPLG1CQUFYLEVBQWdDLEVBQUMsU0FBUyxLQUFLLEdBQUwsQ0FBUyxTQUFULENBQVYsRUFBaEMsQ0FGVztBQUdoQix5QkFBUztBQUhPLGFBQWI7QUFLUDtBQUxPLGFBTUYsSUFORSxDQU1HLFVBQUMsUUFBRCxFQUFjO0FBQ2hCLHVCQUFLLEdBQUwsQ0FBUyxnQkFBVCxFQUEyQixHQUEzQixDQUErQixRQUEvQjtBQUNBLHVCQUFPLFFBQVA7QUFDSCxhQVRFO0FBVUg7QUFWRyxzQkFXSSxVQUFDLEtBQUQsRUFBVztBQUNkLHVCQUFPLEdBQVAsQ0FBVyxPQUFYLEVBQW9CLG1EQUFwQixFQUF5RSxFQUFDLFNBQVMsT0FBSyxHQUFMLENBQVMsU0FBVCxDQUFWLEVBQStCLFlBQS9CLEVBQXpFO0FBQ0Esc0JBQU0sS0FBTjtBQUNILGFBZEUsQ0FBUDtBQWVIOzs7O0VBeEJrRCxTQUFTLEs7O3FCQUEzQyx5Qjs7Ozs7Ozs7OztBQ0xyQjs7QUFFQSxJQUFNLGFBQWEsU0FBYixVQUFhO0FBQUEsUUFBRyxHQUFILFFBQUcsR0FBSDtBQUFBLFFBQVEsR0FBUixRQUFRLEdBQVI7QUFBQSwwQkFDRixHQURFLG1EQUMrQyw4QkFBWSxHQUFaLENBRC9DO0FBQUEsQ0FBbkI7O0FBR0EsSUFBTSwwQkFBMEIsU0FBMUIsdUJBQTBCLENBQUMsWUFBRCxFQUFrQjtBQUM5QyxRQUFNLE1BQU0sZUFDTiwrQ0FETSxHQUVOLCtDQUZOO0FBR0EsV0FBTyxXQUFXLEVBQUUsS0FBSyxLQUFLLDBCQUFMLENBQVAsRUFBeUMsUUFBekMsRUFBWCxDQUFQO0FBQ0gsQ0FMRDs7QUFPQSxJQUFNLDRCQUE0QixTQUE1Qix5QkFBNEIsQ0FBQyxZQUFELEVBQWtCO0FBQ2hELFFBQU0sTUFBTSxlQUNOLGlEQURNLEdBRU4saURBRk47QUFHQSxXQUFPLFdBQVcsRUFBRSxLQUFLLEtBQUssNEJBQUwsQ0FBUCxFQUEyQyxRQUEzQyxFQUFYLENBQVA7QUFDSCxDQUxEOztBQU9PLElBQU0sMEJBQVMsU0FBVCxNQUFTLENBQUMsWUFBRDtBQUFBLDZKQUdSLHdCQUF3QixZQUF4QixDQUhRLHNCQUlSLDBCQUEwQixZQUExQixDQUpRO0FBQUEsQ0FBZjs7Ozs7Ozs7OztBQ25CUDs7QUFDQTs7QUFDQTs7QUFFQSxJQUFNLE9BQU8sU0FBUCxJQUFPLENBQUMsR0FBRDtBQUFBLFdBQVMsT0FBTyxJQUFQLENBQVksR0FBWixDQUFUO0FBQUEsQ0FBYjtBQUNBLElBQU0sT0FBTyxTQUFQLElBQU8sQ0FBQyxHQUFEO0FBQUEsV0FBUyxPQUFPLElBQVAsQ0FBWSxHQUFaLENBQVQ7QUFBQSxDQUFiOztBQUVBLElBQU0sWUFBWSxTQUFaLFNBQVk7QUFBQSxXQUFNLENBQUUsT0FBTyxTQUFQLElBQW9CLE9BQU8sU0FBUCxDQUFpQixPQUF0QyxJQUFrRCxJQUFuRCxFQUF5RCxXQUF6RCxFQUFOO0FBQUEsQ0FBbEI7O0FBRUEsSUFBTSxnQkFBZ0IsU0FBaEIsYUFBZ0IsQ0FBQyxpQkFBRCxFQUFvQixtQkFBcEIsRUFBeUMsWUFBekM7QUFBQSxpU0FLVSxLQUFLLGlCQUFMLENBTFYsZ0ZBTVMsOEJBQVksd0JBQVosQ0FOVCxnSEFTSSxLQUFLLHFCQUFMLENBVEosMElBWUksS0FBSyxvQkFBTCxDQVpKLHdKQWlCQSxrQ0FBbUIsRUFBRSxNQUFNLGlCQUFSLEVBQTJCLDBCQUEzQixFQUF5QyxrQkFBa0IsV0FBM0QsRUFBbkIsQ0FqQkEsOEJBa0JBLG9DQUFxQixFQUFFLE1BQU0sbUJBQVIsRUFBNkIsMEJBQTdCLEVBQTJDLGtCQUFrQixXQUE3RCxFQUFyQixDQWxCQTtBQUFBLENBQXRCOztBQXlCQSxJQUFNLGFBQWEsU0FBYixVQUFhO0FBQUEsUUFBRyxRQUFILFFBQUcsUUFBSDtBQUFBLFdBQ2YsV0FBVyxFQUFYLDJaQVFrQixLQUFLLGtDQUFMLENBUmxCLDBFQURlO0FBQUEsQ0FBbkI7O0FBZ0JPLElBQU0sd0NBQWdCLFNBQWhCLGFBQWdCO0FBQUEsUUFDekIsaUJBRHlCLFNBQ3pCLGlCQUR5QjtBQUFBLFFBQ04sbUJBRE0sU0FDTixtQkFETTtBQUFBLFFBQ2UsWUFEZixTQUNlLFlBRGY7QUFBQSxRQUM2QixVQUQ3QixTQUM2QixVQUQ3QjtBQUFBLFFBQ3lDLGtCQUR6QyxTQUN5QyxrQkFEekM7QUFBQSxRQUM2RCxRQUQ3RCxTQUM2RCxRQUQ3RDtBQUFBLDZEQUluQixjQUFjLGlCQUFkLEVBQWlDLG1CQUFqQyxFQUFzRCxZQUF0RCxDQUptQixtQkFLbkIsYUFBYSw0QkFBTyxZQUFQLENBQWIsR0FBb0MsRUFMakIsb0JBTW5CLHFCQUFxQixXQUFXLEVBQUUsa0JBQUYsRUFBWCxDQUFyQixHQUFnRCxFQU43QjtBQUFBLENBQXRCOzs7Ozs7Ozs7OztBQ2xEUDs7Ozs7Ozs7Ozs7O2NBQytELE07SUFBdkQsYyxXQUFBLGM7SUFBZ0IsRyxXQUFBLEc7SUFBSyxNLFdBQUEsTTtJQUFRLFMsV0FBQSxTO0lBQVcsSSxXQUFBLEk7SUFBTSxJLFdBQUEsSTs7SUFFakMsVzs7O0FBR2pCLDJCQUFjO0FBQUE7O0FBQUEsK0hBQ0QsU0FEQzs7QUFBQSxjQUZkLFFBRWMsR0FGSCx3QkFFRzs7QUFBQSxjQXdKZCxxQkF4SmMsR0F3SlUsVUFBQyxDQUFEO0FBQUEsbUJBQ3BCLENBQUMsRUFBRSxLQUFGLEtBQVksRUFBWixJQUFrQixFQUFFLEtBQUYsS0FBWSxFQUEvQixNQUF1QyxFQUFFLGNBQUYsTUFBc0IsSUFBN0QsQ0FEb0I7QUFBQSxTQXhKVjs7QUFHVixjQUFLLEdBQUwsR0FBVyxLQUFLLE1BQUwsR0FBYyxRQUFkLENBQXVCLEVBQXZCLEVBQTJCLFNBQTNCLENBQXFDLENBQXJDLENBQVg7O0FBRUEsY0FBSyxRQUFMLENBQWMsTUFBSyxLQUFuQixFQUEwQixvQkFBMUIsRUFBZ0Q7QUFBQSxtQkFBTSxNQUFLLE1BQUwsRUFBTjtBQUFBLFNBQWhEOztBQUVBLGNBQUssTUFBTDtBQVBVO0FBUWI7Ozs7aUNBRVE7QUFDTCxnQkFBSSxTQUFTO0FBQ1QsMkNBQTJCLGNBRGxCO0FBRVQsNkNBQTZCLG1CQUZwQjtBQUdULDhDQUE4QjtBQUhyQixhQUFiOztBQU1BLGdCQUFJLGVBQWUsU0FBZixDQUF5QiwwQkFBekIsQ0FBSixFQUEwRDtBQUN0RCx1QkFBTyx3QkFBUCxJQUFtQyx1QkFBbkM7QUFDSDtBQUNELG1CQUFPLE1BQVA7QUFDSDs7OzhDQUVxQixDLEVBQUc7QUFDckIsZ0JBQUksRUFBRSxPQUFGLEtBQWMsRUFBbEIsQ0FBcUIsT0FBckIsRUFBOEI7QUFDMUIseUJBQUssS0FBTDtBQUNIO0FBQ0o7Ozt1Q0FFYztBQUNYLGlCQUFLLEtBQUwsQ0FBVyxPQUFYLENBQW1CLGNBQW5CLEVBQW1DO0FBQy9CLHdCQUFRLFNBRHVCO0FBRS9CLHVCQUFPLEtBQUs7QUFGbUIsYUFBbkM7QUFJSDs7OzBDQUVpQixDLEVBQUc7QUFDakIsZ0JBQUksQ0FBQyxPQUFPLGNBQVAsQ0FBc0IsU0FBdEIsQ0FBZ0MsMEJBQWhDLENBQUwsRUFBa0U7QUFDOUQsa0JBQUUsd0JBQUY7QUFDSDs7QUFFRCxnQkFBSSxFQUFFLE9BQUYsS0FBYyxFQUFkLElBQW9CLEVBQUUsT0FBRixLQUFjLEVBQXRDLEVBQTBDO0FBQ3RDLG9CQUFJLE9BQU8sY0FBUCxDQUFzQixTQUF0QixDQUFnQywwQkFBaEMsQ0FBSixFQUFpRTtBQUM3RCxzQkFBRSx3QkFBRjtBQUNIO0FBQ0QscUJBQUssS0FBTCxDQUFXLE9BQVgsQ0FBbUIsY0FBbkIsRUFBbUM7QUFDL0IsNEJBQVEsU0FEdUI7QUFFL0IsMkJBQU8sS0FBSztBQUZtQixpQkFBbkM7QUFJSDtBQUNKOzs7eUNBbUVnQjtBQUNiLGdCQUFNLE9BQU8sS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLE1BQWYsRUFBdUIsRUFBcEM7O0FBRUEsZ0JBQUksU0FBUyxXQUFULElBQXdCLFNBQVMsT0FBckMsRUFBOEM7QUFDMUMsdUJBQU8sS0FBSyxjQUFMLENBQVA7QUFDSCxhQUZELE1BRU8sSUFBSSxTQUFTLE9BQWIsRUFBc0I7QUFDekIsdUJBQU8sS0FBSyxhQUFMLENBQVA7QUFDSDs7QUFFRCxtQkFBTyxLQUFLLFlBQUwsQ0FBUDtBQUNIOzs7aURBRXdCO0FBQ3JCLGdCQUFNLFFBQVEsS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLE9BQWYsQ0FBZDtBQUNBLGdCQUFJLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxhQUFmLENBQUosRUFBbUM7QUFDL0IsdUJBQU8sS0FBSyw0QkFBTCxFQUFtQyxFQUFFLFlBQUYsRUFBbkMsQ0FBUDtBQUNILGFBRkQsTUFFTztBQUNILHVCQUFPLEtBQUsseUJBQUwsRUFBZ0MsRUFBRSxZQUFGLEVBQWhDLENBQVA7QUFDSDtBQUNKOzs7Z0RBRXVCO0FBQ3BCLGdCQUFJLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxhQUFmLENBQUosRUFBbUM7QUFDL0IsdUJBQU8sS0FBSyx1QkFBTCxDQUFQO0FBQ0gsYUFGRCxNQUVPO0FBQ0gsdUJBQU8sS0FBSyxvQkFBTCxDQUFQO0FBQ0g7QUFDSjs7O2lDQUVRO0FBQ0wsaUJBQUssR0FBTCxDQUFTLEtBQVQsR0FBaUIsTUFBakIsQ0FBd0IsS0FBSyxRQUFMLENBQWMsS0FBSyxTQUFuQixDQUF4Qjs7QUFFQSxtQkFBTyxJQUFQO0FBQ0g7OztnQ0FLTztBQUNKLG1CQUFPLFVBQVAsQ0FBa0IsSUFBbEIsQ0FBdUIsUUFBdkIsQ0FBZ0MsS0FBaEMsQ0FDSSxLQUFLLEdBQUwsQ0FBUyxJQUFULENBQWMsa0JBQWQsQ0FESjtBQUdIOzs7K0JBRU0sQyxFQUFHO0FBQ04sZ0JBQUksS0FBSyxxQkFBTCxDQUEyQixDQUEzQixDQUFKLEVBQW1DO0FBQy9CLHVCQUFPLFVBQVAsQ0FBa0IsSUFBbEIsQ0FBdUIsUUFBdkIsQ0FBZ0MsTUFBaEMsQ0FDSSxLQUFLLEdBQUwsQ0FBUyxJQUFULENBQWMsb0JBQWQsQ0FESjtBQUdIO0FBQ0o7Ozs0QkFuSGU7QUFDWixnQkFBSSxrQkFBa0IsRUFBdEI7QUFDQSxnQkFDSSxFQUNJLEtBQUssS0FBTCxDQUFXLFVBQVgsSUFDQSxlQUFlLFNBQWYsQ0FBeUIsaUJBQXpCLENBRkosQ0FESixFQUtFO0FBQ0Usb0JBQ0ksZUFBZSxTQUFmLENBQXlCLGdCQUF6QixLQUNBLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxnQkFBZixDQUZKLEVBR0U7QUFDRSxzQ0FBa0IsSUFBSSxPQUFPLFlBQVgsRUFBeUI7QUFDdkMsOEJBQU0sVUFEaUM7QUFFdkMsK0JBQU8sS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLGdCQUFmLEVBQWlDLFFBRkQ7QUFHdkMsZ0NBQVE7QUFIK0IscUJBQXpCLENBQWxCO0FBS0gsaUJBVEQsTUFTTyxJQUFJLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxRQUFmLENBQUosRUFBOEI7QUFDakMsc0NBQWtCLElBQUksT0FBTyxZQUFYLEVBQXlCO0FBQ3ZDLDhCQUFNLFFBRGlDO0FBRXZDLCtCQUFPLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxRQUFmLENBRmdDO0FBR3ZDLGdDQUFRO0FBSCtCLHFCQUF6QixDQUFsQjtBQUtIO0FBQ0o7O0FBRUQsZ0JBQUksbUJBQW1CLEtBQXZCO0FBQ0EsaUJBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxTQUFmLEVBQTBCLE9BQTFCLENBQWtDLFVBQUMsTUFBRCxFQUFZO0FBQzFDLG9CQUFJLE9BQU8sRUFBUCxLQUFjLGdCQUFsQixFQUFvQztBQUNoQyx1Q0FBbUIsSUFBbkI7QUFDSDtBQUNKLGFBSkQ7O0FBTUEsZ0JBQUksZ0JBQWdCLEtBQUssS0FBTCxDQUFXLFVBQVgsQ0FBc0IsT0FBdEIsQ0FBOEIsYUFBOUIsQ0FBNEMsRUFBaEU7O0FBRUEsZ0JBQU0sNEJBQTBCLE9BQU8sR0FBUCxDQUM1QixPQUFPLE1BQVAsQ0FBYyxjQURjLEVBRTVCO0FBQ0ksb0JBQUksS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLElBQWY7QUFEUixhQUY0QixDQUExQixJQUtGLG9DQUFrQyxhQUFsQyxHQUFvRCxFQUxsRCxDQUFOOztBQU9BLG1CQUFPO0FBQ0gseUJBQVMsS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLFNBQWYsQ0FETjtBQUVILDBEQUZHO0FBR0gsb0JBQUksS0FBSyxLQUFMLENBQVcsRUFIWjtBQUlILHFCQUFLLEtBQUssR0FKUDtBQUtILHVCQUFPLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxPQUFmLENBTEo7QUFNSCx3QkFBUSxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsTUFBZixFQUF1QixFQU41QjtBQU9ILDRCQUFZLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxRQUFmLEVBQXlCLElBQXpCLElBQWlDLEVBUDFDO0FBUUgsNEJBQVksS0FBSyxjQUFMLEVBUlQ7QUFTSCwyQkFBVyxRQVRSO0FBVUgsb0NBQW9CLEtBQUssc0JBQUwsRUFWakI7QUFXSCxtQ0FBbUIsS0FBSyxxQkFBTCxFQVhoQjtBQVlILGdDQUNJLFVBQVUsa0JBQVYsSUFDQSxDQUFDLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxtQkFBZixDQWRGO0FBZUgsaUNBQWlCLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxhQUFmLElBQ1gsZ0JBRFcsR0FFWCxhQWpCSDtBQWtCSCxnREFsQkc7QUFtQkg7QUFuQkcsYUFBUDtBQXFCSDs7OztFQXRIb0MsU0FBUyxJOztxQkFBN0IsVzs7Ozs7Ozs7Ozs7QUNIckI7Ozs7QUFDQTs7OztBQUNBOzs7Ozs7Ozs7O0lBRXFCLEs7OztBQUNqQix5QkFBK0Q7QUFBQSxZQUFqRCxXQUFpRCxRQUFqRCxXQUFpRDtBQUFBLFlBQXBDLFFBQW9DLFFBQXBDLFFBQW9DO0FBQUEsdUNBQTFCLGNBQTBCO0FBQUEsWUFBMUIsY0FBMEIsdUNBQVQsS0FBUzs7QUFBQTs7QUFBQSxtSEFDbEQsU0FEa0Q7O0FBRzNELGNBQUssV0FBTCxHQUFtQixFQUFFLE1BQUYsQ0FDZixFQUFFLFFBQVEsR0FBVixFQUFlLFFBQVEsR0FBdkIsRUFBNEIsU0FBUyxHQUFyQyxFQURlLEVBRWYsV0FGZSxDQUFuQjtBQUlBLGNBQUssUUFBTCxHQUFnQixRQUFoQjtBQUNBLGNBQUssY0FBTCxHQUFzQixjQUF0Qjs7QUFFQSxjQUFLLFFBQUwsQ0FBYyxNQUFLLEtBQW5CLEVBQTBCLFFBQTFCLEVBQW9DLE1BQUssT0FBekM7QUFDQSxjQUFLLE9BQUw7QUFYMkQ7QUFZOUQ7Ozs7aUNBRVE7QUFDTCxjQUFFLE1BQUYsRUFBVSxHQUFWLGFBQXdCLEtBQUssS0FBTCxDQUFXLEVBQW5DO0FBQ0g7OztrQ0FFUztBQUFBOztBQUNOLGdCQUFNLFFBQVEsS0FBSyxLQUFMLENBQVcsTUFBWCxFQUFkO0FBQ0EsZ0JBQU0sYUFBYSxPQUFPLE1BQVAsR0FDYixLQUFLLFdBQUwsQ0FBaUIsTUFESixHQUViLE9BQU8sTUFBUCxHQUNBLEtBQUssV0FBTCxDQUFpQixNQURqQixHQUVBLEtBQUssV0FBTCxDQUFpQixPQUp2QjtBQUtBLGdCQUFNLFFBQVEsS0FBSyxLQUFMLENBQVcsUUFBWCxDQUFvQixVQUFwQixDQUFkOztBQUVBLGdCQUFJLEtBQUssS0FBTCxDQUFXLGFBQWYsRUFBOEI7QUFDMUIsb0JBQUksa0RBQUo7QUFDQSxxQkFBSyxHQUFMLENBQVMsS0FBVCxHQUFpQixNQUFqQixDQUF3QixNQUF4QjtBQUNILGFBSEQsTUFHTyxJQUFJLFNBQVMsTUFBTSxJQUFuQixFQUF5QjtBQUM1QixvQkFBSSxVQUFTLEVBQ1Qsd0JBQWM7QUFDVixnQ0FEVTtBQUVWLGdDQUNLLFNBQ0csTUFBTSxZQURULElBRUcsTUFBTSxZQUFOLENBQW1CLEdBRnZCLElBR0EsU0FOTTtBQU9WLHlCQUFLLFNBQVMsTUFBTSxJQVBWO0FBUVYsMEJBQU0sS0FBSyxLQUFMLENBQVcsZUFSUDtBQVNWLDJCQUFPLE9BQU8sSUFBUCxDQUFZLHVCQUFaLEVBQXFDO0FBQ3hDLCtCQUFPLE1BQU0sS0FEMkI7QUFFeEMsaUNBQVMsTUFBTTtBQUZ5QixxQkFBckMsQ0FURztBQWFWLG1DQUNJLE1BQU0sTUFBTixDQUFhLElBQWIsSUFBcUIsSUFBckIsR0FBNEIsYUFBNUIsR0FBNEMsRUFkdEM7QUFlViw0QkFBUSxTQUFTLE1BQU07QUFmYixpQkFBZCxDQURTLENBQWI7O0FBb0JBO0FBQ0Esd0JBQU8sSUFBUCxDQUFZLEtBQVosRUFBbUIsRUFBbkIsQ0FBc0IsT0FBdEIsRUFBK0IsWUFBTTtBQUNqQyx3QkFBSSxnQkFBZ0IsS0FBSyxLQUFMLENBQ2hCLEtBQUssU0FBTCxDQUFlLE9BQUssS0FBTCxDQUFXLFVBQVgsQ0FBc0IsTUFBckMsQ0FEZ0IsQ0FBcEI7O0FBSUEsc0JBQUUsYUFBRixFQUFpQixJQUFqQixDQUFzQixVQUFDLEtBQUQsRUFBVztBQUM3QiwrQkFBTyxNQUFNLElBQWI7QUFDSCxxQkFGRDs7QUFJQSwyQkFBSyxLQUFMLENBQVcsR0FBWCxDQUFlLEVBQUUsUUFBUSxhQUFWLEVBQWY7QUFDSCxpQkFWRDs7QUFZQSxxQkFBSyxHQUFMLENBQVMsS0FBVCxHQUFpQixNQUFqQixDQUF3QixPQUF4QjtBQUNILGFBbkNNLE1BbUNBLElBQUksS0FBSyxjQUFULEVBQXlCO0FBQzVCLHFCQUFLLEdBQUwsQ0FBUyxLQUFULEdBQWlCLE1BQWpCLGVBQ2dCLEtBQUssS0FBTCxDQUFXLGVBRDNCLDBDQUVvQixPQUFPLElBQVAsQ0FBWSxvQkFBWixFQUFrQztBQUMxQywyQkFBTyxNQUFNO0FBRDZCLGlCQUFsQyxDQUZwQix1Q0FJNEMsOEJBQ3BDLHdCQURvQyxDQUo1QztBQVNILGFBVk0sTUFVQTtBQUNILG9CQUFJLGNBQWMsS0FBSyxLQUFMLENBQVcsVUFBWCxHQUNaLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxTQUFmLENBRFksR0FFWixLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsa0JBQWYsQ0FGTjtBQUdBLHFCQUFLLEdBQUwsQ0FBUyxLQUFULEdBQWlCLE1BQWpCLENBQ0ksMEJBQWdCO0FBQ1osZ0NBRFk7QUFFWiwwQkFBTSxLQUFLLEtBQUwsQ0FBVyxlQUZMO0FBR1osOEJBQVUsS0FBSyxRQUhIO0FBSVosZ0NBQVksVUFKQTtBQUtaLGlDQUFjLGFBQWEsR0FBZCxHQUFxQixHQUx0QjtBQU1aLGlDQUFhO0FBTkQsaUJBQWhCLENBREo7QUFVQSxrQkFBRSxNQUFGLEVBQVUsRUFBVixhQUNjLEtBQUssS0FBTCxDQUFXLEVBRHpCLEVBRUksRUFBRSxJQUFGLENBQ0ksS0FBSyxlQURULEVBRUksSUFGSixFQUdJLCtDQUhKLEVBSUksS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLE9BQWYsQ0FKSixDQUZKO0FBU0Esa0JBQUUsTUFBRixFQUFVLEVBQVYsYUFDYyxLQUFLLEtBQUwsQ0FBVyxFQUR6QixFQUVJLEVBQUUsSUFBRixDQUNJLEtBQUssZUFEVCxFQUVJLElBRkosRUFHSSxnREFISixFQUlJLFdBSkosQ0FGSjtBQVNBLGtCQUFFLE1BQUYsRUFBVSxFQUFWLGFBQ2MsS0FBSyxLQUFMLENBQVcsRUFEekIsRUFFSSxFQUFFLElBQUYsQ0FBTyxLQUFLLGlCQUFaLEVBQStCLElBQS9CLENBRko7O0FBS0E7QUFDQSwyQkFBVyxZQUFNO0FBQ2IsMkJBQUssZUFBTCxDQUNJLCtDQURKLEVBRUksT0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLE9BQWYsQ0FGSjtBQUlBLDJCQUFLLGVBQUwsQ0FDSSxnREFESixFQUVJLFdBRko7QUFJQSwyQkFBSyxpQkFBTDtBQUNILGlCQVZELEVBVUcsQ0FWSDtBQVdIOztBQUVELG1CQUFPLElBQVA7QUFDSDs7OzRDQUVtQjtBQUNoQixnQkFBTSxRQUFRLEtBQUssRUFBTCxDQUFRLGFBQVIsQ0FBc0IsS0FBdEIsQ0FBZDtBQUNBLGdCQUFJLEtBQUosRUFBVztBQUNQLGtCQUFFLEtBQUYsRUFBUyxNQUFULENBQWlCLEVBQUUsS0FBRixFQUFTLE1BQVQsR0FBa0IsS0FBbEIsS0FBNEIsR0FBN0IsR0FBb0MsR0FBcEQ7QUFDSDtBQUNKOzs7d0NBQ2UsUSxFQUFVLFMsRUFBVztBQUNqQyxnQkFBTSxVQUFVLEtBQUssRUFBTCxDQUFRLGFBQVIsQ0FBc0IsUUFBdEIsQ0FBaEI7QUFDQSxnQkFBSSxPQUFKLEVBQWE7QUFDVCx3QkFBUSxTQUFSLEdBQW9CLFNBQXBCO0FBQ0Esb0JBQUksU0FBUyxPQUFULENBQWlCLFFBQWpCLE1BQStCLENBQUMsQ0FBcEMsRUFBdUM7QUFDbkMsd0JBQUksRUFBRSxPQUFGLEVBQVcsS0FBWCxLQUFxQixHQUF6QixFQUE4QjtBQUMxQiwwQkFBRSxPQUFGLEVBQVcsR0FBWCxDQUFlLFdBQWYsRUFBNEIsTUFBNUI7QUFDSCxxQkFGRCxNQUVPLElBQ0gsRUFBRSxPQUFGLEVBQVcsS0FBWCxLQUFxQixHQUFyQixJQUNBLEVBQUUsT0FBRixFQUFXLEtBQVgsTUFBc0IsR0FGbkIsRUFHTDtBQUNFLDBCQUFFLE9BQUYsRUFBVyxHQUFYLENBQWUsV0FBZixFQUE0QixNQUE1QjtBQUNILHFCQUxNLE1BS0EsSUFDSCxFQUFFLE9BQUYsRUFBVyxLQUFYLEtBQXFCLEdBQXJCLElBQ0EsRUFBRSxPQUFGLEVBQVcsS0FBWCxNQUFzQixHQUZuQixFQUdMO0FBQ0UsMEJBQUUsT0FBRixFQUFXLEdBQVgsQ0FBZSxXQUFmLEVBQTRCLE1BQTVCO0FBQ0gscUJBTE0sTUFLQSxJQUFJLEVBQUUsT0FBRixFQUFXLEtBQVgsTUFBc0IsR0FBMUIsRUFBK0I7QUFDbEMsMEJBQUUsT0FBRixFQUFXLEdBQVgsQ0FBZSxXQUFmLEVBQTRCLE1BQTVCO0FBQ0g7QUFDSixpQkFoQkQsTUFnQk8sSUFBSSxTQUFTLE9BQVQsQ0FBaUIsU0FBakIsTUFBZ0MsQ0FBQyxDQUFyQyxFQUF3QztBQUMzQyx3QkFBSSxFQUFFLE9BQUYsRUFBVyxLQUFYLEtBQXFCLEdBQXpCLEVBQThCO0FBQzFCLDBCQUFFLE9BQUYsRUFBVyxHQUFYLENBQWUsV0FBZixFQUE0QixNQUE1QjtBQUNILHFCQUZELE1BRU8sSUFDSCxFQUFFLE9BQUYsRUFBVyxLQUFYLEtBQXFCLEdBQXJCLElBQ0EsRUFBRSxPQUFGLEVBQVcsS0FBWCxNQUFzQixHQUZuQixFQUdMO0FBQ0UsMEJBQUUsT0FBRixFQUFXLEdBQVgsQ0FBZSxXQUFmLEVBQTRCLE1BQTVCO0FBQ0gscUJBTE0sTUFLQSxJQUNILEVBQUUsT0FBRixFQUFXLEtBQVgsS0FBcUIsR0FBckIsSUFDQSxFQUFFLE9BQUYsRUFBVyxLQUFYLE1BQXNCLEdBRm5CLEVBR0w7QUFDRSwwQkFBRSxPQUFGLEVBQVcsR0FBWCxDQUFlLFdBQWYsRUFBNEIsTUFBNUI7QUFDSCxxQkFMTSxNQUtBLElBQUksRUFBRSxPQUFGLEVBQVcsS0FBWCxNQUFzQixHQUExQixFQUErQjtBQUNsQywwQkFBRSxPQUFGLEVBQVcsR0FBWCxDQUFlLFdBQWYsRUFBNEIsTUFBNUI7QUFDSDtBQUNKO0FBQ0Qsb0JBQ0ksUUFBUSxZQUFSLEdBQXVCLENBQXZCLElBQ0EsUUFBUSxZQUFSLEdBQXVCLFFBQVEsWUFGbkMsRUFHRTtBQUNFLHdCQUFJLE9BQU8sUUFBUSxTQUFuQjtBQUNBLDJCQUFVLEtBQUssT0FBTCxDQUFhLE9BQWIsRUFBc0IsRUFBdEIsQ0FBVixTQUZGLENBRTRDO0FBQzFDLDJCQUNJLFNBQVMsS0FBVCxJQUNBLFFBQVEsWUFBUixHQUF1QixRQUFRLFlBRm5DLEVBR0U7QUFDRSwrQkFBTyxLQUFLLE9BQUwsQ0FBYSxtQkFBYixFQUFrQyxJQUFsQyxDQUFQLENBREYsQ0FDa0Q7QUFDaEQsZ0NBQVEsU0FBUixHQUFvQixJQUFwQjtBQUNIO0FBQ0Q7QUFDSDtBQUNKO0FBQ0o7Ozs7RUE3TDhCLFNBQVMsSTs7cUJBQXZCLEs7Ozs7Ozs7Ozs7O0FDSnJCOzs7O0FBQ0E7Ozs7Ozs7O0lBRXFCLGM7QUFFakIsOEJBQWM7QUFBQTs7QUFDVixVQUFFLE1BQUYsQ0FBUyxJQUFULEVBQWUsU0FBUyxNQUF4Qjs7QUFFQSxhQUFLLEtBQUwsR0FBc0IsSUFBSSw0QkFBSixFQUF0QjtBQUNBLGFBQUssTUFBTCxHQUFzQixFQUF0QjtBQUNBLGFBQUssV0FBTCxHQUFzQixFQUF0QjtBQUNIOzs7O29DQUVXLEksRUFBTSxPLEVBQVM7QUFDdkIsbUJBQU8sS0FBSyxNQUFMLENBQVksRUFBRSxNQUFGLENBQVMsRUFBVCxFQUFhLEVBQUUsT0FBTyxJQUFULEVBQWIsRUFBOEIsT0FBOUIsQ0FBWixDQUFQO0FBQ0g7OzsrQkFFTSxVLEVBQVksTyxFQUFTO0FBQ3hCLG1CQUFPLEtBQUssTUFBTCxDQUFZLEVBQUUsTUFBRixDQUFTLEVBQVQsRUFBYSxVQUFiLEVBQXlCLE9BQXpCLENBQVosQ0FBUDtBQUNIOzs7NENBRW1CLEUsRUFBSSxPLEVBQVM7QUFDN0IsbUJBQU8sS0FBSyxNQUFMLENBQVksRUFBRSxNQUFGLENBQVMsRUFBVCxFQUFhLEVBQUUsY0FBYyxFQUFoQixFQUFiLEVBQW1DLE9BQW5DLENBQVosQ0FBUDtBQUNIOzs7b0RBRTJCLGlCLEVBQW1CLE8sRUFBUztBQUNwRCxtQkFBTyxLQUFLLE1BQUwsQ0FBWSxFQUFFLE1BQUYsQ0FBUyxFQUFULEVBQWEsaUJBQWIsRUFBZ0MsT0FBaEMsQ0FBWixDQUFQO0FBQ0g7O0FBRUQ7Ozs7NkNBQ3FCO0FBQ2pCLGlCQUFLLE9BQUwsQ0FBYSxZQUFiLEVBQTJCLElBQTNCLEVBQWlDLEVBQUUsaUJBQWlCLElBQW5CLEVBQWpDOztBQUVBLGdCQUFJLGdCQUFnQjtBQUNoQix1QkFBYyxFQURFO0FBRWhCLHdCQUFjLEVBRkU7QUFHaEIsNkJBQWM7QUFIRSxhQUFwQjs7QUFNQSxpQkFBSyxVQUFMLENBQWdCLGFBQWhCLEVBQStCLFdBQS9COztBQUVBLGlCQUFLLE9BQUwsQ0FBYSxVQUFiLEVBQXlCLElBQXpCOztBQUVBLG1CQUFPLFFBQVEsT0FBUixDQUFnQixhQUFoQixDQUFQO0FBQ0g7O0FBRUQ7Ozs7Ozs7K0JBSU8sVSxFQUFZO0FBQUE7O0FBRWYsZ0JBQUksQ0FBQyxVQUFMLEVBQWdCO0FBQ1osNkJBQWEsRUFBYjtBQUNIOztBQUVEO0FBQ0EsZ0JBQUksQ0FBQyxXQUFXLGNBQVosSUFBOEIsQ0FBQyxXQUFXLE9BQTlDLEVBQXNEO0FBQ2xELDJCQUFXLGNBQVgsR0FBNEIsT0FBTyxTQUFQLENBQWlCLGVBQTdDO0FBQ0g7O0FBRUQsZ0JBQUksT0FBTyxjQUFQLENBQXNCLFNBQXRCLENBQWdDLFVBQWhDLEtBQStDLFdBQVcsT0FBOUQsRUFBc0U7QUFDbEUsb0JBQU0sUUFBUSxDQUFDLGFBQUQsRUFBZ0IsYUFBaEIsRUFBK0IsT0FBL0IsRUFBd0MsUUFBeEMsRUFBa0QsWUFBbEQsRUFBZ0UsZ0JBQWhFLEVBQWtGLGtCQUFsRixDQUFkO0FBQ0EsMkJBQVcsTUFBWCxHQUFvQixNQUFNLEtBQUssS0FBTCxDQUFXLEtBQUssTUFBTCxLQUFnQixNQUFNLE1BQWpDLENBQU4sQ0FBcEI7QUFDSDs7QUFFRCxnQkFBSSxrQkFBa0IsSUFBSSw0QkFBSixDQUFvQixVQUFwQixDQUF0Qjs7QUFFQSxnQkFBSSxDQUFDLENBQUMsT0FBTyxTQUFQLENBQWlCLGlCQUF2QixFQUEwQztBQUN0QyxnQ0FBZ0IsaUJBQWhCLEdBQW9DLElBQXBDO0FBQ0g7O0FBRUQsaUJBQUssT0FBTCxDQUFhLFlBQWIsRUFBMkIsSUFBM0IsRUFBaUMsRUFBRSxnQ0FBRixFQUFqQzs7QUFFQSxtQkFBTyxJQUFJLE9BQUosQ0FBWSxVQUFDLE9BQUQsRUFBVSxNQUFWLEVBQXFCO0FBQ3BDLGtCQUFFLElBQUYsQ0FBTztBQUNILHlCQUFLLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLElBQWQsQ0FBbUIsS0FBbkIsQ0FBeUIsS0FBcEMsQ0FERjtBQUVILDRCQUFVLE1BRlA7QUFHSCw4QkFBVSxNQUhQO0FBSUgsaUNBQWEsaUNBSlY7QUFLSCwwQkFBVSxLQUFLLFNBQUwsQ0FBZSxnQkFBZ0IsU0FBaEIsRUFBZixDQUxQO0FBTUgsNkJBQVM7QUFOTixpQkFBUCxFQVFDLElBUkQsQ0FRTSxVQUFDLElBQUQsRUFBTyxVQUFQLEVBQW1CLEtBQW5CLEVBQTZCO0FBQy9CLHdCQUFJLE9BQU8sY0FBUCxDQUFzQixTQUF0QixDQUFnQyxVQUFoQyxLQUErQyxXQUFXLE9BQTlELEVBQXNFO0FBQ2xFLDZCQUFLLEtBQUwsR0FBYSxLQUFLLEtBQUwsSUFBYyxFQUFFLE9BQUYsQ0FBVSxLQUFLLEtBQWYsQ0FBM0I7QUFDSDtBQUNELHdCQUFJLE9BQU8sY0FBUCxDQUFzQixTQUF0QixDQUFnQyx5QkFBaEMsS0FBOEQsS0FBSyxLQUF2RSxFQUE4RTtBQUMxRSw2QkFBSyxLQUFMLEdBQWEsS0FBSyxLQUFMLENBQVcsTUFBWCxDQUFrQixVQUFDLENBQUQ7QUFBQSxtQ0FBTyxFQUFFLE9BQUYsS0FBYyxJQUFyQjtBQUFBLHlCQUFsQixDQUFiO0FBQ0g7QUFDRCwwQkFBSyxVQUFMLENBQWdCLElBQWhCLEVBQXNCLFVBQXRCLEVBQWtDLEtBQWxDO0FBQ0EsMEJBQUssT0FBTCxDQUFhLFVBQWIsRUFBeUIsS0FBekI7QUFDQSw0QkFBUSxJQUFSO0FBQ0gsaUJBbEJELEVBbUJDLElBbkJELENBbUJNLFVBQUMsS0FBRCxFQUFRLFVBQVIsRUFBb0IsV0FBcEIsRUFBb0M7QUFDdEMsMEJBQUssVUFBTCxDQUFnQixLQUFoQixFQUF1QixVQUF2QixFQUFtQyxXQUFuQztBQUNBLDBCQUFLLE9BQUwsQ0FBYSxVQUFiLEVBQXlCLEtBQXpCO0FBQ0EsMkJBQU8sS0FBUDtBQUNILGlCQXZCRDtBQXdCSCxhQXpCTSxDQUFQO0FBMEJIOzs7bUNBRVUsSSxFQUFNLFUsRUFBWSxLLEVBQU87QUFDaEMsaUJBQUssS0FBTCxDQUFXLEtBQVgsQ0FBaUIsS0FBSyxLQUF0QjtBQUNBLGlCQUFLLE9BQUwsQ0FBYSxjQUFiLEVBQTZCLElBQTdCLEVBQW1DLEVBQUUsVUFBRixFQUFRLHNCQUFSLEVBQW9CLFlBQXBCLEVBQW5DO0FBQ0g7OzttQ0FFVSxLLEVBQU8sVSxFQUFZLFcsRUFBYTtBQUN2QyxpQkFBSyxPQUFMLENBQWEsV0FBYixFQUEwQixJQUExQixFQUFnQyxFQUFFLFlBQUYsRUFBUyxzQkFBVCxFQUFxQix3QkFBckIsRUFBaEM7QUFDSDs7Ozs7O3FCQTFHZ0IsYzs7Ozs7Ozs7Ozs7Ozs7Ozs7SUNIQSxpQjs7O0FBQ2pCLHFDQUE4QztBQUFBLDZCQUFoQyxJQUFnQztBQUFBLFlBQWhDLElBQWdDLDZCQUF6QixNQUF5QjtBQUFBLFlBQWpCLE1BQWlCLFFBQWpCLE1BQWlCO0FBQUEsWUFBVCxLQUFTLFFBQVQsS0FBUzs7QUFBQTs7QUFBQSwySUFDakMsU0FEaUM7O0FBQUEsY0EyRTlDLGFBM0U4QyxHQTJFOUIsVUFBQyxDQUFEO0FBQUEsbUJBQ1osQ0FBQyxFQUFFLElBQUYsS0FBVyxPQUFYLElBQXNCLEVBQUUsS0FBRixLQUFZLEVBQWxDLElBQXdDLEVBQUUsS0FBRixLQUFZLEVBQXJELE1BQ0MsRUFBRSxjQUFGLE1BQXNCLElBRHZCLENBRFk7QUFBQSxTQTNFOEI7O0FBRzFDLGNBQUssSUFBTCxHQUFZLElBQVo7O0FBRUEsY0FBSyxlQUFMLEdBQXVCLEtBQXZCO0FBQ0EsWUFBSSxDQUFDLENBQUMsTUFBTixFQUFjO0FBQ1Ysa0JBQUssTUFBTCxHQUFjLE1BQWQ7QUFDQSxrQkFBSyxlQUFMLEdBQXVCLElBQXZCO0FBQ0g7O0FBRUQsY0FBSyxLQUFMLEdBQWEsS0FBYjs7QUFFQSxjQUFLLE9BQUwsR0FBZSxFQUFFLFlBQUYsQ0FBZjs7QUFFQSxjQUFLLFFBQUwsQ0FBYyxNQUFLLEtBQW5CLEVBQTBCLG1CQUExQixFQUErQyxNQUFLLE1BQXBEOztBQUVBLGNBQUssTUFBTDtBQWpCMEM7QUFrQjdDOzs7O2lDQWNRO0FBQ0wsaUJBQUssT0FBTCxDQUFhLEdBQWI7QUFDQSxpQkFBSyxHQUFMLENBQVMsR0FBVDs7QUFFQSxnQkFBSSxhQUFhLEtBQUssY0FBTCxFQUFqQjtBQUNBLGdCQUFJLEVBQUUsV0FBVyxJQUFiLEVBQW1CLE9BQW5CLEVBQUosRUFBa0M7QUFDOUIscUJBQUssT0FBTCxHQUFlLEVBQUUsWUFBRixFQUFnQixVQUFoQixDQUFmO0FBQ0gsYUFGRCxNQUVPO0FBQ0gscUJBQUssT0FBTCxHQUFlLEVBQUUsT0FBRixFQUFXLFVBQVgsQ0FBZjtBQUNIOztBQUVEO0FBQ0E7QUFDQTtBQUNBLGdCQUFJLEVBQUUsV0FBVyxJQUFiLEVBQW1CLE9BQW5CLE1BQWdDLEtBQUssZUFBekMsRUFBMEQ7QUFDdEQscUJBQUssb0JBQUwsQ0FBMEIsS0FBSyxPQUEvQjtBQUNIOztBQUVELGlCQUFLLEdBQUwsQ0FBUyxLQUFULEdBQWlCLE1BQWpCLENBQXdCLEtBQUssT0FBN0I7O0FBRUEsbUJBQU8sSUFBUDtBQUNIOzs7a0NBRXlCO0FBQUEsZ0JBQWxCLFNBQWtCLHVFQUFOLElBQU07O0FBQ3RCLGdCQUFJLFNBQUosRUFBZTtBQUNYLHFCQUFLLE9BQUwsQ0FDSyxHQURMLENBQ1Msb0JBRFQsRUFFSyxRQUZMLENBRWMsU0FGZCxFQUdLLElBSEwsQ0FHVSxVQUhWLEVBR3NCLFNBSHRCLEVBSUssTUFKTCxDQUlZLDZCQUpaO0FBS0gsYUFORCxNQU1PO0FBQ0gscUJBQUssT0FBTCxDQUNLLFdBREwsQ0FDaUIsU0FEakIsRUFFSyxJQUZMLENBRVUsVUFGVixFQUVzQixTQUZ0QixFQUdLLElBSEwsQ0FHVSxVQUhWLEVBSUssTUFKTDs7QUFNQSxxQkFBSyxvQkFBTCxDQUEwQixLQUFLLE9BQS9CO0FBQ0g7O0FBRUQsbUJBQU8sSUFBUDtBQUNIOzs7NkNBTW9CLEcsRUFBSztBQUFBOztBQUN0QixnQkFBSSxHQUFKLENBQVEsb0JBQVI7O0FBRUEsZ0JBQUksRUFBSixDQUFPLHlCQUFQLEVBQWtDLFVBQUMsQ0FBRCxFQUFPO0FBQ3JDLHVCQUFLLGFBQUwsQ0FBbUIsQ0FBbkIsS0FBeUIsT0FBSyxNQUFMLENBQVksQ0FBWixDQUF6QjtBQUNILGFBRkQ7QUFHQSxnQkFBSSxFQUFKLENBQU8sMkJBQVAsRUFBb0MsVUFBQyxDQUFELEVBQU87QUFDdkMsdUJBQUssYUFBTCxDQUFtQixDQUFuQixLQUF5QixPQUFLLE1BQUwsQ0FBWSxDQUFaLENBQXpCO0FBQ0gsYUFGRDtBQUdIOzs7K0JBRU0sSyxFQUFPO0FBQ1YsaUJBQUssYUFBTCxDQUFtQixLQUFuQixLQUE2QixLQUFLLG1CQUFMLEVBQTdCO0FBQ0g7Ozs4Q0FFcUI7QUFDbEIsaUJBQUssS0FBTCxDQUFXLE9BQVgsQ0FBbUIsY0FBbkIsRUFBbUM7QUFDL0Isd0JBQVEsS0FBSyxLQURrQjtBQUUvQix1QkFBTyxLQUFLO0FBRm1CLGFBQW5DO0FBSUg7OzsrQ0FFc0I7QUFDbkIsZ0JBQUksT0FBTyxjQUFQLENBQXNCLFNBQXRCLENBQWdDLFNBQWhDLENBQUosRUFBZ0Q7QUFDNUMsdUJBQU8sS0FBSyxLQUFMLENBQVcsVUFBWCxDQUFzQixJQUF0QixDQUEyQixFQUEzQixLQUFrQyxXQUFsQyxHQUNELE9BQU8sSUFBUCxDQUFZLFFBQVosQ0FEQyxHQUVELE9BQU8sSUFBUCxDQUFZLE1BQVosQ0FGTjtBQUdIO0FBQ0QsbUJBQU8sT0FBTyxJQUFQLENBQVksUUFBWixDQUFQO0FBQ0g7OztrREFFeUIsSyxFQUFPO0FBQzdCLGdCQUFJLE9BQU8sY0FBUCxDQUFzQixTQUF0QixDQUFnQyxTQUFoQyxDQUFKLEVBQWdEO0FBQzVDLHVCQUFPLEtBQUssS0FBTCxDQUFXLFVBQVgsQ0FBc0IsSUFBdEIsQ0FBMkIsRUFBM0IsS0FBa0MsV0FBbEMsR0FDRCxPQUFPLElBQVAsQ0FBWSxlQUFaLEVBQTZCLEVBQUUsWUFBRixFQUE3QixDQURDLEdBRUQsT0FBTyxJQUFQLENBQVksV0FBWixFQUF5QixFQUFFLFlBQUYsRUFBekIsQ0FGTjtBQUdIO0FBQ0QsbUJBQU8sT0FBTyxJQUFQLENBQVksYUFBWixFQUEyQixFQUFFLFlBQUYsRUFBM0IsQ0FBUDtBQUNIOzs7eUNBRWdCO0FBQ2IsZ0JBQUksY0FBYztBQUNkLGlDQUFpQixLQUFLLEtBQUwsQ0FBVyxFQURkO0FBRWQsNkJBQWEsS0FBSyxLQUFMLENBQVcsVUFBWCxDQUFzQixJQUF0QixDQUEyQixFQUYxQjtBQUdkLGtDQUNLLEtBQUssS0FBTCxDQUFXLFVBQVgsQ0FBc0IsSUFBdEIsQ0FBMkIsRUFBM0IsSUFDRyxPQUFPLElBQVAsQ0FBWSxLQUFLLEtBQUwsQ0FBVyxVQUFYLENBQXNCLElBQXRCLENBQTJCLEVBQXZDLENBREosSUFFQSxFQU5VO0FBT2Qsc0JBQU8sS0FBSyxPQUFMLENBQWEsSUFBYixJQUFxQixLQUFLLE9BQUwsQ0FBYSxJQUFiLEVBQXRCLElBQThDLEVBUHRDO0FBUWQsMEJBQVU7QUFSSSxhQUFsQjs7QUFXQSxnQkFBSSxRQUFRLEtBQUssS0FBTCxDQUFXLFVBQVgsQ0FBc0IsS0FBbEM7O0FBRUEsZ0JBQUksVUFBVSxDQUFDLG1CQUFELEVBQXNCLFdBQXRCLENBQWQ7O0FBRUEsZ0JBQUksS0FBSyxRQUFULEVBQW1CO0FBQUE7O0FBQ2YscUNBQVEsSUFBUixpQkFBZ0IsQ0FBQyxRQUFELEVBQVcsUUFBWCxFQUFxQixXQUFyQixFQUFrQyxXQUFsQyxDQUFoQjtBQUNIOztBQUVELGdCQUFJLEtBQUssS0FBTCxLQUFlLE1BQW5CLEVBQTJCO0FBQ3ZCLHdCQUFRLElBQVIsQ0FBYSxNQUFiO0FBQ0g7O0FBRUQsb0JBQVEsS0FBSyxLQUFiO0FBQ0kscUJBQUssYUFBTDtBQUNJLDRCQUFRLElBQVIsQ0FBYSx3Q0FBYjtBQUNBLHdCQUFJLE9BQU8sY0FBUCxDQUFzQixTQUF0QixDQUFnQyxTQUFoQyxDQUFKLEVBQWdEO0FBQzVDLGdDQUFRLElBQVIsQ0FBYSxxQkFBYjtBQUNIO0FBQ0QsZ0NBQVksSUFBWixjQUE0QixPQUFPLElBQVAsQ0FDeEIseUJBRHdCLENBQTVCO0FBR0E7QUFDSixxQkFBSyxNQUFMO0FBQ0ksNEJBQVEsSUFBUixDQUFhLGlCQUFiO0FBQ0EsZ0NBQVksSUFBWixjQUE0QixPQUFPLElBQVAsQ0FBWSxZQUFaLENBQTVCO0FBQ0E7QUFDSixxQkFBSyxTQUFMO0FBQ0ksd0JBQUksS0FBSyxNQUFULEVBQWlCO0FBQ2IsZ0NBQVEsSUFBUixDQUFhLGlCQUFiO0FBQ0g7O0FBRUQsNEJBQVEsSUFBUixDQUFhLGlDQUFiO0FBQ0EsZ0NBQVksSUFBWixjQUE0QixPQUFPLElBQVAsQ0FDeEIsa0JBRHdCLENBQTVCO0FBR0EsZ0NBQVksWUFBWixJQUE0QixPQUFPLElBQVAsQ0FDeEIsdUJBRHdCLEVBRXhCLEVBQUUsWUFBRixFQUZ3QixDQUE1QjtBQUlBO0FBQ0oscUJBQUssUUFBTDtBQUNJLHdCQUFJLEtBQUssTUFBVCxFQUFpQjtBQUNiLGdDQUFRLElBQVIsQ0FBYSxpQkFBYjtBQUNIOztBQUVELDRCQUFRLElBQVIsQ0FBYSwrQkFBYjtBQUNBLGdDQUFZLElBQVosY0FBNEIsS0FBSyxvQkFBTCxFQUE1QjtBQUNBLGdDQUFZLFlBQVosSUFDSSxLQUFLLHlCQUFMLENBQStCLEtBQS9CLENBREo7QUFFQTtBQUNKLHFCQUFLLFVBQUw7QUFDSSx3QkFBSSxPQUFPLGNBQVAsQ0FBc0IsU0FBdEIsQ0FBZ0MsU0FBaEMsQ0FBSixFQUFnRDtBQUM1QyxnQ0FBUSxJQUFSLENBQWEsaUJBQWI7QUFDQSxvQ0FBWSxJQUFaLGNBQTRCLE9BQU8sSUFBUCxDQUN4QixVQUR3QixDQUE1QjtBQUdBLG9DQUFZLElBQVosR0FBbUIsT0FBTyxHQUFQLENBQVcsT0FBTyxNQUFQLENBQWMsYUFBekIsRUFBd0M7QUFDdkQsb0NBQVEsS0FBSyxLQUFMLENBQVcsVUFBWCxDQUFzQixPQUF0QixDQUE4QixDQUE5QixFQUFpQyxFQURjO0FBRXZELHFDQUFTLEtBQUssS0FBTCxDQUFXO0FBRm1DLHlCQUF4QyxDQUFuQjtBQUlBLG9DQUFZLFlBQVosSUFBNEIsT0FBTyxJQUFQLENBQVksZUFBWixFQUE2QjtBQUNyRCx1Q0FBVztBQUQwQyx5QkFBN0IsQ0FBNUI7QUFHQSxvQ0FBWSxNQUFaLEdBQXFCLFFBQXJCO0FBQ0Esb0NBQVksR0FBWixHQUFrQixZQUFsQjtBQUNILHFCQWRELE1BY087QUFDSCxnQ0FBUSxJQUFSLENBQWEseUJBQWI7QUFDQSxvQ0FBWSxJQUFaLGNBQTRCLE9BQU8sSUFBUCxDQUN4QixXQUR3QixDQUE1QjtBQUdBLG9DQUFZLElBQVosR0FBbUIsT0FBTyxHQUFQLENBQVcsT0FBTyxNQUFQLENBQWMsWUFBekIsQ0FBbkI7QUFDSDtBQUNEO0FBQ0oscUJBQUssTUFBTDtBQUNJLHdCQUFJLEtBQUssTUFBVCxFQUFpQjtBQUNiLGdDQUFRLElBQVIsQ0FBYSx1QkFBYjtBQUNIOztBQUVELDRCQUFRLElBQVIsQ0FBYSxpQkFBYjtBQUNBLGdDQUFZLElBQVosY0FBNEIsT0FBTyxJQUFQLENBQVksWUFBWixDQUE1QjtBQUNBLGdDQUFZLFlBQVosSUFBNEIsT0FBTyxJQUFQLENBQVksbUJBQVosRUFBaUM7QUFDekQ7QUFEeUQscUJBQWpDLENBQTVCO0FBR0E7QUFDSixxQkFBSyxRQUFMO0FBQ0ksd0JBQUksS0FBSyxRQUFULEVBQW1CO0FBQ2YsZ0NBQVEsSUFBUixDQUFhLFNBQWI7QUFDSDs7QUFFRCw0QkFBUSxJQUFSLENBQWEscUJBQWI7QUFDQSxnQ0FBWSxJQUFaLGNBQTRCLE9BQU8sSUFBUCxDQUFZLFdBQVosQ0FBNUI7QUFDQSxnQ0FBWSxJQUFaLEdBQW1CLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLFlBQXpCLENBQW5CO0FBQ0E7QUFDSixxQkFBSyxPQUFMO0FBQ0ksNEJBQVEsSUFBUixDQUFhLHdCQUFiO0FBQ0EsOEJBQVUsUUFBUSxNQUFSLENBQWUsVUFBQyxDQUFEO0FBQUEsK0JBQU8sTUFBTSxXQUFiO0FBQUEscUJBQWYsQ0FBVjtBQUNBLGdDQUFZLElBQVosZ0VBQThFLE9BQU8sSUFBUCxDQUMxRSxvQkFEMEUsRUFFMUUsRUFBRSxPQUFPLEVBQVQsRUFGMEUsQ0FBOUU7QUFJQTtBQUNKLHFCQUFLLGNBQUw7QUFDSSw0QkFBUSxJQUFSLENBQWEsK0JBQWI7QUFDQSw4QkFBVSxRQUFRLE1BQVIsQ0FBZSxVQUFDLENBQUQ7QUFBQSwrQkFBTyxNQUFNLFdBQWI7QUFBQSxxQkFBZixDQUFWO0FBQ0EsZ0NBQVksSUFBWixnRUFBOEUsT0FBTyxJQUFQLENBQzFFLDJCQUQwRSxDQUE5RTtBQUdBO0FBQ0oscUJBQUssV0FBTDtBQUNJLDRCQUFRLElBQVIsQ0FBYSw0QkFBYjtBQUNBLDhCQUFVLFFBQVEsTUFBUixDQUFlLFVBQUMsQ0FBRDtBQUFBLCtCQUFPLE1BQU0sV0FBYjtBQUFBLHFCQUFmLENBQVY7QUFDQSxnQ0FBWSxJQUFaLGdFQUE4RSxPQUFPLElBQVAsQ0FDMUUsd0JBRDBFLENBQTlFO0FBR0E7QUFDSixxQkFBSyxTQUFMO0FBQ0ksNEJBQVEsSUFBUixDQUFhLDBCQUFiO0FBQ0EsOEJBQVUsUUFBUSxNQUFSLENBQWUsVUFBQyxDQUFEO0FBQUEsK0JBQU8sTUFBTSxXQUFiO0FBQUEscUJBQWYsQ0FBVjtBQUNBLGdDQUFZLElBQVosZ0VBQThFLE9BQU8sSUFBUCxDQUMxRSxzQkFEMEUsQ0FBOUU7QUFHQTtBQUNKLHFCQUFLLFdBQUw7QUFDSSw0QkFBUSxJQUFSLENBQWEsY0FBYjtBQUNBLGdDQUFZLElBQVosY0FBNEIsT0FBTyxJQUFQLENBQVksV0FBWixDQUE1QjtBQUNBLGdDQUFZLElBQVosR0FBbUIsT0FBTyxHQUFQLENBQVcsT0FBTyxNQUFQLENBQWMsYUFBekIsRUFBd0M7QUFDdkQsZ0NBQVEscUJBRCtDO0FBRXZELGlDQUFTLEtBQUssS0FBTCxDQUFXO0FBRm1DLHFCQUF4QyxDQUFuQjtBQUlBLGdDQUFZLE1BQVosR0FBcUIsUUFBckI7QUFDQSxnQ0FBWSxHQUFaLEdBQWtCLFlBQWxCO0FBQ0E7QUFDSixxQkFBSyxTQUFMO0FBQ0ksNEJBQVEsSUFBUixDQUFhLFlBQWI7QUFDQSxnQ0FBWSxJQUFaLGNBQTRCLE9BQU8sSUFBUCxDQUFZLFNBQVosQ0FBNUI7QUFDQSxnQ0FBWSxJQUFaLEdBQW1CLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLGFBQXpCLEVBQXdDO0FBQ3ZELGdDQUFRLGlCQUQrQztBQUV2RCxpQ0FBUyxLQUFLLEtBQUwsQ0FBVztBQUZtQyxxQkFBeEMsQ0FBbkI7QUFJQSxnQ0FBWSxNQUFaLEdBQXFCLFFBQXJCO0FBQ0EsZ0NBQVksR0FBWixHQUFrQixZQUFsQjtBQUNBO0FBQ0oscUJBQUssVUFBTDtBQUNJLHdCQUFJLEtBQUssTUFBVCxFQUFpQjtBQUNiLGdDQUFRLElBQVIsQ0FBYSx1QkFBYjtBQUNIOztBQUVELDRCQUFRLElBQVIsQ0FBYSxhQUFiO0FBQ0EsZ0NBQVksSUFBWixjQUE0QixPQUFPLElBQVAsQ0FBWSxVQUFaLENBQTVCO0FBQ0EsZ0NBQVksSUFBWixHQUFtQixPQUFPLEdBQVAsQ0FBVyxPQUFPLE1BQVAsQ0FBYyxhQUF6QixFQUF3QztBQUN2RCxnQ0FBUSxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsZ0JBQWYsQ0FEK0M7QUFFdkQsaUNBQVMsS0FBSyxLQUFMLENBQVc7QUFGbUMscUJBQXhDLENBQW5CO0FBSUE7QUFDSixxQkFBSyxTQUFMO0FBQ0ksd0JBQUksS0FBSyxNQUFULEVBQWlCO0FBQ2IsNEJBQUksYUFBYSxFQUFFLE9BQU8sdUJBQVQsQ0FBakI7QUFDQSxtQ0FBVyxHQUFYLENBQWUsT0FBZixFQUF3QixTQUF4QjtBQUNBLG9DQUFZLElBQVosR0FBbUIsVUFBbkI7QUFDQTtBQUNIOztBQUVELDRCQUFRLElBQVIsQ0FBYSxtQkFBYjtBQUNBLGdDQUFZLFFBQVosR0FBdUIsSUFBdkI7QUFDQSxnQ0FBWSxJQUFaLEdBQ0ksaURBREo7QUFFQTtBQTFKUjs7QUE2SkEsbUNBQW9CLFFBQVEsSUFBUixDQUFhLEdBQWIsQ0FBcEI7O0FBRUEsbUJBQU8sV0FBUDtBQUNIOzs7NEJBM1JjO0FBQ1gsbUJBQU8sS0FBSyxJQUFMLEtBQWMsUUFBckI7QUFDSDs7OzRCQUVZO0FBQ1QsbUJBQU8sS0FBSyxJQUFMLEtBQWMsTUFBckI7QUFDSDs7OzRCQUVXO0FBQ1IsbUJBQU8sS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLFlBQWYsQ0FBUDtBQUNIOzs7O0VBL0IwQyxTQUFTLEk7O3FCQUFuQyxpQjs7Ozs7Ozs7Ozs7OztBQ0FyQjs7OztBQUVBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7OztJQUVxQixTOzs7Ozs0QkFDRDtBQUNaLG1CQUFPLHVCQUFQO0FBQ0g7OztBQUlELDZCQUErQztBQUFBLFlBQWpDLFdBQWlDLFFBQWpDLFdBQWlDO0FBQUEsaUNBQXBCLFFBQW9CO0FBQUEsWUFBcEIsUUFBb0IsaUNBQVQsS0FBUzs7QUFBQTs7QUFBQSwySEFDbEMsU0FEa0M7O0FBQUEsY0FGL0MsUUFFK0MsR0FGcEMsc0JBRW9DOztBQUUzQyxjQUFLLE1BQUwsR0FBYyxFQUFkOztBQUVBLGNBQUssV0FBTCxHQUFtQixXQUFuQjtBQUNBLGNBQUssUUFBTCxHQUFnQixRQUFoQjs7QUFFQSxjQUFLLE1BQUw7QUFQMkM7QUFROUM7Ozs7aUNBRVE7QUFBQSxnQkFDRyxLQURILEdBQ29DLElBRHBDLENBQ0csS0FESDtBQUFBLGdCQUNVLFdBRFYsR0FDb0MsSUFEcEMsQ0FDVSxXQURWO0FBQUEsZ0JBQ3VCLFFBRHZCLEdBQ29DLElBRHBDLENBQ3VCLFFBRHZCOzs7QUFHTCxpQkFBSyxHQUFMLENBQVMsS0FBVDs7QUFFQSxpQkFBSyxNQUFMLENBQVksT0FBWixDQUFvQixVQUFDLElBQUQ7QUFBQSx1QkFBVSxLQUFLLE1BQUwsRUFBVjtBQUFBLGFBQXBCO0FBQ0EsaUJBQUssTUFBTCxHQUFjLEVBQWQ7O0FBRUEsZ0JBQU0sT0FBTyxFQUNULEtBQUssUUFBTCxDQUFjO0FBQ1YsNkJBQWEsT0FBTyxjQUFQLENBQXNCLFNBQXRCLENBQWdDLFNBQWhDLElBQ1AsUUFETyxHQUVQO0FBSEksYUFBZCxDQURTLENBQWI7O0FBUUE7QUFDQSxnQkFBSSxLQUFLLEtBQUwsQ0FBVyxhQUFmLEVBQThCO0FBQzFCLHFCQUFLLEdBQUwsQ0FBUyxRQUFULENBQWtCLGFBQWxCO0FBQ0g7O0FBRUQsZ0JBQUksQ0FBQyxPQUFPLGNBQVAsQ0FBc0IsU0FBdEIsQ0FBZ0MsU0FBaEMsQ0FBTCxFQUFpRDtBQUM3QyxxQkFBSyxNQUFMLENBQVksSUFBWixDQUNLLEtBQUssY0FBTCxHQUFzQixJQUFJLDJCQUFKLENBQW1CO0FBQ3RDLGdDQURzQztBQUV0Qyx3QkFBSSxLQUFLLElBQUwsQ0FBVSxpQkFBVjtBQUZrQyxpQkFBbkIsQ0FEM0I7QUFNSDs7QUFFRCxpQkFBSyxNQUFMLENBQVksSUFBWixDQUNLLEtBQUssS0FBTCxHQUFhLElBQUksa0JBQUosQ0FBVTtBQUNwQiw0QkFEb0I7QUFFcEIsb0JBQUksS0FBSyxJQUFMLENBQVUsYUFBVixDQUZnQjtBQUdwQix3Q0FIb0I7QUFJcEI7QUFKb0IsYUFBVixDQURsQjs7QUFTQSxpQkFBSyxNQUFMLENBQVksSUFBWixDQUNLLEtBQUssU0FBTCxHQUFpQixJQUFJLHNCQUFKLENBQWM7QUFDNUIsNEJBRDRCO0FBRTVCLG9CQUFJLEtBQUssSUFBTCxDQUFVLFlBQVY7QUFGd0IsYUFBZCxDQUR0Qjs7QUFPQSxpQkFBSyxNQUFMLENBQVksSUFBWixDQUNLLEtBQUssaUJBQUwsR0FBeUIsSUFBSSw4QkFBSixDQUFzQjtBQUM1Qyw0QkFENEM7QUFFNUMsb0JBQUksS0FBSyxJQUFMLENBQVUsY0FBVjtBQUZ3QyxhQUF0QixDQUQ5Qjs7QUFPQSxnQkFDSSxDQUFDLE9BQU8sY0FBUCxDQUFzQixTQUF0QixDQUFnQyxnQkFBaEMsQ0FBRCxJQUNBLEVBQ0ksT0FBTyxjQUFQLENBQXNCLFNBQXRCLENBQWdDLGlCQUFoQyxLQUNBLEtBQUssS0FBTCxDQUFXLFVBRmYsQ0FEQSxJQUtBLENBQUMsT0FBTyxjQUFQLENBQXNCLFNBQXRCLENBQWdDLGlCQUFoQyxDQU5MLEVBT0U7QUFDRSxxQkFBSyxNQUFMLENBQVksSUFBWixDQUNLLEtBQUssY0FBTCxHQUFzQixJQUFJLDJCQUFKLENBQW1CO0FBQ3RDLGdDQURzQztBQUV0Qyx3QkFBSSxLQUFLLElBQUwsQ0FBVSxnQkFBVixDQUZrQztBQUd0QywwQkFBTTtBQUhnQyxpQkFBbkIsRUFJcEIsTUFKb0IsRUFEM0I7QUFPSDs7QUFFRCxpQkFBSyxHQUFMLENBQVMsTUFBVCxDQUFnQixJQUFoQjs7QUFFQSxtQkFBTyxJQUFQO0FBQ0g7OztpQ0FFUTtBQUNMLGlCQUFLLE1BQUwsQ0FBWSxPQUFaLENBQW9CLFVBQUMsSUFBRDtBQUFBLHVCQUFVLEtBQUssTUFBTCxFQUFWO0FBQUEsYUFBcEI7QUFDQTtBQUNIOzs7O0VBL0ZrQyxTQUFTLEk7O3FCQUEzQixTOzs7Ozs7Ozs7Ozs7O0FDUnJCOzs7O0FBQ0E7Ozs7QUFFQTs7OztBQUNBOzs7Ozs7Ozs7Ozs7OztBQUNBLElBQU0sS0FBSyxRQUFRLElBQVIsQ0FBWDtBQUNBOztJQUNxQixtQjs7O0FBRWpCLHVDQUE4RjtBQUFBLFlBQWhGLEdBQWdGLFFBQWhGLEdBQWdGO0FBQUEsWUFBM0UscUJBQTJFLFFBQTNFLHFCQUEyRTtBQUFBLFlBQXBELElBQW9ELFFBQXBELElBQW9EO0FBQUEsWUFBOUMsVUFBOEMsUUFBOUMsVUFBOEM7QUFBQSxZQUFsQyxXQUFrQyxRQUFsQyxXQUFrQztBQUFBLFlBQXJCLFFBQXFCLFFBQXJCLFFBQXFCO0FBQUEsWUFBWCxPQUFXLFFBQVgsT0FBVzs7QUFBQTs7QUFBQSwrSUFDakYsU0FEaUY7O0FBRzFGLGNBQUssTUFBTCxHQUFzQixFQUF0Qjs7QUFFQSxjQUFLLEdBQUwsR0FBc0IsR0FBdEI7QUFDQSxjQUFLLElBQUwsR0FBc0IsUUFBUSxzQkFBOUI7QUFDQSxjQUFLLFVBQUwsR0FBc0IsRUFBRSxNQUFGLENBQVMsRUFBVCxFQUFhLFVBQWIsQ0FBdEI7QUFDQSxjQUFLLFdBQUwsR0FBc0IsV0FBdEI7QUFDQSxjQUFLLFFBQUwsR0FBc0IsUUFBdEI7QUFDQSxjQUFLLE9BQUwsR0FBc0IsT0FBdEI7O0FBRUEsY0FBSyxZQUFMLEdBQXNCLElBQUkseUJBQUosQ0FBaUIsRUFBRSxLQUFLLE1BQUssR0FBWixFQUFpQixnQkFBakIsRUFBakIsQ0FBdEI7O0FBRUEsY0FBSyxRQUFMLENBQWMsTUFBSyxVQUFuQixFQUErQixjQUEvQixFQUErQyxNQUFLLGtCQUFwRDs7QUFFQTtBQUNBO0FBQ0E7QUFDQSxZQUFJLHlCQUF5QixPQUFPLFNBQVAsQ0FBaUIsZUFBMUMsSUFBNkQsT0FBTyxTQUFQLENBQWlCLGNBQWxGLEVBQWtHO0FBQzlGLGtDQUNLLFlBREwsR0FFSyxJQUZMLENBRVUsVUFBQyxVQUFELEVBQWdCO0FBQ2xCLHNCQUFLLGtCQUFMLENBQXdCLFVBQXhCO0FBQ0gsYUFKTDtBQUtIOztBQUVELGNBQUssTUFBTDtBQTNCMEY7QUE0QjdGOzs7O2tEQUtxQztBQUFBLGdCQUFqQixNQUFpQixTQUFqQixNQUFpQjtBQUFBLGdCQUFULEtBQVMsU0FBVCxLQUFTOztBQUNsQyxpQkFBSyxZQUFMLENBQWtCLE9BQWxCLENBQTBCLE1BQTFCLEVBQWtDLEtBQWxDO0FBQ0g7OzsyQ0FFa0IsVSxFQUFZO0FBQUE7O0FBQzNCLGdCQUFJLE1BQU0sRUFBVjtBQUNBLGNBQUUsRUFBRSxNQUFGLENBQVMsVUFBVCxDQUFGLEVBQXdCLElBQXhCLENBQTZCLFVBQUMsSUFBRCxFQUFVO0FBQ25DLG9CQUFJLEVBQUUsT0FBRixDQUFVLElBQVYsQ0FBSixFQUFxQjtBQUFBOztBQUNqQixpQ0FBSSxJQUFKLGdDQUFZLElBQVo7QUFDSCxpQkFGRCxNQUVPLElBQUksRUFBRSxRQUFGLENBQVcsSUFBWCxDQUFKLEVBQXNCO0FBQUE7O0FBQ3pCLGtDQUFJLElBQUosaUNBQVksRUFBRSxJQUFGLENBQU8sSUFBUCxFQUFhLEdBQWIsQ0FBaUIsTUFBakIsQ0FBWjtBQUNILGlCQUZNLE1BRUE7QUFDSCx3QkFBSSxJQUFKLENBQVMsSUFBVDtBQUNIO0FBQ0osYUFSRDtBQVNBLGtCQUFNLEVBQUUsSUFBRixDQUFPLEdBQVAsQ0FBTjs7QUFFQSxnQkFBSSxPQUFKLENBQVksVUFBQyxFQUFELEVBQVE7QUFDaEIsb0JBQU0sUUFBUSxPQUFLLFVBQUwsQ0FBZ0IsR0FBaEIsQ0FBb0IsRUFBcEIsQ0FBZDs7QUFFQSxvQkFBSSxLQUFKLEVBQVc7QUFDUCwwQkFBTSxpQkFBTixDQUF3QixVQUF4QjtBQUNIO0FBQ0osYUFORDs7QUFRQSxpQkFBSyx1QkFBTDtBQUNIOzs7aUNBRVE7QUFBQTs7QUFDTCxnQkFBSSxPQUFPLFNBQVMsc0JBQVQsRUFBWDs7QUFFQSxpQkFBSyxNQUFMLENBQVksT0FBWixDQUFvQixVQUFDLElBQUQ7QUFBQSx1QkFBVSxLQUFLLE1BQUwsRUFBVjtBQUFBLGFBQXBCO0FBQ0EsaUJBQUssTUFBTCxHQUFjLEVBQWQ7O0FBRUEsaUJBQUssVUFBTCxDQUFnQixPQUFoQixDQUF3QixVQUFDLEtBQUQsRUFBVzs7QUFFL0Isc0JBQU0sR0FBTixDQUFVLE9BQVYsRUFBbUIsR0FBRyxNQUFILENBQVUsTUFBTSxHQUFOLENBQVUsT0FBVixDQUFWLENBQW5COztBQUVBLHNCQUFNLFVBQU4sQ0FBaUIsT0FBSyxPQUF0Qjs7QUFFQSxvQkFBSSxPQUFPLElBQUksT0FBSyxJQUFULENBQWM7QUFDckIsMkJBQWMsS0FETztBQUVyQix5QkFBYyxPQUFLLEdBRkU7QUFHckIsaUNBQWMsT0FBSyxXQUhFO0FBSXJCLDhCQUFjLE9BQUs7QUFKRSxpQkFBZCxDQUFYOztBQU9BLHFCQUFLLFdBQUwsQ0FDSSxFQUFFLFFBQUYsRUFBWTtBQUNSLDZCQUFPO0FBREMsaUJBQVosRUFFRyxNQUZILENBRVUsS0FBSyxHQUZmLEVBRW9CLENBRnBCLENBREo7O0FBTUEsdUJBQUssTUFBTCxDQUFZLElBQVosQ0FBaUIsSUFBakI7QUFDSCxhQXBCRDs7QUFzQkEsZ0JBQUksQ0FBQyxPQUFPLGNBQVAsQ0FBc0IsU0FBdEIsQ0FBZ0MsNkJBQWhDLENBQUwsRUFBb0U7QUFDaEU7QUFDQTtBQUNBLG9CQUFNLG1CQUFtQixFQUFFLDZCQUFGLENBQXpCO0FBQ0EscUJBQUssR0FBTCxDQUFTLElBQVQsQ0FBYyxLQUFLLFVBQW5CO0FBQ0EscUJBQUssR0FBTCxDQUFTLEtBQVQsR0FBaUIsTUFBakIsQ0FBd0IsZ0JBQXhCLEVBQTBDLE1BQTFDLENBQWlELElBQWpEO0FBQ0gsYUFORCxNQU1PO0FBQ0gscUJBQUssR0FBTCxDQUFTLElBQVQsQ0FBYyxLQUFLLFVBQW5CO0FBQ0EscUJBQUssR0FBTCxDQUFTLEtBQVQsR0FBaUIsTUFBakIsQ0FBd0IsSUFBeEI7QUFDSDtBQUNKOzs7aUNBRVE7QUFDTCxpQkFBSyxNQUFMLENBQVksT0FBWixDQUFvQixVQUFDLElBQUQ7QUFBQSx1QkFBVSxLQUFLLE1BQUwsRUFBVjtBQUFBLGFBQXBCO0FBQ0E7QUFDSDs7O2tEQUV5QjtBQUN0QixnQkFBSSxPQUFPLFNBQVAsQ0FBaUIsZUFBakIsSUFBb0MsT0FBTyxTQUFQLENBQWlCLGNBQXJELElBQXVFLHlCQUFZLEdBQVosQ0FBZ0IsUUFBaEIsQ0FBM0UsRUFBc0c7QUFDbEcsb0JBQU0sa0JBQWtCLElBQUksbUNBQUosQ0FBMkIsS0FBSyxVQUFoQyxFQUE0QyxLQUFLLEdBQWpELENBQXhCO0FBQ0EsZ0NBQWdCLGFBQWhCO0FBQ0EsdUJBQU8sZUFBUCxHQUF5QixlQUF6QjtBQUNIO0FBQ0o7Ozs0QkFuRmE7QUFDVixtQkFBTyxJQUFQO0FBQ0g7Ozs7RUFqQzRDLFNBQVMsSTs7cUJBQXJDLG1COzs7Ozs7OztBQ1ByQixJQUFNLFdBQVcsT0FBTyxRQUF4Qjs7QUFFQSxJQUFNLGlCQUFpQixTQUFTLElBQVQsQ0FBYyxNQUFkLENBQXFCO0FBQ3hDLGNBRHdDLHdCQUMzQjtBQUNULGFBQUssUUFBTCxDQUFjLEtBQUssS0FBbkIsRUFBMEIsUUFBMUIsRUFBb0MsS0FBSyxNQUF6Qzs7QUFFQSxhQUFLLGVBQUwsR0FBdUIsRUFBRSxTQUFGLENBQXZCOztBQUVBLGFBQUssTUFBTDtBQUNILEtBUHVDO0FBU3hDLFVBVHdDLG9CQVMvQjtBQUNMLFlBQU0sSUFBSSxLQUFLLFdBQUwsRUFBVjs7QUFFQSxhQUFLLGVBQUwsR0FBdUIsRUFBRSxTQUFGLEVBQWEsRUFBRSxTQUFmLEVBQTBCLE1BQTFCLENBQ25CLEVBQUUsT0FBRixFQUFXLEVBQUUsSUFBYixDQURtQixDQUF2QjtBQUdBLGFBQUssR0FBTCxDQUFTLElBQVQsQ0FBYyxLQUFLLGVBQW5CO0FBQ0EsYUFBSyxHQUFMLENBQVMsSUFBVCxDQUFjLGFBQWQsRUFBNkIsTUFBN0I7O0FBRUEsZUFBTyxJQUFQO0FBQ0gsS0FuQnVDO0FBcUJ4QyxlQXJCd0MseUJBcUIxQjtBQUNWLFlBQUksU0FBUztBQUNULHVCQUFXO0FBQ1AseUJBQVMsQ0FBQyxrQkFBRCxFQUFxQixXQUFyQjtBQURGLGFBREY7QUFJVCxrQkFBTTtBQUNGLHNCQUFNLEVBREo7QUFFRixzQkFBTSxLQUFLLEtBQUwsQ0FBVyxlQUZmO0FBR0YsMEJBQVUsQ0FBQztBQUhUO0FBSkcsU0FBYjs7QUFXQSxhQUFLLE1BQUwsR0FBYyxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsWUFBZixDQUFkOztBQUVBLGdCQUFRLEtBQUssTUFBYjtBQUNJLGlCQUFLLGFBQUw7QUFDSSx1QkFBTyxTQUFQLENBQWlCLE9BQWpCLENBQXlCLElBQXpCLENBQ0ksa0NBREo7QUFHQSx1QkFBTyxJQUFQLENBQVksSUFBWixHQUFtQixPQUFPLElBQVAsQ0FBWSx5QkFBWixDQUFuQjtBQUNBO0FBQ0osaUJBQUssTUFBTDtBQUNJLHVCQUFPLFNBQVAsQ0FBaUIsT0FBakIsQ0FBeUIsSUFBekIsQ0FDSSw4Q0FESjtBQUdBLHVCQUFPLElBQVAsQ0FBWSxJQUFaLEdBQW1CLE9BQU8sSUFBUCxDQUFZLHVCQUFaLENBQW5CO0FBQ0E7QUFDSixpQkFBSyxRQUFMO0FBQ0ksdUJBQU8sU0FBUCxDQUFpQixPQUFqQixDQUF5QixJQUF6QixDQUNJLGdEQURKO0FBR0EsdUJBQU8sSUFBUCxDQUFZLElBQVosR0FBbUIsT0FBTyxJQUFQLENBQVksdUJBQVosQ0FBbkI7QUFDQTtBQUNKLGlCQUFLLFVBQUw7QUFDQSxpQkFBSyxVQUFMO0FBQ0EsaUJBQUssV0FBTDtBQUNBLGlCQUFLLFNBQUw7QUFDSSx1QkFBTyxTQUFQLENBQWlCLE9BQWpCLENBQXlCLElBQXpCLENBQ0ksa0RBREo7QUFHQSx1QkFBTyxJQUFQLENBQVksSUFBWixHQUFtQixPQUFPLElBQVAsQ0FBWSxVQUFaLENBQW5CO0FBQ0E7QUFDSixpQkFBSyxNQUFMO0FBQ0ksdUJBQU8sU0FBUCxDQUFpQixPQUFqQixDQUF5QixJQUF6QixDQUE4QiwyQkFBOUI7QUFDQSx1QkFBTyxJQUFQLENBQVksSUFBWixHQUFtQixLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsbUJBQWYsSUFDYixPQUFPLElBQVAsQ0FBWSx3QkFBWixDQURhLEdBRWIsT0FBTyxJQUFQLENBQVksc0JBQVosQ0FGTjtBQUdBO0FBQ0osaUJBQUssUUFBTDtBQUNJLHVCQUFPLFNBQVAsQ0FBaUIsT0FBakIsQ0FBeUIsSUFBekIsQ0FBOEIsNkJBQTlCO0FBQ0EsdUJBQU8sSUFBUCxDQUFZLElBQVosR0FBbUIsT0FBTyxJQUFQLENBQVksUUFBWixDQUFuQjtBQUNBO0FBQ0osaUJBQUssU0FBTDtBQUNJLHVCQUFPLFNBQVAsQ0FBaUIsT0FBakIsR0FBMkIsS0FBSyxlQUFMLENBQ3RCLElBRHNCLENBQ2pCLE9BRGlCLEVBRXRCLEtBRnNCLENBRWhCLEdBRmdCLENBQTNCO0FBR0EsdUJBQU8sSUFBUCxDQUFZLElBQVosR0FBbUIsS0FBSyxlQUFMLENBQXFCLElBQXJCLENBQTBCLFNBQTFCLEVBQXFDLElBQXJDLEVBQW5CO0FBQ0E7QUEzQ1I7O0FBOENBLGVBQU8sU0FBUCxZQUF5QixPQUFPLFNBQVAsQ0FBaUIsT0FBakIsQ0FBeUIsSUFBekIsQ0FBOEIsR0FBOUIsQ0FBekI7O0FBRUEsZUFBTyxNQUFQO0FBQ0g7QUFwRnVDLENBQXJCLENBQXZCOztxQkF1RmUsYzs7Ozs7Ozs7Ozs7QUN6RmY7Ozs7Ozs7Ozs7OztJQUVxQixjOzs7Ozs0QkFDRztBQUNoQixtQkFBTyxLQUFLLFFBQUwsS0FBa0IsU0FBbEIsR0FBOEIsRUFBOUIsR0FBbUMsb0JBQTFDO0FBQ0g7Ozs0QkFFZTtBQUNaLGdCQUFNLFFBQVEsS0FBSyxLQUFMLENBQVcsVUFBWCxDQUFzQixLQUFwQztBQUNBLG1CQUFPLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxlQUFmLE1BQW9DLGFBQXBDLEdBQ0QsT0FBTyxJQUFQLENBQVksb0JBQVosRUFBa0MsRUFBRSxZQUFGLEVBQWxDLENBREMsR0FFRCxPQUFPLElBQVAsQ0FBWSx5QkFBWixFQUF1QyxFQUFFLFlBQUYsRUFBdkMsQ0FGTjtBQUdIOzs7NEJBRWU7QUFDWixtQkFBTyxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsZUFBZixNQUFvQyxhQUFwQyxHQUNELGdCQURDLEdBRUQsc0JBRk47QUFHSDs7OzRCQUVVO0FBQ1AsZ0JBQUksS0FBSyxJQUFMLEtBQWMsV0FBbEIsRUFBK0I7QUFDM0IsdUJBQU8sRUFBUDtBQUNIO0FBQ0QsbUJBQU8sS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLGVBQWYsTUFBb0MsYUFBcEMsR0FDRCxPQUFPLElBQVAsQ0FBWSxlQUFaLENBREMsR0FFRCxPQUFPLElBQVAsQ0FBWSxvQkFBWixDQUZOO0FBR0g7Ozs0QkFFUTtBQUNMLGdCQUFNLFFBQVEsS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLGVBQWYsTUFBb0MsYUFBbEQ7QUFDQSxnQkFBSSxLQUFKLEVBQVc7QUFDUCx1QkFBTztBQUNILDZCQUFTLEtBQUssS0FBTCxDQUFXLFVBQVgsQ0FBc0IsRUFENUI7QUFFSCxnQ0FBWSxLQUFLLEtBQUwsQ0FBVyxVQUFYLENBQXNCLElBQXRCLENBQTJCO0FBRnBDLGlCQUFQO0FBSUg7QUFDRCxtQkFBTyxJQUFQO0FBQ0g7OztBQUVELGtDQUFnQztBQUFBLFlBQWxCLElBQWtCLFFBQWxCLElBQWtCO0FBQUEsWUFBWixRQUFZLFFBQVosUUFBWTs7QUFBQTs7QUFBQSxxSUFDbkIsU0FEbUI7O0FBRTVCLGNBQUssSUFBTCxHQUFZLFFBQVEsV0FBcEI7QUFDQSxjQUFLLFFBQUwsR0FBZ0IsWUFBWSxTQUE1Qjs7QUFFQSxjQUFLLFFBQUwsQ0FBYyxNQUFLLEtBQW5CLEVBQTBCLHNCQUExQixFQUFrRCxNQUFLLE1BQXZEO0FBQ0EsY0FBSyxJQUFMLEdBQVksUUFBUSxXQUFwQjtBQU40QjtBQU8vQjs7OztpQ0FFUTtBQUNMLG1CQUFPLEVBQUUsT0FBTyxjQUFULEVBQVA7QUFDSDs7O2lDQUVRO0FBQ0wsZ0JBQUksQ0FBQyxLQUFLLEVBQU4sSUFBWSxLQUFLLEdBQUwsQ0FBUyxNQUFULEdBQWtCLENBQWxDLEVBQXFDO0FBQ2pDLHVCQURpQyxDQUN6QjtBQUNYOztBQUVEO0FBQ0EsZ0JBQU0sZUFDRixLQUFLLEVBQUwsQ0FBUSxhQUFSLENBQXNCLGlCQUF0QixNQUE2QyxTQUFTLGFBRDFEOztBQUdBLGlCQUFLLEdBQUwsQ0FBUyxLQUFUOztBQUVBLGdCQUFNLGFBQWEsaUNBQXVCO0FBQ3RDLG9CQUFJLEtBQUssRUFENkI7QUFFdEMsK0JBQWUsS0FBSyxhQUZrQjtBQUd0QywyQkFBVyxLQUFLLFNBSHNCO0FBSXRDLDJCQUFXLEtBQUssU0FKc0I7QUFLdEMsc0JBQU0sS0FBSyxJQUwyQjtBQU10QyxzQ0FBc0IsT0FBTyxTQUFQLENBQWlCLGNBQWpCLEdBQ2hCLEVBRGdCLEdBRWhCO0FBUmdDLGFBQXZCLENBQW5COztBQVdBLGlCQUFLLEdBQUwsQ0FBUyxNQUFULENBQWdCLFVBQWhCOztBQUVBLGdCQUFJLFlBQUosRUFBa0I7QUFDZCxxQkFBSyxFQUFMLENBQVEsYUFBUixDQUFzQixpQkFBdEIsRUFBeUMsS0FBekM7QUFDSDs7QUFFRCxtQkFBTyxJQUFQO0FBQ0g7Ozt1Q0FFYztBQUNYLGlCQUFLLEtBQUwsQ0FBVyxPQUFYLENBQW1CLGNBQW5CLEVBQW1DO0FBQy9CLHdCQUFRLE1BRHVCO0FBRS9CLHVCQUFPLEtBQUs7QUFGbUIsYUFBbkM7QUFJQSxnQkFBSSxDQUFDLE9BQU8sU0FBUCxDQUFpQixjQUF0QixFQUFzQztBQUNsQyxxQkFBSyxRQUFMO0FBQ0g7QUFDSjs7O21DQUVVO0FBQ1AsaUJBQUssR0FBTCxDQUNLLElBREwsQ0FDVSxHQURWLEVBRUssV0FGTCxDQUVpQiw2QkFGakIsRUFHSyxRQUhMLENBR2Msb0JBSGQ7QUFJSDs7OztFQWpHdUMsU0FBUyxJOztxQkFBaEMsYzs7Ozs7Ozs7Ozs7Ozs7Ozs7SUNGQSxhOzs7Ozs7Ozs7Ozs0QkFDRjtBQUNYLG1CQUFPO0FBQ0gsMENBQTBCLEtBRHZCO0FBRUgsK0JBQTBCLENBRnZCO0FBR0gsdUJBQTBCLE1BSHZCO0FBSUgsMEJBQTBCLEtBSnZCLENBSTZCO0FBSjdCLGFBQVA7QUFNSDs7OzRCQUVZO0FBQ1QsZ0JBQUksZ0JBQWdCLEtBQUssR0FBTCxDQUFTLGVBQVQsQ0FBcEI7QUFDQSxnQkFBSSxLQUFLLEdBQUwsQ0FBUyxPQUFULE1BQXNCLFNBQTFCLEVBQXFDOztBQUVqQyxvQkFBSSxzQkFBdUIsaUJBQWlCLEtBQUssRUFBdEIsQ0FBM0I7O0FBRUEsdUJBQU87QUFDSCwwQkFBTSxDQUFDLGdCQUFnQixtQkFBakIsS0FBeUMsS0FBSyxFQUE5QyxDQURIO0FBRUgsMkJBQU8sS0FBSyxJQUFMLENBQVUsc0JBQXNCLEVBQWhDO0FBRkosaUJBQVA7QUFJSDtBQUNELG1CQUFPO0FBQ0gsc0JBQU07QUFESCxhQUFQO0FBR0g7O0FBRUQ7Ozs7NEJBQ1k7QUFDUjtBQUNBLGdCQUFJLFlBQVksRUFBaEI7QUFDQSxhQUFDLENBQUMsS0FBSyxNQUFMLENBQVksSUFBZCxJQUFzQixLQUFLLE1BQUwsQ0FBWSxJQUFaLEdBQW1CLENBQXpDLElBQStDLFVBQVUsSUFBVixDQUFlLE9BQU8sSUFBUCxDQUFZLDBCQUFaLEVBQXlDLEVBQUUsTUFBTSxLQUFLLE1BQUwsQ0FBWSxJQUFwQixFQUF6QyxDQUFmLENBQS9DO0FBQ0EsYUFBQyxDQUFDLEtBQUssTUFBTCxDQUFZLEtBQWQsSUFBdUIsS0FBSyxNQUFMLENBQVksS0FBWixHQUFvQixDQUEzQyxJQUFnRCxVQUFVLElBQVYsQ0FBZSxPQUFPLElBQVAsQ0FBWSwyQkFBWixFQUF5QyxFQUFFLE1BQU0sS0FBSyxNQUFMLENBQVksS0FBcEIsRUFBekMsQ0FBZixDQUFoRDs7QUFFQSxtQkFBTyxPQUFPLElBQVAsQ0FBWSxtQkFBWixFQUFpQyxFQUFFLE1BQU0sVUFBVSxJQUFWLENBQWUsR0FBZixDQUFSLEVBQWpDLENBQVA7QUFFSDs7OztFQW5Dc0MsU0FBUyxLOztxQkFBL0IsYTs7Ozs7Ozs7Ozs7OztBQ0FyQjs7OztBQUNBOzs7O0FBQ0E7O0FBQ0E7Ozs7Ozs7Ozs7SUFFcUIsSzs7Ozs7bUNBS047QUFDUCxtQkFBTztBQUNILG9CQUFJLENBREQ7QUFFSCxrQ0FBa0IsSUFGZjtBQUdILHVCQUFPLE9BSEo7QUFJSCxnQ0FBZ0IsQ0FKYjtBQUtILHlCQUFTLEVBTE47QUFNSCx5QkFBUyxLQU5OO0FBT0gsNEJBQVksS0FQVDtBQVFILG1DQUFtQixLQVJoQjtBQVNILDZCQUFhLEtBVFY7QUFVSCw0QkFBWSxHQVZUO0FBV0gsZ0NBQWdCLENBWGI7QUFZSCxpQ0FBaUIsQ0FaZDtBQWFILDRCQUFZLENBYlQ7QUFjSCw0QkFBWSxDQWRUO0FBZUgsNkJBQWEsQ0FmVjtBQWdCSCxpQ0FBaUIsQ0FoQmQ7QUFpQkgscUNBQXFCLENBakJsQjtBQWtCSCx5Q0FBeUIsQ0FsQnRCO0FBbUJILHNDQUFzQixFQW5CbkI7QUFvQkgsa0NBQWtCLEVBcEJmO0FBcUJILDZCQUFhLEVBckJWO0FBc0JILHdCQUFRLEVBdEJMLEVBc0JTO0FBQ1osMkJBQVcsRUF2QlIsRUF1Qlk7QUFDZixzQkFBTSxFQUFFLElBQUksT0FBTixFQXhCSCxFQXdCb0I7QUFDdkIsd0JBQVEsRUF6QkwsRUF5QlM7QUFDWix1Q0FBdUIsQ0ExQnBCO0FBMkJILHlCQUFTO0FBQ0wsbUNBQWU7QUFEVixpQkEzQk47QUE4Qkg7QUFDQSw0QkFBWSxTQS9CVDtBQWdDSCwrQkFBZSxhQWhDWjtBQWlDSCw2QkFBYSxLQWpDVjtBQWtDSCxnQ0FBZ0IsSUFsQ2I7QUFtQ0gsMEJBQVUsS0FuQ1A7QUFvQ0gsZ0NBQWdCLEtBcENiO0FBcUNILDRCQUFZLEtBckNUO0FBc0NILHNDQUFzQjtBQXRDbkIsYUFBUDtBQXdDSDs7O21DQU1VLE8sRUFBUztBQUNoQixpQkFBSyxPQUFMLEdBQWUsT0FBZjtBQUNIOzs7NEJBckRpQjtBQUNkLG1CQUFPLElBQVA7QUFDSDs7OzRCQTZDbUI7QUFDaEIsbUJBQU8sS0FBSyxHQUFMLENBQVMsYUFBVCxDQUFQO0FBQ0g7OztBQU1ELG1CQUFZLEtBQVosRUFBbUIsT0FBbkIsRUFBNEIsT0FBNUIsRUFBcUM7QUFBQTs7QUFBQSxtQkFDWCxXQUFXLEVBREE7QUFBQSxZQUMzQixXQUQyQixRQUMzQixXQUQyQjs7QUFBQSxrSEFHM0IsS0FIMkIsRUFHcEIsT0FIb0I7O0FBS2pDLGNBQUssVUFBTCxDQUFnQixPQUFoQjs7QUFFQSxjQUFLLEdBQUwsQ0FDSSxFQUFFLE1BQUYsQ0FBUyxFQUFULEVBQWEsS0FBYixFQUFvQixFQUFFLFlBQVksTUFBSyxTQUFMLENBQWUsV0FBZixDQUFkLEVBQXBCLENBREo7QUFHQSxZQUFJLENBQUMsTUFBSyxhQUFWLEVBQXlCO0FBQ3JCLGtCQUFLLElBQUwsQ0FBVSxPQUFPLFlBQWpCO0FBQ0g7QUFaZ0M7QUFhcEM7Ozs7NkJBRUksRyxFQUFLO0FBQUE7O0FBQ047QUFDQSxnQkFBSSxLQUFLLEdBQVQsRUFBYztBQUNWLHFCQUFLLGFBQUwsQ0FBbUIsS0FBSyxHQUF4QixFQUE2QixjQUE3QjtBQUNBLHFCQUFLLEdBQUwsR0FBVyxJQUFYO0FBQ0g7O0FBRUQ7QUFDQSxnQkFBSSxHQUFKLEVBQVM7QUFDTCxxQkFBSyxHQUFMLEdBQVcsR0FBWDtBQUNBLHFCQUFLLFFBQUwsQ0FBYyxLQUFLLEdBQW5CLEVBQXdCLGNBQXhCLEVBQXdDLFVBQUMsVUFBRCxFQUFnQjtBQUNwRCwyQkFBSyxhQUFMLENBQW1CLFVBQW5CO0FBQ0gsaUJBRkQ7QUFHSDs7QUFFRCxtQkFBTyxJQUFQO0FBQ0g7OztzQ0FFYSxVLEVBQVk7QUFDdEIsZ0JBQUksZUFBZSxJQUFmLElBQXVCLFdBQVcsRUFBWCxLQUFrQixLQUFLLEVBQWxELEVBQXNEO0FBQ2xELGtIQUFVLFdBQVcsaUJBQVgsRUFBVjtBQUNIO0FBQ0o7Ozs4QkFFSztBQUNGLCtHQUFhLFNBQWI7QUFDQSxpQkFBSyxHQUFMLElBQVksS0FBSyxHQUFMLENBQVMsT0FBVCxDQUFpQixjQUFqQixFQUFpQyxJQUFqQyxDQUFaO0FBQ0g7O0FBRUQ7Ozs7MENBNkVrQixXLEVBQTJCO0FBQUEsZ0JBQWQsT0FBYyx1RUFBSixFQUFJOztBQUN6QyxpQkFBSyxHQUFMLENBQ0k7QUFDSSw0QkFBWSxLQUFLLFNBQUwsQ0FBZSxXQUFmLENBRGhCO0FBRUksK0JBQWUsd0JBQVcsWUFBWCxDQUNYLEtBQUssVUFETSxFQUVYLFdBRlcsSUFJVCxnQkFKUyxHQUtULGFBUFY7QUFRSSxnQ0FBZ0Isd0JBQVcsVUFBWCxDQUNaLEtBQUssVUFETyxFQUVaLFdBRlksQ0FScEIsQ0FXTztBQVhQLGFBREosRUFjSSxPQWRKO0FBZ0JBLGdCQUFNLHNCQUFzQix3QkFBVyxrQkFBWCxDQUN4QixLQUFLLFVBRG1CLEVBRXhCLFdBRndCLENBQTVCO0FBSUEsaUJBQUssR0FBTCxDQUFTLGFBQVQsRUFBd0IsbUJBQXhCLEVBQTZDLFdBQVcsRUFBeEQ7O0FBRUEsZ0JBQU0saUJBQWlCLHdCQUFXLFVBQVgsQ0FDbkIsS0FBSyxVQURjLEVBRW5CLFdBRm1CLENBQXZCO0FBSUEsaUJBQUssR0FBTCxDQUFTLGdCQUFULEVBQTJCLGNBQTNCLEVBQTJDLFdBQVcsRUFBdEQsRUEzQnlDLENBMkJrQjtBQUM5RDs7O2lDQUVRLFcsRUFBYTtBQUNsQixnQkFBTSxTQUFTLEVBQUUsR0FBRixDQUFNLEtBQUssR0FBTCxDQUFTLFFBQVQsQ0FBTixFQUEwQixVQUFDLEtBQUQ7QUFBQSx1QkFBVyxLQUFYO0FBQUEsYUFBMUIsQ0FBZixDQURrQixDQUMwQztBQUM1RCxtQkFBTyw2Q0FBbUIsTUFBbkIsRUFBMkIsV0FBM0IsQ0FBUDtBQUNIOzs7b0NBRVcsVyxFQUFhO0FBQ3JCLGdCQUFNLFFBQVEsS0FBSyxRQUFMLENBQWMsV0FBZCxDQUFkO0FBQ0EsbUJBQVEsU0FBUyxNQUFNLElBQWhCLElBQXlCLDhCQUFZLHdCQUFaLENBQWhDO0FBQ0g7OztpREFFd0I7QUFDckIsbUJBQU8sRUFBRSxJQUFGLENBQU87QUFDVixxQkFBSyxPQUFPLEdBQVAsQ0FBVyxPQUFPLE1BQVAsQ0FBYyxtQkFBekIsRUFBOEMsRUFBRSxJQUFJLEtBQUssRUFBWCxFQUE5QyxDQURLO0FBRVYsc0JBQU0sS0FGSTtBQUdWLHlCQUFTO0FBSEMsYUFBUCxDQUFQO0FBS0g7Ozs0Q0FFbUIsUyxFQUFXO0FBQUE7O0FBQzNCLGdCQUFJLENBQUMsS0FBSyxlQUFWLEVBQTJCO0FBQ3ZCLHFCQUFLLGVBQUwsR0FBdUIsSUFBSSwyQkFBSixFQUF2QjtBQUNIO0FBQ0QsbUJBQU8sS0FBSyxlQUFMLENBQ0YsTUFERSxDQUNLLEVBQUUsU0FBUyxLQUFLLEdBQUwsQ0FBUyxJQUFULENBQVgsRUFETCxFQUVGLElBRkUsQ0FFRyxVQUFDLFFBQUQsRUFBYztBQUNoQix1QkFBSyxHQUFMLENBQVMsU0FBVCxFQUFvQixTQUFTLFNBQVQsQ0FBcEI7QUFDQSx1QkFBTyxRQUFRLE9BQVIsRUFBUDtBQUNILGFBTEUsQ0FBUDtBQU1IOzs7MkNBRWtCO0FBQ2YsZ0JBQUksU0FBUyxLQUFLLEdBQUwsQ0FBUyxZQUFULENBQWI7QUFDQSxnQkFBSSxtQkFBbUIsRUFBdkI7O0FBRUEsb0JBQVEsTUFBUjtBQUNJLHFCQUFLLGFBQUw7QUFDSSx1Q0FBbUIsT0FBTyxJQUFQLENBQVkseUJBQVosQ0FBbkI7QUFDQTtBQUNKLHFCQUFLLE1BQUw7QUFDSSx1Q0FBbUIsT0FBTyxJQUFQLENBQVksdUJBQVosQ0FBbkI7QUFDQTtBQUNKLHFCQUFLLFlBQVksU0FBakI7QUFDSSx1Q0FBbUIsT0FBTyxJQUFQLENBQVksdUJBQVosQ0FBbkI7QUFDQTtBQUNKLHFCQUFLLFVBQUw7QUFDQSxxQkFBSyxVQUFMO0FBQ0EscUJBQUssV0FBTDtBQUNBLHFCQUFLLFNBQUw7QUFDSSx1Q0FBbUIsT0FBTyxJQUFQLENBQVksVUFBWixDQUFuQjtBQUNBO0FBQ0oscUJBQUssTUFBTDtBQUNJLHdCQUFJLEtBQUssR0FBTCxDQUFTLG1CQUFULENBQUosRUFBbUM7QUFDL0IsMkNBQW1CLE9BQU8sSUFBUCxDQUFZLHdCQUFaLENBQW5CO0FBQ0E7QUFDSDs7QUFFRCx1Q0FBbUIsS0FBSyxHQUFMLENBQVMsbUJBQVQsSUFDYixPQUFPLElBQVAsQ0FBWSx3QkFBWixDQURhLEdBRWIsT0FBTyxJQUFQLENBQVksc0JBQVosQ0FGTjtBQUdBO0FBQ0oscUJBQUssUUFBTDtBQUNJLHVDQUFtQixPQUFPLElBQVAsQ0FBWSxRQUFaLENBQW5CO0FBQ0E7QUFDSixxQkFBSyxTQUFMO0FBQ0ksdUNBQW1CLE9BQU8sSUFBUCxDQUFZLFNBQVosQ0FBbkI7QUFDQTtBQS9CUjs7QUFrQ0EsbUJBQU8sZ0JBQVA7QUFDSDs7O2tDQUVTLFcsRUFBYTtBQUNuQixpQkFBSyxjQUFMLENBQW9CLFdBQXBCO0FBQ0EsbUJBQU8sd0JBQVcsUUFBWCxDQUFvQixLQUFLLFVBQXpCLEVBQXFDLFdBQXJDLENBQVA7QUFDSDs7O3VDQUVjLFcsRUFBYTtBQUN4QixpQkFBSyxHQUFMLENBQVM7QUFDTCwwQkFBVSxlQUFlLFlBQVksT0FBWixDQUFvQixPQUFwQixDQUE0QixLQUFLLEVBQWpDLElBQXVDLENBQUM7QUFENUQsYUFBVDtBQUdBLGlCQUFLLEdBQUwsQ0FBUztBQUNMLDRCQUNJLGVBQWUsWUFBWSxXQUFaLENBQXdCLE9BQXhCLENBQWdDLEtBQUssRUFBckMsSUFBMkMsQ0FBQztBQUYxRCxhQUFUO0FBSUg7Ozt3Q0FFZTtBQUNaLGdCQUFJLE9BQU8sS0FBSyxHQUFMLENBQVMsYUFBVCxFQUF3QixPQUF4QixDQUNQLDhCQURPLEVBRVAsR0FGTyxDQUFYO0FBSUEsbUJBQU8sWUFBVSxJQUFWLGFBQXdCLElBQXhCLEVBQVA7QUFDSDs7O3NDQUVhLE8sRUFBUyxPLEVBQVMsTSxFQUFRO0FBQUE7O0FBQ3BDLGNBQUUsSUFBRixDQUFPO0FBQ0gscUJBQUssT0FBTyxHQUFQLENBQVcsT0FBTyxNQUFQLENBQWMsV0FBekIsRUFBc0MsRUFBRSxJQUFJLE9BQU4sRUFBdEMsQ0FERjtBQUVILHNCQUFNLEtBRkg7QUFHSCx5QkFBUyxLQUhOO0FBSUgseUJBQVMsaUJBQUMsSUFBRCxFQUFVO0FBQ2YsMkJBQUssR0FBTCxDQUFTLElBQVQ7QUFDQSwyQkFBSyxHQUFMLENBQVMsWUFBVCxFQUF1QixPQUFLLFNBQUwsQ0FBZSxJQUFmLENBQXZCO0FBQ0E7QUFDSCxpQkFSRTtBQVNILHNCQUFNLGNBQUMsR0FBRCxFQUFTO0FBQ1gsMkJBQU8sR0FBUDtBQUNIO0FBWEUsYUFBUDtBQWFIOzs7NEJBdE55QjtBQUN0QixtQkFBTyxLQUFLLE9BQUwsSUFBZ0IsS0FBSyxPQUFMLENBQWEsb0JBQTdCLEdBQ0QsS0FBSyxPQUFMLENBQWEsb0JBQWIsQ0FBa0MsRUFEakMsR0FFRCxTQUZOO0FBR0g7Ozs0QkFFcUI7QUFDbEI7QUFDQSxnQkFBSSxRQUFRLEVBQUUsSUFBSSxLQUFLLEVBQVgsRUFBWjs7QUFFQSxnQkFBSSxLQUFLLG1CQUFULEVBQThCO0FBQzFCLHNCQUFNLEdBQU4sR0FBWSxLQUFLLG1CQUFqQjtBQUNIOztBQUVELG1CQUFPLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLE9BQXpCLEVBQWtDLEtBQWxDLENBQVA7QUFDSDs7OzRCQUV1QjtBQUNwQixtQkFDSSxPQUFPLGNBQVAsQ0FBc0IsU0FBdEIsQ0FBZ0MsVUFBaEMsS0FDQSxLQUFLLEdBQUwsQ0FBUyxxQkFBVCxJQUFrQyxDQUZ0QztBQUlIOzs7NEJBRTBCO0FBQ3ZCLG1CQUFPLEtBQUssaUJBQUwsSUFBMEIsS0FBSyxHQUFMLENBQVMsYUFBVCxNQUE0QixDQUE3RDtBQUNIOzs7NEJBRXdCO0FBQ3JCLG1CQUNJLEtBQUssMEJBQUwsSUFDQSxLQUFLLEdBQUwsQ0FBUyxpQkFBVCxNQUFnQyxDQURoQyxJQUVBLENBQUMsS0FBSyxHQUFMLENBQVMsZ0JBQVQsQ0FITDtBQUtIOzs7NEJBRWtCO0FBQ2YsbUJBQ0ksS0FBSyxHQUFMLENBQVMsWUFBVCxLQUNBLENBQUMsS0FBSyxHQUFMLENBQVMsVUFBVCxDQURELElBRUEsT0FBTyxjQUFQLENBQXNCLFNBQXRCLENBQWdDLGVBQWhDLENBSEo7QUFLSDs7OzRCQUVpQjtBQUNkLG1CQUFPLEtBQUssR0FBTCxDQUFTLGFBQVQsS0FBMkIsS0FBSywwQkFBdkM7QUFDSDs7OzRCQUVnQztBQUM3QixtQkFDSSxLQUFLLGlCQUFMLElBQTBCLEtBQUssR0FBTCxDQUFTLHlCQUFULElBQXNDLENBRHBFO0FBR0g7Ozs0QkFFZTtBQUNaLG1CQUNJLEtBQUssR0FBTCxDQUFTLFNBQVQsTUFDQyxLQUFLLGdCQUFMLElBQXlCLEtBQUssbUJBRC9CLENBREo7QUFJSDs7OzRCQUVzQjtBQUNuQixtQkFDSSxLQUFLLEdBQUwsQ0FBUyxrQkFBVCxNQUFpQyxRQUFqQyxJQUNBLENBQUMsS0FBSyxHQUFMLENBQVMsbUJBQVQsQ0FERCxJQUVBLENBQUMsS0FBSyxHQUFMLENBQVMsYUFBVCxDQUhMO0FBS0g7Ozs0QkFFeUI7QUFDdEIsbUJBQ0ksS0FBSyxHQUFMLENBQVMsa0JBQVQsTUFBaUMsUUFBakMsSUFDQSxDQUFDLEtBQUssR0FBTCxDQUFTLGFBQVQsQ0FGTDtBQUlIOzs7NEJBOElnQjtBQUNiLG1CQUFPLEtBQUssR0FBTCxDQUFTLE1BQVQsRUFBaUIsRUFBakIsS0FBd0IsVUFBL0I7QUFDSDs7OztFQS9UOEIsU0FBUyxLOztxQkFBdkIsSzs7Ozs7Ozs7Ozs7QUNKckI7Ozs7Ozs7Ozs7OztJQUVxQixlOzs7Ozs7Ozs7Ozs0QkFDTDtBQUFFLG1CQUFPLGtCQUFQO0FBQWU7Ozs7RUFEWSxTQUFTLFU7O3FCQUFqQyxlOzs7Ozs7OztjQ0h5QixNO0lBQXRDLGMsV0FBQSxjO0lBQWdCLEksV0FBQSxJO0lBQU0sRyxXQUFBLEc7SUFBSyxNLFdBQUEsTTs7cUJBRXBCO0FBQUEsUUFDWCxPQURXLFFBQ1gsT0FEVztBQUFBLFFBRVgsb0JBRlcsUUFFWCxvQkFGVztBQUFBLFFBR1gsRUFIVyxRQUdYLEVBSFc7QUFBQSxRQUlYLEdBSlcsUUFJWCxHQUpXO0FBQUEsUUFLWCxNQUxXLFFBS1gsTUFMVztBQUFBLFFBTVgsS0FOVyxRQU1YLEtBTlc7QUFBQSxRQU9YLFNBUFcsUUFPWCxTQVBXO0FBQUEsUUFRWCxVQVJXLFFBUVgsVUFSVztBQUFBLFFBU1gsVUFUVyxRQVNYLFVBVFc7QUFBQSxRQVVYLGtCQVZXLFFBVVgsa0JBVlc7QUFBQSxRQVdYLGlCQVhXLFFBV1gsaUJBWFc7QUFBQSxRQVlYLGNBWlcsUUFZWCxjQVpXO0FBQUEsUUFhWCxlQWJXLFFBYVgsZUFiVztBQUFBLFFBY1gsZUFkVyxRQWNYLGVBZFc7QUFBQSxRQWVYLGdCQWZXLFFBZVgsZ0JBZlc7QUFBQSwrSEFrQnFFLEVBbEJyRSxnQ0FtQlEsS0FuQlIsZ0RBb0J3QixFQXBCeEIsU0FvQjhCLEdBcEI5Qix3Q0FxQmdCLFNBckJoQixxREFzQjZCLEVBdEI3QixnRUF3QlEsS0FBSyxpQkFBTCxFQUF3QixFQUFFLFlBQUYsRUFBeEIsQ0F4QlIsaUlBNkJZLEVBN0JaLFNBNkJrQixHQTdCbEIsNEtBK0JILENBQUMsQ0FBQyxPQUFPLGNBQVAsQ0FBc0IsU0FBdEIsQ0FBZ0Msc0JBQWhDLENBQUQsSUFDRyxPQURKLEtBRUEsZUFBZSxFQUZmLCtGQUtvQixVQUxwQix5QkFLa0QsRUFMbEQsc0JBS3FFLEtBTHJFLCtEQU0wQyxFQU4xQyxxQkFNNEQsTUFONUQsMkJBTXdGLGdCQU54RiwrRUFPMEQsS0FDbEQsbUJBRGtELEVBRWxELEVBQUUsUUFBUSxVQUFWLEVBQXNCLFlBQXRCLEVBRmtELENBUDFELGdDQVdVLFVBWFYsaURBY00sRUE3Q0gscUZBZ0RzQixJQUFJLE9BQU8sT0FBWCxFQUFvQjtBQUN6QztBQUR5QyxLQUFwQixDQWhEdEIsc0JBa0RnQixLQUFLLHVCQUFMLEVBQThCO0FBQ3pEO0FBRHlELEtBQTlCLENBbERoQixVQW9EUixLQUFLLGFBQUwsQ0FwRFEsc0NBdURILG1CQUFtQixvQkFBb0IsRUFBdkMsMEVBRXNELGVBRnRELFVBRTBFLEtBQ2hFLFlBRGdFLENBRjFFLGlCQUtNLEVBNURILG9CQStESCxvRkFDdUUsZUFEdkUseUJBQzBHLEVBRDFHLHFEQUM0SixrQkFENUosVUFDbUwsaUJBRG5MLG1CQS9ERyx1RUFtRStDLG9CQW5FL0Msc0JBbUVvRixLQUMvRixvQkFEK0YsRUFFL0YsRUFBRSxZQUFGLEVBRitGLENBbkVwRixVQXNFVCxLQUFLLGdCQUFMLENBdEVTO0FBQUEsQzs7Ozs7Ozs7O3FCQ0ZBO0FBQUEsUUFBRyxLQUFILFFBQUcsS0FBSDtBQUFBLFFBQVUsR0FBVixRQUFVLEdBQVY7QUFBQSxRQUFlLElBQWYsUUFBZSxJQUFmO0FBQUEsUUFBcUIsVUFBckIsUUFBcUIsVUFBckI7QUFBQSxRQUFpQyxhQUFqQyxRQUFpQyxhQUFqQztBQUFBLFFBQWdELE1BQWhELFFBQWdELE1BQWhEO0FBQUEsK0VBQzZDLFVBRDdDLDJCQUVBLElBRkEsbUVBSWEsSUFKYix1Q0FLYSxNQUFNLEVBTG5CLHVDQU1hLE1BQU0sS0FObkIsdUNBT2EsTUFBTSxJQUFOLENBQVcsRUFQeEIsaUZBVVcsTUFBTSxLQVZqQixXQVU0QixLQUFLLE1BQU0sSUFBTixDQUFXLEVBQWhCLENBVjVCLCtGQVl5QyxhQVp6QywrQkFhSSxHQWJKLHlCQWNELHdCQUFxQixNQUFyQixPQWRDLDZCQWVJLE1BQU0sS0FmVixXQWVxQixLQUFLLE1BQU0sSUFBTixDQUFXLEVBQWhCLENBZnJCLGtEQWdCd0IsVUFoQnhCO0FBQUEsQzs7Ozs7Ozs7O3FCQ0FEO0FBQUEsUUFBRSxPQUFGLFFBQUUsT0FBRjtBQUFBLFFBQVcsV0FBWCxRQUFXLFdBQVg7QUFBQSw0Q0FFSixPQUZJLDJHQUt1QyxXQUx2Qyw2R0FLMEosS0FBSyxTQUFMLENBTDFKLFVBSzhLLEtBQUssU0FBTCxDQUw5SywwSEFNZ0csS0FBSyxRQUFMLENBTmhHO0FBQUEsQzs7Ozs7Ozs7Y0NBRyxNO0lBQVQsSSxXQUFBLEk7O3FCQUVNO0FBQUEsUUFBRSxPQUFGLFFBQUUsT0FBRjtBQUFBLFFBQVcsR0FBWCxRQUFXLEdBQVg7QUFBQSxRQUFnQixVQUFoQixRQUFnQixVQUFoQjtBQUFBLDJIQUU4QixPQUY5Qix1QkFHQSxtVUFNQSxFQVRBLGtIQWM0QixHQWQ1QixlQWN5QyxLQUFLLFlBQUwsQ0FkekMsa09BbUJnRixLQUFLLFFBQUwsQ0FuQmhGO0FBQUEsQzs7Ozs7Ozs7O3FCQ0ZDO0FBQUEsUUFBRyxXQUFILFFBQUcsV0FBSDtBQUFBLHFGQUNzRCxPQUFPLElBQVAsQ0FDN0QseUNBRDZELENBRHRELGtNQVF3RCxXQVJ4RCx1QkFRcUYsT0FBTyxJQUFQLENBQ2hHLDJCQURnRyxDQVJyRjtBQUFBLEM7Ozs7Ozs7O2NDQ3FCLE07SUFBNUIsSSxXQUFBLEk7SUFBTSxJLFdBQUEsSTtJQUFNLEcsV0FBQSxHO0lBQUssTSxXQUFBLE07O3FCQUVWO0FBQUEsUUFBRSxxQkFBRixRQUFFLHFCQUFGO0FBQUEsUUFBeUIsY0FBekIsUUFBeUIsY0FBekI7QUFBQSxRQUF5QyxLQUF6QyxRQUF5QyxLQUF6QztBQUFBLFFBQWdELFVBQWhELFFBQWdELFVBQWhEO0FBQUEsUUFBNEQsZ0JBQTVELFFBQTRELGdCQUE1RDtBQUFBLFFBQThFLFNBQTlFLFFBQThFLFNBQTlFO0FBQUEsUUFBeUYsV0FBekYsUUFBeUYsV0FBekY7QUFBQSxRQUFzRyxnQkFBdEcsUUFBc0csZ0JBQXRHO0FBQUEsNkRBQzhCLFdBQVcsS0FEekMsbUVBR0wsS0FBSyxRQUFMLEVBQWUsRUFBQyxxREFBbUQsZ0JBQW5ELHNCQUFvRixLQUFLLHNCQUFMLEVBQTZCLEVBQUMsUUFBUSxXQUFXLGdCQUFwQixFQUE3QixDQUFwRixVQUE0SixXQUFXLGdCQUF2SyxTQUFELEVBQWYsQ0FISywyRUFNTCxTQU5LLGtGQVNKLGdCQUFnQixDQUFoQixHQUNHLEtBQUsscUJBQUwsRUFBNEIsRUFBQyxPQUFPLEtBQVIsRUFBZSw2REFBMkQsY0FBM0QsVUFBOEUsT0FBTyxJQUFQLENBQVksOEJBQVosQ0FBOUUsU0FBZixFQUE1QixDQURILEtBVEksNEJBYVIsb0JBQW9CLGlCQUFpQixNQUFqQixHQUEwQixDQUEvQyxvQ0FBbUYsZ0JBQW5GLGNBYlM7QUFBQSxDOzs7Ozs7Ozs7QUNIZjs7cUJBRWU7QUFBQSxRQUFHLEtBQUgsUUFBRyxLQUFIO0FBQUEsUUFBVSxJQUFWLFFBQVUsSUFBVjtBQUFBLFFBQWdCLFFBQWhCLFFBQWdCLFFBQWhCO0FBQUEsUUFBMEIsVUFBMUIsUUFBMEIsVUFBMUI7QUFBQSxRQUFzQyxXQUF0QyxRQUFzQyxXQUF0QztBQUFBLFFBQW1ELFdBQW5ELFFBQW1ELFdBQW5EO0FBQUEscUdBRW1DLFdBQVcsc0JBQVgsR0FBb0Msb0JBRnZFLHNCQUdGLElBSEUsaURBS08sSUFMUCw4QkFNTyxNQUFNLEVBTmIsOEJBT08sTUFBTSxLQVBiLDhCQVFPLE1BQU0sSUFBTixDQUFXLEVBUmxCLHVDQVNjLFdBQVcsOEJBQVgsR0FBNEMseUNBVDFELFdBUzBHLE1BQU0sS0FUaEgsNENBVWUsV0FBVyxFQUFYLEdBQWdCLGNBVi9CLFdBVW9ELFdBVnBELG1GQWNZLE1BQU0sS0FkbEIsV0FjK0IsS0FBSyxNQUFNLElBQU4sQ0FBVyxFQUFoQixDQWQvQiw4R0FpQkssOEJBQVksZUFBWixDQWpCTCw0QkFrQkssTUFBTSxLQWxCWCxXQWtCd0IsS0FBSyxNQUFNLElBQU4sQ0FBVyxFQUFoQixDQWxCeEI7QUFBQSxDOzs7Ozs7OztjQ0ZRLE07SUFBZixJLFdBQUEsSTtJQUFNLEksV0FBQSxJOztxQkFFQztBQUFBLFFBQUcsS0FBSCxRQUFHLEtBQUg7QUFBQSxRQUFVLElBQVYsUUFBVSxJQUFWO0FBQUEsUUFBZ0IsUUFBaEIsUUFBZ0IsUUFBaEI7QUFBQSxRQUEwQixFQUExQixRQUEwQixFQUExQjtBQUFBLFFBQThCLGlCQUE5QixRQUE4QixpQkFBOUI7QUFBQSxRQUFpRCxjQUFqRCxRQUFpRCxjQUFqRDtBQUFBLFFBQWlFLFdBQWpFLFFBQWlFLFdBQWpFO0FBQUEsUUFBOEUsV0FBOUUsUUFBOEUsV0FBOUU7QUFBQSxRQUEyRixjQUEzRixRQUEyRixjQUEzRjtBQUFBLDBFQUVKLEtBRkksbUVBR3dDLEtBQUssRUFIN0MscUJBR2lFLEtBQUssS0FBSyxFQUFWLENBSGpFLHNIQU93QixRQVB4QixlQU80QyxLQUFLLFlBQUwsQ0FQNUMsbURBVWdCLEVBVmhCLDJDQVUwRCxFQVYxRCx5REFZSixDQUFDLGlCQUFELEdBQXFCLEVBQXJCLDZEQUMwRCxLQUFLLGlCQUFMLEVBQXdCLEVBQUUsOEJBQUYsRUFBeEIsQ0FEMUQsU0FaSSxtRkFnQkEsZ0JBQWdCLENBQWhCLEdBQ0csS0FBSyxrQ0FBTCxDQURILEdBRUcsaUJBQ0UsS0FBSyxvQ0FBTCxFQUEyQyxFQUFFLHdCQUFGLEVBQTNDLENBREYsR0FFRSxLQUFLLGdDQUFMLEVBQXVDLEVBQUUsd0JBQUYsRUFBdkMsQ0FwQkwsK0dBeUJ1RCxFQXpCdkQsa0ZBeUJ3SSxLQUFLLGNBQUwsQ0F6QnhJLGlCQXlCMEssS0FBSyxjQUFMLENBekIxSyxzQkF5QmlOLEtBQUssY0FBTCxDQXpCak4seUdBMkJpQixLQUFLLG9CQUFMLENBM0JqQiw0RkE4QjJDLEVBOUIzQywrRUE4QnlILEtBQUssY0FBTCxDQTlCekgsaUJBOEIySixLQUFLLGNBQUwsQ0E5QjNKLHNCQThCa00sS0FBSyxjQUFMLENBOUJsTSwrQ0E4QmtRLEVBOUJsUSw2REFnQ2lCLEtBQUssc0JBQUwsQ0FoQ2pCLHdQQXNDNEYsS0FBSyxRQUFMLENBdEM1RjtBQUFBLEM7Ozs7Ozs7OztxQkNGQTtBQUFBLFFBQUUsSUFBRixRQUFFLElBQUY7QUFBQSxRQUFRLFNBQVIsUUFBUSxTQUFSO0FBQUEsUUFBbUIsWUFBbkIsUUFBbUIsWUFBbkI7QUFBQSxRQUFpQyxZQUFqQyxRQUFpQyxZQUFqQztBQUFBLDZCQUNGLElBREUsMkhBSTZDLFNBSjdDLHVIQUtTLFlBTFQscU5BT3dKLFlBUHhKO0FBQUEsQzs7Ozs7Ozs7O3FCQ0FBO0FBQUEsUUFBRyxXQUFILFFBQUcsV0FBSDtBQUFBLDZEQUM2QixXQUQ3QjtBQUFBLEM7Ozs7Ozs7OztxQkNBQTtBQUFBLFFBQUUsTUFBRixRQUFFLE1BQUY7QUFBQSxtQkFDYix1RkFDdUUsTUFEdkUsY0FDc0YsT0FBTyxJQUFQLENBQVksTUFBWixDQUR0RixpQkFFRSxFQUhXO0FBQUEsQzs7Ozs7Ozs7O3FCQ0FBO0FBQUEsUUFBRyxPQUFILFFBQUcsT0FBSDtBQUFBLFFBQVksS0FBWixRQUFZLEtBQVo7QUFBQSxRQUFtQixJQUFuQixRQUFtQixJQUFuQjtBQUFBLFFBQXlCLFNBQXpCLFFBQXlCLFNBQXpCO0FBQUEsNEJBQXdELEtBQXhELGdEQUFzRyxPQUF0RywwREFDYyxJQURkLHNDQUNpRCxTQURqRCxxQkFFSixLQUZJO0FBQUEsQzs7Ozs7Ozs7O3FCQ0FBO0FBQUEsUUFBRSxFQUFGLFFBQUUsRUFBRjtBQUFBLFFBQU0sYUFBTixRQUFNLGFBQU47QUFBQSxRQUFxQixTQUFyQixRQUFxQixTQUFyQjtBQUFBLFFBQWdDLFNBQWhDLFFBQWdDLFNBQWhDO0FBQUEsUUFBMkMsSUFBM0MsUUFBMkMsSUFBM0M7QUFBQSxRQUFpRCxvQkFBakQsUUFBaUQsb0JBQWpEO0FBQUEsMkJBQ0wsb0RBQWtELEdBQUcsT0FBckQsdUJBQThFLEdBQUcsVUFBakYsR0FBZ0csRUFEM0YsaUNBRVMsYUFGVCx3Q0FJRCxTQUpDLDBCQUtDLFNBTEQsY0FLbUIsb0JBTG5CLHdDQU1ULHdEQUFzRCxJQUF0RCxlQUFzRSxFQU43RDtBQUFBLEM7Ozs7Ozs7Ozs7O0FDQWY7O0FBQ0E7Ozs7Ozs7Ozs7OztBQUVBLElBQUksaUJBQWlCLE9BQU8sY0FBNUI7O3dCQUVxQyxPQUFPLFM7SUFBcEMsTyxxQkFBQSxPO0lBQVMsZSxxQkFBQSxlO2NBQ0csTTtJQUFaLE8sV0FBQSxPOzs7QUFFUixJQUFNLGNBQWMsQ0FBQyxFQUNqQixlQUFlLFNBQWYsQ0FBeUIsNkJBQXpCLEtBQ0EsT0FBTyxTQUFQLENBQWlCLFNBQWpCLENBQTJCLEtBQTNCLENBQWlDLG1DQUFqQyxDQUZpQixDQUFyQjtBQUlBLElBQU0sUUFBUSxDQUFDLEVBQ1gsT0FBTyxTQUFQLENBQWlCLFNBQWpCLENBQTJCLEtBQTNCLENBQWlDLEtBQWpDLEtBQ0EsQ0FBQyxPQUFPLEdBRFIsSUFFQSxDQUFDLFdBSFUsQ0FBZjtBQUtBLElBQU0sWUFDRixDQUFDLEVBQUUsT0FBTyxTQUFQLENBQWlCLFNBQWpCLENBQTJCLEtBQTNCLENBQWlDLEtBQWpDLEtBQTJDLENBQUMsT0FBTyxZQUFyRCxDQUFELElBQ0EsQ0FBQyxPQUFPLFNBQVAsQ0FBaUIsY0FGdEI7QUFHQSxJQUFNLGtCQUFrQixDQUFDLENBQUMsT0FBTyxTQUFQLENBQWlCLFNBQWpCLENBQTJCLEtBQTNCLENBQ3RCLG9GQURzQixDQUExQjtBQUdBLElBQU0sUUFBUSxRQUFRLEdBQVIsQ0FBWSxXQUFaLE1BQTZCLFNBQTNDO0FBQ0EsSUFBTSx3QkFBd0IsQ0FBQyxFQUMzQixPQUFPLFlBQVAsSUFBdUIsU0FBUyxPQUFPLFNBQWhCLEVBQTJCLEVBQTNCLEtBQWtDLElBRDlCLENBQS9CO0FBR0EsSUFBTSxrQkFBa0IsQ0FBQyxFQUNyQixPQUFPLFlBQVAsSUFBdUIsU0FBUyxPQUFPLFNBQWhCLEVBQTJCLEVBQTNCLElBQWlDLElBRG5DLENBQXpCOztJQUlxQixvQjs7Ozs7Ozs7Ozs7bUNBQ04sRSxFQUFJO0FBQUE7O0FBQ1gsZ0JBQUksU0FBUyxHQUFHLElBQUgsQ0FBUSxXQUFSLENBQWI7QUFDQSxnQkFBSSxVQUFVLEdBQUcsSUFBSCxDQUFRLFNBQVIsQ0FBZDs7QUFFQSxnQkFBSSxVQUFVLEtBQUssVUFBTCxDQUFnQixNQUFoQixDQUFkO0FBQ0EsZ0JBQUksY0FBYyxPQUFPLEdBQVAsQ0FBVyxPQUFPLE1BQVAsQ0FBYyxhQUF6QixFQUF3QztBQUN0RCw4QkFEc0Q7QUFFdEQ7QUFGc0QsYUFBeEMsQ0FBbEI7O0FBS0EsZ0JBQUksWUFBWSxFQUFaLElBQWtCLENBQUMsS0FBSyxrQkFBTCxDQUF3QixPQUF4QixDQUF2QixFQUF5RDtBQUNyRCxvQkFBSSxXQUFXLEVBQUUsU0FBUyxLQUFLLFdBQUwsQ0FBaUIsT0FBakIsQ0FBWCxFQUFzQyx3QkFBdEMsRUFBZjs7QUFFQSxvQkFBTSxVQUFVLEVBQUUsdUNBQXdCLFFBQXhCLENBQUYsQ0FBaEI7O0FBRUEscUJBQUssS0FBTCxHQUFhLElBQUksWUFBSixDQUFVO0FBQ25CLDJCQUFPLEtBQUssOEJBQUwsQ0FEWTtBQUVuQiw2QkFBUztBQUZVLGlCQUFWLENBQWI7O0FBS0EscUJBQUssS0FBTCxDQUFXLElBQVg7O0FBRUEscUJBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxJQUFmLENBQW9CLFNBQXBCLEVBQStCLEVBQS9CLENBQWtDLE9BQWxDLEVBQTJDLFlBQU07QUFDN0MsMkJBQUssS0FBTCxDQUFXLEtBQVg7QUFDSCxpQkFGRDtBQUdBLHFCQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsSUFBZixDQUFvQixVQUFwQixFQUFnQyxFQUFoQyxDQUFtQyxPQUFuQyxFQUE0QyxZQUFNO0FBQzlDLDJCQUFLLGdCQUFMLENBQXNCLE9BQXRCO0FBQ0EsMkJBQUssS0FBTCxDQUFXLEtBQVg7QUFDSCxpQkFIRDtBQUlILGFBbkJELE1BbUJPLElBQUksV0FBVyxnQkFBZixFQUFpQztBQUNwQyxvQkFBSSxLQUFKLEVBQVc7QUFDUCwyQkFBTyxRQUFQLENBQWdCLElBQWhCLEdBQXVCLFdBQXZCO0FBQ0gsaUJBRkQsTUFFTztBQUNILDJCQUFPLElBQVAsQ0FBWSxXQUFaLEVBQXlCLFFBQXpCLEVBQW1DLFlBQW5DO0FBQ0g7QUFDSixhQU5NLE1BTUE7QUFDSDtBQUNBLHVCQUFPLFFBQVAsQ0FBZ0IsSUFBaEIsR0FBdUIsV0FBdkI7QUFDSDtBQUNKOzs7b0NBRVcsTyxFQUFTO0FBQ2pCLG9CQUFRLE9BQVI7QUFDSSxxQkFBSyxPQUFMO0FBQ0ksMkJBQU8sS0FBSywrQkFBTCxFQUFzQztBQUN6Qyw4QkFDSSx5R0FDQSxLQUFLLGNBQUwsQ0FEQSxHQUVBLGdCQUZBLEdBR0EsS0FBSyxjQUFMLENBSEEsR0FJQTtBQU5xQyxxQkFBdEMsQ0FBUDtBQVFKLHFCQUFLLEtBQUw7QUFDSSwyQkFBTyxLQUFLLCtCQUFMLEVBQXNDO0FBQ3pDLDhCQUNJLCtFQUNBO0FBSHFDLHFCQUF0QyxDQUFQO0FBS0oscUJBQUssWUFBTDtBQUNJLDJCQUFPLEtBQUssbUNBQUwsRUFBMEM7QUFDN0MsOEJBQ0kseUdBQ0EsS0FBSyxjQUFMLENBREEsR0FFQSxnQkFGQSxHQUdBLEtBQUssY0FBTCxDQUhBLEdBSUE7QUFOeUMscUJBQTFDLENBQVA7QUFRSixxQkFBSyxPQUFMO0FBQ0ksMkJBQU8sS0FBSyxzQ0FBTCxFQUE2QztBQUNoRCw4QkFDSSx5R0FDQSxLQUFLLGNBQUwsQ0FEQSxHQUVBLGdCQUZBLEdBR0EsS0FBSyxjQUFMLENBSEEsR0FJQTtBQU40QyxxQkFBN0MsQ0FBUDtBQVFKLHFCQUFLLFFBQUw7QUFDSSwyQkFBTyxLQUFLLDJDQUFMLEVBQWtEO0FBQ3JELCtCQUNJLCtJQUNBLEtBQUssc0NBQUwsRUFBNkM7QUFDekMscUNBQVM7QUFEZ0MseUJBQTdDLENBREEsR0FJQSxxQ0FOaUQ7QUFPckQsK0JBQ0ksNkdBQ0EsS0FBSyxzQ0FBTCxFQUE2QztBQUN6QyxxQ0FBUztBQURnQyx5QkFBN0MsQ0FEQSxHQUlBO0FBWmlELHFCQUFsRCxDQUFQO0FBY0oscUJBQUssUUFBTDtBQUNJLDJCQUFPLEtBQUssdUNBQUwsQ0FBUDtBQUNKLHFCQUFLLE9BQUw7QUFDSSwyQkFBTyxLQUFLLG9DQUFMLEVBQTJDO0FBQzlDLDhCQUNJLDJHQUNBLEtBQUssZ0JBQUwsQ0FEQSxHQUVBLGdCQUZBLEdBR0EsS0FBSyxnQkFBTCxDQUhBLEdBSUE7QUFOMEMscUJBQTNDLENBQVA7QUFRSixxQkFBSyxjQUFMO0FBQ0ksMkJBQU8sS0FBSyxtQ0FBTCxFQUEwQztBQUM3Qyw4QkFDSSxjQUNBLE9BQU8sVUFBUCxDQUNJLE9BREosRUFFSSxnQkFBZ0IscUJBRnBCLENBREEsR0FLQSxvRUFMQSxHQU1BLEtBQUsseUJBQUwsQ0FOQSxHQU9BLGdCQVBBLEdBUUEsS0FBSyx5QkFBTCxDQVJBLEdBU0E7QUFYeUMscUJBQTFDLENBQVA7QUE3RFI7QUEyRUg7OzttQ0FFVSxNLEVBQVE7QUFDZixnQkFBSSxVQUFVLEVBQWQ7QUFDQSxnQkFBSSxXQUFXLGtCQUFmLEVBQW1DO0FBQy9CLG9CQUFJLEtBQUosRUFBVztBQUNQLDhCQUFVLEtBQVY7QUFDSCxpQkFGRCxNQUVPLElBQUksYUFBYSxDQUFDLEtBQWxCLEVBQXlCO0FBQzVCLDhCQUFVLEtBQVY7QUFDSCxpQkFGTSxNQUVBLElBQ0gsQ0FBQyxPQUFPLEdBQVAsSUFDSSxPQUFPLE9BQVAsSUFBa0IsQ0FBQyxPQUFPLFNBQVAsQ0FBaUIsY0FEekMsS0FFQSxDQUFDLEtBSEUsRUFJTDtBQUNFLDhCQUFVLE9BQVY7QUFDSCxpQkFOTSxNQU1BLElBQUkseUJBQXlCLENBQUMsS0FBOUIsRUFBcUM7QUFDeEMsOEJBQVUsT0FBVjtBQUNILGlCQUZNLE1BRUEsSUFBSSxtQkFBbUIsQ0FBQyxLQUF4QixFQUErQjtBQUNsQyw4QkFBVSxjQUFWO0FBQ0g7QUFDSixhQWhCRCxNQWdCTyxJQUNILFdBQVcsaUJBQVgsS0FDQyxTQUFVLGFBQWEsQ0FBQyxLQUR6QixDQURHLEVBR0w7QUFDRSwwQkFBVSxLQUFWO0FBQ0gsYUFMTSxNQUtBLElBQUksV0FBVyxpQkFBZixFQUFrQztBQUNyQyxvQkFBSSxLQUFKLEVBQVc7QUFDUCw4QkFBVSxLQUFWO0FBQ0gsaUJBRkQsTUFFTyxJQUFJLGFBQWEsQ0FBQyxLQUFsQixFQUF5QjtBQUM1Qiw4QkFBVSxLQUFWO0FBQ0gsaUJBRk0sTUFFQSxJQUNILENBQUMsT0FBTyxHQUFQLElBQ0ksT0FBTyxPQUFQLElBQWtCLENBQUMsT0FBTyxTQUFQLENBQWlCLGNBRHpDLEtBRUEsQ0FBQyxLQUhFLEVBSUw7QUFDRSw4QkFBVSxZQUFWO0FBQ0gsaUJBTk0sTUFNQSxJQUFJLHlCQUF5QixDQUFDLEtBQTlCLEVBQXFDO0FBQ3hDLDhCQUFVLE9BQVY7QUFDSCxpQkFGTSxNQUVBLElBQUksbUJBQW1CLENBQUMsS0FBeEIsRUFBK0I7QUFDbEMsOEJBQVUsY0FBVjtBQUNIO0FBQ0osYUFoQk0sTUFnQkEsSUFDSCxXQUFXLGVBQVgsSUFDQSxFQUFFLGVBQWUsU0FBZixDQUF5QixjQUF6QixLQUE0QyxDQUFDLEtBQS9DLENBRkcsRUFHTDtBQUNFLG9CQUNLLENBQUMsT0FBTyxHQUFQLElBQWMsT0FBTyxPQUF0QixLQUFrQyxDQUFDLEtBQXBDLElBQ0EsS0FEQSxJQUVDLGFBQWEsQ0FBQyxLQUhuQixFQUlFO0FBQ0UsOEJBQVUsT0FBVjtBQUNILGlCQU5ELE1BTU8sSUFBSSx5QkFBeUIsQ0FBQyxLQUE5QixFQUFxQztBQUN4Qyw4QkFBVSxPQUFWO0FBQ0gsaUJBRk0sTUFFQSxJQUFJLG1CQUFtQixDQUFDLEtBQXhCLEVBQStCO0FBQ2xDLDhCQUFVLGNBQVY7QUFDSDtBQUNKO0FBQ0QsbUJBQU8sT0FBUDtBQUNIOzs7MkNBRWtCLE8sRUFBUztBQUN4QixnQkFBTSxTQUFTLFFBQVEsR0FBUixDQUFZLG1CQUFaLENBQWY7QUFDQSxnQkFBSSxXQUFXLFNBQWYsRUFBMEI7QUFDdEIsdUJBQU8sS0FBUDtBQUNILGFBRkQsTUFFTztBQUNILG9CQUFJLE1BQU0sT0FBTyxLQUFQLENBQWEsR0FBYixDQUFWO0FBQ0EsdUJBQU8sSUFBSSxPQUFKLENBQVksT0FBWixJQUF1QixDQUFDLENBQS9CO0FBQ0g7QUFDSjs7O3lDQUVnQixPLEVBQVM7QUFDdEIsZ0JBQUksU0FBUyxRQUFRLEdBQVIsQ0FBWSxtQkFBWixDQUFiO0FBQ0EsZ0JBQUksV0FBVyxTQUFmLEVBQTBCO0FBQ3RCLHdCQUFRLEdBQVIsQ0FBWSxtQkFBWixFQUFpQyxVQUFVLEdBQTNDLEVBQWdEO0FBQzVDLDBCQUFNLEdBRHNDO0FBRTVDLDZCQUFTLEdBRm1DO0FBRzVDLCtCQUFXO0FBSGlDLGlCQUFoRDtBQUtILGFBTkQsTUFNTztBQUNILHdCQUFRLEdBQVIsQ0FBWSxtQkFBWixFQUFpQyxTQUFTLE9BQVQsR0FBbUIsR0FBcEQsRUFBeUQ7QUFDckQsMEJBQU0sR0FEK0M7QUFFckQsNkJBQVMsR0FGNEM7QUFHckQsK0JBQVc7QUFIMEMsaUJBQXpEO0FBS0g7QUFDSjs7OztFQTNNNkMsU0FBUyxJOztxQkFBdEMsb0I7Ozs7O0FDN0JyQjs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7OztBQUxBLElBQU0sV0FBWSxPQUFPLFFBQXpCOztBQU9BLElBQU0sb0JBQW9CLFNBQVMsSUFBVCxDQUFjLE1BQWQsQ0FBcUI7QUFDM0MsY0FEMkMsc0JBQ2hDLEdBRGdDLEVBQzNCLFVBRDJCLEVBQ0Q7QUFBQTs7QUFBQSxZQUFkLE9BQWMsdUVBQUosRUFBSTs7QUFDdEMsYUFBSyxHQUFMLEdBQVcsR0FBWDs7QUFFQSxZQUFNLFdBQVc7QUFDYixxQkFBUyxPQUFPLElBQVAsQ0FBWSxDQUFDLENBQUMsUUFBUSxVQUFWLEdBQXVCLDhDQUF2QixHQUNELGlEQURYLEVBRVcsRUFBQyxpQkFBZSxXQUFXLEdBQVgsQ0FBZSxPQUFmLENBQWYsWUFBRCxFQUZYLENBREk7QUFJYixpQkFBSyxXQUFXLFdBQVgsQ0FBdUIsR0FBdkIsQ0FKUTtBQUtiLHdCQUFZLENBQUMsQ0FBQyxRQUFRO0FBTFQsU0FBakI7O0FBUUEsWUFBSSxnQkFBZ0I7QUFDaEIsc0JBQVUsS0FETTtBQUVoQixtQkFBTyxPQUFPLElBQVAsQ0FBWSw2QkFBWixDQUZTO0FBR2hCLHFCQUFTLENBQUMsdUJBQUQsQ0FITztBQUloQixxQkFBUyxvQ0FBa0IsUUFBbEIsQ0FKTztBQUtoQixnQkFBSSx1QkFMWTtBQU1oQix3QkFBWTtBQU5JLFNBQXBCO0FBUUEsYUFBSyxLQUFMLEdBQWEsSUFBSSxZQUFKLENBQVUsYUFBVixDQUFiOztBQUVBLGFBQUssS0FBTCxDQUFXLENBQVgsQ0FBYSxZQUFiLEVBQTJCLEVBQTNCLENBQThCLE9BQTlCLEVBQXVDLFlBQU07QUFDekMsa0JBQUssS0FBTCxDQUFXLEtBQVg7QUFDSCxTQUZEOztBQUlBLGFBQUssUUFBTCxDQUFjLEtBQUssR0FBbkIsRUFBd0IsaUJBQXhCLEVBQTJDLFlBQU07QUFDOUMsa0JBQUssS0FBTCxDQUFXLEtBQVg7QUFDRixTQUZEOztBQUlBLGFBQUssaUJBQUwsR0FBeUIsSUFBSSw4QkFBSixDQUFzQixFQUFFLE9BQU8sVUFBVCxFQUFxQixNQUFNLFFBQTNCLEVBQXFDLElBQUksS0FBSyxLQUFMLENBQVcsQ0FBWCxDQUFhLGNBQWIsQ0FBekMsRUFBdUUsT0FBTyxNQUE5RSxFQUF0QixDQUF6Qjs7QUFFQSxhQUFLLEtBQUwsQ0FBVyxJQUFYOztBQUVBLFlBQUksUUFBUSxVQUFaLEVBQXVCO0FBQ25CLGlCQUFLLFNBQUwsR0FBaUIsSUFBSSxvQkFBSixDQUFZO0FBQ3pCLHdCQUFRLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxJQUFmLENBQW9CLGtCQUFwQixDQURpQjtBQUV6QixrQ0FBZ0IsS0FBSyxtQ0FBTCxDQUFoQjtBQUZ5QixhQUFaLENBQWpCO0FBSUg7QUFDSjtBQXhDMEMsQ0FBckIsQ0FBMUI7O0FBMkNBLE9BQU8sT0FBUCxHQUFpQixpQkFBakI7Ozs7Ozs7OztBQ2xEQTs7QUFDQTs7Ozs7Ozs7Ozs7O0lBRXFCLFM7OztBQUNqQiw2QkFBMEM7QUFBQSxZQUE1QixHQUE0QixRQUE1QixHQUE0QjtBQUFBLFlBQXZCLFVBQXVCLFFBQXZCLFVBQXVCO0FBQUEsWUFBWCxPQUFXLFFBQVgsT0FBVzs7QUFBQTs7QUFBQSwySEFDN0IsU0FENkI7O0FBRXRDLGNBQUssR0FBTCxHQUFXLEdBQVg7O0FBRUEsY0FBSyxjQUFMLEdBQXNCLElBQUksMkJBQUosQ0FBbUIsRUFBRSxRQUFGLEVBQU8sc0JBQVAsRUFBbUIsZ0JBQW5CLEVBQTRCLGdCQUFnQixDQUFDLENBQUMsUUFBUSxjQUF0RCxFQUFuQixDQUF0Qjs7QUFFQSxjQUFLLEtBQUwsR0FBYSxJQUFJLFlBQUosQ0FBVTtBQUNuQixzQkFBYSxLQURNO0FBRW5CLG1CQUFhLE9BQU8sSUFBUCxDQUFZLDZCQUFaLENBRk07QUFHbkIscUJBQWEsQ0FBQyxPQUFELEVBQVUsV0FBVixDQUhNO0FBSW5CLHFCQUFhLE1BQUssY0FBTCxDQUFvQixHQUpkO0FBS25CLHdCQUFhLE1BQUssY0FBTCxDQUFvQixHQUFwQixDQUF3QixJQUF4QixDQUE2QixpQkFBN0I7QUFMTSxTQUFWLENBQWI7O0FBUUEsY0FBSyxLQUFMLENBQVcsSUFBWDs7QUFFQSxjQUFLLFFBQUwsQ0FBYyxNQUFLLEdBQW5CLEVBQXdCLGdCQUF4QixFQUEwQyxZQUFNO0FBQUUsa0JBQUssS0FBTCxDQUFXLEtBQVg7QUFBcUIsU0FBdkU7QUFoQnNDO0FBaUJ6Qzs7O0VBbEJrQyxTQUFTLEk7O3FCQUEzQixTOzs7Ozs7Ozs7OztBQ0hyQixJQUFBLFVBQUEsR0FBQSxPQUFBLENBQUEsY0FBQSxDQUFBLENBQUE7Ozs7QUFDQSxJQUFBLGdCQUFBLEdBQUEsT0FBQSxDQUFBLDJCQUFBLENBQUEsQ0FBQTs7OztBQUNBLElBQUEsb0JBQUEsR0FBQSxPQUFBLENBQUEsd0JBQUEsQ0FBQSxDQUFBOzs7O0FBQ0EsSUFBQSxnQkFBQSxHQUFBLE9BQUEsQ0FBQSw2Q0FBQSxDQUFBLENBQUE7Ozs7QUFDQSxJQUFBLG9CQUFBLEdBQUEsT0FBQSxDQUFBLHVDQUFBLENBQUEsQ0FBQTs7OztBQUNBLElBQUEsTUFBQSxHQUFBLE9BQUEsQ0FBQSxvQkFBQSxDQUFBLENBQUE7O0FBU0EsSUFBQSx5QkFBQSxHQUFBLE9BQUEsQ0FBQSw0Q0FBQSxDQUFBLENBQUE7Ozs7QUFDQSxJQUFBLGlCQUFBLEdBQUEsT0FBQSxDQUFBLDZDQUFBLENBQUEsQ0FBQTs7Ozs7Ozs7Ozs7O2NBUmlDO0lBQXpCLHlCQUFBO0lBQWdCLGVBQUE7O0FBQ3hCO0FBQ0EsSUFBTSxJQUFBLEdBQU8sT0FBQSxDQUFRLE1BQVIsQ0FBYixDQUFBO0FBQ0EsSUFBTSxxQkFBQSxHQUF3QixxOUJBQTlCLENBQUE7O0lBT3FCOzs7SUFLakIsU0FBQSxnQkFBQSxDQUFBLElBQUEsRUFBNkQ7UUFBQSxJQUEvQyxHQUErQyxHQUFBLElBQUEsQ0FBL0MsR0FBK0M7WUFBMUMsVUFBMEMsR0FBQSxJQUFBLENBQTFDLFVBQTBDO1lBQTlCLEtBQThCLEdBQUEsSUFBQSxDQUE5QixLQUE4QjtZQUF2QixtQkFBdUIsR0FBQSxJQUFBLENBQXZCLG1CQUF1QixDQUFBOztRQUFBLGVBQUEsQ0FBQSxJQUFBLEVBQUEsZ0JBQUEsQ0FBQSxDQUFBOztRQUFBLElBQUEsS0FBQSxHQUFBLDBCQUFBLENBQUEsSUFBQSxFQUFBLENBQUEsZ0JBQUEsQ0FBQSxTQUFBLElBQUEsTUFBQSxDQUFBLGNBQUEsQ0FBQSxnQkFBQSxDQUFBLEVBQUEsSUFBQSxDQUFBLElBQUEsQ0FBQSxDQUFBLENBQUE7O1FBQUEsS0FBQSxDQUo3RCxnQkFJNkQsR0FKMUMsY0FBQSxDQUFlLFNBQWYsQ0FBeUIsbUJBQXpCLENBQUEsR0FDYixxQkFBQSxDQUFBLFNBQUEsQ0FEYSxHQUViLENBQUEsQ0FBRSxRQUFGLENBQVcscUJBQVgsQ0FFdUQsQ0FBQTs7UUFFekQsS0FBQSxDQUFLLEdBQUwsR0FBVyxHQUFYLENBQUE7UUFDQSxLQUFBLENBQUssVUFBTCxHQUFrQixVQUFsQixDQUFBO1FBQ0EsS0FBQSxDQUFLLEtBQUwsR0FBYSxLQUFiLENBQUE7UUFDQSxLQUFBLENBQUssbUJBQUwsR0FBMkIsbUJBQTNCLENBQUE7UUFDQSxLQUFBLENBQUssVUFBTCxHQUFrQixJQUFJLGlCQUFBLENBQUEsU0FBQSxDQUFKLEVBQWxCLENBQUE7UUFDQSxLQUFBLENBQUssYUFBTCxHQUFxQixVQUFBLENBQVcsVUFBWCxDQUFzQixPQUF0QixDQUE4QixhQUE5QixDQUE0QyxFQUFqRSxDQUFBOztRQUVBLEtBQUEsQ0FBSyxVQUFMLENBQWdCLEdBQWhCLEdBQXlCLE1BQUEsQ0FBTyxHQUFQLENBQ3JCLE1BQUEsQ0FBTyxNQUFQLENBQWMsSUFBZCxDQUFtQixLQUFuQixDQUF5QixnQkFESixFQUVyQixFQUFFLEVBQUEsRUFBSSxVQUFBLENBQVcsRUFBakIsRUFGcUIsQ0FBekIsR0FBQSxRQUFBLElBSUksS0FBQSxDQUFLLGFBQUwsR0FBQSxpQkFBQSxHQUF1QyxLQUFBLENBQUssYUFBNUMsR0FBOEQsRUFKbEUsQ0FBQSxDQUFBO1FBTUEsS0FBQSxDQUFLLFVBQUwsQ0FBZ0IsS0FBaEIsR0FBd0IsVUFBQyxRQUFELEVBQWM7WUFDbEMsSUFBSSxnQkFBQSxHQUFtQixRQUFBLENBQVMsTUFBaEMsQ0FBQTtZQUNBLElBQ0ksTUFBQSxDQUFPLGNBQVAsQ0FBc0IsU0FBdEIsQ0FBZ0MseUJBQWhDLENBQUEsSUFDQSxRQUFBLENBQVMsTUFGYixFQUdFO2dCQUNFLGdCQUFBLEdBQW1CLFFBQUEsQ0FBUyxNQUFULENBQWdCLE1BQWhCLENBQ2YsVUFBQyxDQUFELEVBQUE7b0JBQUEsT0FBTyxDQUFBLENBQUUsT0FBRixLQUFjLElBQXJCLENBQUE7aUJBRGUsQ0FBbkIsQ0FBQTthQUdIO1lBQ0QsT0FBTyxDQUFBLENBQUUsTUFBRixDQUFTLGdCQUFULENBQVAsQ0FBQTtTQVZKLENBQUE7UUFZQSxLQUFBLENBQUssV0FBTCxHQUFtQixLQUFBLENBQUssVUFBTCxDQUFnQixHQUFoQixDQUFvQixhQUFwQixDQUFBLElBQXNDLENBQXpELENBQUE7UUFDQSxLQUFBLENBQUssZ0JBQUwsR0FBd0IsQ0FBQSxDQUFBLEVBQUEsa0JBQUEsQ0FBQSxTQUFBLENBQUEsRUFBaUIsS0FBQSxDQUFLLFVBQXRCLENBQXhCLENBQUE7O1FBRUEsS0FBQSxDQUFLLGVBQUwsRUFBQSxDQUFBO1FBQ0EsS0FBQSxDQUFLLGVBQUwsR0FBdUIsS0FBQSxDQUFLLENBQUwsQ0FBTyx5QkFBUCxDQUF2QixDQUFBOztRQUVBLElBQU0sUUFBQSxHQUFXLElBQUksTUFBQSxDQUFPLFFBQVAsQ0FBZ0IsTUFBcEIsQ0FBMkI7WUFDeEMsT0FBQSxFQUFTLEtBQUEsQ0FBSyxlQUQwQjtZQUV4QyxLQUFBLEVBQU8sU0FBQSxLQUFBLEdBQU07Z0JBQ1QsUUFBQSxDQUFTLE9BQVQsRUFBQSxDQUFBO2dCQUNBLEtBQUEsQ0FBSyxrQkFBTCxFQUFBLENBQUE7YUFDSDtTQUxZLENBQWpCLENBQUE7O1FBUUEsSUFBSSxhQUFBLEdBQWdCO1lBQ2hCLFFBQUEsRUFBVSxLQURNO1lBRWhCLEtBQUEsRUFBTyxJQUFBLENBQUssZ0JBQUwsQ0FGUztZQUdoQixPQUFBLEVBQVMsQ0FBQyx5QkFBRCxDQUhPO1lBSWhCLE9BQUEsRUFBUyxLQUFBLENBQUssR0FBQTtTQUpsQixDQUFBOztRQU9BLEtBQUEsQ0FBSyxLQUFMLEdBQWEsSUFBSSxNQUFBLENBQUEsS0FBSixDQUFVLGFBQVYsQ0FBYixDQUFBO1FBQ0EsS0FBQSxDQUFLLEtBQUwsQ0FBVyxJQUFYLEVBQUEsQ0FBQTtRQWpEeUQsT0FBQSxLQUFBLENBQUE7S0FrRDVEOzs7OzZDQUVvQjtZQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7WUFDakIsSUFBQSxDQUFLLFVBQUwsQ0FDSyxLQURMLEVBQUEsQ0FFSyxJQUZMLENBRVUsVUFBQyxHQUFELEVBQVM7Z0JBQ1gsSUFBSSxDQUFBLENBQUUsR0FBQSxDQUFJLE1BQU4sQ0FBQSxDQUFjLE9BQWQsRUFBSixFQUE2QjtvQkFDekIsTUFBQSxDQUFLLGVBQUwsQ0FBcUIsS0FBckIsRUFBQSxDQUFBO29CQUNBLE9BQUE7aUJBQ0g7Z0JBQ0QsTUFBQSxDQUFLLG1CQUFMLEVBQUEsQ0FBQTthQVBSLENBQUEsQ0FTSyxJQVRMLENBU1UsWUFBTTtnQkFDUixNQUFBLENBQUssZUFBTCxDQUFxQixLQUFyQixFQUFBLENBQUE7YUFWUixDQUFBLENBQUE7U0FZSDs7OzBDQUVpQjtZQUNkLElBQUksY0FBQSxDQUFlLFNBQWYsQ0FBeUIsWUFBekIsQ0FBSixFQUE0QztnQkFDeEMsSUFBSSxJQUFBLEdBQU8sSUFBWCxDQUFBO2dCQUNBLElBQUksU0FBQSxHQUFZLGNBQUEsQ0FBZSxTQUFmLENBQXlCLHlCQUF6QixDQUFBLEdBQ1YsSUFBQSxDQUFLLFVBQUwsQ0FBZ0IsU0FETixHQUVWLElBQUEsQ0FBSyxVQUFMLENBQWdCLEdBQWhCLENBQW9CLFNBQXBCLENBQUEsSUFDQSxDQUFDLElBQUEsQ0FBSyxVQUFMLENBQWdCLEdBQWhCLENBQW9CLGFBQXBCLENBSFAsQ0FBQTs7Z0JBS0EsSUFBSSxTQUFKLEVBQWU7b0JBQ1gsSUFBQSxHQUFBLFFBQUEsR0FBZ0IsSUFBQSxDQUNaLHlDQURZLENBQWhCLEdBQUEsb0ZBQUEsR0FFc0YsSUFBQSxDQUNsRiw4QkFEa0YsQ0FGdEYsR0FBQSxhQUFBLENBQUE7aUJBREosTUFNTyxJQUFJLElBQUEsQ0FBSyxVQUFMLENBQWdCLEdBQWhCLENBQW9CLFlBQXBCLENBQUosRUFBdUM7b0JBQzFDLElBQUEsR0FBTyxJQUFBLENBQUssa0NBQUwsQ0FBUCxDQUFBO2lCQURHLE1BRUEsSUFBSSxNQUFBLENBQU8sU0FBUCxDQUFpQixTQUFyQixFQUFnQztvQkFDbkMsSUFBQSxHQUFPLElBQUEsQ0FBSyw0QkFBTCxDQUFQLENBQUE7aUJBQ0g7O2dCQUVELE9BQUEsNEVBQUEsR0FDc0MsSUFBQSxDQUN0QixvQ0FEc0IsQ0FEdEMsR0FBQSx5Q0FBQSxHQUlvQixJQUFBLENBQUssK0JBQUwsRUFBc0M7b0JBQzFDLGdCQUFBLEVBQ0ksSUFBQSxDQUFLLFVBQUwsQ0FBZ0IsR0FBaEIsQ0FBb0Isa0JBQXBCLENBRnNDO29CQUcxQyxXQUFBLEVBQWEsSUFBQSxDQUFLLFVBQUwsQ0FBZ0IsR0FBaEIsQ0FBb0IsYUFBcEIsQ0FBQTtpQkFIVCxDQUpwQixHQUFBLHlEQUFBLElBV1ksSUFBQSxHQUFBLDBDQUFBLEdBQ2lELElBQUEsQ0FDdkMsTUFEdUMsQ0FEakQsR0FBQSxlQUFBLEdBR3VCLElBSHZCLEdBQUEsYUFBQSxHQUlNLEVBZmxCLENBQUEsQ0FBQTthQW5CSixNQW9DTztnQkFDSCxJQUFJLElBQUEsR0FBTyxJQUFJLGlCQUFBLENBQUEsU0FBQSxDQUFKLENBQW9CO29CQUMzQixLQUFBLEVBQU8sSUFBQSxDQUFLLFVBRGU7b0JBRTNCLElBQUEsRUFBTSxpQkFBQTtpQkFGQyxDQUFBLENBR1IsTUFIUSxFQUFYLENBQUE7Z0JBSUEsT0FBTyxJQUFBLENBQUssR0FBTCxDQUFTLElBQVQsRUFBUCxDQUFBO2FBQ0g7U0FDSjs7OzhDQUVxQjtZQUNsQixJQUFBLENBQUssZUFBTCxDQUFxQixLQUFyQixFQUFBLENBQUE7O1lBRUEsSUFBTSxXQUFBLEdBQUEsRUFBQSxHQUFpQixNQUFBLENBQU8sR0FBUCxDQUFXLE1BQUEsQ0FBTyxNQUFQLENBQWMsY0FBekIsRUFBeUM7Z0JBQzVELEVBQUEsRUFBSSxJQUFBLENBQUssVUFBTCxDQUFnQixVQUFoQixDQUEyQixFQUFBO2FBRFosQ0FBakIsSUFFRCxJQUFBLENBQUssYUFBTCxHQUFBLGlCQUFBLEdBQXVDLElBQUEsQ0FBSyxhQUE1QyxHQUE4RCxFQUY3RCxDQUFOLENBQUE7O1lBSUEsSUFBQSxDQUFLLGVBQUwsQ0FBcUIsTUFBckIsQ0FBNEIsQ0FBQSxDQUFBLEVBQUEsMEJBQUEsQ0FBQSxTQUFBLENBQUEsRUFBc0IsRUFBRSxXQUFBLEVBQUEsV0FBRixFQUF0QixDQUE1QixDQUFBLENBQUE7O1lBRUEsSUFBQSxDQUFLLG1CQUFMLEdBQTJCLElBQUkscUJBQUEsQ0FBQSxTQUFBLENBQUosQ0FBd0I7Z0JBQy9DLEVBQUEsRUFBSSxJQUFBLENBQUssZUFBTCxDQUFxQixJQUFyQixDQUEwQixnQkFBMUIsQ0FEMkM7Z0JBRS9DLEdBQUEsRUFBSyxJQUFBLENBQUssR0FGcUM7Z0JBRy9DLElBQUEsRUFBTSxXQUFBLENBQUEsU0FBQSxDQUh5QztnQkFJL0MsVUFBQSxFQUFZO29CQUNSLE9BQUEsRUFBTywwRUFBQTtpQkFMb0M7Z0JBTy9DLFVBQUEsRUFBWSxJQUFBLENBQUssVUFQOEI7Z0JBUS9DLFdBQUEsRUFBYSxFQUFFLE1BQUEsRUFBUSxHQUFWLEVBQWUsTUFBQSxFQUFRLEdBQXZCLEVBQTRCLE9BQUEsRUFBUyxHQUFyQyxFQUFBO2FBUlUsQ0FBM0IsQ0FBQTtTQVVIOzs7MENBRWlCO1lBQ2QsSUFBSSxrQkFBQSxHQUFxQixNQUFBLENBQU8sR0FBUCxDQUFXLE1BQUEsQ0FBTyxNQUFQLENBQWMsWUFBekIsRUFBdUM7Z0JBQzVELElBQUEsRUFBTSxXQURzRDtnQkFFNUQsS0FBQSxFQUFPLElBQUEsQ0FBSyxVQUFMLENBQWdCLEdBQWhCLENBQW9CLGdCQUFwQixDQUZxRDtnQkFHNUQsTUFBQSxFQUFRLFlBQUE7YUFIYSxDQUF6QixDQUFBOztZQU1BLElBQUEsQ0FBSyxHQUFMLENBQVMsTUFBVCxDQUNJLElBQUEsQ0FBSyxnQkFBTCxDQUFzQjtnQkFDbEIscUJBQUEsRUFDSSxJQUFBLENBQUssbUJBQUwsSUFDQSxDQUFDLGNBQUEsQ0FBZSxTQUFmLENBQXlCLGdCQUF6QixDQURELEdBRU0sb0NBRk4sR0FHTSx3QkFMUTtnQkFNbEIsY0FBQSxFQUFnQixNQUFBLENBQU8sR0FBUCxDQUFXLE1BQUEsQ0FBTyxNQUFQLENBQWMsWUFBekIsQ0FORTtnQkFPbEIsS0FBQSxFQUFPLElBQUEsQ0FBSyxLQVBNO2dCQVFsQixVQUFBLEVBQVksSUFBQSxDQUFLLFVBQUwsQ0FBZ0IsVUFSVjtnQkFTbEIsZ0JBQUEsRUFBa0Isa0JBVEE7Z0JBVWxCLFNBQUEsRUFBVyxJQUFBLENBQUssZUFBTCxFQVZPO2dCQVdsQixXQUFBLEVBQWEsSUFBQSxDQUFLLFdBWEE7Z0JBWWxCLGdCQUFBLEVBQWtCLElBQUEsQ0FBSyxnQkFBQTthQVozQixDQURKLENBQUEsQ0FBQTtTQWdCSDs7OztFQWxLeUMsUUFBQSxDQUFTOztxQkFBbEM7Ozs7OztBQ2ZyQixJQUFBLGNBQUEsR0FBQSxPQUFBLENBQUEsNEJBQUEsQ0FBQSxDQUFBOzs7O0FBQ0EsSUFBQSxZQUFBLEdBQUEsT0FBQSxDQUFBLGdDQUFBLENBQUEsQ0FBQTs7OztBQUhBLElBQU0sUUFBQSxHQUFZLE1BQUEsQ0FBTyxRQUF6QixDQUFBOztBQUtBO0FBQ0EsSUFBTSxJQUFBLEdBQU8sT0FBQSxDQUFRLE1BQVIsQ0FBYixDQUFBO0FBQ0EsSUFBTSxnQkFBQSxHQUFtQix1N0JBQXpCLENBQUE7O0FBRUEsSUFBTSxhQUFBLEdBQWdCLFFBQUEsQ0FBUyxJQUFULENBQWMsTUFBZCxDQUFxQjtJQUN2QyxRQUFBLEVBQVUsQ0FBQSxDQUFFLFFBQUYsQ0FBVyxnQkFBWCxDQUQ2Qjs7SUFHdkMsVUFIdUMsRUFBQSxTQUFBLFVBQUEsQ0FHNUIsR0FINEIsRUFHdkIsVUFIdUIsRUFHWDtRQUFBLElBQUEsS0FBQSxHQUFBLElBQUEsQ0FBQTs7UUFDeEIsSUFBQSxDQUFLLEdBQUwsR0FBVyxHQUFYLENBQUE7O1FBRUEsSUFBTSxRQUFBLEdBQVc7WUFDYixTQUFBLEVBQVcsQ0FBQSxDQUFBLEVBQUEsWUFBQSxDQUFBLFdBQUEsRUFBWSxpQkFBWixDQURFO1lBRWIsSUFBQSxFQUFNLE1BQUEsQ0FBTyxJQUZBO1lBR2IsSUFBQSxFQUFNLE1BQUEsQ0FBTyxJQUFBO1NBSGpCLENBQUE7O1FBTUEsSUFBQSxDQUFLLEdBQUwsQ0FBUyxJQUFULENBQWMsSUFBQSxDQUFLLFFBQUwsQ0FBYyxRQUFkLENBQWQsQ0FBQSxDQUFBOztRQUVBLElBQUksYUFBQSxHQUFnQjtZQUNoQixRQUFBLEVBQVUsS0FETTtZQUVoQixVQUFBLEVBQVksTUFBQSxDQUFPLElBQVAsQ0FBWSxnQ0FBWixDQUZJO1lBR2hCLEtBQUEsRUFBTyxNQUFBLENBQU8sSUFBUCxDQUFZLFlBQVosQ0FIUztZQUloQixPQUFBLEVBQVMsQ0FBQyxPQUFELEVBQVUsZUFBVixDQUpPO1lBS2hCLE9BQUEsRUFBUyxJQUFBLENBQUssR0FBQTtTQUxsQixDQUFBOztRQVFBLElBQUEsQ0FBSyxLQUFMLEdBQWEsSUFBSSxlQUFBLENBQUEsU0FBQSxDQUFKLENBQWtCLGFBQWxCLENBQWIsQ0FBQTs7UUFFQSxJQUFBLENBQUssS0FBTCxDQUFXLElBQVgsRUFBQSxDQUFBOztRQUVBLElBQUEsQ0FBSyxLQUFMLENBQVcsRUFBWCxDQUFjLFFBQWQsRUFBd0IsWUFBQTtZQUFBLE9BQU0sS0FBQSxDQUFLLEdBQUwsQ0FBUyxPQUFULENBQWlCLDBCQUFqQixFQUE2QyxFQUFFLEtBQUEsRUFBTyxVQUFULEVBQTdDLENBQU4sQ0FBQTtTQUF4QixDQUFBLENBQUE7O1FBRUEsSUFBQSxDQUFLLFFBQUwsQ0FBYyxJQUFBLENBQUssR0FBbkIsRUFBd0IsZ0JBQXhCLEVBQTBDLFlBQU07WUFBRSxLQUFBLENBQUssS0FBTCxDQUFXLEtBQVgsRUFBQSxDQUFBO1NBQWxELENBQUEsQ0FBQTtLQUNIO0NBN0JpQixDQUF0QixDQUFBOztBQWdDQSxNQUFBLENBQU8sT0FBUCxHQUFpQixhQUFqQixDQUFBOzs7Ozs7Ozs7Ozs7QUN6Q0E7Ozs7QUFDQTs7Ozs7Ozs7Ozs7O0lBRXFCLGM7OztBQUdqQixrQ0FBa0U7QUFBQSxZQUFwRCxHQUFvRCxRQUFwRCxHQUFvRDtBQUFBLFlBQS9DLFVBQStDLFFBQS9DLFVBQStDO0FBQUEsWUFBbkMsT0FBbUMsUUFBbkMsT0FBbUM7QUFBQSx1Q0FBMUIsY0FBMEI7QUFBQSxZQUExQixjQUEwQix1Q0FBVCxLQUFTOztBQUFBOztBQUFBLHFJQUNyRCxTQURxRDs7QUFBQSxjQUZsRSxRQUVrRSxHQUZ2RCwyQkFFdUQ7OztBQUc5RCxjQUFLLFVBQUwsR0FBa0IsVUFBbEI7QUFDQSxjQUFLLE9BQUwsR0FBa0IsT0FBbEI7QUFDQSxjQUFLLEdBQUwsR0FBa0IsR0FBbEI7QUFDQSxjQUFLLElBQUwsR0FBa0IsT0FBTyxJQUF6QjtBQUNBLGNBQUssY0FBTCxHQUFzQixjQUF0Qjs7QUFFQSxjQUFLLElBQUwsQ0FBVSxNQUFWLENBQWlCLElBQWpCLENBQXNCLFlBQU07QUFDeEIsa0JBQUssTUFBTDtBQUNBLGtCQUFLLFdBQUw7QUFDSCxTQUhEO0FBVDhEO0FBYWpFOzs7O2lDQUVRO0FBQUE7O0FBQ0wsZ0JBQU0sV0FBVztBQUNiLHVCQUFvQixLQUFLLFVBQUwsQ0FBZ0IsR0FBaEIsQ0FBb0IsT0FBcEIsQ0FEUDtBQUViLHNCQUFvQixLQUFLLFVBQUwsQ0FBZ0IsR0FBaEIsQ0FBb0IsTUFBcEIsQ0FGUDtBQUdiLDBCQUFvQixLQUFLLFVBQUwsQ0FBZ0IsV0FBaEIsQ0FBNEIsR0FBNUIsQ0FIUDtBQUliLG9CQUFvQixLQUFLLFVBQUwsQ0FBZ0IsRUFKdkI7QUFLYixtQ0FBb0IsS0FBSyxVQUFMLENBQWdCLEdBQWhCLENBQW9CLG1CQUFwQixDQUxQO0FBTWIsZ0NBQW9CLEtBQUssVUFBTCxDQUFnQixHQUFoQixDQUFvQixzQkFBcEIsQ0FOUDtBQU9iLDZCQUFvQixLQUFLLFVBQUwsQ0FBZ0IsR0FBaEIsQ0FBb0IsYUFBcEIsQ0FQUDtBQVFiO0FBQ0EsNkJBQW9CLE9BQU8sT0FBTyxTQUFQLENBQWlCLFdBQXhCLEVBQXFDLE9BQXJDLENBQTZDLE9BQTdDLEVBQXNELElBQXRELENBVFA7QUFVYixzQkFBb0IsT0FBTyxJQVZkO0FBV2Isc0JBQW9CLE9BQU8sSUFYZDtBQVliLGdDQUFvQixLQUFLO0FBWlosYUFBakI7O0FBZUEsaUJBQUssR0FBTCxDQUFTLElBQVQsQ0FBYyxLQUFLLFFBQUwsQ0FBYyxRQUFkLENBQWQ7O0FBRUEsaUJBQUssS0FBTCxHQUFhLEtBQUssR0FBTCxDQUFTLElBQVQsQ0FBYyxNQUFkLENBQWI7O0FBRUEsZ0JBQUksS0FBSyxVQUFMLENBQWdCLGtCQUFwQixFQUF3QztBQUNwQyxxQkFBSyxVQUFMLENBQWdCLEdBQWhCLENBQW9CLFlBQXBCLEVBQWtDLE1BQWxDO0FBQ0g7O0FBRUQsaUJBQUssaUJBQUwsR0FBeUIsSUFBSSw4QkFBSixDQUFzQjtBQUMzQyx1QkFBVSxLQUFLLFVBRDRCO0FBRTNDLHNCQUFVLFFBRmlDO0FBRzNDLG9CQUFVLEtBQUssS0FBTCxDQUFXLElBQVgsQ0FBZ0IsY0FBaEIsQ0FIaUM7QUFJM0Msd0JBQVU7QUFBQSwyQkFBTSxPQUFLLEtBQUwsQ0FBVyxNQUFYLEVBQU47QUFBQTtBQUppQyxhQUF0QixDQUF6QjtBQU1IOzs7c0NBRWE7QUFBQTs7QUFDVixpQkFBSyxLQUFMLENBQ0ssVUFETCxDQUNnQixPQURoQixFQUN5QixRQUR6QixFQUVLLEVBRkwsQ0FFUSxtQkFGUixFQUU2QixZQUFNO0FBQzNCLHVCQUFLLElBQUwsQ0FBVSxZQUFWLENBQXVCLE9BQUssR0FBTCxDQUFTLElBQVQsQ0FBYywyQkFBZCxFQUEyQyxHQUEzQyxHQUFpRCxJQUFqRCxFQUF2QjtBQUNBLHVCQUFLLEdBQUwsQ0FBUyxPQUFULENBQWlCLFlBQWpCLEVBQStCLE9BQUssVUFBcEMsRUFBZ0QsT0FBSyxPQUFyRDtBQUNILGFBTEw7QUFNSDs7OztFQXpEdUMsU0FBUyxJOztxQkFBaEMsYzs7Ozs7Ozs7Ozs7QUNIckI7O0FBQ0E7Ozs7Ozs7Ozs7OztJQUVxQixrQjs7Ozs7Ozs7Ozs7eUNBQ2dCO0FBQUE7O0FBQUEsZ0JBQXJCLEdBQXFCLFFBQXJCLEdBQXFCO0FBQUEsZ0JBQWhCLEtBQWdCLFFBQWhCLEtBQWdCO0FBQUEsZ0JBQVQsTUFBUyxRQUFULE1BQVM7O0FBQzdCLGlCQUFLLEdBQUwsR0FBa0IsR0FBbEI7QUFDQSxpQkFBSyxNQUFMLEdBQWtCLFVBQVcsWUFBTSxDQUFFLENBQXJDOztBQUVBLGdCQUFNLFdBQVk7QUFDZCxzQkFBa0IsT0FBTyxJQUFQLENBQVksOEJBQVosQ0FESjtBQUVkLDJCQUFrQixPQUFPLElBQVAsQ0FBWSw0QkFBWixFQUEwQyxFQUFFLE9BQU8sTUFBTSxVQUFOLENBQWlCLEtBQTFCLEVBQTFDLENBRko7QUFHZCw4QkFBa0IsT0FBTyxJQUFQLENBQVksdUJBQVosQ0FISjtBQUlkLDhCQUFrQixPQUFPLElBQVAsQ0FBWSxRQUFaO0FBSkosYUFBbEI7O0FBT0EsZ0JBQU0sVUFBVSxFQUFFLGdDQUEyQixRQUEzQixDQUFGLENBQWhCOztBQUVBLGdCQUFJLGdCQUFnQjtBQUNoQiwwQkFBVSxLQURNO0FBRWhCLHVCQUFPLE9BQU8sSUFBUCxDQUFZLHVCQUFaLENBRlM7QUFHaEIseUJBQVMsT0FITztBQUloQixvQkFBSTtBQUpZLGFBQXBCOztBQU9BLGlCQUFLLEtBQUwsR0FBYSxJQUFJLFlBQUosQ0FBVSxhQUFWLENBQWI7O0FBRUEsaUJBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxJQUFmLENBQW9CLFlBQXBCLEVBQWtDLEVBQWxDLENBQXFDLE9BQXJDLEVBQThDLFlBQU07QUFDaEQsdUJBQUssS0FBTCxDQUFXLEtBQVg7QUFDSCxhQUZEOztBQUlBLGlCQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsSUFBZixDQUFvQixvQkFBcEIsRUFBMEMsRUFBMUMsQ0FBNkMsT0FBN0MsRUFBc0QsWUFBTTtBQUN4RCx1QkFBSyxNQUFMO0FBQ0EsdUJBQUssS0FBTCxDQUFXLEtBQVg7QUFDSCxhQUhEOztBQUtBLGlCQUFLLEtBQUwsQ0FBVyxJQUFYO0FBQ0g7Ozs7RUFqQzJDLFNBQVMsSTs7cUJBQXBDLGtCOzs7Ozs7Ozs7Ozs7O0FDSHJCOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7Ozs7O0lBRXFCLFM7Ozs7OzRCQUNEO0FBQ1osbUJBQU8sWUFBUDtBQUNIOzs7QUFFRCx5QkFBYztBQUFBOztBQUFBLDJIQUNELFNBREM7O0FBRVYsY0FBSyxNQUFMLEdBQWMsRUFBZDs7QUFFQSxjQUFLLE1BQUw7QUFKVTtBQUtiOzs7O2lDQUVRO0FBQ0wsaUJBQUssTUFBTCxDQUFZLE9BQVosQ0FBb0IsVUFBQyxJQUFEO0FBQUEsdUJBQVUsS0FBSyxNQUFMLEVBQVY7QUFBQSxhQUFwQjtBQUNBLGlCQUFLLE1BQUwsR0FBYyxFQUFkO0FBQ0g7OztpQ0FFUTtBQUNMLGlCQUFLLE1BQUw7QUFDQTtBQUNIOzs7aUNBRVE7QUFBQTs7QUFDTCxpQkFBSyxNQUFMOztBQUVBLGlCQUFLLE1BQUwsQ0FBWSxJQUFaLENBQ0ssS0FBSyxTQUFMLEdBQWlCLElBQUksc0JBQUosQ0FBYyxFQUFFLE9BQU8sS0FBSyxLQUFkLEVBQWQsQ0FEdEI7O0FBSUEsZ0JBQUksQ0FBQyxPQUFPLGNBQVAsQ0FBc0IsU0FBdEIsQ0FBZ0MsU0FBaEMsQ0FBTCxFQUFpRDtBQUM3QyxxQkFBSyxNQUFMLENBQVksSUFBWixDQUNLLEtBQUssV0FBTCxHQUFtQixJQUFJLHdCQUFKLENBQWdCLEVBQUUsT0FBTyxLQUFLLEtBQWQsRUFBaEIsQ0FEeEI7QUFHQSxxQkFBSyxXQUFMLENBQWlCLEdBQWpCLENBQXFCLFFBQXJCLENBQThCLFlBQTlCO0FBQ0g7QUFDRCxnQkFBSSxLQUFLLEtBQUwsQ0FBVyxVQUFmLEVBQTJCO0FBQ3ZCLHFCQUFLLE1BQUwsQ0FBWSxJQUFaLENBQ0ssS0FBSyxZQUFMLEdBQW9CLElBQUkseUJBQUosQ0FBaUIsRUFBRSxPQUFPLEtBQUssS0FBZCxFQUFqQixDQUR6QjtBQUdILGFBSkQsTUFJTyxJQUFJLENBQUMsT0FBTyxjQUFQLENBQXNCLFNBQXRCLENBQWdDLFNBQWhDLENBQUwsRUFBaUQ7QUFDcEQscUJBQUssTUFBTCxDQUFZLElBQVosQ0FDSyxLQUFLLFdBQUwsR0FBbUIsSUFBSSx3QkFBSixDQUFnQixFQUFFLE9BQU8sS0FBSyxLQUFkLEVBQWhCLENBRHhCO0FBR0g7O0FBRUQsaUJBQUssTUFBTCxDQUFZLElBQVosQ0FDSyxLQUFLLGdCQUFMLEdBQXdCLElBQUksNkJBQUosQ0FBcUI7QUFDMUMsd0JBQVEsS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLE1BQWYsRUFBdUI7QUFEVyxhQUFyQixDQUQ3Qjs7QUFNQSxpQkFBSyxHQUFMLENBQVMsS0FBVDtBQUNBLHlCQUFLLEdBQUwsRUFBUyxNQUFULGdDQUFtQixLQUFLLE1BQUwsQ0FBWSxHQUFaLENBQWdCLFVBQUMsSUFBRDtBQUFBLHVCQUFVLEtBQUssR0FBZjtBQUFBLGFBQWhCLENBQW5CO0FBQ0g7Ozs7RUFyRGtDLFNBQVMsSTs7cUJBQTNCLFM7Ozs7Ozs7O0FDTnJCLElBQU0sUUFBQSxHQUFZLE1BQUEsQ0FBTyxRQUF6QixDQUFBO0FBQ0EsSUFBTSxjQUFBLEdBQXdCLE1BQUEsQ0FBTyxjQUFyQyxDQUFBOztBQUVBO0FBQ0EsSUFBTSxJQUFBLEdBQU8sT0FBQSxDQUFRLE1BQVIsQ0FBYixDQUFBO0FBQ0EsSUFBTSxtQkFBQSxHQUFzQiwrSEFBNUIsQ0FBQTs7QUFFQSxJQUFNLFdBQUEsR0FBYyxRQUFBLENBQVMsSUFBVCxDQUFjLE1BQWQsQ0FBcUI7SUFDckMsUUFBQSxFQUFVLENBQUEsQ0FBRSxRQUFGLENBQVcsbUJBQVgsQ0FEMkI7O0lBR3JDLFNBQUEsRUFBVyxjQUgwQjs7SUFLckMsT0FBQSxFQUFTLEdBTDRCOztJQU9yQyxVQVBxQyxFQUFBLFNBQUEsVUFBQSxHQU94QjtRQUNULElBQUksSUFBQSxDQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsTUFBZixDQUFBLENBQXVCLEVBQXZCLEtBQThCLGFBQWxDLEVBQWlEO1lBQzdDLElBQUEsQ0FBSyxNQUFMLEVBQUEsQ0FBQTtTQUNIO0tBVmdDO0lBYXJDLE1BYnFDLEVBQUEsU0FBQSxNQUFBLEdBYTVCO1FBQ0wsSUFBSSxLQUFBLEdBQVEsSUFBQSxDQUFLLEtBQUwsQ0FBVyxNQUFYLEVBQVosQ0FBQTs7UUFFQSxJQUFJLEtBQUEsQ0FBTSxnQkFBTixJQUEwQixJQUExQixJQUFrQyxDQUFDLENBQUEsQ0FBRSxPQUFGLENBQVUsS0FBQSxDQUFNLGdCQUFoQixDQUF2QyxFQUEwRTtZQUN0RSxJQUFJLFdBQUEsR0FBYyxjQUFBLENBQWUsU0FBZixDQUF5QixtQkFBekIsQ0FBQSxHQUFnRCxLQUFBLENBQU0sZ0JBQXRELEdBQXlFLENBQUEsQ0FBRSxNQUFGLENBQVMsS0FBQSxDQUFNLGdCQUFmLENBQTNGLENBQUE7O1lBRUEsSUFBTSxRQUFBLEdBQVc7Z0JBQ2IsSUFBQSxFQUFjLE1BQUEsQ0FBTyxHQUFQLENBQVcsTUFBQSxDQUFPLE1BQVAsQ0FBYyxZQUF6QixFQUF1QyxFQUFFLElBQUEsRUFBTSxXQUFSLEVBQXFCLEtBQUEsRUFBTyxLQUFBLENBQU0sY0FBbEMsRUFBa0QsTUFBQSxFQUFRLFlBQTFELEVBQXZDLENBREQ7Z0JBRWIsS0FBQSxFQUFjLE1BQUEsQ0FBTyxJQUFQLENBQVksc0JBQVosRUFBb0MsRUFBRSxNQUFBLEVBQVEsV0FBVixFQUFwQyxDQUZEO2dCQUdiLElBQUEsRUFBYyxXQUFBO2FBSGxCLENBQUE7O1lBTUEsSUFBQSxDQUFLLEdBQUwsQ0FBUyxJQUFULENBQWMsTUFBQSxDQUFPLElBQVAsQ0FBWSxRQUFaLEVBQXNCLEVBQUUsT0FBQSxFQUFTLElBQUEsQ0FBSyxRQUFMLENBQWMsUUFBZCxDQUFYLEVBQXRCLENBQWQsQ0FBQSxDQUFBO1NBVEosTUFVSztZQUNELElBQUcsQ0FBQyxjQUFBLENBQWUsU0FBZixDQUF5QixlQUF6QixDQUFKLEVBQThDO2dCQUMxQyxJQUFBLENBQUssR0FBTCxDQUFTLElBQVQsQ0FBYyxNQUFBLENBQU8sSUFBUCxDQUFZLHlCQUFaLENBQWQsQ0FBQSxDQUFBO2FBQ0g7U0FDSjtLQUNKO0NBL0JlLENBQXBCLENBQUE7O3FCQW1DZTs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lDekNNLFk7OztBQUNqQiw0QkFBYztBQUFBOztBQUFBLGlJQUNELFNBREM7O0FBRVYsY0FBSyxNQUFMO0FBRlU7QUFHYjs7OztpQ0FFUTtBQUNMLGdCQUFJLE9BQU8sa0NBQWdDLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxTQUFmLENBQWhDLFlBQVg7QUFDQSxpQkFBSyxVQUFMLENBQWdCLElBQWhCO0FBQ0g7Ozs7RUFUcUMsU0FBUyxJOztxQkFBOUIsWTs7Ozs7Ozs7O0FDRHJCOzs7Ozs7QUFFQSxJQUFNLG1CQUFtQixTQUFTLElBQVQsQ0FBYyxNQUFkLENBQXFCO0FBQzFDLGNBRDBDLDRCQUNyQjtBQUFBLFlBQVQsTUFBUyxRQUFULE1BQVM7O0FBQ2pCLGFBQUssTUFBTCxHQUFjLE1BQWQ7QUFDQSxhQUFLLE1BQUw7QUFDSCxLQUp5QztBQU0xQyxVQU4wQyxvQkFNakM7QUFDTCxhQUFLLFVBQUwsQ0FBZ0IsRUFBRSxtQ0FBeUIsRUFBQyxRQUFRLEtBQUssTUFBZCxFQUF6QixDQUFGLENBQWhCO0FBQ0g7QUFSeUMsQ0FBckIsQ0FBekI7O3FCQVdlLGdCOzs7Ozs7Ozs7OztBQ2JmOzs7Ozs7Ozs7Ozs7SUFFcUIsUzs7O0FBQ2pCLHlCQUFjO0FBQUE7O0FBQUEsMkhBQ0QsU0FEQzs7QUFHVixjQUFLLFFBQUwsR0FBZ0Isc0JBQWhCO0FBQ0EsY0FBSyxNQUFMO0FBSlU7QUFLYjs7Ozt5Q0FFZ0I7QUFDYixnQkFBSSxhQUFhLEVBQWpCOztBQUVBLHVCQUFXLElBQVgsQ0FBZ0IsS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLE9BQWYsQ0FBaEI7O0FBRUEsZ0JBQUksQ0FBQyxDQUFDLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxrQkFBZixDQUFOLEVBQTBDO0FBQ3RDLDJCQUFXLElBQVgsQ0FBZ0IsT0FBTyxJQUFQLENBQVksUUFBWixFQUFzQixFQUFDLFNBQVMsS0FBSyxLQUFMLENBQVcsVUFBWCxHQUF3QixLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsV0FBZixFQUE0QixJQUFwRCxHQUEyRCxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsa0JBQWYsQ0FBckUsRUFBdEIsQ0FBaEI7QUFDSDs7QUFFRCx1QkFBVyxJQUFYLENBQWdCLEtBQUssS0FBTCxDQUFXLGdCQUFYLEVBQWhCOztBQUVBLHVCQUFXLElBQVgsQ0FBZ0IsS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLE1BQWYsRUFBdUIsSUFBdkM7O0FBRUEsbUJBQU8sV0FBVyxJQUFYLENBQWdCLEdBQWhCLENBQVA7QUFDSDs7O2lDQUVRO0FBQ0wsZ0JBQU0sV0FBVztBQUNiLHlCQUFZLEtBQUssS0FBTCxDQUFXLEVBRFY7QUFFYixzQkFBWSxLQUFLLEtBQUwsQ0FBVyxlQUZWO0FBR2IsMkJBQVksRUFBRSxNQUFGLENBQVMsS0FBSyxjQUFMLEVBQVQsQ0FIQztBQUliLHVCQUFZLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxPQUFmO0FBSkMsYUFBakI7O0FBT0EsaUJBQUssVUFBTCxDQUFnQixFQUFFLEtBQUssUUFBTCxDQUFjLFFBQWQsQ0FBRixDQUFoQjtBQUNIOzs7O0VBakNrQyxTQUFTLEk7O3FCQUEzQixTOzs7Ozs7Ozs7QUNGckI7Ozs7OztBQUVBLElBQU0sa0JBQWtCLFNBQWxCLGVBQWtCLE9BQVU7QUFBQSxRQUFSLEVBQVEsUUFBUixFQUFROztBQUM5QixRQUFNLE9BQU8sSUFBSSxnQ0FBSixDQUEwQixFQUFDLE1BQUQsRUFBMUIsQ0FBYixDQUQ4QixDQUNnQjtBQUM5QyxXQUFPLHFCQUFQLEdBQStCLElBQS9CO0FBQ0gsQ0FIRDs7cUJBS2UsZTs7Ozs7Ozs7O0FDUGY7Ozs7OztBQUVBLElBQU0sd0JBQXdCLGtCQUFTLE1BQVQsQ0FBZ0I7QUFDMUMsWUFBUTtBQUNKLHVDQUErQjtBQUQzQixLQURrQztBQUkxQyxjQUowQyw0QkFJekI7QUFBQSxZQUFMLEVBQUssUUFBTCxFQUFLOztBQUNiLGFBQUssRUFBTCxHQUFVLEVBQVY7QUFDQSxhQUFLLGdCQUFMLEdBQXdCLEVBQUUsdUJBQUYsQ0FBeEI7QUFDQSxhQUFLLG1CQUFMLEdBQTJCLEVBQUUseUJBQUYsQ0FBM0I7QUFDSCxLQVJ5QztBQVMxQyxRQVQwQyxrQkFTbkM7QUFDSCxVQUFFLHNCQUFGLEVBQTBCLFFBQTFCLENBQW1DLGlCQUFuQztBQUNBLGFBQUssZ0JBQUwsQ0FBc0IsR0FBdEIsQ0FBMEIsS0FBSyxtQkFBTCxDQUF5QixDQUF6QixDQUExQixFQUF1RCxRQUF2RCxDQUFnRSxTQUFoRTs7QUFFQTtBQUNBLFVBQUUsUUFBRixFQUFZLFVBQVosQ0FBdUIsVUFBdkIsRUFBbUMsT0FBbkMsRUFBNEMsRUFBRSx5QkFBRixDQUE1QztBQUNBLFlBQUksT0FBSixFQUFhLFFBQVEsV0FBUjtBQUNoQixLQWhCeUM7QUFpQjFDLFNBakIwQyxtQkFpQmxDO0FBQ0osVUFBRSxzQkFBRixFQUEwQixXQUExQixDQUFzQyxpQkFBdEM7QUFDQSxhQUFLLGdCQUFMLENBQXNCLEdBQXRCLENBQTBCLEtBQUssbUJBQUwsQ0FBeUIsQ0FBekIsQ0FBMUIsRUFBdUQsV0FBdkQsQ0FBbUUsU0FBbkU7QUFDQSxZQUFJLE9BQUosRUFBYSxRQUFRLFdBQVI7QUFDaEIsS0FyQnlDO0FBc0IxQyx5QkF0QjBDLG1DQXNCbEI7QUFDcEIsWUFBSSxLQUFLLGdCQUFMLENBQXNCLFFBQXRCLENBQStCLFNBQS9CLENBQUosRUFBK0M7QUFDM0MsaUJBQUssS0FBTDtBQUNILFNBRkQsTUFFTztBQUNILGlCQUFLLElBQUw7QUFDSDtBQUNKO0FBNUJ5QyxDQUFoQixDQUE5Qjs7cUJBK0JlLHFCOzs7Ozs7Ozs7OztBQ2pDZjs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7OztjQUVpQixNO0lBQVQsSSxXQUFBLEk7O0lBRWEsb0I7OztBQUNqQixrQ0FBWSxVQUFaLEVBQXNDO0FBQUEsWUFBZCxPQUFjLHVFQUFKLEVBQUk7O0FBQUE7O0FBQ2xDLFlBQU0sVUFBVSxLQUNaLFFBQVEsVUFBUixHQUNNLDBDQUROLEdBRU0sa0NBSE0sRUFJWjtBQUNJLHdEQUEwQyxXQUFXLEdBQVgsQ0FDdEMsT0FEc0MsQ0FBMUM7QUFESixTQUpZLENBQWhCOztBQVdBLFlBQU0sZ0JBQWdCO0FBQ2xCLHFCQUFTLENBQUMsc0JBQUQsQ0FEUztBQUVsQixtQkFBTyxLQUFLLDhCQUFMLENBRlc7QUFHbEIscUJBQVMsc0NBQVMsRUFBRSxzQkFBRixFQUFjLGdCQUFkLEVBQXVCLGdCQUF2QixFQUFUO0FBSFMsU0FBdEI7O0FBWmtDLGdKQWtCNUIsYUFsQjRCOztBQW9CbEMsY0FBSyxVQUFMLEdBQWtCLElBQUksNEJBQUosRUFBbEI7QUFDQSxjQUFLLFVBQUwsQ0FBZ0IsR0FBaEIsR0FBeUIsT0FBTyxHQUFQLENBQ3JCLE9BQU8sTUFBUCxDQUFjLElBQWQsQ0FBbUIsS0FBbkIsQ0FBeUIsZ0JBREosRUFFckIsRUFBRSxJQUFJLFdBQVcsRUFBakIsRUFGcUIsQ0FBekI7QUFJQSxjQUFLLFVBQUwsQ0FBZ0IsS0FBaEIsR0FBd0IsVUFBQyxRQUFELEVBQWM7QUFDbEMsbUJBQU8sRUFBRSxNQUFGLENBQVMsU0FBUyxNQUFsQixDQUFQO0FBQ0gsU0FGRDtBQUdBLGNBQUssZUFBTCxHQUF1QixNQUFLLENBQUwsQ0FBTyx5QkFBUCxDQUF2QjtBQUNBLGNBQUssVUFBTCxHQUFrQixVQUFsQjtBQUNBLGNBQUssa0JBQUw7O0FBRUEsWUFBSSxRQUFRLFVBQVosRUFBd0I7QUFDcEIsa0JBQUssU0FBTCxHQUFpQixJQUFJLG9CQUFKLENBQVk7QUFDekIsd0JBQVEsTUFBSyxHQUFMLENBQVMsSUFBVCxDQUFjLGtCQUFkLENBRGlCO0FBRXpCLGtDQUFnQixLQUFLLG1DQUFMLENBQWhCO0FBRnlCLGFBQVosQ0FBakI7QUFJSDtBQXJDaUM7QUFzQ3JDOzs7OzZDQUVvQjtBQUFBOztBQUNqQixpQkFBSyxVQUFMLENBQ0ssS0FETCxHQUVLLElBRkwsQ0FFVSxVQUFDLEdBQUQsRUFBUztBQUNYLG9CQUFJLEVBQUUsSUFBSSxNQUFOLEVBQWMsT0FBZCxFQUFKLEVBQTZCO0FBQ3pCLDJCQUFLLGVBQUwsQ0FBcUIsS0FBckI7QUFDQTtBQUNIOztBQUVELHVCQUFLLG1CQUFMO0FBQ0gsYUFUTCxFQVVLLElBVkwsQ0FVVSxZQUFNO0FBQ1IsdUJBQUssZUFBTCxDQUFxQixLQUFyQjtBQUNILGFBWkw7QUFhSDs7OzhDQUVxQjtBQUNsQixpQkFBSyxlQUFMLENBQXFCLEtBQXJCO0FBQ0EsaUJBQUssZUFBTCxDQUFxQixNQUFyQixDQUNJLDJDQUFzQixFQUFFLFlBQVksS0FBSyxVQUFMLENBQWdCLFVBQTlCLEVBQXRCLENBREo7O0FBSUEsaUJBQUssbUJBQUwsR0FBMkIsSUFBSSxnQ0FBSixDQUF3QjtBQUMvQyxvQkFBSSxLQUFLLGVBQUwsQ0FBcUIsSUFBckIsQ0FBMEIsZ0JBQTFCLENBRDJDO0FBRS9DLHFCQUFLLEtBQUssR0FGcUM7QUFHL0Msc0JBQU0sc0JBSHlDO0FBSS9DLDRCQUFZO0FBQ1IsNkJBQU87QUFEQyxpQkFKbUM7QUFPL0MsNEJBQVksS0FBSyxVQVA4QjtBQVEvQyw2QkFBYSxFQUFFLFFBQVEsR0FBVixFQUFlLFFBQVEsR0FBdkIsRUFBNEIsU0FBUyxHQUFyQztBQVJrQyxhQUF4QixDQUEzQjtBQVVIOzs7O0VBekU2QyxZOztxQkFBN0Isb0I7Ozs7Ozs7OztxQkNWUDtBQUFBLFFBQUUsVUFBRixRQUFFLFVBQUY7QUFBQSxRQUFjLE9BQWQsUUFBYyxPQUFkO0FBQUEsUUFBdUIsT0FBdkIsUUFBdUIsT0FBdkI7QUFBQSxpR0FHQSxPQUhBLHVCQUlBLFFBQVEsVUFBUixJQUFzQixDQUFDLFdBQVcsR0FBWCxDQUFlLFVBQWYsQ0FBdkIseVVBTUksRUFWSix3QkFXQSxXQUFXLEdBQVgsQ0FBZSxVQUFmLHlEQUNrQyxPQUFPLElBQVAsQ0FBWSxrQ0FBWixFQUFnRCxFQUFDLE9BQU8sV0FBVyxLQUFuQixFQUFoRCxDQURsQywwQkFFRSxFQWJGO0FBQUEsQzs7Ozs7Ozs7Ozs7QUNBZDs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7Ozs7OztjQUNzQixNO0lBQWQsSSxXQUFBLEk7SUFBTSxHLFdBQUEsRzs7SUFFTyxrQjs7O0FBQ2pCLGtDQUFjO0FBQUE7O0FBQUEsNklBQ0QsU0FEQzs7QUFFVixjQUFLLFVBQUwsR0FBa0IsRUFBRSx5QkFBRixDQUFsQjtBQUNBLGNBQUssTUFBTCxHQUFjLEtBQWQ7QUFDQSxjQUFLLFNBQUwsR0FBaUIsQ0FBakI7QUFDQSxjQUFLLGtCQUFMLEdBQTBCLENBQTFCO0FBQ0EsY0FBSyxPQUFMLEdBQWUsQ0FBZjtBQUNBLGNBQUssYUFBTCxHQUFxQixFQUFyQjs7QUFFQSxjQUFLLFdBQUw7QUFDQSxjQUFLLFFBQUw7O0FBRUEsY0FBSyxHQUFMLENBQVMsRUFBVCxDQUFZLE9BQVosRUFBcUIsVUFBQyxDQUFELEVBQU87QUFDeEI7QUFDQSxjQUFFLGVBQUY7QUFDSCxTQUhEOztBQUtBLFVBQUUsTUFBRixFQUFVLEVBQVYsQ0FBYSxPQUFiLEVBQXNCLFVBQUMsQ0FBRDtBQUFBLG1CQUFPLE1BQUssUUFBTCxDQUFjLENBQWQsQ0FBUDtBQUFBLFNBQXRCO0FBQ0EsY0FBSyxVQUFMLENBQWdCLEVBQWhCLENBQW1CLE9BQW5CLEVBQTRCLFVBQUMsQ0FBRDtBQUFBLG1CQUFPLE1BQUssTUFBTCxDQUFZLENBQVosQ0FBUDtBQUFBLFNBQTVCOztBQUVBLGNBQUssR0FBTCxDQUFTLEVBQVQsQ0FBWSxPQUFaLEVBQXFCLFVBQUMsQ0FBRCxFQUFPO0FBQ3hCLGdCQUFJLEVBQUUsS0FBRixLQUFZLHNCQUFLLEdBQXJCLEVBQTBCO0FBQ3RCLHNCQUFLLFFBQUwsQ0FBYyxDQUFkO0FBQ0g7QUFDSixTQUpEO0FBcEJVO0FBeUJiOzs7O2dDQUVPO0FBQ0osaUJBQUssR0FBTCxDQUFTLE1BQVQ7QUFDQSxpQkFBSyxNQUFMLEdBQWMsS0FBZDtBQUNIOzs7aUNBRVEsQyxFQUFHO0FBQ1IsZ0JBQUksS0FBSyxNQUFMLElBQWUsQ0FBZixJQUFvQixDQUFDLEVBQUUsYUFBRixDQUFnQixpQkFBekMsRUFBNEQ7QUFDeEQscUJBQUssS0FBTDtBQUNIO0FBQ0o7Ozs2QkFFSSxDLEVBQUc7QUFBQTs7QUFDSixnQkFBSSxDQUFDLEtBQUssTUFBVixFQUFrQjtBQUNkLGtCQUFFLGFBQUYsQ0FBZ0IsaUJBQWhCLEdBQW9DLElBQXBDO0FBQ0E7QUFDQSxrQkFBRSxFQUFFLGFBQUosRUFDSyxRQURMLENBQ2MseUJBRGQsRUFFSyxNQUZMLENBRVksS0FBSyxHQUZqQjtBQUdBLHFCQUFLLE1BQUwsR0FBYyxJQUFkO0FBQ0Esa0JBQUUsb0JBQUYsRUFBd0IsV0FBeEIsQ0FBb0MsTUFBcEM7QUFDQTs7QUFFQSxxQkFBSyxHQUFMLENBQVMsSUFBVCxDQUFjLG9CQUFkLEVBQW9DLEtBQXBDLEdBQTRDLEtBQTVDOztBQUVBLHFCQUFLLEdBQUwsQ0FBUyxFQUFULENBQVksU0FBWixFQUF1QixVQUFDLEVBQUQsRUFBUTtBQUMzQix3QkFBSSxHQUFHLEtBQUgsS0FBYSxzQkFBSyxHQUF0QixFQUEyQjtBQUN2QiwrQkFBSyxTQUFMLENBQWUsRUFBZjtBQUNIO0FBQ0osaUJBSkQ7QUFLSDtBQUNKOzs7K0JBRU0sQyxFQUFHO0FBQ04sZ0JBQUksS0FBSyxNQUFULEVBQWlCO0FBQ2IscUJBQUssUUFBTCxDQUFjLENBQWQ7QUFDQSxrQkFBRSxlQUFGO0FBQ0gsYUFIRCxNQUdPO0FBQ0gscUJBQUssSUFBTCxDQUFVLENBQVY7QUFDSDtBQUNKOzs7a0NBRVMsQyxFQUFHO0FBQ1QsZ0JBQU0sYUFBYSxFQUFFLFNBQVMsYUFBWCxDQUFuQjtBQUNBLGdCQUFNLGlCQUNGLEtBQUssQ0FBTCxDQUFPLG9CQUFQLEVBQTZCLENBQTdCLEtBQ0EsS0FBSyxHQUFMLENBQVMsSUFBVCxDQUFjLG9CQUFkLEVBQW9DLEtBQXBDLEVBRko7QUFHQSxnQkFBTSxnQkFBZ0IsS0FBSyxHQUFMLENBQVMsSUFBVCxDQUFjLDZCQUFkLEVBQ2xCLEtBQUssR0FBTCxDQUFTLElBQVQsQ0FBYyw2QkFBZCxFQUE2QyxNQUE3QyxHQUFzRCxDQURwQyxDQUF0Qjs7QUFJQSxnQkFDSSxXQUFXLEVBQVgsQ0FBYyxjQUFkLEtBQ0EsRUFBRSxLQUFGLEtBQVksc0JBQUssR0FEakIsSUFFQSxFQUFFLFFBSE4sRUFJRTtBQUNFLGtCQUFFLGNBQUY7QUFDQSw4QkFBYyxLQUFkO0FBQ0gsYUFQRCxNQU9PLElBQ0gsRUFBRSxVQUFGLEVBQWMsRUFBZCxDQUFpQixhQUFqQixLQUNBLEVBQUUsS0FBRixLQUFZLHNCQUFLLEdBRGpCLElBRUEsQ0FBQyxFQUFFLFFBSEEsRUFJTDtBQUNFLGtCQUFFLGNBQUY7QUFDQSwrQkFBZSxLQUFmO0FBQ0g7QUFDSjs7O3FDQUVZLE0sRUFBUTtBQUNqQixtQkFBTyxNQUFQLENBQWMsS0FBSyxRQUFuQjtBQUNIOzs7c0NBRWE7QUFDVixpQkFBSyxRQUFMLENBQWMsTUFBZDtBQUNIOzs7cUNBRVksVyxFQUFhO0FBQ3RCLGNBQUUsMkJBQUYsRUFBK0IsR0FBL0IsQ0FBbUMsU0FBbkMsRUFBOEMsT0FBOUM7QUFDQSxjQUFFLGtDQUFGLEVBQXNDLEdBQXRDLENBQTBDLFNBQTFDLEVBQXFELGNBQXJEO0FBQ0EsY0FBRSx5QkFBRixFQUE2QixJQUE3QixDQUNJLFlBREosRUFFSSxLQUFLLHdDQUFMLEVBQStDLEVBQUUsS0FBSyxXQUFQLEVBQS9DLENBRko7QUFJQSxjQUFFLHlCQUFGLEVBQTZCLElBQTdCLENBQWtDLE1BQWxDLEVBQTBDLGNBQTFDO0FBQ0EsY0FBRSxvQkFBRixFQUF3QixRQUF4QixDQUFpQyxNQUFqQztBQUNIOzs7c0NBRWE7QUFDVixpQkFBSyxHQUFMLENBQVMsS0FBVDtBQUNBLGlCQUFLLEdBQUwsQ0FBUyxNQUFUO0FBUUEsaUJBQUssUUFBTCxHQUFnQixLQUFLLEdBQUwsQ0FBUyxJQUFULENBQWMsYUFBZCxDQUFoQjtBQUNBLGlCQUFLLGNBQUwsR0FBc0IsS0FBSyxHQUFMLENBQVMsSUFBVCxDQUFjLHlCQUFkLENBQXRCO0FBQ0EsaUJBQUssTUFBTCxHQUFjLEtBQUssR0FBTCxDQUFTLElBQVQsQ0FBYyxxQkFBZCxDQUFkO0FBQ0g7OzttQ0FNVTtBQUFBOztBQUNQLGlCQUFLLGdCQUFMLEdBQ0ssSUFETCxDQUNVLFVBQUMsR0FBRCxFQUFTO0FBQ1gsb0JBQUksT0FBSyxPQUFMLEtBQWlCLENBQXJCLEVBQXdCO0FBQ3BCLDJCQUFLLGtCQUFMLEdBQTBCLElBQUksZ0JBQTlCO0FBQ0EsMkJBQUssUUFBTCxHQUFnQixLQUFLLElBQUwsQ0FDWixPQUFLLGtCQUFMLEdBQTBCLE9BQUssU0FEbkIsQ0FBaEI7QUFHSDs7QUFFRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLG9CQUNJLE9BQ0EsSUFBSSxLQURKLElBRUEsSUFBSSxLQUFKLENBQVUsTUFBVixLQUFxQixDQUZyQixJQUdBLE9BQUssWUFKVCxFQUtFO0FBQ0UsMkJBQUssT0FBTCxJQUFnQixDQUFoQjtBQUNBLDJCQUFPLE9BQUssUUFBTCxFQUFQO0FBQ0g7O0FBRUQsdUJBQUssV0FBTDtBQUNBLG9CQUFJLE9BQU8sT0FBTyxJQUFJLEtBQVgsS0FBcUIsV0FBaEMsRUFBNkM7QUFDekMsd0JBQUksbUJBQW1CLEVBQXZCO0FBQ0Esd0JBQUksS0FBSixDQUFVLE9BQVYsQ0FBa0IsVUFBQyxDQUFELEVBQU87QUFDckIsNEJBQUksT0FBTyxJQUFJLDhCQUFKLENBQXFCLENBQXJCLENBQVg7QUFDQSw2QkFBSyx1QkFBTCxDQUE2QjtBQUFBLG1DQUN6QixPQUFLLHFCQUFMLEVBRHlCO0FBQUEseUJBQTdCO0FBR0EseUNBQWlCLElBQWpCLENBQXNCLElBQXRCO0FBQ0gscUJBTkQ7QUFPQSwyQkFBSyxhQUFMLEdBQ0ksT0FBSyxhQUFMLENBQW1CLE1BQW5CLENBQTBCLGdCQUExQixDQURKO0FBRUEsMkJBQUssVUFBTCxDQUFnQixnQkFBaEI7QUFDSDtBQUNKLGFBckNMLFdBc0NXLFVBQUMsS0FBRCxFQUFXO0FBQ2QsdUJBQUssV0FBTDtBQUNBLHVCQUFPLE1BQVAsQ0FBYyxHQUFkLENBQWtCLE9BQWxCLEVBQTJCLDhCQUEzQixFQUEyRDtBQUN2RCw2QkFBUyxNQUFNLFVBQU4sSUFBb0I7QUFEMEIsaUJBQTNEO0FBR0Esb0JBQUksT0FBSyxPQUFMLEtBQWlCLENBQXJCLEVBQXdCO0FBQ3BCLDJCQUFLLGNBQUwsQ0FDSyxLQURMLEdBRUssTUFGTCxDQUdRLDBDQUN3QyxLQUNoQyw2QkFEZ0MsRUFFaEMsRUFBRSxNQUFNLE9BQUsscUJBQUwsRUFBUixFQUZnQyxDQUR4QyxnQkFIUjtBQVVILGlCQVhELE1BV087QUFDSCwyQkFBSyxZQUFMLENBQ0ssS0FETCxHQUVLLE1BRkwsOERBRytELEtBQ25ELDZCQURtRCxDQUgvRCxTQUthLEtBQ0QsZ0NBREMsQ0FMYjtBQVNBLDJCQUFLLFlBQUwsQ0FDSyxJQURMLENBQ1UseUJBRFYsRUFFSyxFQUZMLENBRVEsT0FGUixFQUVpQixVQUFDLENBQUQ7QUFBQSwrQkFBTyxPQUFLLGFBQUwsQ0FBbUIsQ0FBbkIsQ0FBUDtBQUFBLHFCQUZqQjtBQUdIO0FBQ0osYUFwRUw7QUFxRUg7OzsyQ0FFa0I7QUFBQTs7QUFDZixtQkFBTyxJQUFJLE9BQUosQ0FBWSxVQUFDLE9BQUQsRUFBVSxNQUFWO0FBQUEsdUJBQ2YsRUFBRSxJQUFGLENBQU87QUFDSCw0QkFBUSxLQURMO0FBRUgseUJBQUssT0FBTyxHQUFQLENBQVcsT0FBTyxNQUFQLENBQWMsSUFBZCxDQUFtQixtQkFBbkIsQ0FBdUMsR0FBbEQsQ0FGRjtBQUdILDBCQUFNO0FBQ0Ysb0NBQVksT0FBSyxPQURmO0FBRUYsa0NBQVUsT0FBSztBQUZiLHFCQUhIO0FBT0gsNkJBQVM7QUFQTixpQkFBUCxFQVNLLElBVEwsQ0FTVSxVQUFDLFFBQUQ7QUFBQSwyQkFBYyxRQUFRLFFBQVIsQ0FBZDtBQUFBLGlCQVRWLEVBVUssSUFWTCxDQVVVLFVBQUMsR0FBRCxFQUFNLE1BQU4sRUFBYyxHQUFkO0FBQUEsMkJBQXNCLE9BQU8sR0FBUCxDQUF0QjtBQUFBLGlCQVZWLENBRGU7QUFBQSxhQUFaLENBQVA7QUFhSDs7O21DQUVVLGEsRUFBZTtBQUFBOztBQUN0QixnQkFDSSxLQUFLLE9BQUwsS0FBaUIsQ0FBakIsS0FDQyxDQUFDLGFBQUQsSUFBa0IsY0FBYyxNQUFkLEtBQXlCLENBRDVDLENBREosRUFHRTtBQUNFLHFCQUFLLDZCQUFMO0FBQ0gsYUFMRCxNQUtPLElBQUksS0FBSyxhQUFMLENBQW1CLE1BQW5CLEdBQTRCLENBQWhDLEVBQW1DO0FBQ3RDLG9CQUFJLEtBQUssT0FBTCxLQUFpQixDQUFyQixFQUF3QjtBQUNwQix5QkFBSyxjQUFMLENBQ0ssTUFETDs7QUFNQSx5QkFBSyxzQkFBTCxHQUNJLEtBQUssY0FBTCxDQUFvQixJQUFwQixDQUF5QixvQkFBekIsQ0FESjtBQUVBLHlCQUFLLGVBQUwsR0FBdUIsS0FBSyxjQUFMLENBQW9CLElBQXBCLENBQ25CLHlCQURtQixDQUF2QjtBQUdBLHdCQUFJLEtBQUssa0JBQUwsR0FBMEIsQ0FBOUIsRUFBaUM7QUFDN0IsNkJBQUssWUFBTCxDQUFrQixLQUFLLGtCQUF2QjtBQUNIO0FBQ0o7O0FBRUQscUJBQUssV0FBTDtBQUNBLHFCQUFLLFdBQUw7O0FBRUEsb0JBQUksS0FBSyxZQUFULEVBQXVCO0FBQ25CLHlCQUFLLFlBQUwsQ0FBa0IsTUFBbEI7QUFDSDs7QUFFRCw4QkFBYyxPQUFkLENBQXNCLFVBQUMsQ0FBRCxFQUFPO0FBQ3pCLDJCQUFLLHNCQUFMLENBQTRCLE1BQTVCLENBQW1DLEVBQUUsTUFBRixFQUFuQztBQUNILGlCQUZEOztBQUlBLG9CQUFJLEtBQUssWUFBVCxFQUF1QjtBQUNuQix5QkFBSyxZQUFMLEdBQW9CLHdJQUM4RCxLQUNsRCx3QkFEa0QsQ0FEOUQsOERBQXBCO0FBS0EseUJBQUssc0JBQUwsQ0FBNEIsTUFBNUIsQ0FBbUMsS0FBSyxZQUF4QztBQUNBLHlCQUFLLFlBQUwsQ0FDSyxJQURMLENBQ1UseUJBRFYsRUFFSyxFQUZMLENBRVEsT0FGUixFQUVpQixVQUFDLENBQUQ7QUFBQSwrQkFBTyxPQUFLLGFBQUwsQ0FBbUIsQ0FBbkIsQ0FBUDtBQUFBLHFCQUZqQjtBQUdIOztBQUVELG9CQUFJLEtBQUssT0FBTCxLQUFpQixDQUFyQixFQUF3QjtBQUNwQixzQkFBRSxvQkFBRixFQUF3QixLQUFLLE9BQUwsR0FBZSxLQUFLLFNBQTVDLEVBQXVELEtBQXZEO0FBQ0g7O0FBRUQscUJBQUssT0FBTCxJQUFnQixDQUFoQjtBQUNIO0FBQ0o7Ozt3REFFK0I7QUFDNUIsaUJBQUssY0FBTCxDQUFvQixLQUFwQixHQUNLLE1BREwsaVFBRzBELEtBQ2xDLG9DQURrQyxDQUgxRCw4Q0FNeUIsS0FBSywrQkFBTCxDQU56QjtBQVFIOzs7d0NBRWU7QUFDWixpQkFBSyxZQUFMLENBQWtCLEtBQWxCO0FBQ0EsaUJBQUssWUFBTCxDQUFrQixLQUFLLFlBQXZCO0FBQ0EsaUJBQUssUUFBTDtBQUNIOzs7c0NBRWE7QUFDVixnQkFBSSxLQUFLLGFBQUwsQ0FBbUIsTUFBbkIsR0FBNEIsQ0FBaEMsRUFBbUM7QUFDL0IscUJBQUssTUFBTCxDQUFZLFdBQVosQ0FBd0IsT0FBeEI7QUFDSCxhQUZELE1BRU8sSUFBSSxDQUFDLEtBQUssTUFBTCxDQUFZLFFBQVosQ0FBcUIsT0FBckIsQ0FBTCxFQUFvQztBQUN2QyxxQkFBSyxNQUFMLENBQVksUUFBWixDQUFxQixPQUFyQjtBQUNIO0FBQ0o7OztzQ0FFYTtBQUNWLGlCQUFLLGVBQUwsQ0FBcUIsS0FBckI7QUFDQSxpQkFBSyxlQUFMLENBQXFCLE1BQXJCLFVBQ1csS0FBSyxpQ0FBTCxFQUF3QztBQUMzQyxxQkFBSyxLQUFLLGFBQUwsQ0FBbUIsTUFEbUI7QUFFM0MsdUJBQU8sS0FBSztBQUYrQixhQUF4QyxDQURYO0FBTUg7OztnREFFdUI7QUFDcEIsaUJBQUssa0JBQUwsSUFBMkIsQ0FBM0I7QUFDQSxpQkFBSyxhQUFMLEdBQXFCLEtBQUssYUFBTCxDQUFtQixNQUFuQixDQUEwQixVQUFDLENBQUQ7QUFBQSx1QkFBTyxDQUFDLEVBQUUsV0FBVjtBQUFBLGFBQTFCLENBQXJCOztBQUVBLGdCQUFJLEtBQUssa0JBQUwsR0FBMEIsQ0FBOUIsRUFBaUM7QUFDN0IscUJBQUssNkJBQUw7QUFDSDs7QUFFRCxpQkFBSyxXQUFMO0FBQ0g7OztnREFFdUI7QUFDcEIsZ0JBQUksT0FBTyxFQUFYO0FBQ0EsZ0JBQUksT0FBTyxTQUFQLENBQWlCLGlCQUFqQixLQUF1QyxFQUEzQyxFQUErQztBQUMzQyx1QkFBTyxPQUFPLFNBQVAsQ0FBaUIsaUJBQXhCO0FBQ0gsYUFGRCxNQUVPLElBQUksT0FBTyxTQUFQLENBQWlCLG1CQUFqQixLQUF5QyxFQUE3QyxFQUFpRDtBQUNwRCx1QkFBTyxPQUFPLFNBQVAsQ0FBaUIsbUJBQXhCO0FBQ0gsYUFGTSxNQUVBO0FBQ0gsdUJBQU8sSUFBSSxPQUFPLE1BQVAsQ0FBYyxjQUFsQixDQUFQO0FBQ0g7QUFDRCwwREFBeUMsSUFBekMsZ0RBQW1GLEtBQy9FLGdCQUQrRSxFQUVqRixXQUZpRixFQUFuRjtBQUdIOzs7NEJBN01rQjtBQUNmLG1CQUFPLEtBQUssT0FBTCxHQUFlLEtBQUssUUFBTCxHQUFnQixDQUF0QztBQUNIOzs7O0VBbkkyQyxTQUFTLEk7O3FCQUFwQyxrQjs7Ozs7Ozs7Ozs7QUNMckI7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7Ozs7O2NBRWlCLE07SUFBVCxJLFdBQUEsSTs7SUFFYSxpQjs7O0FBQ2pCLHFDQUFzRTtBQUFBLFlBQXpELEVBQXlELFFBQXpELEVBQXlEO0FBQUEsWUFBckQsT0FBcUQsUUFBckQsT0FBcUQ7QUFBQSxZQUE1QyxJQUE0QyxRQUE1QyxJQUE0QztBQUFBLFlBQXRDLE9BQXNDLFFBQXRDLE9BQXNDO0FBQUEsWUFBN0IsSUFBNkIsUUFBN0IsSUFBNkI7QUFBQSx1Q0FBdkIsY0FBdUI7QUFBQSxZQUF2QixjQUF1Qix1Q0FBTixJQUFNOztBQUFBOztBQUFBLDJJQUN6RCxTQUR5RDs7QUFFbEUsY0FBSyxFQUFMLEdBQVUsRUFBVjtBQUNBLGNBQUssT0FBTCxHQUFlLE9BQWY7QUFDQSxjQUFLLElBQUwsR0FBWSxJQUFaO0FBQ0EsY0FBSyxJQUFMLEdBQVksT0FBWjtBQUNBLGNBQUssSUFBTCxHQUFZLFFBQVEsRUFBcEI7QUFDQSxjQUFLLEtBQUwsR0FBYSxJQUFJLGtCQUFKLENBQVUsSUFBVixDQUFiO0FBQ0EsY0FBSyxNQUFMLEdBQWMsU0FBUyxhQUF2QjtBQUNBLGNBQUssR0FBTCxHQUFXLE9BQU8sWUFBbEI7QUFDQSxjQUFLLGNBQUwsR0FBc0IsY0FBdEI7QUFDQSxjQUFLLFNBQUwsR0FBaUIsS0FBakI7QUFDQSxjQUFLLGdCQUFMLEdBQXdCLEVBQXhCOztBQUVBLGNBQUssZUFBTDtBQWRrRTtBQWVyRTs7OztpQ0FFTztBQUFBOztBQUNKLGlCQUFLLEdBQUwsR0FBVyxLQUFLLFFBQUwsRUFBWDtBQUNBLGlCQUFLLGdCQUFMLENBQXNCLEtBQUssR0FBM0I7QUFDQSxpQkFBSyxxQkFBTDtBQUNBLGlCQUFLLEdBQUwsQ0FBUyxJQUFULENBQWMsb0JBQWQsRUFBb0MsRUFBcEMsQ0FBdUMsT0FBdkMsRUFBZ0Q7QUFBQSx1QkFBTSxPQUFLLG1CQUFMLEVBQU47QUFBQSxhQUFoRDtBQUNBLG1CQUFPLEtBQUssR0FBWjtBQUNIOzs7MENBRWdCO0FBQ2IsZ0JBQUcsQ0FBQyxtQkFBRCxFQUFzQixXQUF0QixFQUFtQyxxQkFBbkMsRUFBMEQscUJBQTFELEVBQWlGLFFBQWpGLENBQTBGLEtBQUssSUFBL0YsQ0FBSCxFQUF3RztBQUNwRzs7O0FBR0EscUJBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxVQUFmLEVBQTJCLElBQTNCO0FBQ0g7QUFDSjs7O2dEQUV1QixRLEVBQVM7QUFDN0IsaUJBQUssZ0JBQUwsQ0FBc0IsSUFBdEIsQ0FBMkIsUUFBM0I7QUFDSDs7OzhDQUVvQjtBQUFBOztBQUNqQixpQkFBSyxNQUFMLEdBRGlCLENBQ0Y7QUFDZixjQUFFLElBQUYsQ0FBTztBQUNILHFCQUFLLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLElBQWQsQ0FBbUIsbUJBQW5CLENBQXVDLE9BQWxELEVBQTJELEVBQUMsSUFBSSxLQUFLLEVBQVYsRUFBM0QsQ0FERjtBQUVILHNCQUFNO0FBRkgsYUFBUCxFQUlDLElBSkQsQ0FJTSxZQUFNO0FBQ1IsdUJBQUssbUJBQUw7QUFDSCxhQU5ELEVBTUcsSUFOSCxDQU1RLFVBQUMsR0FBRCxFQUFNLE1BQU4sRUFBYyxHQUFkLEVBQXNCO0FBQzFCLHVCQUFPLE1BQVAsQ0FBYyxHQUFkLENBQWtCLE9BQWxCLEVBQTJCLCtCQUEzQixFQUE0RCxFQUFDLFNBQVMsSUFBSSxVQUFKLElBQWtCLEdBQTVCLEVBQTVEO0FBQ0gsYUFSRDtBQVNIOzs7aUNBRU87QUFBQTs7QUFDSixpQkFBSyxXQUFMLEdBQW1CLElBQW5CO0FBQ0EsaUJBQUssR0FBTCxDQUFTLElBQVQsQ0FBYyxlQUFkLEVBQStCLFFBQS9CLENBQXdDLHVCQUF4QyxFQUZJLENBRThEO0FBQ2xFLGlCQUFLLEdBQUwsQ0FBUyxRQUFULENBQWtCLGtCQUFsQixFQUhJLENBR21DO0FBQ3ZDLHVCQUFXLFlBQU07QUFBRSx1QkFBSyxHQUFMLENBQVMsSUFBVDtBQUFrQixhQUFyQyxFQUF1QyxHQUF2QyxFQUpJLENBSXlDO0FBQzdDLGlCQUFLLGdCQUFMLENBQXNCLE9BQXRCLENBQThCLFVBQUMsUUFBRCxFQUFjO0FBQ3hDO0FBQ0gsYUFGRDtBQUdIOzs7OENBRXFCO0FBQ2xCLG9CQUFPLEtBQUssSUFBWjtBQUNJLHFCQUFLLG1CQUFMO0FBQ0kseUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsdUJBQWpCLEVBQTBDLEVBQUMsWUFBWSxLQUFLLEtBQWxCLEVBQXlCLFNBQVMsRUFBRSxnQkFBZ0IsS0FBSyxjQUF2QixFQUFsQyxFQUExQztBQUNBO0FBQ0oscUJBQUssWUFBTDtBQUNJLHlCQUFLLEdBQUwsQ0FBUyxPQUFULENBQWlCLDJCQUFqQixFQUE4QyxFQUFDLFlBQVksS0FBSyxLQUFsQixFQUF5QixTQUFTLEVBQUUsZ0JBQWdCLEtBQUssY0FBdkIsRUFBbEMsRUFBOUM7QUFDQTtBQUNKO0FBQ0k7QUFSUjtBQVVIOzs7Z0RBRXNCO0FBQ25CLG1CQUFPLElBQUksSUFBSixDQUFTLEtBQUssSUFBZCxDQUFQO0FBQ0g7Ozt3Q0FFYztBQUNYLGdCQUFHLEtBQUssSUFBUixFQUFhO0FBQ1QsdUJBQU8sS0FBSyxLQUFMLENBQVcsV0FBWCxDQUF1QixHQUF2QixDQUFQO0FBQ0g7QUFDSjs7OzRDQUVtQixTLEVBQVU7QUFDMUIsb0JBQVEsS0FBSyxJQUFiO0FBQ0kscUJBQUssV0FBTDtBQUFpQjtBQUNiLDRCQUFJLFVBQVUsSUFBSSxJQUFKLENBQVMsS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLFlBQWYsQ0FBVCxDQUFkO0FBQ0EsNEJBQUksTUFBTSxJQUFJLElBQUosRUFBVjtBQUNBLDRCQUFJLFNBQVMsRUFBYjtBQUNBLDRCQUFJLFlBQVksS0FBSyxLQUFMLENBQVcsQ0FBQyxRQUFRLE9BQVIsS0FBb0IsSUFBSSxPQUFKLEVBQXJCLElBQXNDLE1BQWpELENBQWhCO0FBQ0EsNEJBQUksYUFBYSxFQUFqQixFQUFxQjtBQUFFO0FBQ25CLGdDQUFJLFdBQVcsS0FBSyxLQUFMLENBQVcsQ0FBQyxRQUFRLE9BQVIsS0FBb0IsSUFBSSxPQUFKLEVBQXJCLElBQXNDLE9BQWpELENBQWY7QUFDQSxxQ0FBUyxLQUFLLHFDQUFMLEVBQTRDLEVBQUMsT0FBTyxTQUFSLEVBQW1CLE1BQU0sUUFBekIsRUFBNUMsQ0FBVDtBQUNILHlCQUhELE1BSUssSUFBSSxhQUFhLENBQWpCLEVBQW1CO0FBQUU7QUFDdEIscUNBQVMsS0FBSyxzQ0FBTCxFQUE2QyxFQUFDLE9BQU8sU0FBUixFQUFtQixNQUFNLFNBQXpCLEVBQTdDLENBQVQ7QUFDSCx5QkFGSSxNQUVFO0FBQUU7QUFDTCxnQ0FBSSxjQUFjLEtBQUssS0FBTCxDQUFXLENBQUMsUUFBUSxPQUFSLEtBQW9CLElBQUksT0FBSixFQUFyQixJQUFzQyxLQUFqRCxDQUFsQjtBQUNBLHFDQUFTLEtBQUsscUNBQUwsRUFBNEMsRUFBQyxPQUFPLFNBQVIsRUFBbUIsTUFBTSxXQUF6QixFQUE1QyxDQUFUO0FBQ0g7QUFDRCwrQkFBTztBQUNILG9DQUFTLE1BRE47QUFFSCxzQ0FBVyxLQUFLLGtDQUFMO0FBRlIseUJBQVA7QUFJSDtBQUNELHFCQUFLLG1CQUFMO0FBQXlCO0FBQ3JCLCtCQUFPO0FBQ0gsb0NBQVMsS0FBSyx3Q0FBTCxFQUErQyxFQUFDLE9BQU8sU0FBUixFQUFtQixNQUFNLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxlQUFmLENBQXpCLEVBQS9DLENBRE47QUFFSCxzQ0FBVyxLQUFLLDBDQUFMLEVBQWlELEVBQUMsTUFBTSxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsZUFBZixDQUFQLEVBQWpEO0FBRlIseUJBQVA7QUFJSDtBQUNELHFCQUFLLFlBQUw7QUFBa0I7QUFDZCwrQkFBTztBQUNILG9DQUFRLEtBQUssaUNBQUwsRUFBd0MsRUFBQyxPQUFPLFNBQVIsRUFBeEMsQ0FETDtBQUVILHNDQUFXLEtBQUssbUNBQUw7QUFGUix5QkFBUDtBQUlIO0FBQ0Q7QUFBUTtBQUNKLCtCQUFPO0FBQ0gsb0NBQVksU0FBWixxREFERztBQUVILHNDQUFXO0FBRlIseUJBQVA7QUFJSDtBQXRDTDtBQXdDSDs7O3dDQUVjO0FBQ1gsbUJBQU8sS0FBSyxNQUFMLElBQWUsS0FBSyxJQUFMLEtBQWMsbUJBQTdCLElBQW9ELEtBQUssSUFBTCxLQUFjLFlBQXpFO0FBQ0g7OzttQ0FFUztBQUNOLGdCQUFJLG1CQUFtQixLQUFLLG9CQUFMLEVBQTJCLEVBQUMsTUFBTSxLQUFLLHFCQUFMLEVBQVAsRUFBM0IsQ0FBdkI7QUFDQSxnQkFBSSxhQUFhLEtBQUssYUFBTCxFQUFqQjtBQUNBLGdCQUFJLFlBQVksS0FBSyxLQUFMLENBQVcsZUFBM0I7QUFDQSxnQkFBSSxZQUFZLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxPQUFmLENBQWhCOztBQUVBLGdCQUFJLFVBQVUsS0FBSyxtQkFBTCxDQUF5QixTQUF6QixDQUFkO0FBQ0EsZ0JBQUksU0FBUyxRQUFRLE1BQXJCO0FBQ0EsZ0JBQUksV0FBVyxRQUFRLFFBQXZCOztBQUVBLG1CQUFPLHdFQUNrRCxLQUFLLGlDQUFMLEVBQXdDLEVBQUMsT0FBTyxTQUFSLEVBQXhDLENBRGxELDBIQUdxQyxLQUFLLGFBQUwsS0FBdUIsb0JBQXZCLEdBQThDLEVBSG5GLGtKQU13QixTQU54QixvQkFNZ0QsU0FOaEQsZUFNbUUsVUFObkUseUpBU29DLGdCQVRwQyw2R0FXeUMsTUFYekMscUVBWXlDLFFBWnpDLDJHQWVXLEtBQUssYUFBTCwyQ0FFc0MsS0FBSyxzQ0FBTCxFQUE2QyxFQUFDLE9BQU8sU0FBUixFQUE3QyxDQUZ0QyxnREFFaUosS0FBSyxFQUZ0Siw2R0FJZSxFQW5CMUIsOERBc0JPLENBQUMsS0FBSyxNQUFOLCtEQUVRLEVBeEJmLDBLQThCcUMsS0FBSyxhQUFMLEtBQXVCLG9CQUF2QixHQUE4QyxFQTlCbkYsa0pBaUN3QixTQWpDeEIsb0JBaUNnRCxTQWpDaEQsZUFpQ21FLFVBakNuRSx5SkFvQ29DLGdCQXBDcEMsNEdBc0N3QyxNQXRDeEMsMkdBeUNXLEtBQUssYUFBTCx3Q0FDcUMsS0FBSyxzQ0FBTCxFQUE2QyxFQUFDLE9BQU8sU0FBUixFQUE3QyxDQURyQyxnREFDZ0osS0FBSyxFQURySiwwR0FHWSxFQTVDdkIsd0pBK0NpQyxRQS9DakMsdUNBZ0RXLENBQUMsS0FBSyxNQUFOLEdBQWUsbUNBQWYsR0FBcUQsRUFoRGhFLDRHQUFQO0FBd0RIOzs7Z0RBRXVCO0FBQUE7O0FBQ3BCLGdCQUFJLGVBQWUsc0JBQW5CO0FBQ0EsZ0JBQUksbUJBQW1CLDJCQUF2QjtBQUNBLGdCQUFJLHlCQUF5Qix5QkFBN0I7QUFDQSxnQkFBSSxvQkFBb0IsZUFBeEIsQ0FKb0IsQ0FJcUI7QUFDekMsZ0JBQUksa0JBQWtCLG9CQUF0Qjs7QUFFQSxnQkFBSSxpQkFBaUIsRUFBckI7QUFDQSxvQkFBUSxLQUFLLElBQWI7QUFDSSxxQkFBSyxXQUFMO0FBQ0kscUNBQWlCLENBQUMsWUFBRCxFQUFlLGlCQUFmLEVBQWtDLGdCQUFsQyxDQUFqQjtBQUNBO0FBQ0oscUJBQUssWUFBTDtBQUNJLHFDQUFpQixDQUFDLGVBQUQsQ0FBakI7QUFDQTtBQUNKLHFCQUFLLG1CQUFMO0FBQ0kscUNBQWlCLENBQUMsZ0JBQUQsRUFBbUIsaUJBQW5CLEVBQXNDLHNCQUF0QyxDQUFqQjtBQUNBO0FBQ0o7QUFDSSwwQkFBTSxJQUFJLEtBQUosMEJBQWdDLEtBQUssSUFBckMsa0NBQU47QUFYUjs7QUFjQSxnQkFBSSx3QkFBd0IsU0FBeEIscUJBQXdCLFFBQWtCO0FBQUEsb0JBQWhCLFVBQWdCLFNBQWhCLFVBQWdCOztBQUMxQyxvQkFBSSxjQUFjLFdBQVcsR0FBWCxDQUFlLElBQWYsTUFBeUIsT0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLElBQWYsQ0FBM0MsRUFBZ0U7QUFDNUQsMkJBQUssbUJBQUw7QUFDSDtBQUNKLGFBSkQ7O0FBTUEsMkJBQWUsT0FBZixDQUF1QixVQUFDLE1BQUQsRUFBWTtBQUMvQix1QkFBSyxHQUFMLENBQVMsRUFBVCxDQUFZLE1BQVosRUFBb0IscUJBQXBCO0FBQ0gsYUFGRDtBQUdIOzs7eUNBR2dCLFEsRUFBUztBQUN0QixnQkFBSSxtQkFBbUIsU0FBUyxJQUFULENBQWMsZ0JBQWQsQ0FBdkI7QUFDQSxnQkFBSSxVQUFVLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxJQUFmLENBQWQ7QUFDQSxnQkFBSSxZQUFZLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxPQUFmLENBQWhCO0FBQ0EsZ0JBQUcsaUJBQWlCLE1BQWpCLEdBQTBCLENBQTdCLEVBQStCO0FBQzNCLHdCQUFRLEtBQUssSUFBYjtBQUNJLHlCQUFLLFdBQUw7QUFDSSx5Q0FBaUIsTUFBakIsQ0FBd0IsS0FBSyxZQUFMLENBQWtCLE9BQWxCLEVBQTJCLFNBQTNCLENBQXhCO0FBQ0EseUNBQWlCLE1BQWpCLENBQXdCLEtBQUssaUJBQUwsQ0FBdUIsT0FBdkIsRUFBZ0MsU0FBaEMsQ0FBeEI7QUFDQSx5Q0FBaUIsTUFBakIsQ0FBd0IsS0FBSyxnQkFBTCxDQUFzQixPQUF0QixFQUErQixTQUEvQixDQUF4QjtBQUNBOztBQUVKLHlCQUFLLFlBQUw7QUFDSSx5Q0FBaUIsTUFBakIsQ0FBd0IsS0FBSyxlQUFMLENBQXFCLE9BQXJCLEVBQThCLFNBQTlCLENBQXhCO0FBQ0E7QUFDSix5QkFBSyxtQkFBTDtBQUNJLHlDQUFpQixNQUFqQixDQUF3QixLQUFLLHlCQUFMLEVBQXhCO0FBQ0EseUNBQWlCLE1BQWpCLENBQXdCLEtBQUssaUJBQUwsQ0FBdUIsT0FBdkIsRUFBZ0MsU0FBaEMsRUFBMkMsS0FBSyxnQ0FBTCxDQUEzQyxDQUF4QjtBQUNBLHlDQUFpQixNQUFqQixDQUF3QixLQUFLLGdCQUFMLENBQXNCLE9BQXRCLEVBQStCLFNBQS9CLENBQXhCO0FBQ0E7QUFDSjtBQUNJLDhCQUFNLElBQUksS0FBSiwwQkFBZ0MsS0FBSyxJQUFyQyxrQ0FBTjtBQWhCUjtBQWtCSDtBQUNKOzs7b0RBRTBCO0FBQUE7O0FBQ3ZCLGdCQUFJLFdBQVcsMkhBQ1csS0FBSyxJQUFMLENBRFgsNkNBQWY7QUFHQSxxQkFBUyxFQUFULENBQVksT0FBWixFQUFxQjtBQUFBLHVCQUFNLE9BQUssbUJBQUwsRUFBTjtBQUFBLGFBQXJCO0FBQ0EsbUJBQU8sUUFBUDtBQUNIOzs7cUNBRVksTyxFQUFTLFMsRUFBVTtBQUFBOztBQUM1QixnQkFBSSxXQUFXLHNHQUFvRyxPQUFwRyxzQkFBNEgsS0FBSyxhQUFMLEVBQW9CLEVBQUMsT0FBTyxTQUFSLEVBQXBCLENBQTVILDRDQUNXLEtBQUssUUFBTCxDQURYLDZDQUFmOztBQUlBLHFCQUFTLEVBQVQsQ0FBWSxPQUFaLEVBQXFCLFVBQUMsQ0FBRCxFQUFPO0FBQ3hCLG9CQUFJLG1CQUFKLENBQVcsT0FBSyxHQUFoQixFQUFxQixXQUFyQixDQUFpQyxPQUFLLEtBQXRDLEVBQTZDLEVBQUUsZ0JBQWdCLE9BQUssY0FBdkIsRUFBN0M7QUFDSCxhQUZEOztBQUlBLG1CQUFPLFFBQVA7QUFDSDs7O3lDQUVnQixPLEVBQVMsUyxFQUFVO0FBQUE7O0FBQ2hDLGdCQUFJLFdBQVcsMkdBQXlHLE9BQXpHLHNCQUFpSSxLQUFLLGdDQUFMLEVBQXVDLEVBQUMsT0FBTyxTQUFSLEVBQXZDLENBQWpJLDRDQUNXLEtBQUssOEJBQUwsQ0FEWCw2Q0FBZjs7QUFLQSxxQkFBUyxFQUFULENBQVksT0FBWixFQUFxQixZQUFNO0FBQ3RCLG9CQUFJLDRCQUFKLEVBQUQsQ0FBd0IsRUFBeEIsQ0FBMkIsU0FBM0IsRUFBc0MsVUFBQyxLQUFELEVBQVc7QUFDN0M7QUFDQSwyQkFBSyxHQUFMLENBQVMsT0FBVCxDQUFpQixtQkFBakIsRUFBc0MsT0FBSyxLQUEzQyxFQUFrRCxFQUFFLGdCQUFnQixPQUFLLGNBQXZCLEVBQWxEO0FBQ0EsMEJBQU0sS0FBTjtBQUNILGlCQUpEO0FBS0gsYUFORDs7QUFRQSxtQkFBTyxRQUFQO0FBQ0g7OzswQ0FFaUIsTyxFQUFTLFMsRUFBb0I7QUFBQTs7QUFBQSxnQkFBVCxLQUFTLHVFQUFILEVBQUc7O0FBQzNDLGdCQUFJLFlBQVksVUFBVSxFQUFWLEdBQWUsS0FBSyw0QkFBTCxDQUFmLEdBQW9ELEtBQXBFO0FBQ0EsZ0JBQUksV0FBVyxvRkFBa0YsT0FBbEYsc0JBQTBHLFNBQTFHLFdBQXlILFNBQXpILDRDQUNXLFNBRFgsNkNBQWY7O0FBSUEscUJBQVMsRUFBVCxDQUFZLE9BQVosRUFBcUIsWUFBTTtBQUN2QixvQkFBSSw2QkFBSixDQUFvQixPQUFLLEtBQXpCLEVBQWdDLEtBQWhDLEVBQXVDLE9BQUssY0FBNUM7QUFDSCxhQUZEOztBQUlBLG1CQUFPLFFBQVA7QUFDSDs7O3dDQUVlLE8sRUFBUyxTLEVBQVU7QUFBQTs7QUFDL0IsZ0JBQUksV0FBVywwR0FBd0csT0FBeEcsc0JBQWdJLEtBQUssbUJBQUwsRUFBMEIsRUFBQyxPQUFPLFNBQVIsRUFBMUIsQ0FBaEksNENBQ1csS0FBSyxZQUFMLENBRFgsNkNBQWY7O0FBSUEscUJBQVMsRUFBVCxDQUFZLE9BQVosRUFBcUIsVUFBQyxDQUFELEVBQU87QUFDeEIsd0JBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsWUFBakIsRUFBK0IsUUFBSyxLQUFwQyxFQUEyQyxFQUFFLGdCQUFnQixRQUFLLGNBQXZCLEVBQTNDO0FBQ0gsYUFGRDs7QUFJQSxtQkFBTyxRQUFQO0FBQ0g7Ozt5Q0FFZ0IsUyxFQUFVO0FBQ3ZCLGdCQUFJLFdBQVcsNkZBQTJGLEtBQUsscUJBQUwsQ0FBM0YsU0FBMEgsU0FBMUgsd0NBQ08sS0FBSyxxQkFBTCxDQURQLHlDQUFmO0FBR0EsbUJBQU8sUUFBUDtBQUNIOzs7cUNBRVksUyxFQUFVO0FBQ25CLGdCQUFJLFdBQVcsNkZBQTJGLEtBQUssd0NBQUwsRUFBK0MsRUFBQyxPQUFPLFNBQVIsRUFBL0MsQ0FBM0Ysd0NBQ08sS0FBSyxlQUFMLENBRFAseUNBQWY7QUFHQSxtQkFBTyxRQUFQO0FBQ0g7OzswQ0FFaUIsUyxFQUFVO0FBQ3hCLGdCQUFJLFdBQVcsMEVBQXdFLEtBQUsscUJBQUwsQ0FBeEUsU0FBdUcsU0FBdkcsd0NBQ08sS0FBSyxxQkFBTCxDQURQLHlDQUFmO0FBR0EsbUJBQU8sUUFBUDtBQUNIOzs7MkNBRWtCLFMsRUFBVTtBQUN6QixnQkFBSSxXQUFXLDZGQUEyRixLQUFLLGdDQUFMLEVBQXVDLEVBQUMsT0FBTyxTQUFSLEVBQXZDLENBQTNGLHdDQUNPLEtBQUssMkJBQUwsQ0FEUCx5Q0FBZjtBQUdBLG1CQUFPLFFBQVA7QUFDSDs7OztFQTVWMEMsU0FBUyxJOztxQkFBbkMsaUI7Ozs7Ozs7Ozs7Ozs7Y0NSRyxNO0lBQWhCLEcsV0FBQSxHO0lBQUssTSxXQUFBLE07O0lBRVEseUI7QUFDakIsdUNBQVksR0FBWixFQUFpQjtBQUFBOztBQUFBOztBQUViLGFBQUssR0FBTCxHQUFXLEdBQVg7QUFDQSxhQUFLLFVBQUwsR0FBa0IsT0FBTyxTQUFQLENBQWlCLE1BQW5DOztBQUVBLGFBQUssR0FBTCxDQUNLLEVBREwsQ0FDUSxzQkFEUixFQUN3QyxVQUFDLE1BQUQ7QUFBQSxtQkFBWSxNQUFLLHlCQUFMLENBQStCLE1BQS9CLEVBQXVDLFFBQXZDLENBQVo7QUFBQSxTQUR4QyxFQUVLLEVBRkwsQ0FFUSxvQkFGUixFQUV3QyxVQUFDLE1BQUQ7QUFBQSxtQkFBWSxNQUFLLHlCQUFMLENBQStCLE1BQS9CLEVBQXVDLE1BQXZDLENBQVo7QUFBQSxTQUZ4QyxFQUdLLEVBSEwsQ0FHUSwyQkFIUixFQUd3QyxVQUFDLE1BQUQ7QUFBQSxtQkFBWSxNQUFLLHlCQUFMLENBQStCLE1BQS9CLEVBQXVDLGFBQXZDLENBQVo7QUFBQSxTQUh4QyxFQUlLLEVBSkwsQ0FJUSxlQUpSLEVBSXdDLFVBQUMsTUFBRDtBQUFBLG1CQUFZLE1BQUsseUJBQUwsQ0FBK0IsTUFBL0IsRUFBdUMsY0FBdkMsQ0FBWjtBQUFBLFNBSnhDLEVBS0ssRUFMTCxDQUtRLHlCQUxSLEVBS3dDLFVBQUMsTUFBRDtBQUFBLG1CQUFZLE1BQUsseUJBQUwsQ0FBK0IsTUFBL0IsRUFBdUMsdUJBQXZDLENBQVo7QUFBQSxTQUx4QztBQU9IOzs7O3dEQUVnRCxLLEVBQU07QUFBQTs7QUFBQSxnQkFBNUIsVUFBNEIsUUFBNUIsVUFBNEI7QUFBQSxnQkFBaEIsT0FBZ0IsUUFBaEIsT0FBZ0I7O0FBQ25ELGdCQUFJLE9BQUosQ0FBWSxVQUFDLE9BQUQsRUFBVSxNQUFWO0FBQUEsdUJBQ1osRUFBRSxJQUFGLENBQU87QUFDSCx5QkFBSyxJQUFJLE9BQU8sSUFBUCxDQUFZLG1CQUFaLENBQWdDLGVBQXBDLENBREY7QUFFSCwwQkFBTSxNQUZIO0FBR0gsMEJBQU07QUFDRixnQ0FBUSxLQUROO0FBRUYsbUNBQVcsT0FBSyxVQUZkO0FBR0YsaUNBQVMsV0FBVztBQUhsQjtBQUhILGlCQUFQLEVBU0MsSUFURCxDQVNNLFVBQUMsUUFBRDtBQUFBLDJCQUFjLFFBQVEsUUFBUixDQUFkO0FBQUEsaUJBVE4sRUFVQyxJQVZELENBVU0sVUFBQyxHQUFELEVBQU0sTUFBTixFQUFjLEdBQWQ7QUFBQSwyQkFBc0IsT0FBTyxHQUFQLENBQXRCO0FBQUEsaUJBVk4sQ0FEWTtBQUFBLGFBQVosV0FZTyxVQUFDLEtBQUQsRUFBVztBQUNkLHVCQUFPLE1BQVAsQ0FBYyxHQUFkLENBQWtCLE9BQWxCLEVBQTJCLG9EQUEzQixFQUFpRixFQUFDLFNBQVMsTUFBTSxVQUFOLElBQW9CLEtBQTlCLEVBQWpGO0FBQ0gsYUFkRDtBQWVIOzs7Ozs7cUJBL0JnQix5Qjs7Ozs7Ozs7Ozs7QUNGckIsSUFBQSxVQUFBLEdBQUEsT0FBQSxDQUFBLHNCQUFBLENBQUEsQ0FBQTs7Ozs7Ozs7Ozs7O0lBRXFCOzs7SUFFakIsU0FBQSxPQUFBLENBQVksSUFBWixFQUFpQjtRQUFBLGVBQUEsQ0FBQSxJQUFBLEVBQUEsT0FBQSxDQUFBLENBQUE7O1FBQUEsSUFBQSxLQUFBLEdBQUEsMEJBQUEsQ0FBQSxJQUFBLEVBQUEsQ0FBQSxPQUFBLENBQUEsU0FBQSxJQUFBLE1BQUEsQ0FBQSxjQUFBLENBQUEsT0FBQSxDQUFBLEVBQUEsS0FBQSxDQUFBLElBQUEsRUFDSixTQURJLENBQUEsQ0FBQSxDQUFBOztRQUdiLElBQUcsQ0FBQyxJQUFBLENBQUssTUFBVCxFQUFnQjtZQUNaLE1BQU0sSUFBSSxLQUFKLENBQVUsMkJBQVYsQ0FBTixDQUFBO1NBQ0g7O1FBRUQsS0FBQSxDQUFLLFFBQUwsR0FBZ0IsSUFBQSxDQUFLLFFBQXJCLENBQUE7UUFDQSxLQUFBLENBQUssTUFBTCxHQUFjLElBQUEsQ0FBSyxNQUFuQixDQUFBO1FBQ0EsS0FBQSxDQUFLLE9BQUwsR0FBZSxLQUFmLENBQUE7UUFDQSxLQUFBLENBQUssU0FBTCxHQUFpQixJQUFBLENBQUssU0FBdEIsQ0FBQTtRQUNBLEtBQUEsQ0FBSyxjQUFMLEdBQXNCLElBQUEsQ0FBSyxLQUFMLElBQWMsR0FBcEMsQ0FBQTtRQUNBLEtBQUEsQ0FBSyxpQkFBTCxHQUF5QixJQUFBLENBQUssaUJBQUwsSUFBMEIsS0FBbkQsQ0FBQTtRQUNBLEtBQUEsQ0FBSyxPQUFMLEdBQWUsSUFBQSxDQUFLLE9BQXBCLENBQUE7UUFDQSxLQUFBLENBQUssV0FBTCxHQUFtQixJQUFBLENBQUssV0FBeEIsQ0FBQTs7UUFFQSxLQUFBLENBQUssTUFBTCxDQUFZLEVBQVosQ0FBZSxPQUFmLEVBQXdCLFVBQUMsQ0FBRCxFQUFPO1lBQzNCLEtBQUEsQ0FBSyxNQUFMLEVBQUEsQ0FBQTtZQUNBLENBQUEsQ0FBRSxlQUFGLEVBQUEsQ0FBQTtTQUZKLENBQUEsQ0FBQTtRQWhCYSxPQUFBLEtBQUEsQ0FBQTtLQW9CaEI7Ozs7b0NBRVc7WUFDUixJQUFJLFNBQUEsR0FBWSxDQUFoQixDQUFBO1lBQ0EsSUFBSSxVQUFBLEdBQWEsQ0FBakIsQ0FBQTtZQUNBLElBQUksV0FBQSxHQUFjLENBQWxCLENBQUE7WUFDQSxJQUFJLFlBQUEsR0FBZSxJQUFBLENBQUssTUFBTCxDQUFZLE1BQVosRUFBbkIsQ0FBQTtZQUNBLElBQUksV0FBQSxHQUFjLElBQUEsQ0FBSyxNQUFMLENBQVksS0FBWixFQUFsQixDQUFBO1lBQ0EsWUFBQSxDQUFhLEtBQWIsR0FBcUIsWUFBQSxDQUFhLElBQWIsR0FBb0IsV0FBekMsQ0FBQTtZQUNBLElBQUksWUFBQSxHQUFlLElBQUEsQ0FBSyxNQUFMLENBQVksTUFBWixFQUFuQixDQUFBO1lBQ0EsSUFBSSxhQUFBLEdBQWdCLENBQUEsQ0FBRSxNQUFGLENBQUEsQ0FBVSxLQUFWLEVBQXBCLENBQUE7WUFDQSxJQUFJLGNBQUEsR0FBaUIsQ0FBQSxDQUFFLE1BQUYsQ0FBQSxDQUFVLE1BQVYsRUFBckIsQ0FBQTtZQUNBLElBQUksS0FBQSxHQUFRLElBQUEsQ0FBSyxHQUFMLENBQVMsSUFBQSxDQUFLLGNBQUwsR0FBdUIsQ0FBQSxHQUFJLFVBQXBDLEVBQWlELGFBQWpELENBQVosQ0FBQTtZQUNBLElBQUksUUFBQSxHQUFXLEtBQUEsR0FBUSxXQUF2QixDQUFBO1lBQ0EsSUFBSSxXQUFBLEdBQWMsWUFBQSxDQUFhLElBQS9CLENBQUE7WUFDQSxJQUFJLFlBQUEsR0FBZSxhQUFBLEdBQWdCLFlBQUEsQ0FBYSxLQUFoRCxDQUFBO1lBQ0EsSUFBSSxXQUFBLEdBQWMsV0FBQSxJQUFnQixRQUFBLEdBQVcsQ0FBN0MsQ0FBQTtZQUNBLElBQUksWUFBQSxHQUFlLFlBQUEsSUFBaUIsUUFBQSxHQUFXLENBQS9DLENBQUE7OztZQUlBLElBQUksSUFBQSxHQUFBLEtBQUEsQ0FBSjtnQkFBVSxLQUFBLEdBQUEsS0FBQSxDQUFWO2dCQUFpQixHQUFBLEdBQUEsS0FBQSxDQUFqQjtnQkFBc0IsTUFBQSxHQUFBLEtBQUEsQ0FBdEI7Z0JBQThCLFNBQUEsR0FBQSxLQUFBLENBQTlCO2dCQUF5QyxVQUFBLEdBQUEsS0FBQSxDQUF6QztnQkFBcUQsY0FBQSxHQUFBLEtBQUEsQ0FBckQsQ0FBQTs7WUFFQSxJQUFJLFdBQUEsSUFBZSxZQUFuQixFQUFnQzs7Z0JBRTVCLElBQUEsR0FBTyxZQUFBLENBQWEsSUFBYixHQUFxQixRQUFBLEdBQVcsQ0FBdkMsQ0FBQTtnQkFDQSxLQUFBLEdBQVEsYUFBQSxHQUFnQixZQUFBLENBQWEsS0FBN0IsR0FBc0MsUUFBQSxHQUFXLENBQXpELENBQUE7Z0JBQ0EsU0FBQSxHQUFZLEtBQUEsR0FBUSxDQUFwQixDQUFBO2dCQUNBLGNBQUEsR0FBaUIsZUFBakIsQ0FBQTthQUxKLE1BTU8sSUFBSSxZQUFBLElBQWdCLFFBQXBCLEVBQTZCOztnQkFFaEMsSUFBQSxHQUFPLFlBQUEsQ0FBYSxJQUFwQixDQUFBO2dCQUNBLEtBQUEsR0FBUSxhQUFBLEdBQWdCLFlBQUEsQ0FBYSxLQUE3QixHQUFxQyxRQUE3QyxDQUFBO2dCQUNBLFNBQUEsR0FBWSxXQUFaLENBQUE7Z0JBQ0EsY0FBQSxHQUFpQixhQUFqQixDQUFBO2FBTEcsTUFNQSxJQUFJLFdBQUEsSUFBZSxRQUFuQixFQUE0Qjs7Z0JBRS9CLElBQUEsR0FBTyxZQUFBLENBQWEsSUFBYixHQUFvQixRQUEzQixDQUFBO2dCQUNBLEtBQUEsR0FBUSxhQUFBLEdBQWdCLFlBQUEsQ0FBYSxLQUFyQyxDQUFBO2dCQUNBLFVBQUEsR0FBYSxXQUFiLENBQUE7Z0JBQ0EsY0FBQSxHQUFpQixjQUFqQixDQUFBO2FBTEcsTUFNQTs7Z0JBRUgsSUFBQSxHQUFPLENBQVAsQ0FBQTtnQkFDQSxLQUFBLEdBQVEsQ0FBUixDQUFBO2dCQUNBLFNBQUEsR0FBWSxZQUFBLENBQWEsSUFBYixHQUFxQixXQUFBLEdBQWMsQ0FBL0MsQ0FBQTtnQkFDQSxjQUFBLEdBQWlCLFlBQWpCLENBQUE7YUFDSDs7WUFFRCxJQUFJLE1BQUEsR0FBVSxDQUFDLElBQUEsQ0FBSyxNQUFMLENBQVksQ0FBWixDQUFBLENBQWUscUJBQWYsRUFBQSxDQUF1QyxHQUF2QyxHQUE4QyxZQUFBLEdBQWUsQ0FBOUQsSUFBb0UsY0FBckUsR0FBdUYsUUFBcEcsQ0FBQTtZQUNBLElBQUksQ0FBQyxNQUFMLEVBQVk7Z0JBQ1IsR0FBQSxHQUFNLFlBQUEsQ0FBYSxHQUFiLEdBQW1CLFNBQW5CLEdBQStCLFlBQXJDLENBQUE7YUFESixNQUVPO2dCQUNILE1BQUEsR0FBUyxjQUFBLEdBQWlCLFlBQUEsQ0FBYSxHQUE5QixHQUFvQyxTQUE3QyxDQUFBO2FBQ0g7O1lBRUQsT0FBTztnQkFDSCxJQUFBLEVBQU07b0JBQ0YsR0FBQSxFQUFBLEdBREU7b0JBRUYsTUFBQSxFQUFBLE1BRkU7b0JBR0YsSUFBQSxFQUFBLElBSEU7b0JBSUYsS0FBQSxFQUFBLEtBQUE7aUJBTEQ7Z0JBT0gsS0FBQSxFQUFPO29CQUNILElBQUEsRUFBTSxTQURIO29CQUVILEtBQUEsRUFBTyxVQUFBO2lCQVRSO2dCQVdILGNBQUEsRUFBZ0IsTUFBQSxHQUFTLFdBQVQsR0FBdUIsYUFYcEM7Z0JBWUgsY0FBQSxFQUFBLGNBQUE7YUFaSixDQUFBO1NBY0g7OztpQ0FHUTtZQUFBLElBQUEsTUFBQSxHQUFBLElBQUEsQ0FBQTs7WUFDTCxJQUFJLE1BQUEsR0FBUyxJQUFBLENBQUssU0FBTCxFQUFiLENBQUE7O1lBRUEsSUFBQSxDQUFLLEdBQUwsQ0FBUyxLQUFULEVBQUEsQ0FBQTtZQUNBLElBQUEsQ0FBSyxHQUFMLEdBQVcsQ0FBQSxDQUFBLDRCQUFBLEdBQ08sSUFBQSxDQUFLLFNBRFosR0FBQSxpQkFBQSxHQUN1QyxNQUFBLENBQU8sY0FEOUMsR0FBQSxHQUFBLEdBQ2dFLE1BQUEsQ0FBTyxjQUR2RSxHQUFBLHdFQUFBLElBR0csTUFBQSxDQUFPLElBQVAsQ0FBWSxHQUFaLEdBQUEsTUFBQSxHQUEwQixNQUFBLENBQU8sSUFBUCxDQUFZLEdBQXRDLEdBQUEsS0FBQSxHQUFpRCxFQUhwRCxDQUFBLEdBQUEsd0JBQUEsSUFJRyxNQUFBLENBQU8sSUFBUCxDQUFZLE1BQVosR0FBQSxTQUFBLEdBQWdDLE1BQUEsQ0FBTyxJQUFQLENBQVksTUFBNUMsR0FBQSxLQUFBLEdBQTBELEVBSjdELENBQUEsR0FBQSw2QkFBQSxHQUtRLE1BQUEsQ0FBTyxJQUFQLENBQVksSUFMcEIsR0FBQSxpQ0FBQSxHQU1TLE1BQUEsQ0FBTyxJQUFQLENBQVksS0FOckIsR0FBQSwySUFBQSxJQVNlLE1BQUEsQ0FBTyxLQUFQLENBQWEsS0FBYixHQUFBLFFBQUEsR0FBK0IsTUFBQSxDQUFPLEtBQVAsQ0FBYSxLQUE1QyxHQUFBLEtBQUEsR0FBeUQsRUFUeEUsQ0FBQSxHQUFBLG9DQUFBLElBVWUsTUFBQSxDQUFPLEtBQVAsQ0FBYSxJQUFiLEdBQUEsT0FBQSxHQUE2QixNQUFBLENBQU8sS0FBUCxDQUFhLElBQTFDLEdBQUEsS0FBQSxHQUFzRCxFQVZyRSxDQUFBLEdBQUEsZ0lBQUEsR0FhTyxJQUFBLENBQUssUUFiWixHQUFBLHdEQUFBLENBQVgsQ0FBQTs7WUFrQkEsQ0FBQSxDQUFFLE1BQUYsQ0FBQSxDQUFVLE1BQVYsQ0FBaUIsSUFBQSxDQUFLLEdBQXRCLENBQUEsQ0FBQTtZQUNBLENBQUEsQ0FBRSxNQUFGLENBQUEsQ0FBVSxLQUFWLENBQWdCLFlBQUE7Z0JBQUEsT0FBTSxNQUFBLENBQUssSUFBTCxFQUFOLENBQUE7YUFBaEIsQ0FBQSxDQUFBO1NBQ0g7OzsrQkFFTTtZQUNILElBQUEsQ0FBSyxHQUFMLENBQVMsTUFBVCxFQUFBLENBQUE7WUFDQSxJQUFBLENBQUssT0FBTCxHQUFlLEtBQWYsQ0FBQTtTQUNIOzs7K0JBRUs7WUFDRixJQUFBLENBQUssTUFBTCxFQUFBLENBQUE7WUFDQSxJQUFHLElBQUEsQ0FBSyxpQkFBUixFQUEwQjtnQkFDdEIsQ0FBQSxDQUFBLEVBQUEsV0FBQSxDQUFBLFNBQUEsQ0FBQSxHQUFBLENBQUE7YUFDSDtZQUNELElBQUcsSUFBQSxDQUFLLE9BQVIsRUFBZ0I7Z0JBQ1osSUFBQSxDQUFLLE9BQUwsRUFBQSxDQUFBO2FBQ0g7WUFDRCxJQUFBLENBQUssT0FBTCxHQUFlLElBQWYsQ0FBQTtTQUNIOzs7aUNBRU87WUFDSixJQUFJLElBQUEsQ0FBSyxPQUFULEVBQWlCO2dCQUNiLElBQUcsSUFBQSxDQUFLLFdBQVIsRUFBb0I7b0JBQ2hCLElBQUEsQ0FBSyxXQUFMLEVBQUEsQ0FBQTtpQkFDSDtnQkFDRCxJQUFBLENBQUssSUFBTCxFQUFBLENBQUE7YUFKSixNQU1LO2dCQUNELElBQUEsQ0FBSyxJQUFMLEVBQUEsQ0FBQTthQUNIO1NBQ0o7Ozs7RUFuSmdDLFFBQUEsQ0FBUzs7cUJBQXpCOzs7Ozs7Ozs7O0FDRnJCOzs7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7Ozs7O0FBRUEsSUFBTSw0QkFBNEIsa0JBQWUsTUFBZixDQUFzQjs7QUFFcEQsV0FBTywyQkFGNkM7O0FBSXBELE9BSm9ELGlCQUk5QztBQUNGLGVBQVUsVUFBVSxnQkFBcEI7QUFDSCxLQU5tRDtBQVFwRCxjQVJvRCxzQkFRekMsTUFSeUMsUUFRTTtBQUFBLFlBQXRDLEtBQXNDLFFBQXRDLEtBQXNDO0FBQUEsOEJBQS9CLEtBQStCO0FBQUEsWUFBL0IsS0FBK0IsOEJBQXZCLEVBQXVCO0FBQUEsK0JBQW5CLE1BQW1CO0FBQUEsWUFBbkIsTUFBbUIsK0JBQVYsT0FBVTs7QUFDdEQsYUFBSyxLQUFMLEdBQWEsS0FBYjtBQUNBLGFBQUssS0FBTCxHQUFhLEtBQWI7QUFDQSxhQUFLLE1BQUwsR0FBYyxNQUFkO0FBQ0EsYUFBSyxNQUFMLEdBQWMsVUFBVSxrQkFBeEI7O0FBRUEsYUFBSyxTQUFMLEdBQWlCLEtBQUssdUJBQUwsRUFBakI7O0FBRUEsYUFBSyxRQUFMLENBQWMsS0FBSyxLQUFuQixFQUEwQixhQUExQixFQUF5QyxLQUFLLGlCQUFMLENBQXVCLElBQXZCLENBQTRCLElBQTVCLENBQXpDO0FBQ0EsYUFBSyxFQUFMLENBQVEsTUFBUixFQUFnQixLQUFLLGdCQUFyQjtBQUNILEtBbEJtRDtBQW9CcEQscUJBcEJvRCwrQkFvQmhDO0FBQ2hCLFlBQUksS0FBSyxLQUFMLENBQVcsc0JBQVgsRUFBSixFQUF5QztBQUNyQztBQUNBLGlCQUFLLFVBQUwsSUFBbUIsS0FBSyxVQUFMLENBQWdCLEtBQWhCLEVBQW5COztBQUVBLGlCQUFLLFVBQUwsR0FBa0IsS0FBSyxLQUFMLEVBQWxCO0FBQ0gsU0FMRCxNQUtPO0FBQ0gsaUJBQUssS0FBTDtBQUNIO0FBQ0osS0E3Qm1EO0FBK0JwRCxlQS9Cb0QseUJBK0J0QztBQUNWLFlBQUksU0FBUyxFQUFDLE9BQU8sS0FBSyxLQUFMLENBQVcsR0FBWCxDQUFlLE1BQWYsQ0FBUixFQUFnQyxTQUFTLEtBQUssS0FBOUMsRUFBcUQsY0FBYyxLQUFLLEtBQXhFLEVBQStFLFFBQVEsS0FBSyxNQUE1RixFQUFvRyxXQUFXLEtBQUssU0FBcEgsRUFBYjtBQUNBLFlBQUksVUFBVSxnQkFBVixLQUErQixVQUFVLFdBQTdDLEVBQTBEO0FBQ3RELG1CQUFPLFNBQVAsSUFBb0IsS0FBSyxNQUF6QjtBQUNIOztBQUVELFlBQUksU0FBUyxPQUFPLGNBQVAsQ0FBc0IsU0FBdEIsQ0FBZ0MsZ0JBQWhDLElBQW9ELEVBQUUsS0FBRixDQUFRLE1BQVIsRUFBZ0IsSUFBaEIsQ0FBcEQsR0FBNEUsRUFBRSxLQUFGLENBQVEsTUFBUixDQUF6RjtBQUNBLGVBQU8sTUFBUDtBQUNILEtBdkNtRDtBQXlDcEQsU0F6Q29ELG1CQXlDNUM7QUFDSixZQUFNLE9BQU8sS0FBSyxXQUFMLEVBQWI7QUFDQSxlQUFPLHNDQUFvQixrQkFBZSxTQUFmLENBQXlCLEtBQXpCLENBQStCLElBQS9CLENBQW9DLElBQXBDLEVBQTBDLEVBQUMsVUFBRCxFQUExQyxDQUFwQixDQUFQO0FBQ0gsS0E1Q21EO0FBOENwRCxvQkE5Q29ELDRCQThDbkMsVUE5Q21DLEVBOEN2QixRQTlDdUIsRUE4Q2IsT0E5Q2EsRUE4Q0o7QUFDNUMsWUFBSSxRQUFRLElBQVIsS0FBaUIsS0FBSyxXQUFMLEVBQXJCLEVBQXlDO0FBQ3JDLGlCQUFLLE9BQUwsQ0FBYSxXQUFiO0FBQ0g7QUFDSixLQWxEbUQ7QUFvRHBELFNBcERvRCxpQkFvRDlDLFFBcEQ4QyxFQW9EcEM7QUFDWixZQUFNLFNBQVMsRUFBRSxHQUFGLENBQU0sU0FBUyxLQUFmLEVBQXNCLFVBQUMsSUFBRCxFQUFPLEtBQVA7QUFBQSxtQkFBa0IsRUFBQyxNQUFNLDBCQUFlLEtBQUssSUFBcEIsQ0FBUCxFQUFrQyxPQUFPLEtBQUssS0FBOUMsRUFBcUQsWUFBckQsRUFBbEI7QUFBQSxTQUF0QixDQUFmO0FBQ0EsZUFBTyxFQUFFLElBQUYsQ0FBTyxNQUFQLEVBQWUsVUFBQyxJQUFEO0FBQUEsbUJBQVUsS0FBSyxJQUFMLENBQVUsV0FBVixFQUFWO0FBQUEsU0FBZixDQUFQO0FBQ0gsS0F2RG1EO0FBeURwRCwyQkF6RG9ELHFDQXlEMUI7QUFDdEIsWUFBSSxZQUFZLEVBQWhCOztBQUVBLFlBQU0sbUJBQW1CLE9BQU8sU0FBUCxDQUFpQixnQkFBMUM7QUFDQSxZQUFJLG9CQUFvQixFQUFFLE9BQUYsQ0FBVSxnQkFBVixDQUF4QixFQUFxRDtBQUNqRDtBQUNBO0FBQ0Esd0JBQVksaUJBQWlCLEdBQWpCLENBQXFCLFVBQUMsTUFBRCxFQUFZO0FBQ3pDLG9CQUFJLGNBQWMsT0FBTyxFQUF6QjtBQUNBLG9CQUFNLGdCQUFnQixZQUFZLE9BQVosQ0FBb0IsR0FBcEIsQ0FBdEI7QUFDQSxvQkFBSSxrQkFBa0IsQ0FBQyxDQUF2QixFQUEwQjtBQUN0QixrQ0FBYyxZQUFZLFNBQVosQ0FBc0IsQ0FBdEIsRUFBeUIsYUFBekIsQ0FBZDtBQUNIO0FBQ0QsdUJBQU8sV0FBUDtBQUNILGFBUFcsQ0FBWjtBQVFBLHdCQUFZLFVBQVUsTUFBVixDQUFpQixVQUFDLEtBQUQsRUFBUSxLQUFSO0FBQUEsdUJBQWtCLFVBQVUsT0FBVixDQUFrQixLQUFsQixNQUE2QixLQUEvQztBQUFBLGFBQWpCLENBQVo7QUFDSDs7QUFFRCxZQUFNLE9BQU8sT0FBTyxTQUFQLENBQWlCLFdBQTlCO0FBQ0EsWUFBTSxjQUFjLFFBQVEsS0FBSyxPQUFiLElBQXdCLEtBQUssT0FBTCxDQUFhLFNBQXpEO0FBQ0EsWUFBSSxXQUFKLEVBQWlCO0FBQ2Isd0JBQVksRUFBRSxTQUFGLEVBQWEsWUFBYixDQUEwQixXQUExQixDQUFaO0FBQ0g7O0FBRUQsWUFBRyxPQUFPLGNBQVAsQ0FBc0IsU0FBdEIsQ0FBZ0MsZ0JBQWhDLENBQUgsRUFBc0Q7QUFDbEQsZ0JBQUksd0JBQXdCLE9BQU8sU0FBUCxDQUFpQixxQkFBakIsQ0FBdUMsS0FBdkMsQ0FBNkMsR0FBN0MsQ0FBNUI7QUFDQSx3QkFBWSxVQUFVLE1BQVYsQ0FBaUI7QUFBQSx1QkFBUSxzQkFBc0IsUUFBdEIsQ0FBK0IsSUFBL0IsQ0FBUjtBQUFBLGFBQWpCLENBQVo7QUFDSDs7QUFFRCxlQUFPLFNBQVA7QUFDSDtBQXZGbUQsQ0FBdEIsQ0FBbEM7O3FCQTBGZSx5Qjs7Ozs7Ozs7O0FDL0ZmOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7OztBQUNBLElBQU0sV0FBVyxPQUFPLFFBQXhCOztBQUVBLElBQU0sa0JBQWtCLFNBQWxCLGVBQWtCLE9BQTREO0FBQUEsUUFBMUQsUUFBMEQsUUFBMUQsUUFBMEQ7QUFBQSxRQUFoRCxpQkFBZ0QsUUFBaEQsaUJBQWdEO0FBQUEsUUFBN0IsY0FBNkIsUUFBN0IsY0FBNkI7QUFBQSxRQUFiLE9BQWEsUUFBYixPQUFhOztBQUNoRixRQUFNLFFBQVEsSUFBSSx5QkFBSixFQUFkO0FBQ0EsUUFBTSxpQkFBaUIsT0FBTyxjQUE5Qjs7QUFFQTtBQUNBLFFBQUksZUFBZSxTQUFmLENBQXlCLGNBQXpCLENBQUosRUFBOEM7QUFDMUMsWUFBTSxrQkFBa0IsRUFBRSxNQUFGLENBQVMsRUFBVCxFQUFhLFNBQVMsTUFBdEIsQ0FBeEI7QUFDQSxZQUFNLHdCQUF3QixJQUFJLG9DQUFKLENBQThCLEVBQUMsSUFBSSxRQUFMLEVBQWUsOEJBQWYsRUFBK0IsWUFBL0IsRUFBc0MsZ0NBQXRDLEVBQTlCLENBQTlCLENBRjBDLENBRTJFO0FBQ3JILFlBQU0sa0JBQWtCLElBQUksNEJBQUosQ0FBOEIsSUFBOUIsRUFBb0MsRUFBQyxZQUFELEVBQXBDLENBQXhCO0FBQ0EsWUFBTSxjQUFjO0FBQ2hCLHdCQURnQjtBQUVoQiw0Q0FGZ0I7QUFHaEIsZ0JBQUksaUJBSFk7QUFJaEIsd0JBQVksZUFKSTtBQUtoQjtBQUxnQixTQUFwQjtBQU9BLFlBQU0sc0JBQXNCLElBQUksNEJBQUosQ0FBd0IsV0FBeEIsQ0FBNUIsQ0FYMEMsQ0FXd0I7QUFDckUsS0FaRCxNQVlPO0FBQ0gsWUFBTSxZQUFZLElBQUksdUJBQUosQ0FBa0IsRUFBQyxJQUFJLFFBQUwsRUFBZSxZQUFmLEVBQXNCLFNBQVMsRUFBQyxlQUFlLGNBQWhCLEVBQS9CLEVBQWxCLENBQWxCLENBREcsQ0FDbUc7QUFDekc7QUFDSixDQXBCRDs7cUJBc0JlLGU7Ozs7Ozs7OztBQzdCZjs7Ozs7O0FBRUEsSUFBTSxpQkFBaUIsa0JBQVUsTUFBVixDQUFpQjtBQUVwQyxZQUZvQyxzQkFFekI7QUFDUCxlQUFPO0FBQ0gsa0JBQU0sRUFESDtBQUVILG9CQUFRO0FBRkwsU0FBUDtBQUlILEtBUG1DO0FBU3BDLFNBVG9DLGlCQVM5QixNQVQ4QixFQVN0QjtBQUNWLGVBQU8sSUFBUCxHQUFjLEtBQUssV0FBTCxDQUFpQixPQUFPLElBQXhCLENBQWQ7QUFDQSxlQUFPLE1BQVA7QUFDSCxLQVptQztBQWNwQyxlQWRvQyx1QkFjeEIsSUFkd0IsRUFjbEI7QUFDZCxlQUFPLEtBQUssT0FBTCxDQUFhLGVBQWIsRUFBOEIsR0FBOUIsQ0FBUDtBQUNIO0FBaEJtQyxDQUFqQixDQUF2Qjs7cUJBbUJlLGM7Ozs7Ozs7OztBQ3JCZjs7Ozs7O0FBRUEsSUFBTSx1QkFBdUIsQ0FBN0I7QUFDQSxJQUFNLGlCQUFpQixDQUF2Qjs7QUFFQSxJQUFNLG1CQUFtQixrQkFBVSxNQUFWLENBQWlCO0FBQ3RDLFlBRHNDLHNCQUMzQjtBQUNQLGVBQU87QUFDSCxrQkFBTTtBQURILFNBQVA7QUFHSCxLQUxxQztBQU90QywwQkFQc0Msb0NBT2I7QUFDckIsWUFBTSxRQUFRLEtBQUssR0FBTCxDQUFTLE1BQVQsQ0FBZDtBQUNBLFlBQU0sb0JBQW9CLE1BQU0sT0FBTixDQUFjLEtBQWQsRUFBcUIsRUFBckIsRUFBeUIsTUFBekIsS0FBb0MsQ0FBOUQ7QUFDQSxZQUFNLDRCQUNGLEtBQUssR0FBTCxDQUFTLE1BQVQsRUFBaUIsTUFBakIsSUFBMkIsb0JBRC9COztBQUdBLGVBQU8sQ0FBQyxpQkFBRCxJQUFzQix5QkFBN0I7QUFDSCxLQWRxQztBQWdCdEMsb0JBaEJzQyw4QkFnQm5CO0FBQ2YsZUFBTyxLQUFLLEdBQUwsQ0FBUyxNQUFULEVBQWlCLE1BQWpCLElBQTJCLGNBQWxDO0FBQ0g7QUFsQnFDLENBQWpCLENBQXpCOztxQkFxQmUsZ0I7Ozs7Ozs7OztBQzFCZixJQUFBLEtBQUEsR0FBQSxPQUFBLENBQUEscUJBQUEsQ0FBQSxDQUFBOzs7O0FBQ0EsSUFBQSxLQUFBLEdBQUEsT0FBQSxDQUFBLG9CQUFBLENBQUEsQ0FBQTs7OztBQUNBO0FBQ0EsSUFBTSxJQUFBLEdBQU8sT0FBQSxDQUFRLE1BQVIsQ0FBYixDQUFBO0FBQ0EsSUFBTSxRQUFBLEdBQVcsc1VBQWpCLENBQUE7O0FBRUEsSUFBTSxjQUFBLEdBQWlCLE1BQUEsQ0FBQSxTQUFBLENBQUEsQ0FBUyxNQUFULENBQWdCOztJQUVuQyxRQUFBLEVBQVUsQ0FBQSxDQUFFLFFBQUYsQ0FBVyxRQUFYLEVBQXFCLEVBQUMsUUFBQSxFQUFVLE1BQVgsRUFBckIsQ0FGeUI7O0lBSW5DLFVBSm1DLEVBQUEsU0FBQSxVQUFBLENBQUEsSUFBQSxFQUlSO1FBQUEsSUFBZixLQUFlLEdBQUEsSUFBQSxDQUFmLEtBQWU7WUFBUixLQUFRLEdBQUEsSUFBQSxDQUFSLEtBQVEsQ0FBQTs7UUFDdkIsSUFBQSxDQUFLLEtBQUwsR0FBYSxLQUFiLENBQUE7UUFDQSxJQUFBLENBQUssS0FBTCxHQUFhLEtBQWIsQ0FBQTtRQUNBLElBQUEsQ0FBSyxRQUFMLENBQWMsSUFBQSxDQUFLLEtBQW5CLEVBQTBCLGVBQTFCLEVBQTJDLElBQUEsQ0FBSyxNQUFoRCxDQUFBLENBQUE7S0FQK0I7SUFVbkMsa0JBVm1DLEVBQUEsU0FBQSxrQkFBQSxHQVVkO1FBQ2pCLElBQUEsQ0FBSyxLQUFMLENBQVcsT0FBWCxFQUFBLENBQUE7UUFDQSxJQUFBLENBQUssVUFBTCxFQUFBLENBQUE7S0FaK0I7SUFlbkMsVUFmbUMsRUFBQSxTQUFBLFVBQUEsR0FldEI7UUFDVCxJQUFBLENBQUssTUFBTCxFQUFBLENBQUE7UUFDQSxJQUFBLENBQUssTUFBTCxFQUFBLENBQUE7S0FqQitCO0lBb0JuQyxlQXBCbUMsRUFBQSxTQUFBLGVBQUEsR0FvQmpCO1FBQ2QsSUFBTSxJQUFBLEdBQU8sTUFBQSxDQUFPLEdBQVAsQ0FBVyxNQUFBLENBQU8sTUFBUCxDQUFjLE1BQXpCLEVBQWlDO1lBQzFDLEtBQUEsRUFBTyxJQUFBLENBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxNQUFmLENBQUE7U0FERSxDQUFiLENBQUE7O1FBSUEsT0FBTyxDQUFBLENBQUUsTUFBRixDQUFTLEVBQVQsRUFBYSxJQUFBLENBQUssS0FBTCxDQUFXLFVBQXhCLEVBQW9DO1lBQ3ZDLElBQUEsRUFBQSxJQUR1QztZQUV2QyxVQUFBLEVBQVksQ0FBQSxDQUFBLEVBQUEsS0FBQSxDQUFBLGVBQUEsRUFBZ0I7Z0JBQ3hCLElBQUEsRUFBTSxJQUFBLENBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxNQUFmLENBRGtCO2dCQUV4QixPQUFBLEVBQVMsSUFBQSxDQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsTUFBZixDQUZlO2dCQUd4QixHQUFBLEVBQUssR0FIbUI7Z0JBSXhCLFVBQUEsRUFBWSxJQUFBO2FBSkosQ0FGMkI7WUFRdkMsS0FBQSxFQUFPLE1BQUEsQ0FBTyxJQUFQLENBQVksZUFBQSxHQUFrQixJQUFBLENBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxPQUFmLENBQTlCLENBQUE7U0FSSixDQUFQLENBQUE7S0FVSDtDQW5Da0IsQ0FBdkIsQ0FBQTs7cUJBc0NlOzs7Ozs7Ozs7O0FDNUNmLElBQUEsV0FBQSxHQUFBLE9BQUEsQ0FBQSwyQkFBQSxDQUFBLENBQUE7Ozs7QUFDQSxJQUFBLGVBQUEsR0FBQSxPQUFBLENBQUEsa0JBQUEsQ0FBQSxDQUFBOzs7Ozs7QUFDQTtBQUNBLElBQU0sSUFBQSxHQUFPLE9BQUEsQ0FBUSxNQUFSLENBQWIsQ0FBQTtBQUNBLElBQU0sUUFBQSxHQUFXLDZLQUFqQixDQUFBOztBQUVBLElBQU0sZUFBQSxHQUFrQixZQUFBLENBQUEsU0FBQSxDQUFBLENBQWUsTUFBZixDQUFzQjs7SUFFMUMsUUFBQSxFQUFVLENBQUEsQ0FBRSxRQUFGLENBQVcsUUFBWCxDQUZnQzs7SUFJMUMsVUFKMEMsRUFBQSxTQUFBLFVBQUEsQ0FBQSxJQUFBLEVBSXlCO1FBQUEsSUFBdkQsRUFBdUQsR0FBQSxJQUFBLENBQXZELEVBQXVEO1lBQW5ELEtBQW1ELEdBQUEsSUFBQSxDQUFuRCxLQUFtRDtZQUE1QyxVQUE0QyxHQUFBLElBQUEsQ0FBNUMsVUFBNEM7WUFBaEMsZUFBZ0MsR0FBQSxJQUFBLENBQWhDLGVBQWdDO1lBQUEsWUFBQSxHQUFBLElBQUEsQ0FBZixPQUFlO1lBQWYsT0FBZSxHQUFBLFlBQUEsS0FBQSxTQUFBLEdBQUwsRUFBSyxHQUFBLFlBQUEsQ0FBQTs7UUFDL0QsSUFBQSxDQUFLLEVBQUwsR0FBVSxFQUFWLENBQUE7UUFDQSxJQUFBLENBQUssVUFBTCxHQUFrQixVQUFsQixDQUFBO1FBQ0EsSUFBQSxDQUFLLEtBQUwsR0FBYSxLQUFiLENBQUE7UUFDQSxJQUFBLENBQUssZUFBTCxHQUF1QixlQUF2QixDQUFBO1FBQ0EsSUFBQSxDQUFLLE9BQUwsR0FBZSxPQUFmLENBQUE7UUFDQSxJQUFBLENBQUssZUFBTCxHQUF1QixDQUFBLENBQUUsMkJBQUYsQ0FBdkIsQ0FBQTtRQUNBLElBQUEsQ0FBSyxVQUFMLEdBQWtCLENBQUEsQ0FBRSxhQUFGLENBQWxCLENBQUE7UUFDQSxJQUFBLENBQUssUUFBTCxDQUFjLElBQUEsQ0FBSyxVQUFuQixFQUErQixPQUEvQixFQUF3QyxJQUFBLENBQUsscUJBQTdDLENBQUEsQ0FBQTtRQUNBLElBQUEsQ0FBSyxRQUFMLENBQWMsSUFBQSxDQUFLLFVBQW5CLEVBQStCLFdBQS9CLEVBQTRDLElBQUEsQ0FBSyxXQUFqRCxDQUFBLENBQUE7UUFDQSxJQUFBLENBQUssUUFBTCxDQUFjLGVBQWQsRUFBK0Isa0JBQS9CLEVBQW1ELElBQUEsQ0FBSyxxQkFBeEQsQ0FBQSxDQUFBO1FBQ0EsSUFBQSxDQUFLLFFBQUwsQ0FBYyxlQUFkLEVBQStCLG1CQUEvQixFQUFvRCxJQUFBLENBQUssV0FBekQsQ0FBQSxDQUFBO1FBQ0EsSUFBQSxDQUFLLFFBQUwsQ0FBYyxlQUFkLEVBQStCLDJCQUEvQixFQUE0RCxJQUFBLENBQUssYUFBakUsQ0FBQSxDQUFBO0tBaEJzQztJQW1CMUMscUJBbkIwQyxFQUFBLFNBQUEscUJBQUEsR0FtQmxCO1FBQ3BCLElBQUksSUFBQSxDQUFLLE9BQUwsQ0FBYSxPQUFqQixFQUEwQjtZQUN0QixJQUFBLENBQUssZUFBTCxDQUFxQixJQUFyQixFQUFBLENBQUE7U0FDSDs7UUFFRCxJQUFJLElBQUEsQ0FBSyxPQUFMLENBQWEsTUFBakIsRUFBeUI7WUFDckIsSUFBQSxDQUFLLG9CQUFMLEVBQUEsQ0FBQTtTQUNIO1FBQ0QsSUFBQSxDQUFLLFVBQUwsQ0FBZ0IsTUFBaEIsQ0FBdUIsS0FBdkIsRUFBOEIsRUFBQyxNQUFBLEVBQVEsS0FBVCxFQUE5QixDQUFBLENBQUE7UUFDQSxJQUFBLENBQUssT0FBTCxFQUFBLENBQUE7UUFDQSxJQUFBLENBQUssb0JBQUwsR0FBNEIsSUFBNUIsQ0FBQTtLQTdCc0M7SUFnQzFDLG9CQWhDMEMsRUFBQSxTQUFBLG9CQUFBLEdBZ0NuQjs7UUFFbkIsQ0FBQSxDQUFFLDRCQUFGLENBQUEsQ0FBZ0MsV0FBaEMsQ0FBNEMsaUJBQTVDLENBQUEsQ0FBQTtRQUNBLENBQUEsQ0FBRSx1QkFBRixDQUFBLENBQTJCLFFBQTNCLENBQW9DLFdBQXBDLENBQUEsQ0FBQTtRQUNBLENBQUEsQ0FBRSwwQkFBRixDQUFBLENBQThCLFdBQTlCLENBQTBDLFdBQTFDLENBQUEsQ0FBQTtRQUNBLENBQUEsQ0FBRSx1QkFBRixDQUFBLENBQTJCLFdBQTNCLENBQXVDLFdBQXZDLENBQUEsQ0FBQTtLQXJDc0M7SUF3QzFDLGFBeEMwQyxFQUFBLFNBQUEsYUFBQSxDQXdDNUIsU0F4QzRCLEVBd0NqQjtRQUNyQixJQUFJLElBQUEsQ0FBSyxVQUFMLENBQWdCLE1BQWhCLENBQXVCLE1BQXZCLEtBQWtDLENBQXRDLEVBQXlDO1lBQ3JDLE9BQUE7U0FDSDtRQUNELElBQUksSUFBQSxDQUFLLG9CQUFMLElBQTZCLElBQWpDLEVBQXVDO1lBQ25DLElBQUEsQ0FBSyxvQkFBTCxHQUE0QixTQUFBLEdBQVksQ0FBWixHQUFnQixDQUFoQixHQUFvQixTQUFoRCxDQUFBO1NBREosTUFFTztZQUNILElBQUEsQ0FBSyxvQkFBTCxJQUE2QixTQUE3QixDQUFBO1NBQ0g7UUFDRCxJQUFJLElBQUEsQ0FBSyxvQkFBTCxHQUE0QixDQUFoQyxFQUFtQztZQUMvQixJQUFBLENBQUssb0JBQUwsR0FBNEIsSUFBQSxDQUFLLEtBQUwsQ0FBVyxNQUFYLEdBQW9CLENBQWhELENBQUE7U0FESixNQUVPLElBQUksSUFBQSxDQUFLLG9CQUFMLElBQTZCLElBQUEsQ0FBSyxVQUFMLENBQWdCLE1BQWhCLENBQXVCLE1BQXhELEVBQWdFO1lBQ25FLElBQUEsQ0FBSyxvQkFBTCxHQUE0QixDQUE1QixDQUFBO1NBQ0g7UUFDRCxJQUFNLEtBQUEsR0FBUSxJQUFBLENBQUssVUFBTCxDQUFnQixNQUFoQixDQUF1QixJQUFBLENBQUssb0JBQTVCLENBQWQsQ0FBQTtRQUNBLElBQUEsQ0FBSyxVQUFMLENBQWdCLE1BQWhCLENBQXVCLEtBQXZCLEVBQThCLEVBQUMsTUFBQSxFQUFRLEtBQVQsRUFBOUIsQ0FBQSxDQUFBO1FBQ0EsS0FBQSxDQUFNLEdBQU4sQ0FBVSxRQUFWLEVBQW9CLElBQXBCLENBQUEsQ0FBQTtRQUNBLElBQUEsQ0FBSyxlQUFMLENBQXFCLE9BQXJCLENBQTZCLGtCQUE3QixFQUFpRCxLQUFBLENBQU0sR0FBTixDQUFVLE1BQVYsQ0FBakQsQ0FBQSxDQUFBO0tBekRzQztJQTREMUMsV0E1RDBDLEVBQUEsU0FBQSxXQUFBLEdBNEQ1QjtRQUNWLElBQU0sU0FBQSxHQUFZLHlCQUFsQixDQUFBO1FBQ0EsSUFBQSxDQUFLLENBQUwsQ0FBTyxTQUFQLENBQUEsQ0FBa0IsTUFBbEIsQ0FBeUIsSUFBQSxDQUFLLElBQTlCLENBQUEsQ0FBQTtLQTlEc0M7SUFpRTFDLFdBakUwQyxFQUFBLFNBQUEsV0FBQSxHQWlFNUI7UUFDVixJQUFBLENBQUssb0JBQUwsR0FBNEIsSUFBNUIsQ0FBQTtRQUNBLElBQUksSUFBQSxDQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsTUFBZixDQUFBLENBQXVCLE1BQXZCLElBQWlDLElBQUEsQ0FBSyxVQUFMLENBQWdCLE1BQWhCLENBQXVCLE1BQTVELEVBQW9FO1lBQ2hFLElBQUEsQ0FBSyxNQUFMLEVBQUEsQ0FBQTtZQUNBLElBQUEsQ0FBSyxlQUFMLENBQXFCLElBQXJCLEVBQUEsQ0FBQTtTQUZKLE1BR087WUFDSCxJQUFBLENBQUssT0FBTCxFQUFBLENBQUE7U0FDSDtLQXhFcUM7SUEyRTFDLGNBM0UwQyxFQUFBLFNBQUEsY0FBQSxDQUFBLEtBQUEsRUEyRWxCO1FBQUEsSUFBUixLQUFRLEdBQUEsS0FBQSxDQUFSLEtBQVEsQ0FBQTs7UUFDcEIsT0FBTyxJQUFJLGdCQUFBLENBQUEsU0FBQSxDQUFKLENBQXFCO1lBQ3hCLEtBQUEsRUFBQSxLQUR3QjtZQUV4QixLQUFBLEVBQU8sSUFBQSxDQUFLLEtBQUE7U0FGVCxDQUFQLENBQUE7S0FJSDtDQWhGbUIsQ0FBeEIsQ0FBQTs7cUJBb0ZlOzs7Ozs7Ozs7O0FDMUZmOzs7O0FBQ0E7Ozs7OztBQUVBLElBQU0sSUFBSSxPQUFPLENBQWpCOztBQUVBLElBQU0sWUFBWSxrQkFBUyxNQUFULENBQWdCOztBQUU5QixZQUFRO0FBQ0osbUNBQTJCLFlBRHZCO0FBRUosc0NBQThCLE9BRjFCO0FBR0osdUNBQStCLFFBSDNCO0FBSUosc0NBQThCLE9BSjFCO0FBS0osaUNBQXlCO0FBTHJCLEtBRnNCOztBQVU5QixjQVY4Qiw0QkFVRztBQUFBOztBQUFBLFlBQXJCLEVBQXFCLFFBQXJCLEVBQXFCO0FBQUEsWUFBakIsS0FBaUIsUUFBakIsS0FBaUI7QUFBQSxZQUFWLE9BQVUsUUFBVixPQUFVOztBQUM3QixhQUFLLDBCQUFMOztBQUVBLGFBQUssVUFBTCxDQUFnQixFQUFoQjtBQUNBLGFBQUssY0FBTDtBQUNBLGFBQUssS0FBTCxHQUFhLEtBQWI7O0FBRUEsYUFBSyxNQUFMLEdBQXNCLEtBQUssR0FBTCxDQUFTLElBQVQsQ0FBYyxzQkFBZCxDQUF0QjtBQUNBLGFBQUssS0FBTCxHQUFzQixLQUFLLEdBQUwsQ0FBUyxJQUFULENBQWMscUJBQWQsQ0FBdEI7QUFDQSxhQUFLLGFBQUwsR0FBc0IsS0FBSyxHQUFMLENBQVMsSUFBVCxDQUFjLGtCQUFkLENBQXRCO0FBQ0EsYUFBSyxZQUFMLEdBQXNCLEtBQUssR0FBTCxDQUFTLElBQVQsQ0FBYyxpQkFBZCxDQUF0Qjs7QUFFQTtBQUNBLGFBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxNQUFmLEVBQXVCLEtBQUssTUFBTCxDQUFZLEdBQVosRUFBdkI7O0FBRUEsVUFBRSxNQUFGLENBQVMsSUFBVCxFQUFnQixXQUFXLEVBQTNCOztBQUVBLGFBQUssYUFBTCxDQUFtQixFQUFuQixDQUFzQixnQkFBdEIsRUFBd0MsVUFBQyxFQUFELEVBQVE7QUFBRSxrQkFBSyxZQUFMLENBQWtCLEVBQWxCO0FBQXdCLFNBQTFFO0FBQ0gsS0E1QjZCO0FBOEI5Qiw4QkE5QjhCLHdDQThCRDtBQUN6QixVQUFFLEVBQUYsQ0FBSyxrQkFBTCxHQUEwQixZQUFXO0FBQ2pDLGdCQUFNLGNBQWMsS0FBSyxHQUFMLEVBQXBCO0FBQ0EsaUJBQUssR0FBTCxDQUFTLEVBQVQsRUFBYSxHQUFiLENBQWlCLFdBQWpCO0FBQ0gsU0FIRDtBQUlILEtBbkM2QjtBQXFDOUIsY0FyQzhCLHNCQXFDbkIsRUFyQ21CLEVBcUNmO0FBQ1gsWUFBSSxLQUFLLEtBQUwsQ0FBVyxnQkFBWCxFQUFKLEVBQW1DO0FBQy9CLGlCQUFLLEtBQUwsQ0FBVyxNQUFYO0FBQ0gsU0FGRCxNQUVPO0FBQ0gsZUFBRyxlQUFIO0FBQ0EsZUFBRyxjQUFIO0FBQ0g7QUFDSixLQTVDNkI7QUE4QzlCLFNBOUM4QixpQkE4Q3hCLEVBOUN3QixFQThDcEI7QUFDTixhQUFLLGVBQUw7O0FBRUEsWUFBSSxLQUFLLFFBQUwsQ0FBYyxHQUFkLENBQWtCLEdBQUcsS0FBckIsQ0FBSixFQUFpQztBQUM3QixpQkFBSyxRQUFMLENBQWMsR0FBZCxDQUFrQixHQUFHLEtBQXJCLEVBQTRCLElBQTVCO0FBQ0gsU0FGRCxNQUVPO0FBQ0gsaUJBQUssS0FBTCxDQUFXLEdBQVgsQ0FBZSxNQUFmLEVBQXVCLEdBQUcsTUFBSCxDQUFVLEtBQWpDO0FBQ0EsZUFBRyxlQUFIO0FBQ0EsZUFBRyxjQUFIO0FBQ0g7QUFDSixLQXhENkI7QUEwRDlCLFNBMUQ4QixpQkEwRHhCLEVBMUR3QixFQTBEcEI7QUFDTixhQUFLLGVBQUw7QUFDQSxhQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsTUFBZixFQUF1QixHQUFHLE1BQUgsQ0FBVSxLQUFqQztBQUNBLFdBQUcsZUFBSDtBQUNBLFdBQUcsY0FBSDtBQUNILEtBL0Q2QjtBQWlFOUIsbUJBakU4Qiw2QkFpRVo7QUFDZCxZQUFJLEtBQUssTUFBTCxDQUFZLEdBQVosRUFBSixFQUF1QjtBQUNuQixpQkFBSyxZQUFMLENBQWtCLElBQWxCO0FBQ0gsU0FGRCxNQUVPO0FBQ0gsaUJBQUssWUFBTCxDQUFrQixJQUFsQjtBQUNIO0FBQ0osS0F2RTZCO0FBeUU5QixlQXpFOEIseUJBeUVoQjtBQUNWLGFBQUssTUFBTCxDQUFZLEdBQVosQ0FBZ0IsRUFBaEIsRUFBb0IsS0FBcEI7QUFDQSxhQUFLLFlBQUwsQ0FBa0IsSUFBbEI7QUFDSCxLQTVFNkI7OztBQThFOUIsY0FBVSxJQUFJLEdBQUosQ0FBUSxDQUNkLENBQUMsc0JBQVMsS0FBVixFQUFpQixVQUFDLElBQUQ7QUFBQSxlQUFVLEtBQUssVUFBTCxFQUFWO0FBQUEsS0FBakIsQ0FEYyxDQUFSLENBOUVvQjs7QUFrRjlCLGdCQWxGOEIsd0JBa0ZqQixFQWxGaUIsRUFrRmI7QUFDYixZQUFJLEdBQUcsS0FBSCxLQUFhLHNCQUFTLEtBQXRCLElBQStCLEdBQUcsS0FBSCxLQUFhLHNCQUFTLEtBQXJELElBQThELEdBQUcsSUFBSCxLQUFZLE9BQTlFLEVBQXVGO0FBQ25GLGlCQUFLLEdBQUwsQ0FBUyxXQUFULENBQXFCLFFBQXJCO0FBQ0EsaUJBQUssTUFBTCxDQUFZLEtBQVosR0FBb0Isa0JBQXBCO0FBQ0g7O0FBRUQsYUFBSyxlQUFMOztBQUVBLFlBQUksT0FBSixFQUFhLFFBQVEsV0FBUjtBQUNoQjtBQTNGNkIsQ0FBaEIsQ0FBbEI7O3FCQStGZSxTOzs7Ozs7Ozs7QUNwR2Y7Ozs7QUFDQTs7Ozs7Ozs7QUFFQSxJQUFNLHdCQUF3Qix3QkFBVSxNQUFWLENBQWlCO0FBRTNDLFVBRjJDLG9CQUVsQztBQUNMLGVBQU8sRUFBRSxNQUFGLENBQVMsRUFBVCxFQUFhLEVBQUUsTUFBRixDQUFTLHdCQUFVLFNBQW5CLEVBQThCLFFBQTlCLENBQWIsRUFBc0Q7QUFDekQseUNBQTZCLE1BRDRCO0FBRXpELDBDQUE4QixPQUYyQjtBQUd6RCw0Q0FBZ0M7QUFIeUIsU0FBdEQsQ0FBUDtBQUtILEtBUjBDO0FBVTNDLGNBVjJDLDRCQVVjO0FBQUEsWUFBN0MsRUFBNkMsUUFBN0MsRUFBNkM7QUFBQSxZQUF6QyxjQUF5QyxRQUF6QyxjQUF5QztBQUFBLFlBQXpCLEtBQXlCLFFBQXpCLEtBQXlCO0FBQUEsWUFBbEIsZUFBa0IsUUFBbEIsZUFBa0I7O0FBQ3JELFlBQUksVUFBVSxFQUFkO0FBQ0EsWUFBSSxjQUFKLEVBQW9CO0FBQ2hCLG9CQUFRLGFBQVIsR0FBd0IsY0FBeEI7QUFDSDs7QUFFRCxnQ0FBVSxTQUFWLENBQW9CLFVBQXBCLENBQStCLElBQS9CLENBQW9DLElBQXBDLEVBQTBDLEVBQUMsTUFBRCxFQUFLLFlBQUwsRUFBWSxnQkFBWixFQUExQztBQUNBLGFBQUssZUFBTCxHQUF1QixlQUF2QjtBQUNBLGFBQUssUUFBTCxDQUFjLEtBQUssZUFBbkIsRUFBb0Msa0JBQXBDLEVBQXdELEtBQUssVUFBN0Q7QUFDSCxLQW5CMEM7QUFxQjNDLGNBckIyQyxzQkFxQmhDLElBckJnQyxFQXFCMUI7QUFDYixhQUFLLE1BQUwsQ0FBWSxHQUFaLENBQWdCLElBQWhCO0FBQ0gsS0F2QjBDO0FBeUIzQyxxQkF6QjJDLDZCQXlCekIsRUF6QnlCLEVBeUJyQjtBQUNsQixZQUFNLFVBQVUsQ0FBQyx1QkFBRCxFQUEwQixvQkFBMUIsRUFBZ0QscUJBQWhELEVBQXVFLGlCQUF2RSxDQUFoQjtBQUNBLFlBQU0sb0JBQW9CLFNBQVMsYUFBbkM7QUFDQSxZQUFNLGlCQUFpQixHQUFHLGFBQTFCO0FBQ0EsZUFBTyxRQUFRLEtBQVIsQ0FBYyxVQUFDLFNBQUQ7QUFBQSxtQkFDakIsRUFBRSxrQkFBa0IsU0FBbEIsQ0FBNEIsUUFBNUIsQ0FBcUMsU0FBckMsS0FDTSxrQkFBa0IsQ0FBQyxlQUFlLFNBQWYsQ0FBeUIsUUFBekIsQ0FBa0MsU0FBbEMsQ0FEM0IsQ0FEaUI7QUFBQSxTQUFkLEtBR0YsS0FITDtBQUlILEtBakMwQztBQW1DM0MsV0FuQzJDLG1CQW1DbkMsRUFuQ21DLEVBbUMvQjtBQUNSLFlBQUksR0FBRyxLQUFILEtBQWEsc0JBQVMsRUFBdEIsSUFBNEIsR0FBRyxLQUFILEtBQWEsc0JBQVMsSUFBdEQsRUFBNEQ7QUFDeEQsbUJBQU8sS0FBUDtBQUNIO0FBQ0QsWUFBSSxHQUFHLEtBQUgsS0FBYSxzQkFBUyxHQUExQixFQUErQjtBQUMzQixpQkFBSyxnQkFBTDtBQUNIO0FBQ0QsZUFBTyxLQUFLLENBQVo7QUFDSCxLQTNDMEM7QUE2QzNDLG9CQTdDMkMsOEJBNkN4QjtBQUNmLGFBQUssZUFBTCxDQUFxQixPQUFyQixDQUE2QixrQkFBN0I7QUFDSCxLQS9DMEM7QUFpRDNDLFFBakQyQyxnQkFpRHRDLEVBakRzQyxFQWlEbEM7QUFBQTs7QUFDTCxtQkFBVyxZQUFNO0FBQ2IsZ0JBQUksTUFBSyxpQkFBTCxDQUF1QixFQUF2QixDQUFKLEVBQWdDO0FBQzVCLHNCQUFLLGdCQUFMO0FBQ0g7QUFDSixTQUpELEVBSUcsQ0FKSDtBQUtILEtBdkQwQztBQXlEM0MsU0F6RDJDLG1CQXlEbkM7QUFDSixhQUFLLGVBQUwsQ0FBcUIsT0FBckIsQ0FBNkIsbUJBQTdCO0FBQ0gsS0EzRDBDOzs7QUE2RDNDLGNBQVUsSUFBSSxHQUFKLENBQVEsQ0FDZCxDQUFDLHNCQUFTLEVBQVYsRUFBYyxVQUFDLElBQUQ7QUFBQSxlQUFVLEtBQUssZUFBTCxDQUFxQixPQUFyQixDQUE2QiwyQkFBN0IsRUFBMEQsQ0FBQyxDQUEzRCxDQUFWO0FBQUEsS0FBZCxDQURjLEVBRWQsQ0FBQyxzQkFBUyxJQUFWLEVBQWdCLFVBQUMsSUFBRDtBQUFBLGVBQVUsS0FBSyxlQUFMLENBQXFCLE9BQXJCLENBQTZCLDJCQUE3QixFQUEwRCxDQUExRCxDQUFWO0FBQUEsS0FBaEIsQ0FGYywrQkFHVix3QkFBVSxTQUFWLENBQW9CLFFBSFYsR0FBUjs7QUE3RGlDLENBQWpCLENBQTlCOztxQkFxRWUscUI7Ozs7Ozs7OztxQkN4RUE7QUFBQSxRQUFFLFNBQUYsUUFBRSxTQUFGO0FBQUEsUUFBYSxnQkFBYixRQUFhLGdCQUFiO0FBQUEsMkRBRUgsS0FBSyw4QkFBTCxDQUZHLHlCQUlMLGdCQUpLLHNFQU9LLFNBUEwsMkZBT3NHLEtBQUssUUFBTCxDQVB0Ryx3QkFRQSxLQUFLLFFBQUwsQ0FSQSx1SEFVbUYsS0FBSyxRQUFMLENBVm5GO0FBQUEsQzs7Ozs7Ozs7O0FDQWY7O0FBQ0E7Ozs7Ozs7Ozs7OztjQUNpQixNO0lBQVQsSSxXQUFBLEk7O0lBRWEsbUI7OztBQUNqQixpQ0FBWSxVQUFaLEVBQXdCO0FBQUE7O0FBQ3BCLFlBQUksYUFBYSxPQUFPLE1BQVAsQ0FBYyxjQUEvQjtBQUNBLFlBQUksaUJBQWUsT0FBTyxNQUFQLENBQWMsa0JBQTdCLElBQ0EsMkJBQXlCLG1CQUFtQixVQUFuQixDQUF6QixHQUE0RCxFQUQ1RCxDQUFKOztBQUlBLFlBQUksc0VBQW9FLFVBQXBFLFVBQW1GLEtBQ25GLHNCQURtRixDQUFuRixTQUFKO0FBR0EsWUFBSSxtQkFBbUIsS0FBSyx3Q0FBTCxFQUErQztBQUNsRSw4QkFBa0I7QUFEZ0QsU0FBL0MsQ0FBdkI7QUFHQSxZQUFNLGdCQUFnQjtBQUNsQixxQkFBUyxDQUFDLHFCQUFELENBRFM7QUFFbEIsbUJBQU8sS0FBSyw2QkFBTCxDQUZXO0FBR2xCLHFCQUFTLHNDQUE0QjtBQUNqQyxvQ0FEaUM7QUFFakM7QUFGaUMsYUFBNUI7QUFIUyxTQUF0Qjs7QUFab0IsOElBcUJkLGFBckJjOztBQXNCcEIsY0FBSyxHQUFMLENBQVMsSUFBVCxDQUFjLFNBQWQsRUFBeUIsRUFBekIsQ0FBNEIsT0FBNUIsRUFBcUMsWUFBTTtBQUN2QyxrQkFBSyxLQUFMO0FBQ0gsU0FGRDtBQXRCb0I7QUF5QnZCOzs7RUExQjRDLFk7O3FCQUE1QixtQjs7Ozs7OztBQ0pyQjs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUVBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7O0lBRU0sVztBQUNGLCtCQU1HO0FBQUEsWUFMQyxHQUtELFFBTEMsR0FLRDtBQUFBLFlBSkMsSUFJRCxRQUpDLElBSUQ7QUFBQSxZQUhDLGNBR0QsUUFIQyxjQUdEO0FBQUEsWUFGQyxjQUVELFFBRkMsY0FFRDtBQUFBLFlBREMsaUJBQ0QsUUFEQyxpQkFDRDs7QUFBQTs7QUFDQyxhQUFLLEdBQUwsR0FBVyxHQUFYO0FBQ0EsYUFBSyxJQUFMLEdBQVksSUFBWjtBQUNBLGFBQUssY0FBTCxHQUFzQixjQUF0QjtBQUNBLGFBQUssY0FBTCxHQUFzQixjQUF0QjtBQUNBLGFBQUssaUJBQUwsR0FBeUIsaUJBQXpCOztBQUVBLGFBQUssbUJBQUw7QUFDQSxhQUFLLDRCQUFMO0FBQ0EsYUFBSyw2QkFBTDtBQUNIOzs7OzhDQUVxQjtBQUNsQixpQkFBSyxJQUFJLCtCQUFKLENBQXVCLEtBQUssR0FBNUIsRUFBaUMsS0FBSyxJQUF0QyxFQUE0QyxLQUFLLGNBQWpELENBQUw7QUFDQSxpQkFBSyxJQUFJLDBCQUFKLENBQ0QsS0FBSyxHQURKLEVBRUQsS0FBSyxjQUZKLEVBR0QsS0FBSyxpQkFISixDQUFMO0FBS0EsaUJBQUssSUFBSSx3QkFBSixDQUFnQixLQUFLLEdBQXJCLENBQUw7QUFDQSxpQkFBSyxJQUFJLHdCQUFKLENBQWdCLEtBQUssR0FBckIsQ0FBTDtBQUNBLGlCQUFLLElBQUksOEJBQUosQ0FBc0IsS0FBSyxHQUEzQixDQUFMO0FBQ0EsaUJBQUssSUFBSSxrQ0FBSixDQUEwQixLQUFLLEdBQS9CLENBQUw7O0FBRUEsZ0JBQUksS0FBSyxjQUFMLENBQW9CLFNBQXBCLENBQThCLGVBQTlCLENBQUosRUFBb0Q7QUFDaEQscUJBQUssSUFBSSxzQ0FBSixDQUE4QixLQUFLLEdBQW5DLENBQUw7QUFDSDtBQUNKOzs7dURBRThCO0FBQzNCLGlCQUFLLElBQUksMEJBQUosQ0FBa0IsS0FBSyxHQUF2QixDQUFMO0FBQ0g7Ozt3REFFK0I7QUFDNUIsa0JBQU0sT0FBTyxTQUFQLENBQWlCLGFBQWpCLEdBQWlDLElBQUksZ0NBQUosQ0FDbkMsS0FBSyxHQUQ4QixDQUF2QztBQUdBLGlCQUFLLElBQUksc0NBQUosQ0FBMEIsS0FBSyxHQUEvQixDQUFMO0FBQ0EsaUJBQUssSUFBSSxnQ0FBSixDQUF3QixLQUFLLEdBQTdCLENBQUw7QUFDQSxpQkFBSyxJQUFJLHlDQUFKLENBQWlDLEtBQUssR0FBdEMsQ0FBTDtBQUNIOzs7Ozs7QUFHTCxPQUFPLE9BQVAsR0FBaUIsV0FBakI7Ozs7Ozs7Ozs7Ozs7Y0NoRXdCLE07SUFBaEIsRyxXQUFBLEc7SUFBSyxNLFdBQUEsTTs7SUFFUSxtQjs7OzRCQUNIO0FBQ1YsbUJBQU8sRUFBRSxPQUFPLEVBQVQsRUFBYSxPQUFiLEVBQVA7QUFDSDs7OzRCQUVtQjtBQUNoQixtQkFBTztBQUNILHNCQUFNLG9CQUF3QztBQUFBLHdCQUFyQyxLQUFxQyxRQUFyQyxLQUFxQztBQUFBLHdCQUE5QixPQUE4QixRQUE5QixPQUE4QjtBQUFBLHdCQUFyQixjQUFxQixRQUFyQixjQUFxQjs7QUFDMUM7QUFDQSw0QkFBUSxHQUFSLGNBQXVCLEtBQXZCLFVBQW1DO0FBQy9CLG9DQUQrQjtBQUUvQix3Q0FGK0I7QUFHL0I7QUFIK0IscUJBQW5DO0FBS0g7QUFSRSxhQUFQO0FBVUg7OztBQUVELGlDQUFZLEdBQVosRUFBaUI7QUFBQTs7QUFBQTs7QUFDYixhQUFLLEdBQUwsR0FBVyxHQUFYOztBQUVBLGFBQUssVUFBTCxHQUFrQixPQUFPLFNBQVAsSUFBb0IsS0FBSyxhQUEzQztBQUNBLGFBQUssVUFBTCxHQUFrQixPQUFPLFNBQVAsQ0FBaUIsTUFBbkM7O0FBRUEsYUFBSyxHQUFMLENBQ0ssRUFETCxDQUNRLHNCQURSLEVBQ2dDLFVBQUMsTUFBRDtBQUFBLG1CQUN4QixNQUFLLFNBQUwsQ0FBZSxNQUFmLEVBQXVCLGFBQXZCLENBRHdCO0FBQUEsU0FEaEMsRUFJSyxFQUpMLENBSVEsb0JBSlIsRUFJOEIsVUFBQyxNQUFEO0FBQUEsbUJBQ3RCLE1BQUssU0FBTCxDQUFlLE1BQWYsRUFBdUIsV0FBdkIsQ0FEc0I7QUFBQSxTQUo5QixFQU9LLEVBUEwsQ0FPUSwyQkFQUixFQU9xQyxVQUFDLE1BQUQ7QUFBQSxtQkFDN0IsTUFBSyxTQUFMLENBQWUsTUFBZixFQUF1QixpQkFBdkIsQ0FENkI7QUFBQSxTQVByQyxFQVVLLEVBVkwsQ0FVUSwyQkFWUixFQVVxQyxVQUFDLE1BQUQ7QUFBQSxtQkFDN0IsTUFBSyxTQUFMLENBQWUsTUFBZixFQUF1Qix3QkFBdkIsQ0FENkI7QUFBQSxTQVZyQyxFQWFLLEVBYkwsQ0FhUSx3QkFiUixFQWFrQyxVQUFDLE1BQUQ7QUFBQSxtQkFDMUIsTUFBSyxTQUFMLENBQWUsTUFBZixFQUF1QixlQUF2QixDQUQwQjtBQUFBLFNBYmxDLEVBZ0JLLEVBaEJMLENBZ0JRLDJCQWhCUixFQWdCcUMsVUFBQyxNQUFEO0FBQUEsbUJBQzdCLE1BQUssU0FBTCxDQUFlLE1BQWYsRUFBdUIsY0FBdkIsQ0FENkI7QUFBQSxTQWhCckMsRUFtQkssRUFuQkwsQ0FtQlEsZ0JBbkJSLEVBbUIwQixVQUFDLE1BQUQ7QUFBQSxtQkFDbEIsTUFBSyxTQUFMLENBQWUsTUFBZixFQUF1QixlQUF2QixDQURrQjtBQUFBLFNBbkIxQixFQXNCSyxFQXRCTCxDQXNCUSxlQXRCUixFQXNCeUIsVUFBQyxNQUFEO0FBQUEsbUJBQ2pCLE1BQUssU0FBTCxDQUFlLE1BQWYsRUFBdUIsY0FBdkIsQ0FEaUI7QUFBQSxTQXRCekIsRUF5QkssRUF6QkwsQ0F5QlEseUJBekJSLEVBeUJtQyxVQUFDLE1BQUQ7QUFBQSxtQkFDM0IsTUFBSyxTQUFMLENBQWUsTUFBZixFQUF1Qix1QkFBdkIsQ0FEMkI7QUFBQSxTQXpCbkMsRUE0QkssRUE1QkwsQ0E0QlEsdUJBNUJSLEVBNEJpQyxVQUFDLE1BQUQ7QUFBQSxtQkFDekIsTUFBSyxTQUFMLENBQWUsTUFBZixFQUF1QixxQkFBdkIsQ0FEeUI7QUFBQSxTQTVCakM7QUErQkg7Ozs7eUNBRWtDLEssRUFBTztBQUFBLGdCQUE5QixVQUE4QixTQUE5QixVQUE4QjtBQUFBLGdCQUFsQixPQUFrQixTQUFsQixPQUFrQjs7QUFDdEMsZ0JBQUksVUFBVSxFQUFFLE1BQUYsQ0FDVixFQURVLEVBRVYsS0FBSyxhQUFMLENBQW1CLFVBQW5CLENBRlUsRUFHVixLQUFLLGtCQUFMLENBQ0ksVUFBVSxRQUFRLG9CQUFsQixHQUF5QyxFQUQ3QyxDQUhVLEVBTVYsS0FBSyxnQkFBTCxDQUNJLFdBQVcsT0FBWCxHQUFxQixXQUFXLE9BQVgsQ0FBbUIsUUFBeEMsR0FBbUQsRUFEdkQsQ0FOVSxFQVNWLFdBQVcsUUFBUSxRQUFuQixHQUE4QixFQUFFLFVBQVUsUUFBUSxRQUFwQixFQUE5QixHQUErRCxFQVRyRCxFQVVWLE9BQU8sY0FBUCxDQUFzQixTQUF0QixDQUFnQyxnQkFBaEMsSUFDTSxLQUFLLG9CQUFMLENBQTBCLE9BQTFCLEVBQW1DLFVBQW5DLEVBQStDLEtBQS9DLENBRE4sR0FFTSxFQVpJLENBQWQ7O0FBZUE7QUFDQTtBQUNBLGdCQUFJLFVBQVUsYUFBVixJQUEyQixRQUFRLFNBQXZDLEVBQWtEO0FBQzlDLHdCQUFRLFlBQVI7QUFDSCxhQUZELE1BRU8sSUFBSSxVQUFVLFdBQVYsSUFBeUIsUUFBUSxjQUFyQyxFQUFxRDtBQUN4RCx3QkFBUSxtQkFBUjtBQUNIOztBQUVELGdCQUFJLHVCQUFKO0FBQ0Esc0JBQ08saUJBQWlCLFFBQVEsY0FEaEMsR0FFTyxpQkFBaUIsS0FGeEI7O0FBSUEsaUJBQUssVUFBTCxDQUFnQixJQUFoQixDQUFxQixFQUFFLFlBQUYsRUFBUyxnQkFBVCxFQUFrQiw4QkFBbEIsRUFBckI7QUFDSDs7O3NDQUVhLFUsRUFBWTtBQUN0QixnQkFBSSxJQUFJLFdBQVcsVUFBbkI7O0FBRUEsbUJBQU87QUFDSCx5QkFBUyxFQUFFLEVBRFI7QUFFSCwyQkFBVyxFQUFFLEtBRlY7QUFHSCx3QkFBUSxFQUFFLGdCQUhQO0FBSUgsNkJBQWMsRUFBRSxJQUFGLElBQVUsRUFBRSxJQUFGLENBQU8sRUFBbEIsSUFBeUI7QUFKbkMsYUFBUDtBQU1IOzs7b0NBRVcsTyxFQUFTO0FBQ2pCLGdCQUFJLFdBQVcsUUFBUSxRQUF2QixFQUFpQztBQUM3Qix1QkFBTyxFQUFFLFVBQVUsUUFBUSxRQUFwQixFQUFQO0FBQ0g7QUFDRCxtQkFBTyxFQUFQO0FBQ0g7OzsyQ0FFa0Isb0IsRUFBc0I7QUFDckMsZ0JBQUksRUFBRSxvQkFBRixFQUF3QixPQUF4QixFQUFKLEVBQXVDO0FBQ25DLHVCQUFPLEVBQVA7QUFDSDs7QUFFRCxnQkFBSSxJQUFJLG9CQUFSO0FBQ0EsbUJBQU87QUFDSCx3QkFBUSxFQUFFLFVBQUYsQ0FBYSxFQURsQjtBQUVILDBCQUFVLEVBQUUsVUFBRixDQUFhLElBRnBCO0FBR0gseUJBQVMsSUFBSSxPQUFPLGNBQVgsRUFBMkI7QUFDaEMsa0NBQWMsRUFBRSxVQUFGLENBQWE7QUFESyxpQkFBM0IsQ0FITjtBQU1IO0FBQ0E7QUFDQSwwQkFBVSxFQUFFLFNBQUYsR0FBYyxTQUFkLEdBQTBCLFdBUmpDO0FBU0gsNEJBQVksRUFBRSxVQUFGLENBQWE7QUFUdEIsYUFBUDtBQVdIOzs7eUNBRWdCLFEsRUFBVTtBQUN2QixnQkFBSSxFQUFFLFFBQUYsRUFBWSxPQUFaLEVBQUosRUFBMkI7QUFDdkIsdUJBQU8sRUFBUDtBQUNIOztBQUVELG1CQUFPO0FBQ0gsNEJBQVksU0FBUyxFQURsQjtBQUVILDhCQUFjLFNBQVM7QUFGcEIsYUFBUDtBQUlIOzs7NkNBRW9CLE8sRUFBUyxVLEVBQVksSyxFQUFPO0FBQzdDLGdCQUNJLFVBQVUsY0FBVixJQUNBLENBQUMsRUFBRSxPQUFGLEVBQVcsT0FBWCxFQURELElBRUEsUUFBUSxTQUhaLEVBSUU7QUFDRSx1QkFBTztBQUNILGlDQUFhLFFBQVEsU0FEbEI7QUFFSCxtQ0FBZSxRQUFRLFlBRnBCO0FBR0gsaUNBQWEsUUFBUSxXQUhsQjtBQUlILDJDQUF1QixXQUFXLEdBQVgsQ0FDbkIsNEJBRG1CLENBSnBCO0FBT0gsOENBQTBCLFdBQVcsR0FBWCxDQUN0Qiw0QkFEc0I7QUFQdkIsaUJBQVA7QUFXSCxhQWhCRCxNQWdCTyxJQUFJLFVBQVUsdUJBQWQsRUFBdUM7QUFDMUMsdUJBQU87QUFDSCwyQ0FBdUIsV0FBVyxHQUFYLENBQ25CLDRCQURtQixDQURwQjtBQUlILDhDQUEwQixXQUFXLEdBQVgsQ0FDdEIsNEJBRHNCO0FBSnZCLGlCQUFQO0FBUUgsYUFUTSxNQVNBO0FBQ0gsdUJBQU8sRUFBUDtBQUNIO0FBQ0o7Ozs7OztxQkF0S2dCLG1COzs7Ozs7Ozs7Ozs7O0lDREEseUI7Ozs0QkFDSDtBQUNWLG1CQUFPLEVBQUUsT0FBTyxFQUFULEVBQWEsT0FBYixFQUFQO0FBQ0g7Ozs0QkFFbUI7QUFDaEIsbUJBQU87QUFDSCxzQkFBTSxvQkFBd0I7QUFBQSx3QkFBckIsS0FBcUIsUUFBckIsS0FBcUI7QUFBQSx3QkFBZCxPQUFjLFFBQWQsT0FBYzs7QUFDMUIsNEJBQVEsR0FBUixjQUF1QixLQUF2QixVQUFtQyxPQUFuQyxFQUQwQixDQUNtQjtBQUNoRDtBQUhFLGFBQVA7QUFLSDs7O0FBRUQsdUNBQVksR0FBWixFQUFpQjtBQUFBOztBQUFBOztBQUNiLGFBQUssR0FBTCxHQUFXLEdBQVg7O0FBRUEsYUFBSyxVQUFMLEdBQWtCLE9BQU8sU0FBUCxJQUFvQixLQUFLLGFBQTNDOztBQUVBLGFBQUssR0FBTCxDQUNLLEVBREwsQ0FDUSxtQ0FEUixFQUM0QztBQUFBLGdCQUFFLE9BQUYsU0FBRSxPQUFGO0FBQUEsZ0JBQVcsTUFBWCxTQUFXLE1BQVg7QUFBQSxtQkFBdUIsTUFBSyxTQUFMLENBQWUsRUFBQyxnQkFBRCxFQUFVLGNBQVYsRUFBZixDQUF2QjtBQUFBLFNBRDVDO0FBRUg7Ozs7eUNBRTRCO0FBQUEsZ0JBQWxCLE9BQWtCLFNBQWxCLE9BQWtCO0FBQUEsZ0JBQVQsTUFBUyxTQUFULE1BQVM7O0FBQ3pCLGdCQUFJLEVBQUUsT0FBTyxJQUFQLENBQVksUUFBUSxPQUFwQixDQUFGLEVBQWdDLFFBQWhDLENBQXlDLG1CQUF6QyxDQUFKLEVBQW1FO0FBQy9ELHFCQUFLLFVBQUwsQ0FBZ0IsSUFBaEIsQ0FBcUI7QUFDakIsMkJBQU8sbUJBRFU7QUFFakIsNkJBQVM7QUFDTCxzQ0FESyxFQUNHO0FBQ1IsK0JBQU8sUUFBUSxPQUFSLENBQWdCO0FBRmxCO0FBRlEsaUJBQXJCO0FBT0g7QUFDSjs7Ozs7O3FCQWhDZ0IseUI7Ozs7Ozs7Ozs7Ozs7SUNBQSw0Qjs7OzRCQUNIO0FBQ1YsbUJBQU8sRUFBRSxPQUFPLEVBQVQsRUFBYSxPQUFiLEVBQVA7QUFDSDs7OzRCQUVtQjtBQUNoQixtQkFBTztBQUNILHNCQUFNLG9CQUF3QjtBQUFBLHdCQUFyQixLQUFxQixRQUFyQixLQUFxQjtBQUFBLHdCQUFkLE9BQWMsUUFBZCxPQUFjOztBQUMxQiw0QkFBUSxHQUFSLGNBQXVCLEtBQXZCLFVBQW1DLE9BQW5DLEVBRDBCLENBQ21CO0FBQ2hEO0FBSEUsYUFBUDtBQUtIOzs7QUFFRCwwQ0FBWSxHQUFaLEVBQWlCO0FBQUE7O0FBQUE7O0FBQ2IsYUFBSyxHQUFMLEdBQVcsR0FBWDs7QUFFQSxhQUFLLFVBQUwsR0FBa0IsT0FBTyxTQUFQLElBQW9CLEtBQUssYUFBM0M7O0FBRUEsYUFBSyxHQUFMLENBQ0ssRUFETCxDQUNRLHVCQURSLEVBQzRDLFVBQUMsTUFBRDtBQUFBLG1CQUFZLE1BQUssU0FBTCxDQUFlLE1BQWYsRUFBdUIscUJBQXZCLENBQVo7QUFBQSxTQUQ1QyxFQUVLLEVBRkwsQ0FFUSx3QkFGUixFQUU2QyxVQUFDLE1BQUQ7QUFBQSxtQkFBWSxNQUFLLFNBQUwsQ0FBZSxNQUFmLEVBQXVCLHNCQUF2QixDQUFaO0FBQUEsU0FGN0MsRUFHSyxFQUhMLENBR1EseUJBSFIsRUFHOEMsVUFBQyxNQUFEO0FBQUEsbUJBQVksTUFBSyxTQUFMLENBQWUsTUFBZixFQUF1Qix1QkFBdkIsQ0FBWjtBQUFBLFNBSDlDLEVBSUssRUFKTCxDQUlRLHdCQUpSLEVBSTZDLFVBQUMsTUFBRDtBQUFBLG1CQUFZLE1BQUssU0FBTCxDQUFlLE1BQWYsRUFBdUIsc0JBQXZCLENBQVo7QUFBQSxTQUo3QyxFQUtLLEVBTEwsQ0FLUSx5QkFMUixFQUs4QyxVQUFDLE1BQUQ7QUFBQSxtQkFBWSxNQUFLLFNBQUwsQ0FBZSxNQUFmLEVBQXVCLHVCQUF2QixDQUFaO0FBQUEsU0FMOUMsRUFNSyxFQU5MLENBTVEsdUJBTlIsRUFNNEMsVUFBQyxNQUFEO0FBQUEsbUJBQVksTUFBSyxTQUFMLENBQWUsTUFBZixFQUF1QixxQkFBdkIsQ0FBWjtBQUFBLFNBTjVDO0FBT0g7Ozs7a0NBRVMsTyxFQUFTLFMsRUFBVztBQUN0QixpQkFBSyxVQUFMLENBQWdCLElBQWhCLENBQXFCO0FBQ2pCLHVCQUFPLFNBRFU7QUFFakIseUJBQVM7QUFGUSxhQUFyQjtBQUlQOzs7Ozs7cUJBaENnQiw0Qjs7Ozs7Ozs7Ozs7OztJQ0RBLG1CO0FBQ2pCLGlDQUFZLEdBQVosRUFBaUI7QUFBQTs7QUFBQTs7QUFDYixhQUFLLEdBQUwsR0FBVyxHQUFYOztBQUVBLGFBQUssVUFBTCxHQUFrQixPQUFPLFNBQVAsSUFBb0IsS0FBSyxhQUEzQzs7QUFFQSxhQUFLLEdBQUwsQ0FDSyxFQURMLENBQ1EsZ0JBRFIsRUFDMEIsVUFBQyxNQUFEO0FBQUEsbUJBQ2xCLE1BQUssZUFBTCxDQUFxQixNQUFyQixFQUE2QixzQkFBN0IsQ0FEa0I7QUFBQSxTQUQxQixFQUlLLEVBSkwsQ0FJUSxpQkFKUixFQUkyQixVQUFDLE1BQUQ7QUFBQSxtQkFDbkIsTUFBSyxlQUFMLENBQXFCLE1BQXJCLEVBQTZCLGtCQUE3QixDQURtQjtBQUFBLFNBSjNCLEVBT0ssRUFQTCxDQU9RLGNBUFIsRUFPd0IsVUFBQyxNQUFEO0FBQUEsbUJBQ2hCLE1BQUssZUFBTCxDQUFxQixNQUFyQixFQUE2QixlQUE3QixDQURnQjtBQUFBLFNBUHhCLEVBVUssRUFWTCxDQVVRLGtCQVZSLEVBVTRCLFVBQUMsTUFBRDtBQUFBLG1CQUNwQixNQUFLLGVBQUwsQ0FBcUIsTUFBckIsRUFBNkIsdUJBQTdCLENBRG9CO0FBQUEsU0FWNUIsRUFhSyxFQWJMLENBYVEsWUFiUixFQWFzQixVQUFDLE1BQUQ7QUFBQSxtQkFDZCxNQUFLLGVBQUwsQ0FBcUIsTUFBckIsRUFBNkIsYUFBN0IsQ0FEYztBQUFBLFNBYnRCLEVBZ0JLLEVBaEJMLENBZ0JRLHNCQWhCUixFQWdCZ0MsVUFBQyxNQUFEO0FBQUEsbUJBQ3hCLE1BQUssZUFBTCxDQUFxQixNQUFyQixFQUE2Qiw2QkFBN0IsQ0FEd0I7QUFBQSxTQWhCaEMsRUFtQkssRUFuQkwsQ0FtQlEsa0JBbkJSLEVBbUI0QixVQUFDLE1BQUQ7QUFBQSxtQkFDcEIsTUFBSyxlQUFMLENBQXFCLE1BQXJCLEVBQTZCLCtCQUE3QixDQURvQjtBQUFBLFNBbkI1QixFQXNCSyxFQXRCTCxDQXNCUSxvQkF0QlIsRUFzQjhCLFVBQUMsTUFBRDtBQUFBLG1CQUN0QixNQUFLLGVBQUwsQ0FBcUIsTUFBckIsRUFBNkIsaUNBQTdCLENBRHNCO0FBQUEsU0F0QjlCLEVBeUJLLEVBekJMLENBeUJRLGlCQXpCUixFQXlCMkIsVUFBQyxNQUFEO0FBQUEsbUJBQ25CLE1BQUssZUFBTCxDQUFxQixNQUFyQixFQUE2Qiw4QkFBN0IsQ0FEbUI7QUFBQSxTQXpCM0IsRUE0QkssRUE1QkwsQ0E0QlEsbUJBNUJSLEVBNEI2QixVQUFDLE1BQUQ7QUFBQSxtQkFDckIsTUFBSyxlQUFMLENBQXFCLE1BQXJCLEVBQTZCLGdDQUE3QixDQURxQjtBQUFBLFNBNUI3QixFQStCSyxFQS9CTCxDQStCUSxxQkEvQlIsRUErQitCLFVBQUMsTUFBRDtBQUFBLG1CQUN2QixNQUFLLGVBQUwsQ0FBcUIsTUFBckIsRUFBNkIscUJBQTdCLENBRHVCO0FBQUEsU0EvQi9CLEVBbUNLLEVBbkNMLENBbUNRLDJCQW5DUixFQW1DcUM7QUFBQSxtQkFDN0IsTUFBSyxpQkFBTCxDQUF1QiwrQkFBdkIsQ0FENkI7QUFBQSxTQW5DckMsRUFzQ0ssRUF0Q0wsQ0FzQ1EsNkJBdENSLEVBc0N1QztBQUFBLG1CQUMvQixNQUFLLGlCQUFMLENBQXVCLGlDQUF2QixDQUQrQjtBQUFBLFNBdEN2QyxFQXlDSyxFQXpDTCxDQXlDUSwrQkF6Q1IsRUF5Q3lDO0FBQUEsbUJBQ2pDLE1BQUssaUJBQUwsQ0FBdUIsNkJBQXZCLENBRGlDO0FBQUEsU0F6Q3pDLEVBNENLLEVBNUNMLENBNENRLHdCQTVDUixFQTRDa0M7QUFBQSxtQkFDMUIsTUFBSyxpQkFBTCxDQUF1QixhQUF2QixDQUQwQjtBQUFBLFNBNUNsQyxFQWdESyxFQWhETCxDQWdEUSxtQkFoRFIsRUFnRDZCO0FBQUEsbUJBQ3JCLE1BQUssaUJBQUwsQ0FBdUIscUJBQXZCLENBRHFCO0FBQUEsU0FoRDdCLEVBbURLLEVBbkRMLENBbURRLDJCQW5EUixFQW1EcUM7QUFBQSxtQkFDN0IsTUFBSyxpQkFBTCxDQUF1QixvQkFBdkIsQ0FENkI7QUFBQSxTQW5EckMsRUFzREssRUF0REwsQ0FzRFEsNkJBdERSLEVBc0R1QztBQUFBLG1CQUMvQixNQUFLLGlCQUFMLENBQXVCLGtCQUF2QixDQUQrQjtBQUFBLFNBdER2QyxFQXlESyxFQXpETCxDQXlEUSwwQkF6RFIsRUF5RG9DO0FBQUEsbUJBQzVCLE1BQUssaUJBQUwsQ0FBdUIsa0JBQXZCLENBRDRCO0FBQUEsU0F6RHBDO0FBNERIOzs7O3dDQVVlLFcsRUFBYSxNLEVBQVE7QUFDakMsZ0JBQUksVUFBVTtBQUNWLHVCQUFPLE1BREc7QUFFViwrQkFBZSxnQkFGTDtBQUdWLDZCQUFhLE1BSEg7QUFJViw0QkFBWTtBQUpGLGFBQWQ7O0FBT0EsaUJBQUssVUFBTCxDQUFnQixJQUFoQixDQUFxQixPQUFyQjtBQUNIOzs7MENBRWlCLE0sRUFBUTtBQUN0QixnQkFBSSxVQUFVO0FBQ1YsdUJBQU8sVUFERztBQUVWLCtCQUFlLFNBRkw7QUFHViw2QkFBYSxZQUhIO0FBSVYsNEJBQVk7QUFKRixhQUFkOztBQU9BLGlCQUFLLFVBQUwsQ0FBZ0IsSUFBaEIsQ0FBcUIsT0FBckI7QUFDSDs7OzRCQTVCbUI7QUFDaEIsbUJBQU87QUFDSCxzQkFBTSxvQkFBd0I7QUFBQSx3QkFBckIsS0FBcUIsUUFBckIsS0FBcUI7QUFBQSx3QkFBZCxPQUFjLFFBQWQsT0FBYzs7QUFDMUIsNEJBQVEsR0FBUixjQUF1QixLQUF2QixVQUFtQyxFQUFFLFlBQUYsRUFBUyxnQkFBVCxFQUFuQyxFQUQwQixDQUM4QjtBQUMzRDtBQUhFLGFBQVA7QUFLSDs7Ozs7O3FCQTFFZ0IsbUI7Ozs7Ozs7OztBQ0FyQjs7cUJBRWU7QUFBQSwrQ0FFSyw4QkFBWSxxQkFBWixDQUZMLDBCQUdELEtBQUsscUJBQUwsQ0FIQyw2Q0FJaUIsS0FBSyx3QkFBTCxDQUpqQixnSUFLcUcsS0FDeEcsc0JBRHdHLENBTHJHLDJFQVE0QyxLQUMvQyw4QkFEK0MsQ0FSNUM7QUFBQSxDOzs7Ozs7Ozs7Ozs7O0FDRmY7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7Ozs7O0lBRXFCLGU7OztBQUNqQiwrQkFBYztBQUFBOztBQUNWLFlBQUksVUFBVSxtQ0FBZDtBQUNBLFlBQUksZ0JBQWdCO0FBQ2hCLHFCQUFTLENBQUMsT0FBRCxFQUFVLGlCQUFWLENBRE87QUFFaEIsbUJBQU8sT0FBTyxJQUFQLENBQVksa0JBQVosQ0FGUztBQUdoQix5QkFBYSxJQUhHO0FBSWhCO0FBSmdCLFNBQXBCOztBQUZVLGlJQVNKLGFBVEk7QUFVYjs7OztnQ0FFTztBQUNKLGlCQUFLLFNBQUw7QUFDQTtBQUNIOzs7b0NBRVc7QUFDUixvQkFBUSxNQUFSLENBQWUsbUJBQWYsRUFBb0MsRUFBQyxNQUFNLEdBQVAsRUFBcEM7QUFDQSxvQkFBUSxHQUFSLENBQVksbUJBQVosRUFBaUMsV0FBakMsRUFBOEMsRUFBQyxNQUFNLEdBQVAsRUFBWSxTQUFTLEVBQXJCLEVBQTlDO0FBQ0g7Ozs7RUFyQndDLFk7O3FCQUF4QixlOzs7Ozs7Ozs7QUNKckIsSUFBQSxLQUFBLEdBQUEsT0FBQSxDQUFBLHFCQUFBLENBQUEsQ0FBQTs7OztBQUNBLElBQUEsUUFBQSxHQUFBLE9BQUEsQ0FBQSxnQkFBQSxDQUFBLENBQUE7Ozs7OztBQUNBO0FBQ0EsSUFBTSxJQUFBLEdBQU8sT0FBQSxDQUFRLE1BQVIsQ0FBYixDQUFBO0FBQ0EsSUFBTSxRQUFBLEdBQVcsMnFCQUFqQixDQUFBOztBQUtBLElBQU0sb0JBQUEsR0FDRiw4TUFESixDQUFBO0FBRUEsSUFBTSxzQkFBQSxHQUNGLCtOQURKLENBQUE7O0FBR0EsSUFBTSxPQUFBLEdBQVUsTUFBQSxDQUFBLFNBQUEsQ0FBQSxDQUFTLE1BQVQsQ0FBZ0I7SUFDNUIsU0FBQSxFQUFXLDJCQURpQjs7SUFHNUIsT0FBQSxFQUFTLElBSG1COztJQUs1QixJQUFBLEVBQU0sSUFMc0I7O0lBTzVCLElBQUEsRUFBTSxFQVBzQjs7SUFTNUIsU0FBQSxFQUFXLEVBVGlCOztJQVc1QixZQUFBLEVBQWMsRUFYYzs7SUFhNUIsS0FBQSxFQUFPO1FBQ0gsS0FBQSxFQUFPLGdCQURKO1FBRUgsT0FBQSxFQUFTLGtCQUZOO1FBR0gsS0FBQSxFQUFPLFdBSEo7UUFJSCxLQUFBLEVBQU8sZ0JBQUE7S0FqQmlCOztJQW9CNUIsWUFBQSxFQUFjO1FBQ1YsT0FBQSxFQUFTLEVBREM7UUFFVixNQUFBLEVBQVEsV0FGRTtRQUdWLEtBQUEsRUFBTyxVQUhHO1FBSVYsVUFBQSxFQUFZLGVBQUE7S0F4Qlk7O0lBMkI1QixRQUFBLEVBQVUsQ0FBQSxDQUFFLFFBQUYsQ0FBVyxRQUFYLENBM0JrQjs7SUE2QjVCLE1BN0I0QixFQUFBLFNBQUEsTUFBQSxHQTZCbkI7UUFDTCxPQUFBLGVBQUEsQ0FBQSxFQUFBLEVBQUEsUUFBQSxHQUNjLElBQUEsQ0FBSyxLQUFMLENBQVcsS0FEekIsRUFDbUMsWUFEbkMsQ0FBQSxDQUFBO0tBOUJ3QjtJQW1DNUIsVUFuQzRCLEVBQUEsU0FBQSxVQUFBLENBQUEsS0FBQSxFQW1DTDtRQUFBLElBQVYsTUFBVSxHQUFBLEtBQUEsQ0FBVixNQUFVLENBQUE7O1FBQ25CLElBQUEsQ0FBSyxNQUFMLEdBQWMsTUFBZCxDQUFBO0tBcEN3QjtJQXVDNUIsVUF2QzRCLEVBQUEsU0FBQSxVQUFBLEdBdUNmO1FBQ1QsSUFBTSxRQUFBLEdBQVcsSUFBQSxDQUFLLENBQUwsQ0FBTyxJQUFBLENBQUssS0FBTCxDQUFXLE9BQWxCLENBQWpCLENBQUE7UUFDQSxJQUFNLE9BQUEsR0FBVSxRQUFBLENBQVMsSUFBVCxDQUFjLElBQWQsQ0FBaEIsQ0FBQTs7UUFFQSxJQUFNLElBQUEsR0FBTztZQUNULHFCQUFBLEVBQXVCLEVBQUUsSUFBQSxFQUFNLHFCQUFSLEVBQStCLEtBQUEsRUFBTyxHQUF0QyxFQUFBO1NBRDNCLENBQUE7UUFHQSxJQUFNLEtBQUEsR0FBUSxJQUFBLENBQUssT0FBTCxDQUFkLENBQUE7UUFDQSxJQUFJLEtBQUosRUFBVztZQUNQLE9BQUEsQ0FBUSxNQUFSLENBQWUsS0FBQSxDQUFNLElBQXJCLEVBQTJCLEVBQUUsSUFBQSxFQUFNLEdBQVIsRUFBM0IsQ0FBQSxDQUFBO1lBQ0EsT0FBQSxDQUFRLEdBQVIsQ0FBWSxLQUFBLENBQU0sSUFBbEIsRUFBd0IsS0FBQSxDQUFNLEtBQTlCLEVBQXFDLEVBQUUsSUFBQSxFQUFNLEdBQVIsRUFBYSxPQUFBLEVBQVMsR0FBdEIsRUFBckMsQ0FBQSxDQUFBO1NBQ0g7O1FBRUQsSUFBSSxPQUFBLEtBQVksY0FBaEIsRUFBZ0M7WUFDNUIsSUFBTSxTQUFBLEdBQVksUUFBQSxDQUFTLFFBQUEsQ0FBUyxJQUFULENBQWMsaUJBQWQsQ0FBVCxFQUEyQyxFQUEzQyxDQUFsQixDQUFBO1lBQ0EsSUFBTSxNQUFBLEdBQVMsT0FBQSxDQUFRLEdBQVIsQ0FBWSxrQkFBWixDQUFmLENBQUE7WUFDQSxJQUFJLFNBQUEsR0FBWSxFQUFoQixDQUFBOztZQUVBLElBQUksTUFBSixFQUFZO2dCQUNSLElBQU0sVUFBQSxHQUFhLElBQUEsQ0FBSyxLQUFMLENBQVcsTUFBWCxDQUFuQixDQUFBOzs7Z0JBR0EsSUFBSSxVQUFBLENBQVcsTUFBWCxJQUFxQixVQUFBLENBQVcsTUFBcEMsRUFBNEM7b0JBQ3hDLFNBQUEsR0FBWTt3QkFDUixNQUFBLEVBQVEsVUFBQSxDQUFXLE1BRFg7d0JBRVIsTUFBQSxFQUFRLFVBQUEsQ0FBVyxNQUFBO3FCQUZ2QixDQUFBOztvQkFLQSxJQUFJLFFBQUEsQ0FBUyxVQUFBLENBQVcsTUFBcEIsRUFBNEIsRUFBNUIsQ0FBQSxHQUFrQyxTQUF0QyxFQUFpRDt3QkFDN0MsU0FBQSxDQUFVLE1BQVYsR0FBbUIsU0FBbkIsQ0FBQTtxQkFDSDs7b0JBRUQsSUFBSSxRQUFBLENBQVMsVUFBQSxDQUFXLE1BQXBCLEVBQTRCLEVBQTVCLENBQUEsR0FBa0MsU0FBdEMsRUFBaUQ7d0JBQzdDLFNBQUEsQ0FBVSxNQUFWLEdBQW1CLFNBQW5CLENBQUE7cUJBQ0g7aUJBWkwsTUFhTzs7O29CQUdILFNBQUEsR0FBWTt3QkFDUixNQUFBLEVBQVEsU0FEQTt3QkFFUixNQUFBLEVBQVEsU0FBQTtxQkFGWixDQUFBO2lCQUlIO2FBeEJMLE1BeUJPOztnQkFFSCxTQUFBLEdBQVk7b0JBQ1IsTUFBQSxFQUFRLFNBREE7b0JBRVIsTUFBQSxFQUFRLFNBQUE7aUJBRlosQ0FBQTthQUlIOztZQUVELE9BQUEsQ0FBUSxNQUFSLENBQWUsa0JBQWYsRUFBbUMsRUFBRSxJQUFBLEVBQU0sR0FBUixFQUFuQyxDQUFBLENBQUE7WUFDQSxPQUFBLENBQVEsR0FBUixDQUFZLGtCQUFaLEVBQWdDLFNBQWhDLEVBQTJDO2dCQUN2QyxJQUFBLEVBQU0sR0FEaUM7Z0JBRXZDLE9BQUEsRUFBUyxHQUFBO2FBRmIsQ0FBQSxDQUFBO1NBSUg7O1FBRUQsSUFBSSxPQUFBLElBQVcsYUFBZixFQUE4QjtZQUMxQixPQUFBLENBQVEsTUFBUixDQUFlLGFBQWYsRUFBOEIsRUFBRSxJQUFBLEVBQU0sR0FBUixFQUE5QixDQUFBLENBQUE7WUFDQSxPQUFBLENBQVEsR0FBUixDQUFZLGFBQVosRUFBMkIsV0FBM0IsRUFBd0MsRUFBRSxJQUFBLEVBQU0sR0FBUixFQUFhLE9BQUEsRUFBUyxFQUF0QixFQUF4QyxDQUFBLENBQUE7U0FDSDs7UUFFRCxJQUFBLENBQUssR0FBTCxFQUFBLENBQUE7O1FBRUEsSUFBSSxJQUFBLENBQUssU0FBTCxDQUFlLE1BQWYsR0FBd0IsQ0FBNUIsRUFBK0I7WUFDM0IsSUFBQSxDQUFLLElBQUwsQ0FBVSxJQUFWLENBQWUsSUFBQSxDQUFLLFNBQUwsQ0FBZSxHQUFmLEVBQWYsQ0FBQSxDQUFBO1NBQ0g7UUFDRCxJQUFBLENBQUssWUFBTCxHQUFvQixFQUFwQixDQUFBO1FBQ0EsSUFBQSxDQUFLLGFBQUwsRUFBQSxDQUFBO0tBNUd3Qjs7Ozs7O0lBa0g1QixnQkFsSDRCLEVBQUEsU0FBQSxnQkFBQSxHQWtIVDtRQUNmLElBQUEsQ0FBSyxXQUFMLEVBQUEsQ0FBQTtRQUNBLElBQUEsQ0FBSyxnQkFBTCxFQUFBLENBQUE7UUFDQSxJQUFBLENBQUssb0JBQUwsRUFBQSxDQUFBO0tBckh3Qjs7Ozs7O0lBMkg1QixXQTNINEIsRUFBQSxTQUFBLFdBQUEsR0EySGQ7UUFDVixJQUFJLENBQUEsQ0FBRSxvQkFBRixDQUFBLENBQXdCLFFBQXhCLENBQWlDLGtCQUFqQyxDQUFKLEVBQTBEO1lBQ3RELElBQUEsQ0FBSyxHQUFMLENBQVMsR0FBVCxDQUFhO2dCQUNULFNBQUEsRUFBVyxPQURGO2dCQUVULG1CQUFBLEVBQXFCLHNCQUZaO2dCQUdULFNBQUEsRUFBVyxzQkFIRjtnQkFJVCxRQUFBLEVBQVUsT0FKRDtnQkFLVCxHQUFBLEVBQUssYUFBQTthQUxULENBQUEsQ0FBQTtTQURKLE1BUU87WUFDSCxJQUFBLENBQUssR0FBTCxDQUFTLEdBQVQsQ0FBYTtnQkFDVCxRQUFBLEVBQVUsU0FBQTthQURkLENBQUEsQ0FBQTtTQUdIO0tBeEl1Qjs7Ozs7OztJQStJNUIsZ0JBL0k0QixFQUFBLFNBQUEsZ0JBQUEsR0ErSVQ7UUFDZixJQUFJLE1BQUEsSUFBVSxNQUFBLENBQU8sT0FBckIsRUFBOEI7WUFDMUIsSUFBTSxjQUFBLEdBQWlCLFFBQUEsQ0FBUyxNQUFBLENBQU8sU0FBaEIsRUFBMkIsRUFBM0IsQ0FBdkIsQ0FBQTtZQUNBLElBQUksY0FBQSxHQUFpQixDQUFyQixFQUF3QjtnQkFDcEIsQ0FBQSxDQUFFLE1BQUYsQ0FBQSxDQUFVLFNBQVYsQ0FBb0IsQ0FBcEIsQ0FBQSxDQUFBO2FBQ0g7U0FDSjtLQXJKdUI7Ozs7SUF5SjVCLG9CQXpKNEIsRUFBQSxTQUFBLG9CQUFBLEdBeUpMO1FBQ25CLENBQUEsQ0FBRSxzQkFBRixDQUFBLENBQTBCLEdBQTFCLENBQThCLFFBQTlCLEVBQXdDLElBQUEsQ0FBSyxHQUFMLENBQVMsTUFBVCxFQUF4QyxDQUFBLENBQUE7S0ExSndCOzs7Ozs7Ozs7O0lBb0s1QixJQXBLNEIsRUFBQSxTQUFBLElBQUEsQ0FvS3ZCLE9BcEt1QixFQW9LbUM7UUFBQSxJQUFqRCxXQUFpRCxHQUFBLFNBQUEsQ0FBQSxNQUFBLEdBQUEsQ0FBQSxJQUFBLFNBQUEsQ0FBQSxDQUFBLENBQUEsS0FBQSxTQUFBLEdBQUEsU0FBQSxDQUFBLENBQUEsQ0FBQSxHQUFuQyxTQUFtQyxDQUFBO1FBQUEsSUFBeEIsRUFBd0IsR0FBQSxTQUFBLENBQUEsTUFBQSxHQUFBLENBQUEsSUFBQSxTQUFBLENBQUEsQ0FBQSxDQUFBLEtBQUEsU0FBQSxHQUFBLFNBQUEsQ0FBQSxDQUFBLENBQUEsR0FBbkIsRUFBbUIsQ0FBQTtRQUFBLElBQWYsU0FBZSxHQUFBLFNBQUEsQ0FBQSxNQUFBLEdBQUEsQ0FBQSxJQUFBLFNBQUEsQ0FBQSxDQUFBLENBQUEsS0FBQSxTQUFBLEdBQUEsU0FBQSxDQUFBLENBQUEsQ0FBQSxHQUFILENBQUcsQ0FBQTs7UUFDM0QsSUFBSSxPQUFBLElBQVcsT0FBQSxLQUFZLEVBQTNCLEVBQStCO1lBQzNCLElBQUEsQ0FBSyxJQUFMLENBQVUsSUFBVixDQUFlLEVBQUUsT0FBQSxFQUFBLE9BQUYsRUFBVyxXQUFBLEVBQUEsV0FBWCxFQUF3QixFQUFBLEVBQUEsRUFBeEIsRUFBNEIsU0FBQSxFQUFBLFNBQTVCLEVBQWYsQ0FBQSxDQUFBO1NBQ0g7UUFDRCxJQUFBLENBQUssYUFBTCxFQUFBLENBQUE7S0F4S3dCOzs7Ozs7O0lBK0s1QixpQkEvSzRCLEVBQUEsU0FBQSxpQkFBQSxDQStLVixNQS9LVSxFQStLRjtRQUN0QixJQUFJLFFBQUEsR0FBVyxNQUFmLENBQUE7O1FBRUEsSUFBQSxDQUFLLElBQUwsR0FBWSxJQUFBLENBQUssSUFBTCxDQUFVLE1BQVYsQ0FBaUIsUUFBakIsQ0FBWixDQUFBO1FBQ0EsSUFBQSxDQUFLLGFBQUwsRUFBQSxDQUFBO0tBbkx3Qjs7Ozs7O0lBeUw1QixhQXpMNEIsRUFBQSxTQUFBLGFBQUEsR0F5TFo7UUFDWixJQUFJLElBQUEsQ0FBSyxJQUFMLENBQVUsTUFBVixHQUFtQixDQUF2QixFQUEwQjtZQUN0QixJQUFNLFNBQUEsR0FBWSxJQUFBLENBQUssSUFBTCxDQUFVLEdBQVYsRUFBbEIsQ0FBQTtZQUNBLFNBQUEsQ0FBVSxXQUFWLEdBQ0ksSUFBQSxDQUFLLFlBQUwsQ0FBa0IsU0FBQSxDQUFVLFdBQTVCLENBQUEsSUFDQSxTQUFBLENBQVUsV0FGZCxDQUFBOztZQUlBLElBQ0ksQ0FBQyxDQUFBLENBQUUsT0FBRixDQUFVLElBQUEsQ0FBSyxZQUFmLENBQUQsSUFDQSxJQUFBLENBQUssWUFBTCxDQUFrQixXQUFsQixLQUFrQyxJQUFBLENBQUssWUFBTCxDQUFrQixVQUZ4RCxFQUdFO2dCQUNFLElBQUEsQ0FBSyxTQUFMLENBQWUsSUFBZixDQUFvQixJQUFBLENBQUssWUFBekIsQ0FBQSxDQUFBO2FBQ0g7WUFDRCxJQUFBLENBQUssYUFBTCxDQUFtQixTQUFuQixDQUFBLENBQUE7WUFDQSxJQUFBLENBQUssWUFBTCxHQUFvQixTQUFwQixDQUFBO1lBQ0EsSUFBQSxDQUFLLGdCQUFMLEVBQUEsQ0FBQTtTQWRKLE1BZU87O1lBRUgsQ0FBQSxDQUFFLHNCQUFGLENBQUEsQ0FBMEIsSUFBMUIsRUFBQSxDQUFBO1lBQ0EsQ0FBQSxDQUFFLE1BQUYsQ0FBQSxDQUFVLE1BQVYsQ0FBaUIsY0FBakIsQ0FBQSxDQUFBO1NBQ0g7S0E3TXVCOzs7Ozs7O0lBb041QixhQXBONEIsRUFBQSxTQUFBLGFBQUEsQ0FvTmQsSUFwTmMsRUFvTlI7UUFBQSxJQUFBLEtBQUEsR0FBQSxJQUFBLENBQUE7O1FBQ2hCLElBQ0ksY0FBQSxDQUFlLFNBQWYsQ0FBeUIsZUFBekIsQ0FBQSxJQUNBLE1BQUEsQ0FBTyxrQkFEUCxJQUVBLE1BQUEsQ0FBTyxrQkFBUCxDQUEwQixNQUg5QixFQUlFO1lBQ0UsTUFBQSxDQUFPLGtCQUFQLENBQTBCLEtBQTFCLEVBQUEsQ0FBQTtTQUNIOztRQUVELElBQU0sbUJBQUEsR0FBc0I7WUFDeEIsaUJBQUEsRUFBbUIsb0JBREs7WUFFeEIsbUJBQUEsRUFBcUIsc0JBRkc7WUFHeEIsWUFBQSxFQUFjLE1BQUEsQ0FBTyxTQUFQLENBQWlCLFlBSFA7WUFJeEIsS0FBQSxFQUFPLElBQUEsQ0FBSyxLQUpZO1lBS3hCLFNBQUEsRUFBVyxDQUxhO1lBTXhCLFdBQUEsRUFBYSxJQUFBLENBQUssWUFBTCxDQUFrQixPQUFBO1NBTm5DLENBQUE7UUFRQSxJQUFNLFlBQUEsR0FBZSxDQUFBLENBQUUsTUFBRixDQUFTLEVBQVQsRUFBYSxtQkFBYixFQUFrQyxJQUFsQyxDQUFyQixDQUFBO1FBQ0EsSUFBQSxDQUFLLEdBQUwsRUFBQSxDQUFBOztRQUVBLElBQUEsQ0FBSyxRQUFMLEdBQWdCLFFBQUEsQ0FBQSxhQUFoQixDQUFBOztRQUVBLElBQUEsQ0FBSyxNQUFMLENBQVksRUFBRSxZQUFBLEVBQUEsWUFBRixFQUFaLENBQUEsQ0FBQTs7UUFFQSxJQUFBLENBQUssV0FBTCxFQUFBLENBQUE7UUFDQSxDQUFBLENBQUUsTUFBRixDQUFBLENBQVUsRUFBVixDQUFhLG1CQUFiLEVBQWtDLFlBQU07WUFDcEMsS0FBQSxDQUFLLFdBQUwsRUFBQSxDQUFBO1NBREosQ0FBQSxDQUFBO1FBR0EsQ0FBQSxDQUFFLE1BQUYsQ0FBQSxDQUFVLEVBQVYsQ0FBYSxRQUFiLEVBQXVCLFlBQU07WUFDekIsS0FBQSxDQUFLLFdBQUwsRUFBQSxDQUFBO1NBREosQ0FBQSxDQUFBOztRQUlBLElBQUEsQ0FBSyxDQUFMLENBQU8sSUFBQSxDQUFLLEtBQUwsQ0FBVyxPQUFsQixDQUFBLENBQTJCLEtBQTNCLEVBQUEsQ0FBQTtLQXBQd0I7Ozs7OztJQTBQNUIsR0ExUDRCLEVBQUEsU0FBQSxHQUFBLEdBMFB0QjtRQUNGLElBQU0sS0FBQSxHQUFRLElBQUEsQ0FBSyxDQUFMLENBQU8sSUFBQSxDQUFLLEtBQUwsQ0FBVyxLQUFsQixDQUFkLENBQUE7UUFDQSxLQUFBLENBQU0sV0FBTixDQUFrQixpQkFBbEIsQ0FBQSxDQUFxQyxRQUFyQyxDQUE4QyxrQkFBOUMsQ0FBQSxDQUFBO1FBQ0EsS0FBQSxDQUFNLEdBQU4sQ0FDSSw4RUFESixFQUVJLEtBQUEsQ0FBTSxNQUFOLEVBRkosQ0FBQSxDQUFBO0tBN1B3Qjs7Ozs7OztJQXVRNUIsV0F2UTRCLEVBQUEsU0FBQSxXQUFBLEdBdVFkO1FBQ1YsSUFBTSxLQUFBLEdBQVEsQ0FBQSxDQUFFLE1BQUYsQ0FBQSxDQUFVLEtBQVYsRUFBZCxDQUFBO1FBQ0EsSUFBTSxTQUFBLEdBQ0YsQ0FBQSxDQUFFLE1BQUYsQ0FBQSxDQUFVLFNBQVYsRUFBQSxHQUF3QixDQUFBLENBQUUsYUFBRixDQUFBLENBQWlCLFdBQWpCLENBQTZCLElBQTdCLENBRDVCLENBQUE7UUFFQSxJQUFNLEtBQUEsR0FBUSxJQUFBLENBQUssR0FBbkIsQ0FBQTtRQUNBLElBQU0sVUFBQSxHQUFhLENBQUEsQ0FBRSxnQkFBRixDQUFBLENBQW9CLEVBQXBCLENBQXVCLFVBQXZCLENBQUEsR0FDYixDQUFBLENBQUUsZ0JBQUYsQ0FBQSxDQUFvQixXQUFwQixDQUFnQyxJQUFoQyxDQURhLEdBRWIsQ0FGTixDQUFBO1FBR0EsSUFBTSxlQUFBLEdBQWtCLENBQUEsQ0FBRSxlQUFGLENBQUEsQ0FBbUIsV0FBbkIsQ0FBK0IsSUFBL0IsQ0FBeEIsQ0FBQTtRQUNBLElBQU0sYUFBQSxHQUFnQixDQUFBLENBQUUsU0FBRixDQUFBLENBQWEsRUFBYixDQUFnQixVQUFoQixDQUFBLEdBQ2hCLENBQUEsQ0FBRSxTQUFGLENBQUEsQ0FBYSxXQUFiLENBQXlCLElBQXpCLENBRGdCLEdBRWhCLENBRk4sQ0FBQTtRQUdBLElBQU0sb0JBQUEsR0FBdUIsQ0FBQSxDQUFFLHFCQUFGLENBQUEsQ0FBeUIsRUFBekIsQ0FBNEIsVUFBNUIsQ0FBQSxHQUN2QixDQUFBLENBQUUscUJBQUYsQ0FBQSxDQUF5QixXQUF6QixDQUFxQyxJQUFyQyxDQUR1QixHQUV2QixDQUZOLENBQUE7UUFHQSxJQUFJLFNBQUEsR0FBWSxDQUFoQixDQUFBOzs7UUFHQSxJQUFJLEtBQUEsSUFBUyxHQUFiLEVBQWtCO1lBQ2QsU0FBQSxHQUFZLGFBQUEsR0FBZ0IsZUFBaEIsR0FBa0MsVUFBOUMsQ0FBQTtTQURKLE1BRU8sSUFBSSxLQUFBLEdBQVEsR0FBWixFQUFpQjs7WUFFcEIsU0FBQSxHQUFZLGFBQUEsR0FBZ0Isb0JBQWhCLEdBQXVDLFVBQW5ELENBQUE7U0FDSDs7OztRQUlELElBQUksQ0FBQSxDQUFFLG9CQUFGLENBQUEsQ0FBd0IsUUFBeEIsQ0FBaUMscUJBQWpDLENBQUosRUFBNkQ7O1lBRXpELEtBQUEsQ0FBTSxRQUFOLENBQWUsUUFBZixDQUFBLENBQUE7U0FGSixNQUdPO1lBQ0gsSUFBQSxDQUFLLEdBQUwsQ0FBUyxHQUFULENBQWE7Z0JBQ1QsUUFBQSxFQUFVLFNBREQ7Z0JBRVQsU0FBQSxFQUFXLEtBQUE7YUFGZixDQUFBLENBQUE7O1lBS0EsS0FBQSxDQUFNLEdBQU4sQ0FBVSxLQUFWLEVBQWlCLFNBQWpCLENBQUEsQ0FBQTtZQUNBLElBQUksU0FBQSxJQUFhLFNBQWpCLEVBQTRCO2dCQUN4QixLQUFBLENBQU0sUUFBTixDQUFlLFFBQWYsQ0FBQSxDQUFBO2dCQUNBLENBQUEsQ0FBRSxzQkFBRixDQUFBLENBQTBCLElBQTFCLEVBQUEsQ0FBQTthQUZKLE1BR087Z0JBQ0gsS0FBQSxDQUFNLFdBQU4sQ0FBa0IsUUFBbEIsQ0FBQSxDQUFBO2dCQUNBLENBQUEsQ0FBRSxzQkFBRixDQUFBLENBQTBCLElBQTFCLEVBQUEsQ0FBQTthQUNIOztZQUVELENBQUEsQ0FBRSxNQUFGLENBQUEsQ0FBVSxFQUFWLENBQWEsY0FBYixFQUE2QixZQUFNO2dCQUMvQixLQUFBLENBQU0sV0FBTixDQUFrQixRQUFsQixFQUE0QixDQUFBLENBQUUsTUFBRixDQUFBLENBQVUsU0FBVixFQUFBLEdBQXdCLFNBQXBELENBQUEsQ0FBQTtnQkFDQSxJQUFJLEtBQUEsQ0FBTSxRQUFOLENBQWUsUUFBZixDQUFKLEVBQThCO29CQUMxQixDQUFBLENBQUUsc0JBQUYsQ0FBQSxDQUEwQixJQUExQixFQUFBLENBQUE7aUJBREosTUFFTztvQkFDSCxDQUFBLENBQUUsc0JBQUYsQ0FBQSxDQUEwQixJQUExQixFQUFBLENBQUE7aUJBQ0g7YUFOTCxDQUFBLENBQUE7U0FRSDtLQUNKO0NBN1RXLENBQWhCLENBQUE7O3FCQWdVZSxJQUFJLE9BQUosQ0FBWSxFQUFFLE1BQUEsRUFBUSxhQUFWLEVBQVo7Ozs7Ozs7Ozs7O0FDOVVmOztBQUNBOztBQUVBLElBQU0sT0FBTyxTQUFQLElBQU8sQ0FBQyxHQUFEO0FBQUEsV0FBUyxPQUFPLElBQVAsQ0FBWSxHQUFaLENBQVQ7QUFBQSxDQUFiOztBQUVBLElBQU0sUUFBUSxTQUFSLEtBQVE7QUFBQSw0QkFDVixPQURVO0FBQUEsUUFDVixPQURVLGdDQUNBLEVBREE7QUFBQSxRQUVWLEVBRlUsUUFFVixFQUZVO0FBQUEsUUFHVixPQUhVLFFBR1YsT0FIVTtBQUFBLFFBSVYsU0FKVSxRQUlWLFNBSlU7QUFBQSxRQUtWLGlCQUxVLFFBS1YsaUJBTFU7QUFBQSxRQU1WLFdBTlUsUUFNVixXQU5VO0FBQUEseURBUTJCLFdBUjNCLGtHQVVrQixPQVZsQiwrQkFVbUQsT0FWbkQscVJBZWdCLEVBZmhCLHFEQWdCNkIsU0FoQjdCLG9DQWlCWSxPQWpCWixpRkFxQlUscUdBR2tCLEtBQUssb0JBQUwsQ0FIbEIseUtBUU0sRUE3QmhCO0FBQUEsQ0FBZDs7QUFxQ08sSUFBTSx3Q0FBZ0IsU0FBaEIsYUFBZ0I7QUFBQSxRQUFHLEVBQUgsU0FBRyxFQUFIO0FBQUEsUUFBTyxPQUFQLFNBQU8sT0FBUDtBQUFBLFFBQWdCLFNBQWhCLFNBQWdCLFNBQWhCO0FBQUEsUUFBMkIsV0FBM0IsU0FBMkIsV0FBM0I7QUFBQSxXQUN6QixNQUFNLEVBQUUsTUFBRixFQUFNLGdCQUFOLEVBQWUsb0JBQWYsRUFBMEIsbUJBQW1CLElBQTdDLEVBQW1ELHdCQUFuRCxFQUFOLENBRHlCO0FBQUEsQ0FBdEI7Ozs7Ozs7OztBQzFDUDs7Ozs7Ozs7Y0FFaUIsTTtJQUFULEksV0FBQSxJOztJQUVhLDRCOzs7QUFDakIsMENBQVksTUFBWixFQUFvQjtBQUFBOztBQUNoQixZQUFJLGFBQWEsdUNBQXFDLE9BQU8sSUFBUCxHQUFjLFdBQWQsRUFBckMsQ0FBakI7QUFDQSxZQUFJLENBQUMsVUFBTCxFQUFpQjtBQUNiLGtCQUFNLElBQUksS0FBSixRQUFjLE1BQWQsa0NBQU47QUFDSDtBQUNELFlBQUksVUFBVSxLQUFLLHNDQUFMLEVBQTZDLEVBQUMsYUFBYSxPQUFPLFNBQVAsQ0FBaUIsV0FBL0IsRUFBNEMsUUFBUSxVQUFwRCxFQUE3QyxDQUFkO0FBQ0EsWUFBTSxnQkFBZ0I7QUFDbEIscUJBQVMsQ0FBQyw4QkFBRCxDQURTO0FBRWxCLG1CQUFPLEtBQUssc0NBQUwsQ0FGVztBQUdsQiw2QkFBZSxPQUFmLGdNQUUwRyxLQUFLLElBQUwsQ0FGMUc7QUFIa0IsU0FBdEI7O0FBTmdCLGdLQWVWLGFBZlU7O0FBaUJoQixjQUFLLEdBQUwsQ0FBUyxJQUFULENBQWMsaUJBQWQsRUFBaUMsRUFBakMsQ0FBb0MsT0FBcEMsRUFBNkMsWUFBTTtBQUMvQyxrQkFBSyxLQUFMO0FBQ0gsU0FGRDtBQWpCZ0I7QUFvQm5COzs7RUFyQnFELFk7O3FCQUFyQyw0Qjs7Ozs7Ozs7O0FDSnJCOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7OztBQUVBOzs7QUFHQSxJQUFNLGtCQUFrQixTQUFsQixlQUFrQixHQUFZO0FBQ2hDLFFBQUksQ0FBQyxPQUFPLFNBQVAsQ0FBaUIsZUFBdEIsRUFBdUM7QUFDbkMsK0JBQWlDO0FBQzdCLGdCQUFJLFNBQVMsYUFBVCxDQUF1Qix1QkFBdkIsQ0FEeUI7QUFFN0Isc0JBQVUsU0FBUyxhQUFULENBQXVCLDZCQUF2QixDQUZtQjtBQUc3QixzQkFBVSxTQUFTLGFBQVQsQ0FBdUIsNkJBQXZCLENBSG1CO0FBSTdCLDRCQUFnQixTQUFTLGFBQVQsQ0FDWixtQ0FEWTtBQUphLFNBQWpDOztBQVNBO0FBQ0EsK0JBQStCO0FBQzNCLGdCQUFJLFNBQVMsYUFBVCxDQUF1QixNQUF2QjtBQUR1QixTQUEvQjs7QUFJQTtBQUNBLCtCQUFvQztBQUNoQyxzQkFBVSxTQUFTLGFBQVQsQ0FBdUIsNEJBQXZCLENBRHNCO0FBRWhDLCtCQUFtQixTQUFTLGFBQVQsQ0FDZix1Q0FEZSxDQUZhO0FBS2hDLDRCQUFnQixFQUFFLDJCQUFGLENBTGdCO0FBTWhDLHFCQUFTLEVBQUUsU0FBUyxJQUFYO0FBTnVCLFNBQXBDOztBQVNBO0FBQ0EsK0JBQW9DO0FBQ2hDLHNCQUFVLFNBQVMsYUFBVCxDQUF1QiwyQkFBdkIsQ0FEc0I7QUFFaEMsK0JBQW1CLFNBQVMsYUFBVCxDQUNmLHNDQURlLENBRmE7QUFLaEMsNEJBQWdCLEVBQUUsMkJBQUYsQ0FMZ0I7QUFNaEMscUJBQVMsRUFBRSxRQUFRLElBQVY7QUFOdUIsU0FBcEM7O0FBU0EsK0JBQWlDO0FBQzdCLGdCQUFJLFNBQVMsYUFBVCxDQUF1QixnQkFBdkI7QUFEeUIsU0FBakM7O0FBSUE7QUFDQTs7QUFFQTtBQUNBLDhFQUFvQyxNQUFwQzs7QUFFQTtBQUNBLFlBQUksZ0NBQUo7O0FBRUE7O0FBRUEsWUFBSSxPQUFPLFNBQVAsQ0FBaUIsdUJBQXJCLEVBQThDO0FBQzFDLGdCQUFJLGdDQUFKLENBQXdCLEVBQUUsZUFBZSxLQUFqQixFQUF4QixFQUFrRCxNQUFsRDtBQUNIOztBQUVELFVBQUUsdUJBQUYsRUFBMkIsRUFBM0IsQ0FBOEIsT0FBOUIsRUFBdUMsWUFBTTtBQUN6QyxnQkFBSSxnQ0FBSixDQUF3QixFQUFFLGVBQWUsSUFBakIsRUFBeEIsRUFBaUQsTUFBakQ7QUFDSCxTQUZEOztBQUlBLFlBQ0ksT0FBTyxjQUFQLENBQXNCLFNBQXRCLENBQWdDLGVBQWhDLEtBQ0EsT0FBTyxTQUFQLENBQWlCLGVBRnJCLEVBR0U7QUFDRTtBQUNBLG1CQUFPLGtCQUFQLEdBQTRCLElBQUksZ0NBQUosRUFBNUI7QUFDSDtBQUNKOztBQUVELFFBQ0ksV0FDQSxPQUFPLFNBQVAsQ0FBaUIsZUFEakIsSUFFQSxPQUFPLGNBQVAsQ0FBc0IsU0FBdEIsQ0FBZ0MsMEJBQWhDLENBRkEsSUFHQSxDQUFDLFFBQVEsR0FBUixDQUFZLGFBQVosQ0FKTCxFQUtFO0FBQ0UsWUFBSSxpR0FBK0YsT0FBTyxJQUFQLENBQy9GLHNCQUQrRixDQUEvRixXQUFKO0FBR0EsZ0JBQVEsSUFBUixDQUNPLE9BQU8sSUFBUCxDQUFZLHFCQUFaLENBRFAsU0FDNkMsSUFEN0MsRUFFSSxPQUZKLEVBR0ksYUFISjtBQUtIOztBQUVELFFBQUksT0FBTyxTQUFQLENBQWlCLG1CQUFyQixFQUEwQztBQUN0QyxZQUFJLDRCQUFKO0FBQ0g7O0FBRUQ7QUFDQSxNQUFFLFFBQUYsRUFBWSxLQUFaLENBQWtCLFVBQVUsQ0FBVixFQUFhO0FBQzNCLFlBQ0ksT0FBTyxjQUFQLENBQXNCLFNBQXRCLENBQWdDLHdCQUFoQyxLQUNBLEVBQUUsS0FBRixLQUFZLHNCQUFLLEdBRGpCLElBRUEsRUFBRSxrQkFBRixFQUFzQixNQUF0QixHQUErQixDQUhuQyxFQUlFO0FBQ0UsZ0JBQUksS0FBSyxFQUFFLGtCQUFGLEVBQXNCLElBQXRCLENBQTJCLElBQTNCLENBQVQ7QUFDQSxjQUFFLFFBQUYsRUFBWSxVQUFaLENBQXVCLFVBQXZCLEVBQW1DLFVBQW5DO0FBQ0Esa0NBQW9CLEVBQXBCLFFBQTJCLEtBQTNCO0FBQ0g7QUFDSixLQVZEO0FBV0gsQ0FwR0Q7O3FCQXNHZSxlOzs7OztBQ3RIZjs7OztBQUNBOzs7Ozs7QUFFQTtBQUNBLEVBQUUsTUFBRixFQUFVLElBQVYsQ0FBZSxVQUFmLEVBQTJCLDRCQUEzQjs7QUFFQTtBQUNBLEVBQUUsUUFBRixFQUFZLEtBQVosQ0FBa0IsMkJBQWxCOztBQUVBLElBQUksT0FBTyxTQUFQLENBQWlCLFFBQWpCLENBQTBCLFNBQTFCLENBQW9DLHNCQUFwQyxDQUFKLEVBQWlFO0FBQzdELE1BQUUsYUFBRixDQUFnQixVQUFDLENBQUQsRUFBSSxFQUFKLEVBQVEsS0FBUixFQUFrQjtBQUM5QixjQUFNLFVBQU4sR0FBbUIsSUFBSSxLQUFKLEdBQVksS0FBL0I7QUFDSCxLQUZEOztBQUlBLE1BQUUsUUFBRixFQUFZLFNBQVosQ0FBc0IsVUFBQyxLQUFELEVBQVEsS0FBUixFQUFlLFFBQWYsRUFBNEI7QUFDOUMsWUFBSTtBQUNBO0FBQ0EsZ0JBQUksU0FBUyxHQUFULEtBQWlCLDBCQUFyQixFQUFpRDtBQUM3QztBQUNIOztBQUVELGNBQUUsSUFBRixDQUFPLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLEdBQWQsQ0FBa0IsU0FBbEIsQ0FBNEIsU0FBdkMsQ0FBUCxFQUEwRDtBQUN0RCwyQkFBVyxNQUFNLFVBRHFDO0FBRXRELDJCQUFXLE1BQU0sSUFGcUM7QUFHdEQsMEJBQVUsT0FBTyxRQUFQLENBQWdCLElBSDRCO0FBSXRELGlDQUFpQixTQUFTLFFBSjRCO0FBS3RELCtCQUFlLFNBQVMsSUFMOEI7QUFNdEQsNEJBQVksU0FBUyxHQU5pQztBQU90RCxvQ0FBb0IsTUFBTSxNQVA0QjtBQVF0RCw4QkFBYyxNQUFNO0FBUmtDLGFBQTFEO0FBVUgsU0FoQkQsQ0FnQkUsT0FBTyxHQUFQLEVBQVksQ0FBRztBQUNwQixLQWxCRDtBQW1CSDs7Ozs7QUM1QkQ7O0FBQ0E7O0FBQ0E7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUVBO0FBdENBO0FBQ0E7QUFDQTs7QUFFQTtBQW1DQSxPQUFPLGNBQVAsR0FBd0Isd0NBQ3BCLFVBQVUscUJBRFUsRUFFcEIsVUFBVSxNQUZVLEVBR3BCLFVBQVUsV0FIVSxFQUlwQixVQUFVLFFBSlUsQ0FBeEI7QUFNQSxPQUFPLEtBQVAsR0FBZSxrQkFBZjtBQUNBLE9BQU8sZ0JBQVAsR0FBMEIsdUJBQTFCO0FBQ0EsT0FBTyxNQUFQLEdBQWdCLGNBQWhCO0FBQ0EsT0FBTyxHQUFQLEdBQWEsV0FBYjtBQUNBLE9BQU8sVUFBUCxHQUFvQix1QkFBcEI7QUFDQSxPQUFPLElBQVAsR0FBYyxhQUFkO0FBQ0EsT0FBTyxJQUFQLEdBQWMsYUFBZDtBQUNBLE9BQU8sc0JBQVAsR0FBZ0MsbUNBQWhDO0FBQ0EsT0FBTyxvQkFBUCxHQUE4QixpQ0FBOUI7QUFDQSxPQUFPLHlCQUFQLEdBQW1DLHNDQUFuQztBQUNBLE9BQU8sY0FBUCxHQUF3QiwyQkFBeEI7QUFDQSxPQUFPLGtCQUFQLEdBQTRCLCtCQUE1QjtBQUNBLE9BQU8sdUJBQVAsR0FBaUMsb0NBQWpDO0FBQ0EsT0FBTyxtQkFBUCxHQUE2QixnQ0FBN0I7QUFDQSxPQUFPLFlBQVAsR0FBc0IseUJBQXRCO0FBQ0EsT0FBTyxRQUFQLEdBQWtCLHFCQUFsQjtBQUNBLE9BQU8sY0FBUCxHQUF3QiwyQkFBeEI7QUFDQSxPQUFPLE9BQVAsR0FBaUIsb0JBQWpCO0FBQ0EsT0FBTyxpQkFBUCxHQUEyQiw4QkFBM0I7QUFDQSxPQUFPLGFBQVAsR0FBdUIsMEJBQXZCO0FBQ0EsT0FBTyxjQUFQLEdBQXdCLDJCQUF4QjtBQUNBLE9BQU8sUUFBUCxHQUFrQixxQkFBbEI7QUFDQSxPQUFPLDRCQUFQLEdBQXNDLHlDQUF0QztBQUNBLE9BQU8saUJBQVAsR0FBMkIsOEJBQTNCO0FBQ0EsT0FBTyxTQUFQLEdBQW1CLHNCQUFuQjtBQUNBLE9BQU8sZ0JBQVAsR0FBMEIsNkJBQTFCO0FBQ0EsT0FBTyxxQkFBUCxHQUErQixrQ0FBL0I7QUFDQSxPQUFPLHVCQUFQLEdBQWlDLG9DQUFqQztBQUNBLE9BQU8sTUFBUCxHQUFnQixtQkFBaEI7QUFDQSxPQUFPLFlBQVAsR0FBc0IseUJBQXRCO0FBQ0EsT0FBTyxPQUFQLEdBQWlCLE9BQU8sU0FBUCxDQUFpQixjQUFqQixHQUFrQyxTQUFsQyxHQUE4QyxnQkFBL0Q7QUFDQSxPQUFPLGVBQVAsR0FBeUIsNkJBQWdCLFlBQWhCLENBQTZCLE1BQTdCLENBQXpCOztBQUVBOzs7Ozs7QUFNQSxPQUFPLFlBQVAsR0FBc0IsRUFBRSxLQUFGLENBQVEsT0FBTyxRQUFQLENBQWdCLE1BQXhCLENBQXRCOztBQUVBLFNBQVMsYUFBVCxDQUF1QixJQUFJLFdBQUosQ0FBZ0IsNEJBQWhCLENBQXZCOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3RGQSxJQUFNLFNBQVMsT0FBTyxNQUF0QjtBQUNBLElBQU0sVUFBVSxPQUFPLE9BQXZCO0FBQ0EsSUFBTSxVQUFVLFFBQVEsc0JBQVIsQ0FBaEI7O0lBRXFCLEk7Ozs7O21DQUdOO0FBQ1AsbUJBQU87QUFDSCwyQkFBVyxDQURSO0FBRUgsMEJBQVUsRUFGUDtBQUdILCtCQUFlLEVBSFo7QUFJSCxnQ0FBZ0IsRUFKYjtBQUtILDZCQUFhLEVBTFY7QUFNSCx1QkFBTyxFQU5KO0FBT0gsK0JBQWUsSUFQWjtBQVFILGdDQUFnQixLQVJiOztBQVVILDJDQUEyQjtBQUN2QixnQ0FBWSxDQURXO0FBRXZCLDJCQUFPLENBRmdCO0FBR3ZCLCtCQUFXLENBSFk7QUFJdkIsMkJBQU87QUFKZ0I7QUFWeEIsYUFBUDtBQWlCSDs7QUFFRDs7OztBQUdBLG9CQUFjO0FBQUE7O0FBQUEsaUhBQ0QsU0FEQzs7QUFBQSxjQXpCZCxHQXlCYyxHQXpCUixPQUFPLElBQVAsQ0FBWSxPQUFaLENBQW9CLEdBeUJaO0FBQUEsY0FGZCxJQUVjLEdBRlAsTUFFTzs7O0FBR1YsWUFDSSxPQUFPLFNBQVAsQ0FBaUIsZUFBakIsSUFDQSxPQUFPLFNBQVAsQ0FBaUIsY0FGckIsRUFHRTtBQUNFLGdCQUFJLE1BQUssZUFBVCxFQUEwQjtBQUN0QixzQkFBSyxHQUFMLENBQVMsTUFBSyxTQUFMLEVBQVQ7O0FBRUE7QUFDQSxzQkFBSyxNQUFMLEdBQWMsUUFBUSxPQUFSLEVBQWQ7QUFDSCxhQUxELE1BS087QUFDSCxzQkFBSyxNQUFMLEdBQWMsTUFBSyxLQUFMLEVBQWQ7QUFDQSxzQkFBSyxNQUFMLENBQVksSUFBWixDQUFpQjtBQUFBLDJCQUFNLE1BQUssU0FBTCxDQUFlLE1BQUssVUFBcEIsQ0FBTjtBQUFBLGlCQUFqQjtBQUNIO0FBQ0o7QUFoQlM7QUFpQmI7Ozs7cUNBRVksSyxFQUFPO0FBQ2hCLGlCQUFLLEdBQUwsQ0FBUyxFQUFFLGVBQWUsS0FBakIsRUFBVDs7QUFFQSxpQkFBSyxTQUFMLENBQWUsS0FBSyxVQUFwQjtBQUNIOzs7K0NBa0JzQixLLEVBQU87QUFDMUIsaUJBQUssR0FBTCxDQUFTLHFCQUFULEVBQWdDLENBQUMsQ0FBQyxLQUFsQztBQUNBLGlCQUFLLFNBQUwsQ0FBZSxLQUFLLFVBQXBCO0FBQ0g7OztvQ0FFVztBQUNSLG1CQUFPLEtBQUssS0FBTCxDQUFXLFFBQVEsR0FBUixDQUFZLEtBQUssSUFBakIsS0FBMEIsSUFBckMsQ0FBUDtBQUNIOzs7cUNBRVk7QUFBQTs7QUFDVCxnQkFDSSxPQUFPLFNBQVAsQ0FBaUIsZUFBakIsSUFDQSxPQUFPLFNBQVAsQ0FBaUIsY0FGckIsRUFHRTtBQUNFLHdCQUFRLE1BQVIsQ0FBZSxLQUFLLElBQXBCO0FBQ0EscUJBQUssTUFBTCxHQUFjLEtBQUssS0FBTCxFQUFkO0FBQ0EsdUJBQU8sS0FBSyxNQUFMLENBQVksSUFBWixDQUFpQjtBQUFBLDJCQUFNLE9BQUssU0FBTCxDQUFlLE9BQUssVUFBcEIsQ0FBTjtBQUFBLGlCQUFqQixDQUFQO0FBQ0g7QUFDRCxtQkFBTyxRQUFRLE9BQVIsRUFBUDtBQUNIOzs7a0NBRVMsSyxFQUFPO0FBQ2Isb0JBQVEsR0FBUixDQUFZLEtBQUssSUFBakIsRUFBdUIsS0FBSyxTQUFMLENBQWUsS0FBZixDQUF2QixFQUE4QztBQUMxQyx5QkFBUyxJQUFJLElBQUosQ0FDTCxJQUFJLElBQUosR0FBVyxPQUFYLEtBQXVCLEtBQUssUUFBUSxvQkFEL0I7QUFEaUMsYUFBOUM7QUFLSDs7OzRCQTNDd0I7QUFDckIsbUJBQU8sS0FBSyxHQUFMLENBQVMsZUFBVCxLQUE2QixLQUFLLEdBQUwsQ0FBUyxZQUFULENBQTdCLElBQXVELEVBQTlEO0FBQ0g7Ozs0QkFFcUI7QUFDbEIsbUJBQU8sQ0FBQyxFQUFFLEtBQUssU0FBTCxFQUFGLEVBQW9CLE9BQXBCLEVBQVI7QUFDSDs7OzRCQUVtQjtBQUNoQixtQkFBTyxLQUFLLEdBQUwsQ0FBUyxlQUFULENBQVA7QUFDSDs7OzRCQUVvQjtBQUNqQixtQkFBTyxLQUFLLEdBQUwsQ0FBUyxnQkFBVCxDQUFQO0FBQ0g7Ozs7RUFqRTZCLFNBQVMsSzs7cUJBQXRCLEk7Ozs7Ozs7Ozs7O0FDSnJCOzs7Ozs7Ozs7Ozs7Y0FFaUMsTTtJQUF6QixJLFdBQUEsRztJQUFLLE0sV0FBQSxNO0lBQVEsTyxXQUFBLE87O0FBRXJCOztBQUNBLE9BQU8sSUFBUCxDQUFZLFdBQVosR0FBMEIsRUFBRSxRQUFRLEVBQUUsT0FBTSwyQkFBUixFQUFWLEVBQTFCOztJQUVxQixpQjs7Ozs7OEJBS1Q7QUFBRSxtQkFBTyxLQUFJLE9BQU8sSUFBUCxDQUFZLFdBQVosQ0FBd0IsTUFBeEIsQ0FBK0IsS0FBbkMsQ0FBUDtBQUFtRDs7QUFIN0Q7Ozs7Z0NBSVE7QUFBRSxtQkFBTyxLQUFQO0FBQWU7OzttQ0FFZDtBQUNQLG1CQUFPO0FBQ0gsbUNBQW1CO0FBRGhCLGFBQVA7QUFHSDs7O0FBRUQsK0JBQVksVUFBWixRQUFpQztBQUFBLFlBQVAsR0FBTyxRQUFQLEdBQU87O0FBQUE7O0FBQUEsMklBQ3BCLFNBRG9COztBQUFBLGNBWGpDLElBV2lDLEdBWDFCLE1BVzBCOztBQUU3QixjQUFLLEdBQUwsR0FBVyxHQUFYOztBQUVBLGNBQUssVUFBTDtBQUo2QjtBQUtoQzs7Ozt5REFFc0Q7QUFBQTs7QUFBQSxnQkFBeEIsT0FBd0IsdUVBQWQsSUFBYztBQUFBLGdCQUFSLE1BQVE7O0FBQ25ELG1CQUFPLElBQUksT0FBSixDQUFZLFVBQUMsT0FBRCxFQUFVLE1BQVYsRUFBcUI7QUFDcEMsdUJBQUssSUFBTCxDQUFVLEVBQUUsbUJBQW1CLENBQUMsQ0FBQyxPQUF2QixFQUFWLEVBQTRDO0FBQ3hDLDJCQUFVLElBRDhCO0FBRXhDLDBCQUFVLElBRjhCO0FBR3hDLDZCQUFVLGlCQUFDLE9BQUQsRUFBYTtBQUNuQiwrQkFBSyxHQUFMLENBQVMsT0FBVCxDQUFpQixtQ0FBakIsRUFBc0QsRUFBRSxnQkFBRixFQUFXLGNBQVgsRUFBdEQ7QUFDQSwrQkFBSyxTQUFMLENBQWUsT0FBSyxVQUFwQjtBQUNBO0FBQ0gscUJBUHVDO0FBUXhDLDJCQUFVLGVBQUMsTUFBRCxFQUFXO0FBQ2pCLCtCQUFPLE1BQVA7QUFDSDtBQVZ1QyxpQkFBNUM7QUFZSCxhQWJNLENBQVA7QUFjSDs7QUFHRDs7OztxQ0FDYTtBQUFBOztBQUNULGdCQUFJLE9BQU8sU0FBUCxDQUFpQixlQUFqQixJQUFvQyxPQUFPLFNBQVAsQ0FBaUIsY0FBekQsRUFBeUU7QUFDckUsb0JBQUksS0FBSyxlQUFULEVBQTBCO0FBQ3RCLHlCQUFLLEdBQUwsQ0FBUyxLQUFLLFNBQUwsRUFBVDs7QUFFQTtBQUNBLHlCQUFLLE1BQUwsR0FBYyxRQUFRLE9BQVIsRUFBZDtBQUNILGlCQUxELE1BS087QUFDSCx5QkFBSyxNQUFMLEdBQWMsS0FBSyxLQUFMLEVBQWQ7QUFDQSx5QkFBSyxNQUFMLENBQVksSUFBWixDQUFpQixZQUFNO0FBQ25CLCtCQUFLLFNBQUwsQ0FBZSxPQUFLLFVBQXBCO0FBQ0gscUJBRkQ7QUFHSDtBQUNKO0FBQ0o7OztvQ0FFVztBQUNSLG1CQUFPLEtBQUssS0FBTCxDQUFXLFFBQVEsR0FBUixDQUFZLEtBQUssSUFBakIsS0FBMEIsSUFBckMsQ0FBUDtBQUNIOzs7a0NBRVMsSyxFQUFPO0FBQ2Isb0JBQVEsR0FBUixDQUFZLEtBQUssSUFBakIsRUFBdUIsS0FBSyxTQUFMLENBQWUsS0FBZixDQUF2QixFQUE4QztBQUMxQyx5QkFBUyxJQUFJLElBQUosQ0FBUyxJQUFJLElBQUosR0FBVyxPQUFYLEtBQXVCLEtBQUsscUJBQVEsb0JBQTdDO0FBRGlDLGFBQTlDO0FBR0g7Ozs0QkFFcUI7QUFDbEIsbUJBQU8sQ0FBQyxFQUFFLEtBQUssU0FBTCxFQUFGLEVBQW9CLE9BQXBCLEVBQVI7QUFDSDs7OztFQXBFMEMsU0FBUyxLOztxQkFBbkMsaUI7Ozs7Ozs7O0FDUHJCO3FCQUNlLE9BQU8sUUFBUCxDQUFnQixLOzs7Ozs7Ozs7QUNDL0I7Ozs7OztrTkFGQTs7QUFJQSxJQUFNLGVBQWU7QUFDakIsMkJBQXVCLHVCQUROO0FBRWpCLGNBQVUsa0JBRk87QUFHakIsa0JBQWMsZUFIRztBQUlqQixjQUFVLFVBSk87QUFLakIsdUJBQW1CLG9CQUxGO0FBTWpCLHVCQUFtQjtBQU5GLENBQXJCOztBQVNBLElBQU0sbUJBQW1CLGtCQUFVLE1BQVYsQ0FBaUI7QUFDdEMsY0FEc0Msd0JBQ3pCO0FBQ1QsYUFBSyxFQUFMLENBQVEsOEJBQVIsRUFBd0MsS0FBSyxXQUFMLENBQWlCLElBQWpCLENBQXNCLElBQXRCLENBQXhDO0FBQ0gsS0FIcUM7QUFLdEMsT0FMc0MsaUJBS2hDO0FBQ0YsZUFBTyxPQUFPLEdBQVAsQ0FBVyxPQUFPLE1BQVAsQ0FBYyxXQUF6QixDQUFQO0FBQ0gsS0FQcUM7QUFTdEMsU0FUc0MsbUJBUzlCO0FBQ0osZUFBTyxLQUFQO0FBQ0gsS0FYcUM7QUFhdEMscUJBYnNDLDZCQWFwQixRQWJvQixFQWFWO0FBQ3hCLGVBQU8sRUFBRSxNQUFGLENBQ0gsRUFBRSxHQUFGLENBQU0sRUFBRSxLQUFGLENBQVEsUUFBUixDQUFOLEVBQXlCLFVBQUMsSUFBRDtBQUFBLG1CQUFVLEtBQUssQ0FBTCxNQUFZLElBQVosSUFBb0IsS0FBSyxDQUFMLENBQTlCO0FBQUEsU0FBekIsQ0FERyxDQUFQO0FBR0gsS0FqQnFDO0FBbUJ0Qyx5QkFuQnNDLHVDQTBCbkM7QUFBQSxZQU5DLFFBTUQsUUFOQyxRQU1EO0FBQUEsWUFMQyxZQUtELFFBTEMsWUFLRDtBQUFBLFlBSkMscUJBSUQsUUFKQyxxQkFJRDtBQUFBLFlBSEMsUUFHRCxRQUhDLFFBR0Q7QUFBQSxZQUZDLGlCQUVELFFBRkMsaUJBRUQ7QUFBQSxZQURDLGlCQUNELFFBREMsaUJBQ0Q7O0FBQ0MsYUFBSyxHQUFMLENBQ0ksRUFBRSxNQUFGLENBQ0ksRUFBRSxVQUFVLEtBQUssaUJBQUwsQ0FBdUIsUUFBdkIsQ0FBWixFQURKLEVBRUk7QUFDSSxtQ0FBdUIsQ0FBQyxDQUFDLHFCQUQ3QjtBQUVJLDBCQUFjLENBQUMsQ0FBQyxZQUZwQjtBQUdJLHNCQUFVLENBQUMsQ0FBQyxRQUhoQjtBQUlJLGdEQUpKO0FBS0k7QUFMSixTQUZKLENBREosRUFXSSxFQUFFLFFBQVEsSUFBVixFQVhKO0FBYUgsS0F4Q3FDO0FBMEN0QyxnQkExQ3NDLDBCQTBDdkI7QUFDWCxZQUFNLG9CQUFvQixFQUFFLElBQUYsQ0FBTyxLQUFLLGlCQUFMLEVBQVAsQ0FBMUI7QUFDQSxZQUFNLFNBQVMsS0FBSyxNQUFMLEVBQWY7QUFDQSxZQUFNLE9BQU8sRUFBYjs7QUFFQSwwQkFBa0IsT0FBbEIsQ0FBMEIsVUFBQyxJQUFELEVBQVU7QUFDaEMsaUJBQUssYUFBYSxJQUFiLENBQUwsSUFBMkIsT0FBTyxhQUFhLElBQWIsQ0FBUCxDQUEzQjtBQUNILFNBRkQ7O0FBSUEsZUFBTyxFQUFFLElBQUYsQ0FBTyxJQUFQLEVBQWEsVUFBQyxLQUFEO0FBQUEsbUJBQVcsVUFBVSxLQUFLLENBQTFCO0FBQUEsU0FBYixDQUFQO0FBQ0gsS0FwRHFDO0FBc0R0QyxVQXREc0Msb0JBc0Q3QjtBQUFBOztBQUNMLFlBQU0saURBQ0QsYUFBYSxRQURaLEVBQ3VCLEtBQUssR0FBTCxDQUFTLFVBQVQsQ0FEdkIsNEJBRUQsYUFBYSxxQkFGWixFQUVvQyxLQUFLLEdBQUwsQ0FDbEMsdUJBRGtDLENBRnBDLDRCQUtELGFBQWEsWUFMWixFQUsyQixLQUFLLEdBQUwsQ0FBUyxjQUFULENBTDNCLDRCQU1ELGFBQWEsUUFOWixFQU11QixLQUFLLEdBQUwsQ0FBUyxVQUFULENBTnZCLDRCQU9ELGFBQWEsaUJBUFosRUFPZ0MsS0FBSyxHQUFMLENBQVMsbUJBQVQsQ0FQaEMsNEJBUUQsYUFBYSxpQkFSWixFQVFnQyxLQUFLLEdBQUwsQ0FBUyxtQkFBVCxDQVJoQyxXQUFOO0FBVUEsZUFBTyxFQUFFLElBQUYsQ0FBTyxNQUFQLEVBQWUsVUFBQyxLQUFEO0FBQUEsbUJBQVcsVUFBVSxLQUFLLENBQTFCO0FBQUEsU0FBZixDQUFQO0FBQ0gsS0FsRXFDO0FBb0V0QyxlQXBFc0MseUJBb0V4QjtBQUNWO0FBQ0EsWUFBTSxlQUFlLEtBQUssR0FBTCxDQUFTLHVCQUFULENBQXJCO0FBQ0EsVUFBRSxJQUFGLENBQU87QUFDSCxpQkFBSyxPQUFPLEdBQVAsQ0FBVyxPQUFPLE1BQVAsQ0FBYyxrQkFBekIsQ0FERjtBQUVILHlCQUFhLGtCQUZWO0FBR0gsa0JBQU0sTUFISDtBQUlILGtCQUFNLEtBQUssU0FBTCxDQUFlLEVBQUUsb0JBQW9CLFlBQXRCLEVBQWY7QUFKSCxTQUFQO0FBTUg7QUE3RXFDLENBQWpCLENBQXpCOztxQkFnRmUsZ0I7Ozs7O0FDN0ZmOztBQUNBOztBQUVBOzs7O0FBQ0E7Ozs7QUFFQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7O0FBRUEsT0FBTyxNQUFQLEdBQWdCLG1CQUFoQjs7QUFFQSxNQUFNLG1DQUF1Qiw0QkFBN0I7O0FBRUEsT0FBTyxpQkFBUCxHQUEyQixJQUFJLDhCQUFKLENBQXNCLEVBQXRCLEVBQTBCLEVBQUUsS0FBSyxPQUFPLFlBQWQsRUFBMUIsQ0FBM0I7QUFDQSxPQUFPLElBQVAsR0FBYyxJQUFJLGlCQUFKLEVBQWQ7O0FBRUEsS0FBTSxJQUFJLHdCQUFKLENBQWdCO0FBQ2xCLFNBQW9CLE9BQU8sWUFEVDtBQUVsQixVQUFvQixPQUFPLElBRlQ7QUFHbEIsb0JBQW9CLE9BQU8sY0FIVDtBQUlsQixvQkFBb0IsT0FBTyxjQUpUO0FBS2xCLHVCQUFvQixPQUFPO0FBTFQsQ0FBaEIsQ0FBTjs7QUFRQSxPQUFPLFNBQVAsQ0FBaUIsdUJBQWpCLEdBQTJDLElBQUksb0NBQUosQ0FBNEIsUUFBUSxHQUFSLENBQVksMEJBQWEsZUFBYixDQUE2QixJQUF6QyxLQUFrRCxHQUE5RSxFQUFtRixPQUFPLGNBQTFGLEVBQTBHLE9BQU8sU0FBUCxDQUFpQixtQkFBM0gsQ0FBM0M7QUFDQSxPQUFPLFNBQVAsQ0FBaUIsdUJBQWpCLEdBQTJDLElBQUksb0NBQUosQ0FBNEIsT0FBTyxTQUFQLENBQWlCLHVCQUE3QyxDQUEzQzs7Ozs7QUM5QkEsQ0FBQyxZQUFNO0FBQ0gsUUFBSSxPQUFPLE9BQU8sV0FBZCxLQUE4QixVQUFsQyxFQUE4QztBQUMxQyxlQUFPLEtBQVA7QUFDSDs7QUFFRCxRQUFNLGNBQWMsU0FBZCxXQUFjLENBQUMsSUFBRCxFQUFPLGFBQVAsRUFBeUI7QUFDekMsWUFBTSxRQUFRLFNBQVMsV0FBVCxDQUFxQixhQUFyQixDQUFkO0FBQ0EsWUFBSSxhQUFKLEVBQW1CO0FBQ2Ysa0JBQU0sZUFBTixDQUFzQixJQUF0QixFQUE0QixjQUFjLE9BQTFDLEVBQW1ELGNBQWMsVUFBakUsRUFBNkUsY0FBYyxNQUEzRjtBQUNILFNBRkQsTUFFTztBQUNILGtCQUFNLGVBQU4sQ0FBc0IsSUFBdEI7QUFDSDtBQUNELGVBQU8sS0FBUDtBQUNILEtBUkQ7O0FBVUEsZ0JBQVksU0FBWixHQUF3QixPQUFPLEtBQVAsQ0FBYSxTQUFyQztBQUNBLFdBQU8sV0FBUCxHQUFxQixXQUFyQjtBQUNILENBakJEOzs7Ozs7Ozs7OztBQ0FBOzs7O0lBRXFCLE87QUFDakIscUJBQVksR0FBWixFQUFpQjtBQUFBOztBQUNiLGFBQUssR0FBTCxHQUFXLEdBQVg7QUFDSDs7OzttQ0FFVSxVLEVBQVc7QUFDbEIsZ0JBQUksT0FBTztBQUNQLDBCQUFVLEtBREg7QUFFUCx1QkFBTyxXQUFXLEdBQVgsQ0FBZSxPQUFmLENBRkE7QUFHUCwyQ0FBMEIsV0FBVyxHQUFYLENBQWUsUUFBZixFQUF5QixJQUFuRCxnQkFITztBQUlQLHlCQUFTLENBQUMsY0FBRCxDQUpGO0FBS1AsNEJBQWEsSUFMTjtBQU1QLDZCQUFjLElBTlA7QUFPUCxpQ0FBaUI7QUFQVixhQUFYO0FBU0EsaUJBQUssS0FBTCxHQUFhLElBQUksWUFBSixDQUFVLElBQVYsQ0FBYjtBQUNBLGlCQUFLLEtBQUwsQ0FBVyxJQUFYO0FBQ0g7Ozs7OztxQkFqQmdCLE87Ozs7Ozs7Ozs7O0FDRnJCOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUVBOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7SUFFcUIsa0I7QUFDakIsZ0NBQVksR0FBWixFQUFpQixJQUFqQixFQUF1QixjQUF2QixFQUF1QztBQUFBOztBQUFBOztBQUNuQyxhQUFLLEdBQUwsR0FBVyxHQUFYO0FBQ0EsYUFBSyxJQUFMLEdBQVksSUFBWjtBQUNBLGFBQUssY0FBTCxHQUFzQixjQUF0Qjs7QUFFQSxhQUFLLE9BQUwsR0FBZSxJQUFJLG1CQUFKLENBQVcsS0FBSyxHQUFoQixDQUFmO0FBQ0EsYUFBSyxLQUFMLEdBQWEsSUFBSSxpQkFBSixDQUFTLEtBQUssR0FBZCxFQUFtQixLQUFLLElBQXhCLENBQWI7QUFDQSxhQUFLLFNBQUwsR0FBaUIsSUFBSSxxQkFBSixDQUFhLEtBQUssR0FBbEIsQ0FBakI7QUFDQSxhQUFLLEtBQUwsR0FBYSxJQUFJLGlCQUFKLENBQVMsS0FBSyxHQUFkLENBQWI7QUFDQSxhQUFLLE9BQUwsR0FBZSxJQUFJLHVCQUFKLENBQWUsS0FBSyxHQUFwQixDQUFmO0FBQ0EsYUFBSyxRQUFMLEdBQWdCLElBQUksMkJBQUosQ0FBbUIsS0FBSyxHQUF4QixDQUFoQjtBQUNBLGFBQUssUUFBTCxHQUFnQixJQUFJLG9CQUFKLENBQVksS0FBSyxHQUFqQixDQUFoQjs7QUFFQSxhQUFLLEdBQUwsQ0FDSyxFQURMLENBQ1EsY0FEUixFQUN3QixVQUFDLEtBQUQsRUFBUSxPQUFSO0FBQUEsbUJBQ2hCLE1BQUssT0FBTCxDQUFhLFFBQWIsRUFBdUIsS0FBdkIsRUFBOEIsT0FBOUIsQ0FEZ0I7QUFBQSxTQUR4QixFQUlLLEVBSkwsQ0FJUSxZQUpSLEVBSXNCLFVBQUMsS0FBRCxFQUFRLE9BQVI7QUFBQSxtQkFDZCxNQUFLLE9BQUwsQ0FBYSxNQUFiLEVBQXFCLEtBQXJCLEVBQTRCLE9BQTVCLENBRGM7QUFBQSxTQUp0QixFQU9LLEVBUEwsQ0FPUSxtQkFQUixFQU82QixVQUFDLEtBQUQsRUFBUSxPQUFSO0FBQUEsbUJBQ3JCLE1BQUssT0FBTCxDQUFhLFlBQWIsRUFBMkIsS0FBM0IsRUFBa0MsT0FBbEMsQ0FEcUI7QUFBQSxTQVA3QixFQVVLLEVBVkwsQ0FVUSxnQkFWUixFQVUwQixVQUFDLEtBQUQsRUFBUSxPQUFSO0FBQUEsbUJBQ2xCLE1BQUssT0FBTCxDQUFhLE1BQWIsRUFBcUIsS0FBckIsRUFBNEIsT0FBNUIsQ0FEa0I7QUFBQSxTQVYxQixFQWFLLEVBYkwsQ0FhUSxZQWJSLEVBYXNCLFVBQUMsS0FBRCxFQUFRLE9BQVI7QUFBQSxtQkFDZCxNQUFLLE9BQUwsQ0FBYSxNQUFiLEVBQXFCLEtBQXJCLEVBQTRCLE9BQTVCLENBRGM7QUFBQSxTQWJ0QixFQWdCSyxFQWhCTCxDQWdCUSxjQWhCUixFQWdCd0IsVUFBQyxLQUFELEVBQVEsT0FBUjtBQUFBLG1CQUNoQixNQUFLLE9BQUwsQ0FBYSxRQUFiLEVBQXVCLEtBQXZCLEVBQThCLE9BQTlCLENBRGdCO0FBQUEsU0FoQnhCLEVBbUJLLEVBbkJMLENBbUJRLGVBbkJSLEVBbUJ5QixVQUFDLEtBQUQsRUFBUSxPQUFSO0FBQUEsbUJBQ2pCLE1BQUssT0FBTCxDQUFhLFNBQWIsRUFBd0IsS0FBeEIsRUFBK0IsT0FBL0IsQ0FEaUI7QUFBQSxTQW5CekIsRUFzQkssRUF0QkwsQ0FzQlEsZUF0QlIsRUFzQnlCLFVBQUMsS0FBRCxFQUFRLE9BQVI7QUFBQSxtQkFDakIsTUFBSyxPQUFMLENBQWEsU0FBYixFQUF3QixLQUF4QixFQUErQixPQUEvQixDQURpQjtBQUFBLFNBdEJ6QixFQXlCSyxFQXpCTCxDQXlCUSxhQXpCUixFQXlCdUIsVUFBQyxLQUFELEVBQVEsT0FBUjtBQUFBLG1CQUNmLE1BQUssT0FBTCxDQUFhLE9BQWIsRUFBc0IsS0FBdEIsRUFBNkIsT0FBN0IsQ0FEZTtBQUFBLFNBekJ2QixFQTRCSyxFQTVCTCxDQTRCUSxvQkE1QlIsRUE0QjhCLFVBQUMsS0FBRCxFQUFRLE9BQVI7QUFBQSxtQkFDdEIsTUFBSyxPQUFMLENBQWEsY0FBYixFQUE2QixLQUE3QixFQUFvQyxPQUFwQyxDQURzQjtBQUFBLFNBNUI5QjtBQStCSDs7OztnQ0FFTyxNLEVBQVEsVSxFQUFZLE8sRUFBUztBQUNqQyxnQkFBSSxDQUFDLE9BQU8sU0FBUCxDQUFpQixlQUFsQixJQUFxQyxXQUFXLFNBQXBELEVBQStEO0FBQzNELHFCQUFLLGVBQUwsQ0FDSSxNQURKLEVBRUksV0FBVyxFQUZmLEVBR0ksV0FBVyxHQUFYLENBQWUsZ0JBQWYsQ0FISjtBQUtILGFBTkQsTUFNTyxJQUNILENBQUMsT0FBTyxTQUFQLENBQWlCLGNBQWxCLElBQ0EsQ0FBQyxPQUFPLGNBQVAsQ0FBc0IsU0FBdEIsQ0FBZ0MsZ0JBQWhDLENBRkUsRUFHTDtBQUNFLG9CQUFJLGNBQWMsV0FBVyxHQUFYLENBQWUsWUFBZixDQUFsQjtBQUNBLG9CQUFJLFdBQVcsUUFBZixFQUF5QjtBQUNyQiw4Q0FBd0IsV0FBVyxHQUFYLENBQWUsZ0JBQWYsQ0FBeEI7QUFDSDtBQUNELHFCQUFLLEdBQUwsQ0FBUyxPQUFULENBQWlCLGdCQUFqQixFQUFtQyxFQUFFLFFBQVEsV0FBVixFQUFuQztBQUNILGFBVE0sTUFTQSxJQUFJLE9BQU8sS0FBSyxRQUFMLE1BQWlCLE1BQWpCLENBQVAsS0FBc0MsVUFBMUMsRUFBc0Q7QUFDekQscUJBQUssY0FBTCxDQUFvQixNQUFwQixFQUE0QixVQUE1QixFQUF3QyxPQUF4QztBQUNIOztBQUVEO0FBQ0g7Ozt3Q0FFZSxNLEVBQVEsRSxFQUFJLE0sRUFBUTtBQUNoQyxnQkFBSSxZQUFlLE1BQWYsU0FBeUIsRUFBN0I7QUFDQSxnQkFBSSxNQUFKLEVBQVk7QUFDUixtQ0FBaUIsTUFBakI7QUFDSDtBQUNELG1CQUFPLFFBQVAsR0FBa0IsT0FBTyxHQUFQLENBQVcsT0FBTyxNQUFQLENBQWMsYUFBekIsRUFBd0M7QUFDdEQseUJBQ0ksT0FBTyxRQUFQLENBQWdCLFFBQWhCLEdBQ0EsT0FBTyxRQUFQLENBQWdCLE1BRGhCLEdBRUEsVUFGQSxHQUdBO0FBTGtELGFBQXhDLENBQWxCO0FBT0g7Ozt1Q0FFYyxNLEVBQVEsSyxFQUFPLE8sRUFBUztBQUFBOztBQUNuQyxpQkFBSyxjQUFMLENBQW9CLE1BQXBCLEVBQTRCLEtBQTVCLEVBQW1DO0FBQUEsdUJBQy9CLE9BQUssUUFBTCxNQUFpQixNQUFqQixFQUEyQixLQUEzQixFQUFrQyxPQUFsQyxDQUQrQjtBQUFBLGFBQW5DO0FBR0g7Ozt1Q0FFYyxNLEVBQVEsSyxFQUFPLGUsRUFBaUI7QUFBQTs7QUFDM0MsZ0JBQUksY0FBYyxLQUFsQjtBQUNBLGdCQUFJLEVBQUUsQ0FBQyxRQUFELEVBQVcsTUFBWCxFQUFtQixTQUFuQixDQUFGLEVBQWlDLFFBQWpDLENBQTBDLE1BQTFDLENBQUosRUFBdUQ7QUFDbkQsOEJBQWMsSUFBZDtBQUNILGFBRkQsTUFFTyxJQUFJLFdBQVcsTUFBZixFQUF1QjtBQUMxQiw4QkFBYyxNQUFNLEdBQU4sQ0FBVSxlQUFWLE1BQStCLGFBQTdDO0FBQ0gsYUFGTSxNQUVBLElBQUksV0FBVyxTQUFmLEVBQTBCO0FBQzdCLDhCQUFjLENBQUMsTUFBTSxHQUFOLENBQVUsYUFBVixDQUFmO0FBQ0g7O0FBRUQsZ0JBQUksV0FBSixFQUFpQjtBQUNiLG9CQUFJLG9CQUFvQixDQUFDLE1BQU0sR0FBTixDQUFVLFdBQVYsQ0FBRCxHQUNsQixNQUFNLG1CQUFOLENBQTBCLFdBQTFCLENBRGtCLEdBRWxCLFFBQVEsT0FBUixFQUZOO0FBR0Esa0NBQWtCLElBQWxCLENBQXVCLFlBQU07QUFDekIsd0JBQ0ksT0FBSyxtQkFBTCxDQUF5QixLQUF6QixLQUNDLFFBQVEsR0FBUixDQUFZLDJCQUFaLEtBQ0csUUFBUSxHQUFSLENBQVksMkJBQVosTUFBNkMsR0FIckQsRUFJRTtBQUNFO0FBQ0gscUJBTkQsTUFNTztBQUNILCtCQUFPLE1BQVAsQ0FBYyxHQUFkLENBQ0ksTUFESixFQUVJLG1DQUZKLEVBR0k7QUFDSSw0Q0FDSSxPQUFPLGNBQVAsQ0FBc0Isb0JBQXRCLENBRlI7QUFHSSw0Q0FBZ0IsTUFBTSxHQUFOLENBQVUsV0FBVjtBQUhwQix5QkFISjtBQVNBLDRCQUFNLGdCQUFnQixJQUFJLGtDQUFKLENBQTBCO0FBQzVDLG1DQUFPLElBQUksNkJBQUosQ0FBcUI7QUFDeEIsMkNBQVcsTUFBTSxHQUFOLENBQVUsV0FBVixDQURhO0FBRXhCO0FBRndCLDZCQUFyQjtBQURxQyx5QkFBMUIsQ0FBdEI7QUFNQSxzQ0FBYyxHQUFkLENBQ0ssSUFETCxDQUNVLGlCQURWLEVBRUssRUFGTCxDQUVRLE9BRlIsRUFFaUIsWUFBTTtBQUNmLDBDQUFjLEtBQWQ7QUFDQSxnQ0FDSSxjQUFjLEdBQWQsQ0FDSyxJQURMLENBQ1UsbUJBRFYsRUFFSyxFQUZMLENBRVEsVUFGUixDQURKLEVBSUU7QUFDRSxvQ0FBTSxxQkFDRixPQUFPLEVBQVAsR0FBWSxFQUFaLEdBQWlCLEVBQWpCLEdBQXNCLEdBRDFCO0FBRUEsb0NBQU0sYUFBYSxJQUFJLElBQUosQ0FDZixLQUFLLEdBQUwsS0FBYSxrQkFERSxDQUFuQjtBQUdBLHdDQUFRLEdBQVIsQ0FBWSwyQkFBWixFQUF5QyxHQUF6QyxFQUE4QztBQUMxQyw4Q0FBVSxLQURnQztBQUUxQyw2Q0FBUztBQUZpQyxpQ0FBOUM7QUFJSDtBQUNEO0FBQ0gseUJBcEJMO0FBcUJBLHNDQUFjLEdBQWQsQ0FBa0IsSUFBbEIsQ0FBdUIsZ0JBQXZCLEVBQXlDLEVBQXpDLENBQTRDLE9BQTVDLEVBQXFELFlBQU07QUFDdkQsMENBQWMsS0FBZDtBQUNBLGtDQUFNLE9BQU4sQ0FBYyxzQkFBZDtBQUNILHlCQUhEO0FBSUg7QUFDSixpQkFqREQ7QUFrREgsYUF0REQsTUFzRE87QUFDSDtBQUNIO0FBQ0o7Ozs0Q0FFbUIsSyxFQUFPO0FBQ3ZCLGdCQUFNLGlCQUFpQixNQUFNLEdBQU4sQ0FBVSxXQUFWLENBQXZCO0FBQ0EsZ0JBQU0sbUJBQ0Qsa0JBQWtCLGVBQWUsR0FBZixDQUFtQixVQUFDLFFBQUQ7QUFBQSx1QkFBYyxTQUFTLEVBQXZCO0FBQUEsYUFBbkIsQ0FBbkIsSUFDQSxFQUZKO0FBR0EsZ0JBQUksaUJBQWlCLE9BQU8sY0FBUCxDQUFzQixvQkFBdEIsQ0FBckI7QUFDQSxnQkFBSSxDQUFDLENBQUMsY0FBTixFQUFzQjtBQUNsQixvQkFBTSxlQUFlLGVBQWUsT0FBZixDQUF1QixHQUF2QixDQUFyQjtBQUNBLG9CQUFJLGlCQUFpQixDQUFDLENBQXRCLEVBQXlCO0FBQ3JCLHFDQUFpQixlQUFlLFNBQWYsQ0FBeUIsQ0FBekIsRUFBNEIsWUFBNUIsQ0FBakI7QUFDSDtBQUNELG9CQUFJLENBQUMsaUJBQWlCLFFBQWpCLENBQTBCLGNBQTFCLENBQUwsRUFBZ0Q7QUFDNUMsMkJBQU8sS0FBUDtBQUNIO0FBQ0o7QUFDRCxtQkFBTyxJQUFQO0FBQ0g7Ozs0QkFFYztBQUNYLGdCQUFJLE9BQU8sSUFBWDtBQUNBLG1CQUFPO0FBQ0gsc0JBREcsa0JBQ0ksS0FESixFQUNXLE9BRFgsRUFDb0I7QUFDbkIseUJBQUssT0FBTCxDQUFhLFdBQWIsQ0FBeUIsS0FBekIsRUFBZ0MsT0FBaEM7QUFDSCxpQkFIRTtBQUtILG9CQUxHLGdCQUtFLEtBTEYsRUFLUyxPQUxULEVBS2tCO0FBQ2pCLHlCQUFLLEtBQUwsQ0FBVyxTQUFYLENBQXFCLEtBQXJCLEVBQTRCLE9BQTVCO0FBQ0gsaUJBUEU7QUFTSCwwQkFURyxzQkFTUSxLQVRSLEVBU2UsT0FUZixFQVN3QjtBQUN2Qix5QkFBSyxLQUFMLENBQVcsVUFBWCxDQUFzQixLQUF0QixFQUE2QixPQUE3QjtBQUNILGlCQVhFO0FBYUgsb0JBYkcsZ0JBYUUsS0FiRixFQWFTLE9BYlQsRUFha0I7QUFDakIseUJBQUssU0FBTCxDQUFlLGNBQWYsQ0FBOEIsS0FBOUIsRUFBcUMsT0FBckM7QUFDSCxpQkFmRTtBQWlCSCxvQkFqQkcsZ0JBaUJFLEtBakJGLEVBaUJTLE9BakJULEVBaUJrQjtBQUNqQix5QkFBSyxLQUFMLENBQVcsVUFBWCxDQUFzQixLQUF0QixFQUE2QixPQUE3QjtBQUNILGlCQW5CRTtBQXFCSCxzQkFyQkcsa0JBcUJJLEtBckJKLEVBcUJXLE9BckJYLEVBcUJvQjtBQUNuQix5QkFBSyxPQUFMLENBQWEsY0FBYixDQUE0QixLQUE1QixFQUFtQyxPQUFuQztBQUNILGlCQXZCRTtBQXlCSCx1QkF6QkcsbUJBeUJLLEtBekJMLEVBeUJZLE9BekJaLEVBeUJxQjtBQUNwQix5QkFBSyxRQUFMLENBQWMsb0JBQWQsQ0FBbUMsS0FBbkMsRUFBMEMsT0FBMUM7QUFDSCxpQkEzQkU7QUE2QkgsdUJBN0JHLG1CQTZCSyxLQTdCTCxFQTZCWTtBQUNYLHlCQUFLLFFBQUwsQ0FBYyxVQUFkLENBQXlCLEtBQXpCO0FBQ0gsaUJBL0JFO0FBaUNILHFCQWpDRyxpQkFpQ0csS0FqQ0gsRUFpQ1UsT0FqQ1YsRUFpQ21CO0FBQ2xCLDRCQUFRLFNBQVIsR0FBb0IsSUFBcEI7QUFDQSw0QkFBUSxVQUFSLEdBQXFCLElBQXJCO0FBQ0Esd0JBQUksTUFBTSxVQUFOLENBQWlCLGdCQUFyQixFQUF1QztBQUNuQyxnQ0FBUSxVQUFSLEdBQ0ksTUFBTSxVQUFOLENBQWlCLFlBQWpCLENBQThCLE1BQTlCLElBQ0EsTUFBTSxVQUFOLENBQWlCLFlBQWpCLENBQThCLENBQTlCLEVBQWlDLEVBRnJDO0FBR0g7QUFDRCx5QkFBSyxPQUFMLENBQWEsV0FBYixDQUF5QixLQUF6QixFQUFnQyxPQUFoQztBQUNILGlCQTFDRTtBQTRDSCw0QkE1Q0csd0JBNENVLEtBNUNWLEVBNENpQixPQTVDakIsRUE0QzBCO0FBQ3pCLDRCQUFRLGNBQVIsR0FBeUIsSUFBekI7QUFDQSx5QkFBSyxLQUFMLENBQVcsU0FBWCxDQUFxQixLQUFyQixFQUE0QixPQUE1QjtBQUNIO0FBL0NFLGFBQVA7QUFpREg7Ozs7OztxQkFwT2dCLGtCOzs7Ozs7Ozs7Ozs7O0lDWEEsWTtBQUNqQixnQ0FBOEI7QUFBQSxZQUFoQixHQUFnQixRQUFoQixHQUFnQjtBQUFBLFlBQVgsT0FBVyxRQUFYLE9BQVc7O0FBQUE7O0FBQzFCLGFBQUssR0FBTCxHQUFXLEdBQVg7O0FBRUEsYUFBSyxPQUFMLEdBQWU7QUFDWCxrQkFBTSxTQURLO0FBRVgsa0NBQXNCO0FBRlgsU0FBZjs7QUFLQSxVQUFFLE1BQUYsQ0FBUyxLQUFLLE9BQWQsRUFBdUIsT0FBdkI7QUFDSDs7OztnQ0FFTyxNLEVBQVEsVSxFQUFZO0FBQ3hCLGdCQUFJLE9BQU8sV0FBUyxNQUFULENBQVAsS0FBOEIsVUFBbEMsRUFBOEM7QUFDMUMsMkJBQVMsTUFBVCxFQUFtQixVQUFuQjtBQUNIO0FBQ0o7OztnQ0FFTyxVLEVBQVk7QUFDaEIsaUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsY0FBakIsRUFBaUMsVUFBakMsRUFBNkMsS0FBSyxPQUFsRDtBQUNIOzs7OEJBRUssVSxFQUFZO0FBQ2QsaUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsWUFBakIsRUFBK0IsVUFBL0IsRUFBMkMsS0FBSyxPQUFoRDtBQUNIOzs7OEJBRUssVSxFQUFZO0FBQ2QsaUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsZ0JBQWpCLEVBQW1DLFVBQW5DLEVBQStDLEtBQUssT0FBcEQ7QUFDSDs7OzhCQUVLLFUsRUFBWTtBQUNkLGlCQUFLLEdBQUwsQ0FBUyxPQUFULENBQWlCLFlBQWpCLEVBQStCLFVBQS9CLEVBQTJDLEtBQUssT0FBaEQ7QUFDSDs7O2dDQUVPLFUsRUFBWTtBQUNoQixpQkFBSyxHQUFMLENBQVMsT0FBVCxDQUFpQixjQUFqQixFQUFpQyxVQUFqQyxFQUE2QyxLQUFLLE9BQWxEO0FBQ0g7OztpQ0FFUSxVLEVBQVk7QUFDakIsaUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsZUFBakIsRUFBa0MsVUFBbEMsRUFBOEMsS0FBSyxPQUFuRDtBQUNIOzs7a0NBRVMsVSxFQUFZO0FBQ2xCLGlCQUFLLEdBQUwsQ0FBUyxPQUFULENBQWlCLGdCQUFqQixFQUFtQyxVQUFuQyxFQUErQyxLQUFLLE9BQXBEO0FBQ0g7OztpQ0FFUSxVLEVBQVk7QUFDakIsaUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsZUFBakIsRUFBa0MsVUFBbEMsRUFBOEMsS0FBSyxPQUFuRDtBQUNIOzs7K0JBRU0sVSxFQUFZO0FBQ2YsaUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsYUFBakIsRUFBZ0MsVUFBaEMsRUFBNEMsS0FBSyxPQUFqRDtBQUNIOzs7c0NBRWEsVSxFQUFZO0FBQ3RCLGlCQUFLLEdBQUwsQ0FBUyxPQUFULENBQWlCLG9CQUFqQixFQUF1QyxVQUF2QyxFQUFtRCxLQUFLLE9BQXhEO0FBQ0g7Ozt1Q0FFYyxJLEVBQU07QUFDakIsZ0JBQUksRUFBRSxJQUFGLEVBQVEsT0FBUixFQUFKLEVBQXVCO0FBQ25CLHVCQUFPLEtBQUssT0FBTCxDQUFhLElBQXBCO0FBQ0gsYUFGRCxNQUVPO0FBQ0gscUJBQUssT0FBTCxDQUFhLElBQWIsR0FBb0IsSUFBcEI7QUFDSDs7QUFFRCxtQkFBTyxJQUFQO0FBQ0g7Ozs2Q0FFb0IsZSxFQUFpQjtBQUNsQyxnQkFBSSxFQUFFLGVBQUYsRUFBbUIsT0FBbkIsRUFBSixFQUFrQztBQUM5Qix1QkFBTyxLQUFLLE9BQUwsQ0FBYSxlQUFwQjtBQUNILGFBRkQsTUFFTztBQUNILHFCQUFLLE9BQUwsQ0FBYSxlQUFiLEdBQStCLGVBQS9CO0FBQ0g7O0FBRUQsbUJBQU8sSUFBUDtBQUNIOzs7Ozs7cUJBNUVnQixZOzs7Ozs7Ozs7Ozs7O0lDQWYsVTs7Ozs7OztpQ0FDYyxLLEVBQU8sVyxFQUFhO0FBQ2hDLGdCQUFNLGlCQUFpQixPQUFPLGNBQTlCOztBQUVBLGdCQUFJLGVBQWUsU0FBZixDQUF5QixnQkFBekIsQ0FBSixFQUFnRDtBQUM1Qyx1QkFBTyxTQUFQO0FBQ0g7O0FBRUQsZ0JBQUksVUFBVSxNQUFNLEVBQXBCOztBQUVBLGdCQUFJLFdBQVcsZUFBZSxZQUFZLE9BQVosQ0FBb0IsT0FBcEIsQ0FBNEIsT0FBNUIsSUFBdUMsQ0FBQyxDQUF0RTtBQUNBLGdCQUFJLGdCQUNBLGVBQWUsWUFBWSxXQUFaLENBQXdCLE9BQXhCLENBQWdDLE9BQWhDLElBQTJDLENBQUMsQ0FEL0Q7QUFFQSxnQkFBSSxjQUNBLE1BQU0sV0FBTixJQUNDLGVBQWUsU0FBZixDQUF5QixVQUF6QixLQUNHLE1BQU0sdUJBQU4sR0FBZ0MsQ0FIeEM7O0FBS0EsZ0JBQ0ksaUJBQWlCLElBQWpCLENBQXNCLE9BQU8sUUFBUCxDQUFnQixJQUF0QyxLQUNBLE1BQU0sV0FETixJQUVBLGVBQWUsU0FBZixDQUF5QixlQUF6QixDQUhKLEVBSUU7QUFDRSxvQkFBSSxRQUFKLEVBQWM7QUFDViwyQkFBTyxXQUFQO0FBQ0gsaUJBRkQsTUFFTyxJQUNILE1BQU0sVUFBTixJQUFvQixDQUFwQixJQUNBLE1BQU0sV0FBTixJQUFxQixDQURyQixJQUVBLEVBQ0ksZUFBZSxTQUFmLENBQXlCLFVBQXpCLEtBQ0EsTUFBTSxrQkFGVixDQUhHLEVBT0w7QUFDRSwyQkFBTyxPQUFQO0FBQ0g7QUFDRCx1QkFBTyxjQUFQO0FBQ0g7O0FBRUQsZ0JBQUksYUFBSixFQUFtQjtBQUNmLHVCQUFPLFVBQVA7QUFDSDs7QUFFRCxnQkFBSSxZQUFZLENBQUMsV0FBakIsRUFBOEI7QUFDMUIsdUJBQU8sUUFBUDtBQUNIOztBQUVELGdCQUFJLFdBQUosRUFBaUI7QUFDYixvQkFBSSxNQUFNLElBQU4sQ0FBVyxFQUFYLEtBQWtCLGFBQXRCLEVBQXFDO0FBQ2pDLDJCQUFPLE1BQVA7QUFDSDs7QUFFRCx1QkFBTyxRQUFQO0FBQ0g7O0FBRUQsZ0JBQUksTUFBTSxVQUFOLElBQW9CLGVBQWUsU0FBZixDQUF5QixlQUF6QixDQUF4QixFQUFtRTtBQUMvRCx1QkFBTyxNQUFQO0FBQ0g7O0FBRUQsbUJBQU8sYUFBUDtBQUNIOzs7cUNBRW1CLEssRUFBTyxXLEVBQWE7QUFDcEMsbUJBQU8sZUFBZSxZQUFZLFVBQVosQ0FBdUIsT0FBdkIsQ0FBK0IsTUFBTSxFQUFyQyxJQUEyQyxDQUFDLENBQWxFO0FBQ0g7OzsyQ0FFeUIsSyxFQUFPLFcsRUFBYTtBQUMxQyxtQkFDSSxlQUFlLFlBQVksZ0JBQVosQ0FBNkIsT0FBN0IsQ0FBcUMsTUFBTSxFQUEzQyxJQUFpRCxDQUFDLENBRHJFO0FBR0g7OzttQ0FFaUIsSyxFQUFPLFcsRUFBYTtBQUNsQztBQUNBLG1CQUNLLGVBQ0csWUFBWSxXQURmLElBRUcsWUFBWSxXQUFaLENBQXdCLE1BQU0sRUFBOUIsQ0FGSixJQUdBLENBSko7QUFNSDs7Ozs7O3FCQUdVLFU7Ozs7Ozs7Ozs7O0FDbEZmOzs7O0FBQ0E7Ozs7Ozs7O0lBRU0sTTtBQUNGLG9CQUFZLEdBQVosRUFBaUI7QUFBQTs7QUFDYixhQUFLLEdBQUwsR0FBVyxHQUFYO0FBQ0g7Ozs7b0NBRVcsVSxFQUFZLE8sRUFBUztBQUFBOztBQUM3QixnQkFBSSxTQUFTLFNBQVQsTUFBUyxHQUFNO0FBQ2Ysb0JBQUksQ0FBQyxRQUFRLFNBQWIsRUFBd0I7QUFDcEIsK0JBQVcsR0FBWCxDQUFlLFlBQWYsRUFBNkIsU0FBN0I7QUFDSDs7QUFFRCxxQkFBSyxJQUFJLCtCQUFKLENBQXVCO0FBQ3hCLDJCQUFPLFVBRGlCO0FBRXhCLHlCQUFLLE1BQUssR0FGYztBQUd4QiwrQkFBVyxDQUFDLENBQUMsUUFBUSxTQUhHO0FBSXhCLDRCQUFRLGdCQUFDLEtBQUQsRUFBVztBQUNmLDhCQUFLLFdBQUwsQ0FBaUIsVUFBakIsRUFBNkIsT0FBN0IsRUFBc0MsTUFBdEMsQ0FBNkMsWUFBTTtBQUMvQyxrQ0FBTSxLQUFOO0FBQ0gseUJBRkQ7QUFHSCxxQkFSdUI7QUFTeEIsNkJBQVMsaUJBQUMsS0FBRCxFQUFXO0FBQ2hCLDhCQUFLLGNBQUwsQ0FBb0IsVUFBcEIsRUFBZ0MsRUFBaEMsRUFBb0MsRUFBcEMsRUFBd0MsS0FBeEM7QUFDSDtBQVh1QixpQkFBdkIsQ0FBTDtBQWFILGFBbEJEOztBQW9CQSxnQkFBSSxPQUFPLGNBQVAsQ0FBc0IsU0FBdEIsQ0FBZ0MsWUFBaEMsQ0FBSixFQUFtRDtBQUMvQyxvQkFBSSxXQUFXLFdBQVgsSUFBMEIsQ0FBQyxDQUFDLFFBQVEsU0FBeEMsRUFBbUQ7QUFDL0M7QUFDSCxpQkFGRCxNQUVPLElBQUksT0FBTyxTQUFQLENBQWlCLFNBQXJCLEVBQWdDO0FBQ25DLHdCQUFJLHlDQUFKLENBQWlDLFFBQWpDO0FBQ0g7QUFDSixhQU5ELE1BTU87QUFDSDtBQUNIO0FBQ0o7OztvQ0FFVyxVLEVBQVksTyxFQUFTO0FBQUE7O0FBQzdCLGlCQUFLLEdBQUwsQ0FBUyxPQUFULENBQWlCLG9CQUFqQixFQUF1QyxFQUFFLHNCQUFGLEVBQWMsZ0JBQWQsRUFBdkM7O0FBRDZCLDBCQUdKLE1BSEk7QUFBQSxnQkFHdkIsTUFIdUIsV0FHdkIsTUFIdUI7QUFBQSxnQkFHZixNQUhlLFdBR2YsTUFIZTs7O0FBSzdCLGdCQUFNLGdCQUFnQixXQUFXLEdBQVgsQ0FBZSxlQUFmLENBQXRCO0FBQ0EsbUJBQU8sRUFBRSxJQUFGLENBQ0gsT0FBTyxHQUFQLENBQVcsT0FBTyxNQUFQLENBQWMsV0FBekIsRUFBc0MsRUFBRSxTQUFTLFdBQVcsRUFBdEIsRUFBdEMsQ0FERyxFQUVIO0FBQ0ksK0JBQWUsY0FBYyxhQURqQztBQUVJLHVCQUFPLGNBQWMsS0FGekI7QUFHSSwwQkFBVSxVQUFVLE1BSHhCO0FBSUksc0NBQXNCLElBSjFCO0FBS0ksMkJBQVcsQ0FBQyxDQUFDLFFBQVEsU0FMekI7QUFNSSxvQ0FDSSxXQUFXLGtCQUFYLElBQWlDLENBQUMsUUFBUTtBQVBsRCxhQUZHLEVBWUYsSUFaRSxDQVlHLFVBQUMsUUFBRDtBQUFBLHVCQUNGLE9BQUssY0FBTCxDQUFvQixVQUFwQixFQUFnQyxRQUFoQyxFQUEwQyxPQUExQyxDQURFO0FBQUEsYUFaSCxFQWVGLElBZkUsQ0FlRyxVQUFDLEtBQUQsRUFBUSxVQUFSLEVBQW9CLFdBQXBCO0FBQUEsdUJBQ0YsT0FBSyxjQUFMLENBQW9CLFVBQXBCLEVBQWdDLEtBQWhDLEVBQXVDLFVBQXZDLEVBQW1ELFdBQW5ELENBREU7QUFBQSxhQWZILEVBa0JGLE1BbEJFLENBa0JLLFlBQU07QUFDVix1QkFBSyxHQUFMLENBQVMsT0FBVCxDQUFpQixrQkFBakIsRUFBcUMsVUFBckM7QUFDSCxhQXBCRSxDQUFQO0FBcUJIOzs7dUNBRWMsVSxFQUFZLFEsRUFBVSxPLEVBQVM7QUFDMUMsZ0JBQUksQ0FBQyxDQUFDLFFBQVEsU0FBZCxFQUF5QjtBQUNyQiwyQkFBVyxHQUFYLENBQWUsWUFBZixFQUE2QixTQUE3QjtBQUNILGFBRkQsTUFFTztBQUNILDJCQUFXLEdBQVgsQ0FBZSxZQUFmLEVBQTZCLFVBQTdCO0FBQ0g7O0FBRUQsaUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsc0JBQWpCLEVBQXlDO0FBQ3JDLHlCQUFTLFNBQVMsT0FEbUI7QUFFckMsc0JBQU0sUUFGK0I7QUFHckMsc0NBSHFDO0FBSXJDO0FBSnFDLGFBQXpDOztBQU9BLHVCQUFXLEdBQVgsQ0FBZSxhQUFmLEVBQThCLElBQTlCO0FBQ0g7Ozt1Q0FFYyxVLEVBQVksSyxFQUFPLFUsRUFBWSxXLEVBQWEsTyxFQUFTO0FBQ2hFLGdCQUFJLENBQUMsaUJBQWlCLElBQWpCLENBQXNCLE9BQU8sUUFBUCxDQUFnQixJQUF0QyxDQUFMLEVBQWtEO0FBQzlDLDJCQUFXLEdBQVgsQ0FBZSxZQUFmLEVBQTZCLFFBQTdCO0FBQ0g7O0FBRUQsaUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsbUJBQWpCLEVBQXNDO0FBQ2xDLDRCQURrQztBQUVsQyxzQ0FGa0M7QUFHbEMsd0NBSGtDO0FBSWxDLHNDQUprQztBQUtsQztBQUxrQyxhQUF0QztBQU9IOzs7Ozs7cUJBR1UsTTs7Ozs7Ozs7Ozs7QUNuR2Y7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7OztBQVJBLElBQUksU0FBUyxRQUFRLFFBQVIsQ0FBYjs7SUFVTSxhO0FBQ0YsMkJBQVksR0FBWixFQUFpQixjQUFqQixFQUFpQyxpQkFBakMsRUFBb0Q7QUFBQTs7QUFBQTs7QUFDaEQsYUFBSyxHQUFMLEdBQVcsR0FBWDtBQUNBLGFBQUssY0FBTCxHQUFzQixjQUF0QjtBQUNBLGFBQUssaUJBQUwsR0FBeUIsaUJBQXpCOztBQUVBLGFBQUssR0FBTCxDQUNLLEVBREwsQ0FDUSxzQkFEUixFQUNnQyxVQUFDLElBQUQ7QUFBQSxtQkFBVSxNQUFLLGFBQUwsQ0FBbUIsSUFBbkIsQ0FBVjtBQUFBLFNBRGhDLEVBRUssRUFGTCxDQUVRLG1CQUZSLEVBRTZCLFVBQUMsSUFBRDtBQUFBLG1CQUFVLE1BQUssVUFBTCxDQUFnQixJQUFoQixDQUFWO0FBQUEsU0FGN0IsRUFHSyxFQUhMLENBR1EsdUJBSFIsRUFHaUMsVUFBQyxJQUFEO0FBQUEsbUJBQ3pCLE1BQUssa0JBQUwsQ0FBd0IsS0FBSyxVQUE3QixDQUR5QjtBQUFBLFNBSGpDO0FBTUg7Ozs7c0NBRWEsSSxFQUFNO0FBQUE7O0FBQ2hCLGdCQUFNLE1BQU0sT0FBTyxJQUFQLENBQVksV0FBWixFQUF5QixFQUFFLEdBQUcsS0FBSyxPQUFWLEVBQXpCLENBQVo7QUFDQSxnQkFBTSxVQUFVLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLFlBQXpCLENBQWhCO0FBQ0EsZ0JBQU0sUUFBUSxPQUFPLElBQVAsQ0FBWSxPQUFaLENBQWQ7QUFDQSxnQkFBTSxZQUFZLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLElBQWQsQ0FBbUIsT0FBbkIsQ0FBMkIsTUFBdEMsQ0FBbEI7O0FBRUEsY0FBRSxJQUFGLENBQU8sU0FBUCxFQUFrQixJQUFsQixDQUF1QixVQUFDLE1BQUQsRUFBWTtBQUMvQixvQkFBSSxnQkFBZ0IsSUFBSSwwQkFBSixDQUFrQixPQUFPLElBQXpCLENBQXBCO0FBQ0Esb0JBQUksZUFBZSxPQUFLLGNBQUwsQ0FBb0IsU0FBcEIsQ0FDZix1QkFEZSxDQUFuQjtBQUdBLG9CQUFJLGVBQ0MsUUFBUSxHQUFSLENBQVksOEJBQVosS0FDRyxRQUFRLEdBQVIsQ0FBWSw4QkFBWixNQUFnRCxHQURwRCxJQUVDLE9BQUssaUJBQUwsSUFDRyxPQUFLLGlCQUFMLENBQXVCLEdBQXZCLENBQTJCLG1CQUEzQixDQUpSO0FBS0Esb0JBQUksUUFBUSxRQUFRLEdBQVIsQ0FBWSxXQUFaLE1BQTZCLFNBQXpDO0FBQ0Esb0JBQUksZ0JBQ0EsT0FBSyxjQUFMLENBQW9CLFNBQXBCLENBQThCLDBCQUE5QixLQUNBLEtBREEsSUFFQSxPQUFPLFNBQVAsQ0FDSSxPQUFPLE1BQVAsQ0FBYyxPQUFPLFNBQVAsQ0FBaUIsVUFBL0IsQ0FESixFQUVJLFFBRkosQ0FISjs7QUFRQSxvQkFBSSxPQUFPLElBQUksc0JBQUosQ0FDUCxLQUFLLElBREUsRUFFUCxZQUZPLEVBR1AsWUFITyxFQUlQLEtBSk8sRUFLUCxPQUFPLE1BQVAsQ0FBYyxHQUxQLEVBTVAsT0FBSyxjQUFMLENBQW9CLFNBQXBCLENBQThCLHNCQUE5QixDQU5PLEVBT1AsT0FBSyxjQUFMLENBQW9CLFNBQXBCLENBQ0kscUNBREosQ0FQTyxFQVVQLE9BQU8sU0FBUCxDQUFpQixnQkFWVixFQVdQLGFBWE8sRUFZUCxPQUFLLGNBQUwsQ0FBb0IsU0FBcEIsQ0FBOEIsdUJBQTlCLENBWk8sRUFhUCxPQUFLLGNBQUwsQ0FBb0IsU0FBcEIsQ0FBOEIsY0FBOUIsQ0FiTyxFQWNQLE9BQUssY0FBTCxDQUFvQixTQUFwQixDQUNJLGlDQURKLENBZE8sRUFpQlAsT0FBSyxjQUFMLENBQW9CLFNBQXBCLENBQThCLDBCQUE5QixDQWpCTyxDQUFYOztBQW9CQSxvQkFBSSxRQUFRLElBQUksa0NBQUosQ0FBMEI7QUFDbEMsMEJBQU0sSUFENEI7QUFFbEMsMkJBQU8sS0FBSyxVQUZzQjtBQUdsQyx5QkFBSyxPQUFLLEdBSHdCO0FBSWxDLG9DQUFnQixPQUFLLGNBSmE7QUFLbEMsdUNBQW1CLE9BQUssaUJBTFU7QUFNbEMsbUNBQWUsYUFObUI7QUFPbEMsK0JBQVcsQ0FBQyxDQUFDLEtBQUssT0FBTCxDQUFhLFNBUFE7QUFRbEMsZ0NBQVksS0FBSyxPQUFMLENBQWEsVUFBYixJQUEyQjtBQVJMLGlCQUExQixDQUFaO0FBVUEsc0JBQU0sTUFBTjtBQUNILGFBbEREO0FBbURIOzs7bUNBRVUsSSxFQUFNO0FBQ2IsZ0JBQU0sV0FBVyxLQUFLLEtBQUwsQ0FBVyxLQUFLLEtBQUwsQ0FBVyxZQUFYLElBQTJCLElBQXRDLENBQWpCO0FBQ0EsZ0JBQUksU0FBUyxTQUFULEtBQXVCLGdDQUEzQixFQUE2RDtBQUN6RCxxQkFBSyxHQUFMLENBQVMsT0FBVCxDQUFpQixtQkFBakI7QUFDSCxhQUZELE1BRU8sSUFBSSxTQUFTLGNBQWIsRUFBNkI7QUFDaEMscUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsc0JBQWpCLEVBQXlDO0FBQ3JDLHdDQUFrQixLQUFLLFVBQUwsQ0FBZ0I7QUFERyxpQkFBekM7QUFHSCxhQUpNLE1BSUEsSUFDSCxTQUFTLFNBQVQsS0FBdUIscUNBQXZCLElBQ0EsU0FBUyxTQUFULEtBQXVCLHdCQUZwQixFQUdMO0FBQ0UscUJBQUssa0JBQUwsQ0FBd0IsS0FBSyxVQUE3QjtBQUNILGFBTE0sTUFLQSxJQUFJLFNBQVMsU0FBVCxLQUF1QixxQkFBM0IsRUFBa0Q7QUFDckQscUJBQUssa0JBQUwsQ0FBd0IsS0FBSyxVQUE3QjtBQUNILGFBRk0sTUFFQSxJQUNILFNBQVMsU0FBVCxLQUF1QixlQUF2QixJQUNBLFNBQVMsU0FBVCxLQUF1QixxQkFGcEIsRUFHTDtBQUNFLHFCQUFLLGtCQUFMLENBQXdCLEtBQUssVUFBN0I7QUFDSCxhQUxNLE1BS0EsSUFDSCxTQUFTLFNBQVQsS0FBdUIsNkJBQXZCLElBQ0EsS0FBSyxjQUFMLENBQW9CLFNBQXBCLENBQThCLFVBQTlCLENBRkcsRUFHTDtBQUNFLHFCQUFLLGtCQUFMLENBQXdCLEtBQUssVUFBN0IsRUFBeUMsRUFBRSxZQUFZLElBQWQsRUFBekM7QUFDSCxhQUxNLE1BS0EsSUFDSCxTQUFTLFNBQVQsS0FBdUIsd0NBRHBCLEVBRUw7QUFDRSxvQkFBSSxPQUFPLFFBQVAsQ0FBZ0IsSUFBaEIsQ0FBcUIsS0FBckIsQ0FBMkIsU0FBM0IsTUFBMEMsSUFBOUMsRUFBb0Q7QUFDaEQsd0JBQUksT0FBSixFQUNJLFFBQVEsSUFBUixNQUFnQixPQUFPLElBQVAsQ0FBWSxlQUFaLENBQWhCLEVBQWdELE9BQWhEO0FBQ1AsaUJBSEQsTUFHTztBQUNILHlCQUFLLGtCQUFMLENBQXdCLEtBQUssVUFBN0I7QUFDSDtBQUNKLGFBVE0sTUFTQSxJQUFJLFNBQVMsU0FBVCxLQUF1Qiw4QkFBM0IsRUFBMkQ7QUFDOUQsb0JBQUkseUNBQUosQ0FBaUMsUUFBakM7QUFDQSxvQkFBSSxPQUFPLGNBQVAsQ0FBc0IsU0FBdEIsQ0FBZ0MsWUFBaEMsQ0FBSixFQUFtRDtBQUMvQyx5QkFBSyxVQUFMLENBQWdCLEdBQWhCLENBQW9CO0FBQ2hCLG9DQUFZLGFBREk7QUFFaEIseUNBQWlCLENBRkQ7QUFHaEIscUNBQWE7QUFIRyxxQkFBcEI7QUFLSDtBQUNKLGFBVE0sTUFTQSxJQUFJLFNBQVMsU0FBVCxLQUF1QixzQkFBM0IsRUFBbUQ7QUFDdEQsb0JBQUksWUFBSixDQUFVO0FBQ04sMkJBQU8sT0FBTyxJQUFQLENBQVksY0FBWixDQUREO0FBRU4scUNBQWUsT0FBTyxJQUFQLENBQVksb0JBQVosQ0FBZjtBQUZNLGlCQUFWO0FBSUgsYUFMTSxNQUtBO0FBQ0gscUJBQUssYUFBTCxDQUFtQixTQUFTLFNBQTVCLEVBQXVDLEtBQUssVUFBNUM7QUFDSDtBQUNKOzs7c0NBRWEsUyxFQUFXLFUsRUFBWTtBQUNqQyxnQkFBSSxPQUFPLEVBQVg7QUFDQSxnQkFBSSxXQUFXLEVBQWY7O0FBRUEsZ0JBQ0ksY0FBYyw2QkFBZCxJQUNBLGNBQWMsbUJBRmxCLEVBR0U7QUFDRSx1QkFBTyxPQUFPLEdBQVAsQ0FBVyxPQUFPLE1BQVAsQ0FBYyxZQUF6QixDQUFQO0FBQ0EsMkJBQVcsT0FBTyxJQUFQLENBQVksT0FBWixDQUFYO0FBQ0gsYUFORCxNQU1PLElBQ0gsY0FBYyw2QkFBZCxJQUNBLGNBQWMsK0JBRlgsRUFHTDtBQUNFLHVCQUFPLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLGNBQXpCLENBQVA7QUFDQSwyQkFBVyxPQUFPLElBQVAsQ0FBWSxzQkFBWixDQUFYO0FBQ0g7O0FBRUQsZ0JBQUksT0FBSixFQUFhO0FBQ1Qsb0JBQU0sa0NBQWdDLElBQWhDLHVCQUFzRCxRQUF0RCxTQUFOO0FBQ0Esb0JBQ0ksY0FBYyw2QkFBZCxJQUNBLEtBQUssY0FBTCxDQUFvQixTQUFwQixDQUE4QixnQkFBOUIsQ0FEQSxJQUVBLFdBQVcsR0FBWCxDQUFlLGtCQUFmLE1BQXVDLENBSDNDLEVBSUU7QUFDRSw0QkFBUSxJQUFSLE1BQ08sT0FBTyxJQUFQLDhCQUF5QyxFQUFFLFVBQUYsRUFBekMsQ0FEUCxFQUVJLE9BRko7QUFJSCxpQkFURCxNQVNPO0FBQ0gsNEJBQVEsSUFBUixjQUNlLE9BQU8sSUFBUCxDQUNQLGNBRE8sQ0FEZixrQkFHa0IsT0FBTyxJQUFQLFlBQXFCLFNBQXJCLEVBQWtDLEVBQUUsVUFBRixFQUFsQyxDQUhsQixFQUlJLE9BSko7QUFNSDtBQUNKO0FBQ0o7OzsyQ0FFa0IsVSxFQUEwQjtBQUFBLGdCQUFkLE9BQWMsdUVBQUosRUFBSTs7QUFDekM7QUFDQTtBQUNBLGdCQUFJLENBQUMsV0FBVyxZQUFoQixFQUE4QjtBQUMxQixvQkFBSSxpQ0FBSixDQUF5QixVQUF6QixFQUFxQyxPQUFyQztBQUNBLDJCQUFXLEdBQVgsQ0FBZTtBQUNYLGdDQUFZLFdBQVcsR0FBWCxDQUFlLFVBQWYsSUFDTixRQURNLEdBRU4sYUFISztBQUlYLHFDQUFpQixDQUpOO0FBS1gsaUNBQWE7QUFMRixpQkFBZjtBQU9ILGFBVEQsTUFTTztBQUNILG9CQUFJLGlCQUFpQixpQkFBaUIsSUFBakIsQ0FBc0IsT0FBTyxRQUFQLENBQWdCLElBQXRDLENBQXJCO0FBQ0EsMkJBQVcsR0FBWCxDQUFlO0FBQ1gsZ0NBQVksaUJBQWlCLGNBQWpCLEdBQWtDLE1BRG5DO0FBRVgscUNBQWlCLENBRk47QUFHWCxpQ0FBYTtBQUhGLGlCQUFmO0FBS0Esb0JBQUksOEJBQUosQ0FBc0IsS0FBSyxHQUEzQixFQUFnQyxVQUFoQyxFQUE0QyxPQUE1QztBQUNIO0FBQ0o7Ozs7OztxQkFHVSxhOzs7Ozs7Ozs7Ozs7Ozs7OztjQ3hNRSxNO0lBQVQsSSxXQUFBLEk7O0lBRWEsZ0I7Ozs7Ozs7Ozs7OzRCQUNFO0FBQ2YsZ0JBQU0sZ0JBQWdCLEtBQUssR0FBTCxDQUFTLFdBQVQsRUFBc0IsR0FBdEIsQ0FDbEIsVUFBQyxRQUFEO0FBQUEsdUJBQWMsU0FBUyxFQUFULElBQWUsU0FBUyxFQUFULENBQVksS0FBWixDQUFrQixHQUFsQixFQUF1QixDQUF2QixDQUE3QjtBQUFBLGFBRGtCLENBQXRCO0FBR0EsZ0JBQU0sZUFBZSxjQUFjLEdBQWQsQ0FDakIsVUFBQyxJQUFEO0FBQUEsdUJBQVUsUUFBUSx5QkFBdUIsSUFBdkIsQ0FBbEI7QUFBQSxhQURpQixDQUFyQjtBQUdBLG1CQUFPLEtBQUssNkJBQUwsRUFBb0M7QUFDdkMsMEJBQVUsYUFBYSxJQUFiLENBQWtCLElBQWxCO0FBRDZCLGFBQXBDLENBQVA7QUFHSDs7OzRCQUVvQjtBQUNqQixvQkFBUSxLQUFLLEdBQUwsQ0FBUyxRQUFULENBQVI7QUFDSSxxQkFBSyxRQUFMO0FBQ0ksMkJBQU8sS0FBSyxvQ0FBTCxDQUFQO0FBQ0oscUJBQUssTUFBTDtBQUNJLDJCQUFPLEtBQUssa0NBQUwsQ0FBUDtBQUNKLHFCQUFLLE1BQUw7QUFDSSwyQkFBTyxLQUFLLGtDQUFMLENBQVA7QUFDSixxQkFBSyxTQUFMO0FBQ0ksMkJBQU8sS0FBSyxxQ0FBTCxDQUFQO0FBQ0o7QUFDSSwyQkFBTyxFQUFQO0FBVlI7QUFZSDs7OzRCQUVnQjtBQUNiLG9CQUFRLEtBQUssR0FBTCxDQUFTLFFBQVQsQ0FBUjtBQUNJLHFCQUFLLFFBQUw7QUFDSSwyQkFBTyxLQUFLLFFBQUwsQ0FBUDtBQUNKLHFCQUFLLE1BQUw7QUFDSSwyQkFBTyxLQUFLLFdBQUwsQ0FBUDtBQUNKLHFCQUFLLE1BQUw7QUFDSSwyQkFBTyxLQUFLLGVBQUwsQ0FBUDtBQUNKLHFCQUFLLFNBQUw7QUFDSSwyQkFBTyxLQUFLLG9CQUFMLENBQVA7QUFDSjtBQUNJLDJCQUFPLEtBQUssU0FBTCxDQUFQO0FBVlI7QUFZSDs7OztFQXpDeUMsU0FBUyxLOztxQkFBbEMsZ0I7Ozs7Ozs7OztxQkNGTjtBQUFBLFFBQUUsWUFBRixRQUFFLFlBQUY7QUFBQSxRQUFnQixjQUFoQixRQUFnQixjQUFoQjtBQUFBLFFBQWdDLFVBQWhDLFFBQWdDLFVBQWhDO0FBQUEsMERBRUwsWUFGSyxTQUVXLGNBRlgsMktBSTJILE9BQU8sSUFBUCxDQUFZLFVBQVosQ0FKM0gscU1BUWdHLFVBUmhHLHNIQVNrRixPQUFPLElBQVAsQ0FBWSxRQUFaLENBVGxGO0FBQUEsQzs7Ozs7Ozs7O0FDQWY7O0FBQ0E7Ozs7Ozs7Ozs7OztJQUVxQixxQjs7O0FBQ2pCLHlDQUFxQjtBQUFBLFlBQVIsS0FBUSxRQUFSLEtBQVE7O0FBQUE7O0FBQ2pCLFlBQU0sZ0JBQWdCO0FBQ2xCLHFCQUFTLENBQUMsdUJBQUQsQ0FEUztBQUVsQixtQkFBTyxPQUFPLElBQVAsQ0FBWSx1Q0FBWixDQUZXO0FBR2xCLHFCQUFTLHdDQUE4QjtBQUNuQyw4QkFBYyxNQUFNLFlBRGU7QUFFbkMsZ0NBQWdCLE1BQU0sY0FGYTtBQUduQyw0QkFBWSxNQUFNO0FBSGlCLGFBQTlCO0FBSFMsU0FBdEI7QUFEaUIsNklBVVgsYUFWVztBQVdwQjs7O0VBWjhDLFk7O3FCQUE5QixxQjs7Ozs7Ozs7Ozs7QUNIckI7Ozs7Ozs7O0lBRU0sYztBQUNGLDRCQUFZLEdBQVosRUFBaUI7QUFBQTs7QUFDYixhQUFLLEdBQUwsR0FBVyxHQUFYO0FBQ0g7Ozs7MENBRWlCO0FBQUE7O0FBQ2QsaUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsK0JBQWpCOztBQUVBLG1CQUFPLEVBQUUsSUFBRixDQUFPLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLElBQWQsQ0FBbUIsY0FBbkIsQ0FBa0MsS0FBN0MsQ0FBUCxFQUNGLElBREUsQ0FDRztBQUFBOztBQUFBLGtEQUFJLE1BQUo7QUFBSSwwQkFBSjtBQUFBOztBQUFBLHVCQUFpQixjQUFLLEdBQUwsRUFBUyxPQUFULGNBQWlCLGlDQUFqQixTQUF1RCxNQUF2RCxFQUFqQjtBQUFBLGFBREgsRUFFRixJQUZFLENBRUc7QUFBQTs7QUFBQSxtREFBSSxNQUFKO0FBQUksMEJBQUo7QUFBQTs7QUFBQSx1QkFBaUIsZUFBSyxHQUFMLEVBQVMsT0FBVCxlQUFpQiw4QkFBakIsU0FBb0QsTUFBcEQsRUFBakI7QUFBQSxhQUZILEVBR0YsTUFIRSxDQUdLO0FBQUEsdUJBQWUsTUFBSyxHQUFMLENBQVMsT0FBVCxDQUFpQiw2QkFBakIsQ0FBZjtBQUFBLGFBSEwsQ0FBUDtBQUlIOzs7NkNBRW9CLFUsRUFBWSxPLEVBQVM7QUFBQTs7QUFDdEMsZ0JBQUksU0FBUyxXQUFXLEdBQVgsQ0FBZSxhQUFmLElBQWdDLFFBQWhDLEdBQTJDLEtBQXhEOztBQUVBLGlCQUFLLEdBQUwsQ0FBUyxPQUFULENBQWlCLHFCQUFqQixFQUF3QyxFQUFFLHNCQUFGLEVBQWMsY0FBZCxFQUF4Qzs7QUFFQSxnQkFBSSxXQUFXLElBQUksT0FBSixDQUFZLFVBQUMsT0FBRCxFQUFVLE1BQVYsRUFBcUI7QUFDNUMsb0JBQUksV0FBVyxRQUFmLEVBQXlCO0FBQ3JCLHdCQUFJLCtCQUFKLENBQXVCO0FBQ25CLDZCQUFRLE9BQUssR0FETTtBQUVuQiwrQkFBUSxVQUZXO0FBR25CLGdDQUFRLGtCQUFNO0FBQ1YsbUNBQUssa0JBQUwsQ0FBd0IsVUFBeEIsRUFBb0MsT0FBcEMsRUFBNkMsSUFBN0MsQ0FBa0QsT0FBbEQsRUFBMkQsSUFBM0QsQ0FBZ0UsTUFBaEU7QUFDSDtBQUxrQixxQkFBdkI7QUFPSCxpQkFSRCxNQVFPO0FBQ0gsMkJBQUssZUFBTCxDQUFxQixVQUFyQixFQUFpQyxPQUFqQyxFQUEwQyxJQUExQyxDQUErQyxPQUEvQyxFQUF3RCxJQUF4RCxDQUE2RCxNQUE3RDtBQUNIO0FBQ0osYUFaYyxDQUFmOztBQWNBLG1CQUFPLFNBQ0YsSUFERSxDQUNHO0FBQUE7O0FBQUEsbURBQUksTUFBSjtBQUFJLDBCQUFKO0FBQUE7O0FBQUEsdUJBQWlCLGdCQUFLLEdBQUwsRUFBUyxPQUFULGVBQWlCLHVCQUFqQixFQUE2QyxFQUFFLHNCQUFGLEVBQWMsY0FBZCxFQUFzQixnQkFBdEIsRUFBN0MsU0FBaUYsTUFBakYsRUFBakI7QUFBQSxhQURILFdBRUk7QUFBQTs7QUFBQSxtREFBSSxNQUFKO0FBQUksMEJBQUo7QUFBQTs7QUFBQSx1QkFBZ0IsZ0JBQUssR0FBTCxFQUFTLE9BQVQsZUFBaUIsb0JBQWpCLEVBQTZDLEVBQUUsc0JBQUYsRUFBYyxjQUFkLEVBQXNCLGdCQUF0QixFQUE3QyxTQUFpRixNQUFqRixFQUFoQjtBQUFBLGFBRkosRUFHRixJQUhFLENBR0c7QUFBQSx1QkFBaUIsT0FBSyxHQUFMLENBQVMsT0FBVCxDQUFpQixtQkFBakIsRUFBNkMsRUFBRSxzQkFBRixFQUFjLGNBQWQsRUFBc0IsZ0JBQXRCLEVBQTdDLENBQWpCO0FBQUEsYUFISCxDQUFQO0FBSUg7Ozt3Q0FFZSxVLEVBQVksTyxFQUFTO0FBQUE7O0FBQ2pDLGlCQUFLLEdBQUwsQ0FBUyxPQUFULENBQWlCLHlCQUFqQixFQUE0QyxFQUFFLHNCQUFGLEVBQWMsZ0JBQWQsRUFBNUM7O0FBRUEsZ0JBQUksV0FBVyxFQUFFLElBQUYsQ0FBTztBQUNsQixxQkFBSyxPQUFPLEdBQVAsQ0FBVyxPQUFPLE1BQVAsQ0FBYyxJQUFkLENBQW1CLGNBQW5CLENBQWtDLEtBQTdDLEVBQW9ELEVBQUMsSUFBSSxXQUFXLEdBQVgsQ0FBZSxJQUFmLENBQUwsRUFBcEQsQ0FEYTtBQUVsQixzQkFBTTtBQUZZLGFBQVAsQ0FBZjs7QUFLQSxxQkFDSyxJQURMLENBQ1UsWUFBTTtBQUNSLDJCQUFXLEdBQVgsQ0FBZSxhQUFmLEVBQThCLENBQUMsV0FBVyxHQUFYLENBQWUsYUFBZixDQUEvQjtBQUNBLHVCQUFLLEdBQUwsQ0FBUyxPQUFULENBQWlCLDJCQUFqQixFQUE4QyxFQUFFLHNCQUFGLEVBQWMsZ0JBQWQsRUFBOUM7QUFDSCxhQUpMLEVBS0ssSUFMTCxDQUtVO0FBQUE7O0FBQUEsbURBQUksTUFBSjtBQUFJLDBCQUFKO0FBQUE7O0FBQUEsdUJBQWUsZ0JBQUssR0FBTCxFQUFTLE9BQVQsZUFBaUIsd0JBQWpCLEVBQTJDLEVBQUUsc0JBQUYsRUFBYyxnQkFBZCxFQUEzQyxTQUF1RSxNQUF2RSxFQUFmO0FBQUEsYUFMVixFQU1LLE1BTkwsQ0FNWTtBQUFBLHVCQUFNLE9BQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsdUJBQWpCLEVBQTBDLEVBQUUsc0JBQUYsRUFBYyxnQkFBZCxFQUExQyxDQUFOO0FBQUEsYUFOWjs7QUFRQSxtQkFBTyxRQUFQO0FBQ0g7OzsyQ0FFa0IsVSxFQUFZLE8sRUFBUztBQUFBOztBQUNwQyxpQkFBSyxHQUFMLENBQVMsT0FBVCxDQUFpQiw0QkFBakIsRUFBK0MsRUFBRSxzQkFBRixFQUFjLGdCQUFkLEVBQS9DOztBQUVBLGdCQUFJLFdBQVcsRUFBRSxJQUFGLENBQU87QUFDbEIscUJBQUssT0FBTyxHQUFQLENBQVcsT0FBTyxNQUFQLENBQWMsSUFBZCxDQUFtQixjQUFuQixDQUFrQyxLQUE3QyxFQUFvRCxFQUFDLElBQUksV0FBVyxHQUFYLENBQWUsSUFBZixDQUFMLEVBQXBELENBRGE7QUFFbEIsc0JBQU07QUFGWSxhQUFQLENBQWY7O0FBS0EscUJBQ0ssSUFETCxDQUNVLFlBQU07QUFDUiwyQkFBVyxHQUFYLENBQWUsYUFBZixFQUE4QixDQUFDLFdBQVcsR0FBWCxDQUFlLGFBQWYsQ0FBL0I7QUFDQSx1QkFBSyxHQUFMLENBQVMsT0FBVCxDQUFpQiw4QkFBakIsRUFBaUQsRUFBRSxzQkFBRixFQUFjLGdCQUFkLEVBQWpEO0FBQ0gsYUFKTCxFQUtLLElBTEwsQ0FLVTtBQUFBOztBQUFBLG1EQUFJLE1BQUo7QUFBSSwwQkFBSjtBQUFBOztBQUFBLHVCQUFlLGdCQUFLLEdBQUwsRUFBUyxPQUFULGVBQWlCLDJCQUFqQixFQUE4QyxFQUFFLHNCQUFGLEVBQWMsZ0JBQWQsRUFBOUMsU0FBMEUsTUFBMUUsRUFBZjtBQUFBLGFBTFYsRUFNSyxNQU5MLENBTVk7QUFBQSx1QkFBTSxPQUFLLEdBQUwsQ0FBUyxPQUFULENBQWlCLDBCQUFqQixFQUE2QyxFQUFFLHNCQUFGLEVBQWMsZ0JBQWQsRUFBN0MsQ0FBTjtBQUFBLGFBTlo7O0FBUUEsbUJBQU8sUUFBUDtBQUNIOzs7Ozs7cUJBR1UsYzs7Ozs7Ozs7Ozs7QUNoRmY7Ozs7Ozs7O0lBRXFCLHFCO0FBQ2pCLG1DQUFZLEdBQVosRUFBaUI7QUFBQTs7QUFBQTs7QUFDYixhQUFLLEdBQUwsR0FBVyxHQUFYOztBQUVBLGFBQUssR0FBTCxDQUNLLEVBREwsQ0FDUSxpQ0FEUixFQUM0QztBQUFBLG1CQUFlLE1BQUssd0JBQUwsd0JBQWY7QUFBQSxTQUQ1QyxFQUVLLEVBRkwsQ0FFUSxvQkFGUixFQUU0QztBQUFBLG1CQUFlLE1BQUssY0FBTCx3QkFBZjtBQUFBLFNBRjVDO0FBSUg7Ozs7aURBRXdCLEksRUFBTTtBQUMzQixnQkFBSSx5Q0FBSixDQUE2QixLQUFLLGtCQUFsQyxFQUFzRCxLQUFLLG9CQUEzRDtBQUNIOzs7NkNBRThCLEssRUFBTyxVLEVBQVksVyxFQUFhO0FBQUEsZ0JBQTlDLFVBQThDLFFBQTlDLFVBQThDOztBQUMzRCxnQkFBSSxXQUFXLEtBQUssS0FBTCxDQUFXLE1BQU0sWUFBTixJQUFzQixJQUFqQyxDQUFmOztBQUVBLGdCQUFJLFNBQVMsY0FBYixFQUE2QjtBQUN6QixxQkFBSyxHQUFMLENBQVMsT0FBVCxDQUFpQixzQkFBakI7QUFDSCxhQUZELE1BRU8sSUFBSSxPQUFKLEVBQWE7QUFDaEIsd0JBQVEsSUFBUixDQUFhLE9BQU8sSUFBUCxDQUFZLHdCQUFaLENBQWIsRUFBb0QsT0FBcEQ7QUFDSDtBQUNKOzs7Ozs7cUJBdEJnQixxQjs7Ozs7Ozs7Ozs7QUNGckI7Ozs7Ozs7O0lBRXFCLEk7QUFDakIsa0JBQVksR0FBWixFQUFpQixJQUFqQixFQUF1QjtBQUFBOztBQUNuQixhQUFLLEdBQUwsR0FBVyxHQUFYO0FBQ0EsYUFBSyxJQUFMLEdBQVksSUFBWjtBQUNIOzs7O2tDQUVTLFUsRUFBWSxPLEVBQVM7QUFBQTs7QUFDM0IsZ0JBQ0ksT0FBTyxjQUFQLENBQXNCLFNBQXRCLENBQWdDLFlBQWhDLEtBQ0EsT0FBTyxTQUFQLENBQWlCLFNBRGpCLEtBRUMsQ0FBQyxPQUFPLGNBQVAsQ0FBc0IsU0FBdEIsQ0FBZ0MsZUFBaEMsQ0FBRCxJQUNHLENBQUMsV0FBVyxHQUFYLENBQWUsWUFBZixDQUhMLENBREosRUFLRTtBQUNFLG9CQUFJLHlDQUFKLENBQWlDLE1BQWpDO0FBQ0gsYUFQRCxNQU9PLElBQUksS0FBSyxJQUFMLENBQVUsa0JBQVYsQ0FBNkIsTUFBakMsRUFBeUM7QUFDNUM7QUFDQSxxQkFBSyxTQUFMLENBQWUsVUFBZixFQUEyQixPQUEzQjtBQUNILGFBSE0sTUFHQTtBQUNILHFCQUFLLElBQUwsQ0FBVSxNQUFWLENBQWlCLElBQWpCLENBQXNCLFlBQU07QUFDeEIsd0JBQUksTUFBSyxJQUFMLENBQVUsa0JBQVYsQ0FBNkIsTUFBakMsRUFBeUM7QUFDckMsOEJBQUssU0FBTCxDQUFlLFVBQWYsRUFBMkIsT0FBM0I7QUFDSCxxQkFGRCxNQUVPO0FBQ0gsOEJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsMEJBQWpCLEVBQTZDO0FBQ3pDLGtEQUR5QztBQUV6QztBQUZ5Qyx5QkFBN0M7QUFJSDtBQUNKLGlCQVREO0FBVUg7QUFDSjs7O21DQUVVLFUsRUFBWSxPLEVBQVM7QUFBQTs7QUFDNUIsbUJBQU8sRUFBRSxJQUFGLENBQU87QUFDVixzQkFBTSxRQURJO0FBRVYscUJBQUssT0FBTyxHQUFQLENBQVcsT0FBTyxNQUFQLENBQWMsZUFBekIsRUFBMEM7QUFDM0MsNkJBQVMsV0FBVztBQUR1QixpQkFBMUM7QUFGSyxhQUFQLEVBTUYsSUFORSxDQU1HLFVBQUMsUUFBRCxFQUFjO0FBQ2hCLDJCQUFXLEdBQVgsQ0FBZSxZQUFmLEVBQTZCLE1BQTdCO0FBQ0EsdUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsMkJBQWpCLEVBQThDO0FBQzFDLDBDQUQwQztBQUUxQztBQUYwQyxpQkFBOUM7QUFJSCxhQVpFLEVBYUYsSUFiRSxDQWFHLFVBQUMsS0FBRCxFQUFRLFVBQVIsRUFBb0IsV0FBcEIsRUFBb0M7QUFDdEMsMkJBQVcsR0FBWCxDQUFlLFlBQWYsRUFBNkIsUUFBN0I7QUFDQSx1QkFBSyxHQUFMLENBQVMsT0FBVCxDQUFpQix3QkFBakIsRUFBMkM7QUFDdkMsZ0NBRHVDO0FBRXZDLDBDQUZ1QztBQUd2Qyw0Q0FIdUM7QUFJdkMsMENBSnVDO0FBS3ZDO0FBTHVDLGlCQUEzQztBQU9ILGFBdEJFLEVBdUJGLFFBdkJFLENBdUJPLFlBQU07QUFDWix1QkFBSyxHQUFMLENBQVMsT0FBVCxDQUFpQix1QkFBakIsRUFBMEM7QUFDdEMsMENBRHNDO0FBRXRDO0FBRnNDLGlCQUExQztBQUlILGFBNUJFLENBQVA7QUE2Qkg7OztrQ0FFUyxVLEVBQVksTyxFQUFTO0FBQUE7O0FBQzNCLGlCQUFLLEdBQUwsQ0FBUyxPQUFULENBQWlCLGtCQUFqQixFQUFxQztBQUNqQyxzQ0FEaUM7QUFFakMsdUJBQU8sS0FBSyxJQUFMLENBQVUsa0JBRmdCO0FBR2pDO0FBSGlDLGFBQXJDOztBQU1BLGdCQUFJLENBQUMsUUFBUSxjQUFiLEVBQTZCO0FBQ3pCLDJCQUFXLEdBQVgsQ0FBZSxZQUFmLEVBQTZCLFNBQTdCO0FBQ0g7O0FBVDBCLDBCQVdGLE1BWEU7QUFBQSxnQkFXckIsTUFYcUIsV0FXckIsTUFYcUI7QUFBQSxnQkFXYixNQVhhLFdBV2IsTUFYYTs7O0FBYTNCLG1CQUFPLEVBQUUsSUFBRixDQUFPO0FBQ1YscUJBQUssT0FBTyxHQUFQLENBQVcsT0FBTyxNQUFQLENBQWMsY0FBekIsQ0FESztBQUVWLHNCQUFNLE1BRkk7QUFHVixzQkFBTTtBQUNGLDZCQUFTLFdBQVcsRUFEbEI7QUFFRiwyQkFBTyxLQUFLLElBQUwsQ0FBVSxrQkFGZjtBQUdGLDhCQUFVLFVBQVUsTUFIbEI7QUFJRixrQ0FDSSxPQUFPLGNBQVAsQ0FBc0Isb0JBQXRCLEtBQ0EsT0FBTyxPQUFQLENBQWUsR0FBZixDQUFtQixvQkFBbkIsQ0FEQSxJQUVBLEVBQUUsTUFBRixFQUFVLElBQVYsQ0FBZSxNQUFmLENBRkEsSUFHQTtBQVJGO0FBSEksYUFBUCxFQWNGLElBZEUsQ0FjRyxVQUFDLFFBQUQsRUFBYztBQUNoQixvQkFBSSxpQkFDQSxDQUFDLENBQUMsUUFBUSxjQUFWLElBQ0EsaUJBQWlCLElBQWpCLENBQXNCLE9BQU8sUUFBUCxDQUFnQixJQUF0QyxDQUZKO0FBR0EsMkJBQVcsR0FBWCxDQUNJLFlBREosRUFFSSxpQkFBaUIsV0FBakIsR0FBK0IsUUFGbkM7QUFJQSx1QkFBSyxHQUFMLENBQVMsT0FBVCxDQUFpQixvQkFBakIsRUFBdUMsRUFBRSxzQkFBRixFQUFjLGdCQUFkLEVBQXZDO0FBQ0gsYUF2QkUsRUF3QkYsSUF4QkUsQ0F3QkcsVUFBQyxLQUFELEVBQVEsVUFBUixFQUFvQixXQUFwQixFQUFvQztBQUN0QyxvQkFBSSxDQUFDLFFBQVEsY0FBYixFQUE2QjtBQUN6QiwrQkFBVyxHQUFYLENBQWUsWUFBZixFQUE2QixNQUE3QjtBQUNIO0FBQ0QsdUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsaUJBQWpCLEVBQW9DO0FBQ2hDLGdDQURnQztBQUVoQywwQ0FGZ0M7QUFHaEMsNENBSGdDO0FBSWhDLDBDQUpnQztBQUtoQztBQUxnQyxpQkFBcEM7QUFPSCxhQW5DRSxFQW9DRixRQXBDRSxDQW9DTyxZQUFNO0FBQ1osdUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsZ0JBQWpCLEVBQW1DLEVBQUUsc0JBQUYsRUFBYyxnQkFBZCxFQUFuQztBQUNILGFBdENFLENBQVA7QUF1Q0g7Ozs7OztxQkFuSGdCLEk7Ozs7Ozs7Ozs7O0FDRnJCOzs7O0FBQ0E7Ozs7QUFDQTs7Ozs7Ozs7SUFFcUIsVztBQUNqQix5QkFBWSxHQUFaLEVBQWlCO0FBQUE7O0FBQUE7O0FBQ2IsYUFBSyxHQUFMLEdBQVcsR0FBWDs7QUFFQSxhQUFLLEdBQUwsQ0FDSyxFQURMLENBQ1Esb0JBRFIsRUFDb0MsVUFBQyxJQUFEO0FBQUEsbUJBQVUsTUFBSyxXQUFMLENBQWlCLElBQWpCLENBQVY7QUFBQSxTQURwQyxFQUVLLEVBRkwsQ0FFUSxpQkFGUixFQUVvQyxVQUFDLElBQUQ7QUFBQSxtQkFBVSxNQUFLLFFBQUwsQ0FBYyxJQUFkLENBQVY7QUFBQSxTQUZwQyxFQUdLLEVBSEwsQ0FHUSwwQkFIUixFQUdvQyxVQUFDLElBQUQ7QUFBQSxtQkFBVSxNQUFLLGNBQUwsQ0FBb0IsSUFBcEIsQ0FBVjtBQUFBLFNBSHBDLEVBSUssRUFKTCxDQUlRLHFCQUpSLEVBSW9DLFVBQUMsSUFBRDtBQUFBLG1CQUFVLE1BQUssa0JBQUwsQ0FBd0IsS0FBSyxVQUE3QixDQUFWO0FBQUEsU0FKcEMsRUFLSyxFQUxMLENBS1Esd0JBTFIsRUFLb0MsVUFBQyxJQUFEO0FBQUEsbUJBQVUsTUFBSyxjQUFMLENBQW9CLElBQXBCLENBQVY7QUFBQSxTQUxwQzs7QUFPQSxhQUFLLGNBQUwsR0FBdUIsT0FBTyxjQUE5QjtBQUNIOzs7O29DQUVXLEksRUFBTTtBQUFBOztBQUNkLG1CQUFPLElBQVAsQ0FBWSxPQUFaLENBQW9CLEtBQUssVUFBTCxDQUFnQixHQUFoQixDQUFvQixJQUFwQixDQUFwQixFQUErQyxJQUEvQyxDQUFvRCxVQUFDLFFBQUQsRUFBYztBQUM5RCxxQkFBSyxVQUFMLENBQWdCLEdBQWhCLENBQW9CO0FBQ2hCLGdDQUFZLFNBQVMsVUFETDtBQUVoQixnQ0FBWSxTQUFTLFVBRkw7QUFHaEIsc0NBQWtCLFNBQVM7QUFIWCxpQkFBcEI7QUFLQSxvQkFBSSw2QkFBSixDQUFxQixFQUFDLEtBQUksT0FBSyxHQUFWO0FBQ2pCLGdDQUFZLEtBQUssVUFEQTtBQUVqQiwyQkFBTyxPQUFPLElBQVAsQ0FBWSxrQkFGRjtBQUdqQix5Q0FBcUIsT0FBTyxjQUFQLENBQXNCLHVCQUF0QixNQUFtRCxDQUh2RCxFQUFyQjtBQUlILGFBVkQ7QUFXSDs7O3VDQUUrQjtBQUFBLGdCQUFyQixLQUFxQixRQUFyQixLQUFxQjtBQUFBLGdCQUFkLFVBQWMsUUFBZCxVQUFjOztBQUM1QixnQkFBTSxXQUFXLEtBQUssS0FBTCxDQUFXLE1BQU0sWUFBakIsQ0FBakI7O0FBRUEsZ0JBQUksU0FBUyxTQUFULEtBQXVCLGdDQUEzQixFQUE2RDtBQUN6RCxxQkFBSyxHQUFMLENBQVMsT0FBVCxDQUFpQixtQkFBakI7QUFDSCxhQUZELE1BRU8sSUFBSSxTQUFTLGNBQWIsRUFBNkI7QUFDaEMscUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsc0JBQWpCLEVBQXlDLEVBQUUsa0JBQWdCLFdBQVcsRUFBN0IsRUFBekM7QUFDSCxhQUZNLE1BRUEsSUFBSSxTQUFTLFNBQVQsS0FBdUIsbUJBQXZCLElBQThDLFNBQVMsU0FBVCxLQUF1Qix5QkFBekUsRUFBb0c7QUFDdkcsb0JBQUksa0NBQWdDLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLFlBQXpCLENBQWhDLHVCQUF3RixPQUFPLElBQVAsQ0FBWSxPQUFaLENBQXhGLFNBQUo7QUFDQSxxQkFBSyxXQUFMLENBQWlCLElBQWpCLEVBQXVCLFNBQVMsU0FBaEM7QUFDSCxhQUhNLE1BR0EsSUFBSSxTQUFTLFNBQVQsS0FBdUIsK0JBQXZCLElBQTBELFNBQVMsU0FBVCxLQUF1Qix3QkFBckYsRUFBK0c7QUFDbEgsb0JBQUksbUNBQWdDLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLGNBQXpCLENBQWhDLHVCQUEwRixPQUFPLElBQVAsQ0FBWSxzQkFBWixDQUExRixTQUFKO0FBQ0EscUJBQUssV0FBTCxDQUFpQixLQUFqQixFQUF1QixTQUFTLFNBQWhDO0FBQ0gsYUFITSxNQUdBLElBQUksU0FBUyxTQUFULEtBQXVCLDBCQUEzQixFQUFzRDtBQUN6RCxvQkFBSSx5Q0FBSixDQUFpQyxNQUFqQztBQUNILGFBRk0sTUFFQSxJQUFJLFNBQVMsU0FBYixFQUF3QjtBQUMzQixxQkFBSyxXQUFMLENBQWlCLEVBQWpCLEVBQXFCLFNBQVMsU0FBOUI7QUFDSCxhQUZNLE1BRUEsSUFBSSxPQUFKLEVBQWE7QUFDaEIsd0JBQVEsSUFBUixjQUF3QixPQUFPLElBQVAsQ0FBWSxjQUFaLENBQXhCLGdCQUFnRSxPQUFoRTtBQUNIO0FBQ0o7Ozs4Q0FFdUU7QUFBQSxnQkFBdkQsS0FBdUQsU0FBdkQsS0FBdUQ7QUFBQSxnQkFBaEQsVUFBZ0QsU0FBaEQsVUFBZ0Q7QUFBQSxnQkFBcEMsV0FBb0MsU0FBcEMsV0FBb0M7QUFBQSxnQkFBdkIsVUFBdUIsU0FBdkIsVUFBdUI7QUFBQSxnQkFBWCxPQUFXLFNBQVgsT0FBVzs7QUFDcEUsZ0JBQUksV0FBVyxLQUFLLEtBQUwsQ0FBVyxNQUFNLFlBQWpCLENBQWY7QUFDQSxnQkFBRyxTQUFTLGNBQVosRUFBMkI7QUFDdkIscUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsc0JBQWpCO0FBQ0gsYUFGRCxNQUVPLElBQUksT0FBSixFQUFhO0FBQ2hCLHdCQUFRLElBQVIsY0FBd0IsT0FBTyxJQUFQLENBQVksY0FBWixDQUF4QixrQkFBZ0UsT0FBTyxJQUFQLENBQVksV0FBVyxTQUFTLFNBQWhDLENBQWhFLEVBQThHLE9BQTlHO0FBQ0g7QUFFSjs7O29DQUVXLFEsRUFBVSxTLEVBQVc7QUFDN0IsZ0JBQUksT0FBSixFQUFhLFFBQVEsSUFBUixjQUF3QixPQUFPLElBQVAsQ0FBWSxjQUFaLENBQXhCLGtCQUFnRSxPQUFPLElBQVAsWUFBcUIsU0FBckIsRUFBa0MsRUFBQyxNQUFNLFFBQVAsRUFBbEMsQ0FBaEUsRUFBdUgsT0FBdkg7QUFDaEI7Ozs4Q0FFdUM7QUFBQSxnQkFBdkIsVUFBdUIsU0FBdkIsVUFBdUI7QUFBQSxnQkFBWCxPQUFXLFNBQVgsT0FBVzs7QUFDcEMsZ0JBQUksT0FBTyxjQUFQLENBQXNCLFNBQXRCLENBQWdDLFlBQWhDLENBQUosRUFBa0Q7QUFDOUMsb0JBQUksT0FBTyxTQUFQLENBQWlCLFNBQWpCLElBQThCLENBQUMsS0FBSyxjQUFMLENBQW9CLFNBQXBCLENBQThCLGVBQTlCLENBQW5DLEVBQW1GO0FBQy9FLHdCQUFJLHlDQUFKLENBQWlDLE1BQWpDO0FBQ0gsaUJBRkQsTUFFTztBQUNILHdCQUFJLHNCQUFKLENBQWM7QUFDViw2QkFBSyxLQUFLLEdBREE7QUFFViw4Q0FGVTtBQUdWO0FBSFUscUJBQWQ7QUFLSDtBQUNKLGFBVkQsTUFVTztBQUNILG9CQUFJLHNCQUFKLENBQWMsRUFBQyxLQUFLLEtBQUssR0FBWCxFQUFnQixzQkFBaEIsRUFBNEIsZ0JBQTVCLEVBQWQ7QUFDSDtBQUdKOzs7Ozs7cUJBaEZnQixXOzs7Ozs7Ozs7Ozs7O0lDSmYsSTtBQUNGLGtCQUFZLEdBQVosRUFBaUI7QUFBQTs7QUFBQTs7QUFDYixhQUFLLEdBQUwsR0FBVyxHQUFYOztBQUVBLGFBQUssR0FBTCxDQUFTLEVBQVQsQ0FBWSwwQkFBWixFQUF3QyxVQUFDLElBQUQ7QUFBQSxtQkFBVSxNQUFLLGNBQUwsQ0FBb0IsS0FBSyxLQUF6QixDQUFWO0FBQUEsU0FBeEM7QUFDSDs7OzttQ0FFVSxLLEVBQU87QUFDZCxnQkFBSSxRQUFRLEdBQVIsQ0FBWSxtQkFBWixNQUFxQyxHQUF6QyxFQUE4QztBQUMxQyxxQkFBSyxTQUFMLENBQWUsS0FBZjtBQUNILGFBRkQsTUFFTztBQUNILHFCQUFLLEdBQUwsQ0FBUyxPQUFULENBQWlCLHlCQUFqQixFQUE2QyxFQUFFLFlBQVksS0FBZCxFQUE3QztBQUNIO0FBQ0o7OztrQ0FFUyxLLEVBQU87QUFBQTs7QUFDYixrQkFBTSxHQUFOLENBQVUsWUFBVixFQUF3QixTQUF4QjtBQUNBLGlCQUFLLEdBQUwsQ0FBUyxPQUFULENBQWlCLGtCQUFqQixFQUFxQyxLQUFyQzs7QUFFQSxtQkFBTyxFQUFFLElBQUYsQ0FBTztBQUNWLHFCQUFLLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLFdBQXpCLEVBQXNDO0FBQ3ZDLDZCQUFTLE1BQU07QUFEd0IsaUJBQXRDLENBREs7QUFJVixzQkFBTTtBQUpJLGFBQVAsRUFNTixJQU5NLENBTUQsVUFBQyxRQUFEO0FBQUEsdUJBQWMsT0FBSyxZQUFMLENBQWtCLEtBQWxCLEVBQXlCLFFBQXpCLENBQWQ7QUFBQSxhQU5DLEVBT04sSUFQTSxDQU9ELFVBQUMsS0FBRCxFQUFRLFVBQVIsRUFBb0IsV0FBcEI7QUFBQSx1QkFBb0MsT0FBSyxZQUFMLENBQWtCLEtBQWxCLEVBQXlCLEtBQXpCLEVBQWdDLFVBQWhDLEVBQTRDLFdBQTVDLENBQXBDO0FBQUEsYUFQQyxFQVFOLFFBUk0sQ0FRRyxZQUFNO0FBQUUsdUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsZ0JBQWpCLEVBQW1DLEtBQW5DO0FBQTRDLGFBUnZELENBQVA7QUFTSDs7O3FDQUVZLEssRUFBTztBQUNoQixrQkFBTSxHQUFOLENBQVUsWUFBVixFQUF3QixVQUF4QjtBQUNBLGlCQUFLLEdBQUwsQ0FBUyxPQUFULENBQWlCLG9CQUFqQixFQUF1QyxFQUFDLFlBQVksS0FBYixFQUF2QztBQUNIOzs7cUNBRVksSyxFQUFPLEssRUFBTyxVLEVBQVksVyxFQUFhO0FBQ2hELGtCQUFNLEdBQU4sQ0FBVSxZQUFWLEVBQXdCLE1BQXhCOztBQUVBLGlCQUFLLEdBQUwsQ0FBUyxPQUFULENBQWlCLGlCQUFqQixFQUFvQyxFQUFDLFlBQUQsRUFBUSxzQkFBUixFQUFvQix3QkFBcEIsRUFBaUMsWUFBWSxLQUE3QyxFQUFwQztBQUNIOzs7dUNBRWMsVSxFQUFZO0FBQ3ZCLG9CQUFRLEdBQVIsQ0FBWSxtQkFBWixFQUFpQyxHQUFqQztBQUNBLGlCQUFLLFNBQUwsQ0FBZSxVQUFmO0FBQ0g7Ozs7OztxQkFHVSxJOzs7Ozs7Ozs7OztBQy9DZjs7Ozs7Ozs7SUFFTSxXO0FBQ0YseUJBQVksR0FBWixFQUFpQjtBQUFBOztBQUFBOztBQUNiLGFBQUssR0FBTCxHQUFXLEdBQVg7O0FBRUEsYUFBSyxHQUFMLENBQ0ssRUFETCxDQUNRLG9CQURSLEVBQ29DLFVBQUMsSUFBRDtBQUFBLG1CQUFVLE1BQUssV0FBTCxDQUFpQixJQUFqQixDQUFWO0FBQUEsU0FEcEMsRUFFSyxFQUZMLENBRVEsaUJBRlIsRUFFb0MsVUFBQyxJQUFEO0FBQUEsbUJBQVUsTUFBSyxRQUFMLENBQWMsSUFBZCxDQUFWO0FBQUEsU0FGcEMsRUFHSyxFQUhMLENBR1EseUJBSFIsRUFHb0MsVUFBQyxJQUFEO0FBQUEsbUJBQVUsTUFBSyxrQkFBTCxDQUF3QixLQUFLLFVBQTdCLENBQVY7QUFBQSxTQUhwQztBQUlIOzs7O29DQUVXLEksRUFBTTtBQUNkLG1CQUFPLFFBQVAsQ0FBZ0IsSUFBaEIsR0FBdUIsT0FBTyxHQUFQLENBQVcsT0FBTyxNQUFQLENBQWMsYUFBekIsRUFBd0MsRUFBQyxRQUFRLGtCQUFULEVBQTZCLFNBQVMsS0FBSyxVQUFMLENBQWdCLEVBQXRELEVBQXhDLENBQXZCO0FBQ0g7OztpQ0FFUSxJLEVBQU07QUFDWCxnQkFBTSxXQUFXLEtBQUssS0FBTCxDQUFXLEtBQUssS0FBTCxDQUFXLFlBQXRCLENBQWpCOztBQUVBLGdCQUFJLFNBQVMsU0FBVCxLQUF1QixnQ0FBM0IsRUFBNkQ7QUFDekQscUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsbUJBQWpCO0FBQ0gsYUFGRCxNQUdLLElBQUksU0FBUyxTQUFULEtBQXVCLHdDQUEzQixFQUFxRTtBQUN0RSxvQkFBTSxPQUFPLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLFlBQXpCLENBQWI7QUFDQSxvQkFBTSxXQUFXLE9BQU8sSUFBUCxDQUFZLE9BQVosQ0FBakI7QUFDQSxvQkFBTSxrQ0FBZ0MsSUFBaEMsdUJBQXNELFFBQXRELFNBQU47QUFDQSxvQkFBSSxPQUFKLEVBQWEsUUFBUSxJQUFSLGNBQXdCLE9BQU8sSUFBUCxDQUFZLGNBQVosQ0FBeEIsa0JBQWdFLE9BQU8sSUFBUCxZQUFxQixTQUFTLFNBQTlCLEVBQTJDLEVBQUMsVUFBRCxFQUEzQyxDQUFoRSxFQUFzSCxPQUF0SDtBQUNoQixhQUxJLE1BTUEsSUFBSSxTQUFTLGNBQWIsRUFBNkI7QUFDOUIscUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsc0JBQWpCO0FBQ0g7QUFDSjs7OzJDQUVrQixVLEVBQVk7QUFDM0IsZ0JBQUksMEJBQUosQ0FBYyxLQUFLLEdBQW5CLEVBQXdCLFVBQXhCO0FBQ0g7Ozs7OztxQkFHVSxXOzs7Ozs7Ozs7Ozs7O0lDckNULFU7QUFDRix3QkFBWSxHQUFaLEVBQWlCO0FBQUE7O0FBQ2IsYUFBSyxHQUFMLEdBQVcsR0FBWDtBQUNIOzs7O3VDQUVjLEssRUFBTztBQUNsQixnQkFBSSxNQUFNLEdBQU4sQ0FBVSxnQkFBVixJQUE4QixDQUFsQyxFQUFxQztBQUNqQztBQUNBLHFCQUFLLGNBQUwsQ0FBb0IsS0FBcEI7QUFDSCxhQUhELE1BR087QUFDSDtBQUNBLHFCQUFLLGlCQUFMLENBQXVCLEtBQXZCO0FBQ0g7QUFDSjs7O3VDQUVjLEssRUFBTztBQUFBOztBQUNsQixtQkFBTyxFQUFFLElBQUYsQ0FBTztBQUNWLHFCQUFLLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLHNCQUF6QixFQUFpRCxFQUFDLFNBQVMsTUFBTSxHQUFOLENBQVUsSUFBVixDQUFWLEVBQWpELENBREs7QUFFVixzQkFBTSxLQUZJO0FBR1Ysc0JBQU0sRUFBQyxRQUFRLE1BQU0sR0FBTixDQUFVLGdCQUFWLENBQVQsRUFISTtBQUlWLHlCQUFTO0FBSkMsYUFBUCxFQU1OLElBTk0sQ0FNRCxVQUFDLEtBQUQsRUFBUSxVQUFSLEVBQW9CLFdBQXBCO0FBQUEsdUJBQW9DLE1BQUssYUFBTCxDQUFtQixLQUFuQixFQUEwQixLQUExQixFQUFpQyxVQUFqQyxFQUE2QyxXQUE3QyxDQUFwQztBQUFBLGFBTkMsQ0FBUDtBQU9IOzs7MENBRWlCLEssRUFBTztBQUFBOztBQUNyQixtQkFBTyxFQUFFLElBQUYsQ0FBTztBQUNWLHFCQUFLLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLHNCQUF6QixFQUFpRCxFQUFDLFNBQVMsTUFBTSxHQUFOLENBQVUsSUFBVixDQUFWLEVBQWpELENBREs7QUFFVixzQkFBTSxRQUZJO0FBR1YseUJBQVM7QUFIQyxhQUFQLEVBS04sSUFMTSxDQUtELFVBQUMsS0FBRCxFQUFRLFVBQVIsRUFBb0IsV0FBcEI7QUFBQSx1QkFBb0MsT0FBSyxhQUFMLENBQW1CLEtBQW5CLEVBQTBCLEtBQTFCLEVBQWlDLFVBQWpDLEVBQTZDLFdBQTdDLENBQXBDO0FBQUEsYUFMQyxDQUFQO0FBTUg7OztzQ0FFYSxLLEVBQU8sSyxFQUFPLFUsRUFBWSxXLEVBQWE7QUFDakQsaUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsbUJBQWpCLEVBQXNDLEVBQUMsWUFBRCxFQUFRLFlBQVIsRUFBZSxzQkFBZixFQUEyQix3QkFBM0IsRUFBdEM7QUFDSDs7Ozs7O3FCQUdVLFU7Ozs7Ozs7Ozs7Ozs7SUN2Q1QsaUI7QUFDRiwrQkFBWSxHQUFaLEVBQWlCO0FBQUE7O0FBQUE7O0FBQ2IsYUFBSyxHQUFMLEdBQVcsR0FBWDs7QUFFQSxhQUFLLEdBQUwsQ0FBUyxFQUFULENBQVksbUJBQVosRUFBaUMsVUFBQyxJQUFEO0FBQUEsbUJBQVUsTUFBSyxVQUFMLENBQWdCLElBQWhCLENBQVY7QUFBQSxTQUFqQztBQUNIOzs7O21DQUVVLEksRUFBTTtBQUNiLGdCQUFJLGlCQUFKO0FBQ0EsZ0JBQUk7QUFDQSwyQkFBVyxLQUFLLEtBQUwsQ0FBVyxLQUFLLEtBQUwsQ0FBVyxZQUF0QixDQUFYO0FBQ0gsYUFGRCxDQUVFLE9BQU8sRUFBUCxFQUFVO0FBQ1IsMkJBQVcsRUFBWDtBQUNIOztBQUVELGdCQUFJLFNBQVMsY0FBYixFQUE0QjtBQUN4QixxQkFBSyxHQUFMLENBQVMsT0FBVCxDQUFpQixzQkFBakI7QUFDSCxhQUZELE1BRU87QUFDSCxvQkFBSSxrQ0FBZ0MsT0FBTyxHQUFQLENBQVcsT0FBTyxNQUFQLENBQWMsY0FBekIsQ0FBaEMsdUJBQTBGLE9BQU8sSUFBUCxDQUFZLHNCQUFaLENBQTFGLFNBQUo7QUFDQSx3QkFBUSxJQUFSLGNBQXdCLE9BQU8sSUFBUCxDQUFZLGNBQVosQ0FBeEIsa0JBQWdFLE9BQU8sSUFBUCxDQUFZLDJCQUFaLEVBQXlDLEVBQUMsVUFBRCxFQUF6QyxDQUFoRSxFQUFvSCxPQUFwSDtBQUNIO0FBQ0o7Ozs7OztxQkFHVSxpQjs7Ozs7Ozs7Ozs7QUN6QmY7Ozs7Ozs7O0lBRXFCLGE7QUFDakIsMkJBQVksR0FBWixFQUFpQjtBQUFBOztBQUFBOztBQUNiLGFBQUssR0FBTCxHQUFXLEdBQVg7O0FBRUEsYUFBSyxHQUFMLENBQ0ssRUFETCxDQUNRLHNCQURSLEVBQ2dDLFVBQUMsSUFBRDtBQUFBLG1CQUFVLE1BQUssZUFBTCxDQUFxQixJQUFyQixDQUFWO0FBQUEsU0FEaEMsRUFFSyxFQUZMLENBRVEsbUJBRlIsRUFFNkI7QUFBQSxtQkFBTSxNQUFLLCtCQUFMLEVBQU47QUFBQSxTQUY3QixFQUdLLEVBSEwsQ0FHUSxnQkFIUixFQUcwQixVQUFDLElBQUQ7QUFBQSxtQkFBVSxNQUFLLGNBQUwsQ0FBb0IsS0FBSyxNQUF6QixDQUFWO0FBQUEsU0FIMUI7QUFJSDs7Ozt3Q0FFZSxJLEVBQU07QUFDbEIsZ0JBQUksYUFBYSxPQUFPLFFBQVAsQ0FBZ0IsUUFBaEIsR0FBMkIsT0FBTyxRQUFQLENBQWdCLE1BQTVEO0FBQ0EsZ0JBQUksUUFBUSxLQUFLLE1BQWpCLEVBQXdCO0FBQ3BCLDJDQUF5QixtQkFBbUIsS0FBSyxNQUF4QixDQUF6QjtBQUNIO0FBQ0QsZ0JBQUksZ0NBQUosQ0FBd0IsVUFBeEI7QUFDSDs7O3VDQUVjLE0sRUFBUTtBQUNuQixnQkFBSSxDQUFDLE9BQU8sY0FBUCxDQUFzQixTQUF0QixDQUFnQyxnQkFBaEMsQ0FBTCxFQUF1RDtBQUNuRCxvQkFBTSxhQUFhLE9BQU8sUUFBUCxDQUFnQixRQUFoQixHQUEyQixPQUFPLFFBQVAsQ0FBZ0IsTUFBaEIsQ0FBdUIsT0FBdkIsQ0FBK0IscUNBQS9CLEVBQXNFLEVBQXRFLENBQTlDO0FBQ0Esb0JBQU0sc0JBQXNCLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLG9CQUF6QixFQUErQyxFQUFDLFNBQVMsVUFBVixFQUFzQixjQUF0QixFQUEvQyxDQUE1QjtBQUNBLGtCQUFFLGtCQUFGLEVBQXNCLElBQXRCLENBQTJCLE1BQTNCLEVBQW1DLG1CQUFuQztBQUNBLGtCQUFFLGtCQUFGLEVBQXNCLFVBQXRCLENBQWlDLFFBQWpDLEVBQTJDLE1BQTNDO0FBQ0g7QUFDSjs7OzBEQUVpQztBQUM5QixnQkFBSSxPQUFPLFNBQVAsQ0FBaUIsUUFBakIsS0FBOEIsU0FBOUIsSUFBMkMsT0FBTyxjQUFQLENBQXNCLFNBQXRCLENBQWdDLHFCQUFoQyxDQUEvQyxFQUF1RztBQUNuRyxvQkFBSSxnQ0FBSjtBQUNILGFBRkQsTUFFTztBQUNIO0FBQ0Esa0JBQUUsc0JBQUYsRUFBMEIsVUFBMUIsQ0FBcUMsUUFBckMsRUFBK0MsTUFBL0M7QUFDSDtBQUNKOzs7Ozs7cUJBbENnQixhOzs7Ozs7Ozs7Ozs7O0lDRmYsUTtBQUNGLHNCQUFZLEdBQVosRUFBaUI7QUFBQTs7QUFDYixhQUFLLEdBQUwsR0FBVyxHQUFYO0FBQ0g7Ozs7dUNBRWMsVSxFQUFZLE8sRUFBUztBQUFBOztBQUNoQyxnQkFBSSxTQUFTLFdBQVcsR0FBWCxDQUFlLGVBQWYsTUFBb0MsYUFBcEMsR0FBb0QsS0FBcEQsR0FBNEQsUUFBekU7O0FBRUEsaUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsc0JBQWpCLEVBQXlDLEVBQUUsc0JBQUYsRUFBYyxjQUFkLEVBQXpDOztBQUVBLGdCQUFJLFVBQVUsSUFBSSxPQUFKLENBQVksVUFBQyxPQUFELEVBQVUsTUFBVixFQUFxQjtBQUMzQyxvQkFBSSxXQUFXLEdBQVgsQ0FBZSxlQUFmLE1BQW9DLGFBQXhDLEVBQXVEO0FBQ25ELDBCQUFLLGdCQUFMLENBQXNCLFVBQXRCLEVBQ0ssSUFETCxDQUNVLE9BRFYsRUFFSyxJQUZMLENBRVUsVUFBQyxLQUFEO0FBQUEsK0JBQVcsT0FBTyxFQUFFLFlBQUYsRUFBUyxzQkFBVCxFQUFQLENBQVg7QUFBQSxxQkFGVjtBQUdILGlCQUpELE1BSU87QUFDSCwwQkFBSyxtQkFBTCxDQUF5QixVQUF6QixFQUNLLElBREwsQ0FDVSxPQURWLEVBRUssSUFGTCxDQUVVLFVBQUMsS0FBRDtBQUFBLCtCQUFXLE9BQU8sRUFBRSxZQUFGLEVBQVMsc0JBQVQsRUFBUCxDQUFYO0FBQUEscUJBRlY7QUFHSDtBQUNKLGFBVmEsQ0FBZDs7QUFZQSxvQkFDSyxJQURMLENBQ1U7QUFBQTs7QUFBQSxrREFBSSxNQUFKO0FBQUksMEJBQUo7QUFBQTs7QUFBQSx1QkFBaUIsY0FBSyxHQUFMLEVBQVMsT0FBVCxjQUFpQix3QkFBakIsRUFBMkMsRUFBRSxzQkFBRixFQUFjLGNBQWQsRUFBc0IsZ0JBQXRCLEVBQTNDLFNBQStFLE1BQS9FLEVBQWpCO0FBQUEsYUFEVixXQUVXLFlBQWdCO0FBQUE7O0FBQUEsbURBQVosTUFBWTtBQUFaLDBCQUFZO0FBQUE7O0FBQUEsb0JBQ2IsS0FEYSxHQUNILENBQUMsT0FBTyxNQUFQLElBQWlCLE1BQWpCLElBQTJCLENBQUMsRUFBRCxDQUE1QixFQUFrQyxDQUFsQyxDQURHLENBQ2IsS0FEYTs7O0FBR25CLHNCQUFLLGdCQUFMLENBQXNCLFVBQXRCLEVBQWtDLEtBQWxDO0FBQ0EsK0JBQUssR0FBTCxFQUFTLE9BQVQsZUFBaUIscUJBQWpCLEVBQXdDLEVBQUUsc0JBQUYsRUFBYyxjQUFkLEVBQXNCLGdCQUF0QixFQUF4QyxTQUE0RSxNQUE1RTtBQUNILGFBUEwsRUFRSyxJQVJMLENBUVU7QUFBQSx1QkFBTSxNQUFLLEdBQUwsQ0FBUyxPQUFULENBQWlCLG9CQUFqQixFQUF1QyxFQUFFLHNCQUFGLEVBQWMsY0FBZCxFQUFzQixnQkFBdEIsRUFBdkMsQ0FBTjtBQUFBLGFBUlY7O0FBVUEsbUJBQU8sT0FBUDtBQUNIOzs7eUNBRWdCLFUsRUFBWSxPLEVBQVM7QUFBQTs7QUFDbEMsaUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsMEJBQWpCLEVBQTZDLEVBQUUsc0JBQUYsRUFBYyxnQkFBZCxFQUE3Qzs7QUFFQSxnQkFBSSxXQUFXLEVBQUUsSUFBRixDQUFPO0FBQ2xCLHFCQUFLLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLGtCQUF6QixFQUE2QyxFQUFDLFNBQVMsV0FBVyxFQUFyQixFQUE3QyxDQURhO0FBRWxCLHNCQUFNO0FBRlksYUFBUCxDQUFmOztBQUtBLHFCQUNLLElBREwsQ0FDVSxZQUFNO0FBQ1IsMkJBQVcsR0FBWCxDQUFlLGVBQWYsRUFBZ0MsZ0JBQWhDO0FBQ0EsdUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsNEJBQWpCLEVBQStDLEVBQUUsc0JBQUYsRUFBYyxnQkFBZCxFQUEvQztBQUNILGFBSkwsRUFLSyxJQUxMLENBS1U7QUFBQTs7QUFBQSxtREFBSSxNQUFKO0FBQUksMEJBQUo7QUFBQTs7QUFBQSx1QkFBZSxnQkFBSyxHQUFMLEVBQVMsT0FBVCxlQUFpQix5QkFBakIsRUFBNEMsRUFBRSxzQkFBRixFQUFjLGdCQUFkLEVBQTVDLFNBQXdFLE1BQXhFLEVBQWY7QUFBQSxhQUxWLEVBTUssTUFOTCxDQU1ZO0FBQUEsdUJBQU0sT0FBSyxHQUFMLENBQVMsT0FBVCxDQUFpQix3QkFBakIsRUFBMkMsRUFBRSxzQkFBRixFQUFjLGdCQUFkLEVBQTNDLENBQU47QUFBQSxhQU5aOztBQVFBLG1CQUFPLFFBQVA7QUFDSDs7OzRDQUVtQixVLEVBQVksTyxFQUFTO0FBQUE7O0FBQ3JDLGlCQUFLLEdBQUwsQ0FBUyxPQUFULENBQWlCLDZCQUFqQixFQUFnRCxFQUFFLHNCQUFGLEVBQWMsZ0JBQWQsRUFBaEQ7O0FBRUEsZ0JBQUksV0FBVyxFQUFFLElBQUYsQ0FBTztBQUNsQixxQkFBSyxPQUFPLEdBQVAsQ0FBVyxPQUFPLE1BQVAsQ0FBYyxxQkFBekIsRUFBZ0QsRUFBQyxTQUFTLFdBQVcsRUFBckIsRUFBaEQsQ0FEYTtBQUVsQixzQkFBTTtBQUZZLGFBQVAsQ0FBZjs7QUFLQSxxQkFDSyxJQURMLENBQ1UsWUFBTTtBQUNSLDJCQUFXLEdBQVgsQ0FBZSxlQUFmLEVBQWdDLGFBQWhDO0FBQ0EsdUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsK0JBQWpCLEVBQWtELEVBQUUsc0JBQUYsRUFBYyxnQkFBZCxFQUFsRDtBQUNILGFBSkwsRUFLSyxJQUxMLENBS1U7QUFBQTs7QUFBQSxtREFBSSxNQUFKO0FBQUksMEJBQUo7QUFBQTs7QUFBQSx1QkFBZSxnQkFBSyxHQUFMLEVBQVMsT0FBVCxlQUFpQiw0QkFBakIsRUFBK0MsRUFBRSxzQkFBRixFQUFjLGdCQUFkLEVBQS9DLFNBQTJFLE1BQTNFLEVBQWY7QUFBQSxhQUxWLEVBTUssTUFOTCxDQU1ZO0FBQUEsdUJBQU0sT0FBSyxHQUFMLENBQVMsT0FBVCxDQUFpQiwyQkFBakIsRUFBOEMsRUFBRSxzQkFBRixFQUFjLGdCQUFkLEVBQTlDLENBQU47QUFBQSxhQU5aOztBQVFBLG1CQUFPLFFBQVA7QUFDSDs7O3lDQUVnQixVLEVBQVksSyxFQUFPO0FBQ2hDLGdCQUFJLE1BQU0sWUFBTixJQUFzQixLQUFLLEtBQUwsQ0FBVyxNQUFNLFlBQWpCLEVBQStCLGNBQXpELEVBQXlFO0FBQ3JFLHFCQUFLLEdBQUwsQ0FBUyxPQUFULENBQWlCLHNCQUFqQjtBQUNILGFBRkQsTUFFTztBQUNILHdCQUFRLElBQVIsQ0FBYSxPQUFPLElBQVAsQ0FBWSx3QkFBWixDQUFiLEVBQW9ELE9BQXBEO0FBQ0g7QUFDSjs7Ozs7O3FCQUdVLFE7Ozs7Ozs7Ozs7O0FDbEZmOzs7Ozs7OztJQUVxQix1QjtBQUNqQixxQ0FBWSx1QkFBWixFQUFvQztBQUFBOztBQUFBOztBQUNoQyxhQUFLLHVCQUFMLEdBQStCLHVCQUEvQjs7QUFFQSxVQUFFLGtFQUFGLEVBQXNFLEVBQXRFLENBQXlFLE9BQXpFLEVBQWtGLFVBQUMsQ0FBRDtBQUFBLG1CQUFPLE1BQUsseUJBQUwsQ0FBK0IsQ0FBL0IsQ0FBUDtBQUFBLFNBQWxGO0FBQ0EsVUFBRSxpQ0FBRixFQUFxQyxFQUFyQyxDQUF3QyxPQUF4QyxFQUFpRDtBQUFBLG1CQUFNLE1BQUssa0JBQUwsRUFBTjtBQUFBLFNBQWpEO0FBQ0g7Ozs7NkNBRW9CO0FBQ2pCLGlCQUFLLHVCQUFMLENBQTZCLHNCQUE3QjtBQUNBLGlCQUFLLElBQUw7QUFDSDs7O2tEQUUwQixDLEVBQUU7QUFDekIsZ0JBQUksY0FBYyxLQUFLLGNBQUwsQ0FBb0IsRUFBRSxhQUF0QixDQUFsQjs7QUFFQSxnQkFBSSxDQUFDLEtBQUssdUJBQUwsQ0FBNkIsVUFBN0IsQ0FBd0MsV0FBeEMsQ0FBTCxFQUEwRDtBQUN0RCxxQkFBSyx1QkFBTCxDQUE2QixLQUE3QixDQUFtQyxXQUFuQztBQUNBLHFCQUFLLElBQUw7QUFDSDs7QUFFRCxpQkFBSyxxQkFBTCxDQUEyQixXQUEzQjtBQUNBLGlCQUFLLG1CQUFMLEdBVHlCLENBU0c7QUFDL0I7Ozt1Q0FFYyxPLEVBQVE7QUFDbkIsZ0JBQUksU0FBUyxLQUFLLHFCQUFMLENBQTJCLE9BQTNCLENBQWI7QUFDQSxtQkFBTyxPQUFPLFVBQVAsQ0FBa0IsbUJBQWxCLEVBQXVDLEtBQTlDO0FBQ0g7Ozs4Q0FFcUIsVyxFQUFZO0FBQzlCLHVDQUF5QixXQUF6QixTQUEwQyxXQUExQyxDQUFzRCxZQUF0RDtBQUNIOzs7OENBRXFCLGMsRUFBZTtBQUNqQyxnQkFBSSxFQUFFLGNBQUYsRUFBa0IsUUFBbEIsQ0FBMkIsb0JBQTNCLENBQUosRUFBc0Q7QUFDbEQsdUJBQU8sY0FBUDtBQUNILGFBRkQsTUFHSztBQUNELG9CQUFJLGdCQUFnQixFQUFFLGNBQUYsRUFBa0IsT0FBbEIsQ0FBMEIscUJBQTFCLEVBQWlELEtBQWpELEVBQXBCO0FBQ0Esb0JBQUksQ0FBQyxhQUFELElBQWtCLGNBQWMsTUFBZCxLQUF5QixDQUEvQyxFQUFpRDtBQUM3QywwQkFBTSxJQUFJLEtBQUosQ0FBVSxtREFBVixDQUFOO0FBQ0g7QUFDRCx1QkFBTyxjQUFjLENBQWQsQ0FBUDtBQUNIO0FBQ0o7Ozs4Q0FFb0I7QUFDakIsZ0JBQUksQ0FBQyxLQUFLLHVCQUFMLENBQTZCLHVCQUFsQyxFQUEyRDtBQUN2RCxrQkFBRSx3QkFBRixFQUE0QixXQUE1QixDQUF3QywyQkFBeEM7QUFDSDtBQUNKOzs7K0JBRU07QUFDSCxnQkFBSSxhQUFhLDBCQUFhLGVBQTlCO0FBQ0Esb0JBQVEsR0FBUixDQUFZLFdBQVcsSUFBdkIsRUFBNkIsS0FBSyx1QkFBTCxDQUE2QixLQUExRCxFQUFpRSxFQUFFLFNBQVMsSUFBSSxJQUFKLENBQVMsS0FBSyxHQUFMLEtBQWEsV0FBVyxVQUFqQyxDQUFYLEVBQWpFOztBQUVBLGdCQUFHLE9BQU8sU0FBUCxDQUFpQixlQUFwQixFQUFxQztBQUNqQyxrQkFBRSxJQUFGLENBQU87QUFDSCx5QkFBSyxPQUFPLEdBQVAsQ0FBVyxPQUFPLE1BQVAsQ0FBYyxXQUF6QixDQURGO0FBRUgsMEJBQU0sT0FGSDtBQUdILGlDQUFjLGtCQUhYO0FBSUgsMEJBQU0sS0FBSyxTQUFMLENBQWUsRUFBRSxpQkFBaUIsS0FBSyx1QkFBTCxDQUE2QixLQUFoRCxFQUFmLENBSkg7QUFLSCx5QkFMRyxpQkFLRyxLQUxILEVBS1UsVUFMVixFQUtzQixXQUx0QixFQUttQztBQUNsQywrQkFBTyxNQUFQLENBQWMsR0FBZCxDQUFrQixPQUFsQixFQUEyQiwwREFBM0IsRUFBc0YsRUFBQyxRQUFRLFVBQVQsRUFBcUIsT0FBTyxXQUE1QixFQUF0RjtBQUNIO0FBUEUsaUJBQVA7QUFTSDtBQUNKOzs7Ozs7cUJBcEVnQix1Qjs7Ozs7OztBQ0ZyQjtBQUNBLFFBQVEsTUFBUixHQUFpQixVQUFTLFFBQVQsRUFBbUI7QUFBQSxRQUMxQixpQkFEMEIsR0FFNUIsMkJBQVksU0FBWixFQUF1QixLQUF2QixFQUE4QjtBQUFBOztBQUMxQixhQUFLLFNBQUwsR0FBaUIsU0FBakI7QUFDQSxhQUFLLEtBQUwsR0FBYSxLQUFiO0FBQ0gsS0FMMkI7O0FBUWhDLFdBQU8sUUFBUSxHQUFSLENBQVksU0FBUyxHQUFULENBQWEsVUFBQyxDQUFEO0FBQUE7QUFDNUI7QUFDQSxvQkFBUSxPQUFSLENBQWdCLENBQWhCLEVBQW1CLElBQW5CLENBQXdCLFVBQUMsR0FBRDtBQUFBLHVCQUFTLElBQUksaUJBQUosQ0FBc0IsSUFBdEIsRUFBNEIsR0FBNUIsQ0FBVDtBQUFBLGFBQXhCLFdBQXlFLFVBQUMsR0FBRDtBQUFBLHVCQUFTLElBQUksaUJBQUosQ0FBc0IsS0FBdEIsRUFBNkIsR0FBN0IsQ0FBVDtBQUFBLGFBQXpFO0FBRjRCO0FBQUEsS0FBYixDQUFaLENBQVA7QUFHSCxDQVhEOztBQWFBO0FBQ0EsUUFBUSxJQUFSLEdBQWUsVUFBUyxPQUFULEVBQWtCO0FBQzdCLFdBQU8sSUFBSSxPQUFKLENBQVksVUFBQyxPQUFELEVBQVUsTUFBVjtBQUFBLGVBQ2YsRUFBRSxJQUFGLENBQU8sT0FBUCxFQUNLLElBREwsQ0FDVSxVQUFDLFFBQUQ7QUFBQSxtQkFBYyxRQUFRLFFBQVIsQ0FBZDtBQUFBLFNBRFYsRUFFSyxJQUZMLENBRVUsVUFBQyxHQUFELEVBQU0sTUFBTixFQUFjLEdBQWQ7QUFBQSxtQkFBc0IsT0FBTyxHQUFQLENBQXRCO0FBQUEsU0FGVixDQURlO0FBQUEsS0FBWixDQUFQO0FBS0gsQ0FORDs7Ozs7Ozs7O0FDZkE7Ozs7OztBQUNBOzs7O0FBSUEsSUFBTSxzQkFBc0IsU0FBdEIsbUJBQXNCLENBQVMsQ0FBVCxFQUFZO0FBQ3BDLFFBQUksRUFBRSxLQUFGLEtBQVksc0JBQVMsSUFBekIsRUFBK0I7QUFDM0IsVUFBRSxjQUFGO0FBQ0EsWUFBSSxFQUFFLEVBQUUsTUFBSixFQUFZLEVBQVosQ0FBZSxJQUFmLENBQUosRUFBMEI7QUFDdEIsY0FBRSxpQ0FBRixFQUFxQyxLQUFyQztBQUNILFNBRkQsTUFFTztBQUNILGNBQUUsRUFBRSxNQUFKLEVBQVksVUFBWjtBQUNIO0FBQ0o7QUFDRCxRQUFJLEVBQUUsS0FBRixLQUFZLHNCQUFTLEVBQXpCLEVBQTZCO0FBQ3pCLFVBQUUsY0FBRjtBQUNBLFVBQUUsRUFBRSxNQUFKLEVBQVksVUFBWixDQUF1QixDQUFDLENBQXhCO0FBQ0g7O0FBRUQsTUFBRSxlQUFGO0FBQ0gsQ0FmRDs7cUJBaUJlLG1COzs7Ozs7OztBQ3RCZixJQUFNLDBCQUEwQixTQUExQix1QkFBMEIsQ0FBUyxDQUFULEVBQVksRUFBWixFQUFnQjtBQUM1QyxRQUFNLFFBQVEsRUFBRSxFQUFGLEVBQU0sUUFBTixDQUFlLGtCQUFmLENBQWQ7QUFDQSxRQUFNLFlBQVksRUFBRSxFQUFGLEVBQU0sQ0FBTixFQUFTLHFCQUFULEdBQWlDLEtBQW5EO0FBQ0EsUUFBTSxhQUFhLE1BQU0sQ0FBTixFQUFTLHFCQUFULEdBQWlDLEtBQXBEO0FBQ0EsUUFBTSxjQUFjLE1BQU0sTUFBMUI7O0FBRUEsUUFBSSxFQUFFLEVBQUYsRUFBTSxVQUFOLE9BQXVCLENBQTNCLEVBQThCO0FBQzFCLFVBQUUsRUFBRixFQUFNLE1BQU4sR0FBZSxRQUFmLENBQXdCLHVCQUF4QixFQUFpRCxHQUFqRCxDQUFxRCxZQUFyRCxFQUFtRSxRQUFuRTtBQUNILEtBRkQsTUFFTztBQUNILFVBQUUsRUFBRixFQUFNLE1BQU4sR0FBZSxRQUFmLENBQXdCLHVCQUF4QixFQUFpRCxHQUFqRCxDQUFxRCxZQUFyRCxFQUFtRSxTQUFuRTtBQUNIOztBQUVELFFBQUksRUFBRSxFQUFGLEVBQU0sVUFBTixLQUFxQixTQUFyQixJQUFtQyxhQUFhLFdBQWQsR0FBOEIsY0FBYyxHQUFsRixFQUF3RjtBQUNwRixVQUFFLEVBQUYsRUFBTSxNQUFOLEdBQWUsUUFBZixDQUF3Qix3QkFBeEIsRUFBa0QsR0FBbEQsQ0FBc0QsWUFBdEQsRUFBb0UsUUFBcEU7O0FBRUE7QUFDQSxZQUFJLE9BQU8sU0FBUCxLQUFxQixDQUF6QixFQUE0QjtBQUN4QixtQkFBTyxTQUFQLEdBQW1CLEVBQUUsRUFBRixFQUFNLFVBQU4sRUFBbkI7QUFDSCxTQUZELE1BRU87QUFDSCxjQUFFLEVBQUYsRUFBTSxVQUFOLENBQWlCLE9BQU8sU0FBeEI7QUFDQSxtQkFBTyxTQUFQLEdBQW1CLENBQW5CO0FBQ0g7QUFDSixLQVZELE1BVU87QUFDSCxVQUFFLEVBQUYsRUFBTSxNQUFOLEdBQWUsUUFBZixDQUF3Qix3QkFBeEIsRUFBa0QsR0FBbEQsQ0FBc0QsWUFBdEQsRUFBb0UsU0FBcEU7QUFDSDtBQUNKLENBekJEOztxQkEyQmUsdUI7Ozs7Ozs7O0FDM0JmLElBQU0sMEJBQTBCLFNBQTFCLHVCQUEwQixDQUFTLEVBQVQsRUFBYTtBQUN6QyxRQUFNLFFBQVEsRUFBRSxFQUFGLEVBQU0sUUFBTixDQUFlLGtCQUFmLENBQWQ7QUFDQSxRQUFNLGNBQWMsTUFBTSxNQUExQjtBQUNBLFFBQU0sYUFBYSxNQUFNLENBQU4sRUFBUyxxQkFBVCxHQUFpQyxLQUFwRDtBQUNBLFFBQU0sWUFBWSxFQUFFLEVBQUYsRUFBTSxDQUFOLEVBQVMscUJBQVQsR0FBaUMsS0FBbkQ7O0FBRUEsTUFBRSxFQUFGLEVBQU0sTUFBTixHQUFlLFFBQWYsQ0FBd0Isd0JBQXhCLEVBQWtELEdBQWxELENBQXNELFlBQXRELEVBQW9FLFNBQXBFOztBQUVBLFFBQUssY0FBYyxVQUFmLElBQThCLFNBQWxDLEVBQTZDO0FBQ3pDLFVBQUUsRUFBRixFQUFNLE1BQU4sR0FBZSxRQUFmLENBQXdCLHVCQUF4QixFQUFpRCxHQUFqRCxDQUFxRCxZQUFyRCxFQUFtRSxRQUFuRTtBQUNBLFVBQUUsRUFBRixFQUFNLE1BQU4sR0FBZSxRQUFmLENBQXdCLHdCQUF4QixFQUFrRCxHQUFsRCxDQUFzRCxZQUF0RCxFQUFvRSxRQUFwRTtBQUNIO0FBQ0osQ0FaRDs7cUJBY2UsdUI7Ozs7Ozs7O0FDZGY7OztBQUdBLElBQU0sY0FBYyxTQUFkLFdBQWMsQ0FBUyxDQUFULEVBQVksU0FBWixFQUF1QixLQUF2QixFQUE4QjtBQUM5QyxRQUFJLGNBQWMsTUFBbEIsRUFBMEI7QUFDdEIsZUFBTyxLQUFLLElBQUwsQ0FBVSxJQUFJLEtBQWQsSUFBdUIsS0FBOUI7QUFDSDtBQUNELFdBQU8sS0FBSyxLQUFMLENBQVcsSUFBSSxLQUFmLElBQXdCLEtBQS9CO0FBQ0gsQ0FMRDs7cUJBT2UsVzs7Ozs7Ozs7O0FDVmY7Ozs7OztBQUVBOzs7OztBQUtBLElBQU0saUJBQWlCLFNBQWpCLGNBQWlCLENBQVMsU0FBVCxFQUFvQixJQUFwQixFQUEwQjtBQUM3QyxRQUFNLFFBQVEsRUFBRSxJQUFGLEVBQVEsUUFBUixDQUFpQixrQkFBakIsQ0FBZDtBQUNBLFFBQU0sWUFBWSxLQUFLLENBQUwsRUFBUSxxQkFBUixHQUFnQyxLQUFsRDtBQUNBLFFBQU0sYUFBYSxNQUFNLENBQU4sRUFBUyxxQkFBVCxHQUFpQyxLQUFwRDtBQUNBLFFBQU0sY0FBYyxNQUFNLE1BQTFCOztBQUVBO0FBQ0EsUUFBTSxZQUFZLEtBQUssSUFBTCxDQUFVLEtBQUssVUFBTCxLQUFvQixVQUE5QixDQUFsQjs7QUFFQTtBQUNBLFFBQU0sZUFBZSxDQUFDLFlBQVksQ0FBYixJQUFrQixDQUF2Qzs7QUFFQSxRQUFJLGNBQWMsT0FBbEIsRUFBMkI7QUFDdkIsWUFBSSxLQUFLLFVBQUwsS0FBb0IsU0FBcEIsR0FBaUMsYUFBYSxXQUFsRCxFQUFnRTtBQUM1RCxnQkFBTSxJQUFJLDhCQUFZLEtBQUssVUFBTCxFQUFaLEVBQStCLE9BQS9CLEVBQXdDLFVBQXhDLENBQVY7QUFDQSxnQkFBTSxJQUFJLDhCQUFZLFNBQVosRUFBdUIsT0FBdkIsRUFBZ0MsVUFBaEMsQ0FBVjtBQUNBLGdCQUFNLGFBQWEsSUFBSSxDQUFKLEdBQVEsWUFBM0I7QUFDQSxpQkFBSyxPQUFMLENBQWEsRUFBQyxzQkFBRCxFQUFiO0FBQ0g7QUFDSixLQVBELE1BT087QUFDSDtBQUNBLFlBQUksV0FBVyxDQUFmO0FBQ0EsWUFBSSw4QkFBWSxLQUFLLFVBQUwsRUFBWixFQUErQixNQUEvQixFQUF1QyxVQUF2QyxJQUFxRCxLQUFLLFVBQUwsRUFBckQsR0FBeUUsR0FBN0UsRUFBa0Y7QUFDOUUsd0JBQVksVUFBWjtBQUNIO0FBQ0QsWUFBTSxLQUFJLDhCQUFZLEtBQUssVUFBTCxFQUFaLEVBQStCLE1BQS9CLEVBQXVDLFVBQXZDLENBQVY7QUFDQSxZQUFNLEtBQUksQ0FBQyxTQUFYO0FBQ0EsWUFBTSxJQUFJLFlBQVY7QUFDQSxZQUFNLElBQUksQ0FBQyxFQUFYO0FBQ0EsWUFBTSxJQUFJLENBQUMsUUFBWDtBQUNBLFlBQU0sY0FBYSxLQUFJLEVBQUosR0FBUSxDQUFSLEdBQVksQ0FBWixHQUFnQixDQUFuQztBQUNBLGFBQUssT0FBTCxDQUFhLEVBQUMsdUJBQUQsRUFBYjtBQUNIO0FBQ0osQ0FqQ0Q7O3FCQW1DZSxjOzs7Ozs7OztBQzFDZixJQUFNLGlCQUFpQixTQUFqQixjQUFpQixDQUFTLENBQVQsRUFBWTtBQUMvQixRQUFNLE1BQU0sRUFBRSxRQUFGLENBQVcsRUFBWCxDQUFaO0FBQ0EsV0FBTyxJQUFJLE1BQUosS0FBZSxDQUFmLFNBQXVCLEdBQXZCLEdBQStCLEdBQXRDO0FBQ0gsQ0FIRDs7cUJBS2UsYzs7Ozs7Ozs7O0FDTGY7Ozs7OztBQUVBLElBQU0sV0FBVyxTQUFYLFFBQVcsQ0FBUyxDQUFULEVBQVksQ0FBWixFQUFlLENBQWYsRUFBa0I7QUFDL0IsaUJBQVcsaUNBQWUsQ0FBZixDQUFYLEdBQStCLGlDQUFlLENBQWYsQ0FBL0IsR0FBbUQsaUNBQWUsQ0FBZixDQUFuRDtBQUNILENBRkQ7O3FCQUllLFE7Ozs7Ozs7OztBQ05mOzs7Ozs7QUFFQTs7O0FBR0EsSUFBTSxnQkFBZ0IsU0FBaEIsYUFBZ0IsQ0FBUyxPQUFULEVBQWtCO0FBQ3BDLFdBQ0ksQ0FBQyxRQUFRLEVBQVIsQ0FBVyxJQUFYLENBQUQsSUFDRyxRQUFRLE9BQVIsQ0FBZ0IsSUFBaEIsRUFBc0IsRUFBdEIsQ0FBeUIsY0FBekIsQ0FESCxLQUlRLFFBQVEsT0FBUixDQUFnQixJQUFoQixFQUFzQixRQUF0QixDQUErQixlQUEvQixLQUNHLFFBQVEsT0FBUixDQUFnQixJQUFoQixFQUFzQixPQUF0QixDQUE4QixJQUE5QixFQUFvQyxFQUFwQyxDQUF1QyxjQUF2QyxDQUZQLElBSUcsUUFBUSxPQUFSLENBQWdCLElBQWhCLEVBQXNCLFFBQXRCLENBQStCLGdCQUEvQixDQVBQLENBREo7QUFXSCxDQVpEOztBQWNBOzs7O0FBSUEsSUFBTSxlQUFlLFNBQWYsWUFBZSxDQUFTLENBQVQsRUFBWTtBQUM3QixRQUFJLEtBQUssRUFBVDtBQUNBLFFBQU0sVUFBVSxFQUFFLEVBQUUsTUFBSixDQUFoQjtBQUNBLFFBQUksRUFBRSxLQUFGLEtBQVksc0JBQVMsSUFBekIsRUFBK0I7QUFDM0IsVUFBRSxjQUFGO0FBQ0E7QUFDQSxZQUFJLFFBQVEsUUFBUixDQUFpQixZQUFqQixDQUFKLEVBQW9DO0FBQ2hDLG9CQUFRLFFBQVIsQ0FBaUIsY0FBakIsRUFBaUMsSUFBakMsQ0FBc0MsVUFBdEMsRUFBa0QsS0FBbEQ7QUFDSCxTQUZELE1BRU8sSUFBSSxRQUFRLEVBQVIsQ0FBVyxJQUFYLENBQUosRUFBc0I7QUFDekIsb0JBQVEsSUFBUixDQUFhLElBQWIsRUFBbUIsSUFBbkIsQ0FBd0IsU0FBeEIsRUFBbUMsS0FBbkM7QUFDSCxTQUZNLE1BRUEsSUFBSSxRQUFRLFFBQVIsQ0FBaUIsWUFBakIsQ0FBSixFQUFvQztBQUN2QyxnQkFBSSxRQUFRLE9BQVIsQ0FBZ0IsS0FBaEIsRUFBdUIsUUFBdkIsQ0FBZ0MsVUFBaEMsQ0FBSixFQUFpRDtBQUM3QyxvQkFBSSxRQUFRLE9BQVIsQ0FBZ0IsV0FBaEIsRUFBNkIsSUFBN0IsQ0FBa0MsS0FBbEMsRUFBeUMsUUFBekMsQ0FBa0QsU0FBbEQsQ0FBSixFQUFrRTtBQUM5RCw0QkFBUSxPQUFSLENBQWdCLFdBQWhCLEVBQTZCLElBQTdCLENBQWtDLGFBQWxDLEVBQWlELElBQWpELENBQXNELFVBQXRELEVBQWtFLEtBQWxFO0FBQ0gsaUJBRkQsTUFFTztBQUNILHlCQUFLLFFBQVEsT0FBUixDQUFnQixJQUFoQixFQUFzQixJQUF0QixDQUEyQixJQUEzQixDQUFMO0FBQ0EsNkNBQXVCLEVBQXZCLFdBQWlDLEtBQWpDO0FBQ0g7QUFDSixhQVBELE1BT087QUFDSCxxQkFBSyxRQUFRLE9BQVIsQ0FBZ0IsSUFBaEIsRUFBc0IsSUFBdEIsQ0FBMkIsSUFBM0IsQ0FBTDtBQUNBLHlDQUF1QixFQUF2QixTQUErQixLQUEvQjtBQUNIO0FBQ0osU0FaTSxNQVlBO0FBQ0gsb0JBQVEsVUFBUjtBQUNIO0FBQ0osS0F0QkQsTUFzQk8sSUFBSSxFQUFFLEtBQUYsS0FBWSxzQkFBUyxFQUF6QixFQUE2QjtBQUNoQyxVQUFFLGNBQUY7QUFDQSxZQUFJLGNBQWMsT0FBZCxDQUFKLEVBQTRCO0FBQ3hCLG9CQUFRLE9BQVIsQ0FBZ0IsS0FBaEIsRUFBdUIsSUFBdkIsQ0FBNEIsSUFBNUIsRUFBa0MsS0FBbEM7QUFDSCxTQUZELE1BRU8sSUFBSSxRQUFRLFFBQVIsQ0FBaUIsWUFBakIsQ0FBSixFQUFvQztBQUN2QyxvQkFBUSxJQUFSLENBQWEsSUFBYixFQUFtQixJQUFuQixDQUF3QixpQkFBeEIsRUFBMkMsS0FBM0M7QUFDSCxTQUZNLE1BRUEsSUFBSSxRQUFRLEVBQVIsQ0FBVyxJQUFYLENBQUosRUFBc0I7QUFDekIsZ0JBQUksUUFBUSxPQUFSLENBQWdCLEtBQWhCLEVBQXVCLFFBQXZCLENBQWdDLFNBQWhDLENBQUosRUFBZ0Q7QUFDNUMsd0JBQVEsT0FBUixDQUFnQixhQUFoQixFQUErQixJQUEvQixDQUFvQyxjQUFwQyxFQUFvRCxJQUFwRCxDQUF5RCxjQUF6RCxFQUF5RSxLQUF6RTtBQUNILGFBRkQsTUFFTztBQUNILHFCQUFLLFFBQVEsT0FBUixDQUFnQixJQUFoQixFQUFzQixJQUF0QixDQUEyQixJQUEzQixDQUFMO0FBQ0EseUNBQXVCLEVBQXZCLFdBQWlDLEtBQWpDO0FBQ0g7QUFDSixTQVBNLE1BT0E7QUFDSCxvQkFBUSxVQUFSLENBQW1CLENBQUMsQ0FBcEI7QUFDSDtBQUNKO0FBQ0QsTUFBRSxlQUFGO0FBQ0gsQ0EzQ0Q7O3FCQTZDZSxZOzs7Ozs7OztBQ3BFZjtBQUNBO0FBQ0EsSUFBTSxzQkFBc0IsU0FBdEIsbUJBQXNCLENBQUMsS0FBRCxFQUFXO0FBQ25DLFFBQUksTUFBTSxhQUFOLENBQW9CLFNBQXhCLEVBQW1DO0FBQy9CLGVBQU8sUUFBUCxDQUFnQixNQUFoQjtBQUNIO0FBQ0osQ0FKRDs7cUJBTWUsbUI7Ozs7Ozs7O0FDUmY7QUFDQTtBQUNBLElBQU0sV0FBVyxTQUFYLFFBQVcsR0FBVyxDQUFFLENBQTlCLEMsQ0FBZ0M7cUJBQ2pCLFE7Ozs7Ozs7O0FDSGY7OztBQUdBLElBQU0sOEJBQThCLFNBQTlCLDJCQUE4QixHQUFZO0FBQzVDLFFBQU0sa0JBQWtCLEtBQUssR0FBTCxDQUFTLE9BQU8sV0FBaEIsTUFBaUMsRUFBekQ7QUFDQTtBQUNBLE1BQUUsa0JBQUYsRUFBc0IsSUFBdEIsQ0FBMkIsVUFBQyxLQUFELEVBQVEsRUFBUixFQUFlO0FBQ3RDLFlBQUksV0FBVyxFQUFFLEVBQUYsRUFBTSxRQUFOLEVBQWY7QUFDQSxhQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksU0FBUyxNQUE3QixFQUFxQyxHQUFyQyxFQUEwQztBQUN0QyxjQUFFLFNBQVMsQ0FBVCxDQUFGLEVBQWUsTUFBZjtBQUNIOztBQUVELG1CQUFXLFNBQVMsS0FBVCxDQUFlLENBQWYsRUFBa0IsQ0FBbEIsQ0FBWDtBQUNBLGlCQUFTLFFBQVQsQ0FBa0IsV0FBbEI7QUFDQSxVQUFFLEVBQUYsRUFBTSxRQUFOLENBQWUsYUFBZixFQUE4QixHQUE5QixDQUFrQyxZQUFsQyxFQUFnRCxRQUFoRDs7QUFFQSxZQUFJLGVBQUosRUFBcUI7QUFDakIscUJBQVMsSUFBVCxHQUFnQixJQUFoQjtBQUNIO0FBQ0osS0FiRDtBQWNBLE1BQUUsbUJBQUYsRUFBdUIsTUFBdkIsR0FqQjRDLENBaUJYO0FBQ3BDLENBbEJEOztBQW9CQTs7O0FBR0EsSUFBTSx3Q0FBd0MsU0FBeEMscUNBQXdDLEdBQVk7QUFDdEQsV0FBTyxtQkFBUCxHQUE2QixZQUFZO0FBQ3JDLFVBQUUsa0JBQUYsRUFBc0IsSUFBdEIsQ0FBMkIsVUFBQyxLQUFELEVBQVEsRUFBUjtBQUFBLG1CQUN2QixFQUFFLEVBQUYsRUFBTSxRQUFOLEdBQWlCLElBQWpCLEdBQXdCLElBQXhCLEVBRHVCO0FBQUEsU0FBM0I7QUFHSCxLQUpEO0FBS0gsQ0FORDs7QUFRQTs7OztBQUlBLElBQU0sc0NBQXNDLFNBQXRDLG1DQUFzQyxDQUFVLE1BQVYsRUFBa0I7QUFDMUQsUUFBTSxTQUFTLFFBQVEsUUFBUixDQUFmO0FBQ0EsUUFBSSxjQUFjLE9BQU8sTUFBUCxDQUFjLE9BQU8sU0FBckIsQ0FBbEI7QUFDQSxRQUFNLGVBQ0YsT0FBTyxPQUFQLElBQ0EsT0FBTyxTQUFQLENBQWlCLFdBQWpCLEVBQThCLFNBQTlCLENBREEsSUFFQSxDQUFDLENBQUMsT0FBTyxTQUFQLENBQWlCLFNBQWpCLENBQTJCLEtBQTNCLENBQWlDLE1BQWpDLENBSE47QUFJQSxRQUFNLGVBQWUsT0FBTyxPQUFQLElBQWtCLFNBQVMsT0FBTyxTQUFoQixFQUEyQixFQUEzQixJQUFpQyxDQUF4RTs7QUFFQSxRQUFJLGdCQUFnQixZQUFwQixFQUFrQztBQUM5QjtBQUNBO0FBQ0g7QUFDSixDQWJEOztRQWVTLG1DLEdBQUEsbUM7Ozs7Ozs7O0FDckRULElBQU0sVUFBVSxTQUFWLE9BQVUsQ0FBUyxJQUFULEVBQWU7QUFDM0IsUUFBTSxJQUFJLElBQUksSUFBSixFQUFWO0FBQ0EsTUFBRSxPQUFGLENBQVUsRUFBRSxPQUFGLEtBQWMsT0FBTyxFQUFQLEdBQVksRUFBWixHQUFpQixFQUFqQixHQUFzQixJQUE5QztBQUNBLFdBQU8sRUFBRSxXQUFGLEVBQVA7QUFDSCxDQUpEOztxQkFNZSxPOzs7Ozs7Ozs7QUNOZjs7Ozs7O0FBRUE7OztBQUdBLElBQU0seURBQXlELFNBQXpELHNEQUF5RCxHQUFXO0FBQ3RFLFFBQUksT0FBTyxPQUFQLElBQWtCLE9BQU8sT0FBUCxDQUFlLEdBQWYsQ0FBbUIsa0JBQW5CLE1BQTJDLEdBQWpFLEVBQXNFO0FBQ2xFLHlFQUErQyxlQUEvQyxFQUFnRSxDQUFDLENBQWpFO0FBQ0g7QUFDSixDQUpEOztxQkFNZSxzRDs7Ozs7Ozs7QUNYZixJQUFNLDhDQUFBLEdBQWlELFNBQWpELDhDQUFpRCxDQUFDLElBQUQsRUFBTyxjQUFQLEVBQTBCO0lBQzdFLENBQUEsQ0FBRSw4RUFBRixDQUFBLENBQWtGLElBQWxGLENBQXVGLFVBQUMsS0FBRCxFQUFRLEVBQVIsRUFBZTtRQUNsRyxFQUFBLENBQUcsS0FBSCxDQUFTLFdBQVQsQ0FBcUIsYUFBckIsRUFBb0MsSUFBcEMsRUFBMEMsV0FBMUMsQ0FBQSxDQUFBO1FBQ0EsSUFBTSxHQUFBLEdBQU0sQ0FBQSxDQUFFLEVBQUYsQ0FBWixDQUFBO1FBQ0EsSUFBSSxHQUFBLENBQUksUUFBSixFQUFBLENBQWUsTUFBZixLQUEwQixDQUExQixJQUFnQyxHQUFBLENBQUksUUFBSixFQUFBLENBQWUsTUFBZixLQUEwQixDQUExQixJQUErQixHQUFBLENBQUksUUFBSixDQUFhLEdBQWIsQ0FBQSxDQUFrQixNQUFsQixJQUE0QixDQUEvRixFQUFtRztZQUMvRixJQUFNLFFBQUEsR0FBVyxRQUFBLENBQVMsR0FBQSxDQUFJLEdBQUosQ0FBUSxXQUFSLENBQVQsRUFBK0IsRUFBL0IsQ0FBakIsQ0FBQTtZQUNBLEdBQUEsQ0FBSSxHQUFKLENBQVEsV0FBUixFQUF3QixRQUFBLEdBQVcsY0FBbkMsR0FBQSxJQUFBLENBQUEsQ0FBQTtTQUNIO0tBTkwsQ0FBQSxDQUFBO0NBREosQ0FBQTs7cUJBV2U7Ozs7Ozs7OztBQ1hmOzs7OztBQUtBLElBQU0sNEJBQTRCLFNBQTVCLHlCQUE0QixDQUFTLEdBQVQsRUFBYztBQUM1QyxTQUFPLG1CQUFtQixHQUFuQixFQUF3QixPQUF4QixDQUFnQyxXQUFoQyxFQUE2QyxNQUE3QyxDQUFQO0FBQ0gsQ0FGRDs7cUJBSWUseUI7Ozs7Ozs7O0FDVGY7Ozs7QUFJQSxJQUFNLGVBQWUsU0FBZixZQUFlLENBQVMsT0FBVCxFQUFrQjtBQUNuQyxRQUFJLFdBQVcsSUFBZixFQUFxQjtBQUNqQixhQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksUUFBUSxNQUE1QixFQUFvQyxHQUFwQyxFQUF5QztBQUNyQyxnQkFBTSxNQUFNLFFBQVEsQ0FBUixDQUFaO0FBQ0EsZ0JBQUksSUFBSSxFQUFKLEtBQVcsa0JBQVgsSUFDTyxJQUFJLEVBQUosS0FBVyxpQkFEbEIsSUFFTyxJQUFJLEVBQUosS0FBVyxlQUZsQixJQUdPLElBQUksRUFBSixLQUFXLGlCQUh0QixFQUd5QztBQUNyQyx1QkFBTyxJQUFJLEVBQVg7QUFDSDtBQUNKO0FBQ0o7QUFDRCxXQUFPLElBQVA7QUFDSCxDQWJEOztxQkFlZSxZOzs7Ozs7OztBQ25CZixJQUFNLE9BQU8sT0FBTyxNQUFQLENBQWM7QUFDdkIsU0FBSyxDQURrQjtBQUV2QixXQUFPLEVBRmdCO0FBR3ZCLFVBQU0sRUFIaUI7QUFJdkIsUUFBSSxFQUptQjtBQUt2QixXQUFPLEVBTGdCO0FBTXZCLFVBQU0sRUFOaUI7QUFPdkIsV0FBTyxFQVBnQjtBQVF2QixTQUFLO0FBUmtCLENBQWQsQ0FBYjtxQkFVZSxJOzs7Ozs7OztjQ1ZELE07SUFBTixDLFdBQUEsQzs7O0FBRVIsSUFBTSxTQUFTO0FBQ1gsT0FEVyxlQUNQLEtBRE8sRUFDQSxPQURBLEVBQ1MsTUFEVCxFQUNpQjtBQUN4QixZQUFNLE9BQU87QUFDVCxtQkFBTyxTQUFTLE1BRFA7QUFFVCxxQkFBUyxXQUFXLHNCQUZYO0FBR1Qsb0JBQVE7QUFDSixzQkFBTSxPQUFPLFFBQVAsQ0FBZ0I7QUFEbEI7QUFIQyxTQUFiOztBQVFBLFlBQUksVUFBVSxPQUFkLEVBQXVCO0FBQ25CLGlCQUFLLE1BQUwsQ0FBWSxVQUFaLEdBQXlCLElBQUksS0FBSixHQUFZLEtBQXJDO0FBQ0g7O0FBRUQsWUFBSSxDQUFDLEVBQUUsTUFBRixFQUFVLE9BQVYsRUFBTCxFQUEwQjtBQUN0QixtQkFBTyxNQUFQLENBQWMsS0FBSyxNQUFuQixFQUEyQixNQUEzQjtBQUNIOztBQUVEO0FBQ0EsZ0JBQVEsR0FBUixDQUFZLElBQVo7O0FBRUEsWUFBTSxjQUFjLEtBQUssU0FBTCxDQUFlLElBQWYsQ0FBcEI7O0FBRUEsWUFBSSxVQUFVLElBQUksY0FBSixFQUFkO0FBQ0EsZ0JBQVEsSUFBUixDQUFhLE1BQWIsRUFBcUIsTUFBckIsRUFBNkIsSUFBN0I7QUFDQSxnQkFBUSxnQkFBUixDQUF5QixjQUF6QixFQUF5QyxrQkFBekM7QUFDQSxnQkFBUSxJQUFSLENBQWEsV0FBYjtBQUNIO0FBM0JVLENBQWY7O3FCQThCZSxPQUFPLE1BQVAsQ0FBYyxNQUFkLEM7Ozs7Ozs7O0FDaENmLElBQU0sU0FBUyxTQUFULE1BQVMsQ0FBUyxNQUFULEVBQWlCLE9BQWpCLEVBQTBCLElBQTFCLEVBQWdDO0FBQzNDO0FBQ0EsUUFBTSxhQUFhLEtBQUssT0FBTCxDQUFhLG1CQUFtQixzQkFBbkIsQ0FBYixFQUF5RCxFQUF6RCxFQUE2RCxPQUE3RCxDQUFxRSxxQ0FBckUsRUFBNEcsRUFBNUcsQ0FBbkI7QUFDQSxRQUFNLGNBQWMsT0FBTyxHQUFQLENBQVcsT0FBTyxNQUFQLENBQWMsb0JBQXpCLEVBQStDLEVBQUMsU0FBUyxVQUFWLEVBQXNCLFFBQVEsQ0FBQyxNQUFELEVBQVMsT0FBVCxFQUFrQixJQUFsQixDQUF1QixHQUF2QixDQUE5QixFQUEvQyxDQUFwQjtBQUNBLE1BQUUsa0JBQUYsRUFBc0IsSUFBdEIsQ0FBMkIsTUFBM0IsRUFBbUMsV0FBbkM7QUFDSCxDQUxEOztxQkFPZSxNOzs7Ozs7OztBQ1BmLElBQU0sWUFBWSxTQUFaLFNBQVksR0FBTTtBQUNwQixVQUFNLElBQUksS0FBSixDQUFVLG1CQUFWLENBQU47QUFDSCxDQUZEOztRQUtJLFMsR0FBQSxTOzs7Ozs7Ozs7O0FDTEo7Ozs7OztBQUVBLElBQU0sbUJBQW1CLFNBQW5CLGdCQUFtQixDQUFDLEVBQUQsRUFBSyxLQUFMLEVBQWU7QUFDcEMsUUFBSSxRQUFRLEdBQUcsV0FBSCxFQUFaO0FBQ0EsUUFBSSxHQUFHLENBQUgsTUFBVSxHQUFkLEVBQW1CO0FBQ2YsZ0JBQVEsR0FBRyxNQUFILENBQVUsQ0FBVixDQUFSLENBRGUsQ0FDTztBQUN6QjtBQUNELFFBQU0sV0FBVyx5QkFBWSxLQUFaLENBQWtCLEtBQWxCLENBQWpCO0FBQ0EsV0FBTyxTQUFTLEtBQVQsQ0FBUDtBQUNBLGlCQUFXLHlCQUFZLFNBQVosQ0FBc0IsUUFBdEIsQ0FBWCxDQVBvQyxDQU9VO0FBQ2pELENBUkQ7O1FBV0ksZ0IsR0FBQSxnQjs7Ozs7Ozs7O3FCQ2JXLFVBQVMsU0FBVCxFQUFvQjtBQUMvQixRQUFNLFVBQVUsRUFBRSxZQUFGLENBQWUsT0FBL0I7QUFDQSxXQUFPLEVBQUUsWUFBRixDQUFlLE9BQXRCO0FBQ0EsUUFBTSxVQUFVLFdBQWhCO0FBQ0EsTUFBRSxZQUFGLENBQWUsT0FBZixHQUF5QixPQUF6QjtBQUNBLFdBQU8sT0FBUDtBQUNILEM7Ozs7Ozs7Ozs7QUNORDs7Ozs7O0FBRUEsSUFBTSxTQUFTLHFCQUFRLE1BQXZCOztBQUVBLElBQU0sTUFBTSxTQUFOLEdBQU0sQ0FBUyxLQUFULEVBQWdCLFVBQWhCLEVBQTRCO0FBQ3BDLFFBQU0sU0FBUyxxQkFBUSxXQUFSLENBQW9CLEVBQUMsU0FBUyxPQUFPLFNBQVAsQ0FBaUIsUUFBM0IsRUFBcEIsRUFBMEQsS0FBMUQsRUFBaUUsVUFBakUsQ0FBZjs7QUFFQSxRQUFJLENBQUMsTUFBTCxFQUFhO0FBQ1QsWUFBSTtBQUNBLGdCQUFJLCtCQUE2QixLQUFqQztBQUNBLGdCQUFJLGNBQWMsSUFBbEIsRUFBd0I7QUFDcEIsb0JBQU0saUJBQWlCLEtBQUssU0FBTCxDQUFlLFVBQWYsQ0FBdkI7QUFDQSxpREFBK0IsY0FBL0I7QUFDSDs7QUFFRCxnQkFBTSxRQUFRLElBQUksS0FBSixDQUFVLE9BQVYsQ0FBZDs7QUFFQSxnQkFBSSxPQUFPLEtBQVAsSUFBZ0IsT0FBTyxLQUFQLENBQWEsV0FBakMsRUFBOEM7QUFDMUMsdUJBQU8sS0FBUCxDQUFhLFdBQWIsQ0FBeUIsS0FBekI7QUFDSCxhQUZELE1BRU8sSUFBSSxPQUFPLE9BQVAsSUFBa0IsT0FBTyxPQUFQLENBQWUsS0FBckMsRUFBNEM7QUFDL0MsdUJBQU8sT0FBUCxDQUFlLEtBQWYsQ0FBcUIsS0FBckI7QUFDSDtBQUNKLFNBZEQsQ0FjRSxPQUFPLENBQVAsRUFBVTtBQUNSO0FBQ0g7QUFDSjtBQUNELFdBQU8sTUFBUDtBQUNILENBdkJEOztRQTBCSSxHLEdBQUEsRztRQUNBLE0sR0FBQSxNOzs7Ozs7Ozs7QUMvQko7O0FBRUE7cUJBQ2UsWUFBTTtBQUNqQixNQUFFLFlBQU07QUFDSixZQUFJO0FBQ0EsbUJBQU8sRUFBRSxZQUFGLENBQWUsT0FBZixDQUF1QixZQUF2QixDQUFQOztBQUVBLGNBQUUscUJBQUYsRUFBeUIsSUFBekIsQ0FBOEIsVUFBQyxDQUFELEVBQUksRUFBSixFQUFXO0FBQ3JDLG9CQUFJLE9BQU8sRUFBRSxFQUFGLENBQVg7QUFDQSxvQkFBSSxNQUFNLEtBQUssSUFBTCxDQUFVLFVBQVYsQ0FBVjs7QUFFQSxvQkFBSSxDQUFDLEVBQUUsR0FBRixFQUFPLE9BQVAsRUFBRCxJQUFxQixDQUFDLEtBQUssSUFBTCxFQUExQixFQUF1QztBQUNuQyxzQkFBRSxHQUFGLENBQU0sdUNBQW1CLEdBQW5CLENBQU4sRUFBaUMsSUFBakMsQ0FBc0MsVUFBQyxRQUFELEVBQWM7QUFDaEQsNEJBQUksQ0FBQyxLQUFLLElBQUwsRUFBTCxFQUFrQjtBQUNkLGlDQUFLLE1BQUwsQ0FBWSxFQUFFLEtBQUYsRUFBUyxRQUFULENBQVo7QUFDSDtBQUNKLHFCQUpEO0FBS0g7QUFDSixhQVhEO0FBWUgsU0FmRCxTQWdCUTtBQUNKLGNBQUUsU0FBRixDQUFZO0FBQ1IseUJBQVMsRUFBQyxjQUFjLEVBQUUsT0FBRixFQUFXLEdBQVgsTUFBb0IsVUFBVSxLQUE3QztBQURELGFBQVo7QUFHSDtBQUNKLEtBdEJEO0FBdUJILEM7Ozs7Ozs7Ozs7QUMzQkQ7O0FBRUEsSUFBTSxtQkFBbUIsU0FBbkIsZ0JBQW1CLENBQUMsR0FBRDtBQUFBLGlCQUFhLEdBQWI7QUFBQSxDQUF6Qjs7QUFFQSxJQUFNLG1CQUFtQixTQUFuQixnQkFBbUIsQ0FBQyxHQUFEO0FBQUEsa0JBQWMsR0FBZDtBQUFBLENBQXpCOztBQUVBLElBQU0saUJBQWlCLFNBQWpCLGNBQWlCLENBQUMsYUFBRCxFQUFtQjtBQUN0QyxRQUFNLFdBQVcsU0FBUyxhQUFULENBQXVCLFVBQXZCLENBQWpCO0FBQ0EsYUFBUyxTQUFULEdBQXFCLGFBQXJCO0FBQ0EsV0FBTyxTQUFTLEtBQWhCO0FBQ0gsQ0FKRDs7QUFNQSxJQUFNLGNBQWMsQ0FDaEIsR0FEZ0IsRUFFaEIsR0FGZ0IsRUFHaEIsR0FIZ0IsRUFJaEIsR0FKZ0IsRUFLaEIsR0FMZ0IsRUFNaEIsR0FOZ0IsRUFPaEIsR0FQZ0IsRUFRaEIsR0FSZ0IsRUFTaEIsR0FUZ0IsRUFVaEIsR0FWZ0IsRUFXaEIsR0FYZ0IsRUFZaEIsR0FaZ0IsRUFhaEIsR0FiZ0IsRUFjaEIsR0FkZ0IsRUFlaEIsR0FmZ0IsQ0FBcEI7O0FBa0JBLElBQU0sa0JBQWtCLFNBQWxCLGVBQWtCLENBQUMsT0FBRCxFQUFhO0FBQ2pDLFFBQUksZUFBZSxPQUFuQjtBQUNBLGdCQUFZLE9BQVosQ0FBb0IsVUFBQyxFQUFELEVBQVE7QUFDeEIsWUFBTSxVQUFVLElBQUksTUFBSixRQUFnQixFQUFoQixFQUFzQixHQUF0QixDQUFoQjtBQUNBLHVCQUFlLGFBQWEsT0FBYixDQUFxQixPQUFyQixFQUE4QixFQUE5QixDQUFmO0FBQ0gsS0FIRDtBQUlBLFdBQU8sWUFBUDtBQUNILENBUEQ7O0FBU0EsSUFBTSw0QkFBNEIsU0FBNUIseUJBQTRCLEdBQU07QUFDcEMsUUFBSSxrQkFBa0IsRUFBdEI7QUFDQSxnQkFBWSxPQUFaLENBQW9CLFVBQUMsRUFBRCxFQUFRO0FBQ3hCLFlBQUksb0JBQW9CLEVBQXhCLEVBQTRCO0FBQ3hCLHFDQUF1QixFQUF2QjtBQUNILFNBRkQsTUFFTztBQUNILDhCQUFxQixlQUFyQixXQUEwQyxFQUExQztBQUNIO0FBQ0osS0FORDtBQU9BLGlCQUFXLGVBQVg7QUFDSCxDQVZEOztBQVlBLElBQU0sa0JBQWtCLFNBQWxCLGVBQWtCLE9BTWxCO0FBQUEseUJBTEYsSUFLRTtBQUFBLFFBTEYsSUFLRSw2QkFMSyw0QkFLTDtBQUFBLDRCQUpGLE9BSUU7QUFBQSxRQUpGLE9BSUUsZ0NBSlEsNEJBSVI7QUFBQSx3QkFIRixHQUdFO0FBQUEsUUFIRixHQUdFLDRCQUhJLDRCQUdKO0FBQUEsK0JBRkYsVUFFRTtBQUFBLFFBRkYsVUFFRSxtQ0FGVyxLQUVYO0FBQUEsMkJBREYsTUFDRTtBQUFBLFFBREYsTUFDRSwrQkFETyxLQUNQOztBQUNGO0FBQ0EsUUFBTSxlQUFlLGdCQUFnQixPQUFoQixDQUFyQjtBQUNBO0FBQ0EsUUFBTSxnQkFBYyxhQUNmLEtBRGUsQ0FDVCxFQURTLEVBRWYsSUFGZSxDQUVWLDJCQUZVLENBQWQsTUFBTjtBQUdBLFFBQU0sY0FBVyxhQUFhLEdBQWIsR0FBbUIsRUFBOUIsS0FBbUMsU0FBUyxHQUFULEdBQWUsRUFBbEQsQ0FBTjtBQUNBLFFBQU0sU0FBUyxJQUFJLE1BQUosQ0FBVyxPQUFYLEVBQW9CLEtBQXBCLENBQWY7QUFDQSxRQUFNLGVBQWtCLGlCQUFpQixHQUFqQixDQUFsQixVQUE0QyxpQkFBaUIsR0FBakIsQ0FBbEQ7QUFDQSxXQUFPLEtBQUssT0FBTCxDQUFhLE1BQWIsRUFBcUIsWUFBckIsQ0FBUDtBQUNILENBakJEOztBQW1CQSxJQUFNLGNBQWMsU0FBZCxXQUFjLFFBS2Q7QUFBQSwyQkFKRixJQUlFO0FBQUEsUUFKRixJQUlFLDhCQUpLLDRCQUlMO0FBQUEsaUNBSEYsVUFHRTtBQUFBLFFBSEYsVUFHRSxvQ0FIVyxLQUdYO0FBQUEsNkJBRkYsTUFFRTtBQUFBLFFBRkYsTUFFRSxnQ0FGTyxLQUVQO0FBQUEsc0NBREYsZ0JBQ0U7QUFBQSxRQURGLGdCQUNFLHlDQURpQixLQUNqQjs7QUFDRixRQUFNLFVBQVUseUJBQ04sS0FBSyxLQUFMLENBQVcsRUFBWCxFQUFlLElBQWYsQ0FBb0IsWUFBcEIsQ0FETSxTQUVWLElBRk47QUFHQSxRQUFNLGNBQVcsYUFBYSxHQUFiLEdBQW1CLEVBQTlCLEtBQW1DLFNBQVMsR0FBVCxHQUFlLEVBQWxELENBQU47QUFDQSxRQUFNLFNBQVMsSUFBSSxNQUFKLENBQVcsT0FBWCxFQUFvQixLQUFwQixDQUFmO0FBQ0EsV0FBTyxNQUFQO0FBQ0gsQ0FaRDs7UUFlSSxnQixHQUFBLGdCO1FBQ0EsZ0IsR0FBQSxnQjtRQUNBLGMsR0FBQSxjO1FBQ0EsZSxHQUFBLGU7UUFDQSxXLEdBQUEsVzs7Ozs7Ozs7QUN6RkosSUFBTSxZQUFZLFNBQVosU0FBWSxDQUFTLFVBQVQsRUFBcUIsS0FBckIsRUFBNEIsT0FBNUIsRUFBcUM7QUFDbkQsWUFBUSxTQUFTLENBQWpCO0FBQ0EsY0FBVSxXQUFXLEVBQXJCO0FBQ0EsUUFBSSxXQUFXLFdBQVcsUUFBWCxDQUFvQixZQUFwQixDQUFmOztBQUVBLGFBQVMsV0FBVCxDQUFxQixRQUFyQjtBQUNBLFFBQUksQ0FBQyxRQUFRLE9BQWIsRUFBc0I7QUFBRTtBQUNwQixpQkFBUyxJQUFULENBQWMsVUFBQyxDQUFELEVBQUksRUFBSixFQUFXO0FBQ3JCLGdCQUFJLGFBQWEsT0FBTyxJQUFQLENBQVkseUJBQVosRUFBdUMsRUFBQyxRQUFRLElBQUksQ0FBYixFQUFnQixlQUFlLEtBQS9CLEVBQXZDLENBQWpCO0FBQ0EsZ0JBQUksUUFBUSxTQUFaLEVBQXVCO0FBQ25CLDZCQUFhLE9BQU8sSUFBUCxDQUFZLDJCQUFaLEVBQXlDLEVBQUMsUUFBUSxJQUFJLENBQWIsRUFBZ0IsZUFBZSxLQUEvQixFQUF6QyxDQUFiO0FBQ0g7QUFDRCxjQUFFLEVBQUYsRUFBTSxJQUFOLENBQVcsWUFBWCxFQUF5QixVQUF6QjtBQUNILFNBTkQ7QUFPSDs7QUFFRCxlQUFXLFNBQVMsTUFBVCxDQUFnQixVQUFDLENBQUQ7QUFBQSxlQUFRLElBQUksQ0FBTCxJQUFXLEtBQUssS0FBTCxDQUFXLEtBQVgsQ0FBbEI7QUFBQSxLQUFoQixFQUNWLFFBRFUsQ0FDRCxRQURDLENBQVg7O0FBR0EsUUFBSSxRQUFRLFNBQVosRUFBdUI7QUFDbkIsaUJBQ0ssSUFETCxHQUVLLElBRkwsQ0FFVSxZQUZWLEVBRXdCLE9BQU8sSUFBUCxDQUFZLHlCQUFaLEVBQXVDLEVBQUMsWUFBRCxFQUF2QyxDQUZ4QjtBQUdIO0FBQ0osQ0F4QkQ7O3FCQTBCZSxTOzs7Ozs7Ozs7QUMxQmY7O0FBQ0E7O0FBRUEsSUFBTSwwQkFBMEIsU0FBMUIsdUJBQTBCLENBQVMsSUFBVCxFQUFlLE9BQWYsRUFBd0I7QUFDcEQsTUFBRSxJQUFGLENBQU8sS0FBSyxjQUFMLEVBQVAsRUFBOEIsSUFBOUIsQ0FBbUMsVUFBQyxTQUFELEVBQWU7QUFDOUMsWUFBSSxjQUFjLEVBQWxCLEVBQXNCO0FBQ2xCLGdCQUFNLFFBQVEsS0FBSyxLQUFuQjtBQUNBLGdCQUFNLFNBQVMsS0FBSyxJQUFMLENBQVUsRUFBekI7QUFDQSxnQkFBTSxXQUFXLEtBQUssSUFBTCxDQUFVLElBQTNCO0FBQ0EsZ0JBQU0sVUFBVSxLQUFLLE1BQUwsQ0FBWSxZQUFaLENBQXlCLElBQXpCLElBQWlDLElBQWpDLEdBQXdDLDhCQUFZLHdCQUFaLENBQXhDLEdBQWdGLEtBQUssTUFBTCxDQUFZLFlBQVosQ0FBeUIsSUFBekg7QUFDQSxnQkFBTSxpQkFBaUIsbUJBQUssV0FBTCxFQUFrQixFQUFDLEdBQUcsS0FBSyxvQkFBVCxFQUFsQixDQUF2QjtBQUNBLGdCQUFNLGVBQWUsS0FBSyxpQkFBMUI7QUFDQSxnQkFBTSxVQUFVLE9BQWhCOztBQUVBLGdCQUFNLFFBQVEsRUFBRSxxQkFBRixDQUFkO0FBQ0EsY0FBRSxtQkFBRixFQUF1QixJQUF2QixDQUE0QixLQUE1QjtBQUNBLGNBQUUseUJBQUYsRUFBNkIsV0FBN0IsR0FBMkMsUUFBM0MsV0FBNEQsTUFBNUQ7QUFDQSxjQUFFLHlCQUFGLEVBQTZCLElBQTdCLENBQWtDLFFBQWxDO0FBQ0EsY0FBRSx5QkFBRixFQUE2QixJQUE3QixDQUFrQyxLQUFsQyxFQUF5QyxPQUF6QztBQUNBLGdCQUFJLGtCQUFrQixJQUFsQixJQUEwQixZQUE5QixFQUE0QztBQUN4QyxrQkFBRSwrQkFBRixFQUFtQyxJQUFuQyxDQUF3QyxPQUFPLElBQVAsQ0FBWSxpQ0FBWixFQUErQyxFQUFDLE1BQU0sY0FBUCxFQUEvQyxDQUF4QyxFQUFnSCxXQUFoSCxDQUE0SCxRQUE1SDtBQUNILGFBRkQsTUFFTztBQUNILGtCQUFFLCtCQUFGLEVBQW1DLElBQW5DLENBQXdDLEVBQXhDLEVBQTRDLFFBQTVDLENBQXFELFFBQXJEO0FBQ0g7O0FBRUQsY0FBRSx3QkFBRixFQUE0QixJQUE1QixDQUFpQyxFQUFDLGlCQUFpQixPQUFsQixFQUEyQixrQkFBa0IsTUFBN0MsRUFBakM7O0FBRUE7QUFDQSxnQkFBSSxLQUFLLFNBQUwsQ0FBZSxFQUFmLElBQXFCLEtBQXJCLElBQThCLEtBQUssU0FBTCxDQUFlLEVBQWYsSUFBcUIsS0FBbkQsSUFBNEQsUUFBUSxHQUFSLENBQVkscUJBQVosTUFBdUMsR0FBdkcsRUFBNEc7QUFDeEcsa0JBQUUsb0JBQUYsRUFBd0IsVUFBeEIsQ0FBbUMsUUFBbkMsRUFBNkMsTUFBN0M7QUFDSCxhQUZELE1BRU87QUFDSCxzQkFBTSxVQUFOLENBQWlCLFFBQWpCLEVBQTJCLE1BQTNCO0FBQ0g7QUFDSixTQTVCRCxNQTRCTztBQUNILGlCQUFLLFNBQUwsQ0FBZSxPQUFmLEVBQXdCLFNBQXhCLEVBQW1DLEVBQUUsTUFBRixDQUFuQztBQUNIO0FBQ0osS0FoQ0Q7QUFpQ0gsQ0FsQ0Q7O3FCQW9DZSx1Qjs7Ozs7Ozs7QUN2Q2Y7OztBQUdBLElBQU0sd0JBQXdCLFNBQXhCLHFCQUF3QixDQUFTLFNBQVQsRUFBb0I7QUFDOUMsUUFBTSx1QkFBdUIsc0NBQW9DLFVBQVUsRUFBOUMsU0FBc0QsSUFBdEQsRUFBN0I7O0FBRUEsTUFBRSxRQUFGLEVBQVksVUFBWixDQUF1QixRQUF2QixFQUFpQyxPQUFqQzs7QUFFQSxRQUFNLFdBQVcsVUFBVSxNQUEzQjtBQUNBLFFBQU0sYUFBYSxFQUFFLHdEQUFGLENBQW5COztBQUVBLG9DQUE4QixVQUFVLEVBQXhDLFNBQWdELElBQWhELENBQXFELG9CQUFyRDtBQUNBLE1BQUUsbUJBQUYsRUFBdUIsSUFBdkIsQ0FBNEIsVUFBVSxLQUF0QztBQUNBLE1BQUUseUJBQUYsRUFBNkIsSUFBN0IsQ0FBa0MsS0FBbEMsRUFBeUMsVUFBVSxLQUFuRDs7QUFFQSxlQUFXLElBQVgsQ0FBZ0IsWUFBaEIsRUFBOEIsVUFBVSxLQUF4QyxFQUErQyxJQUEvQyxDQUFvRCxjQUFwRCxFQUFvRSxVQUFVLEtBQTlFLEVBQ0ssSUFETCxDQUNVLFdBRFYsRUFDdUIsUUFEdkIsRUFDaUMsSUFEakMsQ0FDc0MsZ0JBRHRDLEVBQ3dELFNBQVMsV0FBVCxFQUR4RCxFQUNnRixJQURoRixDQUNxRixrQkFEckYsRUFDeUcsVUFBVSxVQURuSDs7QUFHQSxZQUFRLGlCQUFSLENBQTBCLFVBQTFCLEVBQXNDLE1BQXRDOztBQUVBLGVBQVcsSUFBWCxDQUFnQixlQUFoQixFQUFpQyxVQUFVLEVBQTNDLEVBQStDLElBQS9DLENBQW9ELE1BQXBELEVBQTRELG9CQUE1RCxFQUFrRixJQUFsRixDQUF1RixhQUF2RixFQUFzRyxNQUF0RztBQUNBLE1BQUUsd0JBQUYsRUFBNEIsVUFBNUIsQ0FBdUMsUUFBdkMsRUFBaUQsTUFBakQ7QUFDSCxDQW5CRDs7cUJBc0JlLHFCOzs7Ozs7Ozs7OztBQ3pCZjs7OztBQUNBOzs7O0FBQ0E7Ozs7Ozs7O0lBRXFCLHNCO0FBQ2pCLG9DQUFZLFVBQVosRUFBd0IsR0FBeEIsRUFBNkIsS0FBN0IsRUFBb0M7QUFBQTs7QUFDaEMsWUFBSSxPQUFPLHlCQUFZLEdBQVosQ0FBZ0IsUUFBaEIsRUFBMEIsQ0FBMUIsQ0FBWDtBQUNBLGFBQUssU0FBTCxHQUFpQixPQUFPLEtBQUssS0FBTCxDQUFXLEdBQVgsQ0FBUCxHQUF5QixFQUExQztBQUNBLGFBQUssTUFBTCxHQUFjLEtBQUssU0FBTCxDQUFlLENBQWYsS0FBcUIsSUFBbkM7QUFDQSxhQUFLLE9BQUwsR0FBZSxLQUFLLFNBQUwsQ0FBZSxDQUFmLEtBQXFCLElBQXBDO0FBQ0EsYUFBSyxNQUFMLEdBQWMsS0FBSyxTQUFMLENBQWUsQ0FBZixLQUFxQixDQUFuQztBQUNBLGFBQUssS0FBTCxHQUFhLFNBQVMsSUFBdEI7QUFDQSxhQUFLLFVBQUwsR0FBa0IsV0FBVyxNQUE3QjtBQUNBLGFBQUssR0FBTCxHQUFXLEdBQVg7QUFDSDs7QUFFRDs7Ozs7d0NBQ2dCO0FBQUE7O0FBQ1osZ0JBQUksQ0FBQyxLQUFLLE1BQU4sSUFBZ0IsQ0FBQyxLQUFLLE9BQTFCLEVBQW1DO0FBQy9CO0FBQ0g7O0FBRUQsZ0JBQ0ksQ0FBQyxLQUFLLEtBQU4sSUFDQyxLQUFLLEtBQUwsSUFBYyxLQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsSUFBZixNQUF5QixLQUFLLE9BRmpELEVBR0U7QUFDRSxxQkFBSyxLQUFMLEdBQWEsRUFBRSxJQUFGLENBQ1QsS0FBSyxVQURJLEVBRVQsVUFBQyxLQUFEO0FBQUEsMkJBQVcsTUFBTSxFQUFOLEtBQWEsTUFBSyxPQUE3QjtBQUFBLGlCQUZTLENBQWI7QUFJSDs7QUFFRCxnQkFBSSxlQUFlLElBQUkseUJBQUosQ0FBaUIsRUFBRSxLQUFLLEtBQUssR0FBWixFQUFqQixDQUFuQjs7QUFFQSxnQkFBSSxLQUFLLEtBQVQsRUFBZ0I7QUFDWjtBQUNBLHlDQUFZLE1BQVosQ0FBbUIsUUFBbkI7QUFDQSxxQkFBSyxLQUFMLENBQVcsR0FBWCxDQUFlLGdCQUFmLEVBQWlDLEtBQUssTUFBdEM7QUFDQSw2QkFBYSxPQUFiLENBQXFCLEtBQUssTUFBMUIsRUFBa0MsS0FBSyxLQUF2QztBQUNILGFBTEQsTUFLTztBQUNIO0FBQ0Esb0JBQUksUUFBUSxJQUFJLGtCQUFKLEVBQVo7QUFDQSxvQkFBSSxVQUFVLElBQUksT0FBSixDQUFZLFVBQUMsT0FBRCxFQUFVLE1BQVYsRUFBcUI7QUFDM0MsMEJBQU0sYUFBTixDQUFvQixNQUFLLE9BQXpCLEVBQWtDLE9BQWxDLEVBQTJDLE1BQTNDO0FBQ0gsaUJBRmEsQ0FBZDs7QUFJQSx3QkFBUSxJQUFSLENBQWEsWUFBTTtBQUNmLDBCQUFLLEtBQUwsSUFBYyxNQUFLLEtBQUwsQ0FBVyxHQUFYLENBQWUsZ0JBQWYsRUFBaUMsTUFBSyxNQUF0QyxDQUFkO0FBQ0EsaUNBQWEsT0FBYixDQUFxQixNQUFLLE1BQTFCLEVBQWtDLEtBQWxDO0FBQ0EsNkNBQVksTUFBWixDQUFtQixRQUFuQjtBQUNILGlCQUpEO0FBS0g7QUFDSjs7Ozs7O3FCQWhEZ0Isc0I7Ozs7Ozs7OztBQ0pyQjs7OztBQUNBOztBQUNBOzs7O0FBQ0E7Ozs7QUFDQSxJQUFNLHdCQUF3Qiw0QkFBOUI7QUFDQSxJQUFNLDBCQUEwQiw4QkFBaEM7O0FBRUEsSUFBTSwrQkFBK0IsU0FBL0IsNEJBQStCLENBQVUsSUFBVixFQUFnQjtBQUNqRCxRQUFNLFVBQ0YsUUFDQSxPQUFPLFFBQVAsQ0FBZ0IsUUFBaEIsSUFDSyxPQUFPLFFBQVAsQ0FBZ0IsTUFBaEIsR0FBeUIsT0FBTyxRQUFQLENBQWdCLE1BQXpDLEdBQWtELEVBRHZELENBRko7QUFJQSxRQUFJLFNBQVMsaUNBQWUsT0FBTyxRQUFQLENBQWdCLE1BQS9CLEVBQXVDLE1BQXBEO0FBQ0EsUUFBTSxPQUFPLEVBQUUsTUFBRixFQUFVLElBQVYsQ0FBZSx1QkFBZixDQUFiO0FBQ0EsUUFBTSxLQUFLLDZCQUFpQixPQUFPLFFBQVAsQ0FBZ0IsTUFBakMsRUFBeUMsUUFBekMsQ0FBWDs7QUFFQSxRQUNJLFVBQ0EsQ0FBQyxJQURELElBRUEsT0FBTyxPQUFQLENBQWUsR0FBZixJQUFzQixDQUFDLENBRnZCLElBR0EsRUFBRSxNQUFGLEVBQVUsSUFBVixDQUFlLGlCQUFmLE1BQXNDLE9BSjFDLEVBS0U7QUFDRSxnQkFBUSxZQUFSLENBQXFCLElBQXJCLEVBQTJCLElBQTNCLEVBQWlDLE9BQU8sUUFBUCxDQUFnQixRQUFoQixHQUEyQixFQUE1RDs7QUFFQSxpQkFBUyxPQUFPLEtBQVAsQ0FBYSxHQUFiLENBQVQ7QUFDQSxZQUFNLFVBQVUsT0FBTyxDQUFQLENBQWhCO0FBQ0EsWUFBTSxhQUFhLG1EQUNnQyxPQURoQyxRQUFuQjtBQUdBLFlBQU0sWUFBWSw2QkFBMkIsT0FBM0IsVUFBbEI7QUFDQSxZQUFNLFNBQVMsU0FBUyxPQUFPLENBQVAsQ0FBVCxFQUFvQixFQUFwQixDQUFmO0FBQ0EsWUFBTSxlQUFlLG9DQUNlLE9BRGYsU0FFbkIsS0FGbUIsRUFBckIsQ0FWRixDQVlhO0FBQ1gsWUFBTSxnQkFBZ0IsdUNBQ2lCLE9BRGpCLCtDQUNrRSxPQURsRSxTQUVwQixLQUZvQixFQUF0QixDQWJGLENBZWE7QUFDWCxZQUFJLE9BQU8sSUFBWDtBQUNBLFlBQUksaUJBQWlCLEVBQXJCLENBakJGLENBaUIyQjs7QUFFekIsZ0JBQVEsT0FBTyxDQUFQLENBQVI7QUFDSSxpQkFBSyxNQUFMO0FBQ0EsaUJBQUssY0FBTDtBQUNBLGlCQUFLLGlCQUFMO0FBQ0k7QUFDQSxvQkFDSSxzREFDc0QsT0FEdEQsU0FFRSxNQUZGLElBR0EsNkJBQzZCLE9BRDdCLGdDQUVFLE1BTk4sRUFPRTtBQUNFO0FBQ0g7O0FBRUQ7QUFDQSxvQkFBSSxXQUFXLE1BQWYsRUFBdUI7QUFDbkI7QUFDQSwrQkFBVyxLQUFYO0FBQ0gsaUJBSEQsTUFHTyxJQUFJLFVBQVUsTUFBZCxFQUFzQjtBQUN6QjtBQUNBLDhCQUFVLEtBQVY7QUFDSCxpQkFITSxNQUdBO0FBQ0g7QUFDQSx5QkFBSyxXQUFMLENBQWlCLE9BQWpCLEVBQTBCLEVBQUUsTUFBRixDQUExQjtBQUNBLHNCQUFFLElBQUYsQ0FBTztBQUNILDZCQUFLLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLFdBQXpCLEVBQXNDO0FBQ3ZDLGdDQUFJO0FBRG1DLHlCQUF0QyxDQURGO0FBSUgsOEJBQU07QUFKSCxxQkFBUDtBQU1IO0FBQ0Q7QUFDSixpQkFBSyxNQUFMO0FBQ0k7QUFDQSxrQkFBRSxNQUFGLEVBQVUsRUFBVixDQUFhLG1CQUFiLEVBQWtDLFlBQU07QUFDcEMsdURBQ0ksOENBQzhDLE9BRDlDLFFBREosRUFJSSxNQUpKO0FBTUgsaUJBUEQ7QUFRQTtBQUNKO0FBQVM7QUFDTCxvQkFDSSxhQUFhLE1BQWIsS0FDQyxhQUFhLEVBQWIsQ0FBZ0IsVUFBaEIsS0FDRyxRQUFRLEdBQVIsQ0FBWSx1QkFBWixNQUF5QyxNQUY3QyxDQURKLEVBSUU7QUFDRSwyQkFBTyxZQUFQO0FBQ0EscUNBQWlCLEtBQUssSUFBTCxDQUFVLGFBQVYsQ0FBakI7QUFDQSx3QkFBSSxtQkFBbUIsZUFBdkIsRUFBd0M7QUFDcEMseUNBQWlCLFFBQWpCO0FBQ0g7QUFDSixpQkFWRCxNQVVPLElBQUksY0FBYyxNQUFsQixFQUEwQjtBQUM3QiwyQkFBTyxhQUFQO0FBQ0Esd0JBQ0ssS0FBSyxJQUFMLENBQVUsU0FBVixLQUNHLEtBQ0ssSUFETCxDQUNVLFNBRFYsRUFFSyxXQUZMLEdBR0ssT0FITCxDQUdhLFFBSGIsSUFHeUIsQ0FBQyxDQUo5QixJQUtBLEtBQUssUUFBTCxDQUFjLFdBQWQsQ0FOSixFQU9FO0FBQ0UseUNBQWlCLFFBQWpCO0FBQ0gscUJBVEQsTUFTTyxJQUNGLEtBQUssSUFBTCxDQUFVLFNBQVYsS0FDRyxLQUFLLElBQUwsQ0FBVSxTQUFWLEVBQXFCLFdBQXJCLEdBQW1DLE9BQW5DLENBQTJDLE1BQTNDLElBQ0ksQ0FBQyxDQUZULElBR0EsS0FBSyxRQUFMLENBQWMsU0FBZCxDQUpHLEVBS0w7QUFDRSx5Q0FBaUIsTUFBakI7QUFDSDtBQUNKOztBQUVELG9CQUFJLElBQUosRUFBVTtBQUNOLHdCQUFJLE9BQU8sQ0FBUCxNQUFjLGNBQWQsSUFBZ0MsT0FBTyxDQUFQLE1BQWMsTUFBbEQsRUFBMEQ7QUFDdEQ7QUFDQSw2QkFBSyxLQUFMO0FBQ0gscUJBSEQsTUFHTyxJQUFJLG1CQUFtQixNQUF2QixFQUErQjtBQUNsQyw4Q0FBc0IsT0FBdEIsRUFBK0IsSUFBL0I7QUFDSDtBQUNKLGlCQVBELE1BT087QUFDSDtBQUNBLHNCQUFFLElBQUYsQ0FBTztBQUNILDZCQUFLLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLFdBQXpCLEVBQXNDO0FBQ3ZDLGdDQUFJO0FBRG1DLHlCQUF0QyxDQURGO0FBSUgsOEJBQU0sS0FKSDtBQUtILCtCQUxHLG1CQUtLLElBTEwsRUFLVztBQUNWLGdDQUNJLE9BQU8sQ0FBUCxNQUFjLFFBQWQsSUFDQSxPQUFPLENBQVAsTUFBYyxlQUZsQixFQUdFO0FBQ0UscUNBQUssTUFBTCxDQUFZLE9BQVosRUFBcUIsS0FBckIsRUFBNEIsRUFBRSxNQUFGLENBQTVCO0FBQ0Esa0NBQUUsUUFBRixFQUNLLEVBREwsQ0FFUSxlQUZSLEVBR1EsVUFBQyxDQUFELEVBQUksU0FBSixFQUFlLE9BQWYsRUFBMkI7QUFDdkI7QUFDQSx3Q0FBTSxPQUNGLEtBQUssSUFBTCxDQUFVLEVBQVYsS0FBaUIsT0FBakIsR0FDTSxLQUFLLElBQUwsQ0FBVSxJQURoQixHQUVNLEtBQUssSUFBTCxDQUFVLEVBSHBCO0FBSUEseUNBQUssa0JBQUwsQ0FDSSxPQURKLEVBRUksSUFGSjtBQUlILGlDQWJULEVBZUssRUFmTCxDQWdCUSxlQWhCUixFQWlCUSxVQUFDLENBQUQsRUFBSSxTQUFKLEVBQWUsUUFBZixFQUE0QjtBQUN4Qix3Q0FBTSxpQkFBaUIsS0FBSyxLQUFMLENBQ25CLFNBQVMsS0FBVCxDQUFlLFlBREksQ0FBdkI7O0FBSUE7QUFDQSx3Q0FDSSxlQUFlLFNBQWYsS0FDSSx3QkFESixJQUVBLFVBQVUsT0FBVixDQUFrQixPQUFsQixLQUNJLE1BSlIsRUFLRTtBQUNFLDRDQUFNLFdBQVcsRUFBRSxLQUFGLEVBQVM7QUFDdEIsMERBQWMsS0FBSyxLQURHO0FBRXRCLHlEQUFhLEtBQUssSUFBTCxDQUFVLEVBRkQ7QUFHdEIsNERBQ0ksS0FBSyxNQUFMLENBQVksWUFBWixDQUNLLElBREwsSUFDYSxJQURiLEdBRU0sd0JBRk4sR0FHTSxLQUFLLE1BQUwsQ0FDSyxZQURMLENBRUssSUFUTztBQVV0QiwrREFBbUIsbUJBQ2YsV0FEZSxFQUVmO0FBQ0ksbURBQUcsS0FBSztBQURaLDZDQUZlO0FBVkcseUNBQVQsQ0FBakI7QUFpQkEsOERBQ0ksT0FESixFQUVJLFFBRko7QUFJSCxxQ0EzQkQsTUEyQk8sSUFDSCxlQUFlLFNBRFosRUFFTDtBQUNFLDRDQUFJLE9BQU8sRUFBWDtBQUNBLDRDQUFJLFdBQVcsRUFBZjtBQUNBLDRDQUNJLGVBQWUsU0FBZixLQUNJLDZCQURKLElBRUEsZUFBZSxTQUFmLEtBQ0ksbUJBSlIsRUFLRTtBQUNFLG1EQUFPLE9BQU8sR0FBUCxDQUNILE9BQU8sTUFBUCxDQUNLLFlBRkYsQ0FBUDtBQUlBLHVEQUNJLE9BQU8sSUFBUCxDQUFZLE9BQVosQ0FESjtBQUVILHlDQVpELE1BWU8sSUFDSCxlQUFlLFNBQWYsS0FDSSw2QkFESixJQUVBLGVBQWUsU0FBZixLQUNJLCtCQUpELEVBS0w7QUFDRSxtREFBTyxPQUFPLEdBQVAsQ0FDSCxPQUFPLE1BQVAsQ0FDSyxjQUZGLENBQVA7QUFJQSx1REFBVyxPQUFPLElBQVAsQ0FDUCxzQkFETyxDQUFYO0FBR0g7O0FBRUQsNENBQUksT0FBSixFQUFhO0FBQ1QsZ0RBQU0sa0NBQWdDLElBQWhDLHVCQUFzRCxRQUF0RCxTQUFOO0FBQ0Esb0RBQVEsSUFBUixjQUNlLE9BQU8sSUFBUCxDQUNQLGNBRE8sQ0FEZixrQkFHa0IsT0FBTyxJQUFQLFlBQ0QsZUFBZSxTQURkLEVBRVYsRUFBRSxVQUFGLEVBRlUsQ0FIbEIsRUFPSSxPQVBKO0FBU0g7QUFDSjtBQUNKLGlDQS9GVDtBQWlHSCw2QkF0R0QsTUFzR08sSUFBSSxPQUFPLENBQVAsTUFBYyxNQUFsQixFQUEwQjtBQUM3QixrQ0FBRSxJQUFGLENBQU8sS0FBSyxlQUFMLENBQXFCLE9BQXJCLENBQVAsRUFDSyxJQURMLENBQ1UsVUFBQyxTQUFELEVBQWU7QUFDakIsd0NBQUksVUFBVSxlQUFWLEdBQTRCLENBQWhDLEVBQW1DO0FBQy9CLDRDQUFNLFdBQVcsRUFBRSxLQUFGLEVBQVM7QUFDdEIsMERBQWMsVUFBVSxLQURGO0FBRXRCLHlEQUFhLFVBQVUsSUFBVixDQUFlLEVBRk47QUFHdEIsNERBQ0ksVUFBVSxNQUFWLENBQ0ssWUFETCxDQUNrQixJQURsQixJQUVBLElBRkEsR0FHTSx3QkFITixHQUlNLFVBQVUsTUFBVixDQUNLLFlBREwsQ0FFSyxJQVZPO0FBV3RCLCtEQUFtQixtQkFDZixXQURlLEVBRWY7QUFDSSxtREFBRyxVQUFVO0FBRGpCLDZDQUZlO0FBWEcseUNBQVQsQ0FBakI7QUFrQkgscUNBbkJELE1BbUJPO0FBQ0gsZ0VBQ0ksU0FESixFQUVJLE9BRko7QUFJSDtBQUNKLGlDQTNCTCxFQTRCSyxJQTVCTCxDQTRCVSxZQUFNO0FBQ1IsNERBQXdCLElBQXhCLEVBQThCLE9BQTlCO0FBQ0gsaUNBOUJMO0FBK0JIO0FBQ0o7QUE3SUUscUJBQVA7QUErSUg7QUFDRDtBQXRPUjs7QUF5T0EsVUFBRSxNQUFGLEVBQVUsSUFBVixDQUFlLHVCQUFmLEVBQXdDLElBQXhDO0FBQ0gsS0FsUUQsTUFrUU8sSUFDSCxVQUNBLENBQUMsSUFERCxJQUVBLEVBQUUsTUFBRixFQUFVLElBQVYsQ0FBZSxpQkFBZixNQUFzQyxNQUhuQyxFQUlMO0FBQ0UsaUJBQVMsT0FBTyxLQUFQLENBQWEsR0FBYixDQUFUO0FBQ0EsWUFBTSxXQUFVLE9BQU8sQ0FBUCxDQUFoQjs7QUFFQTtBQUNBLFlBQU0sYUFBYSxRQUNkLE9BRGMsQ0FDTixtQkFBbUIsc0JBQW5CLENBRE0sRUFDc0MsRUFEdEMsRUFFZCxPQUZjLENBRU4scUNBRk0sRUFFaUMsRUFGakMsQ0FBbkI7QUFHQSxZQUFNLGNBQWMsT0FBTyxHQUFQLENBQVcsT0FBTyxNQUFQLENBQWMsb0JBQXpCLEVBQStDO0FBQy9ELHFCQUFTLFVBRHNEO0FBRS9ELG9CQUFRLENBQUMsT0FBTyxDQUFQLENBQUQsRUFBWSxRQUFaLEVBQXFCLElBQXJCLENBQTBCLEdBQTFCO0FBRnVELFNBQS9DLENBQXBCOztBQUtBLFVBQUUsa0JBQUYsRUFBc0IsSUFBdEIsQ0FBMkIsaUJBQTNCLEVBQThDLFdBQTlDO0FBQ0g7QUFDSixDQTlSRDs7cUJBZ1NlLDRCOzs7Ozs7Ozs7QUN2U2Y7Ozs7QUFDQTs7Ozs7O0FBRUE7OztBQUdBLElBQU0sbUJBQW1CLFNBQW5CLGdCQUFtQixDQUFTLFVBQVQsRUFBcUIsY0FBckIsRUFBcUMsT0FBckMsRUFBOEM7QUFDbkUsUUFBTSxVQUFVLFdBQVcsSUFBWCxDQUFnQixVQUFoQixDQUFoQjtBQUNBLFFBQU0saUJBQWlCLFdBQVcsSUFBWCxDQUFnQixhQUFoQixDQUF2Qjs7QUFFQSxRQUFJLFVBQVUsS0FBZDtBQUNBLFFBQUksa0JBQWtCLElBQWxCLElBQTBCLG1CQUFtQixjQUFqRCxFQUFpRTtBQUM3RCxrQkFBVSxJQUFWO0FBQ0g7QUFDRCxRQUFNLFNBQVMsVUFBVSxDQUFWLEdBQWMsY0FBN0I7QUFDQSxRQUFJLE9BQUosRUFBYTtBQUNULG1CQUFXLElBQVgsQ0FBZ0IsYUFBaEIsRUFBK0IsSUFBL0I7QUFDQSxtQkFBVyxXQUFYLENBQXVCLGFBQXZCO0FBQ0Esb0NBQVUsVUFBVixFQUFzQixXQUFXLElBQVgsQ0FBZ0IsZUFBaEIsQ0FBdEIsRUFBd0QsRUFBQyxXQUFXLEtBQVosRUFBbUIsZ0JBQW5CLEVBQXhEO0FBQ0gsS0FKRCxNQUlPO0FBQ0gsNENBQWtCLFVBQWxCLEVBQThCLE1BQTlCLEVBQXNDLEVBQUMsV0FBVyxJQUFaLEVBQWtCLGdCQUFsQixFQUF0QztBQUNIOztBQUVELFFBQUksV0FBVyxRQUFYLENBQW9CLFlBQXBCLENBQUosRUFBdUM7QUFDbkM7QUFDQSxZQUFNLGFBQWEsT0FBTyxRQUFQLENBQWdCLFFBQW5DO0FBQ0EsWUFBTSxTQUFTLENBQUMsTUFBRCxFQUFTLE9BQVQsRUFBa0IsTUFBbEIsRUFBMEIsSUFBMUIsQ0FBK0IsR0FBL0IsQ0FBZjtBQUNBLGVBQU8sUUFBUCxHQUFrQixPQUFPLEdBQVAsQ0FBVyxPQUFPLE1BQVAsQ0FBYyxhQUF6QixFQUF3QyxFQUFDLFNBQVMsVUFBVixFQUFzQixjQUF0QixFQUF4QyxDQUFsQjtBQUNILEtBTEQsTUFLTyxJQUFJLE9BQUosRUFBYTtBQUNoQixhQUFLLGdCQUFMLENBQXNCLE9BQXRCO0FBQ0gsS0FGTSxNQUVBO0FBQ0gsYUFBSyxhQUFMLENBQW1CLE9BQW5CLEVBQTRCLE1BQTVCO0FBQ0g7QUFDSixDQTNCRDs7cUJBNkJlLGdCOzs7Ozs7Ozs7QUNuQ2Y7Ozs7OztBQUVBOzs7QUFHQSxJQUFNLG9CQUFvQixTQUFwQixpQkFBb0IsQ0FBUyxVQUFULEVBQXFCLE1BQXJCLEVBQTZCLE9BQTdCLEVBQXNDO0FBQzVELGVBQVcsSUFBWCxDQUFnQixhQUFoQixFQUErQixNQUEvQjtBQUNBLGVBQVcsV0FBWCxDQUF1QixhQUF2QixFQUFzQyxRQUF0QyxDQUErQyxhQUEvQztBQUNBLGdDQUFVLFVBQVYsRUFBc0IsTUFBdEIsRUFBOEIsT0FBOUI7QUFDSCxDQUpEOztxQkFNZSxpQjs7Ozs7Ozs7QUNYZjs7O0FBR0EsSUFBTSx1QkFBdUIsU0FBdkIsb0JBQXVCLEdBQVk7QUFDckMsUUFBTSxnQkFBZ0IsT0FBTyxJQUFQLENBQVksd0JBQVosQ0FBdEI7QUFDQSxRQUFNLFdBQVcsT0FBTyxJQUFQLENBQVksVUFBWixDQUFqQjtBQUNBLFFBQU0sY0FBYyxPQUFPLElBQVAsQ0FBWSxhQUFaLEVBQTJCO0FBQzNDLDJHQUFpRyxhQUFqRztBQUQyQyxLQUEzQixDQUFwQjtBQUdBLFFBQU0sa0JBQWtCLE9BQU8sSUFBUCxDQUFZLGlCQUFaLEVBQStCO0FBQ25ELHdEQUE4QyxRQUE5QztBQURtRCxLQUEvQixDQUF4QjtBQUdBLE1BQUUsa0JBQUYsRUFBc0IsSUFBdEI7QUFDSTtBQUNHLGVBRlAsOERBS1UsZUFMVjtBQVFILENBakJEOztxQkFtQmUsb0I7Ozs7Ozs7O0FDdEJmOzs7OztBQUtBLElBQU0sZ0JBQWdCLFNBQWhCLGFBQWdCLENBQVMsSUFBVCxFQUFlLEtBQWYsRUFBc0I7QUFDeEMsUUFBTSxPQUFPLE9BQU8sUUFBUCxDQUFnQixRQUE3QjtBQUNBLFFBQUksY0FBYyxPQUFPLFFBQVAsQ0FBZ0IsTUFBbEM7O0FBRUEsUUFBSSxXQUFKLEVBQWlCO0FBQ2IsNkJBQW1CLElBQW5CLFNBQTJCLEtBQTNCO0FBQ0gsS0FGRCxNQUVPO0FBQ0gsNkJBQW1CLElBQW5CLFNBQTJCLEtBQTNCO0FBQ0g7O0FBRUQsV0FBTyxRQUFQLENBQWdCLElBQWhCLEdBQXVCLE9BQU8sV0FBOUI7QUFDSCxDQVhEOztxQkFhZSxhOzs7Ozs7OztBQ2xCZjs7Ozs7QUFLQSxJQUFNLGlCQUFpQixTQUFqQixjQUFpQixDQUFVLEVBQVYsRUFBYztBQUNqQyxRQUFNLGFBQWEsR0FBRyxLQUFILENBQVMsR0FBVCxFQUFjLElBQWQsQ0FBbUIsR0FBbkIsQ0FBbkI7O0FBRUEsUUFBTSxTQUFTLEVBQWY7QUFDQSxRQUFNLEtBQUssdUJBQVg7QUFDQSxRQUFJLFNBQVMsR0FBRyxJQUFILENBQVEsVUFBUixDQUFiOztBQUVBLFdBQU8sTUFBUCxFQUFlO0FBQ1gsZUFBTyxtQkFBbUIsT0FBTyxDQUFQLENBQW5CLENBQVAsSUFBd0MsbUJBQW1CLE9BQU8sQ0FBUCxDQUFuQixDQUF4QztBQUNBLGlCQUFTLEdBQUcsSUFBSCxDQUFRLFVBQVIsQ0FBVDtBQUNIOztBQUVELFdBQU8sTUFBUDtBQUNILENBYkQ7O3FCQWVlLGM7Ozs7Ozs7OztBQ3BCZjs7Ozs7O0FBQ0E7Ozs7O0FBS0EsSUFBTSxvQkFBb0IsU0FBcEIsaUJBQW9CLENBQVMsSUFBVCxFQUFlLEtBQWYsRUFBc0I7QUFDNUMsUUFBTSxPQUFPLE9BQU8sUUFBUCxDQUFnQixRQUE3QjtBQUNBLFFBQUksY0FBYyxPQUFPLFFBQVAsQ0FBZ0IsTUFBaEIsQ0FBdUIsT0FBdkIsQ0FBK0IsWUFBL0IsRUFBNkMsU0FBN0MsRUFBd0QsT0FBeEQsQ0FBZ0UsYUFBaEUsRUFBK0UsU0FBL0UsQ0FBbEI7QUFDQSxRQUFNLFFBQVEsaUNBQWUsV0FBZixDQUFkOztBQUVBLFFBQUksV0FBSixFQUFpQjtBQUNiLFlBQUksTUFBTSxJQUFOLENBQUosRUFBaUI7QUFDYiwwQkFBYyxZQUFZLE9BQVosQ0FBdUIsSUFBdkIsU0FBK0IsTUFBTSxJQUFOLENBQS9CLEVBQWlELElBQWpELFNBQXlELEtBQXpELENBQWQ7QUFDSCxTQUZELE1BRU87QUFDSCxpQ0FBbUIsSUFBbkIsU0FBMkIsS0FBM0I7QUFDSDtBQUNKLEtBTkQsTUFNTztBQUNILDRCQUFrQixJQUFsQixTQUEwQixLQUExQjtBQUNIOztBQUVELFdBQU8sUUFBUCxDQUFnQixJQUFoQixHQUF1QixPQUFPLFdBQTlCO0FBQ0gsQ0FoQkQ7O3FCQWtCZSxpQjs7Ozs7Ozs7QUN4QmY7Ozs7O0FBS0EsSUFBTSx5QkFBeUIsU0FBekIsc0JBQXlCLENBQVMsRUFBVCxFQUFhO0FBQ3hDLFFBQU0sTUFBTSxHQUFHLEtBQUgsQ0FBUyxHQUFULENBQVo7O0FBRUEsUUFBSSxJQUFJLE1BQUosS0FBZSxDQUFmLElBQW9CLElBQUksQ0FBSixFQUFPLE9BQVAsQ0FBZSxnQkFBZixJQUFtQyxDQUEzRCxFQUE4RDtBQUMxRCxlQUFPLEVBQVA7QUFDSDs7QUFFRCxRQUFJLFFBQVEsRUFBWjtBQUNBLFNBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxJQUFJLE1BQXhCLEVBQWdDLEdBQWhDLEVBQXFDO0FBQ2pDLFlBQUksSUFBSSxDQUFKLEVBQU8sT0FBUCxDQUFlLGdCQUFmLElBQW1DLENBQUMsQ0FBeEMsRUFBMkM7QUFDdkMsZ0JBQUksQ0FBSixJQUFTLEVBQVQ7QUFDSCxTQUZELE1BRU8sSUFBSSxJQUFJLENBQUosSUFBUyxJQUFJLElBQUksTUFBckIsRUFBNkI7QUFDaEMscUJBQVMsR0FBVDtBQUNIO0FBQ0QsaUJBQVMsSUFBSSxDQUFKLENBQVQ7QUFDSDs7QUFFRCxXQUFPLEtBQVA7QUFDSCxDQWxCRDs7cUJBb0JlLHNCOzs7Ozs7Ozs7QUN4QmYsSUFBTSxRQUFBLEdBQVcsTUFBQSxDQUFPLFFBQXhCLENBQUE7QUFDQTtBQUNBLElBQU0sSUFBQSxHQUFPLE9BQUEsQ0FBUSxNQUFSLENBQWIsQ0FBQTtBQUNBLElBQU0sY0FBQSxHQUFpQixDQUFBLENBQUUsUUFBRixDQUFXLDRKQUFYLENBQXZCLENBQUE7O0FBRUEsSUFBTSxRQUFBLEdBQVcsUUFBQSxDQUFTLElBQVQsQ0FBYyxNQUFkLENBQXFCO0lBRWxDLEtBRmtDLEVBQUEsU0FBQSxLQUFBLEdBRTFCO1FBQ0osSUFBQSxDQUFLLE9BQUwsQ0FBYSxPQUFiLENBQUEsQ0FBQTtRQUNBLElBQUEsQ0FBSyxNQUFMLEVBQUEsQ0FBQTtRQUNBLElBQUEsQ0FBSyxNQUFMLEVBQUEsQ0FBQTtRQUNBLElBQUEsQ0FBSyxhQUFMLEVBQUEsQ0FBQTs7UUFFQSxJQUFBLENBQUssT0FBTCxJQUFnQixJQUFBLENBQUssT0FBTCxFQUFoQixDQUFBO1FBQ0EsT0FBTyxJQUFQLENBQUE7S0FUOEI7SUFZbEMsT0Faa0MsRUFBQSxTQUFBLE9BQUEsR0FZTDtRQUFBLElBQUEsSUFBQSxHQUFBLFNBQUEsQ0FBQSxNQUFBLEdBQUEsQ0FBQSxJQUFBLFNBQUEsQ0FBQSxDQUFBLENBQUEsS0FBQSxTQUFBLEdBQUEsU0FBQSxDQUFBLENBQUEsQ0FBQSxHQUFKLEVBQUk7WUFBcEIsWUFBb0IsR0FBQSxJQUFBLENBQXBCLFlBQW9CLENBQUE7O1FBQ3pCLElBQU0sT0FBQSxHQUFVO1lBQ1osSUFBQSxFQUFNLE1BQUEsQ0FBTyxJQUREO1lBRVosSUFBQSxFQUFNLE1BQUEsQ0FBTyxJQUFBO1NBRmpCLENBQUE7UUFJQSxJQUFNLElBQUEsR0FBTyxZQUFBLElBQWdCLElBQUEsQ0FBSyxlQUFMLEVBQTdCLENBQUE7UUFDQSxPQUFPLElBQUEsQ0FBSyxRQUFMLENBQWMsQ0FBQSxDQUFFLE1BQUYsQ0FBUyxFQUFULEVBQWEsSUFBYixFQUFtQixPQUFuQixDQUFkLENBQVAsQ0FBQTtLQWxCOEI7SUFxQmxDLFlBckJrQyxFQUFBLFNBQUEsWUFBQSxDQXFCckIsT0FyQnFCLEVBcUJaO1FBQ2xCLE9BQU8sSUFBQSxDQUFLLEdBQUwsQ0FBUyxJQUFULENBQWMsSUFBQSxDQUFLLE9BQUwsQ0FBYSxPQUFiLENBQWQsQ0FBUCxDQUFBO0tBdEI4QjtJQXlCbEMsUUF6QmtDLEVBQUEsU0FBQSxRQUFBLENBeUJ6QixPQXpCeUIsRUF5QmhCO1FBQ2QsSUFBQSxDQUFLLFlBQUwsQ0FBa0IsT0FBbEIsQ0FBQSxDQUFBO1FBQ0EsSUFBSSxJQUFBLENBQUssTUFBTCxJQUFlLENBQUMsSUFBQSxDQUFLLFFBQXpCLEVBQW1DO1lBQy9CLElBQUEsQ0FBSyxZQUFMLElBQXFCLElBQUEsQ0FBSyxZQUFMLEVBQXJCLENBQUE7WUFDQSxJQUFBLENBQUssTUFBTCxFQUFBLENBQUE7WUFDQSxJQUFBLENBQUssUUFBTCxHQUFnQixJQUFoQixDQUFBO1NBQ0g7S0EvQjZCO0lBa0NsQyxNQWxDa0MsRUFBQSxTQUFBLE1BQUEsR0FrQ3pCO1FBQ0wsSUFBSSxFQUFFLElBQUEsQ0FBSyxPQUFMLFlBQXdCLFFBQUEsQ0FBUyxDQUFuQyxDQUFKLEVBQTJDO1lBQ3ZDLElBQUEsQ0FBSyxPQUFMLEdBQWUsUUFBQSxDQUFTLENBQVQsQ0FBVyxJQUFBLENBQUssTUFBaEIsQ0FBZixDQUFBO1NBQ0g7UUFDRCxJQUFBLENBQUssT0FBTCxDQUFhLE1BQWIsQ0FBb0IsSUFBQSxDQUFLLEdBQXpCLENBQUEsQ0FBQTtLQXRDOEI7SUF5Q2xDLE1BekNrQyxFQUFBLFNBQUEsTUFBQSxDQXlDM0IsT0F6QzJCLEVBeUNsQjtRQUNaLElBQUEsQ0FBSyxXQUFMLEVBQUEsQ0FBQTs7UUFFQSxJQUFJLElBQUEsQ0FBSyxZQUFULEVBQXVCO1lBQ25CLElBQUEsQ0FBSyxZQUFMLEVBQUEsQ0FBQTtTQUNIO1FBQ0QsSUFBQSxDQUFLLFFBQUwsQ0FBYyxPQUFkLENBQUEsQ0FBQTtRQUNBLElBQUksSUFBQSxDQUFLLFdBQVQsRUFBc0I7WUFDbEIsSUFBQSxDQUFLLFdBQUwsRUFBQSxDQUFBO1NBQ0g7UUFDRCxPQUFPLElBQVAsQ0FBQTtLQW5EOEI7SUFzRGxDLGVBdERrQyxFQUFBLFNBQUEsZUFBQSxHQXNEaEI7UUFDZCxPQUFPLElBQUEsQ0FBSyxLQUFMLElBQWMsSUFBQSxDQUFLLEtBQUwsQ0FBVyxNQUFYLEVBQWQsSUFBcUMsRUFBNUMsQ0FBQTtLQXZEOEI7SUEwRGxDLFlBMURrQyxFQUFBLFNBQUEsWUFBQSxHQTBEbkI7UUFDWCxJQUFNLElBQUEsR0FBTyxDQUFBLENBQUUsSUFBQSxDQUFLLE1BQVAsQ0FBQSxDQUFlLE1BQWYsR0FBd0IsQ0FBQSxDQUFFLElBQUEsQ0FBSyxNQUFQLENBQXhCLEdBQXlDLElBQUEsQ0FBSyxHQUEzRCxDQUFBO1FBQ0EsSUFBQSxDQUFLLEtBQUwsRUFBQSxDQUFhLE1BQWIsQ0FBb0IsY0FBQSxDQUFlLEVBQUMsSUFBQSxFQUFNLE1BQUEsQ0FBTyxJQUFkLEVBQWYsQ0FBcEIsQ0FBQSxDQUFBO0tBNUQ4QjtJQStEbEMsV0EvRGtDLEVBQUEsU0FBQSxXQUFBLEdBK0RwQjs7UUFFVixJQUFNLE9BQUEsR0FBVSxDQUFBLENBQUUsZUFBRixDQUFoQixDQUFBO1FBQ0EsSUFBSSxPQUFBLENBQVEsTUFBWixFQUFvQjtZQUNoQixPQUFBLENBQVEsTUFBUixFQUFBLENBQUE7U0FDSDtLQUNKO0NBckVZLENBQWpCLENBQUE7O3FCQXlFZTs7Ozs7Ozs7OztBQy9FZjs7Ozs7O0FBRUEsSUFBTSxpQkFBaUIsa0JBQVMsTUFBVCxDQUFnQjs7QUFFbkMsV0FBTyxFQUY0Qjs7QUFJbkMsVUFBTSxTQUFTLGFBQVQsQ0FBdUIsS0FBdkIsQ0FKNkI7O0FBTW5DLGdCQU5tQywwQkFNcEI7QUFDWCxlQUFPLEtBQUssS0FBTCxDQUFXLE1BQVgsR0FBb0IsQ0FBM0IsRUFBOEI7QUFDMUIsaUJBQUssS0FBTCxDQUFXLENBQVgsRUFBYyxVQUFkO0FBQ0EsbUJBQU8sS0FBSyxLQUFMLENBQVcsQ0FBWCxDQUFQO0FBQ0EsaUJBQUssS0FBTCxDQUFXLEtBQVg7QUFDSDtBQUNKLEtBWmtDO0FBY25DLFdBZG1DLHFCQWN6QjtBQUNOLGFBQUssWUFBTDtBQUNBLGFBQUssR0FBTCxDQUFTLEtBQVQ7QUFDQSxhQUFLLElBQUwsQ0FBVSxTQUFWLEdBQXNCLEVBQXRCO0FBQ0gsS0FsQmtDO0FBb0JuQyxnQkFwQm1DLDBCQW9CcEI7QUFDWCxhQUFLLE9BQUw7QUFDSCxLQXRCa0M7QUF3Qm5DLFlBeEJtQyxzQkF3QnhCO0FBQ1AsYUFBSyxRQUFMLElBQWlCLGtCQUFTLFNBQVQsQ0FBbUIsUUFBbkIsQ0FBNEIsSUFBNUIsQ0FBaUMsSUFBakMsQ0FBakI7QUFDQSxhQUFLLG1CQUFMO0FBQ0gsS0EzQmtDO0FBNkJuQyx1QkE3Qm1DLGlDQTZCYjtBQUNsQixhQUFLLFVBQUw7QUFDQSxhQUFLLFdBQUw7QUFDSCxLQWhDa0M7QUFrQ25DLGNBbENtQyx3QkFrQ3RCO0FBQ1QsYUFBSyxVQUFMLENBQWdCLElBQWhCLENBQXFCLEtBQUssU0FBMUIsRUFBcUMsSUFBckM7QUFDSCxLQXBDa0M7QUFzQ25DLGVBdENtQyx5QkFzQ3JCO0FBQ1YsYUFBSyxHQUFMLENBQVMsTUFBVCxDQUFnQixLQUFLLElBQXJCO0FBQ0gsS0F4Q2tDO0FBMENuQyxhQTFDbUMscUJBMEN6QixLQTFDeUIsRUEwQ2xCLEtBMUNrQixFQTBDWDtBQUNwQixZQUFNLE9BQU8sS0FBSyxjQUFMLENBQW9CLEVBQUMsWUFBRCxFQUFwQixDQUFiO0FBQ0EsYUFBSyxZQUFMLElBQXFCLEtBQUssWUFBTCxDQUFrQixFQUFDLFVBQUQsRUFBTyxZQUFQLEVBQWMsWUFBZCxFQUFsQixDQUFyQjtBQUNBLFlBQU0sT0FBTyxLQUFLLE1BQUwsR0FBYyxFQUEzQjtBQUNBLGFBQUssVUFBTCxDQUFnQixFQUFDLFVBQUQsRUFBTyxVQUFQLEVBQWEsWUFBYixFQUFvQixZQUFwQixFQUFoQjtBQUNBLGFBQUssS0FBTCxDQUFXLElBQVgsQ0FBZ0IsSUFBaEI7QUFDSCxLQWhEa0M7QUFrRG5DLGNBbERtQyw0QkFrRGhCO0FBQUEsWUFBUCxJQUFPLFFBQVAsSUFBTzs7QUFDZixhQUFLLElBQUwsQ0FBVSxXQUFWLENBQXNCLElBQXRCO0FBQ0gsS0FwRGtDO0FBc0RuQyxtQkF0RG1DLDZCQXNEakI7QUFDZCxlQUFPLEtBQUssVUFBTCxJQUFtQixLQUFLLFVBQUwsQ0FBZ0IsTUFBbkMsSUFBNkMsRUFBcEQ7QUFDSDtBQXhEa0MsQ0FBaEIsQ0FBdkI7O3FCQTREZSxjOzs7Ozs7Ozs7QUM5RGY7Ozs7OztBQUVBLElBQU0sbUJBQW1CLFNBQW5CLGdCQUFtQixDQUFTLEtBQVQsRUFBZ0I7O0FBRXJDLDZDQUFvQixLQUFwQjtBQUVILENBSkQ7O3FCQU1lLGdCOzs7OztBQ1JmOzs7Ozs7O0FBT0EsRUFBRSxRQUFGLEVBQVksS0FBWixDQUFrQixZQUFZO0FBQzFCLE1BQUUsTUFBRixFQUFVLEVBQVYsQ0FBYSxlQUFiLEVBQThCLFVBQVUsQ0FBVixFQUFhO0FBQ3ZDLFlBQUksRUFBRSxJQUFGLElBQVUsbUJBQWQsRUFBbUM7QUFDL0IsY0FBRSxjQUFGO0FBQ0g7QUFDSixLQUpEOztBQU1BO0FBQ0EsTUFBRSxNQUFGLEVBQVUsTUFBVixDQUFpQixVQUFVLENBQVYsRUFBYTtBQUMxQixZQUFJLEVBQUUsSUFBRixFQUFRLElBQVIsQ0FBYSxhQUFiLEVBQTRCLEVBQTVCLENBQStCLFVBQS9CLENBQUosRUFBZ0Q7QUFDNUMsY0FBRSxjQUFGO0FBQ0g7QUFDSixLQUpEOztBQU1BLFFBQUksT0FBTyxRQUFQLEtBQW9CLFVBQXhCLEVBQW9DO0FBQ2hDLFlBQUksT0FBTyxTQUFTLEVBQUUsS0FBSyxZQUFQLEVBQVQsQ0FBWDs7QUFFQSxVQUFFLGlCQUFGO0FBQ0k7QUFESixTQUVLLFFBRkwsQ0FFYyxRQUZkO0FBR0k7QUFISixTQUlLLElBSkwsQ0FLUSxLQUxSLEVBTVEsNEVBTlI7QUFRSTtBQVJKLFNBU0ssRUFUTCxDQVNRLE1BVFIsRUFTZ0IsWUFBWTtBQUNwQixnQkFBSSxLQUFLLFlBQUwsQ0FBa0IsWUFBbEIsQ0FBSixFQUFxQztBQUNqQyxrQkFBRSxJQUFGLEVBQ0ssVUFETCxDQUNnQixtQkFEaEIsRUFFSyxXQUZMLENBRWlCLFFBRmpCO0FBR0g7QUFDSixTQWZMO0FBZ0JJO0FBaEJKLFNBaUJLLElBakJMLENBaUJVLFlBQVk7QUFDZCxpQkFBSyxJQUFMO0FBQ0gsU0FuQkw7QUFvQkgsS0F2QkQsTUF1Qk87QUFDSCxVQUFFLGlCQUFGLEVBQXFCLElBQXJCLENBQTBCLEtBQTFCLEVBQWlDLFlBQVk7QUFDekMsbUJBQU8sRUFBRSxJQUFGLEVBQVEsSUFBUixDQUFhLFlBQWIsQ0FBUDtBQUNILFNBRkQ7QUFHSDs7QUFFRCxNQUFFLGdCQUFGLEVBQW9CLElBQXBCLENBQ0ksTUFESixFQUVJLEVBQUUsZ0JBQUYsRUFBb0IsSUFBcEIsQ0FBeUIsTUFBekIsSUFDSSxXQURKLEdBRUksT0FBTyxRQUFQLENBQWdCLFFBRnBCLEdBR0ksdUJBQXVCLFNBQVMsTUFBaEMsQ0FISixHQUlJLFNBQVMsSUFBVCxDQUFjLE9BQWQsQ0FBc0IsR0FBdEIsRUFBMkIsVUFBM0IsQ0FOUjs7QUFTQSxRQUFJLFlBQ0EsT0FBTyxTQUFQLENBQWlCLFFBQWpCLENBQTBCLEtBQTFCLENBQWdDLEtBQWhDLEtBQTBDLENBQUMsT0FBTyxZQUFsRCxHQUNNLElBRE4sR0FFTSxLQUhWO0FBSUEsUUFBSSxrQkFBa0IsT0FBTyxTQUFQLENBQWlCLFNBQWpCLENBQTJCLEtBQTNCLENBQ2xCLG9GQURrQixJQUdoQixJQUhnQixHQUloQixLQUpOO0FBS0EsUUFBSSxRQUFRLFFBQVEsR0FBUixDQUFZLFdBQVosS0FBNEIsU0FBeEM7O0FBRUEsUUFBSSxhQUFhLGVBQWIsSUFBZ0MsS0FBcEMsRUFBMkM7QUFDdkMsWUFBSSxRQUFRLEVBQ1IsbUVBRFEsQ0FBWjtBQUdBLGNBQU0sSUFBTixDQUFXLFlBQVk7QUFDbkIsZ0JBQUksRUFBRSxJQUFGLEVBQVEsSUFBUixDQUFhLFdBQWIsQ0FBSixFQUErQjtBQUMzQixrQkFBRSxJQUFGLEVBQ0ssSUFETCxDQUNVLFlBRFYsRUFDd0IsTUFEeEIsRUFFSyxJQUZMLENBRVUsTUFGVixFQUVrQixFQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsV0FBYixDQUZsQixFQUdLLElBSEwsQ0FHVSxRQUhWLEVBR29CLFFBSHBCLEVBSUssSUFKTCxDQUlVLEtBSlYsRUFJaUIsWUFKakIsRUFLSyxVQUxMLENBS2dCLGdCQUxoQjtBQU1IO0FBQ0osU0FURDtBQVVIOztBQUVELFFBQ0ksRUFBRSxvQ0FBRixFQUNLLEtBREwsR0FFSyxJQUZMLENBRVUsaUJBRlYsRUFHSyxJQUhMLEdBR1ksTUFIWixHQUdxQixHQUp6QixFQUtFO0FBQ0UsVUFBRSxvQkFBRixFQUF3QixRQUF4QixDQUFpQyxTQUFqQztBQUNIOztBQUVEO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsUUFBSSxhQUFhLEVBQUUsMEJBQUYsQ0FBakI7QUFDQSxlQUFXLEVBQVgsQ0FBYyxRQUFkLEVBQXdCLFlBQVk7QUFDaEMsZUFBTyxpQkFBUCxDQUF5QixRQUF6QixFQUFtQyxFQUFFLElBQUYsRUFBUSxHQUFSLEVBQW5DO0FBQ0gsS0FGRDtBQUdILENBaEdEOztBQWtHQTs7O0FBR0EsRUFBRSxlQUFGLEVBQW1CLEVBQW5CLENBQXNCLE9BQXRCLEVBQStCLFlBQVk7QUFDdkMsTUFBRSxJQUFGLEVBQVEsVUFBUixDQUFtQixRQUFuQixFQUE2QixPQUE3QjtBQUNILENBRkQ7O0FBSUEsT0FBTyxTQUFQLEdBQW1CLENBQW5COztBQUVBOzs7QUFHQSxFQUFFLGtCQUFGLEVBQXNCLEVBQXRCLENBQXlCLFFBQXpCLEVBQW1DLFVBQVUsQ0FBVixFQUFhO0FBQzVDLDRCQUF3QixDQUF4QixFQUEyQixJQUEzQjtBQUNILENBRkQ7O0FBSUE7OztBQUdBLEVBQUUsa0JBQUYsRUFBc0IsRUFBdEIsQ0FBeUI7QUFDckIsZ0JBQVksc0JBQVk7QUFDcEIsZUFBTyxTQUFQLEdBQW1CLENBQW5CO0FBQ0g7QUFIb0IsQ0FBekI7O0FBTUEsRUFBRSxrQkFBRixFQUFzQixJQUF0QixDQUEyQixZQUFZO0FBQ25DLHVCQUFtQixJQUFuQjtBQUNILENBRkQ7O0FBSUEsSUFBSSxDQUFDLE9BQU8sTUFBUixJQUFrQixDQUFDLE9BQU8sTUFBOUIsRUFBc0M7QUFDbEMsTUFBRSxrQkFBRixFQUFzQixJQUF0QixDQUEyQixZQUFZO0FBQ25DLFdBQUcsVUFBSCxDQUFjLEVBQUUsSUFBRixFQUFRLENBQVIsQ0FBZCxFQUEwQixFQUFFLGlCQUFpQixJQUFuQixFQUExQjtBQUNILEtBRkQ7QUFHSDs7QUFFRCxFQUFFLHdCQUFGLEVBQTRCLEVBQTVCLENBQStCLE9BQS9CLEVBQXdDLFlBQVk7QUFDaEQsUUFBSSxPQUFPLEVBQUUsSUFBRixFQUNOLFFBRE0sQ0FDRyxjQURILEVBRU4sUUFGTSxDQUVHLDRCQUZILENBQVg7QUFHQSxtQkFBZSxPQUFmLEVBQXdCLElBQXhCO0FBQ0gsQ0FMRDs7QUFPQSxFQUFFLHVCQUFGLEVBQTJCLEVBQTNCLENBQThCLE9BQTlCLEVBQXVDLFlBQVk7QUFDL0MsUUFBSSxPQUFPLEVBQUUsSUFBRixFQUNOLFFBRE0sQ0FDRyxjQURILEVBRU4sUUFGTSxDQUVHLDRCQUZILENBQVg7QUFHQSxtQkFBZSxNQUFmLEVBQXVCLElBQXZCO0FBQ0gsQ0FMRDs7QUFPQTs7O0FBR0EsRUFBRSxPQUFGLEVBQVcsRUFBWCxDQUFjLHVCQUFkLEVBQXVDLFlBQVk7QUFDL0MsTUFBRSxJQUFGLEVBQVEsSUFBUixDQUFhLEdBQWIsRUFBa0IsSUFBbEIsQ0FBdUIsVUFBdkIsRUFBbUMsSUFBbkM7QUFDQSxNQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsSUFBYixFQUFtQixJQUFuQixDQUF3QixVQUF4QixFQUFvQyxJQUFwQztBQUNBLFFBQUksT0FBTyxFQUFFLHVCQUF1QixFQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsSUFBYixDQUF2QixHQUE0QyxRQUE5QyxDQUFYO0FBQ0EsU0FBSyxJQUFMLENBQVUsZUFBVixFQUEyQixPQUEzQjtBQUNILENBTEQ7O0FBT0EsRUFBRSxrQkFBRixFQUFzQixFQUF0QixDQUF5QixVQUF6QixFQUFxQyxZQUFZO0FBQzdDLFFBQUksV0FBVyxFQUFFLElBQUYsRUFBUSxPQUFSLENBQWdCLHFCQUFoQixFQUF1QyxJQUF2QyxDQUE0QyxJQUE1QyxDQUFmO0FBQ0EsYUFBUyxRQUFULENBQWtCLEdBQWxCLEVBQXVCLEtBQXZCO0FBQ0gsQ0FIRDs7QUFLQSxFQUFFLDRCQUFGLEVBQ0ssRUFETCxDQUNRLFNBRFIsRUFDbUIsVUFBVSxDQUFWLEVBQWE7QUFDeEIsaUJBQWEsQ0FBYjtBQUNILENBSEwsRUFJSyxFQUpMLENBSVEsU0FKUixFQUltQixHQUpuQixFQUl3QixVQUFVLENBQVYsRUFBYTtBQUM3QixpQkFBYSxDQUFiO0FBQ0gsQ0FOTDs7QUFRQSxFQUFFLGdCQUFGLEVBQ0ssRUFETCxDQUNRLFNBRFIsRUFDbUIsVUFBVSxDQUFWLEVBQWE7QUFDeEIsd0JBQW9CLENBQXBCO0FBQ0gsQ0FITCxFQUlLLEVBSkwsQ0FJUSxTQUpSLEVBSW1CLEdBSm5CLEVBSXdCLFVBQVUsQ0FBVixFQUFhO0FBQzdCLHdCQUFvQixDQUFwQjtBQUNILENBTkw7O0FBUUE7QUFDQSxFQUFFLFFBQUYsRUFBWSxLQUFaLENBQWtCLFlBQVk7QUFDMUIsTUFBRSxRQUFGLEVBQVksRUFBWixDQUFlLHFCQUFmLEVBQXNDLFlBQVk7QUFDOUMsVUFBRSxNQUFGLENBQVMsb0JBQVQsR0FBZ0MsS0FBaEM7QUFDSCxLQUZEO0FBR0EsTUFBRSxRQUFGLEVBQVksRUFBWixDQUFlLGlCQUFmLEVBQWtDLFlBQVk7QUFDMUMsVUFBRSxNQUFGLENBQVMsb0JBQVQsR0FBZ0MsSUFBaEM7QUFDSCxLQUZEO0FBR0gsQ0FQRDs7QUFTQSxFQUFFLGtCQUFGLEVBQXNCLEVBQXRCLENBQXlCLHFCQUF6QixFQUFnRCxZQUFZO0FBQ3hELFFBQUksU0FBUyxFQUFFLGtCQUFGLENBQWI7QUFDQSxRQUFJLE9BQU8sSUFBUCxDQUFZLGlCQUFaLENBQUosRUFBb0M7QUFDaEMsZUFBTyxJQUFQLENBQVksTUFBWixFQUFvQixPQUFPLElBQVAsQ0FBWSxpQkFBWixDQUFwQjtBQUNBLGVBQU8sVUFBUCxDQUFrQixpQkFBbEI7QUFDSDtBQUNKLENBTkQ7O0FBUUEsRUFBRSxNQUFGLEVBQVUsTUFBVixDQUFpQixZQUFZO0FBQ3pCLGlCQUFhLEtBQUssRUFBbEI7QUFDQSxTQUFLLEVBQUwsR0FBVSxXQUFXLFlBQVksQ0FBRSxDQUF6QixFQUEyQixHQUEzQixDQUFWLENBRnlCLENBRWtCO0FBQzlDLENBSEQ7O0FBS0E7QUFDQSxJQUFJLFlBQVksS0FBaEI7QUFDQSxFQUFFLE1BQUYsRUFDSyxFQURMLENBQ1EsV0FEUixFQUNxQixZQUFZO0FBQ3pCLGdCQUFZLElBQVo7QUFDSCxDQUhMLEVBSUssRUFKTCxDQUlRLFVBSlIsRUFJb0IsWUFBWTtBQUN4QixnQkFBWSxLQUFaO0FBQ0gsQ0FOTDs7QUFRQTs7OztBQUlBLEVBQUUsVUFBRixFQUFjLEVBQWQsQ0FBaUIsZ0JBQWpCLEVBQW1DLFVBQVUsQ0FBVixFQUFhO0FBQzVDLFFBQUksU0FBSixFQUFlO0FBQ1gsb0JBQVksS0FBWjtBQUNBO0FBQ0g7QUFDRCxXQUFPLFFBQVAsR0FBa0IsRUFBRSxJQUFGLEVBQVEsSUFBUixDQUFhLE1BQWIsQ0FBbEI7QUFDSCxDQU5EOztBQVFBO0FBQ0E7QUFDQSxFQUFFLE1BQUYsQ0FBUyxFQUFFLElBQUYsQ0FBTyxHQUFQLENBQVQsRUFBc0I7QUFDbEIsZUFBVyxtQkFBVSxFQUFWLEVBQWMsS0FBZCxFQUFxQixRQUFyQixFQUErQjtBQUN0QyxlQUFPLEVBQUUsRUFBRixFQUFNLEVBQU4sQ0FBUywrQkFBVCxDQUFQO0FBQ0g7QUFIaUIsQ0FBdEI7O0FBTUEsSUFBSTtBQUNBLFdBQU8sT0FBUCxJQUNJLE9BQU8sT0FBUCxDQUFlLEdBRG5CLElBRUksT0FBTyxPQUFQLENBQWUsR0FBZixDQUNJLG1NQURKLENBRko7QUFLSCxDQU5ELENBTUUsT0FBTyxDQUFQLEVBQVUsQ0FBRTs7Ozs7QUNwUGQ7QUFDQSxPQUFPLElBQVAsR0FBYztBQUNWLFNBQUssT0FBTyxZQURGO0FBRVY7QUFDQSxZQUFRLGdCQUFVLE9BQVYsRUFBbUIsYUFBbkIsRUFBa0MsUUFBbEMsRUFBNEMsS0FBNUMsRUFBbUQ7QUFDdkQsaUJBQVMsSUFBVCxDQUFjLFlBQVk7QUFDdEIsY0FBRSxJQUFGLEVBQVEsT0FBUixDQUFnQixlQUFoQjtBQUNILFNBRkQ7O0FBSUEsZUFBTyxFQUFFLElBQUYsQ0FDSCxPQUFPLEdBQVAsQ0FBVyxPQUFPLE1BQVAsQ0FBYyxXQUF6QixFQUFzQyxFQUFFLFNBQVMsT0FBWCxFQUF0QyxDQURHLEVBRUg7QUFDSSwyQkFBZSxhQURuQjtBQUVJLG1CQUFPLEtBRlg7QUFHSSxzQkFBVSxPQUFPLE1BQVAsSUFBaUIsT0FBTztBQUh0QyxTQUZHLEVBUUYsSUFSRSxDQVFHLFVBQVUsSUFBVixFQUFnQjtBQUNsQixxQkFBUyxJQUFULENBQWMsVUFBVSxDQUFWLEVBQWEsRUFBYixFQUFpQjtBQUMzQixvQkFBSSxPQUFPLEVBQUUsRUFBRixDQUFYOztBQUVBLG9CQUFJLEtBQUssSUFBTCxDQUFVLFdBQVYsTUFBMkIsYUFBL0IsRUFBOEM7QUFDMUMsc0JBQUUsUUFBRixFQUFZLE9BQVosQ0FBb0IsYUFBcEIsRUFBbUMsQ0FBQyxJQUFELEVBQU8sSUFBUCxDQUFuQzs7QUFFQSx3QkFBSSxLQUFLLE9BQUwsQ0FBYSxPQUFiLEtBQXlCLE1BQTdCLEVBQXFDO0FBQ2pDLDZCQUFLLFVBQUwsQ0FBZ0IsV0FBaEIsRUFBNkIsTUFBN0IsQ0FDSSxlQURKLEVBRGlDLENBRzlCO0FBQ047QUFDSixpQkFSRCxNQVFPO0FBQ0gsc0JBQUUsUUFBRixFQUFZLE9BQVosQ0FBb0IsZUFBcEIsRUFBcUMsQ0FBQyxJQUFELEVBQU8sSUFBUCxDQUFyQztBQUNIO0FBQ0osYUFkRDtBQWVILFNBeEJFLEVBeUJGLElBekJFLENBeUJHLFVBQVUsS0FBVixFQUFpQixVQUFqQixFQUE2QixXQUE3QixFQUEwQztBQUM1QyxxQkFBUyxJQUFULENBQWMsVUFBVSxDQUFWLEVBQWEsRUFBYixFQUFpQjtBQUMzQixvQkFBSSxPQUFPLEVBQUUsRUFBRixDQUFYO0FBQ0EscUJBQUssT0FBTCxDQUFhLGVBQWIsRUFBOEIsQ0FDMUIsSUFEMEIsRUFFMUI7QUFDSSwyQkFBTyxLQURYO0FBRUksZ0NBQVksVUFGaEI7QUFHSSxpQ0FBYTtBQUhqQixpQkFGMEIsQ0FBOUI7QUFRSCxhQVZEO0FBV0gsU0FyQ0UsQ0FBUDtBQXNDSCxLQTlDUzs7QUFnRFYsaUJBQWEscUJBQVUsT0FBVixFQUFtQjtBQUM1QixZQUFJLE9BQU8sSUFBWDtBQUNBLFVBQUUsSUFBRixDQUFPO0FBQ0gsaUJBQUssT0FBTyxHQUFQLENBQVcsT0FBTyxNQUFQLENBQWMsV0FBekIsRUFBc0M7QUFDdkMseUJBQVMsU0FBUyxPQUFULEVBQWtCLEVBQWxCO0FBRDhCLGFBQXRDLENBREY7QUFJSCxrQkFBTSxRQUpIO0FBS0gscUJBQVMsbUJBQVk7QUFDakIsdUJBQU8sUUFBUCxHQUFrQixPQUFPLFFBQVAsQ0FBZ0IsUUFBbEM7QUFDSCxhQVBFO0FBUUgsbUJBQU8sZUFBVSxLQUFWLEVBQWlCLFVBQWpCLEVBQTZCLFdBQTdCLEVBQTBDO0FBQzdDLG9CQUFJLFdBQVcsS0FBSyxLQUFMLENBQVcsTUFBTSxZQUFqQixDQUFmO0FBQ0Esb0JBQUksU0FBUyxjQUFiLEVBQTZCO0FBQ3pCLHlCQUFLLEdBQUwsQ0FBUyxPQUFULENBQWlCLHNCQUFqQjtBQUNILGlCQUZELE1BRU8sSUFBSSxPQUFKLEVBQWE7QUFDaEIsd0JBQUksT0FBTyxFQUFYO0FBQ0Esd0JBQUksU0FBUyxTQUFULEtBQXVCLDRCQUEzQixFQUF5RDtBQUNyRCw2Q0FBbUIsT0FBTyxVQUFQLENBQ2YsT0FBTyxTQUFQLENBQWlCLE9BREYsRUFFZixPQUFPLFNBQVAsQ0FBaUIsZUFBakIsQ0FBaUMsV0FGbEIsQ0FBbkIsdUJBR21CLE9BQU8sSUFBUCxDQUNmLHFCQURlLENBSG5CO0FBTUgscUJBUEQsTUFPTyxJQUNILFNBQVMsU0FBVCxLQUNBLHdDQUZHLEVBR0w7QUFDRSw2Q0FBbUIsT0FBTyxHQUFQLENBQ2YsT0FBTyxNQUFQLENBQWMsYUFEQyxFQUVmO0FBQ0ksb0NBQVEsY0FEWjtBQUVJLHFDQUFTO0FBRmIseUJBRmUsQ0FBbkIsd0RBTW9ELE9BQU8sSUFBUCxDQUNoRCxhQURnRCxDQU5wRDtBQVNIOztBQUVELDRCQUFRLElBQVIsQ0FDSSxhQUNJLE9BQU8sSUFBUCxDQUFZLGNBQVosQ0FESixHQUVJLFlBRkosR0FHSSxPQUFPLElBQVAsQ0FBWSxXQUFXLFNBQVMsU0FBaEMsRUFBMkM7QUFDdkMsOEJBQU07QUFEaUMscUJBQTNDLENBSlIsRUFPSSxPQVBKO0FBU0g7O0FBRUQsa0JBQUUsZUFBRixFQUFtQixVQUFuQixDQUE4QixRQUE5QixFQUF3QyxPQUF4QztBQUNIO0FBaERFLFNBQVA7QUFrREgsS0FwR1M7O0FBc0dWO0FBQ0EsZUFBVyxtQkFBVSxPQUFWLEVBQW1CLEtBQW5CLEVBQTBCLFFBQTFCLEVBQW9DO0FBQzNDLGlCQUFTLElBQVQsQ0FBYyxZQUFZO0FBQ3RCLGdCQUFJLENBQUMsRUFBRSxJQUFGLEVBQVEsUUFBUixDQUFpQixnQkFBakIsQ0FBTCxFQUF5QztBQUNyQyxrQkFBRSxJQUFGLEVBQVEsT0FBUixDQUFnQixhQUFoQixFQUErQixFQUFFLElBQUYsQ0FBL0I7QUFDSDtBQUNKLFNBSkQ7O0FBTUEsVUFBRSxJQUFGLENBQU87QUFDSCxpQkFBSyxPQUFPLEdBQVAsQ0FBVyxPQUFPLE1BQVAsQ0FBYyxjQUF6QixDQURGO0FBRUgsa0JBQU0sTUFGSDtBQUdILGtCQUFNO0FBQ0YsdUJBQU8sS0FETDtBQUVGLHlCQUFTLE9BRlA7QUFHRiwwQkFBVSxPQUFPLE1BQVAsSUFBaUIsT0FBTyxNQUhoQztBQUlGLDhCQUNJLE9BQU8sY0FBUCxDQUFzQixvQkFBdEIsS0FDQSxPQUFPLE9BQVAsQ0FBZSxHQUFmLENBQW1CLG9CQUFuQixDQURBLElBRUEsRUFBRSxNQUFGLEVBQVUsSUFBVixDQUFlLE1BQWYsQ0FGQSxJQUdBO0FBUkYsYUFISDtBQWFILHFCQUFTLGlCQUFVLElBQVYsRUFBZ0IsVUFBaEIsRUFBNEIsR0FBNUIsRUFBaUM7QUFDdEMseUJBQVMsSUFBVCxDQUFjLFlBQVk7QUFDdEI7QUFDQSx3QkFBSSxJQUFJLE1BQUosS0FBZSxHQUFuQixFQUF3QjtBQUNwQiw0QkFBSSxVQUFVLEVBQUUsY0FBYyxJQUFoQixFQUFkO0FBQ0EsMEJBQUUsSUFBRixFQUFRLE9BQVIsQ0FBZ0IsYUFBaEIsRUFBK0IsQ0FBQyxFQUFFLElBQUYsQ0FBRCxFQUFVLE9BQVYsQ0FBL0I7QUFDSCxxQkFIRCxNQUdPO0FBQ0gsMEJBQUUsSUFBRixFQUFRLE9BQVIsQ0FBZ0IsYUFBaEIsRUFBK0IsQ0FBQyxFQUFFLElBQUYsQ0FBRCxFQUFVLElBQVYsQ0FBL0I7QUFDSDtBQUNKLGlCQVJEO0FBU0gsYUF2QkU7QUF3QkgsbUJBQU8sZUFBVSxRQUFWLEVBQW9CO0FBQ3ZCLHlCQUFTLElBQVQsQ0FBYyxZQUFZO0FBQ3RCLHNCQUFFLElBQUYsRUFBUSxPQUFSLENBQWdCLGFBQWhCLEVBQStCLENBQUMsRUFBRSxJQUFGLENBQUQsRUFBVSxRQUFWLENBQS9CO0FBQ0gsaUJBRkQ7QUFHSDtBQTVCRSxTQUFQO0FBOEJILEtBNUlTOztBQThJVjtBQUNBLGFBQVMsaUJBQVUsT0FBVixFQUFtQjtBQUN4QixlQUFPLEVBQUUsSUFBRixDQUFPO0FBQ1YsaUJBQUssT0FBTyxHQUFQLENBQVcsT0FBTyxNQUFQLENBQWMsYUFBekIsRUFBd0M7QUFDekMseUJBQVMsU0FBUyxPQUFUO0FBRGdDLGFBQXhDLENBREs7QUFJVixrQkFBTTtBQUpJLFNBQVAsQ0FBUDtBQU1ILEtBdEpTOztBQXdKVjtBQUNBLGtCQUFjLHNCQUFVLE9BQVYsRUFBbUI7QUFDN0IsZUFBTyxFQUFFLElBQUYsQ0FBTztBQUNWLGlCQUFLLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLFdBQXpCLEVBQXNDO0FBQ3ZDLHlCQUFTLFNBQVMsT0FBVDtBQUQ4QixhQUF0QyxDQURLO0FBSVYsa0JBQU07QUFKSSxTQUFQLENBQVA7QUFNSCxLQWhLUzs7QUFrS1YsZ0JBQVksb0JBQVUsSUFBVixFQUFnQixPQUFoQixFQUF5QjtBQUNqQyxVQUFFLElBQUYsQ0FBTztBQUNILGlCQUFLLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLGVBQXpCLEVBQTBDO0FBQzNDLHlCQUFTLE9BRGtDO0FBRTNDLHlCQUFTO0FBRmtDLGFBQTFDLENBREY7QUFLSCxrQkFBTSxRQUxIO0FBTUgscUJBQVMsbUJBQVk7QUFDakIsdUJBQU8sUUFBUCxDQUFnQixNQUFoQjtBQUNILGFBUkU7QUFTSCxtQkFBTyxlQUFVLEtBQVYsRUFBaUIsVUFBakIsRUFBNkIsV0FBN0IsRUFBMEM7QUFDN0Msb0JBQUksV0FBVyxLQUFLLEtBQUwsQ0FBVyxNQUFNLFlBQWpCLENBQWY7QUFDQSxvQkFBSSxPQUFKLEVBQWE7QUFDVCw0QkFBUSxJQUFSLENBQ0ksYUFDSSxPQUFPLElBQVAsQ0FBWSxjQUFaLENBREosR0FFSSxZQUZKLEdBR0ksT0FBTyxJQUFQLENBQVksV0FBVyxTQUFTLFNBQWhDLENBSlIsRUFLSSxPQUxKO0FBT0g7QUFDRCxrQkFBRSxRQUFGLEVBQVksVUFBWixDQUF1QixRQUF2QixFQUFpQyxPQUFqQztBQUNIO0FBckJFLFNBQVA7QUF1QkgsS0ExTFM7O0FBNExWO0FBQ0EsaUJBQWEscUJBQVUsT0FBVixFQUFtQixRQUFuQixFQUE2QjtBQUN0QyxVQUFFLFFBQUYsRUFBWSxJQUFaLENBQWlCLFlBQVk7QUFDekIsY0FBRSxJQUFGLEVBQVEsT0FBUixDQUFnQixvQkFBaEI7QUFDSCxTQUZEOztBQUlBLFVBQUUsSUFBRixDQUFPO0FBQ0gsaUJBQUssT0FBTyxHQUFQLENBQVcsT0FBTyxNQUFQLENBQWMsa0JBQXpCLEVBQTZDO0FBQzlDLHlCQUFTO0FBRHFDLGFBQTdDLENBREY7QUFJSCxrQkFBTSxLQUpIO0FBS0gscUJBQVMsaUJBQVUsSUFBVixFQUFnQjtBQUNyQixrQkFBRSxRQUFGLEVBQVksSUFBWixDQUFpQixZQUFZO0FBQ3pCLHNCQUFFLElBQUYsRUFBUSxPQUFSLENBQWdCLG9CQUFoQixFQUFzQyxJQUF0QztBQUNILGlCQUZEO0FBR0gsYUFURTtBQVVILG1CQUFPLGVBQVUsS0FBVixFQUFpQixVQUFqQixFQUE2QixXQUE3QixFQUEwQztBQUM3QyxrQkFBRSxRQUFGLEVBQVksSUFBWixDQUFpQixZQUFZO0FBQ3pCLHNCQUFFLElBQUYsRUFBUSxPQUFSLENBQ0ksb0JBREosRUFFSSxLQUZKLEVBR0ksVUFISixFQUlJLFdBSko7QUFNSCxpQkFQRDtBQVFIO0FBbkJFLFNBQVA7QUFxQkgsS0F2TlM7O0FBeU5WO0FBQ0Esb0JBQWdCLHdCQUFVLE9BQVYsRUFBbUIsUUFBbkIsRUFBNkIsTUFBN0IsRUFBcUM7QUFDakQsVUFBRSxRQUFGLEVBQVksSUFBWixDQUFpQixZQUFZO0FBQ3pCLGNBQUUsSUFBRixFQUFRLE9BQVIsQ0FBZ0IsdUJBQWhCLEVBQXlDLFFBQXpDO0FBQ0gsU0FGRDs7QUFJQSxZQUFJLE9BQU8sSUFBWDs7QUFFQSxVQUFFLElBQUYsQ0FBTztBQUNILGlCQUFLLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLHFCQUF6QixFQUFnRDtBQUNqRCx5QkFBUztBQUR3QyxhQUFoRCxDQURGO0FBSUgsa0JBQU0sUUFKSDtBQUtILHFCQUFTLGlCQUFVLElBQVYsRUFBZ0I7QUFDckIsb0JBQUksTUFBSixFQUFZO0FBQ1I7QUFDQSwyQkFBTyxRQUFQLENBQWdCLE1BQWhCO0FBQ0gsaUJBSEQsTUFHTztBQUNILHNCQUFFLFFBQUYsRUFBWSxJQUFaLENBQWlCLFlBQVk7QUFDekIsMEJBQUUsSUFBRixFQUFRLE9BQVIsQ0FBZ0IsdUJBQWhCLEVBQXlDLElBQXpDO0FBQ0gscUJBRkQ7QUFHSDtBQUNKLGFBZEU7QUFlSCxtQkFBTyxlQUFVLEtBQVYsRUFBaUIsVUFBakIsRUFBNkIsV0FBN0IsRUFBMEM7QUFDN0Msb0JBQUksV0FBVyxLQUFLLEtBQUwsQ0FBVyxNQUFNLFlBQWpCLENBQWY7QUFDQSxvQkFBSSxTQUFTLGNBQWIsRUFBNkI7QUFDekIseUJBQUssR0FBTCxDQUFTLE9BQVQsQ0FBaUIsc0JBQWpCO0FBQ0gsaUJBRkQsTUFFTztBQUNILHNCQUFFLFFBQUYsRUFBWSxJQUFaLENBQWlCLFlBQVk7QUFDekIsMEJBQUUsSUFBRixFQUFRLE9BQVIsQ0FDSSx1QkFESixFQUVJLEtBRkosRUFHSSxVQUhKLEVBSUksV0FKSjtBQU1ILHFCQVBEO0FBUUg7QUFDSjtBQTdCRSxTQUFQO0FBK0JILEtBaFFTOztBQWtRVixvQkFBZ0Isd0JBQVUsS0FBVixFQUFpQjtBQUM3QixZQUNJLFNBQ0EsTUFBTSxNQUROLElBRUEsT0FBTyxTQUFQLENBQWlCLGVBRmpCLElBR0EsT0FBTyxTQUFQLENBQWlCLGNBSnJCLEVBS0U7QUFDRSxjQUFFLE1BQUYsRUFBVSxPQUFWLENBQWtCLG9CQUFsQjs7QUFFQSxjQUFFLElBQUYsQ0FBTztBQUNILHFCQUFLLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLFNBQXpCLENBREY7QUFFSCxzQkFBTSxNQUZIO0FBR0gsNkJBQWEsa0JBSFY7QUFJSCx5QkFBUyxLQUpOO0FBS0gsc0JBQU0sS0FBSyxTQUFMLENBQWUsRUFBRSxVQUFVLEtBQVosRUFBZixDQUxIO0FBTUgseUJBQVMsaUJBQVUsSUFBVixFQUFnQjtBQUNyQixzQkFBRSxNQUFGLEVBQVUsT0FBVixDQUFrQixvQkFBbEIsRUFBd0MsSUFBeEM7QUFDSCxpQkFSRTtBQVNILHVCQUFPLGVBQVUsS0FBVixFQUFpQixVQUFqQixFQUE2QixXQUE3QixFQUEwQztBQUM3QyxzQkFBRSxNQUFGLEVBQVUsT0FBVixDQUNJLG9CQURKLEVBRUksS0FGSixFQUdJLFVBSEosRUFJSSxXQUpKLEVBS0ksS0FMSjtBQU9IO0FBakJFLGFBQVA7QUFtQkg7QUFDSixLQS9SUzs7QUFpU1YsdUJBQW1CLDJCQUFVLE9BQVYsRUFBbUIsUUFBbkIsRUFBNkIsUUFBN0IsRUFBdUM7QUFDdEQsWUFBSSxXQUFXLEVBQVgsSUFBaUIsV0FBVyxJQUFoQyxFQUFzQztBQUNsQztBQUNIOztBQUVELFVBQUUsUUFBRixFQUFZLElBQVosQ0FBaUIsWUFBWTtBQUN6QixjQUFFLElBQUYsRUFBUSxPQUFSLENBQWdCLHVCQUFoQjtBQUNILFNBRkQ7O0FBSUEsWUFBSSxPQUFPLElBQVg7QUFDQSxVQUFFLElBQUYsQ0FBTztBQUNILGlCQUFLLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLG1CQUF6QixFQUE4QztBQUMvQyx5QkFBUztBQURzQyxhQUE5QyxDQURGO0FBSUgsa0JBQU0sS0FKSDtBQUtILHFCQUFTLENBTE47QUFNSCxxQkFBUyxpQkFBVSxJQUFWLEVBQWdCO0FBQ3JCLGtCQUFFLFFBQUYsRUFBWSxJQUFaLENBQWlCLFlBQVk7QUFDekIsc0JBQUUsSUFBRixFQUFRLE9BQVIsQ0FBZ0IseUJBQWhCLEVBQTJDLEVBQUUsT0FBTyxJQUFULEVBQTNDO0FBQ0gsaUJBRkQ7O0FBSUEsb0JBQUksWUFBWSxJQUFoQixFQUFzQjtBQUNsQiw2QkFBUyxJQUFUO0FBQ0g7QUFDSixhQWRFOztBQWdCSCxtQkFBTyxlQUFVLElBQVYsRUFBZ0I7QUFDbkI7QUFDQSxxQkFBSyxHQUFMLENBQVMsT0FBVCxDQUFpQiwyQkFBakI7QUFDSDtBQW5CRSxTQUFQO0FBcUJILEtBaFVTOztBQWtVVixxQkFBaUIseUJBQVUsT0FBVixFQUFtQjtBQUNoQyxlQUFPLEVBQUUsSUFBRixDQUFPO0FBQ1YsaUJBQUssT0FBTyxHQUFQLENBQVcsT0FBTyxNQUFQLENBQWMsbUJBQXpCLEVBQThDLEVBQUUsSUFBSSxPQUFOLEVBQTlDLENBREs7QUFFVixrQkFBTSxLQUZJO0FBR1YscUJBQVM7QUFIQyxTQUFQLENBQVA7QUFLSCxLQXhVUzs7QUEwVVYsbUJBQWUsdUJBQVUsT0FBVixFQUFtQixRQUFuQixFQUE2QjtBQUN4QyxVQUFFLElBQUYsQ0FBTztBQUNILGlCQUFLLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLHNCQUF6QixFQUFpRDtBQUNsRCx5QkFBUztBQUR5QyxhQUFqRCxDQURGO0FBSUgsa0JBQU0sS0FKSDtBQUtILHFCQUFTLENBTE47QUFNSCxxQkFBUyxpQkFBVSxJQUFWLEVBQWdCO0FBQ3JCLGtCQUFFLFFBQUYsRUFBWSxJQUFaLENBQWlCLFlBQVk7QUFDekIsc0JBQUUsSUFBRixFQUFRLE9BQVIsQ0FBZ0Isc0JBQWhCLEVBQXdDLElBQXhDO0FBQ0gsaUJBRkQ7QUFHSCxhQVZFOztBQVlILG1CQUFPLGVBQVUsSUFBVixFQUFnQjtBQUNuQixrQkFBRSxJQUFGLEVBQVEsT0FBUixDQUFnQixxQkFBaEIsRUFBdUMsSUFBdkM7QUFDSDtBQWRFLFNBQVA7QUFnQkgsS0EzVlM7O0FBNlZWLG1CQUFlLHVCQUFVLE9BQVYsRUFBbUIsTUFBbkIsRUFBMkI7QUFDdEMsWUFBSSxPQUFPLElBQVg7QUFDQSxVQUFFLElBQUYsQ0FBTztBQUNILGlCQUFLLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLHNCQUF6QixFQUFpRDtBQUNsRCx5QkFBUztBQUR5QyxhQUFqRCxDQURGO0FBSUgsa0JBQU0sS0FKSDtBQUtILGtCQUFNLEVBQUUsUUFBUSxNQUFWLEVBTEg7QUFNSCxxQkFBUyxDQU5OOztBQVFILG1CQUFPLGVBQVUsSUFBVixFQUFnQjtBQUNuQixrQkFBRSxJQUFGLEVBQVEsT0FBUixDQUFnQixxQkFBaEIsRUFBdUMsSUFBdkM7O0FBRUE7QUFDQSxxQkFBSyxHQUFMLENBQVMsT0FBVCxDQUFpQixpQkFBakI7QUFDSDtBQWJFLFNBQVA7QUFlSCxLQTlXUzs7QUFnWFYsc0JBQWtCLDBCQUFVLE9BQVYsRUFBbUI7QUFDakMsWUFBSSxPQUFPLElBQVg7QUFDQSxVQUFFLElBQUYsQ0FBTztBQUNILGlCQUFLLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLHNCQUF6QixFQUFpRDtBQUNsRCx5QkFBUztBQUR5QyxhQUFqRCxDQURGO0FBSUgsa0JBQU0sUUFKSDtBQUtILHFCQUFTLENBTE47O0FBT0gsbUJBQU8sZUFBVSxJQUFWLEVBQWdCO0FBQ25CLGtCQUFFLElBQUYsRUFBUSxPQUFSLENBQWdCLHFCQUFoQixFQUF1QyxJQUF2Qzs7QUFFQTtBQUNBLHFCQUFLLEdBQUwsQ0FBUyxPQUFULENBQWlCLG9CQUFqQjtBQUNIO0FBWkUsU0FBUDtBQWNILEtBaFlTOztBQWtZVixvQkFBZ0Isd0JBQVUsUUFBVixFQUFvQjtBQUNoQyxlQUFPLEVBQUUsSUFBRixDQUFPO0FBQ1YsaUJBQUssT0FBTyxHQUFQLENBQVcsT0FBTyxNQUFQLENBQWMsV0FBekIsQ0FESztBQUVWLGtCQUFNLEtBRkk7QUFHVixxQkFBUztBQUhDLFNBQVAsQ0FBUDtBQUtILEtBeFlTOztBQTBZVix3QkFBb0IsNEJBQVUsT0FBVixFQUFtQixhQUFuQixFQUFrQztBQUNsRCxZQUFJLE1BQU0sT0FBTyxJQUFQLENBQVksV0FBWixFQUF5QixFQUFFLEdBQUcsT0FBTCxFQUF6QixDQUFWO0FBQ0EsWUFBSSxlQUFlLDBCQUFuQjtBQUNBLFlBQUksSUFBSSxLQUFKLENBQVUsVUFBVixDQUFKLEVBQTJCO0FBQ3ZCLDJCQUFlLCtCQUFmO0FBQ0g7QUFDRCxZQUFJLFVBQVUsT0FBTyxHQUFQLENBQVcsT0FBTyxNQUFQLENBQWMsWUFBekIsQ0FBZDtBQUNBLFlBQUksUUFBUSxPQUFPLElBQVAsQ0FBWSxPQUFaLENBQVo7QUFDQSxZQUFJLE9BQUosRUFBYTtBQUNULG9CQUFRLElBQVIsQ0FDSSxPQUFPLElBQVAsQ0FBWSxZQUFaLEVBQTBCO0FBQ3RCLCtCQUFlLGFBRE87QUFFdEIscUJBQUssR0FGaUI7QUFHdEIsc0JBQ0ksMkJBQ0EsT0FEQSxHQUVBLGlCQUZBLEdBR0EsS0FIQSxHQUlBO0FBUmtCLGFBQTFCLENBREosRUFXSSxZQVhKO0FBYUg7QUFDSjtBQWphUyxDQUFkOzs7OztBQ0RBLElBQUksVUFBVSxFQUFFLFFBQUYsQ0FBZDs7QUFFQTs7O0FBR0EsRUFBRSxlQUFGLEVBQW1CLElBQW5CLENBQXdCLFlBQVc7QUFDL0I7QUFDQSxNQUFFLElBQUYsRUFBUSxFQUFSLENBQVcsbUJBQVgsRUFBZ0MsWUFBVztBQUN2QyxrQkFBVSxTQUFTLGFBQW5CO0FBQ0gsS0FGRDs7QUFJQSxNQUFFLElBQUYsRUFBUSxFQUFSLENBQVcscUJBQVgsRUFBa0MsWUFBVztBQUN6QyxZQUFJLFFBQVEsSUFBWjs7QUFFQSxVQUFFLEtBQUYsRUFBUyxJQUFULENBQWMsYUFBZCxFQUE2QixLQUE3QjtBQUNBLFVBQUUsWUFBRixFQUFnQixJQUFoQixDQUFxQixhQUFyQixFQUFvQyxNQUFwQztBQUNBLFVBQUUsYUFBRixFQUFpQixJQUFqQixDQUFzQixhQUF0QixFQUFxQyxNQUFyQztBQUNBLFVBQUUsZ0JBQUYsRUFBb0IsSUFBcEIsQ0FBeUIsYUFBekIsRUFBd0MsTUFBeEM7O0FBRUE7QUFDQSxVQUFFLEtBQUYsRUFBUyxJQUFULENBQWMsaUJBQWQsRUFBaUMsS0FBakM7QUFFSCxLQVhELEVBV0csRUFYSCxDQVdNLHFCQVhOLEVBVzZCLFlBQVc7QUFDcEMsVUFBRSxJQUFGLEVBQVEsSUFBUixDQUFhLGFBQWIsRUFBNEIsSUFBNUI7QUFDQSxVQUFFLFlBQUYsRUFBZ0IsSUFBaEIsQ0FBcUIsYUFBckIsRUFBb0MsT0FBcEM7QUFDQSxVQUFFLGFBQUYsRUFBaUIsSUFBakIsQ0FBc0IsYUFBdEIsRUFBcUMsT0FBckM7QUFDQSxVQUFFLGdCQUFGLEVBQW9CLElBQXBCLENBQXlCLGFBQXpCLEVBQXdDLE9BQXhDO0FBQ0E7QUFDQSxnQkFBUSxLQUFSO0FBQ0gsS0FsQkQ7QUFtQkgsQ0F6QkQ7O0FBMkJBOzs7OztBQUtBLEVBQUUsUUFBRixFQUFZLEVBQVosQ0FBZSxTQUFmLEVBQTBCLGVBQTFCLEVBQTJDLFVBQVMsQ0FBVCxFQUFZO0FBQ25ELFFBQUksYUFBYSxTQUFTLGFBQTFCOztBQUVBLFFBQUksRUFBRSxVQUFGLEVBQWMsUUFBZCxDQUF1QixnQkFBdkIsS0FBNEMsRUFBRSxLQUFGLEtBQVksQ0FBeEQsSUFBNkQsRUFBRSxRQUFuRSxFQUE2RTtBQUN6RSxVQUFFLGNBQUY7QUFDQSxVQUFFLGVBQUY7QUFDQSxVQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsZ0JBQWIsRUFBK0IsS0FBL0I7QUFDSCxLQUpELE1BSU8sSUFBSSxFQUFFLFVBQUYsRUFBYyxRQUFkLENBQXVCLGVBQXZCLEtBQTJDLEVBQUUsS0FBRixLQUFZLENBQXZELElBQTRELENBQUMsRUFBRSxRQUFuRSxFQUE2RTtBQUNoRixVQUFFLGNBQUY7QUFDQSxVQUFFLGVBQUY7QUFDQSxVQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsaUJBQWIsRUFBZ0MsS0FBaEM7QUFDSDtBQUNKLENBWkQ7O0FBY0E7QUFDQSxFQUFFLHNCQUFGLEVBQTBCLE9BQTFCLENBQWtDLFVBQVMsQ0FBVCxFQUFZO0FBQzFDLFFBQUksRUFBRSxLQUFGLElBQVcsRUFBZixFQUFtQjtBQUNmLFVBQUUsSUFBRixFQUFRLEtBQVI7QUFDSDtBQUNKLENBSkQ7O0FBTUE7QUFDQSxFQUFFLG1FQUFGLEVBQXVFLEVBQXZFLENBQTBFLHFCQUExRSxFQUFpRyxZQUFXOztBQUV4RztBQUNBLE1BQUUsOEJBQUYsRUFBa0MsSUFBbEMsQ0FBdUMsWUFBVztBQUM5QyxZQUFJLFlBQVksRUFBRSxJQUFGLEVBQVEsT0FBUixDQUFnQixrQkFBaEIsQ0FBaEI7QUFDQSxrQkFBVSxJQUFWLENBQWUsVUFBVSxJQUFWLENBQWUsb0JBQWYsQ0FBZjtBQUNILEtBSEQ7QUFJSCxDQVBEOzs7OztBQzNEQTs7QUFFQTtBQUNBO0FBQ0EsSUFBSSxXQUFXLE1BQWY7O0FBRUEsSUFBSSw0QkFBNEIsU0FBNUIseUJBQTRCLENBQVUsQ0FBVixFQUFhO0FBQ3pDLFFBQUksQ0FBSixFQUFPO0FBQ0gsZUFBTyxFQUFFLE9BQUYsQ0FBVSxlQUFWLEVBQTJCLElBQTNCLENBQVA7QUFDSCxLQUZELE1BRU87QUFDSCxlQUFPLENBQVA7QUFDSDtBQUNKLENBTkQ7O0FBUUEsSUFBSSxlQUFlLFNBQWYsWUFBZSxDQUFVLEtBQVYsRUFBaUI7QUFDaEMsV0FDSSxFQUFFLDJCQUFGLEVBQStCLEtBQS9CLEtBQ0EsRUFBRSx5QkFBRixFQUE2QixLQUE3QixFQURBLEdBRUEsTUFBTSxLQUFOLEVBRkEsR0FHQSxFQUpKO0FBTUgsQ0FQRDs7QUFTQSxJQUFNLGlCQUFpQixTQUFqQixjQUFpQixHQUFNO0FBQ3pCLFFBQU0sV0FBVyxFQUFFLDJCQUFGLENBQWpCO0FBQ0EsUUFBSSxPQUFPLGNBQVAsQ0FBc0IsU0FBdEIsQ0FBZ0MsY0FBaEMsS0FBbUQsUUFBdkQsRUFBaUU7QUFDN0QsWUFBSSxrQ0FBSixDQUFxQjtBQUNqQixnQkFBSSxRQURhO0FBRWpCLDBCQUFjLE9BQU8sU0FBUCxDQUFpQixZQUZkO0FBR2pCLDRCQUFnQixPQUFPLFNBQVAsQ0FBaUIsY0FIaEI7QUFJakIsNkJBQWlCLE9BQU8sU0FBUCxDQUFpQjtBQUpqQixTQUFyQjtBQU1IO0FBQ0osQ0FWRDs7QUFZQSxFQUFFLFFBQUYsRUFBWSxLQUFaLENBQWtCLFlBQVk7QUFDMUI7QUFDQSxNQUFFLFFBQUYsRUFBWSxFQUFaLENBQWUsT0FBZixFQUF3QixvQkFBeEIsRUFBOEMsVUFBVSxDQUFWLEVBQWE7QUFDdkQsWUFBSSxFQUFFLEtBQUYsSUFBVyxFQUFmLEVBQW1CO0FBQ2YsZ0JBQUksRUFBRSxJQUFGLEVBQVEsR0FBUixNQUFpQixFQUFyQixFQUF5QjtBQUNyQixrQkFBRSxJQUFGLEVBQVEsT0FBUixDQUFnQixNQUFoQixFQUF3QixNQUF4QjtBQUNILGFBRkQsTUFFTztBQUNILGtCQUFFLGNBQUY7QUFDQSx1QkFBTyxLQUFQO0FBQ0g7QUFDSjtBQUNKLEtBVEQ7O0FBV0E7QUFDQSxRQUFJLGNBQWMsMEJBQTBCLFNBQVMsUUFBbkMsQ0FBbEI7QUFDQSxRQUFJLFdBQVcsMEJBQTBCLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLElBQXpCLENBQTFCLENBQWY7QUFDQSxRQUFJLGdCQUFnQixRQUFwQixFQUE4QjtBQUMxQjtBQUNBO0FBQ0EsVUFBRSxjQUFjLFdBQWQsR0FBNEIsSUFBOUIsRUFBb0MsUUFBcEMsQ0FBNkMsVUFBN0M7QUFDQSxVQUFFLGNBQWMsV0FBZCxHQUE0QixZQUE5QixFQUE0QyxRQUE1QyxDQUFxRCxVQUFyRDtBQUNIOztBQUVELFFBQUksRUFBRSxRQUFGLEVBQVksS0FBWixLQUFzQixHQUExQixFQUErQjtBQUMzQixVQUFFLGVBQUYsRUFBbUIsV0FBbkIsQ0FBK0IsS0FBL0I7QUFDSDs7QUFFRDtBQUNBLE1BQUUsc0JBQUYsRUFBMEIsR0FBMUIsQ0FDSSxPQURKLEVBRUksYUFBYSxFQUFFLDRCQUFGLENBQWIsSUFBZ0QsSUFGcEQ7QUFJSCxDQWhDRDs7QUFrQ0EsRUFBRSx1QkFBRixFQUNLLEVBREwsQ0FDUSxrQkFEUixFQUM0QixZQUFZO0FBQ2hDLGVBQVcsWUFBWTtBQUNuQixZQUFJLENBQUMsRUFBRSw2QkFBRixFQUFpQyxFQUFqQyxDQUFvQyxVQUFwQyxDQUFMLEVBQXNEO0FBQ2xELGNBQUUsNkJBQUYsRUFBaUMsTUFBakM7QUFDQSxnQkFBSSxPQUFPLE9BQVgsRUFBb0IsT0FBTyxPQUFQLENBQWUsV0FBZjtBQUN2Qjs7QUFFRCxZQUFJLEVBQUUseUJBQUYsRUFBNkIsUUFBN0IsQ0FBc0MsU0FBdEMsQ0FBSixFQUFzRDtBQUNsRCxtQkFBTyxxQkFBUCxDQUE2QixLQUE3QjtBQUNBLGdCQUFJLE9BQU8sT0FBWCxFQUFvQixPQUFPLE9BQVAsQ0FBZSxXQUFmO0FBQ3ZCO0FBQ0osS0FWRCxFQVVHLENBVkg7QUFXSCxDQWJMLEVBY0ssRUFkTCxDQWNRLFVBZFIsRUFjb0IsWUFBWTtBQUN4QixlQUFXLFlBQVk7QUFDbkIsWUFBSSxVQUFVLEVBQUUsU0FBUyxhQUFYLENBQWQ7QUFDQSxZQUNJLENBQUMsUUFBUSxRQUFSLENBQWlCLHVCQUFqQixDQUFELElBQ0EsRUFBRSw2QkFBRixFQUFpQyxHQUFqQyxDQUFxQyxTQUFyQyxLQUFtRCxPQURuRCxJQUVBLENBQUMsUUFBUSxRQUFSLENBQWlCLHNCQUFqQixDQUhMLEVBSUU7QUFDRSxnQkFBSSxPQUFPLE9BQVgsRUFBb0IsT0FBTyxPQUFQLENBQWUsV0FBZjtBQUN2QjtBQUNKLEtBVEQsRUFTRyxDQVRIO0FBVUgsQ0F6Qkw7O0FBMkJBLEVBQ0ksdUhBREosRUFFRSxFQUZGLENBRUssVUFGTCxFQUVpQixZQUFZO0FBQ3pCLGVBQVcsWUFBWTtBQUNuQixZQUFJLFVBQVUsRUFBRSxTQUFTLGFBQVgsQ0FBZDtBQUNBLFlBQ0ksQ0FBQyxRQUFRLFFBQVIsQ0FBaUIsd0JBQWpCLENBQUQsSUFDQSxDQUFDLFFBQVEsUUFBUixDQUFpQix5QkFBakIsQ0FERCxJQUVBLENBQUMsUUFBUSxRQUFSLENBQWlCLGVBQWpCLENBRkQsSUFHQSxDQUFDLFFBQVEsUUFBUixDQUFpQix1QkFBakIsQ0FIRCxJQUlBLENBQUMsUUFBUSxRQUFSLENBQWlCLHNCQUFqQixDQUxMLEVBTUU7QUFDRSxjQUFFLDZCQUFGLEVBQWlDLElBQWpDO0FBQ0g7QUFDSixLQVhELEVBV0csQ0FYSDtBQVlILENBZkQ7O0FBaUJBO0FBQ0EsRUFBRSxnQkFBRixFQUFvQixFQUFwQixDQUNJLFdBREosRUFFSSxFQUFFLFFBQUYsQ0FBVyxVQUFVLENBQVYsRUFBYTtBQUNwQixNQUFFLGNBQUY7QUFDQSxNQUFFLGVBQUY7O0FBRUE7QUFDQTtBQUNBO0FBQ0EsUUFDSSxPQUFPLGNBQVAsQ0FBc0IsU0FBdEIsQ0FBZ0MsZUFBaEMsS0FDQSxPQUFPLGtCQUZYLEVBR0U7QUFDRSxlQUFPLGtCQUFQLENBQTBCLEtBQTFCO0FBQ0g7O0FBRUQ7O0FBRUEsZUFBVyxZQUFZO0FBQ25CLFlBQUksT0FBTyxPQUFYLEVBQW9CLE9BQU8sT0FBUCxDQUFlLFdBQWY7QUFDdkIsS0FGRCxFQUVHLENBRkg7O0FBSUEsUUFBSSxFQUFFLGtCQUFGLEVBQXNCLFFBQXRCLENBQStCLFVBQS9CLENBQUosRUFBZ0Q7QUFDNUMsVUFBRSxrQkFBRixFQUNLLFdBREwsQ0FDaUIsVUFEakIsRUFFSyxRQUZMLENBRWMsWUFGZDtBQUdIOztBQUVELE1BQ0ksZ0RBQWdELFFBQWhELEdBQTJELElBRC9ELEVBRUUsTUFGRjs7QUFJQSxRQUFJLEVBQUUseUJBQUYsRUFBNkIsUUFBN0IsQ0FBc0MsU0FBdEMsQ0FBSixFQUFzRDtBQUNsRCxlQUFPLHFCQUFQLENBQTZCLEtBQTdCO0FBQ0g7O0FBRUQsUUFBSSxFQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsSUFBYixLQUFzQixXQUExQixFQUF1QztBQUNuQyxZQUFJLEVBQUUsSUFBRixFQUFRLElBQVIsQ0FBYSxlQUFiLEtBQWlDLE9BQXJDLEVBQThDO0FBQzFDLGNBQUUsSUFBRixFQUFRLElBQVIsQ0FBYSxlQUFiLEVBQThCLE1BQTlCO0FBQ0gsU0FGRCxNQUVPO0FBQ0gsY0FBRSxJQUFGLEVBQVEsSUFBUixDQUFhLGVBQWIsRUFBOEIsT0FBOUI7QUFDSDtBQUNKO0FBQ0QsV0FBTyxLQUFQO0FBQ0gsQ0ExQ0QsRUEwQ0csR0ExQ0gsQ0FGSjs7QUErQ0E7QUFDQSxFQUFFLHVCQUFGLEVBQ0ssRUFETCxDQUNRLHVCQURSLEVBQ2lDLFlBQVk7QUFDckMsTUFBRSxVQUFGLEVBQWMsR0FBZCxDQUFrQixVQUFsQixFQUE4QixTQUE5QjtBQUNBLFFBQUksT0FBTyxFQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsR0FBYixDQUFYO0FBQ0EsTUFBRSxJQUFGLEVBQVEsSUFBUixDQUFhLEdBQWIsRUFBa0IsSUFBbEIsQ0FBdUIsVUFBdkIsRUFBbUMsS0FBSyxJQUFMLENBQVUsVUFBVixDQUFuQztBQUNBLFNBQUssSUFBTCxDQUFVLFVBQVYsRUFBc0IsS0FBSyxJQUFMLENBQVUsVUFBVixDQUF0QjtBQUNILENBTkwsRUFPSyxFQVBMLENBT1EsdUJBUFIsRUFPaUMsWUFBWTtBQUNyQyxNQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsR0FBYixFQUFrQixJQUFsQixDQUF1QixVQUF2QixFQUFtQyxDQUFDLENBQXBDO0FBQ0EsTUFBRSxJQUFGLEVBQVEsSUFBUixDQUFhLEdBQWIsRUFBa0IsSUFBbEIsQ0FBdUIsVUFBdkIsRUFBbUMsQ0FBQyxDQUFwQztBQUNILENBVkw7O0FBWUEsRUFBRSxNQUFGLEVBQVUsTUFBVixDQUFpQixZQUFZO0FBQ3pCLFFBQUksUUFBUSxFQUFFLFFBQUYsRUFBWSxLQUFaLEVBQVo7QUFDQSxRQUFJLFNBQVMsR0FBYixFQUFrQjtBQUNkLFVBQUUsZUFBRixFQUFtQixRQUFuQixDQUE0QixLQUE1Qjs7QUFFQSxZQUFJLGFBQWEsRUFBRSxzQkFBRixDQUFqQjtBQUNBLFlBQUksV0FBVyxRQUFYLENBQW9CLGFBQXBCLENBQUosRUFBd0M7QUFDcEMsdUJBQVcsR0FBWCxDQUNJLE9BREosRUFFSSxhQUFhLEVBQUUsNEJBQUYsQ0FBYixJQUFnRCxJQUZwRDtBQUlILFNBTEQsTUFLTztBQUNILHVCQUFXLEdBQVgsQ0FDSSxPQURKLEVBRUksYUFBYSxFQUFFLDRCQUFGLENBQWIsSUFBZ0QsSUFGcEQ7QUFJSDtBQUNKLEtBZkQsTUFlTztBQUNILFVBQUUsZUFBRixFQUFtQixXQUFuQixDQUErQixLQUEvQjtBQUNIO0FBQ0osQ0FwQkQ7O0FBc0JBLFNBQVMsY0FBVCxHQUEwQjtBQUN0QixNQUFFLDRCQUFGLEVBQWdDLFFBQWhDLENBQXlDLFVBQXpDO0FBQ0EsUUFBSSxnQkFBZ0IsRUFBRSw0QkFBRixDQUFwQjtBQUNBLGtCQUFjLFdBQWQsQ0FBMEIsVUFBMUI7QUFDQSxNQUFFLHNCQUFGLEVBQ0ssV0FETCxDQUNpQixhQURqQixFQUVLLFFBRkwsQ0FFYyxlQUZkLEVBR0ssR0FITCxDQUdTLE9BSFQsRUFHa0IsYUFBYSxhQUFiLElBQThCLElBSGhEO0FBSUg7O0FBRUQsU0FBUyxlQUFULEdBQTJCO0FBQ3ZCLFFBQUksa0JBQWtCLEVBQUUsNEJBQUYsQ0FBdEI7QUFDQSxvQkFBZ0IsV0FBaEIsQ0FBNEIsVUFBNUI7QUFDQSxNQUFFLDRCQUFGLEVBQWdDLFFBQWhDLENBQXlDLFVBQXpDO0FBQ0EsTUFBRSxzQkFBRixFQUNLLFFBREwsQ0FDYyxhQURkLEVBRUssV0FGTCxDQUVpQixlQUZqQixFQUdLLEdBSEwsQ0FHUyxPQUhULEVBR2tCLGFBQWEsZUFBYixJQUFnQyxJQUhsRDtBQUlIOztBQUVEO0FBQ0EsRUFBRSx1QkFBRixFQUEyQixFQUEzQixDQUE4QixXQUE5QixFQUEyQyxZQUFZO0FBQ25ELE1BQUUsdUJBQUYsRUFBMkIsR0FBM0IsQ0FBK0IsRUFBL0IsRUFBbUMsT0FBbkMsQ0FBMkMsT0FBM0MsRUFBb0QsS0FBcEQ7QUFDQTtBQUNBLE1BQUUsNkJBQUYsRUFBaUMsSUFBakM7O0FBRUE7QUFDQSxNQUFFLHNCQUFGLEVBQTBCLHVCQUExQixFQUFtRCxPQUFuRCxDQUEyRCxPQUEzRDtBQUNBLE1BQUUsc0JBQUYsRUFBMEIsdUJBQTFCLEVBQW1ELE9BQW5ELENBQTJELFVBQTNEO0FBQ0gsQ0FSRDs7QUFVQSxFQUFFLHVCQUFGLEVBQ0ssRUFETCxDQUNRLE9BRFIsRUFDaUIsWUFBWTtBQUNyQjs7QUFFQSxRQUFJLEVBQUUsSUFBRixFQUFRLEdBQVIsR0FBYyxNQUFkLEtBQXlCLENBQTdCLEVBQWdDO0FBQzVCO0FBQ0EsVUFBRSw2QkFBRixFQUFpQyxJQUFqQztBQUNIO0FBQ0osQ0FSTCxFQVNLLEVBVEwsQ0FTUSxhQVRSLEVBU3VCLFlBQVk7QUFDM0IsUUFBSSxFQUFFLElBQUYsRUFBUSxHQUFSLEdBQWMsTUFBZCxHQUF1QixDQUEzQixFQUE4QjtBQUMxQjtBQUNIO0FBQ0QsTUFBRSw2QkFBRixFQUFpQyxJQUFqQztBQUNILENBZEwsRUFlSyxFQWZMLENBZVEsTUFmUixFQWVnQixZQUFZO0FBQ3BCO0FBQ0EsTUFBRSxnREFBRixFQUFvRCxXQUFwRCxDQUNJLGlCQURKO0FBR0gsQ0FwQkw7O0FBc0JBLEVBQUUsUUFBRixFQUFZLEtBQVosQ0FBa0IsVUFBVSxDQUFWLEVBQWE7QUFDM0IsUUFBSSxDQUFDLEVBQUUsRUFBRSxNQUFKLEVBQVksTUFBWixHQUFxQixNQUFyQixHQUE4QixRQUE5QixDQUF1QywwQkFBdkMsQ0FBTCxFQUF5RTtBQUNyRTtBQUNIO0FBQ0osQ0FKRDs7QUFNQSxFQUFFLG1CQUFGLEVBQXVCLEVBQXZCLENBQTBCLGtCQUExQixFQUE4QyxVQUFVLENBQVYsRUFBYTtBQUN2RCxRQUFJLEVBQUUsdUJBQUYsRUFBMkIsR0FBM0IsT0FBcUMsRUFBekMsRUFBNkM7QUFDekMsVUFBRSxxQkFBRixFQUF5QixNQUF6QjtBQUNIO0FBQ0osQ0FKRDs7QUFNQTtBQUNBLEVBQUUsNENBQUYsRUFBZ0QsRUFBaEQsQ0FDSSxXQURKLEVBRUksd0JBRkosRUFHSSxVQUFVLENBQVYsRUFBYTtBQUNULE1BQUUsZUFBRjs7QUFFQSxRQUFJLFlBQVksRUFBRSxJQUFGLEVBQVEsTUFBUixFQUFoQjs7QUFFQSxRQUFJLFVBQVUsUUFBVixDQUFtQixRQUFuQixLQUFnQyxVQUFVLFFBQVYsQ0FBbUIsU0FBbkIsQ0FBcEMsRUFBbUU7QUFDL0Qsa0JBQVUsV0FBVixDQUFzQixRQUF0QjtBQUNBLFVBQUUsMkNBQUYsRUFBK0MsTUFBL0M7QUFDSCxLQUhELE1BR08sSUFBSSxVQUFVLFFBQVYsQ0FBbUIsU0FBbkIsQ0FBSixFQUFtQztBQUN0QyxVQUFFLCtCQUFGLEVBQW1DLFdBQW5DLENBQStDLFFBQS9DO0FBQ0Esa0JBQVUsUUFBVixDQUFtQixRQUFuQjtBQUNBLFVBQUUsMkNBQUYsRUFBK0MsTUFBL0M7QUFDQSxVQUFFLElBQUYsRUFBUSxNQUFSLEdBQWlCLElBQWpCLENBQXNCLFVBQXRCLEVBQWtDLE1BQWxDO0FBQ0g7O0FBRUQsUUFBSSxPQUFPLE9BQVgsRUFBb0IsT0FBTyxPQUFQLENBQWUsV0FBZjtBQUN2QixDQW5CTDs7QUFzQkE7QUFDQSxJQUFJLFNBQVMsT0FBTyxNQUFwQjtBQUNBLElBQUksU0FBUyxPQUFPLE1BQXBCOztBQUVBLElBQUksVUFBVSxNQUFkLEVBQXNCO0FBQ2xCLE1BQUUsZUFBRixFQUFtQixVQUFuQixDQUE4QixXQUE5QjtBQUNILENBRkQsTUFFTztBQUNILE1BQUUsZUFBRixFQUFtQixLQUFuQjtBQUNIOztBQUVEO0FBQ0EsT0FBTyxtQkFBUCxHQUE2QixZQUFZO0FBQ3JDLFFBQ0ksRUFBRSxzQkFBRixFQUEwQixHQUExQixDQUE4QixTQUE5QixLQUE0QyxNQUE1QyxJQUNBLEVBQUUsZUFBRixFQUFtQixHQUFuQixDQUF1QixTQUF2QixLQUFxQyxNQURyQyxJQUVBLEVBQUUsYUFBRixFQUFpQixNQUFqQixHQUEwQixDQUYxQixJQUdBLEtBQUssR0FBTCxDQUFTLE9BQU8sV0FBaEIsS0FBZ0MsRUFKcEMsRUFLRTtBQUNFLFVBQUUsdUJBQUYsRUFBMkIsT0FBM0IsQ0FBbUMsT0FBbkM7QUFDSCxLQVBELE1BT08sSUFDSCxLQUFLLEdBQUwsQ0FBUyxPQUFPLFdBQWhCLE1BQWlDLEVBQWpDLElBQ0EsRUFBRSxhQUFGLEVBQWlCLE1BQWpCLEdBQTBCLENBRnZCLEVBR0w7QUFDRSxVQUFFLGVBQUYsRUFBbUIsT0FBbkIsQ0FBMkIsT0FBM0I7QUFDSCxLQUxNLE1BS0EsSUFBSSxFQUFFLGFBQUYsRUFBaUIsTUFBakIsR0FBMEIsQ0FBOUIsRUFBaUM7QUFDcEMsVUFBRSx1QkFBRixFQUEyQixPQUEzQixDQUFtQyxPQUFuQztBQUNIO0FBQ0osQ0FoQkQ7O0FBa0JBLEVBQUUsb0JBQUYsRUFBd0IsS0FBeEIsQ0FBOEIsVUFBVSxDQUFWLEVBQWE7QUFDdkMsUUFBSSxDQUFDLEVBQUUsb0JBQUYsRUFBd0IsRUFBeEIsQ0FBMkIsUUFBM0IsQ0FBTCxFQUEyQztBQUN2QyxpQkFBUyxhQUFULENBQXVCLElBQXZCO0FBQ0EsVUFBRSxJQUFGLEVBQVEsSUFBUjtBQUNBLFlBQUksT0FBTyxFQUFFLElBQUYsRUFBUSxHQUFSLEVBQVg7QUFDQSxVQUFFLG9CQUFGLEVBQXdCLEdBQXhCLENBQTRCLElBQTVCO0FBQ0EsVUFBRSxJQUFGLEVBQVEsS0FBUjtBQUNBLFVBQUUsY0FBRjtBQUNIO0FBQ0osQ0FURDs7QUFXQSxJQUFJLEVBQUUsdUJBQUYsRUFBMkIsSUFBM0IsQ0FBZ0MsS0FBaEMsS0FBMEMsRUFBOUMsRUFBa0Q7QUFDOUM7QUFDSDs7QUFFRCxJQUFJLEVBQUUsdUJBQUYsRUFBMkIsSUFBM0IsQ0FBZ0MsS0FBaEMsS0FBMEMsRUFBOUMsRUFBa0Q7QUFDOUM7QUFDSDs7QUFFRDs7OztBQUlBLElBQUksVUFBVSxLQUFkO0FBQ0EsRUFBRSxxQkFBRixFQUNLLEVBREwsQ0FDUSx1QkFEUixFQUNpQyxVQUFVLEtBQVYsRUFBaUI7QUFDMUMsTUFBRSxJQUFGLEVBQVEsSUFBUixDQUFhLE9BQWIsRUFBc0IsSUFBdEIsQ0FBMkIsVUFBM0IsRUFBdUMsQ0FBdkM7QUFDQTtBQUNBLFFBQUksQ0FBQyxPQUFMLEVBQWM7QUFDVjtBQUNBLFlBQUksTUFBTSxFQUFFLHFCQUFGLENBQVY7QUFDQSxZQUFJLFVBQVUsSUFBSSxJQUFKLENBQVMsZ0JBQVQsRUFBMkIsUUFBM0IsQ0FBb0MsSUFBcEMsQ0FBZDtBQUNBLFlBQUksY0FBYyxRQUFRLE1BQTFCO0FBQ0EsWUFBSSxjQUFlLElBQUksV0FBTCxHQUFvQixHQUFwQixHQUEwQixHQUE1Qzs7QUFFQSxnQkFBUSxHQUFSLENBQVksT0FBWixFQUFxQixXQUFyQjs7QUFFQSxZQUFJLGdCQUFnQixDQUFwQixFQUF1QjtBQUNuQixvQkFBUSxJQUFSLEdBQWUsR0FBZixDQUFtQixPQUFuQixFQUE0QixPQUE1QjtBQUNIOztBQUVELFlBQUksUUFBSixDQUFhLFNBQVMsV0FBVCxHQUF1QixVQUFwQztBQUNBLGtCQUFVLElBQVY7QUFDSDtBQUNKLENBcEJMLEVBcUJLLEVBckJMLENBcUJRLHVCQXJCUixFQXFCaUMsWUFBWTtBQUNyQyxNQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsT0FBYixFQUFzQixJQUF0QixDQUEyQixVQUEzQixFQUF1QyxDQUFDLENBQXhDO0FBQ0gsQ0F2Qkw7O0FBeUJBLEVBQUUsc0JBQUYsRUFBMEIsRUFBMUIsQ0FBNkIsT0FBN0IsRUFBc0MsVUFBVSxLQUFWLEVBQWlCO0FBQ25ELFVBQU0sZUFBTjtBQUNBLFVBQU0sY0FBTjtBQUNBLFdBQU8sVUFBUCxDQUFrQixJQUFsQixDQUF1QixRQUF2QixDQUFnQyxNQUFoQyxDQUF1QyxFQUFFLElBQUYsQ0FBdkM7O0FBRUE7QUFDSCxDQU5EOztBQVFBLEVBQUUsc0JBQUYsRUFBMEIsRUFBMUIsQ0FBNkIsT0FBN0IsRUFBc0MsVUFBVSxLQUFWLEVBQWlCO0FBQ25ELFVBQU0sZUFBTjtBQUNBLFVBQU0sY0FBTjtBQUNBLFFBQUksTUFBTSxLQUFOLEtBQWdCLEVBQXBCLEVBQXdCO0FBQ3BCLGVBQU8sVUFBUCxDQUFrQixJQUFsQixDQUF1QixRQUF2QixDQUFnQyxNQUFoQyxDQUF1QyxFQUFFLElBQUYsQ0FBdkM7O0FBRUE7QUFDSDtBQUNKLENBUkQ7O0FBVUEsRUFBRSxzQkFBRixFQUNLLEVBREwsQ0FDUSx1QkFEUixFQUNpQyxZQUFZO0FBQ3JDLE1BQUUsSUFBRixFQUFRLElBQVIsQ0FBYSxHQUFiLEVBQWtCLElBQWxCLENBQXVCLFVBQXZCLEVBQW1DLENBQW5DO0FBQ0EsTUFBRSxJQUFGLEVBQVEsSUFBUixDQUFhLFNBQWI7QUFDQSxNQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsVUFBYixFQUF5QixDQUF6QixFQUE0QixLQUE1QjtBQUNILENBTEwsRUFNSyxFQU5MLENBTVEsdUJBTlIsRUFNaUMsWUFBWTtBQUNyQyxNQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsR0FBYixFQUFrQixJQUFsQixDQUF1QixVQUF2QixFQUFtQyxDQUFDLENBQXBDO0FBQ0EsTUFBRSxJQUFGLEVBQVEsSUFBUixDQUFhLFVBQWIsRUFBeUIsQ0FBQyxDQUExQjtBQUNILENBVEw7O0FBV0E7QUFDQSxFQUFFLGNBQUYsRUFBa0IsRUFBbEIsQ0FBcUIsdUJBQXJCLEVBQThDLFVBQVUsQ0FBVixFQUFhO0FBQ3ZELFdBQU8sVUFBUCxDQUFrQixJQUFsQixDQUF1QixRQUF2QixDQUFnQyxLQUFoQyxDQUFzQyxFQUFFLG1CQUFGLENBQXRDO0FBQ0gsQ0FGRDs7QUFJQSxFQUFFLHdCQUFGLEVBQTRCLEVBQTVCLENBQStCLFdBQS9CLEVBQTRDLFlBQVk7QUFDcEQsWUFBUSxHQUFSLENBQVkscUJBQVosRUFBbUMsR0FBbkMsRUFBd0MsRUFBRSxNQUFNLEdBQVIsRUFBYSxTQUFTLENBQXRCLEVBQXhDOztBQUVBLFFBQUksbUJBQW1CLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLGFBQXpCLENBQXZCOztBQUVBLE1BQUUsbUJBQUYsRUFBdUIsSUFBdkI7QUFDQSxRQUFJLE9BQU8sT0FBWCxFQUFvQixPQUFPLE9BQVAsQ0FBZSxXQUFmO0FBQ3BCLE1BQUUsNERBQUYsRUFDSyxVQURMLENBQ2dCLDBDQURoQixFQUVLLElBRkwsQ0FFVSxFQUFFLE1BQU0sZ0JBQVIsRUFBMEIsZ0JBQWdCLEVBQTFDLEVBRlY7QUFHQSxNQUNJLHdHQURKLEVBRUUsRUFGRixDQUVLLE9BRkwsRUFFYyxVQUFVLENBQVYsRUFBYTtBQUN2QixVQUFFLGVBQUY7QUFDSCxLQUpEO0FBS0gsQ0FmRDs7Ozs7QUM1WUEsQ0FBQSxDQUFFLGVBQUYsQ0FBQSxDQUFtQixFQUFuQixDQUFzQixxQkFBdEIsRUFBNkMsVUFBVSxDQUFWLEVBQWE7SUFDdEQsQ0FBQSxDQUFFLDhCQUFGLENBQUEsQ0FBa0MsSUFBbEMsQ0FBdUMsS0FBdkMsRUFBOEMsYUFBOUMsQ0FBQSxDQUFBO0NBREosQ0FBQSxDQUFBOztBQUlBLENBQUEsQ0FBRSxZQUFNO0lBQ0osSUFBSSxDQUFDLE1BQUEsQ0FBTyxjQUFQLENBQXNCLFNBQXRCLENBQWdDLDBCQUFoQyxDQUFMLEVBQWtFO1FBQzlELENBQUEsQ0FBRSxNQUFGLENBQUEsQ0FBVSxFQUFWLENBQWEsYUFBYixFQUE0QixvQkFBNUIsRUFBa0QsVUFBVSxDQUFWLEVBQWE7WUFDM0QsQ0FBQSxDQUFFLHdCQUFGLEVBQUEsQ0FBQTs7WUFFQSxJQUFJLENBQUEsQ0FBRSxJQUFGLEtBQVcsT0FBWCxJQUFzQixDQUFBLENBQUUsS0FBRixLQUFZLEVBQWxDLElBQXdDLENBQUEsQ0FBRSxLQUFGLEtBQVksRUFBeEQsRUFBNEQ7O2dCQUV4RCxJQUFJLFFBQUEsR0FBVyxDQUFBLENBQUUsSUFBRixDQUFBLENBQVEsSUFBUixDQUFhLGVBQWIsQ0FBZixDQUFBOztnQkFFQSxJQUFJLENBQUEsQ0FBRSxLQUFBLEdBQVEsUUFBVixDQUFBLENBQW9CLE1BQXBCLEVBQUEsQ0FBNkIsSUFBN0IsR0FBb0MsQ0FBeEMsRUFBMkM7b0JBQ3ZDLFVBQUEsQ0FBVyxJQUFYLENBQWdCLFFBQWhCLENBQXlCLEtBQXpCLENBQ0ksQ0FBQSxDQUFFLEdBQUEsR0FBTSxRQUFSLENBREosRUFFSSxDQUFBLENBQ0ksb0NBQUEsR0FDSSxDQUFBLENBQUUsR0FBQSxHQUFNLFFBQVIsQ0FBQSxDQUFrQixJQUFsQixDQUF1QixJQUF2QixDQURKLEdBRUksSUFIUixDQUZKLENBQUEsQ0FBQTtvQkFRQSxDQUFBLENBQUUsS0FBQSxHQUFRLFFBQVIsR0FBbUIsT0FBckIsQ0FBQSxDQUE4QixJQUE5QixDQUFtQyxVQUFuQyxFQUErQyxDQUFDLENBQWhELENBQUEsQ0FBQTtpQkFUSixNQVVPO29CQUNILENBQUEsQ0FBRSxRQUFGLENBQUEsQ0FBWSxVQUFaLENBQXVCLFVBQXZCLEVBQW1DLFVBQW5DLENBQUEsQ0FBQTtvQkFDQSxDQUFBLENBQUUsS0FBQSxHQUFRLFFBQVIsR0FBbUIsT0FBckIsQ0FBQSxDQUE4QixJQUE5QixDQUFtQyxVQUFuQyxFQUErQyxDQUEvQyxDQUFBLENBQUE7b0JBQ0EsVUFBQSxDQUFXLElBQVgsQ0FBZ0IsUUFBaEIsQ0FBeUIsSUFBekIsQ0FDSSxDQUFBLENBQUUsR0FBQSxHQUFNLFFBQVIsQ0FESixFQUVJLENBQUEsQ0FDSSxvQ0FBQSxHQUNJLENBQUEsQ0FBRSxHQUFBLEdBQU0sUUFBUixDQUFBLENBQWtCLElBQWxCLENBQXVCLElBQXZCLENBREosR0FFSSxJQUhSLENBRkosQ0FBQSxDQUFBO29CQVFBLENBQUEsQ0FBRSxJQUFGLENBQUEsQ0FBUSxLQUFSLEVBQUEsQ0FBQTtpQkFDSDthQUNKO1NBOUJMLENBQUEsQ0FBQTtLQWdDSDtDQWxDTCxDQUFBLENBQUE7O0FBcUNBLENBQUEsQ0FBRSxNQUFGLENBQUEsQ0FBVSxFQUFWLENBQWEsdUJBQWIsRUFBc0Msa0JBQXRDLEVBQTBELFVBQVUsQ0FBVixFQUFhO0lBQ25FLENBQUEsQ0FBRSxDQUFBLENBQUUsTUFBSixDQUFBLENBQVksSUFBWixDQUFpQixHQUFqQixDQUFBLENBQXNCLElBQXRCLENBQTJCLFVBQTNCLEVBQXVDLElBQXZDLENBQUEsQ0FBQTtDQURKLENBQUEsQ0FBQTs7QUFJQSxDQUFBLENBQUUsTUFBRixDQUFBLENBQVUsRUFBVixDQUFhLHVCQUFiLEVBQXNDLGtCQUF0QyxFQUEwRCxVQUFVLENBQVYsRUFBYTtJQUNuRSxDQUFBLENBQUUsQ0FBQSxDQUFFLE1BQUosQ0FBQSxDQUFZLElBQVosQ0FBaUIsR0FBakIsQ0FBQSxDQUFzQixJQUF0QixDQUEyQixVQUEzQixFQUF1QyxHQUF2QyxDQUFBLENBQUE7Q0FESixDQUFBLENBQUE7O0FBSUEsQ0FBQSxDQUFFLE1BQUYsQ0FBQSxDQUFVLEVBQVYsQ0FDSSxPQURKLEVBRUksNERBRkosRUFHSSxVQUFVLENBQVYsRUFBYTtJQUNULElBQUksU0FBQSxHQUFZLE1BQUEsQ0FBTyxHQUFQLENBQVcsTUFBQSxDQUFPLE1BQVAsQ0FBYyxhQUF6QixFQUF3QztRQUNwRCxPQUFBLEVBQVMsTUFBQSxDQUFPLFFBQVAsQ0FBZ0IsSUFBQTtLQURiLENBQWhCLENBQUE7SUFHQSxJQUFJLDJCQUFBLEdBQ0EsTUFBQSxDQUFPLGNBQVAsQ0FBc0IsU0FBdEIsQ0FBZ0Msd0JBQWhDLENBQUEsSUFDQSxDQUFDLE1BQUEsQ0FBTyxTQUFQLENBQWlCLGVBRGxCLElBRUEsQ0FBQyxNQUFBLENBQU8sU0FBUCxDQUFpQixzQkFIdEIsQ0FBQTtJQUlBLElBQUksMkJBQUosRUFBaUM7UUFDN0IsQ0FBQSxDQUFFLHdCQUFGLEVBQUEsQ0FBQTtRQUNBLE1BQUEsQ0FBTyxRQUFQLENBQWdCLE1BQWhCLENBQXVCLFNBQXZCLENBQUEsQ0FBQTtLQUZKLE1BR087O1FBRUgsSUFBSSxLQUFBLEdBQVEsT0FBQSxDQUFRLEdBQVIsQ0FBWSxXQUFaLENBQUEsS0FBNkIsU0FBekMsQ0FBQTtRQUNBLElBQUksTUFBQSxHQUFTLENBQUEsQ0FBRSxDQUFBLENBQUUsTUFBSixDQUFBLENBQVksT0FBWixDQUFvQixHQUFwQixDQUFiLENBQUE7UUFDQSxJQUFJLGNBQUEsR0FBaUIsS0FBckIsQ0FBQTs7O1FBR0EsSUFBSSxNQUFBLENBQU8sSUFBUCxDQUFZLGlCQUFaLENBQUosRUFBb0M7WUFDaEMsY0FBQSxHQUNJLE1BQUEsQ0FBTyxJQUFQLENBQVksaUJBQVosQ0FBQSxLQUFtQyxNQUFuQyxHQUE0QyxJQUE1QyxHQUFtRCxLQUR2RCxDQUFBO1NBRUg7O1FBRUQsSUFBSSxjQUFBLEtBQW1CLEtBQW5CLElBQTRCLE1BQUEsQ0FBTyxTQUFQLENBQWlCLFVBQWpELEVBQTZEO1lBQ3pELElBQUksS0FBQSxHQUNBLE1BQUEsQ0FBTyxTQUFQLENBQWlCLFVBQWpCLENBQTRCLE1BQUEsQ0FBTyxJQUFQLENBQVksZUFBWixDQUE1QixDQURKLENBQUE7WUFFQSxJQUFJLE9BQUEsR0FBVSxLQUFBLENBQU0sU0FBTixDQUFkLENBQUE7WUFDQSxPQUFBLENBQVEsT0FBUixDQUFnQixVQUFDLEdBQUQsRUFBUztnQkFDckIsSUFBSSxHQUFBLENBQUksSUFBSixDQUFBLEtBQWMsZ0JBQWxCLEVBQW9DO29CQUNoQyxjQUFBLEdBQWlCLElBQWpCLENBQUE7aUJBQ0g7YUFITCxDQUFBLENBQUE7U0FLSDs7UUFFRCxJQUNJLENBQUEsQ0FBRSxRQUFGLENBQUEsQ0FBWSxLQUFaLEVBQUEsSUFBdUIsR0FBdkIsSUFDQSxNQUFBLENBQU8sSUFBUCxDQUFZLFdBQVosQ0FBQSxLQUE2QixPQUQ3QixJQUVBLE1BQUEsQ0FBTyxJQUFQLENBQVksWUFBWixDQUZBLElBR0EsS0FIQSxJQUlBLGNBTEosRUFNRTtZQUNFLE1BQUEsQ0FDSyxJQURMLENBQ1U7Z0JBQ0YsTUFBQSxFQUFRLFFBRE47Z0JBRUYsR0FBQSxFQUFLLFlBRkg7Z0JBR0YsSUFBQSxFQUFNLE1BQUEsQ0FBTyxJQUFQLENBQVksV0FBWixDQUFBO2FBSmQsQ0FBQSxDQU1LLFVBTkwsQ0FNZ0IsZ0JBTmhCLENBQUEsQ0FBQTtTQVBKLE1BY087WUFDSCxNQUFBLENBQU8sSUFBUCxDQUFZLGdCQUFaLEVBQThCLHNCQUE5QixDQUFBLENBQUE7O1lBRUEsSUFBSSxNQUFBLENBQU8sSUFBUCxDQUFZLFdBQVosQ0FBSixFQUE4QjtnQkFDMUIsQ0FBQSxDQUFFLDhCQUFGLENBQUEsQ0FBa0MsSUFBbEMsQ0FDSSxLQURKLEVBRUksTUFBQSxDQUFPLElBQVAsQ0FBWSxXQUFaLENBRkosQ0FBQSxDQUFBO2dCQUlBLENBQUEsQ0FBRSxpQ0FBRixDQUFBLENBQXFDLElBQXJDLENBQ0ksTUFBQSxDQUFPLElBQVAsQ0FBWSxZQUFaLENBREosQ0FBQSxDQUFBO2dCQUdBLENBQUEsQ0FBRSxRQUFGLENBQUEsQ0FBWSxVQUFaLENBQXVCLFFBQXZCLEVBQWlDLFFBQWpDLENBQUEsQ0FBQTthQUNIO1NBQ0o7S0FDSjtDQWpFVCxDQUFBLENBQUE7Ozs7OztBQ2pEQTs7OztBQUlBLE9BQU8sS0FBUCxHQUFlO0FBQ1gsZ0JBQVksb0JBQVUsUUFBVixFQUFvQjtBQUM1QixlQUFPLElBQVAsQ0FBWSxTQUFaLENBQ0ksU0FBUyxJQUFULENBQWMsZUFBZCxDQURKLEVBRUksRUFBRSw0QkFBRixFQUFnQyxHQUFoQyxFQUZKLEVBR0ksUUFISjtBQUtILEtBUFU7O0FBU1g7OztBQUdBLHFCQUFpQix5QkFBVSxJQUFWLEVBQWdCO0FBQzdCLFlBQUksQ0FBQyxLQUFLLFFBQUwsQ0FBYyxVQUFkLENBQUwsRUFBZ0M7QUFDNUIsZ0JBQUksS0FBSixFQUNJLE1BREosRUFFSSxRQUZKLEVBR0ksT0FISixFQUlJLGNBSkosRUFLSSxZQUxKLEVBTUksT0FOSjs7QUFRQSxvQkFBUSxLQUFLLElBQUwsQ0FBVSxZQUFWLENBQVI7QUFDQSxxQkFBUyxLQUFLLElBQUwsQ0FBVSxXQUFWLENBQVQ7QUFDQSx1QkFBVyxLQUFLLElBQUwsQ0FBVSxnQkFBVixDQUFYO0FBQ0Esc0JBQVUsS0FBSyxJQUFMLENBQVUsY0FBVixDQUFWO0FBQ0EsNkJBQWlCLEtBQUssSUFBTCxDQUFVLHNCQUFWLENBQWpCO0FBQ0EsMkJBQWUsS0FBSyxJQUFMLENBQVUsc0JBQVYsS0FBcUMsRUFBcEQ7QUFDQSxzQkFBVSxLQUFLLElBQUwsQ0FBVSxlQUFWLENBQVY7O0FBRUEsZ0JBQUksUUFBUSxFQUFFLHFCQUFGLENBQVo7QUFDQSxjQUFFLG1CQUFGLEVBQXVCLElBQXZCLENBQTRCLEtBQTVCO0FBQ0EsY0FBRSx5QkFBRixFQUNLLFdBREwsR0FFSyxRQUZMLENBRWMsVUFBVSxNQUZ4QjtBQUdBLGNBQUUseUJBQUYsRUFBNkIsSUFBN0IsQ0FBa0MsUUFBbEM7QUFDQSxjQUFFLHlCQUFGLEVBQTZCLElBQTdCLENBQWtDLEtBQWxDLEVBQXlDLE9BQXpDOztBQUVBLGdCQUFJLFlBQVksT0FBTyxJQUFQLENBQVksZ0NBQVosRUFBOEM7QUFDMUQsNkJBQWEsT0FBTyxTQUFQLENBQWlCO0FBRDRCLGFBQTlDLENBQWhCO0FBR0EsZ0JBQUksT0FBTyxTQUFQLENBQWlCLFVBQWpCLENBQTRCLE9BQTVCLEVBQXFDLFdBQXJDLEtBQXFELENBQXpELEVBQTREO0FBQ3hELDRCQUFZLE9BQU8sSUFBUCxDQUFZLGtDQUFaLENBQVo7QUFDSDtBQUNELGNBQUUsc0JBQUYsRUFBMEIsSUFBMUIsQ0FBK0IsU0FBL0I7O0FBRUEsZ0JBQUksa0JBQWtCLFNBQWxCLElBQStCLFlBQW5DLEVBQWlEO0FBQzdDLGtCQUFFLCtCQUFGLEVBQ0ssSUFETCxDQUVRLE9BQU8sSUFBUCxDQUFZLGlCQUFaLEVBQStCO0FBQzNCLG9DQUFnQjtBQURXLGlCQUEvQixDQUZSLEVBTUssV0FOTCxDQU1pQixRQU5qQjtBQU9ILGFBUkQsTUFRTztBQUNILGtCQUFFLCtCQUFGLEVBQW1DLElBQW5DLENBQXdDLEVBQXhDLEVBQTRDLFFBQTVDLENBQXFELFFBQXJEO0FBQ0g7O0FBRUQsY0FBRSx3QkFBRixFQUE0QixJQUE1QixDQUFpQyxlQUFqQyxFQUFrRCxPQUFsRDs7QUFFQSxnQkFDSSxLQUFLLElBQUwsQ0FBVSxnQkFBVixLQUErQixPQUEvQixJQUNBLEtBQUssSUFBTCxDQUFVLGdCQUFWLEtBQStCLE9BRC9CLElBRUEsUUFBUSxHQUFSLENBQVkscUJBQVosS0FBc0MsR0FIMUMsRUFJRTtBQUNFO0FBQ0Esa0JBQUUsb0JBQUYsRUFBd0IsVUFBeEIsQ0FBbUMsUUFBbkMsRUFBNkMsTUFBN0M7QUFDSCxhQVBELE1BT087QUFDSCxzQkFBTSxVQUFOLENBQWlCLFFBQWpCLEVBQTJCLE1BQTNCO0FBQ0g7QUFDSjtBQUNKO0FBdkVVLENBQWY7O0FBMEVBOzs7QUFHQSxPQUFPLE9BQVAsR0FBaUI7QUFDYixjQUFVLEVBREc7O0FBR2IsaUJBQWEscUJBQVUsSUFBVixFQUFnQixTQUFoQixFQUEyQjtBQUNwQyxhQUFLLFdBQUwsQ0FBaUIsNENBQWpCLEVBQStELFFBQS9ELENBQ0ksY0FBYyxTQURsQjtBQUdILEtBUFk7O0FBU2IsdUJBQW1CLDJCQUFVLElBQVYsRUFBZ0IsTUFBaEIsRUFBd0IsV0FBeEIsRUFBcUM7QUFDcEQsZUFBTyxLQUFLLElBQUwsQ0FBVSxhQUFWLElBQ0QsSUFEQyxHQUVELEtBQUssT0FBTCxDQUNJLG9EQURKLENBRk47QUFLQSxZQUFJLFFBQVEsRUFBWjtBQUNBLFlBQUksT0FBTyxLQUFLLElBQUwsQ0FBVSxNQUFWLENBQVg7QUFDQSxZQUFJLFVBQVUsS0FBSyxJQUFMLENBQVUsVUFBVixDQUFkO0FBQ0EsWUFBSSxVQUFVLEtBQUssSUFBTCxDQUFVLFNBQVYsQ0FBZDtBQUNBLFlBQUksYUFBYSxFQUFqQjtBQUNBLFlBQUksUUFBUSxRQUFRLEdBQVIsQ0FBWSxXQUFaLEtBQTRCLFNBQXhDO0FBQ0EsWUFBSSxXQUFXLGFBQWEsT0FBYixDQUFmO0FBQ0EsWUFBSSxlQUFlLE9BQU8sU0FBUCxDQUFpQixTQUFqQixDQUEyQixLQUEzQixDQUFpQyxNQUFqQyxJQUNiLElBRGEsR0FFYixLQUZOO0FBR0EsWUFBSSxrQkFBa0IsRUFBdEI7O0FBRUEsWUFBSSxtQkFDQSxPQUFPLE9BQVAsSUFBa0IsU0FBUyxPQUFPLFNBQWhCLEVBQTJCLEVBQTNCLEtBQWtDLEdBQXBELEdBQ00sSUFETixHQUVNLEtBSFY7QUFJQSxZQUFJLGlCQUNBLE9BQU8sU0FBUCxDQUFpQixTQUFqQixDQUEyQixLQUEzQixDQUFpQyxpQkFBakMsS0FDQSxPQUFPLE9BRFAsR0FFTSxJQUZOLEdBR00sS0FKVjtBQUtBLFlBQUksWUFBWSxPQUFPLFNBQVAsQ0FBaUIsU0FBakIsQ0FBMkIsS0FBM0IsQ0FBaUMsUUFBakMsSUFDVixJQURVLEdBRVYsS0FGTjtBQUdBLFlBQUksU0FDQSxPQUFPLFNBQVAsQ0FBaUIsU0FBakIsQ0FBMkIsS0FBM0IsQ0FBaUMsY0FBakMsS0FBb0QsQ0FBQyxPQUFPLE1BQTVELEdBQ00sSUFETixHQUVNLEtBSFY7QUFJQSxZQUFJLFNBQVMsd0JBQXdCLElBQXhCLENBQTZCLFVBQVUsU0FBdkMsSUFDUCxJQURPLEdBRVAsS0FGTjtBQUdBLFlBQUksdUJBQ0MsQ0FBQyxnQkFBRCxLQUFzQixrQkFBa0IsU0FBbEIsSUFBK0IsTUFBckQsQ0FBRCxJQUNBLE1BREEsR0FFTSxJQUZOLEdBR00sS0FKVjs7QUFNQSxZQUFJLGtCQUNBLG1FQURKOztBQUdBLFlBQUksU0FBUyxFQUNULHlDQUNJLEtBQUssSUFBTCxDQUFVLGVBQVYsQ0FESixHQUVJLE1BSEssQ0FBYjs7QUFNQSxZQUFJLE9BQUosRUFBYTtBQUNULGlCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksUUFBUSxNQUE1QixFQUFvQyxHQUFwQyxFQUF5QztBQUNyQyxvQkFDSSxRQUFRLENBQVIsRUFBVyxJQUFYLEtBQW9CLGlCQUFwQixJQUNBLFFBQVEsQ0FBUixFQUFXLElBQVgsS0FBb0IsaUJBRHBCLElBRUEsUUFBUSxDQUFSLEVBQVcsSUFBWCxLQUFvQixxQkFIeEIsRUFJRTtBQUNFLHNDQUFrQixRQUFRLENBQVIsRUFBVyxJQUFYLENBQWxCO0FBQ0g7QUFDSjtBQUNKOztBQUVELGdCQUFRLE1BQVI7QUFDSSxpQkFBSyxRQUFMO0FBQ0k7QUFDQSxvQkFBSSxnQkFBZ0IsRUFBRSwwQkFBMEIsT0FBNUIsRUFBcUMsR0FBckMsRUFBcEI7QUFDQSxvQkFBSSxRQUFRLGFBQVosRUFBMkI7QUFDdkIsNEJBQVEsT0FBTyxJQUFQLENBQVksS0FBWixDQUFSO0FBQ0EseUJBQUssUUFBTCxDQUFjLGtCQUFkLEVBQWtDLFdBQWxDLENBQ0ksNkJBREo7O0FBSUE7O0FBRUEsd0JBQUksUUFBUSxHQUFSLENBQVksbUJBQVosS0FBb0MsR0FBeEMsRUFBNkM7QUFDekMsNkJBQUssVUFBTCxDQUFnQixnQkFBaEI7QUFDSDtBQUNKLGlCQVhELE1BV08sSUFBSSxnQkFBZ0IsQ0FBcEIsRUFBdUI7QUFDMUIsNEJBQ0ksOENBQ0EsT0FBTyxJQUFQLENBQVksUUFBWixDQURBLEdBRUEsc0RBRkEsR0FHQSxPQUFPLElBQVAsQ0FBWSxVQUFaLEVBQXdCO0FBQ3BCLHVDQUFlO0FBREsscUJBQXhCLENBSEEsR0FNQSxTQVBKO0FBUUgsaUJBVE0sTUFTQTtBQUNILDRCQUFRLFdBQVcsT0FBTyxJQUFQLENBQVksUUFBWixDQUFYLEdBQW1DLFNBQTNDO0FBQ0EseUJBQUssR0FBTCxDQUFTLGFBQVQsRUFBd0IsTUFBeEIsRUFGRyxDQUU4QjtBQUNwQztBQUNELHFCQUFLLFdBQUwsQ0FBaUIsZUFBakIsRUFDSyxRQURMLENBRVEsd0RBRlIsRUFJSyxJQUpMLENBSVUsTUFKVixFQUlrQixvQkFKbEI7O0FBTUEsa0JBQUUsMEJBQUYsRUFDSyxRQURMLENBQ2MsV0FEZCxFQUVLLFdBRkwsQ0FFaUIsVUFGakI7QUFHQTs7QUFFSixpQkFBSyxlQUFMO0FBQ0k7QUFDQSxvQkFBSSxRQUFRLGFBQVosRUFBMkI7QUFDdkIsNEJBQVEsV0FBVyxPQUFPLElBQVAsQ0FBWSxZQUFaLENBQVgsR0FBdUMsU0FBL0M7QUFDQSx5QkFBSyxRQUFMLENBQWMsa0JBQWQsRUFBa0MsV0FBbEMsQ0FDSSw2QkFESjs7QUFJQTs7QUFFQSx3QkFBSSxRQUFRLEdBQVIsQ0FBWSxtQkFBWixLQUFvQyxHQUF4QyxFQUE2QztBQUN6Qyw2QkFBSyxVQUFMLENBQWdCLGdCQUFoQjtBQUNIO0FBQ0osaUJBWEQsTUFXTztBQUNILDRCQUNJLDhDQUNBLE9BQU8sSUFBUCxDQUFZLFFBQVosQ0FEQSxHQUVBLFNBSEo7QUFJSDtBQUNELHFCQUFLLFdBQUwsQ0FBaUIsZUFBakIsRUFDSyxRQURMLENBQ2MsbUNBRGQsRUFFSyxJQUZMLENBRVUsTUFGVixFQUVrQixvQkFGbEI7O0FBSUEscUJBQUssV0FBTCxDQUFpQixjQUFqQjtBQUNBOztBQUVKLGlCQUFLLE1BQUw7QUFDSTtBQUNBLHdCQUFRLFdBQVcsT0FBTyxJQUFQLENBQVksWUFBWixDQUFYLEdBQXVDLFNBQS9DO0FBQ0EscUJBQUssV0FBTCxDQUFpQixlQUFqQixFQUNLLFFBREwsQ0FDYyxzQ0FEZCxFQUVLLElBRkwsQ0FFVSxNQUZWLEVBRWtCLG9CQUZsQjtBQUdBOztBQUVKLGlCQUFLLFVBQUw7QUFDSSxvQkFBSSxxQkFDQSxPQUFPLEdBQVAsSUFBYyxPQUFPLFNBQVAsQ0FBaUIsQ0FBakIsTUFBd0IsR0FEMUM7O0FBR0E7O0FBRUE7QUFDQSxvQkFBSSxlQUFlLEtBQW5COztBQUVBLG9CQUFJLFlBQVksT0FBTyxJQUFQLENBQVksV0FBWixDQUFoQjtBQUNBLDZCQUFhLFdBQVcsU0FBWCxHQUF1QixTQUFwQzs7QUFFQSxxQkFBSyxJQUFMLENBQVUsTUFBVixFQUFrQixPQUFPLEdBQVAsQ0FBVyxPQUFPLE1BQVAsQ0FBYyxZQUF6QixDQUFsQixFQUNLLElBREwsQ0FDVSxVQURWLEVBQ3NCLEdBRHRCLEVBRUssSUFGTCxDQUVVLE9BQU8sSUFBUCxDQUFZLFdBQVosQ0FGVixFQUdLLFFBSEwsQ0FHYyxXQUhkOztBQUtBLHdCQUFRLGFBQ0YsVUFERSxHQUVGLFdBQVcsT0FBTyxJQUFQLENBQVksV0FBWixDQUFYLEdBQXNDLFNBRjVDO0FBR0EscUJBQUssUUFBTCxDQUFjLGtCQUFkLEVBQWtDLFdBQWxDLENBQ0ksNkJBREo7QUFHQSxxQkFBSyxXQUFMLENBQWlCLGNBQWpCOztBQUVBLG9CQUFJLEtBQUssSUFBTCxDQUFVLFdBQVYsS0FBMEIsYUFBOUIsRUFBNkM7QUFDekMseUJBQUssVUFBTCxDQUFnQixnQkFBaEI7QUFDSDs7QUFFRCxxQkFBSyxJQUFMLENBQVUsYUFBVixFQUF5QixVQUF6QixFQUNLLFdBREwsQ0FDaUIsZUFEakIsRUFFSyxRQUZMLENBRWMsbUNBRmQ7QUFHQSxvQkFBSSxDQUFDLEtBQUssTUFBTCxHQUFjLFFBQWQsQ0FBdUIsV0FBdkIsQ0FBTCxFQUEwQztBQUN0Qyx5QkFBSyxRQUFMLENBQWMsY0FBZDtBQUNBLHdCQUFJLFVBQVUsTUFBVixHQUFtQixFQUF2QixFQUEyQjtBQUN2Qiw2QkFBSyxRQUFMLENBQWMsbUJBQWQ7QUFDSDtBQUNKLGlCQUxELE1BS087QUFDSCx3QkFBSSxVQUFVLE1BQVYsR0FBbUIsRUFBdkIsRUFBMkI7QUFDdkIsNkJBQUssUUFBTCxDQUFjLGtDQUFkO0FBQ0g7O0FBRUQsd0JBQUksVUFBVSxNQUFWLEdBQW1CLEVBQXZCLEVBQTJCO0FBQ3ZCLDZCQUFLLFFBQUwsQ0FBYyw0QkFBZDtBQUNIO0FBQ0o7O0FBRUQsdUJBQU8sSUFBUCxDQUFZLE9BQU8sSUFBUCxDQUFZLHNCQUFaLENBQVo7QUFDQSx1QkFDSyxPQURMLENBQ2EsbUJBRGIsRUFFSyxRQUZMLENBRWMsc0NBRmQsRUFHSyxXQUhMLENBR2lCLG1CQUhqQjs7QUFLQTs7QUFFSixpQkFBSyxNQUFMO0FBQ0k7QUFDQSx3QkFBUSxXQUFXLE9BQU8sSUFBUCxDQUFZLFdBQVosQ0FBWCxHQUFzQyxTQUE5Qzs7QUFFQSxxQkFBSyxJQUFMLENBQ0ksTUFESixFQUVJLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLFlBQXpCLENBRkosRUFHRSxVQUhGLENBR2EsU0FIYjtBQUlBLHFCQUFLLFdBQUwsQ0FBaUIsZUFBakIsRUFBa0MsUUFBbEMsQ0FBMkMsZ0JBQTNDO0FBQ0Esb0JBQUksQ0FBQyxLQUFLLE1BQUwsR0FBYyxRQUFkLENBQXVCLFdBQXZCLENBQUwsRUFBMEM7QUFDdEMseUJBQUssUUFBTCxDQUFjLGNBQWQ7QUFDQTtBQUNBLHdCQUFJLE1BQU0sTUFBTixHQUFlLEVBQW5CLEVBQXVCO0FBQ25CLDZCQUFLLFFBQUwsQ0FBYyxrQkFBZDtBQUNIOztBQUVELHdCQUFJLE1BQU0sTUFBTixHQUFlLEVBQW5CLEVBQXVCO0FBQ25CLDZCQUFLLFFBQUwsQ0FBYyxtQkFBZDtBQUNIO0FBQ0osaUJBVkQsTUFVTztBQUNIO0FBQ0Esd0JBQUksTUFBTSxNQUFOLEdBQWUsRUFBbkIsRUFBdUI7QUFDbkIsNkJBQUssUUFBTCxDQUFjLDJCQUFkO0FBQ0g7O0FBRUQsd0JBQUksTUFBTSxNQUFOLEdBQWUsRUFBbkIsRUFBdUI7QUFDbkIsNkJBQUssUUFBTCxDQUFjLGtDQUFkO0FBQ0g7O0FBRUQsd0JBQUksTUFBTSxNQUFOLEdBQWUsRUFBbkIsRUFBdUI7QUFDbkIsNkJBQUssUUFBTCxDQUFjLDRCQUFkO0FBQ0g7QUFDSjtBQUNELHFCQUFLLElBQUwsQ0FBVSxhQUFWLEVBQXlCLE1BQXpCLEVBQWlDLFFBQWpDLENBQTBDLG1CQUExQztBQUNBLHVCQUFPLElBQVAsQ0FBWSxPQUFPLElBQVAsQ0FBWSxRQUFaLENBQVo7QUFDQSx1QkFDSyxPQURMLENBQ2EsbUJBRGIsRUFFSyxXQUZMLENBRWlCLHNDQUZqQixFQUdLLFFBSEwsQ0FHYyxtQkFIZCxFQUlLLFFBSkwsQ0FJYyxXQUpkO0FBS0E7QUFDQSxvQkFBSSxPQUFPLElBQVAsR0FBYyxNQUFkLEdBQXVCLEVBQTNCLEVBQStCO0FBQzNCLHlCQUFLLE1BQUwsR0FDSyxRQURMLENBQ2Msb0JBRGQsRUFFSyxRQUZMLENBRWMsZUFGZDtBQUdIO0FBQ0Q7O0FBRUosaUJBQUssY0FBTDtBQUNJLHdCQUNJLDZCQUNBLE9BQU8sSUFBUCxDQUFZLGVBQVosQ0FEQSxHQUVBLFNBSEo7QUFJQSxxQkFBSyxRQUFMLENBQWMsc0JBQWQsRUFDSyxXQURMLENBQ2lCLFFBRGpCLEVBRUssSUFGTCxDQUVVLGFBRlYsRUFFeUIsY0FGekI7QUFHQSxxQkFBSyxPQUFMLENBQWEscUJBQWIsRUFDSyxRQURMLENBQ2MsUUFEZCxFQUVLLFdBRkwsQ0FFaUIsV0FGakI7QUFHQSxxQkFBSyxXQUFMLENBQWlCLGNBQWpCO0FBQ0E7O0FBRUosaUJBQUssaUJBQUw7QUFDSSx3QkFDSSw2QkFDQSxPQUFPLElBQVAsQ0FBWSxvQkFBWixDQURBLEdBRUEsU0FISjtBQUlBLHFCQUFLLFFBQUwsQ0FBYyx5QkFBZCxFQUNLLFdBREwsQ0FDaUIsS0FEakIsRUFFSyxJQUZMLENBRVUsYUFGVixFQUV5QixpQkFGekI7QUFHQSxxQkFBSyxPQUFMLENBQWEscUJBQWIsRUFDSyxRQURMLENBQ2MsV0FEZCxFQUVLLFdBRkwsQ0FFaUIsUUFGakI7QUFHQSxxQkFBSyxXQUFMLENBQWlCLGNBQWpCOztBQUVBLHFCQUFLLElBQUwsQ0FBVSxhQUFWLEVBQXlCLGlCQUF6QjtBQUNBOztBQUVKLGlCQUFLLFNBQUw7QUFDSSx3QkFDSSw2QkFDQSxPQUFPLElBQVAsQ0FBWSxvQkFBWixDQURBLEdBRUEsU0FISjtBQUlBLHFCQUFLLFFBQUwsQ0FBYyx5QkFBZCxFQUNLLFdBREwsQ0FDaUIsS0FEakIsRUFFSyxJQUZMLENBRVUsYUFGVixFQUV5QixpQkFGekI7QUFHQSxxQkFBSyxXQUFMLENBQWlCLGNBQWpCO0FBQ0E7O0FBRUosaUJBQUssSUFBTDtBQUNBLGlCQUFLLEtBQUw7QUFDSSxxQkFBSyxRQUFMLENBQWMsS0FBZCxFQUFxQixNQUFyQjtBQUNBLHdCQUFRLEtBQUssSUFBTCxFQUFSO0FBQ0EseUJBQVMsU0FBVDtBQUNBOztBQUVKO0FBQ0kscUJBQUssUUFBTCxDQUFjLEtBQWQsRUFBcUIsTUFBckI7QUFDQSx3QkFBUSxLQUFLLElBQUwsRUFBUjtBQUNBLHlCQUFTLFNBQVQ7QUFDQTtBQXBPUjs7QUF1T0EsYUFBSyxJQUFMLENBQVUsV0FBVixFQUF1QixPQUF2QixFQUNLLFdBREwsQ0FDaUIsVUFEakIsRUFFSyxVQUZMLENBRWdCLFVBRmhCO0FBR0EsYUFBSyxJQUFMLENBQVUsZ0NBQVYsRUFBNEMsV0FBNUMsQ0FBd0QsVUFBeEQ7O0FBRUEsWUFBSSxVQUFVLFNBQWQsRUFBeUI7QUFDckIsaUJBQUssSUFBTCxDQUFVLGFBQVYsRUFBeUIsTUFBekI7QUFDSDs7QUFFRCxZQUFJLFVBQVUsUUFBVixJQUFzQixLQUFLLElBQUwsQ0FBVSxXQUFWLEtBQTBCLGFBQXBELEVBQW1FO0FBQy9ELGlCQUFLLFFBQUwsQ0FBYyxRQUFkLEVBQ0ssV0FETCxDQUNpQixpQkFEakIsRUFFSyxHQUZMLENBRVMsVUFGVCxFQUVxQixVQUZyQjtBQUdBLGlCQUFLLElBQUwsQ0FBVSxnQ0FBVixFQUE0QyxJQUE1QztBQUNIOztBQUVELGFBQUssSUFBTCxDQUFVLEtBQVYsRUFBaUIsUUFBakIsQ0FBMEIsV0FBMUI7O0FBRUEscUNBQ0ksT0FBTyxRQUFQLENBQWdCLFFBQWhCLElBQ0ssT0FBTyxRQUFQLENBQWdCLE1BQWhCLEdBQXlCLE9BQU8sUUFBUCxDQUFnQixNQUF6QyxHQUFrRCxFQUR2RCxDQURKO0FBSUgsS0F0VVk7O0FBd1ViLG9CQUFnQix3QkFBVSxPQUFWLEVBQW1CLElBQW5CLEVBQXlCO0FBQ3JDLFlBQUksYUFBYSxFQUFFLHNDQUFzQyxPQUF0QyxHQUFnRCxJQUFsRCxFQUNaLElBRFksQ0FDUCxHQURPLEVBRVosUUFGWSxDQUVILEtBRkcsQ0FBakI7QUFHQSxZQUFJLFdBQVcsTUFBZixFQUF1QjtBQUNuQixnQkFBSSxLQUFLLElBQUksTUFBSixDQUNMLE1BQ0ksT0FBTyxJQUFQLENBQVksc0JBQVosQ0FESixHQUVJLEtBRkosR0FHSSxPQUFPLElBQVAsQ0FBWSxNQUFaLENBSEosR0FJSSxLQUpKLEdBS0ksT0FBTyxJQUFQLENBQVksUUFBWixDQUxKLEdBTUksS0FOSixHQU9JLE9BQU8sSUFBUCxDQUFZLHVCQUFaLENBUEosR0FRSSxLQVJKLEdBU0ksT0FBTyxJQUFQLENBQVksc0JBQVosQ0FUSixHQVVJLEtBVkosR0FXSSxPQUFPLElBQVAsQ0FBWSx3QkFBWixDQVhKLEdBWUksR0FiQyxFQWNMLElBZEssQ0FBVDtBQWdCQSx1QkFBVyxJQUFYLENBQWdCLEtBQWhCLEVBQXVCLFdBQVcsSUFBWCxDQUFnQixLQUFoQixFQUF1QixPQUF2QixDQUErQixFQUEvQixFQUFtQyxJQUFuQyxDQUF2QjtBQUNIO0FBQ0o7QUEvVlksQ0FBakI7O0FBa1dBOzs7QUFHQSxPQUFPLGlCQUFQLEdBQTJCLFlBQVk7QUFDbkMsV0FBTyxZQUFQLENBQW9CLE9BQXBCLENBQTRCLG1CQUE1QjtBQUNILENBRkQ7O0FBSUE7OztBQUdBLEVBQUUsWUFBWTtBQUNWLFFBQUksV0FDQSwrR0FESjtBQUVBLE1BQUUsUUFBRixFQUFZLEVBQVosQ0FBZSxPQUFmLEVBQXdCLFFBQXhCLEVBQWtDLFVBQVUsQ0FBVixFQUFhO0FBQzNDLFlBQUksT0FDQSxFQUFFLEVBQUUsTUFBSixFQUFZLEVBQVosQ0FBZSx3QkFBZixLQUNBLEVBQUUsRUFBRSxNQUFKLEVBQVksRUFBWixDQUFlLCtCQUFmLENBREEsR0FFTSxFQUFFLEVBQUUsTUFBSixDQUZOLEdBR00sRUFBRSxFQUFFLE1BQUosRUFBWSxPQUFaLENBQW9CLHdCQUFwQixFQUE4QyxNQUE5QyxHQUNBLEVBQUUsRUFBRSxNQUFKLEVBQVksT0FBWixDQUFvQix3QkFBcEIsQ0FEQSxHQUVBLEVBQUUsRUFBRSxNQUFKLEVBQVksT0FBWixDQUFvQiwrQkFBcEIsQ0FOVjtBQU9BLFlBQUksVUFBVSxLQUFLLElBQUwsQ0FBVSxlQUFWLENBQWQ7O0FBRUEsWUFBSSxLQUFLLElBQUwsQ0FBVSxXQUFWLEtBQTBCLGFBQTlCLEVBQTZDO0FBQ3pDLGdCQUFJLHFCQUFxQixFQUFFLDJCQUEyQixPQUE3QixFQUNwQixNQURvQixHQUVuQixFQUFFLDJCQUEyQixPQUE3QixDQUZtQixHQUduQixFQUFFLHFCQUFxQixPQUF2QixDQUhOO0FBSUEsbUJBQU8sSUFBUCxDQUFZLE1BQVosQ0FBbUIsT0FBbkIsRUFBNEIsbUJBQW1CLEdBQW5CLEVBQTVCLEVBQXNELElBQXREOztBQUVBO0FBQ0EsaUJBQUssR0FBTCxDQUFTLE9BQVQ7QUFDSCxTQVRELE1BU08sSUFDSCxLQUFLLElBQUwsQ0FBVSxXQUFWLEtBQTBCLGFBQTFCLElBQ0EsUUFBUSxHQUFSLENBQVksbUJBQVosS0FBb0MsR0FGakMsRUFHTDtBQUNFLGNBQUUsdUJBQUYsRUFBMkIsSUFBM0IsQ0FBZ0MsZUFBaEMsRUFBaUQsT0FBakQ7QUFDSCxTQUxNLE1BS0E7QUFDSDtBQUNBLGlCQUFLLElBQUwsQ0FBVSxhQUFWLEVBQXlCLE1BQXpCLEVBQWlDLEtBQWpDO0FBQ0g7QUFDSixLQTVCRDs7QUE4QkE7QUFDQSxNQUFFLFFBQUYsRUFBWSxFQUFaLENBQWUsMkJBQWYsRUFBNEMsVUFBVSxDQUFWLEVBQWEsSUFBYixFQUFtQixJQUFuQixFQUF5QjtBQUNqRSxZQUFJLFVBQVUsS0FBSyxJQUFMLENBQVUsZUFBVixDQUFkO0FBQ0EsWUFBSSxlQUFlLEVBQ2Ysa0RBQ0ksT0FESixHQUVJLDBDQUZKLEdBR0ksT0FISixHQUlJLElBTFcsQ0FBbkI7O0FBUUE7QUFDQSxVQUFFLG9DQUFvQyxPQUFwQyxHQUE4QyxJQUFoRCxFQUFzRCxHQUF0RCxDQUNJLFlBREosRUFFSSxRQUZKO0FBSUgsS0FmRDs7QUFpQkE7QUFDQSxNQUFFLFFBQUYsRUFDSyxFQURMLENBQ1EsZUFEUixFQUN5QixVQUFVLENBQVYsRUFBYSxJQUFiLEVBQW1CLElBQW5CLEVBQXlCO0FBQzFDLFlBQUksVUFBVSxLQUFLLElBQUwsQ0FBVSxlQUFWLENBQWQ7QUFDQSxZQUFJLGVBQWUsRUFDZixrREFBa0QsT0FBbEQsR0FBNEQsSUFEN0MsQ0FBbkI7O0FBSUE7QUFDQSxZQUFJLE9BQU8sT0FBTyxJQUFQLENBQVksc0JBQVosRUFBb0MsV0FBcEMsRUFBWDtBQUNBLFVBQUUsc0NBQXNDLE9BQXRDLEdBQWdELE1BQWxELEVBQ0ssSUFETCxDQUVRLE9BQ0ksd0VBSFosRUFLSyxJQUxMLENBS1UsTUFMVixFQUtrQixPQUFPLEdBQVAsQ0FBVyxPQUFPLE1BQVAsQ0FBYyxZQUF6QixDQUxsQjs7QUFPQTtBQUNBLGVBQU8sT0FBUCxDQUFlLGlCQUFmLENBQWlDLFlBQWpDLEVBQStDLFVBQS9DOztBQUVBO0FBQ0EsWUFDSSxhQUFhLElBQWIsQ0FBa0IsV0FBbEIsTUFBbUMsYUFBbkMsSUFDQSxDQUFDLEtBQUssY0FGVixFQUdFO0FBQ0UsbUJBQU8sSUFBUCxDQUFZLGtCQUFaLENBQ0ksSUFESixFQUVJLEtBQUssSUFBTCxDQUFVLGdCQUFWLENBRko7QUFJSDs7QUFFRDtBQUNBLFVBQUUsUUFBRixFQUFZLFVBQVosQ0FBdUIsUUFBdkIsRUFBaUMsT0FBakM7QUFDSCxLQWhDTCxFQWlDSyxFQWpDTCxDQWlDUSxlQWpDUixFQWlDeUIsVUFBVSxDQUFWLEVBQWE7QUFDOUI7QUFDQSxZQUFJLEVBQUUsRUFBRSxNQUFKLEVBQVksT0FBWixDQUFvQixPQUFwQixLQUFnQyxNQUFwQyxFQUE0QyxDQUMzQztBQUNKLEtBckNMLEVBc0NLLEVBdENMLENBc0NRLGVBdENSLEVBc0N5QixVQUFVLENBQVYsRUFBYSxJQUFiLEVBQW1CLFFBQW5CLEVBQTZCO0FBQzlDLG1CQUFXLEtBQUssS0FBTCxDQUFXLFNBQVMsS0FBVCxDQUFlLFlBQTFCLENBQVg7QUFDQSxZQUFJLFNBQVMsSUFBYjtBQUNBLFlBQUksVUFBVSxPQUFPLElBQVAsQ0FBWSxlQUFaLENBQWQ7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQSxZQUFJLFNBQVMsU0FBVCxLQUF1QixnQ0FBM0IsRUFBNkQ7QUFDekQsZ0JBQUksT0FBTyxTQUFQLENBQWlCLFFBQWpCLEtBQThCLFNBQWxDLEVBQTZDO0FBQ3pDLHVCQUFPLGlCQUFQO0FBQ0gsYUFGRCxNQUVPO0FBQ0g7QUFDQSxrQkFBRSxzQkFBRixFQUEwQixVQUExQixDQUFxQyxRQUFyQyxFQUErQyxNQUEvQztBQUNBLGtCQUFFLG9DQUFvQyxPQUFwQyxHQUE4QyxJQUFoRCxFQUFzRCxJQUF0RCxDQUNJLEVBQ0ksb0NBQW9DLE9BQXBDLEdBQThDLElBRGxELEVBRUUsSUFGRixDQUVPLG9CQUZQLENBREo7QUFLSDtBQUNKLFNBWkQsTUFZTyxJQUFJLFNBQVMsY0FBYixFQUE2QjtBQUNoQyxnQkFBSSxhQUFhLE9BQU8sUUFBUCxDQUFnQixRQUFqQztBQUNBLGdCQUFJLE9BQU8sUUFBUCxDQUFnQixNQUFwQixFQUE0QjtBQUN4Qiw4QkFBYyxPQUFPLFFBQVAsQ0FBZ0IsTUFBaEIsR0FBeUIsVUFBekIsR0FBc0MsT0FBcEQ7QUFDSCxhQUZELE1BRU87QUFDSCw4QkFBYyxhQUFhLE9BQTNCO0FBQ0g7QUFDRCxjQUFFLG9CQUFGLEVBQXdCLElBQXhCLENBQ0ksTUFESixFQUVJLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLGFBQXpCLEVBQXdDO0FBQ3BDLHlCQUFTO0FBRDJCLGFBQXhDLENBRko7QUFNQSxjQUFFLHFCQUFGLEVBQXlCLFVBQXpCLENBQW9DLFFBQXBDLEVBQThDLE1BQTlDO0FBQ0EsY0FBRSxvQ0FBb0MsT0FBcEMsR0FBOEMsSUFBaEQsRUFBc0QsSUFBdEQsQ0FDSSxFQUFFLG9DQUFvQyxPQUFwQyxHQUE4QyxJQUFoRCxFQUFzRCxJQUF0RCxDQUNJLG9CQURKLENBREo7QUFLSCxTQW5CTSxNQW1CQSxJQUFJLFNBQVMsU0FBVCxLQUF1Qix3QkFBM0IsRUFBcUQ7QUFDeEQsZ0JBQUksT0FBTyxFQUFYO0FBQ0EsZ0JBQUksV0FBVyxFQUFmO0FBQ0EsZ0JBQ0ksU0FBUyxTQUFULEtBQXVCLDZCQUF2QixJQUNBLFNBQVMsU0FBVCxLQUF1QixtQkFGM0IsRUFHRTtBQUNFLHVCQUFPLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLFlBQXpCLENBQVA7QUFDQSwyQkFBVyxPQUFPLElBQVAsQ0FBWSxPQUFaLENBQVg7QUFDSCxhQU5ELE1BTU8sSUFDSCxTQUFTLFNBQVQsS0FBdUIsNkJBQXZCLElBQ0EsU0FBUyxTQUFULEtBQXVCLCtCQUZwQixFQUdMO0FBQ0UsdUJBQU8sT0FBTyxHQUFQLENBQVcsT0FBTyxNQUFQLENBQWMsY0FBekIsQ0FBUDtBQUNBLDJCQUFXLE9BQU8sSUFBUCxDQUFZLHNCQUFaLENBQVg7QUFDSDtBQUNELGdCQUFJLE9BQ0EsMkJBQ0EsSUFEQSxHQUVBLGlCQUZBLEdBR0EsUUFIQSxHQUlBLE1BTEo7QUFNQSxnQkFBSSxPQUFPLE9BQVgsRUFDSSxPQUFPLE9BQVAsQ0FBZSxJQUFmLENBQ0ksYUFDSSxPQUFPLElBQVAsQ0FBWSxjQUFaLENBREosR0FFSSxZQUZKLEdBR0ksT0FBTyxJQUFQLENBQVksV0FBVyxTQUFTLFNBQWhDLEVBQTJDO0FBQ3ZDLHNCQUFNO0FBRGlDLGFBQTNDLENBSlIsRUFPSSxPQVBKO0FBU0osY0FBRSxvQ0FBb0MsT0FBcEMsR0FBOEMsSUFBaEQsRUFBc0QsSUFBdEQsQ0FDSSxFQUFFLG9DQUFvQyxPQUFwQyxHQUE4QyxJQUFoRCxFQUFzRCxJQUF0RCxDQUNJLG9CQURKLENBREo7QUFLSCxTQXJDTSxNQXFDQSxJQUFJLEtBQUssT0FBTCxDQUFhLE9BQWIsS0FBeUIsTUFBN0IsRUFBcUM7QUFDeEMsZ0JBQUksWUFBWTtBQUNaLG9CQUFJLE9BRFE7QUFFWix1QkFBTyxPQUFPLElBQVAsQ0FBWSxZQUFaLENBRks7QUFHWix1QkFBTyxPQUFPLElBQVAsQ0FBWSxTQUFaLENBSEs7QUFJWix3QkFBUSxPQUFPLElBQVAsQ0FBWSxXQUFaLENBSkk7QUFLWiw0QkFBWSxPQUFPLElBQVAsQ0FBWSxrQkFBWjtBQUxBLGFBQWhCOztBQVFBLGtDQUFzQixTQUF0QjtBQUNIO0FBQ0osS0E5SEw7O0FBZ0lBO0FBQ0E7QUFDQSxNQUFFLFFBQUYsRUFBWSxFQUFaLENBQ0ksV0FESixFQUVJLGtEQUZKLEVBR0ksVUFBVSxDQUFWLEVBQWE7QUFDVCxZQUFJLE9BQU8sRUFBRSxFQUFFLE1BQUosRUFBWSxFQUFaLENBQWUsc0JBQWYsSUFDTCxFQUFFLEVBQUUsTUFBSixDQURLLEdBRUwsRUFBRSxFQUFFLE1BQUosRUFBWSxPQUFaLENBQW9CLHNCQUFwQixDQUZOO0FBR0EsWUFBSSxLQUNBLEtBQUssSUFBTCxDQUFVLElBQVYsS0FBbUIscUJBQW5CLElBQ0EsUUFBUSxHQUFSLENBQVksbUJBQVosS0FBb0MsR0FGeEM7O0FBSUEsWUFBSSxFQUFKLEVBQVE7QUFDSixtQkFBTyxFQUNILDBDQUNJLEtBQUssSUFBTCxDQUFVLGVBQVYsQ0FESixHQUVJLElBSEQsQ0FBUCxDQURJLENBS0Q7QUFDSCxtQkFBTyxJQUFQLENBQVksTUFBWixDQUFtQixLQUFLLElBQUwsQ0FBVSxlQUFWLENBQW5CLEVBQStDLElBQS9DLEVBQXFELElBQXJEO0FBQ0gsU0FQRCxNQU9PO0FBQ0gsY0FBRSx1QkFBRixFQUEyQixJQUEzQixDQUNJLGVBREosRUFFSSxLQUFLLElBQUwsQ0FBVSxlQUFWLENBRko7QUFJSDtBQUNKLEtBeEJMOztBQTJCQTtBQUNBLE1BQUUsMENBQUYsRUFBOEMsRUFBOUMsQ0FBaUQsT0FBakQsRUFBMEQsWUFBWTtBQUNsRSxVQUFFLHNCQUFGLEVBQTBCLElBQTFCLENBQStCO0FBQzNCLDZCQUFpQixFQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsZUFBYixDQURVO0FBRTNCLHlCQUFhLEVBQUUsSUFBRixFQUFRLElBQVIsQ0FBYSxXQUFiO0FBRmMsU0FBL0I7QUFJSCxLQUxEO0FBTUgsQ0F4TkQ7O0FBME5BLE9BQU8sbUJBQVAsR0FBNkIsVUFBVSxPQUFWLEVBQW1CO0FBQzVDLFFBQUksT0FBTyxFQUFFLG9DQUFvQyxPQUFwQyxHQUE4QyxVQUFoRCxDQUFYO0FBQ0EsU0FBSyxJQUFMLENBQVUsb0JBQVYsRUFBZ0MsS0FBSyxJQUFMLEVBQWhDO0FBQ0EsU0FBSyxJQUFMLENBQVUsdUJBQVY7QUFDQSxTQUFLLE1BQUwsQ0FBWSxPQUFaLEVBQXFCLElBQXJCLEVBQTJCLElBQTNCO0FBQ0gsQ0FMRDs7QUFPQTs7O0FBR0EsRUFBRSxZQUFZO0FBQ1YsUUFBSSxXQUFXLGtEQUFmO0FBQ0EsTUFBRSxRQUFGLEVBQ0ssRUFETCxDQUNRLE9BRFIsRUFDaUIsUUFEakIsRUFDMkIsVUFBVSxDQUFWLEVBQWE7QUFDaEMsWUFBSSxTQUFTLEVBQUUsRUFBRSxNQUFKLEVBQVksT0FBWixDQUFvQixRQUFwQixDQUFiO0FBQ0EsWUFBSSxVQUFVLE9BQU8sSUFBUCxDQUFZLGVBQVosQ0FBZDs7QUFFQTtBQUNBLGVBQU8sVUFBUCxDQUFrQixNQUFsQixFQUEwQixPQUExQjs7QUFFQSxVQUFFLHdCQUFGLEVBQTRCLFVBQTVCLENBQXVDLGlCQUF2Qzs7QUFFQTtBQUNBLFVBQUUsRUFBRSxFQUFFLE1BQUosQ0FBRixFQUFlLEdBQWYsQ0FBbUIsT0FBbkI7QUFDSCxLQVpMLEVBYUssRUFiTCxDQWFRLGFBYlIsRUFhdUIsVUFBVSxDQUFWLEVBQWEsSUFBYixFQUFtQixJQUFuQixFQUF5QjtBQUN4QyxZQUFJLFVBQVUsS0FBSyxJQUFMLENBQVUsZUFBVixDQUFkO0FBQ0EsWUFBSSxXQUFXLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLFlBQXpCLENBQWY7O0FBRUE7QUFDQSxlQUFPLElBQVAsQ0FBWSxPQUFaLENBQW9CLE9BQXBCLEVBQTZCLElBQTdCLENBQWtDLFVBQVUsS0FBVixFQUFpQjtBQUMvQyxtQkFBTywwQkFBUCxDQUFrQyxLQUFsQztBQUNILFNBRkQ7O0FBSUEsWUFBSSxRQUFRLEVBQUUsNEJBQUYsRUFBZ0MsR0FBaEMsRUFBWjs7QUFFQTtBQUNBLFlBQUksUUFBUSxJQUFJLE9BQU8sS0FBWCxDQUFpQixPQUFPLFNBQVAsQ0FBaUIsVUFBakIsQ0FBNEIsT0FBNUIsQ0FBakIsQ0FBWjtBQUNBLGVBQU8sWUFBUCxDQUFvQixPQUFwQixDQUE0QixvQkFBNUIsRUFBa0Q7QUFDOUMsd0JBQVk7QUFEa0MsU0FBbEQ7O0FBSUEsVUFBRSxvQ0FBb0MsT0FBcEMsR0FBOEMsSUFBaEQsRUFBc0QsR0FBdEQsQ0FDSSxZQURKLEVBRUksUUFGSjs7QUFLQSxZQUFJLE9BQ0EsY0FBYyxRQUFkLEdBQXlCLElBQXpCLEdBQWdDLE9BQU8sSUFBUCxDQUFZLE9BQVosQ0FBaEMsR0FBdUQsTUFEM0Q7QUFFQSxVQUFFLDJCQUFGLEVBQStCLElBQS9CLENBQ0ksT0FBTyxJQUFQLENBQVksdUJBQVosRUFBcUMsRUFBRSxNQUFNLElBQVIsRUFBckMsQ0FESjs7QUFJQSxZQUNJLEVBQUUsSUFBRixFQUFRLE9BQVIsQ0FBZ0IsbUNBQWhCLEVBQXFELE1BQXJELEdBQThELENBRGxFLEVBRUU7QUFDRSxjQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsYUFBYixFQUE0QixNQUE1QjtBQUNIO0FBQ0QsZUFBTyxPQUFQLENBQWUsaUJBQWYsQ0FDSSxFQUNJLDBDQUNJLE9BREosR0FFSSw2Q0FGSixHQUdJLE9BSEosR0FJSSxvREFKSixHQUtJLE9BTEosR0FNSSwyQ0FOSixHQU9JLE9BUEosR0FRSSxJQVRSLENBREosRUFZSSxNQVpKOztBQWVBO0FBQ0EsVUFBRSxzQ0FBc0MsT0FBdEMsR0FBZ0QsTUFBbEQsRUFDSyxJQURMLENBRVEsT0FBTyxJQUFQLENBQVksUUFBWixJQUNJLHdFQUhaLEVBS0ssSUFMTCxDQUtVLE1BTFYsRUFLa0IsUUFMbEIsRUFNSyxRQU5MLENBTWMsV0FOZDtBQU9BLGVBQU8sT0FBUCxDQUFlLGNBQWYsQ0FBOEIsT0FBOUIsRUFBdUMsT0FBTyxJQUFQLENBQVksUUFBWixDQUF2Qzs7QUFFQTtBQUNBLFVBQUUsNkNBQTZDLE9BQTdDLEdBQXVELElBQXpELEVBQ0ssUUFETCxDQUNjLHFCQURkLEVBRUssV0FGTCxDQUVpQix5QkFGakI7O0FBSUE7QUFDQSxVQUFFLG1DQUFtQyxPQUFuQyxHQUE2QyxJQUEvQyxFQUFxRCxRQUFyRCxDQUNJLFNBREo7QUFHSCxLQWhGTCxFQWlGSyxFQWpGTCxDQWlGUSxhQWpGUixFQWlGdUIsVUFBVSxDQUFWLEVBQWEsSUFBYixFQUFtQixRQUFuQixFQUE2QjtBQUM1QyxlQUFPLE9BQVAsQ0FBZSxpQkFBZixDQUFpQyxJQUFqQyxFQUF1QyxNQUF2Qzs7QUFFQSxtQkFBVyxLQUFLLEtBQUwsQ0FBVyxTQUFTLFlBQXBCLENBQVg7QUFDQSxZQUFJLE9BQU8sRUFBWDtBQUNBLFlBQUksVUFBVSxLQUFLLElBQUwsQ0FBVSxlQUFWLENBQWQ7O0FBRUEsaUJBQVMsVUFBVCxDQUFvQixRQUFwQixFQUE4QjtBQUMxQixtQkFBTyxPQUFQLENBQWUsSUFBZixDQUNJLGFBQ0ksT0FBTyxJQUFQLENBQVksY0FBWixDQURKLEdBRUksWUFGSixHQUdJLE9BQU8sSUFBUCxDQUFZLFdBQVcsU0FBUyxTQUFoQyxFQUEyQztBQUN2QyxzQkFBTTtBQURpQyxhQUEzQyxDQUpSLEVBT0ksT0FQSjtBQVNIOztBQUVELFlBQUksU0FBUyxjQUFiLEVBQTZCO0FBQ3pCLG1CQUFPLFlBQVAsQ0FBb0IsT0FBcEIsQ0FBNEIsc0JBQTVCLEVBQW9EO0FBQ2hELHdCQUFRLFVBQVU7QUFEOEIsYUFBcEQ7QUFHSCxTQUpELE1BSU8sSUFDSCxTQUFTLFNBQVQsS0FBdUIsZ0NBRHBCLEVBRUw7QUFDRSxjQUFFLHFCQUFGLEVBQXlCLFVBQXpCLENBQW9DLFFBQXBDLEVBQThDLE9BQTlDO0FBQ0EsbUJBQU8saUJBQVA7QUFDSCxTQUxNLE1BS0EsSUFDSCxTQUFTLFNBQVQsS0FBdUIsbUJBQXZCLElBQ0EsU0FBUyxTQUFULEtBQXVCLHlCQUZwQixFQUdMO0FBQ0UsY0FBRSxxQkFBRixFQUF5QixVQUF6QixDQUFvQyxRQUFwQyxFQUE4QyxPQUE5QztBQUNBLG1CQUNJLDJCQUNBLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLFlBQXpCLENBREEsR0FFQSxpQkFGQSxHQUdBLE9BQU8sSUFBUCxDQUFZLE9BQVosQ0FIQSxHQUlBLE1BTEo7QUFNQSxnQkFBSSxPQUFPLE9BQVgsRUFBb0IsV0FBVyxJQUFYO0FBQ3ZCLFNBWk0sTUFZQSxJQUNILFNBQVMsU0FBVCxLQUF1QiwrQkFBdkIsSUFDQSxTQUFTLFNBQVQsS0FBdUIsd0JBRnBCLEVBR0w7QUFDRSxjQUFFLHFCQUFGLEVBQXlCLFVBQXpCLENBQW9DLFFBQXBDLEVBQThDLE9BQTlDO0FBQ0EsbUJBQ0ksMkJBQ0EsT0FBTyxHQUFQLENBQVcsT0FBTyxNQUFQLENBQWMsY0FBekIsQ0FEQSxHQUVBLGlCQUZBLEdBR0EsT0FBTyxJQUFQLENBQVksc0JBQVosQ0FIQSxHQUlBLE1BTEo7QUFNQSxnQkFBSSxPQUFPLE9BQVgsRUFBb0IsV0FBVyxJQUFYO0FBQ3ZCLFNBWk0sTUFZQTtBQUNILGNBQUUscUJBQUYsRUFBeUIsVUFBekIsQ0FBb0MsUUFBcEMsRUFBOEMsT0FBOUM7QUFDQSxnQkFBSSxPQUFPLE9BQVgsRUFBb0IsV0FBVyxFQUFYO0FBQ3ZCOztBQUVELFVBQ0ksb0NBQ0ksS0FBSyxJQUFMLENBQVUsZUFBVixDQURKLEdBRUksSUFIUixFQUlFLElBSkYsQ0FJTyxLQUFLLElBQUwsQ0FBVSxvQkFBVixDQUpQO0FBS0gsS0EvSUw7O0FBaUpBOzs7QUFHQSxNQUFFLHdCQUFGLEVBQTRCLEVBQTVCLENBQStCLG1CQUEvQixFQUFvRCxVQUFVLENBQVYsRUFBYTtBQUM3RCxZQUFJLE9BQU8sRUFDUCx5Q0FDSSxFQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsZUFBYixDQURKLEdBRUksSUFIRyxFQUlULEtBSlMsRUFBWDs7QUFNQTtBQUNBLFlBQUksRUFBRSx3QkFBRixFQUE0QixJQUE1QixDQUFpQyxpQkFBakMsQ0FBSixFQUF5RDtBQUNyRCxtQkFBTyxpQkFBUCxDQUNJLEVBQUUsd0JBQUYsRUFBNEIsSUFBNUIsQ0FBaUMsZUFBakMsQ0FESixFQUVJLEVBQUUsMENBQUYsRUFBOEMsSUFBOUMsRUFGSjtBQUlILFNBTEQsTUFLTyxJQUFJLEVBQUUsd0JBQUYsRUFBNEIsSUFBNUIsQ0FBaUMsZ0JBQWpDLENBQUosRUFBd0Q7QUFDM0QsbUJBQU8sSUFBUCxDQUFZLFNBQVosQ0FDSSxFQUFFLHdCQUFGLEVBQTRCLElBQTVCLENBQWlDLGVBQWpDLENBREosRUFFSSxFQUFFLDRCQUFGLEVBQWdDLEdBQWhDLEVBRkosRUFHSSxFQUFFLE1BQUYsQ0FISjtBQUtILFNBTk0sTUFNQTtBQUNILG1CQUFPLEtBQVAsQ0FBYSxVQUFiLENBQXdCLElBQXhCO0FBQ0g7QUFDSixLQXRCRDtBQXVCSCxDQTdLRDs7QUErS0EsT0FBTyxVQUFQLEdBQW9CLFVBQVUsTUFBVixFQUFrQixPQUFsQixFQUEyQjtBQUMzQyxhQUFTLGVBQVQsR0FBMkI7QUFDdkIsVUFBRSx5Q0FBRixFQUE2QyxJQUE3QyxDQUNJLEVBQUUsbUJBQUYsRUFBdUIsSUFBdkIsQ0FBNEIsWUFBNUIsQ0FESjtBQUdBLFlBQUksT0FBTyxJQUFQLENBQVksY0FBWixDQUFKLEVBQWlDO0FBQzdCLGNBQUUseUJBQUYsRUFBNkIsSUFBN0IsQ0FDSSxLQURKLEVBRUksT0FBTyxJQUFQLENBQVksY0FBWixDQUZKO0FBSUgsU0FMRCxNQUtPO0FBQ0gsZ0JBQUksTUFBTSxFQUFFLDhCQUE4QixPQUE5QixHQUF3QyxRQUExQyxFQUFvRCxJQUFwRCxDQUNOLEtBRE0sQ0FBVjtBQUdBLGdCQUFJLE9BQU8sR0FBUCxJQUFjLFdBQWxCLEVBQStCO0FBQzNCLHNCQUFNLEVBQUUsZ0RBQUYsRUFBb0QsSUFBcEQsQ0FDRixLQURFLENBQU47QUFHSDtBQUNELGNBQUUseUJBQUYsRUFBNkIsSUFBN0IsQ0FBa0MsS0FBbEMsRUFBeUMsR0FBekM7QUFDSDtBQUNELGVBQU8sS0FBUCxDQUFhLGVBQWIsQ0FBNkIsTUFBN0I7QUFDSDs7QUFFRCxXQUFPLElBQVAsQ0FDSyxjQURMLEdBRUssSUFGTCxDQUVVLFVBQVUsS0FBVixFQUFpQjtBQUNuQixZQUFJLFNBQVMsRUFBYixFQUFpQjtBQUNiLGNBQUUsK0NBQUYsRUFBbUQsR0FBbkQsQ0FBdUQsS0FBdkQ7QUFDQSxjQUNJLHFFQURKLEVBRUUsUUFGRixDQUVXLGFBRlg7QUFHQSxtQkFBTyxLQUFQLENBQWEsVUFBYixDQUF3QixNQUF4QjtBQUNILFNBTkQsTUFNTztBQUNIO0FBQ0g7QUFDSixLQVpMLEVBYUssSUFiTCxDQWFVLFlBQVk7QUFDZDtBQUNILEtBZkw7QUFnQkgsQ0F4Q0Q7O0FBMENBOzs7QUFHQSxTQUFTLHFCQUFULENBQ0ksS0FESixFQUVJLE1BRkosRUFHSSxRQUhKLEVBSUksT0FKSixFQUtJLE9BTEosRUFNSSxjQU5KLEVBT0ksWUFQSixFQVFFO0FBQ0UsUUFBSSxRQUFRLEVBQUUscUJBQUYsQ0FBWjtBQUNBLE1BQUUsd0JBQUYsRUFBNEIsSUFBNUIsQ0FBaUMsaUJBQWpDLEVBQW9ELElBQXBEO0FBQ0EsUUFBSSxTQUFTLEVBQUUsb0NBQW9DLE9BQXBDLEdBQThDLFVBQWhELENBQWI7O0FBRUEsV0FBTyxJQUFQLENBQVksb0JBQVosRUFBa0MsT0FBTyxJQUFQLEVBQWxDO0FBQ0EsV0FBTyxJQUFQLENBQVksdUJBQVo7O0FBRUEsTUFBRSxJQUFGLENBQU8sT0FBTyxJQUFQLENBQVksZUFBWixDQUE0QixPQUE1QixDQUFQLEVBQTZDLE9BQU8sSUFBUCxDQUFZLGNBQVosRUFBN0MsRUFDSyxJQURMLENBQ1UsVUFBVSxnQkFBVixFQUE0QixTQUE1QixFQUF1QztBQUN6QyxZQUFJLG1CQUFtQixpQkFBaUIsQ0FBakIsQ0FBdkI7QUFDQSxZQUFJLFFBQVEsVUFBVSxDQUFWLENBQVo7O0FBRUEsWUFBSSxTQUFTLEVBQVQsSUFBZSxpQkFBaUIsZUFBakIsR0FBbUMsQ0FBdEQsRUFBeUQ7QUFDckQsY0FBRSwrQ0FBRixFQUFtRCxHQUFuRCxDQUF1RCxLQUF2RDtBQUNBLGNBQ0kscUVBREosRUFFRSxRQUZGLENBRVcsYUFGWDtBQUdBLGNBQUUsd0JBQUYsRUFBNEIsSUFBNUIsQ0FBaUMsZUFBakMsRUFBa0QsT0FBbEQ7QUFDQSxtQkFBTyxpQkFBUCxDQUNJLE9BREosRUFFSSxpQkFBaUIsZUFBakIsR0FBbUMsQ0FGdkM7QUFJSCxTQVZELE1BVU87QUFDSCxjQUFFLG1CQUFGLEVBQXVCLElBQXZCLENBQTRCLEtBQTVCO0FBQ0EsY0FBRSx5QkFBRixFQUNLLFdBREwsR0FFSyxRQUZMLENBRWMsVUFBVSxNQUZ4QjtBQUdBLGNBQUUseUJBQUYsRUFBNkIsSUFBN0IsQ0FBa0MsUUFBbEM7QUFDQSxjQUFFLHlCQUFGLEVBQTZCLElBQTdCLENBQWtDLEtBQWxDLEVBQXlDLE9BQXpDO0FBQ0EsZ0JBQUksa0JBQWtCLFNBQWxCLElBQStCLFlBQW5DLEVBQWlEO0FBQzdDLGtCQUFFLCtCQUFGLEVBQ0ssSUFETCxDQUNVLDJCQUEyQixjQURyQyxFQUVLLFdBRkwsQ0FFaUIsUUFGakI7QUFHSCxhQUpELE1BSU87QUFDSCxrQkFBRSwrQkFBRixFQUNLLElBREwsQ0FDVSxFQURWLEVBRUssUUFGTCxDQUVjLFFBRmQ7QUFHSDs7QUFFRCxnQkFBSSxZQUFZLE9BQU8sSUFBUCxDQUFZLGdDQUFaLEVBQThDO0FBQzFELDZCQUFhLE9BQU8sU0FBUCxDQUFpQjtBQUQ0QixhQUE5QyxDQUFoQjtBQUdBLGdCQUFJLE9BQU8sU0FBUCxDQUFpQixVQUFqQixDQUE0QixPQUE1QixFQUFxQyxXQUFyQyxLQUFxRCxDQUF6RCxFQUE0RDtBQUN4RCw0QkFBWSxPQUFPLElBQVAsQ0FBWSxrQ0FBWixDQUFaO0FBQ0g7QUFDRCxjQUFFLHNCQUFGLEVBQTBCLElBQTFCLENBQStCLFNBQS9COztBQUVBLGNBQUUsd0JBQUYsRUFBNEIsSUFBNUIsQ0FBaUMsZUFBakMsRUFBa0QsT0FBbEQ7O0FBRUEsZ0JBQ0ksT0FBTyxJQUFQLENBQVksZ0JBQVosS0FBaUMsT0FBakMsSUFDQSxPQUFPLElBQVAsQ0FBWSxnQkFBWixLQUFpQyxPQURqQyxJQUVBLFFBQVEsR0FBUixDQUFZLHFCQUFaLEtBQXNDLEdBSDFDLEVBSUU7QUFDRTtBQUNBLGtCQUFFLG9CQUFGLEVBQXdCLFVBQXhCLENBQW1DLFFBQW5DLEVBQTZDLE1BQTdDO0FBQ0gsYUFQRCxNQU9PO0FBQ0gsc0JBQU0sVUFBTixDQUFpQixRQUFqQixFQUEyQixNQUEzQjtBQUNIO0FBQ0o7QUFDSixLQXJETCxFQXNESyxJQXRETCxDQXNEVSxZQUFZO0FBQ2QsZUFBTyxVQUFQLENBQWtCLE1BQWxCLEVBQTBCLE9BQTFCO0FBQ0gsS0F4REw7QUF5REg7O0FBRUQsT0FBTyxpQkFBUCxHQUEyQixVQUFVLE9BQVYsRUFBbUIsZUFBbkIsRUFBb0M7QUFDM0QsUUFBSSxPQUFPLEVBQUUsb0NBQW9DLE9BQXBDLEdBQThDLElBQWhELENBQVg7O0FBRUEsUUFBSSx1QkFBdUIsRUFDdkIsb0NBQW9DLE9BQXBDLEdBQThDLElBRHZCLEVBRXpCLElBRnlCLEVBQTNCO0FBR0EsU0FBSyxJQUFMLENBQVUsT0FBTyx1QkFBakI7QUFDQSxNQUNJLHFFQURKLEVBRUUsUUFGRixDQUVXLGFBRlg7O0FBSUEsV0FBTyxJQUFQLENBQVksU0FBWixDQUNJLE9BREosRUFFSSxtQkFBbUIsRUFBRSw0QkFBRixFQUFnQyxHQUFoQyxFQUFuQixDQUZKLEVBR0ksSUFISjtBQUtILENBaEJEOztBQWtCQSxPQUFPLG9CQUFQLEdBQThCLFVBQVUsTUFBVixFQUFrQjtBQUM1QyxRQUFJLFFBQVEsRUFBRSxzQkFBRixDQUFaO0FBQ0EsUUFBSSxVQUFVLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLFlBQXpCLENBQWQ7QUFDQSxRQUFJLGNBQ0EsNENBQ0EsT0FEQSxHQUVBLGlCQUZBLEdBR0EsT0FBTyxJQUFQLENBQVksOEJBQVosQ0FIQSxHQUlBLE1BTEo7QUFNQSxRQUFJLFdBQUo7QUFDQSxRQUFJLE9BQU8sbUJBQVAsSUFBOEIsQ0FBbEMsRUFBcUM7QUFDakMsc0JBQWMsT0FBTyxJQUFQLENBQVksb0NBQVosRUFBa0Q7QUFDNUQsbUJBQU8sT0FBTyxLQUQ4QztBQUU1RCw2QkFBaUI7QUFGMkMsU0FBbEQsQ0FBZDtBQUlILEtBTEQsTUFLTztBQUNILHNCQUFjLE9BQU8sSUFBUCxDQUFZLHdCQUFaLEVBQXNDO0FBQ2hELG1CQUFPLE9BQU8sS0FEa0M7QUFFaEQsNkJBQWlCO0FBRitCLFNBQXRDLENBQWQ7QUFJSDtBQUNELFVBQU0sSUFBTixDQUFXLCtCQUFYLEVBQTRDLElBQTVDLENBQWlELHVCQUFqRDtBQUNBLE1BQUUsR0FBRixDQUNJLE9BQU8sR0FBUCxDQUFXLE9BQU8sTUFBUCxDQUFjLDBCQUF6QixFQUFxRDtBQUNqRCxpQkFBUyxPQUFPO0FBRGlDLEtBQXJELENBREosRUFJSSxVQUFVLEdBQVYsRUFBZTtBQUNYLFVBQUUsd0JBQUYsRUFBNEIsSUFBNUIsQ0FBaUMsR0FBakM7QUFDQSxjQUFNLElBQU4sQ0FBVyw2QkFBWCxFQUEwQyxJQUExQyxDQUErQyxXQUEvQztBQUNBLFlBQUksT0FBTyxTQUFTLEVBQUUsS0FBSyxZQUFQLEVBQVQsQ0FBWDtBQUNBLFVBQUUsaUJBQUY7QUFDSTtBQURKLFNBRUssUUFGTCxDQUVjLFFBRmQ7QUFHSTtBQUhKLFNBSUssSUFKTCxDQUtRLEtBTFIsRUFNUSw0RUFOUjtBQVFJO0FBUkosU0FTSyxFQVRMLENBU1EsTUFUUixFQVNnQixZQUFZO0FBQ3BCLGdCQUFJLEtBQUssWUFBTCxDQUFrQixZQUFsQixDQUFKLEVBQXFDO0FBQ2pDLGtCQUFFLElBQUYsRUFDSyxVQURMLENBQ2dCLG1CQURoQixFQUVLLFdBRkwsQ0FFaUIsUUFGakI7QUFHSDtBQUNKLFNBZkw7QUFnQkk7QUFoQkosU0FpQkssSUFqQkwsQ0FpQlUsWUFBWTtBQUNkLGlCQUFLLElBQUw7QUFDSCxTQW5CTDtBQW9CQSxjQUFNLElBQU4sQ0FBVywrQkFBWCxFQUE0QyxJQUE1QyxDQUFpRCxFQUFqRDtBQUNBLGNBQU0sVUFBTixDQUFpQixRQUFqQixFQUEyQixNQUEzQjtBQUNBLFlBQUksT0FBTyxPQUFPLE1BQWQsSUFBd0IsVUFBNUIsRUFBd0MsT0FBTyxNQUFQO0FBQzNDLEtBL0JMO0FBaUNILENBdkREOztBQXlEQTtBQUNBLEVBQUUsc0JBQUYsRUFBMEIsRUFBMUIsQ0FBNkIscUJBQTdCLEVBQW9ELFVBQVUsQ0FBVixFQUFhO0FBQzdEO0FBQ0EsUUFDSSxFQUFFLDRCQUFGLEVBQWdDLElBQWhDLENBQXFDLGtCQUFyQyxNQUE2RCxNQUE3RCxJQUNBLENBQUMsRUFBRSxFQUFFLE1BQUosRUFBWSxRQUFaLENBQXFCLGlCQUFyQixDQUZMLEVBR0U7QUFDRSxVQUFFLHdCQUFGLEVBQTRCLElBQTVCLENBQWlDLEVBQWpDO0FBQ0g7QUFDRCxRQUFJLE9BQU8sT0FBWCxFQUFvQixPQUFPLE9BQVAsQ0FBZSxXQUFmO0FBQ3ZCLENBVEQ7O0FBV0EsRUFBRSx3QkFBRixFQUE0QixFQUE1QixDQUErQixXQUEvQixFQUE0QyxVQUFVLENBQVYsRUFBYTtBQUNyRCxRQUFJLEVBQUUsRUFBRSxNQUFKLEVBQVksUUFBWixDQUFxQiwwQkFBckIsQ0FBSixFQUFzRDtBQUNsRCxVQUFFLDRCQUFGLEVBQWdDLElBQWhDLENBQXFDLGtCQUFyQyxFQUF5RCxJQUF6RDtBQUNIO0FBQ0osQ0FKRDs7QUFNQSxFQUFFLDRCQUFGLEVBQWdDLEVBQWhDLENBQW1DLHFCQUFuQyxFQUEwRCxZQUFZO0FBQ2xFLFFBQUksRUFBRSxJQUFGLEVBQVEsSUFBUixDQUFhLGtCQUFiLE1BQXFDLE1BQXpDLEVBQWlEO0FBQzdDLFVBQUUsc0JBQUYsRUFBMEIsVUFBMUIsQ0FBcUMsUUFBckMsRUFBK0MsTUFBL0M7QUFDQSxVQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsa0JBQWIsRUFBaUMsS0FBakM7QUFDSDtBQUNKLENBTEQ7O0FBT0E7OztBQUdBLEVBQUUsUUFBRixFQUFZLEVBQVosQ0FBZSxtQkFBZixFQUFvQyxrQkFBcEMsRUFBd0QsWUFBWTtBQUNoRSxRQUFJLFVBQVUsRUFBRSxVQUFGLEVBQWMsR0FBZCxFQUFkOztBQUVBLE1BQUUsSUFBRixDQUFPO0FBQ0gsYUFBSyxPQUFPLEdBQVAsQ0FBVyxPQUFPLE1BQVAsQ0FBYyxhQUF6QixFQUF3QyxFQUFFLFNBQVMsT0FBWCxFQUF4QyxDQURGO0FBRUgsY0FBTSxLQUZIO0FBR0gsY0FBTTtBQUNGLG1CQUFPLEVBQUUsb0JBQUYsRUFBd0IsR0FBeEIsRUFETDtBQUVGLDBCQUFjLE9BQU8sY0FBUCxDQUFzQix1QkFBdEIsS0FBa0Q7QUFGOUQsU0FISDtBQU9ILGlCQUFTLGlCQUFVLElBQVYsRUFBZ0I7QUFDckIsZ0JBQUksUUFBUSxFQUFFLG9CQUFGLEVBQXdCLEdBQXhCLEVBQVo7O0FBRUE7QUFDQSxtQkFBTyxJQUFQLElBQWUsT0FBTyxJQUFQLENBQVksWUFBWixDQUF5QixLQUF6QixDQUFmO0FBQ0EsY0FBRSx3QkFBRixFQUE0QixVQUE1QixDQUF1QyxRQUF2QyxFQUFpRCxPQUFqRDtBQUNILFNBYkU7QUFjSCxlQUFPLGVBQVUsS0FBVixFQUFpQixVQUFqQixFQUE2QixXQUE3QixFQUEwQztBQUM3QyxjQUFFLHdCQUFGLEVBQTRCLFVBQTVCLENBQXVDLFFBQXZDLEVBQWlELE9BQWpEO0FBQ0EsZ0JBQUksT0FBTyxPQUFYLEVBQ0ksT0FBTyxPQUFQLENBQWUsSUFBZixDQUNJLGFBQ0ksT0FBTyxJQUFQLENBQVksY0FBWixDQURKLEdBRUksWUFGSixHQUdJLE1BQU0sWUFKZCxFQUtJLE9BTEo7QUFPUDtBQXhCRSxLQUFQO0FBMEJILENBN0JEOztBQStCQTs7O0FBR0EsRUFBRSxZQUFZO0FBQ1YsUUFBSSxVQUFVLDBEQUFkOztBQUVBLE1BQUUsTUFBRixFQUNLLEVBREwsQ0FDUSxPQURSLEVBQ2lCLE9BRGpCLEVBQzBCLFVBQVUsQ0FBVixFQUFhO0FBQy9CLGVBQU8sSUFBUCxDQUFZLFdBQVosQ0FDSSxFQUFFLEVBQUUsTUFBSixFQUFZLE9BQVosQ0FBb0IsR0FBcEIsRUFBeUIsSUFBekIsQ0FBOEIsZUFBOUIsQ0FESixFQUVJLEVBQUUsRUFBRSxNQUFKLEVBQVksT0FBWixDQUFvQixHQUFwQixDQUZKO0FBSUgsS0FOTCxFQU9LLEVBUEwsQ0FPUSxvQkFQUixFQU84QixPQVA5QixFQU91QyxVQUFVLENBQVYsRUFBYTtBQUM1QyxZQUFJLE9BQU8sRUFBRSxFQUFFLE1BQUosRUFBWSxPQUFaLENBQW9CLEtBQXBCLEVBQTJCLFFBQTNCLENBQW9DLEdBQXBDLENBQVg7QUFDQSxlQUFPLE9BQVAsQ0FBZSxXQUFmLENBQTJCLElBQTNCLEVBQWlDLFdBQWpDO0FBQ0gsS0FWTCxFQVdLLEVBWEwsQ0FXUSxvQkFYUixFQVc4QixPQVg5QixFQVd1QyxVQUFVLENBQVYsRUFBYSxJQUFiLEVBQW1CO0FBQ2xELFlBQUksT0FBTyxFQUFFLEVBQUUsTUFBSixFQUFZLE9BQVosQ0FBb0IsS0FBcEIsRUFBMkIsUUFBM0IsQ0FBb0MsR0FBcEMsQ0FBWDtBQUNBLGFBQUssV0FBTCxDQUFpQixnQkFBakIsRUFBbUMsUUFBbkMsQ0FBNEMsc0JBQTVDO0FBQ0EsWUFBSSxVQUFVLEVBQUUsRUFBRSxNQUFKLEVBQVksT0FBWixDQUFvQixHQUFwQixFQUF5QixJQUF6QixDQUE4QixlQUE5QixDQUFkO0FBQ0EsZUFBTyxPQUFQLENBQWUsaUJBQWYsQ0FDSSxFQUFFLEVBQUUsTUFBSixFQUFZLE9BQVosQ0FBb0IsR0FBcEIsQ0FESixFQUVJLGlCQUZKO0FBSUEsZUFBTyxPQUFQLENBQWUsV0FBZixDQUEyQixJQUEzQixFQUFpQyxVQUFqQzs7QUFFQTtBQUNBLFlBQUksV0FBVyxFQUNYLGlDQUFpQyxPQUFqQyxHQUEyQyxJQURoQyxFQUViLElBRmEsQ0FFUixHQUZRLENBQWY7QUFHQSxpQkFBUyxRQUFULENBQWtCLGdCQUFsQixJQUNNLFNBQ0ssV0FETCxDQUNpQixnQkFEakIsRUFFSyxRQUZMLENBRWMsc0JBRmQsQ0FETixHQUlNLFNBQ0ssV0FETCxDQUNpQixzQkFEakIsRUFFSyxRQUZMLENBRWMsZ0JBRmQsQ0FKTjtBQU9ILEtBaENMOztBQWtDQSxRQUFJLGFBQWEsaUNBQWpCO0FBQ0EsTUFBRSxNQUFGLEVBQ0ssRUFETCxDQUNRLE9BRFIsRUFDaUIsVUFEakIsRUFDNkIsVUFBVSxDQUFWLEVBQWE7QUFDbEMsZUFBTyxJQUFQLENBQVksY0FBWixDQUNJLEVBQUUsRUFBRSxNQUFKLEVBQVksT0FBWixDQUFvQixHQUFwQixFQUF5QixJQUF6QixDQUE4QixlQUE5QixDQURKLEVBRUksRUFBRSxFQUFFLE1BQUosRUFBWSxPQUFaLENBQW9CLEdBQXBCLENBRkosRUFHSSxLQUhKO0FBS0gsS0FQTCxFQVFLLEVBUkwsQ0FRUSx1QkFSUixFQVFpQyxVQVJqQyxFQVE2QyxVQUFVLENBQVYsRUFBYTtBQUNsRCxZQUFJLE9BQU8sRUFBRSxFQUFFLE1BQUosRUFBWSxPQUFaLENBQW9CLEtBQXBCLEVBQTJCLFFBQTNCLENBQW9DLEdBQXBDLENBQVg7QUFDQSxlQUFPLE9BQVAsQ0FBZSxXQUFmLENBQTJCLElBQTNCLEVBQWlDLFdBQWpDO0FBQ0gsS0FYTCxFQVlLLEVBWkwsQ0FZUSx1QkFaUixFQVlpQyxVQVpqQyxFQVk2QyxVQUFVLENBQVYsRUFBYSxJQUFiLEVBQW1CO0FBQ3hELFlBQUksT0FBTyxFQUFFLEVBQUUsTUFBSixFQUFZLE9BQVosQ0FBb0IsS0FBcEIsRUFBMkIsUUFBM0IsQ0FBb0MsR0FBcEMsQ0FBWDtBQUNBLGFBQUssV0FBTCxDQUFpQixzQkFBakIsRUFBeUMsUUFBekMsQ0FBa0QsZ0JBQWxEO0FBQ0EsWUFBSSxVQUFVLEVBQUUsRUFBRSxNQUFKLEVBQVksT0FBWixDQUFvQixHQUFwQixFQUF5QixJQUF6QixDQUE4QixlQUE5QixDQUFkO0FBQ0EsVUFBRSxFQUFFLE1BQUosRUFBWSxPQUFaLENBQW9CLEdBQXBCLEVBQXlCLElBQXpCLENBQThCLGFBQTlCLEVBQTZDLGNBQTdDO0FBQ0EsZUFBTyxPQUFQLENBQWUsaUJBQWYsQ0FDSSxFQUFFLEVBQUUsTUFBSixFQUFZLE9BQVosQ0FBb0IsR0FBcEIsQ0FESixFQUVJLGNBRko7QUFJQSxlQUFPLE9BQVAsQ0FBZSxXQUFmLENBQTJCLElBQTNCLEVBQWlDLFVBQWpDOztBQUVBO0FBQ0EsWUFBSSxXQUFXLEVBQUUsMkJBQTJCLE9BQTNCLEdBQXFDLElBQXZDLEVBQTZDLElBQTdDLENBQ1gsR0FEVyxDQUFmO0FBR0EsaUJBQVMsUUFBVCxDQUFrQixnQkFBbEIsSUFDTSxTQUNLLFdBREwsQ0FDaUIsZ0JBRGpCLEVBRUssUUFGTCxDQUVjLHNCQUZkLENBRE4sR0FJTSxTQUNLLFdBREwsQ0FDaUIsc0JBRGpCLEVBRUssUUFGTCxDQUVjLGdCQUZkLENBSk47QUFPSCxLQWxDTDtBQW1DSCxDQXpFRDs7QUEyRUE7OztBQUdBLE9BQU8sbUJBQVAsR0FBNkIsVUFBVSxPQUFWLEVBQW1CLElBQW5CLEVBQXlCO0FBQ2xELFFBQUksY0FBYyxPQUFPLEdBQVAsQ0FBVyxPQUFPLE1BQVAsQ0FBYyxlQUF6QixDQUFsQjtBQUNBLFFBQUksT0FBTyxFQUFFLElBQUYsRUFBUSxRQUFSLENBQWlCLFFBQWpCLENBQVg7QUFDQSxRQUFJLFlBQVksRUFDWixnQ0FBZ0MsT0FBaEMsR0FBMEMsWUFEOUIsRUFFZCxJQUZjLEVBQWhCO0FBR0EsTUFBRSxJQUFGLEVBQVEsUUFBUixDQUFpQixXQUFqQjs7QUFFQSxRQUFJLEVBQUUsSUFBRixFQUFRLFFBQVIsQ0FBaUIsZ0JBQWpCLENBQUosRUFBd0M7QUFDcEM7QUFDQSxlQUFPLElBQVAsQ0FBWSxXQUFaLENBQXdCLE9BQXhCLEVBQWlDLElBQWpDOztBQUVBLFVBQUUsUUFBRixFQUNLLEVBREwsQ0FDUSxvQkFEUixFQUM4QixJQUQ5QixFQUNvQyxZQUFZO0FBQ3hDLGNBQUUsSUFBRixFQUNLLFdBREwsQ0FDaUIsZ0JBRGpCLEVBRUssUUFGTCxDQUVjLHNCQUZkLEVBR0ssV0FITCxDQUdpQixXQUhqQixFQUlLLFFBSkwsQ0FJYyxVQUpkO0FBS0EsY0FBRSxJQUFGLEVBQVEsSUFBUixDQUNJLFlBREosRUFFSSxPQUFPLElBQVAsQ0FBWSx5QkFBWixFQUF1QyxFQUFFLE9BQU8sU0FBVCxFQUF2QyxDQUZKOztBQUtBO0FBQ0EsZ0JBQUksVUFBVSxFQUFFLElBQUYsRUFDVCxPQURTLENBQ0QsY0FEQyxFQUVULElBRlMsQ0FFSixlQUZJLENBQWQ7QUFHQSxnQkFBSSxXQUFXLEVBQ1gsa0RBQ0ksT0FESixHQUVJLElBSE8sQ0FBZjtBQUtBLGdCQUFJLFdBQVcsU0FBUyxJQUFULENBQWMsR0FBZCxDQUFmO0FBQ0EscUJBQVMsSUFBVCxDQUFjLGFBQWQsRUFBNkIsaUJBQTdCO0FBQ0EscUJBQ0ssV0FETCxDQUNpQixnQkFEakIsRUFFSyxRQUZMLENBRWMsc0JBRmQ7QUFHQSxtQkFBTyxPQUFQLENBQWUsV0FBZixDQUEyQixRQUEzQixFQUFxQyxVQUFyQztBQUNBLG1CQUFPLE9BQVAsQ0FBZSxpQkFBZixDQUFpQyxRQUFqQyxFQUEyQyxpQkFBM0M7O0FBRUEsY0FBRSxRQUFGLEVBQVksR0FBWixDQUFnQixvQkFBaEI7QUFDSCxTQTlCTCxFQStCSyxFQS9CTCxDQWdDUSxvQkFoQ1IsRUFpQ1EsSUFqQ1IsRUFrQ1EsVUFBVSxDQUFWLEVBQWEsS0FBYixFQUFvQixVQUFwQixFQUFnQyxXQUFoQyxFQUE2QztBQUN6QyxvQkFBUSxHQUFSLENBQVksV0FBWjtBQUNBLGdCQUFJLFVBQVUsRUFBRSxJQUFGLEVBQ1QsT0FEUyxDQUNELGNBREMsRUFFVCxJQUZTLENBRUosZUFGSSxDQUFkOztBQUlBLGdCQUNJLE1BQU0sWUFBTixJQUNBLEtBQUssS0FBTCxDQUFXLE1BQU0sWUFBakIsRUFBK0IsZ0JBQS9CLENBRkosRUFHRTtBQUNFLG9CQUFJLGFBQWEsT0FBTyxRQUFQLENBQWdCLFFBQWpDO0FBQ0Esb0JBQUksT0FBTyxRQUFQLENBQWdCLE1BQXBCLEVBQTRCO0FBQ3hCLGtDQUNJLE9BQU8sUUFBUCxDQUFnQixNQUFoQixHQUF5QixRQUF6QixHQUFvQyxPQUR4QztBQUVILGlCQUhELE1BR087QUFDSCxrQ0FBYyxXQUFXLE9BQXpCO0FBQ0g7QUFDRCxrQkFBRSxvQkFBRixFQUF3QixJQUF4QixDQUNJLE1BREosRUFFSSxPQUFPLEdBQVAsQ0FBVyxPQUFPLE1BQVAsQ0FBYyxhQUF6QixFQUF3QztBQUNwQyw2QkFBUztBQUQyQixpQkFBeEMsQ0FGSjtBQU1BLGtCQUFFLHFCQUFGLEVBQXlCLFVBQXpCLENBQW9DLFFBQXBDLEVBQThDLE1BQTlDO0FBQ0gsYUFsQkQsTUFrQk87QUFDSCxvQkFBSSxPQUFPLE9BQVgsRUFDSSxPQUFPLE9BQVAsQ0FBZSxJQUFmLENBQ0ksT0FBTyxJQUFQLENBQVksd0JBQVosQ0FESixFQUVJLE9BRko7QUFJUDs7QUFFRCxnQkFBSSxPQUFPLEVBQUUsSUFBRixFQUFRLFFBQVIsQ0FBaUIsR0FBakIsQ0FBWDtBQUNBLG1CQUFPLE9BQVAsQ0FBZSxXQUFmLENBQTJCLElBQTNCLEVBQWlDLFVBQWpDOztBQUVBLGNBQUUsUUFBRixFQUFZLEdBQVosQ0FBZ0Isb0JBQWhCO0FBQ0gsU0F0RVQ7QUF3RUgsS0E1RUQsTUE0RU8sSUFBSSxFQUFFLElBQUYsRUFBUSxRQUFSLENBQWlCLHNCQUFqQixDQUFKLEVBQThDO0FBQ2pEO0FBQ0EsZUFBTyxJQUFQLENBQVksY0FBWixDQUEyQixPQUEzQixFQUFvQyxJQUFwQyxFQUEwQyxLQUExQzs7QUFFQSxVQUFFLFFBQUYsRUFDSyxFQURMLENBQ1EsdUJBRFIsRUFDaUMsSUFEakMsRUFDdUMsWUFBWTtBQUMzQyxjQUFFLElBQUYsRUFDSyxXQURMLENBQ2lCLHNCQURqQixFQUVLLFFBRkwsQ0FFYyxnQkFGZCxFQUdLLFdBSEwsQ0FHaUIsV0FIakIsRUFJSyxRQUpMLENBSWMsVUFKZDtBQUtBLGNBQUUsSUFBRixFQUFRLElBQVIsQ0FDSSxZQURKLEVBRUksT0FBTyxJQUFQLENBQVksb0JBQVosRUFBa0MsRUFBRSxPQUFPLFNBQVQsRUFBbEMsQ0FGSjs7QUFLQTtBQUNBLGdCQUFJLFVBQVUsRUFBRSxJQUFGLEVBQVEsT0FBUixDQUFnQixjQUFoQixFQUFnQyxJQUFoQyxDQUFxQyxTQUFyQyxDQUFkO0FBQ0EsZ0JBQUksV0FBVyxFQUNYLHFEQUNJLE9BREosR0FFSSxJQUhPLENBQWY7QUFLQSxnQkFBSSxXQUFXLFNBQVMsSUFBVCxDQUFjLEdBQWQsQ0FBZjtBQUNBLHFCQUFTLElBQVQsQ0FBYyxhQUFkLEVBQTZCLGNBQTdCO0FBQ0EscUJBQ0ssV0FETCxDQUNpQixzQkFEakIsRUFFSyxRQUZMLENBRWMsZ0JBRmQ7QUFHQSxtQkFBTyxPQUFQLENBQWUsV0FBZixDQUEyQixRQUEzQixFQUFxQyxVQUFyQztBQUNBLG1CQUFPLE9BQVAsQ0FBZSxpQkFBZixDQUFpQyxRQUFqQyxFQUEyQyxjQUEzQzs7QUFFQSxjQUFFLFFBQUYsRUFBWSxHQUFaLENBQWdCLHVCQUFoQjtBQUNILFNBNUJMLEVBNkJLLEVBN0JMLENBOEJRLHVCQTlCUixFQStCUSxJQS9CUixFQWdDUSxVQUFVLENBQVYsRUFBYSxLQUFiLEVBQW9CLFVBQXBCLEVBQWdDLFdBQWhDLEVBQTZDO0FBQ3pDLGdCQUFJLFVBQVUsRUFBRSxJQUFGLEVBQ1QsT0FEUyxDQUNELGNBREMsRUFFVCxJQUZTLENBRUosU0FGSSxDQUFkO0FBR0Esb0JBQVEsR0FBUixDQUFZLFdBQVo7O0FBRUEsZ0JBQ0ksTUFBTSxZQUFOLElBQ0EsS0FBSyxLQUFMLENBQVcsTUFBTSxZQUFqQixFQUErQixnQkFBL0IsQ0FGSixFQUdFO0FBQ0Usb0JBQUksYUFDQSxPQUFPLFFBQVAsQ0FBZ0IsUUFBaEIsR0FBMkIsT0FBTyxRQUFQLENBQWdCLE1BRC9DO0FBRUEsa0JBQUUsb0JBQUYsRUFBd0IsSUFBeEIsQ0FDSSxNQURKLEVBRUksT0FBTyxHQUFQLENBQVcsT0FBTyxNQUFQLENBQWMsYUFBekIsRUFBd0M7QUFDcEMsNkJBQVM7QUFEMkIsaUJBQXhDLENBRko7QUFNQSxrQkFBRSxxQkFBRixFQUF5QixVQUF6QixDQUFvQyxRQUFwQyxFQUE4QyxNQUE5QztBQUNILGFBYkQsTUFhTztBQUNILG9CQUFJLE9BQU8sT0FBWCxFQUNJLE9BQU8sT0FBUCxDQUFlLElBQWYsQ0FDSSxPQUFPLElBQVAsQ0FBWSx3QkFBWixDQURKLEVBRUksT0FGSjtBQUlQOztBQUVELGdCQUFJLE9BQU8sRUFBRSxJQUFGLEVBQVEsUUFBUixDQUFpQixHQUFqQixDQUFYO0FBQ0EsbUJBQU8sT0FBUCxDQUFlLFdBQWYsQ0FBMkIsSUFBM0IsRUFBaUMsVUFBakM7O0FBRUEsY0FBRSxRQUFGLEVBQVksR0FBWixDQUFnQix1QkFBaEI7QUFDSCxTQS9EVDtBQWlFSDtBQUNKLENBMUpEOztBQTRKQTs7O0FBR0EsRUFBRSxZQUFZO0FBQ1YsUUFBSSxRQUFRLEVBQVo7QUFDQSxRQUFJLGdCQUFnQixFQUFwQjs7QUFFQSxNQUFFLE1BQUYsRUFDSyxFQURMLENBQ1Esb0JBRFIsRUFDOEIsWUFBWTtBQUNsQyxVQUNJLGtFQURKLEVBRUUsSUFGRixDQUVPLFlBQVk7QUFDZixnQkFBSSxTQUFTLEVBQUUsSUFBRixFQUFRLElBQVIsQ0FBYSxhQUFiLENBQWI7QUFDQSxnQkFBSSxVQUFVLGNBQVYsSUFBNEIsVUFBVSxpQkFBMUMsRUFBNkQ7QUFDekQsb0JBQUksT0FBTyxFQUFFLElBQUYsRUFBUSxPQUFSLENBQWdCLEtBQWhCLEVBQXVCLFFBQXZCLENBQWdDLEdBQWhDLENBQVg7QUFDQSx1QkFBTyxPQUFQLENBQWUsV0FBZixDQUEyQixJQUEzQixFQUFpQyxXQUFqQztBQUNIO0FBQ0osU0FSRDtBQVNILEtBWEwsRUFZSyxFQVpMLENBWVEsb0JBWlIsRUFZOEIsVUFBVSxDQUFWLEVBQWEsSUFBYixFQUFtQjtBQUN6QyxZQUFJLElBQUo7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQSxjQUFNLFFBQU4sQ0FDSSxDQUNJLFVBQVUsUUFBVixFQUFvQjtBQUNoQjtBQUNBLGdCQUFJLEtBQUssV0FBTCxJQUFvQixJQUF4QixFQUE4QjtBQUMxQixxQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEtBQUssV0FBTCxDQUFpQixNQUFyQyxFQUE2QyxHQUE3QyxFQUFrRDtBQUM5Qyx3QkFBSSxVQUFVLEtBQUssV0FBTCxDQUFpQixDQUFqQixDQUFkO0FBQ0EsMEJBQU0sTUFBTixDQUFhLE1BQU0sT0FBTixDQUFjLENBQUMsT0FBZixDQUFiLEVBQXNDLENBQXRDOztBQUVBO0FBQ0Esc0JBQ0ksc0NBQ0ksT0FESixHQUVJLE1BSFIsRUFLSyxJQUxMLENBTVEsT0FBTyxJQUFQLENBQVksVUFBWixJQUNJLHdFQVBaLEVBU0ssSUFUTCxDQVVRLE1BVlIsRUFXUSxPQUFPLEdBQVAsQ0FBVyxPQUFPLE1BQVAsQ0FBYyxZQUF6QixDQVhSLEVBYUssUUFiTCxDQWFjLFdBYmQ7QUFjQSwyQkFBTyxPQUFQLENBQWUsY0FBZixDQUNJLE9BREosRUFFSSxPQUFPLElBQVAsQ0FBWSxVQUFaLENBRko7QUFJQSxzQkFDSSxvQ0FDSSxPQURKLEdBRUksSUFIUixFQUlFLFFBSkYsQ0FJVyw0QkFKWDs7QUFNQTtBQUNBLDJCQUFPLEVBQ0gsMkNBQ0ksT0FESixHQUVJLG1EQUZKLEdBR0ksT0FISixHQUlJLDBDQUpKLEdBS0ksT0FMSixHQU1JLDBDQU5KLEdBT0ksT0FQSixHQVFJLElBVEQsQ0FBUDtBQVdBLDJCQUFPLE9BQVAsQ0FBZSxpQkFBZixDQUNJLElBREosRUFFSSxVQUZKLEVBR0ksSUFISjtBQUtBO0FBQ0Esc0JBQ0ksa0NBQ0ksT0FESixHQUVJLElBSFIsRUFJRSxJQUpGLENBS0ksT0FDSyxJQURMLENBQ1Usc0JBRFYsRUFFSyxXQUZMLEVBTEo7QUFTSDtBQUNKOztBQUVEO0FBQ0gsU0FoRUwsRUFpRUksVUFBVSxRQUFWLEVBQW9CO0FBQ2hCO0FBQ0EsZ0JBQUksS0FBSyxPQUFMLElBQWdCLElBQXBCLEVBQTBCO0FBQ3RCLHFCQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksS0FBSyxPQUFMLENBQWEsTUFBakMsRUFBeUMsR0FBekMsRUFBOEM7QUFDMUM7QUFDQSx3QkFDSSxLQUFLLFdBQUwsQ0FBaUIsT0FBakIsQ0FBeUIsS0FBSyxPQUFMLENBQWEsQ0FBYixDQUF6QixLQUNBLENBQUMsQ0FGTCxFQUdFO0FBQ0UsNEJBQUksVUFBVSxLQUFLLE9BQUwsQ0FBYSxDQUFiLENBQWQ7QUFDQSw4QkFBTSxNQUFOLENBQWEsTUFBTSxPQUFOLENBQWMsQ0FBQyxPQUFmLENBQWIsRUFBc0MsQ0FBdEM7O0FBRUEsMEJBQ0ksc0NBQ0ksT0FESixHQUVJLE1BSFIsRUFLSyxJQUxMLENBTVEsT0FBTyxJQUFQLENBQVksUUFBWixJQUNJLHdFQVBaLEVBU0ssSUFUTCxDQVVRLE1BVlIsRUFXUSxPQUFPLEdBQVAsQ0FDSSxPQUFPLE1BQVAsQ0FBYyxZQURsQixDQVhSLEVBZUssUUFmTCxDQWVjLFdBZmQ7QUFnQkEsK0JBQU8sT0FBUCxDQUFlLGNBQWYsQ0FDSSxPQURKLEVBRUksT0FBTyxJQUFQLENBQVksUUFBWixDQUZKOztBQUtBLDBCQUNJLG9DQUNJLE9BREosR0FFSSxJQUhSLEVBSUUsUUFKRixDQUlXLDRCQUpYOztBQU1BO0FBQ0EsK0JBQU8sRUFDSCx5Q0FDSSxPQURKLEdBRUksNENBRkosR0FHSSxPQUhKLEdBSUksSUFMRCxDQUFQO0FBT0EsK0JBQU8sT0FBUCxDQUFlLGlCQUFmLENBQ0ksSUFESixFQUVJLE1BRko7O0FBS0E7QUFDQSwwQkFDSSxrQ0FDSSxPQURKLEdBRUksSUFIUixFQUlFLElBSkYsQ0FJTyxPQUFPLElBQVAsQ0FBWSxRQUFaLENBSlA7O0FBTUE7QUFDQSwwQkFDSSw2Q0FDSSxPQURKLEdBRUksSUFIUixFQUtLLFFBTEwsQ0FLYyxxQkFMZCxFQU1LLFdBTkwsQ0FNaUIseUJBTmpCOztBQVFBO0FBQ0EsMEJBQ0ksbUNBQ0ksT0FESixHQUVJLElBSFIsRUFJRSxRQUpGLENBSVcsU0FKWDtBQUtIO0FBQ0o7QUFDSjs7QUFFRDtBQUNILFNBaEpMLEVBaUpJLFVBQVUsUUFBVixFQUFvQjtBQUNoQjtBQUNBLGdCQUFJLEtBQUssVUFBTCxJQUFtQixJQUF2QixFQUE2QjtBQUN6QixxQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLEtBQUssVUFBTCxDQUFnQixNQUFwQyxFQUE0QyxHQUE1QyxFQUFpRDtBQUM3Qyx3QkFBSSxVQUFVLEtBQUssVUFBTCxDQUFnQixDQUFoQixDQUFkO0FBQ0Esd0JBQUksWUFBWSxFQUNaLGdDQUNJLE9BREosR0FFSSxZQUhRLEVBSWQsSUFKYyxFQUFoQjs7QUFNQSxzQkFDSSw4QkFDSSxPQURKLEdBRUksTUFIUixFQUtLLFdBTEwsQ0FLaUIsZ0JBTGpCLEVBTUssUUFOTCxDQU9RLHVDQVBSO0FBU0Esc0JBQ0ksOEJBQ0ksT0FESixHQUVJLE1BSFIsRUFJRSxJQUpGLENBS0ksWUFMSixFQU1JLE9BQU8sSUFBUCxDQUFZLHlCQUFaLEVBQXVDO0FBQ25DLCtCQUFPO0FBRDRCLHFCQUF2QyxDQU5KOztBQVdBO0FBQ0EsMkJBQU8sRUFDSCxpREFDSSxPQURKLEdBRUksSUFIRCxDQUFQO0FBS0Esd0JBQUksT0FBTyxLQUFLLE9BQUwsQ0FBYSxLQUFiLEVBQW9CLFFBQXBCLENBQTZCLEdBQTdCLENBQVg7QUFDQSwyQkFBTyxPQUFQLENBQWUsV0FBZixDQUEyQixJQUEzQixFQUFpQyxVQUFqQztBQUNBLDJCQUFPLE9BQVAsQ0FBZSxpQkFBZixDQUNJLElBREosRUFFSSxpQkFGSjtBQUlBLHlCQUFLLFdBQUwsQ0FBaUIsZ0JBQWpCLEVBQW1DLFFBQW5DLENBQ0ksc0JBREo7QUFHSDtBQUNKOztBQUVEO0FBQ0gsU0FuTUwsQ0FESixFQXNNSSxVQUFVLEdBQVYsRUFBZSxPQUFmLEVBQXdCO0FBQ3BCO0FBQ0EsaUJBQUssSUFBSSxJQUFJLENBQWIsRUFBZ0IsSUFBSSxNQUFNLE1BQTFCLEVBQWtDLEdBQWxDLEVBQXVDO0FBQ25DLG9CQUFJLE9BQU8sRUFDUCxrQ0FDSSxNQUFNLENBQU4sQ0FESixHQUVJLDBCQUhHLENBQVg7O0FBTUEscUJBQUssSUFBTCxDQUFVLFlBQVk7QUFDbEIsMkJBQU8sT0FBUCxDQUFlLGlCQUFmLENBQ0ksRUFBRSxJQUFGLENBREosRUFFSSxFQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsYUFBYixDQUZKLEVBR0ksSUFISjtBQUtILGlCQU5EO0FBT0g7O0FBRUQ7QUFDQSxpQkFBSyxJQUFJLElBQUksQ0FBYixFQUFnQixJQUFJLGNBQWMsTUFBbEMsRUFBMEMsR0FBMUMsRUFBK0M7QUFDM0Msb0JBQUksT0FBTyxFQUNQLGlEQUNJLGNBQWMsQ0FBZCxDQURKLEdBRUksSUFIRyxDQUFYOztBQU1BLG9CQUFJLE9BQU8sS0FBSyxPQUFMLENBQWEsS0FBYixFQUFvQixRQUFwQixDQUE2QixHQUE3QixDQUFYO0FBQ0EsdUJBQU8sT0FBUCxDQUFlLFdBQWYsQ0FBMkIsSUFBM0IsRUFBaUMsVUFBakM7QUFDQSx1QkFBTyxPQUFQLENBQWUsaUJBQWYsQ0FDSSxFQUFFLElBQUYsQ0FESixFQUVJLEVBQUUsSUFBRixFQUFRLElBQVIsQ0FBYSxhQUFiLENBRkosRUFHSSxJQUhKO0FBS0g7QUFDSixTQXhPTDs7QUEyT0EsWUFBSSxXQUFXLE9BQU8sUUFBUCxDQUFnQixRQUFoQixFQUFmOztBQUVBO0FBQ0EsWUFBSSxTQUFTLE9BQVQsQ0FBaUIsU0FBakIsS0FBK0IsQ0FBQyxDQUFwQyxFQUF1QztBQUNuQyx5Q0FDSSxPQUFPLFFBQVAsQ0FBZ0IsUUFBaEIsSUFDSyxPQUFPLFFBQVAsQ0FBZ0IsTUFBaEIsR0FBeUIsT0FBTyxRQUFQLENBQWdCLE1BQXpDLEdBQWtELEVBRHZELENBREo7QUFJSDs7QUFFRCxVQUFFLGtCQUFGLEVBQXNCLElBQXRCLENBQTJCLFlBQVk7QUFDbkMsZ0JBQUksQ0FBQyxPQUFPLE1BQVIsSUFBa0IsQ0FBQyxPQUFPLE1BQTlCLEVBQXNDO0FBQ2xDLG1CQUFHLE1BQUgsQ0FBVSxJQUFWO0FBQ0EsbUNBQW1CLElBQW5CO0FBQ0g7QUFDSixTQUxEOztBQU9BLFVBQUUsMEJBQUYsRUFBOEIsR0FBOUIsQ0FBa0MsU0FBbEMsRUFBNkMsTUFBN0M7QUFDQSxVQUFFLHlCQUFGLEVBQ0ssR0FETCxDQUNTLFNBRFQsRUFDb0IsT0FEcEIsRUFFSyxPQUZMLEdBR0ssSUFITCxDQUdVLFlBQVk7QUFDZCxjQUFFLFFBQUYsRUFBWSxPQUFaLENBQW9CLGtCQUFwQjtBQUNILFNBTEw7O0FBT0EsVUFBRSxvREFBRixFQUF3RCxXQUF4RCxDQUNJLFVBREo7QUFHSCxLQTVSTCxFQTZSSyxFQTdSTCxDQTZSUSxvQkE3UlIsRUE2UjhCLFVBQVUsQ0FBVixFQUFhLEtBQWIsRUFBb0I7QUFDMUMsVUFBRSxvREFBRixFQUF3RCxJQUF4RCxDQUNJLFlBQVk7QUFDUixnQkFDSSxFQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsYUFBYixLQUErQixjQUEvQixJQUNBLEVBQUUsSUFBRixFQUFRLElBQVIsQ0FBYSxhQUFiLEtBQStCLGlCQUZuQyxFQUdFO0FBQ0UsdUJBQU8sT0FBUCxDQUFlLFdBQWYsQ0FDSSxFQUFFLElBQUYsRUFBUSxPQUFSLENBQWdCLEtBQWhCLEVBQXVCLFFBQXZCLENBQWdDLEdBQWhDLENBREosRUFFSSxVQUZKO0FBSUg7QUFDRCxtQkFBTyxPQUFQLENBQWUsaUJBQWYsQ0FDSSxFQUFFLElBQUYsQ0FESixFQUVJLEVBQUUsSUFBRixFQUFRLElBQVIsQ0FBYSxhQUFiLENBRkosRUFHSSxJQUhKO0FBS0gsU0FoQkw7O0FBbUJBLFVBQUUsa0JBQUYsRUFBc0IsSUFBdEIsQ0FBMkIsWUFBWTtBQUNuQyxnQkFBSSxDQUFDLE9BQU8sTUFBUixJQUFrQixDQUFDLE9BQU8sTUFBOUIsRUFBc0M7QUFDbEMsbUJBQUcsTUFBSCxDQUFVLElBQVY7QUFDQSxtQ0FBbUIsSUFBbkI7QUFDSDtBQUNKLFNBTEQ7QUFNSCxLQXZUTDs7QUF5VEEsUUFBSSxXQUFXLE9BQU8sUUFBUCxDQUFnQixRQUFoQixFQUFmO0FBQ0EsUUFDSSxFQUFFLE1BQUYsRUFBVSxJQUFWLENBQWUsZUFBZixLQUFtQyxPQUFuQyxJQUNBLFNBQVMsT0FBVCxDQUFpQixRQUFqQixLQUE4QixDQUFDLENBRm5DLEVBR0U7QUFDRSxVQUNJLG9IQURKLEVBRUUsSUFGRixDQUVPLFlBQVk7QUFDZixnQkFBSSxVQUNBLE9BQU8sRUFBRSxJQUFGLEVBQVEsSUFBUixDQUFhLGVBQWIsQ0FBUCxLQUF5QyxXQUF6QyxHQUNNLEVBQUUsSUFBRixFQUFRLElBQVIsQ0FBYSxTQUFiLENBRE4sR0FFTSxFQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsZUFBYixDQUhWO0FBSUEsZ0JBQUksTUFBTSxPQUFOLENBQWMsQ0FBQyxPQUFmLElBQTBCLENBQTFCLElBQStCLE9BQW5DLEVBQTRDO0FBQ3hDLHNCQUFNLElBQU4sQ0FBVyxDQUFDLE9BQVo7QUFDQSw4QkFBYyxJQUFkLENBQW1CLENBQUMsT0FBcEI7QUFDSDtBQUNKLFNBWEQ7QUFZQTtBQUNBLFlBQ0ssTUFBTSxNQUFOLEtBQWlCLENBQWpCLElBQXNCLFNBQVMsT0FBVCxDQUFpQixXQUFXLE1BQU0sQ0FBTixDQUE1QixJQUF3QyxDQUEvRCxJQUNBLE1BQU0sTUFBTixHQUFlLENBRm5CLEVBR0U7QUFDRSxtQkFBTyxJQUFQLENBQVksY0FBWixDQUEyQixLQUEzQjtBQUNIO0FBQ0osS0F2QkQsTUF1Qk87QUFDSCxVQUFFLG9EQUFGLEVBQXdELElBQXhELENBQ0ksWUFBWTtBQUNSLG1CQUFPLE9BQVAsQ0FBZSxpQkFBZixDQUNJLEVBQUUsSUFBRixDQURKLEVBRUksRUFBRSxJQUFGLEVBQVEsSUFBUixDQUFhLGFBQWIsQ0FGSixFQUdJLElBSEo7QUFLSCxTQVBMOztBQVVBLFVBQUUsMEJBQUYsRUFBOEIsR0FBOUIsQ0FBa0MsU0FBbEMsRUFBNkMsTUFBN0M7QUFDQSxVQUFFLHlCQUFGLEVBQTZCLEdBQTdCLENBQWlDLFNBQWpDLEVBQTRDLE9BQTVDO0FBQ0EsVUFBRSxtQ0FBRixFQUF1QyxHQUF2QyxDQUEyQyxTQUEzQyxFQUFzRCxPQUF0RDs7QUFFQSxZQUFJLEVBQUUsTUFBRixFQUFVLElBQVYsQ0FBZSxpQkFBZixNQUFzQyxNQUExQyxFQUFrRDtBQUM5QyxjQUFFLFFBQUYsRUFBWSxLQUFaLENBQWtCLFlBQVk7QUFDMUIsMkJBQVcsWUFBWTtBQUNuQixzQkFBRSxRQUFGLEVBQVksT0FBWixDQUFvQixtQkFBcEI7QUFDSCxpQkFGRCxFQUVHLEdBRkg7QUFHSCxhQUpEO0FBS0g7O0FBRUQsVUFBRSxrQkFBRixFQUFzQixJQUF0QixDQUEyQixZQUFZO0FBQ25DLGdCQUFJLENBQUMsT0FBTyxNQUFSLElBQWtCLENBQUMsT0FBTyxNQUE5QixFQUFzQztBQUNsQyxtQkFBRyxNQUFILENBQVUsSUFBVjtBQUNBLG1DQUFtQixJQUFuQjtBQUNIO0FBQ0osU0FMRDtBQU1IO0FBQ0osQ0FuWEQ7O0FBcVhBOzs7QUFHQSxFQUFFLFlBQVk7QUFDVixNQUFFLGdDQUFGLEVBQ0ssRUFETCxDQUNRLHlCQURSLEVBQ21DLFVBQVUsQ0FBVixFQUFhLElBQWIsRUFBbUI7QUFDOUMsWUFBSSxvQkFBb0IsRUFBRSx5QkFBRixDQUF4QjtBQUNBLDBCQUFrQixLQUFsQixHQUY4QyxDQUVuQjtBQUMzQixhQUFLLElBQUksSUFBSSxDQUFiLEVBQWdCLElBQUksS0FBSyxLQUFMLENBQVcsTUFBL0IsRUFBdUMsR0FBdkMsRUFBNEM7QUFDeEMsZ0JBQUksSUFBSjtBQUNBLGdCQUFJLEtBQUssS0FBTCxDQUFXLENBQVgsRUFBYyxLQUFkLElBQXVCLE1BQTNCLEVBQW1DO0FBQy9CLHVCQUFPLEtBQUssS0FBTCxDQUFXLENBQVgsRUFBYyxhQUFyQjtBQUNILGFBRkQsTUFFTztBQUNIO0FBQ0EsdUJBQU8sS0FBSyxLQUFMLENBQVcsQ0FBWCxFQUFjLGFBQWQsR0FBOEIsSUFBckM7QUFDSDtBQUNELGdCQUFJLGdCQUFnQixLQUFLLEtBQUwsQ0FBVyxDQUFYLEVBQWMsd0JBQWQsR0FDZCxvQkFEYyxHQUVkLEVBRk47QUFHQSxnQkFBSSxlQUFlLEtBQUssS0FBTCxDQUFXLENBQVgsRUFBYyx3QkFBZCxHQUNiLHNCQURhLEdBRWIsdUJBRk47QUFHQSxnQkFBSSxnQkFBZ0IsS0FBSyxLQUFMLENBQVcsQ0FBWCxFQUFjLHdCQUFkLEdBQ2QsT0FBTyxJQUFQLENBQVksVUFBWixDQURjLEdBRWQsRUFGTjs7QUFJQSxnQkFBSSxVQUNBLDBIQUNBLFlBREEsR0FFQSxlQUZBLEdBR0EsT0FBTyxJQUFQLENBQVksbUJBQVosRUFBaUMsRUFBRSxNQUFNLElBQVIsRUFBakMsQ0FIQSxHQUlBLGFBSkEsR0FLQSxXQUxBLEdBTUEsYUFOQSxHQU9BLGdHQVBBLEdBUUEsT0FBTyxJQUFQLENBQVksVUFBWixFQUF3QixFQUFFLGVBQWUsSUFBakIsRUFBeEIsQ0FSQSxHQVNBLGVBVEEsR0FVQSxJQVZBLEdBV0EsZ0JBWEEsR0FZQSxJQVpBLEdBYUEsU0FiQSxHQWNBLE9BQU8sSUFBUCxDQUFZLE9BQVosRUFBcUIsRUFBRSxlQUFlLElBQWpCLEVBQXJCLENBZEEsR0FlQSxXQWhCSjs7QUFrQkEsOEJBQWtCLE1BQWxCLENBQXlCLE9BQXpCOztBQUVBLGdCQUFJLEtBQUssS0FBTCxDQUFXLENBQVgsRUFBYyx3QkFBbEIsRUFBNEM7QUFDeEMsb0JBQUksT0FBTyxJQUFYO0FBQ0EsMkJBQ0ksVUFBVSxJQUFWLEVBQWdCLElBQWhCLEVBQXNCO0FBQ2xCLHNCQUFFLElBQUYsRUFDSyxJQURMLENBRVEsc0JBQ0ksRUFBRSxJQUFGLEVBQVEsSUFBUixDQUFhLGVBQWIsQ0FESixHQUVJLElBSlosRUFNSyxRQU5MLENBTWMsa0JBTmQsRUFPSyxJQVBMLENBUVEsT0FBTyxJQUFQLENBQVksVUFBWixFQUF3QjtBQUNwQix1Q0FBZTtBQURLLHFCQUF4QixDQVJSO0FBWUgsaUJBZEwsRUFlSSxDQWZKLEVBZ0JJLElBaEJKLEVBaUJJLElBakJKO0FBbUJBLGtCQUNJLDBCQUEwQixFQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsZUFBYixDQUQ5QixFQUVFLEdBRkYsQ0FFTSxJQUZOO0FBR0g7QUFDSjs7QUFFRCxlQUFPLE9BQVAsQ0FBZSxpQkFBZixDQUNJLEVBQUUsSUFBRixFQUFRLElBQVIsQ0FBYSx3QkFBYixDQURKLEVBRUksUUFGSjs7QUFLQTtBQUNBLFlBQUksV0FBVyxPQUFPLFFBQVAsQ0FBZ0IsUUFBaEIsRUFBZjtBQUNBLFlBQUksU0FBUyxPQUFULENBQWlCLFNBQWpCLElBQThCLENBQUMsQ0FBbkMsRUFBc0M7QUFDbEMseUNBQ0ksT0FBTyxRQUFQLENBQWdCLFFBQWhCLElBQ0ssT0FBTyxRQUFQLENBQWdCLE1BQWhCLEdBQXlCLE9BQU8sUUFBUCxDQUFnQixNQUF6QyxHQUFrRCxFQUR2RCxDQURKO0FBSUg7QUFDSixLQWxGTCxFQW1GSyxJQW5GTCxDQW1GVSxZQUFZO0FBQ2Q7QUFDQSxZQUNLLEVBQUUsSUFBRixFQUFRLE9BQVIsQ0FBZ0IsaUNBQWhCLEVBQW1ELE1BQW5ELElBQ0csQ0FESCxJQUVHLENBQUMsRUFBRSxJQUFGLEVBQVEsT0FBUixDQUFnQixpQkFBaEIsRUFBbUMsTUFGeEMsSUFHQyxFQUFFLElBQUYsRUFBUSxPQUFSLENBQWdCLGlCQUFoQixFQUFtQyxNQUFuQyxJQUNHLGlCQUNJLEVBQUUsSUFBRixFQUFRLE9BQVIsQ0FBZ0IsaUJBQWhCLEVBQW1DLENBQW5DLENBREosRUFFSSxJQUZKLEVBR0UsT0FIRixJQUdhLE1BUGpCLElBUUEsRUFBRSw0QkFBRixFQUFnQyxNQVRwQyxFQVVFO0FBQ0UsZ0JBQ0ksRUFBRSxNQUFGLEVBQVUsSUFBVixDQUFlLGVBQWYsS0FBbUMsT0FBbkMsSUFDQSxFQUFFLE1BQUYsRUFBVSxJQUFWLENBQWUsaUJBQWYsS0FBcUMsT0FGekMsRUFHRTtBQUNFLG9CQUFJLFVBQVUsRUFBRSxJQUFGLEVBQVEsSUFBUixDQUFhLGVBQWIsQ0FBZDtBQUNBLG9CQUFJLGFBQWEsT0FBTyxHQUFQLENBQVcsT0FBTyxNQUFQLENBQWMsT0FBekIsRUFBa0M7QUFDL0Msd0JBQUk7QUFEMkMsaUJBQWxDLENBQWpCO0FBR0Esb0JBQUksWUFBWSxPQUFPLEdBQVAsQ0FBVyxPQUFPLE1BQVAsQ0FBYyxhQUF6QixFQUF3QztBQUNwRCw2QkFBUztBQUQyQyxpQkFBeEMsQ0FBaEI7QUFHQSxvQkFBSSxhQUNBLHFGQUNBLE9BQU8sSUFBUCxDQUFZLDhCQUFaLENBREEsR0FFQSxVQUZBLEdBR0EsU0FIQSxHQUlBLElBSkEsR0FLQSxPQUFPLElBQVAsQ0FBWSxRQUFaLENBTEEsR0FNQSxNQVBKO0FBUUEsb0JBQUksVUFBVSxPQUFPLElBQVAsQ0FDVixxQ0FEVSxFQUVWLEVBQUUsTUFBTSxVQUFSLEVBRlUsQ0FBZDtBQUlBLGtCQUNJLCtCQUNJLEVBQUUsSUFBRixFQUFRLElBQVIsQ0FBYSxlQUFiLENBRlIsRUFHRSxNQUhGLENBR1MsT0FIVDtBQUlILGFBM0JELE1BMkJPO0FBQ0g7QUFDQSxvQkFBSSxPQUFPLEVBQUUsSUFBRixFQUFRLElBQVIsQ0FBYSxzQkFBYixDQUFYO0FBQ0Esb0JBQUksT0FBTyxJQUFQLEtBQWdCLFdBQWhCLElBQStCLFNBQVMsS0FBNUMsRUFBbUQ7QUFDL0Msd0JBQUksY0FDQSxxRkFDQSxPQUFPLElBQVAsQ0FBWSw4QkFBWixDQURBLEdBRUEsK0RBRkEsR0FHQSxPQUFPLElBQVAsQ0FBWSxVQUFaLENBSEEsR0FJQSxNQUxKO0FBTUEsd0JBQUksVUFBVSxPQUFPLElBQVAsQ0FDVixxQ0FEVSxFQUVWLEVBQUUsTUFBTSxXQUFSLEVBRlUsQ0FBZDtBQUlBLHNCQUNJLCtCQUNJLEVBQUUsSUFBRixFQUFRLElBQVIsQ0FBYSxlQUFiLENBRlIsRUFHRSxNQUhGLENBR1MsT0FIVDtBQUlILGlCQWZELE1BZU87QUFDSCwyQkFBTyxJQUFQLENBQVksaUJBQVosQ0FDSSxFQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsZUFBYixDQURKLEVBRUksRUFBRSxJQUFGLENBRko7QUFJSDtBQUNKO0FBQ0o7QUFDSixLQXJKTDs7QUF1SkEsV0FBTyxZQUFQLENBQW9CLEVBQXBCLENBQXVCLDJCQUF2QixFQUFvRCxZQUFZO0FBQzVELFVBQUUseUJBQUYsRUFBNkIsSUFBN0IsQ0FDSSxXQUFXLE9BQU8sSUFBUCxDQUFZLHFCQUFaLENBQVgsR0FBZ0QsU0FEcEQ7QUFHSCxLQUpEOztBQU1BOzs7QUFHQSxNQUFFLE1BQUYsRUFBVSxFQUFWLENBQWEsZUFBYixFQUE4Qix3QkFBOUIsRUFBd0QsVUFBVSxDQUFWLEVBQWE7QUFDakUsWUFBSSxFQUFFLElBQUYsSUFBVSxPQUFWLElBQXFCLEVBQUUsS0FBRixJQUFXLEVBQWhDLElBQXNDLEVBQUUsS0FBRixJQUFXLEVBQXJELEVBQXlEO0FBQ3JELGNBQUUsY0FBRjs7QUFFQSxnQkFBSSxpQkFBaUIsRUFBRSxFQUFFLE1BQUosRUFDaEIsT0FEZ0IsQ0FDUixJQURRLEVBRWhCLElBRmdCLENBRVgsZ0NBRlcsQ0FBckI7QUFHQSxnQkFBSSxVQUFVLGVBQWUsSUFBZixDQUFvQixlQUFwQixDQUFkOztBQUVBLGdCQUFJLGtCQUFrQixFQUNsQixxQ0FBcUMsT0FEbkIsRUFFcEIsTUFGb0IsR0FHaEIscUNBQXFDLE9BSHJCLEdBSWhCLCtCQUErQixPQUpyQztBQUtBLGNBQUUsa0JBQWtCLE9BQXBCLEVBQTZCLElBQTdCLENBQWtDLFlBQVk7QUFDMUMsa0JBQUUsSUFBRixFQUNLLFdBREwsQ0FDaUIsb0JBRGpCLEVBRUssSUFGTCxDQUVVO0FBQ0YscUNBQWlCLE9BRGY7QUFFRixrQ0FBYyxFQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsWUFBYixJQUNSLEVBQUUsSUFBRixFQUNLLElBREwsQ0FDVSxZQURWLEVBRUssT0FGTCxDQUVhLE9BQU8sSUFBUCxDQUFZLFVBQVosQ0FGYixFQUVzQyxFQUZ0QyxDQURRLEdBSVI7QUFOSixpQkFGVjtBQVVILGFBWEQ7O0FBYUEsY0FDSSxrQkFDSSxtQkFESixHQUVJLEVBQUUsSUFBRixFQUFRLElBQVIsQ0FBYSxNQUFiLENBRkosR0FHSSxJQUpSLEVBTUssUUFOTCxDQU1jLG9CQU5kLEVBT0ssSUFQTCxDQU9VO0FBQ0YsaUNBQWlCLE1BRGY7QUFFRiw4QkFBYyxPQUFPLElBQVAsQ0FBWSxtQkFBWixFQUFpQztBQUMzQywwQkFBTSxFQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsTUFBYjtBQURxQyxpQkFBakM7QUFGWixhQVBWOztBQWNBLDJCQUNLLElBREwsQ0FDVSx3QkFEVixFQUVLLElBRkwsQ0FFVSxzQkFGVixFQUdLLElBSEwsQ0FHVSxFQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsTUFBYixDQUhWOztBQUtBLGdCQUFJLHFCQUFxQixFQUFFLDJCQUEyQixPQUE3QixFQUNwQixNQURvQixHQUVuQixFQUFFLDJCQUEyQixPQUE3QixDQUZtQixHQUduQixFQUFFLHFCQUFxQixPQUF2QixDQUhOOztBQUtBLCtCQUFtQixHQUFuQixDQUF1QixFQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsTUFBYixDQUF2Qjs7QUFFQSxnQkFBSSxDQUFDLEVBQUUsSUFBRixFQUFRLFFBQVIsQ0FBaUIsU0FBakIsQ0FBTCxFQUFrQztBQUM5QiwrQkFDSyxJQURMLENBQ1Usd0JBRFYsRUFFSyxRQUZMLENBRWMsU0FGZDtBQUdILGFBSkQsTUFJTztBQUNILCtCQUNLLElBREwsQ0FDVSx3QkFEVixFQUVLLFdBRkwsQ0FFaUIsU0FGakI7QUFHSDs7QUFFRDtBQUNBLGNBQUUseUJBQUYsRUFBNkIsSUFBN0I7QUFDQSxjQUFFLG9DQUFGLEVBQXdDLEtBQXhDO0FBQ0gsU0FqRUQsTUFpRU8sSUFBSSxFQUFFLEtBQUYsSUFBVyxFQUFmLEVBQW1CO0FBQ3RCO0FBQ0EsY0FBRSxjQUFGO0FBQ0EsY0FBRSxJQUFGLEVBQVEsT0FBUixDQUFnQixJQUFoQixFQUFzQixJQUF0QixDQUEyQixJQUEzQixFQUFpQyxRQUFqQyxDQUEwQyxHQUExQyxFQUErQyxLQUEvQztBQUNILFNBSk0sTUFJQSxJQUFJLEVBQUUsS0FBRixJQUFXLEVBQWYsRUFBbUI7QUFDdEI7QUFDQSxjQUFFLGNBQUY7O0FBRUE7QUFDQSxnQkFBSSxFQUFFLElBQUYsRUFBUSxPQUFSLENBQWdCLElBQWhCLEVBQXNCLEVBQXRCLENBQXlCLGNBQXpCLENBQUosRUFBOEM7QUFDMUMsa0JBQUUsSUFBRixFQUFRLE9BQVIsQ0FBZ0IsSUFBaEIsRUFBc0IsSUFBdEIsQ0FBMkIsaUJBQTNCLEVBQThDLEtBQTlDO0FBQ0gsYUFGRCxNQUVPO0FBQ0gsa0JBQUUsSUFBRixFQUFRLE9BQVIsQ0FBZ0IsSUFBaEIsRUFBc0IsSUFBdEIsQ0FBMkIsSUFBM0IsRUFBaUMsUUFBakMsQ0FBMEMsR0FBMUMsRUFBK0MsS0FBL0M7QUFDSDtBQUNKO0FBQ0osS0FqRkQ7O0FBbUZBLE1BQUUsMEJBQUYsRUFBOEIsRUFBOUIsQ0FBaUMsU0FBakMsRUFBNEMsVUFBVSxDQUFWLEVBQWE7QUFDckQsWUFBSSxFQUFFLEtBQUYsSUFBVyxFQUFmLEVBQW1CO0FBQ2Y7QUFDQSxjQUFFLGNBQUY7QUFDQSxnQkFBSSxXQUFXLEVBQUUsSUFBRixFQUFRLElBQVIsQ0FBYSxVQUFiLENBQWY7QUFDQSxjQUFFLFFBQVEsUUFBVixFQUNLLFFBREwsQ0FDYyxJQURkLEVBRUssS0FGTCxHQUdLLFFBSEwsQ0FHYyxHQUhkLEVBSUssS0FKTDtBQUtIO0FBQ0osS0FYRDs7QUFhQTtBQUNBLE1BQUUsdUNBQUYsRUFDSyxFQURMLENBQ1EsdUJBRFIsRUFDaUMsWUFBWTtBQUNyQyxVQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsR0FBYixFQUFrQixJQUFsQixDQUF1QixVQUF2QixFQUFtQyxHQUFuQztBQUNILEtBSEwsRUFJSyxFQUpMLENBSVEsdUJBSlIsRUFJaUMsWUFBWTtBQUNyQyxZQUFJLFVBQVUsRUFBRSxJQUFGLEVBQVEsSUFBUixDQUFhLGVBQWIsQ0FBZDtBQUNBLFVBQUUsSUFBRixFQUFRLElBQVIsQ0FBYSxHQUFiLEVBQWtCLElBQWxCLENBQXVCLFVBQXZCLEVBQW1DLElBQW5DO0FBQ0EsVUFBRSwwQkFBMEIsT0FBNUIsRUFBcUMsT0FBckMsQ0FBNkMsUUFBN0M7QUFDSCxLQVJMOztBQVVBO0FBQ0EsTUFBRSw2QkFBRixFQUFpQyxFQUFqQyxDQUFvQyxRQUFwQyxFQUE4QyxZQUFZO0FBQ3RELFVBQUUsSUFBRixFQUFRLElBQVIsQ0FBYSx3QkFBYixFQUF1QyxLQUF2QztBQUNILEtBRkQ7QUFHSCxDQWhSRDs7QUFrUkE7OztBQUdBLEVBQUUsWUFBWTtBQUNWO0FBQ0EsTUFBRSx5Q0FBRixFQUE2QyxFQUE3QyxDQUNJLE9BREosRUFFSSxZQUZKLEVBR0ksVUFBVSxDQUFWLEVBQWE7QUFDVCxZQUFJLFVBQVUsRUFBRSxFQUFFLE1BQUosQ0FBZDtBQUNBLFlBQUksYUFBYSxRQUFRLE9BQVIsQ0FBZ0IseUJBQWhCLENBQWpCO0FBQ0EsWUFBSSxTQUFTLFFBQVEsSUFBUixDQUFhLE9BQWIsQ0FBYjs7QUFFQSx5QkFBaUIsVUFBakIsRUFBNkIsTUFBN0IsRUFBcUMsS0FBckM7QUFDSCxLQVRMOztBQVlBO0FBQ0EsTUFBRSxNQUFGLEVBQVUsRUFBVixDQUFhLG9CQUFiLEVBQW1DLFVBQVUsQ0FBVixFQUFhLElBQWIsRUFBbUI7QUFDbEQsYUFBSyxJQUFJLE9BQVQsSUFBb0IsS0FBSyxXQUF6QixFQUFzQztBQUNsQyxnQkFBSSxhQUFhLEVBQ2IsbURBQ0ksT0FESixHQUVJLElBSFMsQ0FBakI7QUFLQSxnQkFBSSxTQUFTLEtBQUssV0FBTCxDQUFpQixPQUFqQixDQUFiOztBQUVBLDhCQUFrQixVQUFsQixFQUE4QixNQUE5QixFQUFzQztBQUNsQywyQkFBVyxJQUR1QjtBQUVsQyx5QkFBUztBQUZ5QixhQUF0QztBQUlIO0FBQ0QsVUFBRSxJQUFGLEVBQVEsT0FBUixDQUFnQixtQkFBaEIsRUFka0QsQ0FjWjtBQUN6QyxLQWZEOztBQWlCQTtBQUNBLE1BQUUsb0RBQUYsRUFBd0QsS0FBeEQsQ0FBOEQsVUFBVSxDQUFWLEVBQWE7QUFDdkUsWUFBSSxRQUFRLEVBQUUsSUFBRixDQUFaO0FBQ0EsWUFBSSxhQUFhLE1BQU0sT0FBTixDQUFjLHlCQUFkLENBQWpCO0FBQ0EsWUFBSSxhQUFhLFdBQVcsSUFBWCxDQUFnQixhQUFoQixDQUFqQjs7QUFFQSxtQkFBVyxRQUFYLENBQW9CLGFBQXBCOztBQUVBLFlBQUkscUJBQXFCLE1BQU0sSUFBTixDQUFXLE9BQVgsQ0FBekI7QUFDQSxrQkFBVSxVQUFWLEVBQXNCLGtCQUF0QixFQUEwQztBQUN0Qyx1QkFBVyxLQUQyQjtBQUV0QyxxQkFBUztBQUY2QixTQUExQztBQUlILEtBWkQ7O0FBY0EsTUFBRSx5Q0FBRixFQUE2QyxFQUE3QyxDQUFnRCxZQUFoRCxFQUE4RCxZQUFZO0FBQ3RFLFlBQUksUUFBUSxFQUFFLElBQUYsQ0FBWjtBQUNBLFlBQUksYUFBYSxNQUFNLE9BQU4sQ0FBYyx5QkFBZCxDQUFqQjtBQUNBLFlBQUksYUFBYSxXQUFXLElBQVgsQ0FBZ0IsYUFBaEIsQ0FBakI7QUFDQSxZQUFJLGdCQUFnQixhQUFhLENBQWpDOztBQUVBLFlBQUksQ0FBQyxhQUFMLEVBQW9CO0FBQ2hCLHVCQUFXLFdBQVgsQ0FBdUIsYUFBdkI7O0FBRUEsc0JBQVUsVUFBVixFQUFzQixXQUFXLElBQVgsQ0FBZ0IsZUFBaEIsQ0FBdEIsRUFBd0Q7QUFDcEQsMkJBQVcsS0FEeUM7QUFFcEQseUJBQVM7QUFGMkMsYUFBeEQ7QUFJSCxTQVBELE1BT087QUFDSCxzQkFBVSxVQUFWLEVBQXNCLFVBQXRCLEVBQWtDO0FBQzlCLDJCQUFXLEtBRG1CO0FBRTlCLHlCQUFTO0FBRnFCLGFBQWxDO0FBSUg7QUFDSixLQW5CRDs7QUFxQkEsV0FBTyxZQUFQLENBQW9CLEVBQXBCLENBQXVCLGlCQUF2QixFQUEwQyxZQUFZO0FBQ2xELFlBQUksT0FDQSwyQkFDQSxPQUFPLEdBQVAsQ0FBVyxPQUFPLE1BQVAsQ0FBYyxjQUF6QixDQURBLEdBRUEsaUJBRkEsR0FHQSxPQUFPLElBQVAsQ0FBWSxzQkFBWixDQUhBLEdBSUEsTUFMSjtBQU1BLFlBQUksT0FBTyxPQUFYLEVBQ0ksT0FBTyxPQUFQLENBQWUsSUFBZixDQUNJLGFBQ0ksT0FBTyxJQUFQLENBQVksY0FBWixDQURKLEdBRUksWUFGSixHQUdJLE9BQU8sSUFBUCxDQUFZLDJCQUFaLEVBQXlDLEVBQUUsTUFBTSxJQUFSLEVBQXpDLENBSlIsRUFLSSxPQUxKO0FBT1AsS0FmRDs7QUFpQkEsV0FBTyxZQUFQLENBQW9CLEVBQXBCLENBQXVCLG9CQUF2QixFQUE2QyxZQUFZO0FBQ3JELFlBQUksT0FDQSwyQkFDQSxPQUFPLEdBQVAsQ0FBVyxPQUFPLE1BQVAsQ0FBYyxjQUF6QixDQURBLEdBRUEsaUJBRkEsR0FHQSxPQUFPLElBQVAsQ0FBWSxzQkFBWixDQUhBLEdBSUEsTUFMSjtBQU1BLFlBQUksT0FBTyxPQUFYLEVBQ0ksT0FBTyxPQUFQLENBQWUsSUFBZixDQUNJLGFBQ0ksT0FBTyxJQUFQLENBQVksY0FBWixDQURKLEdBRUksWUFGSixHQUdJLE9BQU8sSUFBUCxDQUFZLDJCQUFaLEVBQXlDLEVBQUUsTUFBTSxJQUFSLEVBQXpDLENBSlIsRUFLSSxPQUxKO0FBT1AsS0FmRDtBQWdCSCxDQXJHRDs7QUF1R0EsRUFBRSxRQUFGLEVBQVksRUFBWixDQUFlLE9BQWYsRUFBd0IsbUJBQXhCLEVBQTZDLFVBQVUsQ0FBVixFQUFhO0FBQ3RELE1BQUUsY0FBRjtBQUNILENBRkQ7O0FBSUEsRUFBRSxRQUFGLEVBQVksS0FBWixDQUFrQixZQUFZO0FBQzFCLE1BQUUsUUFBRixFQUFZLEVBQVosQ0FDSSxPQURKLEVBRUksdUVBRkosRUFHSSxZQUFZO0FBQ1IsWUFBSSxzQkFBc0IsT0FBTyxRQUFQLENBQWdCLE1BQWhCLENBQXVCLE9BQXZCLENBQ3RCLHdDQURzQixFQUV0QixVQUFVLEtBQVYsRUFBaUI7QUFDYixnQkFBSSxXQUFXLE1BQU0sTUFBTSxNQUFOLEdBQWUsQ0FBckIsQ0FBZjtBQUNBLGdCQUFJLGFBQWEsR0FBakIsRUFBc0I7QUFDbEI7QUFDQSx1QkFBTyxNQUFNLENBQU4sQ0FBUDtBQUNILGFBSEQsTUFHTztBQUNIO0FBQ0EsdUJBQU8sRUFBUDtBQUNIO0FBQ0osU0FYcUIsQ0FBMUI7O0FBY0EsWUFBSSxhQUNBLE9BQU8sUUFBUCxDQUFnQixRQUFoQixHQUNBLE9BQU8sUUFBUCxDQUFnQixNQUFoQixDQUF1QixPQUF2QixDQUNJLHFDQURKLEVBRUksRUFGSixDQUZKO0FBTUEsWUFBSSxTQUFTLEVBQWI7QUFDQSxZQUFJLEVBQUUsSUFBRixFQUFRLFFBQVIsQ0FBaUIsV0FBakIsQ0FBSixFQUFtQztBQUMvQixxQkFDSSxVQUNBLEVBQUUsSUFBRixFQUFRLE1BQVIsR0FBaUIsSUFBakIsQ0FBc0IsZUFBdEIsQ0FEQSxHQUVBLEdBRkEsR0FHQSxFQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsT0FBYixDQUpKLENBRCtCLENBS0o7QUFDOUIsU0FORCxNQU1PO0FBQ0gscUJBQ0ksRUFBRSxJQUFGLEVBQVEsSUFBUixDQUFhLGFBQWIsSUFDQSxHQURBLEdBRUEsRUFBRSxJQUFGLEVBQVEsSUFBUixDQUFhLGVBQWIsQ0FISjtBQUlIO0FBQ0QsWUFBSSxzQkFBc0IsT0FBTyxHQUFQLENBQ3RCLE9BQU8sTUFBUCxDQUFjLG9CQURRLEVBRXRCLEVBQUUsU0FBUyxVQUFYLEVBQXVCLFFBQVEsTUFBL0IsRUFGc0IsQ0FBMUI7QUFJQSxVQUFFLGtCQUFGLEVBQXNCLElBQXRCLENBQTJCLE1BQTNCLEVBQW1DLG1CQUFuQztBQUNBLFVBQUUsa0JBQUYsRUFBc0IsVUFBdEIsQ0FBaUMsUUFBakMsRUFBMkMsTUFBM0M7QUFDSCxLQTNDTDs7QUE4Q0E7QUFDQSxNQUFFLGtCQUFGLEVBQXNCLEVBQXRCLENBQXlCLG9CQUF6QixFQUErQyxZQUFZO0FBQ3ZELFlBQUksWUFBWSxFQUFFLHlCQUFGLENBQWhCO0FBQ0Esa0JBQVUsSUFBVixDQUFlLGFBQWYsRUFBOEIsSUFBOUIsRUFBb0MsV0FBcEMsQ0FBZ0QsYUFBaEQ7QUFDQSxrQkFBVSxTQUFWLEVBQXFCLEtBQUssS0FBTCxDQUFXLFVBQVUsSUFBVixDQUFlLGVBQWYsQ0FBWCxDQUFyQjtBQUNILEtBSkQ7QUFLSCxDQXJERDs7QUF1REE7QUFDQSxFQUFFLFFBQUYsRUFBWSxFQUFaLENBQWUsT0FBZixFQUF3Qix1QkFBeEIsRUFBaUQsWUFBWTtBQUN6RCxNQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsR0FBYixFQUFrQixLQUFsQjtBQUNILENBRkQ7O0FBSUEsT0FBTywwQkFBUCxHQUFvQyxVQUFVLEtBQVYsRUFBaUI7QUFDakQsWUFBUSxTQUFTLEVBQWpCO0FBQ0EsTUFBRSxxQkFBRixFQUF5QixJQUF6QixDQUE4QixZQUFZO0FBQ3RDLFlBQUksRUFBRSxJQUFGLEVBQVEsSUFBUixDQUFhLHVCQUFiLEtBQXlDLEVBQTdDLEVBQWlEO0FBQzdDLGNBQUUsSUFBRixFQUFRLElBQVIsQ0FDSSxTQURKLEVBRUksNEJBQ0ksRUFBRSxJQUFGLEVBQVEsSUFBUixDQUFhLGlCQUFiLENBREosR0FFSSxJQUZKLEdBR0ksRUFBRSxJQUFGLEVBQVEsSUFBUixDQUFhLGtCQUFiLENBSEosR0FJSSxJQUpKLEdBS0ksRUFBRSxJQUFGLEVBQVEsSUFBUixDQUFhLGlCQUFiLENBTEosR0FNSSxJQU5KLEdBT0ksRUFBRSxJQUFGLEVBQVEsSUFBUixDQUFhLHVCQUFiLENBUEosR0FRSSxJQVZSO0FBWUg7O0FBRUQsWUFDSSxFQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsa0JBQWIsS0FBb0MsRUFBcEMsSUFDQSxFQUFFLElBQUYsRUFBUSxJQUFSLENBQWEsa0JBQWIsS0FBb0MsQ0FGeEMsRUFHRTtBQUNFLGNBQUUsa0JBQUYsRUFBc0IsUUFBdEIsQ0FBK0IsUUFBL0I7QUFDQSxjQUFFLG1CQUFGLEVBQXVCLElBQXZCLENBQ0ksaUJBREosRUFFSSwwQkFGSjtBQUlIO0FBQ0osS0ExQkQ7O0FBNEJBLE1BQUUsNkJBQUYsRUFBaUMsSUFBakMsQ0FDSSxTQURKLEVBRUksNEJBQ0ksTUFBTSxVQURWLEdBRUksSUFGSixHQUdJLE1BQU0sV0FIVixHQUlJLElBSkosR0FLSSxNQUFNLFVBTFYsR0FNSSxJQU5KLEdBT0ksTUFBTSxnQkFQVixHQVFJLElBVlI7QUFZSCxDQTFDRDs7Ozs7QUNsbkVBOztBQUVBLElBQUksVUFBVSxPQUFPLElBQXJCLEVBQTJCO0FBQ3ZCLEtBQUMsVUFBVSxDQUFWLEVBQWE7QUFDVjs7QUFDQSxVQUFFLFlBQVk7QUFDVixjQUFFLGVBQUYsRUFDSyxLQURMLENBQ1csWUFBWTtBQUNmLG9CQUFJLFFBQVEsRUFBRSxJQUFGLENBQVo7QUFDQSxvQkFBSSxNQUFNLEdBQU4sT0FBZ0IsTUFBTSxJQUFOLENBQVcsYUFBWCxDQUFwQixFQUErQztBQUMzQywwQkFBTSxHQUFOLENBQVUsRUFBVixFQUFjLFdBQWQsQ0FBMEIsYUFBMUI7QUFDSDtBQUNKLGFBTkwsRUFPSyxJQVBMLENBT1UsWUFBWTtBQUNkLG9CQUFJLFFBQVEsRUFBRSxJQUFGLENBQVo7QUFDQSxvQkFDSSxNQUFNLEdBQU4sT0FBZ0IsRUFBaEIsSUFDQSxNQUFNLEdBQU4sT0FBZ0IsTUFBTSxJQUFOLENBQVcsYUFBWCxDQUZwQixFQUdFO0FBQ0UsMEJBQ0ssUUFETCxDQUNjLGFBRGQsRUFFSyxHQUZMLENBRVMsTUFBTSxJQUFOLENBQVcsYUFBWCxDQUZUO0FBR0g7QUFDSixhQWpCTCxFQWtCSyxJQWxCTCxHQW1CSyxPQW5CTCxDQW1CYSxNQW5CYixFQW9CSyxNQXBCTCxDQW9CWSxZQUFZO0FBQ2hCLGtCQUFFLElBQUYsRUFDSyxJQURMLENBQ1UsZUFEVixFQUVLLElBRkwsQ0FFVSxZQUFZO0FBQ2Qsd0JBQUksUUFBUSxFQUFFLElBQUYsQ0FBWjtBQUNBLHdCQUFJLE1BQU0sR0FBTixPQUFnQixNQUFNLElBQU4sQ0FBVyxhQUFYLENBQXBCLEVBQStDO0FBQzNDLDhCQUFNLEdBQU4sQ0FBVSxFQUFWO0FBQ0g7QUFDSixpQkFQTDtBQVFILGFBN0JMO0FBOEJILFNBL0JEO0FBZ0NILEtBbENELEVBa0NHLE1BbENIO0FBbUNIOzs7OztlQ3RDa0IsUUFBUSxVQUFSLEM7SUFBWCxNLFlBQUEsTTs7QUFFUixPQUFPLE9BQVAsR0FBaUI7QUFDYixZQUFRLE9BQU8sTUFBUCxDQUFjLE1BQWQ7QUFESyxDQUFqQjs7O0FDRkE7O0FBQ0EsT0FBTyxjQUFQLENBQXNCLE9BQXRCLEVBQStCLFlBQS9CLEVBQTZDLEVBQUUsT0FBTyxJQUFULEVBQTdDO0FBQ0EsUUFBUSxNQUFSLEdBQWlCLEtBQUssQ0FBdEI7QUFDQSxRQUFRLE1BQVIsR0FBaUI7QUFDYixVQUFNLEdBRE87QUFFYixZQUFRLFNBRks7QUFHYixZQUFRLFNBSEs7QUFJYixrQkFBYyxlQUpEO0FBS2Isb0JBQWdCLGtCQUxIO0FBTWIsb0JBQWdCLDJCQU5IO0FBT2Isd0JBQW9CLCtCQVBQO0FBUWIsYUFBUyxZQVJJO0FBU2IsaUJBQWEsaUJBVEE7QUFVYixvQkFBZ0Isb0JBVkg7QUFXYixnQ0FBNEIsdUNBWGY7QUFZYixlQUFXLGFBWkU7QUFhYix5QkFBcUIseUJBYlI7QUFjYixtQkFBZSxrQ0FkRjtBQWViLGlCQUFhLHdCQWZBO0FBZ0JiLHVCQUFtQixtQ0FoQk47QUFpQmIsaUJBQWEsd0JBakJBO0FBa0JiLDRCQUF3QixvQ0FsQlg7QUFtQmIscUJBQWlCLDhCQW5CSjtBQW9CYixtQkFBZSxzQkFwQkY7QUFxQmIsb0JBQWdCLGFBckJIO0FBc0JiLG1CQUFlLDRCQXRCRjtBQXVCYixzQkFBa0IsK0JBdkJMO0FBd0JiLCtCQUEyQixzQ0F4QmQ7QUF5QmIscUJBQWlCLDhCQXpCSjtBQTBCYixxQkFBaUIsbUJBMUJKO0FBMkJiLHFCQUFpQix5QkEzQko7QUE0QmIsMkJBQXVCLHFEQTVCVjtBQTZCYiwyQkFBdUIseUNBN0JWO0FBOEJiLHdCQUFvQixzQ0E5QlA7QUErQmIsb0JBQWdCLGtCQS9CSDtBQWdDYixpQkFBYSxlQWhDQTtBQWlDYixrQkFBYyxnQkFqQ0Q7QUFrQ2Isd0JBQW9CLHVCQWxDUDtBQW1DYixrQkFBYyxnQkFuQ0Q7QUFvQ2IscUJBQWlCLG1CQXBDSjtBQXFDYixxQkFBaUIsNkJBckNKO0FBc0NiLG9CQUFnQixrQkF0Q0g7QUF1Q2IsMEJBQXNCLDZCQXZDVDtBQXdDYixtQkFBZSxrQkF4Q0Y7QUF5Q2IsMkJBQXVCLDJCQXpDVjtBQTBDYixvQkFBZ0IsbUJBMUNIO0FBMkNiLHFCQUFpQiwyQkEzQ0o7QUE0Q2IsV0FBTztBQUNILGdCQUFRLHdCQURMO0FBRUgsc0JBQWMsc0JBRlg7QUFHSCxnQ0FBd0IsNEJBSHJCO0FBSUgsa0JBQVU7QUFKUCxLQTVDTTtBQWtEYiw4QkFBMEIsNkJBbERiO0FBbURiLG9DQUFnQyxxQ0FuRG5CO0FBb0RiLGlCQUFhLGVBcERBO0FBcURiLHlCQUFxQix1Q0FyRFI7QUFzRGIsWUFBUSxTQXRESztBQXVEYixhQUFTLFdBdkRJO0FBd0RiLHFCQUFpQix1QkF4REo7QUF5RGIsZ0JBQVkscUJBekRDO0FBMERiLG1CQUFlLDJCQTFERjtBQTJEYix3QkFBb0IsdUJBM0RQO0FBNERiLGlCQUFhLFdBNURBO0FBNkRiLGlCQUFhLGNBN0RBO0FBOERiLHFCQUFpQixtQkE5REo7QUErRGIsYUFBUyx5QkEvREk7QUFnRWIscUJBQWlCLGtDQWhFSjtBQWlFYixvQkFBZ0Isa0JBakVIO0FBa0ViLFVBQU07QUFDRixpQkFBUztBQUNMLGlCQUFLLGdCQURBO0FBRUwsb0JBQVEsc0JBRkg7QUFHTCx1QkFBVztBQUhOLFNBRFA7QUFNRixxQkFBYTtBQUNULHFCQUFTO0FBREEsU0FOWDtBQVNGLGVBQU87QUFDSCxtQkFBTyxhQURKO0FBRUgscUJBQVMsK0JBRk47QUFHSCwrQkFBbUIsbUNBSGhCO0FBSUgsOEJBQWtCLHdDQUpmO0FBS0gsMEJBQWM7QUFMWCxTQVRMO0FBZ0JGLGtCQUFVO0FBQ04sZ0NBQW9CLHlCQURkO0FBRU4saUNBQXFCO0FBRmYsU0FoQlI7QUFvQkYsZ0JBQVE7QUFDSixnQ0FBb0I7QUFEaEIsU0FwQk47QUF1QkYsd0JBQWdCO0FBQ1osbUJBQU8sc0JBREs7QUFFWixtQkFBTyxnQ0FGSztBQUdaLHNCQUFVLCtCQUhFO0FBSVosc0JBQVE7QUFKSSxTQXZCZDtBQTZCRixlQUFPO0FBQ0gsaUJBQUs7QUFERixTQTdCTDtBQWdDRixtQkFBVztBQUNQLGlCQUFLLDZCQURFO0FBRVAsaUNBQXFCO0FBRmQsU0FoQ1Q7QUFvQ0YscUJBQWE7QUFDVCxvQkFBUTtBQUNKLHVCQUFPO0FBREg7QUFEQyxTQXBDWDtBQXlDRixhQUFLO0FBQ0QsbUJBQU87QUFDSCwwQkFBVSwyQkFEUDtBQUVILHdCQUFRLHlCQUZMO0FBR0gsNEJBQVk7QUFIVCxhQUROO0FBTUQsaUJBQUs7QUFDRCwyQkFBVztBQURWLGFBTko7QUFTRCxtQkFBTztBQUNILDBCQUFVLDJCQURQO0FBRUgsNEJBQVk7QUFGVCxhQVROO0FBYUQsb0JBQVE7QUFiUCxTQXpDSDtBQXdERiw2QkFBcUI7QUFDakIsaUJBQUssc0JBRFk7QUFFakIscUJBQVMseUJBRlE7QUFHakIsNkJBQWlCO0FBSEE7QUF4RG5CLEtBbEVPO0FBZ0liLFlBQVE7QUFDSixhQUFLO0FBQ0QsNkJBQWlCO0FBRGhCO0FBREQsS0FoSUs7QUFxSWIsc0JBQWtCLG1CQXJJTDtBQXNJYixvQkFBZ0IsYUF0SUg7QUF1SWIsZ0JBQVksU0F2SUM7QUF3SWIsaUJBQWEsY0F4SUE7QUF5SWIsb0JBQWdCLGFBeklIO0FBMEliLGFBQVMsTUExSUk7QUEySWIsMEJBQXNCO0FBQ2xCLGVBQU8seUJBRFc7QUFFbEIsYUFBSyx1QkFGYTtBQUdsQix5QkFBaUIsNEJBSEM7QUFJbEIsNkJBQXFCLGlEQUpIO0FBS2xCLGtCQUFVO0FBTFEsS0EzSVQ7QUFrSmIsU0FBSztBQUNELGlCQUFTLGNBRFI7QUFFRCxtQkFBVztBQUNQLHVCQUFXO0FBREosU0FGVjtBQUtELGdCQUFRO0FBQ0osdUJBQVcsK0RBRFA7QUFFSixzQkFBVTtBQUZOO0FBTFAsS0FsSlE7QUE0SmIsWUFBUTtBQUNKLHdCQUFnQix5QkFEWjtBQUVKLGVBQU87QUFGSCxLQTVKSztBQWdLYixTQUFLO0FBQ0QsZ0JBQVEsZUFEUDtBQUVELGFBQUssYUFGSjtBQUdELGVBQU8sU0FITjtBQUlELGFBQUs7QUFDRCxzQkFBVSw2QkFEVDtBQUVELHVCQUFXLHVCQUZWO0FBR0Qsa0JBQU0sa0JBSEw7QUFJRCwwQkFBYywyQkFKYjtBQUtELDJCQUFlO0FBTGQsU0FKSjtBQVdELGdCQUFRO0FBWFA7QUFoS1EsQ0FBakI7O0FBK0tBOztBQUVBIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24oKXtmdW5jdGlvbiByKGUsbix0KXtmdW5jdGlvbiBvKGksZil7aWYoIW5baV0pe2lmKCFlW2ldKXt2YXIgYz1cImZ1bmN0aW9uXCI9PXR5cGVvZiByZXF1aXJlJiZyZXF1aXJlO2lmKCFmJiZjKXJldHVybiBjKGksITApO2lmKHUpcmV0dXJuIHUoaSwhMCk7dmFyIGE9bmV3IEVycm9yKFwiQ2Fubm90IGZpbmQgbW9kdWxlICdcIitpK1wiJ1wiKTt0aHJvdyBhLmNvZGU9XCJNT0RVTEVfTk9UX0ZPVU5EXCIsYX12YXIgcD1uW2ldPXtleHBvcnRzOnt9fTtlW2ldWzBdLmNhbGwocC5leHBvcnRzLGZ1bmN0aW9uKHIpe3ZhciBuPWVbaV1bMV1bcl07cmV0dXJuIG8obnx8cil9LHAscC5leHBvcnRzLHIsZSxuLHQpfXJldHVybiBuW2ldLmV4cG9ydHN9Zm9yKHZhciB1PVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmUsaT0wO2k8dC5sZW5ndGg7aSsrKW8odFtpXSk7cmV0dXJuIG99cmV0dXJuIHJ9KSgpIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgb2JqZWN0QXNzaWduID0gcmVxdWlyZSgnb2JqZWN0LWFzc2lnbicpO1xuXG4vLyBjb21wYXJlIGFuZCBpc0J1ZmZlciB0YWtlbiBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL2Jsb2IvNjgwZTllNWU0ODhmMjJhYWMyNzU5OWE1N2RjODQ0YTYzMTU5MjhkZC9pbmRleC5qc1xuLy8gb3JpZ2luYWwgbm90aWNlOlxuXG4vKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG5mdW5jdGlvbiBjb21wYXJlKGEsIGIpIHtcbiAgaWYgKGEgPT09IGIpIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuXG4gIHZhciB4ID0gYS5sZW5ndGg7XG4gIHZhciB5ID0gYi5sZW5ndGg7XG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgeCA9IGFbaV07XG4gICAgICB5ID0gYltpXTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkge1xuICAgIHJldHVybiAtMTtcbiAgfVxuICBpZiAoeSA8IHgpIHtcbiAgICByZXR1cm4gMTtcbiAgfVxuICByZXR1cm4gMDtcbn1cbmZ1bmN0aW9uIGlzQnVmZmVyKGIpIHtcbiAgaWYgKGdsb2JhbC5CdWZmZXIgJiYgdHlwZW9mIGdsb2JhbC5CdWZmZXIuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICByZXR1cm4gZ2xvYmFsLkJ1ZmZlci5pc0J1ZmZlcihiKTtcbiAgfVxuICByZXR1cm4gISEoYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyKTtcbn1cblxuLy8gYmFzZWQgb24gbm9kZSBhc3NlcnQsIG9yaWdpbmFsIG5vdGljZTpcbi8vIE5COiBUaGUgVVJMIHRvIHRoZSBDb21tb25KUyBzcGVjIGlzIGtlcHQganVzdCBmb3IgdHJhZGl0aW9uLlxuLy8gICAgIG5vZGUtYXNzZXJ0IGhhcyBldm9sdmVkIGEgbG90IHNpbmNlIHRoZW4sIGJvdGggaW4gQVBJIGFuZCBiZWhhdmlvci5cblxuLy8gaHR0cDovL3dpa2kuY29tbW9uanMub3JnL3dpa2kvVW5pdF9UZXN0aW5nLzEuMFxuLy9cbi8vIFRISVMgSVMgTk9UIFRFU1RFRCBOT1IgTElLRUxZIFRPIFdPUksgT1VUU0lERSBWOCFcbi8vXG4vLyBPcmlnaW5hbGx5IGZyb20gbmFyd2hhbC5qcyAoaHR0cDovL25hcndoYWxqcy5vcmcpXG4vLyBDb3B5cmlnaHQgKGMpIDIwMDkgVGhvbWFzIFJvYmluc29uIDwyODBub3J0aC5jb20+XG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgJ1NvZnR3YXJlJyksIHRvXG4vLyBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICdBUyBJUycsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTlxuLy8gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTlxuLy8gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciB1dGlsID0gcmVxdWlyZSgndXRpbC8nKTtcbnZhciBoYXNPd24gPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xudmFyIHBTbGljZSA9IEFycmF5LnByb3RvdHlwZS5zbGljZTtcbnZhciBmdW5jdGlvbnNIYXZlTmFtZXMgPSAoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24gZm9vKCkge30ubmFtZSA9PT0gJ2Zvbyc7XG59KCkpO1xuZnVuY3Rpb24gcFRvU3RyaW5nIChvYmopIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmopO1xufVxuZnVuY3Rpb24gaXNWaWV3KGFycmJ1Zikge1xuICBpZiAoaXNCdWZmZXIoYXJyYnVmKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIGdsb2JhbC5BcnJheUJ1ZmZlciAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyA9PT0gJ2Z1bmN0aW9uJykge1xuICAgIHJldHVybiBBcnJheUJ1ZmZlci5pc1ZpZXcoYXJyYnVmKTtcbiAgfVxuICBpZiAoIWFycmJ1Zikge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICBpZiAoYXJyYnVmIGluc3RhbmNlb2YgRGF0YVZpZXcpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICBpZiAoYXJyYnVmLmJ1ZmZlciAmJiBhcnJidWYuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gZmFsc2U7XG59XG4vLyAxLiBUaGUgYXNzZXJ0IG1vZHVsZSBwcm92aWRlcyBmdW5jdGlvbnMgdGhhdCB0aHJvd1xuLy8gQXNzZXJ0aW9uRXJyb3IncyB3aGVuIHBhcnRpY3VsYXIgY29uZGl0aW9ucyBhcmUgbm90IG1ldC4gVGhlXG4vLyBhc3NlcnQgbW9kdWxlIG11c3QgY29uZm9ybSB0byB0aGUgZm9sbG93aW5nIGludGVyZmFjZS5cblxudmFyIGFzc2VydCA9IG1vZHVsZS5leHBvcnRzID0gb2s7XG5cbi8vIDIuIFRoZSBBc3NlcnRpb25FcnJvciBpcyBkZWZpbmVkIGluIGFzc2VydC5cbi8vIG5ldyBhc3NlcnQuQXNzZXJ0aW9uRXJyb3IoeyBtZXNzYWdlOiBtZXNzYWdlLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbDogYWN0dWFsLFxuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkOiBleHBlY3RlZCB9KVxuXG52YXIgcmVnZXggPSAvXFxzKmZ1bmN0aW9uXFxzKyhbXlxcKFxcc10qKVxccyovO1xuLy8gYmFzZWQgb24gaHR0cHM6Ly9naXRodWIuY29tL2xqaGFyYi9mdW5jdGlvbi5wcm90b3R5cGUubmFtZS9ibG9iL2FkZWVlZWM4YmZjYzYwNjhiMTg3ZDdkOWZiM2Q1YmIxZDNhMzA4OTkvaW1wbGVtZW50YXRpb24uanNcbmZ1bmN0aW9uIGdldE5hbWUoZnVuYykge1xuICBpZiAoIXV0aWwuaXNGdW5jdGlvbihmdW5jKSkge1xuICAgIHJldHVybjtcbiAgfVxuICBpZiAoZnVuY3Rpb25zSGF2ZU5hbWVzKSB7XG4gICAgcmV0dXJuIGZ1bmMubmFtZTtcbiAgfVxuICB2YXIgc3RyID0gZnVuYy50b1N0cmluZygpO1xuICB2YXIgbWF0Y2ggPSBzdHIubWF0Y2gocmVnZXgpO1xuICByZXR1cm4gbWF0Y2ggJiYgbWF0Y2hbMV07XG59XG5hc3NlcnQuQXNzZXJ0aW9uRXJyb3IgPSBmdW5jdGlvbiBBc3NlcnRpb25FcnJvcihvcHRpb25zKSB7XG4gIHRoaXMubmFtZSA9ICdBc3NlcnRpb25FcnJvcic7XG4gIHRoaXMuYWN0dWFsID0gb3B0aW9ucy5hY3R1YWw7XG4gIHRoaXMuZXhwZWN0ZWQgPSBvcHRpb25zLmV4cGVjdGVkO1xuICB0aGlzLm9wZXJhdG9yID0gb3B0aW9ucy5vcGVyYXRvcjtcbiAgaWYgKG9wdGlvbnMubWVzc2FnZSkge1xuICAgIHRoaXMubWVzc2FnZSA9IG9wdGlvbnMubWVzc2FnZTtcbiAgICB0aGlzLmdlbmVyYXRlZE1lc3NhZ2UgPSBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICB0aGlzLm1lc3NhZ2UgPSBnZXRNZXNzYWdlKHRoaXMpO1xuICAgIHRoaXMuZ2VuZXJhdGVkTWVzc2FnZSA9IHRydWU7XG4gIH1cbiAgdmFyIHN0YWNrU3RhcnRGdW5jdGlvbiA9IG9wdGlvbnMuc3RhY2tTdGFydEZ1bmN0aW9uIHx8IGZhaWw7XG4gIGlmIChFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSkge1xuICAgIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKHRoaXMsIHN0YWNrU3RhcnRGdW5jdGlvbik7XG4gIH0gZWxzZSB7XG4gICAgLy8gbm9uIHY4IGJyb3dzZXJzIHNvIHdlIGNhbiBoYXZlIGEgc3RhY2t0cmFjZVxuICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoKTtcbiAgICBpZiAoZXJyLnN0YWNrKSB7XG4gICAgICB2YXIgb3V0ID0gZXJyLnN0YWNrO1xuXG4gICAgICAvLyB0cnkgdG8gc3RyaXAgdXNlbGVzcyBmcmFtZXNcbiAgICAgIHZhciBmbl9uYW1lID0gZ2V0TmFtZShzdGFja1N0YXJ0RnVuY3Rpb24pO1xuICAgICAgdmFyIGlkeCA9IG91dC5pbmRleE9mKCdcXG4nICsgZm5fbmFtZSk7XG4gICAgICBpZiAoaWR4ID49IDApIHtcbiAgICAgICAgLy8gb25jZSB3ZSBoYXZlIGxvY2F0ZWQgdGhlIGZ1bmN0aW9uIGZyYW1lXG4gICAgICAgIC8vIHdlIG5lZWQgdG8gc3RyaXAgb3V0IGV2ZXJ5dGhpbmcgYmVmb3JlIGl0IChhbmQgaXRzIGxpbmUpXG4gICAgICAgIHZhciBuZXh0X2xpbmUgPSBvdXQuaW5kZXhPZignXFxuJywgaWR4ICsgMSk7XG4gICAgICAgIG91dCA9IG91dC5zdWJzdHJpbmcobmV4dF9saW5lICsgMSk7XG4gICAgICB9XG5cbiAgICAgIHRoaXMuc3RhY2sgPSBvdXQ7XG4gICAgfVxuICB9XG59O1xuXG4vLyBhc3NlcnQuQXNzZXJ0aW9uRXJyb3IgaW5zdGFuY2VvZiBFcnJvclxudXRpbC5pbmhlcml0cyhhc3NlcnQuQXNzZXJ0aW9uRXJyb3IsIEVycm9yKTtcblxuZnVuY3Rpb24gdHJ1bmNhdGUocywgbikge1xuICBpZiAodHlwZW9mIHMgPT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIHMubGVuZ3RoIDwgbiA/IHMgOiBzLnNsaWNlKDAsIG4pO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzO1xuICB9XG59XG5mdW5jdGlvbiBpbnNwZWN0KHNvbWV0aGluZykge1xuICBpZiAoZnVuY3Rpb25zSGF2ZU5hbWVzIHx8ICF1dGlsLmlzRnVuY3Rpb24oc29tZXRoaW5nKSkge1xuICAgIHJldHVybiB1dGlsLmluc3BlY3Qoc29tZXRoaW5nKTtcbiAgfVxuICB2YXIgcmF3bmFtZSA9IGdldE5hbWUoc29tZXRoaW5nKTtcbiAgdmFyIG5hbWUgPSByYXduYW1lID8gJzogJyArIHJhd25hbWUgOiAnJztcbiAgcmV0dXJuICdbRnVuY3Rpb24nICsgIG5hbWUgKyAnXSc7XG59XG5mdW5jdGlvbiBnZXRNZXNzYWdlKHNlbGYpIHtcbiAgcmV0dXJuIHRydW5jYXRlKGluc3BlY3Qoc2VsZi5hY3R1YWwpLCAxMjgpICsgJyAnICtcbiAgICAgICAgIHNlbGYub3BlcmF0b3IgKyAnICcgK1xuICAgICAgICAgdHJ1bmNhdGUoaW5zcGVjdChzZWxmLmV4cGVjdGVkKSwgMTI4KTtcbn1cblxuLy8gQXQgcHJlc2VudCBvbmx5IHRoZSB0aHJlZSBrZXlzIG1lbnRpb25lZCBhYm92ZSBhcmUgdXNlZCBhbmRcbi8vIHVuZGVyc3Rvb2QgYnkgdGhlIHNwZWMuIEltcGxlbWVudGF0aW9ucyBvciBzdWIgbW9kdWxlcyBjYW4gcGFzc1xuLy8gb3RoZXIga2V5cyB0byB0aGUgQXNzZXJ0aW9uRXJyb3IncyBjb25zdHJ1Y3RvciAtIHRoZXkgd2lsbCBiZVxuLy8gaWdub3JlZC5cblxuLy8gMy4gQWxsIG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIG11c3QgdGhyb3cgYW4gQXNzZXJ0aW9uRXJyb3Jcbi8vIHdoZW4gYSBjb3JyZXNwb25kaW5nIGNvbmRpdGlvbiBpcyBub3QgbWV0LCB3aXRoIGEgbWVzc2FnZSB0aGF0XG4vLyBtYXkgYmUgdW5kZWZpbmVkIGlmIG5vdCBwcm92aWRlZC4gIEFsbCBhc3NlcnRpb24gbWV0aG9kcyBwcm92aWRlXG4vLyBib3RoIHRoZSBhY3R1YWwgYW5kIGV4cGVjdGVkIHZhbHVlcyB0byB0aGUgYXNzZXJ0aW9uIGVycm9yIGZvclxuLy8gZGlzcGxheSBwdXJwb3Nlcy5cblxuZnVuY3Rpb24gZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCBvcGVyYXRvciwgc3RhY2tTdGFydEZ1bmN0aW9uKSB7XG4gIHRocm93IG5ldyBhc3NlcnQuQXNzZXJ0aW9uRXJyb3Ioe1xuICAgIG1lc3NhZ2U6IG1lc3NhZ2UsXG4gICAgYWN0dWFsOiBhY3R1YWwsXG4gICAgZXhwZWN0ZWQ6IGV4cGVjdGVkLFxuICAgIG9wZXJhdG9yOiBvcGVyYXRvcixcbiAgICBzdGFja1N0YXJ0RnVuY3Rpb246IHN0YWNrU3RhcnRGdW5jdGlvblxuICB9KTtcbn1cblxuLy8gRVhURU5TSU9OISBhbGxvd3MgZm9yIHdlbGwgYmVoYXZlZCBlcnJvcnMgZGVmaW5lZCBlbHNld2hlcmUuXG5hc3NlcnQuZmFpbCA9IGZhaWw7XG5cbi8vIDQuIFB1cmUgYXNzZXJ0aW9uIHRlc3RzIHdoZXRoZXIgYSB2YWx1ZSBpcyB0cnV0aHksIGFzIGRldGVybWluZWRcbi8vIGJ5ICEhZ3VhcmQuXG4vLyBhc3NlcnQub2soZ3VhcmQsIG1lc3NhZ2Vfb3B0KTtcbi8vIFRoaXMgc3RhdGVtZW50IGlzIGVxdWl2YWxlbnQgdG8gYXNzZXJ0LmVxdWFsKHRydWUsICEhZ3VhcmQsXG4vLyBtZXNzYWdlX29wdCk7LiBUbyB0ZXN0IHN0cmljdGx5IGZvciB0aGUgdmFsdWUgdHJ1ZSwgdXNlXG4vLyBhc3NlcnQuc3RyaWN0RXF1YWwodHJ1ZSwgZ3VhcmQsIG1lc3NhZ2Vfb3B0KTsuXG5cbmZ1bmN0aW9uIG9rKHZhbHVlLCBtZXNzYWdlKSB7XG4gIGlmICghdmFsdWUpIGZhaWwodmFsdWUsIHRydWUsIG1lc3NhZ2UsICc9PScsIGFzc2VydC5vayk7XG59XG5hc3NlcnQub2sgPSBvaztcblxuLy8gNS4gVGhlIGVxdWFsaXR5IGFzc2VydGlvbiB0ZXN0cyBzaGFsbG93LCBjb2VyY2l2ZSBlcXVhbGl0eSB3aXRoXG4vLyA9PS5cbi8vIGFzc2VydC5lcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5lcXVhbCA9IGZ1bmN0aW9uIGVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCAhPSBleHBlY3RlZCkgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnPT0nLCBhc3NlcnQuZXF1YWwpO1xufTtcblxuLy8gNi4gVGhlIG5vbi1lcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgZm9yIHdoZXRoZXIgdHdvIG9iamVjdHMgYXJlIG5vdCBlcXVhbFxuLy8gd2l0aCAhPSBhc3NlcnQubm90RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZV9vcHQpO1xuXG5hc3NlcnQubm90RXF1YWwgPSBmdW5jdGlvbiBub3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChhY3R1YWwgPT0gZXhwZWN0ZWQpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICchPScsIGFzc2VydC5ub3RFcXVhbCk7XG4gIH1cbn07XG5cbi8vIDcuIFRoZSBlcXVpdmFsZW5jZSBhc3NlcnRpb24gdGVzdHMgYSBkZWVwIGVxdWFsaXR5IHJlbGF0aW9uLlxuLy8gYXNzZXJ0LmRlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5kZWVwRXF1YWwgPSBmdW5jdGlvbiBkZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoIV9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgZmFsc2UpKSB7XG4gICAgZmFpbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlLCAnZGVlcEVxdWFsJywgYXNzZXJ0LmRlZXBFcXVhbCk7XG4gIH1cbn07XG5cbmFzc2VydC5kZWVwU3RyaWN0RXF1YWwgPSBmdW5jdGlvbiBkZWVwU3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoIV9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgdHJ1ZSkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdkZWVwU3RyaWN0RXF1YWwnLCBhc3NlcnQuZGVlcFN0cmljdEVxdWFsKTtcbiAgfVxufTtcblxuZnVuY3Rpb24gX2RlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBzdHJpY3QsIG1lbW9zKSB7XG4gIC8vIDcuMS4gQWxsIGlkZW50aWNhbCB2YWx1ZXMgYXJlIGVxdWl2YWxlbnQsIGFzIGRldGVybWluZWQgYnkgPT09LlxuICBpZiAoYWN0dWFsID09PSBleHBlY3RlZCkge1xuICAgIHJldHVybiB0cnVlO1xuICB9IGVsc2UgaWYgKGlzQnVmZmVyKGFjdHVhbCkgJiYgaXNCdWZmZXIoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGNvbXBhcmUoYWN0dWFsLCBleHBlY3RlZCkgPT09IDA7XG5cbiAgLy8gNy4yLiBJZiB0aGUgZXhwZWN0ZWQgdmFsdWUgaXMgYSBEYXRlIG9iamVjdCwgdGhlIGFjdHVhbCB2YWx1ZSBpc1xuICAvLyBlcXVpdmFsZW50IGlmIGl0IGlzIGFsc28gYSBEYXRlIG9iamVjdCB0aGF0IHJlZmVycyB0byB0aGUgc2FtZSB0aW1lLlxuICB9IGVsc2UgaWYgKHV0aWwuaXNEYXRlKGFjdHVhbCkgJiYgdXRpbC5pc0RhdGUoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGFjdHVhbC5nZXRUaW1lKCkgPT09IGV4cGVjdGVkLmdldFRpbWUoKTtcblxuICAvLyA3LjMgSWYgdGhlIGV4cGVjdGVkIHZhbHVlIGlzIGEgUmVnRXhwIG9iamVjdCwgdGhlIGFjdHVhbCB2YWx1ZSBpc1xuICAvLyBlcXVpdmFsZW50IGlmIGl0IGlzIGFsc28gYSBSZWdFeHAgb2JqZWN0IHdpdGggdGhlIHNhbWUgc291cmNlIGFuZFxuICAvLyBwcm9wZXJ0aWVzIChgZ2xvYmFsYCwgYG11bHRpbGluZWAsIGBsYXN0SW5kZXhgLCBgaWdub3JlQ2FzZWApLlxuICB9IGVsc2UgaWYgKHV0aWwuaXNSZWdFeHAoYWN0dWFsKSAmJiB1dGlsLmlzUmVnRXhwKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBhY3R1YWwuc291cmNlID09PSBleHBlY3RlZC5zb3VyY2UgJiZcbiAgICAgICAgICAgYWN0dWFsLmdsb2JhbCA9PT0gZXhwZWN0ZWQuZ2xvYmFsICYmXG4gICAgICAgICAgIGFjdHVhbC5tdWx0aWxpbmUgPT09IGV4cGVjdGVkLm11bHRpbGluZSAmJlxuICAgICAgICAgICBhY3R1YWwubGFzdEluZGV4ID09PSBleHBlY3RlZC5sYXN0SW5kZXggJiZcbiAgICAgICAgICAgYWN0dWFsLmlnbm9yZUNhc2UgPT09IGV4cGVjdGVkLmlnbm9yZUNhc2U7XG5cbiAgLy8gNy40LiBPdGhlciBwYWlycyB0aGF0IGRvIG5vdCBib3RoIHBhc3MgdHlwZW9mIHZhbHVlID09ICdvYmplY3QnLFxuICAvLyBlcXVpdmFsZW5jZSBpcyBkZXRlcm1pbmVkIGJ5ID09LlxuICB9IGVsc2UgaWYgKChhY3R1YWwgPT09IG51bGwgfHwgdHlwZW9mIGFjdHVhbCAhPT0gJ29iamVjdCcpICYmXG4gICAgICAgICAgICAgKGV4cGVjdGVkID09PSBudWxsIHx8IHR5cGVvZiBleHBlY3RlZCAhPT0gJ29iamVjdCcpKSB7XG4gICAgcmV0dXJuIHN0cmljdCA/IGFjdHVhbCA9PT0gZXhwZWN0ZWQgOiBhY3R1YWwgPT0gZXhwZWN0ZWQ7XG5cbiAgLy8gSWYgYm90aCB2YWx1ZXMgYXJlIGluc3RhbmNlcyBvZiB0eXBlZCBhcnJheXMsIHdyYXAgdGhlaXIgdW5kZXJseWluZ1xuICAvLyBBcnJheUJ1ZmZlcnMgaW4gYSBCdWZmZXIgZWFjaCB0byBpbmNyZWFzZSBwZXJmb3JtYW5jZVxuICAvLyBUaGlzIG9wdGltaXphdGlvbiByZXF1aXJlcyB0aGUgYXJyYXlzIHRvIGhhdmUgdGhlIHNhbWUgdHlwZSBhcyBjaGVja2VkIGJ5XG4gIC8vIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcgKGFrYSBwVG9TdHJpbmcpLiBOZXZlciBwZXJmb3JtIGJpbmFyeVxuICAvLyBjb21wYXJpc29ucyBmb3IgRmxvYXQqQXJyYXlzLCB0aG91Z2gsIHNpbmNlIGUuZy4gKzAgPT09IC0wIGJ1dCB0aGVpclxuICAvLyBiaXQgcGF0dGVybnMgYXJlIG5vdCBpZGVudGljYWwuXG4gIH0gZWxzZSBpZiAoaXNWaWV3KGFjdHVhbCkgJiYgaXNWaWV3KGV4cGVjdGVkKSAmJlxuICAgICAgICAgICAgIHBUb1N0cmluZyhhY3R1YWwpID09PSBwVG9TdHJpbmcoZXhwZWN0ZWQpICYmXG4gICAgICAgICAgICAgIShhY3R1YWwgaW5zdGFuY2VvZiBGbG9hdDMyQXJyYXkgfHxcbiAgICAgICAgICAgICAgIGFjdHVhbCBpbnN0YW5jZW9mIEZsb2F0NjRBcnJheSkpIHtcbiAgICByZXR1cm4gY29tcGFyZShuZXcgVWludDhBcnJheShhY3R1YWwuYnVmZmVyKSxcbiAgICAgICAgICAgICAgICAgICBuZXcgVWludDhBcnJheShleHBlY3RlZC5idWZmZXIpKSA9PT0gMDtcblxuICAvLyA3LjUgRm9yIGFsbCBvdGhlciBPYmplY3QgcGFpcnMsIGluY2x1ZGluZyBBcnJheSBvYmplY3RzLCBlcXVpdmFsZW5jZSBpc1xuICAvLyBkZXRlcm1pbmVkIGJ5IGhhdmluZyB0aGUgc2FtZSBudW1iZXIgb2Ygb3duZWQgcHJvcGVydGllcyAoYXMgdmVyaWZpZWRcbiAgLy8gd2l0aCBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwpLCB0aGUgc2FtZSBzZXQgb2Yga2V5c1xuICAvLyAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIG9yZGVyKSwgZXF1aXZhbGVudCB2YWx1ZXMgZm9yIGV2ZXJ5XG4gIC8vIGNvcnJlc3BvbmRpbmcga2V5LCBhbmQgYW4gaWRlbnRpY2FsICdwcm90b3R5cGUnIHByb3BlcnR5LiBOb3RlOiB0aGlzXG4gIC8vIGFjY291bnRzIGZvciBib3RoIG5hbWVkIGFuZCBpbmRleGVkIHByb3BlcnRpZXMgb24gQXJyYXlzLlxuICB9IGVsc2UgaWYgKGlzQnVmZmVyKGFjdHVhbCkgIT09IGlzQnVmZmVyKGV4cGVjdGVkKSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfSBlbHNlIHtcbiAgICBtZW1vcyA9IG1lbW9zIHx8IHthY3R1YWw6IFtdLCBleHBlY3RlZDogW119O1xuXG4gICAgdmFyIGFjdHVhbEluZGV4ID0gbWVtb3MuYWN0dWFsLmluZGV4T2YoYWN0dWFsKTtcbiAgICBpZiAoYWN0dWFsSW5kZXggIT09IC0xKSB7XG4gICAgICBpZiAoYWN0dWFsSW5kZXggPT09IG1lbW9zLmV4cGVjdGVkLmluZGV4T2YoZXhwZWN0ZWQpKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgfVxuICAgIH1cblxuICAgIG1lbW9zLmFjdHVhbC5wdXNoKGFjdHVhbCk7XG4gICAgbWVtb3MuZXhwZWN0ZWQucHVzaChleHBlY3RlZCk7XG5cbiAgICByZXR1cm4gb2JqRXF1aXYoYWN0dWFsLCBleHBlY3RlZCwgc3RyaWN0LCBtZW1vcyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaXNBcmd1bWVudHMob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PSAnW29iamVjdCBBcmd1bWVudHNdJztcbn1cblxuZnVuY3Rpb24gb2JqRXF1aXYoYSwgYiwgc3RyaWN0LCBhY3R1YWxWaXNpdGVkT2JqZWN0cykge1xuICBpZiAoYSA9PT0gbnVsbCB8fCBhID09PSB1bmRlZmluZWQgfHwgYiA9PT0gbnVsbCB8fCBiID09PSB1bmRlZmluZWQpXG4gICAgcmV0dXJuIGZhbHNlO1xuICAvLyBpZiBvbmUgaXMgYSBwcmltaXRpdmUsIHRoZSBvdGhlciBtdXN0IGJlIHNhbWVcbiAgaWYgKHV0aWwuaXNQcmltaXRpdmUoYSkgfHwgdXRpbC5pc1ByaW1pdGl2ZShiKSlcbiAgICByZXR1cm4gYSA9PT0gYjtcbiAgaWYgKHN0cmljdCAmJiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoYSkgIT09IE9iamVjdC5nZXRQcm90b3R5cGVPZihiKSlcbiAgICByZXR1cm4gZmFsc2U7XG4gIHZhciBhSXNBcmdzID0gaXNBcmd1bWVudHMoYSk7XG4gIHZhciBiSXNBcmdzID0gaXNBcmd1bWVudHMoYik7XG4gIGlmICgoYUlzQXJncyAmJiAhYklzQXJncykgfHwgKCFhSXNBcmdzICYmIGJJc0FyZ3MpKVxuICAgIHJldHVybiBmYWxzZTtcbiAgaWYgKGFJc0FyZ3MpIHtcbiAgICBhID0gcFNsaWNlLmNhbGwoYSk7XG4gICAgYiA9IHBTbGljZS5jYWxsKGIpO1xuICAgIHJldHVybiBfZGVlcEVxdWFsKGEsIGIsIHN0cmljdCk7XG4gIH1cbiAgdmFyIGthID0gb2JqZWN0S2V5cyhhKTtcbiAgdmFyIGtiID0gb2JqZWN0S2V5cyhiKTtcbiAgdmFyIGtleSwgaTtcbiAgLy8gaGF2aW5nIHRoZSBzYW1lIG51bWJlciBvZiBvd25lZCBwcm9wZXJ0aWVzIChrZXlzIGluY29ycG9yYXRlc1xuICAvLyBoYXNPd25Qcm9wZXJ0eSlcbiAgaWYgKGthLmxlbmd0aCAhPT0ga2IubGVuZ3RoKVxuICAgIHJldHVybiBmYWxzZTtcbiAgLy90aGUgc2FtZSBzZXQgb2Yga2V5cyAoYWx0aG91Z2ggbm90IG5lY2Vzc2FyaWx5IHRoZSBzYW1lIG9yZGVyKSxcbiAga2Euc29ydCgpO1xuICBrYi5zb3J0KCk7XG4gIC8vfn5+Y2hlYXAga2V5IHRlc3RcbiAgZm9yIChpID0ga2EubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICBpZiAoa2FbaV0gIT09IGtiW2ldKVxuICAgICAgcmV0dXJuIGZhbHNlO1xuICB9XG4gIC8vZXF1aXZhbGVudCB2YWx1ZXMgZm9yIGV2ZXJ5IGNvcnJlc3BvbmRpbmcga2V5LCBhbmRcbiAgLy9+fn5wb3NzaWJseSBleHBlbnNpdmUgZGVlcCB0ZXN0XG4gIGZvciAoaSA9IGthLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAga2V5ID0ga2FbaV07XG4gICAgaWYgKCFfZGVlcEVxdWFsKGFba2V5XSwgYltrZXldLCBzdHJpY3QsIGFjdHVhbFZpc2l0ZWRPYmplY3RzKSlcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICByZXR1cm4gdHJ1ZTtcbn1cblxuLy8gOC4gVGhlIG5vbi1lcXVpdmFsZW5jZSBhc3NlcnRpb24gdGVzdHMgZm9yIGFueSBkZWVwIGluZXF1YWxpdHkuXG4vLyBhc3NlcnQubm90RGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0Lm5vdERlZXBFcXVhbCA9IGZ1bmN0aW9uIG5vdERlZXBFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlKSB7XG4gIGlmIChfZGVlcEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIGZhbHNlKSkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJ25vdERlZXBFcXVhbCcsIGFzc2VydC5ub3REZWVwRXF1YWwpO1xuICB9XG59O1xuXG5hc3NlcnQubm90RGVlcFN0cmljdEVxdWFsID0gbm90RGVlcFN0cmljdEVxdWFsO1xuZnVuY3Rpb24gbm90RGVlcFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKF9kZWVwRXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgdHJ1ZSkpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICdub3REZWVwU3RyaWN0RXF1YWwnLCBub3REZWVwU3RyaWN0RXF1YWwpO1xuICB9XG59XG5cblxuLy8gOS4gVGhlIHN0cmljdCBlcXVhbGl0eSBhc3NlcnRpb24gdGVzdHMgc3RyaWN0IGVxdWFsaXR5LCBhcyBkZXRlcm1pbmVkIGJ5ID09PS5cbi8vIGFzc2VydC5zdHJpY3RFcXVhbChhY3R1YWwsIGV4cGVjdGVkLCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC5zdHJpY3RFcXVhbCA9IGZ1bmN0aW9uIHN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UpIHtcbiAgaWYgKGFjdHVhbCAhPT0gZXhwZWN0ZWQpIHtcbiAgICBmYWlsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2UsICc9PT0nLCBhc3NlcnQuc3RyaWN0RXF1YWwpO1xuICB9XG59O1xuXG4vLyAxMC4gVGhlIHN0cmljdCBub24tZXF1YWxpdHkgYXNzZXJ0aW9uIHRlc3RzIGZvciBzdHJpY3QgaW5lcXVhbGl0eSwgYXNcbi8vIGRldGVybWluZWQgYnkgIT09LiAgYXNzZXJ0Lm5vdFN0cmljdEVxdWFsKGFjdHVhbCwgZXhwZWN0ZWQsIG1lc3NhZ2Vfb3B0KTtcblxuYXNzZXJ0Lm5vdFN0cmljdEVxdWFsID0gZnVuY3Rpb24gbm90U3RyaWN0RXF1YWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICBpZiAoYWN0dWFsID09PSBleHBlY3RlZCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgbWVzc2FnZSwgJyE9PScsIGFzc2VydC5ub3RTdHJpY3RFcXVhbCk7XG4gIH1cbn07XG5cbmZ1bmN0aW9uIGV4cGVjdGVkRXhjZXB0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpIHtcbiAgaWYgKCFhY3R1YWwgfHwgIWV4cGVjdGVkKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChleHBlY3RlZCkgPT0gJ1tvYmplY3QgUmVnRXhwXScpIHtcbiAgICByZXR1cm4gZXhwZWN0ZWQudGVzdChhY3R1YWwpO1xuICB9XG5cbiAgdHJ5IHtcbiAgICBpZiAoYWN0dWFsIGluc3RhbmNlb2YgZXhwZWN0ZWQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIC8vIElnbm9yZS4gIFRoZSBpbnN0YW5jZW9mIGNoZWNrIGRvZXNuJ3Qgd29yayBmb3IgYXJyb3cgZnVuY3Rpb25zLlxuICB9XG5cbiAgaWYgKEVycm9yLmlzUHJvdG90eXBlT2YoZXhwZWN0ZWQpKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgcmV0dXJuIGV4cGVjdGVkLmNhbGwoe30sIGFjdHVhbCkgPT09IHRydWU7XG59XG5cbmZ1bmN0aW9uIF90cnlCbG9jayhibG9jaykge1xuICB2YXIgZXJyb3I7XG4gIHRyeSB7XG4gICAgYmxvY2soKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIGVycm9yID0gZTtcbiAgfVxuICByZXR1cm4gZXJyb3I7XG59XG5cbmZ1bmN0aW9uIF90aHJvd3Moc2hvdWxkVGhyb3csIGJsb2NrLCBleHBlY3RlZCwgbWVzc2FnZSkge1xuICB2YXIgYWN0dWFsO1xuXG4gIGlmICh0eXBlb2YgYmxvY2sgIT09ICdmdW5jdGlvbicpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJsb2NrXCIgYXJndW1lbnQgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gIH1cblxuICBpZiAodHlwZW9mIGV4cGVjdGVkID09PSAnc3RyaW5nJykge1xuICAgIG1lc3NhZ2UgPSBleHBlY3RlZDtcbiAgICBleHBlY3RlZCA9IG51bGw7XG4gIH1cblxuICBhY3R1YWwgPSBfdHJ5QmxvY2soYmxvY2spO1xuXG4gIG1lc3NhZ2UgPSAoZXhwZWN0ZWQgJiYgZXhwZWN0ZWQubmFtZSA/ICcgKCcgKyBleHBlY3RlZC5uYW1lICsgJykuJyA6ICcuJykgK1xuICAgICAgICAgICAgKG1lc3NhZ2UgPyAnICcgKyBtZXNzYWdlIDogJy4nKTtcblxuICBpZiAoc2hvdWxkVGhyb3cgJiYgIWFjdHVhbCkge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgJ01pc3NpbmcgZXhwZWN0ZWQgZXhjZXB0aW9uJyArIG1lc3NhZ2UpO1xuICB9XG5cbiAgdmFyIHVzZXJQcm92aWRlZE1lc3NhZ2UgPSB0eXBlb2YgbWVzc2FnZSA9PT0gJ3N0cmluZyc7XG4gIHZhciBpc1Vud2FudGVkRXhjZXB0aW9uID0gIXNob3VsZFRocm93ICYmIHV0aWwuaXNFcnJvcihhY3R1YWwpO1xuICB2YXIgaXNVbmV4cGVjdGVkRXhjZXB0aW9uID0gIXNob3VsZFRocm93ICYmIGFjdHVhbCAmJiAhZXhwZWN0ZWQ7XG5cbiAgaWYgKChpc1Vud2FudGVkRXhjZXB0aW9uICYmXG4gICAgICB1c2VyUHJvdmlkZWRNZXNzYWdlICYmXG4gICAgICBleHBlY3RlZEV4Y2VwdGlvbihhY3R1YWwsIGV4cGVjdGVkKSkgfHxcbiAgICAgIGlzVW5leHBlY3RlZEV4Y2VwdGlvbikge1xuICAgIGZhaWwoYWN0dWFsLCBleHBlY3RlZCwgJ0dvdCB1bndhbnRlZCBleGNlcHRpb24nICsgbWVzc2FnZSk7XG4gIH1cblxuICBpZiAoKHNob3VsZFRocm93ICYmIGFjdHVhbCAmJiBleHBlY3RlZCAmJlxuICAgICAgIWV4cGVjdGVkRXhjZXB0aW9uKGFjdHVhbCwgZXhwZWN0ZWQpKSB8fCAoIXNob3VsZFRocm93ICYmIGFjdHVhbCkpIHtcbiAgICB0aHJvdyBhY3R1YWw7XG4gIH1cbn1cblxuLy8gMTEuIEV4cGVjdGVkIHRvIHRocm93IGFuIGVycm9yOlxuLy8gYXNzZXJ0LnRocm93cyhibG9jaywgRXJyb3Jfb3B0LCBtZXNzYWdlX29wdCk7XG5cbmFzc2VydC50aHJvd3MgPSBmdW5jdGlvbihibG9jaywgLypvcHRpb25hbCovZXJyb3IsIC8qb3B0aW9uYWwqL21lc3NhZ2UpIHtcbiAgX3Rocm93cyh0cnVlLCBibG9jaywgZXJyb3IsIG1lc3NhZ2UpO1xufTtcblxuLy8gRVhURU5TSU9OISBUaGlzIGlzIGFubm95aW5nIHRvIHdyaXRlIG91dHNpZGUgdGhpcyBtb2R1bGUuXG5hc3NlcnQuZG9lc05vdFRocm93ID0gZnVuY3Rpb24oYmxvY2ssIC8qb3B0aW9uYWwqL2Vycm9yLCAvKm9wdGlvbmFsKi9tZXNzYWdlKSB7XG4gIF90aHJvd3MoZmFsc2UsIGJsb2NrLCBlcnJvciwgbWVzc2FnZSk7XG59O1xuXG5hc3NlcnQuaWZFcnJvciA9IGZ1bmN0aW9uKGVycikgeyBpZiAoZXJyKSB0aHJvdyBlcnI7IH07XG5cbi8vIEV4cG9zZSBhIHN0cmljdCBvbmx5IHZhcmlhbnQgb2YgYXNzZXJ0XG5mdW5jdGlvbiBzdHJpY3QodmFsdWUsIG1lc3NhZ2UpIHtcbiAgaWYgKCF2YWx1ZSkgZmFpbCh2YWx1ZSwgdHJ1ZSwgbWVzc2FnZSwgJz09Jywgc3RyaWN0KTtcbn1cbmFzc2VydC5zdHJpY3QgPSBvYmplY3RBc3NpZ24oc3RyaWN0LCBhc3NlcnQsIHtcbiAgZXF1YWw6IGFzc2VydC5zdHJpY3RFcXVhbCxcbiAgZGVlcEVxdWFsOiBhc3NlcnQuZGVlcFN0cmljdEVxdWFsLFxuICBub3RFcXVhbDogYXNzZXJ0Lm5vdFN0cmljdEVxdWFsLFxuICBub3REZWVwRXF1YWw6IGFzc2VydC5ub3REZWVwU3RyaWN0RXF1YWxcbn0pO1xuYXNzZXJ0LnN0cmljdC5zdHJpY3QgPSBhc3NlcnQuc3RyaWN0O1xuXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChoYXNPd24uY2FsbChvYmosIGtleSkpIGtleXMucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiBrZXlzO1xufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9zaGltXCIpO1xuXG5yZXF1aXJlKFwicmVnZW5lcmF0b3ItcnVudGltZS9ydW50aW1lXCIpO1xuXG5yZXF1aXJlKFwiY29yZS1qcy9mbi9yZWdleHAvZXNjYXBlXCIpO1xuXG5pZiAoZ2xvYmFsLl9iYWJlbFBvbHlmaWxsKSB7XG4gIHRocm93IG5ldyBFcnJvcihcIm9ubHkgb25lIGluc3RhbmNlIG9mIGJhYmVsLXBvbHlmaWxsIGlzIGFsbG93ZWRcIik7XG59XG5nbG9iYWwuX2JhYmVsUG9seWZpbGwgPSB0cnVlO1xuXG52YXIgREVGSU5FX1BST1BFUlRZID0gXCJkZWZpbmVQcm9wZXJ0eVwiO1xuZnVuY3Rpb24gZGVmaW5lKE8sIGtleSwgdmFsdWUpIHtcbiAgT1trZXldIHx8IE9iamVjdFtERUZJTkVfUFJPUEVSVFldKE8sIGtleSwge1xuICAgIHdyaXRhYmxlOiB0cnVlLFxuICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICB2YWx1ZTogdmFsdWVcbiAgfSk7XG59XG5cbmRlZmluZShTdHJpbmcucHJvdG90eXBlLCBcInBhZExlZnRcIiwgXCJcIi5wYWRTdGFydCk7XG5kZWZpbmUoU3RyaW5nLnByb3RvdHlwZSwgXCJwYWRSaWdodFwiLCBcIlwiLnBhZEVuZCk7XG5cblwicG9wLHJldmVyc2Usc2hpZnQsa2V5cyx2YWx1ZXMsZW50cmllcyxpbmRleE9mLGV2ZXJ5LHNvbWUsZm9yRWFjaCxtYXAsZmlsdGVyLGZpbmQsZmluZEluZGV4LGluY2x1ZGVzLGpvaW4sc2xpY2UsY29uY2F0LHB1c2gsc3BsaWNlLHVuc2hpZnQsc29ydCxsYXN0SW5kZXhPZixyZWR1Y2UscmVkdWNlUmlnaHQsY29weVdpdGhpbixmaWxsXCIuc3BsaXQoXCIsXCIpLmZvckVhY2goZnVuY3Rpb24gKGtleSkge1xuICBbXVtrZXldICYmIGRlZmluZShBcnJheSwga2V5LCBGdW5jdGlvbi5jYWxsLmJpbmQoW11ba2V5XSkpO1xufSk7IiwiLyohXG4gKiBodHRwczovL2dpdGh1Yi5jb20vZXMtc2hpbXMvZXM1LXNoaW1cbiAqIEBsaWNlbnNlIGVzNS1zaGltIENvcHlyaWdodCAyMDA5LTIwMjAgYnkgY29udHJpYnV0b3JzLCBNSVQgTGljZW5zZVxuICogc2VlIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbS9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuLy8gdmltOiB0cz00IHN0cz00IHN3PTQgZXhwYW5kdGFiXG5cbi8vIEFkZCBzZW1pY29sb24gdG8gcHJldmVudCBJSUZFIGZyb20gYmVpbmcgcGFzc2VkIGFzIGFyZ3VtZW50IHRvIGNvbmNhdGVuYXRlZCBjb2RlLlxuOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWV4dHJhLXNlbWlcblxuLy8gVU1EIChVbml2ZXJzYWwgTW9kdWxlIERlZmluaXRpb24pXG4vLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL3VtZGpzL3VtZC9ibG9iL21hc3Rlci90ZW1wbGF0ZXMvcmV0dXJuRXhwb3J0cy5qc1xuKGZ1bmN0aW9uIChyb290LCBmYWN0b3J5KSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgLyogZ2xvYmFsIGRlZmluZSAqL1xuICAgIGlmICh0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQpIHtcbiAgICAgICAgLy8gQU1ELiBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgbW9kdWxlLlxuICAgICAgICBkZWZpbmUoZmFjdG9yeSk7XG4gICAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0XG4gICAgICAgIC8vIG9ubHkgQ29tbW9uSlMtbGlrZSBlbnZpcm9tZW50cyB0aGF0IHN1cHBvcnQgbW9kdWxlLmV4cG9ydHMsXG4gICAgICAgIC8vIGxpa2UgTm9kZS5cbiAgICAgICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQnJvd3NlciBnbG9iYWxzIChyb290IGlzIHdpbmRvdylcbiAgICAgICAgcm9vdC5yZXR1cm5FeHBvcnRzID0gZmFjdG9yeSgpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXBhcmFtLXJlYXNzaWduXG4gICAgfVxufSh0aGlzLCBmdW5jdGlvbiAoKSB7XG4gICAgLyoqXG4gICAgICogQnJpbmdzIGFuIGVudmlyb25tZW50IGFzIGNsb3NlIHRvIEVDTUFTY3JpcHQgNSBjb21wbGlhbmNlXG4gICAgICogYXMgaXMgcG9zc2libGUgd2l0aCB0aGUgZmFjaWxpdGllcyBvZiBlcnN0d2hpbGUgZW5naW5lcy5cbiAgICAgKlxuICAgICAqIEFubm90YXRlZCBFUzU6IGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8gKHNwZWNpZmljIGxpbmtzIGJlbG93KVxuICAgICAqIEVTNSBTcGVjOiBodHRwczovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL3dwLWNvbnRlbnQvdXBsb2Fkcy9FQ01BLTI2Ml81LjFfZWRpdGlvbl9qdW5lXzIwMTEucGRmXG4gICAgICogUmVxdWlyZWQgcmVhZGluZzogaHR0cHM6Ly9qYXZhc2NyaXB0d2VibG9nLndvcmRwcmVzcy5jb20vMjAxMS8xMi8wNS9leHRlbmRpbmctamF2YXNjcmlwdC1uYXRpdmVzL1xuICAgICAqL1xuXG4gICAgLy8gU2hvcnRjdXQgdG8gYW4gb2Z0ZW4gYWNjZXNzZWQgcHJvcGVydGllcywgaW4gb3JkZXIgdG8gYXZvaWQgbXVsdGlwbGVcbiAgICAvLyBkZXJlZmVyZW5jZSB0aGF0IGNvc3RzIHVuaXZlcnNhbGx5LiBUaGlzIGFsc28gaG9sZHMgYSByZWZlcmVuY2UgdG8ga25vd24tZ29vZFxuICAgIC8vIGZ1bmN0aW9ucy5cbiAgICB2YXIgJEFycmF5ID0gQXJyYXk7XG4gICAgdmFyIEFycmF5UHJvdG90eXBlID0gJEFycmF5LnByb3RvdHlwZTtcbiAgICB2YXIgJE9iamVjdCA9IE9iamVjdDtcbiAgICB2YXIgT2JqZWN0UHJvdG90eXBlID0gJE9iamVjdC5wcm90b3R5cGU7XG4gICAgdmFyICRGdW5jdGlvbiA9IEZ1bmN0aW9uO1xuICAgIHZhciBGdW5jdGlvblByb3RvdHlwZSA9ICRGdW5jdGlvbi5wcm90b3R5cGU7XG4gICAgdmFyICRTdHJpbmcgPSBTdHJpbmc7XG4gICAgdmFyIFN0cmluZ1Byb3RvdHlwZSA9ICRTdHJpbmcucHJvdG90eXBlO1xuICAgIHZhciAkTnVtYmVyID0gTnVtYmVyO1xuICAgIHZhciBOdW1iZXJQcm90b3R5cGUgPSAkTnVtYmVyLnByb3RvdHlwZTtcbiAgICB2YXIgYXJyYXlfc2xpY2UgPSBBcnJheVByb3RvdHlwZS5zbGljZTtcbiAgICB2YXIgYXJyYXlfc3BsaWNlID0gQXJyYXlQcm90b3R5cGUuc3BsaWNlO1xuICAgIHZhciBhcnJheV9wdXNoID0gQXJyYXlQcm90b3R5cGUucHVzaDtcbiAgICB2YXIgYXJyYXlfdW5zaGlmdCA9IEFycmF5UHJvdG90eXBlLnVuc2hpZnQ7XG4gICAgdmFyIGFycmF5X2NvbmNhdCA9IEFycmF5UHJvdG90eXBlLmNvbmNhdDtcbiAgICB2YXIgYXJyYXlfam9pbiA9IEFycmF5UHJvdG90eXBlLmpvaW47XG4gICAgdmFyIGNhbGwgPSBGdW5jdGlvblByb3RvdHlwZS5jYWxsO1xuICAgIHZhciBhcHBseSA9IEZ1bmN0aW9uUHJvdG90eXBlLmFwcGx5O1xuICAgIHZhciBtYXggPSBNYXRoLm1heDtcbiAgICB2YXIgbWluID0gTWF0aC5taW47XG4gICAgdmFyIGZsb29yID0gTWF0aC5mbG9vcjtcbiAgICB2YXIgYWJzID0gTWF0aC5hYnM7XG4gICAgdmFyIHBvdyA9IE1hdGgucG93O1xuICAgIHZhciByb3VuZCA9IE1hdGgucm91bmQ7XG4gICAgdmFyIGxvZyA9IE1hdGgubG9nO1xuICAgIHZhciBMT0cxMEUgPSBNYXRoLkxPRzEwRTtcbiAgICB2YXIgbG9nMTAgPSBNYXRoLmxvZzEwIHx8IGZ1bmN0aW9uIGxvZzEwKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBsb2codmFsdWUpICogTE9HMTBFO1xuICAgIH07XG5cbiAgICAvLyBIYXZpbmcgYSB0b1N0cmluZyBsb2NhbCB2YXJpYWJsZSBuYW1lIGJyZWFrcyBpbiBPcGVyYSBzbyB1c2UgdG9fc3RyaW5nLlxuICAgIHZhciB0b19zdHJpbmcgPSBPYmplY3RQcm90b3R5cGUudG9TdHJpbmc7XG5cbiAgICAvKiBlc2xpbnQtZGlzYWJsZSBvbmUtdmFyLWRlY2xhcmF0aW9uLXBlci1saW5lLCBuby1yZWRlY2xhcmUsIG1heC1zdGF0ZW1lbnRzLXBlci1saW5lICovXG4gICAgdmFyIGhhc1RvU3RyaW5nVGFnID0gdHlwZW9mIFN5bWJvbCA9PT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgU3ltYm9sLnRvU3RyaW5nVGFnID09PSAnc3ltYm9sJztcbiAgICB2YXIgaXNDYWxsYWJsZTsgLyogaW5saW5lZCBmcm9tIGh0dHBzOi8vbnBtanMuY29tL2lzLWNhbGxhYmxlICovIHZhciBmblRvU3RyID0gRnVuY3Rpb24ucHJvdG90eXBlLnRvU3RyaW5nLCBjb25zdHJ1Y3RvclJlZ2V4ID0gL15cXHMqY2xhc3MgLywgaXNFUzZDbGFzc0ZuID0gZnVuY3Rpb24gaXNFUzZDbGFzc0ZuKHZhbHVlKSB7IHRyeSB7IHZhciBmblN0ciA9IGZuVG9TdHIuY2FsbCh2YWx1ZSk7IHZhciBzaW5nbGVTdHJpcHBlZCA9IGZuU3RyLnJlcGxhY2UoL1xcL1xcLy4qXFxuL2csICcnKTsgdmFyIG11bHRpU3RyaXBwZWQgPSBzaW5nbGVTdHJpcHBlZC5yZXBsYWNlKC9cXC9cXCpbLlxcc1xcU10qXFwqXFwvL2csICcnKTsgdmFyIHNwYWNlU3RyaXBwZWQgPSBtdWx0aVN0cmlwcGVkLnJlcGxhY2UoL1xcbi9tZywgJyAnKS5yZXBsYWNlKC8gezJ9L2csICcgJyk7IHJldHVybiBjb25zdHJ1Y3RvclJlZ2V4LnRlc3Qoc3BhY2VTdHJpcHBlZCk7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyAvKiBub3QgYSBmdW5jdGlvbiAqLyB9IH0sIHRyeUZ1bmN0aW9uT2JqZWN0ID0gZnVuY3Rpb24gdHJ5RnVuY3Rpb25PYmplY3QodmFsdWUpIHsgdHJ5IHsgaWYgKGlzRVM2Q2xhc3NGbih2YWx1ZSkpIHsgcmV0dXJuIGZhbHNlOyB9IGZuVG9TdHIuY2FsbCh2YWx1ZSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9LCBmbkNsYXNzID0gJ1tvYmplY3QgRnVuY3Rpb25dJywgZ2VuQ2xhc3MgPSAnW29iamVjdCBHZW5lcmF0b3JGdW5jdGlvbl0nLCBpc0NhbGxhYmxlID0gZnVuY3Rpb24gaXNDYWxsYWJsZSh2YWx1ZSkgeyBpZiAoIXZhbHVlKSB7IHJldHVybiBmYWxzZTsgfSBpZiAodHlwZW9mIHZhbHVlICE9PSAnZnVuY3Rpb24nICYmIHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9IGlmIChoYXNUb1N0cmluZ1RhZykgeyByZXR1cm4gdHJ5RnVuY3Rpb25PYmplY3QodmFsdWUpOyB9IGlmIChpc0VTNkNsYXNzRm4odmFsdWUpKSB7IHJldHVybiBmYWxzZTsgfSB2YXIgc3RyQ2xhc3MgPSB0b19zdHJpbmcuY2FsbCh2YWx1ZSk7IHJldHVybiBzdHJDbGFzcyA9PT0gZm5DbGFzcyB8fCBzdHJDbGFzcyA9PT0gZ2VuQ2xhc3M7IH07XG5cbiAgICB2YXIgaXNSZWdleDsgLyogaW5saW5lZCBmcm9tIGh0dHBzOi8vbnBtanMuY29tL2lzLXJlZ2V4ICovIHZhciByZWdleEV4ZWMgPSBSZWdFeHAucHJvdG90eXBlLmV4ZWMsIHRyeVJlZ2V4RXhlYyA9IGZ1bmN0aW9uIHRyeVJlZ2V4RXhlYyh2YWx1ZSkgeyB0cnkgeyByZWdleEV4ZWMuY2FsbCh2YWx1ZSk7IHJldHVybiB0cnVlOyB9IGNhdGNoIChlKSB7IHJldHVybiBmYWxzZTsgfSB9LCByZWdleENsYXNzID0gJ1tvYmplY3QgUmVnRXhwXSc7IGlzUmVnZXggPSBmdW5jdGlvbiBpc1JlZ2V4KHZhbHVlKSB7IGlmICh0eXBlb2YgdmFsdWUgIT09ICdvYmplY3QnKSB7IHJldHVybiBmYWxzZTsgfSByZXR1cm4gaGFzVG9TdHJpbmdUYWcgPyB0cnlSZWdleEV4ZWModmFsdWUpIDogdG9fc3RyaW5nLmNhbGwodmFsdWUpID09PSByZWdleENsYXNzOyB9O1xuICAgIHZhciBpc1N0cmluZzsgLyogaW5saW5lZCBmcm9tIGh0dHBzOi8vbnBtanMuY29tL2lzLXN0cmluZyAqLyB2YXIgc3RyVmFsdWUgPSBTdHJpbmcucHJvdG90eXBlLnZhbHVlT2YsIHRyeVN0cmluZ09iamVjdCA9IGZ1bmN0aW9uIHRyeVN0cmluZ09iamVjdCh2YWx1ZSkgeyB0cnkgeyBzdHJWYWx1ZS5jYWxsKHZhbHVlKTsgcmV0dXJuIHRydWU7IH0gY2F0Y2ggKGUpIHsgcmV0dXJuIGZhbHNlOyB9IH0sIHN0cmluZ0NsYXNzID0gJ1tvYmplY3QgU3RyaW5nXSc7IGlzU3RyaW5nID0gZnVuY3Rpb24gaXNTdHJpbmcodmFsdWUpIHsgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHsgcmV0dXJuIHRydWU7IH0gaWYgKHR5cGVvZiB2YWx1ZSAhPT0gJ29iamVjdCcpIHsgcmV0dXJuIGZhbHNlOyB9IHJldHVybiBoYXNUb1N0cmluZ1RhZyA/IHRyeVN0cmluZ09iamVjdCh2YWx1ZSkgOiB0b19zdHJpbmcuY2FsbCh2YWx1ZSkgPT09IHN0cmluZ0NsYXNzOyB9O1xuICAgIC8qIGVzbGludC1lbmFibGUgb25lLXZhci1kZWNsYXJhdGlvbi1wZXItbGluZSwgbm8tcmVkZWNsYXJlLCBtYXgtc3RhdGVtZW50cy1wZXItbGluZSAqL1xuXG4gICAgLyogaW5saW5lZCBmcm9tIGh0dHBzOi8vbnBtanMuY29tL2RlZmluZS1wcm9wZXJ0aWVzICovXG4gICAgdmFyIHN1cHBvcnRzRGVzY3JpcHRvcnMgPSAkT2JqZWN0LmRlZmluZVByb3BlcnR5ICYmIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB2YXIgb2JqID0ge307XG4gICAgICAgICAgICAkT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgJ3gnLCB7IGVudW1lcmFibGU6IGZhbHNlLCB2YWx1ZTogb2JqIH0pO1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVucmVhY2hhYmxlLWxvb3AsIG1heC1zdGF0ZW1lbnRzLXBlci1saW5lXG4gICAgICAgICAgICBmb3IgKHZhciBfIGluIG9iaikgeyByZXR1cm4gZmFsc2U7IH0gLy8ganNjczppZ25vcmUgZGlzYWxsb3dVbnVzZWRWYXJpYWJsZXNcbiAgICAgICAgICAgIHJldHVybiBvYmoueCA9PT0gb2JqO1xuICAgICAgICB9IGNhdGNoIChlKSB7IC8qIHRoaXMgaXMgRVMzICovXG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9KCkpO1xuICAgIHZhciBkZWZpbmVQcm9wZXJ0aWVzID0gKGZ1bmN0aW9uIChoYXMpIHtcbiAgICAgICAgLy8gRGVmaW5lIGNvbmZpZ3VyYWJsZSwgd3JpdGFibGUsIGFuZCBub24tZW51bWVyYWJsZSBwcm9wc1xuICAgICAgICAvLyBpZiB0aGV5IGRvbid0IGV4aXN0LlxuICAgICAgICB2YXIgZGVmaW5lUHJvcGVydHk7XG4gICAgICAgIGlmIChzdXBwb3J0c0Rlc2NyaXB0b3JzKSB7XG4gICAgICAgICAgICBkZWZpbmVQcm9wZXJ0eSA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWUsIG1ldGhvZCwgZm9yY2VBc3NpZ24pIHtcbiAgICAgICAgICAgICAgICBpZiAoIWZvcmNlQXNzaWduICYmIChuYW1lIGluIG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAkT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iamVjdCwgbmFtZSwge1xuICAgICAgICAgICAgICAgICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IG1ldGhvZFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRlZmluZVByb3BlcnR5ID0gZnVuY3Rpb24gKG9iamVjdCwgbmFtZSwgbWV0aG9kLCBmb3JjZUFzc2lnbikge1xuICAgICAgICAgICAgICAgIGlmICghZm9yY2VBc3NpZ24gJiYgKG5hbWUgaW4gb2JqZWN0KSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIG9iamVjdFtuYW1lXSA9IG1ldGhvZDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZnVuY3Rpb24gZGVmaW5lUHJvcGVydGllcyhvYmplY3QsIG1hcCwgZm9yY2VBc3NpZ24pIHtcbiAgICAgICAgICAgIGZvciAodmFyIG5hbWUgaW4gbWFwKSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhcy5jYWxsKG1hcCwgbmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVmaW5lUHJvcGVydHkob2JqZWN0LCBuYW1lLCBtYXBbbmFtZV0sIGZvcmNlQXNzaWduKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfShPYmplY3RQcm90b3R5cGUuaGFzT3duUHJvcGVydHkpKTtcblxuICAgIC8vIHRoaXMgaXMgbmVlZGVkIGluIENocm9tZSAxNSAocHJvYmFibHkgZWFybGllcikgLSAzNlxuICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMzMzRcbiAgICBpZiAoJE9iamVjdC5kZWZpbmVQcm9wZXJ0eSAmJiBzdXBwb3J0c0Rlc2NyaXB0b3JzKSB7XG4gICAgICAgIHZhciBGID0gZnVuY3Rpb24gKCkge307XG4gICAgICAgIHZhciB0b1N0cmluZ1NlbnRpbmVsID0ge307XG4gICAgICAgIHZhciBzZW50aW5lbCA9IHsgdG9TdHJpbmc6IHRvU3RyaW5nU2VudGluZWwgfTtcbiAgICAgICAgJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShGLCAncHJvdG90eXBlJywgeyB2YWx1ZTogc2VudGluZWwsIHdyaXRhYmxlOiBmYWxzZSB9KTtcbiAgICAgICAgaWYgKChuZXcgRigpKS50b1N0cmluZyAhPT0gdG9TdHJpbmdTZW50aW5lbCkge1xuICAgICAgICAgICAgdmFyICRkUCA9ICRPYmplY3QuZGVmaW5lUHJvcGVydHk7XG4gICAgICAgICAgICB2YXIgJGdPUEQgPSAkT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcbiAgICAgICAgICAgIGRlZmluZVByb3BlcnRpZXMoJE9iamVjdCwge1xuICAgICAgICAgICAgICAgIGRlZmluZVByb3BlcnR5OiBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShvLCBrLCBkKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBrZXkgPSAkU3RyaW5nKGspO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIG8gPT09ICdmdW5jdGlvbicgJiYga2V5ID09PSAncHJvdG90eXBlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGRlc2MgPSAkZ09QRChvLCBrZXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlc2Mud3JpdGFibGUgJiYgIWQud3JpdGFibGUgJiYgJ3ZhbHVlJyBpbiBkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb1trZXldID0gZC52YWx1ZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHsgLyoqLyB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJGRQKG8sIGtleSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogJ2NvbmZpZ3VyYWJsZScgaW4gZCA/IGQuY29uZmlndXJhYmxlIDogZGVzYy5jb25maWd1cmFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogJ2VudW1lcmFibGUnIGluIGQgPyBkLmVudW1lcmFibGUgOiBkZXNjLmVudW1lcmFibGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGFibGU6IGQud3JpdGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAkZFAobywga2V5LCBkKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LCB0cnVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vXG4gICAgLy8gVXRpbFxuICAgIC8vID09PT09PVxuICAgIC8vXG5cbiAgICAvKiByZXBsYWNlYWJsZSB3aXRoIGh0dHBzOi8vbnBtanMuY29tL3BhY2thZ2UvZXMtYWJzdHJhY3QgL2hlbHBlcnMvaXNQcmltaXRpdmUgKi9cbiAgICB2YXIgaXNQcmltaXRpdmUgPSBmdW5jdGlvbiBpc1ByaW1pdGl2ZShpbnB1dCkge1xuICAgICAgICB2YXIgdHlwZSA9IHR5cGVvZiBpbnB1dDtcbiAgICAgICAgcmV0dXJuIGlucHV0ID09PSBudWxsIHx8ICh0eXBlICE9PSAnb2JqZWN0JyAmJiB0eXBlICE9PSAnZnVuY3Rpb24nKTtcbiAgICB9O1xuXG4gICAgdmFyIGlzQWN0dWFsTmFOID0gJE51bWJlci5pc05hTiB8fCBmdW5jdGlvbiBpc0FjdHVhbE5hTih4KSB7XG4gICAgICAgIHJldHVybiB4ICE9PSB4O1xuICAgIH07XG5cbiAgICB2YXIgRVMgPSB7XG4gICAgICAgIC8vIEVTNSA5LjRcbiAgICAgICAgLy8gaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4OS40XG4gICAgICAgIC8vIGh0dHA6Ly9qc3BlcmYuY29tL3RvLWludGVnZXJcbiAgICAgICAgLyogcmVwbGFjZWFibGUgd2l0aCBodHRwczovL25wbWpzLmNvbS9wYWNrYWdlL2VzLWFic3RyYWN0IEVTNS5Ub0ludGVnZXIgKi9cbiAgICAgICAgVG9JbnRlZ2VyOiBmdW5jdGlvbiBUb0ludGVnZXIobnVtKSB7XG4gICAgICAgICAgICB2YXIgbiA9ICtudW07XG4gICAgICAgICAgICBpZiAoaXNBY3R1YWxOYU4obikpIHtcbiAgICAgICAgICAgICAgICBuID0gMDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAobiAhPT0gMCAmJiBuICE9PSAoMSAvIDApICYmIG4gIT09IC0oMSAvIDApKSB7XG4gICAgICAgICAgICAgICAgbiA9IChuID4gMCB8fCAtMSkgKiBmbG9vcihhYnMobikpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG47XG4gICAgICAgIH0sXG5cbiAgICAgICAgLyogcmVwbGFjZWFibGUgd2l0aCBodHRwczovL25wbWpzLmNvbS9wYWNrYWdlL2VzLWFic3RyYWN0IEVTNS5Ub1ByaW1pdGl2ZSAqL1xuICAgICAgICBUb1ByaW1pdGl2ZTogZnVuY3Rpb24gVG9QcmltaXRpdmUoaW5wdXQpIHtcbiAgICAgICAgICAgIHZhciB2YWwsIHZhbHVlT2YsIHRvU3RyO1xuICAgICAgICAgICAgaWYgKGlzUHJpbWl0aXZlKGlucHV0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBpbnB1dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhbHVlT2YgPSBpbnB1dC52YWx1ZU9mO1xuICAgICAgICAgICAgaWYgKGlzQ2FsbGFibGUodmFsdWVPZikpIHtcbiAgICAgICAgICAgICAgICB2YWwgPSB2YWx1ZU9mLmNhbGwoaW5wdXQpO1xuICAgICAgICAgICAgICAgIGlmIChpc1ByaW1pdGl2ZSh2YWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdG9TdHIgPSBpbnB1dC50b1N0cmluZztcbiAgICAgICAgICAgIGlmIChpc0NhbGxhYmxlKHRvU3RyKSkge1xuICAgICAgICAgICAgICAgIHZhbCA9IHRvU3RyLmNhbGwoaW5wdXQpO1xuICAgICAgICAgICAgICAgIGlmIChpc1ByaW1pdGl2ZSh2YWwpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigpO1xuICAgICAgICB9LFxuXG4gICAgICAgIC8vIEVTNSA5LjlcbiAgICAgICAgLy8gaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4OS45XG4gICAgICAgIC8qIHJlcGxhY2VhYmxlIHdpdGggaHR0cHM6Ly9ucG1qcy5jb20vcGFja2FnZS9lcy1hYnN0cmFjdCBFUzUuVG9PYmplY3QgKi9cbiAgICAgICAgVG9PYmplY3Q6IGZ1bmN0aW9uIChvKSB7XG4gICAgICAgICAgICBpZiAobyA9PSBudWxsKSB7IC8vIHRoaXMgbWF0Y2hlcyBib3RoIG51bGwgYW5kIHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjYW4ndCBjb252ZXJ0IFwiICsgbyArICcgdG8gb2JqZWN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJE9iamVjdChvKTtcbiAgICAgICAgfSxcblxuICAgICAgICAvKiByZXBsYWNlYWJsZSB3aXRoIGh0dHBzOi8vbnBtanMuY29tL3BhY2thZ2UvZXMtYWJzdHJhY3QgRVM1LlRvVWludDMyICovXG4gICAgICAgIFRvVWludDMyOiBmdW5jdGlvbiBUb1VpbnQzMih4KSB7XG4gICAgICAgICAgICByZXR1cm4geCA+Pj4gMDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICAvL1xuICAgIC8vIEZ1bmN0aW9uXG4gICAgLy8gPT09PT09PT1cbiAgICAvL1xuXG4gICAgLy8gRVMtNSAxNS4zLjQuNVxuICAgIC8vIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjMuNC41XG5cbiAgICB2YXIgRW1wdHkgPSBmdW5jdGlvbiBFbXB0eSgpIHt9O1xuXG4gICAgZGVmaW5lUHJvcGVydGllcyhGdW5jdGlvblByb3RvdHlwZSwge1xuICAgICAgICBiaW5kOiBmdW5jdGlvbiBiaW5kKHRoYXQpIHsgLy8gLmxlbmd0aCBpcyAxXG4gICAgICAgICAgICAvLyAxLiBMZXQgVGFyZ2V0IGJlIHRoZSB0aGlzIHZhbHVlLlxuICAgICAgICAgICAgdmFyIHRhcmdldCA9IHRoaXM7XG4gICAgICAgICAgICAvLyAyLiBJZiBJc0NhbGxhYmxlKFRhcmdldCkgaXMgZmFsc2UsIHRocm93IGEgVHlwZUVycm9yIGV4Y2VwdGlvbi5cbiAgICAgICAgICAgIGlmICghaXNDYWxsYWJsZSh0YXJnZXQpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgY2FsbGVkIG9uIGluY29tcGF0aWJsZSAnICsgdGFyZ2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIDMuIExldCBBIGJlIGEgbmV3IChwb3NzaWJseSBlbXB0eSkgaW50ZXJuYWwgbGlzdCBvZiBhbGwgb2YgdGhlXG4gICAgICAgICAgICAvLyAgIGFyZ3VtZW50IHZhbHVlcyBwcm92aWRlZCBhZnRlciB0aGlzQXJnIChhcmcxLCBhcmcyIGV0YyksIGluIG9yZGVyLlxuICAgICAgICAgICAgLy8gWFhYIHNsaWNlZEFyZ3Mgd2lsbCBzdGFuZCBpbiBmb3IgXCJBXCIgaWYgdXNlZFxuICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcnJheV9zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7IC8vIGZvciBub3JtYWwgY2FsbFxuICAgICAgICAgICAgLy8gNC4gTGV0IEYgYmUgYSBuZXcgbmF0aXZlIEVDTUFTY3JpcHQgb2JqZWN0LlxuICAgICAgICAgICAgLy8gMTEuIFNldCB0aGUgW1tQcm90b3R5cGVdXSBpbnRlcm5hbCBwcm9wZXJ0eSBvZiBGIHRvIHRoZSBzdGFuZGFyZFxuICAgICAgICAgICAgLy8gICBidWlsdC1pbiBGdW5jdGlvbiBwcm90b3R5cGUgb2JqZWN0IGFzIHNwZWNpZmllZCBpbiAxNS4zLjMuMS5cbiAgICAgICAgICAgIC8vIDEyLiBTZXQgdGhlIFtbQ2FsbF1dIGludGVybmFsIHByb3BlcnR5IG9mIEYgYXMgZGVzY3JpYmVkIGluXG4gICAgICAgICAgICAvLyAgIDE1LjMuNC41LjEuXG4gICAgICAgICAgICAvLyAxMy4gU2V0IHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsIHByb3BlcnR5IG9mIEYgYXMgZGVzY3JpYmVkIGluXG4gICAgICAgICAgICAvLyAgIDE1LjMuNC41LjIuXG4gICAgICAgICAgICAvLyAxNC4gU2V0IHRoZSBbW0hhc0luc3RhbmNlXV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgRiBhcyBkZXNjcmliZWQgaW5cbiAgICAgICAgICAgIC8vICAgMTUuMy40LjUuMy5cbiAgICAgICAgICAgIHZhciBib3VuZDtcbiAgICAgICAgICAgIHZhciBiaW5kZXIgPSBmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIGJvdW5kKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIDE1LjMuNC41LjIgW1tDb25zdHJ1Y3RdXVxuICAgICAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsIG1ldGhvZCBvZiBhIGZ1bmN0aW9uIG9iamVjdCxcbiAgICAgICAgICAgICAgICAgICAgLy8gRiB0aGF0IHdhcyBjcmVhdGVkIHVzaW5nIHRoZSBiaW5kIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGFcbiAgICAgICAgICAgICAgICAgICAgLy8gbGlzdCBvZiBhcmd1bWVudHMgRXh0cmFBcmdzLCB0aGUgZm9sbG93aW5nIHN0ZXBzIGFyZSB0YWtlbjpcbiAgICAgICAgICAgICAgICAgICAgLy8gMS4gTGV0IHRhcmdldCBiZSB0aGUgdmFsdWUgb2YgRidzIFtbVGFyZ2V0RnVuY3Rpb25dXVxuICAgICAgICAgICAgICAgICAgICAvLyAgIGludGVybmFsIHByb3BlcnR5LlxuICAgICAgICAgICAgICAgICAgICAvLyAyLiBJZiB0YXJnZXQgaGFzIG5vIFtbQ29uc3RydWN0XV0gaW50ZXJuYWwgbWV0aG9kLCBhXG4gICAgICAgICAgICAgICAgICAgIC8vICAgVHlwZUVycm9yIGV4Y2VwdGlvbiBpcyB0aHJvd24uXG4gICAgICAgICAgICAgICAgICAgIC8vIDMuIExldCBib3VuZEFyZ3MgYmUgdGhlIHZhbHVlIG9mIEYncyBbW0JvdW5kQXJnc11dIGludGVybmFsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgcHJvcGVydHkuXG4gICAgICAgICAgICAgICAgICAgIC8vIDQuIExldCBhcmdzIGJlIGEgbmV3IGxpc3QgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhlXG4gICAgICAgICAgICAgICAgICAgIC8vICAgbGlzdCBib3VuZEFyZ3MgaW4gdGhlIHNhbWUgb3JkZXIgZm9sbG93ZWQgYnkgdGhlIHNhbWVcbiAgICAgICAgICAgICAgICAgICAgLy8gICB2YWx1ZXMgYXMgdGhlIGxpc3QgRXh0cmFBcmdzIGluIHRoZSBzYW1lIG9yZGVyLlxuICAgICAgICAgICAgICAgICAgICAvLyA1LiBSZXR1cm4gdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0NvbnN0cnVjdF1dIGludGVybmFsXG4gICAgICAgICAgICAgICAgICAgIC8vICAgbWV0aG9kIG9mIHRhcmdldCBwcm92aWRpbmcgYXJncyBhcyB0aGUgYXJndW1lbnRzLlxuXG4gICAgICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSBhcHBseS5jYWxsKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5X2NvbmNhdC5jYWxsKGFyZ3MsIGFycmF5X3NsaWNlLmNhbGwoYXJndW1lbnRzKSlcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCRPYmplY3QocmVzdWx0KSA9PT0gcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIDE1LjMuNC41LjEgW1tDYWxsXV1cbiAgICAgICAgICAgICAgICAvLyBXaGVuIHRoZSBbW0NhbGxdXSBpbnRlcm5hbCBtZXRob2Qgb2YgYSBmdW5jdGlvbiBvYmplY3QsIEYsXG4gICAgICAgICAgICAgICAgLy8gd2hpY2ggd2FzIGNyZWF0ZWQgdXNpbmcgdGhlIGJpbmQgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggYVxuICAgICAgICAgICAgICAgIC8vIHRoaXMgdmFsdWUgYW5kIGEgbGlzdCBvZiBhcmd1bWVudHMgRXh0cmFBcmdzLCB0aGUgZm9sbG93aW5nXG4gICAgICAgICAgICAgICAgLy8gc3RlcHMgYXJlIHRha2VuOlxuICAgICAgICAgICAgICAgIC8vIDEuIExldCBib3VuZEFyZ3MgYmUgdGhlIHZhbHVlIG9mIEYncyBbW0JvdW5kQXJnc11dIGludGVybmFsXG4gICAgICAgICAgICAgICAgLy8gICBwcm9wZXJ0eS5cbiAgICAgICAgICAgICAgICAvLyAyLiBMZXQgYm91bmRUaGlzIGJlIHRoZSB2YWx1ZSBvZiBGJ3MgW1tCb3VuZFRoaXNdXSBpbnRlcm5hbFxuICAgICAgICAgICAgICAgIC8vICAgcHJvcGVydHkuXG4gICAgICAgICAgICAgICAgLy8gMy4gTGV0IHRhcmdldCBiZSB0aGUgdmFsdWUgb2YgRidzIFtbVGFyZ2V0RnVuY3Rpb25dXSBpbnRlcm5hbFxuICAgICAgICAgICAgICAgIC8vICAgcHJvcGVydHkuXG4gICAgICAgICAgICAgICAgLy8gNC4gTGV0IGFyZ3MgYmUgYSBuZXcgbGlzdCBjb250YWluaW5nIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGVcbiAgICAgICAgICAgICAgICAvLyAgIGxpc3QgYm91bmRBcmdzIGluIHRoZSBzYW1lIG9yZGVyIGZvbGxvd2VkIGJ5IHRoZSBzYW1lXG4gICAgICAgICAgICAgICAgLy8gICB2YWx1ZXMgYXMgdGhlIGxpc3QgRXh0cmFBcmdzIGluIHRoZSBzYW1lIG9yZGVyLlxuICAgICAgICAgICAgICAgIC8vIDUuIFJldHVybiB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIFtbQ2FsbF1dIGludGVybmFsIG1ldGhvZFxuICAgICAgICAgICAgICAgIC8vICAgb2YgdGFyZ2V0IHByb3ZpZGluZyBib3VuZFRoaXMgYXMgdGhlIHRoaXMgdmFsdWUgYW5kXG4gICAgICAgICAgICAgICAgLy8gICBwcm92aWRpbmcgYXJncyBhcyB0aGUgYXJndW1lbnRzLlxuXG4gICAgICAgICAgICAgICAgLy8gZXF1aXY6IHRhcmdldC5jYWxsKHRoaXMsIC4uLmJvdW5kQXJncywgLi4uYXJncylcbiAgICAgICAgICAgICAgICByZXR1cm4gYXBwbHkuY2FsbChcbiAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LFxuICAgICAgICAgICAgICAgICAgICB0aGF0LFxuICAgICAgICAgICAgICAgICAgICBhcnJheV9jb25jYXQuY2FsbChhcmdzLCBhcnJheV9zbGljZS5jYWxsKGFyZ3VtZW50cykpXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgLy8gMTUuIElmIHRoZSBbW0NsYXNzXV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgVGFyZ2V0IGlzIFwiRnVuY3Rpb25cIiwgdGhlblxuICAgICAgICAgICAgLy8gICAgIGEuIExldCBMIGJlIHRoZSBsZW5ndGggcHJvcGVydHkgb2YgVGFyZ2V0IG1pbnVzIHRoZSBsZW5ndGggb2YgQS5cbiAgICAgICAgICAgIC8vICAgICBiLiBTZXQgdGhlIGxlbmd0aCBvd24gcHJvcGVydHkgb2YgRiB0byBlaXRoZXIgMCBvciBMLCB3aGljaGV2ZXIgaXNcbiAgICAgICAgICAgIC8vICAgICAgIGxhcmdlci5cbiAgICAgICAgICAgIC8vIDE2LiBFbHNlIHNldCB0aGUgbGVuZ3RoIG93biBwcm9wZXJ0eSBvZiBGIHRvIDAuXG5cbiAgICAgICAgICAgIHZhciBib3VuZExlbmd0aCA9IG1heCgwLCB0YXJnZXQubGVuZ3RoIC0gYXJncy5sZW5ndGgpO1xuXG4gICAgICAgICAgICAvLyAxNy4gU2V0IHRoZSBhdHRyaWJ1dGVzIG9mIHRoZSBsZW5ndGggb3duIHByb3BlcnR5IG9mIEYgdG8gdGhlIHZhbHVlc1xuICAgICAgICAgICAgLy8gICBzcGVjaWZpZWQgaW4gMTUuMy41LjEuXG4gICAgICAgICAgICB2YXIgYm91bmRBcmdzID0gW107XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGJvdW5kTGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBhcnJheV9wdXNoLmNhbGwoYm91bmRBcmdzLCAnJCcgKyBpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gWFhYIEJ1aWxkIGEgZHluYW1pYyBmdW5jdGlvbiB3aXRoIGRlc2lyZWQgYW1vdW50IG9mIGFyZ3VtZW50cyBpcyB0aGUgb25seVxuICAgICAgICAgICAgLy8gd2F5IHRvIHNldCB0aGUgbGVuZ3RoIHByb3BlcnR5IG9mIGEgZnVuY3Rpb24uXG4gICAgICAgICAgICAvLyBJbiBlbnZpcm9ubWVudHMgd2hlcmUgQ29udGVudCBTZWN1cml0eSBQb2xpY2llcyBlbmFibGVkIChDaHJvbWUgZXh0ZW5zaW9ucyxcbiAgICAgICAgICAgIC8vIGZvciBleC4pIGFsbCB1c2Ugb2YgZXZhbCBvciBGdW5jdGlvbiBjb3N0cnVjdG9yIHRocm93cyBhbiBleGNlcHRpb24uXG4gICAgICAgICAgICAvLyBIb3dldmVyIGluIGFsbCBvZiB0aGVzZSBlbnZpcm9ubWVudHMgRnVuY3Rpb24ucHJvdG90eXBlLmJpbmQgZXhpc3RzXG4gICAgICAgICAgICAvLyBhbmQgc28gdGhpcyBjb2RlIHdpbGwgbmV2ZXIgYmUgZXhlY3V0ZWQuXG4gICAgICAgICAgICBib3VuZCA9ICRGdW5jdGlvbignYmluZGVyJywgJ3JldHVybiBmdW5jdGlvbiAoJyArIGFycmF5X2pvaW4uY2FsbChib3VuZEFyZ3MsICcsJykgKyAnKXsgcmV0dXJuIGJpbmRlci5hcHBseSh0aGlzLCBhcmd1bWVudHMpOyB9JykoYmluZGVyKTtcblxuICAgICAgICAgICAgaWYgKHRhcmdldC5wcm90b3R5cGUpIHtcbiAgICAgICAgICAgICAgICBFbXB0eS5wcm90b3R5cGUgPSB0YXJnZXQucHJvdG90eXBlO1xuICAgICAgICAgICAgICAgIGJvdW5kLnByb3RvdHlwZSA9IG5ldyBFbXB0eSgpO1xuICAgICAgICAgICAgICAgIC8vIENsZWFuIHVwIGRhbmdsaW5nIHJlZmVyZW5jZXMuXG4gICAgICAgICAgICAgICAgRW1wdHkucHJvdG90eXBlID0gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVE9ET1xuICAgICAgICAgICAgLy8gMTguIFNldCB0aGUgW1tFeHRlbnNpYmxlXV0gaW50ZXJuYWwgcHJvcGVydHkgb2YgRiB0byB0cnVlLlxuXG4gICAgICAgICAgICAvLyBUT0RPXG4gICAgICAgICAgICAvLyAxOS4gTGV0IHRocm93ZXIgYmUgdGhlIFtbVGhyb3dUeXBlRXJyb3JdXSBmdW5jdGlvbiBPYmplY3QgKDEzLjIuMykuXG4gICAgICAgICAgICAvLyAyMC4gQ2FsbCB0aGUgW1tEZWZpbmVPd25Qcm9wZXJ0eV1dIGludGVybmFsIG1ldGhvZCBvZiBGIHdpdGhcbiAgICAgICAgICAgIC8vICAgYXJndW1lbnRzIFwiY2FsbGVyXCIsIFByb3BlcnR5RGVzY3JpcHRvciB7W1tHZXRdXTogdGhyb3dlciwgW1tTZXRdXTpcbiAgICAgICAgICAgIC8vICAgdGhyb3dlciwgW1tFbnVtZXJhYmxlXV06IGZhbHNlLCBbW0NvbmZpZ3VyYWJsZV1dOiBmYWxzZX0sIGFuZFxuICAgICAgICAgICAgLy8gICBmYWxzZS5cbiAgICAgICAgICAgIC8vIDIxLiBDYWxsIHRoZSBbW0RlZmluZU93blByb3BlcnR5XV0gaW50ZXJuYWwgbWV0aG9kIG9mIEYgd2l0aFxuICAgICAgICAgICAgLy8gICBhcmd1bWVudHMgXCJhcmd1bWVudHNcIiwgUHJvcGVydHlEZXNjcmlwdG9yIHtbW0dldF1dOiB0aHJvd2VyLFxuICAgICAgICAgICAgLy8gICBbW1NldF1dOiB0aHJvd2VyLCBbW0VudW1lcmFibGVdXTogZmFsc2UsIFtbQ29uZmlndXJhYmxlXV06IGZhbHNlfSxcbiAgICAgICAgICAgIC8vICAgYW5kIGZhbHNlLlxuXG4gICAgICAgICAgICAvLyBUT0RPXG4gICAgICAgICAgICAvLyBOT1RFIEZ1bmN0aW9uIG9iamVjdHMgY3JlYXRlZCB1c2luZyBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCBkbyBub3RcbiAgICAgICAgICAgIC8vIGhhdmUgYSBwcm90b3R5cGUgcHJvcGVydHkgb3IgdGhlIFtbQ29kZV1dLCBbW0Zvcm1hbFBhcmFtZXRlcnNdXSwgYW5kXG4gICAgICAgICAgICAvLyBbW1Njb3BlXV0gaW50ZXJuYWwgcHJvcGVydGllcy5cbiAgICAgICAgICAgIC8vIFhYWCBjYW4ndCBkZWxldGUgcHJvdG90eXBlIGluIHB1cmUtanMuXG5cbiAgICAgICAgICAgIC8vIDIyLiBSZXR1cm4gRi5cbiAgICAgICAgICAgIHJldHVybiBib3VuZDtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgLy8gX1BsZWFzZSBub3RlOiBTaG9ydGN1dHMgYXJlIGRlZmluZWQgYWZ0ZXIgYEZ1bmN0aW9uLnByb3RvdHlwZS5iaW5kYCBhcyB3ZVxuICAgIC8vIHVzZSBpdCBpbiBkZWZpbmluZyBzaG9ydGN1dHMuXG4gICAgdmFyIG93bnMgPSBjYWxsLmJpbmQoT2JqZWN0UHJvdG90eXBlLmhhc093blByb3BlcnR5KTtcbiAgICB2YXIgdG9TdHIgPSBjYWxsLmJpbmQoT2JqZWN0UHJvdG90eXBlLnRvU3RyaW5nKTtcbiAgICB2YXIgYXJyYXlTbGljZSA9IGNhbGwuYmluZChhcnJheV9zbGljZSk7XG4gICAgdmFyIGFycmF5U2xpY2VBcHBseSA9IGFwcGx5LmJpbmQoYXJyYXlfc2xpY2UpO1xuICAgIC8qIGdsb2JhbHMgZG9jdW1lbnQgKi9cbiAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAnb2JqZWN0JyAmJiBkb2N1bWVudCAmJiBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGFycmF5U2xpY2UoZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNoaWxkTm9kZXMpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB2YXIgb3JpZ0FycmF5U2xpY2UgPSBhcnJheVNsaWNlO1xuICAgICAgICAgICAgdmFyIG9yaWdBcnJheVNsaWNlQXBwbHkgPSBhcnJheVNsaWNlQXBwbHk7XG4gICAgICAgICAgICBhcnJheVNsaWNlID0gZnVuY3Rpb24gYXJyYXlTbGljZUlFKGFycikge1xuICAgICAgICAgICAgICAgIHZhciByID0gW107XG4gICAgICAgICAgICAgICAgdmFyIGkgPSBhcnIubGVuZ3RoO1xuICAgICAgICAgICAgICAgIHdoaWxlIChpLS0gPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJbaV0gPSBhcnJbaV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnQXJyYXlTbGljZUFwcGx5KHIsIG9yaWdBcnJheVNsaWNlKGFyZ3VtZW50cywgMSkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIGFycmF5U2xpY2VBcHBseSA9IGZ1bmN0aW9uIGFycmF5U2xpY2VBcHBseUlFKGFyciwgYXJncykge1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnQXJyYXlTbGljZUFwcGx5KGFycmF5U2xpY2UoYXJyKSwgYXJncyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBzdHJTbGljZSA9IGNhbGwuYmluZChTdHJpbmdQcm90b3R5cGUuc2xpY2UpO1xuICAgIHZhciBzdHJTcGxpdCA9IGNhbGwuYmluZChTdHJpbmdQcm90b3R5cGUuc3BsaXQpO1xuICAgIHZhciBzdHJJbmRleE9mID0gY2FsbC5iaW5kKFN0cmluZ1Byb3RvdHlwZS5pbmRleE9mKTtcbiAgICB2YXIgcHVzaENhbGwgPSBjYWxsLmJpbmQoYXJyYXlfcHVzaCk7XG4gICAgdmFyIGlzRW51bSA9IGNhbGwuYmluZChPYmplY3RQcm90b3R5cGUucHJvcGVydHlJc0VudW1lcmFibGUpO1xuICAgIHZhciBhcnJheVNvcnQgPSBjYWxsLmJpbmQoQXJyYXlQcm90b3R5cGUuc29ydCk7XG5cbiAgICAvL1xuICAgIC8vIEFycmF5XG4gICAgLy8gPT09PT1cbiAgICAvL1xuXG4gICAgdmFyIGlzQXJyYXkgPSAkQXJyYXkuaXNBcnJheSB8fCBmdW5jdGlvbiBpc0FycmF5KG9iaikge1xuICAgICAgICByZXR1cm4gdG9TdHIob2JqKSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICB9O1xuXG4gICAgLy8gRVM1IDE1LjQuNC4xMlxuICAgIC8vIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjQuNC4xM1xuICAgIC8vIFJldHVybiBsZW4rYXJnQ291bnQuXG4gICAgLy8gW2J1Z2ZpeCwgaWVsdDhdXG4gICAgLy8gSUUgPCA4IGJ1ZzogW10udW5zaGlmdCgwKSA9PT0gdW5kZWZpbmVkIGJ1dCBzaG91bGQgYmUgXCIxXCJcbiAgICB2YXIgaGFzVW5zaGlmdFJldHVyblZhbHVlQnVnID0gW10udW5zaGlmdCgwKSAhPT0gMTtcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKEFycmF5UHJvdG90eXBlLCB7XG4gICAgICAgIHVuc2hpZnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGFycmF5X3Vuc2hpZnQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH0sIGhhc1Vuc2hpZnRSZXR1cm5WYWx1ZUJ1Zyk7XG5cbiAgICAvLyBFUzUgMTUuNC4zLjJcbiAgICAvLyBodHRwczovL2VzNS5naXRodWIuaW8vI3gxNS40LjMuMlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L2lzQXJyYXlcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKCRBcnJheSwgeyBpc0FycmF5OiBpc0FycmF5IH0pO1xuXG4gICAgLy8gVGhlIElzQ2FsbGFibGUoKSBjaGVjayBpbiB0aGUgQXJyYXkgZnVuY3Rpb25zXG4gICAgLy8gaGFzIGJlZW4gcmVwbGFjZWQgd2l0aCBhIHN0cmljdCBjaGVjayBvbiB0aGVcbiAgICAvLyBpbnRlcm5hbCBjbGFzcyBvZiB0aGUgb2JqZWN0IHRvIHRyYXAgY2FzZXMgd2hlcmVcbiAgICAvLyB0aGUgcHJvdmlkZWQgZnVuY3Rpb24gd2FzIGFjdHVhbGx5IGEgcmVndWxhclxuICAgIC8vIGV4cHJlc3Npb24gbGl0ZXJhbCwgd2hpY2ggaW4gVjggYW5kXG4gICAgLy8gSmF2YVNjcmlwdENvcmUgaXMgYSB0eXBlb2YgXCJmdW5jdGlvblwiLiAgT25seSBpblxuICAgIC8vIFY4IGFyZSByZWd1bGFyIGV4cHJlc3Npb24gbGl0ZXJhbHMgcGVybWl0dGVkIGFzXG4gICAgLy8gcmVkdWNlIHBhcmFtZXRlcnMsIHNvIGl0IGlzIGRlc2lyYWJsZSBpbiB0aGVcbiAgICAvLyBnZW5lcmFsIGNhc2UgZm9yIHRoZSBzaGltIHRvIG1hdGNoIHRoZSBtb3JlXG4gICAgLy8gc3RyaWN0IGFuZCBjb21tb24gYmVoYXZpb3Igb2YgcmVqZWN0aW5nIHJlZ3VsYXJcbiAgICAvLyBleHByZXNzaW9ucy5cblxuICAgIC8vIEVTNSAxNS40LjQuMThcbiAgICAvLyBodHRwczovL2VzNS5naXRodWIuaW8vI3gxNS40LjQuMThcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9hcnJheS9mb3JFYWNoXG5cbiAgICAvLyBDaGVjayBmYWlsdXJlIG9mIGJ5LWluZGV4IGFjY2VzcyBvZiBzdHJpbmcgY2hhcmFjdGVycyAoSUUgPCA5KVxuICAgIC8vIGFuZCBmYWlsdXJlIG9mIGAwIGluIGJveGVkU3RyaW5nYCAoUmhpbm8pXG4gICAgdmFyIGJveGVkU3RyaW5nID0gJE9iamVjdCgnYScpO1xuICAgIHZhciBzcGxpdFN0cmluZyA9IGJveGVkU3RyaW5nWzBdICE9PSAnYScgfHwgISgwIGluIGJveGVkU3RyaW5nKTtcblxuICAgIHZhciBwcm9wZXJseUJveGVzQ29udGV4dCA9IGZ1bmN0aW9uIHByb3Blcmx5Qm94ZWQobWV0aG9kKSB7XG4gICAgICAgIC8vIENoZWNrIG5vZGUgMC42LjIxIGJ1ZyB3aGVyZSB0aGlyZCBwYXJhbWV0ZXIgaXMgbm90IGJveGVkXG4gICAgICAgIHZhciBwcm9wZXJseUJveGVzTm9uU3RyaWN0ID0gdHJ1ZTtcbiAgICAgICAgdmFyIHByb3Blcmx5Qm94ZXNTdHJpY3QgPSB0cnVlO1xuICAgICAgICB2YXIgdGhyZXdFeGNlcHRpb24gPSBmYWxzZTtcbiAgICAgICAgaWYgKG1ldGhvZCkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBtZXRob2QuY2FsbCgnZm9vJywgZnVuY3Rpb24gKF8sIF9fLCBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgY29udGV4dCAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3Blcmx5Qm94ZXNOb25TdHJpY3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgbWV0aG9kLmNhbGwoWzFdLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICd1c2Ugc3RyaWN0JztcblxuICAgICAgICAgICAgICAgICAgICBwcm9wZXJseUJveGVzU3RyaWN0ID0gdHlwZW9mIHRoaXMgPT09ICdzdHJpbmcnO1xuICAgICAgICAgICAgICAgIH0sICd4Jyk7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgdGhyZXdFeGNlcHRpb24gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiAhIW1ldGhvZCAmJiAhdGhyZXdFeGNlcHRpb24gJiYgcHJvcGVybHlCb3hlc05vblN0cmljdCAmJiBwcm9wZXJseUJveGVzU3RyaWN0O1xuICAgIH07XG5cbiAgICBkZWZpbmVQcm9wZXJ0aWVzKEFycmF5UHJvdG90eXBlLCB7XG4gICAgICAgIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2tmbi8qLCB0aGlzQXJnKi8pIHtcbiAgICAgICAgICAgIHZhciBvYmplY3QgPSBFUy5Ub09iamVjdCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBzZWxmID0gc3BsaXRTdHJpbmcgJiYgaXNTdHJpbmcodGhpcykgPyBzdHJTcGxpdCh0aGlzLCAnJykgOiBvYmplY3Q7XG4gICAgICAgICAgICB2YXIgaSA9IC0xO1xuICAgICAgICAgICAgdmFyIGxlbmd0aCA9IEVTLlRvVWludDMyKHNlbGYubGVuZ3RoKTtcbiAgICAgICAgICAgIHZhciBUO1xuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgVCA9IGFyZ3VtZW50c1sxXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb25cbiAgICAgICAgICAgIGlmICghaXNDYWxsYWJsZShjYWxsYmFja2ZuKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FycmF5LnByb3RvdHlwZS5mb3JFYWNoIGNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB3aGlsZSAoKytpIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgaW4gc2VsZikge1xuICAgICAgICAgICAgICAgICAgICAvLyBJbnZva2UgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggY2FsbCwgcGFzc2luZyBhcmd1bWVudHM6XG4gICAgICAgICAgICAgICAgICAgIC8vIGNvbnRleHQsIHByb3BlcnR5IHZhbHVlLCBwcm9wZXJ0eSBrZXksIHRoaXNBcmcgb2JqZWN0XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgVCA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4oc2VsZltpXSwgaSwgb2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4uY2FsbChULCBzZWxmW2ldLCBpLCBvYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSwgIXByb3Blcmx5Qm94ZXNDb250ZXh0KEFycmF5UHJvdG90eXBlLmZvckVhY2gpKTtcblxuICAgIC8vIEVTNSAxNS40LjQuMTlcbiAgICAvLyBodHRwczovL2VzNS5naXRodWIuaW8vI3gxNS40LjQuMTlcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9Db3JlX0phdmFTY3JpcHRfMS41X1JlZmVyZW5jZS9PYmplY3RzL0FycmF5L21hcFxuICAgIGRlZmluZVByb3BlcnRpZXMoQXJyYXlQcm90b3R5cGUsIHtcbiAgICAgICAgbWFwOiBmdW5jdGlvbiBtYXAoY2FsbGJhY2tmbi8qLCB0aGlzQXJnKi8pIHtcbiAgICAgICAgICAgIHZhciBvYmplY3QgPSBFUy5Ub09iamVjdCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBzZWxmID0gc3BsaXRTdHJpbmcgJiYgaXNTdHJpbmcodGhpcykgPyBzdHJTcGxpdCh0aGlzLCAnJykgOiBvYmplY3Q7XG4gICAgICAgICAgICB2YXIgbGVuZ3RoID0gRVMuVG9VaW50MzIoc2VsZi5sZW5ndGgpO1xuICAgICAgICAgICAgdmFyIHJlc3VsdCA9ICRBcnJheShsZW5ndGgpO1xuICAgICAgICAgICAgdmFyIFQ7XG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICBUID0gYXJndW1lbnRzWzFdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiBubyBjYWxsYmFjayBmdW5jdGlvbiBvciBpZiBjYWxsYmFjayBpcyBub3QgYSBjYWxsYWJsZSBmdW5jdGlvblxuICAgICAgICAgICAgaWYgKCFpc0NhbGxhYmxlKGNhbGxiYWNrZm4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkucHJvdG90eXBlLm1hcCBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBUID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gY2FsbGJhY2tmbihzZWxmW2ldLCBpLCBvYmplY3QpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0W2ldID0gY2FsbGJhY2tmbi5jYWxsKFQsIHNlbGZbaV0sIGksIG9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfSwgIXByb3Blcmx5Qm94ZXNDb250ZXh0KEFycmF5UHJvdG90eXBlLm1hcCkpO1xuXG4gICAgLy8gRVM1IDE1LjQuNC4yMFxuICAgIC8vIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjQuNC4yMFxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvZmlsdGVyXG4gICAgZGVmaW5lUHJvcGVydGllcyhBcnJheVByb3RvdHlwZSwge1xuICAgICAgICBmaWx0ZXI6IGZ1bmN0aW9uIGZpbHRlcihjYWxsYmFja2ZuLyosIHRoaXNBcmcqLykge1xuICAgICAgICAgICAgdmFyIG9iamVjdCA9IEVTLlRvT2JqZWN0KHRoaXMpO1xuICAgICAgICAgICAgdmFyIHNlbGYgPSBzcGxpdFN0cmluZyAmJiBpc1N0cmluZyh0aGlzKSA/IHN0clNwbGl0KHRoaXMsICcnKSA6IG9iamVjdDtcbiAgICAgICAgICAgIHZhciBsZW5ndGggPSBFUy5Ub1VpbnQzMihzZWxmLmxlbmd0aCk7XG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgICAgICB2YXIgdmFsdWU7XG4gICAgICAgICAgICB2YXIgVDtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIFQgPSBhcmd1bWVudHNbMV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uXG4gICAgICAgICAgICBpZiAoIWlzQ2FsbGFibGUoY2FsbGJhY2tmbikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcnJheS5wcm90b3R5cGUuZmlsdGVyIGNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgaW4gc2VsZikge1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGZbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgVCA9PT0gJ3VuZGVmaW5lZCcgPyBjYWxsYmFja2ZuKHZhbHVlLCBpLCBvYmplY3QpIDogY2FsbGJhY2tmbi5jYWxsKFQsIHZhbHVlLCBpLCBvYmplY3QpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXNoQ2FsbChyZXN1bHQsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9LCAhcHJvcGVybHlCb3hlc0NvbnRleHQoQXJyYXlQcm90b3R5cGUuZmlsdGVyKSk7XG5cbiAgICAvLyBFUzUgMTUuNC40LjE2XG4gICAgLy8gaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTUuNC40LjE2XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvZXZlcnlcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKEFycmF5UHJvdG90eXBlLCB7XG4gICAgICAgIGV2ZXJ5OiBmdW5jdGlvbiBldmVyeShjYWxsYmFja2ZuLyosIHRoaXNBcmcqLykge1xuICAgICAgICAgICAgdmFyIG9iamVjdCA9IEVTLlRvT2JqZWN0KHRoaXMpO1xuICAgICAgICAgICAgdmFyIHNlbGYgPSBzcGxpdFN0cmluZyAmJiBpc1N0cmluZyh0aGlzKSA/IHN0clNwbGl0KHRoaXMsICcnKSA6IG9iamVjdDtcbiAgICAgICAgICAgIHZhciBsZW5ndGggPSBFUy5Ub1VpbnQzMihzZWxmLmxlbmd0aCk7XG4gICAgICAgICAgICB2YXIgVDtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgIFQgPSBhcmd1bWVudHNbMV07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIElmIG5vIGNhbGxiYWNrIGZ1bmN0aW9uIG9yIGlmIGNhbGxiYWNrIGlzIG5vdCBhIGNhbGxhYmxlIGZ1bmN0aW9uXG4gICAgICAgICAgICBpZiAoIWlzQ2FsbGFibGUoY2FsbGJhY2tmbikpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcnJheS5wcm90b3R5cGUuZXZlcnkgY2FsbGJhY2sgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmICEodHlwZW9mIFQgPT09ICd1bmRlZmluZWQnID8gY2FsbGJhY2tmbihzZWxmW2ldLCBpLCBvYmplY3QpIDogY2FsbGJhY2tmbi5jYWxsKFQsIHNlbGZbaV0sIGksIG9iamVjdCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0sICFwcm9wZXJseUJveGVzQ29udGV4dChBcnJheVByb3RvdHlwZS5ldmVyeSkpO1xuXG4gICAgLy8gRVM1IDE1LjQuNC4xN1xuICAgIC8vIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjQuNC4xN1xuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0FycmF5L3NvbWVcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKEFycmF5UHJvdG90eXBlLCB7XG4gICAgICAgIHNvbWU6IGZ1bmN0aW9uIHNvbWUoY2FsbGJhY2tmbi8qLCB0aGlzQXJnICovKSB7XG4gICAgICAgICAgICB2YXIgb2JqZWN0ID0gRVMuVG9PYmplY3QodGhpcyk7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHNwbGl0U3RyaW5nICYmIGlzU3RyaW5nKHRoaXMpID8gc3RyU3BsaXQodGhpcywgJycpIDogb2JqZWN0O1xuICAgICAgICAgICAgdmFyIGxlbmd0aCA9IEVTLlRvVWludDMyKHNlbGYubGVuZ3RoKTtcbiAgICAgICAgICAgIHZhciBUO1xuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgVCA9IGFyZ3VtZW50c1sxXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb25cbiAgICAgICAgICAgIGlmICghaXNDYWxsYWJsZShjYWxsYmFja2ZuKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FycmF5LnByb3RvdHlwZS5zb21lIGNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgaW4gc2VsZiAmJiAodHlwZW9mIFQgPT09ICd1bmRlZmluZWQnID8gY2FsbGJhY2tmbihzZWxmW2ldLCBpLCBvYmplY3QpIDogY2FsbGJhY2tmbi5jYWxsKFQsIHNlbGZbaV0sIGksIG9iamVjdCkpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0sICFwcm9wZXJseUJveGVzQ29udGV4dChBcnJheVByb3RvdHlwZS5zb21lKSk7XG5cbiAgICAvLyBFUzUgMTUuNC40LjIxXG4gICAgLy8gaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTUuNC40LjIxXG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vQ29yZV9KYXZhU2NyaXB0XzEuNV9SZWZlcmVuY2UvT2JqZWN0cy9BcnJheS9yZWR1Y2VcbiAgICB2YXIgcmVkdWNlQ29lcmNlc1RvT2JqZWN0ID0gZmFsc2U7XG4gICAgaWYgKEFycmF5UHJvdG90eXBlLnJlZHVjZSkge1xuICAgICAgICByZWR1Y2VDb2VyY2VzVG9PYmplY3QgPSB0eXBlb2YgQXJyYXlQcm90b3R5cGUucmVkdWNlLmNhbGwoJ2VzNScsIGZ1bmN0aW9uIChfLCBfXywgX19fLCBsaXN0KSB7XG4gICAgICAgICAgICByZXR1cm4gbGlzdDtcbiAgICAgICAgfSkgPT09ICdvYmplY3QnO1xuICAgIH1cbiAgICBkZWZpbmVQcm9wZXJ0aWVzKEFycmF5UHJvdG90eXBlLCB7XG4gICAgICAgIHJlZHVjZTogZnVuY3Rpb24gcmVkdWNlKGNhbGxiYWNrZm4vKiwgaW5pdGlhbFZhbHVlKi8pIHtcbiAgICAgICAgICAgIHZhciBvYmplY3QgPSBFUy5Ub09iamVjdCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBzZWxmID0gc3BsaXRTdHJpbmcgJiYgaXNTdHJpbmcodGhpcykgPyBzdHJTcGxpdCh0aGlzLCAnJykgOiBvYmplY3Q7XG4gICAgICAgICAgICB2YXIgbGVuZ3RoID0gRVMuVG9VaW50MzIoc2VsZi5sZW5ndGgpO1xuXG4gICAgICAgICAgICAvLyBJZiBubyBjYWxsYmFjayBmdW5jdGlvbiBvciBpZiBjYWxsYmFjayBpcyBub3QgYSBjYWxsYWJsZSBmdW5jdGlvblxuICAgICAgICAgICAgaWYgKCFpc0NhbGxhYmxlKGNhbGxiYWNrZm4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJyYXkucHJvdG90eXBlLnJlZHVjZSBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbm8gdmFsdWUgdG8gcmV0dXJuIGlmIG5vIGluaXRpYWwgdmFsdWUgYW5kIGFuIGVtcHR5IGFycmF5XG4gICAgICAgICAgICBpZiAobGVuZ3RoID09PSAwICYmIGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBpID0gMDtcbiAgICAgICAgICAgIHZhciByZXN1bHQ7XG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gYXJndW1lbnRzWzFdO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpIGluIHNlbGYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHNlbGZbaSsrXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gaWYgYXJyYXkgY29udGFpbnMgbm8gdmFsdWVzLCBubyBpbml0aWFsIHZhbHVlIHRvIHJldHVyblxuICAgICAgICAgICAgICAgICAgICBpZiAoKytpID49IGxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigncmVkdWNlIG9mIGVtcHR5IGFycmF5IHdpdGggbm8gaW5pdGlhbCB2YWx1ZScpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSB3aGlsZSAodHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGZvciAoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaSBpbiBzZWxmKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IGNhbGxiYWNrZm4ocmVzdWx0LCBzZWxmW2ldLCBpLCBvYmplY3QpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH0sICFyZWR1Y2VDb2VyY2VzVG9PYmplY3QpO1xuXG4gICAgLy8gRVM1IDE1LjQuNC4yMlxuICAgIC8vIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjQuNC4yMlxuICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL0NvcmVfSmF2YVNjcmlwdF8xLjVfUmVmZXJlbmNlL09iamVjdHMvQXJyYXkvcmVkdWNlUmlnaHRcbiAgICB2YXIgcmVkdWNlUmlnaHRDb2VyY2VzVG9PYmplY3QgPSBmYWxzZTtcbiAgICBpZiAoQXJyYXlQcm90b3R5cGUucmVkdWNlUmlnaHQpIHtcbiAgICAgICAgcmVkdWNlUmlnaHRDb2VyY2VzVG9PYmplY3QgPSB0eXBlb2YgQXJyYXlQcm90b3R5cGUucmVkdWNlUmlnaHQuY2FsbCgnZXM1JywgZnVuY3Rpb24gKF8sIF9fLCBfX18sIGxpc3QpIHtcbiAgICAgICAgICAgIHJldHVybiBsaXN0O1xuICAgICAgICB9KSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIGRlZmluZVByb3BlcnRpZXMoQXJyYXlQcm90b3R5cGUsIHtcbiAgICAgICAgcmVkdWNlUmlnaHQ6IGZ1bmN0aW9uIHJlZHVjZVJpZ2h0KGNhbGxiYWNrZm4vKiwgaW5pdGlhbCovKSB7XG4gICAgICAgICAgICB2YXIgb2JqZWN0ID0gRVMuVG9PYmplY3QodGhpcyk7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHNwbGl0U3RyaW5nICYmIGlzU3RyaW5nKHRoaXMpID8gc3RyU3BsaXQodGhpcywgJycpIDogb2JqZWN0O1xuICAgICAgICAgICAgdmFyIGxlbmd0aCA9IEVTLlRvVWludDMyKHNlbGYubGVuZ3RoKTtcblxuICAgICAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgZnVuY3Rpb24gb3IgaWYgY2FsbGJhY2sgaXMgbm90IGEgY2FsbGFibGUgZnVuY3Rpb25cbiAgICAgICAgICAgIGlmICghaXNDYWxsYWJsZShjYWxsYmFja2ZuKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FycmF5LnByb3RvdHlwZS5yZWR1Y2VSaWdodCBjYWxsYmFjayBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbm8gdmFsdWUgdG8gcmV0dXJuIGlmIG5vIGluaXRpYWwgdmFsdWUsIGVtcHR5IGFycmF5XG4gICAgICAgICAgICBpZiAobGVuZ3RoID09PSAwICYmIGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWR1Y2VSaWdodCBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHJlc3VsdDtcbiAgICAgICAgICAgIHZhciBpID0gbGVuZ3RoIC0gMTtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDIpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBhcmd1bWVudHNbMV07XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGkgaW4gc2VsZikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gc2VsZltpLS1dO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvLyBpZiBhcnJheSBjb250YWlucyBubyB2YWx1ZXMsIG5vIGluaXRpYWwgdmFsdWUgdG8gcmV0dXJuXG4gICAgICAgICAgICAgICAgICAgIGlmICgtLWkgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdyZWR1Y2VSaWdodCBvZiBlbXB0eSBhcnJheSB3aXRoIG5vIGluaXRpYWwgdmFsdWUnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gd2hpbGUgKHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaSA8IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgaWYgKGkgaW4gc2VsZikge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBjYWxsYmFja2ZuKHJlc3VsdCwgc2VsZltpXSwgaSwgb2JqZWN0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IHdoaWxlIChpLS0pO1xuXG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfSwgIXJlZHVjZVJpZ2h0Q29lcmNlc1RvT2JqZWN0KTtcblxuICAgIC8vIEVTNSAxNS40LjQuMTRcbiAgICAvLyBodHRwczovL2VzNS5naXRodWIuaW8vI3gxNS40LjQuMTRcbiAgICAvLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi9KYXZhU2NyaXB0L1JlZmVyZW5jZS9HbG9iYWxfT2JqZWN0cy9BcnJheS9pbmRleE9mXG4gICAgdmFyIGhhc0ZpcmVmb3gySW5kZXhPZkJ1ZyA9IEFycmF5UHJvdG90eXBlLmluZGV4T2YgJiYgWzAsIDFdLmluZGV4T2YoMSwgMikgIT09IC0xO1xuICAgIGRlZmluZVByb3BlcnRpZXMoQXJyYXlQcm90b3R5cGUsIHtcbiAgICAgICAgaW5kZXhPZjogZnVuY3Rpb24gaW5kZXhPZihzZWFyY2hFbGVtZW50LyosIGZyb21JbmRleCAqLykge1xuICAgICAgICAgICAgdmFyIHNlbGYgPSBzcGxpdFN0cmluZyAmJiBpc1N0cmluZyh0aGlzKSA/IHN0clNwbGl0KHRoaXMsICcnKSA6IEVTLlRvT2JqZWN0KHRoaXMpO1xuICAgICAgICAgICAgdmFyIGxlbmd0aCA9IEVTLlRvVWludDMyKHNlbGYubGVuZ3RoKTtcblxuICAgICAgICAgICAgaWYgKGxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgaSA9IEVTLlRvSW50ZWdlcihhcmd1bWVudHNbMV0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBoYW5kbGUgbmVnYXRpdmUgaW5kaWNlc1xuICAgICAgICAgICAgaSA9IGkgPj0gMCA/IGkgOiBtYXgoMCwgbGVuZ3RoICsgaSk7XG4gICAgICAgICAgICBmb3IgKDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGkgaW4gc2VsZiAmJiBzZWxmW2ldID09PSBzZWFyY2hFbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgIH0sIGhhc0ZpcmVmb3gySW5kZXhPZkJ1Zyk7XG5cbiAgICAvLyBFUzUgMTUuNC40LjE1XG4gICAgLy8gaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTUuNC40LjE1XG4gICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvQXJyYXkvbGFzdEluZGV4T2ZcbiAgICB2YXIgaGFzRmlyZWZveDJMYXN0SW5kZXhPZkJ1ZyA9IEFycmF5UHJvdG90eXBlLmxhc3RJbmRleE9mICYmIFswLCAxXS5sYXN0SW5kZXhPZigwLCAtMykgIT09IC0xO1xuICAgIGRlZmluZVByb3BlcnRpZXMoQXJyYXlQcm90b3R5cGUsIHtcbiAgICAgICAgbGFzdEluZGV4T2Y6IGZ1bmN0aW9uIGxhc3RJbmRleE9mKHNlYXJjaEVsZW1lbnQvKiwgZnJvbUluZGV4ICovKSB7XG4gICAgICAgICAgICB2YXIgc2VsZiA9IHNwbGl0U3RyaW5nICYmIGlzU3RyaW5nKHRoaXMpID8gc3RyU3BsaXQodGhpcywgJycpIDogRVMuVG9PYmplY3QodGhpcyk7XG4gICAgICAgICAgICB2YXIgbGVuZ3RoID0gRVMuVG9VaW50MzIoc2VsZi5sZW5ndGgpO1xuXG4gICAgICAgICAgICBpZiAobGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGkgPSBsZW5ndGggLSAxO1xuICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgaSA9IG1pbihpLCBFUy5Ub0ludGVnZXIoYXJndW1lbnRzWzFdKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBoYW5kbGUgbmVnYXRpdmUgaW5kaWNlc1xuICAgICAgICAgICAgaSA9IGkgPj0gMCA/IGkgOiBsZW5ndGggLSBhYnMoaSk7XG4gICAgICAgICAgICBmb3IgKDsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgICAgICBpZiAoaSBpbiBzZWxmICYmIHNlYXJjaEVsZW1lbnQgPT09IHNlbGZbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIC0xO1xuICAgICAgICB9XG4gICAgfSwgaGFzRmlyZWZveDJMYXN0SW5kZXhPZkJ1Zyk7XG5cbiAgICAvLyBFUzUgMTUuNC40LjEyXG4gICAgLy8gaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTUuNC40LjEyXG4gICAgdmFyIHNwbGljZU5vb3BSZXR1cm5zRW1wdHlBcnJheSA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBhID0gWzEsIDJdO1xuICAgICAgICB2YXIgcmVzdWx0ID0gYS5zcGxpY2UoKTtcbiAgICAgICAgcmV0dXJuIGEubGVuZ3RoID09PSAyICYmIGlzQXJyYXkocmVzdWx0KSAmJiByZXN1bHQubGVuZ3RoID09PSAwO1xuICAgIH0oKSk7XG4gICAgZGVmaW5lUHJvcGVydGllcyhBcnJheVByb3RvdHlwZSwge1xuICAgICAgICAvLyBTYWZhcmkgNS4wIGJ1ZyB3aGVyZSAuc3BsaWNlKCkgcmV0dXJucyB1bmRlZmluZWRcbiAgICAgICAgc3BsaWNlOiBmdW5jdGlvbiBzcGxpY2Uoc3RhcnQsIGRlbGV0ZUNvdW50KSB7XG4gICAgICAgICAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhcnJheV9zcGxpY2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICB9XG4gICAgfSwgIXNwbGljZU5vb3BSZXR1cm5zRW1wdHlBcnJheSk7XG5cbiAgICB2YXIgc3BsaWNlV29ya3NXaXRoRW1wdHlPYmplY3QgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgb2JqID0ge307XG4gICAgICAgIEFycmF5UHJvdG90eXBlLnNwbGljZS5jYWxsKG9iaiwgMCwgMCwgMSk7XG4gICAgICAgIHJldHVybiBvYmoubGVuZ3RoID09PSAxO1xuICAgIH0oKSk7XG4gICAgdmFyIGhhc0VTNkRlZmF1bHRzID0gWzAsIDEsIDJdLnNwbGljZSgwKS5sZW5ndGggPT09IDM7XG4gICAgZGVmaW5lUHJvcGVydGllcyhBcnJheVByb3RvdHlwZSwge1xuICAgICAgICBzcGxpY2U6IGZ1bmN0aW9uIHNwbGljZShzdGFydCwgZGVsZXRlQ291bnQpIHtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgICAgICAgICB0aGlzLmxlbmd0aCA9IG1heChFUy5Ub0ludGVnZXIodGhpcy5sZW5ndGgpLCAwKTtcbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMCAmJiB0eXBlb2YgZGVsZXRlQ291bnQgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgYXJncyA9IGFycmF5U2xpY2UoYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPCAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHB1c2hDYWxsKGFyZ3MsIHRoaXMubGVuZ3RoIC0gc3RhcnQpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGFyZ3NbMV0gPSBFUy5Ub0ludGVnZXIoZGVsZXRlQ291bnQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBhcnJheV9zcGxpY2UuYXBwbHkodGhpcywgYXJncyk7XG4gICAgICAgIH1cbiAgICB9LCAhc3BsaWNlV29ya3NXaXRoRW1wdHlPYmplY3QgfHwgIWhhc0VTNkRlZmF1bHRzKTtcbiAgICB2YXIgc3BsaWNlV29ya3NXaXRoTGFyZ2VTcGFyc2VBcnJheXMgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBQZXIgaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltL2lzc3Vlcy8yOTVcbiAgICAgICAgLy8gU2FmYXJpIDcvOCBicmVha3Mgd2l0aCBzcGFyc2UgYXJyYXlzIG9mIHNpemUgMWU1IG9yIGdyZWF0ZXJcbiAgICAgICAgdmFyIGFyciA9IG5ldyAkQXJyYXkoMWU1KTtcbiAgICAgICAgLy8gbm90ZTogdGhlIGluZGV4IE1VU1QgYmUgOCBvciBsYXJnZXIgb3IgdGhlIHRlc3Qgd2lsbCBmYWxzZSBwYXNzXG4gICAgICAgIGFycls4XSA9ICd4JztcbiAgICAgICAgYXJyLnNwbGljZSgxLCAxKTtcbiAgICAgICAgLy8gbm90ZTogdGhpcyB0ZXN0IG11c3QgYmUgZGVmaW5lZCAqYWZ0ZXIqIHRoZSBpbmRleE9mIHNoaW1cbiAgICAgICAgLy8gcGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbS9pc3N1ZXMvMzEzXG4gICAgICAgIHJldHVybiBhcnIuaW5kZXhPZigneCcpID09PSA3O1xuICAgIH0oKSk7XG4gICAgdmFyIHNwbGljZVdvcmtzV2l0aFNtYWxsU3BhcnNlQXJyYXlzID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gUGVyIGh0dHBzOi8vZ2l0aHViLmNvbS9lcy1zaGltcy9lczUtc2hpbS9pc3N1ZXMvMjk1XG4gICAgICAgIC8vIE9wZXJhIDEyLjE1IGJyZWFrcyBvbiB0aGlzLCBubyBpZGVhIHdoeS5cbiAgICAgICAgdmFyIG4gPSAyNTY7XG4gICAgICAgIHZhciBhcnIgPSBbXTtcbiAgICAgICAgYXJyW25dID0gJ2EnO1xuICAgICAgICBhcnIuc3BsaWNlKG4gKyAxLCAwLCAnYicpO1xuICAgICAgICByZXR1cm4gYXJyW25dID09PSAnYSc7XG4gICAgfSgpKTtcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKEFycmF5UHJvdG90eXBlLCB7XG4gICAgICAgIHNwbGljZTogZnVuY3Rpb24gc3BsaWNlKHN0YXJ0LCBkZWxldGVDb3VudCkge1xuICAgICAgICAgICAgdmFyIE8gPSBFUy5Ub09iamVjdCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBBID0gW107XG4gICAgICAgICAgICB2YXIgbGVuID0gRVMuVG9VaW50MzIoTy5sZW5ndGgpO1xuICAgICAgICAgICAgdmFyIHJlbGF0aXZlU3RhcnQgPSBFUy5Ub0ludGVnZXIoc3RhcnQpO1xuICAgICAgICAgICAgdmFyIGFjdHVhbFN0YXJ0ID0gcmVsYXRpdmVTdGFydCA8IDAgPyBtYXgoKGxlbiArIHJlbGF0aXZlU3RhcnQpLCAwKSA6IG1pbihyZWxhdGl2ZVN0YXJ0LCBsZW4pO1xuICAgICAgICAgICAgdmFyIGFjdHVhbERlbGV0ZUNvdW50ID0gYXJndW1lbnRzLmxlbmd0aCA9PT0gMFxuICAgICAgICAgICAgICAgID8gMFxuICAgICAgICAgICAgICAgIDogYXJndW1lbnRzLmxlbmd0aCA9PT0gMVxuICAgICAgICAgICAgICAgICAgICA/IGxlbiAtIGFjdHVhbFN0YXJ0XG4gICAgICAgICAgICAgICAgICAgIDogbWluKG1heChFUy5Ub0ludGVnZXIoZGVsZXRlQ291bnQpLCAwKSwgbGVuIC0gYWN0dWFsU3RhcnQpO1xuXG4gICAgICAgICAgICB2YXIgayA9IDA7XG4gICAgICAgICAgICB2YXIgZnJvbTtcbiAgICAgICAgICAgIHdoaWxlIChrIDwgYWN0dWFsRGVsZXRlQ291bnQpIHtcbiAgICAgICAgICAgICAgICBmcm9tID0gJFN0cmluZyhhY3R1YWxTdGFydCArIGspO1xuICAgICAgICAgICAgICAgIGlmIChvd25zKE8sIGZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgIEFba10gPSBPW2Zyb21dO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBrICs9IDE7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBpdGVtcyA9IGFycmF5U2xpY2UoYXJndW1lbnRzLCAyKTtcbiAgICAgICAgICAgIHZhciBpdGVtQ291bnQgPSBpdGVtcy5sZW5ndGg7XG4gICAgICAgICAgICB2YXIgdG87XG4gICAgICAgICAgICBpZiAoaXRlbUNvdW50IDwgYWN0dWFsRGVsZXRlQ291bnQpIHtcbiAgICAgICAgICAgICAgICBrID0gYWN0dWFsU3RhcnQ7XG4gICAgICAgICAgICAgICAgdmFyIG1heEsgPSBsZW4gLSBhY3R1YWxEZWxldGVDb3VudDtcbiAgICAgICAgICAgICAgICB3aGlsZSAoayA8IG1heEspIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbSA9ICRTdHJpbmcoayArIGFjdHVhbERlbGV0ZUNvdW50KTtcbiAgICAgICAgICAgICAgICAgICAgdG8gPSAkU3RyaW5nKGsgKyBpdGVtQ291bnQpO1xuICAgICAgICAgICAgICAgICAgICBpZiAob3ducyhPLCBmcm9tKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgT1t0b10gPSBPW2Zyb21dO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIE9bdG9dO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGsgKz0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgayA9IGxlbjtcbiAgICAgICAgICAgICAgICB2YXIgbWluSyA9IGxlbiAtIGFjdHVhbERlbGV0ZUNvdW50ICsgaXRlbUNvdW50O1xuICAgICAgICAgICAgICAgIHdoaWxlIChrID4gbWluSykge1xuICAgICAgICAgICAgICAgICAgICBkZWxldGUgT1trIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGsgLT0gMTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGl0ZW1Db3VudCA+IGFjdHVhbERlbGV0ZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgayA9IGxlbiAtIGFjdHVhbERlbGV0ZUNvdW50O1xuICAgICAgICAgICAgICAgIHdoaWxlIChrID4gYWN0dWFsU3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgZnJvbSA9ICRTdHJpbmcoayArIGFjdHVhbERlbGV0ZUNvdW50IC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIHRvID0gJFN0cmluZyhrICsgaXRlbUNvdW50IC0gMSk7XG4gICAgICAgICAgICAgICAgICAgIGlmIChvd25zKE8sIGZyb20pKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBPW3RvXSA9IE9bZnJvbV07XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgT1t0b107XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgayAtPSAxO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGsgPSBhY3R1YWxTdGFydDtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBPW2tdID0gaXRlbXNbaV07XG4gICAgICAgICAgICAgICAgayArPSAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgTy5sZW5ndGggPSBsZW4gLSBhY3R1YWxEZWxldGVDb3VudCArIGl0ZW1Db3VudDtcblxuICAgICAgICAgICAgcmV0dXJuIEE7XG4gICAgICAgIH1cbiAgICB9LCAhc3BsaWNlV29ya3NXaXRoTGFyZ2VTcGFyc2VBcnJheXMgfHwgIXNwbGljZVdvcmtzV2l0aFNtYWxsU3BhcnNlQXJyYXlzKTtcblxuICAgIHZhciBvcmlnaW5hbEpvaW4gPSBBcnJheVByb3RvdHlwZS5qb2luO1xuICAgIHZhciBoYXNTdHJpbmdKb2luQnVnO1xuICAgIHRyeSB7XG4gICAgICAgIGhhc1N0cmluZ0pvaW5CdWcgPSBBcnJheS5wcm90b3R5cGUuam9pbi5jYWxsKCcxMjMnLCAnLCcpICE9PSAnMSwyLDMnO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaGFzU3RyaW5nSm9pbkJ1ZyA9IHRydWU7XG4gICAgfVxuICAgIGlmIChoYXNTdHJpbmdKb2luQnVnKSB7XG4gICAgICAgIGRlZmluZVByb3BlcnRpZXMoQXJyYXlQcm90b3R5cGUsIHtcbiAgICAgICAgICAgIGpvaW46IGZ1bmN0aW9uIGpvaW4oc2VwYXJhdG9yKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNlcCA9IHR5cGVvZiBzZXBhcmF0b3IgPT09ICd1bmRlZmluZWQnID8gJywnIDogc2VwYXJhdG9yO1xuICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbEpvaW4uY2FsbChpc1N0cmluZyh0aGlzKSA/IHN0clNwbGl0KHRoaXMsICcnKSA6IHRoaXMsIHNlcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGhhc1N0cmluZ0pvaW5CdWcpO1xuICAgIH1cblxuICAgIHZhciBoYXNKb2luVW5kZWZpbmVkQnVnID0gWzEsIDJdLmpvaW4odW5kZWZpbmVkKSAhPT0gJzEsMic7XG4gICAgaWYgKGhhc0pvaW5VbmRlZmluZWRCdWcpIHtcbiAgICAgICAgZGVmaW5lUHJvcGVydGllcyhBcnJheVByb3RvdHlwZSwge1xuICAgICAgICAgICAgam9pbjogZnVuY3Rpb24gam9pbihzZXBhcmF0b3IpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2VwID0gdHlwZW9mIHNlcGFyYXRvciA9PT0gJ3VuZGVmaW5lZCcgPyAnLCcgOiBzZXBhcmF0b3I7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsSm9pbi5jYWxsKHRoaXMsIHNlcCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGhhc0pvaW5VbmRlZmluZWRCdWcpO1xuICAgIH1cblxuICAgIHZhciBwdXNoU2hpbSA9IGZ1bmN0aW9uIHB1c2goaXRlbSkge1xuICAgICAgICB2YXIgTyA9IEVTLlRvT2JqZWN0KHRoaXMpO1xuICAgICAgICB2YXIgbiA9IEVTLlRvVWludDMyKE8ubGVuZ3RoKTtcbiAgICAgICAgdmFyIGkgPSAwO1xuICAgICAgICB3aGlsZSAoaSA8IGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIE9bbiArIGldID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgaSArPSAxO1xuICAgICAgICB9XG4gICAgICAgIE8ubGVuZ3RoID0gbiArIGk7XG4gICAgICAgIHJldHVybiBuICsgaTtcbiAgICB9O1xuXG4gICAgdmFyIHB1c2hJc05vdEdlbmVyaWMgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgb2JqID0ge307XG4gICAgICAgIHZhciByZXN1bHQgPSBBcnJheS5wcm90b3R5cGUucHVzaC5jYWxsKG9iaiwgdW5kZWZpbmVkKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAhPT0gMSB8fCBvYmoubGVuZ3RoICE9PSAxIHx8IHR5cGVvZiBvYmpbMF0gIT09ICd1bmRlZmluZWQnIHx8ICFvd25zKG9iaiwgMCk7XG4gICAgfSgpKTtcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKEFycmF5UHJvdG90eXBlLCB7XG4gICAgICAgIHB1c2g6IGZ1bmN0aW9uIHB1c2goaXRlbSkge1xuICAgICAgICAgICAgaWYgKGlzQXJyYXkodGhpcykpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlfcHVzaC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHB1c2hTaGltLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICB9LCBwdXNoSXNOb3RHZW5lcmljKTtcblxuICAgIC8vIFRoaXMgZml4ZXMgYSB2ZXJ5IHdlaXJkIGJ1ZyBpbiBPcGVyYSAxMC42IHdoZW4gcHVzaGluZyBgdW5kZWZpbmVkXG4gICAgdmFyIHB1c2hVbmRlZmluZWRJc1dlaXJkID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyciA9IFtdO1xuICAgICAgICB2YXIgcmVzdWx0ID0gYXJyLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdCAhPT0gMSB8fCBhcnIubGVuZ3RoICE9PSAxIHx8IHR5cGVvZiBhcnJbMF0gIT09ICd1bmRlZmluZWQnIHx8ICFvd25zKGFyciwgMCk7XG4gICAgfSgpKTtcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKEFycmF5UHJvdG90eXBlLCB7IHB1c2g6IHB1c2hTaGltIH0sIHB1c2hVbmRlZmluZWRJc1dlaXJkKTtcblxuICAgIC8vIEVTNSAxNS4yLjMuMTRcbiAgICAvLyBodHRwczovL2VzNS5naXRodWIuaW8vI3gxNS40LjQuMTBcbiAgICAvLyBGaXggYm94ZWQgc3RyaW5nIGJ1Z1xuICAgIGRlZmluZVByb3BlcnRpZXMoQXJyYXlQcm90b3R5cGUsIHtcbiAgICAgICAgc2xpY2U6IGZ1bmN0aW9uIChzdGFydCwgZW5kKSB7XG4gICAgICAgICAgICB2YXIgYXJyID0gaXNTdHJpbmcodGhpcykgPyBzdHJTcGxpdCh0aGlzLCAnJykgOiB0aGlzO1xuICAgICAgICAgICAgcmV0dXJuIGFycmF5U2xpY2VBcHBseShhcnIsIGFyZ3VtZW50cyk7XG4gICAgICAgIH1cbiAgICB9LCBzcGxpdFN0cmluZyk7XG5cbiAgICB2YXIgc29ydElnbm9yZXNOb25GdW5jdGlvbnMgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgWzEsIDJdLnNvcnQobnVsbCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgWzEsIDJdLnNvcnQoe30pO1xuICAgICAgICAgICAgfSBjYXRjaCAoZTIpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSgpKTtcbiAgICB2YXIgc29ydFRocm93c09uUmVnZXggPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyB0aGlzIGlzIGEgcHJvYmxlbSBpbiBGaXJlZm94IDQsIGluIHdoaWNoIGB0eXBlb2YgL2EvID09PSAnZnVuY3Rpb24nYFxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgWzEsIDJdLnNvcnQoL2EvKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSgpKTtcbiAgICB2YXIgc29ydElnbm9yZXNVbmRlZmluZWQgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICAvLyBhcHBsaWVzIGluIElFIDgsIGZvciBvbmUuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBbMSwgMl0uc29ydCh1bmRlZmluZWQpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHt9XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KCkpO1xuICAgIGRlZmluZVByb3BlcnRpZXMoQXJyYXlQcm90b3R5cGUsIHtcbiAgICAgICAgc29ydDogZnVuY3Rpb24gc29ydChjb21wYXJlRm4pIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgY29tcGFyZUZuID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBhcnJheVNvcnQodGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIWlzQ2FsbGFibGUoY29tcGFyZUZuKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FycmF5LnByb3RvdHlwZS5zb3J0IGNhbGxiYWNrIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGFycmF5U29ydCh0aGlzLCBjb21wYXJlRm4pO1xuICAgICAgICB9XG4gICAgfSwgc29ydElnbm9yZXNOb25GdW5jdGlvbnMgfHwgIXNvcnRJZ25vcmVzVW5kZWZpbmVkIHx8ICFzb3J0VGhyb3dzT25SZWdleCk7XG5cbiAgICAvL1xuICAgIC8vIE9iamVjdFxuICAgIC8vID09PT09PVxuICAgIC8vXG5cbiAgICAvLyBFUzUgMTUuMi4zLjE0XG4gICAgLy8gaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTUuMi4zLjE0XG5cbiAgICAvLyBodHRwczovL3dlYi5hcmNoaXZlLm9yZy93ZWIvMjAxNDA3MjcwNDIyMzQvaHR0cDovL3doYXR0aGVoZWFkc2FpZC5jb20vMjAxMC8xMC9hLXNhZmVyLW9iamVjdC1rZXlzLWNvbXBhdGliaWxpdHktaW1wbGVtZW50YXRpb25cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcXVvdGUtcHJvcHNcbiAgICB2YXIgaGFzRG9udEVudW1CdWcgPSAhaXNFbnVtKHsgJ3RvU3RyaW5nJzogbnVsbCB9LCAndG9TdHJpbmcnKTsgLy8ganNjczppZ25vcmUgZGlzYWxsb3dRdW90ZWRLZXlzSW5PYmplY3RzXG4gICAgdmFyIGhhc1Byb3RvRW51bUJ1ZyA9IGlzRW51bShmdW5jdGlvbiAoKSB7fSwgJ3Byb3RvdHlwZScpO1xuICAgIHZhciBoYXNTdHJpbmdFbnVtQnVnID0gIW93bnMoJ3gnLCAnMCcpO1xuICAgIHZhciBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZSA9IGZ1bmN0aW9uIChvKSB7XG4gICAgICAgIHZhciBjdG9yID0gby5jb25zdHJ1Y3RvcjtcbiAgICAgICAgcmV0dXJuIGN0b3IgJiYgY3Rvci5wcm90b3R5cGUgPT09IG87XG4gICAgfTtcbiAgICB2YXIgZXhjbHVkZWRLZXlzID0ge1xuICAgICAgICAkYXBwbGljYXRpb25DYWNoZTogdHJ1ZSxcbiAgICAgICAgJGNvbnNvbGU6IHRydWUsXG4gICAgICAgICRleHRlcm5hbDogdHJ1ZSxcbiAgICAgICAgJGZyYW1lOiB0cnVlLFxuICAgICAgICAkZnJhbWVFbGVtZW50OiB0cnVlLFxuICAgICAgICAkZnJhbWVzOiB0cnVlLFxuICAgICAgICAkaW5uZXJIZWlnaHQ6IHRydWUsXG4gICAgICAgICRpbm5lcldpZHRoOiB0cnVlLFxuICAgICAgICAkb25tb3pmdWxsc2NyZWVuY2hhbmdlOiB0cnVlLFxuICAgICAgICAkb25tb3pmdWxsc2NyZWVuZXJyb3I6IHRydWUsXG4gICAgICAgICRvdXRlckhlaWdodDogdHJ1ZSxcbiAgICAgICAgJG91dGVyV2lkdGg6IHRydWUsXG4gICAgICAgICRwYWdlWE9mZnNldDogdHJ1ZSxcbiAgICAgICAgJHBhZ2VZT2Zmc2V0OiB0cnVlLFxuICAgICAgICAkcGFyZW50OiB0cnVlLFxuICAgICAgICAkc2Nyb2xsTGVmdDogdHJ1ZSxcbiAgICAgICAgJHNjcm9sbFRvcDogdHJ1ZSxcbiAgICAgICAgJHNjcm9sbFg6IHRydWUsXG4gICAgICAgICRzY3JvbGxZOiB0cnVlLFxuICAgICAgICAkc2VsZjogdHJ1ZSxcbiAgICAgICAgJHdlYmtpdEluZGV4ZWREQjogdHJ1ZSxcbiAgICAgICAgJHdlYmtpdFN0b3JhZ2VJbmZvOiB0cnVlLFxuICAgICAgICAkd2luZG93OiB0cnVlLFxuXG4gICAgICAgICR3aWR0aDogdHJ1ZSxcbiAgICAgICAgJGhlaWdodDogdHJ1ZSxcbiAgICAgICAgJHRvcDogdHJ1ZSxcbiAgICAgICAgJGxvY2FsU3RvcmFnZTogdHJ1ZVxuICAgIH07XG4gICAgdmFyIGhhc0F1dG9tYXRpb25FcXVhbGl0eUJ1ZyA9IChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8qIGdsb2JhbHMgd2luZG93ICovXG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGZvciAodmFyIGsgaW4gd2luZG93KSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGlmICghZXhjbHVkZWRLZXlzWyckJyArIGtdICYmIG93bnMod2luZG93LCBrKSAmJiB3aW5kb3dba10gIT09IG51bGwgJiYgdHlwZW9mIHdpbmRvd1trXSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUod2luZG93W2tdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0oKSk7XG4gICAgdmFyIGVxdWFsc0NvbnN0cnVjdG9yUHJvdG90eXBlSWZOb3RCdWdneSA9IGZ1bmN0aW9uIChvYmplY3QpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB3aW5kb3cgPT09ICd1bmRlZmluZWQnIHx8ICFoYXNBdXRvbWF0aW9uRXF1YWxpdHlCdWcpIHtcbiAgICAgICAgICAgIHJldHVybiBlcXVhbHNDb25zdHJ1Y3RvclByb3RvdHlwZShvYmplY3QpO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICByZXR1cm4gZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGUob2JqZWN0KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfTtcbiAgICB2YXIgZG9udEVudW1zID0gW1xuICAgICAgICAndG9TdHJpbmcnLFxuICAgICAgICAndG9Mb2NhbGVTdHJpbmcnLFxuICAgICAgICAndmFsdWVPZicsXG4gICAgICAgICdoYXNPd25Qcm9wZXJ0eScsXG4gICAgICAgICdpc1Byb3RvdHlwZU9mJyxcbiAgICAgICAgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJyxcbiAgICAgICAgJ2NvbnN0cnVjdG9yJ1xuICAgIF07XG4gICAgdmFyIGRvbnRFbnVtc0xlbmd0aCA9IGRvbnRFbnVtcy5sZW5ndGg7XG5cbiAgICAvLyB0YWtlbiBkaXJlY3RseSBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9samhhcmIvaXMtYXJndW1lbnRzL2Jsb2IvbWFzdGVyL2luZGV4LmpzXG4gICAgLy8gY2FuIGJlIHJlcGxhY2VkIHdpdGggcmVxdWlyZSgnaXMtYXJndW1lbnRzJykgaWYgd2UgZXZlciB1c2UgYSBidWlsZCBwcm9jZXNzIGluc3RlYWRcbiAgICB2YXIgaXNTdGFuZGFyZEFyZ3VtZW50cyA9IGZ1bmN0aW9uIGlzQXJndW1lbnRzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cih2YWx1ZSkgPT09ICdbb2JqZWN0IEFyZ3VtZW50c10nO1xuICAgIH07XG4gICAgdmFyIGlzTGVnYWN5QXJndW1lbnRzID0gZnVuY3Rpb24gaXNBcmd1bWVudHModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsXG4gICAgICAgICAgICAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnXG4gICAgICAgICAgICAmJiB0eXBlb2YgdmFsdWUubGVuZ3RoID09PSAnbnVtYmVyJ1xuICAgICAgICAgICAgJiYgdmFsdWUubGVuZ3RoID49IDBcbiAgICAgICAgICAgICYmICFpc0FycmF5KHZhbHVlKVxuICAgICAgICAgICAgJiYgaXNDYWxsYWJsZSh2YWx1ZS5jYWxsZWUpO1xuICAgIH07XG4gICAgdmFyIGlzQXJndW1lbnRzID0gaXNTdGFuZGFyZEFyZ3VtZW50cyhhcmd1bWVudHMpID8gaXNTdGFuZGFyZEFyZ3VtZW50cyA6IGlzTGVnYWN5QXJndW1lbnRzO1xuXG4gICAgZGVmaW5lUHJvcGVydGllcygkT2JqZWN0LCB7XG4gICAgICAgIGtleXM6IGZ1bmN0aW9uIGtleXMob2JqZWN0KSB7XG4gICAgICAgICAgICB2YXIgaXNGbiA9IGlzQ2FsbGFibGUob2JqZWN0KTtcbiAgICAgICAgICAgIHZhciBpc0FyZ3MgPSBpc0FyZ3VtZW50cyhvYmplY3QpO1xuICAgICAgICAgICAgdmFyIGlzT2JqZWN0ID0gb2JqZWN0ICE9PSBudWxsICYmIHR5cGVvZiBvYmplY3QgPT09ICdvYmplY3QnO1xuICAgICAgICAgICAgdmFyIGlzU3RyID0gaXNPYmplY3QgJiYgaXNTdHJpbmcob2JqZWN0KTtcblxuICAgICAgICAgICAgaWYgKCFpc09iamVjdCAmJiAhaXNGbiAmJiAhaXNBcmdzKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignT2JqZWN0LmtleXMgY2FsbGVkIG9uIGEgbm9uLW9iamVjdCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgdGhlS2V5cyA9IFtdO1xuICAgICAgICAgICAgdmFyIHNraXBQcm90byA9IGhhc1Byb3RvRW51bUJ1ZyAmJiBpc0ZuO1xuICAgICAgICAgICAgaWYgKChpc1N0ciAmJiBoYXNTdHJpbmdFbnVtQnVnKSB8fCBpc0FyZ3MpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IG9iamVjdC5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBwdXNoQ2FsbCh0aGVLZXlzLCAkU3RyaW5nKGkpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICghaXNBcmdzKSB7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgbmFtZSBpbiBvYmplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEoc2tpcFByb3RvICYmIG5hbWUgPT09ICdwcm90b3R5cGUnKSAmJiBvd25zKG9iamVjdCwgbmFtZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hDYWxsKHRoZUtleXMsICRTdHJpbmcobmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoaGFzRG9udEVudW1CdWcpIHtcbiAgICAgICAgICAgICAgICB2YXIgc2tpcENvbnN0cnVjdG9yID0gZXF1YWxzQ29uc3RydWN0b3JQcm90b3R5cGVJZk5vdEJ1Z2d5KG9iamVjdCk7XG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBkb250RW51bXNMZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZG9udEVudW0gPSBkb250RW51bXNbal07XG4gICAgICAgICAgICAgICAgICAgIGlmICghKHNraXBDb25zdHJ1Y3RvciAmJiBkb250RW51bSA9PT0gJ2NvbnN0cnVjdG9yJykgJiYgb3ducyhvYmplY3QsIGRvbnRFbnVtKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcHVzaENhbGwodGhlS2V5cywgZG9udEVudW0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRoZUtleXM7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHZhciBrZXlzV29ya3NXaXRoQXJndW1lbnRzID0gJE9iamVjdC5rZXlzICYmIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIC8vIFNhZmFyaSA1LjAgYnVnXG4gICAgICAgIHJldHVybiAkT2JqZWN0LmtleXMoYXJndW1lbnRzKS5sZW5ndGggPT09IDI7XG4gICAgfSgxLCAyKSk7XG4gICAgdmFyIGtleXNIYXNBcmd1bWVudHNMZW5ndGhCdWcgPSAkT2JqZWN0LmtleXMgJiYgKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGFyZ0tleXMgPSAkT2JqZWN0LmtleXMoYXJndW1lbnRzKTtcbiAgICAgICAgcmV0dXJuIGFyZ3VtZW50cy5sZW5ndGggIT09IDEgfHwgYXJnS2V5cy5sZW5ndGggIT09IDEgfHwgYXJnS2V5c1swXSAhPT0gMTtcbiAgICB9KDEpKTtcbiAgICB2YXIgb3JpZ2luYWxLZXlzID0gJE9iamVjdC5rZXlzO1xuICAgIGRlZmluZVByb3BlcnRpZXMoJE9iamVjdCwge1xuICAgICAgICBrZXlzOiBmdW5jdGlvbiBrZXlzKG9iamVjdCkge1xuICAgICAgICAgICAgaWYgKGlzQXJndW1lbnRzKG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxLZXlzKGFycmF5U2xpY2Uob2JqZWN0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxLZXlzKG9iamVjdCk7XG5cbiAgICAgICAgfVxuICAgIH0sICFrZXlzV29ya3NXaXRoQXJndW1lbnRzIHx8IGtleXNIYXNBcmd1bWVudHNMZW5ndGhCdWcpO1xuXG4gICAgLy9cbiAgICAvLyBEYXRlXG4gICAgLy8gPT09PVxuICAgIC8vXG5cbiAgICB2YXIgaGFzTmVnYXRpdmVNb250aFllYXJCdWcgPSBuZXcgRGF0ZSgtMzUwOTgyNzMyOTYwMDI5MikuZ2V0VVRDTW9udGgoKSAhPT0gMDtcbiAgICB2YXIgYU5lZ2F0aXZlVGVzdERhdGUgPSBuZXcgRGF0ZSgtMTUwOTg0MjI4OTYwMDI5Mik7XG4gICAgdmFyIGFQb3NpdGl2ZVRlc3REYXRlID0gbmV3IERhdGUoMTQ0OTY2MjQwMDAwMCk7XG4gICAgdmFyIGhhc1RvVVRDU3RyaW5nRm9ybWF0QnVnID0gYU5lZ2F0aXZlVGVzdERhdGUudG9VVENTdHJpbmcoKSAhPT0gJ01vbiwgMDEgSmFuIC00NTg3NSAxMTo1OTo1OSBHTVQnO1xuICAgIHZhciBoYXNUb0RhdGVTdHJpbmdGb3JtYXRCdWc7XG4gICAgdmFyIGhhc1RvU3RyaW5nRm9ybWF0QnVnO1xuICAgIHZhciB0aW1lWm9uZU9mZnNldCA9IGFOZWdhdGl2ZVRlc3REYXRlLmdldFRpbWV6b25lT2Zmc2V0KCk7XG4gICAgaWYgKHRpbWVab25lT2Zmc2V0IDwgLTcyMCkge1xuICAgICAgICBoYXNUb0RhdGVTdHJpbmdGb3JtYXRCdWcgPSBhTmVnYXRpdmVUZXN0RGF0ZS50b0RhdGVTdHJpbmcoKSAhPT0gJ1R1ZSBKYW4gMDIgLTQ1ODc1JztcbiAgICAgICAgaGFzVG9TdHJpbmdGb3JtYXRCdWcgPSAhKC9eVGh1IERlYyAxMCAyMDE1IFxcZFxcZDpcXGRcXGQ6XFxkXFxkIEdNVFstK11cXGRcXGRcXGRcXGQoPzogfCQpLykudGVzdChTdHJpbmcoYVBvc2l0aXZlVGVzdERhdGUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBoYXNUb0RhdGVTdHJpbmdGb3JtYXRCdWcgPSBhTmVnYXRpdmVUZXN0RGF0ZS50b0RhdGVTdHJpbmcoKSAhPT0gJ01vbiBKYW4gMDEgLTQ1ODc1JztcbiAgICAgICAgaGFzVG9TdHJpbmdGb3JtYXRCdWcgPSAhKC9eV2VkIERlYyAwOSAyMDE1IFxcZFxcZDpcXGRcXGQ6XFxkXFxkIEdNVFstK11cXGRcXGRcXGRcXGQoPzogfCQpLykudGVzdChTdHJpbmcoYVBvc2l0aXZlVGVzdERhdGUpKTtcbiAgICB9XG5cbiAgICB2YXIgb3JpZ2luYWxHZXRGdWxsWWVhciA9IGNhbGwuYmluZChEYXRlLnByb3RvdHlwZS5nZXRGdWxsWWVhcik7XG4gICAgdmFyIG9yaWdpbmFsR2V0TW9udGggPSBjYWxsLmJpbmQoRGF0ZS5wcm90b3R5cGUuZ2V0TW9udGgpO1xuICAgIHZhciBvcmlnaW5hbEdldERhdGUgPSBjYWxsLmJpbmQoRGF0ZS5wcm90b3R5cGUuZ2V0RGF0ZSk7XG4gICAgdmFyIG9yaWdpbmFsR2V0VVRDRnVsbFllYXIgPSBjYWxsLmJpbmQoRGF0ZS5wcm90b3R5cGUuZ2V0VVRDRnVsbFllYXIpO1xuICAgIHZhciBvcmlnaW5hbEdldFVUQ01vbnRoID0gY2FsbC5iaW5kKERhdGUucHJvdG90eXBlLmdldFVUQ01vbnRoKTtcbiAgICB2YXIgb3JpZ2luYWxHZXRVVENEYXRlID0gY2FsbC5iaW5kKERhdGUucHJvdG90eXBlLmdldFVUQ0RhdGUpO1xuICAgIHZhciBvcmlnaW5hbEdldFVUQ0RheSA9IGNhbGwuYmluZChEYXRlLnByb3RvdHlwZS5nZXRVVENEYXkpO1xuICAgIHZhciBvcmlnaW5hbEdldFVUQ0hvdXJzID0gY2FsbC5iaW5kKERhdGUucHJvdG90eXBlLmdldFVUQ0hvdXJzKTtcbiAgICB2YXIgb3JpZ2luYWxHZXRVVENNaW51dGVzID0gY2FsbC5iaW5kKERhdGUucHJvdG90eXBlLmdldFVUQ01pbnV0ZXMpO1xuICAgIHZhciBvcmlnaW5hbEdldFVUQ1NlY29uZHMgPSBjYWxsLmJpbmQoRGF0ZS5wcm90b3R5cGUuZ2V0VVRDU2Vjb25kcyk7XG4gICAgdmFyIG9yaWdpbmFsR2V0VVRDTWlsbGlzZWNvbmRzID0gY2FsbC5iaW5kKERhdGUucHJvdG90eXBlLmdldFVUQ01pbGxpc2Vjb25kcyk7XG4gICAgdmFyIGRheU5hbWUgPSBbJ1N1bicsICdNb24nLCAnVHVlJywgJ1dlZCcsICdUaHUnLCAnRnJpJywgJ1NhdCddO1xuICAgIHZhciBtb250aE5hbWUgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJywgJ09jdCcsICdOb3YnLCAnRGVjJ107XG4gICAgdmFyIGRheXNJbk1vbnRoID0gZnVuY3Rpb24gZGF5c0luTW9udGgobW9udGgsIHllYXIpIHtcbiAgICAgICAgcmV0dXJuIG9yaWdpbmFsR2V0RGF0ZShuZXcgRGF0ZSh5ZWFyLCBtb250aCwgMCkpO1xuICAgIH07XG5cbiAgICBkZWZpbmVQcm9wZXJ0aWVzKERhdGUucHJvdG90eXBlLCB7XG4gICAgICAgIGdldEZ1bGxZZWFyOiBmdW5jdGlvbiBnZXRGdWxsWWVhcigpIHtcbiAgICAgICAgICAgIGlmICghdGhpcyB8fCAhKHRoaXMgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RoaXMgaXMgbm90IGEgRGF0ZSBvYmplY3QuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgeWVhciA9IG9yaWdpbmFsR2V0RnVsbFllYXIodGhpcyk7XG4gICAgICAgICAgICBpZiAoeWVhciA8IDAgJiYgb3JpZ2luYWxHZXRNb250aCh0aGlzKSA+IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHllYXIgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHllYXI7XG4gICAgICAgIH0sXG4gICAgICAgIGdldE1vbnRoOiBmdW5jdGlvbiBnZXRNb250aCgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcyB8fCAhKHRoaXMgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RoaXMgaXMgbm90IGEgRGF0ZSBvYmplY3QuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgeWVhciA9IG9yaWdpbmFsR2V0RnVsbFllYXIodGhpcyk7XG4gICAgICAgICAgICB2YXIgbW9udGggPSBvcmlnaW5hbEdldE1vbnRoKHRoaXMpO1xuICAgICAgICAgICAgaWYgKHllYXIgPCAwICYmIG1vbnRoID4gMTEpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBtb250aDtcbiAgICAgICAgfSxcbiAgICAgICAgZ2V0RGF0ZTogZnVuY3Rpb24gZ2V0RGF0ZSgpIHtcbiAgICAgICAgICAgIGlmICghdGhpcyB8fCAhKHRoaXMgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RoaXMgaXMgbm90IGEgRGF0ZSBvYmplY3QuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgeWVhciA9IG9yaWdpbmFsR2V0RnVsbFllYXIodGhpcyk7XG4gICAgICAgICAgICB2YXIgbW9udGggPSBvcmlnaW5hbEdldE1vbnRoKHRoaXMpO1xuICAgICAgICAgICAgdmFyIGRhdGUgPSBvcmlnaW5hbEdldERhdGUodGhpcyk7XG4gICAgICAgICAgICBpZiAoeWVhciA8IDAgJiYgbW9udGggPiAxMSkge1xuICAgICAgICAgICAgICAgIGlmIChtb250aCA9PT0gMTIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBkYXlzID0gZGF5c0luTW9udGgoMCwgeWVhciArIDEpO1xuICAgICAgICAgICAgICAgIHJldHVybiAoZGF5cyAtIGRhdGUpICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkYXRlO1xuICAgICAgICB9LFxuICAgICAgICBnZXRVVENGdWxsWWVhcjogZnVuY3Rpb24gZ2V0VVRDRnVsbFllYXIoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMgfHwgISh0aGlzIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0aGlzIGlzIG5vdCBhIERhdGUgb2JqZWN0LicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHllYXIgPSBvcmlnaW5hbEdldFVUQ0Z1bGxZZWFyKHRoaXMpO1xuICAgICAgICAgICAgaWYgKHllYXIgPCAwICYmIG9yaWdpbmFsR2V0VVRDTW9udGgodGhpcykgPiAxMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB5ZWFyICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB5ZWFyO1xuICAgICAgICB9LFxuICAgICAgICBnZXRVVENNb250aDogZnVuY3Rpb24gZ2V0VVRDTW9udGgoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMgfHwgISh0aGlzIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0aGlzIGlzIG5vdCBhIERhdGUgb2JqZWN0LicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHllYXIgPSBvcmlnaW5hbEdldFVUQ0Z1bGxZZWFyKHRoaXMpO1xuICAgICAgICAgICAgdmFyIG1vbnRoID0gb3JpZ2luYWxHZXRVVENNb250aCh0aGlzKTtcbiAgICAgICAgICAgIGlmICh5ZWFyIDwgMCAmJiBtb250aCA+IDExKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gbW9udGg7XG4gICAgICAgIH0sXG4gICAgICAgIGdldFVUQ0RhdGU6IGZ1bmN0aW9uIGdldFVUQ0RhdGUoKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMgfHwgISh0aGlzIGluc3RhbmNlb2YgRGF0ZSkpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd0aGlzIGlzIG5vdCBhIERhdGUgb2JqZWN0LicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHllYXIgPSBvcmlnaW5hbEdldFVUQ0Z1bGxZZWFyKHRoaXMpO1xuICAgICAgICAgICAgdmFyIG1vbnRoID0gb3JpZ2luYWxHZXRVVENNb250aCh0aGlzKTtcbiAgICAgICAgICAgIHZhciBkYXRlID0gb3JpZ2luYWxHZXRVVENEYXRlKHRoaXMpO1xuICAgICAgICAgICAgaWYgKHllYXIgPCAwICYmIG1vbnRoID4gMTEpIHtcbiAgICAgICAgICAgICAgICBpZiAobW9udGggPT09IDEyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBkYXRlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YXIgZGF5cyA9IGRheXNJbk1vbnRoKDAsIHllYXIgKyAxKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gKGRheXMgLSBkYXRlKSArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGF0ZTtcbiAgICAgICAgfVxuICAgIH0sIGhhc05lZ2F0aXZlTW9udGhZZWFyQnVnKTtcblxuICAgIGRlZmluZVByb3BlcnRpZXMoRGF0ZS5wcm90b3R5cGUsIHtcbiAgICAgICAgdG9VVENTdHJpbmc6IGZ1bmN0aW9uIHRvVVRDU3RyaW5nKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzIHx8ICEodGhpcyBpbnN0YW5jZW9mIERhdGUpKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcigndGhpcyBpcyBub3QgYSBEYXRlIG9iamVjdC4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBkYXkgPSBvcmlnaW5hbEdldFVUQ0RheSh0aGlzKTtcbiAgICAgICAgICAgIHZhciBkYXRlID0gb3JpZ2luYWxHZXRVVENEYXRlKHRoaXMpO1xuICAgICAgICAgICAgdmFyIG1vbnRoID0gb3JpZ2luYWxHZXRVVENNb250aCh0aGlzKTtcbiAgICAgICAgICAgIHZhciB5ZWFyID0gb3JpZ2luYWxHZXRVVENGdWxsWWVhcih0aGlzKTtcbiAgICAgICAgICAgIHZhciBob3VyID0gb3JpZ2luYWxHZXRVVENIb3Vycyh0aGlzKTtcbiAgICAgICAgICAgIHZhciBtaW51dGUgPSBvcmlnaW5hbEdldFVUQ01pbnV0ZXModGhpcyk7XG4gICAgICAgICAgICB2YXIgc2Vjb25kID0gb3JpZ2luYWxHZXRVVENTZWNvbmRzKHRoaXMpO1xuICAgICAgICAgICAgcmV0dXJuIGRheU5hbWVbZGF5XSArICcsICdcbiAgICAgICAgICAgICAgICArIChkYXRlIDwgMTAgPyAnMCcgKyBkYXRlIDogZGF0ZSkgKyAnICdcbiAgICAgICAgICAgICAgICArIG1vbnRoTmFtZVttb250aF0gKyAnICdcbiAgICAgICAgICAgICAgICArIHllYXIgKyAnICdcbiAgICAgICAgICAgICAgICArIChob3VyIDwgMTAgPyAnMCcgKyBob3VyIDogaG91cikgKyAnOidcbiAgICAgICAgICAgICAgICArIChtaW51dGUgPCAxMCA/ICcwJyArIG1pbnV0ZSA6IG1pbnV0ZSkgKyAnOidcbiAgICAgICAgICAgICAgICArIChzZWNvbmQgPCAxMCA/ICcwJyArIHNlY29uZCA6IHNlY29uZCkgKyAnIEdNVCc7XG4gICAgICAgIH1cbiAgICB9LCBoYXNOZWdhdGl2ZU1vbnRoWWVhckJ1ZyB8fCBoYXNUb1VUQ1N0cmluZ0Zvcm1hdEJ1Zyk7XG5cbiAgICAvLyBPcGVyYSAxMiBoYXMgYCxgXG4gICAgZGVmaW5lUHJvcGVydGllcyhEYXRlLnByb3RvdHlwZSwge1xuICAgICAgICB0b0RhdGVTdHJpbmc6IGZ1bmN0aW9uIHRvRGF0ZVN0cmluZygpIHtcbiAgICAgICAgICAgIGlmICghdGhpcyB8fCAhKHRoaXMgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RoaXMgaXMgbm90IGEgRGF0ZSBvYmplY3QuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZGF5ID0gdGhpcy5nZXREYXkoKTtcbiAgICAgICAgICAgIHZhciBkYXRlID0gdGhpcy5nZXREYXRlKCk7XG4gICAgICAgICAgICB2YXIgbW9udGggPSB0aGlzLmdldE1vbnRoKCk7XG4gICAgICAgICAgICB2YXIgeWVhciA9IHRoaXMuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgIHJldHVybiBkYXlOYW1lW2RheV0gKyAnICdcbiAgICAgICAgICAgICAgICArIG1vbnRoTmFtZVttb250aF0gKyAnICdcbiAgICAgICAgICAgICAgICArIChkYXRlIDwgMTAgPyAnMCcgKyBkYXRlIDogZGF0ZSkgKyAnICdcbiAgICAgICAgICAgICAgICArIHllYXI7XG4gICAgICAgIH1cbiAgICB9LCBoYXNOZWdhdGl2ZU1vbnRoWWVhckJ1ZyB8fCBoYXNUb0RhdGVTdHJpbmdGb3JtYXRCdWcpO1xuXG4gICAgLy8gY2FuJ3QgdXNlIGRlZmluZVByb3BlcnRpZXMgaGVyZSBiZWNhdXNlIG9mIHRvU3RyaW5nIGVudW1lcmF0aW9uIGlzc3VlIGluIElFIDw9IDhcbiAgICBpZiAoaGFzTmVnYXRpdmVNb250aFllYXJCdWcgfHwgaGFzVG9TdHJpbmdGb3JtYXRCdWcpIHtcbiAgICAgICAgRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICAgICAgICAgIGlmICghdGhpcyB8fCAhKHRoaXMgaW5zdGFuY2VvZiBEYXRlKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RoaXMgaXMgbm90IGEgRGF0ZSBvYmplY3QuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgZGF5ID0gdGhpcy5nZXREYXkoKTtcbiAgICAgICAgICAgIHZhciBkYXRlID0gdGhpcy5nZXREYXRlKCk7XG4gICAgICAgICAgICB2YXIgbW9udGggPSB0aGlzLmdldE1vbnRoKCk7XG4gICAgICAgICAgICB2YXIgeWVhciA9IHRoaXMuZ2V0RnVsbFllYXIoKTtcbiAgICAgICAgICAgIHZhciBob3VyID0gdGhpcy5nZXRIb3VycygpO1xuICAgICAgICAgICAgdmFyIG1pbnV0ZSA9IHRoaXMuZ2V0TWludXRlcygpO1xuICAgICAgICAgICAgdmFyIHNlY29uZCA9IHRoaXMuZ2V0U2Vjb25kcygpO1xuICAgICAgICAgICAgdmFyIHRpbWV6b25lT2Zmc2V0ID0gdGhpcy5nZXRUaW1lem9uZU9mZnNldCgpO1xuICAgICAgICAgICAgdmFyIGhvdXJzT2Zmc2V0ID0gZmxvb3IoYWJzKHRpbWV6b25lT2Zmc2V0KSAvIDYwKTtcbiAgICAgICAgICAgIHZhciBtaW51dGVzT2Zmc2V0ID0gZmxvb3IoYWJzKHRpbWV6b25lT2Zmc2V0KSAlIDYwKTtcbiAgICAgICAgICAgIHJldHVybiBkYXlOYW1lW2RheV0gKyAnICdcbiAgICAgICAgICAgICAgICArIG1vbnRoTmFtZVttb250aF0gKyAnICdcbiAgICAgICAgICAgICAgICArIChkYXRlIDwgMTAgPyAnMCcgKyBkYXRlIDogZGF0ZSkgKyAnICdcbiAgICAgICAgICAgICAgICArIHllYXIgKyAnICdcbiAgICAgICAgICAgICAgICArIChob3VyIDwgMTAgPyAnMCcgKyBob3VyIDogaG91cikgKyAnOidcbiAgICAgICAgICAgICAgICArIChtaW51dGUgPCAxMCA/ICcwJyArIG1pbnV0ZSA6IG1pbnV0ZSkgKyAnOidcbiAgICAgICAgICAgICAgICArIChzZWNvbmQgPCAxMCA/ICcwJyArIHNlY29uZCA6IHNlY29uZCkgKyAnIEdNVCdcbiAgICAgICAgICAgICAgICArICh0aW1lem9uZU9mZnNldCA+IDAgPyAnLScgOiAnKycpXG4gICAgICAgICAgICAgICAgKyAoaG91cnNPZmZzZXQgPCAxMCA/ICcwJyArIGhvdXJzT2Zmc2V0IDogaG91cnNPZmZzZXQpXG4gICAgICAgICAgICAgICAgKyAobWludXRlc09mZnNldCA8IDEwID8gJzAnICsgbWludXRlc09mZnNldCA6IG1pbnV0ZXNPZmZzZXQpO1xuICAgICAgICB9O1xuICAgICAgICBpZiAoc3VwcG9ydHNEZXNjcmlwdG9ycykge1xuICAgICAgICAgICAgJE9iamVjdC5kZWZpbmVQcm9wZXJ0eShEYXRlLnByb3RvdHlwZSwgJ3RvU3RyaW5nJywge1xuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB3cml0YWJsZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFUzUgMTUuOS41LjQzXG4gICAgLy8gaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTUuOS41LjQzXG4gICAgLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgU3RyaW5nIHZhbHVlIHJlcHJlc2VudCB0aGUgaW5zdGFuY2UgaW4gdGltZVxuICAgIC8vIHJlcHJlc2VudGVkIGJ5IHRoaXMgRGF0ZSBvYmplY3QuIFRoZSBmb3JtYXQgb2YgdGhlIFN0cmluZyBpcyB0aGUgRGF0ZSBUaW1lXG4gICAgLy8gc3RyaW5nIGZvcm1hdCBkZWZpbmVkIGluIDE1LjkuMS4xNS4gQWxsIGZpZWxkcyBhcmUgcHJlc2VudCBpbiB0aGUgU3RyaW5nLlxuICAgIC8vIFRoZSB0aW1lIHpvbmUgaXMgYWx3YXlzIFVUQywgZGVub3RlZCBieSB0aGUgc3VmZml4IFouIElmIHRoZSB0aW1lIHZhbHVlIG9mXG4gICAgLy8gdGhpcyBvYmplY3QgaXMgbm90IGEgZmluaXRlIE51bWJlciBhIFJhbmdlRXJyb3IgZXhjZXB0aW9uIGlzIHRocm93bi5cbiAgICB2YXIgbmVnYXRpdmVEYXRlID0gLTYyMTk4NzU1MjAwMDAwO1xuICAgIHZhciBuZWdhdGl2ZVllYXJTdHJpbmcgPSAnLTAwMDAwMSc7XG4gICAgdmFyIGhhc05lZ2F0aXZlRGF0ZUJ1ZyA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nICYmIG5ldyBEYXRlKG5lZ2F0aXZlRGF0ZSkudG9JU09TdHJpbmcoKS5pbmRleE9mKG5lZ2F0aXZlWWVhclN0cmluZykgPT09IC0xOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG1heC1sZW5cbiAgICB2YXIgaGFzU2FmYXJpNTFEYXRlQnVnID0gRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcgJiYgbmV3IERhdGUoLTEpLnRvSVNPU3RyaW5nKCkgIT09ICcxOTY5LTEyLTMxVDIzOjU5OjU5Ljk5OVonO1xuXG4gICAgdmFyIGdldFRpbWUgPSBjYWxsLmJpbmQoRGF0ZS5wcm90b3R5cGUuZ2V0VGltZSk7XG5cbiAgICBkZWZpbmVQcm9wZXJ0aWVzKERhdGUucHJvdG90eXBlLCB7XG4gICAgICAgIHRvSVNPU3RyaW5nOiBmdW5jdGlvbiB0b0lTT1N0cmluZygpIHtcbiAgICAgICAgICAgIGlmICghaXNGaW5pdGUodGhpcykgfHwgIWlzRmluaXRlKGdldFRpbWUodGhpcykpKSB7XG4gICAgICAgICAgICAgICAgLy8gQWRvcGUgUGhvdG9zaG9wIHJlcXVpcmVzIHRoZSBzZWNvbmQgY2hlY2suXG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0RhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nIGNhbGxlZCBvbiBub24tZmluaXRlIHZhbHVlLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgeWVhciA9IG9yaWdpbmFsR2V0VVRDRnVsbFllYXIodGhpcyk7XG5cbiAgICAgICAgICAgIHZhciBtb250aCA9IG9yaWdpbmFsR2V0VVRDTW9udGgodGhpcyk7XG4gICAgICAgICAgICAvLyBzZWUgaHR0cHM6Ly9naXRodWIuY29tL2VzLXNoaW1zL2VzNS1zaGltL2lzc3Vlcy8xMTFcbiAgICAgICAgICAgIHllYXIgKz0gZmxvb3IobW9udGggLyAxMik7XG4gICAgICAgICAgICBtb250aCA9ICgobW9udGggJSAxMikgKyAxMikgJSAxMjtcblxuICAgICAgICAgICAgLy8gdGhlIGRhdGUgdGltZSBzdHJpbmcgZm9ybWF0IGlzIHNwZWNpZmllZCBpbiAxNS45LjEuMTUuXG4gICAgICAgICAgICB2YXIgcmVzdWx0ID0gW1xuICAgICAgICAgICAgICAgIG1vbnRoICsgMSxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEdldFVUQ0RhdGUodGhpcyksXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxHZXRVVENIb3Vycyh0aGlzKSxcbiAgICAgICAgICAgICAgICBvcmlnaW5hbEdldFVUQ01pbnV0ZXModGhpcyksXG4gICAgICAgICAgICAgICAgb3JpZ2luYWxHZXRVVENTZWNvbmRzKHRoaXMpXG4gICAgICAgICAgICBdO1xuICAgICAgICAgICAgeWVhciA9IChcbiAgICAgICAgICAgICAgICAoeWVhciA8IDAgPyAnLScgOiAoeWVhciA+IDk5OTkgPyAnKycgOiAnJykpXG4gICAgICAgICAgICAgICAgKyBzdHJTbGljZSgnMDAwMDAnICsgYWJzKHllYXIpLCAoMCA8PSB5ZWFyICYmIHllYXIgPD0gOTk5OSkgPyAtNCA6IC02KVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAvLyBwYWQgbW9udGhzLCBkYXlzLCBob3VycywgbWludXRlcywgYW5kIHNlY29uZHMgdG8gaGF2ZSB0d28gZGlnaXRzLlxuICAgICAgICAgICAgICAgIHJlc3VsdFtpXSA9IHN0clNsaWNlKCcwMCcgKyByZXN1bHRbaV0sIC0yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIHBhZCBtaWxsaXNlY29uZHMgdG8gaGF2ZSB0aHJlZSBkaWdpdHMuXG4gICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgIHllYXIgKyAnLScgKyBhcnJheVNsaWNlKHJlc3VsdCwgMCwgMikuam9pbignLScpXG4gICAgICAgICAgICAgICAgKyAnVCcgKyBhcnJheVNsaWNlKHJlc3VsdCwgMikuam9pbignOicpICsgJy4nXG4gICAgICAgICAgICAgICAgKyBzdHJTbGljZSgnMDAwJyArIG9yaWdpbmFsR2V0VVRDTWlsbGlzZWNvbmRzKHRoaXMpLCAtMykgKyAnWidcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9LCBoYXNOZWdhdGl2ZURhdGVCdWcgfHwgaGFzU2FmYXJpNTFEYXRlQnVnKTtcblxuICAgIC8vIEVTNSAxNS45LjUuNDRcbiAgICAvLyBodHRwczovL2VzNS5naXRodWIuaW8vI3gxNS45LjUuNDRcbiAgICAvLyBUaGlzIGZ1bmN0aW9uIHByb3ZpZGVzIGEgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGEgRGF0ZSBvYmplY3QgZm9yIHVzZSBieVxuICAgIC8vIEpTT04uc3RyaW5naWZ5ICgxNS4xMi4zKS5cbiAgICB2YXIgZGF0ZVRvSlNPTklzU3VwcG9ydGVkID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJldHVybiBEYXRlLnByb3RvdHlwZS50b0pTT05cbiAgICAgICAgICAgICAgICAmJiBuZXcgRGF0ZShOYU4pLnRvSlNPTigpID09PSBudWxsXG4gICAgICAgICAgICAgICAgJiYgbmV3IERhdGUobmVnYXRpdmVEYXRlKS50b0pTT04oKS5pbmRleE9mKG5lZ2F0aXZlWWVhclN0cmluZykgIT09IC0xXG4gICAgICAgICAgICAgICAgJiYgRGF0ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoeyAvLyBnZW5lcmljXG4gICAgICAgICAgICAgICAgICAgIHRvSVNPU3RyaW5nOiBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH0oKSk7XG4gICAgaWYgKCFkYXRlVG9KU09OSXNTdXBwb3J0ZWQpIHtcbiAgICAgICAgRGF0ZS5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OKGtleSkge1xuICAgICAgICAgICAgLy8gV2hlbiB0aGUgdG9KU09OIG1ldGhvZCBpcyBjYWxsZWQgd2l0aCBhcmd1bWVudCBrZXksIHRoZSBmb2xsb3dpbmdcbiAgICAgICAgICAgIC8vIHN0ZXBzIGFyZSB0YWtlbjpcblxuICAgICAgICAgICAgLy8gMS4gIExldCBPIGJlIHRoZSByZXN1bHQgb2YgY2FsbGluZyBUb09iamVjdCwgZ2l2aW5nIGl0IHRoZSB0aGlzXG4gICAgICAgICAgICAvLyB2YWx1ZSBhcyBpdHMgYXJndW1lbnQuXG4gICAgICAgICAgICAvLyAyLiBMZXQgdHYgYmUgRVMuVG9QcmltaXRpdmUoTywgaGludCBOdW1iZXIpLlxuICAgICAgICAgICAgdmFyIE8gPSAkT2JqZWN0KHRoaXMpO1xuICAgICAgICAgICAgdmFyIHR2ID0gRVMuVG9QcmltaXRpdmUoTyk7XG4gICAgICAgICAgICAvLyAzLiBJZiB0diBpcyBhIE51bWJlciBhbmQgaXMgbm90IGZpbml0ZSwgcmV0dXJuIG51bGwuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHR2ID09PSAnbnVtYmVyJyAmJiAhaXNGaW5pdGUodHYpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyA0LiBMZXQgdG9JU08gYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIHRoZSBbW0dldF1dIGludGVybmFsIG1ldGhvZCBvZlxuICAgICAgICAgICAgLy8gTyB3aXRoIGFyZ3VtZW50IFwidG9JU09TdHJpbmdcIi5cbiAgICAgICAgICAgIHZhciB0b0lTTyA9IE8udG9JU09TdHJpbmc7XG4gICAgICAgICAgICAvLyA1LiBJZiBJc0NhbGxhYmxlKHRvSVNPKSBpcyBmYWxzZSwgdGhyb3cgYSBUeXBlRXJyb3IgZXhjZXB0aW9uLlxuICAgICAgICAgICAgaWYgKCFpc0NhbGxhYmxlKHRvSVNPKSkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ3RvSVNPU3RyaW5nIHByb3BlcnR5IGlzIG5vdCBjYWxsYWJsZScpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gNi4gUmV0dXJuIHRoZSByZXN1bHQgb2YgY2FsbGluZyB0aGUgW1tDYWxsXV0gaW50ZXJuYWwgbWV0aG9kIG9mXG4gICAgICAgICAgICAvLyAgdG9JU08gd2l0aCBPIGFzIHRoZSB0aGlzIHZhbHVlIGFuZCBhbiBlbXB0eSBhcmd1bWVudCBsaXN0LlxuICAgICAgICAgICAgcmV0dXJuIHRvSVNPLmNhbGwoTyk7XG5cbiAgICAgICAgICAgIC8vIE5PVEUgMSBUaGUgYXJndW1lbnQgaXMgaWdub3JlZC5cblxuICAgICAgICAgICAgLy8gTk9URSAyIFRoZSB0b0pTT04gZnVuY3Rpb24gaXMgaW50ZW50aW9uYWxseSBnZW5lcmljOyBpdCBkb2VzIG5vdFxuICAgICAgICAgICAgLy8gcmVxdWlyZSB0aGF0IGl0cyB0aGlzIHZhbHVlIGJlIGEgRGF0ZSBvYmplY3QuIFRoZXJlZm9yZSwgaXQgY2FuIGJlXG4gICAgICAgICAgICAvLyB0cmFuc2ZlcnJlZCB0byBvdGhlciBraW5kcyBvZiBvYmplY3RzIGZvciB1c2UgYXMgYSBtZXRob2QuIEhvd2V2ZXIsXG4gICAgICAgICAgICAvLyBpdCBkb2VzIHJlcXVpcmUgdGhhdCBhbnkgc3VjaCBvYmplY3QgaGF2ZSBhIHRvSVNPU3RyaW5nIG1ldGhvZC4gQW5cbiAgICAgICAgICAgIC8vIG9iamVjdCBpcyBmcmVlIHRvIHVzZSB0aGUgYXJndW1lbnQga2V5IHRvIGZpbHRlciBpdHNcbiAgICAgICAgICAgIC8vIHN0cmluZ2lmaWNhdGlvbi5cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBFUzUgMTUuOS40LjJcbiAgICAvLyBodHRwczovL2VzNS5naXRodWIuaW8vI3gxNS45LjQuMlxuICAgIC8vIGJhc2VkIG9uIHdvcmsgc2hhcmVkIGJ5IERhbmllbCBGcmllc2VuIChkYW50bWFuKVxuICAgIC8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tLzMwMzI0OVxuICAgIHZhciBzdXBwb3J0c0V4dGVuZGVkWWVhcnMgPSBEYXRlLnBhcnNlKCcrMDMzNjU4LTA5LTI3VDAxOjQ2OjQwLjAwMFonKSA9PT0gMWUxNTtcbiAgICB2YXIgYWNjZXB0c0ludmFsaWREYXRlcyA9ICFpc05hTihEYXRlLnBhcnNlKCcyMDEyLTA0LTA0VDI0OjAwOjAwLjUwMFonKSkgfHwgIWlzTmFOKERhdGUucGFyc2UoJzIwMTItMTEtMzFUMjM6NTk6NTkuMDAwWicpKSB8fCAhaXNOYU4oRGF0ZS5wYXJzZSgnMjAxMi0xMi0zMVQyMzo1OTo2MC4wMDBaJykpO1xuICAgIHZhciBkb2VzTm90UGFyc2VZMktOZXdZZWFyID0gaXNOYU4oRGF0ZS5wYXJzZSgnMjAwMC0wMS0wMVQwMDowMDowMC4wMDBaJykpO1xuICAgIGlmIChkb2VzTm90UGFyc2VZMktOZXdZZWFyIHx8IGFjY2VwdHNJbnZhbGlkRGF0ZXMgfHwgIXN1cHBvcnRzRXh0ZW5kZWRZZWFycykge1xuICAgICAgICAvLyBYWFggZ2xvYmFsIGFzc2lnbm1lbnQgd29uJ3Qgd29yayBpbiBlbWJlZGRpbmdzIHRoYXQgdXNlXG4gICAgICAgIC8vIGFuIGFsdGVybmF0ZSBvYmplY3QgZm9yIHRoZSBjb250ZXh0LlxuICAgICAgICB2YXIgbWF4U2FmZVVuc2lnbmVkMzJCaXQgPSBwb3coMiwgMzEpIC0gMTtcbiAgICAgICAgdmFyIGhhc1NhZmFyaVNpZ25lZEludEJ1ZyA9IGlzQWN0dWFsTmFOKG5ldyBEYXRlKDE5NzAsIDAsIDEsIDAsIDAsIDAsIG1heFNhZmVVbnNpZ25lZDMyQml0ICsgMSkuZ2V0VGltZSgpKTtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWltcGxpY2l0LWdsb2JhbHMsIG5vLWdsb2JhbC1hc3NpZ25cbiAgICAgICAgRGF0ZSA9IChmdW5jdGlvbiAoTmF0aXZlRGF0ZSkge1xuICAgICAgICAgICAgLy8gRGF0ZS5sZW5ndGggPT09IDdcbiAgICAgICAgICAgIHZhciBEYXRlU2hpbSA9IGZ1bmN0aW9uIERhdGUoWSwgTSwgRCwgaCwgbSwgcywgbXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB2YXIgZGF0ZTtcbiAgICAgICAgICAgICAgICBpZiAodGhpcyBpbnN0YW5jZW9mIE5hdGl2ZURhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNlY29uZHMgPSBzO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWlsbGlzID0gbXM7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoYXNTYWZhcmlTaWduZWRJbnRCdWcgJiYgbGVuZ3RoID49IDcgJiYgbXMgPiBtYXhTYWZlVW5zaWduZWQzMkJpdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gd29yayBhcm91bmQgYSBTYWZhcmkgOC85IGJ1ZyB3aGVyZSBpdCB0cmVhdHMgdGhlIHNlY29uZHMgYXMgc2lnbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgbXNUb1NoaWZ0ID0gZmxvb3IobXMgLyBtYXhTYWZlVW5zaWduZWQzMkJpdCkgKiBtYXhTYWZlVW5zaWduZWQzMkJpdDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzVG9TaGlmdCA9IGZsb29yKG1zVG9TaGlmdCAvIDFlMyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRzICs9IHNUb1NoaWZ0O1xuICAgICAgICAgICAgICAgICAgICAgICAgbWlsbGlzIC09IHNUb1NoaWZ0ICogMWUzO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHZhciBwYXJzZWQgPSBEYXRlU2hpbS5wYXJzZShZKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGhhc05lZ1RpbWVzdGFtcFBhcnNlQnVnID0gaXNOYU4ocGFyc2VkKTtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IGxlbmd0aCA9PT0gMSAmJiAkU3RyaW5nKFkpID09PSBZICYmICFoYXNOZWdUaW1lc3RhbXBQYXJzZUJ1ZyAvLyBpc1N0cmluZyhZKVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZXhwbGljaXRseSBwYXNzIGl0IHRocm91Z2ggcGFyc2U6XG4gICAgICAgICAgICAgICAgICAgICAgICA/IG5ldyBOYXRpdmVEYXRlKHBhcnNlZClcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgdG8gbWFudWFsbHkgbWFrZSBjYWxscyBkZXBlbmRpbmcgb24gYXJndW1lbnRcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxlbmd0aCBoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGxlbmd0aCA+PSA3ID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCwgaCwgbSwgc2Vjb25kcywgbWlsbGlzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbGVuZ3RoID49IDYgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoLCBtLCBzZWNvbmRzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGxlbmd0aCA+PSA1ID8gbmV3IE5hdGl2ZURhdGUoWSwgTSwgRCwgaCwgbSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbGVuZ3RoID49IDQgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBELCBoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbGVuZ3RoID49IDMgPyBuZXcgTmF0aXZlRGF0ZShZLCBNLCBEKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGxlbmd0aCA+PSAyID8gbmV3IE5hdGl2ZURhdGUoWSwgTSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbGVuZ3RoID49IDEgPyBuZXcgTmF0aXZlRGF0ZShZIGluc3RhbmNlb2YgTmF0aXZlRGF0ZSA/ICtZIDogWSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBOYXRpdmVEYXRlKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGF0ZSA9IE5hdGl2ZURhdGUuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKCFpc1ByaW1pdGl2ZShkYXRlKSkge1xuICAgICAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IG1peHVwcyB3aXRoIHVuZml4ZWQgRGF0ZSBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgZGVmaW5lUHJvcGVydGllcyhkYXRlLCB7IGNvbnN0cnVjdG9yOiBEYXRlU2hpbSB9LCB0cnVlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGRhdGU7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyAxNS45LjEuMTUgRGF0ZSBUaW1lIFN0cmluZyBGb3JtYXQuXG4gICAgICAgICAgICB2YXIgaXNvRGF0ZUV4cHJlc3Npb24gPSBuZXcgUmVnRXhwKCdeJ1xuICAgICAgICAgICAgICAgICsgJyhcXFxcZHs0fXxbKy1dXFxcXGR7Nn0pJyAvLyBmb3VyLWRpZ2l0IHllYXIgY2FwdHVyZSBvciBzaWduICsgNi1kaWdpdCBleHRlbmRlZCB5ZWFyXG4gICAgICAgICAgICAgICAgKyAnKD86LShcXFxcZHsyfSknIC8vIG9wdGlvbmFsIG1vbnRoIGNhcHR1cmVcbiAgICAgICAgICAgICAgICArICcoPzotKFxcXFxkezJ9KScgLy8gb3B0aW9uYWwgZGF5IGNhcHR1cmVcbiAgICAgICAgICAgICAgICArICcoPzonIC8vIGNhcHR1cmUgaG91cnM6bWludXRlczpzZWNvbmRzLm1pbGxpc2Vjb25kc1xuICAgICAgICAgICAgICAgICAgICArICdUKFxcXFxkezJ9KScgLy8gaG91cnMgY2FwdHVyZVxuICAgICAgICAgICAgICAgICAgICArICc6KFxcXFxkezJ9KScgLy8gbWludXRlcyBjYXB0dXJlXG4gICAgICAgICAgICAgICAgICAgICsgJyg/OicgLy8gb3B0aW9uYWwgOnNlY29uZHMubWlsbGlzZWNvbmRzXG4gICAgICAgICAgICAgICAgICAgICAgICArICc6KFxcXFxkezJ9KScgLy8gc2Vjb25kcyBjYXB0dXJlXG4gICAgICAgICAgICAgICAgICAgICAgICArICcoPzooXFxcXC5cXFxcZHsxLH0pKT8nIC8vIG1pbGxpc2Vjb25kcyBjYXB0dXJlXG4gICAgICAgICAgICAgICAgICAgICsgJyk/J1xuICAgICAgICAgICAgICAgICsgJygnIC8vIGNhcHR1cmUgVVRDIG9mZnNldCBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgKyAnWnwnIC8vIFVUQyBjYXB0dXJlXG4gICAgICAgICAgICAgICAgICAgICsgJyg/OicgLy8gb2Zmc2V0IHNwZWNpZmllciArLy1ob3VyczptaW51dGVzXG4gICAgICAgICAgICAgICAgICAgICAgICArICcoWy0rXSknIC8vIHNpZ24gY2FwdHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgKyAnKFxcXFxkezJ9KScgLy8gaG91cnMgb2Zmc2V0IGNhcHR1cmVcbiAgICAgICAgICAgICAgICAgICAgICAgICsgJzooXFxcXGR7Mn0pJyAvLyBtaW51dGVzIG9mZnNldCBjYXB0dXJlXG4gICAgICAgICAgICAgICAgICAgICsgJyknXG4gICAgICAgICAgICAgICAgKyAnKT8pPyk/KT8nXG4gICAgICAgICAgICArICckJyk7XG5cbiAgICAgICAgICAgIHZhciBtb250aHMgPSBbMCwgMzEsIDU5LCA5MCwgMTIwLCAxNTEsIDE4MSwgMjEyLCAyNDMsIDI3MywgMzA0LCAzMzQsIDM2NV07XG5cbiAgICAgICAgICAgIHZhciBkYXlGcm9tTW9udGggPSBmdW5jdGlvbiBkYXlGcm9tTW9udGgoeWVhciwgbW9udGgpIHtcbiAgICAgICAgICAgICAgICB2YXIgdCA9IG1vbnRoID4gMSA/IDEgOiAwO1xuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIG1vbnRoc1ttb250aF1cbiAgICAgICAgICAgICAgICAgICAgICAgICsgZmxvb3IoKHllYXIgLSAxOTY5ICsgdCkgLyA0KVxuICAgICAgICAgICAgICAgICAgICAgICAgLSBmbG9vcigoeWVhciAtIDE5MDEgKyB0KSAvIDEwMClcbiAgICAgICAgICAgICAgICAgICAgICAgICsgZmxvb3IoKHllYXIgLSAxNjAxICsgdCkgLyA0MDApXG4gICAgICAgICAgICAgICAgICAgICAgICArICgzNjUgKiAoeWVhciAtIDE5NzApKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB2YXIgdG9VVEMgPSBmdW5jdGlvbiB0b1VUQyh0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHMgPSAwO1xuICAgICAgICAgICAgICAgIHZhciBtcyA9IHQ7XG4gICAgICAgICAgICAgICAgaWYgKGhhc1NhZmFyaVNpZ25lZEludEJ1ZyAmJiBtcyA+IG1heFNhZmVVbnNpZ25lZDMyQml0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHdvcmsgYXJvdW5kIGEgU2FmYXJpIDgvOSBidWcgd2hlcmUgaXQgdHJlYXRzIHRoZSBzZWNvbmRzIGFzIHNpZ25lZFxuICAgICAgICAgICAgICAgICAgICB2YXIgbXNUb1NoaWZ0ID0gZmxvb3IobXMgLyBtYXhTYWZlVW5zaWduZWQzMkJpdCkgKiBtYXhTYWZlVW5zaWduZWQzMkJpdDtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNUb1NoaWZ0ID0gZmxvb3IobXNUb1NoaWZ0IC8gMWUzKTtcbiAgICAgICAgICAgICAgICAgICAgcyArPSBzVG9TaGlmdDtcbiAgICAgICAgICAgICAgICAgICAgbXMgLT0gc1RvU2hpZnQgKiAxZTM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiAkTnVtYmVyKG5ldyBOYXRpdmVEYXRlKDE5NzAsIDAsIDEsIDAsIDAsIHMsIG1zKSk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBDb3B5IGFueSBjdXN0b20gbWV0aG9kcyBhIDNyZCBwYXJ0eSBsaWJyYXJ5IG1heSBoYXZlIGFkZGVkXG4gICAgICAgICAgICBmb3IgKHZhciBrZXkgaW4gTmF0aXZlRGF0ZSkge1xuICAgICAgICAgICAgICAgIGlmIChvd25zKE5hdGl2ZURhdGUsIGtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgRGF0ZVNoaW1ba2V5XSA9IE5hdGl2ZURhdGVba2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENvcHkgXCJuYXRpdmVcIiBtZXRob2RzIGV4cGxpY2l0bHk7IHRoZXkgbWF5IGJlIG5vbi1lbnVtZXJhYmxlXG4gICAgICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKERhdGVTaGltLCB7XG4gICAgICAgICAgICAgICAgbm93OiBOYXRpdmVEYXRlLm5vdyxcbiAgICAgICAgICAgICAgICBVVEM6IE5hdGl2ZURhdGUuVVRDXG4gICAgICAgICAgICB9LCB0cnVlKTtcbiAgICAgICAgICAgIERhdGVTaGltLnByb3RvdHlwZSA9IE5hdGl2ZURhdGUucHJvdG90eXBlO1xuICAgICAgICAgICAgZGVmaW5lUHJvcGVydGllcyhEYXRlU2hpbS5wcm90b3R5cGUsIHsgY29uc3RydWN0b3I6IERhdGVTaGltIH0sIHRydWUpO1xuXG4gICAgICAgICAgICAvLyBVcGdyYWRlIERhdGUucGFyc2UgdG8gaGFuZGxlIHNpbXBsaWZpZWQgSVNPIDg2MDEgc3RyaW5nc1xuICAgICAgICAgICAgdmFyIHBhcnNlU2hpbSA9IGZ1bmN0aW9uIHBhcnNlKHN0cmluZykge1xuICAgICAgICAgICAgICAgIHZhciBtYXRjaCA9IGlzb0RhdGVFeHByZXNzaW9uLmV4ZWMoc3RyaW5nKTtcbiAgICAgICAgICAgICAgICBpZiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gcGFyc2UgbW9udGhzLCBkYXlzLCBob3VycywgbWludXRlcywgc2Vjb25kcywgYW5kIG1pbGxpc2Vjb25kc1xuICAgICAgICAgICAgICAgICAgICAvLyBwcm92aWRlIGRlZmF1bHQgdmFsdWVzIGlmIG5lY2Vzc2FyeVxuICAgICAgICAgICAgICAgICAgICAvLyBwYXJzZSB0aGUgVVRDIG9mZnNldCBjb21wb25lbnRcbiAgICAgICAgICAgICAgICAgICAgdmFyIHllYXIgPSAkTnVtYmVyKG1hdGNoWzFdKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoID0gJE51bWJlcihtYXRjaFsyXSB8fCAxKSAtIDEsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXkgPSAkTnVtYmVyKG1hdGNoWzNdIHx8IDEpIC0gMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvdXIgPSAkTnVtYmVyKG1hdGNoWzRdIHx8IDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWludXRlID0gJE51bWJlcihtYXRjaFs1XSB8fCAwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZCA9ICROdW1iZXIobWF0Y2hbNl0gfHwgMCksXG4gICAgICAgICAgICAgICAgICAgICAgICBtaWxsaXNlY29uZCA9IGZsb29yKCROdW1iZXIobWF0Y2hbN10gfHwgMCkgKiAxMDAwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gdGltZSB6b25lIGlzIG1pc3NlZCwgbG9jYWwgb2Zmc2V0IHNob3VsZCBiZSB1c2VkXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyAoRVMgNS4xIGJ1ZylcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlZSBodHRwczovL2J1Z3MuZWNtYXNjcmlwdC5vcmcvc2hvd19idWcuY2dpP2lkPTExMlxuICAgICAgICAgICAgICAgICAgICAgICAgaXNMb2NhbFRpbWUgPSBCb29sZWFuKG1hdGNoWzRdICYmICFtYXRjaFs4XSksXG4gICAgICAgICAgICAgICAgICAgICAgICBzaWduT2Zmc2V0ID0gbWF0Y2hbOV0gPT09ICctJyA/IDEgOiAtMSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhvdXJPZmZzZXQgPSAkTnVtYmVyKG1hdGNoWzEwXSB8fCAwKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1pbnV0ZU9mZnNldCA9ICROdW1iZXIobWF0Y2hbMTFdIHx8IDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0O1xuICAgICAgICAgICAgICAgICAgICB2YXIgaGFzTWludXRlc09yU2Vjb25kc09yTWlsbGlzZWNvbmRzID0gbWludXRlID4gMCB8fCBzZWNvbmQgPiAwIHx8IG1pbGxpc2Vjb25kID4gMDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgaG91ciA8IChoYXNNaW51dGVzT3JTZWNvbmRzT3JNaWxsaXNlY29uZHMgPyAyNCA6IDI1KVxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgbWludXRlIDwgNjAgJiYgc2Vjb25kIDwgNjAgJiYgbWlsbGlzZWNvbmQgPCAxMDAwXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBtb250aCA+IC0xICYmIG1vbnRoIDwgMTIgJiYgaG91ck9mZnNldCA8IDI0XG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBtaW51dGVPZmZzZXQgPCA2MCAvLyBkZXRlY3QgaW52YWxpZCBvZmZzZXRzXG4gICAgICAgICAgICAgICAgICAgICAgICAmJiBkYXkgPiAtMVxuICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGF5IDwgKGRheUZyb21Nb250aCh5ZWFyLCBtb250aCArIDEpIC0gZGF5RnJvbU1vbnRoKHllYXIsIG1vbnRoKSlcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChkYXlGcm9tTW9udGgoeWVhciwgbW9udGgpICsgZGF5KSAqIDI0KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgaG91clxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGhvdXJPZmZzZXQgKiBzaWduT2Zmc2V0KVxuICAgICAgICAgICAgICAgICAgICAgICAgKSAqIDYwO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHJlc3VsdCArIG1pbnV0ZSArIChtaW51dGVPZmZzZXQgKiBzaWduT2Zmc2V0KSkgKiA2MClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHNlY29uZFxuICAgICAgICAgICAgICAgICAgICAgICAgKSAqIDEwMDApICsgbWlsbGlzZWNvbmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXNMb2NhbFRpbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSB0b1VUQyhyZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKC04LjY0ZTE1IDw9IHJlc3VsdCAmJiByZXN1bHQgPD0gOC42NGUxNSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5hTjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIE5hdGl2ZURhdGUucGFyc2UuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBkZWZpbmVQcm9wZXJ0aWVzKERhdGVTaGltLCB7IHBhcnNlOiBwYXJzZVNoaW0gfSk7XG5cbiAgICAgICAgICAgIHJldHVybiBEYXRlU2hpbTtcbiAgICAgICAgfShEYXRlKSk7XG4gICAgfVxuXG4gICAgLy8gRVM1IDE1LjkuNC40XG4gICAgLy8gaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTUuOS40LjRcbiAgICBpZiAoIURhdGUubm93KSB7XG4gICAgICAgIERhdGUubm93ID0gZnVuY3Rpb24gbm93KCkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vXG4gICAgLy8gTnVtYmVyXG4gICAgLy8gPT09PT09XG4gICAgLy9cblxuICAgIC8vIEVTNS4xIDE1LjcuNC41XG4gICAgLy8gaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTUuNy40LjVcbiAgICB2YXIgaGFzVG9GaXhlZEJ1Z3MgPSBOdW1iZXJQcm90b3R5cGUudG9GaXhlZCAmJiAoXG4gICAgICAgICgwLjAwMDA4KS50b0ZpeGVkKDMpICE9PSAnMC4wMDAnXG4gICAgICAgIHx8ICgwLjkpLnRvRml4ZWQoMCkgIT09ICcxJ1xuICAgICAgICB8fCAoMS4yNTUpLnRvRml4ZWQoMikgIT09ICcxLjI1J1xuICAgICAgICB8fCAoMTAwMDAwMDAwMDAwMDAwMDEyOCkudG9GaXhlZCgwKSAhPT0gJzEwMDAwMDAwMDAwMDAwMDAxMjgnXG4gICAgKTtcblxuICAgIHZhciB0b0ZpeGVkSGVscGVycyA9IHtcbiAgICAgICAgYmFzZTogMWU3LFxuICAgICAgICBzaXplOiA2LFxuICAgICAgICBkYXRhOiBbMCwgMCwgMCwgMCwgMCwgMF0sXG4gICAgICAgIG11bHRpcGx5OiBmdW5jdGlvbiBtdWx0aXBseShuLCBjKSB7XG4gICAgICAgICAgICB2YXIgaSA9IC0xO1xuICAgICAgICAgICAgdmFyIGMyID0gYztcbiAgICAgICAgICAgIHdoaWxlICgrK2kgPCB0b0ZpeGVkSGVscGVycy5zaXplKSB7XG4gICAgICAgICAgICAgICAgYzIgKz0gbiAqIHRvRml4ZWRIZWxwZXJzLmRhdGFbaV07XG4gICAgICAgICAgICAgICAgdG9GaXhlZEhlbHBlcnMuZGF0YVtpXSA9IGMyICUgdG9GaXhlZEhlbHBlcnMuYmFzZTtcbiAgICAgICAgICAgICAgICBjMiA9IGZsb29yKGMyIC8gdG9GaXhlZEhlbHBlcnMuYmFzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGRpdmlkZTogZnVuY3Rpb24gZGl2aWRlKG4pIHtcbiAgICAgICAgICAgIHZhciBpID0gdG9GaXhlZEhlbHBlcnMuc2l6ZTtcbiAgICAgICAgICAgIHZhciBjID0gMDtcbiAgICAgICAgICAgIHdoaWxlICgtLWkgPj0gMCkge1xuICAgICAgICAgICAgICAgIGMgKz0gdG9GaXhlZEhlbHBlcnMuZGF0YVtpXTtcbiAgICAgICAgICAgICAgICB0b0ZpeGVkSGVscGVycy5kYXRhW2ldID0gZmxvb3IoYyAvIG4pO1xuICAgICAgICAgICAgICAgIGMgPSAoYyAlIG4pICogdG9GaXhlZEhlbHBlcnMuYmFzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICAgICAgbnVtVG9TdHJpbmc6IGZ1bmN0aW9uIG51bVRvU3RyaW5nKCkge1xuICAgICAgICAgICAgdmFyIGkgPSB0b0ZpeGVkSGVscGVycy5zaXplO1xuICAgICAgICAgICAgdmFyIHMgPSAnJztcbiAgICAgICAgICAgIHdoaWxlICgtLWkgPj0gMCkge1xuICAgICAgICAgICAgICAgIGlmIChzICE9PSAnJyB8fCBpID09PSAwIHx8IHRvRml4ZWRIZWxwZXJzLmRhdGFbaV0gIT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHQgPSAkU3RyaW5nKHRvRml4ZWRIZWxwZXJzLmRhdGFbaV0pO1xuICAgICAgICAgICAgICAgICAgICBpZiAocyA9PT0gJycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHMgPSB0O1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcyArPSBzdHJTbGljZSgnMDAwMDAwMCcsIDAsIDcgLSB0Lmxlbmd0aCkgKyB0O1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHM7XG4gICAgICAgIH0sXG4gICAgICAgIHBvdzogZnVuY3Rpb24gcG93KHgsIG4sIGFjYykge1xuICAgICAgICAgICAgcmV0dXJuIChuID09PSAwID8gYWNjIDogKG4gJSAyID09PSAxID8gcG93KHgsIG4gLSAxLCBhY2MgKiB4KSA6IHBvdyh4ICogeCwgbiAvIDIsIGFjYykpKTtcbiAgICAgICAgfSxcbiAgICAgICAgbG9nOiBmdW5jdGlvbiBsb2coeCkge1xuICAgICAgICAgICAgdmFyIG4gPSAwO1xuICAgICAgICAgICAgdmFyIHgyID0geDtcbiAgICAgICAgICAgIHdoaWxlICh4MiA+PSA0MDk2KSB7XG4gICAgICAgICAgICAgICAgbiArPSAxMjtcbiAgICAgICAgICAgICAgICB4MiAvPSA0MDk2O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgd2hpbGUgKHgyID49IDIpIHtcbiAgICAgICAgICAgICAgICBuICs9IDE7XG4gICAgICAgICAgICAgICAgeDIgLz0gMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIHZhciB0b0ZpeGVkU2hpbSA9IGZ1bmN0aW9uIHRvRml4ZWQoZnJhY3Rpb25EaWdpdHMpIHtcbiAgICAgICAgdmFyIGYsIHgsIHMsIG0sIGUsIHosIGosIGs7XG5cbiAgICAgICAgLy8gVGVzdCBmb3IgTmFOIGFuZCByb3VuZCBmcmFjdGlvbkRpZ2l0cyBkb3duXG4gICAgICAgIGYgPSAkTnVtYmVyKGZyYWN0aW9uRGlnaXRzKTtcbiAgICAgICAgZiA9IGlzQWN0dWFsTmFOKGYpID8gMCA6IGZsb29yKGYpO1xuXG4gICAgICAgIGlmIChmIDwgMCB8fCBmID4gMjApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdOdW1iZXIudG9GaXhlZCBjYWxsZWQgd2l0aCBpbnZhbGlkIG51bWJlciBvZiBkZWNpbWFscycpO1xuICAgICAgICB9XG5cbiAgICAgICAgeCA9ICROdW1iZXIodGhpcyk7XG5cbiAgICAgICAgaWYgKGlzQWN0dWFsTmFOKHgpKSB7XG4gICAgICAgICAgICByZXR1cm4gJ05hTic7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJZiBpdCBpcyB0b28gYmlnIG9yIHNtYWxsLCByZXR1cm4gdGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgbnVtYmVyXG4gICAgICAgIGlmICh4IDw9IC0xZTIxIHx8IHggPj0gMWUyMSkge1xuICAgICAgICAgICAgcmV0dXJuICRTdHJpbmcoeCk7XG4gICAgICAgIH1cblxuICAgICAgICBzID0gJyc7XG5cbiAgICAgICAgaWYgKHggPCAwKSB7XG4gICAgICAgICAgICBzID0gJy0nO1xuICAgICAgICAgICAgeCA9IC14O1xuICAgICAgICB9XG5cbiAgICAgICAgbSA9ICcwJztcblxuICAgICAgICBpZiAoeCA+IDFlLTIxKSB7XG4gICAgICAgICAgICAvLyAxZS0yMSA8IHggPCAxZTIxXG4gICAgICAgICAgICAvLyAtNzAgPCBsb2cyKHgpIDwgNzBcbiAgICAgICAgICAgIGUgPSB0b0ZpeGVkSGVscGVycy5sb2coeCAqIHRvRml4ZWRIZWxwZXJzLnBvdygyLCA2OSwgMSkpIC0gNjk7XG4gICAgICAgICAgICB6ID0gKGUgPCAwID8geCAqIHRvRml4ZWRIZWxwZXJzLnBvdygyLCAtZSwgMSkgOiB4IC8gdG9GaXhlZEhlbHBlcnMucG93KDIsIGUsIDEpKTtcbiAgICAgICAgICAgIHogKj0gMHgxMDAwMDAwMDAwMDAwMDsgLy8gcG93KDIsIDUyKTtcbiAgICAgICAgICAgIGUgPSA1MiAtIGU7XG5cbiAgICAgICAgICAgIC8vIC0xOCA8IGUgPCAxMjJcbiAgICAgICAgICAgIC8vIHggPSB6IC8gMiBeIGVcbiAgICAgICAgICAgIGlmIChlID4gMCkge1xuICAgICAgICAgICAgICAgIHRvRml4ZWRIZWxwZXJzLm11bHRpcGx5KDAsIHopO1xuICAgICAgICAgICAgICAgIGogPSBmO1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKGogPj0gNykge1xuICAgICAgICAgICAgICAgICAgICB0b0ZpeGVkSGVscGVycy5tdWx0aXBseSgxZTcsIDApO1xuICAgICAgICAgICAgICAgICAgICBqIC09IDc7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdG9GaXhlZEhlbHBlcnMubXVsdGlwbHkodG9GaXhlZEhlbHBlcnMucG93KDEwLCBqLCAxKSwgMCk7XG4gICAgICAgICAgICAgICAgaiA9IGUgLSAxO1xuXG4gICAgICAgICAgICAgICAgd2hpbGUgKGogPj0gMjMpIHtcbiAgICAgICAgICAgICAgICAgICAgdG9GaXhlZEhlbHBlcnMuZGl2aWRlKDEgPDwgMjMpO1xuICAgICAgICAgICAgICAgICAgICBqIC09IDIzO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRvRml4ZWRIZWxwZXJzLmRpdmlkZSgxIDw8IGopO1xuICAgICAgICAgICAgICAgIHRvRml4ZWRIZWxwZXJzLm11bHRpcGx5KDEsIDEpO1xuICAgICAgICAgICAgICAgIHRvRml4ZWRIZWxwZXJzLmRpdmlkZSgyKTtcbiAgICAgICAgICAgICAgICBtID0gdG9GaXhlZEhlbHBlcnMubnVtVG9TdHJpbmcoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG9GaXhlZEhlbHBlcnMubXVsdGlwbHkoMCwgeik7XG4gICAgICAgICAgICAgICAgdG9GaXhlZEhlbHBlcnMubXVsdGlwbHkoMSA8PCAoLWUpLCAwKTtcbiAgICAgICAgICAgICAgICBtID0gdG9GaXhlZEhlbHBlcnMubnVtVG9TdHJpbmcoKSArIHN0clNsaWNlKCcwLjAwMDAwMDAwMDAwMDAwMDAwMDAwJywgMiwgMiArIGYpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGYgPiAwKSB7XG4gICAgICAgICAgICBrID0gbS5sZW5ndGg7XG5cbiAgICAgICAgICAgIGlmIChrIDw9IGYpIHtcbiAgICAgICAgICAgICAgICBtID0gcyArIHN0clNsaWNlKCcwLjAwMDAwMDAwMDAwMDAwMDAwMDAnLCAwLCBmIC0gayArIDIpICsgbTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbSA9IHMgKyBzdHJTbGljZShtLCAwLCBrIC0gZikgKyAnLicgKyBzdHJTbGljZShtLCBrIC0gZik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtID0gcyArIG07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbTtcbiAgICB9O1xuICAgIGRlZmluZVByb3BlcnRpZXMoTnVtYmVyUHJvdG90eXBlLCB7IHRvRml4ZWQ6IHRvRml4ZWRTaGltIH0sIGhhc1RvRml4ZWRCdWdzKTtcblxuICAgIHZhciBoYXNUb0V4cG9uZW50aWFsUm91bmRpbmdCdWcgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuICgtNi45ZS0xMSkudG9FeHBvbmVudGlhbCg0KSAhPT0gJy02LjkwMDBlLTExJztcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSgpKTtcbiAgICB2YXIgdG9FeHBvbmVudGlhbEFsbG93c0luZmluaXRlRGlnaXRzID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICgxKS50b0V4cG9uZW50aWFsKEluZmluaXR5KTtcbiAgICAgICAgICAgICgxKS50b0V4cG9uZW50aWFsKC1JbmZpbml0eSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfSgpKTtcbiAgICB2YXIgb3JpZ2luYWxUb0V4cG9uZW50aWFsID0gY2FsbC5iaW5kKE51bWJlclByb3RvdHlwZS50b0V4cG9uZW50aWFsKTtcbiAgICB2YXIgbnVtYmVyVG9TdHJpbmcgPSBjYWxsLmJpbmQoTnVtYmVyUHJvdG90eXBlLnRvU3RyaW5nKTtcbiAgICB2YXIgbnVtYmVyVmFsdWVPZiA9IGNhbGwuYmluZChOdW1iZXJQcm90b3R5cGUudmFsdWVPZik7XG4gICAgZGVmaW5lUHJvcGVydGllcyhOdW1iZXJQcm90b3R5cGUsIHtcbiAgICAgICAgdG9FeHBvbmVudGlhbDogZnVuY3Rpb24gdG9FeHBvbmVudGlhbChmcmFjdGlvbkRpZ2l0cykge1xuICAgICAgICAgICAgLy8gMTogTGV0IHggYmUgdGhpcyBOdW1iZXIgdmFsdWUuXG4gICAgICAgICAgICB2YXIgeCA9IG51bWJlclZhbHVlT2YodGhpcyk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnJhY3Rpb25EaWdpdHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsVG9FeHBvbmVudGlhbCh4KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBmID0gRVMuVG9JbnRlZ2VyKGZyYWN0aW9uRGlnaXRzKTtcbiAgICAgICAgICAgIGlmIChpc0FjdHVhbE5hTih4KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiAnTmFOJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGYgPCAwIHx8IGYgPiAyMCkge1xuICAgICAgICAgICAgICAgIGlmICghaXNGaW5pdGUoZikpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gSUUgNiBkb2Vzbid0IHRocm93IGluIHRoZSBuYXRpdmUgb25lXG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0b0V4cG9uZW50aWFsKCkgYXJndW1lbnQgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDIwJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHRoaXMgd2lsbCBwcm9iYWJseSBoYXZlIHRocm93biBhbHJlYWR5XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdpbmFsVG9FeHBvbmVudGlhbCh4LCBmKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gb25seSBjYXNlcyBsZWZ0IGFyZSBhIGZpbml0ZSByZWNlaXZlciArIGluLXJhbmdlIGZyYWN0aW9uRGlnaXRzXG5cbiAgICAgICAgICAgIC8vIGltcGxlbWVudGF0aW9uIGFkYXB0ZWQgZnJvbSBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9TaGVldEpTRGV2LzExMDBhZDU2YjlmODU2Yzk1Mjk5ZWQwZTA2OGVlYTA4XG5cbiAgICAgICAgICAgIC8vIDQ6IExldCBzIGJlIHRoZSBlbXB0eSBzdHJpbmdcbiAgICAgICAgICAgIHZhciBzID0gJyc7XG5cbiAgICAgICAgICAgIC8vIDU6IElmIHggPCAwXG4gICAgICAgICAgICBpZiAoeCA8IDApIHtcbiAgICAgICAgICAgICAgICBzID0gJy0nO1xuICAgICAgICAgICAgICAgIHggPSAteDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gNjogSWYgeCA9ICtJbmZpbml0eVxuICAgICAgICAgICAgaWYgKHggPT09IEluZmluaXR5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHMgKyAnSW5maW5pdHknO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyA3OiBJZiBmcmFjdGlvbkRpZ2l0cyBpcyBub3QgdW5kZWZpbmVkIGFuZCAoZiA8IDAgb3IgZiA+IDIwKSwgdGhyb3cgYSBSYW5nZUVycm9yIGV4Y2VwdGlvbi5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZnJhY3Rpb25EaWdpdHMgIT09ICd1bmRlZmluZWQnICYmIChmIDwgMCB8fCBmID4gMjApKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ZyYWN0aW9uIGRpZ2l0cyAnICsgZnJhY3Rpb25EaWdpdHMgKyAnIG91dCBvZiByYW5nZScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbSA9ICcnO1xuICAgICAgICAgICAgdmFyIGUgPSAwO1xuICAgICAgICAgICAgdmFyIGMgPSAnJztcbiAgICAgICAgICAgIHZhciBkID0gJyc7XG5cbiAgICAgICAgICAgIC8vIDg6IElmIHggPSAwIHRoZW5cbiAgICAgICAgICAgIGlmICh4ID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZSA9IDA7XG4gICAgICAgICAgICAgICAgZiA9IDA7XG4gICAgICAgICAgICAgICAgbSA9ICcwJztcbiAgICAgICAgICAgIH0gZWxzZSB7IC8vIDk6IEVsc2UsIHggIT0gMFxuICAgICAgICAgICAgICAgIHZhciBMID0gbG9nMTAoeCk7XG4gICAgICAgICAgICAgICAgZSA9IGZsb29yKEwpOyAvLyAxMCAqKiBlIDw9IHggYW5kIHggPCAxMCAqKiAoZSsxKVxuICAgICAgICAgICAgICAgIHZhciBuID0gMDtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGZyYWN0aW9uRGlnaXRzICE9PSAndW5kZWZpbmVkJykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5lZ2F0ZWQtY29uZGl0aW9uXG4gICAgICAgICAgICAgICAgICAgIHZhciB3ID0gcG93KDEwLCBlIC0gZik7IC8vIHggLyAxMCAqKiAoZisxKSA8IHcgYW5kIHcgPD0geCAvIDEwICoqIGZcbiAgICAgICAgICAgICAgICAgICAgbiA9IHJvdW5kKHggLyB3KTsgLy8gMTAgKiogZiA8PSBuIGFuZCBuIDwgMTAgKiogKGYrMSlcbiAgICAgICAgICAgICAgICAgICAgaWYgKDIgKiB4ID49ICgoKDIgKiBuKSArIDEpICogdykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG4gKz0gMTsgLy8gcGljayBsYXJnZXIgdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAobiA+PSBwb3coMTAsIGYgKyAxKSkgeyAvLyAxMGUtMSA9IDFlMFxuICAgICAgICAgICAgICAgICAgICAgICAgbiAvPSAxMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGYgPSAxNjsgLy8gc3RhcnQgZnJvbSBNYXRoLmNlaWwoTWF0aC5sb2cxMChOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikpIGFuZCBsb29wIGRvd25cbiAgICAgICAgICAgICAgICAgICAgdmFyIGd1ZXNzX24gPSByb3VuZChwb3coMTAsIEwgLSBlICsgZikpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0X2YgPSBmO1xuICAgICAgICAgICAgICAgICAgICB3aGlsZSAoZi0tID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZ3Vlc3NfbiA9IHJvdW5kKHBvdygxMCwgTCAtIGUgKyBmKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWJzKChndWVzc19uICogcG93KDEwLCBlIC0gZikpIC0geClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PSBhYnMoKG4gKiBwb3coMTAsIGUgLSB0YXJnZXRfZikpIC0geClcbiAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9mID0gZjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBuID0gZ3Vlc3NfbjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBtID0gbnVtYmVyVG9TdHJpbmcobiwgMTApO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgZnJhY3Rpb25EaWdpdHMgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIHdoaWxlIChzdHJTbGljZShtLCAtMSkgPT09ICcwJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbSA9IHN0clNsaWNlKG0sIDAsIC0xKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGQgKz0gMTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gMTA6IElmIGYgIT0gMCwgdGhlblxuICAgICAgICAgICAgaWYgKGYgIT09IDApIHtcbiAgICAgICAgICAgICAgICBtID0gc3RyU2xpY2UobSwgMCwgMSkgKyAnLicgKyBzdHJTbGljZShtLCAxKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gMTE6IElmIGUgPSAwLCB0aGVuXG4gICAgICAgICAgICBpZiAoZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGMgPSAnKyc7XG4gICAgICAgICAgICAgICAgZCA9ICcwJztcbiAgICAgICAgICAgIH0gZWxzZSB7IC8vIDEyOiBFbHNlXG4gICAgICAgICAgICAgICAgYyA9IGUgPiAwID8gJysnIDogJy0nO1xuICAgICAgICAgICAgICAgIGQgPSBudW1iZXJUb1N0cmluZyhhYnMoZSksIDEwKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gMTM6IExldCBtIGJlIHRoZSBjb25jYXRlbmF0aW9uIG9mIHRoZSBmb3VyIFN0cmluZ3MgbSwgXCJlXCIsIGMsIGFuZCBkLlxuICAgICAgICAgICAgbSArPSAnZScgKyBjICsgZDtcblxuICAgICAgICAgICAgLy8gMTQ6IFJldHVybiB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGUgU3RyaW5ncyBzIGFuZCBtLlxuICAgICAgICAgICAgcmV0dXJuIHMgKyBtO1xuICAgICAgICB9XG4gICAgfSwgaGFzVG9FeHBvbmVudGlhbFJvdW5kaW5nQnVnIHx8IHRvRXhwb25lbnRpYWxBbGxvd3NJbmZpbml0ZURpZ2l0cyk7XG5cbiAgICB2YXIgaGFzVG9QcmVjaXNpb25VbmRlZmluZWRCdWcgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIDEuMC50b1ByZWNpc2lvbih1bmRlZmluZWQpID09PSAnMSc7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfSgpKTtcbiAgICB2YXIgb3JpZ2luYWxUb1ByZWNpc2lvbiA9IGNhbGwuYmluZChOdW1iZXJQcm90b3R5cGUudG9QcmVjaXNpb24pO1xuICAgIGRlZmluZVByb3BlcnRpZXMoTnVtYmVyUHJvdG90eXBlLCB7XG4gICAgICAgIHRvUHJlY2lzaW9uOiBmdW5jdGlvbiB0b1ByZWNpc2lvbihwcmVjaXNpb24pIHtcbiAgICAgICAgICAgIHJldHVybiB0eXBlb2YgcHJlY2lzaW9uID09PSAndW5kZWZpbmVkJyA/IG9yaWdpbmFsVG9QcmVjaXNpb24odGhpcykgOiBvcmlnaW5hbFRvUHJlY2lzaW9uKHRoaXMsIHByZWNpc2lvbik7XG4gICAgICAgIH1cbiAgICB9LCBoYXNUb1ByZWNpc2lvblVuZGVmaW5lZEJ1Zyk7XG5cbiAgICAvL1xuICAgIC8vIFN0cmluZ1xuICAgIC8vID09PT09PVxuICAgIC8vXG5cbiAgICAvLyBFUzUgMTUuNS40LjE0XG4gICAgLy8gaHR0cHM6Ly9lczUuZ2l0aHViLmlvLyN4MTUuNS40LjE0XG5cbiAgICAvLyBbYnVnZml4LCBJRSBsdCA5LCBmaXJlZm94IDQsIEtvbnF1ZXJvciwgT3BlcmEsIG9ic2N1cmUgYnJvd3NlcnNdXG4gICAgLy8gTWFueSBicm93c2VycyBkbyBub3Qgc3BsaXQgcHJvcGVybHkgd2l0aCByZWd1bGFyIGV4cHJlc3Npb25zIG9yIHRoZXlcbiAgICAvLyBkbyBub3QgcGVyZm9ybSB0aGUgc3BsaXQgY29ycmVjdGx5IHVuZGVyIG9ic2N1cmUgY29uZGl0aW9ucy5cbiAgICAvLyBTZWUgaHR0cHM6Ly9ibG9nLnN0ZXZlbmxldml0aGFuLmNvbS9hcmNoaXZlcy9jcm9zcy1icm93c2VyLXNwbGl0XG4gICAgLy8gSSd2ZSB0ZXN0ZWQgaW4gbWFueSBicm93c2VycyBhbmQgdGhpcyBzZWVtcyB0byBjb3ZlciB0aGUgZGV2aWFudCBvbmVzOlxuICAgIC8vICAgICdhYicuc3BsaXQoLyg/OmFiKSovKSBzaG91bGQgYmUgW1wiXCIsIFwiXCJdLCBub3QgW1wiXCJdXG4gICAgLy8gICAgJy4nLnNwbGl0KC8oLj8pKC4/KS8pIHNob3VsZCBiZSBbXCJcIiwgXCIuXCIsIFwiXCIsIFwiXCJdLCBub3QgW1wiXCIsIFwiXCJdXG4gICAgLy8gICAgJ3Rlc3N0Jy5zcGxpdCgvKHMpKi8pIHNob3VsZCBiZSBbXCJ0XCIsIHVuZGVmaW5lZCwgXCJlXCIsIFwic1wiLCBcInRcIl0sIG5vdFxuICAgIC8vICAgICAgIFt1bmRlZmluZWQsIFwidFwiLCB1bmRlZmluZWQsIFwiZVwiLCAuLi5dXG4gICAgLy8gICAgJycuc3BsaXQoLy4/Lykgc2hvdWxkIGJlIFtdLCBub3QgW1wiXCJdXG4gICAgLy8gICAgJy4nLnNwbGl0KC8oKSgpLykgc2hvdWxkIGJlIFtcIi5cIl0sIG5vdCBbXCJcIiwgXCJcIiwgXCIuXCJdXG5cbiAgICBpZiAoXG4gICAgICAgICdhYicuc3BsaXQoLyg/OmFiKSovKS5sZW5ndGggIT09IDJcbiAgICAgICAgfHwgJy4nLnNwbGl0KC8oLj8pKC4/KS8pLmxlbmd0aCAhPT0gNFxuICAgICAgICB8fCAndGVzc3QnLnNwbGl0KC8ocykqLylbMV0gPT09ICd0J1xuICAgICAgICB8fCAndGVzdCcuc3BsaXQoLyg/OikvLCAtMSkubGVuZ3RoICE9PSA0XG4gICAgICAgIHx8ICcnLnNwbGl0KC8uPy8pLmxlbmd0aFxuICAgICAgICB8fCAnLicuc3BsaXQoLygpKCkvKS5sZW5ndGggPiAxXG4gICAgKSB7XG4gICAgICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgY29tcGxpYW50RXhlY05wY2cgPSB0eXBlb2YgKC8oKT8/LykuZXhlYygnJylbMV0gPT09ICd1bmRlZmluZWQnOyAvLyBOUENHOiBub25wYXJ0aWNpcGF0aW5nIGNhcHR1cmluZyBncm91cFxuICAgICAgICAgICAgdmFyIG1heFNhZmUzMkJpdEludCA9IHBvdygyLCAzMikgLSAxO1xuXG4gICAgICAgICAgICBTdHJpbmdQcm90b3R5cGUuc3BsaXQgPSBmdW5jdGlvbiBzcGxpdChzZXBhcmF0b3IsIGxpbWl0KSB7XG4gICAgICAgICAgICAgICAgdmFyIHN0cmluZyA9IFN0cmluZyh0aGlzKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHNlcGFyYXRvciA9PT0gJ3VuZGVmaW5lZCcgJiYgbGltaXQgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElmIGBzZXBhcmF0b3JgIGlzIG5vdCBhIHJlZ2V4LCB1c2UgbmF0aXZlIHNwbGl0XG4gICAgICAgICAgICAgICAgaWYgKCFpc1JlZ2V4KHNlcGFyYXRvcikpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0clNwbGl0KHRoaXMsIHNlcGFyYXRvciwgbGltaXQpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBvdXRwdXQgPSBbXTtcbiAgICAgICAgICAgICAgICB2YXIgZmxhZ3MgPSAoc2VwYXJhdG9yLmlnbm9yZUNhc2UgPyAnaScgOiAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChzZXBhcmF0b3IubXVsdGlsaW5lID8gJ20nIDogJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoc2VwYXJhdG9yLnVuaWNvZGUgPyAndScgOiAnJykgLy8gaW4gRVM2XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoc2VwYXJhdG9yLnN0aWNreSA/ICd5JyA6ICcnKSwgLy8gRmlyZWZveCAzKyBhbmQgRVM2XG4gICAgICAgICAgICAgICAgICAgIGxhc3RMYXN0SW5kZXggPSAwLFxuICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIGBnbG9iYWxgIGFuZCBhdm9pZCBgbGFzdEluZGV4YCBpc3N1ZXMgYnkgd29ya2luZyB3aXRoIGEgY29weVxuICAgICAgICAgICAgICAgICAgICBzZXBhcmF0b3IyLCBtYXRjaCwgbGFzdEluZGV4LCBsYXN0TGVuZ3RoO1xuICAgICAgICAgICAgICAgIHZhciBzZXBhcmF0b3JDb3B5ID0gbmV3IFJlZ0V4cChzZXBhcmF0b3Iuc291cmNlLCBmbGFncyArICdnJyk7XG4gICAgICAgICAgICAgICAgaWYgKCFjb21wbGlhbnRFeGVjTnBjZykge1xuICAgICAgICAgICAgICAgICAgICAvLyBEb2Vzbid0IG5lZWQgZmxhZ3MgZ3ksIGJ1dCB0aGV5IGRvbid0IGh1cnRcbiAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yMiA9IG5ldyBSZWdFeHAoJ14nICsgc2VwYXJhdG9yQ29weS5zb3VyY2UgKyAnJCg/IVxcXFxzKScsIGZsYWdzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLyogVmFsdWVzIGZvciBgbGltaXRgLCBwZXIgdGhlIHNwZWM6XG4gICAgICAgICAgICAgICAgICogSWYgdW5kZWZpbmVkOiA0Mjk0OTY3Mjk1IC8vIG1heFNhZmUzMkJpdEludFxuICAgICAgICAgICAgICAgICAqIElmIDAsIEluZmluaXR5LCBvciBOYU46IDBcbiAgICAgICAgICAgICAgICAgKiBJZiBwb3NpdGl2ZSBudW1iZXI6IGxpbWl0ID0gZmxvb3IobGltaXQpOyBpZiAobGltaXQgPiA0Mjk0OTY3Mjk1KSBsaW1pdCAtPSA0Mjk0OTY3Mjk2O1xuICAgICAgICAgICAgICAgICAqIElmIG5lZ2F0aXZlIG51bWJlcjogNDI5NDk2NzI5NiAtIGZsb29yKGFicyhsaW1pdCkpXG4gICAgICAgICAgICAgICAgICogSWYgb3RoZXI6IFR5cGUtY29udmVydCwgdGhlbiB1c2UgdGhlIGFib3ZlIHJ1bGVzXG4gICAgICAgICAgICAgICAgICovXG4gICAgICAgICAgICAgICAgdmFyIHNwbGl0TGltaXQgPSB0eXBlb2YgbGltaXQgPT09ICd1bmRlZmluZWQnID8gbWF4U2FmZTMyQml0SW50IDogRVMuVG9VaW50MzIobGltaXQpO1xuICAgICAgICAgICAgICAgIG1hdGNoID0gc2VwYXJhdG9yQ29weS5leGVjKHN0cmluZyk7XG4gICAgICAgICAgICAgICAgd2hpbGUgKG1hdGNoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGBzZXBhcmF0b3JDb3B5Lmxhc3RJbmRleGAgaXMgbm90IHJlbGlhYmxlIGNyb3NzLWJyb3dzZXJcbiAgICAgICAgICAgICAgICAgICAgbGFzdEluZGV4ID0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0SW5kZXggPiBsYXN0TGFzdEluZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXNoQ2FsbChvdXRwdXQsIHN0clNsaWNlKHN0cmluZywgbGFzdExhc3RJbmRleCwgbWF0Y2guaW5kZXgpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZpeCBicm93c2VycyB3aG9zZSBgZXhlY2AgbWV0aG9kcyBkb24ndCBjb25zaXN0ZW50bHkgcmV0dXJuIGB1bmRlZmluZWRgIGZvclxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9ucGFydGljaXBhdGluZyBjYXB0dXJpbmcgZ3JvdXBzXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNvbXBsaWFudEV4ZWNOcGNnICYmIG1hdGNoLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlc2xpbnQtZGlzYWJsZSBuby1sb29wLWZ1bmMgKi9cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFswXS5yZXBsYWNlKHNlcGFyYXRvcjIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoIC0gMjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZW9mIGFyZ3VtZW50c1tpXSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaFtpXSA9IHZvaWQgMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGVzbGludC1lbmFibGUgbm8tbG9vcC1mdW5jICovXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF0Y2gubGVuZ3RoID4gMSAmJiBtYXRjaC5pbmRleCA8IHN0cmluZy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJheV9wdXNoLmFwcGx5KG91dHB1dCwgYXJyYXlTbGljZShtYXRjaCwgMSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdExlbmd0aCA9IG1hdGNoWzBdLmxlbmd0aDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RMYXN0SW5kZXggPSBsYXN0SW5kZXg7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0Lmxlbmd0aCA+PSBzcGxpdExpbWl0KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHNlcGFyYXRvckNvcHkubGFzdEluZGV4ID09PSBtYXRjaC5pbmRleCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgc2VwYXJhdG9yQ29weS5sYXN0SW5kZXgrKzsgLy8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcFxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1hdGNoID0gc2VwYXJhdG9yQ29weS5leGVjKHN0cmluZyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChsYXN0TGFzdEluZGV4ID09PSBzdHJpbmcubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0TGVuZ3RoIHx8ICFzZXBhcmF0b3JDb3B5LnRlc3QoJycpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwdXNoQ2FsbChvdXRwdXQsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHB1c2hDYWxsKG91dHB1dCwgc3RyU2xpY2Uoc3RyaW5nLCBsYXN0TGFzdEluZGV4KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBvdXRwdXQubGVuZ3RoID4gc3BsaXRMaW1pdCA/IGFycmF5U2xpY2Uob3V0cHV0LCAwLCBzcGxpdExpbWl0KSA6IG91dHB1dDtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0oKSk7XG5cbiAgICAvLyBbYnVnZml4LCBjaHJvbWVdXG4gICAgLy8gSWYgc2VwYXJhdG9yIGlzIHVuZGVmaW5lZCwgdGhlbiB0aGUgcmVzdWx0IGFycmF5IGNvbnRhaW5zIGp1c3Qgb25lIFN0cmluZyxcbiAgICAvLyB3aGljaCBpcyB0aGUgdGhpcyB2YWx1ZSAoY29udmVydGVkIHRvIGEgU3RyaW5nKS4gSWYgbGltaXQgaXMgbm90IHVuZGVmaW5lZCxcbiAgICAvLyB0aGVuIHRoZSBvdXRwdXQgYXJyYXkgaXMgdHJ1bmNhdGVkIHNvIHRoYXQgaXQgY29udGFpbnMgbm8gbW9yZSB0aGFuIGxpbWl0XG4gICAgLy8gZWxlbWVudHMuXG4gICAgLy8gXCIwXCIuc3BsaXQodW5kZWZpbmVkLCAwKSAtPiBbXVxuICAgIH0gZWxzZSBpZiAoJzAnLnNwbGl0KHZvaWQgMCwgMCkubGVuZ3RoKSB7XG4gICAgICAgIFN0cmluZ1Byb3RvdHlwZS5zcGxpdCA9IGZ1bmN0aW9uIHNwbGl0KHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygc2VwYXJhdG9yID09PSAndW5kZWZpbmVkJyAmJiBsaW1pdCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdHJTcGxpdCh0aGlzLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB2YXIgc3RyX3JlcGxhY2UgPSBTdHJpbmdQcm90b3R5cGUucmVwbGFjZTtcbiAgICB2YXIgcmVwbGFjZVJlcG9ydHNHcm91cHNDb3JyZWN0bHkgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgZ3JvdXBzID0gW107XG4gICAgICAgICd4Jy5yZXBsYWNlKC94KC4pPy9nLCBmdW5jdGlvbiAobWF0Y2gsIGdyb3VwKSB7XG4gICAgICAgICAgICBwdXNoQ2FsbChncm91cHMsIGdyb3VwKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiBncm91cHMubGVuZ3RoID09PSAxICYmIHR5cGVvZiBncm91cHNbMF0gPT09ICd1bmRlZmluZWQnO1xuICAgIH0oKSk7XG5cbiAgICBpZiAoIXJlcGxhY2VSZXBvcnRzR3JvdXBzQ29ycmVjdGx5KSB7XG4gICAgICAgIFN0cmluZ1Byb3RvdHlwZS5yZXBsYWNlID0gZnVuY3Rpb24gcmVwbGFjZShzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKSB7XG4gICAgICAgICAgICB2YXIgaXNGbiA9IGlzQ2FsbGFibGUocmVwbGFjZVZhbHVlKTtcbiAgICAgICAgICAgIHZhciBoYXNDYXB0dXJpbmdHcm91cHMgPSBpc1JlZ2V4KHNlYXJjaFZhbHVlKSAmJiAoL1xcKVsqP10vKS50ZXN0KHNlYXJjaFZhbHVlLnNvdXJjZSk7XG4gICAgICAgICAgICBpZiAoIWlzRm4gfHwgIWhhc0NhcHR1cmluZ0dyb3Vwcykge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdHJfcmVwbGFjZS5jYWxsKHRoaXMsIHNlYXJjaFZhbHVlLCByZXBsYWNlVmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIHdyYXBwZWRSZXBsYWNlVmFsdWUgPSBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICAgICAgICAgICAgICB2YXIgb3JpZ2luYWxMYXN0SW5kZXggPSBzZWFyY2hWYWx1ZS5sYXN0SW5kZXg7XG4gICAgICAgICAgICAgICAgc2VhcmNoVmFsdWUubGFzdEluZGV4ID0gMDsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1wYXJhbS1yZWFzc2lnblxuICAgICAgICAgICAgICAgIHZhciBhcmdzID0gc2VhcmNoVmFsdWUuZXhlYyhtYXRjaCkgfHwgW107XG4gICAgICAgICAgICAgICAgc2VhcmNoVmFsdWUubGFzdEluZGV4ID0gb3JpZ2luYWxMYXN0SW5kZXg7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tcGFyYW0tcmVhc3NpZ25cbiAgICAgICAgICAgICAgICBwdXNoQ2FsbChhcmdzLCBhcmd1bWVudHNbbGVuZ3RoIC0gMl0sIGFyZ3VtZW50c1tsZW5ndGggLSAxXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlcGxhY2VWYWx1ZS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4gc3RyX3JlcGxhY2UuY2FsbCh0aGlzLCBzZWFyY2hWYWx1ZSwgd3JhcHBlZFJlcGxhY2VWYWx1ZSk7XG5cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICAvLyBFQ01BLTI2MiwgM3JkIEIuMi4zXG4gICAgLy8gTm90IGFuIEVDTUFTY3JpcHQgc3RhbmRhcmQsIGFsdGhvdWdoIEVDTUFTY3JpcHQgM3JkIEVkaXRpb24gaGFzIGFcbiAgICAvLyBub24tbm9ybWF0aXZlIHNlY3Rpb24gc3VnZ2VzdGluZyB1bmlmb3JtIHNlbWFudGljcyBhbmQgaXQgc2hvdWxkIGJlXG4gICAgLy8gbm9ybWFsaXplZCBhY3Jvc3MgYWxsIGJyb3dzZXJzXG4gICAgLy8gW2J1Z2ZpeCwgSUUgbHQgOV0gSUUgPCA5IHN1YnN0cigpIHdpdGggbmVnYXRpdmUgdmFsdWUgbm90IHdvcmtpbmcgaW4gSUVcbiAgICB2YXIgaGFzTmVnYXRpdmVTdWJzdHJCdWcgPSAnJy5zdWJzdHIgJiYgJzBiJy5zdWJzdHIoLTEpICE9PSAnYic7XG4gICAgdmFyIHN0cmluZ19zdWJzdHIgPSBoYXNOZWdhdGl2ZVN1YnN0ckJ1ZyAmJiBjYWxsLmJpbmQoU3RyaW5nUHJvdG90eXBlLnN1YnN0cik7XG4gICAgZGVmaW5lUHJvcGVydGllcyhTdHJpbmdQcm90b3R5cGUsIHtcbiAgICAgICAgc3Vic3RyOiBmdW5jdGlvbiBzdWJzdHIoc3RhcnQsIGxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIG5vcm1hbGl6ZWRTdGFydCA9IHN0YXJ0O1xuICAgICAgICAgICAgaWYgKHN0YXJ0IDwgMCkge1xuICAgICAgICAgICAgICAgIG5vcm1hbGl6ZWRTdGFydCA9IG1heCh0aGlzLmxlbmd0aCArIHN0YXJ0LCAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBzdHJpbmdfc3Vic3RyKHRoaXMsIG5vcm1hbGl6ZWRTdGFydCwgbGVuZ3RoKTtcbiAgICAgICAgfVxuICAgIH0sIGhhc05lZ2F0aXZlU3Vic3RyQnVnKTtcblxuICAgIC8vIEVTNSAxNS41LjQuMjBcbiAgICAvLyB3aGl0ZXNwYWNlIGZyb206IGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjUuNC4yMFxuICAgIHZhciBtdnMgPSAnXFx1MTgwRSc7XG4gICAgdmFyIG12c0lzV1MgPSAoL1xccy8pLnRlc3QobXZzKTtcbiAgICB2YXIgd3MgPSAnXFx4MDlcXHgwQVxceDBCXFx4MENcXHgwRFxceDIwXFx4QTBcXHUxNjgwXFx1MTgwRVxcdTIwMDBcXHUyMDAxXFx1MjAwMlxcdTIwMDNcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBBXFx1MjAyRlxcdTIwNUZcXHUzMDAwXFx1MjAyOFxcdTIwMjlcXHVGRUZGJ1xuICAgICAgICAucmVwbGFjZSgvXFxTL2csICcnKTsgLy8gcmVtb3ZlIHRoZSBtb25nb2xpYW4gdm93ZWwgc2VwYXJhdG9yIChcXHUxODBFKSBpbiBtb2Rlcm4gZW5naW5lc1xuICAgIHZhciB6ZXJvV2lkdGggPSAnXFx1MjAwYic7XG4gICAgdmFyIHdzUmVnZXhDaGFycyA9ICdbJyArIHdzICsgJ10nO1xuICAgIHZhciB0cmltQmVnaW5SZWdleHAgPSBuZXcgUmVnRXhwKCdeJyArIHdzUmVnZXhDaGFycyArIHdzUmVnZXhDaGFycyArICcqJyk7XG4gICAgdmFyIHRyaW1FbmRSZWdleHAgPSBuZXcgUmVnRXhwKHdzUmVnZXhDaGFycyArIHdzUmVnZXhDaGFycyArICcqJCcpO1xuICAgIHZhciBoYXNUcmltV2hpdGVzcGFjZUJ1ZyA9IFN0cmluZ1Byb3RvdHlwZS50cmltICYmIChcbiAgICAgICAgd3MudHJpbSgpICE9PSAnJyAvLyBpZiB3cyBpcyBub3QgY29uc2lkZXJlZCB3aGl0ZXNwYWNlXG4gICAgICAgIHx8IHplcm9XaWR0aC50cmltKCkgPT09ICcnIC8vIGlmIHplcm8td2lkdGggSVMgY29uc2lkZXJlZCB3aGl0ZXNwYWNlXG4gICAgICAgIHx8IG12cy50cmltKCkgIT09IChtdnNJc1dTID8gJycgOiBtdnMpIC8vIGlmIE1WUyBpcyBlaXRoZXIgd3JvbmdseSBjb25zaWRlcmVkIHdoaXRlc3BhY2UsIG9yLCB3cm9uZ2x5IGNvbnNpZGVyZWQgTk9UIHdoaXRlc3BhY2VcbiAgICApO1xuICAgIGRlZmluZVByb3BlcnRpZXMoU3RyaW5nUHJvdG90eXBlLCB7XG4gICAgICAgIC8vIGh0dHBzOi8vYmxvZy5zdGV2ZW5sZXZpdGhhbi5jb20vYXJjaGl2ZXMvZmFzdGVyLXRyaW0tamF2YXNjcmlwdFxuICAgICAgICAvLyBodHRwOi8vcGVyZmVjdGlvbmtpbGxzLmNvbS93aGl0ZXNwYWNlLWRldmlhdGlvbnMvXG4gICAgICAgIHRyaW06IGZ1bmN0aW9uIHRyaW0oKSB7XG4gICAgICAgICAgICAndXNlIHN0cmljdCc7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcyA9PT0gJ3VuZGVmaW5lZCcgfHwgdGhpcyA9PT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoXCJjYW4ndCBjb252ZXJ0IFwiICsgdGhpcyArICcgdG8gb2JqZWN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gJFN0cmluZyh0aGlzKS5yZXBsYWNlKHRyaW1CZWdpblJlZ2V4cCwgJycpLnJlcGxhY2UodHJpbUVuZFJlZ2V4cCwgJycpO1xuICAgICAgICB9XG4gICAgfSwgaGFzVHJpbVdoaXRlc3BhY2VCdWcpO1xuICAgIHZhciB0cmltID0gY2FsbC5iaW5kKFN0cmluZy5wcm90b3R5cGUudHJpbSk7XG5cbiAgICB2YXIgaGFzTGFzdEluZGV4QnVnID0gU3RyaW5nUHJvdG90eXBlLmxhc3RJbmRleE9mICYmICdhYmPjgYLjgYQnLmxhc3RJbmRleE9mKCfjgYLjgYQnLCAyKSAhPT0gLTE7XG4gICAgZGVmaW5lUHJvcGVydGllcyhTdHJpbmdQcm90b3R5cGUsIHtcbiAgICAgICAgbGFzdEluZGV4T2Y6IGZ1bmN0aW9uIGxhc3RJbmRleE9mKHNlYXJjaFN0cmluZykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzID09PSAndW5kZWZpbmVkJyB8fCB0aGlzID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcihcImNhbid0IGNvbnZlcnQgXCIgKyB0aGlzICsgJyB0byBvYmplY3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBTID0gJFN0cmluZyh0aGlzKTtcbiAgICAgICAgICAgIHZhciBzZWFyY2hTdHIgPSAkU3RyaW5nKHNlYXJjaFN0cmluZyk7XG4gICAgICAgICAgICB2YXIgbnVtUG9zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgPyAkTnVtYmVyKGFyZ3VtZW50c1sxXSkgOiBOYU47XG4gICAgICAgICAgICB2YXIgcG9zID0gaXNBY3R1YWxOYU4obnVtUG9zKSA/IEluZmluaXR5IDogRVMuVG9JbnRlZ2VyKG51bVBvcyk7XG4gICAgICAgICAgICB2YXIgc3RhcnQgPSBtaW4obWF4KHBvcywgMCksIFMubGVuZ3RoKTtcbiAgICAgICAgICAgIHZhciBzZWFyY2hMZW4gPSBzZWFyY2hTdHIubGVuZ3RoO1xuICAgICAgICAgICAgdmFyIGsgPSBzdGFydCArIHNlYXJjaExlbjtcbiAgICAgICAgICAgIHdoaWxlIChrID4gMCkge1xuICAgICAgICAgICAgICAgIGsgPSBtYXgoMCwgayAtIHNlYXJjaExlbik7XG4gICAgICAgICAgICAgICAgdmFyIGluZGV4ID0gc3RySW5kZXhPZihzdHJTbGljZShTLCBrLCBzdGFydCArIHNlYXJjaExlbiksIHNlYXJjaFN0cik7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gayArIGluZGV4O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgIH0sIGhhc0xhc3RJbmRleEJ1Zyk7XG5cbiAgICB2YXIgb3JpZ2luYWxMYXN0SW5kZXhPZiA9IFN0cmluZ1Byb3RvdHlwZS5sYXN0SW5kZXhPZjtcbiAgICBkZWZpbmVQcm9wZXJ0aWVzKFN0cmluZ1Byb3RvdHlwZSwge1xuICAgICAgICBsYXN0SW5kZXhPZjogZnVuY3Rpb24gbGFzdEluZGV4T2Yoc2VhcmNoU3RyaW5nKSB7XG4gICAgICAgICAgICByZXR1cm4gb3JpZ2luYWxMYXN0SW5kZXhPZi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgICAgICB9XG4gICAgfSwgU3RyaW5nUHJvdG90eXBlLmxhc3RJbmRleE9mLmxlbmd0aCAhPT0gMSk7XG5cbiAgICB2YXIgaGV4UmVnZXggPSAvXlstK10/MFt4WF0vO1xuXG4gICAgLy8gRVMtNSAxNS4xLjIuMlxuICAgIGlmIChcbiAgICAgICAgcGFyc2VJbnQod3MgKyAnMDgnKSAhPT0gOCAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIHJhZGl4XG4gICAgICAgIHx8IHBhcnNlSW50KHdzICsgJzB4MTYnKSAhPT0gMjIgLy8gZXNsaW50LWRpc2FibGUtbGluZSByYWRpeFxuICAgICAgICB8fCAobXZzSXNXUyA/IHBhcnNlSW50KG12cyArIDEpICE9PSAxIDogIWlzTmFOKHBhcnNlSW50KG12cyArIDEpKSkgLy8gZXNsaW50LWRpc2FibGUtbGluZSByYWRpeFxuICAgICkge1xuICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tZ2xvYmFsLWFzc2lnbiwgbm8taW1wbGljaXQtZ2xvYmFsc1xuICAgICAgICBwYXJzZUludCA9IChmdW5jdGlvbiAob3JpZ1BhcnNlSW50KSB7XG4gICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gcGFyc2VJbnQoc3RyLCByYWRpeCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzIGluc3RhbmNlb2YgcGFyc2VJbnQpIHsgbmV3IG9yaWdQYXJzZUludCgpOyB9IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbmV3LWNhcCwgbm8tbmV3LCBtYXgtc3RhdGVtZW50cy1wZXItbGluZVxuICAgICAgICAgICAgICAgIHZhciBzdHJpbmcgPSB0cmltKFN0cmluZyhzdHIpKTtcbiAgICAgICAgICAgICAgICB2YXIgZGVmYXVsdGVkUmFkaXggPSAkTnVtYmVyKHJhZGl4KSB8fCAoaGV4UmVnZXgudGVzdChzdHJpbmcpID8gMTYgOiAxMCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG9yaWdQYXJzZUludChzdHJpbmcsIGRlZmF1bHRlZFJhZGl4KTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0ocGFyc2VJbnQpKTtcbiAgICB9XG4gICAgLy8gRWRnZSAxNS0xOFxuICAgIHZhciBwYXJzZUludEZhaWxzVG9UaHJvd09uQm94ZWRTeW1ib2xzID0gKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJhZGl4XG4gICAgICAgICAgICBwYXJzZUludChPYmplY3QoU3ltYm9sLml0ZXJhdG9yKSk7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBjYXRjaCAoZSkgeyAvKiovIH1cblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIHJhZGl4XG4gICAgICAgICAgICBwYXJzZUludChTeW1ib2wuaXRlcmF0b3IpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHsgLyoqLyB9XG5cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH0oKSk7XG4gICAgaWYgKHBhcnNlSW50RmFpbHNUb1Rocm93T25Cb3hlZFN5bWJvbHMpIHtcbiAgICAgICAgdmFyIHN5bWJvbFZhbHVlT2YgPSBTeW1ib2wucHJvdG90eXBlLnZhbHVlT2Y7XG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1nbG9iYWwtYXNzaWduLCBuby1pbXBsaWNpdC1nbG9iYWxzXG4gICAgICAgIHBhcnNlSW50ID0gKGZ1bmN0aW9uIChvcmlnUGFyc2VJbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBmdW5jdGlvbiBwYXJzZUludChzdHIsIHJhZGl4KSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMgaW5zdGFuY2VvZiBwYXJzZUludCkgeyBuZXcgb3JpZ1BhcnNlSW50KCk7IH0gLy8gZXNsaW50LWRpc2FibGUtbGluZSBuZXctY2FwLCBuby1uZXcsIG1heC1zdGF0ZW1lbnRzLXBlci1saW5lXG4gICAgICAgICAgICAgICAgdmFyIGlzU3ltID0gdHlwZW9mIHN0ciA9PT0gJ3N5bWJvbCc7XG4gICAgICAgICAgICAgICAgaWYgKCFpc1N5bSAmJiBzdHIgJiYgdHlwZW9mIHN0ciA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHN5bWJvbFZhbHVlT2YuY2FsbChzdHIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXNTeW0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7IC8qKi8gfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoaXNTeW0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIFN5bWJvbHMgaW4gbm9kZSA4LjMvOC40XG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1pbXBsaWNpdC1jb2VyY2lvbiwgbm8tdW51c2VkLWV4cHJlc3Npb25zXG4gICAgICAgICAgICAgICAgICAgICcnICsgc3RyOyAvLyBqc2NzOmlnbm9yZSBkaXNhbGxvd0ltcGxpY2l0VHlwZUNvbnZlcnNpb25cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIHN0cmluZyA9IHRyaW0oU3RyaW5nKHN0cikpO1xuICAgICAgICAgICAgICAgIHZhciBkZWZhdWx0ZWRSYWRpeCA9ICROdW1iZXIocmFkaXgpIHx8IChoZXhSZWdleC50ZXN0KHN0cmluZykgPyAxNiA6IDEwKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ1BhcnNlSW50KHN0cmluZywgZGVmYXVsdGVkUmFkaXgpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgfShwYXJzZUludCkpO1xuICAgIH1cblxuICAgIC8vIGh0dHBzOi8vZXM1LmdpdGh1Yi5pby8jeDE1LjEuMi4zXG4gICAgaWYgKDEgLyBwYXJzZUZsb2F0KCctMCcpICE9PSAtSW5maW5pdHkpIHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWdsb2JhbC1hc3NpZ24sIG5vLWltcGxpY2l0LWdsb2JhbHMsIG5vLW5hdGl2ZS1yZWFzc2lnblxuICAgICAgICBwYXJzZUZsb2F0ID0gKGZ1bmN0aW9uIChvcmlnUGFyc2VGbG9hdCkge1xuICAgICAgICAgICAgcmV0dXJuIGZ1bmN0aW9uIHBhcnNlRmxvYXQoc3RyaW5nKSB7XG4gICAgICAgICAgICAgICAgdmFyIGlucHV0U3RyaW5nID0gdHJpbShTdHJpbmcoc3RyaW5nKSk7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3VsdCA9IG9yaWdQYXJzZUZsb2F0KGlucHV0U3RyaW5nKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0ID09PSAwICYmIHN0clNsaWNlKGlucHV0U3RyaW5nLCAwLCAxKSA9PT0gJy0nID8gLTAgOiByZXN1bHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KHBhcnNlRmxvYXQpKTtcbiAgICB9XG5cbiAgICBpZiAoU3RyaW5nKG5ldyBSYW5nZUVycm9yKCd0ZXN0JykpICE9PSAnUmFuZ2VFcnJvcjogdGVzdCcpIHtcbiAgICAgICAgdmFyIGVycm9yVG9TdHJpbmdTaGltID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHRoaXMgPT09ICd1bmRlZmluZWQnIHx8IHRoaXMgPT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKFwiY2FuJ3QgY29udmVydCBcIiArIHRoaXMgKyAnIHRvIG9iamVjdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG5hbWUgPSB0aGlzLm5hbWU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG5hbWUgPT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgbmFtZSA9ICdFcnJvcic7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBuYW1lICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIG5hbWUgPSAkU3RyaW5nKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdmFyIG1zZyA9IHRoaXMubWVzc2FnZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgbXNnID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIG1zZyA9ICcnO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlb2YgbXNnICE9PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgICAgIG1zZyA9ICRTdHJpbmcobXNnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICghbmFtZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBtc2c7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIW1zZykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIG5hbWUgKyAnOiAnICsgbXNnO1xuICAgICAgICB9O1xuICAgICAgICAvLyBjYW4ndCB1c2UgZGVmaW5lUHJvcGVydGllcyBoZXJlIGJlY2F1c2Ugb2YgdG9TdHJpbmcgZW51bWVyYXRpb24gaXNzdWUgaW4gSUUgPD0gOFxuICAgICAgICBFcnJvci5wcm90b3R5cGUudG9TdHJpbmcgPSBlcnJvclRvU3RyaW5nU2hpbTtcbiAgICB9XG5cbiAgICBpZiAoc3VwcG9ydHNEZXNjcmlwdG9ycykge1xuICAgICAgICB2YXIgZW5zdXJlTm9uRW51bWVyYWJsZSA9IGZ1bmN0aW9uIChvYmosIHByb3ApIHtcbiAgICAgICAgICAgIGlmIChpc0VudW0ob2JqLCBwcm9wKSkge1xuICAgICAgICAgICAgICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihvYmosIHByb3ApO1xuICAgICAgICAgICAgICAgIGlmIChkZXNjLmNvbmZpZ3VyYWJsZSkge1xuICAgICAgICAgICAgICAgICAgICBkZXNjLmVudW1lcmFibGUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG9iaiwgcHJvcCwgZGVzYyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICBlbnN1cmVOb25FbnVtZXJhYmxlKEVycm9yLnByb3RvdHlwZSwgJ21lc3NhZ2UnKTtcbiAgICAgICAgaWYgKEVycm9yLnByb3RvdHlwZS5tZXNzYWdlICE9PSAnJykge1xuICAgICAgICAgICAgRXJyb3IucHJvdG90eXBlLm1lc3NhZ2UgPSAnJztcbiAgICAgICAgfVxuICAgICAgICBlbnN1cmVOb25FbnVtZXJhYmxlKEVycm9yLnByb3RvdHlwZSwgJ25hbWUnKTtcbiAgICB9XG5cbiAgICBpZiAoU3RyaW5nKC9hL21pZykgIT09ICcvYS9naW0nKSB7XG4gICAgICAgIHZhciByZWdleFRvU3RyaW5nID0gZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgICAgICAgICB2YXIgc3RyID0gJy8nICsgdGhpcy5zb3VyY2UgKyAnLyc7XG4gICAgICAgICAgICBpZiAodGhpcy5nbG9iYWwpIHtcbiAgICAgICAgICAgICAgICBzdHIgKz0gJ2cnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHRoaXMuaWdub3JlQ2FzZSkge1xuICAgICAgICAgICAgICAgIHN0ciArPSAnaSc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5tdWx0aWxpbmUpIHtcbiAgICAgICAgICAgICAgICBzdHIgKz0gJ20nO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHN0cjtcbiAgICAgICAgfTtcbiAgICAgICAgLy8gY2FuJ3QgdXNlIGRlZmluZVByb3BlcnRpZXMgaGVyZSBiZWNhdXNlIG9mIHRvU3RyaW5nIGVudW1lcmF0aW9uIGlzc3VlIGluIElFIDw9IDhcbiAgICAgICAgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZyA9IHJlZ2V4VG9TdHJpbmc7XG4gICAgfVxufSkpO1xuIiwiLyohXG4gKiBlc2NhcGUtaHRtbFxuICogQ29weXJpZ2h0KGMpIDIwMTItMjAxMyBUSiBIb2xvd2F5Y2h1a1xuICogQ29weXJpZ2h0KGMpIDIwMTUgQW5kcmVhcyBMdWJiZVxuICogQ29weXJpZ2h0KGMpIDIwMTUgVGlhbmNoZW5nIFwiVGltb3RoeVwiIEd1XG4gKiBNSVQgTGljZW5zZWRcbiAqL1xuXG4ndXNlIHN0cmljdCc7XG5cbi8qKlxuICogTW9kdWxlIHZhcmlhYmxlcy5cbiAqIEBwcml2YXRlXG4gKi9cblxudmFyIG1hdGNoSHRtbFJlZ0V4cCA9IC9bXCInJjw+XS87XG5cbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKiBAcHVibGljXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBlc2NhcGVIdG1sO1xuXG4vKipcbiAqIEVzY2FwZSBzcGVjaWFsIGNoYXJhY3RlcnMgaW4gdGhlIGdpdmVuIHN0cmluZyBvZiBodG1sLlxuICpcbiAqIEBwYXJhbSAge3N0cmluZ30gc3RyaW5nIFRoZSBzdHJpbmcgdG8gZXNjYXBlIGZvciBpbnNlcnRpbmcgaW50byBIVE1MXG4gKiBAcmV0dXJuIHtzdHJpbmd9XG4gKiBAcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZXNjYXBlSHRtbChzdHJpbmcpIHtcbiAgdmFyIHN0ciA9ICcnICsgc3RyaW5nO1xuICB2YXIgbWF0Y2ggPSBtYXRjaEh0bWxSZWdFeHAuZXhlYyhzdHIpO1xuXG4gIGlmICghbWF0Y2gpIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgdmFyIGVzY2FwZTtcbiAgdmFyIGh0bWwgPSAnJztcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxhc3RJbmRleCA9IDA7XG5cbiAgZm9yIChpbmRleCA9IG1hdGNoLmluZGV4OyBpbmRleCA8IHN0ci5sZW5ndGg7IGluZGV4KyspIHtcbiAgICBzd2l0Y2ggKHN0ci5jaGFyQ29kZUF0KGluZGV4KSkge1xuICAgICAgY2FzZSAzNDogLy8gXCJcbiAgICAgICAgZXNjYXBlID0gJyZxdW90Oyc7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzODogLy8gJlxuICAgICAgICBlc2NhcGUgPSAnJmFtcDsnO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzk6IC8vICdcbiAgICAgICAgZXNjYXBlID0gJyYjMzk7JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDYwOiAvLyA8XG4gICAgICAgIGVzY2FwZSA9ICcmbHQ7JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDYyOiAvLyA+XG4gICAgICAgIGVzY2FwZSA9ICcmZ3Q7JztcbiAgICAgICAgYnJlYWs7XG4gICAgICBkZWZhdWx0OlxuICAgICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICBpZiAobGFzdEluZGV4ICE9PSBpbmRleCkge1xuICAgICAgaHRtbCArPSBzdHIuc3Vic3RyaW5nKGxhc3RJbmRleCwgaW5kZXgpO1xuICAgIH1cblxuICAgIGxhc3RJbmRleCA9IGluZGV4ICsgMTtcbiAgICBodG1sICs9IGVzY2FwZTtcbiAgfVxuXG4gIHJldHVybiBsYXN0SW5kZXggIT09IGluZGV4XG4gICAgPyBodG1sICsgc3RyLnN1YnN0cmluZyhsYXN0SW5kZXgsIGluZGV4KVxuICAgIDogaHRtbDtcbn1cbiIsIi8qISBodHRwczovL210aHMuYmUvaGUgdjEuMi4wIGJ5IEBtYXRoaWFzIHwgTUlUIGxpY2Vuc2UgKi9cbjsoZnVuY3Rpb24ocm9vdCkge1xuXG5cdC8vIERldGVjdCBmcmVlIHZhcmlhYmxlcyBgZXhwb3J0c2AuXG5cdHZhciBmcmVlRXhwb3J0cyA9IHR5cGVvZiBleHBvcnRzID09ICdvYmplY3QnICYmIGV4cG9ydHM7XG5cblx0Ly8gRGV0ZWN0IGZyZWUgdmFyaWFibGUgYG1vZHVsZWAuXG5cdHZhciBmcmVlTW9kdWxlID0gdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUgJiZcblx0XHRtb2R1bGUuZXhwb3J0cyA9PSBmcmVlRXhwb3J0cyAmJiBtb2R1bGU7XG5cblx0Ly8gRGV0ZWN0IGZyZWUgdmFyaWFibGUgYGdsb2JhbGAsIGZyb20gTm9kZS5qcyBvciBCcm93c2VyaWZpZWQgY29kZSxcblx0Ly8gYW5kIHVzZSBpdCBhcyBgcm9vdGAuXG5cdHZhciBmcmVlR2xvYmFsID0gdHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWw7XG5cdGlmIChmcmVlR2xvYmFsLmdsb2JhbCA9PT0gZnJlZUdsb2JhbCB8fCBmcmVlR2xvYmFsLndpbmRvdyA9PT0gZnJlZUdsb2JhbCkge1xuXHRcdHJvb3QgPSBmcmVlR2xvYmFsO1xuXHR9XG5cblx0LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cblx0Ly8gQWxsIGFzdHJhbCBzeW1ib2xzLlxuXHR2YXIgcmVnZXhBc3RyYWxTeW1ib2xzID0gL1tcXHVEODAwLVxcdURCRkZdW1xcdURDMDAtXFx1REZGRl0vZztcblx0Ly8gQWxsIEFTQ0lJIHN5bWJvbHMgKG5vdCBqdXN0IHByaW50YWJsZSBBU0NJSSkgZXhjZXB0IHRob3NlIGxpc3RlZCBpbiB0aGVcblx0Ly8gZmlyc3QgY29sdW1uIG9mIHRoZSBvdmVycmlkZXMgdGFibGUuXG5cdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvbXVsdGlwYWdlL3N5bnRheC5odG1sI3RhYmxlLWNoYXJyZWYtb3ZlcnJpZGVzXG5cdHZhciByZWdleEFzY2lpV2hpdGVsaXN0ID0gL1tcXHgwMS1cXHg3Rl0vZztcblx0Ly8gQWxsIEJNUCBzeW1ib2xzIHRoYXQgYXJlIG5vdCBBU0NJSSBuZXdsaW5lcywgcHJpbnRhYmxlIEFTQ0lJIHN5bWJvbHMsIG9yXG5cdC8vIGNvZGUgcG9pbnRzIGxpc3RlZCBpbiB0aGUgZmlyc3QgY29sdW1uIG9mIHRoZSBvdmVycmlkZXMgdGFibGUgb25cblx0Ly8gaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2Uvc3ludGF4Lmh0bWwjdGFibGUtY2hhcnJlZi1vdmVycmlkZXMuXG5cdHZhciByZWdleEJtcFdoaXRlbGlzdCA9IC9bXFx4MDEtXFx0XFx4MEJcXGZcXHgwRS1cXHgxRlxceDdGXFx4ODFcXHg4RFxceDhGXFx4OTBcXHg5RFxceEEwLVxcdUZGRkZdL2c7XG5cblx0dmFyIHJlZ2V4RW5jb2RlTm9uQXNjaWkgPSAvPFxcdTIwRDJ8PVxcdTIwRTV8PlxcdTIwRDJ8XFx1MjA1RlxcdTIwMEF8XFx1MjE5RFxcdTAzMzh8XFx1MjIwMlxcdTAzMzh8XFx1MjIyMFxcdTIwRDJ8XFx1MjIyOVxcdUZFMDB8XFx1MjIyQVxcdUZFMDB8XFx1MjIzQ1xcdTIwRDJ8XFx1MjIzRFxcdTAzMzF8XFx1MjIzRVxcdTAzMzN8XFx1MjI0MlxcdTAzMzh8XFx1MjI0QlxcdTAzMzh8XFx1MjI0RFxcdTIwRDJ8XFx1MjI0RVxcdTAzMzh8XFx1MjI0RlxcdTAzMzh8XFx1MjI1MFxcdTAzMzh8XFx1MjI2MVxcdTIwRTV8XFx1MjI2NFxcdTIwRDJ8XFx1MjI2NVxcdTIwRDJ8XFx1MjI2NlxcdTAzMzh8XFx1MjI2N1xcdTAzMzh8XFx1MjI2OFxcdUZFMDB8XFx1MjI2OVxcdUZFMDB8XFx1MjI2QVxcdTAzMzh8XFx1MjI2QVxcdTIwRDJ8XFx1MjI2QlxcdTAzMzh8XFx1MjI2QlxcdTIwRDJ8XFx1MjI3RlxcdTAzMzh8XFx1MjI4MlxcdTIwRDJ8XFx1MjI4M1xcdTIwRDJ8XFx1MjI4QVxcdUZFMDB8XFx1MjI4QlxcdUZFMDB8XFx1MjI4RlxcdTAzMzh8XFx1MjI5MFxcdTAzMzh8XFx1MjI5M1xcdUZFMDB8XFx1MjI5NFxcdUZFMDB8XFx1MjJCNFxcdTIwRDJ8XFx1MjJCNVxcdTIwRDJ8XFx1MjJEOFxcdTAzMzh8XFx1MjJEOVxcdTAzMzh8XFx1MjJEQVxcdUZFMDB8XFx1MjJEQlxcdUZFMDB8XFx1MjJGNVxcdTAzMzh8XFx1MjJGOVxcdTAzMzh8XFx1MjkzM1xcdTAzMzh8XFx1MjlDRlxcdTAzMzh8XFx1MjlEMFxcdTAzMzh8XFx1MkE2RFxcdTAzMzh8XFx1MkE3MFxcdTAzMzh8XFx1MkE3RFxcdTAzMzh8XFx1MkE3RVxcdTAzMzh8XFx1MkFBMVxcdTAzMzh8XFx1MkFBMlxcdTAzMzh8XFx1MkFBQ1xcdUZFMDB8XFx1MkFBRFxcdUZFMDB8XFx1MkFBRlxcdTAzMzh8XFx1MkFCMFxcdTAzMzh8XFx1MkFDNVxcdTAzMzh8XFx1MkFDNlxcdTAzMzh8XFx1MkFDQlxcdUZFMDB8XFx1MkFDQ1xcdUZFMDB8XFx1MkFGRFxcdTIwRTV8W1xceEEwLVxcdTAxMTNcXHUwMTE2LVxcdTAxMjJcXHUwMTI0LVxcdTAxMkJcXHUwMTJFLVxcdTAxNERcXHUwMTUwLVxcdTAxN0VcXHUwMTkyXFx1MDFCNVxcdTAxRjVcXHUwMjM3XFx1MDJDNlxcdTAyQzdcXHUwMkQ4LVxcdTAyRERcXHUwMzExXFx1MDM5MS1cXHUwM0ExXFx1MDNBMy1cXHUwM0E5XFx1MDNCMS1cXHUwM0M5XFx1MDNEMVxcdTAzRDJcXHUwM0Q1XFx1MDNENlxcdTAzRENcXHUwM0REXFx1MDNGMFxcdTAzRjFcXHUwM0Y1XFx1MDNGNlxcdTA0MDEtXFx1MDQwQ1xcdTA0MEUtXFx1MDQ0RlxcdTA0NTEtXFx1MDQ1Q1xcdTA0NUVcXHUwNDVGXFx1MjAwMi1cXHUyMDA1XFx1MjAwNy1cXHUyMDEwXFx1MjAxMy1cXHUyMDE2XFx1MjAxOC1cXHUyMDFBXFx1MjAxQy1cXHUyMDFFXFx1MjAyMC1cXHUyMDIyXFx1MjAyNVxcdTIwMjZcXHUyMDMwLVxcdTIwMzVcXHUyMDM5XFx1MjAzQVxcdTIwM0VcXHUyMDQxXFx1MjA0M1xcdTIwNDRcXHUyMDRGXFx1MjA1N1xcdTIwNUYtXFx1MjA2M1xcdTIwQUNcXHUyMERCXFx1MjBEQ1xcdTIxMDJcXHUyMTA1XFx1MjEwQS1cXHUyMTEzXFx1MjExNS1cXHUyMTFFXFx1MjEyMlxcdTIxMjRcXHUyMTI3LVxcdTIxMjlcXHUyMTJDXFx1MjEyRFxcdTIxMkYtXFx1MjEzMVxcdTIxMzMtXFx1MjEzOFxcdTIxNDUtXFx1MjE0OFxcdTIxNTMtXFx1MjE1RVxcdTIxOTAtXFx1MjE5QlxcdTIxOUQtXFx1MjFBN1xcdTIxQTktXFx1MjFBRVxcdTIxQjAtXFx1MjFCM1xcdTIxQjUtXFx1MjFCN1xcdTIxQkEtXFx1MjFEQlxcdTIxRERcXHUyMUU0XFx1MjFFNVxcdTIxRjVcXHUyMUZELVxcdTIyMDVcXHUyMjA3LVxcdTIyMDlcXHUyMjBCXFx1MjIwQ1xcdTIyMEYtXFx1MjIxNFxcdTIyMTYtXFx1MjIxOFxcdTIyMUFcXHUyMjFELVxcdTIyMzhcXHUyMjNBLVxcdTIyNTdcXHUyMjU5XFx1MjI1QVxcdTIyNUNcXHUyMjVGLVxcdTIyNjJcXHUyMjY0LVxcdTIyOEJcXHUyMjhELVxcdTIyOUJcXHUyMjlELVxcdTIyQTVcXHUyMkE3LVxcdTIyQjBcXHUyMkIyLVxcdTIyQkJcXHUyMkJELVxcdTIyREJcXHUyMkRFLVxcdTIyRTNcXHUyMkU2LVxcdTIyRjdcXHUyMkY5LVxcdTIyRkVcXHUyMzA1XFx1MjMwNlxcdTIzMDgtXFx1MjMxMFxcdTIzMTJcXHUyMzEzXFx1MjMxNVxcdTIzMTZcXHUyMzFDLVxcdTIzMUZcXHUyMzIyXFx1MjMyM1xcdTIzMkRcXHUyMzJFXFx1MjMzNlxcdTIzM0RcXHUyMzNGXFx1MjM3Q1xcdTIzQjBcXHUyM0IxXFx1MjNCNC1cXHUyM0I2XFx1MjNEQy1cXHUyM0RGXFx1MjNFMlxcdTIzRTdcXHUyNDIzXFx1MjRDOFxcdTI1MDBcXHUyNTAyXFx1MjUwQ1xcdTI1MTBcXHUyNTE0XFx1MjUxOFxcdTI1MUNcXHUyNTI0XFx1MjUyQ1xcdTI1MzRcXHUyNTNDXFx1MjU1MC1cXHUyNTZDXFx1MjU4MFxcdTI1ODRcXHUyNTg4XFx1MjU5MS1cXHUyNTkzXFx1MjVBMVxcdTI1QUFcXHUyNUFCXFx1MjVBRFxcdTI1QUVcXHUyNUIxXFx1MjVCMy1cXHUyNUI1XFx1MjVCOFxcdTI1QjlcXHUyNUJELVxcdTI1QkZcXHUyNUMyXFx1MjVDM1xcdTI1Q0FcXHUyNUNCXFx1MjVFQ1xcdTI1RUZcXHUyNUY4LVxcdTI1RkNcXHUyNjA1XFx1MjYwNlxcdTI2MEVcXHUyNjQwXFx1MjY0MlxcdTI2NjBcXHUyNjYzXFx1MjY2NVxcdTI2NjZcXHUyNjZBXFx1MjY2RC1cXHUyNjZGXFx1MjcxM1xcdTI3MTdcXHUyNzIwXFx1MjczNlxcdTI3NThcXHUyNzcyXFx1Mjc3M1xcdTI3QzhcXHUyN0M5XFx1MjdFNi1cXHUyN0VEXFx1MjdGNS1cXHUyN0ZBXFx1MjdGQ1xcdTI3RkZcXHUyOTAyLVxcdTI5MDVcXHUyOTBDLVxcdTI5MTNcXHUyOTE2XFx1MjkxOS1cXHUyOTIwXFx1MjkyMy1cXHUyOTJBXFx1MjkzM1xcdTI5MzUtXFx1MjkzOVxcdTI5M0NcXHUyOTNEXFx1Mjk0NVxcdTI5NDgtXFx1Mjk0QlxcdTI5NEUtXFx1Mjk3NlxcdTI5NzhcXHUyOTc5XFx1Mjk3Qi1cXHUyOTdGXFx1Mjk4NVxcdTI5ODZcXHUyOThCLVxcdTI5OTZcXHUyOTlBXFx1Mjk5Q1xcdTI5OURcXHUyOUE0LVxcdTI5QjdcXHUyOUI5XFx1MjlCQlxcdTI5QkNcXHUyOUJFLVxcdTI5QzVcXHUyOUM5XFx1MjlDRC1cXHUyOUQwXFx1MjlEQy1cXHUyOURFXFx1MjlFMy1cXHUyOUU1XFx1MjlFQlxcdTI5RjRcXHUyOUY2XFx1MkEwMC1cXHUyQTAyXFx1MkEwNFxcdTJBMDZcXHUyQTBDXFx1MkEwRFxcdTJBMTAtXFx1MkExN1xcdTJBMjItXFx1MkEyN1xcdTJBMjlcXHUyQTJBXFx1MkEyRC1cXHUyQTMxXFx1MkEzMy1cXHUyQTNDXFx1MkEzRlxcdTJBNDBcXHUyQTQyLVxcdTJBNERcXHUyQTUwXFx1MkE1My1cXHUyQTU4XFx1MkE1QS1cXHUyQTVEXFx1MkE1RlxcdTJBNjZcXHUyQTZBXFx1MkE2RC1cXHUyQTc1XFx1MkE3Ny1cXHUyQTlBXFx1MkE5RC1cXHUyQUEyXFx1MkFBNC1cXHUyQUIwXFx1MkFCMy1cXHUyQUM4XFx1MkFDQlxcdTJBQ0NcXHUyQUNGLVxcdTJBREJcXHUyQUU0XFx1MkFFNi1cXHUyQUU5XFx1MkFFQi1cXHUyQUYzXFx1MkFGRFxcdUZCMDAtXFx1RkIwNF18XFx1RDgzNVtcXHVEQzlDXFx1REM5RVxcdURDOUZcXHVEQ0EyXFx1RENBNVxcdURDQTZcXHVEQ0E5LVxcdURDQUNcXHVEQ0FFLVxcdURDQjlcXHVEQ0JCXFx1RENCRC1cXHVEQ0MzXFx1RENDNS1cXHVEQ0NGXFx1REQwNFxcdUREMDVcXHVERDA3LVxcdUREMEFcXHVERDBELVxcdUREMTRcXHVERDE2LVxcdUREMUNcXHVERDFFLVxcdUREMzlcXHVERDNCLVxcdUREM0VcXHVERDQwLVxcdURENDRcXHVERDQ2XFx1REQ0QS1cXHVERDUwXFx1REQ1Mi1cXHVERDZCXS9nO1xuXHR2YXIgZW5jb2RlTWFwID0geydcXHhBRCc6J3NoeScsJ1xcdTIwMEMnOid6d25qJywnXFx1MjAwRCc6J3p3aicsJ1xcdTIwMEUnOidscm0nLCdcXHUyMDYzJzonaWMnLCdcXHUyMDYyJzonaXQnLCdcXHUyMDYxJzonYWYnLCdcXHUyMDBGJzoncmxtJywnXFx1MjAwQic6J1plcm9XaWR0aFNwYWNlJywnXFx1MjA2MCc6J05vQnJlYWsnLCdcXHUwMzExJzonRG93bkJyZXZlJywnXFx1MjBEQic6J3Rkb3QnLCdcXHUyMERDJzonRG90RG90JywnXFx0JzonVGFiJywnXFxuJzonTmV3TGluZScsJ1xcdTIwMDgnOidwdW5jc3AnLCdcXHUyMDVGJzonTWVkaXVtU3BhY2UnLCdcXHUyMDA5JzondGhpbnNwJywnXFx1MjAwQSc6J2hhaXJzcCcsJ1xcdTIwMDQnOidlbXNwMTMnLCdcXHUyMDAyJzonZW5zcCcsJ1xcdTIwMDUnOidlbXNwMTQnLCdcXHUyMDAzJzonZW1zcCcsJ1xcdTIwMDcnOidudW1zcCcsJ1xceEEwJzonbmJzcCcsJ1xcdTIwNUZcXHUyMDBBJzonVGhpY2tTcGFjZScsJ1xcdTIwM0UnOidvbGluZScsJ18nOidsb3diYXInLCdcXHUyMDEwJzonZGFzaCcsJ1xcdTIwMTMnOiduZGFzaCcsJ1xcdTIwMTQnOidtZGFzaCcsJ1xcdTIwMTUnOidob3JiYXInLCcsJzonY29tbWEnLCc7Jzonc2VtaScsJ1xcdTIwNEYnOidic2VtaScsJzonOidjb2xvbicsJ1xcdTJBNzQnOidDb2xvbmUnLCchJzonZXhjbCcsJ1xceEExJzonaWV4Y2wnLCc/JzoncXVlc3QnLCdcXHhCRic6J2lxdWVzdCcsJy4nOidwZXJpb2QnLCdcXHUyMDI1JzonbmxkcicsJ1xcdTIwMjYnOidtbGRyJywnXFx4QjcnOidtaWRkb3QnLCdcXCcnOidhcG9zJywnXFx1MjAxOCc6J2xzcXVvJywnXFx1MjAxOSc6J3JzcXVvJywnXFx1MjAxQSc6J3NicXVvJywnXFx1MjAzOSc6J2xzYXF1bycsJ1xcdTIwM0EnOidyc2FxdW8nLCdcIic6J3F1b3QnLCdcXHUyMDFDJzonbGRxdW8nLCdcXHUyMDFEJzoncmRxdW8nLCdcXHUyMDFFJzonYmRxdW8nLCdcXHhBQic6J2xhcXVvJywnXFx4QkInOidyYXF1bycsJygnOidscGFyJywnKSc6J3JwYXInLCdbJzonbHNxYicsJ10nOidyc3FiJywneyc6J2xjdWInLCd9JzoncmN1YicsJ1xcdTIzMDgnOidsY2VpbCcsJ1xcdTIzMDknOidyY2VpbCcsJ1xcdTIzMEEnOidsZmxvb3InLCdcXHUyMzBCJzoncmZsb29yJywnXFx1Mjk4NSc6J2xvcGFyJywnXFx1Mjk4Nic6J3JvcGFyJywnXFx1Mjk4Qic6J2xicmtlJywnXFx1Mjk4Qyc6J3JicmtlJywnXFx1Mjk4RCc6J2xicmtzbHUnLCdcXHUyOThFJzoncmJya3NsZCcsJ1xcdTI5OEYnOidsYnJrc2xkJywnXFx1Mjk5MCc6J3JicmtzbHUnLCdcXHUyOTkxJzonbGFuZ2QnLCdcXHUyOTkyJzoncmFuZ2QnLCdcXHUyOTkzJzonbHBhcmx0JywnXFx1Mjk5NCc6J3JwYXJndCcsJ1xcdTI5OTUnOidndGxQYXInLCdcXHUyOTk2JzonbHRyUGFyJywnXFx1MjdFNic6J2xvYnJrJywnXFx1MjdFNyc6J3JvYnJrJywnXFx1MjdFOCc6J2xhbmcnLCdcXHUyN0U5JzoncmFuZycsJ1xcdTI3RUEnOidMYW5nJywnXFx1MjdFQic6J1JhbmcnLCdcXHUyN0VDJzonbG9hbmcnLCdcXHUyN0VEJzoncm9hbmcnLCdcXHUyNzcyJzonbGJicmsnLCdcXHUyNzczJzoncmJicmsnLCdcXHUyMDE2JzonVmVydCcsJ1xceEE3Jzonc2VjdCcsJ1xceEI2JzoncGFyYScsJ0AnOidjb21tYXQnLCcqJzonYXN0JywnLyc6J3NvbCcsJ3VuZGVmaW5lZCc6bnVsbCwnJic6J2FtcCcsJyMnOidudW0nLCclJzoncGVyY250JywnXFx1MjAzMCc6J3Blcm1pbCcsJ1xcdTIwMzEnOidwZXJ0ZW5rJywnXFx1MjAyMCc6J2RhZ2dlcicsJ1xcdTIwMjEnOidEYWdnZXInLCdcXHUyMDIyJzonYnVsbCcsJ1xcdTIwNDMnOidoeWJ1bGwnLCdcXHUyMDMyJzoncHJpbWUnLCdcXHUyMDMzJzonUHJpbWUnLCdcXHUyMDM0JzondHByaW1lJywnXFx1MjA1Nyc6J3FwcmltZScsJ1xcdTIwMzUnOidicHJpbWUnLCdcXHUyMDQxJzonY2FyZXQnLCdgJzonZ3JhdmUnLCdcXHhCNCc6J2FjdXRlJywnXFx1MDJEQyc6J3RpbGRlJywnXic6J0hhdCcsJ1xceEFGJzonbWFjcicsJ1xcdTAyRDgnOidicmV2ZScsJ1xcdTAyRDknOidkb3QnLCdcXHhBOCc6J2RpZScsJ1xcdTAyREEnOidyaW5nJywnXFx1MDJERCc6J2RibGFjJywnXFx4QjgnOidjZWRpbCcsJ1xcdTAyREInOidvZ29uJywnXFx1MDJDNic6J2NpcmMnLCdcXHUwMkM3JzonY2Fyb24nLCdcXHhCMCc6J2RlZycsJ1xceEE5JzonY29weScsJ1xceEFFJzoncmVnJywnXFx1MjExNyc6J2NvcHlzcicsJ1xcdTIxMTgnOid3cCcsJ1xcdTIxMUUnOidyeCcsJ1xcdTIxMjcnOidtaG8nLCdcXHUyMTI5JzonaWlvdGEnLCdcXHUyMTkwJzonbGFycicsJ1xcdTIxOUEnOidubGFycicsJ1xcdTIxOTInOidyYXJyJywnXFx1MjE5Qic6J25yYXJyJywnXFx1MjE5MSc6J3VhcnInLCdcXHUyMTkzJzonZGFycicsJ1xcdTIxOTQnOidoYXJyJywnXFx1MjFBRSc6J25oYXJyJywnXFx1MjE5NSc6J3ZhcnInLCdcXHUyMTk2JzonbndhcnInLCdcXHUyMTk3JzonbmVhcnInLCdcXHUyMTk4Jzonc2VhcnInLCdcXHUyMTk5Jzonc3dhcnInLCdcXHUyMTlEJzoncmFycncnLCdcXHUyMTlEXFx1MDMzOCc6J25yYXJydycsJ1xcdTIxOUUnOidMYXJyJywnXFx1MjE5Ric6J1VhcnInLCdcXHUyMUEwJzonUmFycicsJ1xcdTIxQTEnOidEYXJyJywnXFx1MjFBMic6J2xhcnJ0bCcsJ1xcdTIxQTMnOidyYXJydGwnLCdcXHUyMUE0JzonbWFwc3RvbGVmdCcsJ1xcdTIxQTUnOidtYXBzdG91cCcsJ1xcdTIxQTYnOidtYXAnLCdcXHUyMUE3JzonbWFwc3RvZG93bicsJ1xcdTIxQTknOidsYXJyaGsnLCdcXHUyMUFBJzoncmFycmhrJywnXFx1MjFBQic6J2xhcnJscCcsJ1xcdTIxQUMnOidyYXJybHAnLCdcXHUyMUFEJzonaGFycncnLCdcXHUyMUIwJzonbHNoJywnXFx1MjFCMSc6J3JzaCcsJ1xcdTIxQjInOidsZHNoJywnXFx1MjFCMyc6J3Jkc2gnLCdcXHUyMUI1JzonY3JhcnInLCdcXHUyMUI2JzonY3VsYXJyJywnXFx1MjFCNyc6J2N1cmFycicsJ1xcdTIxQkEnOidvbGFycicsJ1xcdTIxQkInOidvcmFycicsJ1xcdTIxQkMnOidsaGFydScsJ1xcdTIxQkQnOidsaGFyZCcsJ1xcdTIxQkUnOid1aGFycicsJ1xcdTIxQkYnOid1aGFybCcsJ1xcdTIxQzAnOidyaGFydScsJ1xcdTIxQzEnOidyaGFyZCcsJ1xcdTIxQzInOidkaGFycicsJ1xcdTIxQzMnOidkaGFybCcsJ1xcdTIxQzQnOidybGFycicsJ1xcdTIxQzUnOid1ZGFycicsJ1xcdTIxQzYnOidscmFycicsJ1xcdTIxQzcnOidsbGFycicsJ1xcdTIxQzgnOid1dWFycicsJ1xcdTIxQzknOidycmFycicsJ1xcdTIxQ0EnOidkZGFycicsJ1xcdTIxQ0InOidscmhhcicsJ1xcdTIxQ0MnOidybGhhcicsJ1xcdTIxRDAnOidsQXJyJywnXFx1MjFDRCc6J25sQXJyJywnXFx1MjFEMSc6J3VBcnInLCdcXHUyMUQyJzonckFycicsJ1xcdTIxQ0YnOiduckFycicsJ1xcdTIxRDMnOidkQXJyJywnXFx1MjFENCc6J2lmZicsJ1xcdTIxQ0UnOiduaEFycicsJ1xcdTIxRDUnOid2QXJyJywnXFx1MjFENic6J253QXJyJywnXFx1MjFENyc6J25lQXJyJywnXFx1MjFEOCc6J3NlQXJyJywnXFx1MjFEOSc6J3N3QXJyJywnXFx1MjFEQSc6J2xBYXJyJywnXFx1MjFEQic6J3JBYXJyJywnXFx1MjFERCc6J3ppZ3JhcnInLCdcXHUyMUU0JzonbGFycmInLCdcXHUyMUU1JzoncmFycmInLCdcXHUyMUY1JzonZHVhcnInLCdcXHUyMUZEJzonbG9hcnInLCdcXHUyMUZFJzoncm9hcnInLCdcXHUyMUZGJzonaG9hcnInLCdcXHUyMjAwJzonZm9yYWxsJywnXFx1MjIwMSc6J2NvbXAnLCdcXHUyMjAyJzoncGFydCcsJ1xcdTIyMDJcXHUwMzM4JzonbnBhcnQnLCdcXHUyMjAzJzonZXhpc3QnLCdcXHUyMjA0JzonbmV4aXN0JywnXFx1MjIwNSc6J2VtcHR5JywnXFx1MjIwNyc6J0RlbCcsJ1xcdTIyMDgnOidpbicsJ1xcdTIyMDknOidub3RpbicsJ1xcdTIyMEInOiduaScsJ1xcdTIyMEMnOidub3RuaScsJ1xcdTAzRjYnOidiZXBzaScsJ1xcdTIyMEYnOidwcm9kJywnXFx1MjIxMCc6J2NvcHJvZCcsJ1xcdTIyMTEnOidzdW0nLCcrJzoncGx1cycsJ1xceEIxJzoncG0nLCdcXHhGNyc6J2RpdicsJ1xceEQ3JzondGltZXMnLCc8JzonbHQnLCdcXHUyMjZFJzonbmx0JywnPFxcdTIwRDInOidudmx0JywnPSc6J2VxdWFscycsJ1xcdTIyNjAnOiduZScsJz1cXHUyMEU1JzonYm5lJywnXFx1MkE3NSc6J0VxdWFsJywnPic6J2d0JywnXFx1MjI2Ric6J25ndCcsJz5cXHUyMEQyJzonbnZndCcsJ1xceEFDJzonbm90JywnfCc6J3ZlcnQnLCdcXHhBNic6J2JydmJhcicsJ1xcdTIyMTInOidtaW51cycsJ1xcdTIyMTMnOidtcCcsJ1xcdTIyMTQnOidwbHVzZG8nLCdcXHUyMDQ0JzonZnJhc2wnLCdcXHUyMjE2Jzonc2V0bW4nLCdcXHUyMjE3JzonbG93YXN0JywnXFx1MjIxOCc6J2NvbXBmbicsJ1xcdTIyMUEnOidTcXJ0JywnXFx1MjIxRCc6J3Byb3AnLCdcXHUyMjFFJzonaW5maW4nLCdcXHUyMjFGJzonYW5ncnQnLCdcXHUyMjIwJzonYW5nJywnXFx1MjIyMFxcdTIwRDInOiduYW5nJywnXFx1MjIyMSc6J2FuZ21zZCcsJ1xcdTIyMjInOidhbmdzcGgnLCdcXHUyMjIzJzonbWlkJywnXFx1MjIyNCc6J25taWQnLCdcXHUyMjI1JzoncGFyJywnXFx1MjIyNic6J25wYXInLCdcXHUyMjI3JzonYW5kJywnXFx1MjIyOCc6J29yJywnXFx1MjIyOSc6J2NhcCcsJ1xcdTIyMjlcXHVGRTAwJzonY2FwcycsJ1xcdTIyMkEnOidjdXAnLCdcXHUyMjJBXFx1RkUwMCc6J2N1cHMnLCdcXHUyMjJCJzonaW50JywnXFx1MjIyQyc6J0ludCcsJ1xcdTIyMkQnOid0aW50JywnXFx1MkEwQyc6J3FpbnQnLCdcXHUyMjJFJzonb2ludCcsJ1xcdTIyMkYnOidDb25pbnQnLCdcXHUyMjMwJzonQ2NvbmludCcsJ1xcdTIyMzEnOidjd2ludCcsJ1xcdTIyMzInOidjd2NvbmludCcsJ1xcdTIyMzMnOidhd2NvbmludCcsJ1xcdTIyMzQnOid0aGVyZTQnLCdcXHUyMjM1JzonYmVjYXVzJywnXFx1MjIzNic6J3JhdGlvJywnXFx1MjIzNyc6J0NvbG9uJywnXFx1MjIzOCc6J21pbnVzZCcsJ1xcdTIyM0EnOidtRERvdCcsJ1xcdTIyM0InOidob210aHQnLCdcXHUyMjNDJzonc2ltJywnXFx1MjI0MSc6J25zaW0nLCdcXHUyMjNDXFx1MjBEMic6J252c2ltJywnXFx1MjIzRCc6J2JzaW0nLCdcXHUyMjNEXFx1MDMzMSc6J3JhY2UnLCdcXHUyMjNFJzonYWMnLCdcXHUyMjNFXFx1MDMzMyc6J2FjRScsJ1xcdTIyM0YnOidhY2QnLCdcXHUyMjQwJzond3InLCdcXHUyMjQyJzonZXNpbScsJ1xcdTIyNDJcXHUwMzM4JzonbmVzaW0nLCdcXHUyMjQzJzonc2ltZScsJ1xcdTIyNDQnOiduc2ltZScsJ1xcdTIyNDUnOidjb25nJywnXFx1MjI0Nyc6J25jb25nJywnXFx1MjI0Nic6J3NpbW5lJywnXFx1MjI0OCc6J2FwJywnXFx1MjI0OSc6J25hcCcsJ1xcdTIyNEEnOidhcGUnLCdcXHUyMjRCJzonYXBpZCcsJ1xcdTIyNEJcXHUwMzM4JzonbmFwaWQnLCdcXHUyMjRDJzonYmNvbmcnLCdcXHUyMjREJzonQ3VwQ2FwJywnXFx1MjI2RCc6J05vdEN1cENhcCcsJ1xcdTIyNERcXHUyMEQyJzonbnZhcCcsJ1xcdTIyNEUnOididW1wJywnXFx1MjI0RVxcdTAzMzgnOiduYnVtcCcsJ1xcdTIyNEYnOididW1wZScsJ1xcdTIyNEZcXHUwMzM4JzonbmJ1bXBlJywnXFx1MjI1MCc6J2RvdGVxJywnXFx1MjI1MFxcdTAzMzgnOiduZWRvdCcsJ1xcdTIyNTEnOidlRG90JywnXFx1MjI1Mic6J2VmRG90JywnXFx1MjI1Myc6J2VyRG90JywnXFx1MjI1NCc6J2NvbG9uZScsJ1xcdTIyNTUnOidlY29sb24nLCdcXHUyMjU2JzonZWNpcicsJ1xcdTIyNTcnOidjaXJlJywnXFx1MjI1OSc6J3dlZGdlcScsJ1xcdTIyNUEnOid2ZWVlcScsJ1xcdTIyNUMnOid0cmllJywnXFx1MjI1Ric6J2VxdWVzdCcsJ1xcdTIyNjEnOidlcXVpdicsJ1xcdTIyNjInOiduZXF1aXYnLCdcXHUyMjYxXFx1MjBFNSc6J2JuZXF1aXYnLCdcXHUyMjY0JzonbGUnLCdcXHUyMjcwJzonbmxlJywnXFx1MjI2NFxcdTIwRDInOidudmxlJywnXFx1MjI2NSc6J2dlJywnXFx1MjI3MSc6J25nZScsJ1xcdTIyNjVcXHUyMEQyJzonbnZnZScsJ1xcdTIyNjYnOidsRScsJ1xcdTIyNjZcXHUwMzM4JzonbmxFJywnXFx1MjI2Nyc6J2dFJywnXFx1MjI2N1xcdTAzMzgnOiduZ0UnLCdcXHUyMjY4XFx1RkUwMCc6J2x2bkUnLCdcXHUyMjY4JzonbG5FJywnXFx1MjI2OSc6J2duRScsJ1xcdTIyNjlcXHVGRTAwJzonZ3ZuRScsJ1xcdTIyNkEnOidsbCcsJ1xcdTIyNkFcXHUwMzM4Jzonbkx0dicsJ1xcdTIyNkFcXHUyMEQyJzonbkx0JywnXFx1MjI2Qic6J2dnJywnXFx1MjI2QlxcdTAzMzgnOiduR3R2JywnXFx1MjI2QlxcdTIwRDInOiduR3QnLCdcXHUyMjZDJzondHdpeHQnLCdcXHUyMjcyJzonbHNpbScsJ1xcdTIyNzQnOidubHNpbScsJ1xcdTIyNzMnOidnc2ltJywnXFx1MjI3NSc6J25nc2ltJywnXFx1MjI3Nic6J2xnJywnXFx1MjI3OCc6J250bGcnLCdcXHUyMjc3JzonZ2wnLCdcXHUyMjc5JzonbnRnbCcsJ1xcdTIyN0EnOidwcicsJ1xcdTIyODAnOiducHInLCdcXHUyMjdCJzonc2MnLCdcXHUyMjgxJzonbnNjJywnXFx1MjI3Qyc6J3ByY3VlJywnXFx1MjJFMCc6J25wcmN1ZScsJ1xcdTIyN0QnOidzY2N1ZScsJ1xcdTIyRTEnOiduc2NjdWUnLCdcXHUyMjdFJzoncHJzaW0nLCdcXHUyMjdGJzonc2NzaW0nLCdcXHUyMjdGXFx1MDMzOCc6J05vdFN1Y2NlZWRzVGlsZGUnLCdcXHUyMjgyJzonc3ViJywnXFx1MjI4NCc6J25zdWInLCdcXHUyMjgyXFx1MjBEMic6J3Zuc3ViJywnXFx1MjI4Myc6J3N1cCcsJ1xcdTIyODUnOiduc3VwJywnXFx1MjI4M1xcdTIwRDInOid2bnN1cCcsJ1xcdTIyODYnOidzdWJlJywnXFx1MjI4OCc6J25zdWJlJywnXFx1MjI4Nyc6J3N1cGUnLCdcXHUyMjg5JzonbnN1cGUnLCdcXHUyMjhBXFx1RkUwMCc6J3ZzdWJuZScsJ1xcdTIyOEEnOidzdWJuZScsJ1xcdTIyOEJcXHVGRTAwJzondnN1cG5lJywnXFx1MjI4Qic6J3N1cG5lJywnXFx1MjI4RCc6J2N1cGRvdCcsJ1xcdTIyOEUnOid1cGx1cycsJ1xcdTIyOEYnOidzcXN1YicsJ1xcdTIyOEZcXHUwMzM4JzonTm90U3F1YXJlU3Vic2V0JywnXFx1MjI5MCc6J3Nxc3VwJywnXFx1MjI5MFxcdTAzMzgnOidOb3RTcXVhcmVTdXBlcnNldCcsJ1xcdTIyOTEnOidzcXN1YmUnLCdcXHUyMkUyJzonbnNxc3ViZScsJ1xcdTIyOTInOidzcXN1cGUnLCdcXHUyMkUzJzonbnNxc3VwZScsJ1xcdTIyOTMnOidzcWNhcCcsJ1xcdTIyOTNcXHVGRTAwJzonc3FjYXBzJywnXFx1MjI5NCc6J3NxY3VwJywnXFx1MjI5NFxcdUZFMDAnOidzcWN1cHMnLCdcXHUyMjk1Jzonb3BsdXMnLCdcXHUyMjk2Jzonb21pbnVzJywnXFx1MjI5Nyc6J290aW1lcycsJ1xcdTIyOTgnOidvc29sJywnXFx1MjI5OSc6J29kb3QnLCdcXHUyMjlBJzonb2NpcicsJ1xcdTIyOUInOidvYXN0JywnXFx1MjI5RCc6J29kYXNoJywnXFx1MjI5RSc6J3BsdXNiJywnXFx1MjI5Ric6J21pbnVzYicsJ1xcdTIyQTAnOid0aW1lc2InLCdcXHUyMkExJzonc2RvdGInLCdcXHUyMkEyJzondmRhc2gnLCdcXHUyMkFDJzonbnZkYXNoJywnXFx1MjJBMyc6J2Rhc2h2JywnXFx1MjJBNCc6J3RvcCcsJ1xcdTIyQTUnOidib3QnLCdcXHUyMkE3JzonbW9kZWxzJywnXFx1MjJBOCc6J3ZEYXNoJywnXFx1MjJBRCc6J252RGFzaCcsJ1xcdTIyQTknOidWZGFzaCcsJ1xcdTIyQUUnOiduVmRhc2gnLCdcXHUyMkFBJzonVnZkYXNoJywnXFx1MjJBQic6J1ZEYXNoJywnXFx1MjJBRic6J25WRGFzaCcsJ1xcdTIyQjAnOidwcnVyZWwnLCdcXHUyMkIyJzondmx0cmknLCdcXHUyMkVBJzonbmx0cmknLCdcXHUyMkIzJzondnJ0cmknLCdcXHUyMkVCJzonbnJ0cmknLCdcXHUyMkI0JzonbHRyaWUnLCdcXHUyMkVDJzonbmx0cmllJywnXFx1MjJCNFxcdTIwRDInOidudmx0cmllJywnXFx1MjJCNSc6J3J0cmllJywnXFx1MjJFRCc6J25ydHJpZScsJ1xcdTIyQjVcXHUyMEQyJzonbnZydHJpZScsJ1xcdTIyQjYnOidvcmlnb2YnLCdcXHUyMkI3JzonaW1vZicsJ1xcdTIyQjgnOidtdW1hcCcsJ1xcdTIyQjknOidoZXJjb24nLCdcXHUyMkJBJzonaW50Y2FsJywnXFx1MjJCQic6J3ZlZWJhcicsJ1xcdTIyQkQnOidiYXJ2ZWUnLCdcXHUyMkJFJzonYW5ncnR2YicsJ1xcdTIyQkYnOidscnRyaScsJ1xcdTIyQzAnOidXZWRnZScsJ1xcdTIyQzEnOidWZWUnLCdcXHUyMkMyJzoneGNhcCcsJ1xcdTIyQzMnOid4Y3VwJywnXFx1MjJDNCc6J2RpYW0nLCdcXHUyMkM1Jzonc2RvdCcsJ1xcdTIyQzYnOidTdGFyJywnXFx1MjJDNyc6J2Rpdm9ueCcsJ1xcdTIyQzgnOidib3d0aWUnLCdcXHUyMkM5JzonbHRpbWVzJywnXFx1MjJDQSc6J3J0aW1lcycsJ1xcdTIyQ0InOidsdGhyZWUnLCdcXHUyMkNDJzoncnRocmVlJywnXFx1MjJDRCc6J2JzaW1lJywnXFx1MjJDRSc6J2N1dmVlJywnXFx1MjJDRic6J2N1d2VkJywnXFx1MjJEMCc6J1N1YicsJ1xcdTIyRDEnOidTdXAnLCdcXHUyMkQyJzonQ2FwJywnXFx1MjJEMyc6J0N1cCcsJ1xcdTIyRDQnOidmb3JrJywnXFx1MjJENSc6J2VwYXInLCdcXHUyMkQ2JzonbHRkb3QnLCdcXHUyMkQ3JzonZ3Rkb3QnLCdcXHUyMkQ4JzonTGwnLCdcXHUyMkQ4XFx1MDMzOCc6J25MbCcsJ1xcdTIyRDknOidHZycsJ1xcdTIyRDlcXHUwMzM4JzonbkdnJywnXFx1MjJEQVxcdUZFMDAnOidsZXNnJywnXFx1MjJEQSc6J2xlZycsJ1xcdTIyREInOidnZWwnLCdcXHUyMkRCXFx1RkUwMCc6J2dlc2wnLCdcXHUyMkRFJzonY3VlcHInLCdcXHUyMkRGJzonY3Vlc2MnLCdcXHUyMkU2JzonbG5zaW0nLCdcXHUyMkU3JzonZ25zaW0nLCdcXHUyMkU4JzoncHJuc2ltJywnXFx1MjJFOSc6J3NjbnNpbScsJ1xcdTIyRUUnOid2ZWxsaXAnLCdcXHUyMkVGJzonY3Rkb3QnLCdcXHUyMkYwJzondXRkb3QnLCdcXHUyMkYxJzonZHRkb3QnLCdcXHUyMkYyJzonZGlzaW4nLCdcXHUyMkYzJzonaXNpbnN2JywnXFx1MjJGNCc6J2lzaW5zJywnXFx1MjJGNSc6J2lzaW5kb3QnLCdcXHUyMkY1XFx1MDMzOCc6J25vdGluZG90JywnXFx1MjJGNic6J25vdGludmMnLCdcXHUyMkY3Jzonbm90aW52YicsJ1xcdTIyRjknOidpc2luRScsJ1xcdTIyRjlcXHUwMzM4Jzonbm90aW5FJywnXFx1MjJGQSc6J25pc2QnLCdcXHUyMkZCJzoneG5pcycsJ1xcdTIyRkMnOiduaXMnLCdcXHUyMkZEJzonbm90bml2YycsJ1xcdTIyRkUnOidub3RuaXZiJywnXFx1MjMwNSc6J2JhcndlZCcsJ1xcdTIzMDYnOidCYXJ3ZWQnLCdcXHUyMzBDJzonZHJjcm9wJywnXFx1MjMwRCc6J2RsY3JvcCcsJ1xcdTIzMEUnOid1cmNyb3AnLCdcXHUyMzBGJzondWxjcm9wJywnXFx1MjMxMCc6J2Jub3QnLCdcXHUyMzEyJzoncHJvZmxpbmUnLCdcXHUyMzEzJzoncHJvZnN1cmYnLCdcXHUyMzE1JzondGVscmVjJywnXFx1MjMxNic6J3RhcmdldCcsJ1xcdTIzMUMnOid1bGNvcm4nLCdcXHUyMzFEJzondXJjb3JuJywnXFx1MjMxRSc6J2RsY29ybicsJ1xcdTIzMUYnOidkcmNvcm4nLCdcXHUyMzIyJzonZnJvd24nLCdcXHUyMzIzJzonc21pbGUnLCdcXHUyMzJEJzonY3lsY3R5JywnXFx1MjMyRSc6J3Byb2ZhbGFyJywnXFx1MjMzNic6J3RvcGJvdCcsJ1xcdTIzM0QnOidvdmJhcicsJ1xcdTIzM0YnOidzb2xiYXInLCdcXHUyMzdDJzonYW5nemFycicsJ1xcdTIzQjAnOidsbW91c3QnLCdcXHUyM0IxJzoncm1vdXN0JywnXFx1MjNCNCc6J3RicmsnLCdcXHUyM0I1JzonYmJyaycsJ1xcdTIzQjYnOidiYnJrdGJyaycsJ1xcdTIzREMnOidPdmVyUGFyZW50aGVzaXMnLCdcXHUyM0REJzonVW5kZXJQYXJlbnRoZXNpcycsJ1xcdTIzREUnOidPdmVyQnJhY2UnLCdcXHUyM0RGJzonVW5kZXJCcmFjZScsJ1xcdTIzRTInOid0cnBleml1bScsJ1xcdTIzRTcnOidlbGludGVycycsJ1xcdTI0MjMnOidibGFuaycsJ1xcdTI1MDAnOidib3hoJywnXFx1MjUwMic6J2JveHYnLCdcXHUyNTBDJzonYm94ZHInLCdcXHUyNTEwJzonYm94ZGwnLCdcXHUyNTE0JzonYm94dXInLCdcXHUyNTE4JzonYm94dWwnLCdcXHUyNTFDJzonYm94dnInLCdcXHUyNTI0JzonYm94dmwnLCdcXHUyNTJDJzonYm94aGQnLCdcXHUyNTM0JzonYm94aHUnLCdcXHUyNTNDJzonYm94dmgnLCdcXHUyNTUwJzonYm94SCcsJ1xcdTI1NTEnOidib3hWJywnXFx1MjU1Mic6J2JveGRSJywnXFx1MjU1Myc6J2JveERyJywnXFx1MjU1NCc6J2JveERSJywnXFx1MjU1NSc6J2JveGRMJywnXFx1MjU1Nic6J2JveERsJywnXFx1MjU1Nyc6J2JveERMJywnXFx1MjU1OCc6J2JveHVSJywnXFx1MjU1OSc6J2JveFVyJywnXFx1MjU1QSc6J2JveFVSJywnXFx1MjU1Qic6J2JveHVMJywnXFx1MjU1Qyc6J2JveFVsJywnXFx1MjU1RCc6J2JveFVMJywnXFx1MjU1RSc6J2JveHZSJywnXFx1MjU1Ric6J2JveFZyJywnXFx1MjU2MCc6J2JveFZSJywnXFx1MjU2MSc6J2JveHZMJywnXFx1MjU2Mic6J2JveFZsJywnXFx1MjU2Myc6J2JveFZMJywnXFx1MjU2NCc6J2JveEhkJywnXFx1MjU2NSc6J2JveGhEJywnXFx1MjU2Nic6J2JveEhEJywnXFx1MjU2Nyc6J2JveEh1JywnXFx1MjU2OCc6J2JveGhVJywnXFx1MjU2OSc6J2JveEhVJywnXFx1MjU2QSc6J2JveHZIJywnXFx1MjU2Qic6J2JveFZoJywnXFx1MjU2Qyc6J2JveFZIJywnXFx1MjU4MCc6J3VoYmxrJywnXFx1MjU4NCc6J2xoYmxrJywnXFx1MjU4OCc6J2Jsb2NrJywnXFx1MjU5MSc6J2JsazE0JywnXFx1MjU5Mic6J2JsazEyJywnXFx1MjU5Myc6J2JsazM0JywnXFx1MjVBMSc6J3NxdScsJ1xcdTI1QUEnOidzcXVmJywnXFx1MjVBQic6J0VtcHR5VmVyeVNtYWxsU3F1YXJlJywnXFx1MjVBRCc6J3JlY3QnLCdcXHUyNUFFJzonbWFya2VyJywnXFx1MjVCMSc6J2ZsdG5zJywnXFx1MjVCMyc6J3h1dHJpJywnXFx1MjVCNCc6J3V0cmlmJywnXFx1MjVCNSc6J3V0cmknLCdcXHUyNUI4JzoncnRyaWYnLCdcXHUyNUI5JzoncnRyaScsJ1xcdTI1QkQnOid4ZHRyaScsJ1xcdTI1QkUnOidkdHJpZicsJ1xcdTI1QkYnOidkdHJpJywnXFx1MjVDMic6J2x0cmlmJywnXFx1MjVDMyc6J2x0cmknLCdcXHUyNUNBJzonbG96JywnXFx1MjVDQic6J2NpcicsJ1xcdTI1RUMnOid0cmlkb3QnLCdcXHUyNUVGJzoneGNpcmMnLCdcXHUyNUY4JzondWx0cmknLCdcXHUyNUY5JzondXJ0cmknLCdcXHUyNUZBJzonbGx0cmknLCdcXHUyNUZCJzonRW1wdHlTbWFsbFNxdWFyZScsJ1xcdTI1RkMnOidGaWxsZWRTbWFsbFNxdWFyZScsJ1xcdTI2MDUnOidzdGFyZicsJ1xcdTI2MDYnOidzdGFyJywnXFx1MjYwRSc6J3Bob25lJywnXFx1MjY0MCc6J2ZlbWFsZScsJ1xcdTI2NDInOidtYWxlJywnXFx1MjY2MCc6J3NwYWRlcycsJ1xcdTI2NjMnOidjbHVicycsJ1xcdTI2NjUnOidoZWFydHMnLCdcXHUyNjY2JzonZGlhbXMnLCdcXHUyNjZBJzonc3VuZycsJ1xcdTI3MTMnOidjaGVjaycsJ1xcdTI3MTcnOidjcm9zcycsJ1xcdTI3MjAnOidtYWx0JywnXFx1MjczNic6J3NleHQnLCdcXHUyNzU4JzonVmVydGljYWxTZXBhcmF0b3InLCdcXHUyN0M4JzonYnNvbGhzdWInLCdcXHUyN0M5Jzonc3VwaHNvbCcsJ1xcdTI3RjUnOid4bGFycicsJ1xcdTI3RjYnOid4cmFycicsJ1xcdTI3RjcnOid4aGFycicsJ1xcdTI3RjgnOid4bEFycicsJ1xcdTI3RjknOid4ckFycicsJ1xcdTI3RkEnOid4aEFycicsJ1xcdTI3RkMnOid4bWFwJywnXFx1MjdGRic6J2R6aWdyYXJyJywnXFx1MjkwMic6J252bEFycicsJ1xcdTI5MDMnOidudnJBcnInLCdcXHUyOTA0JzonbnZIYXJyJywnXFx1MjkwNSc6J01hcCcsJ1xcdTI5MEMnOidsYmFycicsJ1xcdTI5MEQnOidyYmFycicsJ1xcdTI5MEUnOidsQmFycicsJ1xcdTI5MEYnOidyQmFycicsJ1xcdTI5MTAnOidSQmFycicsJ1xcdTI5MTEnOidERG90cmFoZCcsJ1xcdTI5MTInOidVcEFycm93QmFyJywnXFx1MjkxMyc6J0Rvd25BcnJvd0JhcicsJ1xcdTI5MTYnOidSYXJydGwnLCdcXHUyOTE5JzonbGF0YWlsJywnXFx1MjkxQSc6J3JhdGFpbCcsJ1xcdTI5MUInOidsQXRhaWwnLCdcXHUyOTFDJzonckF0YWlsJywnXFx1MjkxRCc6J2xhcnJmcycsJ1xcdTI5MUUnOidyYXJyZnMnLCdcXHUyOTFGJzonbGFycmJmcycsJ1xcdTI5MjAnOidyYXJyYmZzJywnXFx1MjkyMyc6J253YXJoaycsJ1xcdTI5MjQnOiduZWFyaGsnLCdcXHUyOTI1Jzonc2VhcmhrJywnXFx1MjkyNic6J3N3YXJoaycsJ1xcdTI5MjcnOidud25lYXInLCdcXHUyOTI4JzondG9lYScsJ1xcdTI5MjknOid0b3NhJywnXFx1MjkyQSc6J3N3bndhcicsJ1xcdTI5MzMnOidyYXJyYycsJ1xcdTI5MzNcXHUwMzM4JzonbnJhcnJjJywnXFx1MjkzNSc6J2N1ZGFycnInLCdcXHUyOTM2JzonbGRjYScsJ1xcdTI5MzcnOidyZGNhJywnXFx1MjkzOCc6J2N1ZGFycmwnLCdcXHUyOTM5JzonbGFycnBsJywnXFx1MjkzQyc6J2N1cmFycm0nLCdcXHUyOTNEJzonY3VsYXJycCcsJ1xcdTI5NDUnOidyYXJycGwnLCdcXHUyOTQ4JzonaGFycmNpcicsJ1xcdTI5NDknOidVYXJyb2NpcicsJ1xcdTI5NEEnOidsdXJkc2hhcicsJ1xcdTI5NEInOidsZHJ1c2hhcicsJ1xcdTI5NEUnOidMZWZ0UmlnaHRWZWN0b3InLCdcXHUyOTRGJzonUmlnaHRVcERvd25WZWN0b3InLCdcXHUyOTUwJzonRG93bkxlZnRSaWdodFZlY3RvcicsJ1xcdTI5NTEnOidMZWZ0VXBEb3duVmVjdG9yJywnXFx1Mjk1Mic6J0xlZnRWZWN0b3JCYXInLCdcXHUyOTUzJzonUmlnaHRWZWN0b3JCYXInLCdcXHUyOTU0JzonUmlnaHRVcFZlY3RvckJhcicsJ1xcdTI5NTUnOidSaWdodERvd25WZWN0b3JCYXInLCdcXHUyOTU2JzonRG93bkxlZnRWZWN0b3JCYXInLCdcXHUyOTU3JzonRG93blJpZ2h0VmVjdG9yQmFyJywnXFx1Mjk1OCc6J0xlZnRVcFZlY3RvckJhcicsJ1xcdTI5NTknOidMZWZ0RG93blZlY3RvckJhcicsJ1xcdTI5NUEnOidMZWZ0VGVlVmVjdG9yJywnXFx1Mjk1Qic6J1JpZ2h0VGVlVmVjdG9yJywnXFx1Mjk1Qyc6J1JpZ2h0VXBUZWVWZWN0b3InLCdcXHUyOTVEJzonUmlnaHREb3duVGVlVmVjdG9yJywnXFx1Mjk1RSc6J0Rvd25MZWZ0VGVlVmVjdG9yJywnXFx1Mjk1Ric6J0Rvd25SaWdodFRlZVZlY3RvcicsJ1xcdTI5NjAnOidMZWZ0VXBUZWVWZWN0b3InLCdcXHUyOTYxJzonTGVmdERvd25UZWVWZWN0b3InLCdcXHUyOTYyJzonbEhhcicsJ1xcdTI5NjMnOid1SGFyJywnXFx1Mjk2NCc6J3JIYXInLCdcXHUyOTY1JzonZEhhcicsJ1xcdTI5NjYnOidsdXJ1aGFyJywnXFx1Mjk2Nyc6J2xkcmRoYXInLCdcXHUyOTY4JzoncnVsdWhhcicsJ1xcdTI5NjknOidyZGxkaGFyJywnXFx1Mjk2QSc6J2xoYXJ1bCcsJ1xcdTI5NkInOidsbGhhcmQnLCdcXHUyOTZDJzoncmhhcnVsJywnXFx1Mjk2RCc6J2xyaGFyZCcsJ1xcdTI5NkUnOid1ZGhhcicsJ1xcdTI5NkYnOidkdWhhcicsJ1xcdTI5NzAnOidSb3VuZEltcGxpZXMnLCdcXHUyOTcxJzonZXJhcnInLCdcXHUyOTcyJzonc2ltcmFycicsJ1xcdTI5NzMnOidsYXJyc2ltJywnXFx1Mjk3NCc6J3JhcnJzaW0nLCdcXHUyOTc1JzoncmFycmFwJywnXFx1Mjk3Nic6J2x0bGFycicsJ1xcdTI5NzgnOidndHJhcnInLCdcXHUyOTc5Jzonc3VicmFycicsJ1xcdTI5N0InOidzdXBsYXJyJywnXFx1Mjk3Qyc6J2xmaXNodCcsJ1xcdTI5N0QnOidyZmlzaHQnLCdcXHUyOTdFJzondWZpc2h0JywnXFx1Mjk3Ric6J2RmaXNodCcsJ1xcdTI5OUEnOid2emlnemFnJywnXFx1Mjk5Qyc6J3ZhbmdydCcsJ1xcdTI5OUQnOidhbmdydHZiZCcsJ1xcdTI5QTQnOidhbmdlJywnXFx1MjlBNSc6J3JhbmdlJywnXFx1MjlBNic6J2R3YW5nbGUnLCdcXHUyOUE3JzondXdhbmdsZScsJ1xcdTI5QTgnOidhbmdtc2RhYScsJ1xcdTI5QTknOidhbmdtc2RhYicsJ1xcdTI5QUEnOidhbmdtc2RhYycsJ1xcdTI5QUInOidhbmdtc2RhZCcsJ1xcdTI5QUMnOidhbmdtc2RhZScsJ1xcdTI5QUQnOidhbmdtc2RhZicsJ1xcdTI5QUUnOidhbmdtc2RhZycsJ1xcdTI5QUYnOidhbmdtc2RhaCcsJ1xcdTI5QjAnOidiZW1wdHl2JywnXFx1MjlCMSc6J2RlbXB0eXYnLCdcXHUyOUIyJzonY2VtcHR5dicsJ1xcdTI5QjMnOidyYWVtcHR5dicsJ1xcdTI5QjQnOidsYWVtcHR5dicsJ1xcdTI5QjUnOidvaGJhcicsJ1xcdTI5QjYnOidvbWlkJywnXFx1MjlCNyc6J29wYXInLCdcXHUyOUI5Jzonb3BlcnAnLCdcXHUyOUJCJzonb2xjcm9zcycsJ1xcdTI5QkMnOidvZHNvbGQnLCdcXHUyOUJFJzonb2xjaXInLCdcXHUyOUJGJzonb2ZjaXInLCdcXHUyOUMwJzonb2x0JywnXFx1MjlDMSc6J29ndCcsJ1xcdTI5QzInOidjaXJzY2lyJywnXFx1MjlDMyc6J2NpckUnLCdcXHUyOUM0Jzonc29sYicsJ1xcdTI5QzUnOidic29sYicsJ1xcdTI5QzknOidib3hib3gnLCdcXHUyOUNEJzondHJpc2InLCdcXHUyOUNFJzoncnRyaWx0cmknLCdcXHUyOUNGJzonTGVmdFRyaWFuZ2xlQmFyJywnXFx1MjlDRlxcdTAzMzgnOidOb3RMZWZ0VHJpYW5nbGVCYXInLCdcXHUyOUQwJzonUmlnaHRUcmlhbmdsZUJhcicsJ1xcdTI5RDBcXHUwMzM4JzonTm90UmlnaHRUcmlhbmdsZUJhcicsJ1xcdTI5REMnOidpaW5maW4nLCdcXHUyOUREJzonaW5maW50aWUnLCdcXHUyOURFJzonbnZpbmZpbicsJ1xcdTI5RTMnOidlcGFyc2wnLCdcXHUyOUU0Jzonc21lcGFyc2wnLCdcXHUyOUU1JzonZXF2cGFyc2wnLCdcXHUyOUVCJzonbG96ZicsJ1xcdTI5RjQnOidSdWxlRGVsYXllZCcsJ1xcdTI5RjYnOidkc29sJywnXFx1MkEwMCc6J3hvZG90JywnXFx1MkEwMSc6J3hvcGx1cycsJ1xcdTJBMDInOid4b3RpbWUnLCdcXHUyQTA0JzoneHVwbHVzJywnXFx1MkEwNic6J3hzcWN1cCcsJ1xcdTJBMEQnOidmcGFydGludCcsJ1xcdTJBMTAnOidjaXJmbmludCcsJ1xcdTJBMTEnOidhd2ludCcsJ1xcdTJBMTInOidycHBvbGludCcsJ1xcdTJBMTMnOidzY3BvbGludCcsJ1xcdTJBMTQnOiducG9saW50JywnXFx1MkExNSc6J3BvaW50aW50JywnXFx1MkExNic6J3F1YXRpbnQnLCdcXHUyQTE3JzonaW50bGFyaGsnLCdcXHUyQTIyJzoncGx1c2NpcicsJ1xcdTJBMjMnOidwbHVzYWNpcicsJ1xcdTJBMjQnOidzaW1wbHVzJywnXFx1MkEyNSc6J3BsdXNkdScsJ1xcdTJBMjYnOidwbHVzc2ltJywnXFx1MkEyNyc6J3BsdXN0d28nLCdcXHUyQTI5JzonbWNvbW1hJywnXFx1MkEyQSc6J21pbnVzZHUnLCdcXHUyQTJEJzonbG9wbHVzJywnXFx1MkEyRSc6J3JvcGx1cycsJ1xcdTJBMkYnOidDcm9zcycsJ1xcdTJBMzAnOid0aW1lc2QnLCdcXHUyQTMxJzondGltZXNiYXInLCdcXHUyQTMzJzonc21hc2hwJywnXFx1MkEzNCc6J2xvdGltZXMnLCdcXHUyQTM1Jzoncm90aW1lcycsJ1xcdTJBMzYnOidvdGltZXNhcycsJ1xcdTJBMzcnOidPdGltZXMnLCdcXHUyQTM4Jzonb2RpdicsJ1xcdTJBMzknOid0cmlwbHVzJywnXFx1MkEzQSc6J3RyaW1pbnVzJywnXFx1MkEzQic6J3RyaXRpbWUnLCdcXHUyQTNDJzonaXByb2QnLCdcXHUyQTNGJzonYW1hbGcnLCdcXHUyQTQwJzonY2FwZG90JywnXFx1MkE0Mic6J25jdXAnLCdcXHUyQTQzJzonbmNhcCcsJ1xcdTJBNDQnOidjYXBhbmQnLCdcXHUyQTQ1JzonY3Vwb3InLCdcXHUyQTQ2JzonY3VwY2FwJywnXFx1MkE0Nyc6J2NhcGN1cCcsJ1xcdTJBNDgnOidjdXBicmNhcCcsJ1xcdTJBNDknOidjYXBicmN1cCcsJ1xcdTJBNEEnOidjdXBjdXAnLCdcXHUyQTRCJzonY2FwY2FwJywnXFx1MkE0Qyc6J2NjdXBzJywnXFx1MkE0RCc6J2NjYXBzJywnXFx1MkE1MCc6J2NjdXBzc20nLCdcXHUyQTUzJzonQW5kJywnXFx1MkE1NCc6J09yJywnXFx1MkE1NSc6J2FuZGFuZCcsJ1xcdTJBNTYnOidvcm9yJywnXFx1MkE1Nyc6J29yc2xvcGUnLCdcXHUyQTU4JzonYW5kc2xvcGUnLCdcXHUyQTVBJzonYW5kdicsJ1xcdTJBNUInOidvcnYnLCdcXHUyQTVDJzonYW5kZCcsJ1xcdTJBNUQnOidvcmQnLCdcXHUyQTVGJzond2VkYmFyJywnXFx1MkE2Nic6J3Nkb3RlJywnXFx1MkE2QSc6J3NpbWRvdCcsJ1xcdTJBNkQnOidjb25nZG90JywnXFx1MkE2RFxcdTAzMzgnOiduY29uZ2RvdCcsJ1xcdTJBNkUnOidlYXN0ZXInLCdcXHUyQTZGJzonYXBhY2lyJywnXFx1MkE3MCc6J2FwRScsJ1xcdTJBNzBcXHUwMzM4JzonbmFwRScsJ1xcdTJBNzEnOidlcGx1cycsJ1xcdTJBNzInOidwbHVzZScsJ1xcdTJBNzMnOidFc2ltJywnXFx1MkE3Nyc6J2VERG90JywnXFx1MkE3OCc6J2VxdWl2REQnLCdcXHUyQTc5JzonbHRjaXInLCdcXHUyQTdBJzonZ3RjaXInLCdcXHUyQTdCJzonbHRxdWVzdCcsJ1xcdTJBN0MnOidndHF1ZXN0JywnXFx1MkE3RCc6J2xlcycsJ1xcdTJBN0RcXHUwMzM4JzonbmxlcycsJ1xcdTJBN0UnOidnZXMnLCdcXHUyQTdFXFx1MDMzOCc6J25nZXMnLCdcXHUyQTdGJzonbGVzZG90JywnXFx1MkE4MCc6J2dlc2RvdCcsJ1xcdTJBODEnOidsZXNkb3RvJywnXFx1MkE4Mic6J2dlc2RvdG8nLCdcXHUyQTgzJzonbGVzZG90b3InLCdcXHUyQTg0JzonZ2VzZG90b2wnLCdcXHUyQTg1JzonbGFwJywnXFx1MkE4Nic6J2dhcCcsJ1xcdTJBODcnOidsbmUnLCdcXHUyQTg4JzonZ25lJywnXFx1MkE4OSc6J2xuYXAnLCdcXHUyQThBJzonZ25hcCcsJ1xcdTJBOEInOidsRWcnLCdcXHUyQThDJzonZ0VsJywnXFx1MkE4RCc6J2xzaW1lJywnXFx1MkE4RSc6J2dzaW1lJywnXFx1MkE4Ric6J2xzaW1nJywnXFx1MkE5MCc6J2dzaW1sJywnXFx1MkE5MSc6J2xnRScsJ1xcdTJBOTInOidnbEUnLCdcXHUyQTkzJzonbGVzZ2VzJywnXFx1MkE5NCc6J2dlc2xlcycsJ1xcdTJBOTUnOidlbHMnLCdcXHUyQTk2JzonZWdzJywnXFx1MkE5Nyc6J2Vsc2RvdCcsJ1xcdTJBOTgnOidlZ3Nkb3QnLCdcXHUyQTk5JzonZWwnLCdcXHUyQTlBJzonZWcnLCdcXHUyQTlEJzonc2ltbCcsJ1xcdTJBOUUnOidzaW1nJywnXFx1MkE5Ric6J3NpbWxFJywnXFx1MkFBMCc6J3NpbWdFJywnXFx1MkFBMSc6J0xlc3NMZXNzJywnXFx1MkFBMVxcdTAzMzgnOidOb3ROZXN0ZWRMZXNzTGVzcycsJ1xcdTJBQTInOidHcmVhdGVyR3JlYXRlcicsJ1xcdTJBQTJcXHUwMzM4JzonTm90TmVzdGVkR3JlYXRlckdyZWF0ZXInLCdcXHUyQUE0JzonZ2xqJywnXFx1MkFBNSc6J2dsYScsJ1xcdTJBQTYnOidsdGNjJywnXFx1MkFBNyc6J2d0Y2MnLCdcXHUyQUE4JzonbGVzY2MnLCdcXHUyQUE5JzonZ2VzY2MnLCdcXHUyQUFBJzonc210JywnXFx1MkFBQic6J2xhdCcsJ1xcdTJBQUMnOidzbXRlJywnXFx1MkFBQ1xcdUZFMDAnOidzbXRlcycsJ1xcdTJBQUQnOidsYXRlJywnXFx1MkFBRFxcdUZFMDAnOidsYXRlcycsJ1xcdTJBQUUnOididW1wRScsJ1xcdTJBQUYnOidwcmUnLCdcXHUyQUFGXFx1MDMzOCc6J25wcmUnLCdcXHUyQUIwJzonc2NlJywnXFx1MkFCMFxcdTAzMzgnOiduc2NlJywnXFx1MkFCMyc6J3ByRScsJ1xcdTJBQjQnOidzY0UnLCdcXHUyQUI1JzoncHJuRScsJ1xcdTJBQjYnOidzY25FJywnXFx1MkFCNyc6J3ByYXAnLCdcXHUyQUI4Jzonc2NhcCcsJ1xcdTJBQjknOidwcm5hcCcsJ1xcdTJBQkEnOidzY25hcCcsJ1xcdTJBQkInOidQcicsJ1xcdTJBQkMnOidTYycsJ1xcdTJBQkQnOidzdWJkb3QnLCdcXHUyQUJFJzonc3VwZG90JywnXFx1MkFCRic6J3N1YnBsdXMnLCdcXHUyQUMwJzonc3VwcGx1cycsJ1xcdTJBQzEnOidzdWJtdWx0JywnXFx1MkFDMic6J3N1cG11bHQnLCdcXHUyQUMzJzonc3ViZWRvdCcsJ1xcdTJBQzQnOidzdXBlZG90JywnXFx1MkFDNSc6J3N1YkUnLCdcXHUyQUM1XFx1MDMzOCc6J25zdWJFJywnXFx1MkFDNic6J3N1cEUnLCdcXHUyQUM2XFx1MDMzOCc6J25zdXBFJywnXFx1MkFDNyc6J3N1YnNpbScsJ1xcdTJBQzgnOidzdXBzaW0nLCdcXHUyQUNCXFx1RkUwMCc6J3ZzdWJuRScsJ1xcdTJBQ0InOidzdWJuRScsJ1xcdTJBQ0NcXHVGRTAwJzondnN1cG5FJywnXFx1MkFDQyc6J3N1cG5FJywnXFx1MkFDRic6J2NzdWInLCdcXHUyQUQwJzonY3N1cCcsJ1xcdTJBRDEnOidjc3ViZScsJ1xcdTJBRDInOidjc3VwZScsJ1xcdTJBRDMnOidzdWJzdXAnLCdcXHUyQUQ0Jzonc3Vwc3ViJywnXFx1MkFENSc6J3N1YnN1YicsJ1xcdTJBRDYnOidzdXBzdXAnLCdcXHUyQUQ3Jzonc3VwaHN1YicsJ1xcdTJBRDgnOidzdXBkc3ViJywnXFx1MkFEOSc6J2Zvcmt2JywnXFx1MkFEQSc6J3RvcGZvcmsnLCdcXHUyQURCJzonbWxjcCcsJ1xcdTJBRTQnOidEYXNodicsJ1xcdTJBRTYnOidWZGFzaGwnLCdcXHUyQUU3JzonQmFydicsJ1xcdTJBRTgnOid2QmFyJywnXFx1MkFFOSc6J3ZCYXJ2JywnXFx1MkFFQic6J1ZiYXInLCdcXHUyQUVDJzonTm90JywnXFx1MkFFRCc6J2JOb3QnLCdcXHUyQUVFJzoncm5taWQnLCdcXHUyQUVGJzonY2lybWlkJywnXFx1MkFGMCc6J21pZGNpcicsJ1xcdTJBRjEnOid0b3BjaXInLCdcXHUyQUYyJzonbmhwYXInLCdcXHUyQUYzJzoncGFyc2ltJywnXFx1MkFGRCc6J3BhcnNsJywnXFx1MkFGRFxcdTIwRTUnOiducGFyc2wnLCdcXHUyNjZEJzonZmxhdCcsJ1xcdTI2NkUnOiduYXR1cicsJ1xcdTI2NkYnOidzaGFycCcsJ1xceEE0JzonY3VycmVuJywnXFx4QTInOidjZW50JywnJCc6J2RvbGxhcicsJ1xceEEzJzoncG91bmQnLCdcXHhBNSc6J3llbicsJ1xcdTIwQUMnOidldXJvJywnXFx4QjknOidzdXAxJywnXFx4QkQnOidoYWxmJywnXFx1MjE1Myc6J2ZyYWMxMycsJ1xceEJDJzonZnJhYzE0JywnXFx1MjE1NSc6J2ZyYWMxNScsJ1xcdTIxNTknOidmcmFjMTYnLCdcXHUyMTVCJzonZnJhYzE4JywnXFx4QjInOidzdXAyJywnXFx1MjE1NCc6J2ZyYWMyMycsJ1xcdTIxNTYnOidmcmFjMjUnLCdcXHhCMyc6J3N1cDMnLCdcXHhCRSc6J2ZyYWMzNCcsJ1xcdTIxNTcnOidmcmFjMzUnLCdcXHUyMTVDJzonZnJhYzM4JywnXFx1MjE1OCc6J2ZyYWM0NScsJ1xcdTIxNUEnOidmcmFjNTYnLCdcXHUyMTVEJzonZnJhYzU4JywnXFx1MjE1RSc6J2ZyYWM3OCcsJ1xcdUQ4MzVcXHVEQ0I2JzonYXNjcicsJ1xcdUQ4MzVcXHVERDUyJzonYW9wZicsJ1xcdUQ4MzVcXHVERDFFJzonYWZyJywnXFx1RDgzNVxcdUREMzgnOidBb3BmJywnXFx1RDgzNVxcdUREMDQnOidBZnInLCdcXHVEODM1XFx1REM5Qyc6J0FzY3InLCdcXHhBQSc6J29yZGYnLCdcXHhFMSc6J2FhY3V0ZScsJ1xceEMxJzonQWFjdXRlJywnXFx4RTAnOidhZ3JhdmUnLCdcXHhDMCc6J0FncmF2ZScsJ1xcdTAxMDMnOidhYnJldmUnLCdcXHUwMTAyJzonQWJyZXZlJywnXFx4RTInOidhY2lyYycsJ1xceEMyJzonQWNpcmMnLCdcXHhFNSc6J2FyaW5nJywnXFx4QzUnOidhbmdzdCcsJ1xceEU0JzonYXVtbCcsJ1xceEM0JzonQXVtbCcsJ1xceEUzJzonYXRpbGRlJywnXFx4QzMnOidBdGlsZGUnLCdcXHUwMTA1JzonYW9nb24nLCdcXHUwMTA0JzonQW9nb24nLCdcXHUwMTAxJzonYW1hY3InLCdcXHUwMTAwJzonQW1hY3InLCdcXHhFNic6J2FlbGlnJywnXFx4QzYnOidBRWxpZycsJ1xcdUQ4MzVcXHVEQ0I3JzonYnNjcicsJ1xcdUQ4MzVcXHVERDUzJzonYm9wZicsJ1xcdUQ4MzVcXHVERDFGJzonYmZyJywnXFx1RDgzNVxcdUREMzknOidCb3BmJywnXFx1MjEyQyc6J0JzY3InLCdcXHVEODM1XFx1REQwNSc6J0JmcicsJ1xcdUQ4MzVcXHVERDIwJzonY2ZyJywnXFx1RDgzNVxcdURDQjgnOidjc2NyJywnXFx1RDgzNVxcdURENTQnOidjb3BmJywnXFx1MjEyRCc6J0NmcicsJ1xcdUQ4MzVcXHVEQzlFJzonQ3NjcicsJ1xcdTIxMDInOidDb3BmJywnXFx1MDEwNyc6J2NhY3V0ZScsJ1xcdTAxMDYnOidDYWN1dGUnLCdcXHUwMTA5JzonY2NpcmMnLCdcXHUwMTA4JzonQ2NpcmMnLCdcXHUwMTBEJzonY2Nhcm9uJywnXFx1MDEwQyc6J0NjYXJvbicsJ1xcdTAxMEInOidjZG90JywnXFx1MDEwQSc6J0Nkb3QnLCdcXHhFNyc6J2NjZWRpbCcsJ1xceEM3JzonQ2NlZGlsJywnXFx1MjEwNSc6J2luY2FyZScsJ1xcdUQ4MzVcXHVERDIxJzonZGZyJywnXFx1MjE0Nic6J2RkJywnXFx1RDgzNVxcdURENTUnOidkb3BmJywnXFx1RDgzNVxcdURDQjknOidkc2NyJywnXFx1RDgzNVxcdURDOUYnOidEc2NyJywnXFx1RDgzNVxcdUREMDcnOidEZnInLCdcXHUyMTQ1JzonREQnLCdcXHVEODM1XFx1REQzQic6J0RvcGYnLCdcXHUwMTBGJzonZGNhcm9uJywnXFx1MDEwRSc6J0RjYXJvbicsJ1xcdTAxMTEnOidkc3Ryb2snLCdcXHUwMTEwJzonRHN0cm9rJywnXFx4RjAnOidldGgnLCdcXHhEMCc6J0VUSCcsJ1xcdTIxNDcnOidlZScsJ1xcdTIxMkYnOidlc2NyJywnXFx1RDgzNVxcdUREMjInOidlZnInLCdcXHVEODM1XFx1REQ1Nic6J2VvcGYnLCdcXHUyMTMwJzonRXNjcicsJ1xcdUQ4MzVcXHVERDA4JzonRWZyJywnXFx1RDgzNVxcdUREM0MnOidFb3BmJywnXFx4RTknOidlYWN1dGUnLCdcXHhDOSc6J0VhY3V0ZScsJ1xceEU4JzonZWdyYXZlJywnXFx4QzgnOidFZ3JhdmUnLCdcXHhFQSc6J2VjaXJjJywnXFx4Q0EnOidFY2lyYycsJ1xcdTAxMUInOidlY2Fyb24nLCdcXHUwMTFBJzonRWNhcm9uJywnXFx4RUInOidldW1sJywnXFx4Q0InOidFdW1sJywnXFx1MDExNyc6J2Vkb3QnLCdcXHUwMTE2JzonRWRvdCcsJ1xcdTAxMTknOidlb2dvbicsJ1xcdTAxMTgnOidFb2dvbicsJ1xcdTAxMTMnOidlbWFjcicsJ1xcdTAxMTInOidFbWFjcicsJ1xcdUQ4MzVcXHVERDIzJzonZmZyJywnXFx1RDgzNVxcdURENTcnOidmb3BmJywnXFx1RDgzNVxcdURDQkInOidmc2NyJywnXFx1RDgzNVxcdUREMDknOidGZnInLCdcXHVEODM1XFx1REQzRCc6J0ZvcGYnLCdcXHUyMTMxJzonRnNjcicsJ1xcdUZCMDAnOidmZmxpZycsJ1xcdUZCMDMnOidmZmlsaWcnLCdcXHVGQjA0JzonZmZsbGlnJywnXFx1RkIwMSc6J2ZpbGlnJywnZmonOidmamxpZycsJ1xcdUZCMDInOidmbGxpZycsJ1xcdTAxOTInOidmbm9mJywnXFx1MjEwQSc6J2dzY3InLCdcXHVEODM1XFx1REQ1OCc6J2dvcGYnLCdcXHVEODM1XFx1REQyNCc6J2dmcicsJ1xcdUQ4MzVcXHVEQ0EyJzonR3NjcicsJ1xcdUQ4MzVcXHVERDNFJzonR29wZicsJ1xcdUQ4MzVcXHVERDBBJzonR2ZyJywnXFx1MDFGNSc6J2dhY3V0ZScsJ1xcdTAxMUYnOidnYnJldmUnLCdcXHUwMTFFJzonR2JyZXZlJywnXFx1MDExRCc6J2djaXJjJywnXFx1MDExQyc6J0djaXJjJywnXFx1MDEyMSc6J2dkb3QnLCdcXHUwMTIwJzonR2RvdCcsJ1xcdTAxMjInOidHY2VkaWwnLCdcXHVEODM1XFx1REQyNSc6J2hmcicsJ1xcdTIxMEUnOidwbGFuY2toJywnXFx1RDgzNVxcdURDQkQnOidoc2NyJywnXFx1RDgzNVxcdURENTknOidob3BmJywnXFx1MjEwQic6J0hzY3InLCdcXHUyMTBDJzonSGZyJywnXFx1MjEwRCc6J0hvcGYnLCdcXHUwMTI1JzonaGNpcmMnLCdcXHUwMTI0JzonSGNpcmMnLCdcXHUyMTBGJzonaGJhcicsJ1xcdTAxMjcnOidoc3Ryb2snLCdcXHUwMTI2JzonSHN0cm9rJywnXFx1RDgzNVxcdURENUEnOidpb3BmJywnXFx1RDgzNVxcdUREMjYnOidpZnInLCdcXHVEODM1XFx1RENCRSc6J2lzY3InLCdcXHUyMTQ4JzonaWknLCdcXHVEODM1XFx1REQ0MCc6J0lvcGYnLCdcXHUyMTEwJzonSXNjcicsJ1xcdTIxMTEnOidJbScsJ1xceEVEJzonaWFjdXRlJywnXFx4Q0QnOidJYWN1dGUnLCdcXHhFQyc6J2lncmF2ZScsJ1xceENDJzonSWdyYXZlJywnXFx4RUUnOidpY2lyYycsJ1xceENFJzonSWNpcmMnLCdcXHhFRic6J2l1bWwnLCdcXHhDRic6J0l1bWwnLCdcXHUwMTI5JzonaXRpbGRlJywnXFx1MDEyOCc6J0l0aWxkZScsJ1xcdTAxMzAnOidJZG90JywnXFx1MDEyRic6J2lvZ29uJywnXFx1MDEyRSc6J0lvZ29uJywnXFx1MDEyQic6J2ltYWNyJywnXFx1MDEyQSc6J0ltYWNyJywnXFx1MDEzMyc6J2lqbGlnJywnXFx1MDEzMic6J0lKbGlnJywnXFx1MDEzMSc6J2ltYXRoJywnXFx1RDgzNVxcdURDQkYnOidqc2NyJywnXFx1RDgzNVxcdURENUInOidqb3BmJywnXFx1RDgzNVxcdUREMjcnOidqZnInLCdcXHVEODM1XFx1RENBNSc6J0pzY3InLCdcXHVEODM1XFx1REQwRCc6J0pmcicsJ1xcdUQ4MzVcXHVERDQxJzonSm9wZicsJ1xcdTAxMzUnOidqY2lyYycsJ1xcdTAxMzQnOidKY2lyYycsJ1xcdTAyMzcnOidqbWF0aCcsJ1xcdUQ4MzVcXHVERDVDJzona29wZicsJ1xcdUQ4MzVcXHVEQ0MwJzona3NjcicsJ1xcdUQ4MzVcXHVERDI4Jzona2ZyJywnXFx1RDgzNVxcdURDQTYnOidLc2NyJywnXFx1RDgzNVxcdURENDInOidLb3BmJywnXFx1RDgzNVxcdUREMEUnOidLZnInLCdcXHUwMTM3Jzona2NlZGlsJywnXFx1MDEzNic6J0tjZWRpbCcsJ1xcdUQ4MzVcXHVERDI5JzonbGZyJywnXFx1RDgzNVxcdURDQzEnOidsc2NyJywnXFx1MjExMyc6J2VsbCcsJ1xcdUQ4MzVcXHVERDVEJzonbG9wZicsJ1xcdTIxMTInOidMc2NyJywnXFx1RDgzNVxcdUREMEYnOidMZnInLCdcXHVEODM1XFx1REQ0Myc6J0xvcGYnLCdcXHUwMTNBJzonbGFjdXRlJywnXFx1MDEzOSc6J0xhY3V0ZScsJ1xcdTAxM0UnOidsY2Fyb24nLCdcXHUwMTNEJzonTGNhcm9uJywnXFx1MDEzQyc6J2xjZWRpbCcsJ1xcdTAxM0InOidMY2VkaWwnLCdcXHUwMTQyJzonbHN0cm9rJywnXFx1MDE0MSc6J0xzdHJvaycsJ1xcdTAxNDAnOidsbWlkb3QnLCdcXHUwMTNGJzonTG1pZG90JywnXFx1RDgzNVxcdUREMkEnOidtZnInLCdcXHVEODM1XFx1REQ1RSc6J21vcGYnLCdcXHVEODM1XFx1RENDMic6J21zY3InLCdcXHVEODM1XFx1REQxMCc6J01mcicsJ1xcdUQ4MzVcXHVERDQ0JzonTW9wZicsJ1xcdTIxMzMnOidNc2NyJywnXFx1RDgzNVxcdUREMkInOiduZnInLCdcXHVEODM1XFx1REQ1Ric6J25vcGYnLCdcXHVEODM1XFx1RENDMyc6J25zY3InLCdcXHUyMTE1JzonTm9wZicsJ1xcdUQ4MzVcXHVEQ0E5JzonTnNjcicsJ1xcdUQ4MzVcXHVERDExJzonTmZyJywnXFx1MDE0NCc6J25hY3V0ZScsJ1xcdTAxNDMnOidOYWN1dGUnLCdcXHUwMTQ4JzonbmNhcm9uJywnXFx1MDE0Nyc6J05jYXJvbicsJ1xceEYxJzonbnRpbGRlJywnXFx4RDEnOidOdGlsZGUnLCdcXHUwMTQ2JzonbmNlZGlsJywnXFx1MDE0NSc6J05jZWRpbCcsJ1xcdTIxMTYnOidudW1lcm8nLCdcXHUwMTRCJzonZW5nJywnXFx1MDE0QSc6J0VORycsJ1xcdUQ4MzVcXHVERDYwJzonb29wZicsJ1xcdUQ4MzVcXHVERDJDJzonb2ZyJywnXFx1MjEzNCc6J29zY3InLCdcXHVEODM1XFx1RENBQSc6J09zY3InLCdcXHVEODM1XFx1REQxMic6J09mcicsJ1xcdUQ4MzVcXHVERDQ2JzonT29wZicsJ1xceEJBJzonb3JkbScsJ1xceEYzJzonb2FjdXRlJywnXFx4RDMnOidPYWN1dGUnLCdcXHhGMic6J29ncmF2ZScsJ1xceEQyJzonT2dyYXZlJywnXFx4RjQnOidvY2lyYycsJ1xceEQ0JzonT2NpcmMnLCdcXHhGNic6J291bWwnLCdcXHhENic6J091bWwnLCdcXHUwMTUxJzonb2RibGFjJywnXFx1MDE1MCc6J09kYmxhYycsJ1xceEY1Jzonb3RpbGRlJywnXFx4RDUnOidPdGlsZGUnLCdcXHhGOCc6J29zbGFzaCcsJ1xceEQ4JzonT3NsYXNoJywnXFx1MDE0RCc6J29tYWNyJywnXFx1MDE0Qyc6J09tYWNyJywnXFx1MDE1Myc6J29lbGlnJywnXFx1MDE1Mic6J09FbGlnJywnXFx1RDgzNVxcdUREMkQnOidwZnInLCdcXHVEODM1XFx1RENDNSc6J3BzY3InLCdcXHVEODM1XFx1REQ2MSc6J3BvcGYnLCdcXHUyMTE5JzonUG9wZicsJ1xcdUQ4MzVcXHVERDEzJzonUGZyJywnXFx1RDgzNVxcdURDQUInOidQc2NyJywnXFx1RDgzNVxcdURENjInOidxb3BmJywnXFx1RDgzNVxcdUREMkUnOidxZnInLCdcXHVEODM1XFx1RENDNic6J3FzY3InLCdcXHVEODM1XFx1RENBQyc6J1FzY3InLCdcXHVEODM1XFx1REQxNCc6J1FmcicsJ1xcdTIxMUEnOidRb3BmJywnXFx1MDEzOCc6J2tncmVlbicsJ1xcdUQ4MzVcXHVERDJGJzoncmZyJywnXFx1RDgzNVxcdURENjMnOidyb3BmJywnXFx1RDgzNVxcdURDQzcnOidyc2NyJywnXFx1MjExQic6J1JzY3InLCdcXHUyMTFDJzonUmUnLCdcXHUyMTFEJzonUm9wZicsJ1xcdTAxNTUnOidyYWN1dGUnLCdcXHUwMTU0JzonUmFjdXRlJywnXFx1MDE1OSc6J3JjYXJvbicsJ1xcdTAxNTgnOidSY2Fyb24nLCdcXHUwMTU3JzoncmNlZGlsJywnXFx1MDE1Nic6J1JjZWRpbCcsJ1xcdUQ4MzVcXHVERDY0Jzonc29wZicsJ1xcdUQ4MzVcXHVEQ0M4Jzonc3NjcicsJ1xcdUQ4MzVcXHVERDMwJzonc2ZyJywnXFx1RDgzNVxcdURENEEnOidTb3BmJywnXFx1RDgzNVxcdUREMTYnOidTZnInLCdcXHVEODM1XFx1RENBRSc6J1NzY3InLCdcXHUyNEM4Jzonb1MnLCdcXHUwMTVCJzonc2FjdXRlJywnXFx1MDE1QSc6J1NhY3V0ZScsJ1xcdTAxNUQnOidzY2lyYycsJ1xcdTAxNUMnOidTY2lyYycsJ1xcdTAxNjEnOidzY2Fyb24nLCdcXHUwMTYwJzonU2Nhcm9uJywnXFx1MDE1Ric6J3NjZWRpbCcsJ1xcdTAxNUUnOidTY2VkaWwnLCdcXHhERic6J3N6bGlnJywnXFx1RDgzNVxcdUREMzEnOid0ZnInLCdcXHVEODM1XFx1RENDOSc6J3RzY3InLCdcXHVEODM1XFx1REQ2NSc6J3RvcGYnLCdcXHVEODM1XFx1RENBRic6J1RzY3InLCdcXHVEODM1XFx1REQxNyc6J1RmcicsJ1xcdUQ4MzVcXHVERDRCJzonVG9wZicsJ1xcdTAxNjUnOid0Y2Fyb24nLCdcXHUwMTY0JzonVGNhcm9uJywnXFx1MDE2Myc6J3RjZWRpbCcsJ1xcdTAxNjInOidUY2VkaWwnLCdcXHUyMTIyJzondHJhZGUnLCdcXHUwMTY3JzondHN0cm9rJywnXFx1MDE2Nic6J1RzdHJvaycsJ1xcdUQ4MzVcXHVEQ0NBJzondXNjcicsJ1xcdUQ4MzVcXHVERDY2JzondW9wZicsJ1xcdUQ4MzVcXHVERDMyJzondWZyJywnXFx1RDgzNVxcdURENEMnOidVb3BmJywnXFx1RDgzNVxcdUREMTgnOidVZnInLCdcXHVEODM1XFx1RENCMCc6J1VzY3InLCdcXHhGQSc6J3VhY3V0ZScsJ1xceERBJzonVWFjdXRlJywnXFx4RjknOid1Z3JhdmUnLCdcXHhEOSc6J1VncmF2ZScsJ1xcdTAxNkQnOid1YnJldmUnLCdcXHUwMTZDJzonVWJyZXZlJywnXFx4RkInOid1Y2lyYycsJ1xceERCJzonVWNpcmMnLCdcXHUwMTZGJzondXJpbmcnLCdcXHUwMTZFJzonVXJpbmcnLCdcXHhGQyc6J3V1bWwnLCdcXHhEQyc6J1V1bWwnLCdcXHUwMTcxJzondWRibGFjJywnXFx1MDE3MCc6J1VkYmxhYycsJ1xcdTAxNjknOid1dGlsZGUnLCdcXHUwMTY4JzonVXRpbGRlJywnXFx1MDE3Myc6J3VvZ29uJywnXFx1MDE3Mic6J1VvZ29uJywnXFx1MDE2Qic6J3VtYWNyJywnXFx1MDE2QSc6J1VtYWNyJywnXFx1RDgzNVxcdUREMzMnOid2ZnInLCdcXHVEODM1XFx1REQ2Nyc6J3ZvcGYnLCdcXHVEODM1XFx1RENDQic6J3ZzY3InLCdcXHVEODM1XFx1REQxOSc6J1ZmcicsJ1xcdUQ4MzVcXHVERDREJzonVm9wZicsJ1xcdUQ4MzVcXHVEQ0IxJzonVnNjcicsJ1xcdUQ4MzVcXHVERDY4Jzond29wZicsJ1xcdUQ4MzVcXHVEQ0NDJzond3NjcicsJ1xcdUQ4MzVcXHVERDM0Jzond2ZyJywnXFx1RDgzNVxcdURDQjInOidXc2NyJywnXFx1RDgzNVxcdURENEUnOidXb3BmJywnXFx1RDgzNVxcdUREMUEnOidXZnInLCdcXHUwMTc1Jzond2NpcmMnLCdcXHUwMTc0JzonV2NpcmMnLCdcXHVEODM1XFx1REQzNSc6J3hmcicsJ1xcdUQ4MzVcXHVEQ0NEJzoneHNjcicsJ1xcdUQ4MzVcXHVERDY5JzoneG9wZicsJ1xcdUQ4MzVcXHVERDRGJzonWG9wZicsJ1xcdUQ4MzVcXHVERDFCJzonWGZyJywnXFx1RDgzNVxcdURDQjMnOidYc2NyJywnXFx1RDgzNVxcdUREMzYnOid5ZnInLCdcXHVEODM1XFx1RENDRSc6J3lzY3InLCdcXHVEODM1XFx1REQ2QSc6J3lvcGYnLCdcXHVEODM1XFx1RENCNCc6J1lzY3InLCdcXHVEODM1XFx1REQxQyc6J1lmcicsJ1xcdUQ4MzVcXHVERDUwJzonWW9wZicsJ1xceEZEJzoneWFjdXRlJywnXFx4REQnOidZYWN1dGUnLCdcXHUwMTc3JzoneWNpcmMnLCdcXHUwMTc2JzonWWNpcmMnLCdcXHhGRic6J3l1bWwnLCdcXHUwMTc4JzonWXVtbCcsJ1xcdUQ4MzVcXHVEQ0NGJzonenNjcicsJ1xcdUQ4MzVcXHVERDM3JzonemZyJywnXFx1RDgzNVxcdURENkInOid6b3BmJywnXFx1MjEyOCc6J1pmcicsJ1xcdTIxMjQnOidab3BmJywnXFx1RDgzNVxcdURDQjUnOidac2NyJywnXFx1MDE3QSc6J3phY3V0ZScsJ1xcdTAxNzknOidaYWN1dGUnLCdcXHUwMTdFJzonemNhcm9uJywnXFx1MDE3RCc6J1pjYXJvbicsJ1xcdTAxN0MnOid6ZG90JywnXFx1MDE3Qic6J1pkb3QnLCdcXHUwMUI1JzonaW1wZWQnLCdcXHhGRSc6J3Rob3JuJywnXFx4REUnOidUSE9STicsJ1xcdTAxNDknOiduYXBvcycsJ1xcdTAzQjEnOidhbHBoYScsJ1xcdTAzOTEnOidBbHBoYScsJ1xcdTAzQjInOidiZXRhJywnXFx1MDM5Mic6J0JldGEnLCdcXHUwM0IzJzonZ2FtbWEnLCdcXHUwMzkzJzonR2FtbWEnLCdcXHUwM0I0JzonZGVsdGEnLCdcXHUwMzk0JzonRGVsdGEnLCdcXHUwM0I1JzonZXBzaScsJ1xcdTAzRjUnOidlcHNpdicsJ1xcdTAzOTUnOidFcHNpbG9uJywnXFx1MDNERCc6J2dhbW1hZCcsJ1xcdTAzREMnOidHYW1tYWQnLCdcXHUwM0I2JzonemV0YScsJ1xcdTAzOTYnOidaZXRhJywnXFx1MDNCNyc6J2V0YScsJ1xcdTAzOTcnOidFdGEnLCdcXHUwM0I4JzondGhldGEnLCdcXHUwM0QxJzondGhldGF2JywnXFx1MDM5OCc6J1RoZXRhJywnXFx1MDNCOSc6J2lvdGEnLCdcXHUwMzk5JzonSW90YScsJ1xcdTAzQkEnOidrYXBwYScsJ1xcdTAzRjAnOidrYXBwYXYnLCdcXHUwMzlBJzonS2FwcGEnLCdcXHUwM0JCJzonbGFtYmRhJywnXFx1MDM5Qic6J0xhbWJkYScsJ1xcdTAzQkMnOidtdScsJ1xceEI1JzonbWljcm8nLCdcXHUwMzlDJzonTXUnLCdcXHUwM0JEJzonbnUnLCdcXHUwMzlEJzonTnUnLCdcXHUwM0JFJzoneGknLCdcXHUwMzlFJzonWGknLCdcXHUwM0JGJzonb21pY3JvbicsJ1xcdTAzOUYnOidPbWljcm9uJywnXFx1MDNDMCc6J3BpJywnXFx1MDNENic6J3BpdicsJ1xcdTAzQTAnOidQaScsJ1xcdTAzQzEnOidyaG8nLCdcXHUwM0YxJzoncmhvdicsJ1xcdTAzQTEnOidSaG8nLCdcXHUwM0MzJzonc2lnbWEnLCdcXHUwM0EzJzonU2lnbWEnLCdcXHUwM0MyJzonc2lnbWFmJywnXFx1MDNDNCc6J3RhdScsJ1xcdTAzQTQnOidUYXUnLCdcXHUwM0M1JzondXBzaScsJ1xcdTAzQTUnOidVcHNpbG9uJywnXFx1MDNEMic6J1Vwc2knLCdcXHUwM0M2JzoncGhpJywnXFx1MDNENSc6J3BoaXYnLCdcXHUwM0E2JzonUGhpJywnXFx1MDNDNyc6J2NoaScsJ1xcdTAzQTcnOidDaGknLCdcXHUwM0M4JzoncHNpJywnXFx1MDNBOCc6J1BzaScsJ1xcdTAzQzknOidvbWVnYScsJ1xcdTAzQTknOidvaG0nLCdcXHUwNDMwJzonYWN5JywnXFx1MDQxMCc6J0FjeScsJ1xcdTA0MzEnOidiY3knLCdcXHUwNDExJzonQmN5JywnXFx1MDQzMic6J3ZjeScsJ1xcdTA0MTInOidWY3knLCdcXHUwNDMzJzonZ2N5JywnXFx1MDQxMyc6J0djeScsJ1xcdTA0NTMnOidnamN5JywnXFx1MDQwMyc6J0dKY3knLCdcXHUwNDM0JzonZGN5JywnXFx1MDQxNCc6J0RjeScsJ1xcdTA0NTInOidkamN5JywnXFx1MDQwMic6J0RKY3knLCdcXHUwNDM1JzonaWVjeScsJ1xcdTA0MTUnOidJRWN5JywnXFx1MDQ1MSc6J2lvY3knLCdcXHUwNDAxJzonSU9jeScsJ1xcdTA0NTQnOidqdWtjeScsJ1xcdTA0MDQnOidKdWtjeScsJ1xcdTA0MzYnOid6aGN5JywnXFx1MDQxNic6J1pIY3knLCdcXHUwNDM3JzonemN5JywnXFx1MDQxNyc6J1pjeScsJ1xcdTA0NTUnOidkc2N5JywnXFx1MDQwNSc6J0RTY3knLCdcXHUwNDM4JzonaWN5JywnXFx1MDQxOCc6J0ljeScsJ1xcdTA0NTYnOidpdWtjeScsJ1xcdTA0MDYnOidJdWtjeScsJ1xcdTA0NTcnOid5aWN5JywnXFx1MDQwNyc6J1lJY3knLCdcXHUwNDM5JzonamN5JywnXFx1MDQxOSc6J0pjeScsJ1xcdTA0NTgnOidqc2VyY3knLCdcXHUwNDA4JzonSnNlcmN5JywnXFx1MDQzQSc6J2tjeScsJ1xcdTA0MUEnOidLY3knLCdcXHUwNDVDJzona2pjeScsJ1xcdTA0MEMnOidLSmN5JywnXFx1MDQzQic6J2xjeScsJ1xcdTA0MUInOidMY3knLCdcXHUwNDU5JzonbGpjeScsJ1xcdTA0MDknOidMSmN5JywnXFx1MDQzQyc6J21jeScsJ1xcdTA0MUMnOidNY3knLCdcXHUwNDNEJzonbmN5JywnXFx1MDQxRCc6J05jeScsJ1xcdTA0NUEnOiduamN5JywnXFx1MDQwQSc6J05KY3knLCdcXHUwNDNFJzonb2N5JywnXFx1MDQxRSc6J09jeScsJ1xcdTA0M0YnOidwY3knLCdcXHUwNDFGJzonUGN5JywnXFx1MDQ0MCc6J3JjeScsJ1xcdTA0MjAnOidSY3knLCdcXHUwNDQxJzonc2N5JywnXFx1MDQyMSc6J1NjeScsJ1xcdTA0NDInOid0Y3knLCdcXHUwNDIyJzonVGN5JywnXFx1MDQ1Qic6J3RzaGN5JywnXFx1MDQwQic6J1RTSGN5JywnXFx1MDQ0Myc6J3VjeScsJ1xcdTA0MjMnOidVY3knLCdcXHUwNDVFJzondWJyY3knLCdcXHUwNDBFJzonVWJyY3knLCdcXHUwNDQ0JzonZmN5JywnXFx1MDQyNCc6J0ZjeScsJ1xcdTA0NDUnOidraGN5JywnXFx1MDQyNSc6J0tIY3knLCdcXHUwNDQ2JzondHNjeScsJ1xcdTA0MjYnOidUU2N5JywnXFx1MDQ0Nyc6J2NoY3knLCdcXHUwNDI3JzonQ0hjeScsJ1xcdTA0NUYnOidkemN5JywnXFx1MDQwRic6J0RaY3knLCdcXHUwNDQ4Jzonc2hjeScsJ1xcdTA0MjgnOidTSGN5JywnXFx1MDQ0OSc6J3NoY2hjeScsJ1xcdTA0MjknOidTSENIY3knLCdcXHUwNDRBJzonaGFyZGN5JywnXFx1MDQyQSc6J0hBUkRjeScsJ1xcdTA0NEInOid5Y3knLCdcXHUwNDJCJzonWWN5JywnXFx1MDQ0Qyc6J3NvZnRjeScsJ1xcdTA0MkMnOidTT0ZUY3knLCdcXHUwNDREJzonZWN5JywnXFx1MDQyRCc6J0VjeScsJ1xcdTA0NEUnOid5dWN5JywnXFx1MDQyRSc6J1lVY3knLCdcXHUwNDRGJzoneWFjeScsJ1xcdTA0MkYnOidZQWN5JywnXFx1MjEzNSc6J2FsZXBoJywnXFx1MjEzNic6J2JldGgnLCdcXHUyMTM3JzonZ2ltZWwnLCdcXHUyMTM4JzonZGFsZXRoJ307XG5cblx0dmFyIHJlZ2V4RXNjYXBlID0gL1tcIiYnPD5gXS9nO1xuXHR2YXIgZXNjYXBlTWFwID0ge1xuXHRcdCdcIic6ICcmcXVvdDsnLFxuXHRcdCcmJzogJyZhbXA7Jyxcblx0XHQnXFwnJzogJyYjeDI3OycsXG5cdFx0JzwnOiAnJmx0OycsXG5cdFx0Ly8gU2VlIGh0dHBzOi8vbWF0aGlhc2J5bmVucy5iZS9ub3Rlcy9hbWJpZ3VvdXMtYW1wZXJzYW5kczogaW4gSFRNTCwgdGhlXG5cdFx0Ly8gZm9sbG93aW5nIGlzIG5vdCBzdHJpY3RseSBuZWNlc3NhcnkgdW5sZXNzIGl04oCZcyBwYXJ0IG9mIGEgdGFnIG9yIGFuXG5cdFx0Ly8gdW5xdW90ZWQgYXR0cmlidXRlIHZhbHVlLiBXZeKAmXJlIG9ubHkgZXNjYXBpbmcgaXQgdG8gc3VwcG9ydCB0aG9zZVxuXHRcdC8vIHNpdHVhdGlvbnMsIGFuZCBmb3IgWE1MIHN1cHBvcnQuXG5cdFx0Jz4nOiAnJmd0OycsXG5cdFx0Ly8gSW4gSW50ZXJuZXQgRXhwbG9yZXIg4omkIDgsIHRoZSBiYWNrdGljayBjaGFyYWN0ZXIgY2FuIGJlIHVzZWRcblx0XHQvLyB0byBicmVhayBvdXQgb2YgKHVuKXF1b3RlZCBhdHRyaWJ1dGUgdmFsdWVzIG9yIEhUTUwgY29tbWVudHMuXG5cdFx0Ly8gU2VlIGh0dHA6Ly9odG1sNXNlYy5vcmcvIzEwMiwgaHR0cDovL2h0bWw1c2VjLm9yZy8jMTA4LCBhbmRcblx0XHQvLyBodHRwOi8vaHRtbDVzZWMub3JnLyMxMzMuXG5cdFx0J2AnOiAnJiN4NjA7J1xuXHR9O1xuXG5cdHZhciByZWdleEludmFsaWRFbnRpdHkgPSAvJiMoPzpbeFhdW15hLWZBLUYwLTldfFteMC05eFhdKS87XG5cdHZhciByZWdleEludmFsaWRSYXdDb2RlUG9pbnQgPSAvW1xcMC1cXHgwOFxceDBCXFx4MEUtXFx4MUZcXHg3Ri1cXHg5RlxcdUZERDAtXFx1RkRFRlxcdUZGRkVcXHVGRkZGXXxbXFx1RDgzRlxcdUQ4N0ZcXHVEOEJGXFx1RDhGRlxcdUQ5M0ZcXHVEOTdGXFx1RDlCRlxcdUQ5RkZcXHVEQTNGXFx1REE3RlxcdURBQkZcXHVEQUZGXFx1REIzRlxcdURCN0ZcXHVEQkJGXFx1REJGRl1bXFx1REZGRVxcdURGRkZdfFtcXHVEODAwLVxcdURCRkZdKD8hW1xcdURDMDAtXFx1REZGRl0pfCg/OlteXFx1RDgwMC1cXHVEQkZGXXxeKVtcXHVEQzAwLVxcdURGRkZdLztcblx0dmFyIHJlZ2V4RGVjb2RlID0gLyYoQ291bnRlckNsb2Nrd2lzZUNvbnRvdXJJbnRlZ3JhbHxEb3VibGVMb25nTGVmdFJpZ2h0QXJyb3d8Q2xvY2t3aXNlQ29udG91ckludGVncmFsfE5vdE5lc3RlZEdyZWF0ZXJHcmVhdGVyfE5vdFNxdWFyZVN1cGVyc2V0RXF1YWx8RGlhY3JpdGljYWxEb3VibGVBY3V0ZXxOb3RSaWdodFRyaWFuZ2xlRXF1YWx8Tm90U3VjY2VlZHNTbGFudEVxdWFsfE5vdFByZWNlZGVzU2xhbnRFcXVhbHxDbG9zZUN1cmx5RG91YmxlUXVvdGV8TmVnYXRpdmVWZXJ5VGhpblNwYWNlfERvdWJsZUNvbnRvdXJJbnRlZ3JhbHxGaWxsZWRWZXJ5U21hbGxTcXVhcmV8Q2FwaXRhbERpZmZlcmVudGlhbER8T3BlbkN1cmx5RG91YmxlUXVvdGV8RW1wdHlWZXJ5U21hbGxTcXVhcmV8TmVzdGVkR3JlYXRlckdyZWF0ZXJ8RG91YmxlTG9uZ1JpZ2h0QXJyb3d8Tm90TGVmdFRyaWFuZ2xlRXF1YWx8Tm90R3JlYXRlclNsYW50RXF1YWx8UmV2ZXJzZVVwRXF1aWxpYnJpdW18RG91YmxlTGVmdFJpZ2h0QXJyb3d8Tm90U3F1YXJlU3Vic2V0RXF1YWx8Tm90RG91YmxlVmVydGljYWxCYXJ8UmlnaHRBcnJvd0xlZnRBcnJvd3xOb3RHcmVhdGVyRnVsbEVxdWFsfE5vdFJpZ2h0VHJpYW5nbGVCYXJ8U3F1YXJlU3VwZXJzZXRFcXVhbHxEb3duTGVmdFJpZ2h0VmVjdG9yfERvdWJsZUxvbmdMZWZ0QXJyb3d8bGVmdHJpZ2h0c3F1aWdhcnJvd3xMZWZ0QXJyb3dSaWdodEFycm93fE5lZ2F0aXZlTWVkaXVtU3BhY2V8YmxhY2t0cmlhbmdsZXJpZ2h0fFJpZ2h0RG93blZlY3RvckJhcnxQcmVjZWRlc1NsYW50RXF1YWx8UmlnaHREb3VibGVCcmFja2V0fFN1Y2NlZWRzU2xhbnRFcXVhbHxOb3RMZWZ0VHJpYW5nbGVCYXJ8UmlnaHRUcmlhbmdsZUVxdWFsfFNxdWFyZUludGVyc2VjdGlvbnxSaWdodERvd25UZWVWZWN0b3J8UmV2ZXJzZUVxdWlsaWJyaXVtfE5lZ2F0aXZlVGhpY2tTcGFjZXxsb25nbGVmdHJpZ2h0YXJyb3d8TG9uZ2xlZnRyaWdodGFycm93fExvbmdMZWZ0UmlnaHRBcnJvd3xEb3duUmlnaHRUZWVWZWN0b3J8RG93blJpZ2h0VmVjdG9yQmFyfEdyZWF0ZXJTbGFudEVxdWFsfFNxdWFyZVN1YnNldEVxdWFsfExlZnREb3duVmVjdG9yQmFyfExlZnREb3VibGVCcmFja2V0fFZlcnRpY2FsU2VwYXJhdG9yfHJpZ2h0bGVmdGhhcnBvb25zfE5vdEdyZWF0ZXJHcmVhdGVyfE5vdFNxdWFyZVN1cGVyc2V0fGJsYWNrdHJpYW5nbGVsZWZ0fGJsYWNrdHJpYW5nbGVkb3dufE5lZ2F0aXZlVGhpblNwYWNlfExlZnREb3duVGVlVmVjdG9yfE5vdExlc3NTbGFudEVxdWFsfGxlZnRyaWdodGhhcnBvb25zfERvdWJsZVVwRG93bkFycm93fERvdWJsZVZlcnRpY2FsQmFyfExlZnRUcmlhbmdsZUVxdWFsfEZpbGxlZFNtYWxsU3F1YXJlfHR3b2hlYWRyaWdodGFycm93fE5vdE5lc3RlZExlc3NMZXNzfERvd25MZWZ0VGVlVmVjdG9yfERvd25MZWZ0VmVjdG9yQmFyfFJpZ2h0QW5nbGVCcmFja2V0fE5vdFRpbGRlRnVsbEVxdWFsfE5vdFJldmVyc2VFbGVtZW50fFJpZ2h0VXBEb3duVmVjdG9yfERpYWNyaXRpY2FsVGlsZGV8Tm90U3VjY2VlZHNUaWxkZXxjaXJjbGVhcnJvd3JpZ2h0fE5vdFByZWNlZGVzRXF1YWx8cmlnaHRoYXJwb29uZG93bnxEb3VibGVSaWdodEFycm93fE5vdFN1Y2NlZWRzRXF1YWx8Tm9uQnJlYWtpbmdTcGFjZXxOb3RSaWdodFRyaWFuZ2xlfExlc3NFcXVhbEdyZWF0ZXJ8UmlnaHRVcFRlZVZlY3RvcnxMZWZ0QW5nbGVCcmFja2V0fEdyZWF0ZXJGdWxsRXF1YWx8RG93bkFycm93VXBBcnJvd3xSaWdodFVwVmVjdG9yQmFyfHR3b2hlYWRsZWZ0YXJyb3d8R3JlYXRlckVxdWFsTGVzc3xkb3duaGFycG9vbnJpZ2h0fFJpZ2h0VHJpYW5nbGVCYXJ8bnRyaWFuZ2xlcmlnaHRlcXxOb3RTdXBlcnNldEVxdWFsfExlZnRVcERvd25WZWN0b3J8RGlhY3JpdGljYWxBY3V0ZXxyaWdodHJpZ2h0YXJyb3dzfHZhcnRyaWFuZ2xlcmlnaHR8VXBBcnJvd0Rvd25BcnJvd3xEaWFjcml0aWNhbEdyYXZlfFVuZGVyUGFyZW50aGVzaXN8RW1wdHlTbWFsbFNxdWFyZXxMZWZ0VXBWZWN0b3JCYXJ8bGVmdHJpZ2h0YXJyb3dzfERvd25SaWdodFZlY3Rvcnxkb3duaGFycG9vbmxlZnR8dHJpYW5nbGVyaWdodGVxfFNob3J0UmlnaHRBcnJvd3xPdmVyUGFyZW50aGVzaXN8RG91YmxlTGVmdEFycm93fERvdWJsZURvd25BcnJvd3xOb3RTcXVhcmVTdWJzZXR8YmlndHJpYW5nbGVkb3dufG50cmlhbmdsZWxlZnRlcXxVcHBlclJpZ2h0QXJyb3d8Y3VydmVhcnJvd3JpZ2h0fHZhcnRyaWFuZ2xlbGVmdHxOb3RMZWZ0VHJpYW5nbGV8bmxlZnRyaWdodGFycm93fExvd2VyUmlnaHRBcnJvd3xOb3RIdW1wRG93bkh1bXB8Tm90R3JlYXRlclRpbGRlfHJpZ2h0dGhyZWV0aW1lc3xMZWZ0VXBUZWVWZWN0b3J8Tm90R3JlYXRlckVxdWFsfHN0cmFpZ2h0ZXBzaWxvbnxMZWZ0VHJpYW5nbGVCYXJ8cmlnaHRzcXVpZ2Fycm93fENvbnRvdXJJbnRlZ3JhbHxyaWdodGxlZnRhcnJvd3N8Q2xvc2VDdXJseVF1b3RlfFJpZ2h0RG93blZlY3RvcnxMZWZ0UmlnaHRWZWN0b3J8bkxlZnRyaWdodGFycm93fGxlZnRoYXJwb29uZG93bnxjaXJjbGVhcnJvd2xlZnR8U3F1YXJlU3VwZXJzZXR8T3BlbkN1cmx5UXVvdGV8aG9va3JpZ2h0YXJyb3d8SG9yaXpvbnRhbExpbmV8RGlhY3JpdGljYWxEb3R8Tm90TGVzc0dyZWF0ZXJ8bnRyaWFuZ2xlcmlnaHR8RG91YmxlUmlnaHRUZWV8SW52aXNpYmxlQ29tbWF8SW52aXNpYmxlVGltZXN8TG93ZXJMZWZ0QXJyb3d8RG93bkxlZnRWZWN0b3J8Tm90U3Vic2V0RXF1YWx8Y3VydmVhcnJvd2xlZnR8dHJpYW5nbGVsZWZ0ZXF8Tm90VmVydGljYWxCYXJ8VGlsZGVGdWxsRXF1YWx8ZG93bmRvd25hcnJvd3N8Tm90R3JlYXRlckxlc3N8UmlnaHRUZWVWZWN0b3J8WmVyb1dpZHRoU3BhY2V8bG9vcGFycm93cmlnaHR8TG9uZ1JpZ2h0QXJyb3d8ZG91YmxlYmFyd2VkZ2V8U2hvcnRMZWZ0QXJyb3d8U2hvcnREb3duQXJyb3d8UmlnaHRWZWN0b3JCYXJ8R3JlYXRlckdyZWF0ZXJ8UmV2ZXJzZUVsZW1lbnR8cmlnaHRoYXJwb29udXB8TGVzc1NsYW50RXF1YWx8bGVmdHRocmVldGltZXN8dXBoYXJwb29ucmlnaHR8cmlnaHRhcnJvd3RhaWx8TGVmdERvd25WZWN0b3J8TG9uZ3JpZ2h0YXJyb3d8TmVzdGVkTGVzc0xlc3N8VXBwZXJMZWZ0QXJyb3d8bnNob3J0cGFyYWxsZWx8bGVmdGxlZnRhcnJvd3N8bGVmdHJpZ2h0YXJyb3d8TGVmdHJpZ2h0YXJyb3d8TGVmdFJpZ2h0QXJyb3d8bG9uZ3JpZ2h0YXJyb3d8dXBoYXJwb29ubGVmdHxSaWdodEFycm93QmFyfEFwcGx5RnVuY3Rpb258TGVmdFRlZVZlY3RvcnxsZWZ0YXJyb3d0YWlsfE5vdEVxdWFsVGlsZGV8dmFyc3Vic2V0bmVxcXx2YXJzdXBzZXRuZXFxfFJpZ2h0VGVlQXJyb3d8U3VjY2VlZHNFcXVhbHxTdWNjZWVkc1RpbGRlfExlZnRWZWN0b3JCYXJ8U3VwZXJzZXRFcXVhbHxob29rbGVmdGFycm93fERpZmZlcmVudGlhbER8VmVydGljYWxUaWxkZXxWZXJ5VGhpblNwYWNlfGJsYWNrdHJpYW5nbGV8YmlndHJpYW5nbGV1cHxMZXNzRnVsbEVxdWFsfGRpdmlkZW9udGltZXN8bGVmdGhhcnBvb251cHxVcEVxdWlsaWJyaXVtfG50cmlhbmdsZWxlZnR8UmlnaHRUcmlhbmdsZXxtZWFzdXJlZGFuZ2xlfHNob3J0cGFyYWxsZWx8bG9uZ2xlZnRhcnJvd3xMb25nbGVmdGFycm93fExvbmdMZWZ0QXJyb3d8RG91YmxlTGVmdFRlZXxQb2luY2FyZXBsYW5lfFByZWNlZGVzRXF1YWx8dHJpYW5nbGVyaWdodHxEb3VibGVVcEFycm93fFJpZ2h0VXBWZWN0b3J8ZmFsbGluZ2RvdHNlcXxsb29wYXJyb3dsZWZ0fFByZWNlZGVzVGlsZGV8Tm90VGlsZGVFcXVhbHxOb3RUaWxkZVRpbGRlfHNtYWxsc2V0bWludXN8UHJvcG9ydGlvbmFsfHRyaWFuZ2xlbGVmdHx0cmlhbmdsZWRvd258VW5kZXJCcmFja2V0fE5vdEh1bXBFcXVhbHxleHBvbmVudGlhbGV8RXhwb25lbnRpYWxFfE5vdExlc3NUaWxkZXxIaWxiZXJ0U3BhY2V8UmlnaHRDZWlsaW5nfGJsYWNrbG96ZW5nZXx2YXJzdXBzZXRuZXF8SHVtcERvd25IdW1wfEdyZWF0ZXJFcXVhbHxWZXJ0aWNhbExpbmV8TGVmdFRlZUFycm93fE5vdExlc3NFcXVhbHxEb3duVGVlQXJyb3d8TGVmdFRyaWFuZ2xlfHZhcnN1YnNldG5lcXxJbnRlcnNlY3Rpb258Tm90Q29uZ3J1ZW50fERvd25BcnJvd0JhcnxMZWZ0VXBWZWN0b3J8TGVmdEFycm93QmFyfHJpc2luZ2RvdHNlcXxHcmVhdGVyVGlsZGV8Um91bmRJbXBsaWVzfFNxdWFyZVN1YnNldHxTaG9ydFVwQXJyb3d8Tm90U3VwZXJzZXR8cXVhdGVybmlvbnN8cHJlY25hcHByb3h8YmFja2Vwc2lsb258cHJlY2N1cmx5ZXF8T3ZlckJyYWNrZXR8YmxhY2tzcXVhcmV8TWVkaXVtU3BhY2V8VmVydGljYWxCYXJ8Y2lyY2xlZGNpcmN8Y2lyY2xlZGRhc2h8Q2lyY2xlTWludXN8Q2lyY2xlVGltZXN8TGVzc0dyZWF0ZXJ8Y3VybHllcXByZWN8Y3VybHllcXN1Y2N8ZGlhbW9uZHN1aXR8VXBEb3duQXJyb3d8VXBkb3duYXJyb3d8UnVsZURlbGF5ZWR8UnJpZ2h0YXJyb3d8dXBkb3duYXJyb3d8UmlnaHRWZWN0b3J8blJpZ2h0YXJyb3d8bnJpZ2h0YXJyb3d8ZXFzbGFudGxlc3N8TGVmdENlaWxpbmd8RXF1aWxpYnJpdW18U21hbGxDaXJjbGV8ZXhwZWN0YXRpb258Tm90U3VjY2VlZHN8dGhpY2thcHByb3h8R3JlYXRlckxlc3N8U3F1YXJlVW5pb258Tm90UHJlY2VkZXN8Tm90TGVzc0xlc3N8c3RyYWlnaHRwaGl8c3VjY25hcHByb3h8c3VjY2N1cmx5ZXF8U3Vic2V0RXF1YWx8c3FzdXBzZXRlcXxQcm9wb3J0aW9ufExhcGxhY2V0cmZ8SW1hZ2luYXJ5SXxzdXBzZXRuZXFxfE5vdEdyZWF0ZXJ8Z3RyZXFxbGVzc3xOb3RFbGVtZW50fFRoaWNrU3BhY2V8VGlsZGVFcXVhbHxUaWxkZVRpbGRlfEZvdXJpZXJ0cmZ8cm1vdXN0YWNoZXxFcXVhbFRpbGRlfGVxc2xhbnRndHJ8VW5kZXJCcmFjZXxMZWZ0VmVjdG9yfFVwQXJyb3dCYXJ8bkxlZnRhcnJvd3xuc3Vic2V0ZXFxfHN1YnNldG5lcXF8bnN1cHNldGVxcXxubGVmdGFycm93fHN1Y2NhcHByb3h8bGVzc2FwcHJveHxVcFRlZUFycm93fHVwdXBhcnJvd3N8Y3VybHl3ZWRnZXxsZXNzZXFxZ3RyfHZhcmVwc2lsb258dmFybm90aGluZ3xSaWdodEZsb29yfGNvbXBsZW1lbnR8Q2lyY2xlUGx1c3xzcXN1YnNldGVxfExsZWZ0YXJyb3d8Y2lyY2xlZGFzdHxSaWdodEFycm93fFJpZ2h0YXJyb3d8cmlnaHRhcnJvd3xsbW91c3RhY2hlfEJlcm5vdWxsaXN8cHJlY2FwcHJveHxtYXBzdG9sZWZ0fG1hcHN0b2Rvd258bG9uZ21hcHN0b3xkb3RzcXVhcmV8ZG93bmFycm93fERvdWJsZURvdHxuc3Vic2V0ZXF8c3Vwc2V0bmVxfGxlZnRhcnJvd3xuc3Vwc2V0ZXF8c3Vic2V0bmVxfFRoaW5TcGFjZXxuZ2Vxc2xhbnR8c3Vic2V0ZXFxfEh1bXBFcXVhbHxOb3RTdWJzZXR8dHJpYW5nbGVxfE5vdEN1cENhcHxsZXNzZXFndHJ8aGVhcnRzdWl0fFRyaXBsZURvdHxMZWZ0YXJyb3d8Q29wcm9kdWN0fENvbmdydWVudHx2YXJwcm9wdG98Y29tcGxleGVzfGd2ZXJ0bmVxcXxMZWZ0QXJyb3d8TGVzc1RpbGRlfHN1cHNldGVxcXxNaW51c1BsdXN8Q2lyY2xlRG90fG5sZXFzbGFudHxOb3RFeGlzdHN8Z3RyZXFsZXNzfG5wYXJhbGxlbHxVbmlvblBsdXN8TGVmdEZsb29yfGNoZWNrbWFya3xDZW50ZXJEb3R8Y2VudGVyZG90fE1lbGxpbnRyZnxndHJhcHByb3h8Ymlnb3RpbWVzfE92ZXJCcmFjZXxzcGFkZXN1aXR8dGhlcmVmb3JlfHBpdGNoZm9ya3xyYXRpb25hbHN8UGx1c01pbnVzfEJhY2tzbGFzaHxUaGVyZWZvcmV8RG93bkJyZXZlfGJhY2tzaW1lcXxiYWNrcHJpbWV8RG93bkFycm93fG5zaG9ydG1pZHxEb3duYXJyb3d8bHZlcnRuZXFxfGVxdnBhcnNsfGltYWdsaW5lfGltYWdwYXJ0fGluZmludGllfGludGVnZXJzfEludGVncmFsfGludGVyY2FsfExlc3NMZXNzfFVhcnJvY2lyfGludGxhcmhrfHNxc3Vwc2V0fGFuZ21zZGFmfHNxc3Vic2V0fGxsY29ybmVyfHZhcnRoZXRhfGN1cGJyY2FwfGxuYXBwcm94fFN1cGVyc2V0fFN1Y2hUaGF0fHN1Y2Nuc2ltfHN1Y2NuZXFxfGFuZ21zZGFnfGJpZ3VwbHVzfGN1cmx5dmVlfHRycGV6aXVtfFN1Y2NlZWRzfE5vdFRpbGRlfGJpZ3dlZGdlfGFuZ21zZGFofGFuZ3J0dmJkfHRyaW1pbnVzfGN3Y29uaW50fGZwYXJ0aW50fGxyY29ybmVyfHNtZXBhcnNsfHN1YnNldGVxfHVyY29ybmVyfGx1cmRzaGFyfGxhZW1wdHl2fEREb3RyYWhkfGFwcHJveGVxfGxkcnVzaGFyfGF3Y29uaW50fG1hcHN0b3VwfGJhY2tjb25nfHNob3J0bWlkfHRyaWFuZ2xlfGdlcXNsYW50fGdlc2RvdG9sfHRpbWVzYmFyfGNpcmNsZWRSfGNpcmNsZWRTfHNldG1pbnVzfG11bHRpbWFwfG5hdHVyYWxzfHNjcG9saW50fG5jb25nZG90fFJpZ2h0VGVlfGJveG1pbnVzfGduYXBwcm94fGJveHRpbWVzfGFuZHNsb3BlfHRoaWNrc2ltfGFuZ21zZGFhfHZhcnNpZ21hfGNpcmZuaW50fHJ0cmlsdHJpfGFuZ21zZGFifHJwcG9saW50fGFuZ21zZGFjfGJhcndlZGdlfGRyYmthcm93fGNsdWJzdWl0fHRoZXRhc3ltfGJzb2xoc3VifGNhcGJyY3VwfGR6aWdyYXJyfGRvdGVxZG90fERvdEVxdWFsfGRvdG1pbnVzfFVuZGVyQmFyfE5vdEVxdWFsfHJlYWxwYXJ0fG90aW1lc2FzfHVsY29ybmVyfGhrc2Vhcm93fGhrc3dhcm93fHBhcmFsbGVsfFBhcnRpYWxEfGVsaW50ZXJzfGVtcHR5c2V0fHBsdXNhY2lyfGJicmt0YnJrfGFuZ21zZGFkfHBvaW50aW50fGJpZ29wbHVzfGFuZ21zZGFlfFByZWNlZGVzfGJpZ3NxY3VwfHZhcmthcHBhfG5vdGluZG90fHN1cHNldGVxfHByZWNuZXFxfHByZWNuc2ltfHByb2ZhbGFyfHByb2ZsaW5lfHByb2ZzdXJmfGxlcXNsYW50fGxlc2RvdG9yfHJhZW1wdHl2fHN1YnBsdXN8bm90bml2Ynxub3RuaXZjfHN1YnJhcnJ8emlncmFycnx2emlnemFnfHN1Ym11bHR8c3ViZWRvdHxFbGVtZW50fGJldHdlZW58Y2lyc2NpcnxsYXJyYmZzfGxhcnJzaW18bG90aW1lc3xsYnJrc2xkfGxicmtzbHV8bG96ZW5nZXxsZHJkaGFyfGRia2Fyb3d8YmlnY2lyY3xlcHNpbG9ufHNpbXJhcnJ8c2ltcGx1c3xsdHF1ZXN0fEVwc2lsb258bHVydWhhcnxndHF1ZXN0fG1hbHRlc2V8bnBvbGludHxlcWNvbG9ufG5wcmVjZXF8Ymlnb2RvdHxkZGFnZ2VyfGd0cmxlc3N8Ym5lcXVpdnxoYXJyY2lyfGRkb3RzZXF8ZXF1aXZERHxiYWNrc2ltfGRlbXB0eXZ8bnNxc3ViZXxuc3FzdXBlfFVwc2lsb258bnN1YnNldHx1cHNpbG9ufG1pbnVzZHV8bnN1Y2NlcXxzd2Fycm93fG5zdXBzZXR8Y29sb25lcXxzZWFycm93fGJveHBsdXN8bmFwcHJveHxuYXR1cmFsfGFzeW1wZXF8YWxlZnN5bXxjb25nZG90fG5lYXJyb3d8Ymlnc3RhcnxkaWFtb25kfHN1cHBsdXN8dHJpdGltZXxMZWZ0VGVlfG52aW5maW58dHJpcGx1c3xOZXdMaW5lfG52bHRyaWV8bnZydHJpZXxud2Fycm93fG5leGlzdHN8RGlhbW9uZHxydWx1aGFyfEltcGxpZXN8c3VwbXVsdHxhbmd6YXJyfHN1cGxhcnJ8c3VwaHN1YnxxdWVzdGVxfGJlY2F1c2V8ZGlnYW1tYXxCZWNhdXNlfG9sY3Jvc3N8YmVtcHR5dnxvbWljcm9ufE9taWNyb258cm90aW1lc3xOb0JyZWFrfGludHByb2R8YW5ncnR2YnxvcmRlcm9mfHV3YW5nbGV8c3VwaHNvbHxsZXNkb3RvfG9yc2xvcGV8RG93blRlZXxyZWFsaW5lfGN1ZGFycmx8cmRsZGhhcnxPdmVyQmFyfHN1cGVkb3R8bGVzc2RvdHxzdXBkc3VifHRvcGZvcmt8c3VjY3NpbXxyYnJrc2x1fHJicmtzbGR8cGVydGVua3xjdWRhcnJyfGlzaW5kb3R8cGxhbmNraHxsZXNzZ3RyfHBsdXNjaXJ8Z2VzZG90b3xwbHVzc2ltfHBsdXN0d298bGVzc3NpbXxjdWxhcnJwfHJhcnJzaW18Q2F5bGV5c3xub3RpbnZhfG5vdGludmJ8bm90aW52Y3xVcEFycm93fFVwYXJyb3d8dXBhcnJvd3xOb3RMZXNzfGR3YW5nbGV8cHJlY3NpbXxQcm9kdWN0fGN1cmFycm18Q2NvbmludHxkb3RwbHVzfHJhcnJiZnN8Y2N1cHNzbXxDZWRpbGxhfGNlbXB0eXZ8bm90bml2YXxxdWF0aW50fGZyYWMzNXxmcmFjMzh8ZnJhYzQ1fGZyYWM1NnxmcmFjNTh8ZnJhYzc4fHRyaWRvdHx4b3BsdXN8Z2FjdXRlfGdhbW1hZHxHYW1tYWR8bGZpc2h0fGxmbG9vcnxiaWdjdXB8c3FzdXBlfGdicmV2ZXxHYnJldmV8bGhhcnVsfHNxc3ViZXxzcWN1cHN8R2NlZGlsfGFwYWNpcnxsbGhhcmR8bG1pZG90fExtaWRvdHxsbW91c3R8YW5kYW5kfHNxY2Fwc3xhcHByb3h8QWJyZXZlfHNwYWRlc3xjaXJjZXF8dHByaW1lfGRpdmlkZXx0b3BjaXJ8QXNzaWdufHRvcGJvdHxnZXNkb3R8ZGl2b254fHh1cGx1c3x0aW1lc2R8Z2VzbGVzfGF0aWxkZXxzb2xiYXJ8U09GVGN5fGxvcGx1c3x0aW1lc2J8bG93YXN0fGxvd2JhcnxkbGNvcm58ZGxjcm9wfHNvZnRjeXxkb2xsYXJ8bHBhcmx0fHRoa3NpbXxscmhhcmR8QXRpbGRlfGxzYXF1b3xzbWFzaHB8YmlndmVlfHRoaW5zcHx3cmVhdGh8Ymthcm93fGxzcXVvcnxsc3Ryb2t8THN0cm9rfGx0aHJlZXxsdGltZXN8bHRsYXJyfERvdERvdHxzaW1kb3R8bHRyUGFyfHdlaWVycHx4c3FjdXB8YW5nbXNkfHNpZ21hdnxzaWdtYWZ8emVldHJmfFpjYXJvbnx6Y2Fyb258bWFwc3RvfHZzdXBuZXx0aGV0YXZ8Y2lybWlkfG1hcmtlcnxtY29tbWF8WmFjdXRlfHZzdWJuRXx0aGVyZTR8Z3RsUGFyfHZzdWJuZXxib3R0b218Z3RyYXJyfFNIQ0hjeXxzaGNoY3l8bWlkYXN0fG1pZGNpcnxtaWRkb3R8bWludXNifG1pbnVzZHxndHJkb3R8Ym93dGllfHNmcm93bnxtbnBsdXN8bW9kZWxzfGNvbG9uZXxzZXN3YXJ8Q29sb25lfG1zdHBvc3xzZWFyaGt8Z3Ryc2ltfG5hY3V0ZXxOYWN1dGV8Ym94Ym94fHRlbHJlY3xoYWlyc3B8VGNlZGlsfG5idW1wZXxzY25zaW18bmNhcm9ufE5jYXJvbnxuY2VkaWx8TmNlZGlsfGhhbWlsdHxTY2VkaWx8bmVhcmhrfGhhcmRjeXxIQVJEY3l8dGNlZGlsfFRjYXJvbnxjb21tYXR8bmVxdWl2fG5lc2Vhcnx0Y2Fyb258dGFyZ2V0fGhlYXJ0c3xuZXhpc3R8dmFycmhvfHNjZWRpbHxTY2Fyb258c2Nhcm9ufGhlbGxpcHxTYWN1dGV8c2FjdXRlfGhlcmNvbnxzd253YXJ8Y29tcGZufHJ0aW1lc3xydGhyZWV8cnNxdW9yfHJzYXF1b3x6YWN1dGV8d2VkZ2VxfGhvbXRodHxiYXJ2ZWV8YmFyd2VkfEJhcndlZHxycGFyZ3R8aG9yYmFyfGNvbmludHxzd2FyaGt8cm9wbHVzfG5sdHJpZXxoc2xhc2h8aHN0cm9rfEhzdHJva3xybW91c3R8Q29uaW50fGJwcmltZXxoeWJ1bGx8aHlwaGVufGlhY3V0ZXxJYWN1dGV8c3Vwc3VwfHN1cHN1YnxzdXBzaW18dmFycGhpfGNvcHJvZHxicnZiYXJ8YWdyYXZlfFN1cHNldHxzdXBzZXR8aWdyYXZlfElncmF2ZXxub3RpbkV8QWdyYXZlfGlpaWludHxpaW5maW58Y29weXNyfHdlZGJhcnxWZXJiYXJ8dmFuZ3J0fGJlY2F1c3xpbmNhcmV8dmVyYmFyfGlub2RvdHxidWxsZXR8ZHJjb3JufGludGNhbHxkcmNyb3B8Y3VsYXJyfHZlbGxpcHxVdGlsZGV8YnVtcGVxfGN1cGNhcHxkc3Ryb2t8RHN0cm9rfEN1cENhcHxjdXBjdXB8Y3VwZG90fGVhY3V0ZXxFYWN1dGV8c3VwZG90fGlxdWVzdHxlYXN0ZXJ8ZWNhcm9ufEVjYXJvbnxlY29sb258aXNpbnN2fHV0aWxkZXxpdGlsZGV8SXRpbGRlfGN1cmFycnxzdWNjZXF8QnVtcGVxfGNhY3V0ZXx1bGNyb3B8bnBhcnNsfENhY3V0ZXxucHJjdWV8ZWdyYXZlfEVncmF2ZXxucmFycmN8bnJhcnJ3fHN1YnN1cHxzdWJzdWJ8bnJ0cmllfGpzZXJjeXxuc2NjdWV8SnNlcmN5fGthcHBhdnxrY2VkaWx8S2NlZGlsfHN1YnNpbXx1bGNvcm58bnNpbWVxfGVnc2RvdHx2ZWViYXJ8a2dyZWVufGNhcGFuZHxlbHNkb3R8U3Vic2V0fHN1YnNldHxjdXJyZW58YWFjdXRlfGxhY3V0ZXxMYWN1dGV8ZW1wdHl2fG50aWxkZXxOdGlsZGV8bGFncmFufGxhbWJkYXxMYW1iZGF8Y2FwY2FwfFVncmF2ZXxsYW5nbGV8c3ViZG90fGVtc3AxM3xudW1lcm98ZW1zcDE0fG52ZGFzaHxudkRhc2h8blZkYXNofG5WRGFzaHx1Z3JhdmV8dWZpc2h0fG52SGFycnxsYXJyZnN8bnZsQXJyfGxhcnJoa3xsYXJybHB8bGFycnBsfG52ckFycnxVZGJsYWN8bndhcmhrfGxhcnJ0bHxud25lYXJ8b2FjdXRlfE9hY3V0ZXxsYXRhaWx8bEF0YWlsfHNzdGFyZnxsYnJhY2V8b2RibGFjfE9kYmxhY3xsYnJhY2t8dWRibGFjfG9kc29sZHxlcGFyc2x8bGNhcm9ufExjYXJvbnxvZ3JhdmV8T2dyYXZlfGxjZWRpbHxMY2VkaWx8QWFjdXRlfHNzbWlsZXxzc2V0bW58c3F1YXJmfGxkcXVvcnxjYXBjdXB8b21pbnVzfGN5bGN0eXxyaGFydWx8ZXFjaXJjfGRhZ2dlcnxyZmxvb3J8cmZpc2h0fERhZ2dlcnxkYWxldGh8ZXF1YWxzfG9yaWdvZnxjYXBkb3R8ZXF1ZXN0fGRjYXJvbnxEY2Fyb258cmRxdW9yfG9zbGFzaHxPc2xhc2h8b3RpbGRlfE90aWxkZXxvdGltZXN8T3RpbWVzfHVyY3JvcHxVYnJldmV8dWJyZXZlfFlhY3V0ZXxVYWN1dGV8dWFjdXRlfFJjZWRpbHxyY2VkaWx8dXJjb3JufHBhcnNpbXxSY2Fyb258VmRhc2hsfHJjYXJvbnxUc3Ryb2t8cGVyY250fHBlcmlvZHxwZXJtaWx8RXhpc3RzfHlhY3V0ZXxyYnJhY2t8cmJyYWNlfHBobW1hdHxjY2Fyb258Q2Nhcm9ufHBsYW5ja3xjY2VkaWx8cGxhbmt2fHRzdHJva3xmZW1hbGV8cGx1c2RvfHBsdXNkdXxmZmlsaWd8cGx1c21ufGZmbGxpZ3xDY2VkaWx8ckF0YWlsfGRmaXNodHxiZXJub3V8cmF0YWlsfFJhcnJ0bHxyYXJydGx8YW5nc3BofHJhcnJwbHxyYXJybHB8cmFycmhrfHh3ZWRnZXx4b3RpbWV8Zm9yYWxsfEZvckFsbHxWdmRhc2h8dnN1cG5FfHByZWNlcXxiaWdjYXB8ZnJhYzEyfGZyYWMxM3xmcmFjMTR8cHJpbWVzfHJhcnJmc3xwcm5zaW18ZnJhYzE1fFNxdWFyZXxmcmFjMTZ8c3F1YXJlfGxlc2RvdHxmcmFjMTh8ZnJhYzIzfHByb3B0b3xwcnVyZWx8cmFycmFwfHJhbmdsZXxwdW5jc3B8ZnJhYzI1fFJhY3V0ZXxxcHJpbWV8cmFjdXRlfGxlc2dlc3xmcmFjMzR8YWJyZXZlfEFFbGlnfGVxc2ltfHV0ZG90fHNldG1ufHVydHJpfEVxdWFsfFVyaW5nfHNlQXJyfHVyaW5nfHNlYXJyfGRhc2h2fERhc2h2fG11bWFwfG5hYmxhfGlvZ29ufElvZ29ufHNkb3RlfHNkb3RifHNjc2ltfG5hcGlkfG5hcG9zfGVxdWl2fG5hdHVyfEFjaXJjfGRibGFjfGVyYXJyfG5idW1wfGlwcm9kfGVyRG90fHVjaXJjfGF3aW50fGVzZG90fGFuZ3J0fG5jb25nfGlzaW5FfHNjbmFwfFNjaXJjfHNjaXJjfG5kYXNofGlzaW5zfFVicmN5fG5lYXJyfG5lQXJyfGlzaW52fG5lZG90fHVicmN5fGFjdXRlfFljaXJjfGl1a2N5fEl1a2N5fHh1dHJpfG5lc2ltfGNhcmV0fGpjaXJjfEpjaXJjfGNhcm9ufHR3aXh0fGRkYXJyfHNjY3VlfGV4aXN0fGptYXRofHNicXVvfG5nZXFxfGFuZ3N0fGNjYXBzfGxjZWlsfG5nc2ltfFVwVGVlfGRlbHRhfERlbHRhfHJ0cmlmfG5oYXJyfG5oQXJyfG5ocGFyfHJ0cmllfGp1a2N5fEp1a2N5fGthcHBhfHJzcXVvfEthcHBhfG5sYXJyfG5sQXJyfFRTSGN5fHJyYXJyfGFvZ29ufEFvZ29ufGZmbGlnfHhyYXJyfHRzaGN5fGNjaXJjfG5sZXFxfGZpbGlnfHVwc2lofG5sZXNzfGRoYXJsfG5sc2ltfGZqbGlnfHJvcGFyfG5sdHJpfGRoYXJyfHJvYnJrfHJvYXJyfGZsbGlnfGZsdG5zfHJvYW5nfHJubWlkfHN1Ym5FfHN1Ym5lfGxBYXJyfHRyaXNifENjaXJjfGFjaXJjfGNjdXBzfGJsYW5rfFZEYXNofGZvcmt2fFZkYXNofGxhbmdkfGNlZGlsfGJsazEyfGJsazE0fGxhcXVvfHN0cm5zfGRpYW1zfG5vdGlufHZEYXNofGxhcnJifGJsazM0fGJsb2NrfGRpc2lufHVwbHVzfHZkYXNofHZCYXJ2fGFlbGlnfHN0YXJmfFdlZGdlfGNoZWNrfHhyQXJyfGxhdGVzfGxiYXJyfGxCYXJyfG5vdG5pfGxiYnJrfGJjb25nfGZyYXNsfGxicmtlfGZyb3dufHZydHJpfHZwcm9wfHZuc3VwfGdhbW1hfEdhbW1hfHdlZGdlfHhvZG90fGJkcXVvfHNyYXJyfGRvdGVxfGxkcXVvfGJveGRsfGJveGRMfGdjaXJjfEdjaXJjfGJveERsfGJveERMfGJveGRyfGJveGRSfGJveERyfFRSQURFfHRyYWRlfHJsaGFyfGJveERSfHZuc3VifG5wYXJ0fHZsdHJpfHJsYXJyfGJveGhkfGJveGhEfG5wcmVjfGdlc2NjfG5yYXJyfG5yQXJyfGJveEhkfGJveEhEfGJveGh1fGJveGhVfG5ydHJpfGJveEh1fGNsdWJzfGJveEhVfHRpbWVzfGNvbG9ufENvbG9ufGdpbWVsfHhsQXJyfFRpbGRlfG5zaW1lfHRpbGRlfG5zbWlkfG5zcGFyfFRIT1JOfHRob3JufHhsYXJyfG5zdWJlfG5zdWJFfHRoa2FwfHhoQXJyfGNvbW1hfG5zdWNjfGJveHVsfGJveHVMfG5zdXBlfG5zdXBFfGduZXFxfGduc2ltfGJveFVsfGJveFVMfGdyYXZlfGJveHVyfGJveHVSfGJveFVyfGJveFVSfGxlc2NjfGFuZ2xlfGJlcHNpfGJveHZofHZhcnBpfGJveHZIfG51bXNwfFRoZXRhfGdzaW1lfGdzaW1sfHRoZXRhfGJveFZofGJveFZIfGJveHZsfGd0Y2lyfGd0ZG90fGJveHZMfGJveFZsfGJveFZMfGNyYXJyfGNyb3NzfENyb3NzfG52c2ltfGJveHZyfG53YXJyfG53QXJyfHNxc3VwfGR0ZG90fFVvZ29ufGxoYXJkfGxoYXJ1fGR0cmlmfG9jaXJjfE9jaXJjfGxoYmxrfGR1YXJyfG9kYXNofHNxc3VifEhhY2VrfHNxY3VwfGxsYXJyfGR1aGFyfG9lbGlnfE9FbGlnfG9mY2lyfGJveHZSfHVvZ29ufGxsdHJpfGJveFZyfGNzdWJlfHV1YXJyfG9oYmFyfGNzdXBlfGN0ZG90fG9sYXJyfG9sY2lyfGhhcnJ3fG9saW5lfHNxY2FwfG9tYWNyfE9tYWNyfG9tZWdhfE9tZWdhfGJveFZSfGFsZXBofGxuZXFxfGxuc2ltfGxvYW5nfGxvYXJyfHJoYXJ1fGxvYnJrfGhjaXJjfG9wZXJwfG9wbHVzfHJoYXJkfEhjaXJjfG9yYXJyfFVuaW9ufG9yZGVyfGVjaXJjfEVjaXJjfGN1ZXByfHN6bGlnfGN1ZXNjfGJyZXZlfHJlYWxzfGVERG90fEJyZXZlfGhvYXJyfGxvcGFyfHV0cmlmfHJkcXVvfFVtYWNyfHVtYWNyfGVmRG90fHN3QXJyfHVsdHJpfGFscGhhfHJjZWlsfG92YmFyfHN3YXJyfFdjaXJjfHdjaXJjfHNtdGVzfHNtaWxlfGJzZW1pfGxyYXJyfGFyaW5nfHBhcnNsfGxyaGFyfGJzaW1lfHVoYmxrfGxydHJpfGN1cG9yfEFyaW5nfHVoYXJyfHVoYXJsfHNsYXJyfHJicmtlfGJzb2xifGxzaW1lfHJiYnJrfFJCYXJyfGxzaW1nfHBob25lfHJCYXJyfHJiYXJyfGljaXJjfGxzcXVvfEljaXJjfGVtYWNyfEVtYWNyfHJhdGlvfHNpbW5lfHBsdXNifHNpbWxFfHNpbWdFfHNpbWVxfHBsdXNlfGx0Y2lyfGx0ZG90fGVtcHR5fHhoYXJyfHhkdHJpfGlleGNsfEFscGhhfGx0cmllfHJhcnJ3fHBvdW5kfGx0cmlmfHhjaXJjfGJ1bXBlfHByY3VlfGJ1bXBFfGFzeW1wfGFtYWNyfGN1dmVlfFNpZ21hfHNpZ21hfGlpaW50fHVkaGFyfGlpb3RhfGlqbGlnfElKbGlnfHN1cG5FfGltYWNyfEltYWNyfHByaW1lfFByaW1lfGltYWdlfHBybmFwfGVvZ29ufEVvZ29ufHJhcnJjfG1kYXNofG1ERG90fGN1d2VkfGltYXRofHN1cG5lfGltcGVkfEFtYWNyfHVkYXJyfHByc2ltfG1pY3JvfHJhcnJifGN3aW50fHJhcXVvfGluZmlufGVwbHVzfHJhbmdlfHJhbmdkfFVjaXJjfHJhZGljfG1pbnVzfGFtYWxnfHZlZWVxfHJBYXJyfGVwc2l2fHljaXJjfHF1ZXN0fHNoYXJwfHF1b3R8enduanxRc2NyfHJhY2V8cXNjcnxRb3BmfHFvcGZ8cWludHxyYW5nfFJhbmd8WnNjcnx6c2NyfFpvcGZ8em9wZnxyYXJyfHJBcnJ8UmFycnxQc2NyfHBzY3J8cHJvcHxwcm9kfHBybkV8cHJlY3xaSGN5fHpoY3l8cHJhcHxaZXRhfHpldGF8UG9wZnxwb3BmfFpkb3R8cGx1c3x6ZG90fFl1bWx8eXVtbHxwaGl2fFlVY3l8eXVjeXxZc2NyfHlzY3J8cGVycHxZb3BmfHlvcGZ8cGFydHxwYXJhfFlJY3l8T3VtbHxyY3VifHlpY3l8WUFjeXxyZGNhfG91bWx8b3NvbHxPc2NyfHJkc2h8eWFjeXxyZWFsfG9zY3J8eHZlZXxhbmRkfHJlY3R8YW5kdnxYc2NyfG9yb3J8b3JkbXxvcmRmfHhzY3J8YW5nZXxhb3BmfEFvcGZ8ckhhcnxYb3BmfG9wYXJ8T29wZnx4b3BmfHhuaXN8cmhvdnxvb3BmfG9taWR8eG1hcHxvaW50fGFwaWR8YXBvc3xvZ29ufGFzY3J8QXNjcnxvZG90fG9kaXZ8eGN1cHx4Y2FwfG9jaXJ8b2FzdHxudmx0fG52bGV8bnZndHxudmdlfG52YXB8V3Njcnx3c2NyfGF1bWx8bnRsZ3xudGdsfG5zdXB8bnN1Ynxuc2ltfE5zY3J8bnNjcnxuc2NlfFdvcGZ8cmluZ3xucHJlfHdvcGZ8bnBhcnxBdW1sfEJhcnZ8YmJya3xOb3BmfG5vcGZ8bm1pZHxuTHR2fGJldGF8cm9wZnxSb3BmfEJldGF8YmV0aHxubGVzfHJwYXJ8bmxlcXxibm90fGJOb3R8bmxkcnxOSmN5fHJzY3J8UnNjcnxWc2NyfHZzY3J8cnNxYnxuamN5fGJvcGZ8bmlzZHxCb3BmfHJ0cml8Vm9wZnxuR3R2fG5ndHJ8dm9wZnxib3hofGJveEh8Ym94dnxuZ2VzfG5nZXF8Ym94Vnxic2NyfHNjYXB8QnNjcnxic2ltfFZlcnR8dmVydHxic29sfGJ1bGx8YnVtcHxjYXBzfGNkb3R8bmN1cHxzY25FfG5jYXB8bmJzcHxuYXBFfENkb3R8Y2VudHxzZG90fFZiYXJ8bmFuZ3x2QmFyfGNoY3l8TXNjcnxtc2NyfHNlY3R8c2VtaXxDSGN5fE1vcGZ8bW9wZnxzZXh0fGNpcmN8Y2lyZXxtbGRyfG1sY3B8Y2lyRXxjb21wfHNoY3l8U0hjeXx2QXJyfHZhcnJ8Y29uZ3xjb3BmfENvcGZ8Y29weXxDT1BZfG1hbHR8bWFsZXxtYWNyfGx2bkV8Y3NjcnxsdHJpfHNpbWV8bHRjY3xzaW1nfENzY3J8c2ltbHxjc3VifFV1bWx8bHNxYnxsc2ltfHV1bWx8Y3N1cHxMc2NyfGxzY3J8dXRyaXxzbWlkfGxwYXJ8Y3Vwc3xzbXRlfGxvemZ8ZGFycnxMb3BmfFVzY3J8c29sYnxsb3BmfHNvcGZ8U29wZnxsbmVxfHVzY3J8c3BhcnxkQXJyfGxuYXB8RGFycnxkYXNofFNxcnR8TEpjeXxsamN5fGxIYXJ8ZEhhcnxVcHNpfHVwc2l8ZGlhbXxsZXNnfGRqY3l8REpjeXxsZXFxfGRvcGZ8RG9wZnxkc2NyfERzY3J8ZHNjeXxsZHNofGxkY2F8c3F1ZnxEU2N5fHNzY3J8U3Njcnxkc29sfGxjdWJ8bGF0ZXxzdGFyfFN0YXJ8VW9wZnxMYXJyfGxBcnJ8bGFycnx1b3BmfGR0cml8ZHpjeXxzdWJlfHN1YkV8TGFuZ3xsYW5nfEtzY3J8a3NjcnxLb3BmfGtvcGZ8S0pjeXxramN5fEtIY3l8a2hjeXxEWmN5fGVjaXJ8ZWRvdHxlRG90fEpzY3J8anNjcnxzdWNjfEpvcGZ8am9wZnxFZG90fHVIYXJ8ZW1zcHxlbnNwfEl1bWx8aXVtbHxlb3BmfGlzaW58SXNjcnxpc2NyfEVvcGZ8ZXBhcnxzdW5nfGVwc2l8ZXNjcnxzdXAxfHN1cDJ8c3VwM3xJb3RhfGlvdGF8c3VwZXxzdXBFfElvcGZ8aW9wZnxJT2N5fGlvY3l8RXNjcnxlc2ltfEVzaW18aW1vZnxVYXJyfFFVT1R8dUFycnx1YXJyfGV1bWx8SUVjeXxpZWN5fElkb3R8RXVtbHxldXJvfGV4Y2x8SHNjcnxoc2NyfEhvcGZ8aG9wZnxUU2N5fHRzY3l8VHNjcnxoYmFyfHRzY3J8ZmxhdHx0YnJrfGZub2Z8aEFycnxoYXJyfGhhbGZ8Zm9wZnxGb3BmfHRkb3R8Z3ZuRXxmb3JrfHRyaWV8Z3RjY3xmc2NyfEZzY3J8Z2RvdHxnc2ltfEdzY3J8Z3NjcnxHb3BmfGdvcGZ8Z25lcXxHZG90fHRvc2F8Z25hcHxUb3BmfHRvcGZ8Z2VxcXx0b2VhfEdKY3l8Z2pjeXx0aW50fGdlc2x8bWlkfFNmcnxnZ2d8dG9wfGdlc3xnbGF8Z2xFfGdsanxnZXF8Z25lfGdFbHxnZWx8Z25FfEdjeXxnY3l8Z2FwfFRmcnx0ZnJ8VGN5fHRjeXxIYXR8VGF1fEZmcnx0YXV8VGFifGhmcnxIZnJ8ZmZyfEZjeXxmY3l8aWN5fEljeXxpZmZ8RVRIfGV0aHxpZnJ8SWZyfEV0YXxldGF8aW50fEludHxTdXB8c3VwfHVjeXxVY3l8U3VtfHN1bXxqY3l8RU5HfHVmcnxVZnJ8ZW5nfEpjeXxqZnJ8ZWxzfGVsbHxlZ3N8RWZyfGVmcnxKZnJ8dW1sfGtjeXxLY3l8RWN5fGVjeXxrZnJ8S2ZyfGxhcHxTdWJ8c3VifGxhdHxsY3l8TGN5fGxlZ3xEb3R8ZG90fGxFZ3xsZXF8bGVzfHNxdXxkaXZ8ZGllfGxmcnxMZnJ8bGdFfERmcnxkZnJ8RGVsfGRlZ3xEY3l8ZGN5fGxuZXxsbkV8c29sfGxvenxzbXR8Q3VwfGxybXxjdXB8bHNofExzaHxzaW18c2h5fG1hcHxNYXB8bWN5fE1jeXxtZnJ8TWZyfG1ob3xnZnJ8R2ZyfHNmcnxjaXJ8Q2hpfGNoaXxuYXB8Q2ZyfHZjeXxWY3l8Y2ZyfFNjeXxzY3l8bmN5fE5jeXx2ZWV8VmVlfENhcHxjYXB8bmZyfHNjRXxzY2V8TmZyfG5nZXxuZ0V8bkdnfHZmcnxWZnJ8bmd0fGJvdHxuR3R8bmlzfG5pdnxSc2h8cnNofG5sZXxubEV8Ym5lfEJmcnxiZnJ8bkxsfG5sdHxuTHR8QmN5fGJjeXxub3R8Tm90fHJsbXx3ZnJ8V2ZyfG5wcnxuc2N8bnVtfG9jeXxhc3R8T2N5fG9mcnx4ZnJ8WGZyfE9mcnxvZ3R8b2htfGFwRXxvbHR8UmhvfGFwZXxyaG98UmZyfHJmcnxvcmR8UkVHfGFuZ3xyZWd8b3J2fEFuZHxhbmR8QU1QfFJjeXxhbXB8QWZyfHljeXxZY3l8eWVufHlmcnxZZnJ8cmN5fHBhcnxwY3l8UGN5fHBmcnxQZnJ8cGhpfFBoaXxhZnJ8QWN5fGFjeXx6Y3l8WmN5fHBpdnxhY0V8YWNkfHpmcnxaZnJ8cHJlfHByRXxwc2l8UHNpfHFmcnxRZnJ8endqfE9yfGdlfEdnfGd0fGdnfGVsfG9TfGx0fEx0fExUfFJlfGxnfGdsfGVnfG5lfEltfGl0fGxlfEREfHdwfHdyfG51fE51fGRkfGxFfFNjfHNjfHBpfFBpfGVlfGFmfGxsfExsfHJ4fGdFfHhpfHBtfFhpfGljfHByfFByfGlufG5pfG1wfG11fGFjfE11fG9yfGFwfEd0fEdUfGlpKTt8JihBYWN1dGV8QWdyYXZlfEF0aWxkZXxDY2VkaWx8RWFjdXRlfEVncmF2ZXxJYWN1dGV8SWdyYXZlfE50aWxkZXxPYWN1dGV8T2dyYXZlfE9zbGFzaHxPdGlsZGV8VWFjdXRlfFVncmF2ZXxZYWN1dGV8YWFjdXRlfGFncmF2ZXxhdGlsZGV8YnJ2YmFyfGNjZWRpbHxjdXJyZW58ZGl2aWRlfGVhY3V0ZXxlZ3JhdmV8ZnJhYzEyfGZyYWMxNHxmcmFjMzR8aWFjdXRlfGlncmF2ZXxpcXVlc3R8bWlkZG90fG50aWxkZXxvYWN1dGV8b2dyYXZlfG9zbGFzaHxvdGlsZGV8cGx1c21ufHVhY3V0ZXx1Z3JhdmV8eWFjdXRlfEFFbGlnfEFjaXJjfEFyaW5nfEVjaXJjfEljaXJjfE9jaXJjfFRIT1JOfFVjaXJjfGFjaXJjfGFjdXRlfGFlbGlnfGFyaW5nfGNlZGlsfGVjaXJjfGljaXJjfGlleGNsfGxhcXVvfG1pY3JvfG9jaXJjfHBvdW5kfHJhcXVvfHN6bGlnfHRob3JufHRpbWVzfHVjaXJjfEF1bWx8Q09QWXxFdW1sfEl1bWx8T3VtbHxRVU9UfFV1bWx8YXVtbHxjZW50fGNvcHl8ZXVtbHxpdW1sfG1hY3J8bmJzcHxvcmRmfG9yZG18b3VtbHxwYXJhfHF1b3R8c2VjdHxzdXAxfHN1cDJ8c3VwM3x1dW1sfHl1bWx8QU1QfEVUSHxSRUd8YW1wfGRlZ3xldGh8bm90fHJlZ3xzaHl8dW1sfHllbnxHVHxMVHxndHxsdCkoPyE7KShbPWEtekEtWjAtOV0/KXwmIyhbMC05XSspKDs/KXwmI1t4WF0oW2EtZkEtRjAtOV0rKSg7Pyl8JihbMC05YS16QS1aXSspL2c7XG5cdHZhciBkZWNvZGVNYXAgPSB7J2FhY3V0ZSc6J1xceEUxJywnQWFjdXRlJzonXFx4QzEnLCdhYnJldmUnOidcXHUwMTAzJywnQWJyZXZlJzonXFx1MDEwMicsJ2FjJzonXFx1MjIzRScsJ2FjZCc6J1xcdTIyM0YnLCdhY0UnOidcXHUyMjNFXFx1MDMzMycsJ2FjaXJjJzonXFx4RTInLCdBY2lyYyc6J1xceEMyJywnYWN1dGUnOidcXHhCNCcsJ2FjeSc6J1xcdTA0MzAnLCdBY3knOidcXHUwNDEwJywnYWVsaWcnOidcXHhFNicsJ0FFbGlnJzonXFx4QzYnLCdhZic6J1xcdTIwNjEnLCdhZnInOidcXHVEODM1XFx1REQxRScsJ0Fmcic6J1xcdUQ4MzVcXHVERDA0JywnYWdyYXZlJzonXFx4RTAnLCdBZ3JhdmUnOidcXHhDMCcsJ2FsZWZzeW0nOidcXHUyMTM1JywnYWxlcGgnOidcXHUyMTM1JywnYWxwaGEnOidcXHUwM0IxJywnQWxwaGEnOidcXHUwMzkxJywnYW1hY3InOidcXHUwMTAxJywnQW1hY3InOidcXHUwMTAwJywnYW1hbGcnOidcXHUyQTNGJywnYW1wJzonJicsJ0FNUCc6JyYnLCdhbmQnOidcXHUyMjI3JywnQW5kJzonXFx1MkE1MycsJ2FuZGFuZCc6J1xcdTJBNTUnLCdhbmRkJzonXFx1MkE1QycsJ2FuZHNsb3BlJzonXFx1MkE1OCcsJ2FuZHYnOidcXHUyQTVBJywnYW5nJzonXFx1MjIyMCcsJ2FuZ2UnOidcXHUyOUE0JywnYW5nbGUnOidcXHUyMjIwJywnYW5nbXNkJzonXFx1MjIyMScsJ2FuZ21zZGFhJzonXFx1MjlBOCcsJ2FuZ21zZGFiJzonXFx1MjlBOScsJ2FuZ21zZGFjJzonXFx1MjlBQScsJ2FuZ21zZGFkJzonXFx1MjlBQicsJ2FuZ21zZGFlJzonXFx1MjlBQycsJ2FuZ21zZGFmJzonXFx1MjlBRCcsJ2FuZ21zZGFnJzonXFx1MjlBRScsJ2FuZ21zZGFoJzonXFx1MjlBRicsJ2FuZ3J0JzonXFx1MjIxRicsJ2FuZ3J0dmInOidcXHUyMkJFJywnYW5ncnR2YmQnOidcXHUyOTlEJywnYW5nc3BoJzonXFx1MjIyMicsJ2FuZ3N0JzonXFx4QzUnLCdhbmd6YXJyJzonXFx1MjM3QycsJ2FvZ29uJzonXFx1MDEwNScsJ0FvZ29uJzonXFx1MDEwNCcsJ2FvcGYnOidcXHVEODM1XFx1REQ1MicsJ0FvcGYnOidcXHVEODM1XFx1REQzOCcsJ2FwJzonXFx1MjI0OCcsJ2FwYWNpcic6J1xcdTJBNkYnLCdhcGUnOidcXHUyMjRBJywnYXBFJzonXFx1MkE3MCcsJ2FwaWQnOidcXHUyMjRCJywnYXBvcyc6J1xcJycsJ0FwcGx5RnVuY3Rpb24nOidcXHUyMDYxJywnYXBwcm94JzonXFx1MjI0OCcsJ2FwcHJveGVxJzonXFx1MjI0QScsJ2FyaW5nJzonXFx4RTUnLCdBcmluZyc6J1xceEM1JywnYXNjcic6J1xcdUQ4MzVcXHVEQ0I2JywnQXNjcic6J1xcdUQ4MzVcXHVEQzlDJywnQXNzaWduJzonXFx1MjI1NCcsJ2FzdCc6JyonLCdhc3ltcCc6J1xcdTIyNDgnLCdhc3ltcGVxJzonXFx1MjI0RCcsJ2F0aWxkZSc6J1xceEUzJywnQXRpbGRlJzonXFx4QzMnLCdhdW1sJzonXFx4RTQnLCdBdW1sJzonXFx4QzQnLCdhd2NvbmludCc6J1xcdTIyMzMnLCdhd2ludCc6J1xcdTJBMTEnLCdiYWNrY29uZyc6J1xcdTIyNEMnLCdiYWNrZXBzaWxvbic6J1xcdTAzRjYnLCdiYWNrcHJpbWUnOidcXHUyMDM1JywnYmFja3NpbSc6J1xcdTIyM0QnLCdiYWNrc2ltZXEnOidcXHUyMkNEJywnQmFja3NsYXNoJzonXFx1MjIxNicsJ0JhcnYnOidcXHUyQUU3JywnYmFydmVlJzonXFx1MjJCRCcsJ2JhcndlZCc6J1xcdTIzMDUnLCdCYXJ3ZWQnOidcXHUyMzA2JywnYmFyd2VkZ2UnOidcXHUyMzA1JywnYmJyayc6J1xcdTIzQjUnLCdiYnJrdGJyayc6J1xcdTIzQjYnLCdiY29uZyc6J1xcdTIyNEMnLCdiY3knOidcXHUwNDMxJywnQmN5JzonXFx1MDQxMScsJ2JkcXVvJzonXFx1MjAxRScsJ2JlY2F1cyc6J1xcdTIyMzUnLCdiZWNhdXNlJzonXFx1MjIzNScsJ0JlY2F1c2UnOidcXHUyMjM1JywnYmVtcHR5dic6J1xcdTI5QjAnLCdiZXBzaSc6J1xcdTAzRjYnLCdiZXJub3UnOidcXHUyMTJDJywnQmVybm91bGxpcyc6J1xcdTIxMkMnLCdiZXRhJzonXFx1MDNCMicsJ0JldGEnOidcXHUwMzkyJywnYmV0aCc6J1xcdTIxMzYnLCdiZXR3ZWVuJzonXFx1MjI2QycsJ2Jmcic6J1xcdUQ4MzVcXHVERDFGJywnQmZyJzonXFx1RDgzNVxcdUREMDUnLCdiaWdjYXAnOidcXHUyMkMyJywnYmlnY2lyYyc6J1xcdTI1RUYnLCdiaWdjdXAnOidcXHUyMkMzJywnYmlnb2RvdCc6J1xcdTJBMDAnLCdiaWdvcGx1cyc6J1xcdTJBMDEnLCdiaWdvdGltZXMnOidcXHUyQTAyJywnYmlnc3FjdXAnOidcXHUyQTA2JywnYmlnc3Rhcic6J1xcdTI2MDUnLCdiaWd0cmlhbmdsZWRvd24nOidcXHUyNUJEJywnYmlndHJpYW5nbGV1cCc6J1xcdTI1QjMnLCdiaWd1cGx1cyc6J1xcdTJBMDQnLCdiaWd2ZWUnOidcXHUyMkMxJywnYmlnd2VkZ2UnOidcXHUyMkMwJywnYmthcm93JzonXFx1MjkwRCcsJ2JsYWNrbG96ZW5nZSc6J1xcdTI5RUInLCdibGFja3NxdWFyZSc6J1xcdTI1QUEnLCdibGFja3RyaWFuZ2xlJzonXFx1MjVCNCcsJ2JsYWNrdHJpYW5nbGVkb3duJzonXFx1MjVCRScsJ2JsYWNrdHJpYW5nbGVsZWZ0JzonXFx1MjVDMicsJ2JsYWNrdHJpYW5nbGVyaWdodCc6J1xcdTI1QjgnLCdibGFuayc6J1xcdTI0MjMnLCdibGsxMic6J1xcdTI1OTInLCdibGsxNCc6J1xcdTI1OTEnLCdibGszNCc6J1xcdTI1OTMnLCdibG9jayc6J1xcdTI1ODgnLCdibmUnOic9XFx1MjBFNScsJ2JuZXF1aXYnOidcXHUyMjYxXFx1MjBFNScsJ2Jub3QnOidcXHUyMzEwJywnYk5vdCc6J1xcdTJBRUQnLCdib3BmJzonXFx1RDgzNVxcdURENTMnLCdCb3BmJzonXFx1RDgzNVxcdUREMzknLCdib3QnOidcXHUyMkE1JywnYm90dG9tJzonXFx1MjJBNScsJ2Jvd3RpZSc6J1xcdTIyQzgnLCdib3hib3gnOidcXHUyOUM5JywnYm94ZGwnOidcXHUyNTEwJywnYm94ZEwnOidcXHUyNTU1JywnYm94RGwnOidcXHUyNTU2JywnYm94REwnOidcXHUyNTU3JywnYm94ZHInOidcXHUyNTBDJywnYm94ZFInOidcXHUyNTUyJywnYm94RHInOidcXHUyNTUzJywnYm94RFInOidcXHUyNTU0JywnYm94aCc6J1xcdTI1MDAnLCdib3hIJzonXFx1MjU1MCcsJ2JveGhkJzonXFx1MjUyQycsJ2JveGhEJzonXFx1MjU2NScsJ2JveEhkJzonXFx1MjU2NCcsJ2JveEhEJzonXFx1MjU2NicsJ2JveGh1JzonXFx1MjUzNCcsJ2JveGhVJzonXFx1MjU2OCcsJ2JveEh1JzonXFx1MjU2NycsJ2JveEhVJzonXFx1MjU2OScsJ2JveG1pbnVzJzonXFx1MjI5RicsJ2JveHBsdXMnOidcXHUyMjlFJywnYm94dGltZXMnOidcXHUyMkEwJywnYm94dWwnOidcXHUyNTE4JywnYm94dUwnOidcXHUyNTVCJywnYm94VWwnOidcXHUyNTVDJywnYm94VUwnOidcXHUyNTVEJywnYm94dXInOidcXHUyNTE0JywnYm94dVInOidcXHUyNTU4JywnYm94VXInOidcXHUyNTU5JywnYm94VVInOidcXHUyNTVBJywnYm94dic6J1xcdTI1MDInLCdib3hWJzonXFx1MjU1MScsJ2JveHZoJzonXFx1MjUzQycsJ2JveHZIJzonXFx1MjU2QScsJ2JveFZoJzonXFx1MjU2QicsJ2JveFZIJzonXFx1MjU2QycsJ2JveHZsJzonXFx1MjUyNCcsJ2JveHZMJzonXFx1MjU2MScsJ2JveFZsJzonXFx1MjU2MicsJ2JveFZMJzonXFx1MjU2MycsJ2JveHZyJzonXFx1MjUxQycsJ2JveHZSJzonXFx1MjU1RScsJ2JveFZyJzonXFx1MjU1RicsJ2JveFZSJzonXFx1MjU2MCcsJ2JwcmltZSc6J1xcdTIwMzUnLCdicmV2ZSc6J1xcdTAyRDgnLCdCcmV2ZSc6J1xcdTAyRDgnLCdicnZiYXInOidcXHhBNicsJ2JzY3InOidcXHVEODM1XFx1RENCNycsJ0JzY3InOidcXHUyMTJDJywnYnNlbWknOidcXHUyMDRGJywnYnNpbSc6J1xcdTIyM0QnLCdic2ltZSc6J1xcdTIyQ0QnLCdic29sJzonXFxcXCcsJ2Jzb2xiJzonXFx1MjlDNScsJ2Jzb2xoc3ViJzonXFx1MjdDOCcsJ2J1bGwnOidcXHUyMDIyJywnYnVsbGV0JzonXFx1MjAyMicsJ2J1bXAnOidcXHUyMjRFJywnYnVtcGUnOidcXHUyMjRGJywnYnVtcEUnOidcXHUyQUFFJywnYnVtcGVxJzonXFx1MjI0RicsJ0J1bXBlcSc6J1xcdTIyNEUnLCdjYWN1dGUnOidcXHUwMTA3JywnQ2FjdXRlJzonXFx1MDEwNicsJ2NhcCc6J1xcdTIyMjknLCdDYXAnOidcXHUyMkQyJywnY2FwYW5kJzonXFx1MkE0NCcsJ2NhcGJyY3VwJzonXFx1MkE0OScsJ2NhcGNhcCc6J1xcdTJBNEInLCdjYXBjdXAnOidcXHUyQTQ3JywnY2FwZG90JzonXFx1MkE0MCcsJ0NhcGl0YWxEaWZmZXJlbnRpYWxEJzonXFx1MjE0NScsJ2NhcHMnOidcXHUyMjI5XFx1RkUwMCcsJ2NhcmV0JzonXFx1MjA0MScsJ2Nhcm9uJzonXFx1MDJDNycsJ0NheWxleXMnOidcXHUyMTJEJywnY2NhcHMnOidcXHUyQTREJywnY2Nhcm9uJzonXFx1MDEwRCcsJ0NjYXJvbic6J1xcdTAxMEMnLCdjY2VkaWwnOidcXHhFNycsJ0NjZWRpbCc6J1xceEM3JywnY2NpcmMnOidcXHUwMTA5JywnQ2NpcmMnOidcXHUwMTA4JywnQ2NvbmludCc6J1xcdTIyMzAnLCdjY3Vwcyc6J1xcdTJBNEMnLCdjY3Vwc3NtJzonXFx1MkE1MCcsJ2Nkb3QnOidcXHUwMTBCJywnQ2RvdCc6J1xcdTAxMEEnLCdjZWRpbCc6J1xceEI4JywnQ2VkaWxsYSc6J1xceEI4JywnY2VtcHR5dic6J1xcdTI5QjInLCdjZW50JzonXFx4QTInLCdjZW50ZXJkb3QnOidcXHhCNycsJ0NlbnRlckRvdCc6J1xceEI3JywnY2ZyJzonXFx1RDgzNVxcdUREMjAnLCdDZnInOidcXHUyMTJEJywnY2hjeSc6J1xcdTA0NDcnLCdDSGN5JzonXFx1MDQyNycsJ2NoZWNrJzonXFx1MjcxMycsJ2NoZWNrbWFyayc6J1xcdTI3MTMnLCdjaGknOidcXHUwM0M3JywnQ2hpJzonXFx1MDNBNycsJ2Npcic6J1xcdTI1Q0InLCdjaXJjJzonXFx1MDJDNicsJ2NpcmNlcSc6J1xcdTIyNTcnLCdjaXJjbGVhcnJvd2xlZnQnOidcXHUyMUJBJywnY2lyY2xlYXJyb3dyaWdodCc6J1xcdTIxQkInLCdjaXJjbGVkYXN0JzonXFx1MjI5QicsJ2NpcmNsZWRjaXJjJzonXFx1MjI5QScsJ2NpcmNsZWRkYXNoJzonXFx1MjI5RCcsJ0NpcmNsZURvdCc6J1xcdTIyOTknLCdjaXJjbGVkUic6J1xceEFFJywnY2lyY2xlZFMnOidcXHUyNEM4JywnQ2lyY2xlTWludXMnOidcXHUyMjk2JywnQ2lyY2xlUGx1cyc6J1xcdTIyOTUnLCdDaXJjbGVUaW1lcyc6J1xcdTIyOTcnLCdjaXJlJzonXFx1MjI1NycsJ2NpckUnOidcXHUyOUMzJywnY2lyZm5pbnQnOidcXHUyQTEwJywnY2lybWlkJzonXFx1MkFFRicsJ2NpcnNjaXInOidcXHUyOUMyJywnQ2xvY2t3aXNlQ29udG91ckludGVncmFsJzonXFx1MjIzMicsJ0Nsb3NlQ3VybHlEb3VibGVRdW90ZSc6J1xcdTIwMUQnLCdDbG9zZUN1cmx5UXVvdGUnOidcXHUyMDE5JywnY2x1YnMnOidcXHUyNjYzJywnY2x1YnN1aXQnOidcXHUyNjYzJywnY29sb24nOic6JywnQ29sb24nOidcXHUyMjM3JywnY29sb25lJzonXFx1MjI1NCcsJ0NvbG9uZSc6J1xcdTJBNzQnLCdjb2xvbmVxJzonXFx1MjI1NCcsJ2NvbW1hJzonLCcsJ2NvbW1hdCc6J0AnLCdjb21wJzonXFx1MjIwMScsJ2NvbXBmbic6J1xcdTIyMTgnLCdjb21wbGVtZW50JzonXFx1MjIwMScsJ2NvbXBsZXhlcyc6J1xcdTIxMDInLCdjb25nJzonXFx1MjI0NScsJ2Nvbmdkb3QnOidcXHUyQTZEJywnQ29uZ3J1ZW50JzonXFx1MjI2MScsJ2NvbmludCc6J1xcdTIyMkUnLCdDb25pbnQnOidcXHUyMjJGJywnQ29udG91ckludGVncmFsJzonXFx1MjIyRScsJ2NvcGYnOidcXHVEODM1XFx1REQ1NCcsJ0NvcGYnOidcXHUyMTAyJywnY29wcm9kJzonXFx1MjIxMCcsJ0NvcHJvZHVjdCc6J1xcdTIyMTAnLCdjb3B5JzonXFx4QTknLCdDT1BZJzonXFx4QTknLCdjb3B5c3InOidcXHUyMTE3JywnQ291bnRlckNsb2Nrd2lzZUNvbnRvdXJJbnRlZ3JhbCc6J1xcdTIyMzMnLCdjcmFycic6J1xcdTIxQjUnLCdjcm9zcyc6J1xcdTI3MTcnLCdDcm9zcyc6J1xcdTJBMkYnLCdjc2NyJzonXFx1RDgzNVxcdURDQjgnLCdDc2NyJzonXFx1RDgzNVxcdURDOUUnLCdjc3ViJzonXFx1MkFDRicsJ2NzdWJlJzonXFx1MkFEMScsJ2NzdXAnOidcXHUyQUQwJywnY3N1cGUnOidcXHUyQUQyJywnY3Rkb3QnOidcXHUyMkVGJywnY3VkYXJybCc6J1xcdTI5MzgnLCdjdWRhcnJyJzonXFx1MjkzNScsJ2N1ZXByJzonXFx1MjJERScsJ2N1ZXNjJzonXFx1MjJERicsJ2N1bGFycic6J1xcdTIxQjYnLCdjdWxhcnJwJzonXFx1MjkzRCcsJ2N1cCc6J1xcdTIyMkEnLCdDdXAnOidcXHUyMkQzJywnY3VwYnJjYXAnOidcXHUyQTQ4JywnY3VwY2FwJzonXFx1MkE0NicsJ0N1cENhcCc6J1xcdTIyNEQnLCdjdXBjdXAnOidcXHUyQTRBJywnY3VwZG90JzonXFx1MjI4RCcsJ2N1cG9yJzonXFx1MkE0NScsJ2N1cHMnOidcXHUyMjJBXFx1RkUwMCcsJ2N1cmFycic6J1xcdTIxQjcnLCdjdXJhcnJtJzonXFx1MjkzQycsJ2N1cmx5ZXFwcmVjJzonXFx1MjJERScsJ2N1cmx5ZXFzdWNjJzonXFx1MjJERicsJ2N1cmx5dmVlJzonXFx1MjJDRScsJ2N1cmx5d2VkZ2UnOidcXHUyMkNGJywnY3VycmVuJzonXFx4QTQnLCdjdXJ2ZWFycm93bGVmdCc6J1xcdTIxQjYnLCdjdXJ2ZWFycm93cmlnaHQnOidcXHUyMUI3JywnY3V2ZWUnOidcXHUyMkNFJywnY3V3ZWQnOidcXHUyMkNGJywnY3djb25pbnQnOidcXHUyMjMyJywnY3dpbnQnOidcXHUyMjMxJywnY3lsY3R5JzonXFx1MjMyRCcsJ2RhZ2dlcic6J1xcdTIwMjAnLCdEYWdnZXInOidcXHUyMDIxJywnZGFsZXRoJzonXFx1MjEzOCcsJ2RhcnInOidcXHUyMTkzJywnZEFycic6J1xcdTIxRDMnLCdEYXJyJzonXFx1MjFBMScsJ2Rhc2gnOidcXHUyMDEwJywnZGFzaHYnOidcXHUyMkEzJywnRGFzaHYnOidcXHUyQUU0JywnZGJrYXJvdyc6J1xcdTI5MEYnLCdkYmxhYyc6J1xcdTAyREQnLCdkY2Fyb24nOidcXHUwMTBGJywnRGNhcm9uJzonXFx1MDEwRScsJ2RjeSc6J1xcdTA0MzQnLCdEY3knOidcXHUwNDE0JywnZGQnOidcXHUyMTQ2JywnREQnOidcXHUyMTQ1JywnZGRhZ2dlcic6J1xcdTIwMjEnLCdkZGFycic6J1xcdTIxQ0EnLCdERG90cmFoZCc6J1xcdTI5MTEnLCdkZG90c2VxJzonXFx1MkE3NycsJ2RlZyc6J1xceEIwJywnRGVsJzonXFx1MjIwNycsJ2RlbHRhJzonXFx1MDNCNCcsJ0RlbHRhJzonXFx1MDM5NCcsJ2RlbXB0eXYnOidcXHUyOUIxJywnZGZpc2h0JzonXFx1Mjk3RicsJ2Rmcic6J1xcdUQ4MzVcXHVERDIxJywnRGZyJzonXFx1RDgzNVxcdUREMDcnLCdkSGFyJzonXFx1Mjk2NScsJ2RoYXJsJzonXFx1MjFDMycsJ2RoYXJyJzonXFx1MjFDMicsJ0RpYWNyaXRpY2FsQWN1dGUnOidcXHhCNCcsJ0RpYWNyaXRpY2FsRG90JzonXFx1MDJEOScsJ0RpYWNyaXRpY2FsRG91YmxlQWN1dGUnOidcXHUwMkREJywnRGlhY3JpdGljYWxHcmF2ZSc6J2AnLCdEaWFjcml0aWNhbFRpbGRlJzonXFx1MDJEQycsJ2RpYW0nOidcXHUyMkM0JywnZGlhbW9uZCc6J1xcdTIyQzQnLCdEaWFtb25kJzonXFx1MjJDNCcsJ2RpYW1vbmRzdWl0JzonXFx1MjY2NicsJ2RpYW1zJzonXFx1MjY2NicsJ2RpZSc6J1xceEE4JywnRGlmZmVyZW50aWFsRCc6J1xcdTIxNDYnLCdkaWdhbW1hJzonXFx1MDNERCcsJ2Rpc2luJzonXFx1MjJGMicsJ2Rpdic6J1xceEY3JywnZGl2aWRlJzonXFx4RjcnLCdkaXZpZGVvbnRpbWVzJzonXFx1MjJDNycsJ2Rpdm9ueCc6J1xcdTIyQzcnLCdkamN5JzonXFx1MDQ1MicsJ0RKY3knOidcXHUwNDAyJywnZGxjb3JuJzonXFx1MjMxRScsJ2RsY3JvcCc6J1xcdTIzMEQnLCdkb2xsYXInOickJywnZG9wZic6J1xcdUQ4MzVcXHVERDU1JywnRG9wZic6J1xcdUQ4MzVcXHVERDNCJywnZG90JzonXFx1MDJEOScsJ0RvdCc6J1xceEE4JywnRG90RG90JzonXFx1MjBEQycsJ2RvdGVxJzonXFx1MjI1MCcsJ2RvdGVxZG90JzonXFx1MjI1MScsJ0RvdEVxdWFsJzonXFx1MjI1MCcsJ2RvdG1pbnVzJzonXFx1MjIzOCcsJ2RvdHBsdXMnOidcXHUyMjE0JywnZG90c3F1YXJlJzonXFx1MjJBMScsJ2RvdWJsZWJhcndlZGdlJzonXFx1MjMwNicsJ0RvdWJsZUNvbnRvdXJJbnRlZ3JhbCc6J1xcdTIyMkYnLCdEb3VibGVEb3QnOidcXHhBOCcsJ0RvdWJsZURvd25BcnJvdyc6J1xcdTIxRDMnLCdEb3VibGVMZWZ0QXJyb3cnOidcXHUyMUQwJywnRG91YmxlTGVmdFJpZ2h0QXJyb3cnOidcXHUyMUQ0JywnRG91YmxlTGVmdFRlZSc6J1xcdTJBRTQnLCdEb3VibGVMb25nTGVmdEFycm93JzonXFx1MjdGOCcsJ0RvdWJsZUxvbmdMZWZ0UmlnaHRBcnJvdyc6J1xcdTI3RkEnLCdEb3VibGVMb25nUmlnaHRBcnJvdyc6J1xcdTI3RjknLCdEb3VibGVSaWdodEFycm93JzonXFx1MjFEMicsJ0RvdWJsZVJpZ2h0VGVlJzonXFx1MjJBOCcsJ0RvdWJsZVVwQXJyb3cnOidcXHUyMUQxJywnRG91YmxlVXBEb3duQXJyb3cnOidcXHUyMUQ1JywnRG91YmxlVmVydGljYWxCYXInOidcXHUyMjI1JywnZG93bmFycm93JzonXFx1MjE5MycsJ0Rvd25hcnJvdyc6J1xcdTIxRDMnLCdEb3duQXJyb3cnOidcXHUyMTkzJywnRG93bkFycm93QmFyJzonXFx1MjkxMycsJ0Rvd25BcnJvd1VwQXJyb3cnOidcXHUyMUY1JywnRG93bkJyZXZlJzonXFx1MDMxMScsJ2Rvd25kb3duYXJyb3dzJzonXFx1MjFDQScsJ2Rvd25oYXJwb29ubGVmdCc6J1xcdTIxQzMnLCdkb3duaGFycG9vbnJpZ2h0JzonXFx1MjFDMicsJ0Rvd25MZWZ0UmlnaHRWZWN0b3InOidcXHUyOTUwJywnRG93bkxlZnRUZWVWZWN0b3InOidcXHUyOTVFJywnRG93bkxlZnRWZWN0b3InOidcXHUyMUJEJywnRG93bkxlZnRWZWN0b3JCYXInOidcXHUyOTU2JywnRG93blJpZ2h0VGVlVmVjdG9yJzonXFx1Mjk1RicsJ0Rvd25SaWdodFZlY3Rvcic6J1xcdTIxQzEnLCdEb3duUmlnaHRWZWN0b3JCYXInOidcXHUyOTU3JywnRG93blRlZSc6J1xcdTIyQTQnLCdEb3duVGVlQXJyb3cnOidcXHUyMUE3JywnZHJia2Fyb3cnOidcXHUyOTEwJywnZHJjb3JuJzonXFx1MjMxRicsJ2RyY3JvcCc6J1xcdTIzMEMnLCdkc2NyJzonXFx1RDgzNVxcdURDQjknLCdEc2NyJzonXFx1RDgzNVxcdURDOUYnLCdkc2N5JzonXFx1MDQ1NScsJ0RTY3knOidcXHUwNDA1JywnZHNvbCc6J1xcdTI5RjYnLCdkc3Ryb2snOidcXHUwMTExJywnRHN0cm9rJzonXFx1MDExMCcsJ2R0ZG90JzonXFx1MjJGMScsJ2R0cmknOidcXHUyNUJGJywnZHRyaWYnOidcXHUyNUJFJywnZHVhcnInOidcXHUyMUY1JywnZHVoYXInOidcXHUyOTZGJywnZHdhbmdsZSc6J1xcdTI5QTYnLCdkemN5JzonXFx1MDQ1RicsJ0RaY3knOidcXHUwNDBGJywnZHppZ3JhcnInOidcXHUyN0ZGJywnZWFjdXRlJzonXFx4RTknLCdFYWN1dGUnOidcXHhDOScsJ2Vhc3Rlcic6J1xcdTJBNkUnLCdlY2Fyb24nOidcXHUwMTFCJywnRWNhcm9uJzonXFx1MDExQScsJ2VjaXInOidcXHUyMjU2JywnZWNpcmMnOidcXHhFQScsJ0VjaXJjJzonXFx4Q0EnLCdlY29sb24nOidcXHUyMjU1JywnZWN5JzonXFx1MDQ0RCcsJ0VjeSc6J1xcdTA0MkQnLCdlRERvdCc6J1xcdTJBNzcnLCdlZG90JzonXFx1MDExNycsJ2VEb3QnOidcXHUyMjUxJywnRWRvdCc6J1xcdTAxMTYnLCdlZSc6J1xcdTIxNDcnLCdlZkRvdCc6J1xcdTIyNTInLCdlZnInOidcXHVEODM1XFx1REQyMicsJ0Vmcic6J1xcdUQ4MzVcXHVERDA4JywnZWcnOidcXHUyQTlBJywnZWdyYXZlJzonXFx4RTgnLCdFZ3JhdmUnOidcXHhDOCcsJ2Vncyc6J1xcdTJBOTYnLCdlZ3Nkb3QnOidcXHUyQTk4JywnZWwnOidcXHUyQTk5JywnRWxlbWVudCc6J1xcdTIyMDgnLCdlbGludGVycyc6J1xcdTIzRTcnLCdlbGwnOidcXHUyMTEzJywnZWxzJzonXFx1MkE5NScsJ2Vsc2RvdCc6J1xcdTJBOTcnLCdlbWFjcic6J1xcdTAxMTMnLCdFbWFjcic6J1xcdTAxMTInLCdlbXB0eSc6J1xcdTIyMDUnLCdlbXB0eXNldCc6J1xcdTIyMDUnLCdFbXB0eVNtYWxsU3F1YXJlJzonXFx1MjVGQicsJ2VtcHR5dic6J1xcdTIyMDUnLCdFbXB0eVZlcnlTbWFsbFNxdWFyZSc6J1xcdTI1QUInLCdlbXNwJzonXFx1MjAwMycsJ2Vtc3AxMyc6J1xcdTIwMDQnLCdlbXNwMTQnOidcXHUyMDA1JywnZW5nJzonXFx1MDE0QicsJ0VORyc6J1xcdTAxNEEnLCdlbnNwJzonXFx1MjAwMicsJ2VvZ29uJzonXFx1MDExOScsJ0VvZ29uJzonXFx1MDExOCcsJ2VvcGYnOidcXHVEODM1XFx1REQ1NicsJ0VvcGYnOidcXHVEODM1XFx1REQzQycsJ2VwYXInOidcXHUyMkQ1JywnZXBhcnNsJzonXFx1MjlFMycsJ2VwbHVzJzonXFx1MkE3MScsJ2Vwc2knOidcXHUwM0I1JywnZXBzaWxvbic6J1xcdTAzQjUnLCdFcHNpbG9uJzonXFx1MDM5NScsJ2Vwc2l2JzonXFx1MDNGNScsJ2VxY2lyYyc6J1xcdTIyNTYnLCdlcWNvbG9uJzonXFx1MjI1NScsJ2Vxc2ltJzonXFx1MjI0MicsJ2Vxc2xhbnRndHInOidcXHUyQTk2JywnZXFzbGFudGxlc3MnOidcXHUyQTk1JywnRXF1YWwnOidcXHUyQTc1JywnZXF1YWxzJzonPScsJ0VxdWFsVGlsZGUnOidcXHUyMjQyJywnZXF1ZXN0JzonXFx1MjI1RicsJ0VxdWlsaWJyaXVtJzonXFx1MjFDQycsJ2VxdWl2JzonXFx1MjI2MScsJ2VxdWl2REQnOidcXHUyQTc4JywnZXF2cGFyc2wnOidcXHUyOUU1JywnZXJhcnInOidcXHUyOTcxJywnZXJEb3QnOidcXHUyMjUzJywnZXNjcic6J1xcdTIxMkYnLCdFc2NyJzonXFx1MjEzMCcsJ2VzZG90JzonXFx1MjI1MCcsJ2VzaW0nOidcXHUyMjQyJywnRXNpbSc6J1xcdTJBNzMnLCdldGEnOidcXHUwM0I3JywnRXRhJzonXFx1MDM5NycsJ2V0aCc6J1xceEYwJywnRVRIJzonXFx4RDAnLCdldW1sJzonXFx4RUInLCdFdW1sJzonXFx4Q0InLCdldXJvJzonXFx1MjBBQycsJ2V4Y2wnOichJywnZXhpc3QnOidcXHUyMjAzJywnRXhpc3RzJzonXFx1MjIwMycsJ2V4cGVjdGF0aW9uJzonXFx1MjEzMCcsJ2V4cG9uZW50aWFsZSc6J1xcdTIxNDcnLCdFeHBvbmVudGlhbEUnOidcXHUyMTQ3JywnZmFsbGluZ2RvdHNlcSc6J1xcdTIyNTInLCdmY3knOidcXHUwNDQ0JywnRmN5JzonXFx1MDQyNCcsJ2ZlbWFsZSc6J1xcdTI2NDAnLCdmZmlsaWcnOidcXHVGQjAzJywnZmZsaWcnOidcXHVGQjAwJywnZmZsbGlnJzonXFx1RkIwNCcsJ2Zmcic6J1xcdUQ4MzVcXHVERDIzJywnRmZyJzonXFx1RDgzNVxcdUREMDknLCdmaWxpZyc6J1xcdUZCMDEnLCdGaWxsZWRTbWFsbFNxdWFyZSc6J1xcdTI1RkMnLCdGaWxsZWRWZXJ5U21hbGxTcXVhcmUnOidcXHUyNUFBJywnZmpsaWcnOidmaicsJ2ZsYXQnOidcXHUyNjZEJywnZmxsaWcnOidcXHVGQjAyJywnZmx0bnMnOidcXHUyNUIxJywnZm5vZic6J1xcdTAxOTInLCdmb3BmJzonXFx1RDgzNVxcdURENTcnLCdGb3BmJzonXFx1RDgzNVxcdUREM0QnLCdmb3JhbGwnOidcXHUyMjAwJywnRm9yQWxsJzonXFx1MjIwMCcsJ2ZvcmsnOidcXHUyMkQ0JywnZm9ya3YnOidcXHUyQUQ5JywnRm91cmllcnRyZic6J1xcdTIxMzEnLCdmcGFydGludCc6J1xcdTJBMEQnLCdmcmFjMTInOidcXHhCRCcsJ2ZyYWMxMyc6J1xcdTIxNTMnLCdmcmFjMTQnOidcXHhCQycsJ2ZyYWMxNSc6J1xcdTIxNTUnLCdmcmFjMTYnOidcXHUyMTU5JywnZnJhYzE4JzonXFx1MjE1QicsJ2ZyYWMyMyc6J1xcdTIxNTQnLCdmcmFjMjUnOidcXHUyMTU2JywnZnJhYzM0JzonXFx4QkUnLCdmcmFjMzUnOidcXHUyMTU3JywnZnJhYzM4JzonXFx1MjE1QycsJ2ZyYWM0NSc6J1xcdTIxNTgnLCdmcmFjNTYnOidcXHUyMTVBJywnZnJhYzU4JzonXFx1MjE1RCcsJ2ZyYWM3OCc6J1xcdTIxNUUnLCdmcmFzbCc6J1xcdTIwNDQnLCdmcm93bic6J1xcdTIzMjInLCdmc2NyJzonXFx1RDgzNVxcdURDQkInLCdGc2NyJzonXFx1MjEzMScsJ2dhY3V0ZSc6J1xcdTAxRjUnLCdnYW1tYSc6J1xcdTAzQjMnLCdHYW1tYSc6J1xcdTAzOTMnLCdnYW1tYWQnOidcXHUwM0REJywnR2FtbWFkJzonXFx1MDNEQycsJ2dhcCc6J1xcdTJBODYnLCdnYnJldmUnOidcXHUwMTFGJywnR2JyZXZlJzonXFx1MDExRScsJ0djZWRpbCc6J1xcdTAxMjInLCdnY2lyYyc6J1xcdTAxMUQnLCdHY2lyYyc6J1xcdTAxMUMnLCdnY3knOidcXHUwNDMzJywnR2N5JzonXFx1MDQxMycsJ2dkb3QnOidcXHUwMTIxJywnR2RvdCc6J1xcdTAxMjAnLCdnZSc6J1xcdTIyNjUnLCdnRSc6J1xcdTIyNjcnLCdnZWwnOidcXHUyMkRCJywnZ0VsJzonXFx1MkE4QycsJ2dlcSc6J1xcdTIyNjUnLCdnZXFxJzonXFx1MjI2NycsJ2dlcXNsYW50JzonXFx1MkE3RScsJ2dlcyc6J1xcdTJBN0UnLCdnZXNjYyc6J1xcdTJBQTknLCdnZXNkb3QnOidcXHUyQTgwJywnZ2VzZG90byc6J1xcdTJBODInLCdnZXNkb3RvbCc6J1xcdTJBODQnLCdnZXNsJzonXFx1MjJEQlxcdUZFMDAnLCdnZXNsZXMnOidcXHUyQTk0JywnZ2ZyJzonXFx1RDgzNVxcdUREMjQnLCdHZnInOidcXHVEODM1XFx1REQwQScsJ2dnJzonXFx1MjI2QicsJ0dnJzonXFx1MjJEOScsJ2dnZyc6J1xcdTIyRDknLCdnaW1lbCc6J1xcdTIxMzcnLCdnamN5JzonXFx1MDQ1MycsJ0dKY3knOidcXHUwNDAzJywnZ2wnOidcXHUyMjc3JywnZ2xhJzonXFx1MkFBNScsJ2dsRSc6J1xcdTJBOTInLCdnbGonOidcXHUyQUE0JywnZ25hcCc6J1xcdTJBOEEnLCdnbmFwcHJveCc6J1xcdTJBOEEnLCdnbmUnOidcXHUyQTg4JywnZ25FJzonXFx1MjI2OScsJ2duZXEnOidcXHUyQTg4JywnZ25lcXEnOidcXHUyMjY5JywnZ25zaW0nOidcXHUyMkU3JywnZ29wZic6J1xcdUQ4MzVcXHVERDU4JywnR29wZic6J1xcdUQ4MzVcXHVERDNFJywnZ3JhdmUnOidgJywnR3JlYXRlckVxdWFsJzonXFx1MjI2NScsJ0dyZWF0ZXJFcXVhbExlc3MnOidcXHUyMkRCJywnR3JlYXRlckZ1bGxFcXVhbCc6J1xcdTIyNjcnLCdHcmVhdGVyR3JlYXRlcic6J1xcdTJBQTInLCdHcmVhdGVyTGVzcyc6J1xcdTIyNzcnLCdHcmVhdGVyU2xhbnRFcXVhbCc6J1xcdTJBN0UnLCdHcmVhdGVyVGlsZGUnOidcXHUyMjczJywnZ3Njcic6J1xcdTIxMEEnLCdHc2NyJzonXFx1RDgzNVxcdURDQTInLCdnc2ltJzonXFx1MjI3MycsJ2dzaW1lJzonXFx1MkE4RScsJ2dzaW1sJzonXFx1MkE5MCcsJ2d0JzonPicsJ0d0JzonXFx1MjI2QicsJ0dUJzonPicsJ2d0Y2MnOidcXHUyQUE3JywnZ3RjaXInOidcXHUyQTdBJywnZ3Rkb3QnOidcXHUyMkQ3JywnZ3RsUGFyJzonXFx1Mjk5NScsJ2d0cXVlc3QnOidcXHUyQTdDJywnZ3RyYXBwcm94JzonXFx1MkE4NicsJ2d0cmFycic6J1xcdTI5NzgnLCdndHJkb3QnOidcXHUyMkQ3JywnZ3RyZXFsZXNzJzonXFx1MjJEQicsJ2d0cmVxcWxlc3MnOidcXHUyQThDJywnZ3RybGVzcyc6J1xcdTIyNzcnLCdndHJzaW0nOidcXHUyMjczJywnZ3ZlcnRuZXFxJzonXFx1MjI2OVxcdUZFMDAnLCdndm5FJzonXFx1MjI2OVxcdUZFMDAnLCdIYWNlayc6J1xcdTAyQzcnLCdoYWlyc3AnOidcXHUyMDBBJywnaGFsZic6J1xceEJEJywnaGFtaWx0JzonXFx1MjEwQicsJ2hhcmRjeSc6J1xcdTA0NEEnLCdIQVJEY3knOidcXHUwNDJBJywnaGFycic6J1xcdTIxOTQnLCdoQXJyJzonXFx1MjFENCcsJ2hhcnJjaXInOidcXHUyOTQ4JywnaGFycncnOidcXHUyMUFEJywnSGF0JzonXicsJ2hiYXInOidcXHUyMTBGJywnaGNpcmMnOidcXHUwMTI1JywnSGNpcmMnOidcXHUwMTI0JywnaGVhcnRzJzonXFx1MjY2NScsJ2hlYXJ0c3VpdCc6J1xcdTI2NjUnLCdoZWxsaXAnOidcXHUyMDI2JywnaGVyY29uJzonXFx1MjJCOScsJ2hmcic6J1xcdUQ4MzVcXHVERDI1JywnSGZyJzonXFx1MjEwQycsJ0hpbGJlcnRTcGFjZSc6J1xcdTIxMEInLCdoa3NlYXJvdyc6J1xcdTI5MjUnLCdoa3N3YXJvdyc6J1xcdTI5MjYnLCdob2Fycic6J1xcdTIxRkYnLCdob210aHQnOidcXHUyMjNCJywnaG9va2xlZnRhcnJvdyc6J1xcdTIxQTknLCdob29rcmlnaHRhcnJvdyc6J1xcdTIxQUEnLCdob3BmJzonXFx1RDgzNVxcdURENTknLCdIb3BmJzonXFx1MjEwRCcsJ2hvcmJhcic6J1xcdTIwMTUnLCdIb3Jpem9udGFsTGluZSc6J1xcdTI1MDAnLCdoc2NyJzonXFx1RDgzNVxcdURDQkQnLCdIc2NyJzonXFx1MjEwQicsJ2hzbGFzaCc6J1xcdTIxMEYnLCdoc3Ryb2snOidcXHUwMTI3JywnSHN0cm9rJzonXFx1MDEyNicsJ0h1bXBEb3duSHVtcCc6J1xcdTIyNEUnLCdIdW1wRXF1YWwnOidcXHUyMjRGJywnaHlidWxsJzonXFx1MjA0MycsJ2h5cGhlbic6J1xcdTIwMTAnLCdpYWN1dGUnOidcXHhFRCcsJ0lhY3V0ZSc6J1xceENEJywnaWMnOidcXHUyMDYzJywnaWNpcmMnOidcXHhFRScsJ0ljaXJjJzonXFx4Q0UnLCdpY3knOidcXHUwNDM4JywnSWN5JzonXFx1MDQxOCcsJ0lkb3QnOidcXHUwMTMwJywnaWVjeSc6J1xcdTA0MzUnLCdJRWN5JzonXFx1MDQxNScsJ2lleGNsJzonXFx4QTEnLCdpZmYnOidcXHUyMUQ0JywnaWZyJzonXFx1RDgzNVxcdUREMjYnLCdJZnInOidcXHUyMTExJywnaWdyYXZlJzonXFx4RUMnLCdJZ3JhdmUnOidcXHhDQycsJ2lpJzonXFx1MjE0OCcsJ2lpaWludCc6J1xcdTJBMEMnLCdpaWludCc6J1xcdTIyMkQnLCdpaW5maW4nOidcXHUyOURDJywnaWlvdGEnOidcXHUyMTI5JywnaWpsaWcnOidcXHUwMTMzJywnSUpsaWcnOidcXHUwMTMyJywnSW0nOidcXHUyMTExJywnaW1hY3InOidcXHUwMTJCJywnSW1hY3InOidcXHUwMTJBJywnaW1hZ2UnOidcXHUyMTExJywnSW1hZ2luYXJ5SSc6J1xcdTIxNDgnLCdpbWFnbGluZSc6J1xcdTIxMTAnLCdpbWFncGFydCc6J1xcdTIxMTEnLCdpbWF0aCc6J1xcdTAxMzEnLCdpbW9mJzonXFx1MjJCNycsJ2ltcGVkJzonXFx1MDFCNScsJ0ltcGxpZXMnOidcXHUyMUQyJywnaW4nOidcXHUyMjA4JywnaW5jYXJlJzonXFx1MjEwNScsJ2luZmluJzonXFx1MjIxRScsJ2luZmludGllJzonXFx1MjlERCcsJ2lub2RvdCc6J1xcdTAxMzEnLCdpbnQnOidcXHUyMjJCJywnSW50JzonXFx1MjIyQycsJ2ludGNhbCc6J1xcdTIyQkEnLCdpbnRlZ2Vycyc6J1xcdTIxMjQnLCdJbnRlZ3JhbCc6J1xcdTIyMkInLCdpbnRlcmNhbCc6J1xcdTIyQkEnLCdJbnRlcnNlY3Rpb24nOidcXHUyMkMyJywnaW50bGFyaGsnOidcXHUyQTE3JywnaW50cHJvZCc6J1xcdTJBM0MnLCdJbnZpc2libGVDb21tYSc6J1xcdTIwNjMnLCdJbnZpc2libGVUaW1lcyc6J1xcdTIwNjInLCdpb2N5JzonXFx1MDQ1MScsJ0lPY3knOidcXHUwNDAxJywnaW9nb24nOidcXHUwMTJGJywnSW9nb24nOidcXHUwMTJFJywnaW9wZic6J1xcdUQ4MzVcXHVERDVBJywnSW9wZic6J1xcdUQ4MzVcXHVERDQwJywnaW90YSc6J1xcdTAzQjknLCdJb3RhJzonXFx1MDM5OScsJ2lwcm9kJzonXFx1MkEzQycsJ2lxdWVzdCc6J1xceEJGJywnaXNjcic6J1xcdUQ4MzVcXHVEQ0JFJywnSXNjcic6J1xcdTIxMTAnLCdpc2luJzonXFx1MjIwOCcsJ2lzaW5kb3QnOidcXHUyMkY1JywnaXNpbkUnOidcXHUyMkY5JywnaXNpbnMnOidcXHUyMkY0JywnaXNpbnN2JzonXFx1MjJGMycsJ2lzaW52JzonXFx1MjIwOCcsJ2l0JzonXFx1MjA2MicsJ2l0aWxkZSc6J1xcdTAxMjknLCdJdGlsZGUnOidcXHUwMTI4JywnaXVrY3knOidcXHUwNDU2JywnSXVrY3knOidcXHUwNDA2JywnaXVtbCc6J1xceEVGJywnSXVtbCc6J1xceENGJywnamNpcmMnOidcXHUwMTM1JywnSmNpcmMnOidcXHUwMTM0JywnamN5JzonXFx1MDQzOScsJ0pjeSc6J1xcdTA0MTknLCdqZnInOidcXHVEODM1XFx1REQyNycsJ0pmcic6J1xcdUQ4MzVcXHVERDBEJywnam1hdGgnOidcXHUwMjM3Jywnam9wZic6J1xcdUQ4MzVcXHVERDVCJywnSm9wZic6J1xcdUQ4MzVcXHVERDQxJywnanNjcic6J1xcdUQ4MzVcXHVEQ0JGJywnSnNjcic6J1xcdUQ4MzVcXHVEQ0E1JywnanNlcmN5JzonXFx1MDQ1OCcsJ0pzZXJjeSc6J1xcdTA0MDgnLCdqdWtjeSc6J1xcdTA0NTQnLCdKdWtjeSc6J1xcdTA0MDQnLCdrYXBwYSc6J1xcdTAzQkEnLCdLYXBwYSc6J1xcdTAzOUEnLCdrYXBwYXYnOidcXHUwM0YwJywna2NlZGlsJzonXFx1MDEzNycsJ0tjZWRpbCc6J1xcdTAxMzYnLCdrY3knOidcXHUwNDNBJywnS2N5JzonXFx1MDQxQScsJ2tmcic6J1xcdUQ4MzVcXHVERDI4JywnS2ZyJzonXFx1RDgzNVxcdUREMEUnLCdrZ3JlZW4nOidcXHUwMTM4Jywna2hjeSc6J1xcdTA0NDUnLCdLSGN5JzonXFx1MDQyNScsJ2tqY3knOidcXHUwNDVDJywnS0pjeSc6J1xcdTA0MEMnLCdrb3BmJzonXFx1RDgzNVxcdURENUMnLCdLb3BmJzonXFx1RDgzNVxcdURENDInLCdrc2NyJzonXFx1RDgzNVxcdURDQzAnLCdLc2NyJzonXFx1RDgzNVxcdURDQTYnLCdsQWFycic6J1xcdTIxREEnLCdsYWN1dGUnOidcXHUwMTNBJywnTGFjdXRlJzonXFx1MDEzOScsJ2xhZW1wdHl2JzonXFx1MjlCNCcsJ2xhZ3Jhbic6J1xcdTIxMTInLCdsYW1iZGEnOidcXHUwM0JCJywnTGFtYmRhJzonXFx1MDM5QicsJ2xhbmcnOidcXHUyN0U4JywnTGFuZyc6J1xcdTI3RUEnLCdsYW5nZCc6J1xcdTI5OTEnLCdsYW5nbGUnOidcXHUyN0U4JywnbGFwJzonXFx1MkE4NScsJ0xhcGxhY2V0cmYnOidcXHUyMTEyJywnbGFxdW8nOidcXHhBQicsJ2xhcnInOidcXHUyMTkwJywnbEFycic6J1xcdTIxRDAnLCdMYXJyJzonXFx1MjE5RScsJ2xhcnJiJzonXFx1MjFFNCcsJ2xhcnJiZnMnOidcXHUyOTFGJywnbGFycmZzJzonXFx1MjkxRCcsJ2xhcnJoayc6J1xcdTIxQTknLCdsYXJybHAnOidcXHUyMUFCJywnbGFycnBsJzonXFx1MjkzOScsJ2xhcnJzaW0nOidcXHUyOTczJywnbGFycnRsJzonXFx1MjFBMicsJ2xhdCc6J1xcdTJBQUInLCdsYXRhaWwnOidcXHUyOTE5JywnbEF0YWlsJzonXFx1MjkxQicsJ2xhdGUnOidcXHUyQUFEJywnbGF0ZXMnOidcXHUyQUFEXFx1RkUwMCcsJ2xiYXJyJzonXFx1MjkwQycsJ2xCYXJyJzonXFx1MjkwRScsJ2xiYnJrJzonXFx1Mjc3MicsJ2xicmFjZSc6J3snLCdsYnJhY2snOidbJywnbGJya2UnOidcXHUyOThCJywnbGJya3NsZCc6J1xcdTI5OEYnLCdsYnJrc2x1JzonXFx1Mjk4RCcsJ2xjYXJvbic6J1xcdTAxM0UnLCdMY2Fyb24nOidcXHUwMTNEJywnbGNlZGlsJzonXFx1MDEzQycsJ0xjZWRpbCc6J1xcdTAxM0InLCdsY2VpbCc6J1xcdTIzMDgnLCdsY3ViJzoneycsJ2xjeSc6J1xcdTA0M0InLCdMY3knOidcXHUwNDFCJywnbGRjYSc6J1xcdTI5MzYnLCdsZHF1byc6J1xcdTIwMUMnLCdsZHF1b3InOidcXHUyMDFFJywnbGRyZGhhcic6J1xcdTI5NjcnLCdsZHJ1c2hhcic6J1xcdTI5NEInLCdsZHNoJzonXFx1MjFCMicsJ2xlJzonXFx1MjI2NCcsJ2xFJzonXFx1MjI2NicsJ0xlZnRBbmdsZUJyYWNrZXQnOidcXHUyN0U4JywnbGVmdGFycm93JzonXFx1MjE5MCcsJ0xlZnRhcnJvdyc6J1xcdTIxRDAnLCdMZWZ0QXJyb3cnOidcXHUyMTkwJywnTGVmdEFycm93QmFyJzonXFx1MjFFNCcsJ0xlZnRBcnJvd1JpZ2h0QXJyb3cnOidcXHUyMUM2JywnbGVmdGFycm93dGFpbCc6J1xcdTIxQTInLCdMZWZ0Q2VpbGluZyc6J1xcdTIzMDgnLCdMZWZ0RG91YmxlQnJhY2tldCc6J1xcdTI3RTYnLCdMZWZ0RG93blRlZVZlY3Rvcic6J1xcdTI5NjEnLCdMZWZ0RG93blZlY3Rvcic6J1xcdTIxQzMnLCdMZWZ0RG93blZlY3RvckJhcic6J1xcdTI5NTknLCdMZWZ0Rmxvb3InOidcXHUyMzBBJywnbGVmdGhhcnBvb25kb3duJzonXFx1MjFCRCcsJ2xlZnRoYXJwb29udXAnOidcXHUyMUJDJywnbGVmdGxlZnRhcnJvd3MnOidcXHUyMUM3JywnbGVmdHJpZ2h0YXJyb3cnOidcXHUyMTk0JywnTGVmdHJpZ2h0YXJyb3cnOidcXHUyMUQ0JywnTGVmdFJpZ2h0QXJyb3cnOidcXHUyMTk0JywnbGVmdHJpZ2h0YXJyb3dzJzonXFx1MjFDNicsJ2xlZnRyaWdodGhhcnBvb25zJzonXFx1MjFDQicsJ2xlZnRyaWdodHNxdWlnYXJyb3cnOidcXHUyMUFEJywnTGVmdFJpZ2h0VmVjdG9yJzonXFx1Mjk0RScsJ0xlZnRUZWUnOidcXHUyMkEzJywnTGVmdFRlZUFycm93JzonXFx1MjFBNCcsJ0xlZnRUZWVWZWN0b3InOidcXHUyOTVBJywnbGVmdHRocmVldGltZXMnOidcXHUyMkNCJywnTGVmdFRyaWFuZ2xlJzonXFx1MjJCMicsJ0xlZnRUcmlhbmdsZUJhcic6J1xcdTI5Q0YnLCdMZWZ0VHJpYW5nbGVFcXVhbCc6J1xcdTIyQjQnLCdMZWZ0VXBEb3duVmVjdG9yJzonXFx1Mjk1MScsJ0xlZnRVcFRlZVZlY3Rvcic6J1xcdTI5NjAnLCdMZWZ0VXBWZWN0b3InOidcXHUyMUJGJywnTGVmdFVwVmVjdG9yQmFyJzonXFx1Mjk1OCcsJ0xlZnRWZWN0b3InOidcXHUyMUJDJywnTGVmdFZlY3RvckJhcic6J1xcdTI5NTInLCdsZWcnOidcXHUyMkRBJywnbEVnJzonXFx1MkE4QicsJ2xlcSc6J1xcdTIyNjQnLCdsZXFxJzonXFx1MjI2NicsJ2xlcXNsYW50JzonXFx1MkE3RCcsJ2xlcyc6J1xcdTJBN0QnLCdsZXNjYyc6J1xcdTJBQTgnLCdsZXNkb3QnOidcXHUyQTdGJywnbGVzZG90byc6J1xcdTJBODEnLCdsZXNkb3Rvcic6J1xcdTJBODMnLCdsZXNnJzonXFx1MjJEQVxcdUZFMDAnLCdsZXNnZXMnOidcXHUyQTkzJywnbGVzc2FwcHJveCc6J1xcdTJBODUnLCdsZXNzZG90JzonXFx1MjJENicsJ2xlc3NlcWd0cic6J1xcdTIyREEnLCdsZXNzZXFxZ3RyJzonXFx1MkE4QicsJ0xlc3NFcXVhbEdyZWF0ZXInOidcXHUyMkRBJywnTGVzc0Z1bGxFcXVhbCc6J1xcdTIyNjYnLCdMZXNzR3JlYXRlcic6J1xcdTIyNzYnLCdsZXNzZ3RyJzonXFx1MjI3NicsJ0xlc3NMZXNzJzonXFx1MkFBMScsJ2xlc3NzaW0nOidcXHUyMjcyJywnTGVzc1NsYW50RXF1YWwnOidcXHUyQTdEJywnTGVzc1RpbGRlJzonXFx1MjI3MicsJ2xmaXNodCc6J1xcdTI5N0MnLCdsZmxvb3InOidcXHUyMzBBJywnbGZyJzonXFx1RDgzNVxcdUREMjknLCdMZnInOidcXHVEODM1XFx1REQwRicsJ2xnJzonXFx1MjI3NicsJ2xnRSc6J1xcdTJBOTEnLCdsSGFyJzonXFx1Mjk2MicsJ2xoYXJkJzonXFx1MjFCRCcsJ2xoYXJ1JzonXFx1MjFCQycsJ2xoYXJ1bCc6J1xcdTI5NkEnLCdsaGJsayc6J1xcdTI1ODQnLCdsamN5JzonXFx1MDQ1OScsJ0xKY3knOidcXHUwNDA5JywnbGwnOidcXHUyMjZBJywnTGwnOidcXHUyMkQ4JywnbGxhcnInOidcXHUyMUM3JywnbGxjb3JuZXInOidcXHUyMzFFJywnTGxlZnRhcnJvdyc6J1xcdTIxREEnLCdsbGhhcmQnOidcXHUyOTZCJywnbGx0cmknOidcXHUyNUZBJywnbG1pZG90JzonXFx1MDE0MCcsJ0xtaWRvdCc6J1xcdTAxM0YnLCdsbW91c3QnOidcXHUyM0IwJywnbG1vdXN0YWNoZSc6J1xcdTIzQjAnLCdsbmFwJzonXFx1MkE4OScsJ2xuYXBwcm94JzonXFx1MkE4OScsJ2xuZSc6J1xcdTJBODcnLCdsbkUnOidcXHUyMjY4JywnbG5lcSc6J1xcdTJBODcnLCdsbmVxcSc6J1xcdTIyNjgnLCdsbnNpbSc6J1xcdTIyRTYnLCdsb2FuZyc6J1xcdTI3RUMnLCdsb2Fycic6J1xcdTIxRkQnLCdsb2Jyayc6J1xcdTI3RTYnLCdsb25nbGVmdGFycm93JzonXFx1MjdGNScsJ0xvbmdsZWZ0YXJyb3cnOidcXHUyN0Y4JywnTG9uZ0xlZnRBcnJvdyc6J1xcdTI3RjUnLCdsb25nbGVmdHJpZ2h0YXJyb3cnOidcXHUyN0Y3JywnTG9uZ2xlZnRyaWdodGFycm93JzonXFx1MjdGQScsJ0xvbmdMZWZ0UmlnaHRBcnJvdyc6J1xcdTI3RjcnLCdsb25nbWFwc3RvJzonXFx1MjdGQycsJ2xvbmdyaWdodGFycm93JzonXFx1MjdGNicsJ0xvbmdyaWdodGFycm93JzonXFx1MjdGOScsJ0xvbmdSaWdodEFycm93JzonXFx1MjdGNicsJ2xvb3BhcnJvd2xlZnQnOidcXHUyMUFCJywnbG9vcGFycm93cmlnaHQnOidcXHUyMUFDJywnbG9wYXInOidcXHUyOTg1JywnbG9wZic6J1xcdUQ4MzVcXHVERDVEJywnTG9wZic6J1xcdUQ4MzVcXHVERDQzJywnbG9wbHVzJzonXFx1MkEyRCcsJ2xvdGltZXMnOidcXHUyQTM0JywnbG93YXN0JzonXFx1MjIxNycsJ2xvd2Jhcic6J18nLCdMb3dlckxlZnRBcnJvdyc6J1xcdTIxOTknLCdMb3dlclJpZ2h0QXJyb3cnOidcXHUyMTk4JywnbG96JzonXFx1MjVDQScsJ2xvemVuZ2UnOidcXHUyNUNBJywnbG96Zic6J1xcdTI5RUInLCdscGFyJzonKCcsJ2xwYXJsdCc6J1xcdTI5OTMnLCdscmFycic6J1xcdTIxQzYnLCdscmNvcm5lcic6J1xcdTIzMUYnLCdscmhhcic6J1xcdTIxQ0InLCdscmhhcmQnOidcXHUyOTZEJywnbHJtJzonXFx1MjAwRScsJ2xydHJpJzonXFx1MjJCRicsJ2xzYXF1byc6J1xcdTIwMzknLCdsc2NyJzonXFx1RDgzNVxcdURDQzEnLCdMc2NyJzonXFx1MjExMicsJ2xzaCc6J1xcdTIxQjAnLCdMc2gnOidcXHUyMUIwJywnbHNpbSc6J1xcdTIyNzInLCdsc2ltZSc6J1xcdTJBOEQnLCdsc2ltZyc6J1xcdTJBOEYnLCdsc3FiJzonWycsJ2xzcXVvJzonXFx1MjAxOCcsJ2xzcXVvcic6J1xcdTIwMUEnLCdsc3Ryb2snOidcXHUwMTQyJywnTHN0cm9rJzonXFx1MDE0MScsJ2x0JzonPCcsJ0x0JzonXFx1MjI2QScsJ0xUJzonPCcsJ2x0Y2MnOidcXHUyQUE2JywnbHRjaXInOidcXHUyQTc5JywnbHRkb3QnOidcXHUyMkQ2JywnbHRocmVlJzonXFx1MjJDQicsJ2x0aW1lcyc6J1xcdTIyQzknLCdsdGxhcnInOidcXHUyOTc2JywnbHRxdWVzdCc6J1xcdTJBN0InLCdsdHJpJzonXFx1MjVDMycsJ2x0cmllJzonXFx1MjJCNCcsJ2x0cmlmJzonXFx1MjVDMicsJ2x0clBhcic6J1xcdTI5OTYnLCdsdXJkc2hhcic6J1xcdTI5NEEnLCdsdXJ1aGFyJzonXFx1Mjk2NicsJ2x2ZXJ0bmVxcSc6J1xcdTIyNjhcXHVGRTAwJywnbHZuRSc6J1xcdTIyNjhcXHVGRTAwJywnbWFjcic6J1xceEFGJywnbWFsZSc6J1xcdTI2NDInLCdtYWx0JzonXFx1MjcyMCcsJ21hbHRlc2UnOidcXHUyNzIwJywnbWFwJzonXFx1MjFBNicsJ01hcCc6J1xcdTI5MDUnLCdtYXBzdG8nOidcXHUyMUE2JywnbWFwc3RvZG93bic6J1xcdTIxQTcnLCdtYXBzdG9sZWZ0JzonXFx1MjFBNCcsJ21hcHN0b3VwJzonXFx1MjFBNScsJ21hcmtlcic6J1xcdTI1QUUnLCdtY29tbWEnOidcXHUyQTI5JywnbWN5JzonXFx1MDQzQycsJ01jeSc6J1xcdTA0MUMnLCdtZGFzaCc6J1xcdTIwMTQnLCdtRERvdCc6J1xcdTIyM0EnLCdtZWFzdXJlZGFuZ2xlJzonXFx1MjIyMScsJ01lZGl1bVNwYWNlJzonXFx1MjA1RicsJ01lbGxpbnRyZic6J1xcdTIxMzMnLCdtZnInOidcXHVEODM1XFx1REQyQScsJ01mcic6J1xcdUQ4MzVcXHVERDEwJywnbWhvJzonXFx1MjEyNycsJ21pY3JvJzonXFx4QjUnLCdtaWQnOidcXHUyMjIzJywnbWlkYXN0JzonKicsJ21pZGNpcic6J1xcdTJBRjAnLCdtaWRkb3QnOidcXHhCNycsJ21pbnVzJzonXFx1MjIxMicsJ21pbnVzYic6J1xcdTIyOUYnLCdtaW51c2QnOidcXHUyMjM4JywnbWludXNkdSc6J1xcdTJBMkEnLCdNaW51c1BsdXMnOidcXHUyMjEzJywnbWxjcCc6J1xcdTJBREInLCdtbGRyJzonXFx1MjAyNicsJ21ucGx1cyc6J1xcdTIyMTMnLCdtb2RlbHMnOidcXHUyMkE3JywnbW9wZic6J1xcdUQ4MzVcXHVERDVFJywnTW9wZic6J1xcdUQ4MzVcXHVERDQ0JywnbXAnOidcXHUyMjEzJywnbXNjcic6J1xcdUQ4MzVcXHVEQ0MyJywnTXNjcic6J1xcdTIxMzMnLCdtc3Rwb3MnOidcXHUyMjNFJywnbXUnOidcXHUwM0JDJywnTXUnOidcXHUwMzlDJywnbXVsdGltYXAnOidcXHUyMkI4JywnbXVtYXAnOidcXHUyMkI4JywnbmFibGEnOidcXHUyMjA3JywnbmFjdXRlJzonXFx1MDE0NCcsJ05hY3V0ZSc6J1xcdTAxNDMnLCduYW5nJzonXFx1MjIyMFxcdTIwRDInLCduYXAnOidcXHUyMjQ5JywnbmFwRSc6J1xcdTJBNzBcXHUwMzM4JywnbmFwaWQnOidcXHUyMjRCXFx1MDMzOCcsJ25hcG9zJzonXFx1MDE0OScsJ25hcHByb3gnOidcXHUyMjQ5JywnbmF0dXInOidcXHUyNjZFJywnbmF0dXJhbCc6J1xcdTI2NkUnLCduYXR1cmFscyc6J1xcdTIxMTUnLCduYnNwJzonXFx4QTAnLCduYnVtcCc6J1xcdTIyNEVcXHUwMzM4JywnbmJ1bXBlJzonXFx1MjI0RlxcdTAzMzgnLCduY2FwJzonXFx1MkE0MycsJ25jYXJvbic6J1xcdTAxNDgnLCdOY2Fyb24nOidcXHUwMTQ3JywnbmNlZGlsJzonXFx1MDE0NicsJ05jZWRpbCc6J1xcdTAxNDUnLCduY29uZyc6J1xcdTIyNDcnLCduY29uZ2RvdCc6J1xcdTJBNkRcXHUwMzM4JywnbmN1cCc6J1xcdTJBNDInLCduY3knOidcXHUwNDNEJywnTmN5JzonXFx1MDQxRCcsJ25kYXNoJzonXFx1MjAxMycsJ25lJzonXFx1MjI2MCcsJ25lYXJoayc6J1xcdTI5MjQnLCduZWFycic6J1xcdTIxOTcnLCduZUFycic6J1xcdTIxRDcnLCduZWFycm93JzonXFx1MjE5NycsJ25lZG90JzonXFx1MjI1MFxcdTAzMzgnLCdOZWdhdGl2ZU1lZGl1bVNwYWNlJzonXFx1MjAwQicsJ05lZ2F0aXZlVGhpY2tTcGFjZSc6J1xcdTIwMEInLCdOZWdhdGl2ZVRoaW5TcGFjZSc6J1xcdTIwMEInLCdOZWdhdGl2ZVZlcnlUaGluU3BhY2UnOidcXHUyMDBCJywnbmVxdWl2JzonXFx1MjI2MicsJ25lc2Vhcic6J1xcdTI5MjgnLCduZXNpbSc6J1xcdTIyNDJcXHUwMzM4JywnTmVzdGVkR3JlYXRlckdyZWF0ZXInOidcXHUyMjZCJywnTmVzdGVkTGVzc0xlc3MnOidcXHUyMjZBJywnTmV3TGluZSc6J1xcbicsJ25leGlzdCc6J1xcdTIyMDQnLCduZXhpc3RzJzonXFx1MjIwNCcsJ25mcic6J1xcdUQ4MzVcXHVERDJCJywnTmZyJzonXFx1RDgzNVxcdUREMTEnLCduZ2UnOidcXHUyMjcxJywnbmdFJzonXFx1MjI2N1xcdTAzMzgnLCduZ2VxJzonXFx1MjI3MScsJ25nZXFxJzonXFx1MjI2N1xcdTAzMzgnLCduZ2Vxc2xhbnQnOidcXHUyQTdFXFx1MDMzOCcsJ25nZXMnOidcXHUyQTdFXFx1MDMzOCcsJ25HZyc6J1xcdTIyRDlcXHUwMzM4JywnbmdzaW0nOidcXHUyMjc1Jywnbmd0JzonXFx1MjI2RicsJ25HdCc6J1xcdTIyNkJcXHUyMEQyJywnbmd0cic6J1xcdTIyNkYnLCduR3R2JzonXFx1MjI2QlxcdTAzMzgnLCduaGFycic6J1xcdTIxQUUnLCduaEFycic6J1xcdTIxQ0UnLCduaHBhcic6J1xcdTJBRjInLCduaSc6J1xcdTIyMEInLCduaXMnOidcXHUyMkZDJywnbmlzZCc6J1xcdTIyRkEnLCduaXYnOidcXHUyMjBCJywnbmpjeSc6J1xcdTA0NUEnLCdOSmN5JzonXFx1MDQwQScsJ25sYXJyJzonXFx1MjE5QScsJ25sQXJyJzonXFx1MjFDRCcsJ25sZHInOidcXHUyMDI1JywnbmxlJzonXFx1MjI3MCcsJ25sRSc6J1xcdTIyNjZcXHUwMzM4JywnbmxlZnRhcnJvdyc6J1xcdTIxOUEnLCduTGVmdGFycm93JzonXFx1MjFDRCcsJ25sZWZ0cmlnaHRhcnJvdyc6J1xcdTIxQUUnLCduTGVmdHJpZ2h0YXJyb3cnOidcXHUyMUNFJywnbmxlcSc6J1xcdTIyNzAnLCdubGVxcSc6J1xcdTIyNjZcXHUwMzM4JywnbmxlcXNsYW50JzonXFx1MkE3RFxcdTAzMzgnLCdubGVzJzonXFx1MkE3RFxcdTAzMzgnLCdubGVzcyc6J1xcdTIyNkUnLCduTGwnOidcXHUyMkQ4XFx1MDMzOCcsJ25sc2ltJzonXFx1MjI3NCcsJ25sdCc6J1xcdTIyNkUnLCduTHQnOidcXHUyMjZBXFx1MjBEMicsJ25sdHJpJzonXFx1MjJFQScsJ25sdHJpZSc6J1xcdTIyRUMnLCduTHR2JzonXFx1MjI2QVxcdTAzMzgnLCdubWlkJzonXFx1MjIyNCcsJ05vQnJlYWsnOidcXHUyMDYwJywnTm9uQnJlYWtpbmdTcGFjZSc6J1xceEEwJywnbm9wZic6J1xcdUQ4MzVcXHVERDVGJywnTm9wZic6J1xcdTIxMTUnLCdub3QnOidcXHhBQycsJ05vdCc6J1xcdTJBRUMnLCdOb3RDb25ncnVlbnQnOidcXHUyMjYyJywnTm90Q3VwQ2FwJzonXFx1MjI2RCcsJ05vdERvdWJsZVZlcnRpY2FsQmFyJzonXFx1MjIyNicsJ05vdEVsZW1lbnQnOidcXHUyMjA5JywnTm90RXF1YWwnOidcXHUyMjYwJywnTm90RXF1YWxUaWxkZSc6J1xcdTIyNDJcXHUwMzM4JywnTm90RXhpc3RzJzonXFx1MjIwNCcsJ05vdEdyZWF0ZXInOidcXHUyMjZGJywnTm90R3JlYXRlckVxdWFsJzonXFx1MjI3MScsJ05vdEdyZWF0ZXJGdWxsRXF1YWwnOidcXHUyMjY3XFx1MDMzOCcsJ05vdEdyZWF0ZXJHcmVhdGVyJzonXFx1MjI2QlxcdTAzMzgnLCdOb3RHcmVhdGVyTGVzcyc6J1xcdTIyNzknLCdOb3RHcmVhdGVyU2xhbnRFcXVhbCc6J1xcdTJBN0VcXHUwMzM4JywnTm90R3JlYXRlclRpbGRlJzonXFx1MjI3NScsJ05vdEh1bXBEb3duSHVtcCc6J1xcdTIyNEVcXHUwMzM4JywnTm90SHVtcEVxdWFsJzonXFx1MjI0RlxcdTAzMzgnLCdub3Rpbic6J1xcdTIyMDknLCdub3RpbmRvdCc6J1xcdTIyRjVcXHUwMzM4Jywnbm90aW5FJzonXFx1MjJGOVxcdTAzMzgnLCdub3RpbnZhJzonXFx1MjIwOScsJ25vdGludmInOidcXHUyMkY3Jywnbm90aW52Yyc6J1xcdTIyRjYnLCdOb3RMZWZ0VHJpYW5nbGUnOidcXHUyMkVBJywnTm90TGVmdFRyaWFuZ2xlQmFyJzonXFx1MjlDRlxcdTAzMzgnLCdOb3RMZWZ0VHJpYW5nbGVFcXVhbCc6J1xcdTIyRUMnLCdOb3RMZXNzJzonXFx1MjI2RScsJ05vdExlc3NFcXVhbCc6J1xcdTIyNzAnLCdOb3RMZXNzR3JlYXRlcic6J1xcdTIyNzgnLCdOb3RMZXNzTGVzcyc6J1xcdTIyNkFcXHUwMzM4JywnTm90TGVzc1NsYW50RXF1YWwnOidcXHUyQTdEXFx1MDMzOCcsJ05vdExlc3NUaWxkZSc6J1xcdTIyNzQnLCdOb3ROZXN0ZWRHcmVhdGVyR3JlYXRlcic6J1xcdTJBQTJcXHUwMzM4JywnTm90TmVzdGVkTGVzc0xlc3MnOidcXHUyQUExXFx1MDMzOCcsJ25vdG5pJzonXFx1MjIwQycsJ25vdG5pdmEnOidcXHUyMjBDJywnbm90bml2Yic6J1xcdTIyRkUnLCdub3RuaXZjJzonXFx1MjJGRCcsJ05vdFByZWNlZGVzJzonXFx1MjI4MCcsJ05vdFByZWNlZGVzRXF1YWwnOidcXHUyQUFGXFx1MDMzOCcsJ05vdFByZWNlZGVzU2xhbnRFcXVhbCc6J1xcdTIyRTAnLCdOb3RSZXZlcnNlRWxlbWVudCc6J1xcdTIyMEMnLCdOb3RSaWdodFRyaWFuZ2xlJzonXFx1MjJFQicsJ05vdFJpZ2h0VHJpYW5nbGVCYXInOidcXHUyOUQwXFx1MDMzOCcsJ05vdFJpZ2h0VHJpYW5nbGVFcXVhbCc6J1xcdTIyRUQnLCdOb3RTcXVhcmVTdWJzZXQnOidcXHUyMjhGXFx1MDMzOCcsJ05vdFNxdWFyZVN1YnNldEVxdWFsJzonXFx1MjJFMicsJ05vdFNxdWFyZVN1cGVyc2V0JzonXFx1MjI5MFxcdTAzMzgnLCdOb3RTcXVhcmVTdXBlcnNldEVxdWFsJzonXFx1MjJFMycsJ05vdFN1YnNldCc6J1xcdTIyODJcXHUyMEQyJywnTm90U3Vic2V0RXF1YWwnOidcXHUyMjg4JywnTm90U3VjY2VlZHMnOidcXHUyMjgxJywnTm90U3VjY2VlZHNFcXVhbCc6J1xcdTJBQjBcXHUwMzM4JywnTm90U3VjY2VlZHNTbGFudEVxdWFsJzonXFx1MjJFMScsJ05vdFN1Y2NlZWRzVGlsZGUnOidcXHUyMjdGXFx1MDMzOCcsJ05vdFN1cGVyc2V0JzonXFx1MjI4M1xcdTIwRDInLCdOb3RTdXBlcnNldEVxdWFsJzonXFx1MjI4OScsJ05vdFRpbGRlJzonXFx1MjI0MScsJ05vdFRpbGRlRXF1YWwnOidcXHUyMjQ0JywnTm90VGlsZGVGdWxsRXF1YWwnOidcXHUyMjQ3JywnTm90VGlsZGVUaWxkZSc6J1xcdTIyNDknLCdOb3RWZXJ0aWNhbEJhcic6J1xcdTIyMjQnLCducGFyJzonXFx1MjIyNicsJ25wYXJhbGxlbCc6J1xcdTIyMjYnLCducGFyc2wnOidcXHUyQUZEXFx1MjBFNScsJ25wYXJ0JzonXFx1MjIwMlxcdTAzMzgnLCducG9saW50JzonXFx1MkExNCcsJ25wcic6J1xcdTIyODAnLCducHJjdWUnOidcXHUyMkUwJywnbnByZSc6J1xcdTJBQUZcXHUwMzM4JywnbnByZWMnOidcXHUyMjgwJywnbnByZWNlcSc6J1xcdTJBQUZcXHUwMzM4JywnbnJhcnInOidcXHUyMTlCJywnbnJBcnInOidcXHUyMUNGJywnbnJhcnJjJzonXFx1MjkzM1xcdTAzMzgnLCducmFycncnOidcXHUyMTlEXFx1MDMzOCcsJ25yaWdodGFycm93JzonXFx1MjE5QicsJ25SaWdodGFycm93JzonXFx1MjFDRicsJ25ydHJpJzonXFx1MjJFQicsJ25ydHJpZSc6J1xcdTIyRUQnLCduc2MnOidcXHUyMjgxJywnbnNjY3VlJzonXFx1MjJFMScsJ25zY2UnOidcXHUyQUIwXFx1MDMzOCcsJ25zY3InOidcXHVEODM1XFx1RENDMycsJ05zY3InOidcXHVEODM1XFx1RENBOScsJ25zaG9ydG1pZCc6J1xcdTIyMjQnLCduc2hvcnRwYXJhbGxlbCc6J1xcdTIyMjYnLCduc2ltJzonXFx1MjI0MScsJ25zaW1lJzonXFx1MjI0NCcsJ25zaW1lcSc6J1xcdTIyNDQnLCduc21pZCc6J1xcdTIyMjQnLCduc3Bhcic6J1xcdTIyMjYnLCduc3FzdWJlJzonXFx1MjJFMicsJ25zcXN1cGUnOidcXHUyMkUzJywnbnN1Yic6J1xcdTIyODQnLCduc3ViZSc6J1xcdTIyODgnLCduc3ViRSc6J1xcdTJBQzVcXHUwMzM4JywnbnN1YnNldCc6J1xcdTIyODJcXHUyMEQyJywnbnN1YnNldGVxJzonXFx1MjI4OCcsJ25zdWJzZXRlcXEnOidcXHUyQUM1XFx1MDMzOCcsJ25zdWNjJzonXFx1MjI4MScsJ25zdWNjZXEnOidcXHUyQUIwXFx1MDMzOCcsJ25zdXAnOidcXHUyMjg1JywnbnN1cGUnOidcXHUyMjg5JywnbnN1cEUnOidcXHUyQUM2XFx1MDMzOCcsJ25zdXBzZXQnOidcXHUyMjgzXFx1MjBEMicsJ25zdXBzZXRlcSc6J1xcdTIyODknLCduc3Vwc2V0ZXFxJzonXFx1MkFDNlxcdTAzMzgnLCdudGdsJzonXFx1MjI3OScsJ250aWxkZSc6J1xceEYxJywnTnRpbGRlJzonXFx4RDEnLCdudGxnJzonXFx1MjI3OCcsJ250cmlhbmdsZWxlZnQnOidcXHUyMkVBJywnbnRyaWFuZ2xlbGVmdGVxJzonXFx1MjJFQycsJ250cmlhbmdsZXJpZ2h0JzonXFx1MjJFQicsJ250cmlhbmdsZXJpZ2h0ZXEnOidcXHUyMkVEJywnbnUnOidcXHUwM0JEJywnTnUnOidcXHUwMzlEJywnbnVtJzonIycsJ251bWVybyc6J1xcdTIxMTYnLCdudW1zcCc6J1xcdTIwMDcnLCdudmFwJzonXFx1MjI0RFxcdTIwRDInLCdudmRhc2gnOidcXHUyMkFDJywnbnZEYXNoJzonXFx1MjJBRCcsJ25WZGFzaCc6J1xcdTIyQUUnLCduVkRhc2gnOidcXHUyMkFGJywnbnZnZSc6J1xcdTIyNjVcXHUyMEQyJywnbnZndCc6Jz5cXHUyMEQyJywnbnZIYXJyJzonXFx1MjkwNCcsJ252aW5maW4nOidcXHUyOURFJywnbnZsQXJyJzonXFx1MjkwMicsJ252bGUnOidcXHUyMjY0XFx1MjBEMicsJ252bHQnOic8XFx1MjBEMicsJ252bHRyaWUnOidcXHUyMkI0XFx1MjBEMicsJ252ckFycic6J1xcdTI5MDMnLCdudnJ0cmllJzonXFx1MjJCNVxcdTIwRDInLCdudnNpbSc6J1xcdTIyM0NcXHUyMEQyJywnbndhcmhrJzonXFx1MjkyMycsJ253YXJyJzonXFx1MjE5NicsJ253QXJyJzonXFx1MjFENicsJ253YXJyb3cnOidcXHUyMTk2JywnbnduZWFyJzonXFx1MjkyNycsJ29hY3V0ZSc6J1xceEYzJywnT2FjdXRlJzonXFx4RDMnLCdvYXN0JzonXFx1MjI5QicsJ29jaXInOidcXHUyMjlBJywnb2NpcmMnOidcXHhGNCcsJ09jaXJjJzonXFx4RDQnLCdvY3knOidcXHUwNDNFJywnT2N5JzonXFx1MDQxRScsJ29kYXNoJzonXFx1MjI5RCcsJ29kYmxhYyc6J1xcdTAxNTEnLCdPZGJsYWMnOidcXHUwMTUwJywnb2Rpdic6J1xcdTJBMzgnLCdvZG90JzonXFx1MjI5OScsJ29kc29sZCc6J1xcdTI5QkMnLCdvZWxpZyc6J1xcdTAxNTMnLCdPRWxpZyc6J1xcdTAxNTInLCdvZmNpcic6J1xcdTI5QkYnLCdvZnInOidcXHVEODM1XFx1REQyQycsJ09mcic6J1xcdUQ4MzVcXHVERDEyJywnb2dvbic6J1xcdTAyREInLCdvZ3JhdmUnOidcXHhGMicsJ09ncmF2ZSc6J1xceEQyJywnb2d0JzonXFx1MjlDMScsJ29oYmFyJzonXFx1MjlCNScsJ29obSc6J1xcdTAzQTknLCdvaW50JzonXFx1MjIyRScsJ29sYXJyJzonXFx1MjFCQScsJ29sY2lyJzonXFx1MjlCRScsJ29sY3Jvc3MnOidcXHUyOUJCJywnb2xpbmUnOidcXHUyMDNFJywnb2x0JzonXFx1MjlDMCcsJ29tYWNyJzonXFx1MDE0RCcsJ09tYWNyJzonXFx1MDE0QycsJ29tZWdhJzonXFx1MDNDOScsJ09tZWdhJzonXFx1MDNBOScsJ29taWNyb24nOidcXHUwM0JGJywnT21pY3Jvbic6J1xcdTAzOUYnLCdvbWlkJzonXFx1MjlCNicsJ29taW51cyc6J1xcdTIyOTYnLCdvb3BmJzonXFx1RDgzNVxcdURENjAnLCdPb3BmJzonXFx1RDgzNVxcdURENDYnLCdvcGFyJzonXFx1MjlCNycsJ09wZW5DdXJseURvdWJsZVF1b3RlJzonXFx1MjAxQycsJ09wZW5DdXJseVF1b3RlJzonXFx1MjAxOCcsJ29wZXJwJzonXFx1MjlCOScsJ29wbHVzJzonXFx1MjI5NScsJ29yJzonXFx1MjIyOCcsJ09yJzonXFx1MkE1NCcsJ29yYXJyJzonXFx1MjFCQicsJ29yZCc6J1xcdTJBNUQnLCdvcmRlcic6J1xcdTIxMzQnLCdvcmRlcm9mJzonXFx1MjEzNCcsJ29yZGYnOidcXHhBQScsJ29yZG0nOidcXHhCQScsJ29yaWdvZic6J1xcdTIyQjYnLCdvcm9yJzonXFx1MkE1NicsJ29yc2xvcGUnOidcXHUyQTU3Jywnb3J2JzonXFx1MkE1QicsJ29TJzonXFx1MjRDOCcsJ29zY3InOidcXHUyMTM0JywnT3Njcic6J1xcdUQ4MzVcXHVEQ0FBJywnb3NsYXNoJzonXFx4RjgnLCdPc2xhc2gnOidcXHhEOCcsJ29zb2wnOidcXHUyMjk4Jywnb3RpbGRlJzonXFx4RjUnLCdPdGlsZGUnOidcXHhENScsJ290aW1lcyc6J1xcdTIyOTcnLCdPdGltZXMnOidcXHUyQTM3Jywnb3RpbWVzYXMnOidcXHUyQTM2Jywnb3VtbCc6J1xceEY2JywnT3VtbCc6J1xceEQ2Jywnb3ZiYXInOidcXHUyMzNEJywnT3ZlckJhcic6J1xcdTIwM0UnLCdPdmVyQnJhY2UnOidcXHUyM0RFJywnT3ZlckJyYWNrZXQnOidcXHUyM0I0JywnT3ZlclBhcmVudGhlc2lzJzonXFx1MjNEQycsJ3Bhcic6J1xcdTIyMjUnLCdwYXJhJzonXFx4QjYnLCdwYXJhbGxlbCc6J1xcdTIyMjUnLCdwYXJzaW0nOidcXHUyQUYzJywncGFyc2wnOidcXHUyQUZEJywncGFydCc6J1xcdTIyMDInLCdQYXJ0aWFsRCc6J1xcdTIyMDInLCdwY3knOidcXHUwNDNGJywnUGN5JzonXFx1MDQxRicsJ3BlcmNudCc6JyUnLCdwZXJpb2QnOicuJywncGVybWlsJzonXFx1MjAzMCcsJ3BlcnAnOidcXHUyMkE1JywncGVydGVuayc6J1xcdTIwMzEnLCdwZnInOidcXHVEODM1XFx1REQyRCcsJ1Bmcic6J1xcdUQ4MzVcXHVERDEzJywncGhpJzonXFx1MDNDNicsJ1BoaSc6J1xcdTAzQTYnLCdwaGl2JzonXFx1MDNENScsJ3BobW1hdCc6J1xcdTIxMzMnLCdwaG9uZSc6J1xcdTI2MEUnLCdwaSc6J1xcdTAzQzAnLCdQaSc6J1xcdTAzQTAnLCdwaXRjaGZvcmsnOidcXHUyMkQ0JywncGl2JzonXFx1MDNENicsJ3BsYW5jayc6J1xcdTIxMEYnLCdwbGFuY2toJzonXFx1MjEwRScsJ3BsYW5rdic6J1xcdTIxMEYnLCdwbHVzJzonKycsJ3BsdXNhY2lyJzonXFx1MkEyMycsJ3BsdXNiJzonXFx1MjI5RScsJ3BsdXNjaXInOidcXHUyQTIyJywncGx1c2RvJzonXFx1MjIxNCcsJ3BsdXNkdSc6J1xcdTJBMjUnLCdwbHVzZSc6J1xcdTJBNzInLCdQbHVzTWludXMnOidcXHhCMScsJ3BsdXNtbic6J1xceEIxJywncGx1c3NpbSc6J1xcdTJBMjYnLCdwbHVzdHdvJzonXFx1MkEyNycsJ3BtJzonXFx4QjEnLCdQb2luY2FyZXBsYW5lJzonXFx1MjEwQycsJ3BvaW50aW50JzonXFx1MkExNScsJ3BvcGYnOidcXHVEODM1XFx1REQ2MScsJ1BvcGYnOidcXHUyMTE5JywncG91bmQnOidcXHhBMycsJ3ByJzonXFx1MjI3QScsJ1ByJzonXFx1MkFCQicsJ3ByYXAnOidcXHUyQUI3JywncHJjdWUnOidcXHUyMjdDJywncHJlJzonXFx1MkFBRicsJ3ByRSc6J1xcdTJBQjMnLCdwcmVjJzonXFx1MjI3QScsJ3ByZWNhcHByb3gnOidcXHUyQUI3JywncHJlY2N1cmx5ZXEnOidcXHUyMjdDJywnUHJlY2VkZXMnOidcXHUyMjdBJywnUHJlY2VkZXNFcXVhbCc6J1xcdTJBQUYnLCdQcmVjZWRlc1NsYW50RXF1YWwnOidcXHUyMjdDJywnUHJlY2VkZXNUaWxkZSc6J1xcdTIyN0UnLCdwcmVjZXEnOidcXHUyQUFGJywncHJlY25hcHByb3gnOidcXHUyQUI5JywncHJlY25lcXEnOidcXHUyQUI1JywncHJlY25zaW0nOidcXHUyMkU4JywncHJlY3NpbSc6J1xcdTIyN0UnLCdwcmltZSc6J1xcdTIwMzInLCdQcmltZSc6J1xcdTIwMzMnLCdwcmltZXMnOidcXHUyMTE5JywncHJuYXAnOidcXHUyQUI5JywncHJuRSc6J1xcdTJBQjUnLCdwcm5zaW0nOidcXHUyMkU4JywncHJvZCc6J1xcdTIyMEYnLCdQcm9kdWN0JzonXFx1MjIwRicsJ3Byb2ZhbGFyJzonXFx1MjMyRScsJ3Byb2ZsaW5lJzonXFx1MjMxMicsJ3Byb2ZzdXJmJzonXFx1MjMxMycsJ3Byb3AnOidcXHUyMjFEJywnUHJvcG9ydGlvbic6J1xcdTIyMzcnLCdQcm9wb3J0aW9uYWwnOidcXHUyMjFEJywncHJvcHRvJzonXFx1MjIxRCcsJ3Byc2ltJzonXFx1MjI3RScsJ3BydXJlbCc6J1xcdTIyQjAnLCdwc2NyJzonXFx1RDgzNVxcdURDQzUnLCdQc2NyJzonXFx1RDgzNVxcdURDQUInLCdwc2knOidcXHUwM0M4JywnUHNpJzonXFx1MDNBOCcsJ3B1bmNzcCc6J1xcdTIwMDgnLCdxZnInOidcXHVEODM1XFx1REQyRScsJ1Fmcic6J1xcdUQ4MzVcXHVERDE0JywncWludCc6J1xcdTJBMEMnLCdxb3BmJzonXFx1RDgzNVxcdURENjInLCdRb3BmJzonXFx1MjExQScsJ3FwcmltZSc6J1xcdTIwNTcnLCdxc2NyJzonXFx1RDgzNVxcdURDQzYnLCdRc2NyJzonXFx1RDgzNVxcdURDQUMnLCdxdWF0ZXJuaW9ucyc6J1xcdTIxMEQnLCdxdWF0aW50JzonXFx1MkExNicsJ3F1ZXN0JzonPycsJ3F1ZXN0ZXEnOidcXHUyMjVGJywncXVvdCc6J1wiJywnUVVPVCc6J1wiJywnckFhcnInOidcXHUyMURCJywncmFjZSc6J1xcdTIyM0RcXHUwMzMxJywncmFjdXRlJzonXFx1MDE1NScsJ1JhY3V0ZSc6J1xcdTAxNTQnLCdyYWRpYyc6J1xcdTIyMUEnLCdyYWVtcHR5dic6J1xcdTI5QjMnLCdyYW5nJzonXFx1MjdFOScsJ1JhbmcnOidcXHUyN0VCJywncmFuZ2QnOidcXHUyOTkyJywncmFuZ2UnOidcXHUyOUE1JywncmFuZ2xlJzonXFx1MjdFOScsJ3JhcXVvJzonXFx4QkInLCdyYXJyJzonXFx1MjE5MicsJ3JBcnInOidcXHUyMUQyJywnUmFycic6J1xcdTIxQTAnLCdyYXJyYXAnOidcXHUyOTc1JywncmFycmInOidcXHUyMUU1JywncmFycmJmcyc6J1xcdTI5MjAnLCdyYXJyYyc6J1xcdTI5MzMnLCdyYXJyZnMnOidcXHUyOTFFJywncmFycmhrJzonXFx1MjFBQScsJ3JhcnJscCc6J1xcdTIxQUMnLCdyYXJycGwnOidcXHUyOTQ1JywncmFycnNpbSc6J1xcdTI5NzQnLCdyYXJydGwnOidcXHUyMUEzJywnUmFycnRsJzonXFx1MjkxNicsJ3JhcnJ3JzonXFx1MjE5RCcsJ3JhdGFpbCc6J1xcdTI5MUEnLCdyQXRhaWwnOidcXHUyOTFDJywncmF0aW8nOidcXHUyMjM2JywncmF0aW9uYWxzJzonXFx1MjExQScsJ3JiYXJyJzonXFx1MjkwRCcsJ3JCYXJyJzonXFx1MjkwRicsJ1JCYXJyJzonXFx1MjkxMCcsJ3JiYnJrJzonXFx1Mjc3MycsJ3JicmFjZSc6J30nLCdyYnJhY2snOiddJywncmJya2UnOidcXHUyOThDJywncmJya3NsZCc6J1xcdTI5OEUnLCdyYnJrc2x1JzonXFx1Mjk5MCcsJ3JjYXJvbic6J1xcdTAxNTknLCdSY2Fyb24nOidcXHUwMTU4JywncmNlZGlsJzonXFx1MDE1NycsJ1JjZWRpbCc6J1xcdTAxNTYnLCdyY2VpbCc6J1xcdTIzMDknLCdyY3ViJzonfScsJ3JjeSc6J1xcdTA0NDAnLCdSY3knOidcXHUwNDIwJywncmRjYSc6J1xcdTI5MzcnLCdyZGxkaGFyJzonXFx1Mjk2OScsJ3JkcXVvJzonXFx1MjAxRCcsJ3JkcXVvcic6J1xcdTIwMUQnLCdyZHNoJzonXFx1MjFCMycsJ1JlJzonXFx1MjExQycsJ3JlYWwnOidcXHUyMTFDJywncmVhbGluZSc6J1xcdTIxMUInLCdyZWFscGFydCc6J1xcdTIxMUMnLCdyZWFscyc6J1xcdTIxMUQnLCdyZWN0JzonXFx1MjVBRCcsJ3JlZyc6J1xceEFFJywnUkVHJzonXFx4QUUnLCdSZXZlcnNlRWxlbWVudCc6J1xcdTIyMEInLCdSZXZlcnNlRXF1aWxpYnJpdW0nOidcXHUyMUNCJywnUmV2ZXJzZVVwRXF1aWxpYnJpdW0nOidcXHUyOTZGJywncmZpc2h0JzonXFx1Mjk3RCcsJ3JmbG9vcic6J1xcdTIzMEInLCdyZnInOidcXHVEODM1XFx1REQyRicsJ1Jmcic6J1xcdTIxMUMnLCdySGFyJzonXFx1Mjk2NCcsJ3JoYXJkJzonXFx1MjFDMScsJ3JoYXJ1JzonXFx1MjFDMCcsJ3JoYXJ1bCc6J1xcdTI5NkMnLCdyaG8nOidcXHUwM0MxJywnUmhvJzonXFx1MDNBMScsJ3Job3YnOidcXHUwM0YxJywnUmlnaHRBbmdsZUJyYWNrZXQnOidcXHUyN0U5JywncmlnaHRhcnJvdyc6J1xcdTIxOTInLCdSaWdodGFycm93JzonXFx1MjFEMicsJ1JpZ2h0QXJyb3cnOidcXHUyMTkyJywnUmlnaHRBcnJvd0Jhcic6J1xcdTIxRTUnLCdSaWdodEFycm93TGVmdEFycm93JzonXFx1MjFDNCcsJ3JpZ2h0YXJyb3d0YWlsJzonXFx1MjFBMycsJ1JpZ2h0Q2VpbGluZyc6J1xcdTIzMDknLCdSaWdodERvdWJsZUJyYWNrZXQnOidcXHUyN0U3JywnUmlnaHREb3duVGVlVmVjdG9yJzonXFx1Mjk1RCcsJ1JpZ2h0RG93blZlY3Rvcic6J1xcdTIxQzInLCdSaWdodERvd25WZWN0b3JCYXInOidcXHUyOTU1JywnUmlnaHRGbG9vcic6J1xcdTIzMEInLCdyaWdodGhhcnBvb25kb3duJzonXFx1MjFDMScsJ3JpZ2h0aGFycG9vbnVwJzonXFx1MjFDMCcsJ3JpZ2h0bGVmdGFycm93cyc6J1xcdTIxQzQnLCdyaWdodGxlZnRoYXJwb29ucyc6J1xcdTIxQ0MnLCdyaWdodHJpZ2h0YXJyb3dzJzonXFx1MjFDOScsJ3JpZ2h0c3F1aWdhcnJvdyc6J1xcdTIxOUQnLCdSaWdodFRlZSc6J1xcdTIyQTInLCdSaWdodFRlZUFycm93JzonXFx1MjFBNicsJ1JpZ2h0VGVlVmVjdG9yJzonXFx1Mjk1QicsJ3JpZ2h0dGhyZWV0aW1lcyc6J1xcdTIyQ0MnLCdSaWdodFRyaWFuZ2xlJzonXFx1MjJCMycsJ1JpZ2h0VHJpYW5nbGVCYXInOidcXHUyOUQwJywnUmlnaHRUcmlhbmdsZUVxdWFsJzonXFx1MjJCNScsJ1JpZ2h0VXBEb3duVmVjdG9yJzonXFx1Mjk0RicsJ1JpZ2h0VXBUZWVWZWN0b3InOidcXHUyOTVDJywnUmlnaHRVcFZlY3Rvcic6J1xcdTIxQkUnLCdSaWdodFVwVmVjdG9yQmFyJzonXFx1Mjk1NCcsJ1JpZ2h0VmVjdG9yJzonXFx1MjFDMCcsJ1JpZ2h0VmVjdG9yQmFyJzonXFx1Mjk1MycsJ3JpbmcnOidcXHUwMkRBJywncmlzaW5nZG90c2VxJzonXFx1MjI1MycsJ3JsYXJyJzonXFx1MjFDNCcsJ3JsaGFyJzonXFx1MjFDQycsJ3JsbSc6J1xcdTIwMEYnLCdybW91c3QnOidcXHUyM0IxJywncm1vdXN0YWNoZSc6J1xcdTIzQjEnLCdybm1pZCc6J1xcdTJBRUUnLCdyb2FuZyc6J1xcdTI3RUQnLCdyb2Fycic6J1xcdTIxRkUnLCdyb2Jyayc6J1xcdTI3RTcnLCdyb3Bhcic6J1xcdTI5ODYnLCdyb3BmJzonXFx1RDgzNVxcdURENjMnLCdSb3BmJzonXFx1MjExRCcsJ3JvcGx1cyc6J1xcdTJBMkUnLCdyb3RpbWVzJzonXFx1MkEzNScsJ1JvdW5kSW1wbGllcyc6J1xcdTI5NzAnLCdycGFyJzonKScsJ3JwYXJndCc6J1xcdTI5OTQnLCdycHBvbGludCc6J1xcdTJBMTInLCdycmFycic6J1xcdTIxQzknLCdScmlnaHRhcnJvdyc6J1xcdTIxREInLCdyc2FxdW8nOidcXHUyMDNBJywncnNjcic6J1xcdUQ4MzVcXHVEQ0M3JywnUnNjcic6J1xcdTIxMUInLCdyc2gnOidcXHUyMUIxJywnUnNoJzonXFx1MjFCMScsJ3JzcWInOiddJywncnNxdW8nOidcXHUyMDE5JywncnNxdW9yJzonXFx1MjAxOScsJ3J0aHJlZSc6J1xcdTIyQ0MnLCdydGltZXMnOidcXHUyMkNBJywncnRyaSc6J1xcdTI1QjknLCdydHJpZSc6J1xcdTIyQjUnLCdydHJpZic6J1xcdTI1QjgnLCdydHJpbHRyaSc6J1xcdTI5Q0UnLCdSdWxlRGVsYXllZCc6J1xcdTI5RjQnLCdydWx1aGFyJzonXFx1Mjk2OCcsJ3J4JzonXFx1MjExRScsJ3NhY3V0ZSc6J1xcdTAxNUInLCdTYWN1dGUnOidcXHUwMTVBJywnc2JxdW8nOidcXHUyMDFBJywnc2MnOidcXHUyMjdCJywnU2MnOidcXHUyQUJDJywnc2NhcCc6J1xcdTJBQjgnLCdzY2Fyb24nOidcXHUwMTYxJywnU2Nhcm9uJzonXFx1MDE2MCcsJ3NjY3VlJzonXFx1MjI3RCcsJ3NjZSc6J1xcdTJBQjAnLCdzY0UnOidcXHUyQUI0Jywnc2NlZGlsJzonXFx1MDE1RicsJ1NjZWRpbCc6J1xcdTAxNUUnLCdzY2lyYyc6J1xcdTAxNUQnLCdTY2lyYyc6J1xcdTAxNUMnLCdzY25hcCc6J1xcdTJBQkEnLCdzY25FJzonXFx1MkFCNicsJ3NjbnNpbSc6J1xcdTIyRTknLCdzY3BvbGludCc6J1xcdTJBMTMnLCdzY3NpbSc6J1xcdTIyN0YnLCdzY3knOidcXHUwNDQxJywnU2N5JzonXFx1MDQyMScsJ3Nkb3QnOidcXHUyMkM1Jywnc2RvdGInOidcXHUyMkExJywnc2RvdGUnOidcXHUyQTY2Jywnc2VhcmhrJzonXFx1MjkyNScsJ3NlYXJyJzonXFx1MjE5OCcsJ3NlQXJyJzonXFx1MjFEOCcsJ3NlYXJyb3cnOidcXHUyMTk4Jywnc2VjdCc6J1xceEE3Jywnc2VtaSc6JzsnLCdzZXN3YXInOidcXHUyOTI5Jywnc2V0bWludXMnOidcXHUyMjE2Jywnc2V0bW4nOidcXHUyMjE2Jywnc2V4dCc6J1xcdTI3MzYnLCdzZnInOidcXHVEODM1XFx1REQzMCcsJ1Nmcic6J1xcdUQ4MzVcXHVERDE2Jywnc2Zyb3duJzonXFx1MjMyMicsJ3NoYXJwJzonXFx1MjY2RicsJ3NoY2hjeSc6J1xcdTA0NDknLCdTSENIY3knOidcXHUwNDI5Jywnc2hjeSc6J1xcdTA0NDgnLCdTSGN5JzonXFx1MDQyOCcsJ1Nob3J0RG93bkFycm93JzonXFx1MjE5MycsJ1Nob3J0TGVmdEFycm93JzonXFx1MjE5MCcsJ3Nob3J0bWlkJzonXFx1MjIyMycsJ3Nob3J0cGFyYWxsZWwnOidcXHUyMjI1JywnU2hvcnRSaWdodEFycm93JzonXFx1MjE5MicsJ1Nob3J0VXBBcnJvdyc6J1xcdTIxOTEnLCdzaHknOidcXHhBRCcsJ3NpZ21hJzonXFx1MDNDMycsJ1NpZ21hJzonXFx1MDNBMycsJ3NpZ21hZic6J1xcdTAzQzInLCdzaWdtYXYnOidcXHUwM0MyJywnc2ltJzonXFx1MjIzQycsJ3NpbWRvdCc6J1xcdTJBNkEnLCdzaW1lJzonXFx1MjI0MycsJ3NpbWVxJzonXFx1MjI0MycsJ3NpbWcnOidcXHUyQTlFJywnc2ltZ0UnOidcXHUyQUEwJywnc2ltbCc6J1xcdTJBOUQnLCdzaW1sRSc6J1xcdTJBOUYnLCdzaW1uZSc6J1xcdTIyNDYnLCdzaW1wbHVzJzonXFx1MkEyNCcsJ3NpbXJhcnInOidcXHUyOTcyJywnc2xhcnInOidcXHUyMTkwJywnU21hbGxDaXJjbGUnOidcXHUyMjE4Jywnc21hbGxzZXRtaW51cyc6J1xcdTIyMTYnLCdzbWFzaHAnOidcXHUyQTMzJywnc21lcGFyc2wnOidcXHUyOUU0Jywnc21pZCc6J1xcdTIyMjMnLCdzbWlsZSc6J1xcdTIzMjMnLCdzbXQnOidcXHUyQUFBJywnc210ZSc6J1xcdTJBQUMnLCdzbXRlcyc6J1xcdTJBQUNcXHVGRTAwJywnc29mdGN5JzonXFx1MDQ0QycsJ1NPRlRjeSc6J1xcdTA0MkMnLCdzb2wnOicvJywnc29sYic6J1xcdTI5QzQnLCdzb2xiYXInOidcXHUyMzNGJywnc29wZic6J1xcdUQ4MzVcXHVERDY0JywnU29wZic6J1xcdUQ4MzVcXHVERDRBJywnc3BhZGVzJzonXFx1MjY2MCcsJ3NwYWRlc3VpdCc6J1xcdTI2NjAnLCdzcGFyJzonXFx1MjIyNScsJ3NxY2FwJzonXFx1MjI5MycsJ3NxY2Fwcyc6J1xcdTIyOTNcXHVGRTAwJywnc3FjdXAnOidcXHUyMjk0Jywnc3FjdXBzJzonXFx1MjI5NFxcdUZFMDAnLCdTcXJ0JzonXFx1MjIxQScsJ3Nxc3ViJzonXFx1MjI4RicsJ3Nxc3ViZSc6J1xcdTIyOTEnLCdzcXN1YnNldCc6J1xcdTIyOEYnLCdzcXN1YnNldGVxJzonXFx1MjI5MScsJ3Nxc3VwJzonXFx1MjI5MCcsJ3Nxc3VwZSc6J1xcdTIyOTInLCdzcXN1cHNldCc6J1xcdTIyOTAnLCdzcXN1cHNldGVxJzonXFx1MjI5MicsJ3NxdSc6J1xcdTI1QTEnLCdzcXVhcmUnOidcXHUyNUExJywnU3F1YXJlJzonXFx1MjVBMScsJ1NxdWFyZUludGVyc2VjdGlvbic6J1xcdTIyOTMnLCdTcXVhcmVTdWJzZXQnOidcXHUyMjhGJywnU3F1YXJlU3Vic2V0RXF1YWwnOidcXHUyMjkxJywnU3F1YXJlU3VwZXJzZXQnOidcXHUyMjkwJywnU3F1YXJlU3VwZXJzZXRFcXVhbCc6J1xcdTIyOTInLCdTcXVhcmVVbmlvbic6J1xcdTIyOTQnLCdzcXVhcmYnOidcXHUyNUFBJywnc3F1Zic6J1xcdTI1QUEnLCdzcmFycic6J1xcdTIxOTInLCdzc2NyJzonXFx1RDgzNVxcdURDQzgnLCdTc2NyJzonXFx1RDgzNVxcdURDQUUnLCdzc2V0bW4nOidcXHUyMjE2Jywnc3NtaWxlJzonXFx1MjMyMycsJ3NzdGFyZic6J1xcdTIyQzYnLCdzdGFyJzonXFx1MjYwNicsJ1N0YXInOidcXHUyMkM2Jywnc3RhcmYnOidcXHUyNjA1Jywnc3RyYWlnaHRlcHNpbG9uJzonXFx1MDNGNScsJ3N0cmFpZ2h0cGhpJzonXFx1MDNENScsJ3N0cm5zJzonXFx4QUYnLCdzdWInOidcXHUyMjgyJywnU3ViJzonXFx1MjJEMCcsJ3N1YmRvdCc6J1xcdTJBQkQnLCdzdWJlJzonXFx1MjI4NicsJ3N1YkUnOidcXHUyQUM1Jywnc3ViZWRvdCc6J1xcdTJBQzMnLCdzdWJtdWx0JzonXFx1MkFDMScsJ3N1Ym5lJzonXFx1MjI4QScsJ3N1Ym5FJzonXFx1MkFDQicsJ3N1YnBsdXMnOidcXHUyQUJGJywnc3VicmFycic6J1xcdTI5NzknLCdzdWJzZXQnOidcXHUyMjgyJywnU3Vic2V0JzonXFx1MjJEMCcsJ3N1YnNldGVxJzonXFx1MjI4NicsJ3N1YnNldGVxcSc6J1xcdTJBQzUnLCdTdWJzZXRFcXVhbCc6J1xcdTIyODYnLCdzdWJzZXRuZXEnOidcXHUyMjhBJywnc3Vic2V0bmVxcSc6J1xcdTJBQ0InLCdzdWJzaW0nOidcXHUyQUM3Jywnc3Vic3ViJzonXFx1MkFENScsJ3N1YnN1cCc6J1xcdTJBRDMnLCdzdWNjJzonXFx1MjI3QicsJ3N1Y2NhcHByb3gnOidcXHUyQUI4Jywnc3VjY2N1cmx5ZXEnOidcXHUyMjdEJywnU3VjY2VlZHMnOidcXHUyMjdCJywnU3VjY2VlZHNFcXVhbCc6J1xcdTJBQjAnLCdTdWNjZWVkc1NsYW50RXF1YWwnOidcXHUyMjdEJywnU3VjY2VlZHNUaWxkZSc6J1xcdTIyN0YnLCdzdWNjZXEnOidcXHUyQUIwJywnc3VjY25hcHByb3gnOidcXHUyQUJBJywnc3VjY25lcXEnOidcXHUyQUI2Jywnc3VjY25zaW0nOidcXHUyMkU5Jywnc3VjY3NpbSc6J1xcdTIyN0YnLCdTdWNoVGhhdCc6J1xcdTIyMEInLCdzdW0nOidcXHUyMjExJywnU3VtJzonXFx1MjIxMScsJ3N1bmcnOidcXHUyNjZBJywnc3VwJzonXFx1MjI4MycsJ1N1cCc6J1xcdTIyRDEnLCdzdXAxJzonXFx4QjknLCdzdXAyJzonXFx4QjInLCdzdXAzJzonXFx4QjMnLCdzdXBkb3QnOidcXHUyQUJFJywnc3VwZHN1Yic6J1xcdTJBRDgnLCdzdXBlJzonXFx1MjI4NycsJ3N1cEUnOidcXHUyQUM2Jywnc3VwZWRvdCc6J1xcdTJBQzQnLCdTdXBlcnNldCc6J1xcdTIyODMnLCdTdXBlcnNldEVxdWFsJzonXFx1MjI4NycsJ3N1cGhzb2wnOidcXHUyN0M5Jywnc3VwaHN1Yic6J1xcdTJBRDcnLCdzdXBsYXJyJzonXFx1Mjk3QicsJ3N1cG11bHQnOidcXHUyQUMyJywnc3VwbmUnOidcXHUyMjhCJywnc3VwbkUnOidcXHUyQUNDJywnc3VwcGx1cyc6J1xcdTJBQzAnLCdzdXBzZXQnOidcXHUyMjgzJywnU3Vwc2V0JzonXFx1MjJEMScsJ3N1cHNldGVxJzonXFx1MjI4NycsJ3N1cHNldGVxcSc6J1xcdTJBQzYnLCdzdXBzZXRuZXEnOidcXHUyMjhCJywnc3Vwc2V0bmVxcSc6J1xcdTJBQ0MnLCdzdXBzaW0nOidcXHUyQUM4Jywnc3Vwc3ViJzonXFx1MkFENCcsJ3N1cHN1cCc6J1xcdTJBRDYnLCdzd2FyaGsnOidcXHUyOTI2Jywnc3dhcnInOidcXHUyMTk5Jywnc3dBcnInOidcXHUyMUQ5Jywnc3dhcnJvdyc6J1xcdTIxOTknLCdzd253YXInOidcXHUyOTJBJywnc3psaWcnOidcXHhERicsJ1RhYic6J1xcdCcsJ3RhcmdldCc6J1xcdTIzMTYnLCd0YXUnOidcXHUwM0M0JywnVGF1JzonXFx1MDNBNCcsJ3RicmsnOidcXHUyM0I0JywndGNhcm9uJzonXFx1MDE2NScsJ1RjYXJvbic6J1xcdTAxNjQnLCd0Y2VkaWwnOidcXHUwMTYzJywnVGNlZGlsJzonXFx1MDE2MicsJ3RjeSc6J1xcdTA0NDInLCdUY3knOidcXHUwNDIyJywndGRvdCc6J1xcdTIwREInLCd0ZWxyZWMnOidcXHUyMzE1JywndGZyJzonXFx1RDgzNVxcdUREMzEnLCdUZnInOidcXHVEODM1XFx1REQxNycsJ3RoZXJlNCc6J1xcdTIyMzQnLCd0aGVyZWZvcmUnOidcXHUyMjM0JywnVGhlcmVmb3JlJzonXFx1MjIzNCcsJ3RoZXRhJzonXFx1MDNCOCcsJ1RoZXRhJzonXFx1MDM5OCcsJ3RoZXRhc3ltJzonXFx1MDNEMScsJ3RoZXRhdic6J1xcdTAzRDEnLCd0aGlja2FwcHJveCc6J1xcdTIyNDgnLCd0aGlja3NpbSc6J1xcdTIyM0MnLCdUaGlja1NwYWNlJzonXFx1MjA1RlxcdTIwMEEnLCd0aGluc3AnOidcXHUyMDA5JywnVGhpblNwYWNlJzonXFx1MjAwOScsJ3Roa2FwJzonXFx1MjI0OCcsJ3Roa3NpbSc6J1xcdTIyM0MnLCd0aG9ybic6J1xceEZFJywnVEhPUk4nOidcXHhERScsJ3RpbGRlJzonXFx1MDJEQycsJ1RpbGRlJzonXFx1MjIzQycsJ1RpbGRlRXF1YWwnOidcXHUyMjQzJywnVGlsZGVGdWxsRXF1YWwnOidcXHUyMjQ1JywnVGlsZGVUaWxkZSc6J1xcdTIyNDgnLCd0aW1lcyc6J1xceEQ3JywndGltZXNiJzonXFx1MjJBMCcsJ3RpbWVzYmFyJzonXFx1MkEzMScsJ3RpbWVzZCc6J1xcdTJBMzAnLCd0aW50JzonXFx1MjIyRCcsJ3RvZWEnOidcXHUyOTI4JywndG9wJzonXFx1MjJBNCcsJ3RvcGJvdCc6J1xcdTIzMzYnLCd0b3BjaXInOidcXHUyQUYxJywndG9wZic6J1xcdUQ4MzVcXHVERDY1JywnVG9wZic6J1xcdUQ4MzVcXHVERDRCJywndG9wZm9yayc6J1xcdTJBREEnLCd0b3NhJzonXFx1MjkyOScsJ3RwcmltZSc6J1xcdTIwMzQnLCd0cmFkZSc6J1xcdTIxMjInLCdUUkFERSc6J1xcdTIxMjInLCd0cmlhbmdsZSc6J1xcdTI1QjUnLCd0cmlhbmdsZWRvd24nOidcXHUyNUJGJywndHJpYW5nbGVsZWZ0JzonXFx1MjVDMycsJ3RyaWFuZ2xlbGVmdGVxJzonXFx1MjJCNCcsJ3RyaWFuZ2xlcSc6J1xcdTIyNUMnLCd0cmlhbmdsZXJpZ2h0JzonXFx1MjVCOScsJ3RyaWFuZ2xlcmlnaHRlcSc6J1xcdTIyQjUnLCd0cmlkb3QnOidcXHUyNUVDJywndHJpZSc6J1xcdTIyNUMnLCd0cmltaW51cyc6J1xcdTJBM0EnLCdUcmlwbGVEb3QnOidcXHUyMERCJywndHJpcGx1cyc6J1xcdTJBMzknLCd0cmlzYic6J1xcdTI5Q0QnLCd0cml0aW1lJzonXFx1MkEzQicsJ3RycGV6aXVtJzonXFx1MjNFMicsJ3RzY3InOidcXHVEODM1XFx1RENDOScsJ1RzY3InOidcXHVEODM1XFx1RENBRicsJ3RzY3knOidcXHUwNDQ2JywnVFNjeSc6J1xcdTA0MjYnLCd0c2hjeSc6J1xcdTA0NUInLCdUU0hjeSc6J1xcdTA0MEInLCd0c3Ryb2snOidcXHUwMTY3JywnVHN0cm9rJzonXFx1MDE2NicsJ3R3aXh0JzonXFx1MjI2QycsJ3R3b2hlYWRsZWZ0YXJyb3cnOidcXHUyMTlFJywndHdvaGVhZHJpZ2h0YXJyb3cnOidcXHUyMUEwJywndWFjdXRlJzonXFx4RkEnLCdVYWN1dGUnOidcXHhEQScsJ3VhcnInOidcXHUyMTkxJywndUFycic6J1xcdTIxRDEnLCdVYXJyJzonXFx1MjE5RicsJ1VhcnJvY2lyJzonXFx1Mjk0OScsJ3VicmN5JzonXFx1MDQ1RScsJ1VicmN5JzonXFx1MDQwRScsJ3VicmV2ZSc6J1xcdTAxNkQnLCdVYnJldmUnOidcXHUwMTZDJywndWNpcmMnOidcXHhGQicsJ1VjaXJjJzonXFx4REInLCd1Y3knOidcXHUwNDQzJywnVWN5JzonXFx1MDQyMycsJ3VkYXJyJzonXFx1MjFDNScsJ3VkYmxhYyc6J1xcdTAxNzEnLCdVZGJsYWMnOidcXHUwMTcwJywndWRoYXInOidcXHUyOTZFJywndWZpc2h0JzonXFx1Mjk3RScsJ3Vmcic6J1xcdUQ4MzVcXHVERDMyJywnVWZyJzonXFx1RDgzNVxcdUREMTgnLCd1Z3JhdmUnOidcXHhGOScsJ1VncmF2ZSc6J1xceEQ5JywndUhhcic6J1xcdTI5NjMnLCd1aGFybCc6J1xcdTIxQkYnLCd1aGFycic6J1xcdTIxQkUnLCd1aGJsayc6J1xcdTI1ODAnLCd1bGNvcm4nOidcXHUyMzFDJywndWxjb3JuZXInOidcXHUyMzFDJywndWxjcm9wJzonXFx1MjMwRicsJ3VsdHJpJzonXFx1MjVGOCcsJ3VtYWNyJzonXFx1MDE2QicsJ1VtYWNyJzonXFx1MDE2QScsJ3VtbCc6J1xceEE4JywnVW5kZXJCYXInOidfJywnVW5kZXJCcmFjZSc6J1xcdTIzREYnLCdVbmRlckJyYWNrZXQnOidcXHUyM0I1JywnVW5kZXJQYXJlbnRoZXNpcyc6J1xcdTIzREQnLCdVbmlvbic6J1xcdTIyQzMnLCdVbmlvblBsdXMnOidcXHUyMjhFJywndW9nb24nOidcXHUwMTczJywnVW9nb24nOidcXHUwMTcyJywndW9wZic6J1xcdUQ4MzVcXHVERDY2JywnVW9wZic6J1xcdUQ4MzVcXHVERDRDJywndXBhcnJvdyc6J1xcdTIxOTEnLCdVcGFycm93JzonXFx1MjFEMScsJ1VwQXJyb3cnOidcXHUyMTkxJywnVXBBcnJvd0Jhcic6J1xcdTI5MTInLCdVcEFycm93RG93bkFycm93JzonXFx1MjFDNScsJ3VwZG93bmFycm93JzonXFx1MjE5NScsJ1VwZG93bmFycm93JzonXFx1MjFENScsJ1VwRG93bkFycm93JzonXFx1MjE5NScsJ1VwRXF1aWxpYnJpdW0nOidcXHUyOTZFJywndXBoYXJwb29ubGVmdCc6J1xcdTIxQkYnLCd1cGhhcnBvb25yaWdodCc6J1xcdTIxQkUnLCd1cGx1cyc6J1xcdTIyOEUnLCdVcHBlckxlZnRBcnJvdyc6J1xcdTIxOTYnLCdVcHBlclJpZ2h0QXJyb3cnOidcXHUyMTk3JywndXBzaSc6J1xcdTAzQzUnLCdVcHNpJzonXFx1MDNEMicsJ3Vwc2loJzonXFx1MDNEMicsJ3Vwc2lsb24nOidcXHUwM0M1JywnVXBzaWxvbic6J1xcdTAzQTUnLCdVcFRlZSc6J1xcdTIyQTUnLCdVcFRlZUFycm93JzonXFx1MjFBNScsJ3VwdXBhcnJvd3MnOidcXHUyMUM4JywndXJjb3JuJzonXFx1MjMxRCcsJ3VyY29ybmVyJzonXFx1MjMxRCcsJ3VyY3JvcCc6J1xcdTIzMEUnLCd1cmluZyc6J1xcdTAxNkYnLCdVcmluZyc6J1xcdTAxNkUnLCd1cnRyaSc6J1xcdTI1RjknLCd1c2NyJzonXFx1RDgzNVxcdURDQ0EnLCdVc2NyJzonXFx1RDgzNVxcdURDQjAnLCd1dGRvdCc6J1xcdTIyRjAnLCd1dGlsZGUnOidcXHUwMTY5JywnVXRpbGRlJzonXFx1MDE2OCcsJ3V0cmknOidcXHUyNUI1JywndXRyaWYnOidcXHUyNUI0JywndXVhcnInOidcXHUyMUM4JywndXVtbCc6J1xceEZDJywnVXVtbCc6J1xceERDJywndXdhbmdsZSc6J1xcdTI5QTcnLCd2YW5ncnQnOidcXHUyOTlDJywndmFyZXBzaWxvbic6J1xcdTAzRjUnLCd2YXJrYXBwYSc6J1xcdTAzRjAnLCd2YXJub3RoaW5nJzonXFx1MjIwNScsJ3ZhcnBoaSc6J1xcdTAzRDUnLCd2YXJwaSc6J1xcdTAzRDYnLCd2YXJwcm9wdG8nOidcXHUyMjFEJywndmFycic6J1xcdTIxOTUnLCd2QXJyJzonXFx1MjFENScsJ3ZhcnJobyc6J1xcdTAzRjEnLCd2YXJzaWdtYSc6J1xcdTAzQzInLCd2YXJzdWJzZXRuZXEnOidcXHUyMjhBXFx1RkUwMCcsJ3ZhcnN1YnNldG5lcXEnOidcXHUyQUNCXFx1RkUwMCcsJ3ZhcnN1cHNldG5lcSc6J1xcdTIyOEJcXHVGRTAwJywndmFyc3Vwc2V0bmVxcSc6J1xcdTJBQ0NcXHVGRTAwJywndmFydGhldGEnOidcXHUwM0QxJywndmFydHJpYW5nbGVsZWZ0JzonXFx1MjJCMicsJ3ZhcnRyaWFuZ2xlcmlnaHQnOidcXHUyMkIzJywndkJhcic6J1xcdTJBRTgnLCdWYmFyJzonXFx1MkFFQicsJ3ZCYXJ2JzonXFx1MkFFOScsJ3ZjeSc6J1xcdTA0MzInLCdWY3knOidcXHUwNDEyJywndmRhc2gnOidcXHUyMkEyJywndkRhc2gnOidcXHUyMkE4JywnVmRhc2gnOidcXHUyMkE5JywnVkRhc2gnOidcXHUyMkFCJywnVmRhc2hsJzonXFx1MkFFNicsJ3ZlZSc6J1xcdTIyMjgnLCdWZWUnOidcXHUyMkMxJywndmVlYmFyJzonXFx1MjJCQicsJ3ZlZWVxJzonXFx1MjI1QScsJ3ZlbGxpcCc6J1xcdTIyRUUnLCd2ZXJiYXInOid8JywnVmVyYmFyJzonXFx1MjAxNicsJ3ZlcnQnOid8JywnVmVydCc6J1xcdTIwMTYnLCdWZXJ0aWNhbEJhcic6J1xcdTIyMjMnLCdWZXJ0aWNhbExpbmUnOid8JywnVmVydGljYWxTZXBhcmF0b3InOidcXHUyNzU4JywnVmVydGljYWxUaWxkZSc6J1xcdTIyNDAnLCdWZXJ5VGhpblNwYWNlJzonXFx1MjAwQScsJ3Zmcic6J1xcdUQ4MzVcXHVERDMzJywnVmZyJzonXFx1RDgzNVxcdUREMTknLCd2bHRyaSc6J1xcdTIyQjInLCd2bnN1Yic6J1xcdTIyODJcXHUyMEQyJywndm5zdXAnOidcXHUyMjgzXFx1MjBEMicsJ3ZvcGYnOidcXHVEODM1XFx1REQ2NycsJ1ZvcGYnOidcXHVEODM1XFx1REQ0RCcsJ3Zwcm9wJzonXFx1MjIxRCcsJ3ZydHJpJzonXFx1MjJCMycsJ3ZzY3InOidcXHVEODM1XFx1RENDQicsJ1ZzY3InOidcXHVEODM1XFx1RENCMScsJ3ZzdWJuZSc6J1xcdTIyOEFcXHVGRTAwJywndnN1Ym5FJzonXFx1MkFDQlxcdUZFMDAnLCd2c3VwbmUnOidcXHUyMjhCXFx1RkUwMCcsJ3ZzdXBuRSc6J1xcdTJBQ0NcXHVGRTAwJywnVnZkYXNoJzonXFx1MjJBQScsJ3Z6aWd6YWcnOidcXHUyOTlBJywnd2NpcmMnOidcXHUwMTc1JywnV2NpcmMnOidcXHUwMTc0Jywnd2VkYmFyJzonXFx1MkE1RicsJ3dlZGdlJzonXFx1MjIyNycsJ1dlZGdlJzonXFx1MjJDMCcsJ3dlZGdlcSc6J1xcdTIyNTknLCd3ZWllcnAnOidcXHUyMTE4Jywnd2ZyJzonXFx1RDgzNVxcdUREMzQnLCdXZnInOidcXHVEODM1XFx1REQxQScsJ3dvcGYnOidcXHVEODM1XFx1REQ2OCcsJ1dvcGYnOidcXHVEODM1XFx1REQ0RScsJ3dwJzonXFx1MjExOCcsJ3dyJzonXFx1MjI0MCcsJ3dyZWF0aCc6J1xcdTIyNDAnLCd3c2NyJzonXFx1RDgzNVxcdURDQ0MnLCdXc2NyJzonXFx1RDgzNVxcdURDQjInLCd4Y2FwJzonXFx1MjJDMicsJ3hjaXJjJzonXFx1MjVFRicsJ3hjdXAnOidcXHUyMkMzJywneGR0cmknOidcXHUyNUJEJywneGZyJzonXFx1RDgzNVxcdUREMzUnLCdYZnInOidcXHVEODM1XFx1REQxQicsJ3hoYXJyJzonXFx1MjdGNycsJ3hoQXJyJzonXFx1MjdGQScsJ3hpJzonXFx1MDNCRScsJ1hpJzonXFx1MDM5RScsJ3hsYXJyJzonXFx1MjdGNScsJ3hsQXJyJzonXFx1MjdGOCcsJ3htYXAnOidcXHUyN0ZDJywneG5pcyc6J1xcdTIyRkInLCd4b2RvdCc6J1xcdTJBMDAnLCd4b3BmJzonXFx1RDgzNVxcdURENjknLCdYb3BmJzonXFx1RDgzNVxcdURENEYnLCd4b3BsdXMnOidcXHUyQTAxJywneG90aW1lJzonXFx1MkEwMicsJ3hyYXJyJzonXFx1MjdGNicsJ3hyQXJyJzonXFx1MjdGOScsJ3hzY3InOidcXHVEODM1XFx1RENDRCcsJ1hzY3InOidcXHVEODM1XFx1RENCMycsJ3hzcWN1cCc6J1xcdTJBMDYnLCd4dXBsdXMnOidcXHUyQTA0JywneHV0cmknOidcXHUyNUIzJywneHZlZSc6J1xcdTIyQzEnLCd4d2VkZ2UnOidcXHUyMkMwJywneWFjdXRlJzonXFx4RkQnLCdZYWN1dGUnOidcXHhERCcsJ3lhY3knOidcXHUwNDRGJywnWUFjeSc6J1xcdTA0MkYnLCd5Y2lyYyc6J1xcdTAxNzcnLCdZY2lyYyc6J1xcdTAxNzYnLCd5Y3knOidcXHUwNDRCJywnWWN5JzonXFx1MDQyQicsJ3llbic6J1xceEE1JywneWZyJzonXFx1RDgzNVxcdUREMzYnLCdZZnInOidcXHVEODM1XFx1REQxQycsJ3lpY3knOidcXHUwNDU3JywnWUljeSc6J1xcdTA0MDcnLCd5b3BmJzonXFx1RDgzNVxcdURENkEnLCdZb3BmJzonXFx1RDgzNVxcdURENTAnLCd5c2NyJzonXFx1RDgzNVxcdURDQ0UnLCdZc2NyJzonXFx1RDgzNVxcdURDQjQnLCd5dWN5JzonXFx1MDQ0RScsJ1lVY3knOidcXHUwNDJFJywneXVtbCc6J1xceEZGJywnWXVtbCc6J1xcdTAxNzgnLCd6YWN1dGUnOidcXHUwMTdBJywnWmFjdXRlJzonXFx1MDE3OScsJ3pjYXJvbic6J1xcdTAxN0UnLCdaY2Fyb24nOidcXHUwMTdEJywnemN5JzonXFx1MDQzNycsJ1pjeSc6J1xcdTA0MTcnLCd6ZG90JzonXFx1MDE3QycsJ1pkb3QnOidcXHUwMTdCJywnemVldHJmJzonXFx1MjEyOCcsJ1plcm9XaWR0aFNwYWNlJzonXFx1MjAwQicsJ3pldGEnOidcXHUwM0I2JywnWmV0YSc6J1xcdTAzOTYnLCd6ZnInOidcXHVEODM1XFx1REQzNycsJ1pmcic6J1xcdTIxMjgnLCd6aGN5JzonXFx1MDQzNicsJ1pIY3knOidcXHUwNDE2JywnemlncmFycic6J1xcdTIxREQnLCd6b3BmJzonXFx1RDgzNVxcdURENkInLCdab3BmJzonXFx1MjEyNCcsJ3pzY3InOidcXHVEODM1XFx1RENDRicsJ1pzY3InOidcXHVEODM1XFx1RENCNScsJ3p3aic6J1xcdTIwMEQnLCd6d25qJzonXFx1MjAwQyd9O1xuXHR2YXIgZGVjb2RlTWFwTGVnYWN5ID0geydhYWN1dGUnOidcXHhFMScsJ0FhY3V0ZSc6J1xceEMxJywnYWNpcmMnOidcXHhFMicsJ0FjaXJjJzonXFx4QzInLCdhY3V0ZSc6J1xceEI0JywnYWVsaWcnOidcXHhFNicsJ0FFbGlnJzonXFx4QzYnLCdhZ3JhdmUnOidcXHhFMCcsJ0FncmF2ZSc6J1xceEMwJywnYW1wJzonJicsJ0FNUCc6JyYnLCdhcmluZyc6J1xceEU1JywnQXJpbmcnOidcXHhDNScsJ2F0aWxkZSc6J1xceEUzJywnQXRpbGRlJzonXFx4QzMnLCdhdW1sJzonXFx4RTQnLCdBdW1sJzonXFx4QzQnLCdicnZiYXInOidcXHhBNicsJ2NjZWRpbCc6J1xceEU3JywnQ2NlZGlsJzonXFx4QzcnLCdjZWRpbCc6J1xceEI4JywnY2VudCc6J1xceEEyJywnY29weSc6J1xceEE5JywnQ09QWSc6J1xceEE5JywnY3VycmVuJzonXFx4QTQnLCdkZWcnOidcXHhCMCcsJ2RpdmlkZSc6J1xceEY3JywnZWFjdXRlJzonXFx4RTknLCdFYWN1dGUnOidcXHhDOScsJ2VjaXJjJzonXFx4RUEnLCdFY2lyYyc6J1xceENBJywnZWdyYXZlJzonXFx4RTgnLCdFZ3JhdmUnOidcXHhDOCcsJ2V0aCc6J1xceEYwJywnRVRIJzonXFx4RDAnLCdldW1sJzonXFx4RUInLCdFdW1sJzonXFx4Q0InLCdmcmFjMTInOidcXHhCRCcsJ2ZyYWMxNCc6J1xceEJDJywnZnJhYzM0JzonXFx4QkUnLCdndCc6Jz4nLCdHVCc6Jz4nLCdpYWN1dGUnOidcXHhFRCcsJ0lhY3V0ZSc6J1xceENEJywnaWNpcmMnOidcXHhFRScsJ0ljaXJjJzonXFx4Q0UnLCdpZXhjbCc6J1xceEExJywnaWdyYXZlJzonXFx4RUMnLCdJZ3JhdmUnOidcXHhDQycsJ2lxdWVzdCc6J1xceEJGJywnaXVtbCc6J1xceEVGJywnSXVtbCc6J1xceENGJywnbGFxdW8nOidcXHhBQicsJ2x0JzonPCcsJ0xUJzonPCcsJ21hY3InOidcXHhBRicsJ21pY3JvJzonXFx4QjUnLCdtaWRkb3QnOidcXHhCNycsJ25ic3AnOidcXHhBMCcsJ25vdCc6J1xceEFDJywnbnRpbGRlJzonXFx4RjEnLCdOdGlsZGUnOidcXHhEMScsJ29hY3V0ZSc6J1xceEYzJywnT2FjdXRlJzonXFx4RDMnLCdvY2lyYyc6J1xceEY0JywnT2NpcmMnOidcXHhENCcsJ29ncmF2ZSc6J1xceEYyJywnT2dyYXZlJzonXFx4RDInLCdvcmRmJzonXFx4QUEnLCdvcmRtJzonXFx4QkEnLCdvc2xhc2gnOidcXHhGOCcsJ09zbGFzaCc6J1xceEQ4Jywnb3RpbGRlJzonXFx4RjUnLCdPdGlsZGUnOidcXHhENScsJ291bWwnOidcXHhGNicsJ091bWwnOidcXHhENicsJ3BhcmEnOidcXHhCNicsJ3BsdXNtbic6J1xceEIxJywncG91bmQnOidcXHhBMycsJ3F1b3QnOidcIicsJ1FVT1QnOidcIicsJ3JhcXVvJzonXFx4QkInLCdyZWcnOidcXHhBRScsJ1JFRyc6J1xceEFFJywnc2VjdCc6J1xceEE3Jywnc2h5JzonXFx4QUQnLCdzdXAxJzonXFx4QjknLCdzdXAyJzonXFx4QjInLCdzdXAzJzonXFx4QjMnLCdzemxpZyc6J1xceERGJywndGhvcm4nOidcXHhGRScsJ1RIT1JOJzonXFx4REUnLCd0aW1lcyc6J1xceEQ3JywndWFjdXRlJzonXFx4RkEnLCdVYWN1dGUnOidcXHhEQScsJ3VjaXJjJzonXFx4RkInLCdVY2lyYyc6J1xceERCJywndWdyYXZlJzonXFx4RjknLCdVZ3JhdmUnOidcXHhEOScsJ3VtbCc6J1xceEE4JywndXVtbCc6J1xceEZDJywnVXVtbCc6J1xceERDJywneWFjdXRlJzonXFx4RkQnLCdZYWN1dGUnOidcXHhERCcsJ3llbic6J1xceEE1JywneXVtbCc6J1xceEZGJ307XG5cdHZhciBkZWNvZGVNYXBOdW1lcmljID0geycwJzonXFx1RkZGRCcsJzEyOCc6J1xcdTIwQUMnLCcxMzAnOidcXHUyMDFBJywnMTMxJzonXFx1MDE5MicsJzEzMic6J1xcdTIwMUUnLCcxMzMnOidcXHUyMDI2JywnMTM0JzonXFx1MjAyMCcsJzEzNSc6J1xcdTIwMjEnLCcxMzYnOidcXHUwMkM2JywnMTM3JzonXFx1MjAzMCcsJzEzOCc6J1xcdTAxNjAnLCcxMzknOidcXHUyMDM5JywnMTQwJzonXFx1MDE1MicsJzE0Mic6J1xcdTAxN0QnLCcxNDUnOidcXHUyMDE4JywnMTQ2JzonXFx1MjAxOScsJzE0Nyc6J1xcdTIwMUMnLCcxNDgnOidcXHUyMDFEJywnMTQ5JzonXFx1MjAyMicsJzE1MCc6J1xcdTIwMTMnLCcxNTEnOidcXHUyMDE0JywnMTUyJzonXFx1MDJEQycsJzE1Myc6J1xcdTIxMjInLCcxNTQnOidcXHUwMTYxJywnMTU1JzonXFx1MjAzQScsJzE1Nic6J1xcdTAxNTMnLCcxNTgnOidcXHUwMTdFJywnMTU5JzonXFx1MDE3OCd9O1xuXHR2YXIgaW52YWxpZFJlZmVyZW5jZUNvZGVQb2ludHMgPSBbMSwyLDMsNCw1LDYsNyw4LDExLDEzLDE0LDE1LDE2LDE3LDE4LDE5LDIwLDIxLDIyLDIzLDI0LDI1LDI2LDI3LDI4LDI5LDMwLDMxLDEyNywxMjgsMTI5LDEzMCwxMzEsMTMyLDEzMywxMzQsMTM1LDEzNiwxMzcsMTM4LDEzOSwxNDAsMTQxLDE0MiwxNDMsMTQ0LDE0NSwxNDYsMTQ3LDE0OCwxNDksMTUwLDE1MSwxNTIsMTUzLDE1NCwxNTUsMTU2LDE1NywxNTgsMTU5LDY0OTc2LDY0OTc3LDY0OTc4LDY0OTc5LDY0OTgwLDY0OTgxLDY0OTgyLDY0OTgzLDY0OTg0LDY0OTg1LDY0OTg2LDY0OTg3LDY0OTg4LDY0OTg5LDY0OTkwLDY0OTkxLDY0OTkyLDY0OTkzLDY0OTk0LDY0OTk1LDY0OTk2LDY0OTk3LDY0OTk4LDY0OTk5LDY1MDAwLDY1MDAxLDY1MDAyLDY1MDAzLDY1MDA0LDY1MDA1LDY1MDA2LDY1MDA3LDY1NTM0LDY1NTM1LDEzMTA3MCwxMzEwNzEsMTk2NjA2LDE5NjYwNywyNjIxNDIsMjYyMTQzLDMyNzY3OCwzMjc2NzksMzkzMjE0LDM5MzIxNSw0NTg3NTAsNDU4NzUxLDUyNDI4Niw1MjQyODcsNTg5ODIyLDU4OTgyMyw2NTUzNTgsNjU1MzU5LDcyMDg5NCw3MjA4OTUsNzg2NDMwLDc4NjQzMSw4NTE5NjYsODUxOTY3LDkxNzUwMiw5MTc1MDMsOTgzMDM4LDk4MzAzOSwxMDQ4NTc0LDEwNDg1NzUsMTExNDExMCwxMTE0MTExXTtcblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHR2YXIgc3RyaW5nRnJvbUNoYXJDb2RlID0gU3RyaW5nLmZyb21DaGFyQ29kZTtcblxuXHR2YXIgb2JqZWN0ID0ge307XG5cdHZhciBoYXNPd25Qcm9wZXJ0eSA9IG9iamVjdC5oYXNPd25Qcm9wZXJ0eTtcblx0dmFyIGhhcyA9IGZ1bmN0aW9uKG9iamVjdCwgcHJvcGVydHlOYW1lKSB7XG5cdFx0cmV0dXJuIGhhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBwcm9wZXJ0eU5hbWUpO1xuXHR9O1xuXG5cdHZhciBjb250YWlucyA9IGZ1bmN0aW9uKGFycmF5LCB2YWx1ZSkge1xuXHRcdHZhciBpbmRleCA9IC0xO1xuXHRcdHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGg7XG5cdFx0d2hpbGUgKCsraW5kZXggPCBsZW5ndGgpIHtcblx0XHRcdGlmIChhcnJheVtpbmRleF0gPT0gdmFsdWUpIHtcblx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBmYWxzZTtcblx0fTtcblxuXHR2YXIgbWVyZ2UgPSBmdW5jdGlvbihvcHRpb25zLCBkZWZhdWx0cykge1xuXHRcdGlmICghb3B0aW9ucykge1xuXHRcdFx0cmV0dXJuIGRlZmF1bHRzO1xuXHRcdH1cblx0XHR2YXIgcmVzdWx0ID0ge307XG5cdFx0dmFyIGtleTtcblx0XHRmb3IgKGtleSBpbiBkZWZhdWx0cykge1xuXHRcdFx0Ly8gQSBgaGFzT3duUHJvcGVydHlgIGNoZWNrIGlzIG5vdCBuZWVkZWQgaGVyZSwgc2luY2Ugb25seSByZWNvZ25pemVkXG5cdFx0XHQvLyBvcHRpb24gbmFtZXMgYXJlIHVzZWQgYW55d2F5LiBBbnkgb3RoZXJzIGFyZSBpZ25vcmVkLlxuXHRcdFx0cmVzdWx0W2tleV0gPSBoYXMob3B0aW9ucywga2V5KSA/IG9wdGlvbnNba2V5XSA6IGRlZmF1bHRzW2tleV07XG5cdFx0fVxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH07XG5cblx0Ly8gTW9kaWZpZWQgdmVyc2lvbiBvZiBgdWNzMmVuY29kZWA7IHNlZSBodHRwczovL210aHMuYmUvcHVueWNvZGUuXG5cdHZhciBjb2RlUG9pbnRUb1N5bWJvbCA9IGZ1bmN0aW9uKGNvZGVQb2ludCwgc3RyaWN0KSB7XG5cdFx0dmFyIG91dHB1dCA9ICcnO1xuXHRcdGlmICgoY29kZVBvaW50ID49IDB4RDgwMCAmJiBjb2RlUG9pbnQgPD0gMHhERkZGKSB8fCBjb2RlUG9pbnQgPiAweDEwRkZGRikge1xuXHRcdFx0Ly8gU2VlIGlzc3VlICM0OlxuXHRcdFx0Ly8g4oCcT3RoZXJ3aXNlLCBpZiB0aGUgbnVtYmVyIGlzIGluIHRoZSByYW5nZSAweEQ4MDAgdG8gMHhERkZGIG9yIGlzXG5cdFx0XHQvLyBncmVhdGVyIHRoYW4gMHgxMEZGRkYsIHRoZW4gdGhpcyBpcyBhIHBhcnNlIGVycm9yLiBSZXR1cm4gYSBVK0ZGRkRcblx0XHRcdC8vIFJFUExBQ0VNRU5UIENIQVJBQ1RFUi7igJ1cblx0XHRcdGlmIChzdHJpY3QpIHtcblx0XHRcdFx0cGFyc2VFcnJvcignY2hhcmFjdGVyIHJlZmVyZW5jZSBvdXRzaWRlIHRoZSBwZXJtaXNzaWJsZSBVbmljb2RlIHJhbmdlJyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gJ1xcdUZGRkQnO1xuXHRcdH1cblx0XHRpZiAoaGFzKGRlY29kZU1hcE51bWVyaWMsIGNvZGVQb2ludCkpIHtcblx0XHRcdGlmIChzdHJpY3QpIHtcblx0XHRcdFx0cGFyc2VFcnJvcignZGlzYWxsb3dlZCBjaGFyYWN0ZXIgcmVmZXJlbmNlJyk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZGVjb2RlTWFwTnVtZXJpY1tjb2RlUG9pbnRdO1xuXHRcdH1cblx0XHRpZiAoc3RyaWN0ICYmIGNvbnRhaW5zKGludmFsaWRSZWZlcmVuY2VDb2RlUG9pbnRzLCBjb2RlUG9pbnQpKSB7XG5cdFx0XHRwYXJzZUVycm9yKCdkaXNhbGxvd2VkIGNoYXJhY3RlciByZWZlcmVuY2UnKTtcblx0XHR9XG5cdFx0aWYgKGNvZGVQb2ludCA+IDB4RkZGRikge1xuXHRcdFx0Y29kZVBvaW50IC09IDB4MTAwMDA7XG5cdFx0XHRvdXRwdXQgKz0gc3RyaW5nRnJvbUNoYXJDb2RlKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMCk7XG5cdFx0XHRjb2RlUG9pbnQgPSAweERDMDAgfCBjb2RlUG9pbnQgJiAweDNGRjtcblx0XHR9XG5cdFx0b3V0cHV0ICs9IHN0cmluZ0Zyb21DaGFyQ29kZShjb2RlUG9pbnQpO1xuXHRcdHJldHVybiBvdXRwdXQ7XG5cdH07XG5cblx0dmFyIGhleEVzY2FwZSA9IGZ1bmN0aW9uKGNvZGVQb2ludCkge1xuXHRcdHJldHVybiAnJiN4JyArIGNvZGVQb2ludC50b1N0cmluZygxNikudG9VcHBlckNhc2UoKSArICc7Jztcblx0fTtcblxuXHR2YXIgZGVjRXNjYXBlID0gZnVuY3Rpb24oY29kZVBvaW50KSB7XG5cdFx0cmV0dXJuICcmIycgKyBjb2RlUG9pbnQgKyAnOyc7XG5cdH07XG5cblx0dmFyIHBhcnNlRXJyb3IgPSBmdW5jdGlvbihtZXNzYWdlKSB7XG5cdFx0dGhyb3cgRXJyb3IoJ1BhcnNlIGVycm9yOiAnICsgbWVzc2FnZSk7XG5cdH07XG5cblx0LyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5cblx0dmFyIGVuY29kZSA9IGZ1bmN0aW9uKHN0cmluZywgb3B0aW9ucykge1xuXHRcdG9wdGlvbnMgPSBtZXJnZShvcHRpb25zLCBlbmNvZGUub3B0aW9ucyk7XG5cdFx0dmFyIHN0cmljdCA9IG9wdGlvbnMuc3RyaWN0O1xuXHRcdGlmIChzdHJpY3QgJiYgcmVnZXhJbnZhbGlkUmF3Q29kZVBvaW50LnRlc3Qoc3RyaW5nKSkge1xuXHRcdFx0cGFyc2VFcnJvcignZm9yYmlkZGVuIGNvZGUgcG9pbnQnKTtcblx0XHR9XG5cdFx0dmFyIGVuY29kZUV2ZXJ5dGhpbmcgPSBvcHRpb25zLmVuY29kZUV2ZXJ5dGhpbmc7XG5cdFx0dmFyIHVzZU5hbWVkUmVmZXJlbmNlcyA9IG9wdGlvbnMudXNlTmFtZWRSZWZlcmVuY2VzO1xuXHRcdHZhciBhbGxvd1Vuc2FmZVN5bWJvbHMgPSBvcHRpb25zLmFsbG93VW5zYWZlU3ltYm9scztcblx0XHR2YXIgZXNjYXBlQ29kZVBvaW50ID0gb3B0aW9ucy5kZWNpbWFsID8gZGVjRXNjYXBlIDogaGV4RXNjYXBlO1xuXG5cdFx0dmFyIGVzY2FwZUJtcFN5bWJvbCA9IGZ1bmN0aW9uKHN5bWJvbCkge1xuXHRcdFx0cmV0dXJuIGVzY2FwZUNvZGVQb2ludChzeW1ib2wuY2hhckNvZGVBdCgwKSk7XG5cdFx0fTtcblxuXHRcdGlmIChlbmNvZGVFdmVyeXRoaW5nKSB7XG5cdFx0XHQvLyBFbmNvZGUgQVNDSUkgc3ltYm9scy5cblx0XHRcdHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKHJlZ2V4QXNjaWlXaGl0ZWxpc3QsIGZ1bmN0aW9uKHN5bWJvbCkge1xuXHRcdFx0XHQvLyBVc2UgbmFtZWQgcmVmZXJlbmNlcyBpZiByZXF1ZXN0ZWQgJiBwb3NzaWJsZS5cblx0XHRcdFx0aWYgKHVzZU5hbWVkUmVmZXJlbmNlcyAmJiBoYXMoZW5jb2RlTWFwLCBzeW1ib2wpKSB7XG5cdFx0XHRcdFx0cmV0dXJuICcmJyArIGVuY29kZU1hcFtzeW1ib2xdICsgJzsnO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBlc2NhcGVCbXBTeW1ib2woc3ltYm9sKTtcblx0XHRcdH0pO1xuXHRcdFx0Ly8gU2hvcnRlbiBhIGZldyBlc2NhcGVzIHRoYXQgcmVwcmVzZW50IHR3byBzeW1ib2xzLCBvZiB3aGljaCBhdCBsZWFzdCBvbmVcblx0XHRcdC8vIGlzIHdpdGhpbiB0aGUgQVNDSUkgcmFuZ2UuXG5cdFx0XHRpZiAodXNlTmFtZWRSZWZlcmVuY2VzKSB7XG5cdFx0XHRcdHN0cmluZyA9IHN0cmluZ1xuXHRcdFx0XHRcdC5yZXBsYWNlKC8mZ3Q7XFx1MjBEMi9nLCAnJm52Z3Q7Jylcblx0XHRcdFx0XHQucmVwbGFjZSgvJmx0O1xcdTIwRDIvZywgJyZudmx0OycpXG5cdFx0XHRcdFx0LnJlcGxhY2UoLyYjeDY2OyYjeDZBOy9nLCAnJmZqbGlnOycpO1xuXHRcdFx0fVxuXHRcdFx0Ly8gRW5jb2RlIG5vbi1BU0NJSSBzeW1ib2xzLlxuXHRcdFx0aWYgKHVzZU5hbWVkUmVmZXJlbmNlcykge1xuXHRcdFx0XHQvLyBFbmNvZGUgbm9uLUFTQ0lJIHN5bWJvbHMgdGhhdCBjYW4gYmUgcmVwbGFjZWQgd2l0aCBhIG5hbWVkIHJlZmVyZW5jZS5cblx0XHRcdFx0c3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocmVnZXhFbmNvZGVOb25Bc2NpaSwgZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0XHRcdFx0Ly8gTm90ZTogdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBgaGFzKGVuY29kZU1hcCwgc3RyaW5nKWAgaGVyZS5cblx0XHRcdFx0XHRyZXR1cm4gJyYnICsgZW5jb2RlTWFwW3N0cmluZ10gKyAnOyc7XG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0Ly8gTm90ZTogYW55IHJlbWFpbmluZyBub24tQVNDSUkgc3ltYm9scyBhcmUgaGFuZGxlZCBvdXRzaWRlIG9mIHRoZSBgaWZgLlxuXHRcdH0gZWxzZSBpZiAodXNlTmFtZWRSZWZlcmVuY2VzKSB7XG5cdFx0XHQvLyBBcHBseSBuYW1lZCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy5cblx0XHRcdC8vIEVuY29kZSBgPD5cIicmYCB1c2luZyBuYW1lZCBjaGFyYWN0ZXIgcmVmZXJlbmNlcy5cblx0XHRcdGlmICghYWxsb3dVbnNhZmVTeW1ib2xzKSB7XG5cdFx0XHRcdHN0cmluZyA9IHN0cmluZy5yZXBsYWNlKHJlZ2V4RXNjYXBlLCBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRcdFx0XHRyZXR1cm4gJyYnICsgZW5jb2RlTWFwW3N0cmluZ10gKyAnOyc7IC8vIG5vIG5lZWQgdG8gY2hlY2sgYGhhcygpYCBoZXJlXG5cdFx0XHRcdH0pO1xuXHRcdFx0fVxuXHRcdFx0Ly8gU2hvcnRlbiBlc2NhcGVzIHRoYXQgcmVwcmVzZW50IHR3byBzeW1ib2xzLCBvZiB3aGljaCBhdCBsZWFzdCBvbmUgaXNcblx0XHRcdC8vIGA8PlwiJyZgLlxuXHRcdFx0c3RyaW5nID0gc3RyaW5nXG5cdFx0XHRcdC5yZXBsYWNlKC8mZ3Q7XFx1MjBEMi9nLCAnJm52Z3Q7Jylcblx0XHRcdFx0LnJlcGxhY2UoLyZsdDtcXHUyMEQyL2csICcmbnZsdDsnKTtcblx0XHRcdC8vIEVuY29kZSBub24tQVNDSUkgc3ltYm9scyB0aGF0IGNhbiBiZSByZXBsYWNlZCB3aXRoIGEgbmFtZWQgcmVmZXJlbmNlLlxuXHRcdFx0c3RyaW5nID0gc3RyaW5nLnJlcGxhY2UocmVnZXhFbmNvZGVOb25Bc2NpaSwgZnVuY3Rpb24oc3RyaW5nKSB7XG5cdFx0XHRcdC8vIE5vdGU6IHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgYGhhcyhlbmNvZGVNYXAsIHN0cmluZylgIGhlcmUuXG5cdFx0XHRcdHJldHVybiAnJicgKyBlbmNvZGVNYXBbc3RyaW5nXSArICc7Jztcblx0XHRcdH0pO1xuXHRcdH0gZWxzZSBpZiAoIWFsbG93VW5zYWZlU3ltYm9scykge1xuXHRcdFx0Ly8gRW5jb2RlIGA8PlwiJyZgIHVzaW5nIGhleGFkZWNpbWFsIGVzY2FwZXMsIG5vdyB0aGF0IHRoZXnigJlyZSBub3QgaGFuZGxlZFxuXHRcdFx0Ly8gdXNpbmcgbmFtZWQgY2hhcmFjdGVyIHJlZmVyZW5jZXMuXG5cdFx0XHRzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShyZWdleEVzY2FwZSwgZXNjYXBlQm1wU3ltYm9sKTtcblx0XHR9XG5cdFx0cmV0dXJuIHN0cmluZ1xuXHRcdFx0Ly8gRW5jb2RlIGFzdHJhbCBzeW1ib2xzLlxuXHRcdFx0LnJlcGxhY2UocmVnZXhBc3RyYWxTeW1ib2xzLCBmdW5jdGlvbigkMCkge1xuXHRcdFx0XHQvLyBodHRwczovL21hdGhpYXNieW5lbnMuYmUvbm90ZXMvamF2YXNjcmlwdC1lbmNvZGluZyNzdXJyb2dhdGUtZm9ybXVsYWVcblx0XHRcdFx0dmFyIGhpZ2ggPSAkMC5jaGFyQ29kZUF0KDApO1xuXHRcdFx0XHR2YXIgbG93ID0gJDAuY2hhckNvZGVBdCgxKTtcblx0XHRcdFx0dmFyIGNvZGVQb2ludCA9IChoaWdoIC0gMHhEODAwKSAqIDB4NDAwICsgbG93IC0gMHhEQzAwICsgMHgxMDAwMDtcblx0XHRcdFx0cmV0dXJuIGVzY2FwZUNvZGVQb2ludChjb2RlUG9pbnQpO1xuXHRcdFx0fSlcblx0XHRcdC8vIEVuY29kZSBhbnkgcmVtYWluaW5nIEJNUCBzeW1ib2xzIHRoYXQgYXJlIG5vdCBwcmludGFibGUgQVNDSUkgc3ltYm9sc1xuXHRcdFx0Ly8gdXNpbmcgYSBoZXhhZGVjaW1hbCBlc2NhcGUuXG5cdFx0XHQucmVwbGFjZShyZWdleEJtcFdoaXRlbGlzdCwgZXNjYXBlQm1wU3ltYm9sKTtcblx0fTtcblx0Ly8gRXhwb3NlIGRlZmF1bHQgb3B0aW9ucyAoc28gdGhleSBjYW4gYmUgb3ZlcnJpZGRlbiBnbG9iYWxseSkuXG5cdGVuY29kZS5vcHRpb25zID0ge1xuXHRcdCdhbGxvd1Vuc2FmZVN5bWJvbHMnOiBmYWxzZSxcblx0XHQnZW5jb2RlRXZlcnl0aGluZyc6IGZhbHNlLFxuXHRcdCdzdHJpY3QnOiBmYWxzZSxcblx0XHQndXNlTmFtZWRSZWZlcmVuY2VzJzogZmFsc2UsXG5cdFx0J2RlY2ltYWwnIDogZmFsc2Vcblx0fTtcblxuXHR2YXIgZGVjb2RlID0gZnVuY3Rpb24oaHRtbCwgb3B0aW9ucykge1xuXHRcdG9wdGlvbnMgPSBtZXJnZShvcHRpb25zLCBkZWNvZGUub3B0aW9ucyk7XG5cdFx0dmFyIHN0cmljdCA9IG9wdGlvbnMuc3RyaWN0O1xuXHRcdGlmIChzdHJpY3QgJiYgcmVnZXhJbnZhbGlkRW50aXR5LnRlc3QoaHRtbCkpIHtcblx0XHRcdHBhcnNlRXJyb3IoJ21hbGZvcm1lZCBjaGFyYWN0ZXIgcmVmZXJlbmNlJyk7XG5cdFx0fVxuXHRcdHJldHVybiBodG1sLnJlcGxhY2UocmVnZXhEZWNvZGUsIGZ1bmN0aW9uKCQwLCAkMSwgJDIsICQzLCAkNCwgJDUsICQ2LCAkNywgJDgpIHtcblx0XHRcdHZhciBjb2RlUG9pbnQ7XG5cdFx0XHR2YXIgc2VtaWNvbG9uO1xuXHRcdFx0dmFyIGRlY0RpZ2l0cztcblx0XHRcdHZhciBoZXhEaWdpdHM7XG5cdFx0XHR2YXIgcmVmZXJlbmNlO1xuXHRcdFx0dmFyIG5leHQ7XG5cblx0XHRcdGlmICgkMSkge1xuXHRcdFx0XHRyZWZlcmVuY2UgPSAkMTtcblx0XHRcdFx0Ly8gTm90ZTogdGhlcmUgaXMgbm8gbmVlZCB0byBjaGVjayBgaGFzKGRlY29kZU1hcCwgcmVmZXJlbmNlKWAuXG5cdFx0XHRcdHJldHVybiBkZWNvZGVNYXBbcmVmZXJlbmNlXTtcblx0XHRcdH1cblxuXHRcdFx0aWYgKCQyKSB7XG5cdFx0XHRcdC8vIERlY29kZSBuYW1lZCBjaGFyYWN0ZXIgcmVmZXJlbmNlcyB3aXRob3V0IHRyYWlsaW5nIGA7YCwgZS5nLiBgJmFtcGAuXG5cdFx0XHRcdC8vIFRoaXMgaXMgb25seSBhIHBhcnNlIGVycm9yIGlmIGl0IGdldHMgY29udmVydGVkIHRvIGAmYCwgb3IgaWYgaXQgaXNcblx0XHRcdFx0Ly8gZm9sbG93ZWQgYnkgYD1gIGluIGFuIGF0dHJpYnV0ZSBjb250ZXh0LlxuXHRcdFx0XHRyZWZlcmVuY2UgPSAkMjtcblx0XHRcdFx0bmV4dCA9ICQzO1xuXHRcdFx0XHRpZiAobmV4dCAmJiBvcHRpb25zLmlzQXR0cmlidXRlVmFsdWUpIHtcblx0XHRcdFx0XHRpZiAoc3RyaWN0ICYmIG5leHQgPT0gJz0nKSB7XG5cdFx0XHRcdFx0XHRwYXJzZUVycm9yKCdgJmAgZGlkIG5vdCBzdGFydCBhIGNoYXJhY3RlciByZWZlcmVuY2UnKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuICQwO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGlmIChzdHJpY3QpIHtcblx0XHRcdFx0XHRcdHBhcnNlRXJyb3IoXG5cdFx0XHRcdFx0XHRcdCduYW1lZCBjaGFyYWN0ZXIgcmVmZXJlbmNlIHdhcyBub3QgdGVybWluYXRlZCBieSBhIHNlbWljb2xvbidcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdC8vIE5vdGU6IHRoZXJlIGlzIG5vIG5lZWQgdG8gY2hlY2sgYGhhcyhkZWNvZGVNYXBMZWdhY3ksIHJlZmVyZW5jZSlgLlxuXHRcdFx0XHRcdHJldHVybiBkZWNvZGVNYXBMZWdhY3lbcmVmZXJlbmNlXSArIChuZXh0IHx8ICcnKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpZiAoJDQpIHtcblx0XHRcdFx0Ly8gRGVjb2RlIGRlY2ltYWwgZXNjYXBlcywgZS5nLiBgJiMxMTk1NTg7YC5cblx0XHRcdFx0ZGVjRGlnaXRzID0gJDQ7XG5cdFx0XHRcdHNlbWljb2xvbiA9ICQ1O1xuXHRcdFx0XHRpZiAoc3RyaWN0ICYmICFzZW1pY29sb24pIHtcblx0XHRcdFx0XHRwYXJzZUVycm9yKCdjaGFyYWN0ZXIgcmVmZXJlbmNlIHdhcyBub3QgdGVybWluYXRlZCBieSBhIHNlbWljb2xvbicpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGNvZGVQb2ludCA9IHBhcnNlSW50KGRlY0RpZ2l0cywgMTApO1xuXHRcdFx0XHRyZXR1cm4gY29kZVBvaW50VG9TeW1ib2woY29kZVBvaW50LCBzdHJpY3QpO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoJDYpIHtcblx0XHRcdFx0Ly8gRGVjb2RlIGhleGFkZWNpbWFsIGVzY2FwZXMsIGUuZy4gYCYjeDFEMzA2O2AuXG5cdFx0XHRcdGhleERpZ2l0cyA9ICQ2O1xuXHRcdFx0XHRzZW1pY29sb24gPSAkNztcblx0XHRcdFx0aWYgKHN0cmljdCAmJiAhc2VtaWNvbG9uKSB7XG5cdFx0XHRcdFx0cGFyc2VFcnJvcignY2hhcmFjdGVyIHJlZmVyZW5jZSB3YXMgbm90IHRlcm1pbmF0ZWQgYnkgYSBzZW1pY29sb24nKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRjb2RlUG9pbnQgPSBwYXJzZUludChoZXhEaWdpdHMsIDE2KTtcblx0XHRcdFx0cmV0dXJuIGNvZGVQb2ludFRvU3ltYm9sKGNvZGVQb2ludCwgc3RyaWN0KTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgd2XigJlyZSBzdGlsbCBoZXJlLCBgaWYgKCQ3KWAgaXMgaW1wbGllZDsgaXTigJlzIGFuIGFtYmlndW91c1xuXHRcdFx0Ly8gYW1wZXJzYW5kIGZvciBzdXJlLiBodHRwczovL210aHMuYmUvbm90ZXMvYW1iaWd1b3VzLWFtcGVyc2FuZHNcblx0XHRcdGlmIChzdHJpY3QpIHtcblx0XHRcdFx0cGFyc2VFcnJvcihcblx0XHRcdFx0XHQnbmFtZWQgY2hhcmFjdGVyIHJlZmVyZW5jZSB3YXMgbm90IHRlcm1pbmF0ZWQgYnkgYSBzZW1pY29sb24nXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gJDA7XG5cdFx0fSk7XG5cdH07XG5cdC8vIEV4cG9zZSBkZWZhdWx0IG9wdGlvbnMgKHNvIHRoZXkgY2FuIGJlIG92ZXJyaWRkZW4gZ2xvYmFsbHkpLlxuXHRkZWNvZGUub3B0aW9ucyA9IHtcblx0XHQnaXNBdHRyaWJ1dGVWYWx1ZSc6IGZhbHNlLFxuXHRcdCdzdHJpY3QnOiBmYWxzZVxuXHR9O1xuXG5cdHZhciBlc2NhcGUgPSBmdW5jdGlvbihzdHJpbmcpIHtcblx0XHRyZXR1cm4gc3RyaW5nLnJlcGxhY2UocmVnZXhFc2NhcGUsIGZ1bmN0aW9uKCQwKSB7XG5cdFx0XHQvLyBOb3RlOiB0aGVyZSBpcyBubyBuZWVkIHRvIGNoZWNrIGBoYXMoZXNjYXBlTWFwLCAkMClgIGhlcmUuXG5cdFx0XHRyZXR1cm4gZXNjYXBlTWFwWyQwXTtcblx0XHR9KTtcblx0fTtcblxuXHQvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi9cblxuXHR2YXIgaGUgPSB7XG5cdFx0J3ZlcnNpb24nOiAnMS4yLjAnLFxuXHRcdCdlbmNvZGUnOiBlbmNvZGUsXG5cdFx0J2RlY29kZSc6IGRlY29kZSxcblx0XHQnZXNjYXBlJzogZXNjYXBlLFxuXHRcdCd1bmVzY2FwZSc6IGRlY29kZVxuXHR9O1xuXG5cdC8vIFNvbWUgQU1EIGJ1aWxkIG9wdGltaXplcnMsIGxpa2Ugci5qcywgY2hlY2sgZm9yIHNwZWNpZmljIGNvbmRpdGlvbiBwYXR0ZXJuc1xuXHQvLyBsaWtlIHRoZSBmb2xsb3dpbmc6XG5cdGlmIChcblx0XHR0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiZcblx0XHR0eXBlb2YgZGVmaW5lLmFtZCA9PSAnb2JqZWN0JyAmJlxuXHRcdGRlZmluZS5hbWRcblx0KSB7XG5cdFx0ZGVmaW5lKGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIGhlO1xuXHRcdH0pO1xuXHR9XHRlbHNlIGlmIChmcmVlRXhwb3J0cyAmJiAhZnJlZUV4cG9ydHMubm9kZVR5cGUpIHtcblx0XHRpZiAoZnJlZU1vZHVsZSkgeyAvLyBpbiBOb2RlLmpzLCBpby5qcywgb3IgUmluZ29KUyB2MC44LjArXG5cdFx0XHRmcmVlTW9kdWxlLmV4cG9ydHMgPSBoZTtcblx0XHR9IGVsc2UgeyAvLyBpbiBOYXJ3aGFsIG9yIFJpbmdvSlMgdjAuNy4wLVxuXHRcdFx0Zm9yICh2YXIga2V5IGluIGhlKSB7XG5cdFx0XHRcdGhhcyhoZSwga2V5KSAmJiAoZnJlZUV4cG9ydHNba2V5XSA9IGhlW2tleV0pO1xuXHRcdFx0fVxuXHRcdH1cblx0fSBlbHNlIHsgLy8gaW4gUmhpbm8gb3IgYSB3ZWIgYnJvd3NlclxuXHRcdHJvb3QuaGUgPSBoZTtcblx0fVxuXG59KHRoaXMpKTtcbiIsImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgfVxufVxuIiwiLy8gR2VuZXJhdGVkIGJ5IENvZmZlZVNjcmlwdCAxLjYuM1xuKGZ1bmN0aW9uKCkge1xuICB2YXIgTG9jYWxlLCBMb2NhbGVzLCBhcHAsIF9yZWYsXG4gICAgX19zbGljZSA9IFtdLnNsaWNlO1xuXG4gIGFwcCA9IGZ1bmN0aW9uKHN1cHBvcnRlZCwgZGVmKSB7XG4gICAgaWYgKCEoc3VwcG9ydGVkIGluc3RhbmNlb2YgTG9jYWxlcykpIHtcbiAgICAgIHN1cHBvcnRlZCA9IG5ldyBMb2NhbGVzKHN1cHBvcnRlZCwgZGVmKTtcbiAgICAgIHN1cHBvcnRlZC5pbmRleCgpO1xuICAgIH1cbiAgICByZXR1cm4gZnVuY3Rpb24ocmVxLCByZXMsIG5leHQpIHtcbiAgICAgIHZhciBiZXN0TG9jYWxlLCBsb2NhbGVzO1xuICAgICAgbG9jYWxlcyA9IG5ldyBMb2NhbGVzKHJlcS5oZWFkZXJzW1wiYWNjZXB0LWxhbmd1YWdlXCJdKTtcbiAgICAgIGJlc3RMb2NhbGUgPSBsb2NhbGVzLmJlc3Qoc3VwcG9ydGVkKTtcbiAgICAgIHJlcS5sb2NhbGUgPSBTdHJpbmcoYmVzdExvY2FsZSk7XG4gICAgICByZXEucmF3TG9jYWxlID0gYmVzdExvY2FsZTtcbiAgICAgIHJldHVybiBuZXh0KCk7XG4gICAgfTtcbiAgfTtcblxuICBhcHAuTG9jYWxlID0gKGZ1bmN0aW9uKCkge1xuICAgIHZhciBzZXJpYWxpemU7XG5cbiAgICBMb2NhbGVbXCJkZWZhdWx0XCJdID0gbmV3IExvY2FsZShwcm9jZXNzLmVudi5MQU5HIHx8IFwiZW5fVVNcIik7XG5cbiAgICBmdW5jdGlvbiBMb2NhbGUoc3RyKSB7XG4gICAgICB2YXIgY291bnRyeSwgbGFuZ3VhZ2UsIG1hdGNoLCBub3JtYWxpemVkO1xuICAgICAgaWYgKCEobWF0Y2ggPSBzdHIgIT0gbnVsbCA/IHN0ci5tYXRjaCgvW2Etel0rL2dpKSA6IHZvaWQgMCkpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgbGFuZ3VhZ2UgPSBtYXRjaFswXSwgY291bnRyeSA9IG1hdGNoWzFdO1xuICAgICAgdGhpcy5jb2RlID0gc3RyO1xuICAgICAgdGhpcy5sYW5ndWFnZSA9IGxhbmd1YWdlLnRvTG93ZXJDYXNlKCk7XG4gICAgICBpZiAoY291bnRyeSkge1xuICAgICAgICB0aGlzLmNvdW50cnkgPSBjb3VudHJ5LnRvVXBwZXJDYXNlKCk7XG4gICAgICB9XG4gICAgICBub3JtYWxpemVkID0gW3RoaXMubGFuZ3VhZ2VdO1xuICAgICAgaWYgKHRoaXMuY291bnRyeSkge1xuICAgICAgICBub3JtYWxpemVkLnB1c2godGhpcy5jb3VudHJ5KTtcbiAgICAgIH1cbiAgICAgIHRoaXMubm9ybWFsaXplZCA9IG5vcm1hbGl6ZWQuam9pbihcIl9cIik7XG4gICAgfVxuXG4gICAgc2VyaWFsaXplID0gZnVuY3Rpb24oKSB7XG4gICAgICBpZiAodGhpcy5sYW5ndWFnZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb2RlO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICB9XG4gICAgfTtcblxuICAgIExvY2FsZS5wcm90b3R5cGUudG9TdHJpbmcgPSBzZXJpYWxpemU7XG5cbiAgICBMb2NhbGUucHJvdG90eXBlLnRvSlNPTiA9IHNlcmlhbGl6ZTtcblxuICAgIHJldHVybiBMb2NhbGU7XG5cbiAgfSkoKTtcblxuICBhcHAuTG9jYWxlcyA9IChmdW5jdGlvbigpIHtcbiAgICB2YXIgc2VyaWFsaXplO1xuXG4gICAgTG9jYWxlcy5wcm90b3R5cGUubGVuZ3RoID0gMDtcblxuICAgIExvY2FsZXMucHJvdG90eXBlLl9pbmRleCA9IG51bGw7XG5cbiAgICBMb2NhbGVzLnByb3RvdHlwZS5zb3J0ID0gQXJyYXkucHJvdG90eXBlLnNvcnQ7XG5cbiAgICBMb2NhbGVzLnByb3RvdHlwZS5wdXNoID0gQXJyYXkucHJvdG90eXBlLnB1c2g7XG5cbiAgICBmdW5jdGlvbiBMb2NhbGVzKHN0ciwgZGVmKSB7XG4gICAgICB2YXIgaXRlbSwgbG9jYWxlLCBxLCBfaSwgX2xlbiwgX3JlZiwgX3JlZjE7XG4gICAgICBpZiAoZGVmKSB7XG4gICAgICAgIHRoaXNbXCJkZWZhdWx0XCJdID0gbmV3IExvY2FsZShkZWYpO1xuICAgICAgfVxuICAgICAgaWYgKCFzdHIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgICAgX3JlZiA9IChTdHJpbmcoc3RyKSkuc3BsaXQoXCIsXCIpO1xuICAgICAgZm9yIChfaSA9IDAsIF9sZW4gPSBfcmVmLmxlbmd0aDsgX2kgPCBfbGVuOyBfaSsrKSB7XG4gICAgICAgIGl0ZW0gPSBfcmVmW19pXTtcbiAgICAgICAgX3JlZjEgPSBpdGVtLnNwbGl0KFwiO1wiKSwgbG9jYWxlID0gX3JlZjFbMF0sIHEgPSBfcmVmMVsxXTtcbiAgICAgICAgbG9jYWxlID0gbmV3IExvY2FsZShsb2NhbGUudHJpbSgpKTtcbiAgICAgICAgbG9jYWxlLnNjb3JlID0gcSA/ICtxLnNsaWNlKDIpIHx8IDAgOiAxO1xuICAgICAgICB0aGlzLnB1c2gobG9jYWxlKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuc29ydChmdW5jdGlvbihhLCBiKSB7XG4gICAgICAgIHJldHVybiBiLnNjb3JlIC0gYS5zY29yZTtcbiAgICAgIH0pO1xuICAgIH1cblxuICAgIExvY2FsZXMucHJvdG90eXBlLmluZGV4ID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgaWR4LCBsb2NhbGUsIF9pLCBfbGVuO1xuICAgICAgaWYgKCF0aGlzLl9pbmRleCkge1xuICAgICAgICB0aGlzLl9pbmRleCA9IHt9O1xuICAgICAgICBmb3IgKGlkeCA9IF9pID0gMCwgX2xlbiA9IHRoaXMubGVuZ3RoOyBfaSA8IF9sZW47IGlkeCA9ICsrX2kpIHtcbiAgICAgICAgICBsb2NhbGUgPSB0aGlzW2lkeF07XG4gICAgICAgICAgdGhpcy5faW5kZXhbbG9jYWxlLm5vcm1hbGl6ZWRdID0gaWR4O1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gdGhpcy5faW5kZXg7XG4gICAgfTtcblxuICAgIExvY2FsZXMucHJvdG90eXBlLmJlc3QgPSBmdW5jdGlvbihsb2NhbGVzKSB7XG4gICAgICB2YXIgaW5kZXgsIGl0ZW0sIGwsIGxhbmd1YWdlSW5kZXgsIGxvY2FsZSwgbm9ybWFsaXplZEluZGV4LCBzZXRMb2NhbGUsIF9pLCBfaiwgX2xlbiwgX2xlbjE7XG4gICAgICBzZXRMb2NhbGUgPSBmdW5jdGlvbihsKSB7XG4gICAgICAgIHZhciByO1xuICAgICAgICByID0gbDtcbiAgICAgICAgci5kZWZhdWx0ZWQgPSBmYWxzZTtcbiAgICAgICAgcmV0dXJuIHI7XG4gICAgICB9O1xuICAgICAgbG9jYWxlID0gTG9jYWxlW1wiZGVmYXVsdFwiXTtcbiAgICAgIGlmIChsb2NhbGVzICYmIGxvY2FsZXNbXCJkZWZhdWx0XCJdKSB7XG4gICAgICAgIGxvY2FsZSA9IGxvY2FsZXNbXCJkZWZhdWx0XCJdO1xuICAgICAgfVxuICAgICAgbG9jYWxlLmRlZmF1bHRlZCA9IHRydWU7XG4gICAgICBpZiAoIWxvY2FsZXMpIHtcbiAgICAgICAgaWYgKHRoaXNbMF0pIHtcbiAgICAgICAgICBsb2NhbGUgPSB0aGlzWzBdO1xuICAgICAgICAgIGxvY2FsZS5kZWZhdWx0ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsb2NhbGU7XG4gICAgICB9XG4gICAgICBpbmRleCA9IGxvY2FsZXMuaW5kZXgoKTtcbiAgICAgIGZvciAoX2kgPSAwLCBfbGVuID0gdGhpcy5sZW5ndGg7IF9pIDwgX2xlbjsgX2krKykge1xuICAgICAgICBpdGVtID0gdGhpc1tfaV07XG4gICAgICAgIG5vcm1hbGl6ZWRJbmRleCA9IGluZGV4W2l0ZW0ubm9ybWFsaXplZF07XG4gICAgICAgIGxhbmd1YWdlSW5kZXggPSBpbmRleFtpdGVtLmxhbmd1YWdlXTtcbiAgICAgICAgaWYgKG5vcm1hbGl6ZWRJbmRleCAhPSBudWxsKSB7XG4gICAgICAgICAgcmV0dXJuIHNldExvY2FsZShsb2NhbGVzW25vcm1hbGl6ZWRJbmRleF0pO1xuICAgICAgICB9IGVsc2UgaWYgKGxhbmd1YWdlSW5kZXggIT0gbnVsbCkge1xuICAgICAgICAgIHJldHVybiBzZXRMb2NhbGUobG9jYWxlc1tsYW5ndWFnZUluZGV4XSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZm9yIChfaiA9IDAsIF9sZW4xID0gbG9jYWxlcy5sZW5ndGg7IF9qIDwgX2xlbjE7IF9qKyspIHtcbiAgICAgICAgICAgIGwgPSBsb2NhbGVzW19qXTtcbiAgICAgICAgICAgIGlmIChsLmxhbmd1YWdlID09PSBpdGVtLmxhbmd1YWdlKSB7XG4gICAgICAgICAgICAgIHJldHVybiBzZXRMb2NhbGUobCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gbG9jYWxlO1xuICAgIH07XG5cbiAgICBzZXJpYWxpemUgPSBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBfX3NsaWNlLmNhbGwodGhpcyk7XG4gICAgfTtcblxuICAgIExvY2FsZXMucHJvdG90eXBlLnRvSlNPTiA9IHNlcmlhbGl6ZTtcblxuICAgIExvY2FsZXMucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gU3RyaW5nKHRoaXMudG9KU09OKCkpO1xuICAgIH07XG5cbiAgICByZXR1cm4gTG9jYWxlcztcblxuICB9KSgpO1xuXG4gIF9yZWYgPSBtb2R1bGUuZXhwb3J0cyA9IGFwcCwgTG9jYWxlID0gX3JlZi5Mb2NhbGUsIExvY2FsZXMgPSBfcmVmLkxvY2FsZXM7XG5cbn0pLmNhbGwodGhpcyk7XG4iLCJ2YXIgX2NjID0gW1xuICB7Y2FyZGluYWw6W1wib3RoZXJcIl0sb3JkaW5hbDpbXCJvdGhlclwiXX0sXG4gIHtjYXJkaW5hbDpbXCJvbmVcIixcIm90aGVyXCJdLG9yZGluYWw6W1wib3RoZXJcIl19LFxuICB7Y2FyZGluYWw6W1wib25lXCIsXCJvdGhlclwiXSxvcmRpbmFsOltcIm9uZVwiLFwib3RoZXJcIl19LFxuICB7Y2FyZGluYWw6W1wib25lXCIsXCJ0d29cIixcIm90aGVyXCJdLG9yZGluYWw6W1wib3RoZXJcIl19XG5dO1xuXG4oZnVuY3Rpb24gKHJvb3QsIHBsdXJhbENhdGVnb3JpZXMpIHtcbiAgaWYgKHR5cGVvZiBkZWZpbmUgPT09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCkge1xuICAgIGRlZmluZShwbHVyYWxDYXRlZ29yaWVzKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgZXhwb3J0cyA9PT0gJ29iamVjdCcpIHtcbiAgICBtb2R1bGUuZXhwb3J0cyA9IHBsdXJhbENhdGVnb3JpZXM7XG4gIH0gZWxzZSB7XG4gICAgcm9vdC5wbHVyYWxDYXRlZ29yaWVzID0gcGx1cmFsQ2F0ZWdvcmllcztcbiAgfVxufSh0aGlzLCB7XG5hZjogX2NjWzFdLFxuYWs6IF9jY1sxXSxcbmFtOiBfY2NbMV0sXG5hcjoge2NhcmRpbmFsOltcInplcm9cIixcIm9uZVwiLFwidHdvXCIsXCJmZXdcIixcIm1hbnlcIixcIm90aGVyXCJdLG9yZGluYWw6W1wib3RoZXJcIl19LFxuYXJzOiB7Y2FyZGluYWw6W1wiemVyb1wiLFwib25lXCIsXCJ0d29cIixcImZld1wiLFwibWFueVwiLFwib3RoZXJcIl0sb3JkaW5hbDpbXCJvdGhlclwiXX0sXG5hczoge2NhcmRpbmFsOltcIm9uZVwiLFwib3RoZXJcIl0sb3JkaW5hbDpbXCJvbmVcIixcInR3b1wiLFwiZmV3XCIsXCJtYW55XCIsXCJvdGhlclwiXX0sXG5hc2E6IF9jY1sxXSxcbmFzdDogX2NjWzFdLFxuYXo6IHtjYXJkaW5hbDpbXCJvbmVcIixcIm90aGVyXCJdLG9yZGluYWw6W1wib25lXCIsXCJmZXdcIixcIm1hbnlcIixcIm90aGVyXCJdfSxcbmJlOiB7Y2FyZGluYWw6W1wib25lXCIsXCJmZXdcIixcIm1hbnlcIixcIm90aGVyXCJdLG9yZGluYWw6W1wiZmV3XCIsXCJvdGhlclwiXX0sXG5iZW06IF9jY1sxXSxcbmJlejogX2NjWzFdLFxuYmc6IF9jY1sxXSxcbmJoOiBfY2NbMV0sXG5ibTogX2NjWzBdLFxuYm46IHtjYXJkaW5hbDpbXCJvbmVcIixcIm90aGVyXCJdLG9yZGluYWw6W1wib25lXCIsXCJ0d29cIixcImZld1wiLFwibWFueVwiLFwib3RoZXJcIl19LFxuYm86IF9jY1swXSxcbmJyOiB7Y2FyZGluYWw6W1wib25lXCIsXCJ0d29cIixcImZld1wiLFwibWFueVwiLFwib3RoZXJcIl0sb3JkaW5hbDpbXCJvdGhlclwiXX0sXG5icng6IF9jY1sxXSxcbmJzOiB7Y2FyZGluYWw6W1wib25lXCIsXCJmZXdcIixcIm90aGVyXCJdLG9yZGluYWw6W1wib3RoZXJcIl19LFxuY2E6IHtjYXJkaW5hbDpbXCJvbmVcIixcIm90aGVyXCJdLG9yZGluYWw6W1wib25lXCIsXCJ0d29cIixcImZld1wiLFwib3RoZXJcIl19LFxuY2U6IF9jY1sxXSxcbmNnZzogX2NjWzFdLFxuY2hyOiBfY2NbMV0sXG5ja2I6IF9jY1sxXSxcbmNzOiB7Y2FyZGluYWw6W1wib25lXCIsXCJmZXdcIixcIm1hbnlcIixcIm90aGVyXCJdLG9yZGluYWw6W1wib3RoZXJcIl19LFxuY3k6IHtjYXJkaW5hbDpbXCJ6ZXJvXCIsXCJvbmVcIixcInR3b1wiLFwiZmV3XCIsXCJtYW55XCIsXCJvdGhlclwiXSxvcmRpbmFsOltcInplcm9cIixcIm9uZVwiLFwidHdvXCIsXCJmZXdcIixcIm1hbnlcIixcIm90aGVyXCJdfSxcbmRhOiBfY2NbMV0sXG5kZTogX2NjWzFdLFxuZHNiOiB7Y2FyZGluYWw6W1wib25lXCIsXCJ0d29cIixcImZld1wiLFwib3RoZXJcIl0sb3JkaW5hbDpbXCJvdGhlclwiXX0sXG5kdjogX2NjWzFdLFxuZHo6IF9jY1swXSxcbmVlOiBfY2NbMV0sXG5lbDogX2NjWzFdLFxuZW46IHtjYXJkaW5hbDpbXCJvbmVcIixcIm90aGVyXCJdLG9yZGluYWw6W1wib25lXCIsXCJ0d29cIixcImZld1wiLFwib3RoZXJcIl19LFxuZW86IF9jY1sxXSxcbmVzOiBfY2NbMV0sXG5ldDogX2NjWzFdLFxuZXU6IF9jY1sxXSxcbmZhOiBfY2NbMV0sXG5mZjogX2NjWzFdLFxuZmk6IF9jY1sxXSxcbmZpbDogX2NjWzJdLFxuZm86IF9jY1sxXSxcbmZyOiBfY2NbMl0sXG5mdXI6IF9jY1sxXSxcbmZ5OiBfY2NbMV0sXG5nYToge2NhcmRpbmFsOltcIm9uZVwiLFwidHdvXCIsXCJmZXdcIixcIm1hbnlcIixcIm90aGVyXCJdLG9yZGluYWw6W1wib25lXCIsXCJvdGhlclwiXX0sXG5nZDoge2NhcmRpbmFsOltcIm9uZVwiLFwidHdvXCIsXCJmZXdcIixcIm90aGVyXCJdLG9yZGluYWw6W1wib25lXCIsXCJ0d29cIixcImZld1wiLFwib3RoZXJcIl19LFxuZ2w6IF9jY1sxXSxcbmdzdzogX2NjWzFdLFxuZ3U6IHtjYXJkaW5hbDpbXCJvbmVcIixcIm90aGVyXCJdLG9yZGluYWw6W1wib25lXCIsXCJ0d29cIixcImZld1wiLFwibWFueVwiLFwib3RoZXJcIl19LFxuZ3V3OiBfY2NbMV0sXG5ndjoge2NhcmRpbmFsOltcIm9uZVwiLFwidHdvXCIsXCJmZXdcIixcIm1hbnlcIixcIm90aGVyXCJdLG9yZGluYWw6W1wib3RoZXJcIl19LFxuaGE6IF9jY1sxXSxcbmhhdzogX2NjWzFdLFxuaGU6IHtjYXJkaW5hbDpbXCJvbmVcIixcInR3b1wiLFwibWFueVwiLFwib3RoZXJcIl0sb3JkaW5hbDpbXCJvdGhlclwiXX0sXG5oaToge2NhcmRpbmFsOltcIm9uZVwiLFwib3RoZXJcIl0sb3JkaW5hbDpbXCJvbmVcIixcInR3b1wiLFwiZmV3XCIsXCJtYW55XCIsXCJvdGhlclwiXX0sXG5ocjoge2NhcmRpbmFsOltcIm9uZVwiLFwiZmV3XCIsXCJvdGhlclwiXSxvcmRpbmFsOltcIm90aGVyXCJdfSxcbmhzYjoge2NhcmRpbmFsOltcIm9uZVwiLFwidHdvXCIsXCJmZXdcIixcIm90aGVyXCJdLG9yZGluYWw6W1wib3RoZXJcIl19LFxuaHU6IF9jY1syXSxcbmh5OiBfY2NbMl0sXG5pYTogX2NjWzFdLFxuaWQ6IF9jY1swXSxcbmlnOiBfY2NbMF0sXG5paTogX2NjWzBdLFxuXCJpblwiOiBfY2NbMF0sXG5pbzogX2NjWzFdLFxuaXM6IF9jY1sxXSxcbml0OiB7Y2FyZGluYWw6W1wib25lXCIsXCJvdGhlclwiXSxvcmRpbmFsOltcIm1hbnlcIixcIm90aGVyXCJdfSxcbml1OiBfY2NbM10sXG5pdzoge2NhcmRpbmFsOltcIm9uZVwiLFwidHdvXCIsXCJtYW55XCIsXCJvdGhlclwiXSxvcmRpbmFsOltcIm90aGVyXCJdfSxcbmphOiBfY2NbMF0sXG5qYm86IF9jY1swXSxcbmpnbzogX2NjWzFdLFxuamk6IF9jY1sxXSxcbmptYzogX2NjWzFdLFxuanY6IF9jY1swXSxcbmp3OiBfY2NbMF0sXG5rYToge2NhcmRpbmFsOltcIm9uZVwiLFwib3RoZXJcIl0sb3JkaW5hbDpbXCJvbmVcIixcIm1hbnlcIixcIm90aGVyXCJdfSxcbmthYjogX2NjWzFdLFxua2FqOiBfY2NbMV0sXG5rY2c6IF9jY1sxXSxcbmtkZTogX2NjWzBdLFxua2VhOiBfY2NbMF0sXG5razoge2NhcmRpbmFsOltcIm9uZVwiLFwib3RoZXJcIl0sb3JkaW5hbDpbXCJtYW55XCIsXCJvdGhlclwiXX0sXG5ra2o6IF9jY1sxXSxcbmtsOiBfY2NbMV0sXG5rbTogX2NjWzBdLFxua246IF9jY1sxXSxcbmtvOiBfY2NbMF0sXG5rczogX2NjWzFdLFxua3NiOiBfY2NbMV0sXG5rc2g6IHtjYXJkaW5hbDpbXCJ6ZXJvXCIsXCJvbmVcIixcIm90aGVyXCJdLG9yZGluYWw6W1wib3RoZXJcIl19LFxua3U6IF9jY1sxXSxcbmt3OiBfY2NbM10sXG5reTogX2NjWzFdLFxubGFnOiB7Y2FyZGluYWw6W1wiemVyb1wiLFwib25lXCIsXCJvdGhlclwiXSxvcmRpbmFsOltcIm90aGVyXCJdfSxcbmxiOiBfY2NbMV0sXG5sZzogX2NjWzFdLFxubGt0OiBfY2NbMF0sXG5sbjogX2NjWzFdLFxubG86IHtjYXJkaW5hbDpbXCJvdGhlclwiXSxvcmRpbmFsOltcIm9uZVwiLFwib3RoZXJcIl19LFxubHQ6IHtjYXJkaW5hbDpbXCJvbmVcIixcImZld1wiLFwibWFueVwiLFwib3RoZXJcIl0sb3JkaW5hbDpbXCJvdGhlclwiXX0sXG5sdjoge2NhcmRpbmFsOltcInplcm9cIixcIm9uZVwiLFwib3RoZXJcIl0sb3JkaW5hbDpbXCJvdGhlclwiXX0sXG5tYXM6IF9jY1sxXSxcbm1nOiBfY2NbMV0sXG5tZ286IF9jY1sxXSxcbm1rOiB7Y2FyZGluYWw6W1wib25lXCIsXCJvdGhlclwiXSxvcmRpbmFsOltcIm9uZVwiLFwidHdvXCIsXCJtYW55XCIsXCJvdGhlclwiXX0sXG5tbDogX2NjWzFdLFxubW46IF9jY1sxXSxcbm1vOiB7Y2FyZGluYWw6W1wib25lXCIsXCJmZXdcIixcIm90aGVyXCJdLG9yZGluYWw6W1wib25lXCIsXCJvdGhlclwiXX0sXG5tcjoge2NhcmRpbmFsOltcIm9uZVwiLFwib3RoZXJcIl0sb3JkaW5hbDpbXCJvbmVcIixcInR3b1wiLFwiZmV3XCIsXCJvdGhlclwiXX0sXG5tczoge2NhcmRpbmFsOltcIm90aGVyXCJdLG9yZGluYWw6W1wib25lXCIsXCJvdGhlclwiXX0sXG5tdDoge2NhcmRpbmFsOltcIm9uZVwiLFwiZmV3XCIsXCJtYW55XCIsXCJvdGhlclwiXSxvcmRpbmFsOltcIm90aGVyXCJdfSxcbm15OiBfY2NbMF0sXG5uYWg6IF9jY1sxXSxcbm5hcTogX2NjWzNdLFxubmI6IF9jY1sxXSxcbm5kOiBfY2NbMV0sXG5uZTogX2NjWzJdLFxubmw6IF9jY1sxXSxcbm5uOiBfY2NbMV0sXG5ubmg6IF9jY1sxXSxcbm5vOiBfY2NbMV0sXG5ucW86IF9jY1swXSxcbm5yOiBfY2NbMV0sXG5uc286IF9jY1sxXSxcbm55OiBfY2NbMV0sXG5ueW46IF9jY1sxXSxcbm9tOiBfY2NbMV0sXG5vcjoge2NhcmRpbmFsOltcIm9uZVwiLFwib3RoZXJcIl0sb3JkaW5hbDpbXCJvbmVcIixcInR3b1wiLFwiZmV3XCIsXCJtYW55XCIsXCJvdGhlclwiXX0sXG5vczogX2NjWzFdLFxucGE6IF9jY1sxXSxcbnBhcDogX2NjWzFdLFxucGw6IHtjYXJkaW5hbDpbXCJvbmVcIixcImZld1wiLFwibWFueVwiLFwib3RoZXJcIl0sb3JkaW5hbDpbXCJvdGhlclwiXX0sXG5wcmc6IHtjYXJkaW5hbDpbXCJ6ZXJvXCIsXCJvbmVcIixcIm90aGVyXCJdLG9yZGluYWw6W1wib3RoZXJcIl19LFxucHM6IF9jY1sxXSxcbnB0OiBfY2NbMV0sXG5cInB0LVBUXCI6IF9jY1sxXSxcbnJtOiBfY2NbMV0sXG5ybzoge2NhcmRpbmFsOltcIm9uZVwiLFwiZmV3XCIsXCJvdGhlclwiXSxvcmRpbmFsOltcIm9uZVwiLFwib3RoZXJcIl19LFxucm9mOiBfY2NbMV0sXG5yb290OiBfY2NbMF0sXG5ydToge2NhcmRpbmFsOltcIm9uZVwiLFwiZmV3XCIsXCJtYW55XCIsXCJvdGhlclwiXSxvcmRpbmFsOltcIm90aGVyXCJdfSxcbnJ3azogX2NjWzFdLFxuc2FoOiBfY2NbMF0sXG5zYXE6IF9jY1sxXSxcbnNjOiB7Y2FyZGluYWw6W1wib25lXCIsXCJvdGhlclwiXSxvcmRpbmFsOltcIm1hbnlcIixcIm90aGVyXCJdfSxcbnNjbjoge2NhcmRpbmFsOltcIm9uZVwiLFwib3RoZXJcIl0sb3JkaW5hbDpbXCJtYW55XCIsXCJvdGhlclwiXX0sXG5zZDogX2NjWzFdLFxuc2RoOiBfY2NbMV0sXG5zZTogX2NjWzNdLFxuc2VoOiBfY2NbMV0sXG5zZXM6IF9jY1swXSxcbnNnOiBfY2NbMF0sXG5zaDoge2NhcmRpbmFsOltcIm9uZVwiLFwiZmV3XCIsXCJvdGhlclwiXSxvcmRpbmFsOltcIm90aGVyXCJdfSxcbnNoaToge2NhcmRpbmFsOltcIm9uZVwiLFwiZmV3XCIsXCJvdGhlclwiXSxvcmRpbmFsOltcIm90aGVyXCJdfSxcbnNpOiBfY2NbMV0sXG5zazoge2NhcmRpbmFsOltcIm9uZVwiLFwiZmV3XCIsXCJtYW55XCIsXCJvdGhlclwiXSxvcmRpbmFsOltcIm90aGVyXCJdfSxcbnNsOiB7Y2FyZGluYWw6W1wib25lXCIsXCJ0d29cIixcImZld1wiLFwib3RoZXJcIl0sb3JkaW5hbDpbXCJvdGhlclwiXX0sXG5zbWE6IF9jY1szXSxcbnNtaTogX2NjWzNdLFxuc21qOiBfY2NbM10sXG5zbW46IF9jY1szXSxcbnNtczogX2NjWzNdLFxuc246IF9jY1sxXSxcbnNvOiBfY2NbMV0sXG5zcToge2NhcmRpbmFsOltcIm9uZVwiLFwib3RoZXJcIl0sb3JkaW5hbDpbXCJvbmVcIixcIm1hbnlcIixcIm90aGVyXCJdfSxcbnNyOiB7Y2FyZGluYWw6W1wib25lXCIsXCJmZXdcIixcIm90aGVyXCJdLG9yZGluYWw6W1wib3RoZXJcIl19LFxuc3M6IF9jY1sxXSxcbnNzeTogX2NjWzFdLFxuc3Q6IF9jY1sxXSxcbnN2OiBfY2NbMl0sXG5zdzogX2NjWzFdLFxuc3lyOiBfY2NbMV0sXG50YTogX2NjWzFdLFxudGU6IF9jY1sxXSxcbnRlbzogX2NjWzFdLFxudGg6IF9jY1swXSxcbnRpOiBfY2NbMV0sXG50aWc6IF9jY1sxXSxcbnRrOiB7Y2FyZGluYWw6W1wib25lXCIsXCJvdGhlclwiXSxvcmRpbmFsOltcImZld1wiLFwib3RoZXJcIl19LFxudGw6IF9jY1syXSxcbnRuOiBfY2NbMV0sXG50bzogX2NjWzBdLFxudHI6IF9jY1sxXSxcbnRzOiBfY2NbMV0sXG50em06IF9jY1sxXSxcbnVnOiBfY2NbMV0sXG51azoge2NhcmRpbmFsOltcIm9uZVwiLFwiZmV3XCIsXCJtYW55XCIsXCJvdGhlclwiXSxvcmRpbmFsOltcImZld1wiLFwib3RoZXJcIl19LFxudXI6IF9jY1sxXSxcbnV6OiBfY2NbMV0sXG52ZTogX2NjWzFdLFxudmk6IHtjYXJkaW5hbDpbXCJvdGhlclwiXSxvcmRpbmFsOltcIm9uZVwiLFwib3RoZXJcIl19LFxudm86IF9jY1sxXSxcbnZ1bjogX2NjWzFdLFxud2E6IF9jY1sxXSxcbndhZTogX2NjWzFdLFxud286IF9jY1swXSxcbnhoOiBfY2NbMV0sXG54b2c6IF9jY1sxXSxcbnlpOiBfY2NbMV0sXG55bzogX2NjWzBdLFxueXVlOiBfY2NbMF0sXG56aDogX2NjWzBdLFxuenU6IF9jY1sxXVxufSkpO1xuIiwidmFyIF9jcCA9IFtcbmZ1bmN0aW9uKG4sIG9yZCkge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuICdvdGhlcic7XG59LFxuZnVuY3Rpb24obiwgb3JkKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuZnVuY3Rpb24obiwgb3JkKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKChuID09IDBcbiAgICAgICAgICB8fCBuID09IDEpKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5mdW5jdGlvbihuLCBvcmQpIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgdjAgPSAhc1sxXTtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxICYmIHYwKSA/ICdvbmUnIDogJ290aGVyJztcbn1cbl07XG5cbihmdW5jdGlvbiAocm9vdCwgcGx1cmFscykge1xuICBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7XG4gICAgZGVmaW5lKHBsdXJhbHMpO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0Jykge1xuICAgIG1vZHVsZS5leHBvcnRzID0gcGx1cmFscztcbiAgfSBlbHNlIHtcbiAgICByb290LnBsdXJhbHMgPSBwbHVyYWxzO1xuICB9XG59KHRoaXMsIHtcbmFmOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuYWs6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKChuID09IDBcbiAgICAgICAgICB8fCBuID09IDEpKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmFtOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID49IDAgJiYgbiA8PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmFyOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICB2YXIgcyA9IFN0cmluZyhuKS5zcGxpdCgnLicpLCB0MCA9IE51bWJlcihzWzBdKSA9PSBuLFxuICAgICAgbjEwMCA9IHQwICYmIHNbMF0uc2xpY2UoLTIpO1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDApID8gJ3plcm8nXG4gICAgICA6IChuID09IDEpID8gJ29uZSdcbiAgICAgIDogKG4gPT0gMikgPyAndHdvJ1xuICAgICAgOiAoKG4xMDAgPj0gMyAmJiBuMTAwIDw9IDEwKSkgPyAnZmV3J1xuICAgICAgOiAoKG4xMDAgPj0gMTEgJiYgbjEwMCA8PSA5OSkpID8gJ21hbnknXG4gICAgICA6ICdvdGhlcic7XG59LFxuXG5hcnM6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIHZhciBzID0gU3RyaW5nKG4pLnNwbGl0KCcuJyksIHQwID0gTnVtYmVyKHNbMF0pID09IG4sXG4gICAgICBuMTAwID0gdDAgJiYgc1swXS5zbGljZSgtMik7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMCkgPyAnemVybydcbiAgICAgIDogKG4gPT0gMSkgPyAnb25lJ1xuICAgICAgOiAobiA9PSAyKSA/ICd0d28nXG4gICAgICA6ICgobjEwMCA+PSAzICYmIG4xMDAgPD0gMTApKSA/ICdmZXcnXG4gICAgICA6ICgobjEwMCA+PSAxMSAmJiBuMTAwIDw9IDk5KSkgPyAnbWFueSdcbiAgICAgIDogJ290aGVyJztcbn0sXG5cbmFzOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gKChuID09IDEgfHwgbiA9PSA1IHx8IG4gPT0gNyB8fCBuID09IDggfHwgbiA9PSA5XG4gICAgICAgICAgfHwgbiA9PSAxMCkpID8gJ29uZSdcbiAgICAgIDogKChuID09IDJcbiAgICAgICAgICB8fCBuID09IDMpKSA/ICd0d28nXG4gICAgICA6IChuID09IDQpID8gJ2ZldydcbiAgICAgIDogKG4gPT0gNikgPyAnbWFueSdcbiAgICAgIDogJ290aGVyJztcbiAgcmV0dXJuIChuID49IDAgJiYgbiA8PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmFzYTogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmFzdDogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgdjAgPSAhc1sxXTtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxICYmIHYwKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmF6OiBmdW5jdGlvbihuLCBvcmRcbikge1xuICB2YXIgcyA9IFN0cmluZyhuKS5zcGxpdCgnLicpLCBpID0gc1swXSwgaTEwID0gaS5zbGljZSgtMSksXG4gICAgICBpMTAwID0gaS5zbGljZSgtMiksIGkxMDAwID0gaS5zbGljZSgtMyk7XG4gIGlmIChvcmQpIHJldHVybiAoKGkxMCA9PSAxIHx8IGkxMCA9PSAyIHx8IGkxMCA9PSA1IHx8IGkxMCA9PSA3IHx8IGkxMCA9PSA4KVxuICAgICAgICAgIHx8IChpMTAwID09IDIwIHx8IGkxMDAgPT0gNTAgfHwgaTEwMCA9PSA3MFxuICAgICAgICAgIHx8IGkxMDAgPT0gODApKSA/ICdvbmUnXG4gICAgICA6ICgoaTEwID09IDMgfHwgaTEwID09IDQpIHx8IChpMTAwMCA9PSAxMDAgfHwgaTEwMDAgPT0gMjAwXG4gICAgICAgICAgfHwgaTEwMDAgPT0gMzAwIHx8IGkxMDAwID09IDQwMCB8fCBpMTAwMCA9PSA1MDAgfHwgaTEwMDAgPT0gNjAwIHx8IGkxMDAwID09IDcwMFxuICAgICAgICAgIHx8IGkxMDAwID09IDgwMFxuICAgICAgICAgIHx8IGkxMDAwID09IDkwMCkpID8gJ2ZldydcbiAgICAgIDogKGkgPT0gMCB8fCBpMTAgPT0gNiB8fCAoaTEwMCA9PSA0MCB8fCBpMTAwID09IDYwXG4gICAgICAgICAgfHwgaTEwMCA9PSA5MCkpID8gJ21hbnknXG4gICAgICA6ICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmJlOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICB2YXIgcyA9IFN0cmluZyhuKS5zcGxpdCgnLicpLCB0MCA9IE51bWJlcihzWzBdKSA9PSBuLFxuICAgICAgbjEwID0gdDAgJiYgc1swXS5zbGljZSgtMSksIG4xMDAgPSB0MCAmJiBzWzBdLnNsaWNlKC0yKTtcbiAgaWYgKG9yZCkgcmV0dXJuICgobjEwID09IDJcbiAgICAgICAgICB8fCBuMTAgPT0gMykgJiYgbjEwMCAhPSAxMiAmJiBuMTAwICE9IDEzKSA/ICdmZXcnIDogJ290aGVyJztcbiAgcmV0dXJuIChuMTAgPT0gMSAmJiBuMTAwICE9IDExKSA/ICdvbmUnXG4gICAgICA6ICgobjEwID49IDIgJiYgbjEwIDw9IDQpICYmIChuMTAwIDwgMTJcbiAgICAgICAgICB8fCBuMTAwID4gMTQpKSA/ICdmZXcnXG4gICAgICA6ICh0MCAmJiBuMTAgPT0gMCB8fCAobjEwID49IDUgJiYgbjEwIDw9IDkpXG4gICAgICAgICAgfHwgKG4xMDAgPj0gMTEgJiYgbjEwMCA8PSAxNCkpID8gJ21hbnknXG4gICAgICA6ICdvdGhlcic7XG59LFxuXG5iZW06IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5iZXo6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5iZzogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmJoOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuICgobiA9PSAwXG4gICAgICAgICAgfHwgbiA9PSAxKSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5ibTogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAnb3RoZXInO1xufSxcblxuYm46IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAoKG4gPT0gMSB8fCBuID09IDUgfHwgbiA9PSA3IHx8IG4gPT0gOCB8fCBuID09IDlcbiAgICAgICAgICB8fCBuID09IDEwKSkgPyAnb25lJ1xuICAgICAgOiAoKG4gPT0gMlxuICAgICAgICAgIHx8IG4gPT0gMykpID8gJ3R3bydcbiAgICAgIDogKG4gPT0gNCkgPyAnZmV3J1xuICAgICAgOiAobiA9PSA2KSA/ICdtYW55J1xuICAgICAgOiAnb3RoZXInO1xuICByZXR1cm4gKG4gPj0gMCAmJiBuIDw9IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuYm86IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gJ290aGVyJztcbn0sXG5cbmJyOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICB2YXIgcyA9IFN0cmluZyhuKS5zcGxpdCgnLicpLCB0MCA9IE51bWJlcihzWzBdKSA9PSBuLFxuICAgICAgbjEwID0gdDAgJiYgc1swXS5zbGljZSgtMSksIG4xMDAgPSB0MCAmJiBzWzBdLnNsaWNlKC0yKSxcbiAgICAgIG4xMDAwMDAwID0gdDAgJiYgc1swXS5zbGljZSgtNik7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4xMCA9PSAxICYmIG4xMDAgIT0gMTEgJiYgbjEwMCAhPSA3MSAmJiBuMTAwICE9IDkxKSA/ICdvbmUnXG4gICAgICA6IChuMTAgPT0gMiAmJiBuMTAwICE9IDEyICYmIG4xMDAgIT0gNzIgJiYgbjEwMCAhPSA5MikgPyAndHdvJ1xuICAgICAgOiAoKChuMTAgPT0gMyB8fCBuMTAgPT0gNCkgfHwgbjEwID09IDkpICYmIChuMTAwIDwgMTBcbiAgICAgICAgICB8fCBuMTAwID4gMTkpICYmIChuMTAwIDwgNzAgfHwgbjEwMCA+IDc5KSAmJiAobjEwMCA8IDkwXG4gICAgICAgICAgfHwgbjEwMCA+IDk5KSkgPyAnZmV3J1xuICAgICAgOiAobiAhPSAwICYmIHQwICYmIG4xMDAwMDAwID09IDApID8gJ21hbnknXG4gICAgICA6ICdvdGhlcic7XG59LFxuXG5icng6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5iczogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgaSA9IHNbMF0sIGYgPSBzWzFdIHx8ICcnLCB2MCA9ICFzWzFdLFxuICAgICAgaTEwID0gaS5zbGljZSgtMSksIGkxMDAgPSBpLnNsaWNlKC0yKSwgZjEwID0gZi5zbGljZSgtMSksIGYxMDAgPSBmLnNsaWNlKC0yKTtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAodjAgJiYgaTEwID09IDEgJiYgaTEwMCAhPSAxMVxuICAgICAgICAgIHx8IGYxMCA9PSAxICYmIGYxMDAgIT0gMTEpID8gJ29uZSdcbiAgICAgIDogKHYwICYmIChpMTAgPj0gMiAmJiBpMTAgPD0gNCkgJiYgKGkxMDAgPCAxMiB8fCBpMTAwID4gMTQpXG4gICAgICAgICAgfHwgKGYxMCA+PSAyICYmIGYxMCA8PSA0KSAmJiAoZjEwMCA8IDEyXG4gICAgICAgICAgfHwgZjEwMCA+IDE0KSkgPyAnZmV3J1xuICAgICAgOiAnb3RoZXInO1xufSxcblxuY2E6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIHZhciBzID0gU3RyaW5nKG4pLnNwbGl0KCcuJyksIHYwID0gIXNbMV07XG4gIGlmIChvcmQpIHJldHVybiAoKG4gPT0gMVxuICAgICAgICAgIHx8IG4gPT0gMykpID8gJ29uZSdcbiAgICAgIDogKG4gPT0gMikgPyAndHdvJ1xuICAgICAgOiAobiA9PSA0KSA/ICdmZXcnXG4gICAgICA6ICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxICYmIHYwKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmNlOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuY2dnOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuY2hyOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuY2tiOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuY3M6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIHZhciBzID0gU3RyaW5nKG4pLnNwbGl0KCcuJyksIGkgPSBzWzBdLCB2MCA9ICFzWzFdO1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEgJiYgdjApID8gJ29uZSdcbiAgICAgIDogKChpID49IDIgJiYgaSA8PSA0KSAmJiB2MCkgPyAnZmV3J1xuICAgICAgOiAoIXYwKSA/ICdtYW55J1xuICAgICAgOiAnb3RoZXInO1xufSxcblxuY3k6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAoKG4gPT0gMCB8fCBuID09IDcgfHwgbiA9PSA4XG4gICAgICAgICAgfHwgbiA9PSA5KSkgPyAnemVybydcbiAgICAgIDogKG4gPT0gMSkgPyAnb25lJ1xuICAgICAgOiAobiA9PSAyKSA/ICd0d28nXG4gICAgICA6ICgobiA9PSAzXG4gICAgICAgICAgfHwgbiA9PSA0KSkgPyAnZmV3J1xuICAgICAgOiAoKG4gPT0gNVxuICAgICAgICAgIHx8IG4gPT0gNikpID8gJ21hbnknXG4gICAgICA6ICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAwKSA/ICd6ZXJvJ1xuICAgICAgOiAobiA9PSAxKSA/ICdvbmUnXG4gICAgICA6IChuID09IDIpID8gJ3R3bydcbiAgICAgIDogKG4gPT0gMykgPyAnZmV3J1xuICAgICAgOiAobiA9PSA2KSA/ICdtYW55J1xuICAgICAgOiAnb3RoZXInO1xufSxcblxuZGE6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIHZhciBzID0gU3RyaW5nKG4pLnNwbGl0KCcuJyksIGkgPSBzWzBdLCB0MCA9IE51bWJlcihzWzBdKSA9PSBuO1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEgfHwgIXQwICYmIChpID09IDBcbiAgICAgICAgICB8fCBpID09IDEpKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmRlOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICB2YXIgcyA9IFN0cmluZyhuKS5zcGxpdCgnLicpLCB2MCA9ICFzWzFdO1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEgJiYgdjApID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuZHNiOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICB2YXIgcyA9IFN0cmluZyhuKS5zcGxpdCgnLicpLCBpID0gc1swXSwgZiA9IHNbMV0gfHwgJycsIHYwID0gIXNbMV0sXG4gICAgICBpMTAwID0gaS5zbGljZSgtMiksIGYxMDAgPSBmLnNsaWNlKC0yKTtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAodjAgJiYgaTEwMCA9PSAxXG4gICAgICAgICAgfHwgZjEwMCA9PSAxKSA/ICdvbmUnXG4gICAgICA6ICh2MCAmJiBpMTAwID09IDJcbiAgICAgICAgICB8fCBmMTAwID09IDIpID8gJ3R3bydcbiAgICAgIDogKHYwICYmIChpMTAwID09IDMgfHwgaTEwMCA9PSA0KSB8fCAoZjEwMCA9PSAzXG4gICAgICAgICAgfHwgZjEwMCA9PSA0KSkgPyAnZmV3J1xuICAgICAgOiAnb3RoZXInO1xufSxcblxuZHY6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5kejogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAnb3RoZXInO1xufSxcblxuZWU6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5lbDogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmVuOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICB2YXIgcyA9IFN0cmluZyhuKS5zcGxpdCgnLicpLCB2MCA9ICFzWzFdLCB0MCA9IE51bWJlcihzWzBdKSA9PSBuLFxuICAgICAgbjEwID0gdDAgJiYgc1swXS5zbGljZSgtMSksIG4xMDAgPSB0MCAmJiBzWzBdLnNsaWNlKC0yKTtcbiAgaWYgKG9yZCkgcmV0dXJuIChuMTAgPT0gMSAmJiBuMTAwICE9IDExKSA/ICdvbmUnXG4gICAgICA6IChuMTAgPT0gMiAmJiBuMTAwICE9IDEyKSA/ICd0d28nXG4gICAgICA6IChuMTAgPT0gMyAmJiBuMTAwICE9IDEzKSA/ICdmZXcnXG4gICAgICA6ICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxICYmIHYwKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmVvOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuZXM6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5ldDogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgdjAgPSAhc1sxXTtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxICYmIHYwKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmV1OiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuZmE6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPj0gMCAmJiBuIDw9IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuZmY6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPj0gMCAmJiBuIDwgMikgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5maTogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgdjAgPSAhc1sxXTtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxICYmIHYwKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmZpbDogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgaSA9IHNbMF0sIGYgPSBzWzFdIHx8ICcnLCB2MCA9ICFzWzFdLFxuICAgICAgaTEwID0gaS5zbGljZSgtMSksIGYxMCA9IGYuc2xpY2UoLTEpO1xuICBpZiAob3JkKSByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG4gIHJldHVybiAodjAgJiYgKGkgPT0gMSB8fCBpID09IDIgfHwgaSA9PSAzKVxuICAgICAgICAgIHx8IHYwICYmIGkxMCAhPSA0ICYmIGkxMCAhPSA2ICYmIGkxMCAhPSA5XG4gICAgICAgICAgfHwgIXYwICYmIGYxMCAhPSA0ICYmIGYxMCAhPSA2ICYmIGYxMCAhPSA5KSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmZvOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuZnI6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbiAgcmV0dXJuIChuID49IDAgJiYgbiA8IDIpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuZnVyOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuZnk6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIHZhciBzID0gU3RyaW5nKG4pLnNwbGl0KCcuJyksIHYwID0gIXNbMV07XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSAmJiB2MCkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5nYTogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgdDAgPSBOdW1iZXIoc1swXSkgPT0gbjtcbiAgaWYgKG9yZCkgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJ1xuICAgICAgOiAobiA9PSAyKSA/ICd0d28nXG4gICAgICA6ICgodDAgJiYgbiA+PSAzICYmIG4gPD0gNikpID8gJ2ZldydcbiAgICAgIDogKCh0MCAmJiBuID49IDcgJiYgbiA8PSAxMCkpID8gJ21hbnknXG4gICAgICA6ICdvdGhlcic7XG59LFxuXG5nZDogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgdDAgPSBOdW1iZXIoc1swXSkgPT0gbjtcbiAgaWYgKG9yZCkgcmV0dXJuICgobiA9PSAxXG4gICAgICAgICAgfHwgbiA9PSAxMSkpID8gJ29uZSdcbiAgICAgIDogKChuID09IDJcbiAgICAgICAgICB8fCBuID09IDEyKSkgPyAndHdvJ1xuICAgICAgOiAoKG4gPT0gM1xuICAgICAgICAgIHx8IG4gPT0gMTMpKSA/ICdmZXcnXG4gICAgICA6ICdvdGhlcic7XG4gIHJldHVybiAoKG4gPT0gMVxuICAgICAgICAgIHx8IG4gPT0gMTEpKSA/ICdvbmUnXG4gICAgICA6ICgobiA9PSAyXG4gICAgICAgICAgfHwgbiA9PSAxMikpID8gJ3R3bydcbiAgICAgIDogKCgodDAgJiYgbiA+PSAzICYmIG4gPD0gMTApXG4gICAgICAgICAgfHwgKHQwICYmIG4gPj0gMTMgJiYgbiA8PSAxOSkpKSA/ICdmZXcnXG4gICAgICA6ICdvdGhlcic7XG59LFxuXG5nbDogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgdjAgPSAhc1sxXTtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxICYmIHYwKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmdzdzogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmd1OiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gKG4gPT0gMSkgPyAnb25lJ1xuICAgICAgOiAoKG4gPT0gMlxuICAgICAgICAgIHx8IG4gPT0gMykpID8gJ3R3bydcbiAgICAgIDogKG4gPT0gNCkgPyAnZmV3J1xuICAgICAgOiAobiA9PSA2KSA/ICdtYW55J1xuICAgICAgOiAnb3RoZXInO1xuICByZXR1cm4gKG4gPj0gMCAmJiBuIDw9IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuZ3V3OiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuICgobiA9PSAwXG4gICAgICAgICAgfHwgbiA9PSAxKSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5ndjogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgaSA9IHNbMF0sIHYwID0gIXNbMV0sIGkxMCA9IGkuc2xpY2UoLTEpLFxuICAgICAgaTEwMCA9IGkuc2xpY2UoLTIpO1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuICh2MCAmJiBpMTAgPT0gMSkgPyAnb25lJ1xuICAgICAgOiAodjAgJiYgaTEwID09IDIpID8gJ3R3bydcbiAgICAgIDogKHYwICYmIChpMTAwID09IDAgfHwgaTEwMCA9PSAyMCB8fCBpMTAwID09IDQwIHx8IGkxMDAgPT0gNjBcbiAgICAgICAgICB8fCBpMTAwID09IDgwKSkgPyAnZmV3J1xuICAgICAgOiAoIXYwKSA/ICdtYW55J1xuICAgICAgOiAnb3RoZXInO1xufSxcblxuaGE6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5oYXc6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5oZTogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgaSA9IHNbMF0sIHYwID0gIXNbMV0sIHQwID0gTnVtYmVyKHNbMF0pID09IG4sXG4gICAgICBuMTAgPSB0MCAmJiBzWzBdLnNsaWNlKC0xKTtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxICYmIHYwKSA/ICdvbmUnXG4gICAgICA6IChpID09IDIgJiYgdjApID8gJ3R3bydcbiAgICAgIDogKHYwICYmIChuIDwgMFxuICAgICAgICAgIHx8IG4gPiAxMCkgJiYgdDAgJiYgbjEwID09IDApID8gJ21hbnknXG4gICAgICA6ICdvdGhlcic7XG59LFxuXG5oaTogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuIChuID09IDEpID8gJ29uZSdcbiAgICAgIDogKChuID09IDJcbiAgICAgICAgICB8fCBuID09IDMpKSA/ICd0d28nXG4gICAgICA6IChuID09IDQpID8gJ2ZldydcbiAgICAgIDogKG4gPT0gNikgPyAnbWFueSdcbiAgICAgIDogJ290aGVyJztcbiAgcmV0dXJuIChuID49IDAgJiYgbiA8PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmhyOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICB2YXIgcyA9IFN0cmluZyhuKS5zcGxpdCgnLicpLCBpID0gc1swXSwgZiA9IHNbMV0gfHwgJycsIHYwID0gIXNbMV0sXG4gICAgICBpMTAgPSBpLnNsaWNlKC0xKSwgaTEwMCA9IGkuc2xpY2UoLTIpLCBmMTAgPSBmLnNsaWNlKC0xKSwgZjEwMCA9IGYuc2xpY2UoLTIpO1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuICh2MCAmJiBpMTAgPT0gMSAmJiBpMTAwICE9IDExXG4gICAgICAgICAgfHwgZjEwID09IDEgJiYgZjEwMCAhPSAxMSkgPyAnb25lJ1xuICAgICAgOiAodjAgJiYgKGkxMCA+PSAyICYmIGkxMCA8PSA0KSAmJiAoaTEwMCA8IDEyIHx8IGkxMDAgPiAxNClcbiAgICAgICAgICB8fCAoZjEwID49IDIgJiYgZjEwIDw9IDQpICYmIChmMTAwIDwgMTJcbiAgICAgICAgICB8fCBmMTAwID4gMTQpKSA/ICdmZXcnXG4gICAgICA6ICdvdGhlcic7XG59LFxuXG5oc2I6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIHZhciBzID0gU3RyaW5nKG4pLnNwbGl0KCcuJyksIGkgPSBzWzBdLCBmID0gc1sxXSB8fCAnJywgdjAgPSAhc1sxXSxcbiAgICAgIGkxMDAgPSBpLnNsaWNlKC0yKSwgZjEwMCA9IGYuc2xpY2UoLTIpO1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuICh2MCAmJiBpMTAwID09IDFcbiAgICAgICAgICB8fCBmMTAwID09IDEpID8gJ29uZSdcbiAgICAgIDogKHYwICYmIGkxMDAgPT0gMlxuICAgICAgICAgIHx8IGYxMDAgPT0gMikgPyAndHdvJ1xuICAgICAgOiAodjAgJiYgKGkxMDAgPT0gMyB8fCBpMTAwID09IDQpIHx8IChmMTAwID09IDNcbiAgICAgICAgICB8fCBmMTAwID09IDQpKSA/ICdmZXcnXG4gICAgICA6ICdvdGhlcic7XG59LFxuXG5odTogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICgobiA9PSAxXG4gICAgICAgICAgfHwgbiA9PSA1KSkgPyAnb25lJyA6ICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmh5OiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG4gIHJldHVybiAobiA+PSAwICYmIG4gPCAyKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmlhOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICB2YXIgcyA9IFN0cmluZyhuKS5zcGxpdCgnLicpLCB2MCA9ICFzWzFdO1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEgJiYgdjApID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuaWQ6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gJ290aGVyJztcbn0sXG5cbmlnOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuICdvdGhlcic7XG59LFxuXG5paTogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAnb3RoZXInO1xufSxcblxuXCJpblwiOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuICdvdGhlcic7XG59LFxuXG5pbzogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgdjAgPSAhc1sxXTtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxICYmIHYwKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmlzOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICB2YXIgcyA9IFN0cmluZyhuKS5zcGxpdCgnLicpLCBpID0gc1swXSwgdDAgPSBOdW1iZXIoc1swXSkgPT0gbixcbiAgICAgIGkxMCA9IGkuc2xpY2UoLTEpLCBpMTAwID0gaS5zbGljZSgtMik7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKHQwICYmIGkxMCA9PSAxICYmIGkxMDAgIT0gMTFcbiAgICAgICAgICB8fCAhdDApID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuaXQ6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIHZhciBzID0gU3RyaW5nKG4pLnNwbGl0KCcuJyksIHYwID0gIXNbMV07XG4gIGlmIChvcmQpIHJldHVybiAoKG4gPT0gMTEgfHwgbiA9PSA4IHx8IG4gPT0gODBcbiAgICAgICAgICB8fCBuID09IDgwMCkpID8gJ21hbnknIDogJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEgJiYgdjApID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuaXU6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJ1xuICAgICAgOiAobiA9PSAyKSA/ICd0d28nXG4gICAgICA6ICdvdGhlcic7XG59LFxuXG5pdzogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgaSA9IHNbMF0sIHYwID0gIXNbMV0sIHQwID0gTnVtYmVyKHNbMF0pID09IG4sXG4gICAgICBuMTAgPSB0MCAmJiBzWzBdLnNsaWNlKC0xKTtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxICYmIHYwKSA/ICdvbmUnXG4gICAgICA6IChpID09IDIgJiYgdjApID8gJ3R3bydcbiAgICAgIDogKHYwICYmIChuIDwgMFxuICAgICAgICAgIHx8IG4gPiAxMCkgJiYgdDAgJiYgbjEwID09IDApID8gJ21hbnknXG4gICAgICA6ICdvdGhlcic7XG59LFxuXG5qYTogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAnb3RoZXInO1xufSxcblxuamJvOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuICdvdGhlcic7XG59LFxuXG5qZ286IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5qaTogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgdjAgPSAhc1sxXTtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxICYmIHYwKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmptYzogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmp2OiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuICdvdGhlcic7XG59LFxuXG5qdzogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAnb3RoZXInO1xufSxcblxua2E6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIHZhciBzID0gU3RyaW5nKG4pLnNwbGl0KCcuJyksIGkgPSBzWzBdLCBpMTAwID0gaS5zbGljZSgtMik7XG4gIGlmIChvcmQpIHJldHVybiAoaSA9PSAxKSA/ICdvbmUnXG4gICAgICA6IChpID09IDAgfHwgKChpMTAwID49IDIgJiYgaTEwMCA8PSAyMCkgfHwgaTEwMCA9PSA0MCB8fCBpMTAwID09IDYwXG4gICAgICAgICAgfHwgaTEwMCA9PSA4MCkpID8gJ21hbnknXG4gICAgICA6ICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmthYjogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA+PSAwICYmIG4gPCAyKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmthajogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmtjZzogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmtkZTogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAnb3RoZXInO1xufSxcblxua2VhOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuICdvdGhlcic7XG59LFxuXG5razogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgdDAgPSBOdW1iZXIoc1swXSkgPT0gbixcbiAgICAgIG4xMCA9IHQwICYmIHNbMF0uc2xpY2UoLTEpO1xuICBpZiAob3JkKSByZXR1cm4gKG4xMCA9PSA2IHx8IG4xMCA9PSA5XG4gICAgICAgICAgfHwgdDAgJiYgbjEwID09IDAgJiYgbiAhPSAwKSA/ICdtYW55JyA6ICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmtrajogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmtsOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxua206IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gJ290aGVyJztcbn0sXG5cbmtuOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID49IDAgJiYgbiA8PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmtvOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuICdvdGhlcic7XG59LFxuXG5rczogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmtzYjogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmtzaDogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAwKSA/ICd6ZXJvJ1xuICAgICAgOiAobiA9PSAxKSA/ICdvbmUnXG4gICAgICA6ICdvdGhlcic7XG59LFxuXG5rdTogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbmt3OiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZSdcbiAgICAgIDogKG4gPT0gMikgPyAndHdvJ1xuICAgICAgOiAnb3RoZXInO1xufSxcblxua3k6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5sYWc6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIHZhciBzID0gU3RyaW5nKG4pLnNwbGl0KCcuJyksIGkgPSBzWzBdO1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDApID8gJ3plcm8nXG4gICAgICA6ICgoaSA9PSAwXG4gICAgICAgICAgfHwgaSA9PSAxKSAmJiBuICE9IDApID8gJ29uZSdcbiAgICAgIDogJ290aGVyJztcbn0sXG5cbmxiOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxubGc6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5sa3Q6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gJ290aGVyJztcbn0sXG5cbmxuOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuICgobiA9PSAwXG4gICAgICAgICAgfHwgbiA9PSAxKSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5sbzogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xuICByZXR1cm4gJ290aGVyJztcbn0sXG5cbmx0OiBmdW5jdGlvbihuLCBvcmRcbikge1xuICB2YXIgcyA9IFN0cmluZyhuKS5zcGxpdCgnLicpLCBmID0gc1sxXSB8fCAnJywgdDAgPSBOdW1iZXIoc1swXSkgPT0gbixcbiAgICAgIG4xMCA9IHQwICYmIHNbMF0uc2xpY2UoLTEpLCBuMTAwID0gdDAgJiYgc1swXS5zbGljZSgtMik7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4xMCA9PSAxICYmIChuMTAwIDwgMTFcbiAgICAgICAgICB8fCBuMTAwID4gMTkpKSA/ICdvbmUnXG4gICAgICA6ICgobjEwID49IDIgJiYgbjEwIDw9IDkpICYmIChuMTAwIDwgMTFcbiAgICAgICAgICB8fCBuMTAwID4gMTkpKSA/ICdmZXcnXG4gICAgICA6IChmICE9IDApID8gJ21hbnknXG4gICAgICA6ICdvdGhlcic7XG59LFxuXG5sdjogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgZiA9IHNbMV0gfHwgJycsIHYgPSBmLmxlbmd0aCxcbiAgICAgIHQwID0gTnVtYmVyKHNbMF0pID09IG4sIG4xMCA9IHQwICYmIHNbMF0uc2xpY2UoLTEpLFxuICAgICAgbjEwMCA9IHQwICYmIHNbMF0uc2xpY2UoLTIpLCBmMTAwID0gZi5zbGljZSgtMiksIGYxMCA9IGYuc2xpY2UoLTEpO1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuICh0MCAmJiBuMTAgPT0gMCB8fCAobjEwMCA+PSAxMSAmJiBuMTAwIDw9IDE5KVxuICAgICAgICAgIHx8IHYgPT0gMiAmJiAoZjEwMCA+PSAxMSAmJiBmMTAwIDw9IDE5KSkgPyAnemVybydcbiAgICAgIDogKG4xMCA9PSAxICYmIG4xMDAgIT0gMTEgfHwgdiA9PSAyICYmIGYxMCA9PSAxICYmIGYxMDAgIT0gMTFcbiAgICAgICAgICB8fCB2ICE9IDIgJiYgZjEwID09IDEpID8gJ29uZSdcbiAgICAgIDogJ290aGVyJztcbn0sXG5cbm1hczogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbm1nOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuICgobiA9PSAwXG4gICAgICAgICAgfHwgbiA9PSAxKSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5tZ286IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5tazogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgaSA9IHNbMF0sIGYgPSBzWzFdIHx8ICcnLCB2MCA9ICFzWzFdLFxuICAgICAgaTEwID0gaS5zbGljZSgtMSksIGkxMDAgPSBpLnNsaWNlKC0yKSwgZjEwID0gZi5zbGljZSgtMSksIGYxMDAgPSBmLnNsaWNlKC0yKTtcbiAgaWYgKG9yZCkgcmV0dXJuIChpMTAgPT0gMSAmJiBpMTAwICE9IDExKSA/ICdvbmUnXG4gICAgICA6IChpMTAgPT0gMiAmJiBpMTAwICE9IDEyKSA/ICd0d28nXG4gICAgICA6ICgoaTEwID09IDdcbiAgICAgICAgICB8fCBpMTAgPT0gOCkgJiYgaTEwMCAhPSAxNyAmJiBpMTAwICE9IDE4KSA/ICdtYW55J1xuICAgICAgOiAnb3RoZXInO1xuICByZXR1cm4gKHYwICYmIGkxMCA9PSAxICYmIGkxMDAgIT0gMTFcbiAgICAgICAgICB8fCBmMTAgPT0gMSAmJiBmMTAwICE9IDExKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbm1sOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxubW46IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5tbzogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgdjAgPSAhc1sxXSwgdDAgPSBOdW1iZXIoc1swXSkgPT0gbixcbiAgICAgIG4xMDAgPSB0MCAmJiBzWzBdLnNsaWNlKC0yKTtcbiAgaWYgKG9yZCkgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSAmJiB2MCkgPyAnb25lJ1xuICAgICAgOiAoIXYwIHx8IG4gPT0gMFxuICAgICAgICAgIHx8IG4gIT0gMSAmJiAobjEwMCA+PSAxICYmIG4xMDAgPD0gMTkpKSA/ICdmZXcnXG4gICAgICA6ICdvdGhlcic7XG59LFxuXG5tcjogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuIChuID09IDEpID8gJ29uZSdcbiAgICAgIDogKChuID09IDJcbiAgICAgICAgICB8fCBuID09IDMpKSA/ICd0d28nXG4gICAgICA6IChuID09IDQpID8gJ2ZldydcbiAgICAgIDogJ290aGVyJztcbiAgcmV0dXJuIChuID49IDAgJiYgbiA8PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbm1zOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG4gIHJldHVybiAnb3RoZXInO1xufSxcblxubXQ6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIHZhciBzID0gU3RyaW5nKG4pLnNwbGl0KCcuJyksIHQwID0gTnVtYmVyKHNbMF0pID09IG4sXG4gICAgICBuMTAwID0gdDAgJiYgc1swXS5zbGljZSgtMik7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJ1xuICAgICAgOiAobiA9PSAwXG4gICAgICAgICAgfHwgKG4xMDAgPj0gMiAmJiBuMTAwIDw9IDEwKSkgPyAnZmV3J1xuICAgICAgOiAoKG4xMDAgPj0gMTEgJiYgbjEwMCA8PSAxOSkpID8gJ21hbnknXG4gICAgICA6ICdvdGhlcic7XG59LFxuXG5teTogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAnb3RoZXInO1xufSxcblxubmFoOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxubmFxOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZSdcbiAgICAgIDogKG4gPT0gMikgPyAndHdvJ1xuICAgICAgOiAnb3RoZXInO1xufSxcblxubmI6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5uZDogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbm5lOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICB2YXIgcyA9IFN0cmluZyhuKS5zcGxpdCgnLicpLCB0MCA9IE51bWJlcihzWzBdKSA9PSBuO1xuICBpZiAob3JkKSByZXR1cm4gKCh0MCAmJiBuID49IDEgJiYgbiA8PSA0KSkgPyAnb25lJyA6ICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbm5sOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICB2YXIgcyA9IFN0cmluZyhuKS5zcGxpdCgnLicpLCB2MCA9ICFzWzFdO1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEgJiYgdjApID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxubm46IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5ubmg6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5ubzogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbm5xbzogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAnb3RoZXInO1xufSxcblxubnI6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5uc286IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKChuID09IDBcbiAgICAgICAgICB8fCBuID09IDEpKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbm55OiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxubnluOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxub206IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5vcjogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgdDAgPSBOdW1iZXIoc1swXSkgPT0gbjtcbiAgaWYgKG9yZCkgcmV0dXJuICgobiA9PSAxIHx8IG4gPT0gNVxuICAgICAgICAgIHx8ICh0MCAmJiBuID49IDcgJiYgbiA8PSA5KSkpID8gJ29uZSdcbiAgICAgIDogKChuID09IDJcbiAgICAgICAgICB8fCBuID09IDMpKSA/ICd0d28nXG4gICAgICA6IChuID09IDQpID8gJ2ZldydcbiAgICAgIDogKG4gPT0gNikgPyAnbWFueSdcbiAgICAgIDogJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxub3M6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5wYTogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAoKG4gPT0gMFxuICAgICAgICAgIHx8IG4gPT0gMSkpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxucGFwOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxucGw6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIHZhciBzID0gU3RyaW5nKG4pLnNwbGl0KCcuJyksIGkgPSBzWzBdLCB2MCA9ICFzWzFdLCBpMTAgPSBpLnNsaWNlKC0xKSxcbiAgICAgIGkxMDAgPSBpLnNsaWNlKC0yKTtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxICYmIHYwKSA/ICdvbmUnXG4gICAgICA6ICh2MCAmJiAoaTEwID49IDIgJiYgaTEwIDw9IDQpICYmIChpMTAwIDwgMTJcbiAgICAgICAgICB8fCBpMTAwID4gMTQpKSA/ICdmZXcnXG4gICAgICA6ICh2MCAmJiBpICE9IDEgJiYgKGkxMCA9PSAwIHx8IGkxMCA9PSAxKVxuICAgICAgICAgIHx8IHYwICYmIChpMTAgPj0gNSAmJiBpMTAgPD0gOSlcbiAgICAgICAgICB8fCB2MCAmJiAoaTEwMCA+PSAxMiAmJiBpMTAwIDw9IDE0KSkgPyAnbWFueSdcbiAgICAgIDogJ290aGVyJztcbn0sXG5cbnByZzogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgZiA9IHNbMV0gfHwgJycsIHYgPSBmLmxlbmd0aCxcbiAgICAgIHQwID0gTnVtYmVyKHNbMF0pID09IG4sIG4xMCA9IHQwICYmIHNbMF0uc2xpY2UoLTEpLFxuICAgICAgbjEwMCA9IHQwICYmIHNbMF0uc2xpY2UoLTIpLCBmMTAwID0gZi5zbGljZSgtMiksIGYxMCA9IGYuc2xpY2UoLTEpO1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuICh0MCAmJiBuMTAgPT0gMCB8fCAobjEwMCA+PSAxMSAmJiBuMTAwIDw9IDE5KVxuICAgICAgICAgIHx8IHYgPT0gMiAmJiAoZjEwMCA+PSAxMSAmJiBmMTAwIDw9IDE5KSkgPyAnemVybydcbiAgICAgIDogKG4xMCA9PSAxICYmIG4xMDAgIT0gMTEgfHwgdiA9PSAyICYmIGYxMCA9PSAxICYmIGYxMDAgIT0gMTFcbiAgICAgICAgICB8fCB2ICE9IDIgJiYgZjEwID09IDEpID8gJ29uZSdcbiAgICAgIDogJ290aGVyJztcbn0sXG5cbnBzOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxucHQ6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIHZhciBzID0gU3RyaW5nKG4pLnNwbGl0KCcuJyksIGkgPSBzWzBdO1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuICgoaSA9PSAwXG4gICAgICAgICAgfHwgaSA9PSAxKSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5cInB0LVBUXCI6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIHZhciBzID0gU3RyaW5nKG4pLnNwbGl0KCcuJyksIHYwID0gIXNbMV07XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSAmJiB2MCkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5ybTogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbnJvOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICB2YXIgcyA9IFN0cmluZyhuKS5zcGxpdCgnLicpLCB2MCA9ICFzWzFdLCB0MCA9IE51bWJlcihzWzBdKSA9PSBuLFxuICAgICAgbjEwMCA9IHQwICYmIHNbMF0uc2xpY2UoLTIpO1xuICBpZiAob3JkKSByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxICYmIHYwKSA/ICdvbmUnXG4gICAgICA6ICghdjAgfHwgbiA9PSAwXG4gICAgICAgICAgfHwgbiAhPSAxICYmIChuMTAwID49IDEgJiYgbjEwMCA8PSAxOSkpID8gJ2ZldydcbiAgICAgIDogJ290aGVyJztcbn0sXG5cbnJvZjogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbnJvb3Q6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gJ290aGVyJztcbn0sXG5cbnJ1OiBmdW5jdGlvbihuLCBvcmRcbikge1xuICB2YXIgcyA9IFN0cmluZyhuKS5zcGxpdCgnLicpLCBpID0gc1swXSwgdjAgPSAhc1sxXSwgaTEwID0gaS5zbGljZSgtMSksXG4gICAgICBpMTAwID0gaS5zbGljZSgtMik7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKHYwICYmIGkxMCA9PSAxICYmIGkxMDAgIT0gMTEpID8gJ29uZSdcbiAgICAgIDogKHYwICYmIChpMTAgPj0gMiAmJiBpMTAgPD0gNCkgJiYgKGkxMDAgPCAxMlxuICAgICAgICAgIHx8IGkxMDAgPiAxNCkpID8gJ2ZldydcbiAgICAgIDogKHYwICYmIGkxMCA9PSAwIHx8IHYwICYmIChpMTAgPj0gNSAmJiBpMTAgPD0gOSlcbiAgICAgICAgICB8fCB2MCAmJiAoaTEwMCA+PSAxMSAmJiBpMTAwIDw9IDE0KSkgPyAnbWFueSdcbiAgICAgIDogJ290aGVyJztcbn0sXG5cbnJ3azogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbnNhaDogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAnb3RoZXInO1xufSxcblxuc2FxOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuc2M6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIHZhciBzID0gU3RyaW5nKG4pLnNwbGl0KCcuJyksIHYwID0gIXNbMV07XG4gIGlmIChvcmQpIHJldHVybiAoKG4gPT0gMTEgfHwgbiA9PSA4IHx8IG4gPT0gODBcbiAgICAgICAgICB8fCBuID09IDgwMCkpID8gJ21hbnknIDogJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEgJiYgdjApID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuc2NuOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICB2YXIgcyA9IFN0cmluZyhuKS5zcGxpdCgnLicpLCB2MCA9ICFzWzFdO1xuICBpZiAob3JkKSByZXR1cm4gKChuID09IDExIHx8IG4gPT0gOCB8fCBuID09IDgwXG4gICAgICAgICAgfHwgbiA9PSA4MDApKSA/ICdtYW55JyA6ICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxICYmIHYwKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbnNkOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuc2RoOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuc2U6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJ1xuICAgICAgOiAobiA9PSAyKSA/ICd0d28nXG4gICAgICA6ICdvdGhlcic7XG59LFxuXG5zZWg6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5zZXM6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gJ290aGVyJztcbn0sXG5cbnNnOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuICdvdGhlcic7XG59LFxuXG5zaDogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgaSA9IHNbMF0sIGYgPSBzWzFdIHx8ICcnLCB2MCA9ICFzWzFdLFxuICAgICAgaTEwID0gaS5zbGljZSgtMSksIGkxMDAgPSBpLnNsaWNlKC0yKSwgZjEwID0gZi5zbGljZSgtMSksIGYxMDAgPSBmLnNsaWNlKC0yKTtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAodjAgJiYgaTEwID09IDEgJiYgaTEwMCAhPSAxMVxuICAgICAgICAgIHx8IGYxMCA9PSAxICYmIGYxMDAgIT0gMTEpID8gJ29uZSdcbiAgICAgIDogKHYwICYmIChpMTAgPj0gMiAmJiBpMTAgPD0gNCkgJiYgKGkxMDAgPCAxMiB8fCBpMTAwID4gMTQpXG4gICAgICAgICAgfHwgKGYxMCA+PSAyICYmIGYxMCA8PSA0KSAmJiAoZjEwMCA8IDEyXG4gICAgICAgICAgfHwgZjEwMCA+IDE0KSkgPyAnZmV3J1xuICAgICAgOiAnb3RoZXInO1xufSxcblxuc2hpOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICB2YXIgcyA9IFN0cmluZyhuKS5zcGxpdCgnLicpLCB0MCA9IE51bWJlcihzWzBdKSA9PSBuO1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID49IDAgJiYgbiA8PSAxKSA/ICdvbmUnXG4gICAgICA6ICgodDAgJiYgbiA+PSAyICYmIG4gPD0gMTApKSA/ICdmZXcnXG4gICAgICA6ICdvdGhlcic7XG59LFxuXG5zaTogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgaSA9IHNbMF0sIGYgPSBzWzFdIHx8ICcnO1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuICgobiA9PSAwIHx8IG4gPT0gMSlcbiAgICAgICAgICB8fCBpID09IDAgJiYgZiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbnNrOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICB2YXIgcyA9IFN0cmluZyhuKS5zcGxpdCgnLicpLCBpID0gc1swXSwgdjAgPSAhc1sxXTtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxICYmIHYwKSA/ICdvbmUnXG4gICAgICA6ICgoaSA+PSAyICYmIGkgPD0gNCkgJiYgdjApID8gJ2ZldydcbiAgICAgIDogKCF2MCkgPyAnbWFueSdcbiAgICAgIDogJ290aGVyJztcbn0sXG5cbnNsOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICB2YXIgcyA9IFN0cmluZyhuKS5zcGxpdCgnLicpLCBpID0gc1swXSwgdjAgPSAhc1sxXSwgaTEwMCA9IGkuc2xpY2UoLTIpO1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuICh2MCAmJiBpMTAwID09IDEpID8gJ29uZSdcbiAgICAgIDogKHYwICYmIGkxMDAgPT0gMikgPyAndHdvJ1xuICAgICAgOiAodjAgJiYgKGkxMDAgPT0gMyB8fCBpMTAwID09IDQpXG4gICAgICAgICAgfHwgIXYwKSA/ICdmZXcnXG4gICAgICA6ICdvdGhlcic7XG59LFxuXG5zbWE6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJ1xuICAgICAgOiAobiA9PSAyKSA/ICd0d28nXG4gICAgICA6ICdvdGhlcic7XG59LFxuXG5zbWk6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJ1xuICAgICAgOiAobiA9PSAyKSA/ICd0d28nXG4gICAgICA6ICdvdGhlcic7XG59LFxuXG5zbWo6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJ1xuICAgICAgOiAobiA9PSAyKSA/ICd0d28nXG4gICAgICA6ICdvdGhlcic7XG59LFxuXG5zbW46IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJ1xuICAgICAgOiAobiA9PSAyKSA/ICd0d28nXG4gICAgICA6ICdvdGhlcic7XG59LFxuXG5zbXM6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJ1xuICAgICAgOiAobiA9PSAyKSA/ICd0d28nXG4gICAgICA6ICdvdGhlcic7XG59LFxuXG5zbjogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbnNvOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuc3E6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIHZhciBzID0gU3RyaW5nKG4pLnNwbGl0KCcuJyksIHQwID0gTnVtYmVyKHNbMF0pID09IG4sXG4gICAgICBuMTAgPSB0MCAmJiBzWzBdLnNsaWNlKC0xKSwgbjEwMCA9IHQwICYmIHNbMF0uc2xpY2UoLTIpO1xuICBpZiAob3JkKSByZXR1cm4gKG4gPT0gMSkgPyAnb25lJ1xuICAgICAgOiAobjEwID09IDQgJiYgbjEwMCAhPSAxNCkgPyAnbWFueSdcbiAgICAgIDogJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuc3I6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIHZhciBzID0gU3RyaW5nKG4pLnNwbGl0KCcuJyksIGkgPSBzWzBdLCBmID0gc1sxXSB8fCAnJywgdjAgPSAhc1sxXSxcbiAgICAgIGkxMCA9IGkuc2xpY2UoLTEpLCBpMTAwID0gaS5zbGljZSgtMiksIGYxMCA9IGYuc2xpY2UoLTEpLCBmMTAwID0gZi5zbGljZSgtMik7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKHYwICYmIGkxMCA9PSAxICYmIGkxMDAgIT0gMTFcbiAgICAgICAgICB8fCBmMTAgPT0gMSAmJiBmMTAwICE9IDExKSA/ICdvbmUnXG4gICAgICA6ICh2MCAmJiAoaTEwID49IDIgJiYgaTEwIDw9IDQpICYmIChpMTAwIDwgMTIgfHwgaTEwMCA+IDE0KVxuICAgICAgICAgIHx8IChmMTAgPj0gMiAmJiBmMTAgPD0gNCkgJiYgKGYxMDAgPCAxMlxuICAgICAgICAgIHx8IGYxMDAgPiAxNCkpID8gJ2ZldydcbiAgICAgIDogJ290aGVyJztcbn0sXG5cbnNzOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuc3N5OiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuc3Q6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG5zdjogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgdjAgPSAhc1sxXSwgdDAgPSBOdW1iZXIoc1swXSkgPT0gbixcbiAgICAgIG4xMCA9IHQwICYmIHNbMF0uc2xpY2UoLTEpLCBuMTAwID0gdDAgJiYgc1swXS5zbGljZSgtMik7XG4gIGlmIChvcmQpIHJldHVybiAoKG4xMCA9PSAxXG4gICAgICAgICAgfHwgbjEwID09IDIpICYmIG4xMDAgIT0gMTEgJiYgbjEwMCAhPSAxMikgPyAnb25lJyA6ICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxICYmIHYwKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbnN3OiBmdW5jdGlvbihuLCBvcmRcbikge1xuICB2YXIgcyA9IFN0cmluZyhuKS5zcGxpdCgnLicpLCB2MCA9ICFzWzFdO1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEgJiYgdjApID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxuc3lyOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxudGE6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG50ZTogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbnRlbzogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbnRoOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuICdvdGhlcic7XG59LFxuXG50aTogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAoKG4gPT0gMFxuICAgICAgICAgIHx8IG4gPT0gMSkpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxudGlnOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxudGs6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIHZhciBzID0gU3RyaW5nKG4pLnNwbGl0KCcuJyksIHQwID0gTnVtYmVyKHNbMF0pID09IG4sXG4gICAgICBuMTAgPSB0MCAmJiBzWzBdLnNsaWNlKC0xKTtcbiAgaWYgKG9yZCkgcmV0dXJuICgobjEwID09IDYgfHwgbjEwID09IDkpXG4gICAgICAgICAgfHwgbiA9PSAxMCkgPyAnZmV3JyA6ICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbnRsOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICB2YXIgcyA9IFN0cmluZyhuKS5zcGxpdCgnLicpLCBpID0gc1swXSwgZiA9IHNbMV0gfHwgJycsIHYwID0gIXNbMV0sXG4gICAgICBpMTAgPSBpLnNsaWNlKC0xKSwgZjEwID0gZi5zbGljZSgtMSk7XG4gIGlmIChvcmQpIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbiAgcmV0dXJuICh2MCAmJiAoaSA9PSAxIHx8IGkgPT0gMiB8fCBpID09IDMpXG4gICAgICAgICAgfHwgdjAgJiYgaTEwICE9IDQgJiYgaTEwICE9IDYgJiYgaTEwICE9IDlcbiAgICAgICAgICB8fCAhdjAgJiYgZjEwICE9IDQgJiYgZjEwICE9IDYgJiYgZjEwICE9IDkpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxudG46IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG50bzogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAnb3RoZXInO1xufSxcblxudHI6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG50czogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbnR6bTogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgdDAgPSBOdW1iZXIoc1swXSkgPT0gbjtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAoKG4gPT0gMCB8fCBuID09IDEpXG4gICAgICAgICAgfHwgKHQwICYmIG4gPj0gMTEgJiYgbiA8PSA5OSkpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxudWc6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG51azogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgaSA9IHNbMF0sIHYwID0gIXNbMV0sIHQwID0gTnVtYmVyKHNbMF0pID09IG4sXG4gICAgICBuMTAgPSB0MCAmJiBzWzBdLnNsaWNlKC0xKSwgbjEwMCA9IHQwICYmIHNbMF0uc2xpY2UoLTIpLCBpMTAgPSBpLnNsaWNlKC0xKSxcbiAgICAgIGkxMDAgPSBpLnNsaWNlKC0yKTtcbiAgaWYgKG9yZCkgcmV0dXJuIChuMTAgPT0gMyAmJiBuMTAwICE9IDEzKSA/ICdmZXcnIDogJ290aGVyJztcbiAgcmV0dXJuICh2MCAmJiBpMTAgPT0gMSAmJiBpMTAwICE9IDExKSA/ICdvbmUnXG4gICAgICA6ICh2MCAmJiAoaTEwID49IDIgJiYgaTEwIDw9IDQpICYmIChpMTAwIDwgMTJcbiAgICAgICAgICB8fCBpMTAwID4gMTQpKSA/ICdmZXcnXG4gICAgICA6ICh2MCAmJiBpMTAgPT0gMCB8fCB2MCAmJiAoaTEwID49IDUgJiYgaTEwIDw9IDkpXG4gICAgICAgICAgfHwgdjAgJiYgKGkxMDAgPj0gMTEgJiYgaTEwMCA8PSAxNCkpID8gJ21hbnknXG4gICAgICA6ICdvdGhlcic7XG59LFxuXG51cjogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgdmFyIHMgPSBTdHJpbmcobikuc3BsaXQoJy4nKSwgdjAgPSAhc1sxXTtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxICYmIHYwKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbnV6OiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxudmU6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKG4gPT0gMSkgPyAnb25lJyA6ICdvdGhlcic7XG59LFxuXG52aTogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xuICByZXR1cm4gJ290aGVyJztcbn0sXG5cbnZvOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxudnVuOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEpID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxud2E6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gKChuID09IDBcbiAgICAgICAgICB8fCBuID09IDEpKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbndhZTogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbndvOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuICdvdGhlcic7XG59LFxuXG54aDogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbnhvZzogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAobiA9PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn0sXG5cbnlpOiBmdW5jdGlvbihuLCBvcmRcbikge1xuICB2YXIgcyA9IFN0cmluZyhuKS5zcGxpdCgnLicpLCB2MCA9ICFzWzFdO1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID09IDEgJiYgdjApID8gJ29uZScgOiAnb3RoZXInO1xufSxcblxueW86IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gJ290aGVyJztcbn0sXG5cbnl1ZTogZnVuY3Rpb24obiwgb3JkXG4pIHtcbiAgaWYgKG9yZCkgcmV0dXJuICdvdGhlcic7XG4gIHJldHVybiAnb3RoZXInO1xufSxcblxuemg6IGZ1bmN0aW9uKG4sIG9yZFxuKSB7XG4gIGlmIChvcmQpIHJldHVybiAnb3RoZXInO1xuICByZXR1cm4gJ290aGVyJztcbn0sXG5cbnp1OiBmdW5jdGlvbihuLCBvcmRcbikge1xuICBpZiAob3JkKSByZXR1cm4gJ290aGVyJztcbiAgcmV0dXJuIChuID49IDAgJiYgbiA8PSAxKSA/ICdvbmUnIDogJ290aGVyJztcbn1cbn0pKTtcbiIsInZhciByZXNlcnZlZCA9IHJlcXVpcmUoJ3Jlc2VydmVkLXdvcmRzJyk7XG52YXIgcGFyc2UgPSByZXF1aXJlKCdtZXNzYWdlZm9ybWF0LXBhcnNlcicpLnBhcnNlO1xuXG5cbi8qKiBDcmVhdGVzIGEgbmV3IG1lc3NhZ2UgY29tcGlsZXIuIENhbGxlZCBpbnRlcm5hbGx5IGZyb20ge0BsaW5rIE1lc3NhZ2VGb3JtYXQjY29tcGlsZX0uXG4gKlxuICogQGNsYXNzXG4gKiBAcGFyYW0ge01lc3NhZ2VGb3JtYXR9IG1mIC0gQSBNZXNzYWdlRm9ybWF0IGluc3RhbmNlXG4gKiBAcHJvcGVydHkge29iamVjdH0gbG9jYWxlcyAtIFRoZSBsb2NhbGUgaWRlbnRpZmllcnMgdGhhdCBhcmUgdXNlZCBieSB0aGUgY29tcGlsZWQgZnVuY3Rpb25zXG4gKiBAcHJvcGVydHkge29iamVjdH0gcnVudGltZSAtIE5hbWVzIG9mIHRoZSBjb3JlIHJ1bnRpbWUgZnVuY3Rpb25zIHRoYXQgYXJlIHVzZWQgYnkgdGhlIGNvbXBpbGVkIGZ1bmN0aW9uc1xuICogQHByb3BlcnR5IHtvYmplY3R9IGZvcm1hdHRlcnMgLSBUaGUgZm9ybWF0dGVyIGZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkIGJ5IHRoZSBjb21waWxlZCBmdW5jdGlvbnNcbiAqL1xuZnVuY3Rpb24gQ29tcGlsZXIobWYpIHtcbiAgICB0aGlzLm1mID0gbWY7XG4gICAgdGhpcy5sYyA9IG51bGw7XG4gICAgdGhpcy5sb2NhbGVzID0ge307XG4gICAgdGhpcy5ydW50aW1lID0ge307XG4gICAgdGhpcy5mb3JtYXR0ZXJzID0ge307XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQ29tcGlsZXI7XG5cblxuLyoqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIHF1b3RpbmcgYW4gT2JqZWN0J3Mga2V5IHZhbHVlIGlmIHJlcXVpcmVkXG4gKlxuICogIFF1b3RlcyB0aGUga2V5IGlmIGl0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyBvciBpcyBhblxuICogIEVDTUFTY3JpcHQgM3JkIEVkaXRpb24gcmVzZXJ2ZWQgd29yZCAoZm9yIElFOCkuXG4gKi9cbkNvbXBpbGVyLnByb3BuYW1lID0gZnVuY3Rpb24oa2V5LCBvYmopIHtcbiAgaWYgKC9eW0EtWl8kXVswLTlBLVpfJF0qJC9pLnRlc3Qoa2V5KSAmJlxuICAgICBbJ2JyZWFrJywgJ2NvbnRpbnVlJywgJ2RlbGV0ZScsICdlbHNlJywgJ2ZvcicsICdmdW5jdGlvbicsICdpZicsICdpbicsICduZXcnLFxuICAgICAgJ3JldHVybicsICd0aGlzJywgJ3R5cGVvZicsICd2YXInLCAndm9pZCcsICd3aGlsZScsICd3aXRoJywgJ2Nhc2UnLCAnY2F0Y2gnLFxuICAgICAgJ2RlZmF1bHQnLCAnZG8nLCAnZmluYWxseScsICdpbnN0YW5jZW9mJywgJ3N3aXRjaCcsICd0aHJvdycsICd0cnknXS5pbmRleE9mKGtleSkgPCAwKSB7XG4gICAgcmV0dXJuIG9iaiA/IG9iaiArICcuJyArIGtleSA6IGtleTtcbiAgfSBlbHNlIHtcbiAgICB2YXIgamtleSA9IEpTT04uc3RyaW5naWZ5KGtleSk7XG4gICAgcmV0dXJuIG9iaiA/IG9iaiArICdbJyArIGprZXkgKyAnXScgOiBqa2V5O1xuICB9XG59XG5cblxuLyoqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIGVzY2FwaW5nIGEgZnVuY3Rpb24gbmFtZSBpZiByZXF1aXJlZFxuICovXG5Db21waWxlci5mdW5jbmFtZSA9IGZ1bmN0aW9uKGtleSkge1xuICB2YXIgZm4gPSBrZXkudHJpbSgpLnJlcGxhY2UoL1xcVysvZywgJ18nKTtcbiAgcmV0dXJuIHJlc2VydmVkLmNoZWNrKGZuLCAnZXMyMDE1JywgdHJ1ZSkgfHwgL15cXGQvLnRlc3QoZm4pID8gJ18nICsgZm4gOiBmbjtcbn1cblxuXG4vKiogVXRpbGl0eSBmb3JtYXR0ZXIgZnVuY3Rpb24gZm9yIGVuZm9yY2luZyBCaWRpIFN0cnVjdHVyZWQgVGV4dCBieSB1c2luZyBVQ0NcbiAqXG4gKiAgTGlzdCBpbmxpbmVkIGZyb20gZGF0YSBleHRyYWN0ZWQgZnJvbSBDTERSIHYyNyAmIHYyOFxuICogIFRvIHZlcmlmeS9yZWNyZWF0ZSwgdXNlIHRoZSBmb2xsb3dpbmc6XG4gKlxuICogICAgIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vdW5pY29kZS1jbGRyL2NsZHItbWlzYy1mdWxsLmdpdFxuICogICAgIGNkIGNsZHItbWlzYy1mdWxsL21haW4vXG4gKiAgICAgZ3JlcCBjaGFyYWN0ZXJPcmRlciAtciAuIHwgdHIgJ1wiLycgJ1xcdCcgfCBjdXQgLWYyLDYgfCBncmVwIC1DNCByaWdodC10by1sZWZ0XG4gKi9cbkNvbXBpbGVyLmJpZGlNYXJrVGV4dCA9IGZ1bmN0aW9uKHRleHQsIGxvY2FsZSkge1xuICBmdW5jdGlvbiBpc0xvY2FsZVJUTChsb2NhbGUpIHtcbiAgICB2YXIgcnRsTGFuZ3VhZ2VzID0gWydhcicsICdja2InLCAnZmEnLCAnaGUnLCAna3MoJHxbXmJmaF0pJywgJ2xyYycsICdtem4nLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3BhLUFyYWInLCAncHMnLCAndWcnLCAndXInLCAndXotQXJhYicsICd5aSddO1xuICAgIHJldHVybiBuZXcgUmVnRXhwKCdeJyArIHJ0bExhbmd1YWdlcy5qb2luKCd8XicpKS50ZXN0KGxvY2FsZSk7XG4gIH1cbiAgdmFyIG1hcmsgPSBKU09OLnN0cmluZ2lmeShpc0xvY2FsZVJUTChsb2NhbGUpID8gJ1xcdTIwMEYnIDogJ1xcdTIwMEUnKTtcbiAgcmV0dXJuIG1hcmsgKyAnICsgJyArIHRleHQgKyAnICsgJyArIG1hcms7XG59XG5cblxuLyoqIEBwcml2YXRlICovXG5Db21waWxlci5wcm90b3R5cGUuY2FzZXMgPSBmdW5jdGlvbih0b2tlbiwgcGx1cmFsKSB7XG4gIHZhciBuZWVkT3RoZXIgPSB0b2tlbi50eXBlID09PSAnc2VsZWN0JyB8fCAhdGhpcy5tZi5oYXNDdXN0b21QbHVyYWxGdW5jcztcbiAgdmFyIHIgPSB0b2tlbi5jYXNlcy5tYXAoZnVuY3Rpb24oYykge1xuICAgIGlmIChjLmtleSA9PT0gJ290aGVyJykgbmVlZE90aGVyID0gZmFsc2U7XG4gICAgdmFyIHMgPSBjLnRva2Vucy5tYXAoZnVuY3Rpb24odG9rKSB7IHJldHVybiB0aGlzLnRva2VuKHRvaywgcGx1cmFsKTsgfSwgdGhpcyk7XG4gICAgcmV0dXJuIENvbXBpbGVyLnByb3BuYW1lKGMua2V5KSArICc6ICcgKyAocy5qb2luKCcgKyAnKSB8fCAnXCJcIicpO1xuICB9LCB0aGlzKTtcbiAgaWYgKG5lZWRPdGhlcikgdGhyb3cgbmV3IEVycm9yKFwiTm8gJ290aGVyJyBmb3JtIGZvdW5kIGluIFwiICsgSlNPTi5zdHJpbmdpZnkodG9rZW4pKTtcbiAgcmV0dXJuICd7ICcgKyByLmpvaW4oJywgJykgKyAnIH0nO1xufVxuXG5cbi8qKiBAcHJpdmF0ZSAqL1xuQ29tcGlsZXIucHJvdG90eXBlLnRva2VuID0gZnVuY3Rpb24odG9rZW4sIHBsdXJhbCkge1xuICBpZiAodHlwZW9mIHRva2VuID09ICdzdHJpbmcnKSByZXR1cm4gSlNPTi5zdHJpbmdpZnkodG9rZW4pO1xuXG4gIHZhciBmbiwgYXJncyA9IFsgQ29tcGlsZXIucHJvcG5hbWUodG9rZW4uYXJnLCAnZCcpIF07XG4gIHN3aXRjaCAodG9rZW4udHlwZSkge1xuICAgIGNhc2UgJ2FyZ3VtZW50JzpcbiAgICAgIHJldHVybiB0aGlzLm1mLmJpZGlTdXBwb3J0ID8gQ29tcGlsZXIuYmlkaU1hcmtUZXh0KGFyZ3NbMF0sIHRoaXMubGMpIDogYXJnc1swXTtcblxuICAgIGNhc2UgJ3NlbGVjdCc6XG4gICAgICBmbiA9ICdzZWxlY3QnO1xuICAgICAgYXJncy5wdXNoKHRoaXMuY2FzZXModG9rZW4sIHRoaXMubWYuc3RyaWN0TnVtYmVyU2lnbiA/IG51bGwgOiBwbHVyYWwpKTtcbiAgICAgIHRoaXMucnVudGltZS5zZWxlY3QgPSB0cnVlO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdzZWxlY3RvcmRpbmFsJzpcbiAgICAgIGZuID0gJ3BsdXJhbCc7XG4gICAgICBhcmdzLnB1c2goMCwgQ29tcGlsZXIuZnVuY25hbWUodGhpcy5sYyksIHRoaXMuY2FzZXModG9rZW4sIHRva2VuKSwgMSk7XG4gICAgICB0aGlzLmxvY2FsZXNbdGhpcy5sY10gPSB0cnVlO1xuICAgICAgdGhpcy5ydW50aW1lLnBsdXJhbCA9IHRydWU7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ3BsdXJhbCc6XG4gICAgICBmbiA9ICdwbHVyYWwnO1xuICAgICAgYXJncy5wdXNoKHRva2VuLm9mZnNldCB8fCAwLCBDb21waWxlci5mdW5jbmFtZSh0aGlzLmxjKSwgdGhpcy5jYXNlcyh0b2tlbiwgdG9rZW4pKTtcbiAgICAgIHRoaXMubG9jYWxlc1t0aGlzLmxjXSA9IHRydWU7XG4gICAgICB0aGlzLnJ1bnRpbWUucGx1cmFsID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZnVuY3Rpb24nOlxuICAgICAgaWYgKHRoaXMubWYuaW50bFN1cHBvcnQgJiYgISh0b2tlbi5rZXkgaW4gdGhpcy5tZi5mbXQpICYmICh0b2tlbi5rZXkgaW4gdGhpcy5tZi5jb25zdHJ1Y3Rvci5mb3JtYXR0ZXJzKSkge1xuICAgICAgICB2YXIgZm10ID0gdGhpcy5tZi5jb25zdHJ1Y3Rvci5mb3JtYXR0ZXJzW3Rva2VuLmtleV07XG4gICAgICAgIHRoaXMubWYuZm10W3Rva2VuLmtleV0gPSAodHlwZW9mIGZtdCh0aGlzLm1mKSA9PSAnZnVuY3Rpb24nKSA/IGZtdCh0aGlzLm1mKSA6IGZtdDtcbiAgICAgIH1cbiAgICAgIGlmICghdGhpcy5tZi5mbXRbdG9rZW4ua2V5XSkgdGhyb3cgbmV3IEVycm9yKCdGb3JtYXR0aW5nIGZ1bmN0aW9uICcgKyBKU09OLnN0cmluZ2lmeSh0b2tlbi5rZXkpICsgJyBub3QgZm91bmQhJyk7XG4gICAgICBhcmdzLnB1c2goSlNPTi5zdHJpbmdpZnkodGhpcy5sYykpO1xuICAgICAgaWYgKHRva2VuLnBhcmFtcykgc3dpdGNoICh0b2tlbi5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgY2FzZSAwOiAgIGJyZWFrO1xuICAgICAgICAgIGNhc2UgMTogICBhcmdzLnB1c2goSlNPTi5zdHJpbmdpZnkodG9rZW4ucGFyYW1zWzBdKSk7IGJyZWFrO1xuICAgICAgICAgIGRlZmF1bHQ6ICBhcmdzLnB1c2goSlNPTi5zdHJpbmdpZnkodG9rZW4ucGFyYW1zKSk7IGJyZWFrO1xuICAgICAgfVxuICAgICAgZm4gPSBDb21waWxlci5wcm9wbmFtZSh0b2tlbi5rZXksICdmbXQnKTtcbiAgICAgIHRoaXMuZm9ybWF0dGVyc1t0b2tlbi5rZXldID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnb2N0b3Rob3JwZSc6XG4gICAgICBpZiAoIXBsdXJhbCkgcmV0dXJuICdcIiNcIic7XG4gICAgICBmbiA9ICdudW1iZXInO1xuICAgICAgYXJncyA9IFsgQ29tcGlsZXIucHJvcG5hbWUocGx1cmFsLmFyZywgJ2QnKSwgSlNPTi5zdHJpbmdpZnkocGx1cmFsLmFyZykgXTtcbiAgICAgIGlmIChwbHVyYWwub2Zmc2V0KSBhcmdzLnB1c2gocGx1cmFsLm9mZnNldCk7XG4gICAgICB0aGlzLnJ1bnRpbWUubnVtYmVyID0gdHJ1ZTtcbiAgICAgIGJyZWFrO1xuICB9XG5cbiAgaWYgKCFmbikgdGhyb3cgbmV3IEVycm9yKCdQYXJzZXIgZXJyb3IgZm9yIHRva2VuICcgKyBKU09OLnN0cmluZ2lmeSh0b2tlbikpO1xuICByZXR1cm4gZm4gKyAnKCcgKyBhcmdzLmpvaW4oJywgJykgKyAnKSc7XG59O1xuXG5cbi8qKiBSZWN1cnNpdmVseSBjb21waWxlIGEgc3RyaW5nIG9yIGEgdHJlZSBvZiBzdHJpbmdzIHRvIEphdmFTY3JpcHQgZnVuY3Rpb24gc291cmNlc1xuICpcbiAqICBJZiBgc3JjYCBpcyBhbiBvYmplY3Qgd2l0aCBhIGtleSB0aGF0IGlzIGFsc28gcHJlc2VudCBpbiBgcGx1cmFsc2AsIHRoZSBrZXlcbiAqICBpbiBxdWVzdGlvbiB3aWxsIGJlIHVzZWQgYXMgdGhlIGxvY2FsZSBpZGVudGlmaWVyIGZvciBpdHMgdmFsdWUuIFRvIGRpc2FibGVcbiAqICB0aGUgY29tcGlsZS10aW1lIGNoZWNrcyBmb3IgcGx1cmFsICYgc2VsZWN0b3JkaW5hbCBrZXlzIHdoaWxlIG1haW50YWluaW5nXG4gKiAgbXVsdGktbG9jYWxlIHN1cHBvcnQsIHVzZSBmYWxzeSB2YWx1ZXMgaW4gYHBsdXJhbHNgLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfG9iamVjdH0gc3JjIC0gdGhlIHNvdXJjZSBmb3Igd2hpY2ggdGhlIEpTIGNvZGUgc2hvdWxkIGJlIGdlbmVyYXRlZFxuICogQHBhcmFtIHtzdHJpbmd9IGxjIC0gdGhlIGRlZmF1bHQgbG9jYWxlXG4gKiBAcGFyYW0ge29iamVjdH0gcGx1cmFscyAtIGEgbWFwIG9mIHBsdXJhbGl6YXRpb24ga2V5cyBmb3IgYWxsIGF2YWlsYWJsZSBsb2NhbGVzXG4gKi9cbkNvbXBpbGVyLnByb3RvdHlwZS5jb21waWxlID0gZnVuY3Rpb24oc3JjLCBsYywgcGx1cmFscykge1xuICBpZiAodHlwZW9mIHNyYyAhPSAnb2JqZWN0Jykge1xuICAgIHRoaXMubGMgPSBsYztcbiAgICB2YXIgcGMgPSBwbHVyYWxzW2xjXSB8fCB7IGNhcmRpbmFsOiBbXSwgb3JkaW5hbDogW10gfTtcbiAgICB2YXIgciA9IHBhcnNlKHNyYywgcGMpLm1hcChmdW5jdGlvbih0b2tlbikgeyByZXR1cm4gdGhpcy50b2tlbih0b2tlbik7IH0sIHRoaXMpO1xuICAgIHJldHVybiAnZnVuY3Rpb24oZCkgeyByZXR1cm4gJyArIChyLmpvaW4oJyArICcpIHx8ICdcIlwiJykgKyAnOyB9JztcbiAgfSBlbHNlIHtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgZm9yICh2YXIga2V5IGluIHNyYykge1xuICAgICAgdmFyIGxjS2V5ID0gcGx1cmFscy5oYXNPd25Qcm9wZXJ0eShrZXkpID8ga2V5IDogbGM7XG4gICAgICByZXN1bHRba2V5XSA9IHRoaXMuY29tcGlsZShzcmNba2V5XSwgbGNLZXksIHBsdXJhbHMpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59XG4iLCIvKiogQGZpbGUgbWVzc2FnZWZvcm1hdC5qcyAtIElDVSBQbHVyYWxGb3JtYXQgKyBTZWxlY3RGb3JtYXQgZm9yIEphdmFTY3JpcHRcbiAqXG4gKiBAYXV0aG9yIEFsZXggU2V4dG9uIC0gQFNsZXhBeHRvbiwgRWVtZWxpIEFybyAtIEBlZW1lbGlfYXJvXG4gKiBAY29weXJpZ2h0IDIwMTItMjAxNiBBbGV4IFNleHRvbiwgRWVtZWxpIEFybywgYW5kIENvbnRyaWJ1dG9yc1xuICogQGxpY2Vuc2UgVG8gdXNlIG9yIGZvcmssIE1JVC4gVG8gY29udHJpYnV0ZSBiYWNrLCBKUyBGb3VuZGF0aW9uIENMQVxuICovXG5cbnZhciBDb21waWxlciA9IHJlcXVpcmUoJy4vY29tcGlsZXInKTtcbnZhciBSdW50aW1lID0gcmVxdWlyZSgnLi9ydW50aW1lJyk7XG5cblxuLyoqIFV0aWxpdHkgZ2V0dGVyL3dyYXBwZXIgZm9yIHBsdXJhbGl6YXRpb24gZnVuY3Rpb25zIGZyb21cbiAqICB7QGxpbmsgaHR0cDovL2dpdGh1Yi5jb20vZWVtZWxpL21ha2UtcGx1cmFsLmpzIG1ha2UtcGx1cmFsfVxuICpcbiAqIEBwcml2YXRlXG4gKi9cbmZ1bmN0aW9uIGdldFBsdXJhbEZ1bmMobG9jYWxlLCBub1BsdXJhbEtleUNoZWNrcykge1xuICB2YXIgcGx1cmFscyA9IHJlcXVpcmUoJ21ha2UtcGx1cmFsL3VtZC9wbHVyYWxzJyk7XG4gIHZhciBwbHVyYWxDYXRlZ29yaWVzID0gcmVxdWlyZSgnbWFrZS1wbHVyYWwvdW1kL3BsdXJhbENhdGVnb3JpZXMnKTtcbiAgZm9yICh2YXIgbCA9IGxvY2FsZTsgbDsgbCA9IGwucmVwbGFjZSgvWy1fXT9bXi1fXSokLywgJycpKSB7XG4gICAgdmFyIHBmID0gcGx1cmFsc1tsXTtcbiAgICBpZiAocGYpIHtcbiAgICAgIHZhciBwYyA9IG5vUGx1cmFsS2V5Q2hlY2tzID8geyBjYXJkaW5hbDogW10sIG9yZGluYWw6IFtdIH0gOiAocGx1cmFsQ2F0ZWdvcmllc1tsXSB8fCB7fSk7XG4gICAgICB2YXIgZm4gPSBmdW5jdGlvbigpIHsgcmV0dXJuIHBmLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gICAgICBmbi50b1N0cmluZyA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gcGYudG9TdHJpbmcoKTsgfTtcbiAgICAgIGZuLmNhcmRpbmFsID0gcGMuY2FyZGluYWw7XG4gICAgICBmbi5vcmRpbmFsID0gcGMub3JkaW5hbDtcbiAgICAgIHJldHVybiBmbjtcbiAgICB9XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKCdMb2NhbGlzYXRpb24gZnVuY3Rpb24gbm90IGZvdW5kIGZvciBsb2NhbGUgJyArIEpTT04uc3RyaW5naWZ5KGxvY2FsZSkpO1xufVxuXG5cbi8qKiBDcmVhdGUgYSBuZXcgbWVzc2FnZSBmb3JtYXR0ZXJcbiAqXG4gKiAgSWYgYGxvY2FsZWAgaXMgbm90IHNldCwgY2FsbHMgdG8gYGNvbXBpbGUoKWAgd2lsbCBmZXRjaCB0aGUgZGVmYXVsdCBsb2NhbGVcbiAqICBlYWNoIHRpbWUuIEEgc3RyaW5nIGBsb2NhbGVgIHdpbGwgY3JlYXRlIGEgc2luZ2xlLWxvY2FsZSBNZXNzYWdlRm9ybWF0XG4gKiAgaW5zdGFuY2UsIHdpdGggcGx1cmFsaXNhdGlvbiBydWxlcyBmZXRjaGVkIGZyb20gdGhlIFVuaWNvZGUgQ0xEUiB1c2luZ1xuICogIHtAbGluayBodHRwOi8vZ2l0aHViLmNvbS9lZW1lbGkvbWFrZS1wbHVyYWwuanMgbWFrZS1wbHVyYWx9LlxuICpcbiAqICBVc2luZyBhbiBhcnJheSBvZiBzdHJpbmdzIGFzIGBsb2NhbGVgIHdpbGwgY3JlYXRlIGEgTWVzc2FnZUZvcm1hdCBvYmplY3RcbiAqICB3aXRoIG11bHRpLWxhbmd1YWdlIHN1cHBvcnQsIHdpdGggcGx1cmFsaXNhdGlvbiBydWxlcyBmZXRjaGVkIGFzIGFib3ZlLiBUb1xuICogIHNlbGVjdCB3aGljaCB0byB1c2UsIHVzZSB0aGUgc2Vjb25kIHBhcmFtZXRlciBvZiBgY29tcGlsZSgpYCwgb3IgdXNlIG1lc3NhZ2VcbiAqICBrZXlzIGNvcnJlc3BvbmRpbmcgdG8geW91ciBsb2NhbGVzLlxuICpcbiAqICBVc2luZyBhbiBvYmplY3QgYGxvY2FsZWAgd2l0aCBhbGwgcHJvcGVydGllcyBvZiB0eXBlIGBmdW5jdGlvbmAgYWxsb3dzIGZvclxuICogIHRoZSB1c2Ugb2YgY3VzdG9tL2V4dGVybmFsbHkgZGVmaW5lZCBwbHVyYWxpc2F0aW9uIHJ1bGVzLlxuICpcbiAqIEBjbGFzc1xuICogQHBhcmFtIHtzdHJpbmd8c3RyaW5nW118T2JqZWN0LjxzdHJpbmcsZnVuY3Rpb24+fSBbbG9jYWxlXSAtIFRoZSBsb2NhbGUocykgdG8gdXNlXG4gKi9cbmZ1bmN0aW9uIE1lc3NhZ2VGb3JtYXQobG9jYWxlKSB7XG4gIHRoaXMucGx1cmFsRnVuY3MgPSB7fTtcbiAgaWYgKGxvY2FsZSkge1xuICAgIGlmICh0eXBlb2YgbG9jYWxlID09ICdzdHJpbmcnKSB7XG4gICAgICB0aGlzLnBsdXJhbEZ1bmNzW2xvY2FsZV0gPSBnZXRQbHVyYWxGdW5jKGxvY2FsZSk7XG4gICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KGxvY2FsZSkpIHtcbiAgICAgIGxvY2FsZS5mb3JFYWNoKGZ1bmN0aW9uKGxjKSB7IHRoaXMucGx1cmFsRnVuY3NbbGNdID0gZ2V0UGx1cmFsRnVuYyhsYyk7IH0sIHRoaXMpO1xuICAgIH0gZWxzZSBpZiAodHlwZW9mIGxvY2FsZSA9PSAnb2JqZWN0Jykge1xuICAgICAgZm9yICh2YXIgbGMgaW4gbG9jYWxlKSBpZiAobG9jYWxlLmhhc093blByb3BlcnR5KGxjKSkge1xuICAgICAgICBpZiAodHlwZW9mIGxvY2FsZVtsY10gIT0gJ2Z1bmN0aW9uJykgdGhyb3cgbmV3IEVycm9yKCdFeHBlY3RlZCBmdW5jdGlvbiB2YWx1ZSBmb3IgbG9jYWxlICcgKyBKU09OLnN0cmluZ2lmeShsYykpO1xuICAgICAgICB0aGlzLnBsdXJhbEZ1bmNzW2xjXSA9IGxvY2FsZVtsY107XG4gICAgICB9XG4gICAgICB0aGlzLmhhc0N1c3RvbVBsdXJhbEZ1bmNzID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgdGhpcy5mbXQgPSB7fTtcbiAgdGhpcy5ydW50aW1lID0gbmV3IFJ1bnRpbWUodGhpcyk7XG59XG5cblxuLyoqIFRoZSBkZWZhdWx0IGxvY2FsZVxuICpcbiAqICBSZWFkIGJ5IGBjb21waWxlKClgIHdoZW4gbm8gbG9jYWxlIGhhcyBiZWVuIHByZXZpb3VzbHkgc2V0XG4gKlxuICogQG1lbWJlcm9mIE1lc3NhZ2VGb3JtYXRcbiAqIEBkZWZhdWx0ICdlbidcbiAqL1xuTWVzc2FnZUZvcm1hdC5kZWZhdWx0TG9jYWxlID0gJ2VuJztcblxuXG4vKiogRXNjYXBlIHNwZWNpYWwgY2hhcmFjYXRlcnNcbiAqXG4gKiAgUHJlZml4IHRoZSBjaGFyYWN0ZXJzIGAjYCwgYHtgLCBgfWAgYW5kIGBcXGAgaW4gdGhlIGlucHV0IHN0cmluZyB3aXRoIGEgYFxcYC5cbiAqICBUaGlzIHdpbGwgYWxsb3cgdGhvc2UgY2hhcmFjdGVycyB0byBub3QgYmUgY29uc2lkZXJlZCBhcyBNZXNzYWdlRm9ybWF0XG4gKiAgY29udHJvbCBjaGFyYWN0ZXJzLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzdHIgLSBUaGUgaW5wdXQgc3RyaW5nXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZXNjYXBlZCBzdHJpbmdcbiAqL1xuTWVzc2FnZUZvcm1hdC5lc2NhcGUgPSBmdW5jdGlvbihzdHIpIHtcbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9bI3t9XFxcXF0vZywgJ1xcXFwkJicpO1xufVxuXG5cbi8qKiBEZWZhdWx0IG51bWJlciBmb3JtYXR0aW5nIGZ1bmN0aW9ucyBpbiB0aGUgc3R5bGUgb2YgSUNVJ3NcbiAqICB7QGxpbmsgaHR0cDovL2ljdS1wcm9qZWN0Lm9yZy9hcGlyZWYvaWN1NGovY29tL2libS9pY3UvdGV4dC9NZXNzYWdlRm9ybWF0Lmh0bWwgc2ltcGxlQXJnIHN5bnRheH1cbiAqICBpbXBsZW1lbnRlZCB1c2luZyB0aGVcbiAqICB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4tVVMvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvSW50bCBJbnRsfVxuICogIG9iamVjdCBkZWZpbmVkIGJ5IEVDTUEtNDAyLlxuICpcbiAqICAqKk5vdGUqKjogSW50bCBpcyBub3QgZGVmaW5lZCBpbiBkZWZhdWx0IE5vZGUgdW50aWwgMC4xMS4xNSAvIDAuMTIuMCwgc29cbiAqICBlYXJsaWVyIHZlcnNpb25zIHJlcXVpcmUgYSB7QGxpbmsgaHR0cHM6Ly93d3cubnBtanMuY29tL3BhY2thZ2UvaW50bCBwb2x5ZmlsbH0uXG4gKiAgVGhlcmVmb3JlIHtAbGluayBNZXNzYWdlRm9ybWF0LmludGxTdXBwb3J0fSBuZWVkcyB0byBiZSB0cnVlIGZvciB0aGVzZSBkZWZhdWx0XG4gKiAgZnVuY3Rpb25zIHRvIGJlIGF2YWlsYWJsZSBmb3IgaW5jbHVzaW9uIGluIHRoZSBvdXRwdXQuXG4gKlxuICogQHNlZSBNZXNzYWdlRm9ybWF0I3NldEludGxTdXBwb3J0XG4gKlxuICogQG5hbWVzcGFjZVxuICovXG5NZXNzYWdlRm9ybWF0LmZvcm1hdHRlcnMgPSB7XG5cblxuICAvKiogUmVwcmVzZW50IGEgbnVtYmVyIGFzIGFuIGludGVnZXIsIHBlcmNlbnQgb3IgY3VycmVuY3kgdmFsdWVcbiAgICpcbiAgICogIEF2YWlsYWJsZSBpbiBNZXNzYWdlRm9ybWF0IHN0cmluZ3MgYXMgYHtWQVIsIG51bWJlciwgaW50ZWdlcnxwZXJjZW50fGN1cnJlbmN5fWAuXG4gICAqICBJbnRlcm5hbGx5LCBjYWxscyBJbnRsLk51bWJlckZvcm1hdCB3aXRoIGFwcHJvcHJpYXRlIHBhcmFtZXRlcnMuIGBjdXJyZW5jeWAgd2lsbFxuICAgKiAgZGVmYXVsdCB0byBVU0Q7IHRvIGNoYW5nZSwgc2V0IGBNZXNzYWdlRm9ybWF0I2N1cnJlbmN5YCB0byB0aGUgYXBwcm9wcmlhdGVcbiAgICogIHRocmVlLWxldHRlciBjdXJyZW5jeSBjb2RlLlxuICAgKlxuICAgKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gb3BlcmF0ZSBvblxuICAgKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIE9uZSBvZiBgJ2ludGVnZXInYCwgYCdwZXJjZW50J2AgLCBvciBgY3VycmVuY3lgXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHZhciBtZiA9IG5ldyBNZXNzYWdlRm9ybWF0KCdlbicpLnNldEludGxTdXBwb3J0KHRydWUpO1xuICAgKiBtZi5jdXJyZW5jeSA9ICdFVVInOyAgLy8gbmVlZHMgdG8gYmUgc2V0IGJlZm9yZSBmaXJzdCBjb21waWxlKCkgY2FsbFxuICAgKlxuICAgKiBtZi5jb21waWxlKCd7Tn0gaXMgYWxtb3N0IHtOLCBudW1iZXIsIGludGVnZXJ9JykoeyBOOiAzLjE0IH0pXG4gICAqIC8vICczLjE0IGlzIGFsbW9zdCAzJ1xuICAgKlxuICAgKiBtZi5jb21waWxlKCd7UCwgbnVtYmVyLCBwZXJjZW50fSBjb21wbGV0ZScpKHsgUDogMC45OSB9KVxuICAgKiAvLyAnOTklIGNvbXBsZXRlJ1xuICAgKlxuICAgKiBtZi5jb21waWxlKCdUaGUgdG90YWwgaXMge1YsIG51bWJlciwgY3VycmVuY3l9LicpKHsgVjogNS41IH0pXG4gICAqIC8vICdUaGUgdG90YWwgaXMg4oKsNS41MC4nXG4gICAqL1xuICBudW1iZXI6IGZ1bmN0aW9uKHNlbGYpIHtcbiAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKFwidixsYyxwXCIsXG4gICAgICBcInJldHVybiBuZXcgSW50bC5OdW1iZXJGb3JtYXQobGMsXFxuXCIgK1xuICAgICAgXCIgICAgcD09J2ludGVnZXInID8ge21heGltdW1GcmFjdGlvbkRpZ2l0czowfVxcblwiICtcbiAgICAgIFwiICA6IHA9PSdwZXJjZW50JyA/IHtzdHlsZToncGVyY2VudCd9XFxuXCIgK1xuICAgICAgXCIgIDogcD09J2N1cnJlbmN5JyA/IHtzdHlsZTonY3VycmVuY3knLCBjdXJyZW5jeTonXCIgKyAoc2VsZi5jdXJyZW5jeSB8fCAnVVNEJykgKyBcIicsIG1pbmltdW1GcmFjdGlvbkRpZ2l0czoyLCBtYXhpbXVtRnJhY3Rpb25EaWdpdHM6Mn1cXG5cIiArXG4gICAgICBcIiAgOiB7fSkuZm9ybWF0KHYpXCJcbiAgICApO1xuICB9LFxuXG5cbiAgLyoqIFJlcHJlc2VudCBhIGRhdGUgYXMgYSBzaG9ydC9kZWZhdWx0L2xvbmcvZnVsbCBzdHJpbmdcbiAgICpcbiAgICogVGhlIGlucHV0IHZhbHVlIG5lZWRzIHRvIGJlIGluIGEgZm9ybSB0aGF0IHRoZVxuICAgKiB7QGxpbmsgaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZW4vZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvRGF0ZSBEYXRlIG9iamVjdH1cbiAgICogY2FuIHByb2Nlc3MgdXNpbmcgaXRzIHNpbmdsZS1hcmd1bWVudCBmb3JtLCBgbmV3IERhdGUodmFsdWUpYC5cbiAgICpcbiAgICogQHBhcmFtIHtudW1iZXJ8c3RyaW5nfSB2YWx1ZSAtIEVpdGhlciBhIFVuaXggZXBvY2ggdGltZSBpbiBtaWxsaXNlY29uZHMsIG9yIGEgc3RyaW5nIHZhbHVlIHJlcHJlc2VudGluZyBhIGRhdGVcbiAgICogQHBhcmFtIHtzdHJpbmd9IFt0eXBlPSdkZWZhdWx0J10gLSBPbmUgb2YgYCdzaG9ydCdgLCBgJ2RlZmF1bHQnYCwgYCdsb25nJ2AgLCBvciBgZnVsbGBcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICogdmFyIG1mID0gbmV3IE1lc3NhZ2VGb3JtYXQoWydlbicsICdmaSddKS5zZXRJbnRsU3VwcG9ydCh0cnVlKTtcbiAgICpcbiAgICogbWYuY29tcGlsZSgnVG9kYXkgaXMge1QsIGRhdGV9JykoeyBUOiBEYXRlLm5vdygpIH0pXG4gICAqIC8vICdUb2RheSBpcyBGZWIgMjEsIDIwMTYnXG4gICAqXG4gICAqIG1mLmNvbXBpbGUoJ1TDpG7DpMOkbiBvbiB7VCwgZGF0ZX0nLCAnZmknKSh7IFQ6IERhdGUubm93KCkgfSlcbiAgICogLy8gJ1TDpG7DpMOkbiBvbiAyMS4gaGVsbWlrdXV0YSAyMDE2J1xuICAgKlxuICAgKiBtZi5jb21waWxlKCdVbml4IHRpbWUgc3RhcnRlZCBvbiB7VCwgZGF0ZSwgZnVsbH0nKSh7IFQ6IDAgfSlcbiAgICogLy8gJ1VuaXggdGltZSBzdGFydGVkIG9uIFRodXJzZGF5LCBKYW51YXJ5IDEsIDE5NzAnXG4gICAqXG4gICAqIHZhciBjZiA9IG1mLmNvbXBpbGUoJ3tzeXN9IGJlY2FtZSBvcGVyYXRpb25hbCBvbiB7ZDAsIGRhdGUsIHNob3J0fScpO1xuICAgKiBjZih7IHN5czogJ0hBTCA5MDAwJywgZDA6ICcxMiBKYW51YXJ5IDE5OTknIH0pXG4gICAqIC8vICdIQUwgOTAwMCBiZWNhbWUgb3BlcmF0aW9uYWwgb24gMS8xMi8xOTk5J1xuICAgKi9cbiAgZGF0ZTogZnVuY3Rpb24odixsYyxwKSB7XG4gICAgdmFyIG8gPSB7ZGF5OidudW1lcmljJywgbW9udGg6J3Nob3J0JywgeWVhcjonbnVtZXJpYyd9O1xuICAgIHN3aXRjaCAocCkge1xuICAgICAgY2FzZSAnZnVsbCc6IG8ud2Vla2RheSA9ICdsb25nJztcbiAgICAgIGNhc2UgJ2xvbmcnOiBvLm1vbnRoID0gJ2xvbmcnOyBicmVhaztcbiAgICAgIGNhc2UgJ3Nob3J0Jzogby5tb250aCA9ICdudW1lcmljJztcbiAgICB9XG4gICAgcmV0dXJuIChuZXcgRGF0ZSh2KSkudG9Mb2NhbGVEYXRlU3RyaW5nKGxjLCBvKVxuICB9LFxuXG5cbiAgLyoqIFJlcHJlc2VudCBhIHRpbWUgYXMgYSBzaG9ydC9kZWZhdWx0L2xvbmcgc3RyaW5nXG4gICAqXG4gICAqIFRoZSBpbnB1dCB2YWx1ZSBuZWVkcyB0byBiZSBpbiBhIGZvcm0gdGhhdCB0aGVcbiAgICoge0BsaW5rIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL0RhdGUgRGF0ZSBvYmplY3R9XG4gICAqIGNhbiBwcm9jZXNzIHVzaW5nIGl0cyBzaW5nbGUtYXJndW1lbnQgZm9ybSwgYG5ldyBEYXRlKHZhbHVlKWAuXG4gICAqXG4gICAqIEBwYXJhbSB7bnVtYmVyfHN0cmluZ30gdmFsdWUgLSBFaXRoZXIgYSBVbml4IGVwb2NoIHRpbWUgaW4gbWlsbGlzZWNvbmRzLCBvciBhIHN0cmluZyB2YWx1ZSByZXByZXNlbnRpbmcgYSBkYXRlXG4gICAqIEBwYXJhbSB7c3RyaW5nfSBbdHlwZT0nZGVmYXVsdCddIC0gT25lIG9mIGAnc2hvcnQnYCwgYCdkZWZhdWx0J2AsIGAnbG9uZydgICwgb3IgYGZ1bGxgXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqIHZhciBtZiA9IG5ldyBNZXNzYWdlRm9ybWF0KFsnZW4nLCAnZmknXSkuc2V0SW50bFN1cHBvcnQodHJ1ZSk7XG4gICAqXG4gICAqIG1mLmNvbXBpbGUoJ1RoZSB0aW1lIGlzIG5vdyB7VCwgdGltZX0nKSh7IFQ6IERhdGUubm93KCkgfSlcbiAgICogLy8gJ1RoZSB0aW1lIGlzIG5vdyAxMToyNjozNSBQTSdcbiAgICpcbiAgICogbWYuY29tcGlsZSgnS2VsbG8gb24gbnl0IHtULCB0aW1lfScsICdmaScpKHsgVDogRGF0ZS5ub3coKSB9KVxuICAgKiAvLyAnS2VsbG8gb24gbnl0IDIzLjI2LjM1J1xuICAgKlxuICAgKiB2YXIgY2YgPSBtZi5jb21waWxlKCdUaGUgRWFnbGUgbGFuZGVkIGF0IHtULCB0aW1lLCBmdWxsfSBvbiB7VCwgZGF0ZSwgZnVsbH0nKTtcbiAgICogY2YoeyBUOiAnMTk2OS0wNy0yMCAyMDoxNzo0MCBVVEMnIH0pXG4gICAqIC8vICdUaGUgRWFnbGUgbGFuZGVkIGF0IDEwOjE3OjQwIFBNIEdNVCsyIG9uIFN1bmRheSwgSnVseSAyMCwgMTk2OSdcbiAgICovXG4gIHRpbWU6IGZ1bmN0aW9uKHYsbGMscCkge1xuICAgIHZhciBvID0ge3NlY29uZDonbnVtZXJpYycsIG1pbnV0ZTonbnVtZXJpYycsIGhvdXI6J251bWVyaWMnfTtcbiAgICBzd2l0Y2ggKHApIHtcbiAgICAgIGNhc2UgJ2Z1bGwnOiBjYXNlICdsb25nJzogby50aW1lWm9uZU5hbWUgPSAnc2hvcnQnOyBicmVhaztcbiAgICAgIGNhc2UgJ3Nob3J0JzogZGVsZXRlIG8uc2Vjb25kO1xuICAgIH1cbiAgICByZXR1cm4gKG5ldyBEYXRlKHYpKS50b0xvY2FsZVRpbWVTdHJpbmcobGMsIG8pXG4gIH1cbn07XG5cblxuLyoqIEFkZCBjdXN0b20gZm9ybWF0dGVyIGZ1bmN0aW9ucyB0byB0aGlzIE1lc3NhZ2VGb3JtYXQgaW5zdGFuY2VcbiAqXG4gKiAgVGhlIGdlbmVyYWwgc3ludGF4IGZvciBjYWxsaW5nIGEgZm9ybWF0dGluZyBmdW5jdGlvbiBpbiBNZXNzYWdlRm9ybWF0IGlzXG4gKiAgYHt2YXIsIGZuWywgYXJnc10qfWAsIHdoZXJlIGB2YXJgIGlzIHRoZSB2YXJpYWJsZSB0aGF0IHdpbGwgYmUgc2V0IGJ5IHRoZVxuICogIHVzZXIgY29kZSwgYGZuYCBkZXRlcm1pbmVzIHRoZSBmb3JtYXR0aW5nIGZ1bmN0aW9uLCBhbmQgYGFyZ3NgIGlzIGFuXG4gKiAgb3B0aW9uYWwgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgYWRkaXRpb25hbCBhcmd1bWVudHMuXG4gKlxuICogIEluIEphdmFTY3JpcHQsIGVhY2ggZm9ybWF0dGluZyBmdW5jdGlvbiBpcyBjYWxsZWQgd2l0aCB0aHJlZSBwYXJhbWV0ZXJzO1xuICogIHRoZSB2YXJpYWJsZSB2YWx1ZSBgdmAsIHRoZSBjdXJyZW50IGxvY2FsZSBgbGNgLCBhbmQgKGlmIHNldCkgYGFyZ3NgIGFzIGFcbiAqICBzaW5nbGUgc3RyaW5nLCBvciBhbiBhcnJheSBvZiBzdHJpbmdzLiBGb3JtYXR0aW5nIGZ1bmN0aW9ucyBzaG91bGQgbm90IGhhdmVcbiAqICBzaWRlIGVmZmVjdHMuXG4gKlxuICogQHNlZSBNZXNzYWdlRm9ybWF0LmZvcm1hdHRlcnNcbiAqXG4gKiBAbWVtYmVyb2YgTWVzc2FnZUZvcm1hdFxuICogQHBhcmFtIHtPYmplY3QuPHN0cmluZyxmdW5jdGlvbj59IGZtdCAtIEEgbWFwIG9mIGZvcm1hdHRpbmcgZnVuY3Rpb25zXG4gKiBAcmV0dXJucyB7TWVzc2FnZUZvcm1hdH0gVGhlIE1lc3NhZ2VGb3JtYXQgaW5zdGFuY2UsIHRvIGFsbG93IGZvciBjaGFpbmluZ1xuICpcbiAqIEBleGFtcGxlXG4gKiB2YXIgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdCgnZW4tR0InKTtcbiAqIG1mLmFkZEZvcm1hdHRlcnMoe1xuICogICB1cGNhc2U6IGZ1bmN0aW9uKHYpIHsgcmV0dXJuIHYudG9VcHBlckNhc2UoKTsgfSxcbiAqICAgbG9jYWxlOiBmdW5jdGlvbih2LCBsYykgeyByZXR1cm4gbGM7IH0sXG4gKiAgIHByb3A6IGZ1bmN0aW9uKHYsIGxjLCBwKSB7IHJldHVybiB2W3BdIH1cbiAqIH0pO1xuICpcbiAqIG1mLmNvbXBpbGUoJ1RoaXMgaXMge1ZBUiwgdXBjYXNlfS4nKSh7IFZBUjogJ2JpZycgfSlcbiAqIC8vICdUaGlzIGlzIEJJRy4nXG4gKlxuICogbWYuY29tcGlsZSgnVGhlIGN1cnJlbnQgbG9jYWxlIGlzIHtfLCBsb2NhbGV9LicpKHsgXzogJycgfSlcbiAqIC8vICdUaGUgY3VycmVudCBsb2NhbGUgaXMgZW4tR0IuJ1xuICpcbiAqIG1mLmNvbXBpbGUoJ0Fuc3dlcjoge29iaiwgcHJvcCwgYX0nKSh7IG9iajoge3E6IDMsIGE6IDQyfSB9KVxuICogLy8gJ0Fuc3dlcjogNDInXG4gKi9cbk1lc3NhZ2VGb3JtYXQucHJvdG90eXBlLmFkZEZvcm1hdHRlcnMgPSBmdW5jdGlvbihmbXQpIHtcbiAgZm9yICh2YXIgbmFtZSBpbiBmbXQpIGlmIChmbXQuaGFzT3duUHJvcGVydHkobmFtZSkpIHtcbiAgICB0aGlzLmZtdFtuYW1lXSA9IGZtdFtuYW1lXTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cblxuLyoqIERpc2FibGUgdGhlIHZhbGlkYXRpb24gb2YgcGx1cmFsICYgc2VsZWN0b3JkaW5hbCBrZXlzXG4gKlxuICogIFByZXZpb3VzIHZlcnNpb25zIG9mIG1lc3NhZ2Vmb3JtYXQuanMgYWxsb3dlZCB0aGUgdXNlIG9mIHBsdXJhbCAmXG4gKiAgc2VsZWN0b3JkaW5hbCBzdGF0ZW1lbnRzIHdpdGggYW55IGtleXM7IG5vdyB3ZSB0aHJvdyBhbiBlcnJvciB3aGVuIGFcbiAqICBzdGF0ZW1lbnQgdXNlcyBhIG5vbi1udW1lcmljYWwga2V5IHRoYXQgd2lsbCBuZXZlciBiZSBtYXRjaGVkIGFzIGFcbiAqICBwbHVyYWxpemF0aW9uIGNhdGVnb3J5IGZvciB0aGUgY3VycmVudCBsb2NhbGUuXG4gKlxuICogIFVzZSB0aGlzIG1ldGhvZCB0byBkaXNhYmxlIHRoZSB2YWxpZGF0aW9uIGFuZCBhbGxvdyB1c2FnZSBhcyBwcmV2aW91c2x5LlxuICogIFRvIHJlLWVuYWJsZSwgeW91J2xsIG5lZWQgdG8gY3JlYXRlIGEgbmV3IE1lc3NhZ2VGb3JtYXQgaW5zdGFuY2UuXG4gKlxuICogQHJldHVybnMge01lc3NhZ2VGb3JtYXR9IFRoZSBNZXNzYWdlRm9ybWF0IGluc3RhbmNlLCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcbiAqXG4gKiBAZXhhbXBsZVxuICogdmFyIG1mID0gbmV3IE1lc3NhZ2VGb3JtYXQoJ2VuJyk7XG4gKiB2YXIgbXNnID0gJ3tYLCBwbHVyYWwsIHplcm97bm8gYW5zd2Vyc30gb25le2FuIGFuc3dlcn0gb3RoZXJ7IyBhbnN3ZXJzfX0nO1xuICpcbiAqIG1mLmNvbXBpbGUobXNnKTtcbiAqIC8vIEVycm9yOiBJbnZhbGlkIGtleSBgemVyb2AgZm9yIGFyZ3VtZW50IGBYYC4gVmFsaWQgcGx1cmFsIGtleXMgZm9yIHRoaXNcbiAqIC8vICAgICAgICBsb2NhbGUgYXJlIGBvbmVgLCBgb3RoZXJgLCBhbmQgZXhwbGljaXQga2V5cyBsaWtlIGA9MGAuXG4gKlxuICogbWYuZGlzYWJsZVBsdXJhbEtleUNoZWNrcygpO1xuICogbWYuY29tcGlsZShtc2cpKHsgWDogMCB9KTtcbiAqIC8vICcwIGFuc3dlcnMnXG4gKi9cbk1lc3NhZ2VGb3JtYXQucHJvdG90eXBlLmRpc2FibGVQbHVyYWxLZXlDaGVja3MgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5ub1BsdXJhbEtleUNoZWNrcyA9IHRydWU7XG4gIGZvciAodmFyIGxjIGluIHRoaXMucGx1cmFsRnVuY3MpIGlmICh0aGlzLnBsdXJhbEZ1bmNzLmhhc093blByb3BlcnR5KGxjKSkge1xuICAgIHRoaXMucGx1cmFsRnVuY3NbbGNdLmNhcmRpbmFsID0gW107XG4gICAgdGhpcy5wbHVyYWxGdW5jc1tsY10ub3JkaW5hbCA9IFtdO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuXG4vKiogRW5hYmxlIG9yIGRpc2FibGUgdGhlIGFkZGl0aW9uIG9mIFVuaWNvZGUgY29udHJvbCBjaGFyYWN0ZXJzIHRvIGFsbCBpbnB1dFxuICogIHRvIHByZXNlcnZlIHRoZSBpbnRlZ3JpdHkgb2YgdGhlIG91dHB1dCB3aGVuIG1peGluZyBMVFIgYW5kIFJUTCB0ZXh0LlxuICpcbiAqIEBzZWUgaHR0cDovL2NsZHIudW5pY29kZS5vcmcvZGV2ZWxvcG1lbnQvZGV2ZWxvcG1lbnQtcHJvY2Vzcy9kZXNpZ24tcHJvcG9zYWxzL2JpZGktaGFuZGxpbmctb2Ytc3RydWN0dXJlZC10ZXh0XG4gKlxuICogQG1lbWJlcm9mIE1lc3NhZ2VGb3JtYXRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2VuYWJsZT10cnVlXVxuICogQHJldHVybnMge01lc3NhZ2VGb3JtYXR9IFRoZSBNZXNzYWdlRm9ybWF0IGluc3RhbmNlLCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcbiAqXG4gKiBAZXhhbXBsZVxuICogLy8gdXBwZXIgY2FzZSBzdGFuZHMgZm9yIFJUTCBjaGFyYWN0ZXJzLCBvdXRwdXQgaXMgc2hvd24gYXMgcmVuZGVyZWRcbiAqIHZhciBtZiA9IG5ldyBNZXNzYWdlRm9ybWF0KCdlbicpO1xuICpcbiAqIG1mLmNvbXBpbGUoJ3swfSA+PiB7MX0gPj4gezJ9JykoWydmaXJzdCcsICdTRUNPTkQnLCAnVEhJUkQnXSk7XG4gKiAvLyAnZmlyc3QgPj4gVEhJUkQgPDwgU0VDT05EJ1xuICpcbiAqIG1mLnNldEJpRGlTdXBwb3J0KHRydWUpO1xuICogbWYuY29tcGlsZSgnezB9ID4+IHsxfSA+PiB7Mn0nKShbJ2ZpcnN0JywgJ1NFQ09ORCcsICdUSElSRCddKTtcbiAqIC8vICdmaXJzdCA+PiBTRUNPTkQgPj4gVEhJUkQnXG4gKi9cbk1lc3NhZ2VGb3JtYXQucHJvdG90eXBlLnNldEJpRGlTdXBwb3J0ID0gZnVuY3Rpb24oZW5hYmxlKSB7XG4gICAgdGhpcy5iaWRpU3VwcG9ydCA9ICEhZW5hYmxlIHx8ICh0eXBlb2YgZW5hYmxlID09ICd1bmRlZmluZWQnKTtcbiAgICByZXR1cm4gdGhpcztcbn07XG5cblxuLyoqIEVuYWJsZSBvciBkaXNhYmxlIHN1cHBvcnQgZm9yIHRoZSBkZWZhdWx0IGZvcm1hdHRlcnMsIHdoaWNoIHJlcXVpcmUgdGhlXG4gKiAgYEludGxgIG9iamVjdC4gTm90ZSB0aGF0IHRoaXMgY2FuJ3QgYmUgYXV0b2RldGVjdGVkLCBhcyB0aGUgZW52aXJvbm1lbnRcbiAqICBpbiB3aGljaCB0aGUgZm9ybWF0dGVkIHRleHQgaXMgY29tcGlsZWQgaW50byBKYXZhc2NyaXB0IGZ1bmN0aW9ucyBpcyBub3RcbiAqICBuZWNlc3NhcmlseSB0aGUgc2FtZSBlbnZpcm9ubWVudCBpbiB3aGljaCB0aGV5IHdpbGwgZ2V0IGV4ZWN1dGVkLlxuICpcbiAqIEBzZWUgTWVzc2FnZUZvcm1hdC5mb3JtYXR0ZXJzXG4gKlxuICogQG1lbWJlcm9mIE1lc3NhZ2VGb3JtYXRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2VuYWJsZT10cnVlXVxuICogQHJldHVybnMge01lc3NhZ2VGb3JtYXR9IFRoZSBNZXNzYWdlRm9ybWF0IGluc3RhbmNlLCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcbiAqL1xuTWVzc2FnZUZvcm1hdC5wcm90b3R5cGUuc2V0SW50bFN1cHBvcnQgPSBmdW5jdGlvbihlbmFibGUpIHtcbiAgICB0aGlzLmludGxTdXBwb3J0ID0gISFlbmFibGUgfHwgKHR5cGVvZiBlbmFibGUgPT0gJ3VuZGVmaW5lZCcpO1xuICAgIHJldHVybiB0aGlzO1xufTtcblxuXG4vKiogQWNjb3JkaW5nIHRvIHRoZSBJQ1UgTWVzc2FnZUZvcm1hdCBzcGVjLCBhIGAjYCBjaGFyYWN0ZXIgZGlyZWN0bHkgaW5zaWRlIGFcbiAqICBgcGx1cmFsYCBvciBgc2VsZWN0b3JkaW5hbGAgc3RhdGVtZW50IHNob3VsZCBiZSByZXBsYWNlZCBieSB0aGUgbnVtYmVyXG4gKiAgbWF0Y2hpbmcgdGhlIHN1cnJvdW5kaW5nIHN0YXRlbWVudC4gQnkgZGVmYXVsdCwgbWVzc2FnZWZvcm1hdC5qcyB3aWxsXG4gKiAgcmVwbGFjZSBgI2Agc2lnbnMgd2l0aCB0aGUgdmFsdWUgb2YgdGhlIG5lYXJlc3Qgc3Vycm91bmRpbmcgYHBsdXJhbGAgb3JcbiAqICBgc2VsZWN0b3JkaW5hbGAgc3RhdGVtZW50LlxuICpcbiAqICBTZXQgdGhpcyB0byB0cnVlIHRvIGZvbGxvdyB0aGUgc3RyaWN0ZXIgSUNVIE1lc3NhZ2VGb3JtYXQgc3BlYywgYW5kIHRvXG4gKiAgdGhyb3cgYSBydW50aW1lIGVycm9yIGlmIGAjYCBpcyB1c2VkIHdpdGggbm9uLW51bWVyaWMgaW5wdXQuXG4gKlxuICogQG1lbWJlcm9mIE1lc3NhZ2VGb3JtYXRcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2VuYWJsZT10cnVlXVxuICogQHJldHVybnMge01lc3NhZ2VGb3JtYXR9IFRoZSBNZXNzYWdlRm9ybWF0IGluc3RhbmNlLCB0byBhbGxvdyBmb3IgY2hhaW5pbmdcbiAqXG4gKiBAZXhhbXBsZVxuICogdmFyIG1mID0gbmV3IE1lc3NhZ2VGb3JtYXQoJ2VuJyk7XG4gKlxuICogdmFyIGNvb2tpZU1zZyA9ICcjOiB7WCwgcGx1cmFsLCA9MHtubyBjb29raWVzfSBvbmV7YSBjb29raWV9IG90aGVyeyMgY29va2llc319JztcbiAqIG1mLmNvbXBpbGUoY29va2llTXNnKSh7IFg6IDMgfSk7XG4gKiAvLyAnIzogMyBjb29raWVzJ1xuICpcbiAqIHZhciBwYXN0cnlNc2cgPSAne1gsIHBsdXJhbCwgb25le3tQLCBzZWxlY3QsIGNvb2tpZXthIGNvb2tpZX0gb3RoZXJ7YSBwaWV9fX0gb3RoZXJ7e1AsIHNlbGVjdCwgY29va2lleyMgY29va2llc30gb3RoZXJ7IyBwaWVzfX19fSc7XG4gKiBtZi5jb21waWxlKHBhc3RyeU1zZykoeyBYOiAzLCBQOiAncGllJyB9KTtcbiAqIC8vICczIHBpZXMnXG4gKlxuICogbWYuc2V0U3RyaWN0TnVtYmVyU2lnbih0cnVlKTtcbiAqIG1mLmNvbXBpbGUocGFzdHJ5TXNnKSh7IFg6IDMsIFA6ICdwaWUnIH0pO1xuICogLy8gJyMgcGllcydcbiAqL1xuTWVzc2FnZUZvcm1hdC5wcm90b3R5cGUuc2V0U3RyaWN0TnVtYmVyU2lnbiA9IGZ1bmN0aW9uKGVuYWJsZSkge1xuICAgIHRoaXMuc3RyaWN0TnVtYmVyU2lnbiA9ICEhZW5hYmxlIHx8ICh0eXBlb2YgZW5hYmxlID09ICd1bmRlZmluZWQnKTtcbiAgICB0aGlzLnJ1bnRpbWUuc2V0U3RyaWN0TnVtYmVyKHRoaXMuc3RyaWN0TnVtYmVyU2lnbik7XG4gICAgcmV0dXJuIHRoaXM7XG59O1xuXG5cbi8qKiBDb21waWxlIG1lc3NhZ2VzIGludG8gc3RvcmFibGUgZnVuY3Rpb25zXG4gKlxuICogIElmIGBtZXNzYWdlc2AgaXMgYSBzaW5nbGUgc3RyaW5nIGluY2x1ZGluZyBJQ1UgTWVzc2FnZUZvcm1hdCBkZWNsYXJhdGlvbnMsXG4gKiAgdGhlIHJlc3VsdCBvZiBgY29tcGlsZSgpYCBpcyBhIGZ1bmN0aW9uIHRha2luZyBhIHNpbmdsZSBPYmplY3QgcGFyYW1ldGVyXG4gKiAgYGRgIHJlcHJlc2VudGluZyBlYWNoIG9mIHRoZSBpbnB1dCdzIGRlZmluZWQgdmFyaWFibGVzLlxuICpcbiAqICBJZiBgbWVzc2FnZXNgIGlzIGEgaGllcmFyY2hpY2FsIHN0cnVjdHVyZSBvZiBzdWNoIHN0cmluZ3MsIHRoZSBvdXRwdXQgb2ZcbiAqICBgY29tcGlsZSgpYCB3aWxsIG1hdGNoIHRoYXQgc3RydWN0dXJlLCB3aXRoIGVhY2ggc3RyaW5nIHJlcGxhY2VkIGJ5IGl0c1xuICogIGNvcnJlc3BvbmRpbmcgSmF2YVNjcmlwdCBmdW5jdGlvbi5cbiAqXG4gKiAgSWYgdGhlIGlucHV0IGBtZXNzYWdlc2AgLS0gYW5kIHRoZXJlZm9yZSB0aGUgb3V0cHV0IC0tIG9mIGBjb21waWxlKClgIGlzIGFuXG4gKiAgb2JqZWN0LCB0aGUgb3V0cHV0IG9iamVjdCB3aWxsIGhhdmUgYSBgdG9TdHJpbmcoZ2xvYmFsKWAgbWV0aG9kIHRoYXQgbWF5IGJlXG4gKiAgdXNlZCB0byBzdG9yZSBvciBjYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb25zIHRvIGRpc2ssIGZvciBsYXRlciBpbmNsdXNpb25cbiAqICBpbiBhbnkgSlMgZW52aXJvbm1lbnQsIHdpdGhvdXQgYSBsb2NhbCBNZXNzYWdlRm9ybWF0IGluc3RhbmNlIHJlcXVpcmVkLiBJdHNcbiAqICBgZ2xvYmFsYCBwYXJhbWV0ZXJzIHNldHMgdGhlIG5hbWUgKGlmIGFueSkgb2YgdGhlIHJlc3VsdGluZyBnbG9iYWwgdmFyaWFibGUsXG4gKiAgd2l0aCBzcGVjaWFsIGhhbmRsaW5nIGZvciBgZXhwb3J0c2AsIGBtb2R1bGUuZXhwb3J0c2AsIGFuZCBgZXhwb3J0IGRlZmF1bHRgLlxuICogIElmIGBnbG9iYWxgIGRvZXMgbm90IGNvbnRhaW4gYSBgLmAsIHRoZSBvdXRwdXQgZGVmYXVsdHMgdG8gYW4gVU1EIHBhdHRlcm4uXG4gKlxuICogIElmIGBsb2NhbGVgIGlzIG5vdCBzZXQsIHRoZSBmaXJzdCBsb2NhbGUgc2V0IGluIHRoZSBvYmplY3QncyBjb25zdHJ1Y3RvclxuICogIHdpbGwgYmUgdXNlZCBieSBkZWZhdWx0OyB1c2luZyBhIGtleSBhdCBhbnkgZGVwdGggb2YgYG1lc3NhZ2VzYCB0aGF0IGlzIGFcbiAqICBkZWNsYXJlZCBsb2NhbGUgd2lsbCBzZXQgaXRzIGNoaWxkIGVsZW1lbnRzIHRvIHVzZSB0aGF0IGxvY2FsZS5cbiAqXG4gKiAgSWYgYGxvY2FsZWAgaXMgc2V0LCBpdCBpcyB1c2VkIGZvciBhbGwgbWVzc2FnZXMuIElmIHRoZSBjb25zdHJ1Y3RvclxuICogIGRlY2xhcmVkIGFueSBsb2NhbGVzLCBgbG9jYWxlYCBuZWVkcyB0byBiZSBvbmUgb2YgdGhlbS5cbiAqXG4gKiBAbWVtYmVyb2YgTWVzc2FnZUZvcm1hdFxuICogQHBhcmFtIHtzdHJpbmd8T2JqZWN0fSBtZXNzYWdlcyAtIFRoZSBpbnB1dCBtZXNzYWdlKHMpIHRvIGJlIGNvbXBpbGVkLCBpbiBJQ1UgTWVzc2FnZUZvcm1hdFxuICogQHBhcmFtIHtzdHJpbmd9IFtsb2NhbGVdIC0gQSBsb2NhbGUgdG8gdXNlIGZvciB0aGUgbWVzc2FnZXNcbiAqIEByZXR1cm5zIHtmdW5jdGlvbnxPYmplY3R9IFRoZSBmaXJzdCBtYXRjaCBmb3VuZCBmb3IgdGhlIGdpdmVuIGxvY2FsZShzKVxuICpcbiAqIEBleGFtcGxlXG4gKiB2YXIgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdCgnZW4nKTtcbiAqIHZhciBjZiA9IG1mLmNvbXBpbGUoJ0Ege1RZUEV9IGV4YW1wbGUuJyk7XG4gKlxuICogY2YoeyBUWVBFOiAnc2ltcGxlJyB9KVxuICogLy8gJ0Egc2ltcGxlIGV4YW1wbGUuJ1xuICpcbiAqIEBleGFtcGxlXG4gKiB2YXIgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdChbJ2VuJywgJ2ZpJ10pO1xuICogdmFyIGNmID0gbWYuY29tcGlsZSh7XG4gKiAgIGVuOiB7IGE6ICdBIHtUWVBFfSBleGFtcGxlLicsXG4gKiAgICAgICAgIGI6ICdUaGlzIGlzIHRoZSB7Q09VTlQsIHNlbGVjdG9yZGluYWwsIG9uZXsjc3R9IHR3b3sjbmR9IGZld3sjcmR9IG90aGVyeyN0aH19IGV4YW1wbGUuJyB9LFxuICogICBmaTogeyBhOiAne1RZUEV9IGVzaW1lcmtraS4nLFxuICogICAgICAgICBiOiAnVMOkbcOkIG9uIHtDT1VOVCwgc2VsZWN0b3JkaW5hbCwgb3RoZXJ7Iy59fSBlc2ltZXJra2kuJyB9XG4gKiB9KTtcbiAqXG4gKiBjZi5lbi5iKHsgQ09VTlQ6IDIgfSlcbiAqIC8vICdUaGlzIGlzIHRoZSAybmQgZXhhbXBsZS4nXG4gKlxuICogY2YuZmkuYih7IENPVU5UOiAyIH0pXG4gKiAvLyAnVMOkbcOkIG9uIDIuIGVzaW1lcmtraS4nXG4gKlxuICogQGV4YW1wbGVcbiAqIHZhciBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG4gKiB2YXIgbWYgPSBuZXcgTWVzc2FnZUZvcm1hdCgnZW4nKS5zZXRJbnRsU3VwcG9ydCgpO1xuICogdmFyIG1zZ1NldCA9IHtcbiAqICAgYTogJ0Ege1RZUEV9IGV4YW1wbGUuJyxcbiAqICAgYjogJ1RoaXMgaGFzIHtDT1VOVCwgcGx1cmFsLCBvbmV7b25lIG1lbWJlcn0gb3RoZXJ7IyBtZW1iZXJzfX0uJyxcbiAqICAgYzogJ1dlIGhhdmUge1AsIG51bWJlciwgcGVyY2VudH0gY29kZSBjb3ZlcmFnZS4nXG4gKiB9O1xuICogdmFyIGNmU3RyID0gbWYuY29tcGlsZShtc2dTZXQpLnRvU3RyaW5nKCdtb2R1bGUuZXhwb3J0cycpO1xuICogZnMud3JpdGVGaWxlU3luYygnbWVzc2FnZXMuanMnLCBjZlN0cik7XG4gKiAuLi5cbiAqIHZhciBtZXNzYWdlcyA9IHJlcXVpcmUoJy4vbWVzc2FnZXMnKTtcbiAqXG4gKiBtZXNzYWdlcy5hKHsgVFlQRTogJ21vcmUgY29tcGxleCcgfSlcbiAqIC8vICdBIG1vcmUgY29tcGxleCBleGFtcGxlLidcbiAqXG4gKiBtZXNzYWdlcy5iKHsgQ09VTlQ6IDMgfSlcbiAqIC8vICdUaGlzIGhhcyAzIG1lbWJlcnMuJ1xuICovXG5NZXNzYWdlRm9ybWF0LnByb3RvdHlwZS5jb21waWxlID0gZnVuY3Rpb24obWVzc2FnZXMsIGxvY2FsZSkge1xuICBmdW5jdGlvbiBfc3RyaW5naWZ5KG9iaiwgbGV2ZWwpIHtcbiAgICBpZiAoIWxldmVsKSBsZXZlbCA9IDA7XG4gICAgaWYgKHR5cGVvZiBvYmogIT0gJ29iamVjdCcpIHJldHVybiBvYmo7XG4gICAgdmFyIG8gPSBbXSwgaW5kZW50ID0gJyc7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZXZlbDsgKytpKSBpbmRlbnQgKz0gJyAgJztcbiAgICBmb3IgKHZhciBrIGluIG9iaikgby5wdXNoKCdcXG4nICsgaW5kZW50ICsgJyAgJyArIENvbXBpbGVyLnByb3BuYW1lKGspICsgJzogJyArIF9zdHJpbmdpZnkob2JqW2tdLCBsZXZlbCArIDEpKTtcbiAgICByZXR1cm4gJ3snICsgby5qb2luKCcsJykgKyAnXFxuJyArIGluZGVudCArICd9JztcbiAgfVxuXG4gIHZhciBwZjtcbiAgaWYgKE9iamVjdC5rZXlzKHRoaXMucGx1cmFsRnVuY3MpLmxlbmd0aCA9PSAwKSB7XG4gICAgaWYgKCFsb2NhbGUpIGxvY2FsZSA9IE1lc3NhZ2VGb3JtYXQuZGVmYXVsdExvY2FsZTtcbiAgICBwZiA9IHt9O1xuICAgIHBmW2xvY2FsZV0gPSBnZXRQbHVyYWxGdW5jKGxvY2FsZSwgdGhpcy5ub1BsdXJhbEtleUNoZWNrcyk7XG4gIH0gZWxzZSBpZiAobG9jYWxlKSB7XG4gICAgcGYgPSB7fTtcbiAgICBwZltsb2NhbGVdID0gdGhpcy5wbHVyYWxGdW5jc1tsb2NhbGVdO1xuICAgIGlmICghcGZbbG9jYWxlXSkgdGhyb3cgbmV3IEVycm9yKCdMb2NhbGUgJyArIEpTT04uc3RyaW5naWZ5KGxvY2FsZSkgKyAnbm90IGZvdW5kIGluICcgKyBKU09OLnN0cmluZ2lmeSh0aGlzLnBsdXJhbEZ1bmNzKSArICchJyk7XG4gIH0gZWxzZSB7XG4gICAgcGYgPSB0aGlzLnBsdXJhbEZ1bmNzO1xuICAgIGxvY2FsZSA9IE9iamVjdC5rZXlzKHBmKVswXTtcbiAgfVxuXG4gIHZhciBjb21waWxlciA9IG5ldyBDb21waWxlcih0aGlzKTtcbiAgdmFyIG9iaiA9IGNvbXBpbGVyLmNvbXBpbGUobWVzc2FnZXMsIGxvY2FsZSwgcGYpO1xuXG4gIGlmICh0eXBlb2YgbWVzc2FnZXMgIT0gJ29iamVjdCcpIHtcbiAgICB2YXIgZm4gPSBuZXcgRnVuY3Rpb24oXG4gICAgICAgICdudW1iZXIsIHBsdXJhbCwgc2VsZWN0LCBmbXQnLCBDb21waWxlci5mdW5jbmFtZShsb2NhbGUpLFxuICAgICAgICAncmV0dXJuICcgKyBvYmopO1xuICAgIHZhciBydCA9IHRoaXMucnVudGltZTtcbiAgICByZXR1cm4gZm4ocnQubnVtYmVyLCBydC5wbHVyYWwsIHJ0LnNlbGVjdCwgdGhpcy5mbXQsIHBmW2xvY2FsZV0pO1xuICB9XG5cbiAgdmFyIHJ0U3RyID0gdGhpcy5ydW50aW1lLnRvU3RyaW5nKHBmLCBjb21waWxlcikgKyAnXFxuJztcbiAgdmFyIG9ialN0ciA9IF9zdHJpbmdpZnkob2JqKTtcbiAgdmFyIHJlc3VsdCA9IG5ldyBGdW5jdGlvbihydFN0ciArICdyZXR1cm4gJyArIG9ialN0cikoKTtcbiAgaWYgKHJlc3VsdC5oYXNPd25Qcm9wZXJ0eSgndG9TdHJpbmcnKSkgdGhyb3cgbmV3IEVycm9yKCdUaGUgdG9wLWxldmVsIG1lc3NhZ2Uga2V5IGB0b1N0cmluZ2AgaXMgcmVzZXJ2ZWQnKTtcblxuICByZXN1bHQudG9TdHJpbmcgPSBmdW5jdGlvbihnbG9iYWwpIHtcbiAgICBzd2l0Y2ggKGdsb2JhbCB8fCAnJykge1xuICAgICAgY2FzZSAnZXhwb3J0cyc6XG4gICAgICAgIHZhciBvID0gW107XG4gICAgICAgIGZvciAodmFyIGsgaW4gb2JqKSBvLnB1c2goQ29tcGlsZXIucHJvcG5hbWUoaywgJ2V4cG9ydHMnKSArICcgPSAnICsgX3N0cmluZ2lmeShvYmpba10pKTtcbiAgICAgICAgcmV0dXJuIHJ0U3RyICsgby5qb2luKCc7XFxuJyk7XG4gICAgICBjYXNlICdtb2R1bGUuZXhwb3J0cyc6XG4gICAgICAgIHJldHVybiBydFN0ciArICdtb2R1bGUuZXhwb3J0cyA9ICcgKyBvYmpTdHI7XG4gICAgICBjYXNlICdleHBvcnQgZGVmYXVsdCc6XG4gICAgICAgIHJldHVybiBydFN0ciArICAnZXhwb3J0IGRlZmF1bHQgJyArIG9ialN0cjtcbiAgICAgIGNhc2UgJyc6XG4gICAgICAgIHJldHVybiBydFN0ciArICdyZXR1cm4gJyArIG9ialN0cjtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChnbG9iYWwuaW5kZXhPZignLicpID4gLTEpIHJldHVybiBydFN0ciArIGdsb2JhbCArICcgPSAnICsgb2JqU3RyO1xuICAgICAgICByZXR1cm4gcnRTdHIgKyBbXG4gICAgICAgICAgJyhmdW5jdGlvbiAocm9vdCwgRykgeycsXG4gICAgICAgICAgJyAgaWYgKHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kKSB7IGRlZmluZShHKTsgfScsXG4gICAgICAgICAgJyAgZWxzZSBpZiAodHlwZW9mIGV4cG9ydHMgPT09IFwib2JqZWN0XCIpIHsgbW9kdWxlLmV4cG9ydHMgPSBHOyB9JyxcbiAgICAgICAgICAnICBlbHNlIHsgJyArIENvbXBpbGVyLnByb3BuYW1lKGdsb2JhbCwgJ3Jvb3QnKSArICcgPSBHOyB9JyxcbiAgICAgICAgICAnfSkodGhpcywgJyArIG9ialN0ciArICcpOydcbiAgICAgICAgXS5qb2luKCdcXG4nKTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IE1lc3NhZ2VGb3JtYXQ7XG4iLCJ2YXIgQ29tcGlsZXIgPSByZXF1aXJlKCcuL2NvbXBpbGVyJyk7XG5cblxuLyoqIEEgc2V0IG9mIHV0aWxpdHkgZnVuY3Rpb25zIHRoYXQgYXJlIGNhbGxlZCBieSB0aGUgY29tcGlsZWQgSmF2YXNjcmlwdFxuICogIGZ1bmN0aW9ucywgdGhlc2UgYXJlIGluY2x1ZGVkIGxvY2FsbHkgaW4gdGhlIG91dHB1dCBvZiB7QGxpbmtcbiAqICBNZXNzYWdlRm9ybWF0I2NvbXBpbGUgY29tcGlsZSgpfS5cbiAqXG4gKiBAY2xhc3NcbiAqIEBwYXJhbSB7TWVzc2FnZUZvcm1hdH0gbWYgLSBBIE1lc3NhZ2VGb3JtYXQgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gUnVudGltZShtZikge1xuICB0aGlzLm1mID0gbWY7XG4gIHRoaXMuc2V0U3RyaWN0TnVtYmVyKG1mLnN0cmljdE51bWJlclNpZ24pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IFJ1bnRpbWU7XG5cblxuLyoqIFV0aWxpdHkgZnVuY3Rpb24gZm9yIGAjYCBpbiBwbHVyYWwgcnVsZXNcbiAqXG4gKiAgV2lsbCB0aHJvdyBhbiBFcnJvciBpZiBgdmFsdWVgIGhhcyBhIG5vbi1udW1lcmljIHZhbHVlIGFuZCBgb2Zmc2V0YCBpc1xuICogIG5vbi16ZXJvIG9yIHtAbGluayBNZXNzYWdlRm9ybWF0I3NldFN0cmljdE51bWJlclNpZ259IGlzIHNldC5cbiAqXG4gKiBAZnVuY3Rpb24gUnVudGltZSNudW1iZXJcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSB2YWx1ZSB0byBvcGVyYXRlIG9uXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBhcmd1bWVudCwgdXNlZCBmb3IgZXJyb3IgcmVwb3J0aW5nXG4gKiBAcGFyYW0ge251bWJlcn0gW29mZnNldD0wXSAtIEFuIG9wdGlvbmFsIG9mZnNldCwgc2V0IGJ5IHRoZSBzdXJyb3VuZGluZyBjb250ZXh0XG4gKiBAcmV0dXJucyB7bnVtYmVyfHN0cmluZ30gVGhlIHJlc3VsdCBvZiBhcHBseWluZyB0aGUgb2Zmc2V0IHRvIHRoZSBpbnB1dCB2YWx1ZVxuICovXG5mdW5jdGlvbiBkZWZhdWx0TnVtYmVyKHZhbHVlLCBuYW1lLCBvZmZzZXQpIHtcbiAgaWYgKCFvZmZzZXQpIHJldHVybiB2YWx1ZTtcbiAgaWYgKGlzTmFOKHZhbHVlKSkgdGhyb3cgbmV3IEVycm9yKCdDYW5cXCd0IGFwcGx5IG9mZnNldDonICsgb2Zmc2V0ICsgJyB0byBhcmd1bWVudCBgJyArIG5hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Agd2l0aCBub24tbnVtZXJpY2FsIHZhbHVlICcgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgKyAnLicpO1xuICByZXR1cm4gdmFsdWUgLSBvZmZzZXQ7XG59XG5cblxuLyoqIEBwcml2YXRlICovXG5mdW5jdGlvbiBzdHJpY3ROdW1iZXIodmFsdWUsIG5hbWUsIG9mZnNldCkge1xuICBpZiAoaXNOYU4odmFsdWUpKSB0aHJvdyBuZXcgRXJyb3IoJ0FyZ3VtZW50IGAnICsgbmFtZSArICdgIGhhcyBub24tbnVtZXJpY2FsIHZhbHVlICcgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkgKyAnLicpO1xuICByZXR1cm4gdmFsdWUgLSAob2Zmc2V0IHx8IDApO1xufVxuXG5cbi8qKiBTZXQgaG93IHN0cmljdGx5IHRoZSB7QGxpbmsgbnVtYmVyfSBtZXRob2QgcGFyc2VzIGl0cyBpbnB1dC5cbiAqXG4gKiAgQWNjb3JkaW5nIHRvIHRoZSBJQ1UgTWVzc2FnZUZvcm1hdCBzcGVjLCBgI2AgY2FuIG9ubHkgYmUgdXNlZCB0byByZXBsYWNlIGFcbiAqICBudW1iZXIgaW5wdXQgb2YgYSBgcGx1cmFsYCBzdGF0ZW1lbnQuIEJ5IGRlZmF1bHQsIG1lc3NhZ2Vmb3JtYXQuanMgZG9lcyBub3RcbiAqICB0aHJvdyBhIHJ1bnRpbWUgZXJyb3IgaWYgeW91IHVzZSBub24tbnVtZXJpYyBhcmd1bWVudCB3aXRoIGEgYHBsdXJhbGAgcnVsZSxcbiAqICB1bmxlc3MgcnVsZSBhbHNvIGluY2x1ZGVzIGEgbm9uLXplcm8gYG9mZnNldGAuXG4gKlxuICogIFRoaXMgaXMgY2FsbGVkIGJ5IHtAbGluayBNZXNzYWdlRm9ybWF0I3NldFN0cmljdE51bWJlclNpZ259IHRvIGZvbGxvdyB0aGVcbiAqICBzdHJpY3RlciBJQ1UgTWVzc2FnZUZvcm1hdCBzcGVjLlxuICpcbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2VuYWJsZT1mYWxzZV1cbiAqL1xuUnVudGltZS5wcm90b3R5cGUuc2V0U3RyaWN0TnVtYmVyID0gZnVuY3Rpb24oZW5hYmxlKSB7XG4gIHRoaXMubnVtYmVyID0gZW5hYmxlID8gc3RyaWN0TnVtYmVyIDogZGVmYXVsdE51bWJlcjtcbn1cblxuXG4vKiogVXRpbGl0eSBmdW5jdGlvbiBmb3IgYHtOLCBwbHVyYWx8c2VsZWN0b3JkaW5hbCwgLi4ufWBcbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgLSBUaGUga2V5IHRvIHVzZSB0byBmaW5kIGEgcGx1cmFsaXphdGlvbiBydWxlXG4gKiBAcGFyYW0ge251bWJlcn0gb2Zmc2V0IC0gQW4gb2Zmc2V0IHRvIGFwcGx5IHRvIGB2YWx1ZWBcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGxjZnVuYyAtIEEgbG9jYWxlIGZ1bmN0aW9uIGZyb20gYHBsdXJhbEZ1bmNzYFxuICogQHBhcmFtIHtPYmplY3QuPHN0cmluZyxzdHJpbmc+fSBkYXRhIC0gVGhlIG9iamVjdCBmcm9tIHdoaWNoIHJlc3VsdHMgYXJlIGxvb2tlZCB1cFxuICogQHBhcmFtIHs/Ym9vbGVhbn0gaXNPcmRpbmFsIC0gSWYgdHJ1ZSwgdXNlIG9yZGluYWwgcmF0aGVyIHRoYW4gY2FyZGluYWwgcnVsZXNcbiAqIEByZXR1cm5zIHtzdHJpbmd9IFRoZSByZXN1bHQgb2YgdGhlIHBsdXJhbGl6YXRpb25cbiAqL1xuUnVudGltZS5wcm90b3R5cGUucGx1cmFsID0gZnVuY3Rpb24odmFsdWUsIG9mZnNldCwgbGNmdW5jLCBkYXRhLCBpc09yZGluYWwpIHtcbiAgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwoZGF0YSwgdmFsdWUpKSByZXR1cm4gZGF0YVt2YWx1ZV07XG4gIGlmIChvZmZzZXQpIHZhbHVlIC09IG9mZnNldDtcbiAgdmFyIGtleSA9IGxjZnVuYyh2YWx1ZSwgaXNPcmRpbmFsKTtcbiAgaWYgKGtleSBpbiBkYXRhKSByZXR1cm4gZGF0YVtrZXldO1xuICByZXR1cm4gZGF0YS5vdGhlcjtcbn1cblxuXG4vKiogVXRpbGl0eSBmdW5jdGlvbiBmb3IgYHtOLCBzZWxlY3QsIC4uLn1gXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIC0gVGhlIGtleSB0byB1c2UgdG8gZmluZCBhIHNlbGVjdGlvblxuICogQHBhcmFtIHtPYmplY3QuPHN0cmluZyxzdHJpbmc+fSBkYXRhIC0gVGhlIG9iamVjdCBmcm9tIHdoaWNoIHJlc3VsdHMgYXJlIGxvb2tlZCB1cFxuICogQHJldHVybnMge3N0cmluZ30gVGhlIHJlc3VsdCBvZiB0aGUgc2VsZWN0IHN0YXRlbWVudFxuICovXG5SdW50aW1lLnByb3RvdHlwZS5zZWxlY3QgPSBmdW5jdGlvbih2YWx1ZSwgZGF0YSkge1xuICBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbChkYXRhLCB2YWx1ZSkpIHJldHVybiBkYXRhW3ZhbHVlXTtcbiAgcmV0dXJuIGRhdGEub3RoZXI7XG59XG5cblxuLyoqIEBwcml2YXRlICovXG5SdW50aW1lLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKHBsdXJhbEZ1bmNzLCBjb21waWxlcikge1xuICBmdW5jdGlvbiBfc3RyaW5naWZ5KG8sIGxldmVsKSB7XG4gICAgaWYgKHR5cGVvZiBvICE9ICdvYmplY3QnKSB7XG4gICAgICB2YXIgZnVuY1N0ciA9IG8udG9TdHJpbmcoKS5yZXBsYWNlKC9eKGZ1bmN0aW9uIClcXHcqLywgJyQxJyk7XG4gICAgICB2YXIgaW5kZW50ID0gLyhbIFxcdF0qKVxcUy4qJC8uZXhlYyhmdW5jU3RyKTtcbiAgICAgIHJldHVybiBpbmRlbnQgPyBmdW5jU3RyLnJlcGxhY2UobmV3IFJlZ0V4cCgnXicgKyBpbmRlbnRbMV0sICdtZycpLCAnJykgOiBmdW5jU3RyO1xuICAgIH1cbiAgICB2YXIgcyA9IFtdO1xuICAgIGZvciAodmFyIGkgaW4gbykge1xuICAgICAgaWYgKGxldmVsID09IDApIHMucHVzaCgndmFyICcgKyBpICsgJyA9ICcgKyBfc3RyaW5naWZ5KG9baV0sIGxldmVsICsgMSkgKyAnO1xcbicpO1xuICAgICAgZWxzZSBzLnB1c2goQ29tcGlsZXIucHJvcG5hbWUoaSkgKyAnOiAnICsgX3N0cmluZ2lmeShvW2ldLCBsZXZlbCArIDEpKTtcbiAgICB9XG4gICAgaWYgKGxldmVsID09IDApIHJldHVybiBzLmpvaW4oJycpO1xuICAgIGlmIChzLmxlbmd0aCA9PSAwKSByZXR1cm4gJ3t9JztcbiAgICB2YXIgaW5kZW50ID0gJyAgJzsgd2hpbGUgKC0tbGV2ZWwpIGluZGVudCArPSAnICAnO1xuICAgIHJldHVybiAne1xcbicgKyBzLmpvaW4oJyxcXG4nKS5yZXBsYWNlKC9eL2dtLCBpbmRlbnQpICsgJ1xcbn0nO1xuICB9XG5cbiAgdmFyIG9iaiA9IHt9O1xuICBPYmplY3Qua2V5cyhjb21waWxlci5sb2NhbGVzKS5mb3JFYWNoKGZ1bmN0aW9uKGxjKSB7IG9ialtDb21waWxlci5mdW5jbmFtZShsYyldID0gcGx1cmFsRnVuY3NbbGNdOyB9KTtcbiAgT2JqZWN0LmtleXMoY29tcGlsZXIucnVudGltZSkuZm9yRWFjaChmdW5jdGlvbihmbikgeyBvYmpbZm5dID0gdGhpc1tmbl07IH0sIHRoaXMpO1xuICB2YXIgZm10S2V5cyA9IE9iamVjdC5rZXlzKGNvbXBpbGVyLmZvcm1hdHRlcnMpO1xuICB2YXIgZm10ID0gdGhpcy5tZi5mbXQ7XG4gIGlmIChmbXRLZXlzLmxlbmd0aCkgb2JqLmZtdCA9IGZtdEtleXMucmVkdWNlKGZ1bmN0aW9uKG8sIGtleSkgeyBvW2tleV0gPSBmbXRba2V5XTsgcmV0dXJuIG87IH0sIHt9KTtcbiAgcmV0dXJuIF9zdHJpbmdpZnkob2JqLCAwKTtcbn1cbiIsIi8qXG4gKiBHZW5lcmF0ZWQgYnkgUEVHLmpzIDAuMTAuMC5cbiAqXG4gKiBodHRwOi8vcGVnanMub3JnL1xuICovXG5cblwidXNlIHN0cmljdFwiO1xuXG5mdW5jdGlvbiBwZWckc3ViY2xhc3MoY2hpbGQsIHBhcmVudCkge1xuICBmdW5jdGlvbiBjdG9yKCkgeyB0aGlzLmNvbnN0cnVjdG9yID0gY2hpbGQ7IH1cbiAgY3Rvci5wcm90b3R5cGUgPSBwYXJlbnQucHJvdG90eXBlO1xuICBjaGlsZC5wcm90b3R5cGUgPSBuZXcgY3RvcigpO1xufVxuXG5mdW5jdGlvbiBwZWckU3ludGF4RXJyb3IobWVzc2FnZSwgZXhwZWN0ZWQsIGZvdW5kLCBsb2NhdGlvbikge1xuICB0aGlzLm1lc3NhZ2UgID0gbWVzc2FnZTtcbiAgdGhpcy5leHBlY3RlZCA9IGV4cGVjdGVkO1xuICB0aGlzLmZvdW5kICAgID0gZm91bmQ7XG4gIHRoaXMubG9jYXRpb24gPSBsb2NhdGlvbjtcbiAgdGhpcy5uYW1lICAgICA9IFwiU3ludGF4RXJyb3JcIjtcblxuICBpZiAodHlwZW9mIEVycm9yLmNhcHR1cmVTdGFja1RyYWNlID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCBwZWckU3ludGF4RXJyb3IpO1xuICB9XG59XG5cbnBlZyRzdWJjbGFzcyhwZWckU3ludGF4RXJyb3IsIEVycm9yKTtcblxucGVnJFN5bnRheEVycm9yLmJ1aWxkTWVzc2FnZSA9IGZ1bmN0aW9uKGV4cGVjdGVkLCBmb3VuZCkge1xuICB2YXIgREVTQ1JJQkVfRVhQRUNUQVRJT05fRk5TID0ge1xuICAgICAgICBsaXRlcmFsOiBmdW5jdGlvbihleHBlY3RhdGlvbikge1xuICAgICAgICAgIHJldHVybiBcIlxcXCJcIiArIGxpdGVyYWxFc2NhcGUoZXhwZWN0YXRpb24udGV4dCkgKyBcIlxcXCJcIjtcbiAgICAgICAgfSxcblxuICAgICAgICBcImNsYXNzXCI6IGZ1bmN0aW9uKGV4cGVjdGF0aW9uKSB7XG4gICAgICAgICAgdmFyIGVzY2FwZWRQYXJ0cyA9IFwiXCIsXG4gICAgICAgICAgICAgIGk7XG5cbiAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZXhwZWN0YXRpb24ucGFydHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGVzY2FwZWRQYXJ0cyArPSBleHBlY3RhdGlvbi5wYXJ0c1tpXSBpbnN0YW5jZW9mIEFycmF5XG4gICAgICAgICAgICAgID8gY2xhc3NFc2NhcGUoZXhwZWN0YXRpb24ucGFydHNbaV1bMF0pICsgXCItXCIgKyBjbGFzc0VzY2FwZShleHBlY3RhdGlvbi5wYXJ0c1tpXVsxXSlcbiAgICAgICAgICAgICAgOiBjbGFzc0VzY2FwZShleHBlY3RhdGlvbi5wYXJ0c1tpXSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIFwiW1wiICsgKGV4cGVjdGF0aW9uLmludmVydGVkID8gXCJeXCIgOiBcIlwiKSArIGVzY2FwZWRQYXJ0cyArIFwiXVwiO1xuICAgICAgICB9LFxuXG4gICAgICAgIGFueTogZnVuY3Rpb24oZXhwZWN0YXRpb24pIHtcbiAgICAgICAgICByZXR1cm4gXCJhbnkgY2hhcmFjdGVyXCI7XG4gICAgICAgIH0sXG5cbiAgICAgICAgZW5kOiBmdW5jdGlvbihleHBlY3RhdGlvbikge1xuICAgICAgICAgIHJldHVybiBcImVuZCBvZiBpbnB1dFwiO1xuICAgICAgICB9LFxuXG4gICAgICAgIG90aGVyOiBmdW5jdGlvbihleHBlY3RhdGlvbikge1xuICAgICAgICAgIHJldHVybiBleHBlY3RhdGlvbi5kZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuICAgICAgfTtcblxuICBmdW5jdGlvbiBoZXgoY2gpIHtcbiAgICByZXR1cm4gY2guY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxpdGVyYWxFc2NhcGUocykge1xuICAgIHJldHVybiBzXG4gICAgICAucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKVxuICAgICAgLnJlcGxhY2UoL1wiL2csICAnXFxcXFwiJylcbiAgICAgIC5yZXBsYWNlKC9cXDAvZywgJ1xcXFwwJylcbiAgICAgIC5yZXBsYWNlKC9cXHQvZywgJ1xcXFx0JylcbiAgICAgIC5yZXBsYWNlKC9cXG4vZywgJ1xcXFxuJylcbiAgICAgIC5yZXBsYWNlKC9cXHIvZywgJ1xcXFxyJylcbiAgICAgIC5yZXBsYWNlKC9bXFx4MDAtXFx4MEZdL2csICAgICAgICAgIGZ1bmN0aW9uKGNoKSB7IHJldHVybiAnXFxcXHgwJyArIGhleChjaCk7IH0pXG4gICAgICAucmVwbGFjZSgvW1xceDEwLVxceDFGXFx4N0YtXFx4OUZdL2csIGZ1bmN0aW9uKGNoKSB7IHJldHVybiAnXFxcXHgnICArIGhleChjaCk7IH0pO1xuICB9XG5cbiAgZnVuY3Rpb24gY2xhc3NFc2NhcGUocykge1xuICAgIHJldHVybiBzXG4gICAgICAucmVwbGFjZSgvXFxcXC9nLCAnXFxcXFxcXFwnKVxuICAgICAgLnJlcGxhY2UoL1xcXS9nLCAnXFxcXF0nKVxuICAgICAgLnJlcGxhY2UoL1xcXi9nLCAnXFxcXF4nKVxuICAgICAgLnJlcGxhY2UoLy0vZywgICdcXFxcLScpXG4gICAgICAucmVwbGFjZSgvXFwwL2csICdcXFxcMCcpXG4gICAgICAucmVwbGFjZSgvXFx0L2csICdcXFxcdCcpXG4gICAgICAucmVwbGFjZSgvXFxuL2csICdcXFxcbicpXG4gICAgICAucmVwbGFjZSgvXFxyL2csICdcXFxccicpXG4gICAgICAucmVwbGFjZSgvW1xceDAwLVxceDBGXS9nLCAgICAgICAgICBmdW5jdGlvbihjaCkgeyByZXR1cm4gJ1xcXFx4MCcgKyBoZXgoY2gpOyB9KVxuICAgICAgLnJlcGxhY2UoL1tcXHgxMC1cXHgxRlxceDdGLVxceDlGXS9nLCBmdW5jdGlvbihjaCkgeyByZXR1cm4gJ1xcXFx4JyAgKyBoZXgoY2gpOyB9KTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc2NyaWJlRXhwZWN0YXRpb24oZXhwZWN0YXRpb24pIHtcbiAgICByZXR1cm4gREVTQ1JJQkVfRVhQRUNUQVRJT05fRk5TW2V4cGVjdGF0aW9uLnR5cGVdKGV4cGVjdGF0aW9uKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc2NyaWJlRXhwZWN0ZWQoZXhwZWN0ZWQpIHtcbiAgICB2YXIgZGVzY3JpcHRpb25zID0gbmV3IEFycmF5KGV4cGVjdGVkLmxlbmd0aCksXG4gICAgICAgIGksIGo7XG5cbiAgICBmb3IgKGkgPSAwOyBpIDwgZXhwZWN0ZWQubGVuZ3RoOyBpKyspIHtcbiAgICAgIGRlc2NyaXB0aW9uc1tpXSA9IGRlc2NyaWJlRXhwZWN0YXRpb24oZXhwZWN0ZWRbaV0pO1xuICAgIH1cblxuICAgIGRlc2NyaXB0aW9ucy5zb3J0KCk7XG5cbiAgICBpZiAoZGVzY3JpcHRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgIGZvciAoaSA9IDEsIGogPSAxOyBpIDwgZGVzY3JpcHRpb25zLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChkZXNjcmlwdGlvbnNbaSAtIDFdICE9PSBkZXNjcmlwdGlvbnNbaV0pIHtcbiAgICAgICAgICBkZXNjcmlwdGlvbnNbal0gPSBkZXNjcmlwdGlvbnNbaV07XG4gICAgICAgICAgaisrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBkZXNjcmlwdGlvbnMubGVuZ3RoID0gajtcbiAgICB9XG5cbiAgICBzd2l0Y2ggKGRlc2NyaXB0aW9ucy5sZW5ndGgpIHtcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgcmV0dXJuIGRlc2NyaXB0aW9uc1swXTtcblxuICAgICAgY2FzZSAyOlxuICAgICAgICByZXR1cm4gZGVzY3JpcHRpb25zWzBdICsgXCIgb3IgXCIgKyBkZXNjcmlwdGlvbnNbMV07XG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBkZXNjcmlwdGlvbnMuc2xpY2UoMCwgLTEpLmpvaW4oXCIsIFwiKVxuICAgICAgICAgICsgXCIsIG9yIFwiXG4gICAgICAgICAgKyBkZXNjcmlwdGlvbnNbZGVzY3JpcHRpb25zLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIGRlc2NyaWJlRm91bmQoZm91bmQpIHtcbiAgICByZXR1cm4gZm91bmQgPyBcIlxcXCJcIiArIGxpdGVyYWxFc2NhcGUoZm91bmQpICsgXCJcXFwiXCIgOiBcImVuZCBvZiBpbnB1dFwiO1xuICB9XG5cbiAgcmV0dXJuIFwiRXhwZWN0ZWQgXCIgKyBkZXNjcmliZUV4cGVjdGVkKGV4cGVjdGVkKSArIFwiIGJ1dCBcIiArIGRlc2NyaWJlRm91bmQoZm91bmQpICsgXCIgZm91bmQuXCI7XG59O1xuXG5mdW5jdGlvbiBwZWckcGFyc2UoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgIT09IHZvaWQgMCA/IG9wdGlvbnMgOiB7fTtcblxuICB2YXIgcGVnJEZBSUxFRCA9IHt9LFxuXG4gICAgICBwZWckc3RhcnRSdWxlRnVuY3Rpb25zID0geyBzdGFydDogcGVnJHBhcnNlc3RhcnQgfSxcbiAgICAgIHBlZyRzdGFydFJ1bGVGdW5jdGlvbiAgPSBwZWckcGFyc2VzdGFydCxcblxuICAgICAgcGVnJGMwID0gXCIjXCIsXG4gICAgICBwZWckYzEgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiI1wiLCBmYWxzZSksXG4gICAgICBwZWckYzIgPSBmdW5jdGlvbigpIHsgcmV0dXJuIHsgdHlwZTogJ29jdG90aG9ycGUnIH07IH0sXG4gICAgICBwZWckYzMgPSBmdW5jdGlvbihzdHIpIHsgcmV0dXJuIHN0ci5qb2luKCcnKTsgfSxcbiAgICAgIHBlZyRjNCA9IFwie1wiLFxuICAgICAgcGVnJGM1ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIntcIiwgZmFsc2UpLFxuICAgICAgcGVnJGM2ID0gXCJ9XCIsXG4gICAgICBwZWckYzcgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwifVwiLCBmYWxzZSksXG4gICAgICBwZWckYzggPSBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ2FyZ3VtZW50JyxcbiAgICAgICAgICAgIGFyZzogYXJnXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgIHBlZyRjOSA9IFwiLFwiLFxuICAgICAgcGVnJGMxMCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCIsXCIsIGZhbHNlKSxcbiAgICAgIHBlZyRjMTEgPSBcInNlbGVjdFwiLFxuICAgICAgcGVnJGMxMiA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJzZWxlY3RcIiwgZmFsc2UpLFxuICAgICAgcGVnJGMxMyA9IGZ1bmN0aW9uKGFyZywgY2FzZXMpIHtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogJ3NlbGVjdCcsXG4gICAgICAgICAgICBhcmc6IGFyZyxcbiAgICAgICAgICAgIGNhc2VzOiBjYXNlc1xuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICBwZWckYzE0ID0gXCJwbHVyYWxcIixcbiAgICAgIHBlZyRjMTUgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwicGx1cmFsXCIsIGZhbHNlKSxcbiAgICAgIHBlZyRjMTYgPSBcInNlbGVjdG9yZGluYWxcIixcbiAgICAgIHBlZyRjMTcgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwic2VsZWN0b3JkaW5hbFwiLCBmYWxzZSksXG4gICAgICBwZWckYzE4ID0gZnVuY3Rpb24oYXJnLCB0eXBlLCBvZmZzZXQsIGNhc2VzKSB7XG4gICAgICAgICAgdmFyIGxzID0gKCh0eXBlID09PSAnc2VsZWN0b3JkaW5hbCcpID8gb3B0aW9ucy5vcmRpbmFsIDogb3B0aW9ucy5jYXJkaW5hbClcbiAgICAgICAgICAgICAgICAgICB8fCBbJ3plcm8nLCAnb25lJywgJ3R3bycsICdmZXcnLCAnbWFueScsICdvdGhlciddO1xuICAgICAgICAgIGlmIChscyAmJiBscy5sZW5ndGgpIGNhc2VzLmZvckVhY2goZnVuY3Rpb24oYykge1xuICAgICAgICAgICAgaWYgKGlzTmFOKGMua2V5KSAmJiBscy5pbmRleE9mKGMua2V5KSA8IDApIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgJ0ludmFsaWQga2V5IGAnICsgYy5rZXkgKyAnYCBmb3IgYXJndW1lbnQgYCcgKyBhcmcgKyAnYC4nICtcbiAgICAgICAgICAgICAgJyBWYWxpZCAnICsgdHlwZSArICcga2V5cyBmb3IgdGhpcyBsb2NhbGUgYXJlIGAnICsgbHMuam9pbignYCwgYCcpICtcbiAgICAgICAgICAgICAgJ2AsIGFuZCBleHBsaWNpdCBrZXlzIGxpa2UgYD0wYC4nKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIGFyZzogYXJnLFxuICAgICAgICAgICAgb2Zmc2V0OiBvZmZzZXQgfHwgMCxcbiAgICAgICAgICAgIGNhc2VzOiBjYXNlc1xuICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICBwZWckYzE5ID0gZnVuY3Rpb24oYXJnLCBrZXksIHBhcmFtcykge1xuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiAnZnVuY3Rpb24nLFxuICAgICAgICAgICAgYXJnOiBhcmcsXG4gICAgICAgICAgICBrZXk6IGtleSxcbiAgICAgICAgICAgIHBhcmFtczogcGFyYW1zXG4gICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgIHBlZyRjMjAgPSAvXlswLTlhLXpBLVokX10vLFxuICAgICAgcGVnJGMyMSA9IHBlZyRjbGFzc0V4cGVjdGF0aW9uKFtbXCIwXCIsIFwiOVwiXSwgW1wiYVwiLCBcInpcIl0sIFtcIkFcIiwgXCJaXCJdLCBcIiRcIiwgXCJfXCJdLCBmYWxzZSwgZmFsc2UpLFxuICAgICAgcGVnJGMyMiA9IC9eW14gXFx0XFxuXFxyLC4rPXt9XS8sXG4gICAgICBwZWckYzIzID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1wiIFwiLCBcIlxcdFwiLCBcIlxcblwiLCBcIlxcclwiLCBcIixcIiwgXCIuXCIsIFwiK1wiLCBcIj1cIiwgXCJ7XCIsIFwifVwiXSwgdHJ1ZSwgZmFsc2UpLFxuICAgICAgcGVnJGMyNCA9IGZ1bmN0aW9uKGtleSwgdG9rZW5zKSB7IHJldHVybiB7IGtleToga2V5LCB0b2tlbnM6IHRva2VucyB9OyB9LFxuICAgICAgcGVnJGMyNSA9IGZ1bmN0aW9uKHRva2VucykgeyByZXR1cm4gdG9rZW5zOyB9LFxuICAgICAgcGVnJGMyNiA9IFwib2Zmc2V0XCIsXG4gICAgICBwZWckYzI3ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIm9mZnNldFwiLCBmYWxzZSksXG4gICAgICBwZWckYzI4ID0gXCI6XCIsXG4gICAgICBwZWckYzI5ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIjpcIiwgZmFsc2UpLFxuICAgICAgcGVnJGMzMCA9IGZ1bmN0aW9uKGQpIHsgcmV0dXJuIGQ7IH0sXG4gICAgICBwZWckYzMxID0gXCI9XCIsXG4gICAgICBwZWckYzMyID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIj1cIiwgZmFsc2UpLFxuICAgICAgcGVnJGMzMyA9IGZ1bmN0aW9uKHApIHsgcmV0dXJuIG9wdGlvbnMuc3RyaWN0RnVuY3Rpb25QYXJhbXM7IH0sXG4gICAgICBwZWckYzM0ID0gZnVuY3Rpb24ocCkgeyByZXR1cm4gcDsgfSxcbiAgICAgIHBlZyRjMzUgPSBmdW5jdGlvbihwKSB7IHJldHVybiBwLnJlcGxhY2UoL15bIFxcdFxcblxccl0qfFsgXFx0XFxuXFxyXSokL2csICcnKTsgfSxcbiAgICAgIHBlZyRjMzYgPSBcIicnXCIsXG4gICAgICBwZWckYzM3ID0gcGVnJGxpdGVyYWxFeHBlY3RhdGlvbihcIicnXCIsIGZhbHNlKSxcbiAgICAgIHBlZyRjMzggPSBmdW5jdGlvbigpIHsgcmV0dXJuIFwiJ1wiOyB9LFxuICAgICAgcGVnJGMzOSA9IC9eW14nXS8sXG4gICAgICBwZWckYzQwID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1wiJ1wiXSwgdHJ1ZSwgZmFsc2UpLFxuICAgICAgcGVnJGM0MSA9IFwiJ3tcIixcbiAgICAgIHBlZyRjNDIgPSBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKFwiJ3tcIiwgZmFsc2UpLFxuICAgICAgcGVnJGM0MyA9IFwiJ1wiLFxuICAgICAgcGVnJGM0NCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCInXCIsIGZhbHNlKSxcbiAgICAgIHBlZyRjNDUgPSBmdW5jdGlvbihzdHIpIHsgcmV0dXJuICdcXHUwMDdCJytzdHIuam9pbignJyk7IH0sXG4gICAgICBwZWckYzQ2ID0gXCInfVwiLFxuICAgICAgcGVnJGM0NyA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCInfVwiLCBmYWxzZSksXG4gICAgICBwZWckYzQ4ID0gZnVuY3Rpb24oc3RyKSB7IHJldHVybiAnXFx1MDA3RCcrc3RyLmpvaW4oJycpOyB9LFxuICAgICAgcGVnJGM0OSA9IC9eW157fSNcXFxcXFwwLVxceDA4XFx4MEUtXFx4MUZcXHg3Rl0vLFxuICAgICAgcGVnJGM1MCA9IHBlZyRjbGFzc0V4cGVjdGF0aW9uKFtcIntcIiwgXCJ9XCIsIFwiI1wiLCBcIlxcXFxcIiwgW1wiXFwwXCIsIFwiXFxiXCJdLCBbXCJcXHgwRVwiLCBcIlxceDFGXCJdLCBcIlxceDdGXCJdLCB0cnVlLCBmYWxzZSksXG4gICAgICBwZWckYzUxID0gXCJcXFxcXFxcXFwiLFxuICAgICAgcGVnJGM1MiA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJcXFxcXFxcXFwiLCBmYWxzZSksXG4gICAgICBwZWckYzUzID0gZnVuY3Rpb24oKSB7IHJldHVybiAnXFxcXCc7IH0sXG4gICAgICBwZWckYzU0ID0gXCJcXFxcI1wiLFxuICAgICAgcGVnJGM1NSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJcXFxcI1wiLCBmYWxzZSksXG4gICAgICBwZWckYzU2ID0gZnVuY3Rpb24oKSB7IHJldHVybiAnIyc7IH0sXG4gICAgICBwZWckYzU3ID0gXCJcXFxce1wiLFxuICAgICAgcGVnJGM1OCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJcXFxce1wiLCBmYWxzZSksXG4gICAgICBwZWckYzU5ID0gZnVuY3Rpb24oKSB7IHJldHVybiAnXFx1MDA3Qic7IH0sXG4gICAgICBwZWckYzYwID0gXCJcXFxcfVwiLFxuICAgICAgcGVnJGM2MSA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJcXFxcfVwiLCBmYWxzZSksXG4gICAgICBwZWckYzYyID0gZnVuY3Rpb24oKSB7IHJldHVybiAnXFx1MDA3RCc7IH0sXG4gICAgICBwZWckYzYzID0gXCJcXFxcdVwiLFxuICAgICAgcGVnJGM2NCA9IHBlZyRsaXRlcmFsRXhwZWN0YXRpb24oXCJcXFxcdVwiLCBmYWxzZSksXG4gICAgICBwZWckYzY1ID0gZnVuY3Rpb24oaDEsIGgyLCBoMywgaDQpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKHBhcnNlSW50KCcweCcgKyBoMSArIGgyICsgaDMgKyBoNCkpO1xuICAgICAgICAgIH0sXG4gICAgICBwZWckYzY2ID0gL15bXicsfV0vLFxuICAgICAgcGVnJGM2NyA9IHBlZyRjbGFzc0V4cGVjdGF0aW9uKFtcIidcIiwgXCIsXCIsIFwifVwiXSwgdHJ1ZSwgZmFsc2UpLFxuICAgICAgcGVnJGM2OCA9IC9eW14nfV0vLFxuICAgICAgcGVnJGM2OSA9IHBlZyRjbGFzc0V4cGVjdGF0aW9uKFtcIidcIiwgXCJ9XCJdLCB0cnVlLCBmYWxzZSksXG4gICAgICBwZWckYzcwID0gL15bMC05XS8sXG4gICAgICBwZWckYzcxID0gcGVnJGNsYXNzRXhwZWN0YXRpb24oW1tcIjBcIiwgXCI5XCJdXSwgZmFsc2UsIGZhbHNlKSxcbiAgICAgIHBlZyRjNzIgPSAvXlswLTlhLWZBLUZdLyxcbiAgICAgIHBlZyRjNzMgPSBwZWckY2xhc3NFeHBlY3RhdGlvbihbW1wiMFwiLCBcIjlcIl0sIFtcImFcIiwgXCJmXCJdLCBbXCJBXCIsIFwiRlwiXV0sIGZhbHNlLCBmYWxzZSksXG4gICAgICBwZWckYzc0ID0gL15bIFxcdFxcblxccl0vLFxuICAgICAgcGVnJGM3NSA9IHBlZyRjbGFzc0V4cGVjdGF0aW9uKFtcIiBcIiwgXCJcXHRcIiwgXCJcXG5cIiwgXCJcXHJcIl0sIGZhbHNlLCBmYWxzZSksXG5cbiAgICAgIHBlZyRjdXJyUG9zICAgICAgICAgID0gMCxcbiAgICAgIHBlZyRzYXZlZFBvcyAgICAgICAgID0gMCxcbiAgICAgIHBlZyRwb3NEZXRhaWxzQ2FjaGUgID0gW3sgbGluZTogMSwgY29sdW1uOiAxIH1dLFxuICAgICAgcGVnJG1heEZhaWxQb3MgICAgICAgPSAwLFxuICAgICAgcGVnJG1heEZhaWxFeHBlY3RlZCAgPSBbXSxcbiAgICAgIHBlZyRzaWxlbnRGYWlscyAgICAgID0gMCxcblxuICAgICAgcGVnJHJlc3VsdDtcblxuICBpZiAoXCJzdGFydFJ1bGVcIiBpbiBvcHRpb25zKSB7XG4gICAgaWYgKCEob3B0aW9ucy5zdGFydFJ1bGUgaW4gcGVnJHN0YXJ0UnVsZUZ1bmN0aW9ucykpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbid0IHN0YXJ0IHBhcnNpbmcgZnJvbSBydWxlIFxcXCJcIiArIG9wdGlvbnMuc3RhcnRSdWxlICsgXCJcXFwiLlwiKTtcbiAgICB9XG5cbiAgICBwZWckc3RhcnRSdWxlRnVuY3Rpb24gPSBwZWckc3RhcnRSdWxlRnVuY3Rpb25zW29wdGlvbnMuc3RhcnRSdWxlXTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHRleHQoKSB7XG4gICAgcmV0dXJuIGlucHV0LnN1YnN0cmluZyhwZWckc2F2ZWRQb3MsIHBlZyRjdXJyUG9zKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGxvY2F0aW9uKCkge1xuICAgIHJldHVybiBwZWckY29tcHV0ZUxvY2F0aW9uKHBlZyRzYXZlZFBvcywgcGVnJGN1cnJQb3MpO1xuICB9XG5cbiAgZnVuY3Rpb24gZXhwZWN0ZWQoZGVzY3JpcHRpb24sIGxvY2F0aW9uKSB7XG4gICAgbG9jYXRpb24gPSBsb2NhdGlvbiAhPT0gdm9pZCAwID8gbG9jYXRpb24gOiBwZWckY29tcHV0ZUxvY2F0aW9uKHBlZyRzYXZlZFBvcywgcGVnJGN1cnJQb3MpXG5cbiAgICB0aHJvdyBwZWckYnVpbGRTdHJ1Y3R1cmVkRXJyb3IoXG4gICAgICBbcGVnJG90aGVyRXhwZWN0YXRpb24oZGVzY3JpcHRpb24pXSxcbiAgICAgIGlucHV0LnN1YnN0cmluZyhwZWckc2F2ZWRQb3MsIHBlZyRjdXJyUG9zKSxcbiAgICAgIGxvY2F0aW9uXG4gICAgKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIGVycm9yKG1lc3NhZ2UsIGxvY2F0aW9uKSB7XG4gICAgbG9jYXRpb24gPSBsb2NhdGlvbiAhPT0gdm9pZCAwID8gbG9jYXRpb24gOiBwZWckY29tcHV0ZUxvY2F0aW9uKHBlZyRzYXZlZFBvcywgcGVnJGN1cnJQb3MpXG5cbiAgICB0aHJvdyBwZWckYnVpbGRTaW1wbGVFcnJvcihtZXNzYWdlLCBsb2NhdGlvbik7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckbGl0ZXJhbEV4cGVjdGF0aW9uKHRleHQsIGlnbm9yZUNhc2UpIHtcbiAgICByZXR1cm4geyB0eXBlOiBcImxpdGVyYWxcIiwgdGV4dDogdGV4dCwgaWdub3JlQ2FzZTogaWdub3JlQ2FzZSB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGNsYXNzRXhwZWN0YXRpb24ocGFydHMsIGludmVydGVkLCBpZ25vcmVDYXNlKSB7XG4gICAgcmV0dXJuIHsgdHlwZTogXCJjbGFzc1wiLCBwYXJ0czogcGFydHMsIGludmVydGVkOiBpbnZlcnRlZCwgaWdub3JlQ2FzZTogaWdub3JlQ2FzZSB9O1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGFueUV4cGVjdGF0aW9uKCkge1xuICAgIHJldHVybiB7IHR5cGU6IFwiYW55XCIgfTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRlbmRFeHBlY3RhdGlvbigpIHtcbiAgICByZXR1cm4geyB0eXBlOiBcImVuZFwiIH07XG4gIH1cblxuICBmdW5jdGlvbiBwZWckb3RoZXJFeHBlY3RhdGlvbihkZXNjcmlwdGlvbikge1xuICAgIHJldHVybiB7IHR5cGU6IFwib3RoZXJcIiwgZGVzY3JpcHRpb246IGRlc2NyaXB0aW9uIH07XG4gIH1cblxuICBmdW5jdGlvbiBwZWckY29tcHV0ZVBvc0RldGFpbHMocG9zKSB7XG4gICAgdmFyIGRldGFpbHMgPSBwZWckcG9zRGV0YWlsc0NhY2hlW3Bvc10sIHA7XG5cbiAgICBpZiAoZGV0YWlscykge1xuICAgICAgcmV0dXJuIGRldGFpbHM7XG4gICAgfSBlbHNlIHtcbiAgICAgIHAgPSBwb3MgLSAxO1xuICAgICAgd2hpbGUgKCFwZWckcG9zRGV0YWlsc0NhY2hlW3BdKSB7XG4gICAgICAgIHAtLTtcbiAgICAgIH1cblxuICAgICAgZGV0YWlscyA9IHBlZyRwb3NEZXRhaWxzQ2FjaGVbcF07XG4gICAgICBkZXRhaWxzID0ge1xuICAgICAgICBsaW5lOiAgIGRldGFpbHMubGluZSxcbiAgICAgICAgY29sdW1uOiBkZXRhaWxzLmNvbHVtblxuICAgICAgfTtcblxuICAgICAgd2hpbGUgKHAgPCBwb3MpIHtcbiAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocCkgPT09IDEwKSB7XG4gICAgICAgICAgZGV0YWlscy5saW5lKys7XG4gICAgICAgICAgZGV0YWlscy5jb2x1bW4gPSAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGRldGFpbHMuY29sdW1uKys7XG4gICAgICAgIH1cblxuICAgICAgICBwKys7XG4gICAgICB9XG5cbiAgICAgIHBlZyRwb3NEZXRhaWxzQ2FjaGVbcG9zXSA9IGRldGFpbHM7XG4gICAgICByZXR1cm4gZGV0YWlscztcbiAgICB9XG4gIH1cblxuICBmdW5jdGlvbiBwZWckY29tcHV0ZUxvY2F0aW9uKHN0YXJ0UG9zLCBlbmRQb3MpIHtcbiAgICB2YXIgc3RhcnRQb3NEZXRhaWxzID0gcGVnJGNvbXB1dGVQb3NEZXRhaWxzKHN0YXJ0UG9zKSxcbiAgICAgICAgZW5kUG9zRGV0YWlscyAgID0gcGVnJGNvbXB1dGVQb3NEZXRhaWxzKGVuZFBvcyk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgc3RhcnQ6IHtcbiAgICAgICAgb2Zmc2V0OiBzdGFydFBvcyxcbiAgICAgICAgbGluZTogICBzdGFydFBvc0RldGFpbHMubGluZSxcbiAgICAgICAgY29sdW1uOiBzdGFydFBvc0RldGFpbHMuY29sdW1uXG4gICAgICB9LFxuICAgICAgZW5kOiB7XG4gICAgICAgIG9mZnNldDogZW5kUG9zLFxuICAgICAgICBsaW5lOiAgIGVuZFBvc0RldGFpbHMubGluZSxcbiAgICAgICAgY29sdW1uOiBlbmRQb3NEZXRhaWxzLmNvbHVtblxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICBmdW5jdGlvbiBwZWckZmFpbChleHBlY3RlZCkge1xuICAgIGlmIChwZWckY3VyclBvcyA8IHBlZyRtYXhGYWlsUG9zKSB7IHJldHVybjsgfVxuXG4gICAgaWYgKHBlZyRjdXJyUG9zID4gcGVnJG1heEZhaWxQb3MpIHtcbiAgICAgIHBlZyRtYXhGYWlsUG9zID0gcGVnJGN1cnJQb3M7XG4gICAgICBwZWckbWF4RmFpbEV4cGVjdGVkID0gW107XG4gICAgfVxuXG4gICAgcGVnJG1heEZhaWxFeHBlY3RlZC5wdXNoKGV4cGVjdGVkKTtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRidWlsZFNpbXBsZUVycm9yKG1lc3NhZ2UsIGxvY2F0aW9uKSB7XG4gICAgcmV0dXJuIG5ldyBwZWckU3ludGF4RXJyb3IobWVzc2FnZSwgbnVsbCwgbnVsbCwgbG9jYXRpb24pO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJGJ1aWxkU3RydWN0dXJlZEVycm9yKGV4cGVjdGVkLCBmb3VuZCwgbG9jYXRpb24pIHtcbiAgICByZXR1cm4gbmV3IHBlZyRTeW50YXhFcnJvcihcbiAgICAgIHBlZyRTeW50YXhFcnJvci5idWlsZE1lc3NhZ2UoZXhwZWN0ZWQsIGZvdW5kKSxcbiAgICAgIGV4cGVjdGVkLFxuICAgICAgZm91bmQsXG4gICAgICBsb2NhdGlvblxuICAgICk7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VzdGFydCgpIHtcbiAgICB2YXIgczAsIHMxO1xuXG4gICAgczAgPSBbXTtcbiAgICBzMSA9IHBlZyRwYXJzZXRva2VuKCk7XG4gICAgd2hpbGUgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMC5wdXNoKHMxKTtcbiAgICAgIHMxID0gcGVnJHBhcnNldG9rZW4oKTtcbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2V0b2tlbigpIHtcbiAgICB2YXIgczAsIHMxLCBzMjtcblxuICAgIHMwID0gcGVnJHBhcnNlYXJndW1lbnQoKTtcbiAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMwID0gcGVnJHBhcnNlc2VsZWN0KCk7XG4gICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczAgPSBwZWckcGFyc2VwbHVyYWwoKTtcbiAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczAgPSBwZWckcGFyc2VmdW5jdGlvbigpO1xuICAgICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMzUpIHtcbiAgICAgICAgICAgICAgczEgPSBwZWckYzA7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxKTsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICBzMSA9IHBlZyRjMigpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgICAgICBzMSA9IFtdO1xuICAgICAgICAgICAgICBzMiA9IHBlZyRwYXJzZWNoYXIoKTtcbiAgICAgICAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgd2hpbGUgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICBzMS5wdXNoKHMyKTtcbiAgICAgICAgICAgICAgICAgIHMyID0gcGVnJHBhcnNlY2hhcigpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgICAgczEgPSBwZWckYzMoczEpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlYXJndW1lbnQoKSB7XG4gICAgdmFyIHMwLCBzMSwgczIsIHMzLCBzNCwgczU7XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMTIzKSB7XG4gICAgICBzMSA9IHBlZyRjNDtcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM1KTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gcGVnJHBhcnNlXygpO1xuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMzID0gcGVnJHBhcnNlaWQoKTtcbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDEyNSkge1xuICAgICAgICAgICAgICBzNSA9IHBlZyRjNjtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHM1ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzcpOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgIHMxID0gcGVnJGM4KHMzKTtcbiAgICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VzZWxlY3QoKSB7XG4gICAgdmFyIHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2LCBzNywgczgsIHM5LCBzMTAsIHMxMSwgczEyLCBzMTM7XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMTIzKSB7XG4gICAgICBzMSA9IHBlZyRjNDtcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM1KTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gcGVnJHBhcnNlXygpO1xuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMzID0gcGVnJHBhcnNlaWQoKTtcbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQ0KSB7XG4gICAgICAgICAgICAgIHM1ID0gcGVnJGM5O1xuICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgczUgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTApOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDYpID09PSBwZWckYzExKSB7XG4gICAgICAgICAgICAgICAgICBzNyA9IHBlZyRjMTE7XG4gICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyArPSA2O1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBzNyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTIpOyB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgczggPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICAgICAgICBpZiAoczggIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0NCkge1xuICAgICAgICAgICAgICAgICAgICAgIHM5ID0gcGVnJGM5O1xuICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgczkgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMCk7IH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoczkgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzMTAgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHMxMCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgczExID0gW107XG4gICAgICAgICAgICAgICAgICAgICAgICBzMTIgPSBwZWckcGFyc2VzZWxlY3RDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoczEyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzMTIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMTEucHVzaChzMTIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMxMiA9IHBlZyRwYXJzZXNlbGVjdENhc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgczExID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzMTEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgczEyID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoczEyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAxMjUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMxMyA9IHBlZyRjNjtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMxMyA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNyk7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMxMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMSA9IHBlZyRjMTMoczMsIHMxMSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZXBsdXJhbCgpIHtcbiAgICB2YXIgczAsIHMxLCBzMiwgczMsIHM0LCBzNSwgczYsIHM3LCBzOCwgczksIHMxMCwgczExLCBzMTIsIHMxMywgczE0O1xuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDEyMykge1xuICAgICAgczEgPSBwZWckYzQ7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNSk7IH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IHBlZyRwYXJzZV8oKTtcbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMyA9IHBlZyRwYXJzZWlkKCk7XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM0ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0NCkge1xuICAgICAgICAgICAgICBzNSA9IHBlZyRjOTtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHM1ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzEwKTsgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM2ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgICBpZiAoczYgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA2KSA9PT0gcGVnJGMxNCkge1xuICAgICAgICAgICAgICAgICAgczcgPSBwZWckYzE0O1xuICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgKz0gNjtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgczcgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzE1KTsgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoczcgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDEzKSA9PT0gcGVnJGMxNikge1xuICAgICAgICAgICAgICAgICAgICBzNyA9IHBlZyRjMTY7XG4gICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDEzO1xuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgczcgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTcpOyB9XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgczggPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICAgICAgICBpZiAoczggIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA0NCkge1xuICAgICAgICAgICAgICAgICAgICAgIHM5ID0gcGVnJGM5O1xuICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgczkgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMCk7IH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBpZiAoczkgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzMTAgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHMxMCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgczExID0gcGVnJHBhcnNlb2Zmc2V0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoczExID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHMxMSA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoczExICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHMxMiA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzMTMgPSBwZWckcGFyc2VwbHVyYWxDYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzMTMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoczEzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMTIucHVzaChzMTMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczEzID0gcGVnJHBhcnNlcGx1cmFsQ2FzZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMTIgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzMTIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMTMgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHMxMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAxMjUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczE0ID0gcGVnJGM2O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgczE0ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzcpOyB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoczE0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMSA9IHBlZyRjMTgoczMsIHM3LCBzMTEsIHMxMik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlZnVuY3Rpb24oKSB7XG4gICAgdmFyIHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2LCBzNywgczgsIHM5LCBzMTA7XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMTIzKSB7XG4gICAgICBzMSA9IHBlZyRjNDtcbiAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM1KTsgfVxuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gcGVnJHBhcnNlXygpO1xuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMzID0gcGVnJHBhcnNlaWQoKTtcbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczQgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQ0KSB7XG4gICAgICAgICAgICAgIHM1ID0gcGVnJGM5O1xuICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgczUgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTApOyB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoczUgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgczYgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHM3ID0gcGVnJHBhcnNlaWQoKTtcbiAgICAgICAgICAgICAgICBpZiAoczcgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgIHM4ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgICAgICAgaWYgKHM4ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgIHM5ID0gcGVnJHBhcnNlZnVuY3Rpb25QYXJhbXMoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHM5ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAxMjUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHMxMCA9IHBlZyRjNjtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHMxMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNyk7IH1cbiAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHMxMCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICAgICAgICBzMSA9IHBlZyRjMTkoczMsIHM3LCBzOSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZWlkKCkge1xuICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQ7XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJGN1cnJQb3M7XG4gICAgaWYgKHBlZyRjMjAudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgczIgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczIgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzIxKTsgfVxuICAgIH1cbiAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMzID0gW107XG4gICAgICBpZiAocGVnJGMyMi50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgIHM0ID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHM0ID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzIzKTsgfVxuICAgICAgfVxuICAgICAgd2hpbGUgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMzLnB1c2goczQpO1xuICAgICAgICBpZiAocGVnJGMyMi50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgICAgczQgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczQgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMyMyk7IH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyID0gW3MyLCBzM107XG4gICAgICAgIHMxID0gczI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMxO1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczE7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBpbnB1dC5zdWJzdHJpbmcoczAsIHBlZyRjdXJyUG9zKTtcbiAgICB9IGVsc2Uge1xuICAgICAgczAgPSBzMTtcbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VwYXJhbURlZmF1bHQoKSB7XG4gICAgdmFyIHMwLCBzMSwgczI7XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gW107XG4gICAgczIgPSBwZWckcGFyc2VwYXJhbWNoYXJzRGVmYXVsdCgpO1xuICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgd2hpbGUgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMxLnB1c2goczIpO1xuICAgICAgICBzMiA9IHBlZyRwYXJzZXBhcmFtY2hhcnNEZWZhdWx0KCk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgIHMxID0gcGVnJGMzKHMxKTtcbiAgICB9XG4gICAgczAgPSBzMTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZXBhcmFtU3RyaWN0KCkge1xuICAgIHZhciBzMCwgczEsIHMyO1xuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IFtdO1xuICAgIHMyID0gcGVnJHBhcnNlcGFyYW1jaGFyc1N0cmljdCgpO1xuICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgd2hpbGUgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMxLnB1c2goczIpO1xuICAgICAgICBzMiA9IHBlZyRwYXJzZXBhcmFtY2hhcnNTdHJpY3QoKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgczEgPSBwZWckYzMoczEpO1xuICAgIH1cbiAgICBzMCA9IHMxO1xuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlc2VsZWN0Q2FzZSgpIHtcbiAgICB2YXIgczAsIHMxLCBzMiwgczMsIHM0O1xuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZV8oKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMyID0gcGVnJHBhcnNlaWQoKTtcbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMyA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczQgPSBwZWckcGFyc2VjYXNlVG9rZW5zKCk7XG4gICAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgIHMxID0gcGVnJGMyNChzMiwgczQpO1xuICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VwbHVyYWxDYXNlKCkge1xuICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQ7XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gcGVnJHBhcnNlXygpO1xuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBwZWckcGFyc2VwbHVyYWxLZXkoKTtcbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMyA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgczQgPSBwZWckcGFyc2VjYXNlVG9rZW5zKCk7XG4gICAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgIHMxID0gcGVnJGMyNChzMiwgczQpO1xuICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VjYXNlVG9rZW5zKCkge1xuICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQsIHM1O1xuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDEyMykge1xuICAgICAgczEgPSBwZWckYzQ7XG4gICAgICBwZWckY3VyclBvcysrO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNSk7IH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMiA9IHBlZyRjdXJyUG9zO1xuICAgICAgczMgPSBwZWckcGFyc2VfKCk7XG4gICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczQgPSBwZWckY3VyclBvcztcbiAgICAgICAgcGVnJHNpbGVudEZhaWxzKys7XG4gICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMTIzKSB7XG4gICAgICAgICAgczUgPSBwZWckYzQ7XG4gICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzNSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzUpOyB9XG4gICAgICAgIH1cbiAgICAgICAgcGVnJHNpbGVudEZhaWxzLS07XG4gICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczQ7XG4gICAgICAgICAgczQgPSB2b2lkIDA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczQgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMzID0gW3MzLCBzNF07XG4gICAgICAgICAgczIgPSBzMztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMyO1xuICAgICAgICAgIHMyID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMjtcbiAgICAgICAgczIgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgICAgaWYgKHMyID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyID0gbnVsbDtcbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMyA9IFtdO1xuICAgICAgICBzNCA9IHBlZyRwYXJzZXRva2VuKCk7XG4gICAgICAgIHdoaWxlIChzNCAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMzLnB1c2goczQpO1xuICAgICAgICAgIHM0ID0gcGVnJHBhcnNldG9rZW4oKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzNCA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gMTI1KSB7XG4gICAgICAgICAgICAgIHM1ID0gcGVnJGM2O1xuICAgICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgczUgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNyk7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgICAgczEgPSBwZWckYzI1KHMzKTtcbiAgICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VvZmZzZXQoKSB7XG4gICAgdmFyIHMwLCBzMSwgczIsIHMzLCBzNCwgczUsIHM2LCBzNztcblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VfKCk7XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCA2KSA9PT0gcGVnJGMyNikge1xuICAgICAgICBzMiA9IHBlZyRjMjY7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDY7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMyNyk7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMyA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA1OCkge1xuICAgICAgICAgICAgczQgPSBwZWckYzI4O1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgczQgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzI5KTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHM1ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHM2ID0gcGVnJHBhcnNlZGlnaXRzKCk7XG4gICAgICAgICAgICAgIGlmIChzNiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgIHM3ID0gcGVnJHBhcnNlXygpO1xuICAgICAgICAgICAgICAgIGlmIChzNyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICAgICAgICBzMSA9IHBlZyRjMzAoczYpO1xuICAgICAgICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VwbHVyYWxLZXkoKSB7XG4gICAgdmFyIHMwLCBzMSwgczI7XG5cbiAgICBzMCA9IHBlZyRwYXJzZWlkKCk7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSA2MSkge1xuICAgICAgICBzMSA9IHBlZyRjMzE7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMzMik7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMiA9IHBlZyRwYXJzZWRpZ2l0cygpO1xuICAgICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjMzAoczIpO1xuICAgICAgICAgIHMwID0gczE7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VmdW5jdGlvblBhcmFtcygpIHtcbiAgICB2YXIgczAsIHMxLCBzMjtcblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBbXTtcbiAgICBzMiA9IHBlZyRwYXJzZWZ1bmN0aW9uUGFyYW1zRGVmYXVsdCgpO1xuICAgIHdoaWxlIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczEucHVzaChzMik7XG4gICAgICBzMiA9IHBlZyRwYXJzZWZ1bmN0aW9uUGFyYW1zRGVmYXVsdCgpO1xuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHBlZyRzYXZlZFBvcyA9IHBlZyRjdXJyUG9zO1xuICAgICAgczIgPSBwZWckYzMzKHMxKTtcbiAgICAgIGlmIChzMikge1xuICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMiA9IHZvaWQgMDtcbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzM0KHMxKTtcbiAgICAgICAgczAgPSBzMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgczEgPSBbXTtcbiAgICAgIHMyID0gcGVnJHBhcnNlZnVuY3Rpb25QYXJhbXNTdHJpY3QoKTtcbiAgICAgIHdoaWxlIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMS5wdXNoKHMyKTtcbiAgICAgICAgczIgPSBwZWckcGFyc2VmdW5jdGlvblBhcmFtc1N0cmljdCgpO1xuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHBlZyRzYXZlZFBvcyA9IHBlZyRjdXJyUG9zO1xuICAgICAgICBzMiA9IHBlZyRjMzMoczEpO1xuICAgICAgICBpZiAoczIpIHtcbiAgICAgICAgICBzMiA9IHZvaWQgMDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzM0KHMxKTtcbiAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlZnVuY3Rpb25QYXJhbXNTdHJpY3QoKSB7XG4gICAgdmFyIHMwLCBzMSwgczIsIHMzO1xuXG4gICAgczAgPSBwZWckY3VyclBvcztcbiAgICBzMSA9IHBlZyRwYXJzZV8oKTtcbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIGlmIChpbnB1dC5jaGFyQ29kZUF0KHBlZyRjdXJyUG9zKSA9PT0gNDQpIHtcbiAgICAgICAgczIgPSBwZWckYzk7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGMxMCk7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMyA9IHBlZyRwYXJzZXBhcmFtU3RyaWN0KCk7XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgIHMxID0gcGVnJGMzNChzMyk7XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgIH1cblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZWZ1bmN0aW9uUGFyYW1zRGVmYXVsdCgpIHtcbiAgICB2YXIgczAsIHMxLCBzMiwgczMsIHM0LCBzNTtcblxuICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgczEgPSBwZWckcGFyc2VfKCk7XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChwZWckY3VyclBvcykgPT09IDQ0KSB7XG4gICAgICAgIHMyID0gcGVnJGM5O1xuICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgczIgPSBwZWckRkFJTEVEO1xuICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMTApOyB9XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczMgPSBwZWckcGFyc2VfKCk7XG4gICAgICAgIGlmIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHM0ID0gcGVnJHBhcnNlcGFyYW1EZWZhdWx0KCk7XG4gICAgICAgICAgaWYgKHM0ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICBzNSA9IHBlZyRwYXJzZV8oKTtcbiAgICAgICAgICAgIGlmIChzNSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgICAgczEgPSBwZWckYzM1KHM0KTtcbiAgICAgICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2Vkb3VibGVhcG9zKCkge1xuICAgIHZhciBzMCwgczE7XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzM2KSB7XG4gICAgICBzMSA9IHBlZyRjMzY7XG4gICAgICBwZWckY3VyclBvcyArPSAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjMzcpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICBzMSA9IHBlZyRjMzgoKTtcbiAgICB9XG4gICAgczAgPSBzMTtcblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZWluYXBvcygpIHtcbiAgICB2YXIgczAsIHMxLCBzMjtcblxuICAgIHMwID0gcGVnJHBhcnNlZG91YmxlYXBvcygpO1xuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIHMxID0gW107XG4gICAgICBpZiAocGVnJGMzOS50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgIHMyID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMyID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzQwKTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHdoaWxlIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMxLnB1c2goczIpO1xuICAgICAgICAgIGlmIChwZWckYzM5LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgICAgIHMyID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMyID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM0MCk7IH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzMoczEpO1xuICAgICAgfVxuICAgICAgczAgPSBzMTtcbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VxdW90ZWRDdXJseSgpIHtcbiAgICB2YXIgczAsIHMxLCBzMiwgczM7XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzQxKSB7XG4gICAgICBzMSA9IHBlZyRjNDE7XG4gICAgICBwZWckY3VyclBvcyArPSAyO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNDIpOyB9XG4gICAgfVxuICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgczIgPSBbXTtcbiAgICAgIHMzID0gcGVnJHBhcnNlaW5hcG9zKCk7XG4gICAgICB3aGlsZSAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgczIucHVzaChzMyk7XG4gICAgICAgIHMzID0gcGVnJHBhcnNlaW5hcG9zKCk7XG4gICAgICB9XG4gICAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAzOSkge1xuICAgICAgICAgIHMzID0gcGVnJGM0MztcbiAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMzID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNDQpOyB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMzICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgczEgPSBwZWckYzQ1KHMyKTtcbiAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgfVxuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzQ2KSB7XG4gICAgICAgIHMxID0gcGVnJGM0NjtcbiAgICAgICAgcGVnJGN1cnJQb3MgKz0gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzQ3KTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMyID0gW107XG4gICAgICAgIHMzID0gcGVnJHBhcnNlaW5hcG9zKCk7XG4gICAgICAgIHdoaWxlIChzMyAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMyLnB1c2goczMpO1xuICAgICAgICAgIHMzID0gcGVnJHBhcnNlaW5hcG9zKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAzOSkge1xuICAgICAgICAgICAgczMgPSBwZWckYzQzO1xuICAgICAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgczMgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzQ0KTsgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHBlZyRzYXZlZFBvcyA9IHMwO1xuICAgICAgICAgICAgczEgPSBwZWckYzQ4KHMyKTtcbiAgICAgICAgICAgIHMwID0gczE7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBlZyRjdXJyUG9zID0gczA7XG4gICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlcXVvdGVkRnVuY3Rpb25QYXJhbXMoKSB7XG4gICAgdmFyIHMwO1xuXG4gICAgczAgPSBwZWckcGFyc2VxdW90ZWRDdXJseSgpO1xuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgaWYgKGlucHV0LmNoYXJDb2RlQXQocGVnJGN1cnJQb3MpID09PSAzOSkge1xuICAgICAgICBzMCA9IHBlZyRjNDM7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMCA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM0NCk7IH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VjaGFyKCkge1xuICAgIHZhciBzMCwgczEsIHMyLCBzMywgczQsIHM1O1xuXG4gICAgaWYgKHBlZyRjNDkudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgczAgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzUwKTsgfVxuICAgIH1cbiAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGM1MSkge1xuICAgICAgICBzMSA9IHBlZyRjNTE7XG4gICAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM1Mik7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzUzKCk7XG4gICAgICB9XG4gICAgICBzMCA9IHMxO1xuICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzU0KSB7XG4gICAgICAgICAgczEgPSBwZWckYzU0O1xuICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM1NSk7IH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICBzMSA9IHBlZyRjNTYoKTtcbiAgICAgICAgfVxuICAgICAgICBzMCA9IHMxO1xuICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzU3KSB7XG4gICAgICAgICAgICBzMSA9IHBlZyRjNTc7XG4gICAgICAgICAgICBwZWckY3VyclBvcyArPSAyO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNTgpOyB9XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgICAgICBzMSA9IHBlZyRjNTkoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgczAgPSBzMTtcbiAgICAgICAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgICAgICBpZiAoaW5wdXQuc3Vic3RyKHBlZyRjdXJyUG9zLCAyKSA9PT0gcGVnJGM2MCkge1xuICAgICAgICAgICAgICBzMSA9IHBlZyRjNjA7XG4gICAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM2MSk7IH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgICAgczEgPSBwZWckYzYyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICAgICAgICAgIGlmIChpbnB1dC5zdWJzdHIocGVnJGN1cnJQb3MsIDIpID09PSBwZWckYzYzKSB7XG4gICAgICAgICAgICAgICAgczEgPSBwZWckYzYzO1xuICAgICAgICAgICAgICAgIHBlZyRjdXJyUG9zICs9IDI7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM2NCk7IH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICBzMiA9IHBlZyRwYXJzZWhleERpZ2l0KCk7XG4gICAgICAgICAgICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICBzMyA9IHBlZyRwYXJzZWhleERpZ2l0KCk7XG4gICAgICAgICAgICAgICAgICBpZiAoczMgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgczQgPSBwZWckcGFyc2VoZXhEaWdpdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoczQgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICAgICAgICAgICAgICBzNSA9IHBlZyRwYXJzZWhleERpZ2l0KCk7XG4gICAgICAgICAgICAgICAgICAgICAgaWYgKHM1ICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIHMxID0gcGVnJGM2NShzMiwgczMsIHM0LCBzNSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBzMCA9IHMxO1xuICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcGVnJGN1cnJQb3MgPSBzMDtcbiAgICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBwZWckY3VyclBvcyA9IHMwO1xuICAgICAgICAgICAgICAgIHMwID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZXBhcmFtY2hhcnNDb21tb24oKSB7XG4gICAgdmFyIHMwO1xuXG4gICAgczAgPSBwZWckcGFyc2Vkb3VibGVhcG9zKCk7XG4gICAgaWYgKHMwID09PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IHBlZyRwYXJzZXF1b3RlZEZ1bmN0aW9uUGFyYW1zKCk7XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlcGFyYW1jaGFyc0RlZmF1bHQoKSB7XG4gICAgdmFyIHMwLCBzMSwgczI7XG5cbiAgICBzMCA9IHBlZyRwYXJzZXBhcmFtY2hhcnNDb21tb24oKTtcbiAgICBpZiAoczAgPT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMwID0gcGVnJGN1cnJQb3M7XG4gICAgICBzMSA9IFtdO1xuICAgICAgaWYgKHBlZyRjNjYudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgICBzMiA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM2Nyk7IH1cbiAgICAgIH1cbiAgICAgIGlmIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICB3aGlsZSAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgICBzMS5wdXNoKHMyKTtcbiAgICAgICAgICBpZiAocGVnJGM2Ni50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgICAgICBzMiA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNjcpOyB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMSA9IHBlZyRGQUlMRUQ7XG4gICAgICB9XG4gICAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgICAgcGVnJHNhdmVkUG9zID0gczA7XG4gICAgICAgIHMxID0gcGVnJGMzKHMxKTtcbiAgICAgIH1cbiAgICAgIHMwID0gczE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlcGFyYW1jaGFyc1N0cmljdCgpIHtcbiAgICB2YXIgczAsIHMxLCBzMjtcblxuICAgIHMwID0gcGVnJHBhcnNlcGFyYW1jaGFyc0NvbW1vbigpO1xuICAgIGlmIChzMCA9PT0gcGVnJEZBSUxFRCkge1xuICAgICAgczAgPSBwZWckY3VyclBvcztcbiAgICAgIHMxID0gW107XG4gICAgICBpZiAocGVnJGM2OC50ZXN0KGlucHV0LmNoYXJBdChwZWckY3VyclBvcykpKSB7XG4gICAgICAgIHMyID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMyID0gcGVnJEZBSUxFRDtcbiAgICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzY5KTsgfVxuICAgICAgfVxuICAgICAgaWYgKHMyICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICAgIHdoaWxlIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICAgIHMxLnB1c2goczIpO1xuICAgICAgICAgIGlmIChwZWckYzY4LnRlc3QoaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKSkpIHtcbiAgICAgICAgICAgIHMyID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHMyID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM2OSk7IH1cbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHMxID0gcGVnJEZBSUxFRDtcbiAgICAgIH1cbiAgICAgIGlmIChzMSAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBwZWckc2F2ZWRQb3MgPSBzMDtcbiAgICAgICAgczEgPSBwZWckYzMoczEpO1xuICAgICAgfVxuICAgICAgczAgPSBzMTtcbiAgICB9XG5cbiAgICByZXR1cm4gczA7XG4gIH1cblxuICBmdW5jdGlvbiBwZWckcGFyc2VkaWdpdHMoKSB7XG4gICAgdmFyIHMwLCBzMSwgczI7XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gW107XG4gICAgaWYgKHBlZyRjNzAudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgczIgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczIgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzcxKTsgfVxuICAgIH1cbiAgICBpZiAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHdoaWxlIChzMiAhPT0gcGVnJEZBSUxFRCkge1xuICAgICAgICBzMS5wdXNoKHMyKTtcbiAgICAgICAgaWYgKHBlZyRjNzAudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgICAgIHMyID0gaW5wdXQuY2hhckF0KHBlZyRjdXJyUG9zKTtcbiAgICAgICAgICBwZWckY3VyclBvcysrO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHMyID0gcGVnJEZBSUxFRDtcbiAgICAgICAgICBpZiAocGVnJHNpbGVudEZhaWxzID09PSAwKSB7IHBlZyRmYWlsKHBlZyRjNzEpOyB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgczEgPSBwZWckRkFJTEVEO1xuICAgIH1cbiAgICBpZiAoczEgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMwID0gaW5wdXQuc3Vic3RyaW5nKHMwLCBwZWckY3VyclBvcyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHMwID0gczE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHMwO1xuICB9XG5cbiAgZnVuY3Rpb24gcGVnJHBhcnNlaGV4RGlnaXQoKSB7XG4gICAgdmFyIHMwO1xuXG4gICAgaWYgKHBlZyRjNzIudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgczAgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczAgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzczKTsgfVxuICAgIH1cblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIGZ1bmN0aW9uIHBlZyRwYXJzZV8oKSB7XG4gICAgdmFyIHMwLCBzMSwgczI7XG5cbiAgICBzMCA9IHBlZyRjdXJyUG9zO1xuICAgIHMxID0gW107XG4gICAgaWYgKHBlZyRjNzQudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgczIgPSBpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpO1xuICAgICAgcGVnJGN1cnJQb3MrKztcbiAgICB9IGVsc2Uge1xuICAgICAgczIgPSBwZWckRkFJTEVEO1xuICAgICAgaWYgKHBlZyRzaWxlbnRGYWlscyA9PT0gMCkgeyBwZWckZmFpbChwZWckYzc1KTsgfVxuICAgIH1cbiAgICB3aGlsZSAoczIgIT09IHBlZyRGQUlMRUQpIHtcbiAgICAgIHMxLnB1c2goczIpO1xuICAgICAgaWYgKHBlZyRjNzQudGVzdChpbnB1dC5jaGFyQXQocGVnJGN1cnJQb3MpKSkge1xuICAgICAgICBzMiA9IGlucHV0LmNoYXJBdChwZWckY3VyclBvcyk7XG4gICAgICAgIHBlZyRjdXJyUG9zKys7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzMiA9IHBlZyRGQUlMRUQ7XG4gICAgICAgIGlmIChwZWckc2lsZW50RmFpbHMgPT09IDApIHsgcGVnJGZhaWwocGVnJGM3NSk7IH1cbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKHMxICE9PSBwZWckRkFJTEVEKSB7XG4gICAgICBzMCA9IGlucHV0LnN1YnN0cmluZyhzMCwgcGVnJGN1cnJQb3MpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzMCA9IHMxO1xuICAgIH1cblxuICAgIHJldHVybiBzMDtcbiAgfVxuXG4gIHBlZyRyZXN1bHQgPSBwZWckc3RhcnRSdWxlRnVuY3Rpb24oKTtcblxuICBpZiAocGVnJHJlc3VsdCAhPT0gcGVnJEZBSUxFRCAmJiBwZWckY3VyclBvcyA9PT0gaW5wdXQubGVuZ3RoKSB7XG4gICAgcmV0dXJuIHBlZyRyZXN1bHQ7XG4gIH0gZWxzZSB7XG4gICAgaWYgKHBlZyRyZXN1bHQgIT09IHBlZyRGQUlMRUQgJiYgcGVnJGN1cnJQb3MgPCBpbnB1dC5sZW5ndGgpIHtcbiAgICAgIHBlZyRmYWlsKHBlZyRlbmRFeHBlY3RhdGlvbigpKTtcbiAgICB9XG5cbiAgICB0aHJvdyBwZWckYnVpbGRTdHJ1Y3R1cmVkRXJyb3IoXG4gICAgICBwZWckbWF4RmFpbEV4cGVjdGVkLFxuICAgICAgcGVnJG1heEZhaWxQb3MgPCBpbnB1dC5sZW5ndGggPyBpbnB1dC5jaGFyQXQocGVnJG1heEZhaWxQb3MpIDogbnVsbCxcbiAgICAgIHBlZyRtYXhGYWlsUG9zIDwgaW5wdXQubGVuZ3RoXG4gICAgICAgID8gcGVnJGNvbXB1dGVMb2NhdGlvbihwZWckbWF4RmFpbFBvcywgcGVnJG1heEZhaWxQb3MgKyAxKVxuICAgICAgICA6IHBlZyRjb21wdXRlTG9jYXRpb24ocGVnJG1heEZhaWxQb3MsIHBlZyRtYXhGYWlsUG9zKVxuICAgICk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIFN5bnRheEVycm9yOiBwZWckU3ludGF4RXJyb3IsXG4gIHBhcnNlOiAgICAgICBwZWckcGFyc2Vcbn07XG4iLCIvKlxub2JqZWN0LWFzc2lnblxuKGMpIFNpbmRyZSBTb3JodXNcbkBsaWNlbnNlIE1JVFxuKi9cblxuJ3VzZSBzdHJpY3QnO1xuLyogZXNsaW50LWRpc2FibGUgbm8tdW51c2VkLXZhcnMgKi9cbnZhciBnZXRPd25Qcm9wZXJ0eVN5bWJvbHMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xudmFyIGhhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBwcm9wSXNFbnVtZXJhYmxlID0gT2JqZWN0LnByb3RvdHlwZS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcblxuZnVuY3Rpb24gdG9PYmplY3QodmFsKSB7XG5cdGlmICh2YWwgPT09IG51bGwgfHwgdmFsID09PSB1bmRlZmluZWQpIHtcblx0XHR0aHJvdyBuZXcgVHlwZUVycm9yKCdPYmplY3QuYXNzaWduIGNhbm5vdCBiZSBjYWxsZWQgd2l0aCBudWxsIG9yIHVuZGVmaW5lZCcpO1xuXHR9XG5cblx0cmV0dXJuIE9iamVjdCh2YWwpO1xufVxuXG5mdW5jdGlvbiBzaG91bGRVc2VOYXRpdmUoKSB7XG5cdHRyeSB7XG5cdFx0aWYgKCFPYmplY3QuYXNzaWduKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZWN0IGJ1Z2d5IHByb3BlcnR5IGVudW1lcmF0aW9uIG9yZGVyIGluIG9sZGVyIFY4IHZlcnNpb25zLlxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9NDExOFxuXHRcdHZhciB0ZXN0MSA9IG5ldyBTdHJpbmcoJ2FiYycpOyAgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXctd3JhcHBlcnNcblx0XHR0ZXN0MVs1XSA9ICdkZSc7XG5cdFx0aWYgKE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRlc3QxKVswXSA9PT0gJzUnKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gaHR0cHM6Ly9idWdzLmNocm9taXVtLm9yZy9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzA1NlxuXHRcdHZhciB0ZXN0MiA9IHt9O1xuXHRcdGZvciAodmFyIGkgPSAwOyBpIDwgMTA7IGkrKykge1xuXHRcdFx0dGVzdDJbJ18nICsgU3RyaW5nLmZyb21DaGFyQ29kZShpKV0gPSBpO1xuXHRcdH1cblx0XHR2YXIgb3JkZXIyID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGVzdDIpLm1hcChmdW5jdGlvbiAobikge1xuXHRcdFx0cmV0dXJuIHRlc3QyW25dO1xuXHRcdH0pO1xuXHRcdGlmIChvcmRlcjIuam9pbignJykgIT09ICcwMTIzNDU2Nzg5Jykge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTMwNTZcblx0XHR2YXIgdGVzdDMgPSB7fTtcblx0XHQnYWJjZGVmZ2hpamtsbW5vcHFyc3QnLnNwbGl0KCcnKS5mb3JFYWNoKGZ1bmN0aW9uIChsZXR0ZXIpIHtcblx0XHRcdHRlc3QzW2xldHRlcl0gPSBsZXR0ZXI7XG5cdFx0fSk7XG5cdFx0aWYgKE9iamVjdC5rZXlzKE9iamVjdC5hc3NpZ24oe30sIHRlc3QzKSkuam9pbignJykgIT09XG5cdFx0XHRcdCdhYmNkZWZnaGlqa2xtbm9wcXJzdCcpIHtcblx0XHRcdHJldHVybiBmYWxzZTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSBjYXRjaCAoZXJyKSB7XG5cdFx0Ly8gV2UgZG9uJ3QgZXhwZWN0IGFueSBvZiB0aGUgYWJvdmUgdG8gdGhyb3csIGJ1dCBiZXR0ZXIgdG8gYmUgc2FmZS5cblx0XHRyZXR1cm4gZmFsc2U7XG5cdH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBzaG91bGRVc2VOYXRpdmUoKSA/IE9iamVjdC5hc3NpZ24gOiBmdW5jdGlvbiAodGFyZ2V0LCBzb3VyY2UpIHtcblx0dmFyIGZyb207XG5cdHZhciB0byA9IHRvT2JqZWN0KHRhcmdldCk7XG5cdHZhciBzeW1ib2xzO1xuXG5cdGZvciAodmFyIHMgPSAxOyBzIDwgYXJndW1lbnRzLmxlbmd0aDsgcysrKSB7XG5cdFx0ZnJvbSA9IE9iamVjdChhcmd1bWVudHNbc10pO1xuXG5cdFx0Zm9yICh2YXIga2V5IGluIGZyb20pIHtcblx0XHRcdGlmIChoYXNPd25Qcm9wZXJ0eS5jYWxsKGZyb20sIGtleSkpIHtcblx0XHRcdFx0dG9ba2V5XSA9IGZyb21ba2V5XTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoZ2V0T3duUHJvcGVydHlTeW1ib2xzKSB7XG5cdFx0XHRzeW1ib2xzID0gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGZyb20pO1xuXHRcdFx0Zm9yICh2YXIgaSA9IDA7IGkgPCBzeW1ib2xzLmxlbmd0aDsgaSsrKSB7XG5cdFx0XHRcdGlmIChwcm9wSXNFbnVtZXJhYmxlLmNhbGwoZnJvbSwgc3ltYm9sc1tpXSkpIHtcblx0XHRcdFx0XHR0b1tzeW1ib2xzW2ldXSA9IGZyb21bc3ltYm9sc1tpXV07XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gdG87XG59O1xuIiwiLy8gJ3BhdGgnIG1vZHVsZSBleHRyYWN0ZWQgZnJvbSBOb2RlLmpzIHY4LjExLjEgKG9ubHkgdGhlIHBvc2l4IHBhcnQpXG4vLyB0cmFuc3BsaXRlZCB3aXRoIEJhYmVsXG5cbi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIGFzc2VydFBhdGgocGF0aCkge1xuICBpZiAodHlwZW9mIHBhdGggIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignUGF0aCBtdXN0IGJlIGEgc3RyaW5nLiBSZWNlaXZlZCAnICsgSlNPTi5zdHJpbmdpZnkocGF0aCkpO1xuICB9XG59XG5cbi8vIFJlc29sdmVzIC4gYW5kIC4uIGVsZW1lbnRzIGluIGEgcGF0aCB3aXRoIGRpcmVjdG9yeSBuYW1lc1xuZnVuY3Rpb24gbm9ybWFsaXplU3RyaW5nUG9zaXgocGF0aCwgYWxsb3dBYm92ZVJvb3QpIHtcbiAgdmFyIHJlcyA9ICcnO1xuICB2YXIgbGFzdFNlZ21lbnRMZW5ndGggPSAwO1xuICB2YXIgbGFzdFNsYXNoID0gLTE7XG4gIHZhciBkb3RzID0gMDtcbiAgdmFyIGNvZGU7XG4gIGZvciAodmFyIGkgPSAwOyBpIDw9IHBhdGgubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoaSA8IHBhdGgubGVuZ3RoKVxuICAgICAgY29kZSA9IHBhdGguY2hhckNvZGVBdChpKTtcbiAgICBlbHNlIGlmIChjb2RlID09PSA0NyAvKi8qLylcbiAgICAgIGJyZWFrO1xuICAgIGVsc2VcbiAgICAgIGNvZGUgPSA0NyAvKi8qLztcbiAgICBpZiAoY29kZSA9PT0gNDcgLyovKi8pIHtcbiAgICAgIGlmIChsYXN0U2xhc2ggPT09IGkgLSAxIHx8IGRvdHMgPT09IDEpIHtcbiAgICAgICAgLy8gTk9PUFxuICAgICAgfSBlbHNlIGlmIChsYXN0U2xhc2ggIT09IGkgLSAxICYmIGRvdHMgPT09IDIpIHtcbiAgICAgICAgaWYgKHJlcy5sZW5ndGggPCAyIHx8IGxhc3RTZWdtZW50TGVuZ3RoICE9PSAyIHx8IHJlcy5jaGFyQ29kZUF0KHJlcy5sZW5ndGggLSAxKSAhPT0gNDYgLyouKi8gfHwgcmVzLmNoYXJDb2RlQXQocmVzLmxlbmd0aCAtIDIpICE9PSA0NiAvKi4qLykge1xuICAgICAgICAgIGlmIChyZXMubGVuZ3RoID4gMikge1xuICAgICAgICAgICAgdmFyIGxhc3RTbGFzaEluZGV4ID0gcmVzLmxhc3RJbmRleE9mKCcvJyk7XG4gICAgICAgICAgICBpZiAobGFzdFNsYXNoSW5kZXggIT09IHJlcy5sZW5ndGggLSAxKSB7XG4gICAgICAgICAgICAgIGlmIChsYXN0U2xhc2hJbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICByZXMgPSAnJztcbiAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IDA7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVzID0gcmVzLnNsaWNlKDAsIGxhc3RTbGFzaEluZGV4KTtcbiAgICAgICAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IHJlcy5sZW5ndGggLSAxIC0gcmVzLmxhc3RJbmRleE9mKCcvJyk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgbGFzdFNsYXNoID0gaTtcbiAgICAgICAgICAgICAgZG90cyA9IDA7XG4gICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAocmVzLmxlbmd0aCA9PT0gMiB8fCByZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICByZXMgPSAnJztcbiAgICAgICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gMDtcbiAgICAgICAgICAgIGxhc3RTbGFzaCA9IGk7XG4gICAgICAgICAgICBkb3RzID0gMDtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoYWxsb3dBYm92ZVJvb3QpIHtcbiAgICAgICAgICBpZiAocmVzLmxlbmd0aCA+IDApXG4gICAgICAgICAgICByZXMgKz0gJy8uLic7XG4gICAgICAgICAgZWxzZVxuICAgICAgICAgICAgcmVzID0gJy4uJztcbiAgICAgICAgICBsYXN0U2VnbWVudExlbmd0aCA9IDI7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChyZXMubGVuZ3RoID4gMClcbiAgICAgICAgICByZXMgKz0gJy8nICsgcGF0aC5zbGljZShsYXN0U2xhc2ggKyAxLCBpKTtcbiAgICAgICAgZWxzZVxuICAgICAgICAgIHJlcyA9IHBhdGguc2xpY2UobGFzdFNsYXNoICsgMSwgaSk7XG4gICAgICAgIGxhc3RTZWdtZW50TGVuZ3RoID0gaSAtIGxhc3RTbGFzaCAtIDE7XG4gICAgICB9XG4gICAgICBsYXN0U2xhc2ggPSBpO1xuICAgICAgZG90cyA9IDA7XG4gICAgfSBlbHNlIGlmIChjb2RlID09PSA0NiAvKi4qLyAmJiBkb3RzICE9PSAtMSkge1xuICAgICAgKytkb3RzO1xuICAgIH0gZWxzZSB7XG4gICAgICBkb3RzID0gLTE7XG4gICAgfVxuICB9XG4gIHJldHVybiByZXM7XG59XG5cbmZ1bmN0aW9uIF9mb3JtYXQoc2VwLCBwYXRoT2JqZWN0KSB7XG4gIHZhciBkaXIgPSBwYXRoT2JqZWN0LmRpciB8fCBwYXRoT2JqZWN0LnJvb3Q7XG4gIHZhciBiYXNlID0gcGF0aE9iamVjdC5iYXNlIHx8IChwYXRoT2JqZWN0Lm5hbWUgfHwgJycpICsgKHBhdGhPYmplY3QuZXh0IHx8ICcnKTtcbiAgaWYgKCFkaXIpIHtcbiAgICByZXR1cm4gYmFzZTtcbiAgfVxuICBpZiAoZGlyID09PSBwYXRoT2JqZWN0LnJvb3QpIHtcbiAgICByZXR1cm4gZGlyICsgYmFzZTtcbiAgfVxuICByZXR1cm4gZGlyICsgc2VwICsgYmFzZTtcbn1cblxudmFyIHBvc2l4ID0ge1xuICAvLyBwYXRoLnJlc29sdmUoW2Zyb20gLi4uXSwgdG8pXG4gIHJlc29sdmU6IGZ1bmN0aW9uIHJlc29sdmUoKSB7XG4gICAgdmFyIHJlc29sdmVkUGF0aCA9ICcnO1xuICAgIHZhciByZXNvbHZlZEFic29sdXRlID0gZmFsc2U7XG4gICAgdmFyIGN3ZDtcblxuICAgIGZvciAodmFyIGkgPSBhcmd1bWVudHMubGVuZ3RoIC0gMTsgaSA+PSAtMSAmJiAhcmVzb2x2ZWRBYnNvbHV0ZTsgaS0tKSB7XG4gICAgICB2YXIgcGF0aDtcbiAgICAgIGlmIChpID49IDApXG4gICAgICAgIHBhdGggPSBhcmd1bWVudHNbaV07XG4gICAgICBlbHNlIHtcbiAgICAgICAgaWYgKGN3ZCA9PT0gdW5kZWZpbmVkKVxuICAgICAgICAgIGN3ZCA9IHByb2Nlc3MuY3dkKCk7XG4gICAgICAgIHBhdGggPSBjd2Q7XG4gICAgICB9XG5cbiAgICAgIGFzc2VydFBhdGgocGF0aCk7XG5cbiAgICAgIC8vIFNraXAgZW1wdHkgZW50cmllc1xuICAgICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIGNvbnRpbnVlO1xuICAgICAgfVxuXG4gICAgICByZXNvbHZlZFBhdGggPSBwYXRoICsgJy8nICsgcmVzb2x2ZWRQYXRoO1xuICAgICAgcmVzb2x2ZWRBYnNvbHV0ZSA9IHBhdGguY2hhckNvZGVBdCgwKSA9PT0gNDcgLyovKi87XG4gICAgfVxuXG4gICAgLy8gQXQgdGhpcyBwb2ludCB0aGUgcGF0aCBzaG91bGQgYmUgcmVzb2x2ZWQgdG8gYSBmdWxsIGFic29sdXRlIHBhdGgsIGJ1dFxuICAgIC8vIGhhbmRsZSByZWxhdGl2ZSBwYXRocyB0byBiZSBzYWZlIChtaWdodCBoYXBwZW4gd2hlbiBwcm9jZXNzLmN3ZCgpIGZhaWxzKVxuXG4gICAgLy8gTm9ybWFsaXplIHRoZSBwYXRoXG4gICAgcmVzb2x2ZWRQYXRoID0gbm9ybWFsaXplU3RyaW5nUG9zaXgocmVzb2x2ZWRQYXRoLCAhcmVzb2x2ZWRBYnNvbHV0ZSk7XG5cbiAgICBpZiAocmVzb2x2ZWRBYnNvbHV0ZSkge1xuICAgICAgaWYgKHJlc29sdmVkUGF0aC5sZW5ndGggPiAwKVxuICAgICAgICByZXR1cm4gJy8nICsgcmVzb2x2ZWRQYXRoO1xuICAgICAgZWxzZVxuICAgICAgICByZXR1cm4gJy8nO1xuICAgIH0gZWxzZSBpZiAocmVzb2x2ZWRQYXRoLmxlbmd0aCA+IDApIHtcbiAgICAgIHJldHVybiByZXNvbHZlZFBhdGg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiAnLic7XG4gICAgfVxuICB9LFxuXG4gIG5vcm1hbGl6ZTogZnVuY3Rpb24gbm9ybWFsaXplKHBhdGgpIHtcbiAgICBhc3NlcnRQYXRoKHBhdGgpO1xuXG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSByZXR1cm4gJy4nO1xuXG4gICAgdmFyIGlzQWJzb2x1dGUgPSBwYXRoLmNoYXJDb2RlQXQoMCkgPT09IDQ3IC8qLyovO1xuICAgIHZhciB0cmFpbGluZ1NlcGFyYXRvciA9IHBhdGguY2hhckNvZGVBdChwYXRoLmxlbmd0aCAtIDEpID09PSA0NyAvKi8qLztcblxuICAgIC8vIE5vcm1hbGl6ZSB0aGUgcGF0aFxuICAgIHBhdGggPSBub3JtYWxpemVTdHJpbmdQb3NpeChwYXRoLCAhaXNBYnNvbHV0ZSk7XG5cbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDAgJiYgIWlzQWJzb2x1dGUpIHBhdGggPSAnLic7XG4gICAgaWYgKHBhdGgubGVuZ3RoID4gMCAmJiB0cmFpbGluZ1NlcGFyYXRvcikgcGF0aCArPSAnLyc7XG5cbiAgICBpZiAoaXNBYnNvbHV0ZSkgcmV0dXJuICcvJyArIHBhdGg7XG4gICAgcmV0dXJuIHBhdGg7XG4gIH0sXG5cbiAgaXNBYnNvbHV0ZTogZnVuY3Rpb24gaXNBYnNvbHV0ZShwYXRoKSB7XG4gICAgYXNzZXJ0UGF0aChwYXRoKTtcbiAgICByZXR1cm4gcGF0aC5sZW5ndGggPiAwICYmIHBhdGguY2hhckNvZGVBdCgwKSA9PT0gNDcgLyovKi87XG4gIH0sXG5cbiAgam9pbjogZnVuY3Rpb24gam9pbigpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHJldHVybiAnLic7XG4gICAgdmFyIGpvaW5lZDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgdmFyIGFyZyA9IGFyZ3VtZW50c1tpXTtcbiAgICAgIGFzc2VydFBhdGgoYXJnKTtcbiAgICAgIGlmIChhcmcubGVuZ3RoID4gMCkge1xuICAgICAgICBpZiAoam9pbmVkID09PSB1bmRlZmluZWQpXG4gICAgICAgICAgam9pbmVkID0gYXJnO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgam9pbmVkICs9ICcvJyArIGFyZztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGpvaW5lZCA9PT0gdW5kZWZpbmVkKVxuICAgICAgcmV0dXJuICcuJztcbiAgICByZXR1cm4gcG9zaXgubm9ybWFsaXplKGpvaW5lZCk7XG4gIH0sXG5cbiAgcmVsYXRpdmU6IGZ1bmN0aW9uIHJlbGF0aXZlKGZyb20sIHRvKSB7XG4gICAgYXNzZXJ0UGF0aChmcm9tKTtcbiAgICBhc3NlcnRQYXRoKHRvKTtcblxuICAgIGlmIChmcm9tID09PSB0bykgcmV0dXJuICcnO1xuXG4gICAgZnJvbSA9IHBvc2l4LnJlc29sdmUoZnJvbSk7XG4gICAgdG8gPSBwb3NpeC5yZXNvbHZlKHRvKTtcblxuICAgIGlmIChmcm9tID09PSB0bykgcmV0dXJuICcnO1xuXG4gICAgLy8gVHJpbSBhbnkgbGVhZGluZyBiYWNrc2xhc2hlc1xuICAgIHZhciBmcm9tU3RhcnQgPSAxO1xuICAgIGZvciAoOyBmcm9tU3RhcnQgPCBmcm9tLmxlbmd0aDsgKytmcm9tU3RhcnQpIHtcbiAgICAgIGlmIChmcm9tLmNoYXJDb2RlQXQoZnJvbVN0YXJ0KSAhPT0gNDcgLyovKi8pXG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICB2YXIgZnJvbUVuZCA9IGZyb20ubGVuZ3RoO1xuICAgIHZhciBmcm9tTGVuID0gZnJvbUVuZCAtIGZyb21TdGFydDtcblxuICAgIC8vIFRyaW0gYW55IGxlYWRpbmcgYmFja3NsYXNoZXNcbiAgICB2YXIgdG9TdGFydCA9IDE7XG4gICAgZm9yICg7IHRvU3RhcnQgPCB0by5sZW5ndGg7ICsrdG9TdGFydCkge1xuICAgICAgaWYgKHRvLmNoYXJDb2RlQXQodG9TdGFydCkgIT09IDQ3IC8qLyovKVxuICAgICAgICBicmVhaztcbiAgICB9XG4gICAgdmFyIHRvRW5kID0gdG8ubGVuZ3RoO1xuICAgIHZhciB0b0xlbiA9IHRvRW5kIC0gdG9TdGFydDtcblxuICAgIC8vIENvbXBhcmUgcGF0aHMgdG8gZmluZCB0aGUgbG9uZ2VzdCBjb21tb24gcGF0aCBmcm9tIHJvb3RcbiAgICB2YXIgbGVuZ3RoID0gZnJvbUxlbiA8IHRvTGVuID8gZnJvbUxlbiA6IHRvTGVuO1xuICAgIHZhciBsYXN0Q29tbW9uU2VwID0gLTE7XG4gICAgdmFyIGkgPSAwO1xuICAgIGZvciAoOyBpIDw9IGxlbmd0aDsgKytpKSB7XG4gICAgICBpZiAoaSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgIGlmICh0b0xlbiA+IGxlbmd0aCkge1xuICAgICAgICAgIGlmICh0by5jaGFyQ29kZUF0KHRvU3RhcnQgKyBpKSA9PT0gNDcgLyovKi8pIHtcbiAgICAgICAgICAgIC8vIFdlIGdldCBoZXJlIGlmIGBmcm9tYCBpcyB0aGUgZXhhY3QgYmFzZSBwYXRoIGZvciBgdG9gLlxuICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGU6IGZyb209Jy9mb28vYmFyJzsgdG89Jy9mb28vYmFyL2JheidcbiAgICAgICAgICAgIHJldHVybiB0by5zbGljZSh0b1N0YXJ0ICsgaSArIDEpO1xuICAgICAgICAgIH0gZWxzZSBpZiAoaSA9PT0gMCkge1xuICAgICAgICAgICAgLy8gV2UgZ2V0IGhlcmUgaWYgYGZyb21gIGlzIHRoZSByb290XG4gICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogZnJvbT0nLyc7IHRvPScvZm9vJ1xuICAgICAgICAgICAgcmV0dXJuIHRvLnNsaWNlKHRvU3RhcnQgKyBpKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZnJvbUxlbiA+IGxlbmd0aCkge1xuICAgICAgICAgIGlmIChmcm9tLmNoYXJDb2RlQXQoZnJvbVN0YXJ0ICsgaSkgPT09IDQ3IC8qLyovKSB7XG4gICAgICAgICAgICAvLyBXZSBnZXQgaGVyZSBpZiBgdG9gIGlzIHRoZSBleGFjdCBiYXNlIHBhdGggZm9yIGBmcm9tYC5cbiAgICAgICAgICAgIC8vIEZvciBleGFtcGxlOiBmcm9tPScvZm9vL2Jhci9iYXonOyB0bz0nL2Zvby9iYXInXG4gICAgICAgICAgICBsYXN0Q29tbW9uU2VwID0gaTtcbiAgICAgICAgICB9IGVsc2UgaWYgKGkgPT09IDApIHtcbiAgICAgICAgICAgIC8vIFdlIGdldCBoZXJlIGlmIGB0b2AgaXMgdGhlIHJvb3QuXG4gICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogZnJvbT0nL2Zvbyc7IHRvPScvJ1xuICAgICAgICAgICAgbGFzdENvbW1vblNlcCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgdmFyIGZyb21Db2RlID0gZnJvbS5jaGFyQ29kZUF0KGZyb21TdGFydCArIGkpO1xuICAgICAgdmFyIHRvQ29kZSA9IHRvLmNoYXJDb2RlQXQodG9TdGFydCArIGkpO1xuICAgICAgaWYgKGZyb21Db2RlICE9PSB0b0NvZGUpXG4gICAgICAgIGJyZWFrO1xuICAgICAgZWxzZSBpZiAoZnJvbUNvZGUgPT09IDQ3IC8qLyovKVxuICAgICAgICBsYXN0Q29tbW9uU2VwID0gaTtcbiAgICB9XG5cbiAgICB2YXIgb3V0ID0gJyc7XG4gICAgLy8gR2VuZXJhdGUgdGhlIHJlbGF0aXZlIHBhdGggYmFzZWQgb24gdGhlIHBhdGggZGlmZmVyZW5jZSBiZXR3ZWVuIGB0b2BcbiAgICAvLyBhbmQgYGZyb21gXG4gICAgZm9yIChpID0gZnJvbVN0YXJ0ICsgbGFzdENvbW1vblNlcCArIDE7IGkgPD0gZnJvbUVuZDsgKytpKSB7XG4gICAgICBpZiAoaSA9PT0gZnJvbUVuZCB8fCBmcm9tLmNoYXJDb2RlQXQoaSkgPT09IDQ3IC8qLyovKSB7XG4gICAgICAgIGlmIChvdXQubGVuZ3RoID09PSAwKVxuICAgICAgICAgIG91dCArPSAnLi4nO1xuICAgICAgICBlbHNlXG4gICAgICAgICAgb3V0ICs9ICcvLi4nO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIExhc3RseSwgYXBwZW5kIHRoZSByZXN0IG9mIHRoZSBkZXN0aW5hdGlvbiAoYHRvYCkgcGF0aCB0aGF0IGNvbWVzIGFmdGVyXG4gICAgLy8gdGhlIGNvbW1vbiBwYXRoIHBhcnRzXG4gICAgaWYgKG91dC5sZW5ndGggPiAwKVxuICAgICAgcmV0dXJuIG91dCArIHRvLnNsaWNlKHRvU3RhcnQgKyBsYXN0Q29tbW9uU2VwKTtcbiAgICBlbHNlIHtcbiAgICAgIHRvU3RhcnQgKz0gbGFzdENvbW1vblNlcDtcbiAgICAgIGlmICh0by5jaGFyQ29kZUF0KHRvU3RhcnQpID09PSA0NyAvKi8qLylcbiAgICAgICAgKyt0b1N0YXJ0O1xuICAgICAgcmV0dXJuIHRvLnNsaWNlKHRvU3RhcnQpO1xuICAgIH1cbiAgfSxcblxuICBfbWFrZUxvbmc6IGZ1bmN0aW9uIF9tYWtlTG9uZyhwYXRoKSB7XG4gICAgcmV0dXJuIHBhdGg7XG4gIH0sXG5cbiAgZGlybmFtZTogZnVuY3Rpb24gZGlybmFtZShwYXRoKSB7XG4gICAgYXNzZXJ0UGF0aChwYXRoKTtcbiAgICBpZiAocGF0aC5sZW5ndGggPT09IDApIHJldHVybiAnLic7XG4gICAgdmFyIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoMCk7XG4gICAgdmFyIGhhc1Jvb3QgPSBjb2RlID09PSA0NyAvKi8qLztcbiAgICB2YXIgZW5kID0gLTE7XG4gICAgdmFyIG1hdGNoZWRTbGFzaCA9IHRydWU7XG4gICAgZm9yICh2YXIgaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAxOyAtLWkpIHtcbiAgICAgIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaSk7XG4gICAgICBpZiAoY29kZSA9PT0gNDcgLyovKi8pIHtcbiAgICAgICAgICBpZiAoIW1hdGNoZWRTbGFzaCkge1xuICAgICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3JcbiAgICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGVuZCA9PT0gLTEpIHJldHVybiBoYXNSb290ID8gJy8nIDogJy4nO1xuICAgIGlmIChoYXNSb290ICYmIGVuZCA9PT0gMSkgcmV0dXJuICcvLyc7XG4gICAgcmV0dXJuIHBhdGguc2xpY2UoMCwgZW5kKTtcbiAgfSxcblxuICBiYXNlbmFtZTogZnVuY3Rpb24gYmFzZW5hbWUocGF0aCwgZXh0KSB7XG4gICAgaWYgKGV4dCAhPT0gdW5kZWZpbmVkICYmIHR5cGVvZiBleHQgIT09ICdzdHJpbmcnKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImV4dFwiIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnKTtcbiAgICBhc3NlcnRQYXRoKHBhdGgpO1xuXG4gICAgdmFyIHN0YXJ0ID0gMDtcbiAgICB2YXIgZW5kID0gLTE7XG4gICAgdmFyIG1hdGNoZWRTbGFzaCA9IHRydWU7XG4gICAgdmFyIGk7XG5cbiAgICBpZiAoZXh0ICE9PSB1bmRlZmluZWQgJiYgZXh0Lmxlbmd0aCA+IDAgJiYgZXh0Lmxlbmd0aCA8PSBwYXRoLmxlbmd0aCkge1xuICAgICAgaWYgKGV4dC5sZW5ndGggPT09IHBhdGgubGVuZ3RoICYmIGV4dCA9PT0gcGF0aCkgcmV0dXJuICcnO1xuICAgICAgdmFyIGV4dElkeCA9IGV4dC5sZW5ndGggLSAxO1xuICAgICAgdmFyIGZpcnN0Tm9uU2xhc2hFbmQgPSAtMTtcbiAgICAgIGZvciAoaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIGlmIChjb2RlID09PSA0NyAvKi8qLykge1xuICAgICAgICAgICAgLy8gSWYgd2UgcmVhY2hlZCBhIHBhdGggc2VwYXJhdG9yIHRoYXQgd2FzIG5vdCBwYXJ0IG9mIGEgc2V0IG9mIHBhdGhcbiAgICAgICAgICAgIC8vIHNlcGFyYXRvcnMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCBzdG9wIG5vd1xuICAgICAgICAgICAgaWYgKCFtYXRjaGVkU2xhc2gpIHtcbiAgICAgICAgICAgICAgc3RhcnQgPSBpICsgMTtcbiAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBpZiAoZmlyc3ROb25TbGFzaEVuZCA9PT0gLTEpIHtcbiAgICAgICAgICAgIC8vIFdlIHNhdyB0aGUgZmlyc3Qgbm9uLXBhdGggc2VwYXJhdG9yLCByZW1lbWJlciB0aGlzIGluZGV4IGluIGNhc2VcbiAgICAgICAgICAgIC8vIHdlIG5lZWQgaXQgaWYgdGhlIGV4dGVuc2lvbiBlbmRzIHVwIG5vdCBtYXRjaGluZ1xuICAgICAgICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7XG4gICAgICAgICAgICBmaXJzdE5vblNsYXNoRW5kID0gaSArIDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChleHRJZHggPj0gMCkge1xuICAgICAgICAgICAgLy8gVHJ5IHRvIG1hdGNoIHRoZSBleHBsaWNpdCBleHRlbnNpb25cbiAgICAgICAgICAgIGlmIChjb2RlID09PSBleHQuY2hhckNvZGVBdChleHRJZHgpKSB7XG4gICAgICAgICAgICAgIGlmICgtLWV4dElkeCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBtYXRjaGVkIHRoZSBleHRlbnNpb24sIHNvIG1hcmsgdGhpcyBhcyB0aGUgZW5kIG9mIG91ciBwYXRoXG4gICAgICAgICAgICAgICAgLy8gY29tcG9uZW50XG4gICAgICAgICAgICAgICAgZW5kID0gaTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgLy8gRXh0ZW5zaW9uIGRvZXMgbm90IG1hdGNoLCBzbyBvdXIgcmVzdWx0IGlzIHRoZSBlbnRpcmUgcGF0aFxuICAgICAgICAgICAgICAvLyBjb21wb25lbnRcbiAgICAgICAgICAgICAgZXh0SWR4ID0gLTE7XG4gICAgICAgICAgICAgIGVuZCA9IGZpcnN0Tm9uU2xhc2hFbmQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChzdGFydCA9PT0gZW5kKSBlbmQgPSBmaXJzdE5vblNsYXNoRW5kO2Vsc2UgaWYgKGVuZCA9PT0gLTEpIGVuZCA9IHBhdGgubGVuZ3RoO1xuICAgICAgcmV0dXJuIHBhdGguc2xpY2Uoc3RhcnQsIGVuZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGZvciAoaSA9IHBhdGgubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgaWYgKHBhdGguY2hhckNvZGVBdChpKSA9PT0gNDcgLyovKi8pIHtcbiAgICAgICAgICAgIC8vIElmIHdlIHJlYWNoZWQgYSBwYXRoIHNlcGFyYXRvciB0aGF0IHdhcyBub3QgcGFydCBvZiBhIHNldCBvZiBwYXRoXG4gICAgICAgICAgICAvLyBzZXBhcmF0b3JzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZywgc3RvcCBub3dcbiAgICAgICAgICAgIGlmICghbWF0Y2hlZFNsYXNoKSB7XG4gICAgICAgICAgICAgIHN0YXJ0ID0gaSArIDE7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gZWxzZSBpZiAoZW5kID09PSAtMSkge1xuICAgICAgICAgIC8vIFdlIHNhdyB0aGUgZmlyc3Qgbm9uLXBhdGggc2VwYXJhdG9yLCBtYXJrIHRoaXMgYXMgdGhlIGVuZCBvZiBvdXJcbiAgICAgICAgICAvLyBwYXRoIGNvbXBvbmVudFxuICAgICAgICAgIG1hdGNoZWRTbGFzaCA9IGZhbHNlO1xuICAgICAgICAgIGVuZCA9IGkgKyAxO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIGlmIChlbmQgPT09IC0xKSByZXR1cm4gJyc7XG4gICAgICByZXR1cm4gcGF0aC5zbGljZShzdGFydCwgZW5kKTtcbiAgICB9XG4gIH0sXG5cbiAgZXh0bmFtZTogZnVuY3Rpb24gZXh0bmFtZShwYXRoKSB7XG4gICAgYXNzZXJ0UGF0aChwYXRoKTtcbiAgICB2YXIgc3RhcnREb3QgPSAtMTtcbiAgICB2YXIgc3RhcnRQYXJ0ID0gMDtcbiAgICB2YXIgZW5kID0gLTE7XG4gICAgdmFyIG1hdGNoZWRTbGFzaCA9IHRydWU7XG4gICAgLy8gVHJhY2sgdGhlIHN0YXRlIG9mIGNoYXJhY3RlcnMgKGlmIGFueSkgd2Ugc2VlIGJlZm9yZSBvdXIgZmlyc3QgZG90IGFuZFxuICAgIC8vIGFmdGVyIGFueSBwYXRoIHNlcGFyYXRvciB3ZSBmaW5kXG4gICAgdmFyIHByZURvdFN0YXRlID0gMDtcbiAgICBmb3IgKHZhciBpID0gcGF0aC5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdmFyIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaSk7XG4gICAgICBpZiAoY29kZSA9PT0gNDcgLyovKi8pIHtcbiAgICAgICAgICAvLyBJZiB3ZSByZWFjaGVkIGEgcGF0aCBzZXBhcmF0b3IgdGhhdCB3YXMgbm90IHBhcnQgb2YgYSBzZXQgb2YgcGF0aFxuICAgICAgICAgIC8vIHNlcGFyYXRvcnMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCBzdG9wIG5vd1xuICAgICAgICAgIGlmICghbWF0Y2hlZFNsYXNoKSB7XG4gICAgICAgICAgICBzdGFydFBhcnQgPSBpICsgMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3IsIG1hcmsgdGhpcyBhcyB0aGUgZW5kIG9mIG91clxuICAgICAgICAvLyBleHRlbnNpb25cbiAgICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7XG4gICAgICAgIGVuZCA9IGkgKyAxO1xuICAgICAgfVxuICAgICAgaWYgKGNvZGUgPT09IDQ2IC8qLiovKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBpcyBvdXIgZmlyc3QgZG90LCBtYXJrIGl0IGFzIHRoZSBzdGFydCBvZiBvdXIgZXh0ZW5zaW9uXG4gICAgICAgICAgaWYgKHN0YXJ0RG90ID09PSAtMSlcbiAgICAgICAgICAgIHN0YXJ0RG90ID0gaTtcbiAgICAgICAgICBlbHNlIGlmIChwcmVEb3RTdGF0ZSAhPT0gMSlcbiAgICAgICAgICAgIHByZURvdFN0YXRlID0gMTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhcnREb3QgIT09IC0xKSB7XG4gICAgICAgIC8vIFdlIHNhdyBhIG5vbi1kb3QgYW5kIG5vbi1wYXRoIHNlcGFyYXRvciBiZWZvcmUgb3VyIGRvdCwgc28gd2Ugc2hvdWxkXG4gICAgICAgIC8vIGhhdmUgYSBnb29kIGNoYW5jZSBhdCBoYXZpbmcgYSBub24tZW1wdHkgZXh0ZW5zaW9uXG4gICAgICAgIHByZURvdFN0YXRlID0gLTE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0RG90ID09PSAtMSB8fCBlbmQgPT09IC0xIHx8XG4gICAgICAgIC8vIFdlIHNhdyBhIG5vbi1kb3QgY2hhcmFjdGVyIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgZG90XG4gICAgICAgIHByZURvdFN0YXRlID09PSAwIHx8XG4gICAgICAgIC8vIFRoZSAocmlnaHQtbW9zdCkgdHJpbW1lZCBwYXRoIGNvbXBvbmVudCBpcyBleGFjdGx5ICcuLidcbiAgICAgICAgcHJlRG90U3RhdGUgPT09IDEgJiYgc3RhcnREb3QgPT09IGVuZCAtIDEgJiYgc3RhcnREb3QgPT09IHN0YXJ0UGFydCArIDEpIHtcbiAgICAgIHJldHVybiAnJztcbiAgICB9XG4gICAgcmV0dXJuIHBhdGguc2xpY2Uoc3RhcnREb3QsIGVuZCk7XG4gIH0sXG5cbiAgZm9ybWF0OiBmdW5jdGlvbiBmb3JtYXQocGF0aE9iamVjdCkge1xuICAgIGlmIChwYXRoT2JqZWN0ID09PSBudWxsIHx8IHR5cGVvZiBwYXRoT2JqZWN0ICE9PSAnb2JqZWN0Jykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVGhlIFwicGF0aE9iamVjdFwiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyArIHR5cGVvZiBwYXRoT2JqZWN0KTtcbiAgICB9XG4gICAgcmV0dXJuIF9mb3JtYXQoJy8nLCBwYXRoT2JqZWN0KTtcbiAgfSxcblxuICBwYXJzZTogZnVuY3Rpb24gcGFyc2UocGF0aCkge1xuICAgIGFzc2VydFBhdGgocGF0aCk7XG5cbiAgICB2YXIgcmV0ID0geyByb290OiAnJywgZGlyOiAnJywgYmFzZTogJycsIGV4dDogJycsIG5hbWU6ICcnIH07XG4gICAgaWYgKHBhdGgubGVuZ3RoID09PSAwKSByZXR1cm4gcmV0O1xuICAgIHZhciBjb2RlID0gcGF0aC5jaGFyQ29kZUF0KDApO1xuICAgIHZhciBpc0Fic29sdXRlID0gY29kZSA9PT0gNDcgLyovKi87XG4gICAgdmFyIHN0YXJ0O1xuICAgIGlmIChpc0Fic29sdXRlKSB7XG4gICAgICByZXQucm9vdCA9ICcvJztcbiAgICAgIHN0YXJ0ID0gMTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhcnQgPSAwO1xuICAgIH1cbiAgICB2YXIgc3RhcnREb3QgPSAtMTtcbiAgICB2YXIgc3RhcnRQYXJ0ID0gMDtcbiAgICB2YXIgZW5kID0gLTE7XG4gICAgdmFyIG1hdGNoZWRTbGFzaCA9IHRydWU7XG4gICAgdmFyIGkgPSBwYXRoLmxlbmd0aCAtIDE7XG5cbiAgICAvLyBUcmFjayB0aGUgc3RhdGUgb2YgY2hhcmFjdGVycyAoaWYgYW55KSB3ZSBzZWUgYmVmb3JlIG91ciBmaXJzdCBkb3QgYW5kXG4gICAgLy8gYWZ0ZXIgYW55IHBhdGggc2VwYXJhdG9yIHdlIGZpbmRcbiAgICB2YXIgcHJlRG90U3RhdGUgPSAwO1xuXG4gICAgLy8gR2V0IG5vbi1kaXIgaW5mb1xuICAgIGZvciAoOyBpID49IHN0YXJ0OyAtLWkpIHtcbiAgICAgIGNvZGUgPSBwYXRoLmNoYXJDb2RlQXQoaSk7XG4gICAgICBpZiAoY29kZSA9PT0gNDcgLyovKi8pIHtcbiAgICAgICAgICAvLyBJZiB3ZSByZWFjaGVkIGEgcGF0aCBzZXBhcmF0b3IgdGhhdCB3YXMgbm90IHBhcnQgb2YgYSBzZXQgb2YgcGF0aFxuICAgICAgICAgIC8vIHNlcGFyYXRvcnMgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLCBzdG9wIG5vd1xuICAgICAgICAgIGlmICghbWF0Y2hlZFNsYXNoKSB7XG4gICAgICAgICAgICBzdGFydFBhcnQgPSBpICsgMTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgaWYgKGVuZCA9PT0gLTEpIHtcbiAgICAgICAgLy8gV2Ugc2F3IHRoZSBmaXJzdCBub24tcGF0aCBzZXBhcmF0b3IsIG1hcmsgdGhpcyBhcyB0aGUgZW5kIG9mIG91clxuICAgICAgICAvLyBleHRlbnNpb25cbiAgICAgICAgbWF0Y2hlZFNsYXNoID0gZmFsc2U7XG4gICAgICAgIGVuZCA9IGkgKyAxO1xuICAgICAgfVxuICAgICAgaWYgKGNvZGUgPT09IDQ2IC8qLiovKSB7XG4gICAgICAgICAgLy8gSWYgdGhpcyBpcyBvdXIgZmlyc3QgZG90LCBtYXJrIGl0IGFzIHRoZSBzdGFydCBvZiBvdXIgZXh0ZW5zaW9uXG4gICAgICAgICAgaWYgKHN0YXJ0RG90ID09PSAtMSkgc3RhcnREb3QgPSBpO2Vsc2UgaWYgKHByZURvdFN0YXRlICE9PSAxKSBwcmVEb3RTdGF0ZSA9IDE7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhcnREb3QgIT09IC0xKSB7XG4gICAgICAgIC8vIFdlIHNhdyBhIG5vbi1kb3QgYW5kIG5vbi1wYXRoIHNlcGFyYXRvciBiZWZvcmUgb3VyIGRvdCwgc28gd2Ugc2hvdWxkXG4gICAgICAgIC8vIGhhdmUgYSBnb29kIGNoYW5jZSBhdCBoYXZpbmcgYSBub24tZW1wdHkgZXh0ZW5zaW9uXG4gICAgICAgIHByZURvdFN0YXRlID0gLTE7XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHN0YXJ0RG90ID09PSAtMSB8fCBlbmQgPT09IC0xIHx8XG4gICAgLy8gV2Ugc2F3IGEgbm9uLWRvdCBjaGFyYWN0ZXIgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBkb3RcbiAgICBwcmVEb3RTdGF0ZSA9PT0gMCB8fFxuICAgIC8vIFRoZSAocmlnaHQtbW9zdCkgdHJpbW1lZCBwYXRoIGNvbXBvbmVudCBpcyBleGFjdGx5ICcuLidcbiAgICBwcmVEb3RTdGF0ZSA9PT0gMSAmJiBzdGFydERvdCA9PT0gZW5kIC0gMSAmJiBzdGFydERvdCA9PT0gc3RhcnRQYXJ0ICsgMSkge1xuICAgICAgaWYgKGVuZCAhPT0gLTEpIHtcbiAgICAgICAgaWYgKHN0YXJ0UGFydCA9PT0gMCAmJiBpc0Fic29sdXRlKSByZXQuYmFzZSA9IHJldC5uYW1lID0gcGF0aC5zbGljZSgxLCBlbmQpO2Vsc2UgcmV0LmJhc2UgPSByZXQubmFtZSA9IHBhdGguc2xpY2Uoc3RhcnRQYXJ0LCBlbmQpO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpZiAoc3RhcnRQYXJ0ID09PSAwICYmIGlzQWJzb2x1dGUpIHtcbiAgICAgICAgcmV0Lm5hbWUgPSBwYXRoLnNsaWNlKDEsIHN0YXJ0RG90KTtcbiAgICAgICAgcmV0LmJhc2UgPSBwYXRoLnNsaWNlKDEsIGVuZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQubmFtZSA9IHBhdGguc2xpY2Uoc3RhcnRQYXJ0LCBzdGFydERvdCk7XG4gICAgICAgIHJldC5iYXNlID0gcGF0aC5zbGljZShzdGFydFBhcnQsIGVuZCk7XG4gICAgICB9XG4gICAgICByZXQuZXh0ID0gcGF0aC5zbGljZShzdGFydERvdCwgZW5kKTtcbiAgICB9XG5cbiAgICBpZiAoc3RhcnRQYXJ0ID4gMCkgcmV0LmRpciA9IHBhdGguc2xpY2UoMCwgc3RhcnRQYXJ0IC0gMSk7ZWxzZSBpZiAoaXNBYnNvbHV0ZSkgcmV0LmRpciA9ICcvJztcblxuICAgIHJldHVybiByZXQ7XG4gIH0sXG5cbiAgc2VwOiAnLycsXG4gIGRlbGltaXRlcjogJzonLFxuICB3aW4zMjogbnVsbCxcbiAgcG9zaXg6IG51bGxcbn07XG5cbnBvc2l4LnBvc2l4ID0gcG9zaXg7XG5cbm1vZHVsZS5leHBvcnRzID0gcG9zaXg7XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnByZXBlbmRPbmNlTGlzdGVuZXIgPSBub29wO1xuXG5wcm9jZXNzLmxpc3RlbmVycyA9IGZ1bmN0aW9uIChuYW1lKSB7IHJldHVybiBbXSB9XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbid1c2Ugc3RyaWN0JztcblxuLy8gSWYgb2JqLmhhc093blByb3BlcnR5IGhhcyBiZWVuIG92ZXJyaWRkZW4sIHRoZW4gY2FsbGluZ1xuLy8gb2JqLmhhc093blByb3BlcnR5KHByb3ApIHdpbGwgYnJlYWsuXG4vLyBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9qb3llbnQvbm9kZS9pc3N1ZXMvMTcwN1xuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihxcywgc2VwLCBlcSwgb3B0aW9ucykge1xuICBzZXAgPSBzZXAgfHwgJyYnO1xuICBlcSA9IGVxIHx8ICc9JztcbiAgdmFyIG9iaiA9IHt9O1xuXG4gIGlmICh0eXBlb2YgcXMgIT09ICdzdHJpbmcnIHx8IHFzLmxlbmd0aCA9PT0gMCkge1xuICAgIHJldHVybiBvYmo7XG4gIH1cblxuICB2YXIgcmVnZXhwID0gL1xcKy9nO1xuICBxcyA9IHFzLnNwbGl0KHNlcCk7XG5cbiAgdmFyIG1heEtleXMgPSAxMDAwO1xuICBpZiAob3B0aW9ucyAmJiB0eXBlb2Ygb3B0aW9ucy5tYXhLZXlzID09PSAnbnVtYmVyJykge1xuICAgIG1heEtleXMgPSBvcHRpb25zLm1heEtleXM7XG4gIH1cblxuICB2YXIgbGVuID0gcXMubGVuZ3RoO1xuICAvLyBtYXhLZXlzIDw9IDAgbWVhbnMgdGhhdCB3ZSBzaG91bGQgbm90IGxpbWl0IGtleXMgY291bnRcbiAgaWYgKG1heEtleXMgPiAwICYmIGxlbiA+IG1heEtleXMpIHtcbiAgICBsZW4gPSBtYXhLZXlzO1xuICB9XG5cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47ICsraSkge1xuICAgIHZhciB4ID0gcXNbaV0ucmVwbGFjZShyZWdleHAsICclMjAnKSxcbiAgICAgICAgaWR4ID0geC5pbmRleE9mKGVxKSxcbiAgICAgICAga3N0ciwgdnN0ciwgaywgdjtcblxuICAgIGlmIChpZHggPj0gMCkge1xuICAgICAga3N0ciA9IHguc3Vic3RyKDAsIGlkeCk7XG4gICAgICB2c3RyID0geC5zdWJzdHIoaWR4ICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGtzdHIgPSB4O1xuICAgICAgdnN0ciA9ICcnO1xuICAgIH1cblxuICAgIGsgPSBkZWNvZGVVUklDb21wb25lbnQoa3N0cik7XG4gICAgdiA9IGRlY29kZVVSSUNvbXBvbmVudCh2c3RyKTtcblxuICAgIGlmICghaGFzT3duUHJvcGVydHkob2JqLCBrKSkge1xuICAgICAgb2JqW2tdID0gdjtcbiAgICB9IGVsc2UgaWYgKGlzQXJyYXkob2JqW2tdKSkge1xuICAgICAgb2JqW2tdLnB1c2godik7XG4gICAgfSBlbHNlIHtcbiAgICAgIG9ialtrXSA9IFtvYmpba10sIHZdO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBvYmo7XG59O1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKHhzKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeHMpID09PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4ndXNlIHN0cmljdCc7XG5cbnZhciBzdHJpbmdpZnlQcmltaXRpdmUgPSBmdW5jdGlvbih2KSB7XG4gIHN3aXRjaCAodHlwZW9mIHYpIHtcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgcmV0dXJuIHY7XG5cbiAgICBjYXNlICdib29sZWFuJzpcbiAgICAgIHJldHVybiB2ID8gJ3RydWUnIDogJ2ZhbHNlJztcblxuICAgIGNhc2UgJ251bWJlcic6XG4gICAgICByZXR1cm4gaXNGaW5pdGUodikgPyB2IDogJyc7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuICcnO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iaiwgc2VwLCBlcSwgbmFtZSkge1xuICBzZXAgPSBzZXAgfHwgJyYnO1xuICBlcSA9IGVxIHx8ICc9JztcbiAgaWYgKG9iaiA9PT0gbnVsbCkge1xuICAgIG9iaiA9IHVuZGVmaW5lZDtcbiAgfVxuXG4gIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgIHJldHVybiBtYXAob2JqZWN0S2V5cyhvYmopLCBmdW5jdGlvbihrKSB7XG4gICAgICB2YXIga3MgPSBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKGspKSArIGVxO1xuICAgICAgaWYgKGlzQXJyYXkob2JqW2tdKSkge1xuICAgICAgICByZXR1cm4gbWFwKG9ialtrXSwgZnVuY3Rpb24odikge1xuICAgICAgICAgIHJldHVybiBrcyArIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUodikpO1xuICAgICAgICB9KS5qb2luKHNlcCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4ga3MgKyBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG9ialtrXSkpO1xuICAgICAgfVxuICAgIH0pLmpvaW4oc2VwKTtcblxuICB9XG5cbiAgaWYgKCFuYW1lKSByZXR1cm4gJyc7XG4gIHJldHVybiBlbmNvZGVVUklDb21wb25lbnQoc3RyaW5naWZ5UHJpbWl0aXZlKG5hbWUpKSArIGVxICtcbiAgICAgICAgIGVuY29kZVVSSUNvbXBvbmVudChzdHJpbmdpZnlQcmltaXRpdmUob2JqKSk7XG59O1xuXG52YXIgaXNBcnJheSA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKHhzKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoeHMpID09PSAnW29iamVjdCBBcnJheV0nO1xufTtcblxuZnVuY3Rpb24gbWFwICh4cywgZikge1xuICBpZiAoeHMubWFwKSByZXR1cm4geHMubWFwKGYpO1xuICB2YXIgcmVzID0gW107XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgeHMubGVuZ3RoOyBpKyspIHtcbiAgICByZXMucHVzaChmKHhzW2ldLCBpKSk7XG4gIH1cbiAgcmV0dXJuIHJlcztcbn1cblxudmFyIG9iamVjdEtleXMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiAob2JqKSB7XG4gIHZhciByZXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBrZXkpKSByZXMucHVzaChrZXkpO1xuICB9XG4gIHJldHVybiByZXM7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLmRlY29kZSA9IGV4cG9ydHMucGFyc2UgPSByZXF1aXJlKCcuL2RlY29kZScpO1xuZXhwb3J0cy5lbmNvZGUgPSBleHBvcnRzLnN0cmluZ2lmeSA9IHJlcXVpcmUoJy4vZW5jb2RlJyk7XG4iLCIvKipcbiAqIENvcHlyaWdodCAoYykgMjAxNCwgRmFjZWJvb2ssIEluYy5cbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKlxuICogVGhpcyBzb3VyY2UgY29kZSBpcyBsaWNlbnNlZCB1bmRlciB0aGUgQlNELXN0eWxlIGxpY2Vuc2UgZm91bmQgaW4gdGhlXG4gKiBodHRwczovL3Jhdy5naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL21hc3Rlci9MSUNFTlNFIGZpbGUuIEFuXG4gKiBhZGRpdGlvbmFsIGdyYW50IG9mIHBhdGVudCByaWdodHMgY2FuIGJlIGZvdW5kIGluIHRoZSBQQVRFTlRTIGZpbGUgaW5cbiAqIHRoZSBzYW1lIGRpcmVjdG9yeS5cbiAqL1xuXG4hKGZ1bmN0aW9uKGdsb2JhbCkge1xuICBcInVzZSBzdHJpY3RcIjtcblxuICB2YXIgT3AgPSBPYmplY3QucHJvdG90eXBlO1xuICB2YXIgaGFzT3duID0gT3AuaGFzT3duUHJvcGVydHk7XG4gIHZhciB1bmRlZmluZWQ7IC8vIE1vcmUgY29tcHJlc3NpYmxlIHRoYW4gdm9pZCAwLlxuICB2YXIgJFN5bWJvbCA9IHR5cGVvZiBTeW1ib2wgPT09IFwiZnVuY3Rpb25cIiA/IFN5bWJvbCA6IHt9O1xuICB2YXIgaXRlcmF0b3JTeW1ib2wgPSAkU3ltYm9sLml0ZXJhdG9yIHx8IFwiQEBpdGVyYXRvclwiO1xuICB2YXIgYXN5bmNJdGVyYXRvclN5bWJvbCA9ICRTeW1ib2wuYXN5bmNJdGVyYXRvciB8fCBcIkBAYXN5bmNJdGVyYXRvclwiO1xuICB2YXIgdG9TdHJpbmdUYWdTeW1ib2wgPSAkU3ltYm9sLnRvU3RyaW5nVGFnIHx8IFwiQEB0b1N0cmluZ1RhZ1wiO1xuXG4gIHZhciBpbk1vZHVsZSA9IHR5cGVvZiBtb2R1bGUgPT09IFwib2JqZWN0XCI7XG4gIHZhciBydW50aW1lID0gZ2xvYmFsLnJlZ2VuZXJhdG9yUnVudGltZTtcbiAgaWYgKHJ1bnRpbWUpIHtcbiAgICBpZiAoaW5Nb2R1bGUpIHtcbiAgICAgIC8vIElmIHJlZ2VuZXJhdG9yUnVudGltZSBpcyBkZWZpbmVkIGdsb2JhbGx5IGFuZCB3ZSdyZSBpbiBhIG1vZHVsZSxcbiAgICAgIC8vIG1ha2UgdGhlIGV4cG9ydHMgb2JqZWN0IGlkZW50aWNhbCB0byByZWdlbmVyYXRvclJ1bnRpbWUuXG4gICAgICBtb2R1bGUuZXhwb3J0cyA9IHJ1bnRpbWU7XG4gICAgfVxuICAgIC8vIERvbid0IGJvdGhlciBldmFsdWF0aW5nIHRoZSByZXN0IG9mIHRoaXMgZmlsZSBpZiB0aGUgcnVudGltZSB3YXNcbiAgICAvLyBhbHJlYWR5IGRlZmluZWQgZ2xvYmFsbHkuXG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gRGVmaW5lIHRoZSBydW50aW1lIGdsb2JhbGx5IChhcyBleHBlY3RlZCBieSBnZW5lcmF0ZWQgY29kZSkgYXMgZWl0aGVyXG4gIC8vIG1vZHVsZS5leHBvcnRzIChpZiB3ZSdyZSBpbiBhIG1vZHVsZSkgb3IgYSBuZXcsIGVtcHR5IG9iamVjdC5cbiAgcnVudGltZSA9IGdsb2JhbC5yZWdlbmVyYXRvclJ1bnRpbWUgPSBpbk1vZHVsZSA/IG1vZHVsZS5leHBvcnRzIDoge307XG5cbiAgZnVuY3Rpb24gd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdCkge1xuICAgIC8vIElmIG91dGVyRm4gcHJvdmlkZWQgYW5kIG91dGVyRm4ucHJvdG90eXBlIGlzIGEgR2VuZXJhdG9yLCB0aGVuIG91dGVyRm4ucHJvdG90eXBlIGluc3RhbmNlb2YgR2VuZXJhdG9yLlxuICAgIHZhciBwcm90b0dlbmVyYXRvciA9IG91dGVyRm4gJiYgb3V0ZXJGbi5wcm90b3R5cGUgaW5zdGFuY2VvZiBHZW5lcmF0b3IgPyBvdXRlckZuIDogR2VuZXJhdG9yO1xuICAgIHZhciBnZW5lcmF0b3IgPSBPYmplY3QuY3JlYXRlKHByb3RvR2VuZXJhdG9yLnByb3RvdHlwZSk7XG4gICAgdmFyIGNvbnRleHQgPSBuZXcgQ29udGV4dCh0cnlMb2NzTGlzdCB8fCBbXSk7XG5cbiAgICAvLyBUaGUgLl9pbnZva2UgbWV0aG9kIHVuaWZpZXMgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzLlxuICAgIGdlbmVyYXRvci5faW52b2tlID0gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KTtcblxuICAgIHJldHVybiBnZW5lcmF0b3I7XG4gIH1cbiAgcnVudGltZS53cmFwID0gd3JhcDtcblxuICAvLyBUcnkvY2F0Y2ggaGVscGVyIHRvIG1pbmltaXplIGRlb3B0aW1pemF0aW9ucy4gUmV0dXJucyBhIGNvbXBsZXRpb25cbiAgLy8gcmVjb3JkIGxpa2UgY29udGV4dC50cnlFbnRyaWVzW2ldLmNvbXBsZXRpb24uIFRoaXMgaW50ZXJmYWNlIGNvdWxkXG4gIC8vIGhhdmUgYmVlbiAoYW5kIHdhcyBwcmV2aW91c2x5KSBkZXNpZ25lZCB0byB0YWtlIGEgY2xvc3VyZSB0byBiZVxuICAvLyBpbnZva2VkIHdpdGhvdXQgYXJndW1lbnRzLCBidXQgaW4gYWxsIHRoZSBjYXNlcyB3ZSBjYXJlIGFib3V0IHdlXG4gIC8vIGFscmVhZHkgaGF2ZSBhbiBleGlzdGluZyBtZXRob2Qgd2Ugd2FudCB0byBjYWxsLCBzbyB0aGVyZSdzIG5vIG5lZWRcbiAgLy8gdG8gY3JlYXRlIGEgbmV3IGZ1bmN0aW9uIG9iamVjdC4gV2UgY2FuIGV2ZW4gZ2V0IGF3YXkgd2l0aCBhc3N1bWluZ1xuICAvLyB0aGUgbWV0aG9kIHRha2VzIGV4YWN0bHkgb25lIGFyZ3VtZW50LCBzaW5jZSB0aGF0IGhhcHBlbnMgdG8gYmUgdHJ1ZVxuICAvLyBpbiBldmVyeSBjYXNlLCBzbyB3ZSBkb24ndCBoYXZlIHRvIHRvdWNoIHRoZSBhcmd1bWVudHMgb2JqZWN0LiBUaGVcbiAgLy8gb25seSBhZGRpdGlvbmFsIGFsbG9jYXRpb24gcmVxdWlyZWQgaXMgdGhlIGNvbXBsZXRpb24gcmVjb3JkLCB3aGljaFxuICAvLyBoYXMgYSBzdGFibGUgc2hhcGUgYW5kIHNvIGhvcGVmdWxseSBzaG91bGQgYmUgY2hlYXAgdG8gYWxsb2NhdGUuXG4gIGZ1bmN0aW9uIHRyeUNhdGNoKGZuLCBvYmosIGFyZykge1xuICAgIHRyeSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcIm5vcm1hbFwiLCBhcmc6IGZuLmNhbGwob2JqLCBhcmcpIH07XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICByZXR1cm4geyB0eXBlOiBcInRocm93XCIsIGFyZzogZXJyIH07XG4gICAgfVxuICB9XG5cbiAgdmFyIEdlblN0YXRlU3VzcGVuZGVkU3RhcnQgPSBcInN1c3BlbmRlZFN0YXJ0XCI7XG4gIHZhciBHZW5TdGF0ZVN1c3BlbmRlZFlpZWxkID0gXCJzdXNwZW5kZWRZaWVsZFwiO1xuICB2YXIgR2VuU3RhdGVFeGVjdXRpbmcgPSBcImV4ZWN1dGluZ1wiO1xuICB2YXIgR2VuU3RhdGVDb21wbGV0ZWQgPSBcImNvbXBsZXRlZFwiO1xuXG4gIC8vIFJldHVybmluZyB0aGlzIG9iamVjdCBmcm9tIHRoZSBpbm5lckZuIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXNcbiAgLy8gYnJlYWtpbmcgb3V0IG9mIHRoZSBkaXNwYXRjaCBzd2l0Y2ggc3RhdGVtZW50LlxuICB2YXIgQ29udGludWVTZW50aW5lbCA9IHt9O1xuXG4gIC8vIER1bW15IGNvbnN0cnVjdG9yIGZ1bmN0aW9ucyB0aGF0IHdlIHVzZSBhcyB0aGUgLmNvbnN0cnVjdG9yIGFuZFxuICAvLyAuY29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMgZm9yIGZ1bmN0aW9ucyB0aGF0IHJldHVybiBHZW5lcmF0b3JcbiAgLy8gb2JqZWN0cy4gRm9yIGZ1bGwgc3BlYyBjb21wbGlhbmNlLCB5b3UgbWF5IHdpc2ggdG8gY29uZmlndXJlIHlvdXJcbiAgLy8gbWluaWZpZXIgbm90IHRvIG1hbmdsZSB0aGUgbmFtZXMgb2YgdGhlc2UgdHdvIGZ1bmN0aW9ucy5cbiAgZnVuY3Rpb24gR2VuZXJhdG9yKCkge31cbiAgZnVuY3Rpb24gR2VuZXJhdG9yRnVuY3Rpb24oKSB7fVxuICBmdW5jdGlvbiBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSgpIHt9XG5cbiAgLy8gVGhpcyBpcyBhIHBvbHlmaWxsIGZvciAlSXRlcmF0b3JQcm90b3R5cGUlIGZvciBlbnZpcm9ubWVudHMgdGhhdFxuICAvLyBkb24ndCBuYXRpdmVseSBzdXBwb3J0IGl0LlxuICB2YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcbiAgSXRlcmF0b3JQcm90b3R5cGVbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuXG4gIHZhciBnZXRQcm90byA9IE9iamVjdC5nZXRQcm90b3R5cGVPZjtcbiAgdmFyIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG8gJiYgZ2V0UHJvdG8oZ2V0UHJvdG8odmFsdWVzKFtdKSkpO1xuICBpZiAoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUgJiZcbiAgICAgIE5hdGl2ZUl0ZXJhdG9yUHJvdG90eXBlICE9PSBPcCAmJlxuICAgICAgaGFzT3duLmNhbGwoTmF0aXZlSXRlcmF0b3JQcm90b3R5cGUsIGl0ZXJhdG9yU3ltYm9sKSkge1xuICAgIC8vIFRoaXMgZW52aXJvbm1lbnQgaGFzIGEgbmF0aXZlICVJdGVyYXRvclByb3RvdHlwZSU7IHVzZSBpdCBpbnN0ZWFkXG4gICAgLy8gb2YgdGhlIHBvbHlmaWxsLlxuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gTmF0aXZlSXRlcmF0b3JQcm90b3R5cGU7XG4gIH1cblxuICB2YXIgR3AgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZS5wcm90b3R5cGUgPVxuICAgIEdlbmVyYXRvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEl0ZXJhdG9yUHJvdG90eXBlKTtcbiAgR2VuZXJhdG9yRnVuY3Rpb24ucHJvdG90eXBlID0gR3AuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGUuY29uc3RydWN0b3IgPSBHZW5lcmF0b3JGdW5jdGlvbjtcbiAgR2VuZXJhdG9yRnVuY3Rpb25Qcm90b3R5cGVbdG9TdHJpbmdUYWdTeW1ib2xdID1cbiAgICBHZW5lcmF0b3JGdW5jdGlvbi5kaXNwbGF5TmFtZSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcblxuICAvLyBIZWxwZXIgZm9yIGRlZmluaW5nIHRoZSAubmV4dCwgLnRocm93LCBhbmQgLnJldHVybiBtZXRob2RzIG9mIHRoZVxuICAvLyBJdGVyYXRvciBpbnRlcmZhY2UgaW4gdGVybXMgb2YgYSBzaW5nbGUgLl9pbnZva2UgbWV0aG9kLlxuICBmdW5jdGlvbiBkZWZpbmVJdGVyYXRvck1ldGhvZHMocHJvdG90eXBlKSB7XG4gICAgW1wibmV4dFwiLCBcInRocm93XCIsIFwicmV0dXJuXCJdLmZvckVhY2goZnVuY3Rpb24obWV0aG9kKSB7XG4gICAgICBwcm90b3R5cGVbbWV0aG9kXSA9IGZ1bmN0aW9uKGFyZykge1xuICAgICAgICByZXR1cm4gdGhpcy5faW52b2tlKG1ldGhvZCwgYXJnKTtcbiAgICAgIH07XG4gICAgfSk7XG4gIH1cblxuICBydW50aW1lLmlzR2VuZXJhdG9yRnVuY3Rpb24gPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICB2YXIgY3RvciA9IHR5cGVvZiBnZW5GdW4gPT09IFwiZnVuY3Rpb25cIiAmJiBnZW5GdW4uY29uc3RydWN0b3I7XG4gICAgcmV0dXJuIGN0b3JcbiAgICAgID8gY3RvciA9PT0gR2VuZXJhdG9yRnVuY3Rpb24gfHxcbiAgICAgICAgLy8gRm9yIHRoZSBuYXRpdmUgR2VuZXJhdG9yRnVuY3Rpb24gY29uc3RydWN0b3IsIHRoZSBiZXN0IHdlIGNhblxuICAgICAgICAvLyBkbyBpcyB0byBjaGVjayBpdHMgLm5hbWUgcHJvcGVydHkuXG4gICAgICAgIChjdG9yLmRpc3BsYXlOYW1lIHx8IGN0b3IubmFtZSkgPT09IFwiR2VuZXJhdG9yRnVuY3Rpb25cIlxuICAgICAgOiBmYWxzZTtcbiAgfTtcblxuICBydW50aW1lLm1hcmsgPSBmdW5jdGlvbihnZW5GdW4pIHtcbiAgICBpZiAoT2JqZWN0LnNldFByb3RvdHlwZU9mKSB7XG4gICAgICBPYmplY3Quc2V0UHJvdG90eXBlT2YoZ2VuRnVuLCBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGdlbkZ1bi5fX3Byb3RvX18gPSBHZW5lcmF0b3JGdW5jdGlvblByb3RvdHlwZTtcbiAgICAgIGlmICghKHRvU3RyaW5nVGFnU3ltYm9sIGluIGdlbkZ1bikpIHtcbiAgICAgICAgZ2VuRnVuW3RvU3RyaW5nVGFnU3ltYm9sXSA9IFwiR2VuZXJhdG9yRnVuY3Rpb25cIjtcbiAgICAgIH1cbiAgICB9XG4gICAgZ2VuRnVuLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoR3ApO1xuICAgIHJldHVybiBnZW5GdW47XG4gIH07XG5cbiAgLy8gV2l0aGluIHRoZSBib2R5IG9mIGFueSBhc3luYyBmdW5jdGlvbiwgYGF3YWl0IHhgIGlzIHRyYW5zZm9ybWVkIHRvXG4gIC8vIGB5aWVsZCByZWdlbmVyYXRvclJ1bnRpbWUuYXdyYXAoeClgLCBzbyB0aGF0IHRoZSBydW50aW1lIGNhbiB0ZXN0XG4gIC8vIGBoYXNPd24uY2FsbCh2YWx1ZSwgXCJfX2F3YWl0XCIpYCB0byBkZXRlcm1pbmUgaWYgdGhlIHlpZWxkZWQgdmFsdWUgaXNcbiAgLy8gbWVhbnQgdG8gYmUgYXdhaXRlZC5cbiAgcnVudGltZS5hd3JhcCA9IGZ1bmN0aW9uKGFyZykge1xuICAgIHJldHVybiB7IF9fYXdhaXQ6IGFyZyB9O1xuICB9O1xuXG4gIGZ1bmN0aW9uIEFzeW5jSXRlcmF0b3IoZ2VuZXJhdG9yKSB7XG4gICAgZnVuY3Rpb24gaW52b2tlKG1ldGhvZCwgYXJnLCByZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIHZhciByZWNvcmQgPSB0cnlDYXRjaChnZW5lcmF0b3JbbWV0aG9kXSwgZ2VuZXJhdG9yLCBhcmcpO1xuICAgICAgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgcmVqZWN0KHJlY29yZC5hcmcpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlY29yZC5hcmc7XG4gICAgICAgIHZhciB2YWx1ZSA9IHJlc3VsdC52YWx1ZTtcbiAgICAgICAgaWYgKHZhbHVlICYmXG4gICAgICAgICAgICB0eXBlb2YgdmFsdWUgPT09IFwib2JqZWN0XCIgJiZcbiAgICAgICAgICAgIGhhc093bi5jYWxsKHZhbHVlLCBcIl9fYXdhaXRcIikpIHtcbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlLl9fYXdhaXQpLnRoZW4oZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgICAgIGludm9rZShcIm5leHRcIiwgdmFsdWUsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSwgZnVuY3Rpb24oZXJyKSB7XG4gICAgICAgICAgICBpbnZva2UoXCJ0aHJvd1wiLCBlcnIsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZhbHVlKS50aGVuKGZ1bmN0aW9uKHVud3JhcHBlZCkge1xuICAgICAgICAgIC8vIFdoZW4gYSB5aWVsZGVkIFByb21pc2UgaXMgcmVzb2x2ZWQsIGl0cyBmaW5hbCB2YWx1ZSBiZWNvbWVzXG4gICAgICAgICAgLy8gdGhlIC52YWx1ZSBvZiB0aGUgUHJvbWlzZTx7dmFsdWUsZG9uZX0+IHJlc3VsdCBmb3IgdGhlXG4gICAgICAgICAgLy8gY3VycmVudCBpdGVyYXRpb24uIElmIHRoZSBQcm9taXNlIGlzIHJlamVjdGVkLCBob3dldmVyLCB0aGVcbiAgICAgICAgICAvLyByZXN1bHQgZm9yIHRoaXMgaXRlcmF0aW9uIHdpbGwgYmUgcmVqZWN0ZWQgd2l0aCB0aGUgc2FtZVxuICAgICAgICAgIC8vIHJlYXNvbi4gTm90ZSB0aGF0IHJlamVjdGlvbnMgb2YgeWllbGRlZCBQcm9taXNlcyBhcmUgbm90XG4gICAgICAgICAgLy8gdGhyb3duIGJhY2sgaW50byB0aGUgZ2VuZXJhdG9yIGZ1bmN0aW9uLCBhcyBpcyB0aGUgY2FzZVxuICAgICAgICAgIC8vIHdoZW4gYW4gYXdhaXRlZCBQcm9taXNlIGlzIHJlamVjdGVkLiBUaGlzIGRpZmZlcmVuY2UgaW5cbiAgICAgICAgICAvLyBiZWhhdmlvciBiZXR3ZWVuIHlpZWxkIGFuZCBhd2FpdCBpcyBpbXBvcnRhbnQsIGJlY2F1c2UgaXRcbiAgICAgICAgICAvLyBhbGxvd3MgdGhlIGNvbnN1bWVyIHRvIGRlY2lkZSB3aGF0IHRvIGRvIHdpdGggdGhlIHlpZWxkZWRcbiAgICAgICAgICAvLyByZWplY3Rpb24gKHN3YWxsb3cgaXQgYW5kIGNvbnRpbnVlLCBtYW51YWxseSAudGhyb3cgaXQgYmFja1xuICAgICAgICAgIC8vIGludG8gdGhlIGdlbmVyYXRvciwgYWJhbmRvbiBpdGVyYXRpb24sIHdoYXRldmVyKS4gV2l0aFxuICAgICAgICAgIC8vIGF3YWl0LCBieSBjb250cmFzdCwgdGhlcmUgaXMgbm8gb3Bwb3J0dW5pdHkgdG8gZXhhbWluZSB0aGVcbiAgICAgICAgICAvLyByZWplY3Rpb24gcmVhc29uIG91dHNpZGUgdGhlIGdlbmVyYXRvciBmdW5jdGlvbiwgc28gdGhlXG4gICAgICAgICAgLy8gb25seSBvcHRpb24gaXMgdG8gdGhyb3cgaXQgZnJvbSB0aGUgYXdhaXQgZXhwcmVzc2lvbiwgYW5kXG4gICAgICAgICAgLy8gbGV0IHRoZSBnZW5lcmF0b3IgZnVuY3Rpb24gaGFuZGxlIHRoZSBleGNlcHRpb24uXG4gICAgICAgICAgcmVzdWx0LnZhbHVlID0gdW53cmFwcGVkO1xuICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZW9mIGdsb2JhbC5wcm9jZXNzID09PSBcIm9iamVjdFwiICYmIGdsb2JhbC5wcm9jZXNzLmRvbWFpbikge1xuICAgICAgaW52b2tlID0gZ2xvYmFsLnByb2Nlc3MuZG9tYWluLmJpbmQoaW52b2tlKTtcbiAgICB9XG5cbiAgICB2YXIgcHJldmlvdXNQcm9taXNlO1xuXG4gICAgZnVuY3Rpb24gZW5xdWV1ZShtZXRob2QsIGFyZykge1xuICAgICAgZnVuY3Rpb24gY2FsbEludm9rZVdpdGhNZXRob2RBbmRBcmcoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgICBpbnZva2UobWV0aG9kLCBhcmcsIHJlc29sdmUsIHJlamVjdCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gcHJldmlvdXNQcm9taXNlID1cbiAgICAgICAgLy8gSWYgZW5xdWV1ZSBoYXMgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIHdlIHdhbnQgdG8gd2FpdCB1bnRpbFxuICAgICAgICAvLyBhbGwgcHJldmlvdXMgUHJvbWlzZXMgaGF2ZSBiZWVuIHJlc29sdmVkIGJlZm9yZSBjYWxsaW5nIGludm9rZSxcbiAgICAgICAgLy8gc28gdGhhdCByZXN1bHRzIGFyZSBhbHdheXMgZGVsaXZlcmVkIGluIHRoZSBjb3JyZWN0IG9yZGVyLiBJZlxuICAgICAgICAvLyBlbnF1ZXVlIGhhcyBub3QgYmVlbiBjYWxsZWQgYmVmb3JlLCB0aGVuIGl0IGlzIGltcG9ydGFudCB0b1xuICAgICAgICAvLyBjYWxsIGludm9rZSBpbW1lZGlhdGVseSwgd2l0aG91dCB3YWl0aW5nIG9uIGEgY2FsbGJhY2sgdG8gZmlyZSxcbiAgICAgICAgLy8gc28gdGhhdCB0aGUgYXN5bmMgZ2VuZXJhdG9yIGZ1bmN0aW9uIGhhcyB0aGUgb3Bwb3J0dW5pdHkgdG8gZG9cbiAgICAgICAgLy8gYW55IG5lY2Vzc2FyeSBzZXR1cCBpbiBhIHByZWRpY3RhYmxlIHdheS4gVGhpcyBwcmVkaWN0YWJpbGl0eVxuICAgICAgICAvLyBpcyB3aHkgdGhlIFByb21pc2UgY29uc3RydWN0b3Igc3luY2hyb25vdXNseSBpbnZva2VzIGl0c1xuICAgICAgICAvLyBleGVjdXRvciBjYWxsYmFjaywgYW5kIHdoeSBhc3luYyBmdW5jdGlvbnMgc3luY2hyb25vdXNseVxuICAgICAgICAvLyBleGVjdXRlIGNvZGUgYmVmb3JlIHRoZSBmaXJzdCBhd2FpdC4gU2luY2Ugd2UgaW1wbGVtZW50IHNpbXBsZVxuICAgICAgICAvLyBhc3luYyBmdW5jdGlvbnMgaW4gdGVybXMgb2YgYXN5bmMgZ2VuZXJhdG9ycywgaXQgaXMgZXNwZWNpYWxseVxuICAgICAgICAvLyBpbXBvcnRhbnQgdG8gZ2V0IHRoaXMgcmlnaHQsIGV2ZW4gdGhvdWdoIGl0IHJlcXVpcmVzIGNhcmUuXG4gICAgICAgIHByZXZpb3VzUHJvbWlzZSA/IHByZXZpb3VzUHJvbWlzZS50aGVuKFxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnLFxuICAgICAgICAgIC8vIEF2b2lkIHByb3BhZ2F0aW5nIGZhaWx1cmVzIHRvIFByb21pc2VzIHJldHVybmVkIGJ5IGxhdGVyXG4gICAgICAgICAgLy8gaW52b2NhdGlvbnMgb2YgdGhlIGl0ZXJhdG9yLlxuICAgICAgICAgIGNhbGxJbnZva2VXaXRoTWV0aG9kQW5kQXJnXG4gICAgICAgICkgOiBjYWxsSW52b2tlV2l0aE1ldGhvZEFuZEFyZygpO1xuICAgIH1cblxuICAgIC8vIERlZmluZSB0aGUgdW5pZmllZCBoZWxwZXIgbWV0aG9kIHRoYXQgaXMgdXNlZCB0byBpbXBsZW1lbnQgLm5leHQsXG4gICAgLy8gLnRocm93LCBhbmQgLnJldHVybiAoc2VlIGRlZmluZUl0ZXJhdG9yTWV0aG9kcykuXG4gICAgdGhpcy5faW52b2tlID0gZW5xdWV1ZTtcbiAgfVxuXG4gIGRlZmluZUl0ZXJhdG9yTWV0aG9kcyhBc3luY0l0ZXJhdG9yLnByb3RvdHlwZSk7XG4gIEFzeW5jSXRlcmF0b3IucHJvdG90eXBlW2FzeW5jSXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB0aGlzO1xuICB9O1xuICBydW50aW1lLkFzeW5jSXRlcmF0b3IgPSBBc3luY0l0ZXJhdG9yO1xuXG4gIC8vIE5vdGUgdGhhdCBzaW1wbGUgYXN5bmMgZnVuY3Rpb25zIGFyZSBpbXBsZW1lbnRlZCBvbiB0b3Agb2ZcbiAgLy8gQXN5bmNJdGVyYXRvciBvYmplY3RzOyB0aGV5IGp1c3QgcmV0dXJuIGEgUHJvbWlzZSBmb3IgdGhlIHZhbHVlIG9mXG4gIC8vIHRoZSBmaW5hbCByZXN1bHQgcHJvZHVjZWQgYnkgdGhlIGl0ZXJhdG9yLlxuICBydW50aW1lLmFzeW5jID0gZnVuY3Rpb24oaW5uZXJGbiwgb3V0ZXJGbiwgc2VsZiwgdHJ5TG9jc0xpc3QpIHtcbiAgICB2YXIgaXRlciA9IG5ldyBBc3luY0l0ZXJhdG9yKFxuICAgICAgd3JhcChpbm5lckZuLCBvdXRlckZuLCBzZWxmLCB0cnlMb2NzTGlzdClcbiAgICApO1xuXG4gICAgcmV0dXJuIHJ1bnRpbWUuaXNHZW5lcmF0b3JGdW5jdGlvbihvdXRlckZuKVxuICAgICAgPyBpdGVyIC8vIElmIG91dGVyRm4gaXMgYSBnZW5lcmF0b3IsIHJldHVybiB0aGUgZnVsbCBpdGVyYXRvci5cbiAgICAgIDogaXRlci5uZXh0KCkudGhlbihmdW5jdGlvbihyZXN1bHQpIHtcbiAgICAgICAgICByZXR1cm4gcmVzdWx0LmRvbmUgPyByZXN1bHQudmFsdWUgOiBpdGVyLm5leHQoKTtcbiAgICAgICAgfSk7XG4gIH07XG5cbiAgZnVuY3Rpb24gbWFrZUludm9rZU1ldGhvZChpbm5lckZuLCBzZWxmLCBjb250ZXh0KSB7XG4gICAgdmFyIHN0YXRlID0gR2VuU3RhdGVTdXNwZW5kZWRTdGFydDtcblxuICAgIHJldHVybiBmdW5jdGlvbiBpbnZva2UobWV0aG9kLCBhcmcpIHtcbiAgICAgIGlmIChzdGF0ZSA9PT0gR2VuU3RhdGVFeGVjdXRpbmcpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiR2VuZXJhdG9yIGlzIGFscmVhZHkgcnVubmluZ1wiKTtcbiAgICAgIH1cblxuICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZUNvbXBsZXRlZCkge1xuICAgICAgICBpZiAobWV0aG9kID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICB0aHJvdyBhcmc7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCZSBmb3JnaXZpbmcsIHBlciAyNS4zLjMuMy4zIG9mIHRoZSBzcGVjOlxuICAgICAgICAvLyBodHRwczovL3Blb3BsZS5tb3ppbGxhLm9yZy9+am9yZW5kb3JmZi9lczYtZHJhZnQuaHRtbCNzZWMtZ2VuZXJhdG9ycmVzdW1lXG4gICAgICAgIHJldHVybiBkb25lUmVzdWx0KCk7XG4gICAgICB9XG5cbiAgICAgIGNvbnRleHQubWV0aG9kID0gbWV0aG9kO1xuICAgICAgY29udGV4dC5hcmcgPSBhcmc7XG5cbiAgICAgIHdoaWxlICh0cnVlKSB7XG4gICAgICAgIHZhciBkZWxlZ2F0ZSA9IGNvbnRleHQuZGVsZWdhdGU7XG4gICAgICAgIGlmIChkZWxlZ2F0ZSkge1xuICAgICAgICAgIHZhciBkZWxlZ2F0ZVJlc3VsdCA9IG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpO1xuICAgICAgICAgIGlmIChkZWxlZ2F0ZVJlc3VsdCkge1xuICAgICAgICAgICAgaWYgKGRlbGVnYXRlUmVzdWx0ID09PSBDb250aW51ZVNlbnRpbmVsKSBjb250aW51ZTtcbiAgICAgICAgICAgIHJldHVybiBkZWxlZ2F0ZVJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC5tZXRob2QgPT09IFwibmV4dFwiKSB7XG4gICAgICAgICAgLy8gU2V0dGluZyBjb250ZXh0Ll9zZW50IGZvciBsZWdhY3kgc3VwcG9ydCBvZiBCYWJlbCdzXG4gICAgICAgICAgLy8gZnVuY3Rpb24uc2VudCBpbXBsZW1lbnRhdGlvbi5cbiAgICAgICAgICBjb250ZXh0LnNlbnQgPSBjb250ZXh0Ll9zZW50ID0gY29udGV4dC5hcmc7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgaWYgKHN0YXRlID09PSBHZW5TdGF0ZVN1c3BlbmRlZFN0YXJ0KSB7XG4gICAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgICAgdGhyb3cgY29udGV4dC5hcmc7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgY29udGV4dC5kaXNwYXRjaEV4Y2VwdGlvbihjb250ZXh0LmFyZyk7XG5cbiAgICAgICAgfSBlbHNlIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJyZXR1cm5cIikge1xuICAgICAgICAgIGNvbnRleHQuYWJydXB0KFwicmV0dXJuXCIsIGNvbnRleHQuYXJnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0YXRlID0gR2VuU3RhdGVFeGVjdXRpbmc7XG5cbiAgICAgICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKGlubmVyRm4sIHNlbGYsIGNvbnRleHQpO1xuICAgICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwibm9ybWFsXCIpIHtcbiAgICAgICAgICAvLyBJZiBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gaW5uZXJGbiwgd2UgbGVhdmUgc3RhdGUgPT09XG4gICAgICAgICAgLy8gR2VuU3RhdGVFeGVjdXRpbmcgYW5kIGxvb3AgYmFjayBmb3IgYW5vdGhlciBpbnZvY2F0aW9uLlxuICAgICAgICAgIHN0YXRlID0gY29udGV4dC5kb25lXG4gICAgICAgICAgICA/IEdlblN0YXRlQ29tcGxldGVkXG4gICAgICAgICAgICA6IEdlblN0YXRlU3VzcGVuZGVkWWllbGQ7XG5cbiAgICAgICAgICBpZiAocmVjb3JkLmFyZyA9PT0gQ29udGludWVTZW50aW5lbCkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHZhbHVlOiByZWNvcmQuYXJnLFxuICAgICAgICAgICAgZG9uZTogY29udGV4dC5kb25lXG4gICAgICAgICAgfTtcblxuICAgICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcInRocm93XCIpIHtcbiAgICAgICAgICBzdGF0ZSA9IEdlblN0YXRlQ29tcGxldGVkO1xuICAgICAgICAgIC8vIERpc3BhdGNoIHRoZSBleGNlcHRpb24gYnkgbG9vcGluZyBiYWNrIGFyb3VuZCB0byB0aGVcbiAgICAgICAgICAvLyBjb250ZXh0LmRpc3BhdGNoRXhjZXB0aW9uKGNvbnRleHQuYXJnKSBjYWxsIGFib3ZlLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJ0aHJvd1wiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBDYWxsIGRlbGVnYXRlLml0ZXJhdG9yW2NvbnRleHQubWV0aG9kXShjb250ZXh0LmFyZykgYW5kIGhhbmRsZSB0aGVcbiAgLy8gcmVzdWx0LCBlaXRoZXIgYnkgcmV0dXJuaW5nIGEgeyB2YWx1ZSwgZG9uZSB9IHJlc3VsdCBmcm9tIHRoZVxuICAvLyBkZWxlZ2F0ZSBpdGVyYXRvciwgb3IgYnkgbW9kaWZ5aW5nIGNvbnRleHQubWV0aG9kIGFuZCBjb250ZXh0LmFyZyxcbiAgLy8gc2V0dGluZyBjb250ZXh0LmRlbGVnYXRlIHRvIG51bGwsIGFuZCByZXR1cm5pbmcgdGhlIENvbnRpbnVlU2VudGluZWwuXG4gIGZ1bmN0aW9uIG1heWJlSW52b2tlRGVsZWdhdGUoZGVsZWdhdGUsIGNvbnRleHQpIHtcbiAgICB2YXIgbWV0aG9kID0gZGVsZWdhdGUuaXRlcmF0b3JbY29udGV4dC5tZXRob2RdO1xuICAgIGlmIChtZXRob2QgPT09IHVuZGVmaW5lZCkge1xuICAgICAgLy8gQSAudGhyb3cgb3IgLnJldHVybiB3aGVuIHRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBoYXMgbm8gLnRocm93XG4gICAgICAvLyBtZXRob2QgYWx3YXlzIHRlcm1pbmF0ZXMgdGhlIHlpZWxkKiBsb29wLlxuICAgICAgY29udGV4dC5kZWxlZ2F0ZSA9IG51bGw7XG5cbiAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIGlmIChkZWxlZ2F0ZS5pdGVyYXRvci5yZXR1cm4pIHtcbiAgICAgICAgICAvLyBJZiB0aGUgZGVsZWdhdGUgaXRlcmF0b3IgaGFzIGEgcmV0dXJuIG1ldGhvZCwgZ2l2ZSBpdCBhXG4gICAgICAgICAgLy8gY2hhbmNlIHRvIGNsZWFuIHVwLlxuICAgICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJyZXR1cm5cIjtcbiAgICAgICAgICBjb250ZXh0LmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBtYXliZUludm9rZURlbGVnYXRlKGRlbGVnYXRlLCBjb250ZXh0KTtcblxuICAgICAgICAgIGlmIChjb250ZXh0Lm1ldGhvZCA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICAvLyBJZiBtYXliZUludm9rZURlbGVnYXRlKGNvbnRleHQpIGNoYW5nZWQgY29udGV4dC5tZXRob2QgZnJvbVxuICAgICAgICAgICAgLy8gXCJyZXR1cm5cIiB0byBcInRocm93XCIsIGxldCB0aGF0IG92ZXJyaWRlIHRoZSBUeXBlRXJyb3IgYmVsb3cuXG4gICAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgICAgY29udGV4dC5hcmcgPSBuZXcgVHlwZUVycm9yKFxuICAgICAgICAgIFwiVGhlIGl0ZXJhdG9yIGRvZXMgbm90IHByb3ZpZGUgYSAndGhyb3cnIG1ldGhvZFwiKTtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIHJlY29yZCA9IHRyeUNhdGNoKG1ldGhvZCwgZGVsZWdhdGUuaXRlcmF0b3IsIGNvbnRleHQuYXJnKTtcblxuICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICBjb250ZXh0Lm1ldGhvZCA9IFwidGhyb3dcIjtcbiAgICAgIGNvbnRleHQuYXJnID0gcmVjb3JkLmFyZztcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgdmFyIGluZm8gPSByZWNvcmQuYXJnO1xuXG4gICAgaWYgKCEgaW5mbykge1xuICAgICAgY29udGV4dC5tZXRob2QgPSBcInRocm93XCI7XG4gICAgICBjb250ZXh0LmFyZyA9IG5ldyBUeXBlRXJyb3IoXCJpdGVyYXRvciByZXN1bHQgaXMgbm90IGFuIG9iamVjdFwiKTtcbiAgICAgIGNvbnRleHQuZGVsZWdhdGUgPSBudWxsO1xuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuXG4gICAgaWYgKGluZm8uZG9uZSkge1xuICAgICAgLy8gQXNzaWduIHRoZSByZXN1bHQgb2YgdGhlIGZpbmlzaGVkIGRlbGVnYXRlIHRvIHRoZSB0ZW1wb3JhcnlcbiAgICAgIC8vIHZhcmlhYmxlIHNwZWNpZmllZCBieSBkZWxlZ2F0ZS5yZXN1bHROYW1lIChzZWUgZGVsZWdhdGVZaWVsZCkuXG4gICAgICBjb250ZXh0W2RlbGVnYXRlLnJlc3VsdE5hbWVdID0gaW5mby52YWx1ZTtcblxuICAgICAgLy8gUmVzdW1lIGV4ZWN1dGlvbiBhdCB0aGUgZGVzaXJlZCBsb2NhdGlvbiAoc2VlIGRlbGVnYXRlWWllbGQpLlxuICAgICAgY29udGV4dC5uZXh0ID0gZGVsZWdhdGUubmV4dExvYztcblxuICAgICAgLy8gSWYgY29udGV4dC5tZXRob2Qgd2FzIFwidGhyb3dcIiBidXQgdGhlIGRlbGVnYXRlIGhhbmRsZWQgdGhlXG4gICAgICAvLyBleGNlcHRpb24sIGxldCB0aGUgb3V0ZXIgZ2VuZXJhdG9yIHByb2NlZWQgbm9ybWFsbHkuIElmXG4gICAgICAvLyBjb250ZXh0Lm1ldGhvZCB3YXMgXCJuZXh0XCIsIGZvcmdldCBjb250ZXh0LmFyZyBzaW5jZSBpdCBoYXMgYmVlblxuICAgICAgLy8gXCJjb25zdW1lZFwiIGJ5IHRoZSBkZWxlZ2F0ZSBpdGVyYXRvci4gSWYgY29udGV4dC5tZXRob2Qgd2FzXG4gICAgICAvLyBcInJldHVyblwiLCBhbGxvdyB0aGUgb3JpZ2luYWwgLnJldHVybiBjYWxsIHRvIGNvbnRpbnVlIGluIHRoZVxuICAgICAgLy8gb3V0ZXIgZ2VuZXJhdG9yLlxuICAgICAgaWYgKGNvbnRleHQubWV0aG9kICE9PSBcInJldHVyblwiKSB7XG4gICAgICAgIGNvbnRleHQubWV0aG9kID0gXCJuZXh0XCI7XG4gICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIFJlLXlpZWxkIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGRlbGVnYXRlIG1ldGhvZC5cbiAgICAgIHJldHVybiBpbmZvO1xuICAgIH1cblxuICAgIC8vIFRoZSBkZWxlZ2F0ZSBpdGVyYXRvciBpcyBmaW5pc2hlZCwgc28gZm9yZ2V0IGl0IGFuZCBjb250aW51ZSB3aXRoXG4gICAgLy8gdGhlIG91dGVyIGdlbmVyYXRvci5cbiAgICBjb250ZXh0LmRlbGVnYXRlID0gbnVsbDtcbiAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgfVxuXG4gIC8vIERlZmluZSBHZW5lcmF0b3IucHJvdG90eXBlLntuZXh0LHRocm93LHJldHVybn0gaW4gdGVybXMgb2YgdGhlXG4gIC8vIHVuaWZpZWQgLl9pbnZva2UgaGVscGVyIG1ldGhvZC5cbiAgZGVmaW5lSXRlcmF0b3JNZXRob2RzKEdwKTtcblxuICBHcFt0b1N0cmluZ1RhZ1N5bWJvbF0gPSBcIkdlbmVyYXRvclwiO1xuXG4gIC8vIEEgR2VuZXJhdG9yIHNob3VsZCBhbHdheXMgcmV0dXJuIGl0c2VsZiBhcyB0aGUgaXRlcmF0b3Igb2JqZWN0IHdoZW4gdGhlXG4gIC8vIEBAaXRlcmF0b3IgZnVuY3Rpb24gaXMgY2FsbGVkIG9uIGl0LiBTb21lIGJyb3dzZXJzJyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlXG4gIC8vIGl0ZXJhdG9yIHByb3RvdHlwZSBjaGFpbiBpbmNvcnJlY3RseSBpbXBsZW1lbnQgdGhpcywgY2F1c2luZyB0aGUgR2VuZXJhdG9yXG4gIC8vIG9iamVjdCB0byBub3QgYmUgcmV0dXJuZWQgZnJvbSB0aGlzIGNhbGwuIFRoaXMgZW5zdXJlcyB0aGF0IGRvZXNuJ3QgaGFwcGVuLlxuICAvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2ZhY2Vib29rL3JlZ2VuZXJhdG9yL2lzc3Vlcy8yNzQgZm9yIG1vcmUgZGV0YWlscy5cbiAgR3BbaXRlcmF0b3JTeW1ib2xdID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXM7XG4gIH07XG5cbiAgR3AudG9TdHJpbmcgPSBmdW5jdGlvbigpIHtcbiAgICByZXR1cm4gXCJbb2JqZWN0IEdlbmVyYXRvcl1cIjtcbiAgfTtcblxuICBmdW5jdGlvbiBwdXNoVHJ5RW50cnkobG9jcykge1xuICAgIHZhciBlbnRyeSA9IHsgdHJ5TG9jOiBsb2NzWzBdIH07XG5cbiAgICBpZiAoMSBpbiBsb2NzKSB7XG4gICAgICBlbnRyeS5jYXRjaExvYyA9IGxvY3NbMV07XG4gICAgfVxuXG4gICAgaWYgKDIgaW4gbG9jcykge1xuICAgICAgZW50cnkuZmluYWxseUxvYyA9IGxvY3NbMl07XG4gICAgICBlbnRyeS5hZnRlckxvYyA9IGxvY3NbM107XG4gICAgfVxuXG4gICAgdGhpcy50cnlFbnRyaWVzLnB1c2goZW50cnkpO1xuICB9XG5cbiAgZnVuY3Rpb24gcmVzZXRUcnlFbnRyeShlbnRyeSkge1xuICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uIHx8IHt9O1xuICAgIHJlY29yZC50eXBlID0gXCJub3JtYWxcIjtcbiAgICBkZWxldGUgcmVjb3JkLmFyZztcbiAgICBlbnRyeS5jb21wbGV0aW9uID0gcmVjb3JkO1xuICB9XG5cbiAgZnVuY3Rpb24gQ29udGV4dCh0cnlMb2NzTGlzdCkge1xuICAgIC8vIFRoZSByb290IGVudHJ5IG9iamVjdCAoZWZmZWN0aXZlbHkgYSB0cnkgc3RhdGVtZW50IHdpdGhvdXQgYSBjYXRjaFxuICAgIC8vIG9yIGEgZmluYWxseSBibG9jaykgZ2l2ZXMgdXMgYSBwbGFjZSB0byBzdG9yZSB2YWx1ZXMgdGhyb3duIGZyb21cbiAgICAvLyBsb2NhdGlvbnMgd2hlcmUgdGhlcmUgaXMgbm8gZW5jbG9zaW5nIHRyeSBzdGF0ZW1lbnQuXG4gICAgdGhpcy50cnlFbnRyaWVzID0gW3sgdHJ5TG9jOiBcInJvb3RcIiB9XTtcbiAgICB0cnlMb2NzTGlzdC5mb3JFYWNoKHB1c2hUcnlFbnRyeSwgdGhpcyk7XG4gICAgdGhpcy5yZXNldCh0cnVlKTtcbiAgfVxuXG4gIHJ1bnRpbWUua2V5cyA9IGZ1bmN0aW9uKG9iamVjdCkge1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iamVjdCkge1xuICAgICAga2V5cy5wdXNoKGtleSk7XG4gICAgfVxuICAgIGtleXMucmV2ZXJzZSgpO1xuXG4gICAgLy8gUmF0aGVyIHRoYW4gcmV0dXJuaW5nIGFuIG9iamVjdCB3aXRoIGEgbmV4dCBtZXRob2QsIHdlIGtlZXBcbiAgICAvLyB0aGluZ3Mgc2ltcGxlIGFuZCByZXR1cm4gdGhlIG5leHQgZnVuY3Rpb24gaXRzZWxmLlxuICAgIHJldHVybiBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgd2hpbGUgKGtleXMubGVuZ3RoKSB7XG4gICAgICAgIHZhciBrZXkgPSBrZXlzLnBvcCgpO1xuICAgICAgICBpZiAoa2V5IGluIG9iamVjdCkge1xuICAgICAgICAgIG5leHQudmFsdWUgPSBrZXk7XG4gICAgICAgICAgbmV4dC5kb25lID0gZmFsc2U7XG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgLy8gVG8gYXZvaWQgY3JlYXRpbmcgYW4gYWRkaXRpb25hbCBvYmplY3QsIHdlIGp1c3QgaGFuZyB0aGUgLnZhbHVlXG4gICAgICAvLyBhbmQgLmRvbmUgcHJvcGVydGllcyBvZmYgdGhlIG5leHQgZnVuY3Rpb24gb2JqZWN0IGl0c2VsZi4gVGhpc1xuICAgICAgLy8gYWxzbyBlbnN1cmVzIHRoYXQgdGhlIG1pbmlmaWVyIHdpbGwgbm90IGFub255bWl6ZSB0aGUgZnVuY3Rpb24uXG4gICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuICAgICAgcmV0dXJuIG5leHQ7XG4gICAgfTtcbiAgfTtcblxuICBmdW5jdGlvbiB2YWx1ZXMoaXRlcmFibGUpIHtcbiAgICBpZiAoaXRlcmFibGUpIHtcbiAgICAgIHZhciBpdGVyYXRvck1ldGhvZCA9IGl0ZXJhYmxlW2l0ZXJhdG9yU3ltYm9sXTtcbiAgICAgIGlmIChpdGVyYXRvck1ldGhvZCkge1xuICAgICAgICByZXR1cm4gaXRlcmF0b3JNZXRob2QuY2FsbChpdGVyYWJsZSk7XG4gICAgICB9XG5cbiAgICAgIGlmICh0eXBlb2YgaXRlcmFibGUubmV4dCA9PT0gXCJmdW5jdGlvblwiKSB7XG4gICAgICAgIHJldHVybiBpdGVyYWJsZTtcbiAgICAgIH1cblxuICAgICAgaWYgKCFpc05hTihpdGVyYWJsZS5sZW5ndGgpKSB7XG4gICAgICAgIHZhciBpID0gLTEsIG5leHQgPSBmdW5jdGlvbiBuZXh0KCkge1xuICAgICAgICAgIHdoaWxlICgrK2kgPCBpdGVyYWJsZS5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmIChoYXNPd24uY2FsbChpdGVyYWJsZSwgaSkpIHtcbiAgICAgICAgICAgICAgbmV4dC52YWx1ZSA9IGl0ZXJhYmxlW2ldO1xuICAgICAgICAgICAgICBuZXh0LmRvbmUgPSBmYWxzZTtcbiAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgbmV4dC52YWx1ZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICBuZXh0LmRvbmUgPSB0cnVlO1xuXG4gICAgICAgICAgcmV0dXJuIG5leHQ7XG4gICAgICAgIH07XG5cbiAgICAgICAgcmV0dXJuIG5leHQubmV4dCA9IG5leHQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHdpdGggbm8gdmFsdWVzLlxuICAgIHJldHVybiB7IG5leHQ6IGRvbmVSZXN1bHQgfTtcbiAgfVxuICBydW50aW1lLnZhbHVlcyA9IHZhbHVlcztcblxuICBmdW5jdGlvbiBkb25lUmVzdWx0KCkge1xuICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgfVxuXG4gIENvbnRleHQucHJvdG90eXBlID0ge1xuICAgIGNvbnN0cnVjdG9yOiBDb250ZXh0LFxuXG4gICAgcmVzZXQ6IGZ1bmN0aW9uKHNraXBUZW1wUmVzZXQpIHtcbiAgICAgIHRoaXMucHJldiA9IDA7XG4gICAgICB0aGlzLm5leHQgPSAwO1xuICAgICAgLy8gUmVzZXR0aW5nIGNvbnRleHQuX3NlbnQgZm9yIGxlZ2FjeSBzdXBwb3J0IG9mIEJhYmVsJ3NcbiAgICAgIC8vIGZ1bmN0aW9uLnNlbnQgaW1wbGVtZW50YXRpb24uXG4gICAgICB0aGlzLnNlbnQgPSB0aGlzLl9zZW50ID0gdW5kZWZpbmVkO1xuICAgICAgdGhpcy5kb25lID0gZmFsc2U7XG4gICAgICB0aGlzLmRlbGVnYXRlID0gbnVsbDtcblxuICAgICAgdGhpcy5tZXRob2QgPSBcIm5leHRcIjtcbiAgICAgIHRoaXMuYXJnID0gdW5kZWZpbmVkO1xuXG4gICAgICB0aGlzLnRyeUVudHJpZXMuZm9yRWFjaChyZXNldFRyeUVudHJ5KTtcblxuICAgICAgaWYgKCFza2lwVGVtcFJlc2V0KSB7XG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcykge1xuICAgICAgICAgIC8vIE5vdCBzdXJlIGFib3V0IHRoZSBvcHRpbWFsIG9yZGVyIG9mIHRoZXNlIGNvbmRpdGlvbnM6XG4gICAgICAgICAgaWYgKG5hbWUuY2hhckF0KDApID09PSBcInRcIiAmJlxuICAgICAgICAgICAgICBoYXNPd24uY2FsbCh0aGlzLCBuYW1lKSAmJlxuICAgICAgICAgICAgICAhaXNOYU4oK25hbWUuc2xpY2UoMSkpKSB7XG4gICAgICAgICAgICB0aGlzW25hbWVdID0gdW5kZWZpbmVkO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBzdG9wOiBmdW5jdGlvbigpIHtcbiAgICAgIHRoaXMuZG9uZSA9IHRydWU7XG5cbiAgICAgIHZhciByb290RW50cnkgPSB0aGlzLnRyeUVudHJpZXNbMF07XG4gICAgICB2YXIgcm9vdFJlY29yZCA9IHJvb3RFbnRyeS5jb21wbGV0aW9uO1xuICAgICAgaWYgKHJvb3RSZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgIHRocm93IHJvb3RSZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdGhpcy5ydmFsO1xuICAgIH0sXG5cbiAgICBkaXNwYXRjaEV4Y2VwdGlvbjogZnVuY3Rpb24oZXhjZXB0aW9uKSB7XG4gICAgICBpZiAodGhpcy5kb25lKSB7XG4gICAgICAgIHRocm93IGV4Y2VwdGlvbjtcbiAgICAgIH1cblxuICAgICAgdmFyIGNvbnRleHQgPSB0aGlzO1xuICAgICAgZnVuY3Rpb24gaGFuZGxlKGxvYywgY2F1Z2h0KSB7XG4gICAgICAgIHJlY29yZC50eXBlID0gXCJ0aHJvd1wiO1xuICAgICAgICByZWNvcmQuYXJnID0gZXhjZXB0aW9uO1xuICAgICAgICBjb250ZXh0Lm5leHQgPSBsb2M7XG5cbiAgICAgICAgaWYgKGNhdWdodCkge1xuICAgICAgICAgIC8vIElmIHRoZSBkaXNwYXRjaGVkIGV4Y2VwdGlvbiB3YXMgY2F1Z2h0IGJ5IGEgY2F0Y2ggYmxvY2ssXG4gICAgICAgICAgLy8gdGhlbiBsZXQgdGhhdCBjYXRjaCBibG9jayBoYW5kbGUgdGhlIGV4Y2VwdGlvbiBub3JtYWxseS5cbiAgICAgICAgICBjb250ZXh0Lm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICAgIGNvbnRleHQuYXJnID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuICEhIGNhdWdodDtcbiAgICAgIH1cblxuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuXG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IFwicm9vdFwiKSB7XG4gICAgICAgICAgLy8gRXhjZXB0aW9uIHRocm93biBvdXRzaWRlIG9mIGFueSB0cnkgYmxvY2sgdGhhdCBjb3VsZCBoYW5kbGVcbiAgICAgICAgICAvLyBpdCwgc28gc2V0IHRoZSBjb21wbGV0aW9uIHZhbHVlIG9mIHRoZSBlbnRpcmUgZnVuY3Rpb24gdG9cbiAgICAgICAgICAvLyB0aHJvdyB0aGUgZXhjZXB0aW9uLlxuICAgICAgICAgIHJldHVybiBoYW5kbGUoXCJlbmRcIik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldikge1xuICAgICAgICAgIHZhciBoYXNDYXRjaCA9IGhhc093bi5jYWxsKGVudHJ5LCBcImNhdGNoTG9jXCIpO1xuICAgICAgICAgIHZhciBoYXNGaW5hbGx5ID0gaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKTtcblxuICAgICAgICAgIGlmIChoYXNDYXRjaCAmJiBoYXNGaW5hbGx5KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wcmV2IDwgZW50cnkuY2F0Y2hMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5jYXRjaExvYywgdHJ1ZSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzQ2F0Y2gpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnByZXYgPCBlbnRyeS5jYXRjaExvYykge1xuICAgICAgICAgICAgICByZXR1cm4gaGFuZGxlKGVudHJ5LmNhdGNoTG9jLCB0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSBpZiAoaGFzRmluYWxseSkge1xuICAgICAgICAgICAgaWYgKHRoaXMucHJldiA8IGVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgICAgICAgcmV0dXJuIGhhbmRsZShlbnRyeS5maW5hbGx5TG9jKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJ0cnkgc3RhdGVtZW50IHdpdGhvdXQgY2F0Y2ggb3IgZmluYWxseVwiKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9LFxuXG4gICAgYWJydXB0OiBmdW5jdGlvbih0eXBlLCBhcmcpIHtcbiAgICAgIGZvciAodmFyIGkgPSB0aGlzLnRyeUVudHJpZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyAtLWkpIHtcbiAgICAgICAgdmFyIGVudHJ5ID0gdGhpcy50cnlFbnRyaWVzW2ldO1xuICAgICAgICBpZiAoZW50cnkudHJ5TG9jIDw9IHRoaXMucHJldiAmJlxuICAgICAgICAgICAgaGFzT3duLmNhbGwoZW50cnksIFwiZmluYWxseUxvY1wiKSAmJlxuICAgICAgICAgICAgdGhpcy5wcmV2IDwgZW50cnkuZmluYWxseUxvYykge1xuICAgICAgICAgIHZhciBmaW5hbGx5RW50cnkgPSBlbnRyeTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoZmluYWxseUVudHJ5ICYmXG4gICAgICAgICAgKHR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgICB0eXBlID09PSBcImNvbnRpbnVlXCIpICYmXG4gICAgICAgICAgZmluYWxseUVudHJ5LnRyeUxvYyA8PSBhcmcgJiZcbiAgICAgICAgICBhcmcgPD0gZmluYWxseUVudHJ5LmZpbmFsbHlMb2MpIHtcbiAgICAgICAgLy8gSWdub3JlIHRoZSBmaW5hbGx5IGVudHJ5IGlmIGNvbnRyb2wgaXMgbm90IGp1bXBpbmcgdG8gYVxuICAgICAgICAvLyBsb2NhdGlvbiBvdXRzaWRlIHRoZSB0cnkvY2F0Y2ggYmxvY2suXG4gICAgICAgIGZpbmFsbHlFbnRyeSA9IG51bGw7XG4gICAgICB9XG5cbiAgICAgIHZhciByZWNvcmQgPSBmaW5hbGx5RW50cnkgPyBmaW5hbGx5RW50cnkuY29tcGxldGlvbiA6IHt9O1xuICAgICAgcmVjb3JkLnR5cGUgPSB0eXBlO1xuICAgICAgcmVjb3JkLmFyZyA9IGFyZztcblxuICAgICAgaWYgKGZpbmFsbHlFbnRyeSkge1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwibmV4dFwiO1xuICAgICAgICB0aGlzLm5leHQgPSBmaW5hbGx5RW50cnkuZmluYWxseUxvYztcbiAgICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgICB9XG5cbiAgICAgIHJldHVybiB0aGlzLmNvbXBsZXRlKHJlY29yZCk7XG4gICAgfSxcblxuICAgIGNvbXBsZXRlOiBmdW5jdGlvbihyZWNvcmQsIGFmdGVyTG9jKSB7XG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwidGhyb3dcIikge1xuICAgICAgICB0aHJvdyByZWNvcmQuYXJnO1xuICAgICAgfVxuXG4gICAgICBpZiAocmVjb3JkLnR5cGUgPT09IFwiYnJlYWtcIiB8fFxuICAgICAgICAgIHJlY29yZC50eXBlID09PSBcImNvbnRpbnVlXCIpIHtcbiAgICAgICAgdGhpcy5uZXh0ID0gcmVjb3JkLmFyZztcbiAgICAgIH0gZWxzZSBpZiAocmVjb3JkLnR5cGUgPT09IFwicmV0dXJuXCIpIHtcbiAgICAgICAgdGhpcy5ydmFsID0gdGhpcy5hcmcgPSByZWNvcmQuYXJnO1xuICAgICAgICB0aGlzLm1ldGhvZCA9IFwicmV0dXJuXCI7XG4gICAgICAgIHRoaXMubmV4dCA9IFwiZW5kXCI7XG4gICAgICB9IGVsc2UgaWYgKHJlY29yZC50eXBlID09PSBcIm5vcm1hbFwiICYmIGFmdGVyTG9jKSB7XG4gICAgICAgIHRoaXMubmV4dCA9IGFmdGVyTG9jO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbihmaW5hbGx5TG9jKSB7XG4gICAgICBmb3IgKHZhciBpID0gdGhpcy50cnlFbnRyaWVzLmxlbmd0aCAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIHZhciBlbnRyeSA9IHRoaXMudHJ5RW50cmllc1tpXTtcbiAgICAgICAgaWYgKGVudHJ5LmZpbmFsbHlMb2MgPT09IGZpbmFsbHlMb2MpIHtcbiAgICAgICAgICB0aGlzLmNvbXBsZXRlKGVudHJ5LmNvbXBsZXRpb24sIGVudHJ5LmFmdGVyTG9jKTtcbiAgICAgICAgICByZXNldFRyeUVudHJ5KGVudHJ5KTtcbiAgICAgICAgICByZXR1cm4gQ29udGludWVTZW50aW5lbDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0sXG5cbiAgICBcImNhdGNoXCI6IGZ1bmN0aW9uKHRyeUxvYykge1xuICAgICAgZm9yICh2YXIgaSA9IHRoaXMudHJ5RW50cmllcy5sZW5ndGggLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgICB2YXIgZW50cnkgPSB0aGlzLnRyeUVudHJpZXNbaV07XG4gICAgICAgIGlmIChlbnRyeS50cnlMb2MgPT09IHRyeUxvYykge1xuICAgICAgICAgIHZhciByZWNvcmQgPSBlbnRyeS5jb21wbGV0aW9uO1xuICAgICAgICAgIGlmIChyZWNvcmQudHlwZSA9PT0gXCJ0aHJvd1wiKSB7XG4gICAgICAgICAgICB2YXIgdGhyb3duID0gcmVjb3JkLmFyZztcbiAgICAgICAgICAgIHJlc2V0VHJ5RW50cnkoZW50cnkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdGhyb3duO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIFRoZSBjb250ZXh0LmNhdGNoIG1ldGhvZCBtdXN0IG9ubHkgYmUgY2FsbGVkIHdpdGggYSBsb2NhdGlvblxuICAgICAgLy8gYXJndW1lbnQgdGhhdCBjb3JyZXNwb25kcyB0byBhIGtub3duIGNhdGNoIGJsb2NrLlxuICAgICAgdGhyb3cgbmV3IEVycm9yKFwiaWxsZWdhbCBjYXRjaCBhdHRlbXB0XCIpO1xuICAgIH0sXG5cbiAgICBkZWxlZ2F0ZVlpZWxkOiBmdW5jdGlvbihpdGVyYWJsZSwgcmVzdWx0TmFtZSwgbmV4dExvYykge1xuICAgICAgdGhpcy5kZWxlZ2F0ZSA9IHtcbiAgICAgICAgaXRlcmF0b3I6IHZhbHVlcyhpdGVyYWJsZSksXG4gICAgICAgIHJlc3VsdE5hbWU6IHJlc3VsdE5hbWUsXG4gICAgICAgIG5leHRMb2M6IG5leHRMb2NcbiAgICAgIH07XG5cbiAgICAgIGlmICh0aGlzLm1ldGhvZCA9PT0gXCJuZXh0XCIpIHtcbiAgICAgICAgLy8gRGVsaWJlcmF0ZWx5IGZvcmdldCB0aGUgbGFzdCBzZW50IHZhbHVlIHNvIHRoYXQgd2UgZG9uJ3RcbiAgICAgICAgLy8gYWNjaWRlbnRhbGx5IHBhc3MgaXQgb24gdG8gdGhlIGRlbGVnYXRlLlxuICAgICAgICB0aGlzLmFyZyA9IHVuZGVmaW5lZDtcbiAgICAgIH1cblxuICAgICAgcmV0dXJuIENvbnRpbnVlU2VudGluZWw7XG4gICAgfVxuICB9O1xufSkoXG4gIC8vIEFtb25nIHRoZSB2YXJpb3VzIHRyaWNrcyBmb3Igb2J0YWluaW5nIGEgcmVmZXJlbmNlIHRvIHRoZSBnbG9iYWxcbiAgLy8gb2JqZWN0LCB0aGlzIHNlZW1zIHRvIGJlIHRoZSBtb3N0IHJlbGlhYmxlIHRlY2huaXF1ZSB0aGF0IGRvZXMgbm90XG4gIC8vIHVzZSBpbmRpcmVjdCBldmFsICh3aGljaCB2aW9sYXRlcyBDb250ZW50IFNlY3VyaXR5IFBvbGljeSkuXG4gIHR5cGVvZiBnbG9iYWwgPT09IFwib2JqZWN0XCIgPyBnbG9iYWwgOlxuICB0eXBlb2Ygd2luZG93ID09PSBcIm9iamVjdFwiID8gd2luZG93IDpcbiAgdHlwZW9mIHNlbGYgPT09IFwib2JqZWN0XCIgPyBzZWxmIDogdGhpc1xuKTtcbiIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9yZXNlcnZlZC13b3JkcycpO1xuIiwidmFyIGFzc2VydCA9IHJlcXVpcmUoJ2Fzc2VydCcpO1xuXG4vKipcbiAqIFN0cnVjdHVyZSBmb3Igc3RvcmluZyBrZXl3b3Jkcy5cbiAqXG4gKiBAdHlwZWRlZiB7T2JqZWN0LjxTdHJpbmcsQm9vbGVhbj59IEtleXdvcmRzSGFzaFxuICovXG5cbi8qKlxuICogRUNNQVNjcmlwdCBkaWFsZWN0cy5cbiAqXG4gKiBAY29uc3RcbiAqIEB0eXBlIHtPYmplY3QuPFN0cmluZyxOdW1iZXJ8U3RyaW5nPn0gLSBrZXlzIGFzIHJlYWRhYmxlIG5hbWVzIGFuZCB2YWx1ZXMgYXMgdmVyc2lvbnNcbiAqL1xudmFyIERJQUxFQ1RTID0ge1xuICAgIGVzMzogMyxcbiAgICBlczU6IDUsXG4gICAgZXMyMDE1OiA2LFxuICAgIGVzNzogNyxcblxuICAgIC8vIGFsaWFzZXNcbiAgICBlczY6IDYsXG4gICAgJ2RlZmF1bHQnOiA1LFxuICAgIG5leHQ6IDZcbn07XG5cbi8qKlxuICogRUNNQVNjcmlwdCByZXNlcnZlZCB3b3Jkcy5cbiAqXG4gKiBAdHlwZSB7T2JqZWN0LjxTdHJpbmcsS2V5d29yZHNIYXNoPn1cbiAqL1xudmFyIEtFWVdPUkRTID0gZXhwb3J0cy5LRVlXT1JEUyA9IHt9O1xuXG4vKipcbiAqIENoZWNrIHdvcmQgZm9yIGJlaW5nIGFuIHJlc2VydmVkIHdvcmQuXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IHdvcmQgLSB3b3JkIHRvIGNoZWNrXG4gKiBAcGFyYW0ge1N0cmluZ3xOdW1iZXJ9IFtkaWFsZWN0XSAtIGRpYWxlY3Qgb3IgdmVyc2lvblxuICogQHBhcmFtIHtCb29sZWFufSBbc3RyaWN0XSAtIHN0cmljdCBtb2RlXG4gKiBAcmV0dXJucyB7P0Jvb2xlYW59XG4gKi9cbmV4cG9ydHMuY2hlY2sgPSBmdW5jdGlvbiBjaGVjayh3b3JkLCBkaWFsZWN0LCBzdHJpY3QpIHtcbiAgICBkaWFsZWN0ID0gZGlhbGVjdCB8fCBESUFMRUNUUy5kZWZhdWx0O1xuICAgIHZhciB2ZXJzaW9uID0gRElBTEVDVFNbZGlhbGVjdF0gfHwgZGlhbGVjdDtcblxuICAgIGlmIChzdHJpY3QgJiYgdmVyc2lvbiA+PSA1KSB7XG4gICAgICAgIHZlcnNpb24gKz0gJy1zdHJpY3QnO1xuICAgIH1cblxuICAgIGFzc2VydChLRVlXT1JEU1t2ZXJzaW9uXSwgJ1Vua25vd24gZGlhbGVjdCcpO1xuXG4gICAgcmV0dXJuIEtFWVdPUkRTW3ZlcnNpb25dLmhhc093blByb3BlcnR5KHdvcmQpO1xufTtcblxuLyoqXG4gKiBSZXNlcnZlZCBXb3JkcyBmb3IgRVMzXG4gKlxuICogRUNNQS0yNjIgM3JkOiA3LjUuMVxuICogaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL3B1YmxpY2F0aW9ucy9maWxlcy9FQ01BLVNULUFSQ0gvRUNNQS0yNjIsJTIwM3JkJTIwZWRpdGlvbiwlMjBEZWNlbWJlciUyMDE5OTkucGRmXG4gKlxuICogQHR5cGUge0tleXdvcmRzSGFzaH1cbiAqL1xuS0VZV09SRFNbJzMnXSA9IF9oYXNoKFxuICAgIC8vIEtleXdvcmQsIEVDTUEtMjYyIDNyZDogNy41LjJcbiAgICAnYnJlYWsgICAgZWxzZSAgICAgICBuZXcgICAgIHZhcicsXG4gICAgJ2Nhc2UgICAgIGZpbmFsbHkgICAgcmV0dXJuICB2b2lkJyxcbiAgICAnY2F0Y2ggICAgZm9yICAgICAgICBzd2l0Y2ggIHdoaWxlJyxcbiAgICAnY29udGludWUgZnVuY3Rpb24gICB0aGlzICAgIHdpdGgnLFxuICAgICdkZWZhdWx0ICBpZiAgICAgICAgIHRocm93JyxcbiAgICAnZGVsZXRlICAgaW4gICAgICAgICB0cnknLFxuICAgICdkbyAgICAgICBpbnN0YW5jZW9mIHR5cGVvZicsXG4gICAgLy8gRnV0dXJlUmVzZXJ2ZWRXb3JkLCBFQ01BLTI2MiAzcmQgNy41LjNcbiAgICAnYWJzdHJhY3QgZW51bSAgICAgICBpbnQgICAgICAgIHNob3J0JyxcbiAgICAnYm9vbGVhbiAgZXhwb3J0ICAgICBpbnRlcmZhY2UgIHN0YXRpYycsXG4gICAgJ2J5dGUgICAgIGV4dGVuZHMgICAgbG9uZyAgICAgICBzdXBlcicsXG4gICAgJ2NoYXIgICAgIGZpbmFsICAgICAgbmF0aXZlICAgICBzeW5jaHJvbml6ZWQnLFxuICAgICdjbGFzcyAgICBmbG9hdCAgICAgIHBhY2thZ2UgICAgdGhyb3dzJyxcbiAgICAnY29uc3QgICAgZ290byAgICAgICBwcml2YXRlICAgIHRyYW5zaWVudCcsXG4gICAgJ2RlYnVnZ2VyIGltcGxlbWVudHMgcHJvdGVjdGVkICB2b2xhdGlsZScsXG4gICAgJ2RvdWJsZSAgIGltcG9ydCAgICAgcHVibGljJyxcbiAgICAvLyBOdWxsTGl0ZXJhbCAmIEJvb2xlYW5MaXRlcmFsXG4gICAgJ251bGwgdHJ1ZSBmYWxzZSdcbik7XG5cbi8qKlxuICogUmVzZXJ2ZWQgV29yZHMgZm9yIEVTNS5cbiAqXG4gKiBodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDcuNi4xXG4gKlxuICogQHR5cGUge0tleXdvcmRzSGFzaH1cbiAqL1xuS0VZV09SRFNbJzUnXSA9IF9oYXNoKFxuICAgIC8vIEtleXdvcmRcbiAgICAnYnJlYWsgICAgZG8gICAgICAgaW5zdGFuY2VvZiB0eXBlb2YnLFxuICAgICdjYXNlICAgICBlbHNlICAgICBuZXcgICAgICAgIHZhcicsXG4gICAgJ2NhdGNoICAgIGZpbmFsbHkgIHJldHVybiAgICAgdm9pZCcsXG4gICAgJ2NvbnRpbnVlIGZvciAgICAgIHN3aXRjaCAgICAgd2hpbGUnLFxuICAgICdkZWJ1Z2dlciBmdW5jdGlvbiB0aGlzICAgICAgIHdpdGgnLFxuICAgICdkZWZhdWx0ICBpZiAgICAgICB0aHJvdycsXG4gICAgJ2RlbGV0ZSAgIGluICAgICAgIHRyeScsXG4gICAgLy8gRnV0dXJlUmVzZXJ2ZWRXb3JkXG4gICAgJ2NsYXNzIGVudW0gZXh0ZW5kcyBzdXBlcicsXG4gICAgJ2NvbnN0IGV4cG9ydCBpbXBvcnQnLFxuICAgIC8vIE51bGxMaXRlcmFsICYgQm9vbGVhbkxpdGVyYWxcbiAgICAnbnVsbCB0cnVlIGZhbHNlJ1xuKTtcblxuLyoqXG4gKiBSZXNlcnZlZCBXb3JkcyBmb3IgRVM1IGluIHN0cmljdCBtb2RlLlxuICpcbiAqIEB0eXBlIHtLZXl3b3Jkc0hhc2h9XG4gKi9cbktFWVdPUkRTWyc1LXN0cmljdCddID0gX2hhc2goXG4gICAgS0VZV09SRFNbJzUnXSxcbiAgICAvLyBGdXR1cmVSZXNlcnZlZFdvcmQsIHN0cmljdCBtb2RlLiBodHRwOi8vZXM1LmdpdGh1Yi5pby8jeDcuNi4xLjJcbiAgICAnaW1wbGVtZW50cyBsZXQgICAgIHByaXZhdGUgICBwdWJsaWMgeWllbGQnLFxuICAgICdpbnRlcmZhY2UgIHBhY2thZ2UgcHJvdGVjdGVkIHN0YXRpYydcbik7XG5cbi8qKlxuICogUmVzZXJ2ZWQgV29yZHMgZm9yIEVTNi5cbiAqXG4gKiAxMS42LjJcbiAqIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9lY21hLTI2Mi82LjAvaW5kZXguaHRtbCNzZWMtcmVzZXJ2ZWQtd29yZHNcbiAqXG4gKiBAdHlwZSB7S2V5d29yZHNIYXNofVxuICovXG5LRVlXT1JEU1snNiddID0gX2hhc2goXG4gICAgLy8gS2V5d29yZHMsIEVTNiAxMS42LjIuMSwgaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC9pbmRleC5odG1sI3NlYy1rZXl3b3Jkc1xuICAgICdicmVhayAgICBkbyAgICAgICBpbiAgICAgICAgIHR5cGVvZicsXG4gICAgJ2Nhc2UgICAgIGVsc2UgICAgIGluc3RhbmNlb2YgdmFyJyxcbiAgICAnY2F0Y2ggICAgZXhwb3J0ICAgbmV3ICAgICAgICB2b2lkJyxcbiAgICAnY2xhc3MgICAgZXh0ZW5kcyAgcmV0dXJuICAgICB3aGlsZScsXG4gICAgJ2NvbnN0ICAgIGZpbmFsbHkgIHN1cGVyICAgICAgd2l0aCcsXG4gICAgJ2NvbnRpbnVlIGZvciAgICAgIHN3aXRjaCAgICAgeWllbGQnLFxuICAgICdkZWJ1Z2dlciBmdW5jdGlvbiB0aGlzJyxcbiAgICAnZGVmYXVsdCAgaWYgICAgICAgdGhyb3cnLFxuICAgICdkZWxldGUgICBpbXBvcnQgICB0cnknLFxuICAgIC8vIEZ1dHVyZSBSZXNlcnZlZCBXb3JkcywgRVM2IDExLjYuMi4yXG4gICAgLy8gaHR0cDovL3d3dy5lY21hLWludGVybmF0aW9uYWwub3JnL2VjbWEtMjYyLzYuMC9pbmRleC5odG1sI3NlYy1mdXR1cmUtcmVzZXJ2ZWQtd29yZHNcbiAgICAnZW51bSBhd2FpdCcsXG4gICAgLy8gTnVsbExpdGVyYWwgJiBCb29sZWFuTGl0ZXJhbFxuICAgICdudWxsIHRydWUgZmFsc2UnXG4pO1xuXG4vKipcbiAqIFJlc2VydmVkIFdvcmRzIGZvciBFUzYgaW4gc3RyaWN0IG1vZGUuXG4gKlxuICogQHR5cGUge0tleXdvcmRzSGFzaH1cbiAqL1xuS0VZV09SRFNbJzYtc3RyaWN0J10gPSBfaGFzaChcbiAgICBLRVlXT1JEU1snNiddLFxuICAgIC8vIEtleXdvcmRzLCBFUzYgMTEuNi4yLjFcbiAgICAnbGV0IHN0YXRpYycsXG4gICAgLy8gRnV0dXJlIFJlc2VydmVkIFdvcmRzLCBFUzYgMTEuNi4yLjJcbiAgICAnaW1wbGVtZW50cyBwYWNrYWdlIHByb3RlY3RlZCcsXG4gICAgJ2ludGVyZmFjZSBwcml2YXRlIHB1YmxpYydcbik7XG5cbi8qKlxuICogR2VuZXJhdGVzIGhhc2ggZnJvbSBzdHJpbmdzXG4gKlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7Li4uU3RyaW5nfEtleXdvcmRzSGFzaH0ga2V5d29yZHMgLSBTcGFjZS1kZWxpbWl0ZWQgc3RyaW5nIG9yIHByZXZpb3VzIHJlc3VsdCBvZiBfaGFzaFxuICogQHJldHVybiB7S2V5d29yZHNIYXNofSAtIE9iamVjdCB3aXRoIGtleXdvcmRzIGluIGtleXMgYW5kIHRydWUgaW4gdmFsdWVzXG4gKi9cbmZ1bmN0aW9uIF9oYXNoKCkge1xuICAgIHZhciBzZXQgPSBBcnJheS5wcm90b3R5cGUubWFwLmNhbGwoYXJndW1lbnRzLCBmdW5jdGlvbih2KSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdiA9PT0gJ3N0cmluZycgPyB2IDogT2JqZWN0LmtleXModikuam9pbignICcpO1xuICAgIH0pLmpvaW4oJyAnKTtcblxuICAgIHJldHVybiBzZXQuc3BsaXQoL1xccysvKVxuICAgICAgICAucmVkdWNlKGZ1bmN0aW9uKHJlcywga2V5d29yZCkge1xuICAgICAgICAgICAgcmVzW2tleXdvcmRdID0gdHJ1ZTtcbiAgICAgICAgICAgIHJldHVybiByZXM7XG4gICAgICAgIH0sIHt9KTtcbn1cbiIsImV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IFNlbVZlclxuXG52YXIgZGVidWdcbi8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG5pZiAodHlwZW9mIHByb2Nlc3MgPT09ICdvYmplY3QnICYmXG4gICAgcHJvY2Vzcy5lbnYgJiZcbiAgICBwcm9jZXNzLmVudi5OT0RFX0RFQlVHICYmXG4gICAgL1xcYnNlbXZlclxcYi9pLnRlc3QocHJvY2Vzcy5lbnYuTk9ERV9ERUJVRykpIHtcbiAgZGVidWcgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDApXG4gICAgYXJncy51bnNoaWZ0KCdTRU1WRVInKVxuICAgIGNvbnNvbGUubG9nLmFwcGx5KGNvbnNvbGUsIGFyZ3MpXG4gIH1cbn0gZWxzZSB7XG4gIGRlYnVnID0gZnVuY3Rpb24gKCkge31cbn1cblxuLy8gTm90ZTogdGhpcyBpcyB0aGUgc2VtdmVyLm9yZyB2ZXJzaW9uIG9mIHRoZSBzcGVjIHRoYXQgaXQgaW1wbGVtZW50c1xuLy8gTm90IG5lY2Vzc2FyaWx5IHRoZSBwYWNrYWdlIHZlcnNpb24gb2YgdGhpcyBjb2RlLlxuZXhwb3J0cy5TRU1WRVJfU1BFQ19WRVJTSU9OID0gJzIuMC4wJ1xuXG52YXIgTUFYX0xFTkdUSCA9IDI1NlxudmFyIE1BWF9TQUZFX0lOVEVHRVIgPSBOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiB8fFxuICAvKiBpc3RhbmJ1bCBpZ25vcmUgbmV4dCAqLyA5MDA3MTk5MjU0NzQwOTkxXG5cbi8vIE1heCBzYWZlIHNlZ21lbnQgbGVuZ3RoIGZvciBjb2VyY2lvbi5cbnZhciBNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIID0gMTZcblxuLy8gVGhlIGFjdHVhbCByZWdleHBzIGdvIG9uIGV4cG9ydHMucmVcbnZhciByZSA9IGV4cG9ydHMucmUgPSBbXVxudmFyIHNyYyA9IGV4cG9ydHMuc3JjID0gW11cbnZhciB0ID0gZXhwb3J0cy50b2tlbnMgPSB7fVxudmFyIFIgPSAwXG5cbmZ1bmN0aW9uIHRvayAobikge1xuICB0W25dID0gUisrXG59XG5cbi8vIFRoZSBmb2xsb3dpbmcgUmVndWxhciBFeHByZXNzaW9ucyBjYW4gYmUgdXNlZCBmb3IgdG9rZW5pemluZyxcbi8vIHZhbGlkYXRpbmcsIGFuZCBwYXJzaW5nIFNlbVZlciB2ZXJzaW9uIHN0cmluZ3MuXG5cbi8vICMjIE51bWVyaWMgSWRlbnRpZmllclxuLy8gQSBzaW5nbGUgYDBgLCBvciBhIG5vbi16ZXJvIGRpZ2l0IGZvbGxvd2VkIGJ5IHplcm8gb3IgbW9yZSBkaWdpdHMuXG5cbnRvaygnTlVNRVJJQ0lERU5USUZJRVInKVxuc3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdID0gJzB8WzEtOV1cXFxcZConXG50b2soJ05VTUVSSUNJREVOVElGSUVSTE9PU0UnKVxuc3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV0gPSAnWzAtOV0rJ1xuXG4vLyAjIyBOb24tbnVtZXJpYyBJZGVudGlmaWVyXG4vLyBaZXJvIG9yIG1vcmUgZGlnaXRzLCBmb2xsb3dlZCBieSBhIGxldHRlciBvciBoeXBoZW4sIGFuZCB0aGVuIHplcm8gb3Jcbi8vIG1vcmUgbGV0dGVycywgZGlnaXRzLCBvciBoeXBoZW5zLlxuXG50b2soJ05PTk5VTUVSSUNJREVOVElGSUVSJylcbnNyY1t0Lk5PTk5VTUVSSUNJREVOVElGSUVSXSA9ICdcXFxcZCpbYS16QS1aLV1bYS16QS1aMC05LV0qJ1xuXG4vLyAjIyBNYWluIFZlcnNpb25cbi8vIFRocmVlIGRvdC1zZXBhcmF0ZWQgbnVtZXJpYyBpZGVudGlmaWVycy5cblxudG9rKCdNQUlOVkVSU0lPTicpXG5zcmNbdC5NQUlOVkVSU0lPTl0gPSAnKCcgKyBzcmNbdC5OVU1FUklDSURFTlRJRklFUl0gKyAnKVxcXFwuJyArXG4gICAgICAgICAgICAgICAgICAgJygnICsgc3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdICsgJylcXFxcLicgK1xuICAgICAgICAgICAgICAgICAgICcoJyArIHNyY1t0Lk5VTUVSSUNJREVOVElGSUVSXSArICcpJ1xuXG50b2soJ01BSU5WRVJTSU9OTE9PU0UnKVxuc3JjW3QuTUFJTlZFUlNJT05MT09TRV0gPSAnKCcgKyBzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXSArICcpXFxcXC4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcoJyArIHNyY1t0Lk5VTUVSSUNJREVOVElGSUVSTE9PU0VdICsgJylcXFxcLicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJygnICsgc3JjW3QuTlVNRVJJQ0lERU5USUZJRVJMT09TRV0gKyAnKSdcblxuLy8gIyMgUHJlLXJlbGVhc2UgVmVyc2lvbiBJZGVudGlmaWVyXG4vLyBBIG51bWVyaWMgaWRlbnRpZmllciwgb3IgYSBub24tbnVtZXJpYyBpZGVudGlmaWVyLlxuXG50b2soJ1BSRVJFTEVBU0VJREVOVElGSUVSJylcbnNyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSXSA9ICcoPzonICsgc3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfCcgKyBzcmNbdC5OT05OVU1FUklDSURFTlRJRklFUl0gKyAnKSdcblxudG9rKCdQUkVSRUxFQVNFSURFTlRJRklFUkxPT1NFJylcbnNyY1t0LlBSRVJFTEVBU0VJREVOVElGSUVSTE9PU0VdID0gJyg/OicgKyBzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnfCcgKyBzcmNbdC5OT05OVU1FUklDSURFTlRJRklFUl0gKyAnKSdcblxuLy8gIyMgUHJlLXJlbGVhc2UgVmVyc2lvblxuLy8gSHlwaGVuLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBkb3Qtc2VwYXJhdGVkIHByZS1yZWxlYXNlIHZlcnNpb25cbi8vIGlkZW50aWZpZXJzLlxuXG50b2soJ1BSRVJFTEVBU0UnKVxuc3JjW3QuUFJFUkVMRUFTRV0gPSAnKD86LSgnICsgc3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJdICtcbiAgICAgICAgICAgICAgICAgICcoPzpcXFxcLicgKyBzcmNbdC5QUkVSRUxFQVNFSURFTlRJRklFUl0gKyAnKSopKSdcblxudG9rKCdQUkVSRUxFQVNFTE9PU0UnKVxuc3JjW3QuUFJFUkVMRUFTRUxPT1NFXSA9ICcoPzotPygnICsgc3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJMT09TRV0gK1xuICAgICAgICAgICAgICAgICAgICAgICAnKD86XFxcXC4nICsgc3JjW3QuUFJFUkVMRUFTRUlERU5USUZJRVJMT09TRV0gKyAnKSopKSdcblxuLy8gIyMgQnVpbGQgTWV0YWRhdGEgSWRlbnRpZmllclxuLy8gQW55IGNvbWJpbmF0aW9uIG9mIGRpZ2l0cywgbGV0dGVycywgb3IgaHlwaGVucy5cblxudG9rKCdCVUlMRElERU5USUZJRVInKVxuc3JjW3QuQlVJTERJREVOVElGSUVSXSA9ICdbMC05QS1aYS16LV0rJ1xuXG4vLyAjIyBCdWlsZCBNZXRhZGF0YVxuLy8gUGx1cyBzaWduLCBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBwZXJpb2Qtc2VwYXJhdGVkIGJ1aWxkIG1ldGFkYXRhXG4vLyBpZGVudGlmaWVycy5cblxudG9rKCdCVUlMRCcpXG5zcmNbdC5CVUlMRF0gPSAnKD86XFxcXCsoJyArIHNyY1t0LkJVSUxESURFTlRJRklFUl0gK1xuICAgICAgICAgICAgICcoPzpcXFxcLicgKyBzcmNbdC5CVUlMRElERU5USUZJRVJdICsgJykqKSknXG5cbi8vICMjIEZ1bGwgVmVyc2lvbiBTdHJpbmdcbi8vIEEgbWFpbiB2ZXJzaW9uLCBmb2xsb3dlZCBvcHRpb25hbGx5IGJ5IGEgcHJlLXJlbGVhc2UgdmVyc2lvbiBhbmRcbi8vIGJ1aWxkIG1ldGFkYXRhLlxuXG4vLyBOb3RlIHRoYXQgdGhlIG9ubHkgbWFqb3IsIG1pbm9yLCBwYXRjaCwgYW5kIHByZS1yZWxlYXNlIHNlY3Rpb25zIG9mXG4vLyB0aGUgdmVyc2lvbiBzdHJpbmcgYXJlIGNhcHR1cmluZyBncm91cHMuICBUaGUgYnVpbGQgbWV0YWRhdGEgaXMgbm90IGFcbi8vIGNhcHR1cmluZyBncm91cCwgYmVjYXVzZSBpdCBzaG91bGQgbm90IGV2ZXIgYmUgdXNlZCBpbiB2ZXJzaW9uXG4vLyBjb21wYXJpc29uLlxuXG50b2soJ0ZVTEwnKVxudG9rKCdGVUxMUExBSU4nKVxuc3JjW3QuRlVMTFBMQUlOXSA9ICd2PycgKyBzcmNbdC5NQUlOVkVSU0lPTl0gK1xuICAgICAgICAgICAgICAgICAgc3JjW3QuUFJFUkVMRUFTRV0gKyAnPycgK1xuICAgICAgICAgICAgICAgICAgc3JjW3QuQlVJTERdICsgJz8nXG5cbnNyY1t0LkZVTExdID0gJ14nICsgc3JjW3QuRlVMTFBMQUlOXSArICckJ1xuXG4vLyBsaWtlIGZ1bGwsIGJ1dCBhbGxvd3MgdjEuMi4zIGFuZCA9MS4yLjMsIHdoaWNoIHBlb3BsZSBkbyBzb21ldGltZXMuXG4vLyBhbHNvLCAxLjAuMGFscGhhMSAocHJlcmVsZWFzZSB3aXRob3V0IHRoZSBoeXBoZW4pIHdoaWNoIGlzIHByZXR0eVxuLy8gY29tbW9uIGluIHRoZSBucG0gcmVnaXN0cnkuXG50b2soJ0xPT1NFUExBSU4nKVxuc3JjW3QuTE9PU0VQTEFJTl0gPSAnW3Y9XFxcXHNdKicgKyBzcmNbdC5NQUlOVkVSU0lPTkxPT1NFXSArXG4gICAgICAgICAgICAgICAgICBzcmNbdC5QUkVSRUxFQVNFTE9PU0VdICsgJz8nICtcbiAgICAgICAgICAgICAgICAgIHNyY1t0LkJVSUxEXSArICc/J1xuXG50b2soJ0xPT1NFJylcbnNyY1t0LkxPT1NFXSA9ICdeJyArIHNyY1t0LkxPT1NFUExBSU5dICsgJyQnXG5cbnRvaygnR1RMVCcpXG5zcmNbdC5HVExUXSA9ICcoKD86PHw+KT89PyknXG5cbi8vIFNvbWV0aGluZyBsaWtlIFwiMi4qXCIgb3IgXCIxLjIueFwiLlxuLy8gTm90ZSB0aGF0IFwieC54XCIgaXMgYSB2YWxpZCB4UmFuZ2UgaWRlbnRpZmVyLCBtZWFuaW5nIFwiYW55IHZlcnNpb25cIlxuLy8gT25seSB0aGUgZmlyc3QgaXRlbSBpcyBzdHJpY3RseSByZXF1aXJlZC5cbnRvaygnWFJBTkdFSURFTlRJRklFUkxPT1NFJylcbnNyY1t0LlhSQU5HRUlERU5USUZJRVJMT09TRV0gPSBzcmNbdC5OVU1FUklDSURFTlRJRklFUkxPT1NFXSArICd8eHxYfFxcXFwqJ1xudG9rKCdYUkFOR0VJREVOVElGSUVSJylcbnNyY1t0LlhSQU5HRUlERU5USUZJRVJdID0gc3JjW3QuTlVNRVJJQ0lERU5USUZJRVJdICsgJ3x4fFh8XFxcXConXG5cbnRvaygnWFJBTkdFUExBSU4nKVxuc3JjW3QuWFJBTkdFUExBSU5dID0gJ1t2PVxcXFxzXSooJyArIHNyY1t0LlhSQU5HRUlERU5USUZJRVJdICsgJyknICtcbiAgICAgICAgICAgICAgICAgICAnKD86XFxcXC4oJyArIHNyY1t0LlhSQU5HRUlERU5USUZJRVJdICsgJyknICtcbiAgICAgICAgICAgICAgICAgICAnKD86XFxcXC4oJyArIHNyY1t0LlhSQU5HRUlERU5USUZJRVJdICsgJyknICtcbiAgICAgICAgICAgICAgICAgICAnKD86JyArIHNyY1t0LlBSRVJFTEVBU0VdICsgJyk/JyArXG4gICAgICAgICAgICAgICAgICAgc3JjW3QuQlVJTERdICsgJz8nICtcbiAgICAgICAgICAgICAgICAgICAnKT8pPydcblxudG9rKCdYUkFOR0VQTEFJTkxPT1NFJylcbnNyY1t0LlhSQU5HRVBMQUlOTE9PU0VdID0gJ1t2PVxcXFxzXSooJyArIHNyY1t0LlhSQU5HRUlERU5USUZJRVJMT09TRV0gKyAnKScgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJyg/OlxcXFwuKCcgKyBzcmNbdC5YUkFOR0VJREVOVElGSUVSTE9PU0VdICsgJyknICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcoPzpcXFxcLignICsgc3JjW3QuWFJBTkdFSURFTlRJRklFUkxPT1NFXSArICcpJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnKD86JyArIHNyY1t0LlBSRVJFTEVBU0VMT09TRV0gKyAnKT8nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNyY1t0LkJVSUxEXSArICc/JyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnKT8pPydcblxudG9rKCdYUkFOR0UnKVxuc3JjW3QuWFJBTkdFXSA9ICdeJyArIHNyY1t0LkdUTFRdICsgJ1xcXFxzKicgKyBzcmNbdC5YUkFOR0VQTEFJTl0gKyAnJCdcbnRvaygnWFJBTkdFTE9PU0UnKVxuc3JjW3QuWFJBTkdFTE9PU0VdID0gJ14nICsgc3JjW3QuR1RMVF0gKyAnXFxcXHMqJyArIHNyY1t0LlhSQU5HRVBMQUlOTE9PU0VdICsgJyQnXG5cbi8vIENvZXJjaW9uLlxuLy8gRXh0cmFjdCBhbnl0aGluZyB0aGF0IGNvdWxkIGNvbmNlaXZhYmx5IGJlIGEgcGFydCBvZiBhIHZhbGlkIHNlbXZlclxudG9rKCdDT0VSQ0UnKVxuc3JjW3QuQ09FUkNFXSA9ICcoXnxbXlxcXFxkXSknICtcbiAgICAgICAgICAgICAgJyhcXFxcZHsxLCcgKyBNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIICsgJ30pJyArXG4gICAgICAgICAgICAgICcoPzpcXFxcLihcXFxcZHsxLCcgKyBNQVhfU0FGRV9DT01QT05FTlRfTEVOR1RIICsgJ30pKT8nICtcbiAgICAgICAgICAgICAgJyg/OlxcXFwuKFxcXFxkezEsJyArIE1BWF9TQUZFX0NPTVBPTkVOVF9MRU5HVEggKyAnfSkpPycgK1xuICAgICAgICAgICAgICAnKD86JHxbXlxcXFxkXSknXG50b2soJ0NPRVJDRVJUTCcpXG5yZVt0LkNPRVJDRVJUTF0gPSBuZXcgUmVnRXhwKHNyY1t0LkNPRVJDRV0sICdnJylcblxuLy8gVGlsZGUgcmFuZ2VzLlxuLy8gTWVhbmluZyBpcyBcInJlYXNvbmFibHkgYXQgb3IgZ3JlYXRlciB0aGFuXCJcbnRvaygnTE9ORVRJTERFJylcbnNyY1t0LkxPTkVUSUxERV0gPSAnKD86fj4/KSdcblxudG9rKCdUSUxERVRSSU0nKVxuc3JjW3QuVElMREVUUklNXSA9ICcoXFxcXHMqKScgKyBzcmNbdC5MT05FVElMREVdICsgJ1xcXFxzKydcbnJlW3QuVElMREVUUklNXSA9IG5ldyBSZWdFeHAoc3JjW3QuVElMREVUUklNXSwgJ2cnKVxudmFyIHRpbGRlVHJpbVJlcGxhY2UgPSAnJDF+J1xuXG50b2soJ1RJTERFJylcbnNyY1t0LlRJTERFXSA9ICdeJyArIHNyY1t0LkxPTkVUSUxERV0gKyBzcmNbdC5YUkFOR0VQTEFJTl0gKyAnJCdcbnRvaygnVElMREVMT09TRScpXG5zcmNbdC5USUxERUxPT1NFXSA9ICdeJyArIHNyY1t0LkxPTkVUSUxERV0gKyBzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXSArICckJ1xuXG4vLyBDYXJldCByYW5nZXMuXG4vLyBNZWFuaW5nIGlzIFwiYXQgbGVhc3QgYW5kIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdpdGhcIlxudG9rKCdMT05FQ0FSRVQnKVxuc3JjW3QuTE9ORUNBUkVUXSA9ICcoPzpcXFxcXiknXG5cbnRvaygnQ0FSRVRUUklNJylcbnNyY1t0LkNBUkVUVFJJTV0gPSAnKFxcXFxzKiknICsgc3JjW3QuTE9ORUNBUkVUXSArICdcXFxccysnXG5yZVt0LkNBUkVUVFJJTV0gPSBuZXcgUmVnRXhwKHNyY1t0LkNBUkVUVFJJTV0sICdnJylcbnZhciBjYXJldFRyaW1SZXBsYWNlID0gJyQxXidcblxudG9rKCdDQVJFVCcpXG5zcmNbdC5DQVJFVF0gPSAnXicgKyBzcmNbdC5MT05FQ0FSRVRdICsgc3JjW3QuWFJBTkdFUExBSU5dICsgJyQnXG50b2soJ0NBUkVUTE9PU0UnKVxuc3JjW3QuQ0FSRVRMT09TRV0gPSAnXicgKyBzcmNbdC5MT05FQ0FSRVRdICsgc3JjW3QuWFJBTkdFUExBSU5MT09TRV0gKyAnJCdcblxuLy8gQSBzaW1wbGUgZ3QvbHQvZXEgdGhpbmcsIG9yIGp1c3QgXCJcIiB0byBpbmRpY2F0ZSBcImFueSB2ZXJzaW9uXCJcbnRvaygnQ09NUEFSQVRPUkxPT1NFJylcbnNyY1t0LkNPTVBBUkFUT1JMT09TRV0gPSAnXicgKyBzcmNbdC5HVExUXSArICdcXFxccyooJyArIHNyY1t0LkxPT1NFUExBSU5dICsgJykkfF4kJ1xudG9rKCdDT01QQVJBVE9SJylcbnNyY1t0LkNPTVBBUkFUT1JdID0gJ14nICsgc3JjW3QuR1RMVF0gKyAnXFxcXHMqKCcgKyBzcmNbdC5GVUxMUExBSU5dICsgJykkfF4kJ1xuXG4vLyBBbiBleHByZXNzaW9uIHRvIHN0cmlwIGFueSB3aGl0ZXNwYWNlIGJldHdlZW4gdGhlIGd0bHQgYW5kIHRoZSB0aGluZ1xuLy8gaXQgbW9kaWZpZXMsIHNvIHRoYXQgYD4gMS4yLjNgID09PiBgPjEuMi4zYFxudG9rKCdDT01QQVJBVE9SVFJJTScpXG5zcmNbdC5DT01QQVJBVE9SVFJJTV0gPSAnKFxcXFxzKiknICsgc3JjW3QuR1RMVF0gK1xuICAgICAgICAgICAgICAgICAgICAgICdcXFxccyooJyArIHNyY1t0LkxPT1NFUExBSU5dICsgJ3wnICsgc3JjW3QuWFJBTkdFUExBSU5dICsgJyknXG5cbi8vIHRoaXMgb25lIGhhcyB0byB1c2UgdGhlIC9nIGZsYWdcbnJlW3QuQ09NUEFSQVRPUlRSSU1dID0gbmV3IFJlZ0V4cChzcmNbdC5DT01QQVJBVE9SVFJJTV0sICdnJylcbnZhciBjb21wYXJhdG9yVHJpbVJlcGxhY2UgPSAnJDEkMiQzJ1xuXG4vLyBTb21ldGhpbmcgbGlrZSBgMS4yLjMgLSAxLjIuNGBcbi8vIE5vdGUgdGhhdCB0aGVzZSBhbGwgdXNlIHRoZSBsb29zZSBmb3JtLCBiZWNhdXNlIHRoZXknbGwgYmVcbi8vIGNoZWNrZWQgYWdhaW5zdCBlaXRoZXIgdGhlIHN0cmljdCBvciBsb29zZSBjb21wYXJhdG9yIGZvcm1cbi8vIGxhdGVyLlxudG9rKCdIWVBIRU5SQU5HRScpXG5zcmNbdC5IWVBIRU5SQU5HRV0gPSAnXlxcXFxzKignICsgc3JjW3QuWFJBTkdFUExBSU5dICsgJyknICtcbiAgICAgICAgICAgICAgICAgICAnXFxcXHMrLVxcXFxzKycgK1xuICAgICAgICAgICAgICAgICAgICcoJyArIHNyY1t0LlhSQU5HRVBMQUlOXSArICcpJyArXG4gICAgICAgICAgICAgICAgICAgJ1xcXFxzKiQnXG5cbnRvaygnSFlQSEVOUkFOR0VMT09TRScpXG5zcmNbdC5IWVBIRU5SQU5HRUxPT1NFXSA9ICdeXFxcXHMqKCcgKyBzcmNbdC5YUkFOR0VQTEFJTkxPT1NFXSArICcpJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXFxcXHMrLVxcXFxzKycgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJygnICsgc3JjW3QuWFJBTkdFUExBSU5MT09TRV0gKyAnKScgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1xcXFxzKiQnXG5cbi8vIFN0YXIgcmFuZ2VzIGJhc2ljYWxseSBqdXN0IGFsbG93IGFueXRoaW5nIGF0IGFsbC5cbnRvaygnU1RBUicpXG5zcmNbdC5TVEFSXSA9ICcoPHw+KT89P1xcXFxzKlxcXFwqJ1xuXG4vLyBDb21waWxlIHRvIGFjdHVhbCByZWdleHAgb2JqZWN0cy5cbi8vIEFsbCBhcmUgZmxhZy1mcmVlLCB1bmxlc3MgdGhleSB3ZXJlIGNyZWF0ZWQgYWJvdmUgd2l0aCBhIGZsYWcuXG5mb3IgKHZhciBpID0gMDsgaSA8IFI7IGkrKykge1xuICBkZWJ1ZyhpLCBzcmNbaV0pXG4gIGlmICghcmVbaV0pIHtcbiAgICByZVtpXSA9IG5ldyBSZWdFeHAoc3JjW2ldKVxuICB9XG59XG5cbmV4cG9ydHMucGFyc2UgPSBwYXJzZVxuZnVuY3Rpb24gcGFyc2UgKHZlcnNpb24sIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zIHx8IHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICBsb29zZTogISFvcHRpb25zLFxuICAgICAgaW5jbHVkZVByZXJlbGVhc2U6IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgaWYgKHZlcnNpb24gaW5zdGFuY2VvZiBTZW1WZXIpIHtcbiAgICByZXR1cm4gdmVyc2lvblxuICB9XG5cbiAgaWYgKHR5cGVvZiB2ZXJzaW9uICE9PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICBpZiAodmVyc2lvbi5sZW5ndGggPiBNQVhfTEVOR1RIKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHZhciByID0gb3B0aW9ucy5sb29zZSA/IHJlW3QuTE9PU0VdIDogcmVbdC5GVUxMXVxuICBpZiAoIXIudGVzdCh2ZXJzaW9uKSkge1xuICAgIHJldHVybiBudWxsXG4gIH1cblxuICB0cnkge1xuICAgIHJldHVybiBuZXcgU2VtVmVyKHZlcnNpb24sIG9wdGlvbnMpXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG5leHBvcnRzLnZhbGlkID0gdmFsaWRcbmZ1bmN0aW9uIHZhbGlkICh2ZXJzaW9uLCBvcHRpb25zKSB7XG4gIHZhciB2ID0gcGFyc2UodmVyc2lvbiwgb3B0aW9ucylcbiAgcmV0dXJuIHYgPyB2LnZlcnNpb24gOiBudWxsXG59XG5cbmV4cG9ydHMuY2xlYW4gPSBjbGVhblxuZnVuY3Rpb24gY2xlYW4gKHZlcnNpb24sIG9wdGlvbnMpIHtcbiAgdmFyIHMgPSBwYXJzZSh2ZXJzaW9uLnRyaW0oKS5yZXBsYWNlKC9eWz12XSsvLCAnJyksIG9wdGlvbnMpXG4gIHJldHVybiBzID8gcy52ZXJzaW9uIDogbnVsbFxufVxuXG5leHBvcnRzLlNlbVZlciA9IFNlbVZlclxuXG5mdW5jdGlvbiBTZW1WZXIgKHZlcnNpb24sIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zIHx8IHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICBsb29zZTogISFvcHRpb25zLFxuICAgICAgaW5jbHVkZVByZXJlbGVhc2U6IGZhbHNlXG4gICAgfVxuICB9XG4gIGlmICh2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyKSB7XG4gICAgaWYgKHZlcnNpb24ubG9vc2UgPT09IG9wdGlvbnMubG9vc2UpIHtcbiAgICAgIHJldHVybiB2ZXJzaW9uXG4gICAgfSBlbHNlIHtcbiAgICAgIHZlcnNpb24gPSB2ZXJzaW9uLnZlcnNpb25cbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBWZXJzaW9uOiAnICsgdmVyc2lvbilcbiAgfVxuXG4gIGlmICh2ZXJzaW9uLmxlbmd0aCA+IE1BWF9MRU5HVEgpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2ZXJzaW9uIGlzIGxvbmdlciB0aGFuICcgKyBNQVhfTEVOR1RIICsgJyBjaGFyYWN0ZXJzJylcbiAgfVxuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBTZW1WZXIpKSB7XG4gICAgcmV0dXJuIG5ldyBTZW1WZXIodmVyc2lvbiwgb3B0aW9ucylcbiAgfVxuXG4gIGRlYnVnKCdTZW1WZXInLCB2ZXJzaW9uLCBvcHRpb25zKVxuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gIHRoaXMubG9vc2UgPSAhIW9wdGlvbnMubG9vc2VcblxuICB2YXIgbSA9IHZlcnNpb24udHJpbSgpLm1hdGNoKG9wdGlvbnMubG9vc2UgPyByZVt0LkxPT1NFXSA6IHJlW3QuRlVMTF0pXG5cbiAgaWYgKCFtKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBWZXJzaW9uOiAnICsgdmVyc2lvbilcbiAgfVxuXG4gIHRoaXMucmF3ID0gdmVyc2lvblxuXG4gIC8vIHRoZXNlIGFyZSBhY3R1YWxseSBudW1iZXJzXG4gIHRoaXMubWFqb3IgPSArbVsxXVxuICB0aGlzLm1pbm9yID0gK21bMl1cbiAgdGhpcy5wYXRjaCA9ICttWzNdXG5cbiAgaWYgKHRoaXMubWFqb3IgPiBNQVhfU0FGRV9JTlRFR0VSIHx8IHRoaXMubWFqb3IgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBtYWpvciB2ZXJzaW9uJylcbiAgfVxuXG4gIGlmICh0aGlzLm1pbm9yID4gTUFYX1NBRkVfSU5URUdFUiB8fCB0aGlzLm1pbm9yIDwgMCkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbWlub3IgdmVyc2lvbicpXG4gIH1cblxuICBpZiAodGhpcy5wYXRjaCA+IE1BWF9TQUZFX0lOVEVHRVIgfHwgdGhpcy5wYXRjaCA8IDApIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIHBhdGNoIHZlcnNpb24nKVxuICB9XG5cbiAgLy8gbnVtYmVyaWZ5IGFueSBwcmVyZWxlYXNlIG51bWVyaWMgaWRzXG4gIGlmICghbVs0XSkge1xuICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gIH0gZWxzZSB7XG4gICAgdGhpcy5wcmVyZWxlYXNlID0gbVs0XS5zcGxpdCgnLicpLm1hcChmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGlmICgvXlswLTldKyQvLnRlc3QoaWQpKSB7XG4gICAgICAgIHZhciBudW0gPSAraWRcbiAgICAgICAgaWYgKG51bSA+PSAwICYmIG51bSA8IE1BWF9TQUZFX0lOVEVHRVIpIHtcbiAgICAgICAgICByZXR1cm4gbnVtXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIHJldHVybiBpZFxuICAgIH0pXG4gIH1cblxuICB0aGlzLmJ1aWxkID0gbVs1XSA/IG1bNV0uc3BsaXQoJy4nKSA6IFtdXG4gIHRoaXMuZm9ybWF0KClcbn1cblxuU2VtVmVyLnByb3RvdHlwZS5mb3JtYXQgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMudmVyc2lvbiA9IHRoaXMubWFqb3IgKyAnLicgKyB0aGlzLm1pbm9yICsgJy4nICsgdGhpcy5wYXRjaFxuICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgIHRoaXMudmVyc2lvbiArPSAnLScgKyB0aGlzLnByZXJlbGVhc2Uuam9pbignLicpXG4gIH1cbiAgcmV0dXJuIHRoaXMudmVyc2lvblxufVxuXG5TZW1WZXIucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdGhpcy52ZXJzaW9uXG59XG5cblNlbVZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIChvdGhlcikge1xuICBkZWJ1ZygnU2VtVmVyLmNvbXBhcmUnLCB0aGlzLnZlcnNpb24sIHRoaXMub3B0aW9ucywgb3RoZXIpXG4gIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSkge1xuICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICB9XG5cbiAgcmV0dXJuIHRoaXMuY29tcGFyZU1haW4ob3RoZXIpIHx8IHRoaXMuY29tcGFyZVByZShvdGhlcilcbn1cblxuU2VtVmVyLnByb3RvdHlwZS5jb21wYXJlTWFpbiA9IGZ1bmN0aW9uIChvdGhlcikge1xuICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgfVxuXG4gIHJldHVybiBjb21wYXJlSWRlbnRpZmllcnModGhpcy5tYWpvciwgb3RoZXIubWFqb3IpIHx8XG4gICAgICAgICBjb21wYXJlSWRlbnRpZmllcnModGhpcy5taW5vciwgb3RoZXIubWlub3IpIHx8XG4gICAgICAgICBjb21wYXJlSWRlbnRpZmllcnModGhpcy5wYXRjaCwgb3RoZXIucGF0Y2gpXG59XG5cblNlbVZlci5wcm90b3R5cGUuY29tcGFyZVByZSA9IGZ1bmN0aW9uIChvdGhlcikge1xuICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIFNlbVZlcikpIHtcbiAgICBvdGhlciA9IG5ldyBTZW1WZXIob3RoZXIsIHRoaXMub3B0aW9ucylcbiAgfVxuXG4gIC8vIE5PVCBoYXZpbmcgYSBwcmVyZWxlYXNlIGlzID4gaGF2aW5nIG9uZVxuICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiAhb3RoZXIucHJlcmVsZWFzZS5sZW5ndGgpIHtcbiAgICByZXR1cm4gLTFcbiAgfSBlbHNlIGlmICghdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCAmJiBvdGhlci5wcmVyZWxlYXNlLmxlbmd0aCkge1xuICAgIHJldHVybiAxXG4gIH0gZWxzZSBpZiAoIXRoaXMucHJlcmVsZWFzZS5sZW5ndGggJiYgIW90aGVyLnByZXJlbGVhc2UubGVuZ3RoKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuXG4gIHZhciBpID0gMFxuICBkbyB7XG4gICAgdmFyIGEgPSB0aGlzLnByZXJlbGVhc2VbaV1cbiAgICB2YXIgYiA9IG90aGVyLnByZXJlbGVhc2VbaV1cbiAgICBkZWJ1ZygncHJlcmVsZWFzZSBjb21wYXJlJywgaSwgYSwgYilcbiAgICBpZiAoYSA9PT0gdW5kZWZpbmVkICYmIGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIDBcbiAgICB9IGVsc2UgaWYgKGIgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIDFcbiAgICB9IGVsc2UgaWYgKGEgPT09IHVuZGVmaW5lZCkge1xuICAgICAgcmV0dXJuIC0xXG4gICAgfSBlbHNlIGlmIChhID09PSBiKSB7XG4gICAgICBjb250aW51ZVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY29tcGFyZUlkZW50aWZpZXJzKGEsIGIpXG4gICAgfVxuICB9IHdoaWxlICgrK2kpXG59XG5cblNlbVZlci5wcm90b3R5cGUuY29tcGFyZUJ1aWxkID0gZnVuY3Rpb24gKG90aGVyKSB7XG4gIGlmICghKG90aGVyIGluc3RhbmNlb2YgU2VtVmVyKSkge1xuICAgIG90aGVyID0gbmV3IFNlbVZlcihvdGhlciwgdGhpcy5vcHRpb25zKVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIGRvIHtcbiAgICB2YXIgYSA9IHRoaXMuYnVpbGRbaV1cbiAgICB2YXIgYiA9IG90aGVyLmJ1aWxkW2ldXG4gICAgZGVidWcoJ3ByZXJlbGVhc2UgY29tcGFyZScsIGksIGEsIGIpXG4gICAgaWYgKGEgPT09IHVuZGVmaW5lZCAmJiBiID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAwXG4gICAgfSBlbHNlIGlmIChiID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAxXG4gICAgfSBlbHNlIGlmIChhID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH0gZWxzZSBpZiAoYSA9PT0gYikge1xuICAgICAgY29udGludWVcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGNvbXBhcmVJZGVudGlmaWVycyhhLCBiKVxuICAgIH1cbiAgfSB3aGlsZSAoKytpKVxufVxuXG4vLyBwcmVtaW5vciB3aWxsIGJ1bXAgdGhlIHZlcnNpb24gdXAgdG8gdGhlIG5leHQgbWlub3IgcmVsZWFzZSwgYW5kIGltbWVkaWF0ZWx5XG4vLyBkb3duIHRvIHByZS1yZWxlYXNlLiBwcmVtYWpvciBhbmQgcHJlcGF0Y2ggd29yayB0aGUgc2FtZSB3YXkuXG5TZW1WZXIucHJvdG90eXBlLmluYyA9IGZ1bmN0aW9uIChyZWxlYXNlLCBpZGVudGlmaWVyKSB7XG4gIHN3aXRjaCAocmVsZWFzZSkge1xuICAgIGNhc2UgJ3ByZW1ham9yJzpcbiAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwXG4gICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgdGhpcy5taW5vciA9IDBcbiAgICAgIHRoaXMubWFqb3IrK1xuICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIpXG4gICAgICBicmVha1xuICAgIGNhc2UgJ3ByZW1pbm9yJzpcbiAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPSAwXG4gICAgICB0aGlzLnBhdGNoID0gMFxuICAgICAgdGhpcy5taW5vcisrXG4gICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllcilcbiAgICAgIGJyZWFrXG4gICAgY2FzZSAncHJlcGF0Y2gnOlxuICAgICAgLy8gSWYgdGhpcyBpcyBhbHJlYWR5IGEgcHJlcmVsZWFzZSwgaXQgd2lsbCBidW1wIHRvIHRoZSBuZXh0IHZlcnNpb25cbiAgICAgIC8vIGRyb3AgYW55IHByZXJlbGVhc2VzIHRoYXQgbWlnaHQgYWxyZWFkeSBleGlzdCwgc2luY2UgdGhleSBhcmUgbm90XG4gICAgICAvLyByZWxldmFudCBhdCB0aGlzIHBvaW50LlxuICAgICAgdGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9IDBcbiAgICAgIHRoaXMuaW5jKCdwYXRjaCcsIGlkZW50aWZpZXIpXG4gICAgICB0aGlzLmluYygncHJlJywgaWRlbnRpZmllcilcbiAgICAgIGJyZWFrXG4gICAgLy8gSWYgdGhlIGlucHV0IGlzIGEgbm9uLXByZXJlbGVhc2UgdmVyc2lvbiwgdGhpcyBhY3RzIHRoZSBzYW1lIGFzXG4gICAgLy8gcHJlcGF0Y2guXG4gICAgY2FzZSAncHJlcmVsZWFzZSc6XG4gICAgICBpZiAodGhpcy5wcmVyZWxlYXNlLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICB0aGlzLmluYygncGF0Y2gnLCBpZGVudGlmaWVyKVxuICAgICAgfVxuICAgICAgdGhpcy5pbmMoJ3ByZScsIGlkZW50aWZpZXIpXG4gICAgICBicmVha1xuXG4gICAgY2FzZSAnbWFqb3InOlxuICAgICAgLy8gSWYgdGhpcyBpcyBhIHByZS1tYWpvciB2ZXJzaW9uLCBidW1wIHVwIHRvIHRoZSBzYW1lIG1ham9yIHZlcnNpb24uXG4gICAgICAvLyBPdGhlcndpc2UgaW5jcmVtZW50IG1ham9yLlxuICAgICAgLy8gMS4wLjAtNSBidW1wcyB0byAxLjAuMFxuICAgICAgLy8gMS4xLjAgYnVtcHMgdG8gMi4wLjBcbiAgICAgIGlmICh0aGlzLm1pbm9yICE9PSAwIHx8XG4gICAgICAgICAgdGhpcy5wYXRjaCAhPT0gMCB8fFxuICAgICAgICAgIHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5tYWpvcisrXG4gICAgICB9XG4gICAgICB0aGlzLm1pbm9yID0gMFxuICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgICBicmVha1xuICAgIGNhc2UgJ21pbm9yJzpcbiAgICAgIC8vIElmIHRoaXMgaXMgYSBwcmUtbWlub3IgdmVyc2lvbiwgYnVtcCB1cCB0byB0aGUgc2FtZSBtaW5vciB2ZXJzaW9uLlxuICAgICAgLy8gT3RoZXJ3aXNlIGluY3JlbWVudCBtaW5vci5cbiAgICAgIC8vIDEuMi4wLTUgYnVtcHMgdG8gMS4yLjBcbiAgICAgIC8vIDEuMi4xIGJ1bXBzIHRvIDEuMy4wXG4gICAgICBpZiAodGhpcy5wYXRjaCAhPT0gMCB8fCB0aGlzLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHRoaXMubWlub3IrK1xuICAgICAgfVxuICAgICAgdGhpcy5wYXRjaCA9IDBcbiAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtdXG4gICAgICBicmVha1xuICAgIGNhc2UgJ3BhdGNoJzpcbiAgICAgIC8vIElmIHRoaXMgaXMgbm90IGEgcHJlLXJlbGVhc2UgdmVyc2lvbiwgaXQgd2lsbCBpbmNyZW1lbnQgdGhlIHBhdGNoLlxuICAgICAgLy8gSWYgaXQgaXMgYSBwcmUtcmVsZWFzZSBpdCB3aWxsIGJ1bXAgdXAgdG8gdGhlIHNhbWUgcGF0Y2ggdmVyc2lvbi5cbiAgICAgIC8vIDEuMi4wLTUgcGF0Y2hlcyB0byAxLjIuMFxuICAgICAgLy8gMS4yLjAgcGF0Y2hlcyB0byAxLjIuMVxuICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5wYXRjaCsrXG4gICAgICB9XG4gICAgICB0aGlzLnByZXJlbGVhc2UgPSBbXVxuICAgICAgYnJlYWtcbiAgICAvLyBUaGlzIHByb2JhYmx5IHNob3VsZG4ndCBiZSB1c2VkIHB1YmxpY2x5LlxuICAgIC8vIDEuMC4wIFwicHJlXCIgd291bGQgYmVjb21lIDEuMC4wLTAgd2hpY2ggaXMgdGhlIHdyb25nIGRpcmVjdGlvbi5cbiAgICBjYXNlICdwcmUnOlxuICAgICAgaWYgKHRoaXMucHJlcmVsZWFzZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGhpcy5wcmVyZWxlYXNlID0gWzBdXG4gICAgICB9IGVsc2Uge1xuICAgICAgICB2YXIgaSA9IHRoaXMucHJlcmVsZWFzZS5sZW5ndGhcbiAgICAgICAgd2hpbGUgKC0taSA+PSAwKSB7XG4gICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnByZXJlbGVhc2VbaV0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICB0aGlzLnByZXJlbGVhc2VbaV0rK1xuICAgICAgICAgICAgaSA9IC0yXG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpID09PSAtMSkge1xuICAgICAgICAgIC8vIGRpZG4ndCBpbmNyZW1lbnQgYW55dGhpbmdcbiAgICAgICAgICB0aGlzLnByZXJlbGVhc2UucHVzaCgwKVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBpZiAoaWRlbnRpZmllcikge1xuICAgICAgICAvLyAxLjIuMC1iZXRhLjEgYnVtcHMgdG8gMS4yLjAtYmV0YS4yLFxuICAgICAgICAvLyAxLjIuMC1iZXRhLmZvb2JseiBvciAxLjIuMC1iZXRhIGJ1bXBzIHRvIDEuMi4wLWJldGEuMFxuICAgICAgICBpZiAodGhpcy5wcmVyZWxlYXNlWzBdID09PSBpZGVudGlmaWVyKSB7XG4gICAgICAgICAgaWYgKGlzTmFOKHRoaXMucHJlcmVsZWFzZVsxXSkpIHtcbiAgICAgICAgICAgIHRoaXMucHJlcmVsZWFzZSA9IFtpZGVudGlmaWVyLCAwXVxuICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLnByZXJlbGVhc2UgPSBbaWRlbnRpZmllciwgMF1cbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgYnJlYWtcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoJ2ludmFsaWQgaW5jcmVtZW50IGFyZ3VtZW50OiAnICsgcmVsZWFzZSlcbiAgfVxuICB0aGlzLmZvcm1hdCgpXG4gIHRoaXMucmF3ID0gdGhpcy52ZXJzaW9uXG4gIHJldHVybiB0aGlzXG59XG5cbmV4cG9ydHMuaW5jID0gaW5jXG5mdW5jdGlvbiBpbmMgKHZlcnNpb24sIHJlbGVhc2UsIGxvb3NlLCBpZGVudGlmaWVyKSB7XG4gIGlmICh0eXBlb2YgKGxvb3NlKSA9PT0gJ3N0cmluZycpIHtcbiAgICBpZGVudGlmaWVyID0gbG9vc2VcbiAgICBsb29zZSA9IHVuZGVmaW5lZFxuICB9XG5cbiAgdHJ5IHtcbiAgICByZXR1cm4gbmV3IFNlbVZlcih2ZXJzaW9uLCBsb29zZSkuaW5jKHJlbGVhc2UsIGlkZW50aWZpZXIpLnZlcnNpb25cbiAgfSBjYXRjaCAoZXIpIHtcbiAgICByZXR1cm4gbnVsbFxuICB9XG59XG5cbmV4cG9ydHMuZGlmZiA9IGRpZmZcbmZ1bmN0aW9uIGRpZmYgKHZlcnNpb24xLCB2ZXJzaW9uMikge1xuICBpZiAoZXEodmVyc2lvbjEsIHZlcnNpb24yKSkge1xuICAgIHJldHVybiBudWxsXG4gIH0gZWxzZSB7XG4gICAgdmFyIHYxID0gcGFyc2UodmVyc2lvbjEpXG4gICAgdmFyIHYyID0gcGFyc2UodmVyc2lvbjIpXG4gICAgdmFyIHByZWZpeCA9ICcnXG4gICAgaWYgKHYxLnByZXJlbGVhc2UubGVuZ3RoIHx8IHYyLnByZXJlbGVhc2UubGVuZ3RoKSB7XG4gICAgICBwcmVmaXggPSAncHJlJ1xuICAgICAgdmFyIGRlZmF1bHRSZXN1bHQgPSAncHJlcmVsZWFzZSdcbiAgICB9XG4gICAgZm9yICh2YXIga2V5IGluIHYxKSB7XG4gICAgICBpZiAoa2V5ID09PSAnbWFqb3InIHx8IGtleSA9PT0gJ21pbm9yJyB8fCBrZXkgPT09ICdwYXRjaCcpIHtcbiAgICAgICAgaWYgKHYxW2tleV0gIT09IHYyW2tleV0pIHtcbiAgICAgICAgICByZXR1cm4gcHJlZml4ICsga2V5XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRlZmF1bHRSZXN1bHQgLy8gbWF5IGJlIHVuZGVmaW5lZFxuICB9XG59XG5cbmV4cG9ydHMuY29tcGFyZUlkZW50aWZpZXJzID0gY29tcGFyZUlkZW50aWZpZXJzXG5cbnZhciBudW1lcmljID0gL15bMC05XSskL1xuZnVuY3Rpb24gY29tcGFyZUlkZW50aWZpZXJzIChhLCBiKSB7XG4gIHZhciBhbnVtID0gbnVtZXJpYy50ZXN0KGEpXG4gIHZhciBibnVtID0gbnVtZXJpYy50ZXN0KGIpXG5cbiAgaWYgKGFudW0gJiYgYm51bSkge1xuICAgIGEgPSArYVxuICAgIGIgPSArYlxuICB9XG5cbiAgcmV0dXJuIGEgPT09IGIgPyAwXG4gICAgOiAoYW51bSAmJiAhYm51bSkgPyAtMVxuICAgIDogKGJudW0gJiYgIWFudW0pID8gMVxuICAgIDogYSA8IGIgPyAtMVxuICAgIDogMVxufVxuXG5leHBvcnRzLnJjb21wYXJlSWRlbnRpZmllcnMgPSByY29tcGFyZUlkZW50aWZpZXJzXG5mdW5jdGlvbiByY29tcGFyZUlkZW50aWZpZXJzIChhLCBiKSB7XG4gIHJldHVybiBjb21wYXJlSWRlbnRpZmllcnMoYiwgYSlcbn1cblxuZXhwb3J0cy5tYWpvciA9IG1ham9yXG5mdW5jdGlvbiBtYWpvciAoYSwgbG9vc2UpIHtcbiAgcmV0dXJuIG5ldyBTZW1WZXIoYSwgbG9vc2UpLm1ham9yXG59XG5cbmV4cG9ydHMubWlub3IgPSBtaW5vclxuZnVuY3Rpb24gbWlub3IgKGEsIGxvb3NlKSB7XG4gIHJldHVybiBuZXcgU2VtVmVyKGEsIGxvb3NlKS5taW5vclxufVxuXG5leHBvcnRzLnBhdGNoID0gcGF0Y2hcbmZ1bmN0aW9uIHBhdGNoIChhLCBsb29zZSkge1xuICByZXR1cm4gbmV3IFNlbVZlcihhLCBsb29zZSkucGF0Y2hcbn1cblxuZXhwb3J0cy5jb21wYXJlID0gY29tcGFyZVxuZnVuY3Rpb24gY29tcGFyZSAoYSwgYiwgbG9vc2UpIHtcbiAgcmV0dXJuIG5ldyBTZW1WZXIoYSwgbG9vc2UpLmNvbXBhcmUobmV3IFNlbVZlcihiLCBsb29zZSkpXG59XG5cbmV4cG9ydHMuY29tcGFyZUxvb3NlID0gY29tcGFyZUxvb3NlXG5mdW5jdGlvbiBjb21wYXJlTG9vc2UgKGEsIGIpIHtcbiAgcmV0dXJuIGNvbXBhcmUoYSwgYiwgdHJ1ZSlcbn1cblxuZXhwb3J0cy5jb21wYXJlQnVpbGQgPSBjb21wYXJlQnVpbGRcbmZ1bmN0aW9uIGNvbXBhcmVCdWlsZCAoYSwgYiwgbG9vc2UpIHtcbiAgdmFyIHZlcnNpb25BID0gbmV3IFNlbVZlcihhLCBsb29zZSlcbiAgdmFyIHZlcnNpb25CID0gbmV3IFNlbVZlcihiLCBsb29zZSlcbiAgcmV0dXJuIHZlcnNpb25BLmNvbXBhcmUodmVyc2lvbkIpIHx8IHZlcnNpb25BLmNvbXBhcmVCdWlsZCh2ZXJzaW9uQilcbn1cblxuZXhwb3J0cy5yY29tcGFyZSA9IHJjb21wYXJlXG5mdW5jdGlvbiByY29tcGFyZSAoYSwgYiwgbG9vc2UpIHtcbiAgcmV0dXJuIGNvbXBhcmUoYiwgYSwgbG9vc2UpXG59XG5cbmV4cG9ydHMuc29ydCA9IHNvcnRcbmZ1bmN0aW9uIHNvcnQgKGxpc3QsIGxvb3NlKSB7XG4gIHJldHVybiBsaXN0LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gZXhwb3J0cy5jb21wYXJlQnVpbGQoYSwgYiwgbG9vc2UpXG4gIH0pXG59XG5cbmV4cG9ydHMucnNvcnQgPSByc29ydFxuZnVuY3Rpb24gcnNvcnQgKGxpc3QsIGxvb3NlKSB7XG4gIHJldHVybiBsaXN0LnNvcnQoZnVuY3Rpb24gKGEsIGIpIHtcbiAgICByZXR1cm4gZXhwb3J0cy5jb21wYXJlQnVpbGQoYiwgYSwgbG9vc2UpXG4gIH0pXG59XG5cbmV4cG9ydHMuZ3QgPSBndFxuZnVuY3Rpb24gZ3QgKGEsIGIsIGxvb3NlKSB7XG4gIHJldHVybiBjb21wYXJlKGEsIGIsIGxvb3NlKSA+IDBcbn1cblxuZXhwb3J0cy5sdCA9IGx0XG5mdW5jdGlvbiBsdCAoYSwgYiwgbG9vc2UpIHtcbiAgcmV0dXJuIGNvbXBhcmUoYSwgYiwgbG9vc2UpIDwgMFxufVxuXG5leHBvcnRzLmVxID0gZXFcbmZ1bmN0aW9uIGVxIChhLCBiLCBsb29zZSkge1xuICByZXR1cm4gY29tcGFyZShhLCBiLCBsb29zZSkgPT09IDBcbn1cblxuZXhwb3J0cy5uZXEgPSBuZXFcbmZ1bmN0aW9uIG5lcSAoYSwgYiwgbG9vc2UpIHtcbiAgcmV0dXJuIGNvbXBhcmUoYSwgYiwgbG9vc2UpICE9PSAwXG59XG5cbmV4cG9ydHMuZ3RlID0gZ3RlXG5mdW5jdGlvbiBndGUgKGEsIGIsIGxvb3NlKSB7XG4gIHJldHVybiBjb21wYXJlKGEsIGIsIGxvb3NlKSA+PSAwXG59XG5cbmV4cG9ydHMubHRlID0gbHRlXG5mdW5jdGlvbiBsdGUgKGEsIGIsIGxvb3NlKSB7XG4gIHJldHVybiBjb21wYXJlKGEsIGIsIGxvb3NlKSA8PSAwXG59XG5cbmV4cG9ydHMuY21wID0gY21wXG5mdW5jdGlvbiBjbXAgKGEsIG9wLCBiLCBsb29zZSkge1xuICBzd2l0Y2ggKG9wKSB7XG4gICAgY2FzZSAnPT09JzpcbiAgICAgIGlmICh0eXBlb2YgYSA9PT0gJ29iamVjdCcpXG4gICAgICAgIGEgPSBhLnZlcnNpb25cbiAgICAgIGlmICh0eXBlb2YgYiA9PT0gJ29iamVjdCcpXG4gICAgICAgIGIgPSBiLnZlcnNpb25cbiAgICAgIHJldHVybiBhID09PSBiXG5cbiAgICBjYXNlICchPT0nOlxuICAgICAgaWYgKHR5cGVvZiBhID09PSAnb2JqZWN0JylcbiAgICAgICAgYSA9IGEudmVyc2lvblxuICAgICAgaWYgKHR5cGVvZiBiID09PSAnb2JqZWN0JylcbiAgICAgICAgYiA9IGIudmVyc2lvblxuICAgICAgcmV0dXJuIGEgIT09IGJcblxuICAgIGNhc2UgJyc6XG4gICAgY2FzZSAnPSc6XG4gICAgY2FzZSAnPT0nOlxuICAgICAgcmV0dXJuIGVxKGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnIT0nOlxuICAgICAgcmV0dXJuIG5lcShhLCBiLCBsb29zZSlcblxuICAgIGNhc2UgJz4nOlxuICAgICAgcmV0dXJuIGd0KGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPj0nOlxuICAgICAgcmV0dXJuIGd0ZShhLCBiLCBsb29zZSlcblxuICAgIGNhc2UgJzwnOlxuICAgICAgcmV0dXJuIGx0KGEsIGIsIGxvb3NlKVxuXG4gICAgY2FzZSAnPD0nOlxuICAgICAgcmV0dXJuIGx0ZShhLCBiLCBsb29zZSlcblxuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdJbnZhbGlkIG9wZXJhdG9yOiAnICsgb3ApXG4gIH1cbn1cblxuZXhwb3J0cy5Db21wYXJhdG9yID0gQ29tcGFyYXRvclxuZnVuY3Rpb24gQ29tcGFyYXRvciAoY29tcCwgb3B0aW9ucykge1xuICBpZiAoIW9wdGlvbnMgfHwgdHlwZW9mIG9wdGlvbnMgIT09ICdvYmplY3QnKSB7XG4gICAgb3B0aW9ucyA9IHtcbiAgICAgIGxvb3NlOiAhIW9wdGlvbnMsXG4gICAgICBpbmNsdWRlUHJlcmVsZWFzZTogZmFsc2VcbiAgICB9XG4gIH1cblxuICBpZiAoY29tcCBpbnN0YW5jZW9mIENvbXBhcmF0b3IpIHtcbiAgICBpZiAoY29tcC5sb29zZSA9PT0gISFvcHRpb25zLmxvb3NlKSB7XG4gICAgICByZXR1cm4gY29tcFxuICAgIH0gZWxzZSB7XG4gICAgICBjb21wID0gY29tcC52YWx1ZVxuICAgIH1cbiAgfVxuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBDb21wYXJhdG9yKSkge1xuICAgIHJldHVybiBuZXcgQ29tcGFyYXRvcihjb21wLCBvcHRpb25zKVxuICB9XG5cbiAgZGVidWcoJ2NvbXBhcmF0b3InLCBjb21wLCBvcHRpb25zKVxuICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zXG4gIHRoaXMubG9vc2UgPSAhIW9wdGlvbnMubG9vc2VcbiAgdGhpcy5wYXJzZShjb21wKVxuXG4gIGlmICh0aGlzLnNlbXZlciA9PT0gQU5ZKSB7XG4gICAgdGhpcy52YWx1ZSA9ICcnXG4gIH0gZWxzZSB7XG4gICAgdGhpcy52YWx1ZSA9IHRoaXMub3BlcmF0b3IgKyB0aGlzLnNlbXZlci52ZXJzaW9uXG4gIH1cblxuICBkZWJ1ZygnY29tcCcsIHRoaXMpXG59XG5cbnZhciBBTlkgPSB7fVxuQ29tcGFyYXRvci5wcm90b3R5cGUucGFyc2UgPSBmdW5jdGlvbiAoY29tcCkge1xuICB2YXIgciA9IHRoaXMub3B0aW9ucy5sb29zZSA/IHJlW3QuQ09NUEFSQVRPUkxPT1NFXSA6IHJlW3QuQ09NUEFSQVRPUl1cbiAgdmFyIG0gPSBjb21wLm1hdGNoKHIpXG5cbiAgaWYgKCFtKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBjb21wYXJhdG9yOiAnICsgY29tcClcbiAgfVxuXG4gIHRoaXMub3BlcmF0b3IgPSBtWzFdICE9PSB1bmRlZmluZWQgPyBtWzFdIDogJydcbiAgaWYgKHRoaXMub3BlcmF0b3IgPT09ICc9Jykge1xuICAgIHRoaXMub3BlcmF0b3IgPSAnJ1xuICB9XG5cbiAgLy8gaWYgaXQgbGl0ZXJhbGx5IGlzIGp1c3QgJz4nIG9yICcnIHRoZW4gYWxsb3cgYW55dGhpbmcuXG4gIGlmICghbVsyXSkge1xuICAgIHRoaXMuc2VtdmVyID0gQU5ZXG4gIH0gZWxzZSB7XG4gICAgdGhpcy5zZW12ZXIgPSBuZXcgU2VtVmVyKG1bMl0sIHRoaXMub3B0aW9ucy5sb29zZSlcbiAgfVxufVxuXG5Db21wYXJhdG9yLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMudmFsdWVcbn1cblxuQ29tcGFyYXRvci5wcm90b3R5cGUudGVzdCA9IGZ1bmN0aW9uICh2ZXJzaW9uKSB7XG4gIGRlYnVnKCdDb21wYXJhdG9yLnRlc3QnLCB2ZXJzaW9uLCB0aGlzLm9wdGlvbnMubG9vc2UpXG5cbiAgaWYgKHRoaXMuc2VtdmVyID09PSBBTlkgfHwgdmVyc2lvbiA9PT0gQU5ZKSB7XG4gICAgcmV0dXJuIHRydWVcbiAgfVxuXG4gIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ3N0cmluZycpIHtcbiAgICB0cnkge1xuICAgICAgdmVyc2lvbiA9IG5ldyBTZW1WZXIodmVyc2lvbiwgdGhpcy5vcHRpb25zKVxuICAgIH0gY2F0Y2ggKGVyKSB7XG4gICAgICByZXR1cm4gZmFsc2VcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY21wKHZlcnNpb24sIHRoaXMub3BlcmF0b3IsIHRoaXMuc2VtdmVyLCB0aGlzLm9wdGlvbnMpXG59XG5cbkNvbXBhcmF0b3IucHJvdG90eXBlLmludGVyc2VjdHMgPSBmdW5jdGlvbiAoY29tcCwgb3B0aW9ucykge1xuICBpZiAoIShjb21wIGluc3RhbmNlb2YgQ29tcGFyYXRvcikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdhIENvbXBhcmF0b3IgaXMgcmVxdWlyZWQnKVxuICB9XG5cbiAgaWYgKCFvcHRpb25zIHx8IHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICBsb29zZTogISFvcHRpb25zLFxuICAgICAgaW5jbHVkZVByZXJlbGVhc2U6IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgdmFyIHJhbmdlVG1wXG5cbiAgaWYgKHRoaXMub3BlcmF0b3IgPT09ICcnKSB7XG4gICAgaWYgKHRoaXMudmFsdWUgPT09ICcnKSB7XG4gICAgICByZXR1cm4gdHJ1ZVxuICAgIH1cbiAgICByYW5nZVRtcCA9IG5ldyBSYW5nZShjb21wLnZhbHVlLCBvcHRpb25zKVxuICAgIHJldHVybiBzYXRpc2ZpZXModGhpcy52YWx1ZSwgcmFuZ2VUbXAsIG9wdGlvbnMpXG4gIH0gZWxzZSBpZiAoY29tcC5vcGVyYXRvciA9PT0gJycpIHtcbiAgICBpZiAoY29tcC52YWx1ZSA9PT0gJycpIHtcbiAgICAgIHJldHVybiB0cnVlXG4gICAgfVxuICAgIHJhbmdlVG1wID0gbmV3IFJhbmdlKHRoaXMudmFsdWUsIG9wdGlvbnMpXG4gICAgcmV0dXJuIHNhdGlzZmllcyhjb21wLnNlbXZlciwgcmFuZ2VUbXAsIG9wdGlvbnMpXG4gIH1cblxuICB2YXIgc2FtZURpcmVjdGlvbkluY3JlYXNpbmcgPVxuICAgICh0aGlzLm9wZXJhdG9yID09PSAnPj0nIHx8IHRoaXMub3BlcmF0b3IgPT09ICc+JykgJiZcbiAgICAoY29tcC5vcGVyYXRvciA9PT0gJz49JyB8fCBjb21wLm9wZXJhdG9yID09PSAnPicpXG4gIHZhciBzYW1lRGlyZWN0aW9uRGVjcmVhc2luZyA9XG4gICAgKHRoaXMub3BlcmF0b3IgPT09ICc8PScgfHwgdGhpcy5vcGVyYXRvciA9PT0gJzwnKSAmJlxuICAgIChjb21wLm9wZXJhdG9yID09PSAnPD0nIHx8IGNvbXAub3BlcmF0b3IgPT09ICc8JylcbiAgdmFyIHNhbWVTZW1WZXIgPSB0aGlzLnNlbXZlci52ZXJzaW9uID09PSBjb21wLnNlbXZlci52ZXJzaW9uXG4gIHZhciBkaWZmZXJlbnREaXJlY3Rpb25zSW5jbHVzaXZlID1cbiAgICAodGhpcy5vcGVyYXRvciA9PT0gJz49JyB8fCB0aGlzLm9wZXJhdG9yID09PSAnPD0nKSAmJlxuICAgIChjb21wLm9wZXJhdG9yID09PSAnPj0nIHx8IGNvbXAub3BlcmF0b3IgPT09ICc8PScpXG4gIHZhciBvcHBvc2l0ZURpcmVjdGlvbnNMZXNzVGhhbiA9XG4gICAgY21wKHRoaXMuc2VtdmVyLCAnPCcsIGNvbXAuc2VtdmVyLCBvcHRpb25zKSAmJlxuICAgICgodGhpcy5vcGVyYXRvciA9PT0gJz49JyB8fCB0aGlzLm9wZXJhdG9yID09PSAnPicpICYmXG4gICAgKGNvbXAub3BlcmF0b3IgPT09ICc8PScgfHwgY29tcC5vcGVyYXRvciA9PT0gJzwnKSlcbiAgdmFyIG9wcG9zaXRlRGlyZWN0aW9uc0dyZWF0ZXJUaGFuID1cbiAgICBjbXAodGhpcy5zZW12ZXIsICc+JywgY29tcC5zZW12ZXIsIG9wdGlvbnMpICYmXG4gICAgKCh0aGlzLm9wZXJhdG9yID09PSAnPD0nIHx8IHRoaXMub3BlcmF0b3IgPT09ICc8JykgJiZcbiAgICAoY29tcC5vcGVyYXRvciA9PT0gJz49JyB8fCBjb21wLm9wZXJhdG9yID09PSAnPicpKVxuXG4gIHJldHVybiBzYW1lRGlyZWN0aW9uSW5jcmVhc2luZyB8fCBzYW1lRGlyZWN0aW9uRGVjcmVhc2luZyB8fFxuICAgIChzYW1lU2VtVmVyICYmIGRpZmZlcmVudERpcmVjdGlvbnNJbmNsdXNpdmUpIHx8XG4gICAgb3Bwb3NpdGVEaXJlY3Rpb25zTGVzc1RoYW4gfHwgb3Bwb3NpdGVEaXJlY3Rpb25zR3JlYXRlclRoYW5cbn1cblxuZXhwb3J0cy5SYW5nZSA9IFJhbmdlXG5mdW5jdGlvbiBSYW5nZSAocmFuZ2UsIG9wdGlvbnMpIHtcbiAgaWYgKCFvcHRpb25zIHx8IHR5cGVvZiBvcHRpb25zICE9PSAnb2JqZWN0Jykge1xuICAgIG9wdGlvbnMgPSB7XG4gICAgICBsb29zZTogISFvcHRpb25zLFxuICAgICAgaW5jbHVkZVByZXJlbGVhc2U6IGZhbHNlXG4gICAgfVxuICB9XG5cbiAgaWYgKHJhbmdlIGluc3RhbmNlb2YgUmFuZ2UpIHtcbiAgICBpZiAocmFuZ2UubG9vc2UgPT09ICEhb3B0aW9ucy5sb29zZSAmJlxuICAgICAgICByYW5nZS5pbmNsdWRlUHJlcmVsZWFzZSA9PT0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSB7XG4gICAgICByZXR1cm4gcmFuZ2VcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIG5ldyBSYW5nZShyYW5nZS5yYXcsIG9wdGlvbnMpXG4gICAgfVxuICB9XG5cbiAgaWYgKHJhbmdlIGluc3RhbmNlb2YgQ29tcGFyYXRvcikge1xuICAgIHJldHVybiBuZXcgUmFuZ2UocmFuZ2UudmFsdWUsIG9wdGlvbnMpXG4gIH1cblxuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgUmFuZ2UpKSB7XG4gICAgcmV0dXJuIG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucylcbiAgfVxuXG4gIHRoaXMub3B0aW9ucyA9IG9wdGlvbnNcbiAgdGhpcy5sb29zZSA9ICEhb3B0aW9ucy5sb29zZVxuICB0aGlzLmluY2x1ZGVQcmVyZWxlYXNlID0gISFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlXG5cbiAgLy8gRmlyc3QsIHNwbGl0IGJhc2VkIG9uIGJvb2xlYW4gb3IgfHxcbiAgdGhpcy5yYXcgPSByYW5nZVxuICB0aGlzLnNldCA9IHJhbmdlLnNwbGl0KC9cXHMqXFx8XFx8XFxzKi8pLm1hcChmdW5jdGlvbiAocmFuZ2UpIHtcbiAgICByZXR1cm4gdGhpcy5wYXJzZVJhbmdlKHJhbmdlLnRyaW0oKSlcbiAgfSwgdGhpcykuZmlsdGVyKGZ1bmN0aW9uIChjKSB7XG4gICAgLy8gdGhyb3cgb3V0IGFueSB0aGF0IGFyZSBub3QgcmVsZXZhbnQgZm9yIHdoYXRldmVyIHJlYXNvblxuICAgIHJldHVybiBjLmxlbmd0aFxuICB9KVxuXG4gIGlmICghdGhpcy5zZXQubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBTZW1WZXIgUmFuZ2U6ICcgKyByYW5nZSlcbiAgfVxuXG4gIHRoaXMuZm9ybWF0KClcbn1cblxuUmFuZ2UucHJvdG90eXBlLmZvcm1hdCA9IGZ1bmN0aW9uICgpIHtcbiAgdGhpcy5yYW5nZSA9IHRoaXMuc2V0Lm1hcChmdW5jdGlvbiAoY29tcHMpIHtcbiAgICByZXR1cm4gY29tcHMuam9pbignICcpLnRyaW0oKVxuICB9KS5qb2luKCd8fCcpLnRyaW0oKVxuICByZXR1cm4gdGhpcy5yYW5nZVxufVxuXG5SYW5nZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiB0aGlzLnJhbmdlXG59XG5cblJhbmdlLnByb3RvdHlwZS5wYXJzZVJhbmdlID0gZnVuY3Rpb24gKHJhbmdlKSB7XG4gIHZhciBsb29zZSA9IHRoaXMub3B0aW9ucy5sb29zZVxuICByYW5nZSA9IHJhbmdlLnRyaW0oKVxuICAvLyBgMS4yLjMgLSAxLjIuNGAgPT4gYD49MS4yLjMgPD0xLjIuNGBcbiAgdmFyIGhyID0gbG9vc2UgPyByZVt0LkhZUEhFTlJBTkdFTE9PU0VdIDogcmVbdC5IWVBIRU5SQU5HRV1cbiAgcmFuZ2UgPSByYW5nZS5yZXBsYWNlKGhyLCBoeXBoZW5SZXBsYWNlKVxuICBkZWJ1ZygnaHlwaGVuIHJlcGxhY2UnLCByYW5nZSlcbiAgLy8gYD4gMS4yLjMgPCAxLjIuNWAgPT4gYD4xLjIuMyA8MS4yLjVgXG4gIHJhbmdlID0gcmFuZ2UucmVwbGFjZShyZVt0LkNPTVBBUkFUT1JUUklNXSwgY29tcGFyYXRvclRyaW1SZXBsYWNlKVxuICBkZWJ1ZygnY29tcGFyYXRvciB0cmltJywgcmFuZ2UsIHJlW3QuQ09NUEFSQVRPUlRSSU1dKVxuXG4gIC8vIGB+IDEuMi4zYCA9PiBgfjEuMi4zYFxuICByYW5nZSA9IHJhbmdlLnJlcGxhY2UocmVbdC5USUxERVRSSU1dLCB0aWxkZVRyaW1SZXBsYWNlKVxuXG4gIC8vIGBeIDEuMi4zYCA9PiBgXjEuMi4zYFxuICByYW5nZSA9IHJhbmdlLnJlcGxhY2UocmVbdC5DQVJFVFRSSU1dLCBjYXJldFRyaW1SZXBsYWNlKVxuXG4gIC8vIG5vcm1hbGl6ZSBzcGFjZXNcbiAgcmFuZ2UgPSByYW5nZS5zcGxpdCgvXFxzKy8pLmpvaW4oJyAnKVxuXG4gIC8vIEF0IHRoaXMgcG9pbnQsIHRoZSByYW5nZSBpcyBjb21wbGV0ZWx5IHRyaW1tZWQgYW5kXG4gIC8vIHJlYWR5IHRvIGJlIHNwbGl0IGludG8gY29tcGFyYXRvcnMuXG5cbiAgdmFyIGNvbXBSZSA9IGxvb3NlID8gcmVbdC5DT01QQVJBVE9STE9PU0VdIDogcmVbdC5DT01QQVJBVE9SXVxuICB2YXIgc2V0ID0gcmFuZ2Uuc3BsaXQoJyAnKS5tYXAoZnVuY3Rpb24gKGNvbXApIHtcbiAgICByZXR1cm4gcGFyc2VDb21wYXJhdG9yKGNvbXAsIHRoaXMub3B0aW9ucylcbiAgfSwgdGhpcykuam9pbignICcpLnNwbGl0KC9cXHMrLylcbiAgaWYgKHRoaXMub3B0aW9ucy5sb29zZSkge1xuICAgIC8vIGluIGxvb3NlIG1vZGUsIHRocm93IG91dCBhbnkgdGhhdCBhcmUgbm90IHZhbGlkIGNvbXBhcmF0b3JzXG4gICAgc2V0ID0gc2V0LmZpbHRlcihmdW5jdGlvbiAoY29tcCkge1xuICAgICAgcmV0dXJuICEhY29tcC5tYXRjaChjb21wUmUpXG4gICAgfSlcbiAgfVxuICBzZXQgPSBzZXQubWFwKGZ1bmN0aW9uIChjb21wKSB7XG4gICAgcmV0dXJuIG5ldyBDb21wYXJhdG9yKGNvbXAsIHRoaXMub3B0aW9ucylcbiAgfSwgdGhpcylcblxuICByZXR1cm4gc2V0XG59XG5cblJhbmdlLnByb3RvdHlwZS5pbnRlcnNlY3RzID0gZnVuY3Rpb24gKHJhbmdlLCBvcHRpb25zKSB7XG4gIGlmICghKHJhbmdlIGluc3RhbmNlb2YgUmFuZ2UpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignYSBSYW5nZSBpcyByZXF1aXJlZCcpXG4gIH1cblxuICByZXR1cm4gdGhpcy5zZXQuc29tZShmdW5jdGlvbiAodGhpc0NvbXBhcmF0b3JzKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGlzU2F0aXNmaWFibGUodGhpc0NvbXBhcmF0b3JzLCBvcHRpb25zKSAmJlxuICAgICAgcmFuZ2Uuc2V0LnNvbWUoZnVuY3Rpb24gKHJhbmdlQ29tcGFyYXRvcnMpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICBpc1NhdGlzZmlhYmxlKHJhbmdlQ29tcGFyYXRvcnMsIG9wdGlvbnMpICYmXG4gICAgICAgICAgdGhpc0NvbXBhcmF0b3JzLmV2ZXJ5KGZ1bmN0aW9uICh0aGlzQ29tcGFyYXRvcikge1xuICAgICAgICAgICAgcmV0dXJuIHJhbmdlQ29tcGFyYXRvcnMuZXZlcnkoZnVuY3Rpb24gKHJhbmdlQ29tcGFyYXRvcikge1xuICAgICAgICAgICAgICByZXR1cm4gdGhpc0NvbXBhcmF0b3IuaW50ZXJzZWN0cyhyYW5nZUNvbXBhcmF0b3IsIG9wdGlvbnMpXG4gICAgICAgICAgICB9KVxuICAgICAgICAgIH0pXG4gICAgICAgIClcbiAgICAgIH0pXG4gICAgKVxuICB9KVxufVxuXG4vLyB0YWtlIGEgc2V0IG9mIGNvbXBhcmF0b3JzIGFuZCBkZXRlcm1pbmUgd2hldGhlciB0aGVyZVxuLy8gZXhpc3RzIGEgdmVyc2lvbiB3aGljaCBjYW4gc2F0aXNmeSBpdFxuZnVuY3Rpb24gaXNTYXRpc2ZpYWJsZSAoY29tcGFyYXRvcnMsIG9wdGlvbnMpIHtcbiAgdmFyIHJlc3VsdCA9IHRydWVcbiAgdmFyIHJlbWFpbmluZ0NvbXBhcmF0b3JzID0gY29tcGFyYXRvcnMuc2xpY2UoKVxuICB2YXIgdGVzdENvbXBhcmF0b3IgPSByZW1haW5pbmdDb21wYXJhdG9ycy5wb3AoKVxuXG4gIHdoaWxlIChyZXN1bHQgJiYgcmVtYWluaW5nQ29tcGFyYXRvcnMubGVuZ3RoKSB7XG4gICAgcmVzdWx0ID0gcmVtYWluaW5nQ29tcGFyYXRvcnMuZXZlcnkoZnVuY3Rpb24gKG90aGVyQ29tcGFyYXRvcikge1xuICAgICAgcmV0dXJuIHRlc3RDb21wYXJhdG9yLmludGVyc2VjdHMob3RoZXJDb21wYXJhdG9yLCBvcHRpb25zKVxuICAgIH0pXG5cbiAgICB0ZXN0Q29tcGFyYXRvciA9IHJlbWFpbmluZ0NvbXBhcmF0b3JzLnBvcCgpXG4gIH1cblxuICByZXR1cm4gcmVzdWx0XG59XG5cbi8vIE1vc3RseSBqdXN0IGZvciB0ZXN0aW5nIGFuZCBsZWdhY3kgQVBJIHJlYXNvbnNcbmV4cG9ydHMudG9Db21wYXJhdG9ycyA9IHRvQ29tcGFyYXRvcnNcbmZ1bmN0aW9uIHRvQ29tcGFyYXRvcnMgKHJhbmdlLCBvcHRpb25zKSB7XG4gIHJldHVybiBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpLnNldC5tYXAoZnVuY3Rpb24gKGNvbXApIHtcbiAgICByZXR1cm4gY29tcC5tYXAoZnVuY3Rpb24gKGMpIHtcbiAgICAgIHJldHVybiBjLnZhbHVlXG4gICAgfSkuam9pbignICcpLnRyaW0oKS5zcGxpdCgnICcpXG4gIH0pXG59XG5cbi8vIGNvbXByaXNlZCBvZiB4cmFuZ2VzLCB0aWxkZXMsIHN0YXJzLCBhbmQgZ3RsdCdzIGF0IHRoaXMgcG9pbnQuXG4vLyBhbHJlYWR5IHJlcGxhY2VkIHRoZSBoeXBoZW4gcmFuZ2VzXG4vLyB0dXJuIGludG8gYSBzZXQgb2YgSlVTVCBjb21wYXJhdG9ycy5cbmZ1bmN0aW9uIHBhcnNlQ29tcGFyYXRvciAoY29tcCwgb3B0aW9ucykge1xuICBkZWJ1ZygnY29tcCcsIGNvbXAsIG9wdGlvbnMpXG4gIGNvbXAgPSByZXBsYWNlQ2FyZXRzKGNvbXAsIG9wdGlvbnMpXG4gIGRlYnVnKCdjYXJldCcsIGNvbXApXG4gIGNvbXAgPSByZXBsYWNlVGlsZGVzKGNvbXAsIG9wdGlvbnMpXG4gIGRlYnVnKCd0aWxkZXMnLCBjb21wKVxuICBjb21wID0gcmVwbGFjZVhSYW5nZXMoY29tcCwgb3B0aW9ucylcbiAgZGVidWcoJ3hyYW5nZScsIGNvbXApXG4gIGNvbXAgPSByZXBsYWNlU3RhcnMoY29tcCwgb3B0aW9ucylcbiAgZGVidWcoJ3N0YXJzJywgY29tcClcbiAgcmV0dXJuIGNvbXBcbn1cblxuZnVuY3Rpb24gaXNYIChpZCkge1xuICByZXR1cm4gIWlkIHx8IGlkLnRvTG93ZXJDYXNlKCkgPT09ICd4JyB8fCBpZCA9PT0gJyonXG59XG5cbi8vIH4sIH4+IC0tPiAqIChhbnksIGtpbmRhIHNpbGx5KVxuLy8gfjIsIH4yLngsIH4yLngueCwgfj4yLCB+PjIueCB+PjIueC54IC0tPiA+PTIuMC4wIDwzLjAuMFxuLy8gfjIuMCwgfjIuMC54LCB+PjIuMCwgfj4yLjAueCAtLT4gPj0yLjAuMCA8Mi4xLjBcbi8vIH4xLjIsIH4xLjIueCwgfj4xLjIsIH4+MS4yLnggLS0+ID49MS4yLjAgPDEuMy4wXG4vLyB+MS4yLjMsIH4+MS4yLjMgLS0+ID49MS4yLjMgPDEuMy4wXG4vLyB+MS4yLjAsIH4+MS4yLjAgLS0+ID49MS4yLjAgPDEuMy4wXG5mdW5jdGlvbiByZXBsYWNlVGlsZGVzIChjb21wLCBvcHRpb25zKSB7XG4gIHJldHVybiBjb21wLnRyaW0oKS5zcGxpdCgvXFxzKy8pLm1hcChmdW5jdGlvbiAoY29tcCkge1xuICAgIHJldHVybiByZXBsYWNlVGlsZGUoY29tcCwgb3B0aW9ucylcbiAgfSkuam9pbignICcpXG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VUaWxkZSAoY29tcCwgb3B0aW9ucykge1xuICB2YXIgciA9IG9wdGlvbnMubG9vc2UgPyByZVt0LlRJTERFTE9PU0VdIDogcmVbdC5USUxERV1cbiAgcmV0dXJuIGNvbXAucmVwbGFjZShyLCBmdW5jdGlvbiAoXywgTSwgbSwgcCwgcHIpIHtcbiAgICBkZWJ1ZygndGlsZGUnLCBjb21wLCBfLCBNLCBtLCBwLCBwcilcbiAgICB2YXIgcmV0XG5cbiAgICBpZiAoaXNYKE0pKSB7XG4gICAgICByZXQgPSAnJ1xuICAgIH0gZWxzZSBpZiAoaXNYKG0pKSB7XG4gICAgICByZXQgPSAnPj0nICsgTSArICcuMC4wIDwnICsgKCtNICsgMSkgKyAnLjAuMCdcbiAgICB9IGVsc2UgaWYgKGlzWChwKSkge1xuICAgICAgLy8gfjEuMiA9PSA+PTEuMi4wIDwxLjMuMFxuICAgICAgcmV0ID0gJz49JyArIE0gKyAnLicgKyBtICsgJy4wIDwnICsgTSArICcuJyArICgrbSArIDEpICsgJy4wJ1xuICAgIH0gZWxzZSBpZiAocHIpIHtcbiAgICAgIGRlYnVnKCdyZXBsYWNlVGlsZGUgcHInLCBwcilcbiAgICAgIHJldCA9ICc+PScgKyBNICsgJy4nICsgbSArICcuJyArIHAgKyAnLScgKyBwciArXG4gICAgICAgICAgICAnIDwnICsgTSArICcuJyArICgrbSArIDEpICsgJy4wJ1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyB+MS4yLjMgPT0gPj0xLjIuMyA8MS4zLjBcbiAgICAgIHJldCA9ICc+PScgKyBNICsgJy4nICsgbSArICcuJyArIHAgK1xuICAgICAgICAgICAgJyA8JyArIE0gKyAnLicgKyAoK20gKyAxKSArICcuMCdcbiAgICB9XG5cbiAgICBkZWJ1ZygndGlsZGUgcmV0dXJuJywgcmV0KVxuICAgIHJldHVybiByZXRcbiAgfSlcbn1cblxuLy8gXiAtLT4gKiAoYW55LCBraW5kYSBzaWxseSlcbi8vIF4yLCBeMi54LCBeMi54LnggLS0+ID49Mi4wLjAgPDMuMC4wXG4vLyBeMi4wLCBeMi4wLnggLS0+ID49Mi4wLjAgPDMuMC4wXG4vLyBeMS4yLCBeMS4yLnggLS0+ID49MS4yLjAgPDIuMC4wXG4vLyBeMS4yLjMgLS0+ID49MS4yLjMgPDIuMC4wXG4vLyBeMS4yLjAgLS0+ID49MS4yLjAgPDIuMC4wXG5mdW5jdGlvbiByZXBsYWNlQ2FyZXRzIChjb21wLCBvcHRpb25zKSB7XG4gIHJldHVybiBjb21wLnRyaW0oKS5zcGxpdCgvXFxzKy8pLm1hcChmdW5jdGlvbiAoY29tcCkge1xuICAgIHJldHVybiByZXBsYWNlQ2FyZXQoY29tcCwgb3B0aW9ucylcbiAgfSkuam9pbignICcpXG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VDYXJldCAoY29tcCwgb3B0aW9ucykge1xuICBkZWJ1ZygnY2FyZXQnLCBjb21wLCBvcHRpb25zKVxuICB2YXIgciA9IG9wdGlvbnMubG9vc2UgPyByZVt0LkNBUkVUTE9PU0VdIDogcmVbdC5DQVJFVF1cbiAgcmV0dXJuIGNvbXAucmVwbGFjZShyLCBmdW5jdGlvbiAoXywgTSwgbSwgcCwgcHIpIHtcbiAgICBkZWJ1ZygnY2FyZXQnLCBjb21wLCBfLCBNLCBtLCBwLCBwcilcbiAgICB2YXIgcmV0XG5cbiAgICBpZiAoaXNYKE0pKSB7XG4gICAgICByZXQgPSAnJ1xuICAgIH0gZWxzZSBpZiAoaXNYKG0pKSB7XG4gICAgICByZXQgPSAnPj0nICsgTSArICcuMC4wIDwnICsgKCtNICsgMSkgKyAnLjAuMCdcbiAgICB9IGVsc2UgaWYgKGlzWChwKSkge1xuICAgICAgaWYgKE0gPT09ICcwJykge1xuICAgICAgICByZXQgPSAnPj0nICsgTSArICcuJyArIG0gKyAnLjAgPCcgKyBNICsgJy4nICsgKCttICsgMSkgKyAnLjAnXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQgPSAnPj0nICsgTSArICcuJyArIG0gKyAnLjAgPCcgKyAoK00gKyAxKSArICcuMC4wJ1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAocHIpIHtcbiAgICAgIGRlYnVnKCdyZXBsYWNlQ2FyZXQgcHInLCBwcilcbiAgICAgIGlmIChNID09PSAnMCcpIHtcbiAgICAgICAgaWYgKG0gPT09ICcwJykge1xuICAgICAgICAgIHJldCA9ICc+PScgKyBNICsgJy4nICsgbSArICcuJyArIHAgKyAnLScgKyBwciArXG4gICAgICAgICAgICAgICAgJyA8JyArIE0gKyAnLicgKyBtICsgJy4nICsgKCtwICsgMSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXQgPSAnPj0nICsgTSArICcuJyArIG0gKyAnLicgKyBwICsgJy0nICsgcHIgK1xuICAgICAgICAgICAgICAgICcgPCcgKyBNICsgJy4nICsgKCttICsgMSkgKyAnLjAnXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldCA9ICc+PScgKyBNICsgJy4nICsgbSArICcuJyArIHAgKyAnLScgKyBwciArXG4gICAgICAgICAgICAgICcgPCcgKyAoK00gKyAxKSArICcuMC4wJ1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Zygnbm8gcHInKVxuICAgICAgaWYgKE0gPT09ICcwJykge1xuICAgICAgICBpZiAobSA9PT0gJzAnKSB7XG4gICAgICAgICAgcmV0ID0gJz49JyArIE0gKyAnLicgKyBtICsgJy4nICsgcCArXG4gICAgICAgICAgICAgICAgJyA8JyArIE0gKyAnLicgKyBtICsgJy4nICsgKCtwICsgMSlcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXQgPSAnPj0nICsgTSArICcuJyArIG0gKyAnLicgKyBwICtcbiAgICAgICAgICAgICAgICAnIDwnICsgTSArICcuJyArICgrbSArIDEpICsgJy4wJ1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXQgPSAnPj0nICsgTSArICcuJyArIG0gKyAnLicgKyBwICtcbiAgICAgICAgICAgICAgJyA8JyArICgrTSArIDEpICsgJy4wLjAnXG4gICAgICB9XG4gICAgfVxuXG4gICAgZGVidWcoJ2NhcmV0IHJldHVybicsIHJldClcbiAgICByZXR1cm4gcmV0XG4gIH0pXG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VYUmFuZ2VzIChjb21wLCBvcHRpb25zKSB7XG4gIGRlYnVnKCdyZXBsYWNlWFJhbmdlcycsIGNvbXAsIG9wdGlvbnMpXG4gIHJldHVybiBjb21wLnNwbGl0KC9cXHMrLykubWFwKGZ1bmN0aW9uIChjb21wKSB7XG4gICAgcmV0dXJuIHJlcGxhY2VYUmFuZ2UoY29tcCwgb3B0aW9ucylcbiAgfSkuam9pbignICcpXG59XG5cbmZ1bmN0aW9uIHJlcGxhY2VYUmFuZ2UgKGNvbXAsIG9wdGlvbnMpIHtcbiAgY29tcCA9IGNvbXAudHJpbSgpXG4gIHZhciByID0gb3B0aW9ucy5sb29zZSA/IHJlW3QuWFJBTkdFTE9PU0VdIDogcmVbdC5YUkFOR0VdXG4gIHJldHVybiBjb21wLnJlcGxhY2UociwgZnVuY3Rpb24gKHJldCwgZ3RsdCwgTSwgbSwgcCwgcHIpIHtcbiAgICBkZWJ1ZygneFJhbmdlJywgY29tcCwgcmV0LCBndGx0LCBNLCBtLCBwLCBwcilcbiAgICB2YXIgeE0gPSBpc1goTSlcbiAgICB2YXIgeG0gPSB4TSB8fCBpc1gobSlcbiAgICB2YXIgeHAgPSB4bSB8fCBpc1gocClcbiAgICB2YXIgYW55WCA9IHhwXG5cbiAgICBpZiAoZ3RsdCA9PT0gJz0nICYmIGFueVgpIHtcbiAgICAgIGd0bHQgPSAnJ1xuICAgIH1cblxuICAgIC8vIGlmIHdlJ3JlIGluY2x1ZGluZyBwcmVyZWxlYXNlcyBpbiB0aGUgbWF0Y2gsIHRoZW4gd2UgbmVlZFxuICAgIC8vIHRvIGZpeCB0aGlzIHRvIC0wLCB0aGUgbG93ZXN0IHBvc3NpYmxlIHByZXJlbGVhc2UgdmFsdWVcbiAgICBwciA9IG9wdGlvbnMuaW5jbHVkZVByZXJlbGVhc2UgPyAnLTAnIDogJydcblxuICAgIGlmICh4TSkge1xuICAgICAgaWYgKGd0bHQgPT09ICc+JyB8fCBndGx0ID09PSAnPCcpIHtcbiAgICAgICAgLy8gbm90aGluZyBpcyBhbGxvd2VkXG4gICAgICAgIHJldCA9ICc8MC4wLjAtMCdcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIG5vdGhpbmcgaXMgZm9yYmlkZGVuXG4gICAgICAgIHJldCA9ICcqJ1xuICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZ3RsdCAmJiBhbnlYKSB7XG4gICAgICAvLyB3ZSBrbm93IHBhdGNoIGlzIGFuIHgsIGJlY2F1c2Ugd2UgaGF2ZSBhbnkgeCBhdCBhbGwuXG4gICAgICAvLyByZXBsYWNlIFggd2l0aCAwXG4gICAgICBpZiAoeG0pIHtcbiAgICAgICAgbSA9IDBcbiAgICAgIH1cbiAgICAgIHAgPSAwXG5cbiAgICAgIGlmIChndGx0ID09PSAnPicpIHtcbiAgICAgICAgLy8gPjEgPT4gPj0yLjAuMFxuICAgICAgICAvLyA+MS4yID0+ID49MS4zLjBcbiAgICAgICAgLy8gPjEuMi4zID0+ID49IDEuMi40XG4gICAgICAgIGd0bHQgPSAnPj0nXG4gICAgICAgIGlmICh4bSkge1xuICAgICAgICAgIE0gPSArTSArIDFcbiAgICAgICAgICBtID0gMFxuICAgICAgICAgIHAgPSAwXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbSA9ICttICsgMVxuICAgICAgICAgIHAgPSAwXG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoZ3RsdCA9PT0gJzw9Jykge1xuICAgICAgICAvLyA8PTAuNy54IGlzIGFjdHVhbGx5IDwwLjguMCwgc2luY2UgYW55IDAuNy54IHNob3VsZFxuICAgICAgICAvLyBwYXNzLiAgU2ltaWxhcmx5LCA8PTcueCBpcyBhY3R1YWxseSA8OC4wLjAsIGV0Yy5cbiAgICAgICAgZ3RsdCA9ICc8J1xuICAgICAgICBpZiAoeG0pIHtcbiAgICAgICAgICBNID0gK00gKyAxXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgbSA9ICttICsgMVxuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIHJldCA9IGd0bHQgKyBNICsgJy4nICsgbSArICcuJyArIHAgKyBwclxuICAgIH0gZWxzZSBpZiAoeG0pIHtcbiAgICAgIHJldCA9ICc+PScgKyBNICsgJy4wLjAnICsgcHIgKyAnIDwnICsgKCtNICsgMSkgKyAnLjAuMCcgKyBwclxuICAgIH0gZWxzZSBpZiAoeHApIHtcbiAgICAgIHJldCA9ICc+PScgKyBNICsgJy4nICsgbSArICcuMCcgKyBwciArXG4gICAgICAgICcgPCcgKyBNICsgJy4nICsgKCttICsgMSkgKyAnLjAnICsgcHJcbiAgICB9XG5cbiAgICBkZWJ1ZygneFJhbmdlIHJldHVybicsIHJldClcblxuICAgIHJldHVybiByZXRcbiAgfSlcbn1cblxuLy8gQmVjYXVzZSAqIGlzIEFORC1lZCB3aXRoIGV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgY29tcGFyYXRvcixcbi8vIGFuZCAnJyBtZWFucyBcImFueSB2ZXJzaW9uXCIsIGp1c3QgcmVtb3ZlIHRoZSAqcyBlbnRpcmVseS5cbmZ1bmN0aW9uIHJlcGxhY2VTdGFycyAoY29tcCwgb3B0aW9ucykge1xuICBkZWJ1ZygncmVwbGFjZVN0YXJzJywgY29tcCwgb3B0aW9ucylcbiAgLy8gTG9vc2VuZXNzIGlzIGlnbm9yZWQgaGVyZS4gIHN0YXIgaXMgYWx3YXlzIGFzIGxvb3NlIGFzIGl0IGdldHMhXG4gIHJldHVybiBjb21wLnRyaW0oKS5yZXBsYWNlKHJlW3QuU1RBUl0sICcnKVxufVxuXG4vLyBUaGlzIGZ1bmN0aW9uIGlzIHBhc3NlZCB0byBzdHJpbmcucmVwbGFjZShyZVt0LkhZUEhFTlJBTkdFXSlcbi8vIE0sIG0sIHBhdGNoLCBwcmVyZWxlYXNlLCBidWlsZFxuLy8gMS4yIC0gMy40LjUgPT4gPj0xLjIuMCA8PTMuNC41XG4vLyAxLjIuMyAtIDMuNCA9PiA+PTEuMi4wIDwzLjUuMCBBbnkgMy40Lnggd2lsbCBkb1xuLy8gMS4yIC0gMy40ID0+ID49MS4yLjAgPDMuNS4wXG5mdW5jdGlvbiBoeXBoZW5SZXBsYWNlICgkMCxcbiAgZnJvbSwgZk0sIGZtLCBmcCwgZnByLCBmYixcbiAgdG8sIHRNLCB0bSwgdHAsIHRwciwgdGIpIHtcbiAgaWYgKGlzWChmTSkpIHtcbiAgICBmcm9tID0gJydcbiAgfSBlbHNlIGlmIChpc1goZm0pKSB7XG4gICAgZnJvbSA9ICc+PScgKyBmTSArICcuMC4wJ1xuICB9IGVsc2UgaWYgKGlzWChmcCkpIHtcbiAgICBmcm9tID0gJz49JyArIGZNICsgJy4nICsgZm0gKyAnLjAnXG4gIH0gZWxzZSB7XG4gICAgZnJvbSA9ICc+PScgKyBmcm9tXG4gIH1cblxuICBpZiAoaXNYKHRNKSkge1xuICAgIHRvID0gJydcbiAgfSBlbHNlIGlmIChpc1godG0pKSB7XG4gICAgdG8gPSAnPCcgKyAoK3RNICsgMSkgKyAnLjAuMCdcbiAgfSBlbHNlIGlmIChpc1godHApKSB7XG4gICAgdG8gPSAnPCcgKyB0TSArICcuJyArICgrdG0gKyAxKSArICcuMCdcbiAgfSBlbHNlIGlmICh0cHIpIHtcbiAgICB0byA9ICc8PScgKyB0TSArICcuJyArIHRtICsgJy4nICsgdHAgKyAnLScgKyB0cHJcbiAgfSBlbHNlIHtcbiAgICB0byA9ICc8PScgKyB0b1xuICB9XG5cbiAgcmV0dXJuIChmcm9tICsgJyAnICsgdG8pLnRyaW0oKVxufVxuXG4vLyBpZiBBTlkgb2YgdGhlIHNldHMgbWF0Y2ggQUxMIG9mIGl0cyBjb21wYXJhdG9ycywgdGhlbiBwYXNzXG5SYW5nZS5wcm90b3R5cGUudGVzdCA9IGZ1bmN0aW9uICh2ZXJzaW9uKSB7XG4gIGlmICghdmVyc2lvbikge1xuICAgIHJldHVybiBmYWxzZVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2ZXJzaW9uID09PSAnc3RyaW5nJykge1xuICAgIHRyeSB7XG4gICAgICB2ZXJzaW9uID0gbmV3IFNlbVZlcih2ZXJzaW9uLCB0aGlzLm9wdGlvbnMpXG4gICAgfSBjYXRjaCAoZXIpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgdGhpcy5zZXQubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAodGVzdFNldCh0aGlzLnNldFtpXSwgdmVyc2lvbiwgdGhpcy5vcHRpb25zKSkge1xuICAgICAgcmV0dXJuIHRydWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGZhbHNlXG59XG5cbmZ1bmN0aW9uIHRlc3RTZXQgKHNldCwgdmVyc2lvbiwgb3B0aW9ucykge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgIGlmICghc2V0W2ldLnRlc3QodmVyc2lvbikpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuXG4gIGlmICh2ZXJzaW9uLnByZXJlbGVhc2UubGVuZ3RoICYmICFvcHRpb25zLmluY2x1ZGVQcmVyZWxlYXNlKSB7XG4gICAgLy8gRmluZCB0aGUgc2V0IG9mIHZlcnNpb25zIHRoYXQgYXJlIGFsbG93ZWQgdG8gaGF2ZSBwcmVyZWxlYXNlc1xuICAgIC8vIEZvciBleGFtcGxlLCBeMS4yLjMtcHIuMSBkZXN1Z2FycyB0byA+PTEuMi4zLXByLjEgPDIuMC4wXG4gICAgLy8gVGhhdCBzaG91bGQgYWxsb3cgYDEuMi4zLXByLjJgIHRvIHBhc3MuXG4gICAgLy8gSG93ZXZlciwgYDEuMi40LWFscGhhLm5vdHJlYWR5YCBzaG91bGQgTk9UIGJlIGFsbG93ZWQsXG4gICAgLy8gZXZlbiB0aG91Z2ggaXQncyB3aXRoaW4gdGhlIHJhbmdlIHNldCBieSB0aGUgY29tcGFyYXRvcnMuXG4gICAgZm9yIChpID0gMDsgaSA8IHNldC5sZW5ndGg7IGkrKykge1xuICAgICAgZGVidWcoc2V0W2ldLnNlbXZlcilcbiAgICAgIGlmIChzZXRbaV0uc2VtdmVyID09PSBBTlkpIHtcbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgaWYgKHNldFtpXS5zZW12ZXIucHJlcmVsZWFzZS5sZW5ndGggPiAwKSB7XG4gICAgICAgIHZhciBhbGxvd2VkID0gc2V0W2ldLnNlbXZlclxuICAgICAgICBpZiAoYWxsb3dlZC5tYWpvciA9PT0gdmVyc2lvbi5tYWpvciAmJlxuICAgICAgICAgICAgYWxsb3dlZC5taW5vciA9PT0gdmVyc2lvbi5taW5vciAmJlxuICAgICAgICAgICAgYWxsb3dlZC5wYXRjaCA9PT0gdmVyc2lvbi5wYXRjaCkge1xuICAgICAgICAgIHJldHVybiB0cnVlXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBWZXJzaW9uIGhhcyBhIC1wcmUsIGJ1dCBpdCdzIG5vdCBvbmUgb2YgdGhlIG9uZXMgd2UgbGlrZS5cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIHJldHVybiB0cnVlXG59XG5cbmV4cG9ydHMuc2F0aXNmaWVzID0gc2F0aXNmaWVzXG5mdW5jdGlvbiBzYXRpc2ZpZXMgKHZlcnNpb24sIHJhbmdlLCBvcHRpb25zKSB7XG4gIHRyeSB7XG4gICAgcmFuZ2UgPSBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbiAgcmV0dXJuIHJhbmdlLnRlc3QodmVyc2lvbilcbn1cblxuZXhwb3J0cy5tYXhTYXRpc2Z5aW5nID0gbWF4U2F0aXNmeWluZ1xuZnVuY3Rpb24gbWF4U2F0aXNmeWluZyAodmVyc2lvbnMsIHJhbmdlLCBvcHRpb25zKSB7XG4gIHZhciBtYXggPSBudWxsXG4gIHZhciBtYXhTViA9IG51bGxcbiAgdHJ5IHtcbiAgICB2YXIgcmFuZ2VPYmogPSBuZXcgUmFuZ2UocmFuZ2UsIG9wdGlvbnMpXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuICB2ZXJzaW9ucy5mb3JFYWNoKGZ1bmN0aW9uICh2KSB7XG4gICAgaWYgKHJhbmdlT2JqLnRlc3QodikpIHtcbiAgICAgIC8vIHNhdGlzZmllcyh2LCByYW5nZSwgb3B0aW9ucylcbiAgICAgIGlmICghbWF4IHx8IG1heFNWLmNvbXBhcmUodikgPT09IC0xKSB7XG4gICAgICAgIC8vIGNvbXBhcmUobWF4LCB2LCB0cnVlKVxuICAgICAgICBtYXggPSB2XG4gICAgICAgIG1heFNWID0gbmV3IFNlbVZlcihtYXgsIG9wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuICB9KVxuICByZXR1cm4gbWF4XG59XG5cbmV4cG9ydHMubWluU2F0aXNmeWluZyA9IG1pblNhdGlzZnlpbmdcbmZ1bmN0aW9uIG1pblNhdGlzZnlpbmcgKHZlcnNpb25zLCByYW5nZSwgb3B0aW9ucykge1xuICB2YXIgbWluID0gbnVsbFxuICB2YXIgbWluU1YgPSBudWxsXG4gIHRyeSB7XG4gICAgdmFyIHJhbmdlT2JqID0gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKVxuICB9IGNhdGNoIChlcikge1xuICAgIHJldHVybiBudWxsXG4gIH1cbiAgdmVyc2lvbnMuZm9yRWFjaChmdW5jdGlvbiAodikge1xuICAgIGlmIChyYW5nZU9iai50ZXN0KHYpKSB7XG4gICAgICAvLyBzYXRpc2ZpZXModiwgcmFuZ2UsIG9wdGlvbnMpXG4gICAgICBpZiAoIW1pbiB8fCBtaW5TVi5jb21wYXJlKHYpID09PSAxKSB7XG4gICAgICAgIC8vIGNvbXBhcmUobWluLCB2LCB0cnVlKVxuICAgICAgICBtaW4gPSB2XG4gICAgICAgIG1pblNWID0gbmV3IFNlbVZlcihtaW4sIG9wdGlvbnMpXG4gICAgICB9XG4gICAgfVxuICB9KVxuICByZXR1cm4gbWluXG59XG5cbmV4cG9ydHMubWluVmVyc2lvbiA9IG1pblZlcnNpb25cbmZ1bmN0aW9uIG1pblZlcnNpb24gKHJhbmdlLCBsb29zZSkge1xuICByYW5nZSA9IG5ldyBSYW5nZShyYW5nZSwgbG9vc2UpXG5cbiAgdmFyIG1pbnZlciA9IG5ldyBTZW1WZXIoJzAuMC4wJylcbiAgaWYgKHJhbmdlLnRlc3QobWludmVyKSkge1xuICAgIHJldHVybiBtaW52ZXJcbiAgfVxuXG4gIG1pbnZlciA9IG5ldyBTZW1WZXIoJzAuMC4wLTAnKVxuICBpZiAocmFuZ2UudGVzdChtaW52ZXIpKSB7XG4gICAgcmV0dXJuIG1pbnZlclxuICB9XG5cbiAgbWludmVyID0gbnVsbFxuICBmb3IgKHZhciBpID0gMDsgaSA8IHJhbmdlLnNldC5sZW5ndGg7ICsraSkge1xuICAgIHZhciBjb21wYXJhdG9ycyA9IHJhbmdlLnNldFtpXVxuXG4gICAgY29tcGFyYXRvcnMuZm9yRWFjaChmdW5jdGlvbiAoY29tcGFyYXRvcikge1xuICAgICAgLy8gQ2xvbmUgdG8gYXZvaWQgbWFuaXB1bGF0aW5nIHRoZSBjb21wYXJhdG9yJ3Mgc2VtdmVyIG9iamVjdC5cbiAgICAgIHZhciBjb21wdmVyID0gbmV3IFNlbVZlcihjb21wYXJhdG9yLnNlbXZlci52ZXJzaW9uKVxuICAgICAgc3dpdGNoIChjb21wYXJhdG9yLm9wZXJhdG9yKSB7XG4gICAgICAgIGNhc2UgJz4nOlxuICAgICAgICAgIGlmIChjb21wdmVyLnByZXJlbGVhc2UubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICBjb21wdmVyLnBhdGNoKytcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY29tcHZlci5wcmVyZWxlYXNlLnB1c2goMClcbiAgICAgICAgICB9XG4gICAgICAgICAgY29tcHZlci5yYXcgPSBjb21wdmVyLmZvcm1hdCgpXG4gICAgICAgICAgLyogZmFsbHRocm91Z2ggKi9cbiAgICAgICAgY2FzZSAnJzpcbiAgICAgICAgY2FzZSAnPj0nOlxuICAgICAgICAgIGlmICghbWludmVyIHx8IGd0KG1pbnZlciwgY29tcHZlcikpIHtcbiAgICAgICAgICAgIG1pbnZlciA9IGNvbXB2ZXJcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAnPCc6XG4gICAgICAgIGNhc2UgJzw9JzpcbiAgICAgICAgICAvKiBJZ25vcmUgbWF4aW11bSB2ZXJzaW9ucyAqL1xuICAgICAgICAgIGJyZWFrXG4gICAgICAgIC8qIGlzdGFuYnVsIGlnbm9yZSBuZXh0ICovXG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmV4cGVjdGVkIG9wZXJhdGlvbjogJyArIGNvbXBhcmF0b3Iub3BlcmF0b3IpXG4gICAgICB9XG4gICAgfSlcbiAgfVxuXG4gIGlmIChtaW52ZXIgJiYgcmFuZ2UudGVzdChtaW52ZXIpKSB7XG4gICAgcmV0dXJuIG1pbnZlclxuICB9XG5cbiAgcmV0dXJuIG51bGxcbn1cblxuZXhwb3J0cy52YWxpZFJhbmdlID0gdmFsaWRSYW5nZVxuZnVuY3Rpb24gdmFsaWRSYW5nZSAocmFuZ2UsIG9wdGlvbnMpIHtcbiAgdHJ5IHtcbiAgICAvLyBSZXR1cm4gJyonIGluc3RlYWQgb2YgJycgc28gdGhhdCB0cnV0aGluZXNzIHdvcmtzLlxuICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBpZiBpdCdzIGludmFsaWQgYW55d2F5XG4gICAgcmV0dXJuIG5ldyBSYW5nZShyYW5nZSwgb3B0aW9ucykucmFuZ2UgfHwgJyonXG4gIH0gY2F0Y2ggKGVyKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxufVxuXG4vLyBEZXRlcm1pbmUgaWYgdmVyc2lvbiBpcyBsZXNzIHRoYW4gYWxsIHRoZSB2ZXJzaW9ucyBwb3NzaWJsZSBpbiB0aGUgcmFuZ2VcbmV4cG9ydHMubHRyID0gbHRyXG5mdW5jdGlvbiBsdHIgKHZlcnNpb24sIHJhbmdlLCBvcHRpb25zKSB7XG4gIHJldHVybiBvdXRzaWRlKHZlcnNpb24sIHJhbmdlLCAnPCcsIG9wdGlvbnMpXG59XG5cbi8vIERldGVybWluZSBpZiB2ZXJzaW9uIGlzIGdyZWF0ZXIgdGhhbiBhbGwgdGhlIHZlcnNpb25zIHBvc3NpYmxlIGluIHRoZSByYW5nZS5cbmV4cG9ydHMuZ3RyID0gZ3RyXG5mdW5jdGlvbiBndHIgKHZlcnNpb24sIHJhbmdlLCBvcHRpb25zKSB7XG4gIHJldHVybiBvdXRzaWRlKHZlcnNpb24sIHJhbmdlLCAnPicsIG9wdGlvbnMpXG59XG5cbmV4cG9ydHMub3V0c2lkZSA9IG91dHNpZGVcbmZ1bmN0aW9uIG91dHNpZGUgKHZlcnNpb24sIHJhbmdlLCBoaWxvLCBvcHRpb25zKSB7XG4gIHZlcnNpb24gPSBuZXcgU2VtVmVyKHZlcnNpb24sIG9wdGlvbnMpXG4gIHJhbmdlID0gbmV3IFJhbmdlKHJhbmdlLCBvcHRpb25zKVxuXG4gIHZhciBndGZuLCBsdGVmbiwgbHRmbiwgY29tcCwgZWNvbXBcbiAgc3dpdGNoIChoaWxvKSB7XG4gICAgY2FzZSAnPic6XG4gICAgICBndGZuID0gZ3RcbiAgICAgIGx0ZWZuID0gbHRlXG4gICAgICBsdGZuID0gbHRcbiAgICAgIGNvbXAgPSAnPidcbiAgICAgIGVjb21wID0gJz49J1xuICAgICAgYnJlYWtcbiAgICBjYXNlICc8JzpcbiAgICAgIGd0Zm4gPSBsdFxuICAgICAgbHRlZm4gPSBndGVcbiAgICAgIGx0Zm4gPSBndFxuICAgICAgY29tcCA9ICc8J1xuICAgICAgZWNvbXAgPSAnPD0nXG4gICAgICBicmVha1xuICAgIGRlZmF1bHQ6XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdNdXN0IHByb3ZpZGUgYSBoaWxvIHZhbCBvZiBcIjxcIiBvciBcIj5cIicpXG4gIH1cblxuICAvLyBJZiBpdCBzYXRpc2lmZXMgdGhlIHJhbmdlIGl0IGlzIG5vdCBvdXRzaWRlXG4gIGlmIChzYXRpc2ZpZXModmVyc2lvbiwgcmFuZ2UsIG9wdGlvbnMpKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cblxuICAvLyBGcm9tIG5vdyBvbiwgdmFyaWFibGUgdGVybXMgYXJlIGFzIGlmIHdlJ3JlIGluIFwiZ3RyXCIgbW9kZS5cbiAgLy8gYnV0IG5vdGUgdGhhdCBldmVyeXRoaW5nIGlzIGZsaXBwZWQgZm9yIHRoZSBcImx0clwiIGZ1bmN0aW9uLlxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgcmFuZ2Uuc2V0Lmxlbmd0aDsgKytpKSB7XG4gICAgdmFyIGNvbXBhcmF0b3JzID0gcmFuZ2Uuc2V0W2ldXG5cbiAgICB2YXIgaGlnaCA9IG51bGxcbiAgICB2YXIgbG93ID0gbnVsbFxuXG4gICAgY29tcGFyYXRvcnMuZm9yRWFjaChmdW5jdGlvbiAoY29tcGFyYXRvcikge1xuICAgICAgaWYgKGNvbXBhcmF0b3Iuc2VtdmVyID09PSBBTlkpIHtcbiAgICAgICAgY29tcGFyYXRvciA9IG5ldyBDb21wYXJhdG9yKCc+PTAuMC4wJylcbiAgICAgIH1cbiAgICAgIGhpZ2ggPSBoaWdoIHx8IGNvbXBhcmF0b3JcbiAgICAgIGxvdyA9IGxvdyB8fCBjb21wYXJhdG9yXG4gICAgICBpZiAoZ3Rmbihjb21wYXJhdG9yLnNlbXZlciwgaGlnaC5zZW12ZXIsIG9wdGlvbnMpKSB7XG4gICAgICAgIGhpZ2ggPSBjb21wYXJhdG9yXG4gICAgICB9IGVsc2UgaWYgKGx0Zm4oY29tcGFyYXRvci5zZW12ZXIsIGxvdy5zZW12ZXIsIG9wdGlvbnMpKSB7XG4gICAgICAgIGxvdyA9IGNvbXBhcmF0b3JcbiAgICAgIH1cbiAgICB9KVxuXG4gICAgLy8gSWYgdGhlIGVkZ2UgdmVyc2lvbiBjb21wYXJhdG9yIGhhcyBhIG9wZXJhdG9yIHRoZW4gb3VyIHZlcnNpb25cbiAgICAvLyBpc24ndCBvdXRzaWRlIGl0XG4gICAgaWYgKGhpZ2gub3BlcmF0b3IgPT09IGNvbXAgfHwgaGlnaC5vcGVyYXRvciA9PT0gZWNvbXApIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cblxuICAgIC8vIElmIHRoZSBsb3dlc3QgdmVyc2lvbiBjb21wYXJhdG9yIGhhcyBhbiBvcGVyYXRvciBhbmQgb3VyIHZlcnNpb25cbiAgICAvLyBpcyBsZXNzIHRoYW4gaXQgdGhlbiBpdCBpc24ndCBoaWdoZXIgdGhhbiB0aGUgcmFuZ2VcbiAgICBpZiAoKCFsb3cub3BlcmF0b3IgfHwgbG93Lm9wZXJhdG9yID09PSBjb21wKSAmJlxuICAgICAgICBsdGVmbih2ZXJzaW9uLCBsb3cuc2VtdmVyKSkge1xuICAgICAgcmV0dXJuIGZhbHNlXG4gICAgfSBlbHNlIGlmIChsb3cub3BlcmF0b3IgPT09IGVjb21wICYmIGx0Zm4odmVyc2lvbiwgbG93LnNlbXZlcikpIHtcbiAgICAgIHJldHVybiBmYWxzZVxuICAgIH1cbiAgfVxuICByZXR1cm4gdHJ1ZVxufVxuXG5leHBvcnRzLnByZXJlbGVhc2UgPSBwcmVyZWxlYXNlXG5mdW5jdGlvbiBwcmVyZWxlYXNlICh2ZXJzaW9uLCBvcHRpb25zKSB7XG4gIHZhciBwYXJzZWQgPSBwYXJzZSh2ZXJzaW9uLCBvcHRpb25zKVxuICByZXR1cm4gKHBhcnNlZCAmJiBwYXJzZWQucHJlcmVsZWFzZS5sZW5ndGgpID8gcGFyc2VkLnByZXJlbGVhc2UgOiBudWxsXG59XG5cbmV4cG9ydHMuaW50ZXJzZWN0cyA9IGludGVyc2VjdHNcbmZ1bmN0aW9uIGludGVyc2VjdHMgKHIxLCByMiwgb3B0aW9ucykge1xuICByMSA9IG5ldyBSYW5nZShyMSwgb3B0aW9ucylcbiAgcjIgPSBuZXcgUmFuZ2UocjIsIG9wdGlvbnMpXG4gIHJldHVybiByMS5pbnRlcnNlY3RzKHIyKVxufVxuXG5leHBvcnRzLmNvZXJjZSA9IGNvZXJjZVxuZnVuY3Rpb24gY29lcmNlICh2ZXJzaW9uLCBvcHRpb25zKSB7XG4gIGlmICh2ZXJzaW9uIGluc3RhbmNlb2YgU2VtVmVyKSB7XG4gICAgcmV0dXJuIHZlcnNpb25cbiAgfVxuXG4gIGlmICh0eXBlb2YgdmVyc2lvbiA9PT0gJ251bWJlcicpIHtcbiAgICB2ZXJzaW9uID0gU3RyaW5nKHZlcnNpb24pXG4gIH1cblxuICBpZiAodHlwZW9mIHZlcnNpb24gIT09ICdzdHJpbmcnKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9XG5cbiAgdmFyIG1hdGNoID0gbnVsbFxuICBpZiAoIW9wdGlvbnMucnRsKSB7XG4gICAgbWF0Y2ggPSB2ZXJzaW9uLm1hdGNoKHJlW3QuQ09FUkNFXSlcbiAgfSBlbHNlIHtcbiAgICAvLyBGaW5kIHRoZSByaWdodC1tb3N0IGNvZXJjaWJsZSBzdHJpbmcgdGhhdCBkb2VzIG5vdCBzaGFyZVxuICAgIC8vIGEgdGVybWludXMgd2l0aCBhIG1vcmUgbGVmdC13YXJkIGNvZXJjaWJsZSBzdHJpbmcuXG4gICAgLy8gRWcsICcxLjIuMy40JyB3YW50cyB0byBjb2VyY2UgJzIuMy40Jywgbm90ICczLjQnIG9yICc0J1xuICAgIC8vXG4gICAgLy8gV2FsayB0aHJvdWdoIHRoZSBzdHJpbmcgY2hlY2tpbmcgd2l0aCBhIC9nIHJlZ2V4cFxuICAgIC8vIE1hbnVhbGx5IHNldCB0aGUgaW5kZXggc28gYXMgdG8gcGljayB1cCBvdmVybGFwcGluZyBtYXRjaGVzLlxuICAgIC8vIFN0b3Agd2hlbiB3ZSBnZXQgYSBtYXRjaCB0aGF0IGVuZHMgYXQgdGhlIHN0cmluZyBlbmQsIHNpbmNlIG5vXG4gICAgLy8gY29lcmNpYmxlIHN0cmluZyBjYW4gYmUgbW9yZSByaWdodC13YXJkIHdpdGhvdXQgdGhlIHNhbWUgdGVybWludXMuXG4gICAgdmFyIG5leHRcbiAgICB3aGlsZSAoKG5leHQgPSByZVt0LkNPRVJDRVJUTF0uZXhlYyh2ZXJzaW9uKSkgJiZcbiAgICAgICghbWF0Y2ggfHwgbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGggIT09IHZlcnNpb24ubGVuZ3RoKVxuICAgICkge1xuICAgICAgaWYgKCFtYXRjaCB8fFxuICAgICAgICAgIG5leHQuaW5kZXggKyBuZXh0WzBdLmxlbmd0aCAhPT0gbWF0Y2guaW5kZXggKyBtYXRjaFswXS5sZW5ndGgpIHtcbiAgICAgICAgbWF0Y2ggPSBuZXh0XG4gICAgICB9XG4gICAgICByZVt0LkNPRVJDRVJUTF0ubGFzdEluZGV4ID0gbmV4dC5pbmRleCArIG5leHRbMV0ubGVuZ3RoICsgbmV4dFsyXS5sZW5ndGhcbiAgICB9XG4gICAgLy8gbGVhdmUgaXQgaW4gYSBjbGVhbiBzdGF0ZVxuICAgIHJlW3QuQ09FUkNFUlRMXS5sYXN0SW5kZXggPSAtMVxuICB9XG5cbiAgaWYgKG1hdGNoID09PSBudWxsKSB7XG4gICAgcmV0dXJuIG51bGxcbiAgfVxuXG4gIHJldHVybiBwYXJzZShtYXRjaFsyXSArXG4gICAgJy4nICsgKG1hdGNoWzNdIHx8ICcwJykgK1xuICAgICcuJyArIChtYXRjaFs0XSB8fCAnMCcpLCBvcHRpb25zKVxufVxuIiwiKGZ1bmN0aW9uIChnbG9iYWwsIGZhY3RvcnkpIHtcbiAgdHlwZW9mIGV4cG9ydHMgPT09ICdvYmplY3QnICYmIHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnID8gbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KCkgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoJ3VuZGVyc2NvcmUnLCBmYWN0b3J5KSA6XG4gIChnbG9iYWwgPSB0eXBlb2YgZ2xvYmFsVGhpcyAhPT0gJ3VuZGVmaW5lZCcgPyBnbG9iYWxUaGlzIDogZ2xvYmFsIHx8IHNlbGYsIChmdW5jdGlvbiAoKSB7XG4gICAgdmFyIGN1cnJlbnQgPSBnbG9iYWwuXztcbiAgICB2YXIgZXhwb3J0cyA9IGdsb2JhbC5fID0gZmFjdG9yeSgpO1xuICAgIGV4cG9ydHMubm9Db25mbGljdCA9IGZ1bmN0aW9uICgpIHsgZ2xvYmFsLl8gPSBjdXJyZW50OyByZXR1cm4gZXhwb3J0czsgfTtcbiAgfSgpKSk7XG59KHRoaXMsIChmdW5jdGlvbiAoKSB7XG4gIC8vICAgICBVbmRlcnNjb3JlLmpzIDEuMTMuNlxuICAvLyAgICAgaHR0cHM6Ly91bmRlcnNjb3JlanMub3JnXG4gIC8vICAgICAoYykgMjAwOS0yMDIyIEplcmVteSBBc2hrZW5hcywgSnVsaWFuIEdvbmdncmlqcCwgYW5kIERvY3VtZW50Q2xvdWQgYW5kIEludmVzdGlnYXRpdmUgUmVwb3J0ZXJzICYgRWRpdG9yc1xuICAvLyAgICAgVW5kZXJzY29yZSBtYXkgYmUgZnJlZWx5IGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cblxuICAvLyBDdXJyZW50IHZlcnNpb24uXG4gIHZhciBWRVJTSU9OID0gJzEuMTMuNic7XG5cbiAgLy8gRXN0YWJsaXNoIHRoZSByb290IG9iamVjdCwgYHdpbmRvd2AgKGBzZWxmYCkgaW4gdGhlIGJyb3dzZXIsIGBnbG9iYWxgXG4gIC8vIG9uIHRoZSBzZXJ2ZXIsIG9yIGB0aGlzYCBpbiBzb21lIHZpcnR1YWwgbWFjaGluZXMuIFdlIHVzZSBgc2VsZmBcbiAgLy8gaW5zdGVhZCBvZiBgd2luZG93YCBmb3IgYFdlYldvcmtlcmAgc3VwcG9ydC5cbiAgdmFyIHJvb3QgPSAodHlwZW9mIHNlbGYgPT0gJ29iamVjdCcgJiYgc2VsZi5zZWxmID09PSBzZWxmICYmIHNlbGYpIHx8XG4gICAgICAgICAgICAodHlwZW9mIGdsb2JhbCA9PSAnb2JqZWN0JyAmJiBnbG9iYWwuZ2xvYmFsID09PSBnbG9iYWwgJiYgZ2xvYmFsKSB8fFxuICAgICAgICAgICAgRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKSB8fFxuICAgICAgICAgICAge307XG5cbiAgLy8gU2F2ZSBieXRlcyBpbiB0aGUgbWluaWZpZWQgKGJ1dCBub3QgZ3ppcHBlZCkgdmVyc2lvbjpcbiAgdmFyIEFycmF5UHJvdG8gPSBBcnJheS5wcm90b3R5cGUsIE9ialByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcbiAgdmFyIFN5bWJvbFByb3RvID0gdHlwZW9mIFN5bWJvbCAhPT0gJ3VuZGVmaW5lZCcgPyBTeW1ib2wucHJvdG90eXBlIDogbnVsbDtcblxuICAvLyBDcmVhdGUgcXVpY2sgcmVmZXJlbmNlIHZhcmlhYmxlcyBmb3Igc3BlZWQgYWNjZXNzIHRvIGNvcmUgcHJvdG90eXBlcy5cbiAgdmFyIHB1c2ggPSBBcnJheVByb3RvLnB1c2gsXG4gICAgICBzbGljZSA9IEFycmF5UHJvdG8uc2xpY2UsXG4gICAgICB0b1N0cmluZyA9IE9ialByb3RvLnRvU3RyaW5nLFxuICAgICAgaGFzT3duUHJvcGVydHkgPSBPYmpQcm90by5oYXNPd25Qcm9wZXJ0eTtcblxuICAvLyBNb2Rlcm4gZmVhdHVyZSBkZXRlY3Rpb24uXG4gIHZhciBzdXBwb3J0c0FycmF5QnVmZmVyID0gdHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyxcbiAgICAgIHN1cHBvcnRzRGF0YVZpZXcgPSB0eXBlb2YgRGF0YVZpZXcgIT09ICd1bmRlZmluZWQnO1xuXG4gIC8vIEFsbCAqKkVDTUFTY3JpcHQgNSsqKiBuYXRpdmUgZnVuY3Rpb24gaW1wbGVtZW50YXRpb25zIHRoYXQgd2UgaG9wZSB0byB1c2VcbiAgLy8gYXJlIGRlY2xhcmVkIGhlcmUuXG4gIHZhciBuYXRpdmVJc0FycmF5ID0gQXJyYXkuaXNBcnJheSxcbiAgICAgIG5hdGl2ZUtleXMgPSBPYmplY3Qua2V5cyxcbiAgICAgIG5hdGl2ZUNyZWF0ZSA9IE9iamVjdC5jcmVhdGUsXG4gICAgICBuYXRpdmVJc1ZpZXcgPSBzdXBwb3J0c0FycmF5QnVmZmVyICYmIEFycmF5QnVmZmVyLmlzVmlldztcblxuICAvLyBDcmVhdGUgcmVmZXJlbmNlcyB0byB0aGVzZSBidWlsdGluIGZ1bmN0aW9ucyBiZWNhdXNlIHdlIG92ZXJyaWRlIHRoZW0uXG4gIHZhciBfaXNOYU4gPSBpc05hTixcbiAgICAgIF9pc0Zpbml0ZSA9IGlzRmluaXRlO1xuXG4gIC8vIEtleXMgaW4gSUUgPCA5IHRoYXQgd29uJ3QgYmUgaXRlcmF0ZWQgYnkgYGZvciBrZXkgaW4gLi4uYCBhbmQgdGh1cyBtaXNzZWQuXG4gIHZhciBoYXNFbnVtQnVnID0gIXt0b1N0cmluZzogbnVsbH0ucHJvcGVydHlJc0VudW1lcmFibGUoJ3RvU3RyaW5nJyk7XG4gIHZhciBub25FbnVtZXJhYmxlUHJvcHMgPSBbJ3ZhbHVlT2YnLCAnaXNQcm90b3R5cGVPZicsICd0b1N0cmluZycsXG4gICAgJ3Byb3BlcnR5SXNFbnVtZXJhYmxlJywgJ2hhc093blByb3BlcnR5JywgJ3RvTG9jYWxlU3RyaW5nJ107XG5cbiAgLy8gVGhlIGxhcmdlc3QgaW50ZWdlciB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCBleGFjdGx5LlxuICB2YXIgTUFYX0FSUkFZX0lOREVYID0gTWF0aC5wb3coMiwgNTMpIC0gMTtcblxuICAvLyBTb21lIGZ1bmN0aW9ucyB0YWtlIGEgdmFyaWFibGUgbnVtYmVyIG9mIGFyZ3VtZW50cywgb3IgYSBmZXcgZXhwZWN0ZWRcbiAgLy8gYXJndW1lbnRzIGF0IHRoZSBiZWdpbm5pbmcgYW5kIHRoZW4gYSB2YXJpYWJsZSBudW1iZXIgb2YgdmFsdWVzIHRvIG9wZXJhdGVcbiAgLy8gb24uIFRoaXMgaGVscGVyIGFjY3VtdWxhdGVzIGFsbCByZW1haW5pbmcgYXJndW1lbnRzIHBhc3QgdGhlIGZ1bmN0aW9u4oCZc1xuICAvLyBhcmd1bWVudCBsZW5ndGggKG9yIGFuIGV4cGxpY2l0IGBzdGFydEluZGV4YCksIGludG8gYW4gYXJyYXkgdGhhdCBiZWNvbWVzXG4gIC8vIHRoZSBsYXN0IGFyZ3VtZW50LiBTaW1pbGFyIHRvIEVTNuKAmXMgXCJyZXN0IHBhcmFtZXRlclwiLlxuICBmdW5jdGlvbiByZXN0QXJndW1lbnRzKGZ1bmMsIHN0YXJ0SW5kZXgpIHtcbiAgICBzdGFydEluZGV4ID0gc3RhcnRJbmRleCA9PSBudWxsID8gZnVuYy5sZW5ndGggLSAxIDogK3N0YXJ0SW5kZXg7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIGxlbmd0aCA9IE1hdGgubWF4KGFyZ3VtZW50cy5sZW5ndGggLSBzdGFydEluZGV4LCAwKSxcbiAgICAgICAgICByZXN0ID0gQXJyYXkobGVuZ3RoKSxcbiAgICAgICAgICBpbmRleCA9IDA7XG4gICAgICBmb3IgKDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgcmVzdFtpbmRleF0gPSBhcmd1bWVudHNbaW5kZXggKyBzdGFydEluZGV4XTtcbiAgICAgIH1cbiAgICAgIHN3aXRjaCAoc3RhcnRJbmRleCkge1xuICAgICAgICBjYXNlIDA6IHJldHVybiBmdW5jLmNhbGwodGhpcywgcmVzdCk7XG4gICAgICAgIGNhc2UgMTogcmV0dXJuIGZ1bmMuY2FsbCh0aGlzLCBhcmd1bWVudHNbMF0sIHJlc3QpO1xuICAgICAgICBjYXNlIDI6IHJldHVybiBmdW5jLmNhbGwodGhpcywgYXJndW1lbnRzWzBdLCBhcmd1bWVudHNbMV0sIHJlc3QpO1xuICAgICAgfVxuICAgICAgdmFyIGFyZ3MgPSBBcnJheShzdGFydEluZGV4ICsgMSk7XG4gICAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzdGFydEluZGV4OyBpbmRleCsrKSB7XG4gICAgICAgIGFyZ3NbaW5kZXhdID0gYXJndW1lbnRzW2luZGV4XTtcbiAgICAgIH1cbiAgICAgIGFyZ3Nbc3RhcnRJbmRleF0gPSByZXN0O1xuICAgICAgcmV0dXJuIGZ1bmMuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIElzIGEgZ2l2ZW4gdmFyaWFibGUgYW4gb2JqZWN0P1xuICBmdW5jdGlvbiBpc09iamVjdChvYmopIHtcbiAgICB2YXIgdHlwZSA9IHR5cGVvZiBvYmo7XG4gICAgcmV0dXJuIHR5cGUgPT09ICdmdW5jdGlvbicgfHwgKHR5cGUgPT09ICdvYmplY3QnICYmICEhb2JqKTtcbiAgfVxuXG4gIC8vIElzIGEgZ2l2ZW4gdmFsdWUgZXF1YWwgdG8gbnVsbD9cbiAgZnVuY3Rpb24gaXNOdWxsKG9iaikge1xuICAgIHJldHVybiBvYmogPT09IG51bGw7XG4gIH1cblxuICAvLyBJcyBhIGdpdmVuIHZhcmlhYmxlIHVuZGVmaW5lZD9cbiAgZnVuY3Rpb24gaXNVbmRlZmluZWQob2JqKSB7XG4gICAgcmV0dXJuIG9iaiA9PT0gdm9pZCAwO1xuICB9XG5cbiAgLy8gSXMgYSBnaXZlbiB2YWx1ZSBhIGJvb2xlYW4/XG4gIGZ1bmN0aW9uIGlzQm9vbGVhbihvYmopIHtcbiAgICByZXR1cm4gb2JqID09PSB0cnVlIHx8IG9iaiA9PT0gZmFsc2UgfHwgdG9TdHJpbmcuY2FsbChvYmopID09PSAnW29iamVjdCBCb29sZWFuXSc7XG4gIH1cblxuICAvLyBJcyBhIGdpdmVuIHZhbHVlIGEgRE9NIGVsZW1lbnQ/XG4gIGZ1bmN0aW9uIGlzRWxlbWVudChvYmopIHtcbiAgICByZXR1cm4gISEob2JqICYmIG9iai5ub2RlVHlwZSA9PT0gMSk7XG4gIH1cblxuICAvLyBJbnRlcm5hbCBmdW5jdGlvbiBmb3IgY3JlYXRpbmcgYSBgdG9TdHJpbmdgLWJhc2VkIHR5cGUgdGVzdGVyLlxuICBmdW5jdGlvbiB0YWdUZXN0ZXIobmFtZSkge1xuICAgIHZhciB0YWcgPSAnW29iamVjdCAnICsgbmFtZSArICddJztcbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbChvYmopID09PSB0YWc7XG4gICAgfTtcbiAgfVxuXG4gIHZhciBpc1N0cmluZyA9IHRhZ1Rlc3RlcignU3RyaW5nJyk7XG5cbiAgdmFyIGlzTnVtYmVyID0gdGFnVGVzdGVyKCdOdW1iZXInKTtcblxuICB2YXIgaXNEYXRlID0gdGFnVGVzdGVyKCdEYXRlJyk7XG5cbiAgdmFyIGlzUmVnRXhwID0gdGFnVGVzdGVyKCdSZWdFeHAnKTtcblxuICB2YXIgaXNFcnJvciA9IHRhZ1Rlc3RlcignRXJyb3InKTtcblxuICB2YXIgaXNTeW1ib2wgPSB0YWdUZXN0ZXIoJ1N5bWJvbCcpO1xuXG4gIHZhciBpc0FycmF5QnVmZmVyID0gdGFnVGVzdGVyKCdBcnJheUJ1ZmZlcicpO1xuXG4gIHZhciBpc0Z1bmN0aW9uID0gdGFnVGVzdGVyKCdGdW5jdGlvbicpO1xuXG4gIC8vIE9wdGltaXplIGBpc0Z1bmN0aW9uYCBpZiBhcHByb3ByaWF0ZS4gV29yayBhcm91bmQgc29tZSBgdHlwZW9mYCBidWdzIGluIG9sZFxuICAvLyB2OCwgSUUgMTEgKCMxNjIxKSwgU2FmYXJpIDggKCMxOTI5KSwgYW5kIFBoYW50b21KUyAoIzIyMzYpLlxuICB2YXIgbm9kZWxpc3QgPSByb290LmRvY3VtZW50ICYmIHJvb3QuZG9jdW1lbnQuY2hpbGROb2RlcztcbiAgaWYgKHR5cGVvZiAvLi8gIT0gJ2Z1bmN0aW9uJyAmJiB0eXBlb2YgSW50OEFycmF5ICE9ICdvYmplY3QnICYmIHR5cGVvZiBub2RlbGlzdCAhPSAnZnVuY3Rpb24nKSB7XG4gICAgaXNGdW5jdGlvbiA9IGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIHR5cGVvZiBvYmogPT0gJ2Z1bmN0aW9uJyB8fCBmYWxzZTtcbiAgICB9O1xuICB9XG5cbiAgdmFyIGlzRnVuY3Rpb24kMSA9IGlzRnVuY3Rpb247XG5cbiAgdmFyIGhhc09iamVjdFRhZyA9IHRhZ1Rlc3RlcignT2JqZWN0Jyk7XG5cbiAgLy8gSW4gSUUgMTAgLSBFZGdlIDEzLCBgRGF0YVZpZXdgIGhhcyBzdHJpbmcgdGFnIGAnW29iamVjdCBPYmplY3RdJ2AuXG4gIC8vIEluIElFIDExLCB0aGUgbW9zdCBjb21tb24gYW1vbmcgdGhlbSwgdGhpcyBwcm9ibGVtIGFsc28gYXBwbGllcyB0b1xuICAvLyBgTWFwYCwgYFdlYWtNYXBgIGFuZCBgU2V0YC5cbiAgdmFyIGhhc1N0cmluZ1RhZ0J1ZyA9IChcbiAgICAgICAgc3VwcG9ydHNEYXRhVmlldyAmJiBoYXNPYmplY3RUYWcobmV3IERhdGFWaWV3KG5ldyBBcnJheUJ1ZmZlcig4KSkpXG4gICAgICApLFxuICAgICAgaXNJRTExID0gKHR5cGVvZiBNYXAgIT09ICd1bmRlZmluZWQnICYmIGhhc09iamVjdFRhZyhuZXcgTWFwKSk7XG5cbiAgdmFyIGlzRGF0YVZpZXcgPSB0YWdUZXN0ZXIoJ0RhdGFWaWV3Jyk7XG5cbiAgLy8gSW4gSUUgMTAgLSBFZGdlIDEzLCB3ZSBuZWVkIGEgZGlmZmVyZW50IGhldXJpc3RpY1xuICAvLyB0byBkZXRlcm1pbmUgd2hldGhlciBhbiBvYmplY3QgaXMgYSBgRGF0YVZpZXdgLlxuICBmdW5jdGlvbiBpZTEwSXNEYXRhVmlldyhvYmopIHtcbiAgICByZXR1cm4gb2JqICE9IG51bGwgJiYgaXNGdW5jdGlvbiQxKG9iai5nZXRJbnQ4KSAmJiBpc0FycmF5QnVmZmVyKG9iai5idWZmZXIpO1xuICB9XG5cbiAgdmFyIGlzRGF0YVZpZXckMSA9IChoYXNTdHJpbmdUYWdCdWcgPyBpZTEwSXNEYXRhVmlldyA6IGlzRGF0YVZpZXcpO1xuXG4gIC8vIElzIGEgZ2l2ZW4gdmFsdWUgYW4gYXJyYXk/XG4gIC8vIERlbGVnYXRlcyB0byBFQ01BNSdzIG5hdGl2ZSBgQXJyYXkuaXNBcnJheWAuXG4gIHZhciBpc0FycmF5ID0gbmF0aXZlSXNBcnJheSB8fCB0YWdUZXN0ZXIoJ0FycmF5Jyk7XG5cbiAgLy8gSW50ZXJuYWwgZnVuY3Rpb24gdG8gY2hlY2sgd2hldGhlciBga2V5YCBpcyBhbiBvd24gcHJvcGVydHkgbmFtZSBvZiBgb2JqYC5cbiAgZnVuY3Rpb24gaGFzJDEob2JqLCBrZXkpIHtcbiAgICByZXR1cm4gb2JqICE9IG51bGwgJiYgaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSk7XG4gIH1cblxuICB2YXIgaXNBcmd1bWVudHMgPSB0YWdUZXN0ZXIoJ0FyZ3VtZW50cycpO1xuXG4gIC8vIERlZmluZSBhIGZhbGxiYWNrIHZlcnNpb24gb2YgdGhlIG1ldGhvZCBpbiBicm93c2VycyAoYWhlbSwgSUUgPCA5KSwgd2hlcmVcbiAgLy8gdGhlcmUgaXNuJ3QgYW55IGluc3BlY3RhYmxlIFwiQXJndW1lbnRzXCIgdHlwZS5cbiAgKGZ1bmN0aW9uKCkge1xuICAgIGlmICghaXNBcmd1bWVudHMoYXJndW1lbnRzKSkge1xuICAgICAgaXNBcmd1bWVudHMgPSBmdW5jdGlvbihvYmopIHtcbiAgICAgICAgcmV0dXJuIGhhcyQxKG9iaiwgJ2NhbGxlZScpO1xuICAgICAgfTtcbiAgICB9XG4gIH0oKSk7XG5cbiAgdmFyIGlzQXJndW1lbnRzJDEgPSBpc0FyZ3VtZW50cztcblxuICAvLyBJcyBhIGdpdmVuIG9iamVjdCBhIGZpbml0ZSBudW1iZXI/XG4gIGZ1bmN0aW9uIGlzRmluaXRlJDEob2JqKSB7XG4gICAgcmV0dXJuICFpc1N5bWJvbChvYmopICYmIF9pc0Zpbml0ZShvYmopICYmICFpc05hTihwYXJzZUZsb2F0KG9iaikpO1xuICB9XG5cbiAgLy8gSXMgdGhlIGdpdmVuIHZhbHVlIGBOYU5gP1xuICBmdW5jdGlvbiBpc05hTiQxKG9iaikge1xuICAgIHJldHVybiBpc051bWJlcihvYmopICYmIF9pc05hTihvYmopO1xuICB9XG5cbiAgLy8gUHJlZGljYXRlLWdlbmVyYXRpbmcgZnVuY3Rpb24uIE9mdGVuIHVzZWZ1bCBvdXRzaWRlIG9mIFVuZGVyc2NvcmUuXG4gIGZ1bmN0aW9uIGNvbnN0YW50KHZhbHVlKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIHZhbHVlO1xuICAgIH07XG4gIH1cblxuICAvLyBDb21tb24gaW50ZXJuYWwgbG9naWMgZm9yIGBpc0FycmF5TGlrZWAgYW5kIGBpc0J1ZmZlckxpa2VgLlxuICBmdW5jdGlvbiBjcmVhdGVTaXplUHJvcGVydHlDaGVjayhnZXRTaXplUHJvcGVydHkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oY29sbGVjdGlvbikge1xuICAgICAgdmFyIHNpemVQcm9wZXJ0eSA9IGdldFNpemVQcm9wZXJ0eShjb2xsZWN0aW9uKTtcbiAgICAgIHJldHVybiB0eXBlb2Ygc2l6ZVByb3BlcnR5ID09ICdudW1iZXInICYmIHNpemVQcm9wZXJ0eSA+PSAwICYmIHNpemVQcm9wZXJ0eSA8PSBNQVhfQVJSQVlfSU5ERVg7XG4gICAgfVxuICB9XG5cbiAgLy8gSW50ZXJuYWwgaGVscGVyIHRvIGdlbmVyYXRlIGEgZnVuY3Rpb24gdG8gb2J0YWluIHByb3BlcnR5IGBrZXlgIGZyb20gYG9iamAuXG4gIGZ1bmN0aW9uIHNoYWxsb3dQcm9wZXJ0eShrZXkpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gb2JqID09IG51bGwgPyB2b2lkIDAgOiBvYmpba2V5XTtcbiAgICB9O1xuICB9XG5cbiAgLy8gSW50ZXJuYWwgaGVscGVyIHRvIG9idGFpbiB0aGUgYGJ5dGVMZW5ndGhgIHByb3BlcnR5IG9mIGFuIG9iamVjdC5cbiAgdmFyIGdldEJ5dGVMZW5ndGggPSBzaGFsbG93UHJvcGVydHkoJ2J5dGVMZW5ndGgnKTtcblxuICAvLyBJbnRlcm5hbCBoZWxwZXIgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgd2Ugc2hvdWxkIHNwZW5kIGV4dGVuc2l2ZSBjaGVja3MgYWdhaW5zdFxuICAvLyBgQXJyYXlCdWZmZXJgIGV0IGFsLlxuICB2YXIgaXNCdWZmZXJMaWtlID0gY3JlYXRlU2l6ZVByb3BlcnR5Q2hlY2soZ2V0Qnl0ZUxlbmd0aCk7XG5cbiAgLy8gSXMgYSBnaXZlbiB2YWx1ZSBhIHR5cGVkIGFycmF5P1xuICB2YXIgdHlwZWRBcnJheVBhdHRlcm4gPSAvXFxbb2JqZWN0ICgoSXxVaSludCg4fDE2fDMyKXxGbG9hdCgzMnw2NCl8VWludDhDbGFtcGVkfEJpZyhJfFVpKW50NjQpQXJyYXlcXF0vO1xuICBmdW5jdGlvbiBpc1R5cGVkQXJyYXkob2JqKSB7XG4gICAgLy8gYEFycmF5QnVmZmVyLmlzVmlld2AgaXMgdGhlIG1vc3QgZnV0dXJlLXByb29mLCBzbyB1c2UgaXQgd2hlbiBhdmFpbGFibGUuXG4gICAgLy8gT3RoZXJ3aXNlLCBmYWxsIGJhY2sgb24gdGhlIGFib3ZlIHJlZ3VsYXIgZXhwcmVzc2lvbi5cbiAgICByZXR1cm4gbmF0aXZlSXNWaWV3ID8gKG5hdGl2ZUlzVmlldyhvYmopICYmICFpc0RhdGFWaWV3JDEob2JqKSkgOlxuICAgICAgICAgICAgICAgICAgaXNCdWZmZXJMaWtlKG9iaikgJiYgdHlwZWRBcnJheVBhdHRlcm4udGVzdCh0b1N0cmluZy5jYWxsKG9iaikpO1xuICB9XG5cbiAgdmFyIGlzVHlwZWRBcnJheSQxID0gc3VwcG9ydHNBcnJheUJ1ZmZlciA/IGlzVHlwZWRBcnJheSA6IGNvbnN0YW50KGZhbHNlKTtcblxuICAvLyBJbnRlcm5hbCBoZWxwZXIgdG8gb2J0YWluIHRoZSBgbGVuZ3RoYCBwcm9wZXJ0eSBvZiBhbiBvYmplY3QuXG4gIHZhciBnZXRMZW5ndGggPSBzaGFsbG93UHJvcGVydHkoJ2xlbmd0aCcpO1xuXG4gIC8vIEludGVybmFsIGhlbHBlciB0byBjcmVhdGUgYSBzaW1wbGUgbG9va3VwIHN0cnVjdHVyZS5cbiAgLy8gYGNvbGxlY3ROb25FbnVtUHJvcHNgIHVzZWQgdG8gZGVwZW5kIG9uIGBfLmNvbnRhaW5zYCwgYnV0IHRoaXMgbGVkIHRvXG4gIC8vIGNpcmN1bGFyIGltcG9ydHMuIGBlbXVsYXRlZFNldGAgaXMgYSBvbmUtb2ZmIHNvbHV0aW9uIHRoYXQgb25seSB3b3JrcyBmb3JcbiAgLy8gYXJyYXlzIG9mIHN0cmluZ3MuXG4gIGZ1bmN0aW9uIGVtdWxhdGVkU2V0KGtleXMpIHtcbiAgICB2YXIgaGFzaCA9IHt9O1xuICAgIGZvciAodmFyIGwgPSBrZXlzLmxlbmd0aCwgaSA9IDA7IGkgPCBsOyArK2kpIGhhc2hba2V5c1tpXV0gPSB0cnVlO1xuICAgIHJldHVybiB7XG4gICAgICBjb250YWluczogZnVuY3Rpb24oa2V5KSB7IHJldHVybiBoYXNoW2tleV0gPT09IHRydWU7IH0sXG4gICAgICBwdXNoOiBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgaGFzaFtrZXldID0gdHJ1ZTtcbiAgICAgICAgcmV0dXJuIGtleXMucHVzaChrZXkpO1xuICAgICAgfVxuICAgIH07XG4gIH1cblxuICAvLyBJbnRlcm5hbCBoZWxwZXIuIENoZWNrcyBga2V5c2AgZm9yIHRoZSBwcmVzZW5jZSBvZiBrZXlzIGluIElFIDwgOSB0aGF0IHdvbid0XG4gIC8vIGJlIGl0ZXJhdGVkIGJ5IGBmb3Iga2V5IGluIC4uLmAgYW5kIHRodXMgbWlzc2VkLiBFeHRlbmRzIGBrZXlzYCBpbiBwbGFjZSBpZlxuICAvLyBuZWVkZWQuXG4gIGZ1bmN0aW9uIGNvbGxlY3ROb25FbnVtUHJvcHMob2JqLCBrZXlzKSB7XG4gICAga2V5cyA9IGVtdWxhdGVkU2V0KGtleXMpO1xuICAgIHZhciBub25FbnVtSWR4ID0gbm9uRW51bWVyYWJsZVByb3BzLmxlbmd0aDtcbiAgICB2YXIgY29uc3RydWN0b3IgPSBvYmouY29uc3RydWN0b3I7XG4gICAgdmFyIHByb3RvID0gKGlzRnVuY3Rpb24kMShjb25zdHJ1Y3RvcikgJiYgY29uc3RydWN0b3IucHJvdG90eXBlKSB8fCBPYmpQcm90bztcblxuICAgIC8vIENvbnN0cnVjdG9yIGlzIGEgc3BlY2lhbCBjYXNlLlxuICAgIHZhciBwcm9wID0gJ2NvbnN0cnVjdG9yJztcbiAgICBpZiAoaGFzJDEob2JqLCBwcm9wKSAmJiAha2V5cy5jb250YWlucyhwcm9wKSkga2V5cy5wdXNoKHByb3ApO1xuXG4gICAgd2hpbGUgKG5vbkVudW1JZHgtLSkge1xuICAgICAgcHJvcCA9IG5vbkVudW1lcmFibGVQcm9wc1tub25FbnVtSWR4XTtcbiAgICAgIGlmIChwcm9wIGluIG9iaiAmJiBvYmpbcHJvcF0gIT09IHByb3RvW3Byb3BdICYmICFrZXlzLmNvbnRhaW5zKHByb3ApKSB7XG4gICAgICAgIGtleXMucHVzaChwcm9wKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBSZXRyaWV2ZSB0aGUgbmFtZXMgb2YgYW4gb2JqZWN0J3Mgb3duIHByb3BlcnRpZXMuXG4gIC8vIERlbGVnYXRlcyB0byAqKkVDTUFTY3JpcHQgNSoqJ3MgbmF0aXZlIGBPYmplY3Qua2V5c2AuXG4gIGZ1bmN0aW9uIGtleXMob2JqKSB7XG4gICAgaWYgKCFpc09iamVjdChvYmopKSByZXR1cm4gW107XG4gICAgaWYgKG5hdGl2ZUtleXMpIHJldHVybiBuYXRpdmVLZXlzKG9iaik7XG4gICAgdmFyIGtleXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSBpZiAoaGFzJDEob2JqLCBrZXkpKSBrZXlzLnB1c2goa2V5KTtcbiAgICAvLyBBaGVtLCBJRSA8IDkuXG4gICAgaWYgKGhhc0VudW1CdWcpIGNvbGxlY3ROb25FbnVtUHJvcHMob2JqLCBrZXlzKTtcbiAgICByZXR1cm4ga2V5cztcbiAgfVxuXG4gIC8vIElzIGEgZ2l2ZW4gYXJyYXksIHN0cmluZywgb3Igb2JqZWN0IGVtcHR5P1xuICAvLyBBbiBcImVtcHR5XCIgb2JqZWN0IGhhcyBubyBlbnVtZXJhYmxlIG93bi1wcm9wZXJ0aWVzLlxuICBmdW5jdGlvbiBpc0VtcHR5KG9iaikge1xuICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIHRydWU7XG4gICAgLy8gU2tpcCB0aGUgbW9yZSBleHBlbnNpdmUgYHRvU3RyaW5nYC1iYXNlZCB0eXBlIGNoZWNrcyBpZiBgb2JqYCBoYXMgbm9cbiAgICAvLyBgLmxlbmd0aGAuXG4gICAgdmFyIGxlbmd0aCA9IGdldExlbmd0aChvYmopO1xuICAgIGlmICh0eXBlb2YgbGVuZ3RoID09ICdudW1iZXInICYmIChcbiAgICAgIGlzQXJyYXkob2JqKSB8fCBpc1N0cmluZyhvYmopIHx8IGlzQXJndW1lbnRzJDEob2JqKVxuICAgICkpIHJldHVybiBsZW5ndGggPT09IDA7XG4gICAgcmV0dXJuIGdldExlbmd0aChrZXlzKG9iaikpID09PSAwO1xuICB9XG5cbiAgLy8gUmV0dXJucyB3aGV0aGVyIGFuIG9iamVjdCBoYXMgYSBnaXZlbiBzZXQgb2YgYGtleTp2YWx1ZWAgcGFpcnMuXG4gIGZ1bmN0aW9uIGlzTWF0Y2gob2JqZWN0LCBhdHRycykge1xuICAgIHZhciBfa2V5cyA9IGtleXMoYXR0cnMpLCBsZW5ndGggPSBfa2V5cy5sZW5ndGg7XG4gICAgaWYgKG9iamVjdCA9PSBudWxsKSByZXR1cm4gIWxlbmd0aDtcbiAgICB2YXIgb2JqID0gT2JqZWN0KG9iamVjdCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IF9rZXlzW2ldO1xuICAgICAgaWYgKGF0dHJzW2tleV0gIT09IG9ialtrZXldIHx8ICEoa2V5IGluIG9iaikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBJZiBVbmRlcnNjb3JlIGlzIGNhbGxlZCBhcyBhIGZ1bmN0aW9uLCBpdCByZXR1cm5zIGEgd3JhcHBlZCBvYmplY3QgdGhhdCBjYW5cbiAgLy8gYmUgdXNlZCBPTy1zdHlsZS4gVGhpcyB3cmFwcGVyIGhvbGRzIGFsdGVyZWQgdmVyc2lvbnMgb2YgYWxsIGZ1bmN0aW9ucyBhZGRlZFxuICAvLyB0aHJvdWdoIGBfLm1peGluYC4gV3JhcHBlZCBvYmplY3RzIG1heSBiZSBjaGFpbmVkLlxuICBmdW5jdGlvbiBfJDEob2JqKSB7XG4gICAgaWYgKG9iaiBpbnN0YW5jZW9mIF8kMSkgcmV0dXJuIG9iajtcbiAgICBpZiAoISh0aGlzIGluc3RhbmNlb2YgXyQxKSkgcmV0dXJuIG5ldyBfJDEob2JqKTtcbiAgICB0aGlzLl93cmFwcGVkID0gb2JqO1xuICB9XG5cbiAgXyQxLlZFUlNJT04gPSBWRVJTSU9OO1xuXG4gIC8vIEV4dHJhY3RzIHRoZSByZXN1bHQgZnJvbSBhIHdyYXBwZWQgYW5kIGNoYWluZWQgb2JqZWN0LlxuICBfJDEucHJvdG90eXBlLnZhbHVlID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIHRoaXMuX3dyYXBwZWQ7XG4gIH07XG5cbiAgLy8gUHJvdmlkZSB1bndyYXBwaW5nIHByb3hpZXMgZm9yIHNvbWUgbWV0aG9kcyB1c2VkIGluIGVuZ2luZSBvcGVyYXRpb25zXG4gIC8vIHN1Y2ggYXMgYXJpdGhtZXRpYyBhbmQgSlNPTiBzdHJpbmdpZmljYXRpb24uXG4gIF8kMS5wcm90b3R5cGUudmFsdWVPZiA9IF8kMS5wcm90b3R5cGUudG9KU09OID0gXyQxLnByb3RvdHlwZS52YWx1ZTtcblxuICBfJDEucHJvdG90eXBlLnRvU3RyaW5nID0gZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIFN0cmluZyh0aGlzLl93cmFwcGVkKTtcbiAgfTtcblxuICAvLyBJbnRlcm5hbCBmdW5jdGlvbiB0byB3cmFwIG9yIHNoYWxsb3ctY29weSBhbiBBcnJheUJ1ZmZlcixcbiAgLy8gdHlwZWQgYXJyYXkgb3IgRGF0YVZpZXcgdG8gYSBuZXcgdmlldywgcmV1c2luZyB0aGUgYnVmZmVyLlxuICBmdW5jdGlvbiB0b0J1ZmZlclZpZXcoYnVmZmVyU291cmNlKSB7XG4gICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KFxuICAgICAgYnVmZmVyU291cmNlLmJ1ZmZlciB8fCBidWZmZXJTb3VyY2UsXG4gICAgICBidWZmZXJTb3VyY2UuYnl0ZU9mZnNldCB8fCAwLFxuICAgICAgZ2V0Qnl0ZUxlbmd0aChidWZmZXJTb3VyY2UpXG4gICAgKTtcbiAgfVxuXG4gIC8vIFdlIHVzZSB0aGlzIHN0cmluZyB0d2ljZSwgc28gZ2l2ZSBpdCBhIG5hbWUgZm9yIG1pbmlmaWNhdGlvbi5cbiAgdmFyIHRhZ0RhdGFWaWV3ID0gJ1tvYmplY3QgRGF0YVZpZXddJztcblxuICAvLyBJbnRlcm5hbCByZWN1cnNpdmUgY29tcGFyaXNvbiBmdW5jdGlvbiBmb3IgYF8uaXNFcXVhbGAuXG4gIGZ1bmN0aW9uIGVxKGEsIGIsIGFTdGFjaywgYlN0YWNrKSB7XG4gICAgLy8gSWRlbnRpY2FsIG9iamVjdHMgYXJlIGVxdWFsLiBgMCA9PT0gLTBgLCBidXQgdGhleSBhcmVuJ3QgaWRlbnRpY2FsLlxuICAgIC8vIFNlZSB0aGUgW0hhcm1vbnkgYGVnYWxgIHByb3Bvc2FsXShodHRwczovL3dpa2kuZWNtYXNjcmlwdC5vcmcvZG9rdS5waHA/aWQ9aGFybW9ueTplZ2FsKS5cbiAgICBpZiAoYSA9PT0gYikgcmV0dXJuIGEgIT09IDAgfHwgMSAvIGEgPT09IDEgLyBiO1xuICAgIC8vIGBudWxsYCBvciBgdW5kZWZpbmVkYCBvbmx5IGVxdWFsIHRvIGl0c2VsZiAoc3RyaWN0IGNvbXBhcmlzb24pLlxuICAgIGlmIChhID09IG51bGwgfHwgYiA9PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gICAgLy8gYE5hTmBzIGFyZSBlcXVpdmFsZW50LCBidXQgbm9uLXJlZmxleGl2ZS5cbiAgICBpZiAoYSAhPT0gYSkgcmV0dXJuIGIgIT09IGI7XG4gICAgLy8gRXhoYXVzdCBwcmltaXRpdmUgY2hlY2tzXG4gICAgdmFyIHR5cGUgPSB0eXBlb2YgYTtcbiAgICBpZiAodHlwZSAhPT0gJ2Z1bmN0aW9uJyAmJiB0eXBlICE9PSAnb2JqZWN0JyAmJiB0eXBlb2YgYiAhPSAnb2JqZWN0JykgcmV0dXJuIGZhbHNlO1xuICAgIHJldHVybiBkZWVwRXEoYSwgYiwgYVN0YWNrLCBiU3RhY2spO1xuICB9XG5cbiAgLy8gSW50ZXJuYWwgcmVjdXJzaXZlIGNvbXBhcmlzb24gZnVuY3Rpb24gZm9yIGBfLmlzRXF1YWxgLlxuICBmdW5jdGlvbiBkZWVwRXEoYSwgYiwgYVN0YWNrLCBiU3RhY2spIHtcbiAgICAvLyBVbndyYXAgYW55IHdyYXBwZWQgb2JqZWN0cy5cbiAgICBpZiAoYSBpbnN0YW5jZW9mIF8kMSkgYSA9IGEuX3dyYXBwZWQ7XG4gICAgaWYgKGIgaW5zdGFuY2VvZiBfJDEpIGIgPSBiLl93cmFwcGVkO1xuICAgIC8vIENvbXBhcmUgYFtbQ2xhc3NdXWAgbmFtZXMuXG4gICAgdmFyIGNsYXNzTmFtZSA9IHRvU3RyaW5nLmNhbGwoYSk7XG4gICAgaWYgKGNsYXNzTmFtZSAhPT0gdG9TdHJpbmcuY2FsbChiKSkgcmV0dXJuIGZhbHNlO1xuICAgIC8vIFdvcmsgYXJvdW5kIGEgYnVnIGluIElFIDEwIC0gRWRnZSAxMy5cbiAgICBpZiAoaGFzU3RyaW5nVGFnQnVnICYmIGNsYXNzTmFtZSA9PSAnW29iamVjdCBPYmplY3RdJyAmJiBpc0RhdGFWaWV3JDEoYSkpIHtcbiAgICAgIGlmICghaXNEYXRhVmlldyQxKGIpKSByZXR1cm4gZmFsc2U7XG4gICAgICBjbGFzc05hbWUgPSB0YWdEYXRhVmlldztcbiAgICB9XG4gICAgc3dpdGNoIChjbGFzc05hbWUpIHtcbiAgICAgIC8vIFRoZXNlIHR5cGVzIGFyZSBjb21wYXJlZCBieSB2YWx1ZS5cbiAgICAgIGNhc2UgJ1tvYmplY3QgUmVnRXhwXSc6XG4gICAgICAgIC8vIFJlZ0V4cHMgYXJlIGNvZXJjZWQgdG8gc3RyaW5ncyBmb3IgY29tcGFyaXNvbiAoTm90ZTogJycgKyAvYS9pID09PSAnL2EvaScpXG4gICAgICBjYXNlICdbb2JqZWN0IFN0cmluZ10nOlxuICAgICAgICAvLyBQcmltaXRpdmVzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIG9iamVjdCB3cmFwcGVycyBhcmUgZXF1aXZhbGVudDsgdGh1cywgYFwiNVwiYCBpc1xuICAgICAgICAvLyBlcXVpdmFsZW50IHRvIGBuZXcgU3RyaW5nKFwiNVwiKWAuXG4gICAgICAgIHJldHVybiAnJyArIGEgPT09ICcnICsgYjtcbiAgICAgIGNhc2UgJ1tvYmplY3QgTnVtYmVyXSc6XG4gICAgICAgIC8vIGBOYU5gcyBhcmUgZXF1aXZhbGVudCwgYnV0IG5vbi1yZWZsZXhpdmUuXG4gICAgICAgIC8vIE9iamVjdChOYU4pIGlzIGVxdWl2YWxlbnQgdG8gTmFOLlxuICAgICAgICBpZiAoK2EgIT09ICthKSByZXR1cm4gK2IgIT09ICtiO1xuICAgICAgICAvLyBBbiBgZWdhbGAgY29tcGFyaXNvbiBpcyBwZXJmb3JtZWQgZm9yIG90aGVyIG51bWVyaWMgdmFsdWVzLlxuICAgICAgICByZXR1cm4gK2EgPT09IDAgPyAxIC8gK2EgPT09IDEgLyBiIDogK2EgPT09ICtiO1xuICAgICAgY2FzZSAnW29iamVjdCBEYXRlXSc6XG4gICAgICBjYXNlICdbb2JqZWN0IEJvb2xlYW5dJzpcbiAgICAgICAgLy8gQ29lcmNlIGRhdGVzIGFuZCBib29sZWFucyB0byBudW1lcmljIHByaW1pdGl2ZSB2YWx1ZXMuIERhdGVzIGFyZSBjb21wYXJlZCBieSB0aGVpclxuICAgICAgICAvLyBtaWxsaXNlY29uZCByZXByZXNlbnRhdGlvbnMuIE5vdGUgdGhhdCBpbnZhbGlkIGRhdGVzIHdpdGggbWlsbGlzZWNvbmQgcmVwcmVzZW50YXRpb25zXG4gICAgICAgIC8vIG9mIGBOYU5gIGFyZSBub3QgZXF1aXZhbGVudC5cbiAgICAgICAgcmV0dXJuICthID09PSArYjtcbiAgICAgIGNhc2UgJ1tvYmplY3QgU3ltYm9sXSc6XG4gICAgICAgIHJldHVybiBTeW1ib2xQcm90by52YWx1ZU9mLmNhbGwoYSkgPT09IFN5bWJvbFByb3RvLnZhbHVlT2YuY2FsbChiKTtcbiAgICAgIGNhc2UgJ1tvYmplY3QgQXJyYXlCdWZmZXJdJzpcbiAgICAgIGNhc2UgdGFnRGF0YVZpZXc6XG4gICAgICAgIC8vIENvZXJjZSB0byB0eXBlZCBhcnJheSBzbyB3ZSBjYW4gZmFsbCB0aHJvdWdoLlxuICAgICAgICByZXR1cm4gZGVlcEVxKHRvQnVmZmVyVmlldyhhKSwgdG9CdWZmZXJWaWV3KGIpLCBhU3RhY2ssIGJTdGFjayk7XG4gICAgfVxuXG4gICAgdmFyIGFyZUFycmF5cyA9IGNsYXNzTmFtZSA9PT0gJ1tvYmplY3QgQXJyYXldJztcbiAgICBpZiAoIWFyZUFycmF5cyAmJiBpc1R5cGVkQXJyYXkkMShhKSkge1xuICAgICAgICB2YXIgYnl0ZUxlbmd0aCA9IGdldEJ5dGVMZW5ndGgoYSk7XG4gICAgICAgIGlmIChieXRlTGVuZ3RoICE9PSBnZXRCeXRlTGVuZ3RoKGIpKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChhLmJ1ZmZlciA9PT0gYi5idWZmZXIgJiYgYS5ieXRlT2Zmc2V0ID09PSBiLmJ5dGVPZmZzZXQpIHJldHVybiB0cnVlO1xuICAgICAgICBhcmVBcnJheXMgPSB0cnVlO1xuICAgIH1cbiAgICBpZiAoIWFyZUFycmF5cykge1xuICAgICAgaWYgKHR5cGVvZiBhICE9ICdvYmplY3QnIHx8IHR5cGVvZiBiICE9ICdvYmplY3QnKSByZXR1cm4gZmFsc2U7XG5cbiAgICAgIC8vIE9iamVjdHMgd2l0aCBkaWZmZXJlbnQgY29uc3RydWN0b3JzIGFyZSBub3QgZXF1aXZhbGVudCwgYnV0IGBPYmplY3RgcyBvciBgQXJyYXlgc1xuICAgICAgLy8gZnJvbSBkaWZmZXJlbnQgZnJhbWVzIGFyZS5cbiAgICAgIHZhciBhQ3RvciA9IGEuY29uc3RydWN0b3IsIGJDdG9yID0gYi5jb25zdHJ1Y3RvcjtcbiAgICAgIGlmIChhQ3RvciAhPT0gYkN0b3IgJiYgIShpc0Z1bmN0aW9uJDEoYUN0b3IpICYmIGFDdG9yIGluc3RhbmNlb2YgYUN0b3IgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc0Z1bmN0aW9uJDEoYkN0b3IpICYmIGJDdG9yIGluc3RhbmNlb2YgYkN0b3IpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICYmICgnY29uc3RydWN0b3InIGluIGEgJiYgJ2NvbnN0cnVjdG9yJyBpbiBiKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfVxuICAgIC8vIEFzc3VtZSBlcXVhbGl0eSBmb3IgY3ljbGljIHN0cnVjdHVyZXMuIFRoZSBhbGdvcml0aG0gZm9yIGRldGVjdGluZyBjeWNsaWNcbiAgICAvLyBzdHJ1Y3R1cmVzIGlzIGFkYXB0ZWQgZnJvbSBFUyA1LjEgc2VjdGlvbiAxNS4xMi4zLCBhYnN0cmFjdCBvcGVyYXRpb24gYEpPYC5cblxuICAgIC8vIEluaXRpYWxpemluZyBzdGFjayBvZiB0cmF2ZXJzZWQgb2JqZWN0cy5cbiAgICAvLyBJdCdzIGRvbmUgaGVyZSBzaW5jZSB3ZSBvbmx5IG5lZWQgdGhlbSBmb3Igb2JqZWN0cyBhbmQgYXJyYXlzIGNvbXBhcmlzb24uXG4gICAgYVN0YWNrID0gYVN0YWNrIHx8IFtdO1xuICAgIGJTdGFjayA9IGJTdGFjayB8fCBbXTtcbiAgICB2YXIgbGVuZ3RoID0gYVN0YWNrLmxlbmd0aDtcbiAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgIC8vIExpbmVhciBzZWFyY2guIFBlcmZvcm1hbmNlIGlzIGludmVyc2VseSBwcm9wb3J0aW9uYWwgdG8gdGhlIG51bWJlciBvZlxuICAgICAgLy8gdW5pcXVlIG5lc3RlZCBzdHJ1Y3R1cmVzLlxuICAgICAgaWYgKGFTdGFja1tsZW5ndGhdID09PSBhKSByZXR1cm4gYlN0YWNrW2xlbmd0aF0gPT09IGI7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoZSBmaXJzdCBvYmplY3QgdG8gdGhlIHN0YWNrIG9mIHRyYXZlcnNlZCBvYmplY3RzLlxuICAgIGFTdGFjay5wdXNoKGEpO1xuICAgIGJTdGFjay5wdXNoKGIpO1xuXG4gICAgLy8gUmVjdXJzaXZlbHkgY29tcGFyZSBvYmplY3RzIGFuZCBhcnJheXMuXG4gICAgaWYgKGFyZUFycmF5cykge1xuICAgICAgLy8gQ29tcGFyZSBhcnJheSBsZW5ndGhzIHRvIGRldGVybWluZSBpZiBhIGRlZXAgY29tcGFyaXNvbiBpcyBuZWNlc3NhcnkuXG4gICAgICBsZW5ndGggPSBhLmxlbmd0aDtcbiAgICAgIGlmIChsZW5ndGggIT09IGIubGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICAvLyBEZWVwIGNvbXBhcmUgdGhlIGNvbnRlbnRzLCBpZ25vcmluZyBub24tbnVtZXJpYyBwcm9wZXJ0aWVzLlxuICAgICAgd2hpbGUgKGxlbmd0aC0tKSB7XG4gICAgICAgIGlmICghZXEoYVtsZW5ndGhdLCBiW2xlbmd0aF0sIGFTdGFjaywgYlN0YWNrKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvLyBEZWVwIGNvbXBhcmUgb2JqZWN0cy5cbiAgICAgIHZhciBfa2V5cyA9IGtleXMoYSksIGtleTtcbiAgICAgIGxlbmd0aCA9IF9rZXlzLmxlbmd0aDtcbiAgICAgIC8vIEVuc3VyZSB0aGF0IGJvdGggb2JqZWN0cyBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBwcm9wZXJ0aWVzIGJlZm9yZSBjb21wYXJpbmcgZGVlcCBlcXVhbGl0eS5cbiAgICAgIGlmIChrZXlzKGIpLmxlbmd0aCAhPT0gbGVuZ3RoKSByZXR1cm4gZmFsc2U7XG4gICAgICB3aGlsZSAobGVuZ3RoLS0pIHtcbiAgICAgICAgLy8gRGVlcCBjb21wYXJlIGVhY2ggbWVtYmVyXG4gICAgICAgIGtleSA9IF9rZXlzW2xlbmd0aF07XG4gICAgICAgIGlmICghKGhhcyQxKGIsIGtleSkgJiYgZXEoYVtrZXldLCBiW2tleV0sIGFTdGFjaywgYlN0YWNrKSkpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gUmVtb3ZlIHRoZSBmaXJzdCBvYmplY3QgZnJvbSB0aGUgc3RhY2sgb2YgdHJhdmVyc2VkIG9iamVjdHMuXG4gICAgYVN0YWNrLnBvcCgpO1xuICAgIGJTdGFjay5wb3AoKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIC8vIFBlcmZvcm0gYSBkZWVwIGNvbXBhcmlzb24gdG8gY2hlY2sgaWYgdHdvIG9iamVjdHMgYXJlIGVxdWFsLlxuICBmdW5jdGlvbiBpc0VxdWFsKGEsIGIpIHtcbiAgICByZXR1cm4gZXEoYSwgYik7XG4gIH1cblxuICAvLyBSZXRyaWV2ZSBhbGwgdGhlIGVudW1lcmFibGUgcHJvcGVydHkgbmFtZXMgb2YgYW4gb2JqZWN0LlxuICBmdW5jdGlvbiBhbGxLZXlzKG9iaikge1xuICAgIGlmICghaXNPYmplY3Qob2JqKSkgcmV0dXJuIFtdO1xuICAgIHZhciBrZXlzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIG9iaikga2V5cy5wdXNoKGtleSk7XG4gICAgLy8gQWhlbSwgSUUgPCA5LlxuICAgIGlmIChoYXNFbnVtQnVnKSBjb2xsZWN0Tm9uRW51bVByb3BzKG9iaiwga2V5cyk7XG4gICAgcmV0dXJuIGtleXM7XG4gIH1cblxuICAvLyBTaW5jZSB0aGUgcmVndWxhciBgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZ2AgdHlwZSB0ZXN0cyBkb24ndCB3b3JrIGZvclxuICAvLyBzb21lIHR5cGVzIGluIElFIDExLCB3ZSB1c2UgYSBmaW5nZXJwcmludGluZyBoZXVyaXN0aWMgaW5zdGVhZCwgYmFzZWRcbiAgLy8gb24gdGhlIG1ldGhvZHMuIEl0J3Mgbm90IGdyZWF0LCBidXQgaXQncyB0aGUgYmVzdCB3ZSBnb3QuXG4gIC8vIFRoZSBmaW5nZXJwcmludCBtZXRob2QgbGlzdHMgYXJlIGRlZmluZWQgYmVsb3cuXG4gIGZ1bmN0aW9uIGllMTFmaW5nZXJwcmludChtZXRob2RzKSB7XG4gICAgdmFyIGxlbmd0aCA9IGdldExlbmd0aChtZXRob2RzKTtcbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqKSB7XG4gICAgICBpZiAob2JqID09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICAgIC8vIGBNYXBgLCBgV2Vha01hcGAgYW5kIGBTZXRgIGhhdmUgbm8gZW51bWVyYWJsZSBrZXlzLlxuICAgICAgdmFyIGtleXMgPSBhbGxLZXlzKG9iaik7XG4gICAgICBpZiAoZ2V0TGVuZ3RoKGtleXMpKSByZXR1cm4gZmFsc2U7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICghaXNGdW5jdGlvbiQxKG9ialttZXRob2RzW2ldXSkpIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIC8vIElmIHdlIGFyZSB0ZXN0aW5nIGFnYWluc3QgYFdlYWtNYXBgLCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0XG4gICAgICAvLyBgb2JqYCBkb2Vzbid0IGhhdmUgYSBgZm9yRWFjaGAgbWV0aG9kIGluIG9yZGVyIHRvIGRpc3Rpbmd1aXNoXG4gICAgICAvLyBpdCBmcm9tIGEgcmVndWxhciBgTWFwYC5cbiAgICAgIHJldHVybiBtZXRob2RzICE9PSB3ZWFrTWFwTWV0aG9kcyB8fCAhaXNGdW5jdGlvbiQxKG9ialtmb3JFYWNoTmFtZV0pO1xuICAgIH07XG4gIH1cblxuICAvLyBJbiB0aGUgaW50ZXJlc3Qgb2YgY29tcGFjdCBtaW5pZmljYXRpb24sIHdlIHdyaXRlXG4gIC8vIGVhY2ggc3RyaW5nIGluIHRoZSBmaW5nZXJwcmludHMgb25seSBvbmNlLlxuICB2YXIgZm9yRWFjaE5hbWUgPSAnZm9yRWFjaCcsXG4gICAgICBoYXNOYW1lID0gJ2hhcycsXG4gICAgICBjb21tb25Jbml0ID0gWydjbGVhcicsICdkZWxldGUnXSxcbiAgICAgIG1hcFRhaWwgPSBbJ2dldCcsIGhhc05hbWUsICdzZXQnXTtcblxuICAvLyBgTWFwYCwgYFdlYWtNYXBgIGFuZCBgU2V0YCBlYWNoIGhhdmUgc2xpZ2h0bHkgZGlmZmVyZW50XG4gIC8vIGNvbWJpbmF0aW9ucyBvZiB0aGUgYWJvdmUgc3VibGlzdHMuXG4gIHZhciBtYXBNZXRob2RzID0gY29tbW9uSW5pdC5jb25jYXQoZm9yRWFjaE5hbWUsIG1hcFRhaWwpLFxuICAgICAgd2Vha01hcE1ldGhvZHMgPSBjb21tb25Jbml0LmNvbmNhdChtYXBUYWlsKSxcbiAgICAgIHNldE1ldGhvZHMgPSBbJ2FkZCddLmNvbmNhdChjb21tb25Jbml0LCBmb3JFYWNoTmFtZSwgaGFzTmFtZSk7XG5cbiAgdmFyIGlzTWFwID0gaXNJRTExID8gaWUxMWZpbmdlcnByaW50KG1hcE1ldGhvZHMpIDogdGFnVGVzdGVyKCdNYXAnKTtcblxuICB2YXIgaXNXZWFrTWFwID0gaXNJRTExID8gaWUxMWZpbmdlcnByaW50KHdlYWtNYXBNZXRob2RzKSA6IHRhZ1Rlc3RlcignV2Vha01hcCcpO1xuXG4gIHZhciBpc1NldCA9IGlzSUUxMSA/IGllMTFmaW5nZXJwcmludChzZXRNZXRob2RzKSA6IHRhZ1Rlc3RlcignU2V0Jyk7XG5cbiAgdmFyIGlzV2Vha1NldCA9IHRhZ1Rlc3RlcignV2Vha1NldCcpO1xuXG4gIC8vIFJldHJpZXZlIHRoZSB2YWx1ZXMgb2YgYW4gb2JqZWN0J3MgcHJvcGVydGllcy5cbiAgZnVuY3Rpb24gdmFsdWVzKG9iaikge1xuICAgIHZhciBfa2V5cyA9IGtleXMob2JqKTtcbiAgICB2YXIgbGVuZ3RoID0gX2tleXMubGVuZ3RoO1xuICAgIHZhciB2YWx1ZXMgPSBBcnJheShsZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhbHVlc1tpXSA9IG9ialtfa2V5c1tpXV07XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZXM7XG4gIH1cblxuICAvLyBDb252ZXJ0IGFuIG9iamVjdCBpbnRvIGEgbGlzdCBvZiBgW2tleSwgdmFsdWVdYCBwYWlycy5cbiAgLy8gVGhlIG9wcG9zaXRlIG9mIGBfLm9iamVjdGAgd2l0aCBvbmUgYXJndW1lbnQuXG4gIGZ1bmN0aW9uIHBhaXJzKG9iaikge1xuICAgIHZhciBfa2V5cyA9IGtleXMob2JqKTtcbiAgICB2YXIgbGVuZ3RoID0gX2tleXMubGVuZ3RoO1xuICAgIHZhciBwYWlycyA9IEFycmF5KGxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgcGFpcnNbaV0gPSBbX2tleXNbaV0sIG9ialtfa2V5c1tpXV1dO1xuICAgIH1cbiAgICByZXR1cm4gcGFpcnM7XG4gIH1cblxuICAvLyBJbnZlcnQgdGhlIGtleXMgYW5kIHZhbHVlcyBvZiBhbiBvYmplY3QuIFRoZSB2YWx1ZXMgbXVzdCBiZSBzZXJpYWxpemFibGUuXG4gIGZ1bmN0aW9uIGludmVydChvYmopIHtcbiAgICB2YXIgcmVzdWx0ID0ge307XG4gICAgdmFyIF9rZXlzID0ga2V5cyhvYmopO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBfa2V5cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgcmVzdWx0W29ialtfa2V5c1tpXV1dID0gX2tleXNbaV07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBSZXR1cm4gYSBzb3J0ZWQgbGlzdCBvZiB0aGUgZnVuY3Rpb24gbmFtZXMgYXZhaWxhYmxlIG9uIHRoZSBvYmplY3QuXG4gIGZ1bmN0aW9uIGZ1bmN0aW9ucyhvYmopIHtcbiAgICB2YXIgbmFtZXMgPSBbXTtcbiAgICBmb3IgKHZhciBrZXkgaW4gb2JqKSB7XG4gICAgICBpZiAoaXNGdW5jdGlvbiQxKG9ialtrZXldKSkgbmFtZXMucHVzaChrZXkpO1xuICAgIH1cbiAgICByZXR1cm4gbmFtZXMuc29ydCgpO1xuICB9XG5cbiAgLy8gQW4gaW50ZXJuYWwgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGFzc2lnbmVyIGZ1bmN0aW9ucy5cbiAgZnVuY3Rpb24gY3JlYXRlQXNzaWduZXIoa2V5c0Z1bmMsIGRlZmF1bHRzKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG9iaikge1xuICAgICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgICBpZiAoZGVmYXVsdHMpIG9iaiA9IE9iamVjdChvYmopO1xuICAgICAgaWYgKGxlbmd0aCA8IDIgfHwgb2JqID09IG51bGwpIHJldHVybiBvYmo7XG4gICAgICBmb3IgKHZhciBpbmRleCA9IDE7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgIHZhciBzb3VyY2UgPSBhcmd1bWVudHNbaW5kZXhdLFxuICAgICAgICAgICAga2V5cyA9IGtleXNGdW5jKHNvdXJjZSksXG4gICAgICAgICAgICBsID0ga2V5cy5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbDsgaSsrKSB7XG4gICAgICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICAgICAgaWYgKCFkZWZhdWx0cyB8fCBvYmpba2V5XSA9PT0gdm9pZCAwKSBvYmpba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqO1xuICAgIH07XG4gIH1cblxuICAvLyBFeHRlbmQgYSBnaXZlbiBvYmplY3Qgd2l0aCBhbGwgdGhlIHByb3BlcnRpZXMgaW4gcGFzc2VkLWluIG9iamVjdChzKS5cbiAgdmFyIGV4dGVuZCA9IGNyZWF0ZUFzc2lnbmVyKGFsbEtleXMpO1xuXG4gIC8vIEFzc2lnbnMgYSBnaXZlbiBvYmplY3Qgd2l0aCBhbGwgdGhlIG93biBwcm9wZXJ0aWVzIGluIHRoZSBwYXNzZWQtaW5cbiAgLy8gb2JqZWN0KHMpLlxuICAvLyAoaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxsYS5vcmcvZG9jcy9XZWIvSmF2YVNjcmlwdC9SZWZlcmVuY2UvR2xvYmFsX09iamVjdHMvT2JqZWN0L2Fzc2lnbilcbiAgdmFyIGV4dGVuZE93biA9IGNyZWF0ZUFzc2lnbmVyKGtleXMpO1xuXG4gIC8vIEZpbGwgaW4gYSBnaXZlbiBvYmplY3Qgd2l0aCBkZWZhdWx0IHByb3BlcnRpZXMuXG4gIHZhciBkZWZhdWx0cyA9IGNyZWF0ZUFzc2lnbmVyKGFsbEtleXMsIHRydWUpO1xuXG4gIC8vIENyZWF0ZSBhIG5ha2VkIGZ1bmN0aW9uIHJlZmVyZW5jZSBmb3Igc3Vycm9nYXRlLXByb3RvdHlwZS1zd2FwcGluZy5cbiAgZnVuY3Rpb24gY3RvcigpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKXt9O1xuICB9XG5cbiAgLy8gQW4gaW50ZXJuYWwgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgbmV3IG9iamVjdCB0aGF0IGluaGVyaXRzIGZyb20gYW5vdGhlci5cbiAgZnVuY3Rpb24gYmFzZUNyZWF0ZShwcm90b3R5cGUpIHtcbiAgICBpZiAoIWlzT2JqZWN0KHByb3RvdHlwZSkpIHJldHVybiB7fTtcbiAgICBpZiAobmF0aXZlQ3JlYXRlKSByZXR1cm4gbmF0aXZlQ3JlYXRlKHByb3RvdHlwZSk7XG4gICAgdmFyIEN0b3IgPSBjdG9yKCk7XG4gICAgQ3Rvci5wcm90b3R5cGUgPSBwcm90b3R5cGU7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyBDdG9yO1xuICAgIEN0b3IucHJvdG90eXBlID0gbnVsbDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gQ3JlYXRlcyBhbiBvYmplY3QgdGhhdCBpbmhlcml0cyBmcm9tIHRoZSBnaXZlbiBwcm90b3R5cGUgb2JqZWN0LlxuICAvLyBJZiBhZGRpdGlvbmFsIHByb3BlcnRpZXMgYXJlIHByb3ZpZGVkIHRoZW4gdGhleSB3aWxsIGJlIGFkZGVkIHRvIHRoZVxuICAvLyBjcmVhdGVkIG9iamVjdC5cbiAgZnVuY3Rpb24gY3JlYXRlKHByb3RvdHlwZSwgcHJvcHMpIHtcbiAgICB2YXIgcmVzdWx0ID0gYmFzZUNyZWF0ZShwcm90b3R5cGUpO1xuICAgIGlmIChwcm9wcykgZXh0ZW5kT3duKHJlc3VsdCwgcHJvcHMpO1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH1cblxuICAvLyBDcmVhdGUgYSAoc2hhbGxvdy1jbG9uZWQpIGR1cGxpY2F0ZSBvZiBhbiBvYmplY3QuXG4gIGZ1bmN0aW9uIGNsb25lKG9iaikge1xuICAgIGlmICghaXNPYmplY3Qob2JqKSkgcmV0dXJuIG9iajtcbiAgICByZXR1cm4gaXNBcnJheShvYmopID8gb2JqLnNsaWNlKCkgOiBleHRlbmQoe30sIG9iaik7XG4gIH1cblxuICAvLyBJbnZva2VzIGBpbnRlcmNlcHRvcmAgd2l0aCB0aGUgYG9iamAgYW5kIHRoZW4gcmV0dXJucyBgb2JqYC5cbiAgLy8gVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGlzIG1ldGhvZCBpcyB0byBcInRhcCBpbnRvXCIgYSBtZXRob2QgY2hhaW4sIGluXG4gIC8vIG9yZGVyIHRvIHBlcmZvcm0gb3BlcmF0aW9ucyBvbiBpbnRlcm1lZGlhdGUgcmVzdWx0cyB3aXRoaW4gdGhlIGNoYWluLlxuICBmdW5jdGlvbiB0YXAob2JqLCBpbnRlcmNlcHRvcikge1xuICAgIGludGVyY2VwdG9yKG9iaik7XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBhIChkZWVwKSBwcm9wZXJ0eSBgcGF0aGAgdG8gYXJyYXkuXG4gIC8vIExpa2UgYF8uaXRlcmF0ZWVgLCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjdXN0b21pemVkLlxuICBmdW5jdGlvbiB0b1BhdGgkMShwYXRoKSB7XG4gICAgcmV0dXJuIGlzQXJyYXkocGF0aCkgPyBwYXRoIDogW3BhdGhdO1xuICB9XG4gIF8kMS50b1BhdGggPSB0b1BhdGgkMTtcblxuICAvLyBJbnRlcm5hbCB3cmFwcGVyIGZvciBgXy50b1BhdGhgIHRvIGVuYWJsZSBtaW5pZmljYXRpb24uXG4gIC8vIFNpbWlsYXIgdG8gYGNiYCBmb3IgYF8uaXRlcmF0ZWVgLlxuICBmdW5jdGlvbiB0b1BhdGgocGF0aCkge1xuICAgIHJldHVybiBfJDEudG9QYXRoKHBhdGgpO1xuICB9XG5cbiAgLy8gSW50ZXJuYWwgZnVuY3Rpb24gdG8gb2J0YWluIGEgbmVzdGVkIHByb3BlcnR5IGluIGBvYmpgIGFsb25nIGBwYXRoYC5cbiAgZnVuY3Rpb24gZGVlcEdldChvYmosIHBhdGgpIHtcbiAgICB2YXIgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gdm9pZCAwO1xuICAgICAgb2JqID0gb2JqW3BhdGhbaV1dO1xuICAgIH1cbiAgICByZXR1cm4gbGVuZ3RoID8gb2JqIDogdm9pZCAwO1xuICB9XG5cbiAgLy8gR2V0IHRoZSB2YWx1ZSBvZiB0aGUgKGRlZXApIHByb3BlcnR5IG9uIGBwYXRoYCBmcm9tIGBvYmplY3RgLlxuICAvLyBJZiBhbnkgcHJvcGVydHkgaW4gYHBhdGhgIGRvZXMgbm90IGV4aXN0IG9yIGlmIHRoZSB2YWx1ZSBpc1xuICAvLyBgdW5kZWZpbmVkYCwgcmV0dXJuIGBkZWZhdWx0VmFsdWVgIGluc3RlYWQuXG4gIC8vIFRoZSBgcGF0aGAgaXMgbm9ybWFsaXplZCB0aHJvdWdoIGBfLnRvUGF0aGAuXG4gIGZ1bmN0aW9uIGdldChvYmplY3QsIHBhdGgsIGRlZmF1bHRWYWx1ZSkge1xuICAgIHZhciB2YWx1ZSA9IGRlZXBHZXQob2JqZWN0LCB0b1BhdGgocGF0aCkpO1xuICAgIHJldHVybiBpc1VuZGVmaW5lZCh2YWx1ZSkgPyBkZWZhdWx0VmFsdWUgOiB2YWx1ZTtcbiAgfVxuXG4gIC8vIFNob3J0Y3V0IGZ1bmN0aW9uIGZvciBjaGVja2luZyBpZiBhbiBvYmplY3QgaGFzIGEgZ2l2ZW4gcHJvcGVydHkgZGlyZWN0bHkgb25cbiAgLy8gaXRzZWxmIChpbiBvdGhlciB3b3Jkcywgbm90IG9uIGEgcHJvdG90eXBlKS4gVW5saWtlIHRoZSBpbnRlcm5hbCBgaGFzYFxuICAvLyBmdW5jdGlvbiwgdGhpcyBwdWJsaWMgdmVyc2lvbiBjYW4gYWxzbyB0cmF2ZXJzZSBuZXN0ZWQgcHJvcGVydGllcy5cbiAgZnVuY3Rpb24gaGFzKG9iaiwgcGF0aCkge1xuICAgIHBhdGggPSB0b1BhdGgocGF0aCk7XG4gICAgdmFyIGxlbmd0aCA9IHBhdGgubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBrZXkgPSBwYXRoW2ldO1xuICAgICAgaWYgKCFoYXMkMShvYmosIGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgIG9iaiA9IG9ialtrZXldO1xuICAgIH1cbiAgICByZXR1cm4gISFsZW5ndGg7XG4gIH1cblxuICAvLyBLZWVwIHRoZSBpZGVudGl0eSBmdW5jdGlvbiBhcm91bmQgZm9yIGRlZmF1bHQgaXRlcmF0ZWVzLlxuICBmdW5jdGlvbiBpZGVudGl0eSh2YWx1ZSkge1xuICAgIHJldHVybiB2YWx1ZTtcbiAgfVxuXG4gIC8vIFJldHVybnMgYSBwcmVkaWNhdGUgZm9yIGNoZWNraW5nIHdoZXRoZXIgYW4gb2JqZWN0IGhhcyBhIGdpdmVuIHNldCBvZlxuICAvLyBga2V5OnZhbHVlYCBwYWlycy5cbiAgZnVuY3Rpb24gbWF0Y2hlcihhdHRycykge1xuICAgIGF0dHJzID0gZXh0ZW5kT3duKHt9LCBhdHRycyk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKG9iaikge1xuICAgICAgcmV0dXJuIGlzTWF0Y2gob2JqLCBhdHRycyk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIENyZWF0ZXMgYSBmdW5jdGlvbiB0aGF0LCB3aGVuIHBhc3NlZCBhbiBvYmplY3QsIHdpbGwgdHJhdmVyc2UgdGhhdCBvYmplY3TigJlzXG4gIC8vIHByb3BlcnRpZXMgZG93biB0aGUgZ2l2ZW4gYHBhdGhgLCBzcGVjaWZpZWQgYXMgYW4gYXJyYXkgb2Yga2V5cyBvciBpbmRpY2VzLlxuICBmdW5jdGlvbiBwcm9wZXJ0eShwYXRoKSB7XG4gICAgcGF0aCA9IHRvUGF0aChwYXRoKTtcbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqKSB7XG4gICAgICByZXR1cm4gZGVlcEdldChvYmosIHBhdGgpO1xuICAgIH07XG4gIH1cblxuICAvLyBJbnRlcm5hbCBmdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gZWZmaWNpZW50IChmb3IgY3VycmVudCBlbmdpbmVzKSB2ZXJzaW9uXG4gIC8vIG9mIHRoZSBwYXNzZWQtaW4gY2FsbGJhY2ssIHRvIGJlIHJlcGVhdGVkbHkgYXBwbGllZCBpbiBvdGhlciBVbmRlcnNjb3JlXG4gIC8vIGZ1bmN0aW9ucy5cbiAgZnVuY3Rpb24gb3B0aW1pemVDYihmdW5jLCBjb250ZXh0LCBhcmdDb3VudCkge1xuICAgIGlmIChjb250ZXh0ID09PSB2b2lkIDApIHJldHVybiBmdW5jO1xuICAgIHN3aXRjaCAoYXJnQ291bnQgPT0gbnVsbCA/IDMgOiBhcmdDb3VudCkge1xuICAgICAgY2FzZSAxOiByZXR1cm4gZnVuY3Rpb24odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChjb250ZXh0LCB2YWx1ZSk7XG4gICAgICB9O1xuICAgICAgLy8gVGhlIDItYXJndW1lbnQgY2FzZSBpcyBvbWl0dGVkIGJlY2F1c2Ugd2XigJlyZSBub3QgdXNpbmcgaXQuXG4gICAgICBjYXNlIDM6IHJldHVybiBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChjb250ZXh0LCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pO1xuICAgICAgfTtcbiAgICAgIGNhc2UgNDogcmV0dXJuIGZ1bmN0aW9uKGFjY3VtdWxhdG9yLCB2YWx1ZSwgaW5kZXgsIGNvbGxlY3Rpb24pIHtcbiAgICAgICAgcmV0dXJuIGZ1bmMuY2FsbChjb250ZXh0LCBhY2N1bXVsYXRvciwgdmFsdWUsIGluZGV4LCBjb2xsZWN0aW9uKTtcbiAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIEFuIGludGVybmFsIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGNhbGxiYWNrcyB0aGF0IGNhbiBiZSBhcHBsaWVkIHRvIGVhY2hcbiAgLy8gZWxlbWVudCBpbiBhIGNvbGxlY3Rpb24sIHJldHVybmluZyB0aGUgZGVzaXJlZCByZXN1bHQg4oCUIGVpdGhlciBgXy5pZGVudGl0eWAsXG4gIC8vIGFuIGFyYml0cmFyeSBjYWxsYmFjaywgYSBwcm9wZXJ0eSBtYXRjaGVyLCBvciBhIHByb3BlcnR5IGFjY2Vzc29yLlxuICBmdW5jdGlvbiBiYXNlSXRlcmF0ZWUodmFsdWUsIGNvbnRleHQsIGFyZ0NvdW50KSB7XG4gICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBpZGVudGl0eTtcbiAgICBpZiAoaXNGdW5jdGlvbiQxKHZhbHVlKSkgcmV0dXJuIG9wdGltaXplQ2IodmFsdWUsIGNvbnRleHQsIGFyZ0NvdW50KTtcbiAgICBpZiAoaXNPYmplY3QodmFsdWUpICYmICFpc0FycmF5KHZhbHVlKSkgcmV0dXJuIG1hdGNoZXIodmFsdWUpO1xuICAgIHJldHVybiBwcm9wZXJ0eSh2YWx1ZSk7XG4gIH1cblxuICAvLyBFeHRlcm5hbCB3cmFwcGVyIGZvciBvdXIgY2FsbGJhY2sgZ2VuZXJhdG9yLiBVc2VycyBtYXkgY3VzdG9taXplXG4gIC8vIGBfLml0ZXJhdGVlYCBpZiB0aGV5IHdhbnQgYWRkaXRpb25hbCBwcmVkaWNhdGUvaXRlcmF0ZWUgc2hvcnRoYW5kIHN0eWxlcy5cbiAgLy8gVGhpcyBhYnN0cmFjdGlvbiBoaWRlcyB0aGUgaW50ZXJuYWwtb25seSBgYXJnQ291bnRgIGFyZ3VtZW50LlxuICBmdW5jdGlvbiBpdGVyYXRlZSh2YWx1ZSwgY29udGV4dCkge1xuICAgIHJldHVybiBiYXNlSXRlcmF0ZWUodmFsdWUsIGNvbnRleHQsIEluZmluaXR5KTtcbiAgfVxuICBfJDEuaXRlcmF0ZWUgPSBpdGVyYXRlZTtcblxuICAvLyBUaGUgZnVuY3Rpb24gd2UgY2FsbCBpbnRlcm5hbGx5IHRvIGdlbmVyYXRlIGEgY2FsbGJhY2suIEl0IGludm9rZXNcbiAgLy8gYF8uaXRlcmF0ZWVgIGlmIG92ZXJyaWRkZW4sIG90aGVyd2lzZSBgYmFzZUl0ZXJhdGVlYC5cbiAgZnVuY3Rpb24gY2IodmFsdWUsIGNvbnRleHQsIGFyZ0NvdW50KSB7XG4gICAgaWYgKF8kMS5pdGVyYXRlZSAhPT0gaXRlcmF0ZWUpIHJldHVybiBfJDEuaXRlcmF0ZWUodmFsdWUsIGNvbnRleHQpO1xuICAgIHJldHVybiBiYXNlSXRlcmF0ZWUodmFsdWUsIGNvbnRleHQsIGFyZ0NvdW50KTtcbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIHJlc3VsdHMgb2YgYXBwbHlpbmcgdGhlIGBpdGVyYXRlZWAgdG8gZWFjaCBlbGVtZW50IG9mIGBvYmpgLlxuICAvLyBJbiBjb250cmFzdCB0byBgXy5tYXBgIGl0IHJldHVybnMgYW4gb2JqZWN0LlxuICBmdW5jdGlvbiBtYXBPYmplY3Qob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIGl0ZXJhdGVlID0gY2IoaXRlcmF0ZWUsIGNvbnRleHQpO1xuICAgIHZhciBfa2V5cyA9IGtleXMob2JqKSxcbiAgICAgICAgbGVuZ3RoID0gX2tleXMubGVuZ3RoLFxuICAgICAgICByZXN1bHRzID0ge307XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgdmFyIGN1cnJlbnRLZXkgPSBfa2V5c1tpbmRleF07XG4gICAgICByZXN1bHRzW2N1cnJlbnRLZXldID0gaXRlcmF0ZWUob2JqW2N1cnJlbnRLZXldLCBjdXJyZW50S2V5LCBvYmopO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8vIFByZWRpY2F0ZS1nZW5lcmF0aW5nIGZ1bmN0aW9uLiBPZnRlbiB1c2VmdWwgb3V0c2lkZSBvZiBVbmRlcnNjb3JlLlxuICBmdW5jdGlvbiBub29wKCl7fVxuXG4gIC8vIEdlbmVyYXRlcyBhIGZ1bmN0aW9uIGZvciBhIGdpdmVuIG9iamVjdCB0aGF0IHJldHVybnMgYSBnaXZlbiBwcm9wZXJ0eS5cbiAgZnVuY3Rpb24gcHJvcGVydHlPZihvYmopIHtcbiAgICBpZiAob2JqID09IG51bGwpIHJldHVybiBub29wO1xuICAgIHJldHVybiBmdW5jdGlvbihwYXRoKSB7XG4gICAgICByZXR1cm4gZ2V0KG9iaiwgcGF0aCk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIFJ1biBhIGZ1bmN0aW9uICoqbioqIHRpbWVzLlxuICBmdW5jdGlvbiB0aW1lcyhuLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIHZhciBhY2N1bSA9IEFycmF5KE1hdGgubWF4KDAsIG4pKTtcbiAgICBpdGVyYXRlZSA9IG9wdGltaXplQ2IoaXRlcmF0ZWUsIGNvbnRleHQsIDEpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbjsgaSsrKSBhY2N1bVtpXSA9IGl0ZXJhdGVlKGkpO1xuICAgIHJldHVybiBhY2N1bTtcbiAgfVxuXG4gIC8vIFJldHVybiBhIHJhbmRvbSBpbnRlZ2VyIGJldHdlZW4gYG1pbmAgYW5kIGBtYXhgIChpbmNsdXNpdmUpLlxuICBmdW5jdGlvbiByYW5kb20obWluLCBtYXgpIHtcbiAgICBpZiAobWF4ID09IG51bGwpIHtcbiAgICAgIG1heCA9IG1pbjtcbiAgICAgIG1pbiA9IDA7XG4gICAgfVxuICAgIHJldHVybiBtaW4gKyBNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiAobWF4IC0gbWluICsgMSkpO1xuICB9XG5cbiAgLy8gQSAocG9zc2libHkgZmFzdGVyKSB3YXkgdG8gZ2V0IHRoZSBjdXJyZW50IHRpbWVzdGFtcCBhcyBhbiBpbnRlZ2VyLlxuICB2YXIgbm93ID0gRGF0ZS5ub3cgfHwgZnVuY3Rpb24oKSB7XG4gICAgcmV0dXJuIG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuICB9O1xuXG4gIC8vIEludGVybmFsIGhlbHBlciB0byBnZW5lcmF0ZSBmdW5jdGlvbnMgZm9yIGVzY2FwaW5nIGFuZCB1bmVzY2FwaW5nIHN0cmluZ3NcbiAgLy8gdG8vZnJvbSBIVE1MIGludGVycG9sYXRpb24uXG4gIGZ1bmN0aW9uIGNyZWF0ZUVzY2FwZXIobWFwKSB7XG4gICAgdmFyIGVzY2FwZXIgPSBmdW5jdGlvbihtYXRjaCkge1xuICAgICAgcmV0dXJuIG1hcFttYXRjaF07XG4gICAgfTtcbiAgICAvLyBSZWdleGVzIGZvciBpZGVudGlmeWluZyBhIGtleSB0aGF0IG5lZWRzIHRvIGJlIGVzY2FwZWQuXG4gICAgdmFyIHNvdXJjZSA9ICcoPzonICsga2V5cyhtYXApLmpvaW4oJ3wnKSArICcpJztcbiAgICB2YXIgdGVzdFJlZ2V4cCA9IFJlZ0V4cChzb3VyY2UpO1xuICAgIHZhciByZXBsYWNlUmVnZXhwID0gUmVnRXhwKHNvdXJjZSwgJ2cnKTtcbiAgICByZXR1cm4gZnVuY3Rpb24oc3RyaW5nKSB7XG4gICAgICBzdHJpbmcgPSBzdHJpbmcgPT0gbnVsbCA/ICcnIDogJycgKyBzdHJpbmc7XG4gICAgICByZXR1cm4gdGVzdFJlZ2V4cC50ZXN0KHN0cmluZykgPyBzdHJpbmcucmVwbGFjZShyZXBsYWNlUmVnZXhwLCBlc2NhcGVyKSA6IHN0cmluZztcbiAgICB9O1xuICB9XG5cbiAgLy8gSW50ZXJuYWwgbGlzdCBvZiBIVE1MIGVudGl0aWVzIGZvciBlc2NhcGluZy5cbiAgdmFyIGVzY2FwZU1hcCA9IHtcbiAgICAnJic6ICcmYW1wOycsXG4gICAgJzwnOiAnJmx0OycsXG4gICAgJz4nOiAnJmd0OycsXG4gICAgJ1wiJzogJyZxdW90OycsXG4gICAgXCInXCI6ICcmI3gyNzsnLFxuICAgICdgJzogJyYjeDYwOydcbiAgfTtcblxuICAvLyBGdW5jdGlvbiBmb3IgZXNjYXBpbmcgc3RyaW5ncyB0byBIVE1MIGludGVycG9sYXRpb24uXG4gIHZhciBfZXNjYXBlID0gY3JlYXRlRXNjYXBlcihlc2NhcGVNYXApO1xuXG4gIC8vIEludGVybmFsIGxpc3Qgb2YgSFRNTCBlbnRpdGllcyBmb3IgdW5lc2NhcGluZy5cbiAgdmFyIHVuZXNjYXBlTWFwID0gaW52ZXJ0KGVzY2FwZU1hcCk7XG5cbiAgLy8gRnVuY3Rpb24gZm9yIHVuZXNjYXBpbmcgc3RyaW5ncyBmcm9tIEhUTUwgaW50ZXJwb2xhdGlvbi5cbiAgdmFyIF91bmVzY2FwZSA9IGNyZWF0ZUVzY2FwZXIodW5lc2NhcGVNYXApO1xuXG4gIC8vIEJ5IGRlZmF1bHQsIFVuZGVyc2NvcmUgdXNlcyBFUkItc3R5bGUgdGVtcGxhdGUgZGVsaW1pdGVycy4gQ2hhbmdlIHRoZVxuICAvLyBmb2xsb3dpbmcgdGVtcGxhdGUgc2V0dGluZ3MgdG8gdXNlIGFsdGVybmF0aXZlIGRlbGltaXRlcnMuXG4gIHZhciB0ZW1wbGF0ZVNldHRpbmdzID0gXyQxLnRlbXBsYXRlU2V0dGluZ3MgPSB7XG4gICAgZXZhbHVhdGU6IC88JShbXFxzXFxTXSs/KSU+L2csXG4gICAgaW50ZXJwb2xhdGU6IC88JT0oW1xcc1xcU10rPyklPi9nLFxuICAgIGVzY2FwZTogLzwlLShbXFxzXFxTXSs/KSU+L2dcbiAgfTtcblxuICAvLyBXaGVuIGN1c3RvbWl6aW5nIGBfLnRlbXBsYXRlU2V0dGluZ3NgLCBpZiB5b3UgZG9uJ3Qgd2FudCB0byBkZWZpbmUgYW5cbiAgLy8gaW50ZXJwb2xhdGlvbiwgZXZhbHVhdGlvbiBvciBlc2NhcGluZyByZWdleCwgd2UgbmVlZCBvbmUgdGhhdCBpc1xuICAvLyBndWFyYW50ZWVkIG5vdCB0byBtYXRjaC5cbiAgdmFyIG5vTWF0Y2ggPSAvKC4pXi87XG5cbiAgLy8gQ2VydGFpbiBjaGFyYWN0ZXJzIG5lZWQgdG8gYmUgZXNjYXBlZCBzbyB0aGF0IHRoZXkgY2FuIGJlIHB1dCBpbnRvIGFcbiAgLy8gc3RyaW5nIGxpdGVyYWwuXG4gIHZhciBlc2NhcGVzID0ge1xuICAgIFwiJ1wiOiBcIidcIixcbiAgICAnXFxcXCc6ICdcXFxcJyxcbiAgICAnXFxyJzogJ3InLFxuICAgICdcXG4nOiAnbicsXG4gICAgJ1xcdTIwMjgnOiAndTIwMjgnLFxuICAgICdcXHUyMDI5JzogJ3UyMDI5J1xuICB9O1xuXG4gIHZhciBlc2NhcGVSZWdFeHAgPSAvXFxcXHwnfFxccnxcXG58XFx1MjAyOHxcXHUyMDI5L2c7XG5cbiAgZnVuY3Rpb24gZXNjYXBlQ2hhcihtYXRjaCkge1xuICAgIHJldHVybiAnXFxcXCcgKyBlc2NhcGVzW21hdGNoXTtcbiAgfVxuXG4gIC8vIEluIG9yZGVyIHRvIHByZXZlbnQgdGhpcmQtcGFydHkgY29kZSBpbmplY3Rpb24gdGhyb3VnaFxuICAvLyBgXy50ZW1wbGF0ZVNldHRpbmdzLnZhcmlhYmxlYCwgd2UgdGVzdCBpdCBhZ2FpbnN0IHRoZSBmb2xsb3dpbmcgcmVndWxhclxuICAvLyBleHByZXNzaW9uLiBJdCBpcyBpbnRlbnRpb25hbGx5IGEgYml0IG1vcmUgbGliZXJhbCB0aGFuIGp1c3QgbWF0Y2hpbmcgdmFsaWRcbiAgLy8gaWRlbnRpZmllcnMsIGJ1dCBzdGlsbCBwcmV2ZW50cyBwb3NzaWJsZSBsb29waG9sZXMgdGhyb3VnaCBkZWZhdWx0cyBvclxuICAvLyBkZXN0cnVjdHVyaW5nIGFzc2lnbm1lbnQuXG4gIHZhciBiYXJlSWRlbnRpZmllciA9IC9eXFxzKihcXHd8XFwkKStcXHMqJC87XG5cbiAgLy8gSmF2YVNjcmlwdCBtaWNyby10ZW1wbGF0aW5nLCBzaW1pbGFyIHRvIEpvaG4gUmVzaWcncyBpbXBsZW1lbnRhdGlvbi5cbiAgLy8gVW5kZXJzY29yZSB0ZW1wbGF0aW5nIGhhbmRsZXMgYXJiaXRyYXJ5IGRlbGltaXRlcnMsIHByZXNlcnZlcyB3aGl0ZXNwYWNlLFxuICAvLyBhbmQgY29ycmVjdGx5IGVzY2FwZXMgcXVvdGVzIHdpdGhpbiBpbnRlcnBvbGF0ZWQgY29kZS5cbiAgLy8gTkI6IGBvbGRTZXR0aW5nc2Agb25seSBleGlzdHMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuICBmdW5jdGlvbiB0ZW1wbGF0ZSh0ZXh0LCBzZXR0aW5ncywgb2xkU2V0dGluZ3MpIHtcbiAgICBpZiAoIXNldHRpbmdzICYmIG9sZFNldHRpbmdzKSBzZXR0aW5ncyA9IG9sZFNldHRpbmdzO1xuICAgIHNldHRpbmdzID0gZGVmYXVsdHMoe30sIHNldHRpbmdzLCBfJDEudGVtcGxhdGVTZXR0aW5ncyk7XG5cbiAgICAvLyBDb21iaW5lIGRlbGltaXRlcnMgaW50byBvbmUgcmVndWxhciBleHByZXNzaW9uIHZpYSBhbHRlcm5hdGlvbi5cbiAgICB2YXIgbWF0Y2hlciA9IFJlZ0V4cChbXG4gICAgICAoc2V0dGluZ3MuZXNjYXBlIHx8IG5vTWF0Y2gpLnNvdXJjZSxcbiAgICAgIChzZXR0aW5ncy5pbnRlcnBvbGF0ZSB8fCBub01hdGNoKS5zb3VyY2UsXG4gICAgICAoc2V0dGluZ3MuZXZhbHVhdGUgfHwgbm9NYXRjaCkuc291cmNlXG4gICAgXS5qb2luKCd8JykgKyAnfCQnLCAnZycpO1xuXG4gICAgLy8gQ29tcGlsZSB0aGUgdGVtcGxhdGUgc291cmNlLCBlc2NhcGluZyBzdHJpbmcgbGl0ZXJhbHMgYXBwcm9wcmlhdGVseS5cbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHZhciBzb3VyY2UgPSBcIl9fcCs9J1wiO1xuICAgIHRleHQucmVwbGFjZShtYXRjaGVyLCBmdW5jdGlvbihtYXRjaCwgZXNjYXBlLCBpbnRlcnBvbGF0ZSwgZXZhbHVhdGUsIG9mZnNldCkge1xuICAgICAgc291cmNlICs9IHRleHQuc2xpY2UoaW5kZXgsIG9mZnNldCkucmVwbGFjZShlc2NhcGVSZWdFeHAsIGVzY2FwZUNoYXIpO1xuICAgICAgaW5kZXggPSBvZmZzZXQgKyBtYXRjaC5sZW5ndGg7XG5cbiAgICAgIGlmIChlc2NhcGUpIHtcbiAgICAgICAgc291cmNlICs9IFwiJytcXG4oKF9fdD0oXCIgKyBlc2NhcGUgKyBcIikpPT1udWxsPycnOl8uZXNjYXBlKF9fdCkpK1xcbidcIjtcbiAgICAgIH0gZWxzZSBpZiAoaW50ZXJwb2xhdGUpIHtcbiAgICAgICAgc291cmNlICs9IFwiJytcXG4oKF9fdD0oXCIgKyBpbnRlcnBvbGF0ZSArIFwiKSk9PW51bGw/Jyc6X190KStcXG4nXCI7XG4gICAgICB9IGVsc2UgaWYgKGV2YWx1YXRlKSB7XG4gICAgICAgIHNvdXJjZSArPSBcIic7XFxuXCIgKyBldmFsdWF0ZSArIFwiXFxuX19wKz0nXCI7XG4gICAgICB9XG5cbiAgICAgIC8vIEFkb2JlIFZNcyBuZWVkIHRoZSBtYXRjaCByZXR1cm5lZCB0byBwcm9kdWNlIHRoZSBjb3JyZWN0IG9mZnNldC5cbiAgICAgIHJldHVybiBtYXRjaDtcbiAgICB9KTtcbiAgICBzb3VyY2UgKz0gXCInO1xcblwiO1xuXG4gICAgdmFyIGFyZ3VtZW50ID0gc2V0dGluZ3MudmFyaWFibGU7XG4gICAgaWYgKGFyZ3VtZW50KSB7XG4gICAgICAvLyBJbnN1cmUgYWdhaW5zdCB0aGlyZC1wYXJ0eSBjb2RlIGluamVjdGlvbi4gKENWRS0yMDIxLTIzMzU4KVxuICAgICAgaWYgKCFiYXJlSWRlbnRpZmllci50ZXN0KGFyZ3VtZW50KSkgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAndmFyaWFibGUgaXMgbm90IGEgYmFyZSBpZGVudGlmaWVyOiAnICsgYXJndW1lbnRcbiAgICAgICk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIElmIGEgdmFyaWFibGUgaXMgbm90IHNwZWNpZmllZCwgcGxhY2UgZGF0YSB2YWx1ZXMgaW4gbG9jYWwgc2NvcGUuXG4gICAgICBzb3VyY2UgPSAnd2l0aChvYmp8fHt9KXtcXG4nICsgc291cmNlICsgJ31cXG4nO1xuICAgICAgYXJndW1lbnQgPSAnb2JqJztcbiAgICB9XG5cbiAgICBzb3VyY2UgPSBcInZhciBfX3QsX19wPScnLF9faj1BcnJheS5wcm90b3R5cGUuam9pbixcIiArXG4gICAgICBcInByaW50PWZ1bmN0aW9uKCl7X19wKz1fX2ouY2FsbChhcmd1bWVudHMsJycpO307XFxuXCIgK1xuICAgICAgc291cmNlICsgJ3JldHVybiBfX3A7XFxuJztcblxuICAgIHZhciByZW5kZXI7XG4gICAgdHJ5IHtcbiAgICAgIHJlbmRlciA9IG5ldyBGdW5jdGlvbihhcmd1bWVudCwgJ18nLCBzb3VyY2UpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIGUuc291cmNlID0gc291cmNlO1xuICAgICAgdGhyb3cgZTtcbiAgICB9XG5cbiAgICB2YXIgdGVtcGxhdGUgPSBmdW5jdGlvbihkYXRhKSB7XG4gICAgICByZXR1cm4gcmVuZGVyLmNhbGwodGhpcywgZGF0YSwgXyQxKTtcbiAgICB9O1xuXG4gICAgLy8gUHJvdmlkZSB0aGUgY29tcGlsZWQgc291cmNlIGFzIGEgY29udmVuaWVuY2UgZm9yIHByZWNvbXBpbGF0aW9uLlxuICAgIHRlbXBsYXRlLnNvdXJjZSA9ICdmdW5jdGlvbignICsgYXJndW1lbnQgKyAnKXtcXG4nICsgc291cmNlICsgJ30nO1xuXG4gICAgcmV0dXJuIHRlbXBsYXRlO1xuICB9XG5cbiAgLy8gVHJhdmVyc2VzIHRoZSBjaGlsZHJlbiBvZiBgb2JqYCBhbG9uZyBgcGF0aGAuIElmIGEgY2hpbGQgaXMgYSBmdW5jdGlvbiwgaXRcbiAgLy8gaXMgaW52b2tlZCB3aXRoIGl0cyBwYXJlbnQgYXMgY29udGV4dC4gUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZpbmFsXG4gIC8vIGNoaWxkLCBvciBgZmFsbGJhY2tgIGlmIGFueSBjaGlsZCBpcyB1bmRlZmluZWQuXG4gIGZ1bmN0aW9uIHJlc3VsdChvYmosIHBhdGgsIGZhbGxiYWNrKSB7XG4gICAgcGF0aCA9IHRvUGF0aChwYXRoKTtcbiAgICB2YXIgbGVuZ3RoID0gcGF0aC5sZW5ndGg7XG4gICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgIHJldHVybiBpc0Z1bmN0aW9uJDEoZmFsbGJhY2spID8gZmFsbGJhY2suY2FsbChvYmopIDogZmFsbGJhY2s7XG4gICAgfVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBwcm9wID0gb2JqID09IG51bGwgPyB2b2lkIDAgOiBvYmpbcGF0aFtpXV07XG4gICAgICBpZiAocHJvcCA9PT0gdm9pZCAwKSB7XG4gICAgICAgIHByb3AgPSBmYWxsYmFjaztcbiAgICAgICAgaSA9IGxlbmd0aDsgLy8gRW5zdXJlIHdlIGRvbid0IGNvbnRpbnVlIGl0ZXJhdGluZy5cbiAgICAgIH1cbiAgICAgIG9iaiA9IGlzRnVuY3Rpb24kMShwcm9wKSA/IHByb3AuY2FsbChvYmopIDogcHJvcDtcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIC8vIEdlbmVyYXRlIGEgdW5pcXVlIGludGVnZXIgaWQgKHVuaXF1ZSB3aXRoaW4gdGhlIGVudGlyZSBjbGllbnQgc2Vzc2lvbikuXG4gIC8vIFVzZWZ1bCBmb3IgdGVtcG9yYXJ5IERPTSBpZHMuXG4gIHZhciBpZENvdW50ZXIgPSAwO1xuICBmdW5jdGlvbiB1bmlxdWVJZChwcmVmaXgpIHtcbiAgICB2YXIgaWQgPSArK2lkQ291bnRlciArICcnO1xuICAgIHJldHVybiBwcmVmaXggPyBwcmVmaXggKyBpZCA6IGlkO1xuICB9XG5cbiAgLy8gU3RhcnQgY2hhaW5pbmcgYSB3cmFwcGVkIFVuZGVyc2NvcmUgb2JqZWN0LlxuICBmdW5jdGlvbiBjaGFpbihvYmopIHtcbiAgICB2YXIgaW5zdGFuY2UgPSBfJDEob2JqKTtcbiAgICBpbnN0YW5jZS5fY2hhaW4gPSB0cnVlO1xuICAgIHJldHVybiBpbnN0YW5jZTtcbiAgfVxuXG4gIC8vIEludGVybmFsIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYHNvdXJjZUZ1bmNgIGJvdW5kIHRvIGBjb250ZXh0YCB3aXRoIG9wdGlvbmFsXG4gIC8vIGBhcmdzYC4gRGV0ZXJtaW5lcyB3aGV0aGVyIHRvIGV4ZWN1dGUgYSBmdW5jdGlvbiBhcyBhIGNvbnN0cnVjdG9yIG9yIGFzIGFcbiAgLy8gbm9ybWFsIGZ1bmN0aW9uLlxuICBmdW5jdGlvbiBleGVjdXRlQm91bmQoc291cmNlRnVuYywgYm91bmRGdW5jLCBjb250ZXh0LCBjYWxsaW5nQ29udGV4dCwgYXJncykge1xuICAgIGlmICghKGNhbGxpbmdDb250ZXh0IGluc3RhbmNlb2YgYm91bmRGdW5jKSkgcmV0dXJuIHNvdXJjZUZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgdmFyIHNlbGYgPSBiYXNlQ3JlYXRlKHNvdXJjZUZ1bmMucHJvdG90eXBlKTtcbiAgICB2YXIgcmVzdWx0ID0gc291cmNlRnVuYy5hcHBseShzZWxmLCBhcmdzKTtcbiAgICBpZiAoaXNPYmplY3QocmVzdWx0KSkgcmV0dXJuIHJlc3VsdDtcbiAgICByZXR1cm4gc2VsZjtcbiAgfVxuXG4gIC8vIFBhcnRpYWxseSBhcHBseSBhIGZ1bmN0aW9uIGJ5IGNyZWF0aW5nIGEgdmVyc2lvbiB0aGF0IGhhcyBoYWQgc29tZSBvZiBpdHNcbiAgLy8gYXJndW1lbnRzIHByZS1maWxsZWQsIHdpdGhvdXQgY2hhbmdpbmcgaXRzIGR5bmFtaWMgYHRoaXNgIGNvbnRleHQuIGBfYCBhY3RzXG4gIC8vIGFzIGEgcGxhY2Vob2xkZXIgYnkgZGVmYXVsdCwgYWxsb3dpbmcgYW55IGNvbWJpbmF0aW9uIG9mIGFyZ3VtZW50cyB0byBiZVxuICAvLyBwcmUtZmlsbGVkLiBTZXQgYF8ucGFydGlhbC5wbGFjZWhvbGRlcmAgZm9yIGEgY3VzdG9tIHBsYWNlaG9sZGVyIGFyZ3VtZW50LlxuICB2YXIgcGFydGlhbCA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24oZnVuYywgYm91bmRBcmdzKSB7XG4gICAgdmFyIHBsYWNlaG9sZGVyID0gcGFydGlhbC5wbGFjZWhvbGRlcjtcbiAgICB2YXIgYm91bmQgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBwb3NpdGlvbiA9IDAsIGxlbmd0aCA9IGJvdW5kQXJncy5sZW5ndGg7XG4gICAgICB2YXIgYXJncyA9IEFycmF5KGxlbmd0aCk7XG4gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGFyZ3NbaV0gPSBib3VuZEFyZ3NbaV0gPT09IHBsYWNlaG9sZGVyID8gYXJndW1lbnRzW3Bvc2l0aW9uKytdIDogYm91bmRBcmdzW2ldO1xuICAgICAgfVxuICAgICAgd2hpbGUgKHBvc2l0aW9uIDwgYXJndW1lbnRzLmxlbmd0aCkgYXJncy5wdXNoKGFyZ3VtZW50c1twb3NpdGlvbisrXSk7XG4gICAgICByZXR1cm4gZXhlY3V0ZUJvdW5kKGZ1bmMsIGJvdW5kLCB0aGlzLCB0aGlzLCBhcmdzKTtcbiAgICB9O1xuICAgIHJldHVybiBib3VuZDtcbiAgfSk7XG5cbiAgcGFydGlhbC5wbGFjZWhvbGRlciA9IF8kMTtcblxuICAvLyBDcmVhdGUgYSBmdW5jdGlvbiBib3VuZCB0byBhIGdpdmVuIG9iamVjdCAoYXNzaWduaW5nIGB0aGlzYCwgYW5kIGFyZ3VtZW50cyxcbiAgLy8gb3B0aW9uYWxseSkuXG4gIHZhciBiaW5kID0gcmVzdEFyZ3VtZW50cyhmdW5jdGlvbihmdW5jLCBjb250ZXh0LCBhcmdzKSB7XG4gICAgaWYgKCFpc0Z1bmN0aW9uJDEoZnVuYykpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0JpbmQgbXVzdCBiZSBjYWxsZWQgb24gYSBmdW5jdGlvbicpO1xuICAgIHZhciBib3VuZCA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24oY2FsbEFyZ3MpIHtcbiAgICAgIHJldHVybiBleGVjdXRlQm91bmQoZnVuYywgYm91bmQsIGNvbnRleHQsIHRoaXMsIGFyZ3MuY29uY2F0KGNhbGxBcmdzKSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIGJvdW5kO1xuICB9KTtcblxuICAvLyBJbnRlcm5hbCBoZWxwZXIgZm9yIGNvbGxlY3Rpb24gbWV0aG9kcyB0byBkZXRlcm1pbmUgd2hldGhlciBhIGNvbGxlY3Rpb25cbiAgLy8gc2hvdWxkIGJlIGl0ZXJhdGVkIGFzIGFuIGFycmF5IG9yIGFzIGFuIG9iamVjdC5cbiAgLy8gUmVsYXRlZDogaHR0cHM6Ly9wZW9wbGUubW96aWxsYS5vcmcvfmpvcmVuZG9yZmYvZXM2LWRyYWZ0Lmh0bWwjc2VjLXRvbGVuZ3RoXG4gIC8vIEF2b2lkcyBhIHZlcnkgbmFzdHkgaU9TIDggSklUIGJ1ZyBvbiBBUk0tNjQuICMyMDk0XG4gIHZhciBpc0FycmF5TGlrZSA9IGNyZWF0ZVNpemVQcm9wZXJ0eUNoZWNrKGdldExlbmd0aCk7XG5cbiAgLy8gSW50ZXJuYWwgaW1wbGVtZW50YXRpb24gb2YgYSByZWN1cnNpdmUgYGZsYXR0ZW5gIGZ1bmN0aW9uLlxuICBmdW5jdGlvbiBmbGF0dGVuJDEoaW5wdXQsIGRlcHRoLCBzdHJpY3QsIG91dHB1dCkge1xuICAgIG91dHB1dCA9IG91dHB1dCB8fCBbXTtcbiAgICBpZiAoIWRlcHRoICYmIGRlcHRoICE9PSAwKSB7XG4gICAgICBkZXB0aCA9IEluZmluaXR5O1xuICAgIH0gZWxzZSBpZiAoZGVwdGggPD0gMCkge1xuICAgICAgcmV0dXJuIG91dHB1dC5jb25jYXQoaW5wdXQpO1xuICAgIH1cbiAgICB2YXIgaWR4ID0gb3V0cHV0Lmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gZ2V0TGVuZ3RoKGlucHV0KTsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICB2YXIgdmFsdWUgPSBpbnB1dFtpXTtcbiAgICAgIGlmIChpc0FycmF5TGlrZSh2YWx1ZSkgJiYgKGlzQXJyYXkodmFsdWUpIHx8IGlzQXJndW1lbnRzJDEodmFsdWUpKSkge1xuICAgICAgICAvLyBGbGF0dGVuIGN1cnJlbnQgbGV2ZWwgb2YgYXJyYXkgb3IgYXJndW1lbnRzIG9iamVjdC5cbiAgICAgICAgaWYgKGRlcHRoID4gMSkge1xuICAgICAgICAgIGZsYXR0ZW4kMSh2YWx1ZSwgZGVwdGggLSAxLCBzdHJpY3QsIG91dHB1dCk7XG4gICAgICAgICAgaWR4ID0gb3V0cHV0Lmxlbmd0aDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB2YXIgaiA9IDAsIGxlbiA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICB3aGlsZSAoaiA8IGxlbikgb3V0cHV0W2lkeCsrXSA9IHZhbHVlW2orK107XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoIXN0cmljdCkge1xuICAgICAgICBvdXRwdXRbaWR4KytdID0gdmFsdWU7XG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvdXRwdXQ7XG4gIH1cblxuICAvLyBCaW5kIGEgbnVtYmVyIG9mIGFuIG9iamVjdCdzIG1ldGhvZHMgdG8gdGhhdCBvYmplY3QuIFJlbWFpbmluZyBhcmd1bWVudHNcbiAgLy8gYXJlIHRoZSBtZXRob2QgbmFtZXMgdG8gYmUgYm91bmQuIFVzZWZ1bCBmb3IgZW5zdXJpbmcgdGhhdCBhbGwgY2FsbGJhY2tzXG4gIC8vIGRlZmluZWQgb24gYW4gb2JqZWN0IGJlbG9uZyB0byBpdC5cbiAgdmFyIGJpbmRBbGwgPSByZXN0QXJndW1lbnRzKGZ1bmN0aW9uKG9iaiwga2V5cykge1xuICAgIGtleXMgPSBmbGF0dGVuJDEoa2V5cywgZmFsc2UsIGZhbHNlKTtcbiAgICB2YXIgaW5kZXggPSBrZXlzLmxlbmd0aDtcbiAgICBpZiAoaW5kZXggPCAxKSB0aHJvdyBuZXcgRXJyb3IoJ2JpbmRBbGwgbXVzdCBiZSBwYXNzZWQgZnVuY3Rpb24gbmFtZXMnKTtcbiAgICB3aGlsZSAoaW5kZXgtLSkge1xuICAgICAgdmFyIGtleSA9IGtleXNbaW5kZXhdO1xuICAgICAgb2JqW2tleV0gPSBiaW5kKG9ialtrZXldLCBvYmopO1xuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9KTtcblxuICAvLyBNZW1vaXplIGFuIGV4cGVuc2l2ZSBmdW5jdGlvbiBieSBzdG9yaW5nIGl0cyByZXN1bHRzLlxuICBmdW5jdGlvbiBtZW1vaXplKGZ1bmMsIGhhc2hlcikge1xuICAgIHZhciBtZW1vaXplID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgICB2YXIgY2FjaGUgPSBtZW1vaXplLmNhY2hlO1xuICAgICAgdmFyIGFkZHJlc3MgPSAnJyArIChoYXNoZXIgPyBoYXNoZXIuYXBwbHkodGhpcywgYXJndW1lbnRzKSA6IGtleSk7XG4gICAgICBpZiAoIWhhcyQxKGNhY2hlLCBhZGRyZXNzKSkgY2FjaGVbYWRkcmVzc10gPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICByZXR1cm4gY2FjaGVbYWRkcmVzc107XG4gICAgfTtcbiAgICBtZW1vaXplLmNhY2hlID0ge307XG4gICAgcmV0dXJuIG1lbW9pemU7XG4gIH1cblxuICAvLyBEZWxheXMgYSBmdW5jdGlvbiBmb3IgdGhlIGdpdmVuIG51bWJlciBvZiBtaWxsaXNlY29uZHMsIGFuZCB0aGVuIGNhbGxzXG4gIC8vIGl0IHdpdGggdGhlIGFyZ3VtZW50cyBzdXBwbGllZC5cbiAgdmFyIGRlbGF5ID0gcmVzdEFyZ3VtZW50cyhmdW5jdGlvbihmdW5jLCB3YWl0LCBhcmdzKSB7XG4gICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZnVuYy5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9LCB3YWl0KTtcbiAgfSk7XG5cbiAgLy8gRGVmZXJzIGEgZnVuY3Rpb24sIHNjaGVkdWxpbmcgaXQgdG8gcnVuIGFmdGVyIHRoZSBjdXJyZW50IGNhbGwgc3RhY2sgaGFzXG4gIC8vIGNsZWFyZWQuXG4gIHZhciBkZWZlciA9IHBhcnRpYWwoZGVsYXksIF8kMSwgMSk7XG5cbiAgLy8gUmV0dXJucyBhIGZ1bmN0aW9uLCB0aGF0LCB3aGVuIGludm9rZWQsIHdpbGwgb25seSBiZSB0cmlnZ2VyZWQgYXQgbW9zdCBvbmNlXG4gIC8vIGR1cmluZyBhIGdpdmVuIHdpbmRvdyBvZiB0aW1lLiBOb3JtYWxseSwgdGhlIHRocm90dGxlZCBmdW5jdGlvbiB3aWxsIHJ1blxuICAvLyBhcyBtdWNoIGFzIGl0IGNhbiwgd2l0aG91dCBldmVyIGdvaW5nIG1vcmUgdGhhbiBvbmNlIHBlciBgd2FpdGAgZHVyYXRpb247XG4gIC8vIGJ1dCBpZiB5b3UnZCBsaWtlIHRvIGRpc2FibGUgdGhlIGV4ZWN1dGlvbiBvbiB0aGUgbGVhZGluZyBlZGdlLCBwYXNzXG4gIC8vIGB7bGVhZGluZzogZmFsc2V9YC4gVG8gZGlzYWJsZSBleGVjdXRpb24gb24gdGhlIHRyYWlsaW5nIGVkZ2UsIGRpdHRvLlxuICBmdW5jdGlvbiB0aHJvdHRsZShmdW5jLCB3YWl0LCBvcHRpb25zKSB7XG4gICAgdmFyIHRpbWVvdXQsIGNvbnRleHQsIGFyZ3MsIHJlc3VsdDtcbiAgICB2YXIgcHJldmlvdXMgPSAwO1xuICAgIGlmICghb3B0aW9ucykgb3B0aW9ucyA9IHt9O1xuXG4gICAgdmFyIGxhdGVyID0gZnVuY3Rpb24oKSB7XG4gICAgICBwcmV2aW91cyA9IG9wdGlvbnMubGVhZGluZyA9PT0gZmFsc2UgPyAwIDogbm93KCk7XG4gICAgICB0aW1lb3V0ID0gbnVsbDtcbiAgICAgIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICBpZiAoIXRpbWVvdXQpIGNvbnRleHQgPSBhcmdzID0gbnVsbDtcbiAgICB9O1xuXG4gICAgdmFyIHRocm90dGxlZCA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIF9ub3cgPSBub3coKTtcbiAgICAgIGlmICghcHJldmlvdXMgJiYgb3B0aW9ucy5sZWFkaW5nID09PSBmYWxzZSkgcHJldmlvdXMgPSBfbm93O1xuICAgICAgdmFyIHJlbWFpbmluZyA9IHdhaXQgLSAoX25vdyAtIHByZXZpb3VzKTtcbiAgICAgIGNvbnRleHQgPSB0aGlzO1xuICAgICAgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgIGlmIChyZW1haW5pbmcgPD0gMCB8fCByZW1haW5pbmcgPiB3YWl0KSB7XG4gICAgICAgIGlmICh0aW1lb3V0KSB7XG4gICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIHByZXZpb3VzID0gX25vdztcbiAgICAgICAgcmVzdWx0ID0gZnVuYy5hcHBseShjb250ZXh0LCBhcmdzKTtcbiAgICAgICAgaWYgKCF0aW1lb3V0KSBjb250ZXh0ID0gYXJncyA9IG51bGw7XG4gICAgICB9IGVsc2UgaWYgKCF0aW1lb3V0ICYmIG9wdGlvbnMudHJhaWxpbmcgIT09IGZhbHNlKSB7XG4gICAgICAgIHRpbWVvdXQgPSBzZXRUaW1lb3V0KGxhdGVyLCByZW1haW5pbmcpO1xuICAgICAgfVxuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuXG4gICAgdGhyb3R0bGVkLmNhbmNlbCA9IGZ1bmN0aW9uKCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgcHJldmlvdXMgPSAwO1xuICAgICAgdGltZW91dCA9IGNvbnRleHQgPSBhcmdzID0gbnVsbDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIHRocm90dGxlZDtcbiAgfVxuXG4gIC8vIFdoZW4gYSBzZXF1ZW5jZSBvZiBjYWxscyBvZiB0aGUgcmV0dXJuZWQgZnVuY3Rpb24gZW5kcywgdGhlIGFyZ3VtZW50XG4gIC8vIGZ1bmN0aW9uIGlzIHRyaWdnZXJlZC4gVGhlIGVuZCBvZiBhIHNlcXVlbmNlIGlzIGRlZmluZWQgYnkgdGhlIGB3YWl0YFxuICAvLyBwYXJhbWV0ZXIuIElmIGBpbW1lZGlhdGVgIGlzIHBhc3NlZCwgdGhlIGFyZ3VtZW50IGZ1bmN0aW9uIHdpbGwgYmVcbiAgLy8gdHJpZ2dlcmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlcXVlbmNlIGluc3RlYWQgb2YgYXQgdGhlIGVuZC5cbiAgZnVuY3Rpb24gZGVib3VuY2UoZnVuYywgd2FpdCwgaW1tZWRpYXRlKSB7XG4gICAgdmFyIHRpbWVvdXQsIHByZXZpb3VzLCBhcmdzLCByZXN1bHQsIGNvbnRleHQ7XG5cbiAgICB2YXIgbGF0ZXIgPSBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBwYXNzZWQgPSBub3coKSAtIHByZXZpb3VzO1xuICAgICAgaWYgKHdhaXQgPiBwYXNzZWQpIHtcbiAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQgLSBwYXNzZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGltZW91dCA9IG51bGw7XG4gICAgICAgIGlmICghaW1tZWRpYXRlKSByZXN1bHQgPSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICAvLyBUaGlzIGNoZWNrIGlzIG5lZWRlZCBiZWNhdXNlIGBmdW5jYCBjYW4gcmVjdXJzaXZlbHkgaW52b2tlIGBkZWJvdW5jZWRgLlxuICAgICAgICBpZiAoIXRpbWVvdXQpIGFyZ3MgPSBjb250ZXh0ID0gbnVsbDtcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgdmFyIGRlYm91bmNlZCA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24oX2FyZ3MpIHtcbiAgICAgIGNvbnRleHQgPSB0aGlzO1xuICAgICAgYXJncyA9IF9hcmdzO1xuICAgICAgcHJldmlvdXMgPSBub3coKTtcbiAgICAgIGlmICghdGltZW91dCkge1xuICAgICAgICB0aW1lb3V0ID0gc2V0VGltZW91dChsYXRlciwgd2FpdCk7XG4gICAgICAgIGlmIChpbW1lZGlhdGUpIHJlc3VsdCA9IGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICB9XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0pO1xuXG4gICAgZGVib3VuY2VkLmNhbmNlbCA9IGZ1bmN0aW9uKCkge1xuICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgdGltZW91dCA9IGFyZ3MgPSBjb250ZXh0ID0gbnVsbDtcbiAgICB9O1xuXG4gICAgcmV0dXJuIGRlYm91bmNlZDtcbiAgfVxuXG4gIC8vIFJldHVybnMgdGhlIGZpcnN0IGZ1bmN0aW9uIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byB0aGUgc2Vjb25kLFxuICAvLyBhbGxvd2luZyB5b3UgdG8gYWRqdXN0IGFyZ3VtZW50cywgcnVuIGNvZGUgYmVmb3JlIGFuZCBhZnRlciwgYW5kXG4gIC8vIGNvbmRpdGlvbmFsbHkgZXhlY3V0ZSB0aGUgb3JpZ2luYWwgZnVuY3Rpb24uXG4gIGZ1bmN0aW9uIHdyYXAoZnVuYywgd3JhcHBlcikge1xuICAgIHJldHVybiBwYXJ0aWFsKHdyYXBwZXIsIGZ1bmMpO1xuICB9XG5cbiAgLy8gUmV0dXJucyBhIG5lZ2F0ZWQgdmVyc2lvbiBvZiB0aGUgcGFzc2VkLWluIHByZWRpY2F0ZS5cbiAgZnVuY3Rpb24gbmVnYXRlKHByZWRpY2F0ZSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiAhcHJlZGljYXRlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIC8vIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IGlzIHRoZSBjb21wb3NpdGlvbiBvZiBhIGxpc3Qgb2YgZnVuY3Rpb25zLCBlYWNoXG4gIC8vIGNvbnN1bWluZyB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiB0aGF0IGZvbGxvd3MuXG4gIGZ1bmN0aW9uIGNvbXBvc2UoKSB7XG4gICAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gICAgdmFyIHN0YXJ0ID0gYXJncy5sZW5ndGggLSAxO1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHZhciBpID0gc3RhcnQ7XG4gICAgICB2YXIgcmVzdWx0ID0gYXJnc1tzdGFydF0uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICAgIHdoaWxlIChpLS0pIHJlc3VsdCA9IGFyZ3NbaV0uY2FsbCh0aGlzLCByZXN1bHQpO1xuICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9O1xuICB9XG5cbiAgLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBvbmx5IGJlIGV4ZWN1dGVkIG9uIGFuZCBhZnRlciB0aGUgTnRoIGNhbGwuXG4gIGZ1bmN0aW9uIGFmdGVyKHRpbWVzLCBmdW5jKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKC0tdGltZXMgPCAxKSB7XG4gICAgICAgIHJldHVybiBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgfTtcbiAgfVxuXG4gIC8vIFJldHVybnMgYSBmdW5jdGlvbiB0aGF0IHdpbGwgb25seSBiZSBleGVjdXRlZCB1cCB0byAoYnV0IG5vdCBpbmNsdWRpbmcpIHRoZVxuICAvLyBOdGggY2FsbC5cbiAgZnVuY3Rpb24gYmVmb3JlKHRpbWVzLCBmdW5jKSB7XG4gICAgdmFyIG1lbW87XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgaWYgKC0tdGltZXMgPiAwKSB7XG4gICAgICAgIG1lbW8gPSBmdW5jLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICB9XG4gICAgICBpZiAodGltZXMgPD0gMSkgZnVuYyA9IG51bGw7XG4gICAgICByZXR1cm4gbWVtbztcbiAgICB9O1xuICB9XG5cbiAgLy8gUmV0dXJucyBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBleGVjdXRlZCBhdCBtb3N0IG9uZSB0aW1lLCBubyBtYXR0ZXIgaG93XG4gIC8vIG9mdGVuIHlvdSBjYWxsIGl0LiBVc2VmdWwgZm9yIGxhenkgaW5pdGlhbGl6YXRpb24uXG4gIHZhciBvbmNlID0gcGFydGlhbChiZWZvcmUsIDIpO1xuXG4gIC8vIFJldHVybnMgdGhlIGZpcnN0IGtleSBvbiBhbiBvYmplY3QgdGhhdCBwYXNzZXMgYSB0cnV0aCB0ZXN0LlxuICBmdW5jdGlvbiBmaW5kS2V5KG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgcHJlZGljYXRlID0gY2IocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICB2YXIgX2tleXMgPSBrZXlzKG9iaiksIGtleTtcbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gX2tleXMubGVuZ3RoOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIGtleSA9IF9rZXlzW2ldO1xuICAgICAgaWYgKHByZWRpY2F0ZShvYmpba2V5XSwga2V5LCBvYmopKSByZXR1cm4ga2V5O1xuICAgIH1cbiAgfVxuXG4gIC8vIEludGVybmFsIGZ1bmN0aW9uIHRvIGdlbmVyYXRlIGBfLmZpbmRJbmRleGAgYW5kIGBfLmZpbmRMYXN0SW5kZXhgLlxuICBmdW5jdGlvbiBjcmVhdGVQcmVkaWNhdGVJbmRleEZpbmRlcihkaXIpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oYXJyYXksIHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgICAgcHJlZGljYXRlID0gY2IocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICAgIHZhciBsZW5ndGggPSBnZXRMZW5ndGgoYXJyYXkpO1xuICAgICAgdmFyIGluZGV4ID0gZGlyID4gMCA/IDAgOiBsZW5ndGggLSAxO1xuICAgICAgZm9yICg7IGluZGV4ID49IDAgJiYgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IGRpcikge1xuICAgICAgICBpZiAocHJlZGljYXRlKGFycmF5W2luZGV4XSwgaW5kZXgsIGFycmF5KSkgcmV0dXJuIGluZGV4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH07XG4gIH1cblxuICAvLyBSZXR1cm5zIHRoZSBmaXJzdCBpbmRleCBvbiBhbiBhcnJheS1saWtlIHRoYXQgcGFzc2VzIGEgdHJ1dGggdGVzdC5cbiAgdmFyIGZpbmRJbmRleCA9IGNyZWF0ZVByZWRpY2F0ZUluZGV4RmluZGVyKDEpO1xuXG4gIC8vIFJldHVybnMgdGhlIGxhc3QgaW5kZXggb24gYW4gYXJyYXktbGlrZSB0aGF0IHBhc3NlcyBhIHRydXRoIHRlc3QuXG4gIHZhciBmaW5kTGFzdEluZGV4ID0gY3JlYXRlUHJlZGljYXRlSW5kZXhGaW5kZXIoLTEpO1xuXG4gIC8vIFVzZSBhIGNvbXBhcmF0b3IgZnVuY3Rpb24gdG8gZmlndXJlIG91dCB0aGUgc21hbGxlc3QgaW5kZXggYXQgd2hpY2hcbiAgLy8gYW4gb2JqZWN0IHNob3VsZCBiZSBpbnNlcnRlZCBzbyBhcyB0byBtYWludGFpbiBvcmRlci4gVXNlcyBiaW5hcnkgc2VhcmNoLlxuICBmdW5jdGlvbiBzb3J0ZWRJbmRleChhcnJheSwgb2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIGl0ZXJhdGVlID0gY2IoaXRlcmF0ZWUsIGNvbnRleHQsIDEpO1xuICAgIHZhciB2YWx1ZSA9IGl0ZXJhdGVlKG9iaik7XG4gICAgdmFyIGxvdyA9IDAsIGhpZ2ggPSBnZXRMZW5ndGgoYXJyYXkpO1xuICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICB2YXIgbWlkID0gTWF0aC5mbG9vcigobG93ICsgaGlnaCkgLyAyKTtcbiAgICAgIGlmIChpdGVyYXRlZShhcnJheVttaWRdKSA8IHZhbHVlKSBsb3cgPSBtaWQgKyAxOyBlbHNlIGhpZ2ggPSBtaWQ7XG4gICAgfVxuICAgIHJldHVybiBsb3c7XG4gIH1cblxuICAvLyBJbnRlcm5hbCBmdW5jdGlvbiB0byBnZW5lcmF0ZSB0aGUgYF8uaW5kZXhPZmAgYW5kIGBfLmxhc3RJbmRleE9mYCBmdW5jdGlvbnMuXG4gIGZ1bmN0aW9uIGNyZWF0ZUluZGV4RmluZGVyKGRpciwgcHJlZGljYXRlRmluZCwgc29ydGVkSW5kZXgpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oYXJyYXksIGl0ZW0sIGlkeCkge1xuICAgICAgdmFyIGkgPSAwLCBsZW5ndGggPSBnZXRMZW5ndGgoYXJyYXkpO1xuICAgICAgaWYgKHR5cGVvZiBpZHggPT0gJ251bWJlcicpIHtcbiAgICAgICAgaWYgKGRpciA+IDApIHtcbiAgICAgICAgICBpID0gaWR4ID49IDAgPyBpZHggOiBNYXRoLm1heChpZHggKyBsZW5ndGgsIGkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGxlbmd0aCA9IGlkeCA+PSAwID8gTWF0aC5taW4oaWR4ICsgMSwgbGVuZ3RoKSA6IGlkeCArIGxlbmd0aCArIDE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSBpZiAoc29ydGVkSW5kZXggJiYgaWR4ICYmIGxlbmd0aCkge1xuICAgICAgICBpZHggPSBzb3J0ZWRJbmRleChhcnJheSwgaXRlbSk7XG4gICAgICAgIHJldHVybiBhcnJheVtpZHhdID09PSBpdGVtID8gaWR4IDogLTE7XG4gICAgICB9XG4gICAgICBpZiAoaXRlbSAhPT0gaXRlbSkge1xuICAgICAgICBpZHggPSBwcmVkaWNhdGVGaW5kKHNsaWNlLmNhbGwoYXJyYXksIGksIGxlbmd0aCksIGlzTmFOJDEpO1xuICAgICAgICByZXR1cm4gaWR4ID49IDAgPyBpZHggKyBpIDogLTE7XG4gICAgICB9XG4gICAgICBmb3IgKGlkeCA9IGRpciA+IDAgPyBpIDogbGVuZ3RoIC0gMTsgaWR4ID49IDAgJiYgaWR4IDwgbGVuZ3RoOyBpZHggKz0gZGlyKSB7XG4gICAgICAgIGlmIChhcnJheVtpZHhdID09PSBpdGVtKSByZXR1cm4gaWR4O1xuICAgICAgfVxuICAgICAgcmV0dXJuIC0xO1xuICAgIH07XG4gIH1cblxuICAvLyBSZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGFuIGl0ZW0gaW4gYW4gYXJyYXksXG4gIC8vIG9yIC0xIGlmIHRoZSBpdGVtIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgYXJyYXkuXG4gIC8vIElmIHRoZSBhcnJheSBpcyBsYXJnZSBhbmQgYWxyZWFkeSBpbiBzb3J0IG9yZGVyLCBwYXNzIGB0cnVlYFxuICAvLyBmb3IgKippc1NvcnRlZCoqIHRvIHVzZSBiaW5hcnkgc2VhcmNoLlxuICB2YXIgaW5kZXhPZiA9IGNyZWF0ZUluZGV4RmluZGVyKDEsIGZpbmRJbmRleCwgc29ydGVkSW5kZXgpO1xuXG4gIC8vIFJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBhbiBpdGVtIGluIGFuIGFycmF5LFxuICAvLyBvciAtMSBpZiB0aGUgaXRlbSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGFycmF5LlxuICB2YXIgbGFzdEluZGV4T2YgPSBjcmVhdGVJbmRleEZpbmRlcigtMSwgZmluZExhc3RJbmRleCk7XG5cbiAgLy8gUmV0dXJuIHRoZSBmaXJzdCB2YWx1ZSB3aGljaCBwYXNzZXMgYSB0cnV0aCB0ZXN0LlxuICBmdW5jdGlvbiBmaW5kKG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgdmFyIGtleUZpbmRlciA9IGlzQXJyYXlMaWtlKG9iaikgPyBmaW5kSW5kZXggOiBmaW5kS2V5O1xuICAgIHZhciBrZXkgPSBrZXlGaW5kZXIob2JqLCBwcmVkaWNhdGUsIGNvbnRleHQpO1xuICAgIGlmIChrZXkgIT09IHZvaWQgMCAmJiBrZXkgIT09IC0xKSByZXR1cm4gb2JqW2tleV07XG4gIH1cblxuICAvLyBDb252ZW5pZW5jZSB2ZXJzaW9uIG9mIGEgY29tbW9uIHVzZSBjYXNlIG9mIGBfLmZpbmRgOiBnZXR0aW5nIHRoZSBmaXJzdFxuICAvLyBvYmplY3QgY29udGFpbmluZyBzcGVjaWZpYyBga2V5OnZhbHVlYCBwYWlycy5cbiAgZnVuY3Rpb24gZmluZFdoZXJlKG9iaiwgYXR0cnMpIHtcbiAgICByZXR1cm4gZmluZChvYmosIG1hdGNoZXIoYXR0cnMpKTtcbiAgfVxuXG4gIC8vIFRoZSBjb3JuZXJzdG9uZSBmb3IgY29sbGVjdGlvbiBmdW5jdGlvbnMsIGFuIGBlYWNoYFxuICAvLyBpbXBsZW1lbnRhdGlvbiwgYWthIGBmb3JFYWNoYC5cbiAgLy8gSGFuZGxlcyByYXcgb2JqZWN0cyBpbiBhZGRpdGlvbiB0byBhcnJheS1saWtlcy4gVHJlYXRzIGFsbFxuICAvLyBzcGFyc2UgYXJyYXktbGlrZXMgYXMgaWYgdGhleSB3ZXJlIGRlbnNlLlxuICBmdW5jdGlvbiBlYWNoKG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICBpdGVyYXRlZSA9IG9wdGltaXplQ2IoaXRlcmF0ZWUsIGNvbnRleHQpO1xuICAgIHZhciBpLCBsZW5ndGg7XG4gICAgaWYgKGlzQXJyYXlMaWtlKG9iaikpIHtcbiAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IG9iai5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBpdGVyYXRlZShvYmpbaV0sIGksIG9iaik7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHZhciBfa2V5cyA9IGtleXMob2JqKTtcbiAgICAgIGZvciAoaSA9IDAsIGxlbmd0aCA9IF9rZXlzLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGl0ZXJhdGVlKG9ialtfa2V5c1tpXV0sIF9rZXlzW2ldLCBvYmopO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgLy8gUmV0dXJuIHRoZSByZXN1bHRzIG9mIGFwcGx5aW5nIHRoZSBpdGVyYXRlZSB0byBlYWNoIGVsZW1lbnQuXG4gIGZ1bmN0aW9uIG1hcChvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgaXRlcmF0ZWUgPSBjYihpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgdmFyIF9rZXlzID0gIWlzQXJyYXlMaWtlKG9iaikgJiYga2V5cyhvYmopLFxuICAgICAgICBsZW5ndGggPSAoX2tleXMgfHwgb2JqKS5sZW5ndGgsXG4gICAgICAgIHJlc3VsdHMgPSBBcnJheShsZW5ndGgpO1xuICAgIGZvciAodmFyIGluZGV4ID0gMDsgaW5kZXggPCBsZW5ndGg7IGluZGV4KyspIHtcbiAgICAgIHZhciBjdXJyZW50S2V5ID0gX2tleXMgPyBfa2V5c1tpbmRleF0gOiBpbmRleDtcbiAgICAgIHJlc3VsdHNbaW5kZXhdID0gaXRlcmF0ZWUob2JqW2N1cnJlbnRLZXldLCBjdXJyZW50S2V5LCBvYmopO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0cztcbiAgfVxuXG4gIC8vIEludGVybmFsIGhlbHBlciB0byBjcmVhdGUgYSByZWR1Y2luZyBmdW5jdGlvbiwgaXRlcmF0aW5nIGxlZnQgb3IgcmlnaHQuXG4gIGZ1bmN0aW9uIGNyZWF0ZVJlZHVjZShkaXIpIHtcbiAgICAvLyBXcmFwIGNvZGUgdGhhdCByZWFzc2lnbnMgYXJndW1lbnQgdmFyaWFibGVzIGluIGEgc2VwYXJhdGUgZnVuY3Rpb24gdGhhblxuICAgIC8vIHRoZSBvbmUgdGhhdCBhY2Nlc3NlcyBgYXJndW1lbnRzLmxlbmd0aGAgdG8gYXZvaWQgYSBwZXJmIGhpdC4gKCMxOTkxKVxuICAgIHZhciByZWR1Y2VyID0gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgbWVtbywgaW5pdGlhbCkge1xuICAgICAgdmFyIF9rZXlzID0gIWlzQXJyYXlMaWtlKG9iaikgJiYga2V5cyhvYmopLFxuICAgICAgICAgIGxlbmd0aCA9IChfa2V5cyB8fCBvYmopLmxlbmd0aCxcbiAgICAgICAgICBpbmRleCA9IGRpciA+IDAgPyAwIDogbGVuZ3RoIC0gMTtcbiAgICAgIGlmICghaW5pdGlhbCkge1xuICAgICAgICBtZW1vID0gb2JqW19rZXlzID8gX2tleXNbaW5kZXhdIDogaW5kZXhdO1xuICAgICAgICBpbmRleCArPSBkaXI7XG4gICAgICB9XG4gICAgICBmb3IgKDsgaW5kZXggPj0gMCAmJiBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gZGlyKSB7XG4gICAgICAgIHZhciBjdXJyZW50S2V5ID0gX2tleXMgPyBfa2V5c1tpbmRleF0gOiBpbmRleDtcbiAgICAgICAgbWVtbyA9IGl0ZXJhdGVlKG1lbW8sIG9ialtjdXJyZW50S2V5XSwgY3VycmVudEtleSwgb2JqKTtcbiAgICAgIH1cbiAgICAgIHJldHVybiBtZW1vO1xuICAgIH07XG5cbiAgICByZXR1cm4gZnVuY3Rpb24ob2JqLCBpdGVyYXRlZSwgbWVtbywgY29udGV4dCkge1xuICAgICAgdmFyIGluaXRpYWwgPSBhcmd1bWVudHMubGVuZ3RoID49IDM7XG4gICAgICByZXR1cm4gcmVkdWNlcihvYmosIG9wdGltaXplQ2IoaXRlcmF0ZWUsIGNvbnRleHQsIDQpLCBtZW1vLCBpbml0aWFsKTtcbiAgICB9O1xuICB9XG5cbiAgLy8gKipSZWR1Y2UqKiBidWlsZHMgdXAgYSBzaW5nbGUgcmVzdWx0IGZyb20gYSBsaXN0IG9mIHZhbHVlcywgYWthIGBpbmplY3RgLFxuICAvLyBvciBgZm9sZGxgLlxuICB2YXIgcmVkdWNlID0gY3JlYXRlUmVkdWNlKDEpO1xuXG4gIC8vIFRoZSByaWdodC1hc3NvY2lhdGl2ZSB2ZXJzaW9uIG9mIHJlZHVjZSwgYWxzbyBrbm93biBhcyBgZm9sZHJgLlxuICB2YXIgcmVkdWNlUmlnaHQgPSBjcmVhdGVSZWR1Y2UoLTEpO1xuXG4gIC8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIHRoYXQgcGFzcyBhIHRydXRoIHRlc3QuXG4gIGZ1bmN0aW9uIGZpbHRlcihvYmosIHByZWRpY2F0ZSwgY29udGV4dCkge1xuICAgIHZhciByZXN1bHRzID0gW107XG4gICAgcHJlZGljYXRlID0gY2IocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICBlYWNoKG9iaiwgZnVuY3Rpb24odmFsdWUsIGluZGV4LCBsaXN0KSB7XG4gICAgICBpZiAocHJlZGljYXRlKHZhbHVlLCBpbmRleCwgbGlzdCkpIHJlc3VsdHMucHVzaCh2YWx1ZSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHJlc3VsdHM7XG4gIH1cblxuICAvLyBSZXR1cm4gYWxsIHRoZSBlbGVtZW50cyBmb3Igd2hpY2ggYSB0cnV0aCB0ZXN0IGZhaWxzLlxuICBmdW5jdGlvbiByZWplY3Qob2JqLCBwcmVkaWNhdGUsIGNvbnRleHQpIHtcbiAgICByZXR1cm4gZmlsdGVyKG9iaiwgbmVnYXRlKGNiKHByZWRpY2F0ZSkpLCBjb250ZXh0KTtcbiAgfVxuXG4gIC8vIERldGVybWluZSB3aGV0aGVyIGFsbCBvZiB0aGUgZWxlbWVudHMgcGFzcyBhIHRydXRoIHRlc3QuXG4gIGZ1bmN0aW9uIGV2ZXJ5KG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgcHJlZGljYXRlID0gY2IocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICB2YXIgX2tleXMgPSAhaXNBcnJheUxpa2Uob2JqKSAmJiBrZXlzKG9iaiksXG4gICAgICAgIGxlbmd0aCA9IChfa2V5cyB8fCBvYmopLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB2YXIgY3VycmVudEtleSA9IF9rZXlzID8gX2tleXNbaW5kZXhdIDogaW5kZXg7XG4gICAgICBpZiAoIXByZWRpY2F0ZShvYmpbY3VycmVudEtleV0sIGN1cnJlbnRLZXksIG9iaikpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICAvLyBEZXRlcm1pbmUgaWYgYXQgbGVhc3Qgb25lIGVsZW1lbnQgaW4gdGhlIG9iamVjdCBwYXNzZXMgYSB0cnV0aCB0ZXN0LlxuICBmdW5jdGlvbiBzb21lKG9iaiwgcHJlZGljYXRlLCBjb250ZXh0KSB7XG4gICAgcHJlZGljYXRlID0gY2IocHJlZGljYXRlLCBjb250ZXh0KTtcbiAgICB2YXIgX2tleXMgPSAhaXNBcnJheUxpa2Uob2JqKSAmJiBrZXlzKG9iaiksXG4gICAgICAgIGxlbmd0aCA9IChfa2V5cyB8fCBvYmopLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICB2YXIgY3VycmVudEtleSA9IF9rZXlzID8gX2tleXNbaW5kZXhdIDogaW5kZXg7XG4gICAgICBpZiAocHJlZGljYXRlKG9ialtjdXJyZW50S2V5XSwgY3VycmVudEtleSwgb2JqKSkgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIC8vIERldGVybWluZSBpZiB0aGUgYXJyYXkgb3Igb2JqZWN0IGNvbnRhaW5zIGEgZ2l2ZW4gaXRlbSAodXNpbmcgYD09PWApLlxuICBmdW5jdGlvbiBjb250YWlucyhvYmosIGl0ZW0sIGZyb21JbmRleCwgZ3VhcmQpIHtcbiAgICBpZiAoIWlzQXJyYXlMaWtlKG9iaikpIG9iaiA9IHZhbHVlcyhvYmopO1xuICAgIGlmICh0eXBlb2YgZnJvbUluZGV4ICE9ICdudW1iZXInIHx8IGd1YXJkKSBmcm9tSW5kZXggPSAwO1xuICAgIHJldHVybiBpbmRleE9mKG9iaiwgaXRlbSwgZnJvbUluZGV4KSA+PSAwO1xuICB9XG5cbiAgLy8gSW52b2tlIGEgbWV0aG9kICh3aXRoIGFyZ3VtZW50cykgb24gZXZlcnkgaXRlbSBpbiBhIGNvbGxlY3Rpb24uXG4gIHZhciBpbnZva2UgPSByZXN0QXJndW1lbnRzKGZ1bmN0aW9uKG9iaiwgcGF0aCwgYXJncykge1xuICAgIHZhciBjb250ZXh0UGF0aCwgZnVuYztcbiAgICBpZiAoaXNGdW5jdGlvbiQxKHBhdGgpKSB7XG4gICAgICBmdW5jID0gcGF0aDtcbiAgICB9IGVsc2Uge1xuICAgICAgcGF0aCA9IHRvUGF0aChwYXRoKTtcbiAgICAgIGNvbnRleHRQYXRoID0gcGF0aC5zbGljZSgwLCAtMSk7XG4gICAgICBwYXRoID0gcGF0aFtwYXRoLmxlbmd0aCAtIDFdO1xuICAgIH1cbiAgICByZXR1cm4gbWFwKG9iaiwgZnVuY3Rpb24oY29udGV4dCkge1xuICAgICAgdmFyIG1ldGhvZCA9IGZ1bmM7XG4gICAgICBpZiAoIW1ldGhvZCkge1xuICAgICAgICBpZiAoY29udGV4dFBhdGggJiYgY29udGV4dFBhdGgubGVuZ3RoKSB7XG4gICAgICAgICAgY29udGV4dCA9IGRlZXBHZXQoY29udGV4dCwgY29udGV4dFBhdGgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHJldHVybiB2b2lkIDA7XG4gICAgICAgIG1ldGhvZCA9IGNvbnRleHRbcGF0aF07XG4gICAgICB9XG4gICAgICByZXR1cm4gbWV0aG9kID09IG51bGwgPyBtZXRob2QgOiBtZXRob2QuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgfSk7XG4gIH0pO1xuXG4gIC8vIENvbnZlbmllbmNlIHZlcnNpb24gb2YgYSBjb21tb24gdXNlIGNhc2Ugb2YgYF8ubWFwYDogZmV0Y2hpbmcgYSBwcm9wZXJ0eS5cbiAgZnVuY3Rpb24gcGx1Y2sob2JqLCBrZXkpIHtcbiAgICByZXR1cm4gbWFwKG9iaiwgcHJvcGVydHkoa2V5KSk7XG4gIH1cblxuICAvLyBDb252ZW5pZW5jZSB2ZXJzaW9uIG9mIGEgY29tbW9uIHVzZSBjYXNlIG9mIGBfLmZpbHRlcmA6IHNlbGVjdGluZyBvbmx5XG4gIC8vIG9iamVjdHMgY29udGFpbmluZyBzcGVjaWZpYyBga2V5OnZhbHVlYCBwYWlycy5cbiAgZnVuY3Rpb24gd2hlcmUob2JqLCBhdHRycykge1xuICAgIHJldHVybiBmaWx0ZXIob2JqLCBtYXRjaGVyKGF0dHJzKSk7XG4gIH1cblxuICAvLyBSZXR1cm4gdGhlIG1heGltdW0gZWxlbWVudCAob3IgZWxlbWVudC1iYXNlZCBjb21wdXRhdGlvbikuXG4gIGZ1bmN0aW9uIG1heChvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgdmFyIHJlc3VsdCA9IC1JbmZpbml0eSwgbGFzdENvbXB1dGVkID0gLUluZmluaXR5LFxuICAgICAgICB2YWx1ZSwgY29tcHV0ZWQ7XG4gICAgaWYgKGl0ZXJhdGVlID09IG51bGwgfHwgKHR5cGVvZiBpdGVyYXRlZSA9PSAnbnVtYmVyJyAmJiB0eXBlb2Ygb2JqWzBdICE9ICdvYmplY3QnICYmIG9iaiAhPSBudWxsKSkge1xuICAgICAgb2JqID0gaXNBcnJheUxpa2Uob2JqKSA/IG9iaiA6IHZhbHVlcyhvYmopO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IG9iai5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICB2YWx1ZSA9IG9ialtpXTtcbiAgICAgICAgaWYgKHZhbHVlICE9IG51bGwgJiYgdmFsdWUgPiByZXN1bHQpIHtcbiAgICAgICAgICByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBpdGVyYXRlZSA9IGNiKGl0ZXJhdGVlLCBjb250ZXh0KTtcbiAgICAgIGVhY2gob2JqLCBmdW5jdGlvbih2LCBpbmRleCwgbGlzdCkge1xuICAgICAgICBjb21wdXRlZCA9IGl0ZXJhdGVlKHYsIGluZGV4LCBsaXN0KTtcbiAgICAgICAgaWYgKGNvbXB1dGVkID4gbGFzdENvbXB1dGVkIHx8IChjb21wdXRlZCA9PT0gLUluZmluaXR5ICYmIHJlc3VsdCA9PT0gLUluZmluaXR5KSkge1xuICAgICAgICAgIHJlc3VsdCA9IHY7XG4gICAgICAgICAgbGFzdENvbXB1dGVkID0gY29tcHV0ZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gUmV0dXJuIHRoZSBtaW5pbXVtIGVsZW1lbnQgKG9yIGVsZW1lbnQtYmFzZWQgY29tcHV0YXRpb24pLlxuICBmdW5jdGlvbiBtaW4ob2JqLCBpdGVyYXRlZSwgY29udGV4dCkge1xuICAgIHZhciByZXN1bHQgPSBJbmZpbml0eSwgbGFzdENvbXB1dGVkID0gSW5maW5pdHksXG4gICAgICAgIHZhbHVlLCBjb21wdXRlZDtcbiAgICBpZiAoaXRlcmF0ZWUgPT0gbnVsbCB8fCAodHlwZW9mIGl0ZXJhdGVlID09ICdudW1iZXInICYmIHR5cGVvZiBvYmpbMF0gIT0gJ29iamVjdCcgJiYgb2JqICE9IG51bGwpKSB7XG4gICAgICBvYmogPSBpc0FycmF5TGlrZShvYmopID8gb2JqIDogdmFsdWVzKG9iaik7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0gb2JqLmxlbmd0aDsgaSA8IGxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhbHVlID0gb2JqW2ldO1xuICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiB2YWx1ZSA8IHJlc3VsdCkge1xuICAgICAgICAgIHJlc3VsdCA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGl0ZXJhdGVlID0gY2IoaXRlcmF0ZWUsIGNvbnRleHQpO1xuICAgICAgZWFjaChvYmosIGZ1bmN0aW9uKHYsIGluZGV4LCBsaXN0KSB7XG4gICAgICAgIGNvbXB1dGVkID0gaXRlcmF0ZWUodiwgaW5kZXgsIGxpc3QpO1xuICAgICAgICBpZiAoY29tcHV0ZWQgPCBsYXN0Q29tcHV0ZWQgfHwgKGNvbXB1dGVkID09PSBJbmZpbml0eSAmJiByZXN1bHQgPT09IEluZmluaXR5KSkge1xuICAgICAgICAgIHJlc3VsdCA9IHY7XG4gICAgICAgICAgbGFzdENvbXB1dGVkID0gY29tcHV0ZWQ7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gU2FmZWx5IGNyZWF0ZSBhIHJlYWwsIGxpdmUgYXJyYXkgZnJvbSBhbnl0aGluZyBpdGVyYWJsZS5cbiAgdmFyIHJlU3RyU3ltYm9sID0gL1teXFx1ZDgwMC1cXHVkZmZmXXxbXFx1ZDgwMC1cXHVkYmZmXVtcXHVkYzAwLVxcdWRmZmZdfFtcXHVkODAwLVxcdWRmZmZdL2c7XG4gIGZ1bmN0aW9uIHRvQXJyYXkob2JqKSB7XG4gICAgaWYgKCFvYmopIHJldHVybiBbXTtcbiAgICBpZiAoaXNBcnJheShvYmopKSByZXR1cm4gc2xpY2UuY2FsbChvYmopO1xuICAgIGlmIChpc1N0cmluZyhvYmopKSB7XG4gICAgICAvLyBLZWVwIHN1cnJvZ2F0ZSBwYWlyIGNoYXJhY3RlcnMgdG9nZXRoZXIuXG4gICAgICByZXR1cm4gb2JqLm1hdGNoKHJlU3RyU3ltYm9sKTtcbiAgICB9XG4gICAgaWYgKGlzQXJyYXlMaWtlKG9iaikpIHJldHVybiBtYXAob2JqLCBpZGVudGl0eSk7XG4gICAgcmV0dXJuIHZhbHVlcyhvYmopO1xuICB9XG5cbiAgLy8gU2FtcGxlICoqbioqIHJhbmRvbSB2YWx1ZXMgZnJvbSBhIGNvbGxlY3Rpb24gdXNpbmcgdGhlIG1vZGVybiB2ZXJzaW9uIG9mIHRoZVxuICAvLyBbRmlzaGVyLVlhdGVzIHNodWZmbGVdKGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0Zpc2hlcuKAk1lhdGVzX3NodWZmbGUpLlxuICAvLyBJZiAqKm4qKiBpcyBub3Qgc3BlY2lmaWVkLCByZXR1cm5zIGEgc2luZ2xlIHJhbmRvbSBlbGVtZW50LlxuICAvLyBUaGUgaW50ZXJuYWwgYGd1YXJkYCBhcmd1bWVudCBhbGxvd3MgaXQgdG8gd29yayB3aXRoIGBfLm1hcGAuXG4gIGZ1bmN0aW9uIHNhbXBsZShvYmosIG4sIGd1YXJkKSB7XG4gICAgaWYgKG4gPT0gbnVsbCB8fCBndWFyZCkge1xuICAgICAgaWYgKCFpc0FycmF5TGlrZShvYmopKSBvYmogPSB2YWx1ZXMob2JqKTtcbiAgICAgIHJldHVybiBvYmpbcmFuZG9tKG9iai5sZW5ndGggLSAxKV07XG4gICAgfVxuICAgIHZhciBzYW1wbGUgPSB0b0FycmF5KG9iaik7XG4gICAgdmFyIGxlbmd0aCA9IGdldExlbmd0aChzYW1wbGUpO1xuICAgIG4gPSBNYXRoLm1heChNYXRoLm1pbihuLCBsZW5ndGgpLCAwKTtcbiAgICB2YXIgbGFzdCA9IGxlbmd0aCAtIDE7XG4gICAgZm9yICh2YXIgaW5kZXggPSAwOyBpbmRleCA8IG47IGluZGV4KyspIHtcbiAgICAgIHZhciByYW5kID0gcmFuZG9tKGluZGV4LCBsYXN0KTtcbiAgICAgIHZhciB0ZW1wID0gc2FtcGxlW2luZGV4XTtcbiAgICAgIHNhbXBsZVtpbmRleF0gPSBzYW1wbGVbcmFuZF07XG4gICAgICBzYW1wbGVbcmFuZF0gPSB0ZW1wO1xuICAgIH1cbiAgICByZXR1cm4gc2FtcGxlLnNsaWNlKDAsIG4pO1xuICB9XG5cbiAgLy8gU2h1ZmZsZSBhIGNvbGxlY3Rpb24uXG4gIGZ1bmN0aW9uIHNodWZmbGUob2JqKSB7XG4gICAgcmV0dXJuIHNhbXBsZShvYmosIEluZmluaXR5KTtcbiAgfVxuXG4gIC8vIFNvcnQgdGhlIG9iamVjdCdzIHZhbHVlcyBieSBhIGNyaXRlcmlvbiBwcm9kdWNlZCBieSBhbiBpdGVyYXRlZS5cbiAgZnVuY3Rpb24gc29ydEJ5KG9iaiwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGl0ZXJhdGVlID0gY2IoaXRlcmF0ZWUsIGNvbnRleHQpO1xuICAgIHJldHVybiBwbHVjayhtYXAob2JqLCBmdW5jdGlvbih2YWx1ZSwga2V5LCBsaXN0KSB7XG4gICAgICByZXR1cm4ge1xuICAgICAgICB2YWx1ZTogdmFsdWUsXG4gICAgICAgIGluZGV4OiBpbmRleCsrLFxuICAgICAgICBjcml0ZXJpYTogaXRlcmF0ZWUodmFsdWUsIGtleSwgbGlzdClcbiAgICAgIH07XG4gICAgfSkuc29ydChmdW5jdGlvbihsZWZ0LCByaWdodCkge1xuICAgICAgdmFyIGEgPSBsZWZ0LmNyaXRlcmlhO1xuICAgICAgdmFyIGIgPSByaWdodC5jcml0ZXJpYTtcbiAgICAgIGlmIChhICE9PSBiKSB7XG4gICAgICAgIGlmIChhID4gYiB8fCBhID09PSB2b2lkIDApIHJldHVybiAxO1xuICAgICAgICBpZiAoYSA8IGIgfHwgYiA9PT0gdm9pZCAwKSByZXR1cm4gLTE7XG4gICAgICB9XG4gICAgICByZXR1cm4gbGVmdC5pbmRleCAtIHJpZ2h0LmluZGV4O1xuICAgIH0pLCAndmFsdWUnKTtcbiAgfVxuXG4gIC8vIEFuIGludGVybmFsIGZ1bmN0aW9uIHVzZWQgZm9yIGFnZ3JlZ2F0ZSBcImdyb3VwIGJ5XCIgb3BlcmF0aW9ucy5cbiAgZnVuY3Rpb24gZ3JvdXAoYmVoYXZpb3IsIHBhcnRpdGlvbikge1xuICAgIHJldHVybiBmdW5jdGlvbihvYmosIGl0ZXJhdGVlLCBjb250ZXh0KSB7XG4gICAgICB2YXIgcmVzdWx0ID0gcGFydGl0aW9uID8gW1tdLCBbXV0gOiB7fTtcbiAgICAgIGl0ZXJhdGVlID0gY2IoaXRlcmF0ZWUsIGNvbnRleHQpO1xuICAgICAgZWFjaChvYmosIGZ1bmN0aW9uKHZhbHVlLCBpbmRleCkge1xuICAgICAgICB2YXIga2V5ID0gaXRlcmF0ZWUodmFsdWUsIGluZGV4LCBvYmopO1xuICAgICAgICBiZWhhdmlvcihyZXN1bHQsIHZhbHVlLCBrZXkpO1xuICAgICAgfSk7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH07XG4gIH1cblxuICAvLyBHcm91cHMgdGhlIG9iamVjdCdzIHZhbHVlcyBieSBhIGNyaXRlcmlvbi4gUGFzcyBlaXRoZXIgYSBzdHJpbmcgYXR0cmlidXRlXG4gIC8vIHRvIGdyb3VwIGJ5LCBvciBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgY3JpdGVyaW9uLlxuICB2YXIgZ3JvdXBCeSA9IGdyb3VwKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIGtleSkge1xuICAgIGlmIChoYXMkMShyZXN1bHQsIGtleSkpIHJlc3VsdFtrZXldLnB1c2godmFsdWUpOyBlbHNlIHJlc3VsdFtrZXldID0gW3ZhbHVlXTtcbiAgfSk7XG5cbiAgLy8gSW5kZXhlcyB0aGUgb2JqZWN0J3MgdmFsdWVzIGJ5IGEgY3JpdGVyaW9uLCBzaW1pbGFyIHRvIGBfLmdyb3VwQnlgLCBidXQgZm9yXG4gIC8vIHdoZW4geW91IGtub3cgdGhhdCB5b3VyIGluZGV4IHZhbHVlcyB3aWxsIGJlIHVuaXF1ZS5cbiAgdmFyIGluZGV4QnkgPSBncm91cChmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICByZXN1bHRba2V5XSA9IHZhbHVlO1xuICB9KTtcblxuICAvLyBDb3VudHMgaW5zdGFuY2VzIG9mIGFuIG9iamVjdCB0aGF0IGdyb3VwIGJ5IGEgY2VydGFpbiBjcml0ZXJpb24uIFBhc3NcbiAgLy8gZWl0aGVyIGEgc3RyaW5nIGF0dHJpYnV0ZSB0byBjb3VudCBieSwgb3IgYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlXG4gIC8vIGNyaXRlcmlvbi5cbiAgdmFyIGNvdW50QnkgPSBncm91cChmdW5jdGlvbihyZXN1bHQsIHZhbHVlLCBrZXkpIHtcbiAgICBpZiAoaGFzJDEocmVzdWx0LCBrZXkpKSByZXN1bHRba2V5XSsrOyBlbHNlIHJlc3VsdFtrZXldID0gMTtcbiAgfSk7XG5cbiAgLy8gU3BsaXQgYSBjb2xsZWN0aW9uIGludG8gdHdvIGFycmF5czogb25lIHdob3NlIGVsZW1lbnRzIGFsbCBwYXNzIHRoZSBnaXZlblxuICAvLyB0cnV0aCB0ZXN0LCBhbmQgb25lIHdob3NlIGVsZW1lbnRzIGFsbCBkbyBub3QgcGFzcyB0aGUgdHJ1dGggdGVzdC5cbiAgdmFyIHBhcnRpdGlvbiA9IGdyb3VwKGZ1bmN0aW9uKHJlc3VsdCwgdmFsdWUsIHBhc3MpIHtcbiAgICByZXN1bHRbcGFzcyA/IDAgOiAxXS5wdXNoKHZhbHVlKTtcbiAgfSwgdHJ1ZSk7XG5cbiAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSBjb2xsZWN0aW9uLlxuICBmdW5jdGlvbiBzaXplKG9iaikge1xuICAgIGlmIChvYmogPT0gbnVsbCkgcmV0dXJuIDA7XG4gICAgcmV0dXJuIGlzQXJyYXlMaWtlKG9iaikgPyBvYmoubGVuZ3RoIDoga2V5cyhvYmopLmxlbmd0aDtcbiAgfVxuXG4gIC8vIEludGVybmFsIGBfLnBpY2tgIGhlbHBlciBmdW5jdGlvbiB0byBkZXRlcm1pbmUgd2hldGhlciBga2V5YCBpcyBhbiBlbnVtZXJhYmxlXG4gIC8vIHByb3BlcnR5IG5hbWUgb2YgYG9iamAuXG4gIGZ1bmN0aW9uIGtleUluT2JqKHZhbHVlLCBrZXksIG9iaikge1xuICAgIHJldHVybiBrZXkgaW4gb2JqO1xuICB9XG5cbiAgLy8gUmV0dXJuIGEgY29weSBvZiB0aGUgb2JqZWN0IG9ubHkgY29udGFpbmluZyB0aGUgYWxsb3dlZCBwcm9wZXJ0aWVzLlxuICB2YXIgcGljayA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24ob2JqLCBrZXlzKSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9LCBpdGVyYXRlZSA9IGtleXNbMF07XG4gICAgaWYgKG9iaiA9PSBudWxsKSByZXR1cm4gcmVzdWx0O1xuICAgIGlmIChpc0Z1bmN0aW9uJDEoaXRlcmF0ZWUpKSB7XG4gICAgICBpZiAoa2V5cy5sZW5ndGggPiAxKSBpdGVyYXRlZSA9IG9wdGltaXplQ2IoaXRlcmF0ZWUsIGtleXNbMV0pO1xuICAgICAga2V5cyA9IGFsbEtleXMob2JqKTtcbiAgICB9IGVsc2Uge1xuICAgICAgaXRlcmF0ZWUgPSBrZXlJbk9iajtcbiAgICAgIGtleXMgPSBmbGF0dGVuJDEoa2V5cywgZmFsc2UsIGZhbHNlKTtcbiAgICAgIG9iaiA9IE9iamVjdChvYmopO1xuICAgIH1cbiAgICBmb3IgKHZhciBpID0gMCwgbGVuZ3RoID0ga2V5cy5sZW5ndGg7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdmFyIGtleSA9IGtleXNbaV07XG4gICAgICB2YXIgdmFsdWUgPSBvYmpba2V5XTtcbiAgICAgIGlmIChpdGVyYXRlZSh2YWx1ZSwga2V5LCBvYmopKSByZXN1bHRba2V5XSA9IHZhbHVlO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9KTtcblxuICAvLyBSZXR1cm4gYSBjb3B5IG9mIHRoZSBvYmplY3Qgd2l0aG91dCB0aGUgZGlzYWxsb3dlZCBwcm9wZXJ0aWVzLlxuICB2YXIgb21pdCA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24ob2JqLCBrZXlzKSB7XG4gICAgdmFyIGl0ZXJhdGVlID0ga2V5c1swXSwgY29udGV4dDtcbiAgICBpZiAoaXNGdW5jdGlvbiQxKGl0ZXJhdGVlKSkge1xuICAgICAgaXRlcmF0ZWUgPSBuZWdhdGUoaXRlcmF0ZWUpO1xuICAgICAgaWYgKGtleXMubGVuZ3RoID4gMSkgY29udGV4dCA9IGtleXNbMV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGtleXMgPSBtYXAoZmxhdHRlbiQxKGtleXMsIGZhbHNlLCBmYWxzZSksIFN0cmluZyk7XG4gICAgICBpdGVyYXRlZSA9IGZ1bmN0aW9uKHZhbHVlLCBrZXkpIHtcbiAgICAgICAgcmV0dXJuICFjb250YWlucyhrZXlzLCBrZXkpO1xuICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHBpY2sob2JqLCBpdGVyYXRlZSwgY29udGV4dCk7XG4gIH0pO1xuXG4gIC8vIFJldHVybnMgZXZlcnl0aGluZyBidXQgdGhlIGxhc3QgZW50cnkgb2YgdGhlIGFycmF5LiBFc3BlY2lhbGx5IHVzZWZ1bCBvblxuICAvLyB0aGUgYXJndW1lbnRzIG9iamVjdC4gUGFzc2luZyAqKm4qKiB3aWxsIHJldHVybiBhbGwgdGhlIHZhbHVlcyBpblxuICAvLyB0aGUgYXJyYXksIGV4Y2x1ZGluZyB0aGUgbGFzdCBOLlxuICBmdW5jdGlvbiBpbml0aWFsKGFycmF5LCBuLCBndWFyZCkge1xuICAgIHJldHVybiBzbGljZS5jYWxsKGFycmF5LCAwLCBNYXRoLm1heCgwLCBhcnJheS5sZW5ndGggLSAobiA9PSBudWxsIHx8IGd1YXJkID8gMSA6IG4pKSk7XG4gIH1cblxuICAvLyBHZXQgdGhlIGZpcnN0IGVsZW1lbnQgb2YgYW4gYXJyYXkuIFBhc3NpbmcgKipuKiogd2lsbCByZXR1cm4gdGhlIGZpcnN0IE5cbiAgLy8gdmFsdWVzIGluIHRoZSBhcnJheS4gVGhlICoqZ3VhcmQqKiBjaGVjayBhbGxvd3MgaXQgdG8gd29yayB3aXRoIGBfLm1hcGAuXG4gIGZ1bmN0aW9uIGZpcnN0KGFycmF5LCBuLCBndWFyZCkge1xuICAgIGlmIChhcnJheSA9PSBudWxsIHx8IGFycmF5Lmxlbmd0aCA8IDEpIHJldHVybiBuID09IG51bGwgfHwgZ3VhcmQgPyB2b2lkIDAgOiBbXTtcbiAgICBpZiAobiA9PSBudWxsIHx8IGd1YXJkKSByZXR1cm4gYXJyYXlbMF07XG4gICAgcmV0dXJuIGluaXRpYWwoYXJyYXksIGFycmF5Lmxlbmd0aCAtIG4pO1xuICB9XG5cbiAgLy8gUmV0dXJucyBldmVyeXRoaW5nIGJ1dCB0aGUgZmlyc3QgZW50cnkgb2YgdGhlIGBhcnJheWAuIEVzcGVjaWFsbHkgdXNlZnVsIG9uXG4gIC8vIHRoZSBgYXJndW1lbnRzYCBvYmplY3QuIFBhc3NpbmcgYW4gKipuKiogd2lsbCByZXR1cm4gdGhlIHJlc3QgTiB2YWx1ZXMgaW4gdGhlXG4gIC8vIGBhcnJheWAuXG4gIGZ1bmN0aW9uIHJlc3QoYXJyYXksIG4sIGd1YXJkKSB7XG4gICAgcmV0dXJuIHNsaWNlLmNhbGwoYXJyYXksIG4gPT0gbnVsbCB8fCBndWFyZCA/IDEgOiBuKTtcbiAgfVxuXG4gIC8vIEdldCB0aGUgbGFzdCBlbGVtZW50IG9mIGFuIGFycmF5LiBQYXNzaW5nICoqbioqIHdpbGwgcmV0dXJuIHRoZSBsYXN0IE5cbiAgLy8gdmFsdWVzIGluIHRoZSBhcnJheS5cbiAgZnVuY3Rpb24gbGFzdChhcnJheSwgbiwgZ3VhcmQpIHtcbiAgICBpZiAoYXJyYXkgPT0gbnVsbCB8fCBhcnJheS5sZW5ndGggPCAxKSByZXR1cm4gbiA9PSBudWxsIHx8IGd1YXJkID8gdm9pZCAwIDogW107XG4gICAgaWYgKG4gPT0gbnVsbCB8fCBndWFyZCkgcmV0dXJuIGFycmF5W2FycmF5Lmxlbmd0aCAtIDFdO1xuICAgIHJldHVybiByZXN0KGFycmF5LCBNYXRoLm1heCgwLCBhcnJheS5sZW5ndGggLSBuKSk7XG4gIH1cblxuICAvLyBUcmltIG91dCBhbGwgZmFsc3kgdmFsdWVzIGZyb20gYW4gYXJyYXkuXG4gIGZ1bmN0aW9uIGNvbXBhY3QoYXJyYXkpIHtcbiAgICByZXR1cm4gZmlsdGVyKGFycmF5LCBCb29sZWFuKTtcbiAgfVxuXG4gIC8vIEZsYXR0ZW4gb3V0IGFuIGFycmF5LCBlaXRoZXIgcmVjdXJzaXZlbHkgKGJ5IGRlZmF1bHQpLCBvciB1cCB0byBgZGVwdGhgLlxuICAvLyBQYXNzaW5nIGB0cnVlYCBvciBgZmFsc2VgIGFzIGBkZXB0aGAgbWVhbnMgYDFgIG9yIGBJbmZpbml0eWAsIHJlc3BlY3RpdmVseS5cbiAgZnVuY3Rpb24gZmxhdHRlbihhcnJheSwgZGVwdGgpIHtcbiAgICByZXR1cm4gZmxhdHRlbiQxKGFycmF5LCBkZXB0aCwgZmFsc2UpO1xuICB9XG5cbiAgLy8gVGFrZSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9uZSBhcnJheSBhbmQgYSBudW1iZXIgb2Ygb3RoZXIgYXJyYXlzLlxuICAvLyBPbmx5IHRoZSBlbGVtZW50cyBwcmVzZW50IGluIGp1c3QgdGhlIGZpcnN0IGFycmF5IHdpbGwgcmVtYWluLlxuICB2YXIgZGlmZmVyZW5jZSA9IHJlc3RBcmd1bWVudHMoZnVuY3Rpb24oYXJyYXksIHJlc3QpIHtcbiAgICByZXN0ID0gZmxhdHRlbiQxKHJlc3QsIHRydWUsIHRydWUpO1xuICAgIHJldHVybiBmaWx0ZXIoYXJyYXksIGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAgIHJldHVybiAhY29udGFpbnMocmVzdCwgdmFsdWUpO1xuICAgIH0pO1xuICB9KTtcblxuICAvLyBSZXR1cm4gYSB2ZXJzaW9uIG9mIHRoZSBhcnJheSB0aGF0IGRvZXMgbm90IGNvbnRhaW4gdGhlIHNwZWNpZmllZCB2YWx1ZShzKS5cbiAgdmFyIHdpdGhvdXQgPSByZXN0QXJndW1lbnRzKGZ1bmN0aW9uKGFycmF5LCBvdGhlckFycmF5cykge1xuICAgIHJldHVybiBkaWZmZXJlbmNlKGFycmF5LCBvdGhlckFycmF5cyk7XG4gIH0pO1xuXG4gIC8vIFByb2R1Y2UgYSBkdXBsaWNhdGUtZnJlZSB2ZXJzaW9uIG9mIHRoZSBhcnJheS4gSWYgdGhlIGFycmF5IGhhcyBhbHJlYWR5XG4gIC8vIGJlZW4gc29ydGVkLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIG9mIHVzaW5nIGEgZmFzdGVyIGFsZ29yaXRobS5cbiAgLy8gVGhlIGZhc3RlciBhbGdvcml0aG0gd2lsbCBub3Qgd29yayB3aXRoIGFuIGl0ZXJhdGVlIGlmIHRoZSBpdGVyYXRlZVxuICAvLyBpcyBub3QgYSBvbmUtdG8tb25lIGZ1bmN0aW9uLCBzbyBwcm92aWRpbmcgYW4gaXRlcmF0ZWUgd2lsbCBkaXNhYmxlXG4gIC8vIHRoZSBmYXN0ZXIgYWxnb3JpdGhtLlxuICBmdW5jdGlvbiB1bmlxKGFycmF5LCBpc1NvcnRlZCwgaXRlcmF0ZWUsIGNvbnRleHQpIHtcbiAgICBpZiAoIWlzQm9vbGVhbihpc1NvcnRlZCkpIHtcbiAgICAgIGNvbnRleHQgPSBpdGVyYXRlZTtcbiAgICAgIGl0ZXJhdGVlID0gaXNTb3J0ZWQ7XG4gICAgICBpc1NvcnRlZCA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAoaXRlcmF0ZWUgIT0gbnVsbCkgaXRlcmF0ZWUgPSBjYihpdGVyYXRlZSwgY29udGV4dCk7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHZhciBzZWVuID0gW107XG4gICAgZm9yICh2YXIgaSA9IDAsIGxlbmd0aCA9IGdldExlbmd0aChhcnJheSk7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgdmFyIHZhbHVlID0gYXJyYXlbaV0sXG4gICAgICAgICAgY29tcHV0ZWQgPSBpdGVyYXRlZSA/IGl0ZXJhdGVlKHZhbHVlLCBpLCBhcnJheSkgOiB2YWx1ZTtcbiAgICAgIGlmIChpc1NvcnRlZCAmJiAhaXRlcmF0ZWUpIHtcbiAgICAgICAgaWYgKCFpIHx8IHNlZW4gIT09IGNvbXB1dGVkKSByZXN1bHQucHVzaCh2YWx1ZSk7XG4gICAgICAgIHNlZW4gPSBjb21wdXRlZDtcbiAgICAgIH0gZWxzZSBpZiAoaXRlcmF0ZWUpIHtcbiAgICAgICAgaWYgKCFjb250YWlucyhzZWVuLCBjb21wdXRlZCkpIHtcbiAgICAgICAgICBzZWVuLnB1c2goY29tcHV0ZWQpO1xuICAgICAgICAgIHJlc3VsdC5wdXNoKHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSBlbHNlIGlmICghY29udGFpbnMocmVzdWx0LCB2YWx1ZSkpIHtcbiAgICAgICAgcmVzdWx0LnB1c2godmFsdWUpO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gUHJvZHVjZSBhbiBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSB1bmlvbjogZWFjaCBkaXN0aW5jdCBlbGVtZW50IGZyb20gYWxsIG9mXG4gIC8vIHRoZSBwYXNzZWQtaW4gYXJyYXlzLlxuICB2YXIgdW5pb24gPSByZXN0QXJndW1lbnRzKGZ1bmN0aW9uKGFycmF5cykge1xuICAgIHJldHVybiB1bmlxKGZsYXR0ZW4kMShhcnJheXMsIHRydWUsIHRydWUpKTtcbiAgfSk7XG5cbiAgLy8gUHJvZHVjZSBhbiBhcnJheSB0aGF0IGNvbnRhaW5zIGV2ZXJ5IGl0ZW0gc2hhcmVkIGJldHdlZW4gYWxsIHRoZVxuICAvLyBwYXNzZWQtaW4gYXJyYXlzLlxuICBmdW5jdGlvbiBpbnRlcnNlY3Rpb24oYXJyYXkpIHtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGFyZ3NMZW5ndGggPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBnZXRMZW5ndGgoYXJyYXkpOyBpIDwgbGVuZ3RoOyBpKyspIHtcbiAgICAgIHZhciBpdGVtID0gYXJyYXlbaV07XG4gICAgICBpZiAoY29udGFpbnMocmVzdWx0LCBpdGVtKSkgY29udGludWU7XG4gICAgICB2YXIgajtcbiAgICAgIGZvciAoaiA9IDE7IGogPCBhcmdzTGVuZ3RoOyBqKyspIHtcbiAgICAgICAgaWYgKCFjb250YWlucyhhcmd1bWVudHNbal0sIGl0ZW0pKSBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChqID09PSBhcmdzTGVuZ3RoKSByZXN1bHQucHVzaChpdGVtKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIENvbXBsZW1lbnQgb2YgemlwLiBVbnppcCBhY2NlcHRzIGFuIGFycmF5IG9mIGFycmF5cyBhbmQgZ3JvdXBzXG4gIC8vIGVhY2ggYXJyYXkncyBlbGVtZW50cyBvbiBzaGFyZWQgaW5kaWNlcy5cbiAgZnVuY3Rpb24gdW56aXAoYXJyYXkpIHtcbiAgICB2YXIgbGVuZ3RoID0gKGFycmF5ICYmIG1heChhcnJheSwgZ2V0TGVuZ3RoKS5sZW5ndGgpIHx8IDA7XG4gICAgdmFyIHJlc3VsdCA9IEFycmF5KGxlbmd0aCk7XG5cbiAgICBmb3IgKHZhciBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICByZXN1bHRbaW5kZXhdID0gcGx1Y2soYXJyYXksIGluZGV4KTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIC8vIFppcCB0b2dldGhlciBtdWx0aXBsZSBsaXN0cyBpbnRvIGEgc2luZ2xlIGFycmF5IC0tIGVsZW1lbnRzIHRoYXQgc2hhcmVcbiAgLy8gYW4gaW5kZXggZ28gdG9nZXRoZXIuXG4gIHZhciB6aXAgPSByZXN0QXJndW1lbnRzKHVuemlwKTtcblxuICAvLyBDb252ZXJ0cyBsaXN0cyBpbnRvIG9iamVjdHMuIFBhc3MgZWl0aGVyIGEgc2luZ2xlIGFycmF5IG9mIGBba2V5LCB2YWx1ZV1gXG4gIC8vIHBhaXJzLCBvciB0d28gcGFyYWxsZWwgYXJyYXlzIG9mIHRoZSBzYW1lIGxlbmd0aCAtLSBvbmUgb2Yga2V5cywgYW5kIG9uZSBvZlxuICAvLyB0aGUgY29ycmVzcG9uZGluZyB2YWx1ZXMuIFBhc3NpbmcgYnkgcGFpcnMgaXMgdGhlIHJldmVyc2Ugb2YgYF8ucGFpcnNgLlxuICBmdW5jdGlvbiBvYmplY3QobGlzdCwgdmFsdWVzKSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGZvciAodmFyIGkgPSAwLCBsZW5ndGggPSBnZXRMZW5ndGgobGlzdCk7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHZhbHVlcykge1xuICAgICAgICByZXN1bHRbbGlzdFtpXV0gPSB2YWx1ZXNbaV07XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXN1bHRbbGlzdFtpXVswXV0gPSBsaXN0W2ldWzFdO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gR2VuZXJhdGUgYW4gaW50ZWdlciBBcnJheSBjb250YWluaW5nIGFuIGFyaXRobWV0aWMgcHJvZ3Jlc3Npb24uIEEgcG9ydCBvZlxuICAvLyB0aGUgbmF0aXZlIFB5dGhvbiBgcmFuZ2UoKWAgZnVuY3Rpb24uIFNlZVxuICAvLyBbdGhlIFB5dGhvbiBkb2N1bWVudGF0aW9uXShodHRwczovL2RvY3MucHl0aG9uLm9yZy9saWJyYXJ5L2Z1bmN0aW9ucy5odG1sI3JhbmdlKS5cbiAgZnVuY3Rpb24gcmFuZ2Uoc3RhcnQsIHN0b3AsIHN0ZXApIHtcbiAgICBpZiAoc3RvcCA9PSBudWxsKSB7XG4gICAgICBzdG9wID0gc3RhcnQgfHwgMDtcbiAgICAgIHN0YXJ0ID0gMDtcbiAgICB9XG4gICAgaWYgKCFzdGVwKSB7XG4gICAgICBzdGVwID0gc3RvcCA8IHN0YXJ0ID8gLTEgOiAxO1xuICAgIH1cblxuICAgIHZhciBsZW5ndGggPSBNYXRoLm1heChNYXRoLmNlaWwoKHN0b3AgLSBzdGFydCkgLyBzdGVwKSwgMCk7XG4gICAgdmFyIHJhbmdlID0gQXJyYXkobGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGlkeCA9IDA7IGlkeCA8IGxlbmd0aDsgaWR4KyssIHN0YXJ0ICs9IHN0ZXApIHtcbiAgICAgIHJhbmdlW2lkeF0gPSBzdGFydDtcbiAgICB9XG5cbiAgICByZXR1cm4gcmFuZ2U7XG4gIH1cblxuICAvLyBDaHVuayBhIHNpbmdsZSBhcnJheSBpbnRvIG11bHRpcGxlIGFycmF5cywgZWFjaCBjb250YWluaW5nIGBjb3VudGAgb3IgZmV3ZXJcbiAgLy8gaXRlbXMuXG4gIGZ1bmN0aW9uIGNodW5rKGFycmF5LCBjb3VudCkge1xuICAgIGlmIChjb3VudCA9PSBudWxsIHx8IGNvdW50IDwgMSkgcmV0dXJuIFtdO1xuICAgIHZhciByZXN1bHQgPSBbXTtcbiAgICB2YXIgaSA9IDAsIGxlbmd0aCA9IGFycmF5Lmxlbmd0aDtcbiAgICB3aGlsZSAoaSA8IGxlbmd0aCkge1xuICAgICAgcmVzdWx0LnB1c2goc2xpY2UuY2FsbChhcnJheSwgaSwgaSArPSBjb3VudCkpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGNvbnRpbnVlIGNoYWluaW5nIGludGVybWVkaWF0ZSByZXN1bHRzLlxuICBmdW5jdGlvbiBjaGFpblJlc3VsdChpbnN0YW5jZSwgb2JqKSB7XG4gICAgcmV0dXJuIGluc3RhbmNlLl9jaGFpbiA/IF8kMShvYmopLmNoYWluKCkgOiBvYmo7XG4gIH1cblxuICAvLyBBZGQgeW91ciBvd24gY3VzdG9tIGZ1bmN0aW9ucyB0byB0aGUgVW5kZXJzY29yZSBvYmplY3QuXG4gIGZ1bmN0aW9uIG1peGluKG9iaikge1xuICAgIGVhY2goZnVuY3Rpb25zKG9iaiksIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICAgIHZhciBmdW5jID0gXyQxW25hbWVdID0gb2JqW25hbWVdO1xuICAgICAgXyQxLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYXJncyA9IFt0aGlzLl93cmFwcGVkXTtcbiAgICAgICAgcHVzaC5hcHBseShhcmdzLCBhcmd1bWVudHMpO1xuICAgICAgICByZXR1cm4gY2hhaW5SZXN1bHQodGhpcywgZnVuYy5hcHBseShfJDEsIGFyZ3MpKTtcbiAgICAgIH07XG4gICAgfSk7XG4gICAgcmV0dXJuIF8kMTtcbiAgfVxuXG4gIC8vIEFkZCBhbGwgbXV0YXRvciBgQXJyYXlgIGZ1bmN0aW9ucyB0byB0aGUgd3JhcHBlci5cbiAgZWFjaChbJ3BvcCcsICdwdXNoJywgJ3JldmVyc2UnLCAnc2hpZnQnLCAnc29ydCcsICdzcGxpY2UnLCAndW5zaGlmdCddLCBmdW5jdGlvbihuYW1lKSB7XG4gICAgdmFyIG1ldGhvZCA9IEFycmF5UHJvdG9bbmFtZV07XG4gICAgXyQxLnByb3RvdHlwZVtuYW1lXSA9IGZ1bmN0aW9uKCkge1xuICAgICAgdmFyIG9iaiA9IHRoaXMuX3dyYXBwZWQ7XG4gICAgICBpZiAob2JqICE9IG51bGwpIHtcbiAgICAgICAgbWV0aG9kLmFwcGx5KG9iaiwgYXJndW1lbnRzKTtcbiAgICAgICAgaWYgKChuYW1lID09PSAnc2hpZnQnIHx8IG5hbWUgPT09ICdzcGxpY2UnKSAmJiBvYmoubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgZGVsZXRlIG9ialswXTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgcmV0dXJuIGNoYWluUmVzdWx0KHRoaXMsIG9iaik7XG4gICAgfTtcbiAgfSk7XG5cbiAgLy8gQWRkIGFsbCBhY2Nlc3NvciBgQXJyYXlgIGZ1bmN0aW9ucyB0byB0aGUgd3JhcHBlci5cbiAgZWFjaChbJ2NvbmNhdCcsICdqb2luJywgJ3NsaWNlJ10sIGZ1bmN0aW9uKG5hbWUpIHtcbiAgICB2YXIgbWV0aG9kID0gQXJyYXlQcm90b1tuYW1lXTtcbiAgICBfJDEucHJvdG90eXBlW25hbWVdID0gZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgb2JqID0gdGhpcy5fd3JhcHBlZDtcbiAgICAgIGlmIChvYmogIT0gbnVsbCkgb2JqID0gbWV0aG9kLmFwcGx5KG9iaiwgYXJndW1lbnRzKTtcbiAgICAgIHJldHVybiBjaGFpblJlc3VsdCh0aGlzLCBvYmopO1xuICAgIH07XG4gIH0pO1xuXG4gIC8vIE5hbWVkIEV4cG9ydHNcblxuICB2YXIgYWxsRXhwb3J0cyA9IHtcbiAgICBfX3Byb3RvX186IG51bGwsXG4gICAgVkVSU0lPTjogVkVSU0lPTixcbiAgICByZXN0QXJndW1lbnRzOiByZXN0QXJndW1lbnRzLFxuICAgIGlzT2JqZWN0OiBpc09iamVjdCxcbiAgICBpc051bGw6IGlzTnVsbCxcbiAgICBpc1VuZGVmaW5lZDogaXNVbmRlZmluZWQsXG4gICAgaXNCb29sZWFuOiBpc0Jvb2xlYW4sXG4gICAgaXNFbGVtZW50OiBpc0VsZW1lbnQsXG4gICAgaXNTdHJpbmc6IGlzU3RyaW5nLFxuICAgIGlzTnVtYmVyOiBpc051bWJlcixcbiAgICBpc0RhdGU6IGlzRGF0ZSxcbiAgICBpc1JlZ0V4cDogaXNSZWdFeHAsXG4gICAgaXNFcnJvcjogaXNFcnJvcixcbiAgICBpc1N5bWJvbDogaXNTeW1ib2wsXG4gICAgaXNBcnJheUJ1ZmZlcjogaXNBcnJheUJ1ZmZlcixcbiAgICBpc0RhdGFWaWV3OiBpc0RhdGFWaWV3JDEsXG4gICAgaXNBcnJheTogaXNBcnJheSxcbiAgICBpc0Z1bmN0aW9uOiBpc0Z1bmN0aW9uJDEsXG4gICAgaXNBcmd1bWVudHM6IGlzQXJndW1lbnRzJDEsXG4gICAgaXNGaW5pdGU6IGlzRmluaXRlJDEsXG4gICAgaXNOYU46IGlzTmFOJDEsXG4gICAgaXNUeXBlZEFycmF5OiBpc1R5cGVkQXJyYXkkMSxcbiAgICBpc0VtcHR5OiBpc0VtcHR5LFxuICAgIGlzTWF0Y2g6IGlzTWF0Y2gsXG4gICAgaXNFcXVhbDogaXNFcXVhbCxcbiAgICBpc01hcDogaXNNYXAsXG4gICAgaXNXZWFrTWFwOiBpc1dlYWtNYXAsXG4gICAgaXNTZXQ6IGlzU2V0LFxuICAgIGlzV2Vha1NldDogaXNXZWFrU2V0LFxuICAgIGtleXM6IGtleXMsXG4gICAgYWxsS2V5czogYWxsS2V5cyxcbiAgICB2YWx1ZXM6IHZhbHVlcyxcbiAgICBwYWlyczogcGFpcnMsXG4gICAgaW52ZXJ0OiBpbnZlcnQsXG4gICAgZnVuY3Rpb25zOiBmdW5jdGlvbnMsXG4gICAgbWV0aG9kczogZnVuY3Rpb25zLFxuICAgIGV4dGVuZDogZXh0ZW5kLFxuICAgIGV4dGVuZE93bjogZXh0ZW5kT3duLFxuICAgIGFzc2lnbjogZXh0ZW5kT3duLFxuICAgIGRlZmF1bHRzOiBkZWZhdWx0cyxcbiAgICBjcmVhdGU6IGNyZWF0ZSxcbiAgICBjbG9uZTogY2xvbmUsXG4gICAgdGFwOiB0YXAsXG4gICAgZ2V0OiBnZXQsXG4gICAgaGFzOiBoYXMsXG4gICAgbWFwT2JqZWN0OiBtYXBPYmplY3QsXG4gICAgaWRlbnRpdHk6IGlkZW50aXR5LFxuICAgIGNvbnN0YW50OiBjb25zdGFudCxcbiAgICBub29wOiBub29wLFxuICAgIHRvUGF0aDogdG9QYXRoJDEsXG4gICAgcHJvcGVydHk6IHByb3BlcnR5LFxuICAgIHByb3BlcnR5T2Y6IHByb3BlcnR5T2YsXG4gICAgbWF0Y2hlcjogbWF0Y2hlcixcbiAgICBtYXRjaGVzOiBtYXRjaGVyLFxuICAgIHRpbWVzOiB0aW1lcyxcbiAgICByYW5kb206IHJhbmRvbSxcbiAgICBub3c6IG5vdyxcbiAgICBlc2NhcGU6IF9lc2NhcGUsXG4gICAgdW5lc2NhcGU6IF91bmVzY2FwZSxcbiAgICB0ZW1wbGF0ZVNldHRpbmdzOiB0ZW1wbGF0ZVNldHRpbmdzLFxuICAgIHRlbXBsYXRlOiB0ZW1wbGF0ZSxcbiAgICByZXN1bHQ6IHJlc3VsdCxcbiAgICB1bmlxdWVJZDogdW5pcXVlSWQsXG4gICAgY2hhaW46IGNoYWluLFxuICAgIGl0ZXJhdGVlOiBpdGVyYXRlZSxcbiAgICBwYXJ0aWFsOiBwYXJ0aWFsLFxuICAgIGJpbmQ6IGJpbmQsXG4gICAgYmluZEFsbDogYmluZEFsbCxcbiAgICBtZW1vaXplOiBtZW1vaXplLFxuICAgIGRlbGF5OiBkZWxheSxcbiAgICBkZWZlcjogZGVmZXIsXG4gICAgdGhyb3R0bGU6IHRocm90dGxlLFxuICAgIGRlYm91bmNlOiBkZWJvdW5jZSxcbiAgICB3cmFwOiB3cmFwLFxuICAgIG5lZ2F0ZTogbmVnYXRlLFxuICAgIGNvbXBvc2U6IGNvbXBvc2UsXG4gICAgYWZ0ZXI6IGFmdGVyLFxuICAgIGJlZm9yZTogYmVmb3JlLFxuICAgIG9uY2U6IG9uY2UsXG4gICAgZmluZEtleTogZmluZEtleSxcbiAgICBmaW5kSW5kZXg6IGZpbmRJbmRleCxcbiAgICBmaW5kTGFzdEluZGV4OiBmaW5kTGFzdEluZGV4LFxuICAgIHNvcnRlZEluZGV4OiBzb3J0ZWRJbmRleCxcbiAgICBpbmRleE9mOiBpbmRleE9mLFxuICAgIGxhc3RJbmRleE9mOiBsYXN0SW5kZXhPZixcbiAgICBmaW5kOiBmaW5kLFxuICAgIGRldGVjdDogZmluZCxcbiAgICBmaW5kV2hlcmU6IGZpbmRXaGVyZSxcbiAgICBlYWNoOiBlYWNoLFxuICAgIGZvckVhY2g6IGVhY2gsXG4gICAgbWFwOiBtYXAsXG4gICAgY29sbGVjdDogbWFwLFxuICAgIHJlZHVjZTogcmVkdWNlLFxuICAgIGZvbGRsOiByZWR1Y2UsXG4gICAgaW5qZWN0OiByZWR1Y2UsXG4gICAgcmVkdWNlUmlnaHQ6IHJlZHVjZVJpZ2h0LFxuICAgIGZvbGRyOiByZWR1Y2VSaWdodCxcbiAgICBmaWx0ZXI6IGZpbHRlcixcbiAgICBzZWxlY3Q6IGZpbHRlcixcbiAgICByZWplY3Q6IHJlamVjdCxcbiAgICBldmVyeTogZXZlcnksXG4gICAgYWxsOiBldmVyeSxcbiAgICBzb21lOiBzb21lLFxuICAgIGFueTogc29tZSxcbiAgICBjb250YWluczogY29udGFpbnMsXG4gICAgaW5jbHVkZXM6IGNvbnRhaW5zLFxuICAgIGluY2x1ZGU6IGNvbnRhaW5zLFxuICAgIGludm9rZTogaW52b2tlLFxuICAgIHBsdWNrOiBwbHVjayxcbiAgICB3aGVyZTogd2hlcmUsXG4gICAgbWF4OiBtYXgsXG4gICAgbWluOiBtaW4sXG4gICAgc2h1ZmZsZTogc2h1ZmZsZSxcbiAgICBzYW1wbGU6IHNhbXBsZSxcbiAgICBzb3J0Qnk6IHNvcnRCeSxcbiAgICBncm91cEJ5OiBncm91cEJ5LFxuICAgIGluZGV4Qnk6IGluZGV4QnksXG4gICAgY291bnRCeTogY291bnRCeSxcbiAgICBwYXJ0aXRpb246IHBhcnRpdGlvbixcbiAgICB0b0FycmF5OiB0b0FycmF5LFxuICAgIHNpemU6IHNpemUsXG4gICAgcGljazogcGljayxcbiAgICBvbWl0OiBvbWl0LFxuICAgIGZpcnN0OiBmaXJzdCxcbiAgICBoZWFkOiBmaXJzdCxcbiAgICB0YWtlOiBmaXJzdCxcbiAgICBpbml0aWFsOiBpbml0aWFsLFxuICAgIGxhc3Q6IGxhc3QsXG4gICAgcmVzdDogcmVzdCxcbiAgICB0YWlsOiByZXN0LFxuICAgIGRyb3A6IHJlc3QsXG4gICAgY29tcGFjdDogY29tcGFjdCxcbiAgICBmbGF0dGVuOiBmbGF0dGVuLFxuICAgIHdpdGhvdXQ6IHdpdGhvdXQsXG4gICAgdW5pcTogdW5pcSxcbiAgICB1bmlxdWU6IHVuaXEsXG4gICAgdW5pb246IHVuaW9uLFxuICAgIGludGVyc2VjdGlvbjogaW50ZXJzZWN0aW9uLFxuICAgIGRpZmZlcmVuY2U6IGRpZmZlcmVuY2UsXG4gICAgdW56aXA6IHVuemlwLFxuICAgIHRyYW5zcG9zZTogdW56aXAsXG4gICAgemlwOiB6aXAsXG4gICAgb2JqZWN0OiBvYmplY3QsXG4gICAgcmFuZ2U6IHJhbmdlLFxuICAgIGNodW5rOiBjaHVuayxcbiAgICBtaXhpbjogbWl4aW4sXG4gICAgJ2RlZmF1bHQnOiBfJDFcbiAgfTtcblxuICAvLyBEZWZhdWx0IEV4cG9ydFxuXG4gIC8vIEFkZCBhbGwgb2YgdGhlIFVuZGVyc2NvcmUgZnVuY3Rpb25zIHRvIHRoZSB3cmFwcGVyIG9iamVjdC5cbiAgdmFyIF8gPSBtaXhpbihhbGxFeHBvcnRzKTtcbiAgLy8gTGVnYWN5IE5vZGUuanMgQVBJLlxuICBfLl8gPSBfO1xuXG4gIHJldHVybiBfO1xuXG59KSkpO1xuLy8jIHNvdXJjZU1hcHBpbmdVUkw9dW5kZXJzY29yZS11bWQuanMubWFwXG4iLCIoZnVuY3Rpb24gKG5hbWUsIGNvbnRleHQsIGRlZmluaXRpb24pIHtcbiAgaWYgKHR5cGVvZiBtb2R1bGUgIT09ICd1bmRlZmluZWQnICYmIG1vZHVsZS5leHBvcnRzKSBtb2R1bGUuZXhwb3J0cyA9IGRlZmluaXRpb24oKTtcbiAgZWxzZSBpZiAodHlwZW9mIGRlZmluZSA9PT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSBkZWZpbmUoZGVmaW5pdGlvbik7XG4gIGVsc2UgY29udGV4dFtuYW1lXSA9IGRlZmluaXRpb24oKTtcbn0pKCd1cmxqb2luJywgdGhpcywgZnVuY3Rpb24gKCkge1xuXG4gIGZ1bmN0aW9uIHN0YXJ0c1dpdGgoc3RyLCBzZWFyY2hTdHJpbmcpIHtcbiAgICByZXR1cm4gc3RyLnN1YnN0cigwLCBzZWFyY2hTdHJpbmcubGVuZ3RoKSA9PT0gc2VhcmNoU3RyaW5nO1xuICB9XG5cbiAgZnVuY3Rpb24gbm9ybWFsaXplIChzdHJBcnJheSwgb3B0aW9ucykge1xuICAgIHZhciByZXN1bHRBcnJheSA9IFtdO1xuICAgIFxuICAgIC8vIElmIHRoZSBmaXJzdCBwYXJ0IGlzIGEgcGxhaW4gcHJvdG9jb2wsIHdlIGNvbWJpbmUgaXQgd2l0aCB0aGUgbmV4dCBwYXJ0LlxuICAgIGlmIChzdHJBcnJheVswXS5tYXRjaCgvXlteLzpdKzpcXC8qJC8pICYmIHN0ckFycmF5Lmxlbmd0aCA+IDEpIHtcbiAgICAgIHZhciBmaXJzdCA9IHN0ckFycmF5LnNoaWZ0KCk7XG4gICAgICBzdHJBcnJheVswXSA9IGZpcnN0ICsgc3RyQXJyYXlbMF07XG4gICAgfVxuXG4gICAgLy8gVGhlcmUgbXVzdCBiZSB0d28gb3IgdGhyZWUgc2xhc2hlcyBpbiB0aGUgZmlsZSBwcm90b2NvbCwgdHdvIHNsYXNoZXMgaW4gYW55dGhpbmcgZWxzZS5cbiAgICBpZiAoc3RyQXJyYXlbMF0ubWF0Y2goL15maWxlOlxcL1xcL1xcLy8pKSB7XG4gICAgICBzdHJBcnJheVswXSA9IHN0ckFycmF5WzBdLnJlcGxhY2UoL14oW14vOl0rKTpcXC8qLywgJyQxOi8vLycpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHJBcnJheVswXSA9IHN0ckFycmF5WzBdLnJlcGxhY2UoL14oW14vOl0rKTpcXC8qLywgJyQxOi8vJyk7XG4gICAgfVxuICAgIFxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyQXJyYXkubGVuZ3RoOyBpKyspIHtcbiAgICAgIFxuICAgICAgdmFyIGNvbXBvbmVudCA9IHN0ckFycmF5W2ldO1xuXG4gICAgICBpZiAodHlwZW9mIGNvbXBvbmVudCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgY29tcG9uZW50ID0gY29tcG9uZW50ICYmIGNvbXBvbmVudC50b1N0cmluZygpIHx8ICcnO1xuICAgICAgfVxuXG4gICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgLy8gUmVtb3ZpbmcgdGhlIHN0YXJ0aW5nIHNsYXNoZXMgZm9yIGVhY2ggY29tcG9uZW50IGJ1dCB0aGUgZmlyc3QuXG4gICAgICAgIGNvbXBvbmVudCA9IGNvbXBvbmVudC5yZXBsYWNlKC9eW1xcL10rLywgJycpO1xuICAgICAgfVxuICAgICAgaWYgKGkgPCBzdHJBcnJheS5sZW5ndGggLSAxKSB7XG4gICAgICAgIC8vIFJlbW92aW5nIHRoZSBlbmRpbmcgc2xhc2hlcyBmb3IgZWFjaCBjb21wb25lbnQgYnV0IHRoZSBsYXN0LlxuICAgICAgICBjb21wb25lbnQgPSBjb21wb25lbnQucmVwbGFjZSgvW1xcL10rJC8sICcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEZvciB0aGUgbGFzdCBjb21wb25lbnQgd2Ugd2lsbCBjb21iaW5lIG11bHRpcGxlIHNsYXNoZXMgdG8gYSBzaW5nbGUgb25lLlxuICAgICAgICBjb21wb25lbnQgPSBjb21wb25lbnQucmVwbGFjZSgvW1xcL10rJC8sICcvJyk7XG4gICAgICB9XG4gICAgICBcbiAgICAgIHJlc3VsdEFycmF5LnB1c2goY29tcG9uZW50KTtcbiAgICAgIFxuICAgIH1cblxuICAgIHZhciBzdHIgPSByZXN1bHRBcnJheS5qb2luKCcvJyk7XG4gICAgLy8gRWFjaCBpbnB1dCBjb21wb25lbnQgaXMgbm93IHNlcGFyYXRlZCBieSBhIHNpbmdsZSBzbGFzaCBleGNlcHQgdGhlIHBvc3NpYmxlIGZpcnN0IHBsYWluIHByb3RvY29sIHBhcnQuXG5cbiAgICAvLyByZW1vdmUgdHJhaWxpbmcgc2xhc2ggYmVmb3JlIHBhcmFtZXRlcnMgb3IgaGFzaFxuICAgIHN0ciA9IHN0ci5yZXBsYWNlKC9cXC8oXFw/fCZ8I1teIV0pL2csICckMScpO1xuXG4gICAgLy8gcmVwbGFjZSA/IGluIHBhcmFtZXRlcnMgd2l0aCAmXG4gICAgdmFyIHBhcnRzID0gc3RyLnNwbGl0KCc/Jyk7XG4gICAgc3RyID0gcGFydHMuc2hpZnQoKSArIChwYXJ0cy5sZW5ndGggPiAwID8gJz8nOiAnJykgKyBwYXJ0cy5qb2luKCcmJyk7XG5cbiAgICByZXR1cm4gc3RyO1xuICB9XG5cbiAgcmV0dXJuIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaW5wdXQgPSBhcmd1bWVudHM7XG4gICAgdmFyIG9wdGlvbnMgPSB7fTtcblxuICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzBdID09PSAnb2JqZWN0Jykge1xuICAgICAgLy8gbmV3IHN5bnRheCB3aXRoIGFycmF5IGFuZCBvcHRpb25zXG4gICAgICBpbnB1dCA9IGFyZ3VtZW50c1swXTtcbiAgICAgIG9wdGlvbnMgPSBhcmd1bWVudHNbMV0gfHwge307XG4gICAgfVxuICAgIFxuICAgIHJldHVybiBub3JtYWxpemUoW10uc2xpY2UuY2FsbChpbnB1dCksIG9wdGlvbnMpO1xuICB9O1xuXG59KTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaXNCdWZmZXIoYXJnKSB7XG4gIHJldHVybiBhcmcgJiYgdHlwZW9mIGFyZyA9PT0gJ29iamVjdCdcbiAgICAmJiB0eXBlb2YgYXJnLmNvcHkgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLmZpbGwgPT09ICdmdW5jdGlvbidcbiAgICAmJiB0eXBlb2YgYXJnLnJlYWRVSW50OCA9PT0gJ2Z1bmN0aW9uJztcbn0iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxudmFyIGZvcm1hdFJlZ0V4cCA9IC8lW3NkaiVdL2c7XG5leHBvcnRzLmZvcm1hdCA9IGZ1bmN0aW9uKGYpIHtcbiAgaWYgKCFpc1N0cmluZyhmKSkge1xuICAgIHZhciBvYmplY3RzID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgIG9iamVjdHMucHVzaChpbnNwZWN0KGFyZ3VtZW50c1tpXSkpO1xuICAgIH1cbiAgICByZXR1cm4gb2JqZWN0cy5qb2luKCcgJyk7XG4gIH1cblxuICB2YXIgaSA9IDE7XG4gIHZhciBhcmdzID0gYXJndW1lbnRzO1xuICB2YXIgbGVuID0gYXJncy5sZW5ndGg7XG4gIHZhciBzdHIgPSBTdHJpbmcoZikucmVwbGFjZShmb3JtYXRSZWdFeHAsIGZ1bmN0aW9uKHgpIHtcbiAgICBpZiAoeCA9PT0gJyUlJykgcmV0dXJuICclJztcbiAgICBpZiAoaSA+PSBsZW4pIHJldHVybiB4O1xuICAgIHN3aXRjaCAoeCkge1xuICAgICAgY2FzZSAnJXMnOiByZXR1cm4gU3RyaW5nKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclZCc6IHJldHVybiBOdW1iZXIoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVqJzpcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoYXJnc1tpKytdKTtcbiAgICAgICAgfSBjYXRjaCAoXykge1xuICAgICAgICAgIHJldHVybiAnW0NpcmN1bGFyXSc7XG4gICAgICAgIH1cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbiAgfSk7XG4gIGZvciAodmFyIHggPSBhcmdzW2ldOyBpIDwgbGVuOyB4ID0gYXJnc1srK2ldKSB7XG4gICAgaWYgKGlzTnVsbCh4KSB8fCAhaXNPYmplY3QoeCkpIHtcbiAgICAgIHN0ciArPSAnICcgKyB4O1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgKz0gJyAnICsgaW5zcGVjdCh4KTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHN0cjtcbn07XG5cblxuLy8gTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbi8vIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4vLyBJZiAtLW5vLWRlcHJlY2F0aW9uIGlzIHNldCwgdGhlbiBpdCBpcyBhIG5vLW9wLlxuZXhwb3J0cy5kZXByZWNhdGUgPSBmdW5jdGlvbihmbiwgbXNnKSB7XG4gIC8vIEFsbG93IGZvciBkZXByZWNhdGluZyB0aGluZ3MgaW4gdGhlIHByb2Nlc3Mgb2Ygc3RhcnRpbmcgdXAuXG4gIGlmIChpc1VuZGVmaW5lZChnbG9iYWwucHJvY2VzcykpIHtcbiAgICByZXR1cm4gZnVuY3Rpb24oKSB7XG4gICAgICByZXR1cm4gZXhwb3J0cy5kZXByZWNhdGUoZm4sIG1zZykuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgICB9O1xuICB9XG5cbiAgaWYgKHByb2Nlc3Mubm9EZXByZWNhdGlvbiA9PT0gdHJ1ZSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKHByb2Nlc3MudGhyb3dEZXByZWNhdGlvbikge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IobXNnKTtcbiAgICAgIH0gZWxzZSBpZiAocHJvY2Vzcy50cmFjZURlcHJlY2F0aW9uKSB7XG4gICAgICAgIGNvbnNvbGUudHJhY2UobXNnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IobXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59O1xuXG5cbnZhciBkZWJ1Z3MgPSB7fTtcbnZhciBkZWJ1Z0Vudmlyb247XG5leHBvcnRzLmRlYnVnbG9nID0gZnVuY3Rpb24oc2V0KSB7XG4gIGlmIChpc1VuZGVmaW5lZChkZWJ1Z0Vudmlyb24pKVxuICAgIGRlYnVnRW52aXJvbiA9IHByb2Nlc3MuZW52Lk5PREVfREVCVUcgfHwgJyc7XG4gIHNldCA9IHNldC50b1VwcGVyQ2FzZSgpO1xuICBpZiAoIWRlYnVnc1tzZXRdKSB7XG4gICAgaWYgKG5ldyBSZWdFeHAoJ1xcXFxiJyArIHNldCArICdcXFxcYicsICdpJykudGVzdChkZWJ1Z0Vudmlyb24pKSB7XG4gICAgICB2YXIgcGlkID0gcHJvY2Vzcy5waWQ7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbXNnID0gZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKTtcbiAgICAgICAgY29uc29sZS5lcnJvcignJXMgJWQ6ICVzJywgc2V0LCBwaWQsIG1zZyk7XG4gICAgICB9O1xuICAgIH0gZWxzZSB7XG4gICAgICBkZWJ1Z3Nbc2V0XSA9IGZ1bmN0aW9uKCkge307XG4gICAgfVxuICB9XG4gIHJldHVybiBkZWJ1Z3Nbc2V0XTtcbn07XG5cblxuLyoqXG4gKiBFY2hvcyB0aGUgdmFsdWUgb2YgYSB2YWx1ZS4gVHJ5cyB0byBwcmludCB0aGUgdmFsdWUgb3V0XG4gKiBpbiB0aGUgYmVzdCB3YXkgcG9zc2libGUgZ2l2ZW4gdGhlIGRpZmZlcmVudCB0eXBlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqIFRoZSBvYmplY3QgdG8gcHJpbnQgb3V0LlxuICogQHBhcmFtIHtPYmplY3R9IG9wdHMgT3B0aW9uYWwgb3B0aW9ucyBvYmplY3QgdGhhdCBhbHRlcnMgdGhlIG91dHB1dC5cbiAqL1xuLyogbGVnYWN5OiBvYmosIHNob3dIaWRkZW4sIGRlcHRoLCBjb2xvcnMqL1xuZnVuY3Rpb24gaW5zcGVjdChvYmosIG9wdHMpIHtcbiAgLy8gZGVmYXVsdCBvcHRpb25zXG4gIHZhciBjdHggPSB7XG4gICAgc2VlbjogW10sXG4gICAgc3R5bGl6ZTogc3R5bGl6ZU5vQ29sb3JcbiAgfTtcbiAgLy8gbGVnYWN5Li4uXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDMpIGN0eC5kZXB0aCA9IGFyZ3VtZW50c1syXTtcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gNCkgY3R4LmNvbG9ycyA9IGFyZ3VtZW50c1szXTtcbiAgaWYgKGlzQm9vbGVhbihvcHRzKSkge1xuICAgIC8vIGxlZ2FjeS4uLlxuICAgIGN0eC5zaG93SGlkZGVuID0gb3B0cztcbiAgfSBlbHNlIGlmIChvcHRzKSB7XG4gICAgLy8gZ290IGFuIFwib3B0aW9uc1wiIG9iamVjdFxuICAgIGV4cG9ydHMuX2V4dGVuZChjdHgsIG9wdHMpO1xuICB9XG4gIC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5zaG93SGlkZGVuKSkgY3R4LnNob3dIaWRkZW4gPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5kZXB0aCkpIGN0eC5kZXB0aCA9IDI7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY29sb3JzKSkgY3R4LmNvbG9ycyA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmN1c3RvbUluc3BlY3QpKSBjdHguY3VzdG9tSW5zcGVjdCA9IHRydWU7XG4gIGlmIChjdHguY29sb3JzKSBjdHguc3R5bGl6ZSA9IHN0eWxpemVXaXRoQ29sb3I7XG4gIHJldHVybiBmb3JtYXRWYWx1ZShjdHgsIG9iaiwgY3R4LmRlcHRoKTtcbn1cbmV4cG9ydHMuaW5zcGVjdCA9IGluc3BlY3Q7XG5cblxuLy8gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BTlNJX2VzY2FwZV9jb2RlI2dyYXBoaWNzXG5pbnNwZWN0LmNvbG9ycyA9IHtcbiAgJ2JvbGQnIDogWzEsIDIyXSxcbiAgJ2l0YWxpYycgOiBbMywgMjNdLFxuICAndW5kZXJsaW5lJyA6IFs0LCAyNF0sXG4gICdpbnZlcnNlJyA6IFs3LCAyN10sXG4gICd3aGl0ZScgOiBbMzcsIDM5XSxcbiAgJ2dyZXknIDogWzkwLCAzOV0sXG4gICdibGFjaycgOiBbMzAsIDM5XSxcbiAgJ2JsdWUnIDogWzM0LCAzOV0sXG4gICdjeWFuJyA6IFszNiwgMzldLFxuICAnZ3JlZW4nIDogWzMyLCAzOV0sXG4gICdtYWdlbnRhJyA6IFszNSwgMzldLFxuICAncmVkJyA6IFszMSwgMzldLFxuICAneWVsbG93JyA6IFszMywgMzldXG59O1xuXG4vLyBEb24ndCB1c2UgJ2JsdWUnIG5vdCB2aXNpYmxlIG9uIGNtZC5leGVcbmluc3BlY3Quc3R5bGVzID0ge1xuICAnc3BlY2lhbCc6ICdjeWFuJyxcbiAgJ251bWJlcic6ICd5ZWxsb3cnLFxuICAnYm9vbGVhbic6ICd5ZWxsb3cnLFxuICAndW5kZWZpbmVkJzogJ2dyZXknLFxuICAnbnVsbCc6ICdib2xkJyxcbiAgJ3N0cmluZyc6ICdncmVlbicsXG4gICdkYXRlJzogJ21hZ2VudGEnLFxuICAvLyBcIm5hbWVcIjogaW50ZW50aW9uYWxseSBub3Qgc3R5bGluZ1xuICAncmVnZXhwJzogJ3JlZCdcbn07XG5cblxuZnVuY3Rpb24gc3R5bGl6ZVdpdGhDb2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICB2YXIgc3R5bGUgPSBpbnNwZWN0LnN0eWxlc1tzdHlsZVR5cGVdO1xuXG4gIGlmIChzdHlsZSkge1xuICAgIHJldHVybiAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzBdICsgJ20nICsgc3RyICtcbiAgICAgICAgICAgJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVsxXSArICdtJztcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gc3RyO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc3R5bGl6ZU5vQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgcmV0dXJuIHN0cjtcbn1cblxuXG5mdW5jdGlvbiBhcnJheVRvSGFzaChhcnJheSkge1xuICB2YXIgaGFzaCA9IHt9O1xuXG4gIGFycmF5LmZvckVhY2goZnVuY3Rpb24odmFsLCBpZHgpIHtcbiAgICBoYXNoW3ZhbF0gPSB0cnVlO1xuICB9KTtcblxuICByZXR1cm4gaGFzaDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRWYWx1ZShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMpIHtcbiAgLy8gUHJvdmlkZSBhIGhvb2sgZm9yIHVzZXItc3BlY2lmaWVkIGluc3BlY3QgZnVuY3Rpb25zLlxuICAvLyBDaGVjayB0aGF0IHZhbHVlIGlzIGFuIG9iamVjdCB3aXRoIGFuIGluc3BlY3QgZnVuY3Rpb24gb24gaXRcbiAgaWYgKGN0eC5jdXN0b21JbnNwZWN0ICYmXG4gICAgICB2YWx1ZSAmJlxuICAgICAgaXNGdW5jdGlvbih2YWx1ZS5pbnNwZWN0KSAmJlxuICAgICAgLy8gRmlsdGVyIG91dCB0aGUgdXRpbCBtb2R1bGUsIGl0J3MgaW5zcGVjdCBmdW5jdGlvbiBpcyBzcGVjaWFsXG4gICAgICB2YWx1ZS5pbnNwZWN0ICE9PSBleHBvcnRzLmluc3BlY3QgJiZcbiAgICAgIC8vIEFsc28gZmlsdGVyIG91dCBhbnkgcHJvdG90eXBlIG9iamVjdHMgdXNpbmcgdGhlIGNpcmN1bGFyIGNoZWNrLlxuICAgICAgISh2YWx1ZS5jb25zdHJ1Y3RvciAmJiB2YWx1ZS5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgPT09IHZhbHVlKSkge1xuICAgIHZhciByZXQgPSB2YWx1ZS5pbnNwZWN0KHJlY3Vyc2VUaW1lcywgY3R4KTtcbiAgICBpZiAoIWlzU3RyaW5nKHJldCkpIHtcbiAgICAgIHJldCA9IGZvcm1hdFZhbHVlKGN0eCwgcmV0LCByZWN1cnNlVGltZXMpO1xuICAgIH1cbiAgICByZXR1cm4gcmV0O1xuICB9XG5cbiAgLy8gUHJpbWl0aXZlIHR5cGVzIGNhbm5vdCBoYXZlIHByb3BlcnRpZXNcbiAgdmFyIHByaW1pdGl2ZSA9IGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKTtcbiAgaWYgKHByaW1pdGl2ZSkge1xuICAgIHJldHVybiBwcmltaXRpdmU7XG4gIH1cblxuICAvLyBMb29rIHVwIHRoZSBrZXlzIG9mIHRoZSBvYmplY3QuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXModmFsdWUpO1xuICB2YXIgdmlzaWJsZUtleXMgPSBhcnJheVRvSGFzaChrZXlzKTtcblxuICBpZiAoY3R4LnNob3dIaWRkZW4pIHtcbiAgICBrZXlzID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModmFsdWUpO1xuICB9XG5cbiAgLy8gSUUgZG9lc24ndCBtYWtlIGVycm9yIGZpZWxkcyBub24tZW51bWVyYWJsZVxuICAvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvaWUvZHd3NTJzYnQodj12cy45NCkuYXNweFxuICBpZiAoaXNFcnJvcih2YWx1ZSlcbiAgICAgICYmIChrZXlzLmluZGV4T2YoJ21lc3NhZ2UnKSA+PSAwIHx8IGtleXMuaW5kZXhPZignZGVzY3JpcHRpb24nKSA+PSAwKSkge1xuICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICAvLyBTb21lIHR5cGUgb2Ygb2JqZWN0IHdpdGhvdXQgcHJvcGVydGllcyBjYW4gYmUgc2hvcnRjdXR0ZWQuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCkge1xuICAgIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgICAgdmFyIG5hbWUgPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW0Z1bmN0aW9uJyArIG5hbWUgKyAnXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfVxuICAgIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoRGF0ZS5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdkYXRlJyk7XG4gICAgfVxuICAgIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgICB9XG4gIH1cblxuICB2YXIgYmFzZSA9ICcnLCBhcnJheSA9IGZhbHNlLCBicmFjZXMgPSBbJ3snLCAnfSddO1xuXG4gIC8vIE1ha2UgQXJyYXkgc2F5IHRoYXQgdGhleSBhcmUgQXJyYXlcbiAgaWYgKGlzQXJyYXkodmFsdWUpKSB7XG4gICAgYXJyYXkgPSB0cnVlO1xuICAgIGJyYWNlcyA9IFsnWycsICddJ107XG4gIH1cblxuICAvLyBNYWtlIGZ1bmN0aW9ucyBzYXkgdGhhdCB0aGV5IGFyZSBmdW5jdGlvbnNcbiAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgdmFyIG4gPSB2YWx1ZS5uYW1lID8gJzogJyArIHZhbHVlLm5hbWUgOiAnJztcbiAgICBiYXNlID0gJyBbRnVuY3Rpb24nICsgbiArICddJztcbiAgfVxuXG4gIC8vIE1ha2UgUmVnRXhwcyBzYXkgdGhhdCB0aGV5IGFyZSBSZWdFeHBzXG4gIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZGF0ZXMgd2l0aCBwcm9wZXJ0aWVzIGZpcnN0IHNheSB0aGUgZGF0ZVxuICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBEYXRlLnByb3RvdHlwZS50b1VUQ1N0cmluZy5jYWxsKHZhbHVlKTtcbiAgfVxuXG4gIC8vIE1ha2UgZXJyb3Igd2l0aCBtZXNzYWdlIGZpcnN0IHNheSB0aGUgZXJyb3JcbiAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIGlmIChrZXlzLmxlbmd0aCA9PT0gMCAmJiAoIWFycmF5IHx8IHZhbHVlLmxlbmd0aCA9PSAwKSkge1xuICAgIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgYnJhY2VzWzFdO1xuICB9XG5cbiAgaWYgKHJlY3Vyc2VUaW1lcyA8IDApIHtcbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tPYmplY3RdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cblxuICBjdHguc2Vlbi5wdXNoKHZhbHVlKTtcblxuICB2YXIgb3V0cHV0O1xuICBpZiAoYXJyYXkpIHtcbiAgICBvdXRwdXQgPSBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKTtcbiAgfSBlbHNlIHtcbiAgICBvdXRwdXQgPSBrZXlzLm1hcChmdW5jdGlvbihrZXkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KTtcbiAgICB9KTtcbiAgfVxuXG4gIGN0eC5zZWVuLnBvcCgpO1xuXG4gIHJldHVybiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ3VuZGVmaW5lZCcsICd1bmRlZmluZWQnKTtcbiAgaWYgKGlzU3RyaW5nKHZhbHVlKSkge1xuICAgIHZhciBzaW1wbGUgPSAnXFwnJyArIEpTT04uc3RyaW5naWZ5KHZhbHVlKS5yZXBsYWNlKC9eXCJ8XCIkL2csICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKSArICdcXCcnO1xuICAgIHJldHVybiBjdHguc3R5bGl6ZShzaW1wbGUsICdzdHJpbmcnKTtcbiAgfVxuICBpZiAoaXNOdW1iZXIodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnbnVtYmVyJyk7XG4gIGlmIChpc0Jvb2xlYW4odmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnJyArIHZhbHVlLCAnYm9vbGVhbicpO1xuICAvLyBGb3Igc29tZSByZWFzb24gdHlwZW9mIG51bGwgaXMgXCJvYmplY3RcIiwgc28gc3BlY2lhbCBjYXNlIGhlcmUuXG4gIGlmIChpc051bGwodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgnbnVsbCcsICdudWxsJyk7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0RXJyb3IodmFsdWUpIHtcbiAgcmV0dXJuICdbJyArIEVycm9yLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSArICddJztcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRBcnJheShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXlzKSB7XG4gIHZhciBvdXRwdXQgPSBbXTtcbiAgZm9yICh2YXIgaSA9IDAsIGwgPSB2YWx1ZS5sZW5ndGg7IGkgPCBsOyArK2kpIHtcbiAgICBpZiAoaGFzT3duUHJvcGVydHkodmFsdWUsIFN0cmluZyhpKSkpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAgU3RyaW5nKGkpLCB0cnVlKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG91dHB1dC5wdXNoKCcnKTtcbiAgICB9XG4gIH1cbiAga2V5cy5mb3JFYWNoKGZ1bmN0aW9uKGtleSkge1xuICAgIGlmICgha2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBrZXksIHRydWUpKTtcbiAgICB9XG4gIH0pO1xuICByZXR1cm4gb3V0cHV0O1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpIHtcbiAgdmFyIG5hbWUsIHN0ciwgZGVzYztcbiAgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodmFsdWUsIGtleSkgfHwgeyB2YWx1ZTogdmFsdWVba2V5XSB9O1xuICBpZiAoZGVzYy5nZXQpIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyL1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoZGVzYy5zZXQpIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmICghaGFzT3duUHJvcGVydHkodmlzaWJsZUtleXMsIGtleSkpIHtcbiAgICBuYW1lID0gJ1snICsga2V5ICsgJ10nO1xuICB9XG4gIGlmICghc3RyKSB7XG4gICAgaWYgKGN0eC5zZWVuLmluZGV4T2YoZGVzYy52YWx1ZSkgPCAwKSB7XG4gICAgICBpZiAoaXNOdWxsKHJlY3Vyc2VUaW1lcykpIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCBudWxsKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgcmVjdXJzZVRpbWVzIC0gMSk7XG4gICAgICB9XG4gICAgICBpZiAoc3RyLmluZGV4T2YoJ1xcbicpID4gLTEpIHtcbiAgICAgICAgaWYgKGFycmF5KSB7XG4gICAgICAgICAgc3RyID0gc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpLnN1YnN0cigyKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICBzdHIgPSAnXFxuJyArIHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tDaXJjdWxhcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoaXNVbmRlZmluZWQobmFtZSkpIHtcbiAgICBpZiAoYXJyYXkgJiYga2V5Lm1hdGNoKC9eXFxkKyQvKSkge1xuICAgICAgcmV0dXJuIHN0cjtcbiAgICB9XG4gICAgbmFtZSA9IEpTT04uc3RyaW5naWZ5KCcnICsga2V5KTtcbiAgICBpZiAobmFtZS5tYXRjaCgvXlwiKFthLXpBLVpfXVthLXpBLVpfMC05XSopXCIkLykpIHtcbiAgICAgIG5hbWUgPSBuYW1lLnN1YnN0cigxLCBuYW1lLmxlbmd0aCAtIDIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICduYW1lJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoLycvZywgXCJcXFxcJ1wiKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8oXlwifFwiJCkvZywgXCInXCIpO1xuICAgICAgbmFtZSA9IGN0eC5zdHlsaXplKG5hbWUsICdzdHJpbmcnKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmFtZSArICc6ICcgKyBzdHI7XG59XG5cblxuZnVuY3Rpb24gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpIHtcbiAgdmFyIG51bUxpbmVzRXN0ID0gMDtcbiAgdmFyIGxlbmd0aCA9IG91dHB1dC5yZWR1Y2UoZnVuY3Rpb24ocHJldiwgY3VyKSB7XG4gICAgbnVtTGluZXNFc3QrKztcbiAgICBpZiAoY3VyLmluZGV4T2YoJ1xcbicpID49IDApIG51bUxpbmVzRXN0Kys7XG4gICAgcmV0dXJuIHByZXYgKyBjdXIucmVwbGFjZSgvXFx1MDAxYlxcW1xcZFxcZD9tL2csICcnKS5sZW5ndGggKyAxO1xuICB9LCAwKTtcblxuICBpZiAobGVuZ3RoID4gNjApIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICtcbiAgICAgICAgICAgKGJhc2UgPT09ICcnID8gJycgOiBiYXNlICsgJ1xcbiAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIG91dHB1dC5qb2luKCcsXFxuICAnKSArXG4gICAgICAgICAgICcgJyArXG4gICAgICAgICAgIGJyYWNlc1sxXTtcbiAgfVxuXG4gIHJldHVybiBicmFjZXNbMF0gKyBiYXNlICsgJyAnICsgb3V0cHV0LmpvaW4oJywgJykgKyAnICcgKyBicmFjZXNbMV07XG59XG5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cbmZ1bmN0aW9uIGlzQXJyYXkoYXIpIHtcbiAgcmV0dXJuIEFycmF5LmlzQXJyYXkoYXIpO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gaXNPYmplY3QocmUpICYmIG9iamVjdFRvU3RyaW5nKHJlKSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5leHBvcnRzLmlzUmVnRXhwID0gaXNSZWdFeHA7XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuZXhwb3J0cy5pc09iamVjdCA9IGlzT2JqZWN0O1xuXG5mdW5jdGlvbiBpc0RhdGUoZCkge1xuICByZXR1cm4gaXNPYmplY3QoZCkgJiYgb2JqZWN0VG9TdHJpbmcoZCkgPT09ICdbb2JqZWN0IERhdGVdJztcbn1cbmV4cG9ydHMuaXNEYXRlID0gaXNEYXRlO1xuXG5mdW5jdGlvbiBpc0Vycm9yKGUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGUpICYmXG4gICAgICAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSByZXF1aXJlKCcuL3N1cHBvcnQvaXNCdWZmZXInKTtcblxuZnVuY3Rpb24gb2JqZWN0VG9TdHJpbmcobykge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG8pO1xufVxuXG5cbmZ1bmN0aW9uIHBhZChuKSB7XG4gIHJldHVybiBuIDwgMTAgPyAnMCcgKyBuLnRvU3RyaW5nKDEwKSA6IG4udG9TdHJpbmcoMTApO1xufVxuXG5cbnZhciBtb250aHMgPSBbJ0phbicsICdGZWInLCAnTWFyJywgJ0FwcicsICdNYXknLCAnSnVuJywgJ0p1bCcsICdBdWcnLCAnU2VwJyxcbiAgICAgICAgICAgICAgJ09jdCcsICdOb3YnLCAnRGVjJ107XG5cbi8vIDI2IEZlYiAxNjoxOTozNFxuZnVuY3Rpb24gdGltZXN0YW1wKCkge1xuICB2YXIgZCA9IG5ldyBEYXRlKCk7XG4gIHZhciB0aW1lID0gW3BhZChkLmdldEhvdXJzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRNaW51dGVzKCkpLFxuICAgICAgICAgICAgICBwYWQoZC5nZXRTZWNvbmRzKCkpXS5qb2luKCc6Jyk7XG4gIHJldHVybiBbZC5nZXREYXRlKCksIG1vbnRoc1tkLmdldE1vbnRoKCldLCB0aW1lXS5qb2luKCcgJyk7XG59XG5cblxuLy8gbG9nIGlzIGp1c3QgYSB0aGluIHdyYXBwZXIgdG8gY29uc29sZS5sb2cgdGhhdCBwcmVwZW5kcyBhIHRpbWVzdGFtcFxuZXhwb3J0cy5sb2cgPSBmdW5jdGlvbigpIHtcbiAgY29uc29sZS5sb2coJyVzIC0gJXMnLCB0aW1lc3RhbXAoKSwgZXhwb3J0cy5mb3JtYXQuYXBwbHkoZXhwb3J0cywgYXJndW1lbnRzKSk7XG59O1xuXG5cbi8qKlxuICogSW5oZXJpdCB0aGUgcHJvdG90eXBlIG1ldGhvZHMgZnJvbSBvbmUgY29uc3RydWN0b3IgaW50byBhbm90aGVyLlxuICpcbiAqIFRoZSBGdW5jdGlvbi5wcm90b3R5cGUuaW5oZXJpdHMgZnJvbSBsYW5nLmpzIHJld3JpdHRlbiBhcyBhIHN0YW5kYWxvbmVcbiAqIGZ1bmN0aW9uIChub3Qgb24gRnVuY3Rpb24ucHJvdG90eXBlKS4gTk9URTogSWYgdGhpcyBmaWxlIGlzIHRvIGJlIGxvYWRlZFxuICogZHVyaW5nIGJvb3RzdHJhcHBpbmcgdGhpcyBmdW5jdGlvbiBuZWVkcyB0byBiZSByZXdyaXR0ZW4gdXNpbmcgc29tZSBuYXRpdmVcbiAqIGZ1bmN0aW9ucyBhcyBwcm90b3R5cGUgc2V0dXAgdXNpbmcgbm9ybWFsIEphdmFTY3JpcHQgZG9lcyBub3Qgd29yayBhc1xuICogZXhwZWN0ZWQgZHVyaW5nIGJvb3RzdHJhcHBpbmcgKHNlZSBtaXJyb3IuanMgaW4gcjExNDkwMykuXG4gKlxuICogQHBhcmFtIHtmdW5jdGlvbn0gY3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB3aGljaCBuZWVkcyB0byBpbmhlcml0IHRoZVxuICogICAgIHByb3RvdHlwZS5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IHN1cGVyQ3RvciBDb25zdHJ1Y3RvciBmdW5jdGlvbiB0byBpbmhlcml0IHByb3RvdHlwZSBmcm9tLlxuICovXG5leHBvcnRzLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcblxuZXhwb3J0cy5fZXh0ZW5kID0gZnVuY3Rpb24ob3JpZ2luLCBhZGQpIHtcbiAgLy8gRG9uJ3QgZG8gYW55dGhpbmcgaWYgYWRkIGlzbid0IGFuIG9iamVjdFxuICBpZiAoIWFkZCB8fCAhaXNPYmplY3QoYWRkKSkgcmV0dXJuIG9yaWdpbjtcblxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGFkZCk7XG4gIHZhciBpID0ga2V5cy5sZW5ndGg7XG4gIHdoaWxlIChpLS0pIHtcbiAgICBvcmlnaW5ba2V5c1tpXV0gPSBhZGRba2V5c1tpXV07XG4gIH1cbiAgcmV0dXJuIG9yaWdpbjtcbn07XG5cbmZ1bmN0aW9uIGhhc093blByb3BlcnR5KG9iaiwgcHJvcCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59XG4iLCJyZXF1aXJlKCcuLi8uLi9tb2R1bGVzL2NvcmUucmVnZXhwLmVzY2FwZScpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuLi8uLi9tb2R1bGVzL19jb3JlJykuUmVnRXhwLmVzY2FwZTtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICh0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYSBmdW5jdGlvbiEnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsInZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0LCBtc2cpIHtcbiAgaWYgKHR5cGVvZiBpdCAhPSAnbnVtYmVyJyAmJiBjb2YoaXQpICE9ICdOdW1iZXInKSB0aHJvdyBUeXBlRXJyb3IobXNnKTtcbiAgcmV0dXJuICtpdDtcbn07XG4iLCIvLyAyMi4xLjMuMzEgQXJyYXkucHJvdG90eXBlW0BAdW5zY29wYWJsZXNdXG52YXIgVU5TQ09QQUJMRVMgPSByZXF1aXJlKCcuL193a3MnKSgndW5zY29wYWJsZXMnKTtcbnZhciBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuaWYgKEFycmF5UHJvdG9bVU5TQ09QQUJMRVNdID09IHVuZGVmaW5lZCkgcmVxdWlyZSgnLi9faGlkZScpKEFycmF5UHJvdG8sIFVOU0NPUEFCTEVTLCB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXkpIHtcbiAgQXJyYXlQcm90b1tVTlNDT1BBQkxFU11ba2V5XSA9IHRydWU7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGF0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLWF0JykodHJ1ZSk7XG5cbiAvLyBgQWR2YW5jZVN0cmluZ0luZGV4YCBhYnN0cmFjdCBvcGVyYXRpb25cbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWFkdmFuY2VzdHJpbmdpbmRleFxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoUywgaW5kZXgsIHVuaWNvZGUpIHtcbiAgcmV0dXJuIGluZGV4ICsgKHVuaWNvZGUgPyBhdChTLCBpbmRleCkubGVuZ3RoIDogMSk7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIENvbnN0cnVjdG9yLCBuYW1lLCBmb3JiaWRkZW5GaWVsZCkge1xuICBpZiAoIShpdCBpbnN0YW5jZW9mIENvbnN0cnVjdG9yKSB8fCAoZm9yYmlkZGVuRmllbGQgIT09IHVuZGVmaW5lZCAmJiBmb3JiaWRkZW5GaWVsZCBpbiBpdCkpIHtcbiAgICB0aHJvdyBUeXBlRXJyb3IobmFtZSArICc6IGluY29ycmVjdCBpbnZvY2F0aW9uIScpO1xuICB9IHJldHVybiBpdDtcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmICghaXNPYmplY3QoaXQpKSB0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhbiBvYmplY3QhJyk7XG4gIHJldHVybiBpdDtcbn07XG4iLCIvLyAyMi4xLjMuMyBBcnJheS5wcm90b3R5cGUuY29weVdpdGhpbih0YXJnZXQsIHN0YXJ0LCBlbmQgPSB0aGlzLmxlbmd0aClcbid1c2Ugc3RyaWN0JztcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4vX3RvLWFic29sdXRlLWluZGV4Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBbXS5jb3B5V2l0aGluIHx8IGZ1bmN0aW9uIGNvcHlXaXRoaW4odGFyZ2V0IC8qID0gMCAqLywgc3RhcnQgLyogPSAwLCBlbmQgPSBAbGVuZ3RoICovKSB7XG4gIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gIHZhciBsZW4gPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gIHZhciB0byA9IHRvQWJzb2x1dGVJbmRleCh0YXJnZXQsIGxlbik7XG4gIHZhciBmcm9tID0gdG9BYnNvbHV0ZUluZGV4KHN0YXJ0LCBsZW4pO1xuICB2YXIgZW5kID0gYXJndW1lbnRzLmxlbmd0aCA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gIHZhciBjb3VudCA9IE1hdGgubWluKChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IHRvQWJzb2x1dGVJbmRleChlbmQsIGxlbikpIC0gZnJvbSwgbGVuIC0gdG8pO1xuICB2YXIgaW5jID0gMTtcbiAgaWYgKGZyb20gPCB0byAmJiB0byA8IGZyb20gKyBjb3VudCkge1xuICAgIGluYyA9IC0xO1xuICAgIGZyb20gKz0gY291bnQgLSAxO1xuICAgIHRvICs9IGNvdW50IC0gMTtcbiAgfVxuICB3aGlsZSAoY291bnQtLSA+IDApIHtcbiAgICBpZiAoZnJvbSBpbiBPKSBPW3RvXSA9IE9bZnJvbV07XG4gICAgZWxzZSBkZWxldGUgT1t0b107XG4gICAgdG8gKz0gaW5jO1xuICAgIGZyb20gKz0gaW5jO1xuICB9IHJldHVybiBPO1xufTtcbiIsIi8vIDIyLjEuMy42IEFycmF5LnByb3RvdHlwZS5maWxsKHZhbHVlLCBzdGFydCA9IDAsIGVuZCA9IHRoaXMubGVuZ3RoKVxuJ3VzZSBzdHJpY3QnO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBmaWxsKHZhbHVlIC8qICwgc3RhcnQgPSAwLCBlbmQgPSBAbGVuZ3RoICovKSB7XG4gIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gIHZhciBsZW5ndGggPSB0b0xlbmd0aChPLmxlbmd0aCk7XG4gIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGluZGV4ID0gdG9BYnNvbHV0ZUluZGV4KGFMZW4gPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCBsZW5ndGgpO1xuICB2YXIgZW5kID0gYUxlbiA+IDIgPyBhcmd1bWVudHNbMl0gOiB1bmRlZmluZWQ7XG4gIHZhciBlbmRQb3MgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbmd0aCA6IHRvQWJzb2x1dGVJbmRleChlbmQsIGxlbmd0aCk7XG4gIHdoaWxlIChlbmRQb3MgPiBpbmRleCkgT1tpbmRleCsrXSA9IHZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iLCJ2YXIgZm9yT2YgPSByZXF1aXJlKCcuL19mb3Itb2YnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXRlciwgSVRFUkFUT1IpIHtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICBmb3JPZihpdGVyLCBmYWxzZSwgcmVzdWx0LnB1c2gsIHJlc3VsdCwgSVRFUkFUT1IpO1xuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKElTX0lOQ0xVREVTKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoJHRoaXMsIGVsLCBmcm9tSW5kZXgpIHtcbiAgICB2YXIgTyA9IHRvSU9iamVjdCgkdGhpcyk7XG4gICAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSB0b0Fic29sdXRlSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpO1xuICAgIHZhciB2YWx1ZTtcbiAgICAvLyBBcnJheSNpbmNsdWRlcyB1c2VzIFNhbWVWYWx1ZVplcm8gZXF1YWxpdHkgYWxnb3JpdGhtXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIGlmIChJU19JTkNMVURFUyAmJiBlbCAhPSBlbCkgd2hpbGUgKGxlbmd0aCA+IGluZGV4KSB7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICBpZiAodmFsdWUgIT0gdmFsdWUpIHJldHVybiB0cnVlO1xuICAgIC8vIEFycmF5I2luZGV4T2YgaWdub3JlcyBob2xlcywgQXJyYXkjaW5jbHVkZXMgLSBub3RcbiAgICB9IGVsc2UgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChJU19JTkNMVURFUyB8fCBpbmRleCBpbiBPKSB7XG4gICAgICBpZiAoT1tpbmRleF0gPT09IGVsKSByZXR1cm4gSVNfSU5DTFVERVMgfHwgaW5kZXggfHwgMDtcbiAgICB9IHJldHVybiAhSVNfSU5DTFVERVMgJiYgLTE7XG4gIH07XG59O1xuIiwiLy8gMCAtPiBBcnJheSNmb3JFYWNoXG4vLyAxIC0+IEFycmF5I21hcFxuLy8gMiAtPiBBcnJheSNmaWx0ZXJcbi8vIDMgLT4gQXJyYXkjc29tZVxuLy8gNCAtPiBBcnJheSNldmVyeVxuLy8gNSAtPiBBcnJheSNmaW5kXG4vLyA2IC0+IEFycmF5I2ZpbmRJbmRleFxudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGFzYyA9IHJlcXVpcmUoJy4vX2FycmF5LXNwZWNpZXMtY3JlYXRlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUWVBFLCAkY3JlYXRlKSB7XG4gIHZhciBJU19NQVAgPSBUWVBFID09IDE7XG4gIHZhciBJU19GSUxURVIgPSBUWVBFID09IDI7XG4gIHZhciBJU19TT01FID0gVFlQRSA9PSAzO1xuICB2YXIgSVNfRVZFUlkgPSBUWVBFID09IDQ7XG4gIHZhciBJU19GSU5EX0lOREVYID0gVFlQRSA9PSA2O1xuICB2YXIgTk9fSE9MRVMgPSBUWVBFID09IDUgfHwgSVNfRklORF9JTkRFWDtcbiAgdmFyIGNyZWF0ZSA9ICRjcmVhdGUgfHwgYXNjO1xuICByZXR1cm4gZnVuY3Rpb24gKCR0aGlzLCBjYWxsYmFja2ZuLCB0aGF0KSB7XG4gICAgdmFyIE8gPSB0b09iamVjdCgkdGhpcyk7XG4gICAgdmFyIHNlbGYgPSBJT2JqZWN0KE8pO1xuICAgIHZhciBmID0gY3R4KGNhbGxiYWNrZm4sIHRoYXQsIDMpO1xuICAgIHZhciBsZW5ndGggPSB0b0xlbmd0aChzZWxmLmxlbmd0aCk7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgcmVzdWx0ID0gSVNfTUFQID8gY3JlYXRlKCR0aGlzLCBsZW5ndGgpIDogSVNfRklMVEVSID8gY3JlYXRlKCR0aGlzLCAwKSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgdmFsLCByZXM7XG4gICAgZm9yICg7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIGlmIChOT19IT0xFUyB8fCBpbmRleCBpbiBzZWxmKSB7XG4gICAgICB2YWwgPSBzZWxmW2luZGV4XTtcbiAgICAgIHJlcyA9IGYodmFsLCBpbmRleCwgTyk7XG4gICAgICBpZiAoVFlQRSkge1xuICAgICAgICBpZiAoSVNfTUFQKSByZXN1bHRbaW5kZXhdID0gcmVzOyAgIC8vIG1hcFxuICAgICAgICBlbHNlIGlmIChyZXMpIHN3aXRjaCAoVFlQRSkge1xuICAgICAgICAgIGNhc2UgMzogcmV0dXJuIHRydWU7ICAgICAgICAgICAgIC8vIHNvbWVcbiAgICAgICAgICBjYXNlIDU6IHJldHVybiB2YWw7ICAgICAgICAgICAgICAvLyBmaW5kXG4gICAgICAgICAgY2FzZSA2OiByZXR1cm4gaW5kZXg7ICAgICAgICAgICAgLy8gZmluZEluZGV4XG4gICAgICAgICAgY2FzZSAyOiByZXN1bHQucHVzaCh2YWwpOyAgICAgICAgLy8gZmlsdGVyXG4gICAgICAgIH0gZWxzZSBpZiAoSVNfRVZFUlkpIHJldHVybiBmYWxzZTsgLy8gZXZlcnlcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIElTX0ZJTkRfSU5ERVggPyAtMSA6IElTX1NPTUUgfHwgSVNfRVZFUlkgPyBJU19FVkVSWSA6IHJlc3VsdDtcbiAgfTtcbn07XG4iLCJ2YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0aGF0LCBjYWxsYmFja2ZuLCBhTGVuLCBtZW1vLCBpc1JpZ2h0KSB7XG4gIGFGdW5jdGlvbihjYWxsYmFja2ZuKTtcbiAgdmFyIE8gPSB0b09iamVjdCh0aGF0KTtcbiAgdmFyIHNlbGYgPSBJT2JqZWN0KE8pO1xuICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICB2YXIgaW5kZXggPSBpc1JpZ2h0ID8gbGVuZ3RoIC0gMSA6IDA7XG4gIHZhciBpID0gaXNSaWdodCA/IC0xIDogMTtcbiAgaWYgKGFMZW4gPCAyKSBmb3IgKDs7KSB7XG4gICAgaWYgKGluZGV4IGluIHNlbGYpIHtcbiAgICAgIG1lbW8gPSBzZWxmW2luZGV4XTtcbiAgICAgIGluZGV4ICs9IGk7XG4gICAgICBicmVhaztcbiAgICB9XG4gICAgaW5kZXggKz0gaTtcbiAgICBpZiAoaXNSaWdodCA/IGluZGV4IDwgMCA6IGxlbmd0aCA8PSBpbmRleCkge1xuICAgICAgdGhyb3cgVHlwZUVycm9yKCdSZWR1Y2Ugb2YgZW1wdHkgYXJyYXkgd2l0aCBubyBpbml0aWFsIHZhbHVlJyk7XG4gICAgfVxuICB9XG4gIGZvciAoO2lzUmlnaHQgPyBpbmRleCA+PSAwIDogbGVuZ3RoID4gaW5kZXg7IGluZGV4ICs9IGkpIGlmIChpbmRleCBpbiBzZWxmKSB7XG4gICAgbWVtbyA9IGNhbGxiYWNrZm4obWVtbywgc2VsZltpbmRleF0sIGluZGV4LCBPKTtcbiAgfVxuICByZXR1cm4gbWVtbztcbn07XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBpc0FycmF5ID0gcmVxdWlyZSgnLi9faXMtYXJyYXknKTtcbnZhciBTUEVDSUVTID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob3JpZ2luYWwpIHtcbiAgdmFyIEM7XG4gIGlmIChpc0FycmF5KG9yaWdpbmFsKSkge1xuICAgIEMgPSBvcmlnaW5hbC5jb25zdHJ1Y3RvcjtcbiAgICAvLyBjcm9zcy1yZWFsbSBmYWxsYmFja1xuICAgIGlmICh0eXBlb2YgQyA9PSAnZnVuY3Rpb24nICYmIChDID09PSBBcnJheSB8fCBpc0FycmF5KEMucHJvdG90eXBlKSkpIEMgPSB1bmRlZmluZWQ7XG4gICAgaWYgKGlzT2JqZWN0KEMpKSB7XG4gICAgICBDID0gQ1tTUEVDSUVTXTtcbiAgICAgIGlmIChDID09PSBudWxsKSBDID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgfSByZXR1cm4gQyA9PT0gdW5kZWZpbmVkID8gQXJyYXkgOiBDO1xufTtcbiIsIi8vIDkuNC4yLjMgQXJyYXlTcGVjaWVzQ3JlYXRlKG9yaWdpbmFsQXJyYXksIGxlbmd0aClcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19hcnJheS1zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG9yaWdpbmFsLCBsZW5ndGgpIHtcbiAgcmV0dXJuIG5ldyAoc3BlY2llc0NvbnN0cnVjdG9yKG9yaWdpbmFsKSkobGVuZ3RoKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgaW52b2tlID0gcmVxdWlyZSgnLi9faW52b2tlJyk7XG52YXIgYXJyYXlTbGljZSA9IFtdLnNsaWNlO1xudmFyIGZhY3RvcmllcyA9IHt9O1xuXG52YXIgY29uc3RydWN0ID0gZnVuY3Rpb24gKEYsIGxlbiwgYXJncykge1xuICBpZiAoIShsZW4gaW4gZmFjdG9yaWVzKSkge1xuICAgIGZvciAodmFyIG4gPSBbXSwgaSA9IDA7IGkgPCBsZW47IGkrKykgbltpXSA9ICdhWycgKyBpICsgJ10nO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1uZXctZnVuY1xuICAgIGZhY3Rvcmllc1tsZW5dID0gRnVuY3Rpb24oJ0YsYScsICdyZXR1cm4gbmV3IEYoJyArIG4uam9pbignLCcpICsgJyknKTtcbiAgfSByZXR1cm4gZmFjdG9yaWVzW2xlbl0oRiwgYXJncyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IEZ1bmN0aW9uLmJpbmQgfHwgZnVuY3Rpb24gYmluZCh0aGF0IC8qICwgLi4uYXJncyAqLykge1xuICB2YXIgZm4gPSBhRnVuY3Rpb24odGhpcyk7XG4gIHZhciBwYXJ0QXJncyA9IGFycmF5U2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICB2YXIgYm91bmQgPSBmdW5jdGlvbiAoLyogYXJncy4uLiAqLykge1xuICAgIHZhciBhcmdzID0gcGFydEFyZ3MuY29uY2F0KGFycmF5U2xpY2UuY2FsbChhcmd1bWVudHMpKTtcbiAgICByZXR1cm4gdGhpcyBpbnN0YW5jZW9mIGJvdW5kID8gY29uc3RydWN0KGZuLCBhcmdzLmxlbmd0aCwgYXJncykgOiBpbnZva2UoZm4sIGFyZ3MsIHRoYXQpO1xuICB9O1xuICBpZiAoaXNPYmplY3QoZm4ucHJvdG90eXBlKSkgYm91bmQucHJvdG90eXBlID0gZm4ucHJvdG90eXBlO1xuICByZXR1cm4gYm91bmQ7XG59O1xuIiwiLy8gZ2V0dGluZyB0YWcgZnJvbSAxOS4xLjMuNiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nKClcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbnZhciBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcbi8vIEVTMyB3cm9uZyBoZXJlXG52YXIgQVJHID0gY29mKGZ1bmN0aW9uICgpIHsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICB0cnkge1xuICAgIHJldHVybiBpdFtrZXldO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHZhciBPLCBULCBCO1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAoVCA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVEFHKSkgPT0gJ3N0cmluZycgPyBUXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBBUkcgPyBjb2YoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAoQiA9IGNvZihPKSkgPT0gJ09iamVjdCcgJiYgdHlwZW9mIE8uY2FsbGVlID09ICdmdW5jdGlvbicgPyAnQXJndW1lbnRzJyA6IEI7XG59O1xuIiwidmFyIHRvU3RyaW5nID0ge30udG9TdHJpbmc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiB0b1N0cmluZy5jYWxsKGl0KS5zbGljZSg4LCAtMSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciBmb3JPZiA9IHJlcXVpcmUoJy4vX2Zvci1vZicpO1xudmFyICRpdGVyRGVmaW5lID0gcmVxdWlyZSgnLi9faXRlci1kZWZpbmUnKTtcbnZhciBzdGVwID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJyk7XG52YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJyk7XG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIGZhc3RLZXkgPSByZXF1aXJlKCcuL19tZXRhJykuZmFzdEtleTtcbnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJy4vX3ZhbGlkYXRlLWNvbGxlY3Rpb24nKTtcbnZhciBTSVpFID0gREVTQ1JJUFRPUlMgPyAnX3MnIDogJ3NpemUnO1xuXG52YXIgZ2V0RW50cnkgPSBmdW5jdGlvbiAodGhhdCwga2V5KSB7XG4gIC8vIGZhc3QgY2FzZVxuICB2YXIgaW5kZXggPSBmYXN0S2V5KGtleSk7XG4gIHZhciBlbnRyeTtcbiAgaWYgKGluZGV4ICE9PSAnRicpIHJldHVybiB0aGF0Ll9pW2luZGV4XTtcbiAgLy8gZnJvemVuIG9iamVjdCBjYXNlXG4gIGZvciAoZW50cnkgPSB0aGF0Ll9mOyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uKSB7XG4gICAgaWYgKGVudHJ5LmsgPT0ga2V5KSByZXR1cm4gZW50cnk7XG4gIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICBnZXRDb25zdHJ1Y3RvcjogZnVuY3Rpb24gKHdyYXBwZXIsIE5BTUUsIElTX01BUCwgQURERVIpIHtcbiAgICB2YXIgQyA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGl0ZXJhYmxlKSB7XG4gICAgICBhbkluc3RhbmNlKHRoYXQsIEMsIE5BTUUsICdfaScpO1xuICAgICAgdGhhdC5fdCA9IE5BTUU7ICAgICAgICAgLy8gY29sbGVjdGlvbiB0eXBlXG4gICAgICB0aGF0Ll9pID0gY3JlYXRlKG51bGwpOyAvLyBpbmRleFxuICAgICAgdGhhdC5fZiA9IHVuZGVmaW5lZDsgICAgLy8gZmlyc3QgZW50cnlcbiAgICAgIHRoYXQuX2wgPSB1bmRlZmluZWQ7ICAgIC8vIGxhc3QgZW50cnlcbiAgICAgIHRoYXRbU0laRV0gPSAwOyAgICAgICAgIC8vIHNpemVcbiAgICAgIGlmIChpdGVyYWJsZSAhPSB1bmRlZmluZWQpIGZvck9mKGl0ZXJhYmxlLCBJU19NQVAsIHRoYXRbQURERVJdLCB0aGF0KTtcbiAgICB9KTtcbiAgICByZWRlZmluZUFsbChDLnByb3RvdHlwZSwge1xuICAgICAgLy8gMjMuMS4zLjEgTWFwLnByb3RvdHlwZS5jbGVhcigpXG4gICAgICAvLyAyMy4yLjMuMiBTZXQucHJvdG90eXBlLmNsZWFyKClcbiAgICAgIGNsZWFyOiBmdW5jdGlvbiBjbGVhcigpIHtcbiAgICAgICAgZm9yICh2YXIgdGhhdCA9IHZhbGlkYXRlKHRoaXMsIE5BTUUpLCBkYXRhID0gdGhhdC5faSwgZW50cnkgPSB0aGF0Ll9mOyBlbnRyeTsgZW50cnkgPSBlbnRyeS5uKSB7XG4gICAgICAgICAgZW50cnkuciA9IHRydWU7XG4gICAgICAgICAgaWYgKGVudHJ5LnApIGVudHJ5LnAgPSBlbnRyeS5wLm4gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgZGVsZXRlIGRhdGFbZW50cnkuaV07XG4gICAgICAgIH1cbiAgICAgICAgdGhhdC5fZiA9IHRoYXQuX2wgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoYXRbU0laRV0gPSAwO1xuICAgICAgfSxcbiAgICAgIC8vIDIzLjEuMy4zIE1hcC5wcm90b3R5cGUuZGVsZXRlKGtleSlcbiAgICAgIC8vIDIzLjIuMy40IFNldC5wcm90b3R5cGUuZGVsZXRlKHZhbHVlKVxuICAgICAgJ2RlbGV0ZSc6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgdmFyIHRoYXQgPSB2YWxpZGF0ZSh0aGlzLCBOQU1FKTtcbiAgICAgICAgdmFyIGVudHJ5ID0gZ2V0RW50cnkodGhhdCwga2V5KTtcbiAgICAgICAgaWYgKGVudHJ5KSB7XG4gICAgICAgICAgdmFyIG5leHQgPSBlbnRyeS5uO1xuICAgICAgICAgIHZhciBwcmV2ID0gZW50cnkucDtcbiAgICAgICAgICBkZWxldGUgdGhhdC5faVtlbnRyeS5pXTtcbiAgICAgICAgICBlbnRyeS5yID0gdHJ1ZTtcbiAgICAgICAgICBpZiAocHJldikgcHJldi5uID0gbmV4dDtcbiAgICAgICAgICBpZiAobmV4dCkgbmV4dC5wID0gcHJldjtcbiAgICAgICAgICBpZiAodGhhdC5fZiA9PSBlbnRyeSkgdGhhdC5fZiA9IG5leHQ7XG4gICAgICAgICAgaWYgKHRoYXQuX2wgPT0gZW50cnkpIHRoYXQuX2wgPSBwcmV2O1xuICAgICAgICAgIHRoYXRbU0laRV0tLTtcbiAgICAgICAgfSByZXR1cm4gISFlbnRyeTtcbiAgICAgIH0sXG4gICAgICAvLyAyMy4yLjMuNiBTZXQucHJvdG90eXBlLmZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbiAgICAgIC8vIDIzLjEuMy41IE1hcC5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxuICAgICAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgICAgICB2YWxpZGF0ZSh0aGlzLCBOQU1FKTtcbiAgICAgICAgdmFyIGYgPSBjdHgoY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQsIDMpO1xuICAgICAgICB2YXIgZW50cnk7XG4gICAgICAgIHdoaWxlIChlbnRyeSA9IGVudHJ5ID8gZW50cnkubiA6IHRoaXMuX2YpIHtcbiAgICAgICAgICBmKGVudHJ5LnYsIGVudHJ5LmssIHRoaXMpO1xuICAgICAgICAgIC8vIHJldmVydCB0byB0aGUgbGFzdCBleGlzdGluZyBlbnRyeVxuICAgICAgICAgIHdoaWxlIChlbnRyeSAmJiBlbnRyeS5yKSBlbnRyeSA9IGVudHJ5LnA7XG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICAvLyAyMy4xLjMuNyBNYXAucHJvdG90eXBlLmhhcyhrZXkpXG4gICAgICAvLyAyMy4yLjMuNyBTZXQucHJvdG90eXBlLmhhcyh2YWx1ZSlcbiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICByZXR1cm4gISFnZXRFbnRyeSh2YWxpZGF0ZSh0aGlzLCBOQU1FKSwga2V5KTtcbiAgICAgIH1cbiAgICB9KTtcbiAgICBpZiAoREVTQ1JJUFRPUlMpIGRQKEMucHJvdG90eXBlLCAnc2l6ZScsIHtcbiAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdmFsaWRhdGUodGhpcywgTkFNRSlbU0laRV07XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIEM7XG4gIH0sXG4gIGRlZjogZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHtcbiAgICB2YXIgZW50cnkgPSBnZXRFbnRyeSh0aGF0LCBrZXkpO1xuICAgIHZhciBwcmV2LCBpbmRleDtcbiAgICAvLyBjaGFuZ2UgZXhpc3RpbmcgZW50cnlcbiAgICBpZiAoZW50cnkpIHtcbiAgICAgIGVudHJ5LnYgPSB2YWx1ZTtcbiAgICAvLyBjcmVhdGUgbmV3IGVudHJ5XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoYXQuX2wgPSBlbnRyeSA9IHtcbiAgICAgICAgaTogaW5kZXggPSBmYXN0S2V5KGtleSwgdHJ1ZSksIC8vIDwtIGluZGV4XG4gICAgICAgIGs6IGtleSwgICAgICAgICAgICAgICAgICAgICAgICAvLyA8LSBrZXlcbiAgICAgICAgdjogdmFsdWUsICAgICAgICAgICAgICAgICAgICAgIC8vIDwtIHZhbHVlXG4gICAgICAgIHA6IHByZXYgPSB0aGF0Ll9sLCAgICAgICAgICAgICAvLyA8LSBwcmV2aW91cyBlbnRyeVxuICAgICAgICBuOiB1bmRlZmluZWQsICAgICAgICAgICAgICAgICAgLy8gPC0gbmV4dCBlbnRyeVxuICAgICAgICByOiBmYWxzZSAgICAgICAgICAgICAgICAgICAgICAgLy8gPC0gcmVtb3ZlZFxuICAgICAgfTtcbiAgICAgIGlmICghdGhhdC5fZikgdGhhdC5fZiA9IGVudHJ5O1xuICAgICAgaWYgKHByZXYpIHByZXYubiA9IGVudHJ5O1xuICAgICAgdGhhdFtTSVpFXSsrO1xuICAgICAgLy8gYWRkIHRvIGluZGV4XG4gICAgICBpZiAoaW5kZXggIT09ICdGJykgdGhhdC5faVtpbmRleF0gPSBlbnRyeTtcbiAgICB9IHJldHVybiB0aGF0O1xuICB9LFxuICBnZXRFbnRyeTogZ2V0RW50cnksXG4gIHNldFN0cm9uZzogZnVuY3Rpb24gKEMsIE5BTUUsIElTX01BUCkge1xuICAgIC8vIGFkZCAua2V5cywgLnZhbHVlcywgLmVudHJpZXMsIFtAQGl0ZXJhdG9yXVxuICAgIC8vIDIzLjEuMy40LCAyMy4xLjMuOCwgMjMuMS4zLjExLCAyMy4xLjMuMTIsIDIzLjIuMy41LCAyMy4yLjMuOCwgMjMuMi4zLjEwLCAyMy4yLjMuMTFcbiAgICAkaXRlckRlZmluZShDLCBOQU1FLCBmdW5jdGlvbiAoaXRlcmF0ZWQsIGtpbmQpIHtcbiAgICAgIHRoaXMuX3QgPSB2YWxpZGF0ZShpdGVyYXRlZCwgTkFNRSk7IC8vIHRhcmdldFxuICAgICAgdGhpcy5fayA9IGtpbmQ7ICAgICAgICAgICAgICAgICAgICAgLy8ga2luZFxuICAgICAgdGhpcy5fbCA9IHVuZGVmaW5lZDsgICAgICAgICAgICAgICAgLy8gcHJldmlvdXNcbiAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICB2YXIga2luZCA9IHRoYXQuX2s7XG4gICAgICB2YXIgZW50cnkgPSB0aGF0Ll9sO1xuICAgICAgLy8gcmV2ZXJ0IHRvIHRoZSBsYXN0IGV4aXN0aW5nIGVudHJ5XG4gICAgICB3aGlsZSAoZW50cnkgJiYgZW50cnkucikgZW50cnkgPSBlbnRyeS5wO1xuICAgICAgLy8gZ2V0IG5leHQgZW50cnlcbiAgICAgIGlmICghdGhhdC5fdCB8fCAhKHRoYXQuX2wgPSBlbnRyeSA9IGVudHJ5ID8gZW50cnkubiA6IHRoYXQuX3QuX2YpKSB7XG4gICAgICAgIC8vIG9yIGZpbmlzaCB0aGUgaXRlcmF0aW9uXG4gICAgICAgIHRoYXQuX3QgPSB1bmRlZmluZWQ7XG4gICAgICAgIHJldHVybiBzdGVwKDEpO1xuICAgICAgfVxuICAgICAgLy8gcmV0dXJuIHN0ZXAgYnkga2luZFxuICAgICAgaWYgKGtpbmQgPT0gJ2tleXMnKSByZXR1cm4gc3RlcCgwLCBlbnRyeS5rKTtcbiAgICAgIGlmIChraW5kID09ICd2YWx1ZXMnKSByZXR1cm4gc3RlcCgwLCBlbnRyeS52KTtcbiAgICAgIHJldHVybiBzdGVwKDAsIFtlbnRyeS5rLCBlbnRyeS52XSk7XG4gICAgfSwgSVNfTUFQID8gJ2VudHJpZXMnIDogJ3ZhbHVlcycsICFJU19NQVAsIHRydWUpO1xuXG4gICAgLy8gYWRkIFtAQHNwZWNpZXNdLCAyMy4xLjIuMiwgMjMuMi4yLjJcbiAgICBzZXRTcGVjaWVzKE5BTUUpO1xuICB9XG59O1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL0RhdmlkQnJ1YW50L01hcC1TZXQucHJvdG90eXBlLnRvSlNPTlxudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4vX2FycmF5LWZyb20taXRlcmFibGUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE5BTUUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHRvSlNPTigpIHtcbiAgICBpZiAoY2xhc3NvZih0aGlzKSAhPSBOQU1FKSB0aHJvdyBUeXBlRXJyb3IoTkFNRSArIFwiI3RvSlNPTiBpc24ndCBnZW5lcmljXCIpO1xuICAgIHJldHVybiBmcm9tKHRoaXMpO1xuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xudmFyIGdldFdlYWsgPSByZXF1aXJlKCcuL19tZXRhJykuZ2V0V2VhaztcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG52YXIgZm9yT2YgPSByZXF1aXJlKCcuL19mb3Itb2YnKTtcbnZhciBjcmVhdGVBcnJheU1ldGhvZCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKTtcbnZhciAkaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgYXJyYXlGaW5kID0gY3JlYXRlQXJyYXlNZXRob2QoNSk7XG52YXIgYXJyYXlGaW5kSW5kZXggPSBjcmVhdGVBcnJheU1ldGhvZCg2KTtcbnZhciBpZCA9IDA7XG5cbi8vIGZhbGxiYWNrIGZvciB1bmNhdWdodCBmcm96ZW4ga2V5c1xudmFyIHVuY2F1Z2h0RnJvemVuU3RvcmUgPSBmdW5jdGlvbiAodGhhdCkge1xuICByZXR1cm4gdGhhdC5fbCB8fCAodGhhdC5fbCA9IG5ldyBVbmNhdWdodEZyb3plblN0b3JlKCkpO1xufTtcbnZhciBVbmNhdWdodEZyb3plblN0b3JlID0gZnVuY3Rpb24gKCkge1xuICB0aGlzLmEgPSBbXTtcbn07XG52YXIgZmluZFVuY2F1Z2h0RnJvemVuID0gZnVuY3Rpb24gKHN0b3JlLCBrZXkpIHtcbiAgcmV0dXJuIGFycmF5RmluZChzdG9yZS5hLCBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gaXRbMF0gPT09IGtleTtcbiAgfSk7XG59O1xuVW5jYXVnaHRGcm96ZW5TdG9yZS5wcm90b3R5cGUgPSB7XG4gIGdldDogZnVuY3Rpb24gKGtleSkge1xuICAgIHZhciBlbnRyeSA9IGZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICAgIGlmIChlbnRyeSkgcmV0dXJuIGVudHJ5WzFdO1xuICB9LFxuICBoYXM6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gISFmaW5kVW5jYXVnaHRGcm96ZW4odGhpcywga2V5KTtcbiAgfSxcbiAgc2V0OiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgIHZhciBlbnRyeSA9IGZpbmRVbmNhdWdodEZyb3plbih0aGlzLCBrZXkpO1xuICAgIGlmIChlbnRyeSkgZW50cnlbMV0gPSB2YWx1ZTtcbiAgICBlbHNlIHRoaXMuYS5wdXNoKFtrZXksIHZhbHVlXSk7XG4gIH0sXG4gICdkZWxldGUnOiBmdW5jdGlvbiAoa2V5KSB7XG4gICAgdmFyIGluZGV4ID0gYXJyYXlGaW5kSW5kZXgodGhpcy5hLCBmdW5jdGlvbiAoaXQpIHtcbiAgICAgIHJldHVybiBpdFswXSA9PT0ga2V5O1xuICAgIH0pO1xuICAgIGlmICh+aW5kZXgpIHRoaXMuYS5zcGxpY2UoaW5kZXgsIDEpO1xuICAgIHJldHVybiAhIX5pbmRleDtcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIGdldENvbnN0cnVjdG9yOiBmdW5jdGlvbiAod3JhcHBlciwgTkFNRSwgSVNfTUFQLCBBRERFUikge1xuICAgIHZhciBDID0gd3JhcHBlcihmdW5jdGlvbiAodGhhdCwgaXRlcmFibGUpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhhdCwgQywgTkFNRSwgJ19pJyk7XG4gICAgICB0aGF0Ll90ID0gTkFNRTsgICAgICAvLyBjb2xsZWN0aW9uIHR5cGVcbiAgICAgIHRoYXQuX2kgPSBpZCsrOyAgICAgIC8vIGNvbGxlY3Rpb24gaWRcbiAgICAgIHRoYXQuX2wgPSB1bmRlZmluZWQ7IC8vIGxlYWsgc3RvcmUgZm9yIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RzXG4gICAgICBpZiAoaXRlcmFibGUgIT0gdW5kZWZpbmVkKSBmb3JPZihpdGVyYWJsZSwgSVNfTUFQLCB0aGF0W0FEREVSXSwgdGhhdCk7XG4gICAgfSk7XG4gICAgcmVkZWZpbmVBbGwoQy5wcm90b3R5cGUsIHtcbiAgICAgIC8vIDIzLjMuMy4yIFdlYWtNYXAucHJvdG90eXBlLmRlbGV0ZShrZXkpXG4gICAgICAvLyAyMy40LjMuMyBXZWFrU2V0LnByb3RvdHlwZS5kZWxldGUodmFsdWUpXG4gICAgICAnZGVsZXRlJzogZnVuY3Rpb24gKGtleSkge1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrKGtleSk7XG4gICAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZSh2YWxpZGF0ZSh0aGlzLCBOQU1FKSlbJ2RlbGV0ZSddKGtleSk7XG4gICAgICAgIHJldHVybiBkYXRhICYmICRoYXMoZGF0YSwgdGhpcy5faSkgJiYgZGVsZXRlIGRhdGFbdGhpcy5faV07XG4gICAgICB9LFxuICAgICAgLy8gMjMuMy4zLjQgV2Vha01hcC5wcm90b3R5cGUuaGFzKGtleSlcbiAgICAgIC8vIDIzLjQuMy40IFdlYWtTZXQucHJvdG90eXBlLmhhcyh2YWx1ZSlcbiAgICAgIGhhczogZnVuY3Rpb24gaGFzKGtleSkge1xuICAgICAgICBpZiAoIWlzT2JqZWN0KGtleSkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgdmFyIGRhdGEgPSBnZXRXZWFrKGtleSk7XG4gICAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZSh2YWxpZGF0ZSh0aGlzLCBOQU1FKSkuaGFzKGtleSk7XG4gICAgICAgIHJldHVybiBkYXRhICYmICRoYXMoZGF0YSwgdGhpcy5faSk7XG4gICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIEM7XG4gIH0sXG4gIGRlZjogZnVuY3Rpb24gKHRoYXQsIGtleSwgdmFsdWUpIHtcbiAgICB2YXIgZGF0YSA9IGdldFdlYWsoYW5PYmplY3Qoa2V5KSwgdHJ1ZSk7XG4gICAgaWYgKGRhdGEgPT09IHRydWUpIHVuY2F1Z2h0RnJvemVuU3RvcmUodGhhdCkuc2V0KGtleSwgdmFsdWUpO1xuICAgIGVsc2UgZGF0YVt0aGF0Ll9pXSA9IHZhbHVlO1xuICAgIHJldHVybiB0aGF0O1xuICB9LFxuICB1ZnN0b3JlOiB1bmNhdWdodEZyb3plblN0b3JlXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbnZhciBtZXRhID0gcmVxdWlyZSgnLi9fbWV0YScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgJGl0ZXJEZXRlY3QgPSByZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IHJlcXVpcmUoJy4vX2luaGVyaXQtaWYtcmVxdWlyZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTkFNRSwgd3JhcHBlciwgbWV0aG9kcywgY29tbW9uLCBJU19NQVAsIElTX1dFQUspIHtcbiAgdmFyIEJhc2UgPSBnbG9iYWxbTkFNRV07XG4gIHZhciBDID0gQmFzZTtcbiAgdmFyIEFEREVSID0gSVNfTUFQID8gJ3NldCcgOiAnYWRkJztcbiAgdmFyIHByb3RvID0gQyAmJiBDLnByb3RvdHlwZTtcbiAgdmFyIE8gPSB7fTtcbiAgdmFyIGZpeE1ldGhvZCA9IGZ1bmN0aW9uIChLRVkpIHtcbiAgICB2YXIgZm4gPSBwcm90b1tLRVldO1xuICAgIHJlZGVmaW5lKHByb3RvLCBLRVksXG4gICAgICBLRVkgPT0gJ2RlbGV0ZScgPyBmdW5jdGlvbiAoYSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkgPyBmYWxzZSA6IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhKTtcbiAgICAgIH0gOiBLRVkgPT0gJ2hhcycgPyBmdW5jdGlvbiBoYXMoYSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkgPyBmYWxzZSA6IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhKTtcbiAgICAgIH0gOiBLRVkgPT0gJ2dldCcgPyBmdW5jdGlvbiBnZXQoYSkge1xuICAgICAgICByZXR1cm4gSVNfV0VBSyAmJiAhaXNPYmplY3QoYSkgPyB1bmRlZmluZWQgOiBmbi5jYWxsKHRoaXMsIGEgPT09IDAgPyAwIDogYSk7XG4gICAgICB9IDogS0VZID09ICdhZGQnID8gZnVuY3Rpb24gYWRkKGEpIHsgZm4uY2FsbCh0aGlzLCBhID09PSAwID8gMCA6IGEpOyByZXR1cm4gdGhpczsgfVxuICAgICAgICA6IGZ1bmN0aW9uIHNldChhLCBiKSB7IGZuLmNhbGwodGhpcywgYSA9PT0gMCA/IDAgOiBhLCBiKTsgcmV0dXJuIHRoaXM7IH1cbiAgICApO1xuICB9O1xuICBpZiAodHlwZW9mIEMgIT0gJ2Z1bmN0aW9uJyB8fCAhKElTX1dFQUsgfHwgcHJvdG8uZm9yRWFjaCAmJiAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIG5ldyBDKCkuZW50cmllcygpLm5leHQoKTtcbiAgfSkpKSB7XG4gICAgLy8gY3JlYXRlIGNvbGxlY3Rpb24gY29uc3RydWN0b3JcbiAgICBDID0gY29tbW9uLmdldENvbnN0cnVjdG9yKHdyYXBwZXIsIE5BTUUsIElTX01BUCwgQURERVIpO1xuICAgIHJlZGVmaW5lQWxsKEMucHJvdG90eXBlLCBtZXRob2RzKTtcbiAgICBtZXRhLk5FRUQgPSB0cnVlO1xuICB9IGVsc2Uge1xuICAgIHZhciBpbnN0YW5jZSA9IG5ldyBDKCk7XG4gICAgLy8gZWFybHkgaW1wbGVtZW50YXRpb25zIG5vdCBzdXBwb3J0cyBjaGFpbmluZ1xuICAgIHZhciBIQVNOVF9DSEFJTklORyA9IGluc3RhbmNlW0FEREVSXShJU19XRUFLID8ge30gOiAtMCwgMSkgIT0gaW5zdGFuY2U7XG4gICAgLy8gVjggfiAgQ2hyb21pdW0gNDAtIHdlYWstY29sbGVjdGlvbnMgdGhyb3dzIG9uIHByaW1pdGl2ZXMsIGJ1dCBzaG91bGQgcmV0dXJuIGZhbHNlXG4gICAgdmFyIFRIUk9XU19PTl9QUklNSVRJVkVTID0gZmFpbHMoZnVuY3Rpb24gKCkgeyBpbnN0YW5jZS5oYXMoMSk7IH0pO1xuICAgIC8vIG1vc3QgZWFybHkgaW1wbGVtZW50YXRpb25zIGRvZXNuJ3Qgc3VwcG9ydHMgaXRlcmFibGVzLCBtb3N0IG1vZGVybiAtIG5vdCBjbG9zZSBpdCBjb3JyZWN0bHlcbiAgICB2YXIgQUNDRVBUX0lURVJBQkxFUyA9ICRpdGVyRGV0ZWN0KGZ1bmN0aW9uIChpdGVyKSB7IG5ldyBDKGl0ZXIpOyB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAvLyBmb3IgZWFybHkgaW1wbGVtZW50YXRpb25zIC0wIGFuZCArMCBub3QgdGhlIHNhbWVcbiAgICB2YXIgQlVHR1lfWkVSTyA9ICFJU19XRUFLICYmIGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIC8vIFY4IH4gQ2hyb21pdW0gNDItIGZhaWxzIG9ubHkgd2l0aCA1KyBlbGVtZW50c1xuICAgICAgdmFyICRpbnN0YW5jZSA9IG5ldyBDKCk7XG4gICAgICB2YXIgaW5kZXggPSA1O1xuICAgICAgd2hpbGUgKGluZGV4LS0pICRpbnN0YW5jZVtBRERFUl0oaW5kZXgsIGluZGV4KTtcbiAgICAgIHJldHVybiAhJGluc3RhbmNlLmhhcygtMCk7XG4gICAgfSk7XG4gICAgaWYgKCFBQ0NFUFRfSVRFUkFCTEVTKSB7XG4gICAgICBDID0gd3JhcHBlcihmdW5jdGlvbiAodGFyZ2V0LCBpdGVyYWJsZSkge1xuICAgICAgICBhbkluc3RhbmNlKHRhcmdldCwgQywgTkFNRSk7XG4gICAgICAgIHZhciB0aGF0ID0gaW5oZXJpdElmUmVxdWlyZWQobmV3IEJhc2UoKSwgdGFyZ2V0LCBDKTtcbiAgICAgICAgaWYgKGl0ZXJhYmxlICE9IHVuZGVmaW5lZCkgZm9yT2YoaXRlcmFibGUsIElTX01BUCwgdGhhdFtBRERFUl0sIHRoYXQpO1xuICAgICAgICByZXR1cm4gdGhhdDtcbiAgICAgIH0pO1xuICAgICAgQy5wcm90b3R5cGUgPSBwcm90bztcbiAgICAgIHByb3RvLmNvbnN0cnVjdG9yID0gQztcbiAgICB9XG4gICAgaWYgKFRIUk9XU19PTl9QUklNSVRJVkVTIHx8IEJVR0dZX1pFUk8pIHtcbiAgICAgIGZpeE1ldGhvZCgnZGVsZXRlJyk7XG4gICAgICBmaXhNZXRob2QoJ2hhcycpO1xuICAgICAgSVNfTUFQICYmIGZpeE1ldGhvZCgnZ2V0Jyk7XG4gICAgfVxuICAgIGlmIChCVUdHWV9aRVJPIHx8IEhBU05UX0NIQUlOSU5HKSBmaXhNZXRob2QoQURERVIpO1xuICAgIC8vIHdlYWsgY29sbGVjdGlvbnMgc2hvdWxkIG5vdCBjb250YWlucyAuY2xlYXIgbWV0aG9kXG4gICAgaWYgKElTX1dFQUsgJiYgcHJvdG8uY2xlYXIpIGRlbGV0ZSBwcm90by5jbGVhcjtcbiAgfVxuXG4gIHNldFRvU3RyaW5nVGFnKEMsIE5BTUUpO1xuXG4gIE9bTkFNRV0gPSBDO1xuICAkZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqIChDICE9IEJhc2UpLCBPKTtcblxuICBpZiAoIUlTX1dFQUspIGNvbW1vbi5zZXRTdHJvbmcoQywgTkFNRSwgSVNfTUFQKTtcblxuICByZXR1cm4gQztcbn07XG4iLCJ2YXIgY29yZSA9IG1vZHVsZS5leHBvcnRzID0geyB2ZXJzaW9uOiAnMi42LjEyJyB9O1xuaWYgKHR5cGVvZiBfX2UgPT0gJ251bWJlcicpIF9fZSA9IGNvcmU7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIGluZGV4LCB2YWx1ZSkge1xuICBpZiAoaW5kZXggaW4gb2JqZWN0KSAkZGVmaW5lUHJvcGVydHkuZihvYmplY3QsIGluZGV4LCBjcmVhdGVEZXNjKDAsIHZhbHVlKSk7XG4gIGVsc2Ugb2JqZWN0W2luZGV4XSA9IHZhbHVlO1xufTtcbiIsIi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCB0aGF0LCBsZW5ndGgpIHtcbiAgYUZ1bmN0aW9uKGZuKTtcbiAgaWYgKHRoYXQgPT09IHVuZGVmaW5lZCkgcmV0dXJuIGZuO1xuICBzd2l0Y2ggKGxlbmd0aCkge1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uIChhKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhKTtcbiAgICB9O1xuICAgIGNhc2UgMjogcmV0dXJuIGZ1bmN0aW9uIChhLCBiKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiKTtcbiAgICB9O1xuICAgIGNhc2UgMzogcmV0dXJuIGZ1bmN0aW9uIChhLCBiLCBjKSB7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbiAoLyogLi4uYXJncyAqLykge1xuICAgIHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmd1bWVudHMpO1xuICB9O1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIDIwLjMuNC4zNiAvIDE1LjkuNS40MyBEYXRlLnByb3RvdHlwZS50b0lTT1N0cmluZygpXG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGdldFRpbWUgPSBEYXRlLnByb3RvdHlwZS5nZXRUaW1lO1xudmFyICR0b0lTT1N0cmluZyA9IERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nO1xuXG52YXIgbHogPSBmdW5jdGlvbiAobnVtKSB7XG4gIHJldHVybiBudW0gPiA5ID8gbnVtIDogJzAnICsgbnVtO1xufTtcblxuLy8gUGhhbnRvbUpTIC8gb2xkIFdlYktpdCBoYXMgYSBicm9rZW4gaW1wbGVtZW50YXRpb25zXG5tb2R1bGUuZXhwb3J0cyA9IChmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAkdG9JU09TdHJpbmcuY2FsbChuZXcgRGF0ZSgtNWUxMyAtIDEpKSAhPSAnMDM4NS0wNy0yNVQwNzowNjozOS45OTlaJztcbn0pIHx8ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICR0b0lTT1N0cmluZy5jYWxsKG5ldyBEYXRlKE5hTikpO1xufSkpID8gZnVuY3Rpb24gdG9JU09TdHJpbmcoKSB7XG4gIGlmICghaXNGaW5pdGUoZ2V0VGltZS5jYWxsKHRoaXMpKSkgdGhyb3cgUmFuZ2VFcnJvcignSW52YWxpZCB0aW1lIHZhbHVlJyk7XG4gIHZhciBkID0gdGhpcztcbiAgdmFyIHkgPSBkLmdldFVUQ0Z1bGxZZWFyKCk7XG4gIHZhciBtID0gZC5nZXRVVENNaWxsaXNlY29uZHMoKTtcbiAgdmFyIHMgPSB5IDwgMCA/ICctJyA6IHkgPiA5OTk5ID8gJysnIDogJyc7XG4gIHJldHVybiBzICsgKCcwMDAwMCcgKyBNYXRoLmFicyh5KSkuc2xpY2UocyA/IC02IDogLTQpICtcbiAgICAnLScgKyBseihkLmdldFVUQ01vbnRoKCkgKyAxKSArICctJyArIGx6KGQuZ2V0VVRDRGF0ZSgpKSArXG4gICAgJ1QnICsgbHooZC5nZXRVVENIb3VycygpKSArICc6JyArIGx6KGQuZ2V0VVRDTWludXRlcygpKSArXG4gICAgJzonICsgbHooZC5nZXRVVENTZWNvbmRzKCkpICsgJy4nICsgKG0gPiA5OSA/IG0gOiAnMCcgKyBseihtKSkgKyAnWic7XG59IDogJHRvSVNPU3RyaW5nO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBOVU1CRVIgPSAnbnVtYmVyJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaGludCkge1xuICBpZiAoaGludCAhPT0gJ3N0cmluZycgJiYgaGludCAhPT0gTlVNQkVSICYmIGhpbnQgIT09ICdkZWZhdWx0JykgdGhyb3cgVHlwZUVycm9yKCdJbmNvcnJlY3QgaGludCcpO1xuICByZXR1cm4gdG9QcmltaXRpdmUoYW5PYmplY3QodGhpcyksIGhpbnQgIT0gTlVNQkVSKTtcbn07XG4iLCIvLyA3LjIuMSBSZXF1aXJlT2JqZWN0Q29lcmNpYmxlKGFyZ3VtZW50KVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ID09IHVuZGVmaW5lZCkgdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59O1xuIiwiLy8gVGhhbmsncyBJRTggZm9yIGhpcyBmdW5ueSBkZWZpbmVQcm9wZXJ0eVxubW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkoe30sICdhJywgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH0gfSkuYSAhPSA3O1xufSk7XG4iLCJ2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBkb2N1bWVudCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLmRvY3VtZW50O1xuLy8gdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCcgaW4gb2xkIElFXG52YXIgaXMgPSBpc09iamVjdChkb2N1bWVudCkgJiYgaXNPYmplY3QoZG9jdW1lbnQuY3JlYXRlRWxlbWVudCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTtcbiIsIi8vIElFIDgtIGRvbid0IGVudW0gYnVnIGtleXNcbm1vZHVsZS5leHBvcnRzID0gKFxuICAnY29uc3RydWN0b3IsaGFzT3duUHJvcGVydHksaXNQcm90b3R5cGVPZixwcm9wZXJ0eUlzRW51bWVyYWJsZSx0b0xvY2FsZVN0cmluZyx0b1N0cmluZyx2YWx1ZU9mJ1xuKS5zcGxpdCgnLCcpO1xuIiwiLy8gYWxsIGVudW1lcmFibGUgb2JqZWN0IGtleXMsIGluY2x1ZGVzIHN5bWJvbHNcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciBnT1BTID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKTtcbnZhciBwSUUgPSByZXF1aXJlKCcuL19vYmplY3QtcGllJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgcmVzdWx0ID0gZ2V0S2V5cyhpdCk7XG4gIHZhciBnZXRTeW1ib2xzID0gZ09QUy5mO1xuICBpZiAoZ2V0U3ltYm9scykge1xuICAgIHZhciBzeW1ib2xzID0gZ2V0U3ltYm9scyhpdCk7XG4gICAgdmFyIGlzRW51bSA9IHBJRS5mO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChzeW1ib2xzLmxlbmd0aCA+IGkpIGlmIChpc0VudW0uY2FsbChpdCwga2V5ID0gc3ltYm9sc1tpKytdKSkgcmVzdWx0LnB1c2goa2V5KTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG52YXIgJGV4cG9ydCA9IGZ1bmN0aW9uICh0eXBlLCBuYW1lLCBzb3VyY2UpIHtcbiAgdmFyIElTX0ZPUkNFRCA9IHR5cGUgJiAkZXhwb3J0LkY7XG4gIHZhciBJU19HTE9CQUwgPSB0eXBlICYgJGV4cG9ydC5HO1xuICB2YXIgSVNfU1RBVElDID0gdHlwZSAmICRleHBvcnQuUztcbiAgdmFyIElTX1BST1RPID0gdHlwZSAmICRleHBvcnQuUDtcbiAgdmFyIElTX0JJTkQgPSB0eXBlICYgJGV4cG9ydC5CO1xuICB2YXIgdGFyZ2V0ID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIHx8IChnbG9iYWxbbmFtZV0gPSB7fSkgOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdO1xuICB2YXIgZXhwb3J0cyA9IElTX0dMT0JBTCA/IGNvcmUgOiBjb3JlW25hbWVdIHx8IChjb3JlW25hbWVdID0ge30pO1xuICB2YXIgZXhwUHJvdG8gPSBleHBvcnRzW1BST1RPVFlQRV0gfHwgKGV4cG9ydHNbUFJPVE9UWVBFXSA9IHt9KTtcbiAgdmFyIGtleSwgb3duLCBvdXQsIGV4cDtcbiAgaWYgKElTX0dMT0JBTCkgc291cmNlID0gbmFtZTtcbiAgZm9yIChrZXkgaW4gc291cmNlKSB7XG4gICAgLy8gY29udGFpbnMgaW4gbmF0aXZlXG4gICAgb3duID0gIUlTX0ZPUkNFRCAmJiB0YXJnZXQgJiYgdGFyZ2V0W2tleV0gIT09IHVuZGVmaW5lZDtcbiAgICAvLyBleHBvcnQgbmF0aXZlIG9yIHBhc3NlZFxuICAgIG91dCA9IChvd24gPyB0YXJnZXQgOiBzb3VyY2UpW2tleV07XG4gICAgLy8gYmluZCB0aW1lcnMgdG8gZ2xvYmFsIGZvciBjYWxsIGZyb20gZXhwb3J0IGNvbnRleHRcbiAgICBleHAgPSBJU19CSU5EICYmIG93biA/IGN0eChvdXQsIGdsb2JhbCkgOiBJU19QUk9UTyAmJiB0eXBlb2Ygb3V0ID09ICdmdW5jdGlvbicgPyBjdHgoRnVuY3Rpb24uY2FsbCwgb3V0KSA6IG91dDtcbiAgICAvLyBleHRlbmQgZ2xvYmFsXG4gICAgaWYgKHRhcmdldCkgcmVkZWZpbmUodGFyZ2V0LCBrZXksIG91dCwgdHlwZSAmICRleHBvcnQuVSk7XG4gICAgLy8gZXhwb3J0XG4gICAgaWYgKGV4cG9ydHNba2V5XSAhPSBvdXQpIGhpZGUoZXhwb3J0cywga2V5LCBleHApO1xuICAgIGlmIChJU19QUk9UTyAmJiBleHBQcm90b1trZXldICE9IG91dCkgZXhwUHJvdG9ba2V5XSA9IG91dDtcbiAgfVxufTtcbmdsb2JhbC5jb3JlID0gY29yZTtcbi8vIHR5cGUgYml0bWFwXG4kZXhwb3J0LkYgPSAxOyAgIC8vIGZvcmNlZFxuJGV4cG9ydC5HID0gMjsgICAvLyBnbG9iYWxcbiRleHBvcnQuUyA9IDQ7ICAgLy8gc3RhdGljXG4kZXhwb3J0LlAgPSA4OyAgIC8vIHByb3RvXG4kZXhwb3J0LkIgPSAxNjsgIC8vIGJpbmRcbiRleHBvcnQuVyA9IDMyOyAgLy8gd3JhcFxuJGV4cG9ydC5VID0gNjQ7ICAvLyBzYWZlXG4kZXhwb3J0LlIgPSAxMjg7IC8vIHJlYWwgcHJvdG8gbWV0aG9kIGZvciBgbGlicmFyeWBcbm1vZHVsZS5leHBvcnRzID0gJGV4cG9ydDtcbiIsInZhciBNQVRDSCA9IHJlcXVpcmUoJy4vX3drcycpKCdtYXRjaCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoS0VZKSB7XG4gIHZhciByZSA9IC8uLztcbiAgdHJ5IHtcbiAgICAnLy4vJ1tLRVldKHJlKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHRyeSB7XG4gICAgICByZVtNQVRDSF0gPSBmYWxzZTtcbiAgICAgIHJldHVybiAhJy8uLydbS0VZXShyZSk7XG4gICAgfSBjYXRjaCAoZikgeyAvKiBlbXB0eSAqLyB9XG4gIH0gcmV0dXJuIHRydWU7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoZXhlYykge1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB0cnVlO1xuICB9XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xucmVxdWlyZSgnLi9lczYucmVnZXhwLmV4ZWMnKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbnZhciB3a3MgPSByZXF1aXJlKCcuL193a3MnKTtcbnZhciByZWdleHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMnKTtcblxudmFyIFNQRUNJRVMgPSB3a3MoJ3NwZWNpZXMnKTtcblxudmFyIFJFUExBQ0VfU1VQUE9SVFNfTkFNRURfR1JPVVBTID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gI3JlcGxhY2UgbmVlZHMgYnVpbHQtaW4gc3VwcG9ydCBmb3IgbmFtZWQgZ3JvdXBzLlxuICAvLyAjbWF0Y2ggd29ya3MgZmluZSBiZWNhdXNlIGl0IGp1c3QgcmV0dXJuIHRoZSBleGVjIHJlc3VsdHMsIGV2ZW4gaWYgaXQgaGFzXG4gIC8vIGEgXCJncm9wc1wiIHByb3BlcnR5LlxuICB2YXIgcmUgPSAvLi87XG4gIHJlLmV4ZWMgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHJlc3VsdCA9IFtdO1xuICAgIHJlc3VsdC5ncm91cHMgPSB7IGE6ICc3JyB9O1xuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG4gIHJldHVybiAnJy5yZXBsYWNlKHJlLCAnJDxhPicpICE9PSAnNyc7XG59KTtcblxudmFyIFNQTElUX1dPUktTX1dJVEhfT1ZFUldSSVRURU5fRVhFQyA9IChmdW5jdGlvbiAoKSB7XG4gIC8vIENocm9tZSA1MSBoYXMgYSBidWdneSBcInNwbGl0XCIgaW1wbGVtZW50YXRpb24gd2hlbiBSZWdFeHAjZXhlYyAhPT0gbmF0aXZlRXhlY1xuICB2YXIgcmUgPSAvKD86KS87XG4gIHZhciBvcmlnaW5hbEV4ZWMgPSByZS5leGVjO1xuICByZS5leGVjID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gb3JpZ2luYWxFeGVjLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7IH07XG4gIHZhciByZXN1bHQgPSAnYWInLnNwbGl0KHJlKTtcbiAgcmV0dXJuIHJlc3VsdC5sZW5ndGggPT09IDIgJiYgcmVzdWx0WzBdID09PSAnYScgJiYgcmVzdWx0WzFdID09PSAnYic7XG59KSgpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChLRVksIGxlbmd0aCwgZXhlYykge1xuICB2YXIgU1lNQk9MID0gd2tzKEtFWSk7XG5cbiAgdmFyIERFTEVHQVRFU19UT19TWU1CT0wgPSAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIC8vIFN0cmluZyBtZXRob2RzIGNhbGwgc3ltYm9sLW5hbWVkIFJlZ0VwIG1ldGhvZHNcbiAgICB2YXIgTyA9IHt9O1xuICAgIE9bU1lNQk9MXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIDc7IH07XG4gICAgcmV0dXJuICcnW0tFWV0oTykgIT0gNztcbiAgfSk7XG5cbiAgdmFyIERFTEVHQVRFU19UT19FWEVDID0gREVMRUdBVEVTX1RPX1NZTUJPTCA/ICFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgLy8gU3ltYm9sLW5hbWVkIFJlZ0V4cCBtZXRob2RzIGNhbGwgLmV4ZWNcbiAgICB2YXIgZXhlY0NhbGxlZCA9IGZhbHNlO1xuICAgIHZhciByZSA9IC9hLztcbiAgICByZS5leGVjID0gZnVuY3Rpb24gKCkgeyBleGVjQ2FsbGVkID0gdHJ1ZTsgcmV0dXJuIG51bGw7IH07XG4gICAgaWYgKEtFWSA9PT0gJ3NwbGl0Jykge1xuICAgICAgLy8gUmVnRXhwW0BAc3BsaXRdIGRvZXNuJ3QgY2FsbCB0aGUgcmVnZXgncyBleGVjIG1ldGhvZCwgYnV0IGZpcnN0IGNyZWF0ZXNcbiAgICAgIC8vIGEgbmV3IG9uZS4gV2UgbmVlZCB0byByZXR1cm4gdGhlIHBhdGNoZWQgcmVnZXggd2hlbiBjcmVhdGluZyB0aGUgbmV3IG9uZS5cbiAgICAgIHJlLmNvbnN0cnVjdG9yID0ge307XG4gICAgICByZS5jb25zdHJ1Y3RvcltTUEVDSUVTXSA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHJlOyB9O1xuICAgIH1cbiAgICByZVtTWU1CT0xdKCcnKTtcbiAgICByZXR1cm4gIWV4ZWNDYWxsZWQ7XG4gIH0pIDogdW5kZWZpbmVkO1xuXG4gIGlmIChcbiAgICAhREVMRUdBVEVTX1RPX1NZTUJPTCB8fFxuICAgICFERUxFR0FURVNfVE9fRVhFQyB8fFxuICAgIChLRVkgPT09ICdyZXBsYWNlJyAmJiAhUkVQTEFDRV9TVVBQT1JUU19OQU1FRF9HUk9VUFMpIHx8XG4gICAgKEtFWSA9PT0gJ3NwbGl0JyAmJiAhU1BMSVRfV09SS1NfV0lUSF9PVkVSV1JJVFRFTl9FWEVDKVxuICApIHtcbiAgICB2YXIgbmF0aXZlUmVnRXhwTWV0aG9kID0gLy4vW1NZTUJPTF07XG4gICAgdmFyIGZucyA9IGV4ZWMoXG4gICAgICBkZWZpbmVkLFxuICAgICAgU1lNQk9MLFxuICAgICAgJydbS0VZXSxcbiAgICAgIGZ1bmN0aW9uIG1heWJlQ2FsbE5hdGl2ZShuYXRpdmVNZXRob2QsIHJlZ2V4cCwgc3RyLCBhcmcyLCBmb3JjZVN0cmluZ01ldGhvZCkge1xuICAgICAgICBpZiAocmVnZXhwLmV4ZWMgPT09IHJlZ2V4cEV4ZWMpIHtcbiAgICAgICAgICBpZiAoREVMRUdBVEVTX1RPX1NZTUJPTCAmJiAhZm9yY2VTdHJpbmdNZXRob2QpIHtcbiAgICAgICAgICAgIC8vIFRoZSBuYXRpdmUgU3RyaW5nIG1ldGhvZCBhbHJlYWR5IGRlbGVnYXRlcyB0byBAQG1ldGhvZCAodGhpc1xuICAgICAgICAgICAgLy8gcG9seWZpbGxlZCBmdW5jdGlvbiksIGxlYXNpbmcgdG8gaW5maW5pdGUgcmVjdXJzaW9uLlxuICAgICAgICAgICAgLy8gV2UgYXZvaWQgaXQgYnkgZGlyZWN0bHkgY2FsbGluZyB0aGUgbmF0aXZlIEBAbWV0aG9kIG1ldGhvZC5cbiAgICAgICAgICAgIHJldHVybiB7IGRvbmU6IHRydWUsIHZhbHVlOiBuYXRpdmVSZWdFeHBNZXRob2QuY2FsbChyZWdleHAsIHN0ciwgYXJnMikgfTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHsgZG9uZTogdHJ1ZSwgdmFsdWU6IG5hdGl2ZU1ldGhvZC5jYWxsKHN0ciwgcmVnZXhwLCBhcmcyKSB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGRvbmU6IGZhbHNlIH07XG4gICAgICB9XG4gICAgKTtcbiAgICB2YXIgc3RyZm4gPSBmbnNbMF07XG4gICAgdmFyIHJ4Zm4gPSBmbnNbMV07XG5cbiAgICByZWRlZmluZShTdHJpbmcucHJvdG90eXBlLCBLRVksIHN0cmZuKTtcbiAgICBoaWRlKFJlZ0V4cC5wcm90b3R5cGUsIFNZTUJPTCwgbGVuZ3RoID09IDJcbiAgICAgIC8vIDIxLjIuNS44IFJlZ0V4cC5wcm90b3R5cGVbQEByZXBsYWNlXShzdHJpbmcsIHJlcGxhY2VWYWx1ZSlcbiAgICAgIC8vIDIxLjIuNS4xMSBSZWdFeHAucHJvdG90eXBlW0BAc3BsaXRdKHN0cmluZywgbGltaXQpXG4gICAgICA/IGZ1bmN0aW9uIChzdHJpbmcsIGFyZykgeyByZXR1cm4gcnhmbi5jYWxsKHN0cmluZywgdGhpcywgYXJnKTsgfVxuICAgICAgLy8gMjEuMi41LjYgUmVnRXhwLnByb3RvdHlwZVtAQG1hdGNoXShzdHJpbmcpXG4gICAgICAvLyAyMS4yLjUuOSBSZWdFeHAucHJvdG90eXBlW0BAc2VhcmNoXShzdHJpbmcpXG4gICAgICA6IGZ1bmN0aW9uIChzdHJpbmcpIHsgcmV0dXJuIHJ4Zm4uY2FsbChzdHJpbmcsIHRoaXMpOyB9XG4gICAgKTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIDIxLjIuNS4zIGdldCBSZWdFeHAucHJvdG90eXBlLmZsYWdzXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkge1xuICB2YXIgdGhhdCA9IGFuT2JqZWN0KHRoaXMpO1xuICB2YXIgcmVzdWx0ID0gJyc7XG4gIGlmICh0aGF0Lmdsb2JhbCkgcmVzdWx0ICs9ICdnJztcbiAgaWYgKHRoYXQuaWdub3JlQ2FzZSkgcmVzdWx0ICs9ICdpJztcbiAgaWYgKHRoYXQubXVsdGlsaW5lKSByZXN1bHQgKz0gJ20nO1xuICBpZiAodGhhdC51bmljb2RlKSByZXN1bHQgKz0gJ3UnO1xuICBpZiAodGhhdC5zdGlja3kpIHJlc3VsdCArPSAneSc7XG4gIHJldHVybiByZXN1bHQ7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1mbGF0TWFwLyNzZWMtRmxhdHRlbkludG9BcnJheVxudmFyIGlzQXJyYXkgPSByZXF1aXJlKCcuL19pcy1hcnJheScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBJU19DT05DQVRfU1BSRUFEQUJMRSA9IHJlcXVpcmUoJy4vX3drcycpKCdpc0NvbmNhdFNwcmVhZGFibGUnKTtcblxuZnVuY3Rpb24gZmxhdHRlbkludG9BcnJheSh0YXJnZXQsIG9yaWdpbmFsLCBzb3VyY2UsIHNvdXJjZUxlbiwgc3RhcnQsIGRlcHRoLCBtYXBwZXIsIHRoaXNBcmcpIHtcbiAgdmFyIHRhcmdldEluZGV4ID0gc3RhcnQ7XG4gIHZhciBzb3VyY2VJbmRleCA9IDA7XG4gIHZhciBtYXBGbiA9IG1hcHBlciA/IGN0eChtYXBwZXIsIHRoaXNBcmcsIDMpIDogZmFsc2U7XG4gIHZhciBlbGVtZW50LCBzcHJlYWRhYmxlO1xuXG4gIHdoaWxlIChzb3VyY2VJbmRleCA8IHNvdXJjZUxlbikge1xuICAgIGlmIChzb3VyY2VJbmRleCBpbiBzb3VyY2UpIHtcbiAgICAgIGVsZW1lbnQgPSBtYXBGbiA/IG1hcEZuKHNvdXJjZVtzb3VyY2VJbmRleF0sIHNvdXJjZUluZGV4LCBvcmlnaW5hbCkgOiBzb3VyY2Vbc291cmNlSW5kZXhdO1xuXG4gICAgICBzcHJlYWRhYmxlID0gZmFsc2U7XG4gICAgICBpZiAoaXNPYmplY3QoZWxlbWVudCkpIHtcbiAgICAgICAgc3ByZWFkYWJsZSA9IGVsZW1lbnRbSVNfQ09OQ0FUX1NQUkVBREFCTEVdO1xuICAgICAgICBzcHJlYWRhYmxlID0gc3ByZWFkYWJsZSAhPT0gdW5kZWZpbmVkID8gISFzcHJlYWRhYmxlIDogaXNBcnJheShlbGVtZW50KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNwcmVhZGFibGUgJiYgZGVwdGggPiAwKSB7XG4gICAgICAgIHRhcmdldEluZGV4ID0gZmxhdHRlbkludG9BcnJheSh0YXJnZXQsIG9yaWdpbmFsLCBlbGVtZW50LCB0b0xlbmd0aChlbGVtZW50Lmxlbmd0aCksIHRhcmdldEluZGV4LCBkZXB0aCAtIDEpIC0gMTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICh0YXJnZXRJbmRleCA+PSAweDFmZmZmZmZmZmZmZmZmKSB0aHJvdyBUeXBlRXJyb3IoKTtcbiAgICAgICAgdGFyZ2V0W3RhcmdldEluZGV4XSA9IGVsZW1lbnQ7XG4gICAgICB9XG5cbiAgICAgIHRhcmdldEluZGV4Kys7XG4gICAgfVxuICAgIHNvdXJjZUluZGV4Kys7XG4gIH1cbiAgcmV0dXJuIHRhcmdldEluZGV4O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZsYXR0ZW5JbnRvQXJyYXk7XG4iLCJ2YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgY2FsbCA9IHJlcXVpcmUoJy4vX2l0ZXItY2FsbCcpO1xudmFyIGlzQXJyYXlJdGVyID0gcmVxdWlyZSgnLi9faXMtYXJyYXktaXRlcicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBnZXRJdGVyRm4gPSByZXF1aXJlKCcuL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpO1xudmFyIEJSRUFLID0ge307XG52YXIgUkVUVVJOID0ge307XG52YXIgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhYmxlLCBlbnRyaWVzLCBmbiwgdGhhdCwgSVRFUkFUT1IpIHtcbiAgdmFyIGl0ZXJGbiA9IElURVJBVE9SID8gZnVuY3Rpb24gKCkgeyByZXR1cm4gaXRlcmFibGU7IH0gOiBnZXRJdGVyRm4oaXRlcmFibGUpO1xuICB2YXIgZiA9IGN0eChmbiwgdGhhdCwgZW50cmllcyA/IDIgOiAxKTtcbiAgdmFyIGluZGV4ID0gMDtcbiAgdmFyIGxlbmd0aCwgc3RlcCwgaXRlcmF0b3IsIHJlc3VsdDtcbiAgaWYgKHR5cGVvZiBpdGVyRm4gIT0gJ2Z1bmN0aW9uJykgdGhyb3cgVHlwZUVycm9yKGl0ZXJhYmxlICsgJyBpcyBub3QgaXRlcmFibGUhJyk7XG4gIC8vIGZhc3QgY2FzZSBmb3IgYXJyYXlzIHdpdGggZGVmYXVsdCBpdGVyYXRvclxuICBpZiAoaXNBcnJheUl0ZXIoaXRlckZuKSkgZm9yIChsZW5ndGggPSB0b0xlbmd0aChpdGVyYWJsZS5sZW5ndGgpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKykge1xuICAgIHJlc3VsdCA9IGVudHJpZXMgPyBmKGFuT2JqZWN0KHN0ZXAgPSBpdGVyYWJsZVtpbmRleF0pWzBdLCBzdGVwWzFdKSA6IGYoaXRlcmFibGVbaW5kZXhdKTtcbiAgICBpZiAocmVzdWx0ID09PSBCUkVBSyB8fCByZXN1bHQgPT09IFJFVFVSTikgcmV0dXJuIHJlc3VsdDtcbiAgfSBlbHNlIGZvciAoaXRlcmF0b3IgPSBpdGVyRm4uY2FsbChpdGVyYWJsZSk7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTspIHtcbiAgICByZXN1bHQgPSBjYWxsKGl0ZXJhdG9yLCBmLCBzdGVwLnZhbHVlLCBlbnRyaWVzKTtcbiAgICBpZiAocmVzdWx0ID09PSBCUkVBSyB8fCByZXN1bHQgPT09IFJFVFVSTikgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcbmV4cG9ydHMuQlJFQUsgPSBCUkVBSztcbmV4cG9ydHMuUkVUVVJOID0gUkVUVVJOO1xuIiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgnbmF0aXZlLWZ1bmN0aW9uLXRvLXN0cmluZycsIEZ1bmN0aW9uLnRvU3RyaW5nKTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy84NiNpc3N1ZWNvbW1lbnQtMTE1NzU5MDI4XG52YXIgZ2xvYmFsID0gbW9kdWxlLmV4cG9ydHMgPSB0eXBlb2Ygd2luZG93ICE9ICd1bmRlZmluZWQnICYmIHdpbmRvdy5NYXRoID09IE1hdGhcbiAgPyB3aW5kb3cgOiB0eXBlb2Ygc2VsZiAhPSAndW5kZWZpbmVkJyAmJiBzZWxmLk1hdGggPT0gTWF0aCA/IHNlbGZcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLW5ldy1mdW5jXG4gIDogRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbmlmICh0eXBlb2YgX19nID09ICdudW1iZXInKSBfX2cgPSBnbG9iYWw7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW5kZWZcbiIsInZhciBoYXNPd25Qcm9wZXJ0eSA9IHt9Lmhhc093blByb3BlcnR5O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIGtleSkge1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07XG4iLCJ2YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gZnVuY3Rpb24gKG9iamVjdCwga2V5LCB2YWx1ZSkge1xuICByZXR1cm4gZFAuZihvYmplY3QsIGtleSwgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xufSA6IGZ1bmN0aW9uIChvYmplY3QsIGtleSwgdmFsdWUpIHtcbiAgb2JqZWN0W2tleV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iamVjdDtcbn07XG4iLCJ2YXIgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudDtcbm1vZHVsZS5leHBvcnRzID0gZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuIiwibW9kdWxlLmV4cG9ydHMgPSAhcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkocmVxdWlyZSgnLi9fZG9tLWNyZWF0ZScpKCdkaXYnKSwgJ2EnLCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gNzsgfSB9KS5hICE9IDc7XG59KTtcbiIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIHNldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fc2V0LXByb3RvJykuc2V0O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGhhdCwgdGFyZ2V0LCBDKSB7XG4gIHZhciBTID0gdGFyZ2V0LmNvbnN0cnVjdG9yO1xuICB2YXIgUDtcbiAgaWYgKFMgIT09IEMgJiYgdHlwZW9mIFMgPT0gJ2Z1bmN0aW9uJyAmJiAoUCA9IFMucHJvdG90eXBlKSAhPT0gQy5wcm90b3R5cGUgJiYgaXNPYmplY3QoUCkgJiYgc2V0UHJvdG90eXBlT2YpIHtcbiAgICBzZXRQcm90b3R5cGVPZih0aGF0LCBQKTtcbiAgfSByZXR1cm4gdGhhdDtcbn07XG4iLCIvLyBmYXN0IGFwcGx5LCBodHRwOi8vanNwZXJmLmxua2l0LmNvbS9mYXN0LWFwcGx5LzVcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGZuLCBhcmdzLCB0aGF0KSB7XG4gIHZhciB1biA9IHRoYXQgPT09IHVuZGVmaW5lZDtcbiAgc3dpdGNoIChhcmdzLmxlbmd0aCkge1xuICAgIGNhc2UgMDogcmV0dXJuIHVuID8gZm4oKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0KTtcbiAgICBjYXNlIDE6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICBjYXNlIDQ6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICB9IHJldHVybiBmbi5hcHBseSh0aGF0LCBhcmdzKTtcbn07XG4iLCIvLyBmYWxsYmFjayBmb3Igbm9uLWFycmF5LWxpa2UgRVMzIGFuZCBub24tZW51bWVyYWJsZSBvbGQgVjggc3RyaW5nc1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QoJ3onKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKSA/IE9iamVjdCA6IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG59O1xuIiwiLy8gY2hlY2sgb24gZGVmYXVsdCBBcnJheSBpdGVyYXRvclxudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyIElURVJBVE9SID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyk7XG52YXIgQXJyYXlQcm90byA9IEFycmF5LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b1tJVEVSQVRPUl0gPT09IGl0KTtcbn07XG4iLCIvLyA3LjIuMiBJc0FycmF5KGFyZ3VtZW50KVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIGlzQXJyYXkoYXJnKSB7XG4gIHJldHVybiBjb2YoYXJnKSA9PSAnQXJyYXknO1xufTtcbiIsIi8vIDIwLjEuMi4zIE51bWJlci5pc0ludGVnZXIobnVtYmVyKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0ludGVnZXIoaXQpIHtcbiAgcmV0dXJuICFpc09iamVjdChpdCkgJiYgaXNGaW5pdGUoaXQpICYmIGZsb29yKGl0KSA9PT0gaXQ7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PT0gJ29iamVjdCcgPyBpdCAhPT0gbnVsbCA6IHR5cGVvZiBpdCA9PT0gJ2Z1bmN0aW9uJztcbn07XG4iLCIvLyA3LjIuOCBJc1JlZ0V4cChhcmd1bWVudClcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpO1xudmFyIE1BVENIID0gcmVxdWlyZSgnLi9fd2tzJykoJ21hdGNoJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICB2YXIgaXNSZWdFeHA7XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgKChpc1JlZ0V4cCA9IGl0W01BVENIXSkgIT09IHVuZGVmaW5lZCA/ICEhaXNSZWdFeHAgOiBjb2YoaXQpID09ICdSZWdFeHAnKTtcbn07XG4iLCIvLyBjYWxsIHNvbWV0aGluZyBvbiBpdGVyYXRvciBzdGVwIHdpdGggc2FmZSBjbG9zaW5nIG9uIGVycm9yXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0ZXJhdG9yLCBmbiwgdmFsdWUsIGVudHJpZXMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZW50cmllcyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICAvLyA3LjQuNiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCBjb21wbGV0aW9uKVxuICB9IGNhdGNoIChlKSB7XG4gICAgdmFyIHJldCA9IGl0ZXJhdG9yWydyZXR1cm4nXTtcbiAgICBpZiAocmV0ICE9PSB1bmRlZmluZWQpIGFuT2JqZWN0KHJldC5jYWxsKGl0ZXJhdG9yKSk7XG4gICAgdGhyb3cgZTtcbiAgfVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBjcmVhdGUgPSByZXF1aXJlKCcuL19vYmplY3QtY3JlYXRlJyk7XG52YXIgZGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblxuLy8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2hpZGUnKShJdGVyYXRvclByb3RvdHlwZSwgcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyksIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXM7IH0pO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCkge1xuICBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgPSBjcmVhdGUoSXRlcmF0b3JQcm90b3R5cGUsIHsgbmV4dDogZGVzY3JpcHRvcigxLCBuZXh0KSB9KTtcbiAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIE5BTUUgKyAnIEl0ZXJhdG9yJyk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIExJQlJBUlkgPSByZXF1aXJlKCcuL19saWJyYXJ5Jyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xudmFyICRpdGVyQ3JlYXRlID0gcmVxdWlyZSgnLi9faXRlci1jcmVhdGUnKTtcbnZhciBzZXRUb1N0cmluZ1RhZyA9IHJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBCVUdHWSA9ICEoW10ua2V5cyAmJiAnbmV4dCcgaW4gW10ua2V5cygpKTsgLy8gU2FmYXJpIGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxudmFyIEZGX0lURVJBVE9SID0gJ0BAaXRlcmF0b3InO1xudmFyIEtFWVMgPSAna2V5cyc7XG52YXIgVkFMVUVTID0gJ3ZhbHVlcyc7XG5cbnZhciByZXR1cm5UaGlzID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQmFzZSwgTkFNRSwgQ29uc3RydWN0b3IsIG5leHQsIERFRkFVTFQsIElTX1NFVCwgRk9SQ0VEKSB7XG4gICRpdGVyQ3JlYXRlKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcbiAgdmFyIGdldE1ldGhvZCA9IGZ1bmN0aW9uIChraW5kKSB7XG4gICAgaWYgKCFCVUdHWSAmJiBraW5kIGluIHByb3RvKSByZXR1cm4gcHJvdG9ba2luZF07XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCkgeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgICAgY2FzZSBWQUxVRVM6IHJldHVybiBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgfSByZXR1cm4gZnVuY3Rpb24gZW50cmllcygpIHsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgfTtcbiAgdmFyIFRBRyA9IE5BTUUgKyAnIEl0ZXJhdG9yJztcbiAgdmFyIERFRl9WQUxVRVMgPSBERUZBVUxUID09IFZBTFVFUztcbiAgdmFyIFZBTFVFU19CVUcgPSBmYWxzZTtcbiAgdmFyIHByb3RvID0gQmFzZS5wcm90b3R5cGU7XG4gIHZhciAkbmF0aXZlID0gcHJvdG9bSVRFUkFUT1JdIHx8IHByb3RvW0ZGX0lURVJBVE9SXSB8fCBERUZBVUxUICYmIHByb3RvW0RFRkFVTFRdO1xuICB2YXIgJGRlZmF1bHQgPSAkbmF0aXZlIHx8IGdldE1ldGhvZChERUZBVUxUKTtcbiAgdmFyICRlbnRyaWVzID0gREVGQVVMVCA/ICFERUZfVkFMVUVTID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoJ2VudHJpZXMnKSA6IHVuZGVmaW5lZDtcbiAgdmFyICRhbnlOYXRpdmUgPSBOQU1FID09ICdBcnJheScgPyBwcm90by5lbnRyaWVzIHx8ICRuYXRpdmUgOiAkbmF0aXZlO1xuICB2YXIgbWV0aG9kcywga2V5LCBJdGVyYXRvclByb3RvdHlwZTtcbiAgLy8gRml4IG5hdGl2ZVxuICBpZiAoJGFueU5hdGl2ZSkge1xuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoJGFueU5hdGl2ZS5jYWxsKG5ldyBCYXNlKCkpKTtcbiAgICBpZiAoSXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUgJiYgSXRlcmF0b3JQcm90b3R5cGUubmV4dCkge1xuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JQcm90b3R5cGUsIFRBRywgdHJ1ZSk7XG4gICAgICAvLyBmaXggZm9yIHNvbWUgb2xkIGVuZ2luZXNcbiAgICAgIGlmICghTElCUkFSWSAmJiB0eXBlb2YgSXRlcmF0b3JQcm90b3R5cGVbSVRFUkFUT1JdICE9ICdmdW5jdGlvbicpIGhpZGUoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SLCByZXR1cm5UaGlzKTtcbiAgICB9XG4gIH1cbiAgLy8gZml4IEFycmF5I3t2YWx1ZXMsIEBAaXRlcmF0b3J9Lm5hbWUgaW4gVjggLyBGRlxuICBpZiAoREVGX1ZBTFVFUyAmJiAkbmF0aXZlICYmICRuYXRpdmUubmFtZSAhPT0gVkFMVUVTKSB7XG4gICAgVkFMVUVTX0JVRyA9IHRydWU7XG4gICAgJGRlZmF1bHQgPSBmdW5jdGlvbiB2YWx1ZXMoKSB7IHJldHVybiAkbmF0aXZlLmNhbGwodGhpcyk7IH07XG4gIH1cbiAgLy8gRGVmaW5lIGl0ZXJhdG9yXG4gIGlmICgoIUxJQlJBUlkgfHwgRk9SQ0VEKSAmJiAoQlVHR1kgfHwgVkFMVUVTX0JVRyB8fCAhcHJvdG9bSVRFUkFUT1JdKSkge1xuICAgIGhpZGUocHJvdG8sIElURVJBVE9SLCAkZGVmYXVsdCk7XG4gIH1cbiAgLy8gUGx1ZyBmb3IgbGlicmFyeVxuICBJdGVyYXRvcnNbTkFNRV0gPSAkZGVmYXVsdDtcbiAgSXRlcmF0b3JzW1RBR10gPSByZXR1cm5UaGlzO1xuICBpZiAoREVGQVVMVCkge1xuICAgIG1ldGhvZHMgPSB7XG4gICAgICB2YWx1ZXM6IERFRl9WQUxVRVMgPyAkZGVmYXVsdCA6IGdldE1ldGhvZChWQUxVRVMpLFxuICAgICAga2V5czogSVNfU0VUID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiAkZW50cmllc1xuICAgIH07XG4gICAgaWYgKEZPUkNFRCkgZm9yIChrZXkgaW4gbWV0aG9kcykge1xuICAgICAgaWYgKCEoa2V5IGluIHByb3RvKSkgcmVkZWZpbmUocHJvdG8sIGtleSwgbWV0aG9kc1trZXldKTtcbiAgICB9IGVsc2UgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoQlVHR1kgfHwgVkFMVUVTX0JVRyksIE5BTUUsIG1ldGhvZHMpO1xuICB9XG4gIHJldHVybiBtZXRob2RzO1xufTtcbiIsInZhciBJVEVSQVRPUiA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpO1xudmFyIFNBRkVfQ0xPU0lORyA9IGZhbHNlO1xuXG50cnkge1xuICB2YXIgcml0ZXIgPSBbN11bSVRFUkFUT1JdKCk7XG4gIHJpdGVyWydyZXR1cm4nXSA9IGZ1bmN0aW9uICgpIHsgU0FGRV9DTE9TSU5HID0gdHJ1ZTsgfTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXRocm93LWxpdGVyYWxcbiAgQXJyYXkuZnJvbShyaXRlciwgZnVuY3Rpb24gKCkgeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChleGVjLCBza2lwQ2xvc2luZykge1xuICBpZiAoIXNraXBDbG9zaW5nICYmICFTQUZFX0NMT1NJTkcpIHJldHVybiBmYWxzZTtcbiAgdmFyIHNhZmUgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gWzddO1xuICAgIHZhciBpdGVyID0gYXJyW0lURVJBVE9SXSgpO1xuICAgIGl0ZXIubmV4dCA9IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHsgZG9uZTogc2FmZSA9IHRydWUgfTsgfTtcbiAgICBhcnJbSVRFUkFUT1JdID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gaXRlcjsgfTtcbiAgICBleGVjKGFycik7XG4gIH0gY2F0Y2ggKGUpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gc2FmZTtcbn07XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChkb25lLCB2YWx1ZSkge1xuICByZXR1cm4geyB2YWx1ZTogdmFsdWUsIGRvbmU6ICEhZG9uZSB9O1xufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge307XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZhbHNlO1xuIiwiLy8gMjAuMi4yLjE0IE1hdGguZXhwbTEoeClcbnZhciAkZXhwbTEgPSBNYXRoLmV4cG0xO1xubW9kdWxlLmV4cG9ydHMgPSAoISRleHBtMVxuICAvLyBPbGQgRkYgYnVnXG4gIHx8ICRleHBtMSgxMCkgPiAyMjAyNS40NjU3OTQ4MDY3MTkgfHwgJGV4cG0xKDEwKSA8IDIyMDI1LjQ2NTc5NDgwNjcxNjUxNjhcbiAgLy8gVG9yIEJyb3dzZXIgYnVnXG4gIHx8ICRleHBtMSgtMmUtMTcpICE9IC0yZS0xN1xuKSA/IGZ1bmN0aW9uIGV4cG0xKHgpIHtcbiAgcmV0dXJuICh4ID0gK3gpID09IDAgPyB4IDogeCA+IC0xZS02ICYmIHggPCAxZS02ID8geCArIHggKiB4IC8gMiA6IE1hdGguZXhwKHgpIC0gMTtcbn0gOiAkZXhwbTE7XG4iLCIvLyAyMC4yLjIuMTYgTWF0aC5mcm91bmQoeClcbnZhciBzaWduID0gcmVxdWlyZSgnLi9fbWF0aC1zaWduJyk7XG52YXIgcG93ID0gTWF0aC5wb3c7XG52YXIgRVBTSUxPTiA9IHBvdygyLCAtNTIpO1xudmFyIEVQU0lMT04zMiA9IHBvdygyLCAtMjMpO1xudmFyIE1BWDMyID0gcG93KDIsIDEyNykgKiAoMiAtIEVQU0lMT04zMik7XG52YXIgTUlOMzIgPSBwb3coMiwgLTEyNik7XG5cbnZhciByb3VuZFRpZXNUb0V2ZW4gPSBmdW5jdGlvbiAobikge1xuICByZXR1cm4gbiArIDEgLyBFUFNJTE9OIC0gMSAvIEVQU0lMT047XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGguZnJvdW5kIHx8IGZ1bmN0aW9uIGZyb3VuZCh4KSB7XG4gIHZhciAkYWJzID0gTWF0aC5hYnMoeCk7XG4gIHZhciAkc2lnbiA9IHNpZ24oeCk7XG4gIHZhciBhLCByZXN1bHQ7XG4gIGlmICgkYWJzIDwgTUlOMzIpIHJldHVybiAkc2lnbiAqIHJvdW5kVGllc1RvRXZlbigkYWJzIC8gTUlOMzIgLyBFUFNJTE9OMzIpICogTUlOMzIgKiBFUFNJTE9OMzI7XG4gIGEgPSAoMSArIEVQU0lMT04zMiAvIEVQU0lMT04pICogJGFicztcbiAgcmVzdWx0ID0gYSAtIChhIC0gJGFicyk7XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgaWYgKHJlc3VsdCA+IE1BWDMyIHx8IHJlc3VsdCAhPSByZXN1bHQpIHJldHVybiAkc2lnbiAqIEluZmluaXR5O1xuICByZXR1cm4gJHNpZ24gKiByZXN1bHQ7XG59O1xuIiwiLy8gMjAuMi4yLjIwIE1hdGgubG9nMXAoeClcbm1vZHVsZS5leHBvcnRzID0gTWF0aC5sb2cxcCB8fCBmdW5jdGlvbiBsb2cxcCh4KSB7XG4gIHJldHVybiAoeCA9ICt4KSA+IC0xZS04ICYmIHggPCAxZS04ID8geCAtIHggKiB4IC8gMiA6IE1hdGgubG9nKDEgKyB4KTtcbn07XG4iLCIvLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGguc2NhbGUgfHwgZnVuY3Rpb24gc2NhbGUoeCwgaW5Mb3csIGluSGlnaCwgb3V0TG93LCBvdXRIaWdoKSB7XG4gIGlmIChcbiAgICBhcmd1bWVudHMubGVuZ3RoID09PSAwXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICB8fCB4ICE9IHhcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICAgIHx8IGluTG93ICE9IGluTG93XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICB8fCBpbkhpZ2ggIT0gaW5IaWdoXG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICB8fCBvdXRMb3cgIT0gb3V0TG93XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgICB8fCBvdXRIaWdoICE9IG91dEhpZ2hcbiAgKSByZXR1cm4gTmFOO1xuICBpZiAoeCA9PT0gSW5maW5pdHkgfHwgeCA9PT0gLUluZmluaXR5KSByZXR1cm4geDtcbiAgcmV0dXJuICh4IC0gaW5Mb3cpICogKG91dEhpZ2ggLSBvdXRMb3cpIC8gKGluSGlnaCAtIGluTG93KSArIG91dExvdztcbn07XG4iLCIvLyAyMC4yLjIuMjggTWF0aC5zaWduKHgpXG5tb2R1bGUuZXhwb3J0cyA9IE1hdGguc2lnbiB8fCBmdW5jdGlvbiBzaWduKHgpIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICByZXR1cm4gKHggPSAreCkgPT0gMCB8fCB4ICE9IHggPyB4IDogeCA8IDAgPyAtMSA6IDE7XG59O1xuIiwidmFyIE1FVEEgPSByZXF1aXJlKCcuL191aWQnKSgnbWV0YScpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgc2V0RGVzYyA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgaWQgPSAwO1xudmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGUgfHwgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gdHJ1ZTtcbn07XG52YXIgRlJFRVpFID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gaXNFeHRlbnNpYmxlKE9iamVjdC5wcmV2ZW50RXh0ZW5zaW9ucyh7fSkpO1xufSk7XG52YXIgc2V0TWV0YSA9IGZ1bmN0aW9uIChpdCkge1xuICBzZXREZXNjKGl0LCBNRVRBLCB7IHZhbHVlOiB7XG4gICAgaTogJ08nICsgKytpZCwgLy8gb2JqZWN0IElEXG4gICAgdzoge30gICAgICAgICAgLy8gd2VhayBjb2xsZWN0aW9ucyBJRHNcbiAgfSB9KTtcbn07XG52YXIgZmFzdEtleSA9IGZ1bmN0aW9uIChpdCwgY3JlYXRlKSB7XG4gIC8vIHJldHVybiBwcmltaXRpdmUgd2l0aCBwcmVmaXhcbiAgaWYgKCFpc09iamVjdChpdCkpIHJldHVybiB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6ICh0eXBlb2YgaXQgPT0gJ3N0cmluZycgPyAnUycgOiAnUCcpICsgaXQ7XG4gIGlmICghaGFzKGl0LCBNRVRBKSkge1xuICAgIC8vIGNhbid0IHNldCBtZXRhZGF0YSB0byB1bmNhdWdodCBmcm96ZW4gb2JqZWN0XG4gICAgaWYgKCFpc0V4dGVuc2libGUoaXQpKSByZXR1cm4gJ0YnO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiAnRSc7XG4gICAgLy8gYWRkIG1pc3NpbmcgbWV0YWRhdGFcbiAgICBzZXRNZXRhKGl0KTtcbiAgLy8gcmV0dXJuIG9iamVjdCBJRFxuICB9IHJldHVybiBpdFtNRVRBXS5pO1xufTtcbnZhciBnZXRXZWFrID0gZnVuY3Rpb24gKGl0LCBjcmVhdGUpIHtcbiAgaWYgKCFoYXMoaXQsIE1FVEEpKSB7XG4gICAgLy8gY2FuJ3Qgc2V0IG1ldGFkYXRhIHRvIHVuY2F1Z2h0IGZyb3plbiBvYmplY3RcbiAgICBpZiAoIWlzRXh0ZW5zaWJsZShpdCkpIHJldHVybiB0cnVlO1xuICAgIC8vIG5vdCBuZWNlc3NhcnkgdG8gYWRkIG1ldGFkYXRhXG4gICAgaWYgKCFjcmVhdGUpIHJldHVybiBmYWxzZTtcbiAgICAvLyBhZGQgbWlzc2luZyBtZXRhZGF0YVxuICAgIHNldE1ldGEoaXQpO1xuICAvLyByZXR1cm4gaGFzaCB3ZWFrIGNvbGxlY3Rpb25zIElEc1xuICB9IHJldHVybiBpdFtNRVRBXS53O1xufTtcbi8vIGFkZCBtZXRhZGF0YSBvbiBmcmVlemUtZmFtaWx5IG1ldGhvZHMgY2FsbGluZ1xudmFyIG9uRnJlZXplID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChGUkVFWkUgJiYgbWV0YS5ORUVEICYmIGlzRXh0ZW5zaWJsZShpdCkgJiYgIWhhcyhpdCwgTUVUQSkpIHNldE1ldGEoaXQpO1xuICByZXR1cm4gaXQ7XG59O1xudmFyIG1ldGEgPSBtb2R1bGUuZXhwb3J0cyA9IHtcbiAgS0VZOiBNRVRBLFxuICBORUVEOiBmYWxzZSxcbiAgZmFzdEtleTogZmFzdEtleSxcbiAgZ2V0V2VhazogZ2V0V2VhayxcbiAgb25GcmVlemU6IG9uRnJlZXplXG59O1xuIiwidmFyIE1hcCA9IHJlcXVpcmUoJy4vZXM2Lm1hcCcpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBzaGFyZWQgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgnbWV0YWRhdGEnKTtcbnZhciBzdG9yZSA9IHNoYXJlZC5zdG9yZSB8fCAoc2hhcmVkLnN0b3JlID0gbmV3IChyZXF1aXJlKCcuL2VzNi53ZWFrLW1hcCcpKSgpKTtcblxudmFyIGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAgPSBmdW5jdGlvbiAodGFyZ2V0LCB0YXJnZXRLZXksIGNyZWF0ZSkge1xuICB2YXIgdGFyZ2V0TWV0YWRhdGEgPSBzdG9yZS5nZXQodGFyZ2V0KTtcbiAgaWYgKCF0YXJnZXRNZXRhZGF0YSkge1xuICAgIGlmICghY3JlYXRlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHN0b3JlLnNldCh0YXJnZXQsIHRhcmdldE1ldGFkYXRhID0gbmV3IE1hcCgpKTtcbiAgfVxuICB2YXIga2V5TWV0YWRhdGEgPSB0YXJnZXRNZXRhZGF0YS5nZXQodGFyZ2V0S2V5KTtcbiAgaWYgKCFrZXlNZXRhZGF0YSkge1xuICAgIGlmICghY3JlYXRlKSByZXR1cm4gdW5kZWZpbmVkO1xuICAgIHRhcmdldE1ldGFkYXRhLnNldCh0YXJnZXRLZXksIGtleU1ldGFkYXRhID0gbmV3IE1hcCgpKTtcbiAgfSByZXR1cm4ga2V5TWV0YWRhdGE7XG59O1xudmFyIG9yZGluYXJ5SGFzT3duTWV0YWRhdGEgPSBmdW5jdGlvbiAoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgdmFyIG1ldGFkYXRhTWFwID0gZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCBmYWxzZSk7XG4gIHJldHVybiBtZXRhZGF0YU1hcCA9PT0gdW5kZWZpbmVkID8gZmFsc2UgOiBtZXRhZGF0YU1hcC5oYXMoTWV0YWRhdGFLZXkpO1xufTtcbnZhciBvcmRpbmFyeUdldE93bk1ldGFkYXRhID0gZnVuY3Rpb24gKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gIHZhciBtZXRhZGF0YU1hcCA9IGdldE9yQ3JlYXRlTWV0YWRhdGFNYXAoTywgUCwgZmFsc2UpO1xuICByZXR1cm4gbWV0YWRhdGFNYXAgPT09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IG1ldGFkYXRhTWFwLmdldChNZXRhZGF0YUtleSk7XG59O1xudmFyIG9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEgPSBmdW5jdGlvbiAoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUsIE8sIFApIHtcbiAgZ2V0T3JDcmVhdGVNZXRhZGF0YU1hcChPLCBQLCB0cnVlKS5zZXQoTWV0YWRhdGFLZXksIE1ldGFkYXRhVmFsdWUpO1xufTtcbnZhciBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHRhcmdldEtleSkge1xuICB2YXIgbWV0YWRhdGFNYXAgPSBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKHRhcmdldCwgdGFyZ2V0S2V5LCBmYWxzZSk7XG4gIHZhciBrZXlzID0gW107XG4gIGlmIChtZXRhZGF0YU1hcCkgbWV0YWRhdGFNYXAuZm9yRWFjaChmdW5jdGlvbiAoXywga2V5KSB7IGtleXMucHVzaChrZXkpOyB9KTtcbiAgcmV0dXJuIGtleXM7XG59O1xudmFyIHRvTWV0YUtleSA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgaXQgPT0gJ3N5bWJvbCcgPyBpdCA6IFN0cmluZyhpdCk7XG59O1xudmFyIGV4cCA9IGZ1bmN0aW9uIChPKSB7XG4gICRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIE8pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHN0b3JlOiBzdG9yZSxcbiAgbWFwOiBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwLFxuICBoYXM6IG9yZGluYXJ5SGFzT3duTWV0YWRhdGEsXG4gIGdldDogb3JkaW5hcnlHZXRPd25NZXRhZGF0YSxcbiAgc2V0OiBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhLFxuICBrZXlzOiBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyxcbiAga2V5OiB0b01ldGFLZXksXG4gIGV4cDogZXhwXG59O1xuIiwidmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIG1hY3JvdGFzayA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXQ7XG52YXIgT2JzZXJ2ZXIgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgUHJvbWlzZSA9IGdsb2JhbC5Qcm9taXNlO1xudmFyIGlzTm9kZSA9IHJlcXVpcmUoJy4vX2NvZicpKHByb2Nlc3MpID09ICdwcm9jZXNzJztcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBoZWFkLCBsYXN0LCBub3RpZnk7XG5cbiAgdmFyIGZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIHZhciBwYXJlbnQsIGZuO1xuICAgIGlmIChpc05vZGUgJiYgKHBhcmVudCA9IHByb2Nlc3MuZG9tYWluKSkgcGFyZW50LmV4aXQoKTtcbiAgICB3aGlsZSAoaGVhZCkge1xuICAgICAgZm4gPSBoZWFkLmZuO1xuICAgICAgaGVhZCA9IGhlYWQubmV4dDtcbiAgICAgIHRyeSB7XG4gICAgICAgIGZuKCk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGlmIChoZWFkKSBub3RpZnkoKTtcbiAgICAgICAgZWxzZSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0gbGFzdCA9IHVuZGVmaW5lZDtcbiAgICBpZiAocGFyZW50KSBwYXJlbnQuZW50ZXIoKTtcbiAgfTtcblxuICAvLyBOb2RlLmpzXG4gIGlmIChpc05vZGUpIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXIsIGV4Y2VwdCBpT1MgU2FmYXJpIC0gaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzMzOVxuICB9IGVsc2UgaWYgKE9ic2VydmVyICYmICEoZ2xvYmFsLm5hdmlnYXRvciAmJiBnbG9iYWwubmF2aWdhdG9yLnN0YW5kYWxvbmUpKSB7XG4gICAgdmFyIHRvZ2dsZSA9IHRydWU7XG4gICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgbmV3IE9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHsgY2hhcmFjdGVyRGF0YTogdHJ1ZSB9KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICBub3RpZnkgPSBmdW5jdGlvbiAoKSB7XG4gICAgICBub2RlLmRhdGEgPSB0b2dnbGUgPSAhdG9nZ2xlO1xuICAgIH07XG4gIC8vIGVudmlyb25tZW50cyB3aXRoIG1heWJlIG5vbi1jb21wbGV0ZWx5IGNvcnJlY3QsIGJ1dCBleGlzdGVudCBQcm9taXNlXG4gIH0gZWxzZSBpZiAoUHJvbWlzZSAmJiBQcm9taXNlLnJlc29sdmUpIHtcbiAgICAvLyBQcm9taXNlLnJlc29sdmUgd2l0aG91dCBhbiBhcmd1bWVudCB0aHJvd3MgYW4gZXJyb3IgaW4gTEcgV2ViT1MgMlxuICAgIHZhciBwcm9taXNlID0gUHJvbWlzZS5yZXNvbHZlKHVuZGVmaW5lZCk7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgcHJvbWlzZS50aGVuKGZsdXNoKTtcbiAgICB9O1xuICAvLyBmb3Igb3RoZXIgZW52aXJvbm1lbnRzIC0gbWFjcm90YXNrIGJhc2VkIG9uOlxuICAvLyAtIHNldEltbWVkaWF0ZVxuICAvLyAtIE1lc3NhZ2VDaGFubmVsXG4gIC8vIC0gd2luZG93LnBvc3RNZXNzYWdcbiAgLy8gLSBvbnJlYWR5c3RhdGVjaGFuZ2VcbiAgLy8gLSBzZXRUaW1lb3V0XG4gIH0gZWxzZSB7XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24gKCkge1xuICAgICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgICAgbWFjcm90YXNrLmNhbGwoZ2xvYmFsLCBmbHVzaCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbiAoZm4pIHtcbiAgICB2YXIgdGFzayA9IHsgZm46IGZuLCBuZXh0OiB1bmRlZmluZWQgfTtcbiAgICBpZiAobGFzdCkgbGFzdC5uZXh0ID0gdGFzaztcbiAgICBpZiAoIWhlYWQpIHtcbiAgICAgIGhlYWQgPSB0YXNrO1xuICAgICAgbm90aWZ5KCk7XG4gICAgfSBsYXN0ID0gdGFzaztcbiAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyAyNS40LjEuNSBOZXdQcm9taXNlQ2FwYWJpbGl0eShDKVxudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcblxuZnVuY3Rpb24gUHJvbWlzZUNhcGFiaWxpdHkoQykge1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbiAoJCRyZXNvbHZlLCAkJHJlamVjdCkge1xuICAgIGlmIChyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpIHRocm93IFR5cGVFcnJvcignQmFkIFByb21pc2UgY29uc3RydWN0b3InKTtcbiAgICByZXNvbHZlID0gJCRyZXNvbHZlO1xuICAgIHJlamVjdCA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUZ1bmN0aW9uKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCA9IGFGdW5jdGlvbihyZWplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gKEMpIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlQ2FwYWJpbGl0eShDKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyAxOS4xLjIuMSBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlLCAuLi4pXG52YXIgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpO1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xudmFyIGdPUFMgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpO1xudmFyIHBJRSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0Jyk7XG52YXIgJGFzc2lnbiA9IE9iamVjdC5hc3NpZ247XG5cbi8vIHNob3VsZCB3b3JrIHdpdGggc3ltYm9scyBhbmQgc2hvdWxkIGhhdmUgZGV0ZXJtaW5pc3RpYyBwcm9wZXJ0eSBvcmRlciAoVjggYnVnKVxubW9kdWxlLmV4cG9ydHMgPSAhJGFzc2lnbiB8fCByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgdmFyIEEgPSB7fTtcbiAgdmFyIEIgPSB7fTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gIHZhciBTID0gU3ltYm9sKCk7XG4gIHZhciBLID0gJ2FiY2RlZmdoaWprbG1ub3BxcnN0JztcbiAgQVtTXSA9IDc7XG4gIEsuc3BsaXQoJycpLmZvckVhY2goZnVuY3Rpb24gKGspIHsgQltrXSA9IGs7IH0pO1xuICByZXR1cm4gJGFzc2lnbih7fSwgQSlbU10gIT0gNyB8fCBPYmplY3Qua2V5cygkYXNzaWduKHt9LCBCKSkuam9pbignJykgIT0gSztcbn0pID8gZnVuY3Rpb24gYXNzaWduKHRhcmdldCwgc291cmNlKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgdmFyIFQgPSB0b09iamVjdCh0YXJnZXQpO1xuICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gIHZhciBpbmRleCA9IDE7XG4gIHZhciBnZXRTeW1ib2xzID0gZ09QUy5mO1xuICB2YXIgaXNFbnVtID0gcElFLmY7XG4gIHdoaWxlIChhTGVuID4gaW5kZXgpIHtcbiAgICB2YXIgUyA9IElPYmplY3QoYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICB2YXIga2V5cyA9IGdldFN5bWJvbHMgPyBnZXRLZXlzKFMpLmNvbmNhdChnZXRTeW1ib2xzKFMpKSA6IGdldEtleXMoUyk7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBqID0gMDtcbiAgICB2YXIga2V5O1xuICAgIHdoaWxlIChsZW5ndGggPiBqKSB7XG4gICAgICBrZXkgPSBrZXlzW2orK107XG4gICAgICBpZiAoIURFU0NSSVBUT1JTIHx8IGlzRW51bS5jYWxsKFMsIGtleSkpIFRba2V5XSA9IFNba2V5XTtcbiAgICB9XG4gIH0gcmV0dXJuIFQ7XG59IDogJGFzc2lnbjtcbiIsIi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgZFBzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwcycpO1xudmFyIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xudmFyIEVtcHR5ID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uICgpIHtcbiAgLy8gVGhyYXNoLCB3YXN0ZSBhbmQgc29kb215OiBJRSBHQyBidWdcbiAgdmFyIGlmcmFtZSA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKSgnaWZyYW1lJyk7XG4gIHZhciBpID0gZW51bUJ1Z0tleXMubGVuZ3RoO1xuICB2YXIgbHQgPSAnPCc7XG4gIHZhciBndCA9ICc+JztcbiAgdmFyIGlmcmFtZURvY3VtZW50O1xuICBpZnJhbWUuc3R5bGUuZGlzcGxheSA9ICdub25lJztcbiAgcmVxdWlyZSgnLi9faHRtbCcpLmFwcGVuZENoaWxkKGlmcmFtZSk7XG4gIGlmcmFtZS5zcmMgPSAnamF2YXNjcmlwdDonOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXNjcmlwdC11cmxcbiAgLy8gY3JlYXRlRGljdCA9IGlmcmFtZS5jb250ZW50V2luZG93Lk9iamVjdDtcbiAgLy8gaHRtbC5yZW1vdmVDaGlsZChpZnJhbWUpO1xuICBpZnJhbWVEb2N1bWVudCA9IGlmcmFtZS5jb250ZW50V2luZG93LmRvY3VtZW50O1xuICBpZnJhbWVEb2N1bWVudC5vcGVuKCk7XG4gIGlmcmFtZURvY3VtZW50LndyaXRlKGx0ICsgJ3NjcmlwdCcgKyBndCArICdkb2N1bWVudC5GPU9iamVjdCcgKyBsdCArICcvc2NyaXB0JyArIGd0KTtcbiAgaWZyYW1lRG9jdW1lbnQuY2xvc2UoKTtcbiAgY3JlYXRlRGljdCA9IGlmcmFtZURvY3VtZW50LkY7XG4gIHdoaWxlIChpLS0pIGRlbGV0ZSBjcmVhdGVEaWN0W1BST1RPVFlQRV1bZW51bUJ1Z0tleXNbaV1dO1xuICByZXR1cm4gY3JlYXRlRGljdCgpO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuY3JlYXRlIHx8IGZ1bmN0aW9uIGNyZWF0ZShPLCBQcm9wZXJ0aWVzKSB7XG4gIHZhciByZXN1bHQ7XG4gIGlmIChPICE9PSBudWxsKSB7XG4gICAgRW1wdHlbUFJPVE9UWVBFXSA9IGFuT2JqZWN0KE8pO1xuICAgIHJlc3VsdCA9IG5ldyBFbXB0eSgpO1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsInZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGRQID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcykge1xuICBhbk9iamVjdChPKTtcbiAgUCA9IHRvUHJpbWl0aXZlKFAsIHRydWUpO1xuICBhbk9iamVjdChBdHRyaWJ1dGVzKTtcbiAgaWYgKElFOF9ET01fREVGSU5FKSB0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmICgnZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpIHRocm93IFR5cGVFcnJvcignQWNjZXNzb3JzIG5vdCBzdXBwb3J0ZWQhJyk7XG4gIGlmICgndmFsdWUnIGluIEF0dHJpYnV0ZXMpIE9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07XG4iLCJ2YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGdldEtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcykge1xuICBhbk9iamVjdChPKTtcbiAgdmFyIGtleXMgPSBnZXRLZXlzKFByb3BlcnRpZXMpO1xuICB2YXIgbGVuZ3RoID0ga2V5cy5sZW5ndGg7XG4gIHZhciBpID0gMDtcbiAgdmFyIFA7XG4gIHdoaWxlIChsZW5ndGggPiBpKSBkUC5mKE8sIFAgPSBrZXlzW2krK10sIFByb3BlcnRpZXNbUF0pO1xuICByZXR1cm4gTztcbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyBGb3JjZWQgcmVwbGFjZW1lbnQgcHJvdG90eXBlIGFjY2Vzc29ycyBtZXRob2RzXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKSB8fCAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHZhciBLID0gTWF0aC5yYW5kb20oKTtcbiAgLy8gSW4gRkYgdGhyb3dzIG9ubHkgZGVmaW5lIG1ldGhvZHNcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmLCBuby11c2VsZXNzLWNhbGxcbiAgX19kZWZpbmVTZXR0ZXJfXy5jYWxsKG51bGwsIEssIGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG4gIGRlbGV0ZSByZXF1aXJlKCcuL19nbG9iYWwnKVtLXTtcbn0pO1xuIiwidmFyIHBJRSA9IHJlcXVpcmUoJy4vX29iamVjdC1waWUnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIElFOF9ET01fREVGSU5FID0gcmVxdWlyZSgnLi9faWU4LWRvbS1kZWZpbmUnKTtcbnZhciBnT1BEID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjtcblxuZXhwb3J0cy5mID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSA/IGdPUEQgOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUCkge1xuICBPID0gdG9JT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGlmIChJRThfRE9NX0RFRklORSkgdHJ5IHtcbiAgICByZXR1cm4gZ09QRChPLCBQKTtcbiAgfSBjYXRjaCAoZSkgeyAvKiBlbXB0eSAqLyB9XG4gIGlmIChoYXMoTywgUCkpIHJldHVybiBjcmVhdGVEZXNjKCFwSUUuZi5jYWxsKE8sIFApLCBPW1BdKTtcbn07XG4iLCIvLyBmYWxsYmFjayBmb3IgSUUxMSBidWdneSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyB3aXRoIGlmcmFtZSBhbmQgd2luZG93XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGdPUE4gPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbicpLmY7XG52YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxudmFyIHdpbmRvd05hbWVzID0gdHlwZW9mIHdpbmRvdyA9PSAnb2JqZWN0JyAmJiB3aW5kb3cgJiYgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXNcbiAgPyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh3aW5kb3cpIDogW107XG5cbnZhciBnZXRXaW5kb3dOYW1lcyA9IGZ1bmN0aW9uIChpdCkge1xuICB0cnkge1xuICAgIHJldHVybiBnT1BOKGl0KTtcbiAgfSBjYXRjaCAoZSkge1xuICAgIHJldHVybiB3aW5kb3dOYW1lcy5zbGljZSgpO1xuICB9XG59O1xuXG5tb2R1bGUuZXhwb3J0cy5mID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhpdCkge1xuICByZXR1cm4gd2luZG93TmFtZXMgJiYgdG9TdHJpbmcuY2FsbChpdCkgPT0gJ1tvYmplY3QgV2luZG93XScgPyBnZXRXaW5kb3dOYW1lcyhpdCkgOiBnT1BOKHRvSU9iamVjdChpdCkpO1xufTtcbiIsIi8vIDE5LjEuMi43IC8gMTUuMi4zLjQgT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoTylcbnZhciAka2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJyk7XG52YXIgaGlkZGVuS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKS5jb25jYXQoJ2xlbmd0aCcsICdwcm90b3R5cGUnKTtcblxuZXhwb3J0cy5mID0gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMgfHwgZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlOYW1lcyhPKSB7XG4gIHJldHVybiAka2V5cyhPLCBoaWRkZW5LZXlzKTtcbn07XG4iLCJleHBvcnRzLmYgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzO1xuIiwiLy8gMTkuMS4yLjkgLyAxNS4yLjMuMiBPYmplY3QuZ2V0UHJvdG90eXBlT2YoTylcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xudmFyIE9iamVjdFByb3RvID0gT2JqZWN0LnByb3RvdHlwZTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuZ2V0UHJvdG90eXBlT2YgfHwgZnVuY3Rpb24gKE8pIHtcbiAgTyA9IHRvT2JqZWN0KE8pO1xuICBpZiAoaGFzKE8sIElFX1BST1RPKSkgcmV0dXJuIE9bSUVfUFJPVE9dO1xuICBpZiAodHlwZW9mIE8uY29uc3RydWN0b3IgPT0gJ2Z1bmN0aW9uJyAmJiBPIGluc3RhbmNlb2YgTy5jb25zdHJ1Y3Rvcikge1xuICAgIHJldHVybiBPLmNvbnN0cnVjdG9yLnByb3RvdHlwZTtcbiAgfSByZXR1cm4gTyBpbnN0YW5jZW9mIE9iamVjdCA/IE9iamVjdFByb3RvIDogbnVsbDtcbn07XG4iLCJ2YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGFycmF5SW5kZXhPZiA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykoZmFsc2UpO1xudmFyIElFX1BST1RPID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmplY3QsIG5hbWVzKSB7XG4gIHZhciBPID0gdG9JT2JqZWN0KG9iamVjdCk7XG4gIHZhciBpID0gMDtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIga2V5O1xuICBmb3IgKGtleSBpbiBPKSBpZiAoa2V5ICE9IElFX1BST1RPKSBoYXMoTywga2V5KSAmJiByZXN1bHQucHVzaChrZXkpO1xuICAvLyBEb24ndCBlbnVtIGJ1ZyAmIGhpZGRlbiBrZXlzXG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSBpZiAoaGFzKE8sIGtleSA9IG5hbWVzW2krK10pKSB7XG4gICAgfmFycmF5SW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIi8vIDE5LjEuMi4xNCAvIDE1LjIuMy4xNCBPYmplY3Qua2V5cyhPKVxudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMtaW50ZXJuYWwnKTtcbnZhciBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pIHtcbiAgcmV0dXJuICRrZXlzKE8sIGVudW1CdWdLZXlzKTtcbn07XG4iLCJleHBvcnRzLmYgPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbiIsIi8vIG1vc3QgT2JqZWN0IG1ldGhvZHMgYnkgRVM2IHNob3VsZCBhY2NlcHQgcHJpbWl0aXZlc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEtFWSwgZXhlYykge1xuICB2YXIgZm4gPSAoY29yZS5PYmplY3QgfHwge30pW0tFWV0gfHwgT2JqZWN0W0tFWV07XG4gIHZhciBleHAgPSB7fTtcbiAgZXhwW0tFWV0gPSBleGVjKGZuKTtcbiAgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiBmYWlscyhmdW5jdGlvbiAoKSB7IGZuKDEpOyB9KSwgJ09iamVjdCcsIGV4cCk7XG59O1xuIiwidmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciBnZXRLZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciB0b0lPYmplY3QgPSByZXF1aXJlKCcuL190by1pb2JqZWN0Jyk7XG52YXIgaXNFbnVtID0gcmVxdWlyZSgnLi9fb2JqZWN0LXBpZScpLmY7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpc0VudHJpZXMpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIChpdCkge1xuICAgIHZhciBPID0gdG9JT2JqZWN0KGl0KTtcbiAgICB2YXIga2V5cyA9IGdldEtleXMoTyk7XG4gICAgdmFyIGxlbmd0aCA9IGtleXMubGVuZ3RoO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgdmFyIGtleTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaSkge1xuICAgICAga2V5ID0ga2V5c1tpKytdO1xuICAgICAgaWYgKCFERVNDUklQVE9SUyB8fCBpc0VudW0uY2FsbChPLCBrZXkpKSB7XG4gICAgICAgIHJlc3VsdC5wdXNoKGlzRW50cmllcyA/IFtrZXksIE9ba2V5XV0gOiBPW2tleV0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9O1xufTtcbiIsIi8vIGFsbCBvYmplY3Qga2V5cywgaW5jbHVkZXMgbm9uLWVudW1lcmFibGUgYW5kIHN5bWJvbHNcbnZhciBnT1BOID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKTtcbnZhciBnT1BTID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcHMnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIFJlZmxlY3QgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5SZWZsZWN0O1xubW9kdWxlLmV4cG9ydHMgPSBSZWZsZWN0ICYmIFJlZmxlY3Qub3duS2V5cyB8fCBmdW5jdGlvbiBvd25LZXlzKGl0KSB7XG4gIHZhciBrZXlzID0gZ09QTi5mKGFuT2JqZWN0KGl0KSk7XG4gIHZhciBnZXRTeW1ib2xzID0gZ09QUy5mO1xuICByZXR1cm4gZ2V0U3ltYm9scyA/IGtleXMuY29uY2F0KGdldFN5bWJvbHMoaXQpKSA6IGtleXM7XG59O1xuIiwidmFyICRwYXJzZUZsb2F0ID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykucGFyc2VGbG9hdDtcbnZhciAkdHJpbSA9IHJlcXVpcmUoJy4vX3N0cmluZy10cmltJykudHJpbTtcblxubW9kdWxlLmV4cG9ydHMgPSAxIC8gJHBhcnNlRmxvYXQocmVxdWlyZSgnLi9fc3RyaW5nLXdzJykgKyAnLTAnKSAhPT0gLUluZmluaXR5ID8gZnVuY3Rpb24gcGFyc2VGbG9hdChzdHIpIHtcbiAgdmFyIHN0cmluZyA9ICR0cmltKFN0cmluZyhzdHIpLCAzKTtcbiAgdmFyIHJlc3VsdCA9ICRwYXJzZUZsb2F0KHN0cmluZyk7XG4gIHJldHVybiByZXN1bHQgPT09IDAgJiYgc3RyaW5nLmNoYXJBdCgwKSA9PSAnLScgPyAtMCA6IHJlc3VsdDtcbn0gOiAkcGFyc2VGbG9hdDtcbiIsInZhciAkcGFyc2VJbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5wYXJzZUludDtcbnZhciAkdHJpbSA9IHJlcXVpcmUoJy4vX3N0cmluZy10cmltJykudHJpbTtcbnZhciB3cyA9IHJlcXVpcmUoJy4vX3N0cmluZy13cycpO1xudmFyIGhleCA9IC9eWy0rXT8wW3hYXS87XG5cbm1vZHVsZS5leHBvcnRzID0gJHBhcnNlSW50KHdzICsgJzA4JykgIT09IDggfHwgJHBhcnNlSW50KHdzICsgJzB4MTYnKSAhPT0gMjIgPyBmdW5jdGlvbiBwYXJzZUludChzdHIsIHJhZGl4KSB7XG4gIHZhciBzdHJpbmcgPSAkdHJpbShTdHJpbmcoc3RyKSwgMyk7XG4gIHJldHVybiAkcGFyc2VJbnQoc3RyaW5nLCAocmFkaXggPj4+IDApIHx8IChoZXgudGVzdChzdHJpbmcpID8gMTYgOiAxMCkpO1xufSA6ICRwYXJzZUludDtcbiIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgdHJ5IHtcbiAgICByZXR1cm4geyBlOiBmYWxzZSwgdjogZXhlYygpIH07XG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4geyBlOiB0cnVlLCB2OiBlIH07XG4gIH1cbn07XG4iLCJ2YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi9fbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChDLCB4KSB7XG4gIGFuT2JqZWN0KEMpO1xuICBpZiAoaXNPYmplY3QoeCkgJiYgeC5jb25zdHJ1Y3RvciA9PT0gQykgcmV0dXJuIHg7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYoQyk7XG4gIHZhciByZXNvbHZlID0gcHJvbWlzZUNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgcmVzb2x2ZSh4KTtcbiAgcmV0dXJuIHByb21pc2VDYXBhYmlsaXR5LnByb21pc2U7XG59O1xuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoYml0bWFwLCB2YWx1ZSkge1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGU6ICEoYml0bWFwICYgMSksXG4gICAgY29uZmlndXJhYmxlOiAhKGJpdG1hcCAmIDIpLFxuICAgIHdyaXRhYmxlOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlOiB2YWx1ZVxuICB9O1xufTtcbiIsInZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uICh0YXJnZXQsIHNyYywgc2FmZSkge1xuICBmb3IgKHZhciBrZXkgaW4gc3JjKSByZWRlZmluZSh0YXJnZXQsIGtleSwgc3JjW2tleV0sIHNhZmUpO1xuICByZXR1cm4gdGFyZ2V0O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyIFNSQyA9IHJlcXVpcmUoJy4vX3VpZCcpKCdzcmMnKTtcbnZhciAkdG9TdHJpbmcgPSByZXF1aXJlKCcuL19mdW5jdGlvbi10by1zdHJpbmcnKTtcbnZhciBUT19TVFJJTkcgPSAndG9TdHJpbmcnO1xudmFyIFRQTCA9ICgnJyArICR0b1N0cmluZykuc3BsaXQoVE9fU1RSSU5HKTtcblxucmVxdWlyZSgnLi9fY29yZScpLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuICR0b1N0cmluZy5jYWxsKGl0KTtcbn07XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChPLCBrZXksIHZhbCwgc2FmZSkge1xuICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiB2YWwgPT0gJ2Z1bmN0aW9uJztcbiAgaWYgKGlzRnVuY3Rpb24pIGhhcyh2YWwsICduYW1lJykgfHwgaGlkZSh2YWwsICduYW1lJywga2V5KTtcbiAgaWYgKE9ba2V5XSA9PT0gdmFsKSByZXR1cm47XG4gIGlmIChpc0Z1bmN0aW9uKSBoYXModmFsLCBTUkMpIHx8IGhpZGUodmFsLCBTUkMsIE9ba2V5XSA/ICcnICsgT1trZXldIDogVFBMLmpvaW4oU3RyaW5nKGtleSkpKTtcbiAgaWYgKE8gPT09IGdsb2JhbCkge1xuICAgIE9ba2V5XSA9IHZhbDtcbiAgfSBlbHNlIGlmICghc2FmZSkge1xuICAgIGRlbGV0ZSBPW2tleV07XG4gICAgaGlkZShPLCBrZXksIHZhbCk7XG4gIH0gZWxzZSBpZiAoT1trZXldKSB7XG4gICAgT1trZXldID0gdmFsO1xuICB9IGVsc2Uge1xuICAgIGhpZGUoTywga2V5LCB2YWwpO1xuICB9XG4vLyBhZGQgZmFrZSBGdW5jdGlvbiN0b1N0cmluZyBmb3IgY29ycmVjdCB3b3JrIHdyYXBwZWQgbWV0aG9kcyAvIGNvbnN0cnVjdG9ycyB3aXRoIG1ldGhvZHMgbGlrZSBMb0Rhc2ggaXNOYXRpdmVcbn0pKEZ1bmN0aW9uLnByb3RvdHlwZSwgVE9fU1RSSU5HLCBmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgJiYgdGhpc1tTUkNdIHx8ICR0b1N0cmluZy5jYWxsKHRoaXMpO1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xudmFyIGJ1aWx0aW5FeGVjID0gUmVnRXhwLnByb3RvdHlwZS5leGVjO1xuXG4gLy8gYFJlZ0V4cEV4ZWNgIGFic3RyYWN0IG9wZXJhdGlvblxuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVnZXhwZXhlY1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoUiwgUykge1xuICB2YXIgZXhlYyA9IFIuZXhlYztcbiAgaWYgKHR5cGVvZiBleGVjID09PSAnZnVuY3Rpb24nKSB7XG4gICAgdmFyIHJlc3VsdCA9IGV4ZWMuY2FsbChSLCBTKTtcbiAgICBpZiAodHlwZW9mIHJlc3VsdCAhPT0gJ29iamVjdCcpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlZ0V4cCBleGVjIG1ldGhvZCByZXR1cm5lZCBzb21ldGhpbmcgb3RoZXIgdGhhbiBhbiBPYmplY3Qgb3IgbnVsbCcpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG4gIGlmIChjbGFzc29mKFIpICE9PSAnUmVnRXhwJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1JlZ0V4cCNleGVjIGNhbGxlZCBvbiBpbmNvbXBhdGlibGUgcmVjZWl2ZXInKTtcbiAgfVxuICByZXR1cm4gYnVpbHRpbkV4ZWMuY2FsbChSLCBTKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciByZWdleHBGbGFncyA9IHJlcXVpcmUoJy4vX2ZsYWdzJyk7XG5cbnZhciBuYXRpdmVFeGVjID0gUmVnRXhwLnByb3RvdHlwZS5leGVjO1xuLy8gVGhpcyBhbHdheXMgcmVmZXJzIHRvIHRoZSBuYXRpdmUgaW1wbGVtZW50YXRpb24sIGJlY2F1c2UgdGhlXG4vLyBTdHJpbmcjcmVwbGFjZSBwb2x5ZmlsbCB1c2VzIC4vZml4LXJlZ2V4cC13ZWxsLWtub3duLXN5bWJvbC1sb2dpYy5qcyxcbi8vIHdoaWNoIGxvYWRzIHRoaXMgZmlsZSBiZWZvcmUgcGF0Y2hpbmcgdGhlIG1ldGhvZC5cbnZhciBuYXRpdmVSZXBsYWNlID0gU3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlO1xuXG52YXIgcGF0Y2hlZEV4ZWMgPSBuYXRpdmVFeGVjO1xuXG52YXIgTEFTVF9JTkRFWCA9ICdsYXN0SW5kZXgnO1xuXG52YXIgVVBEQVRFU19MQVNUX0lOREVYX1dST05HID0gKGZ1bmN0aW9uICgpIHtcbiAgdmFyIHJlMSA9IC9hLyxcbiAgICAgIHJlMiA9IC9iKi9nO1xuICBuYXRpdmVFeGVjLmNhbGwocmUxLCAnYScpO1xuICBuYXRpdmVFeGVjLmNhbGwocmUyLCAnYScpO1xuICByZXR1cm4gcmUxW0xBU1RfSU5ERVhdICE9PSAwIHx8IHJlMltMQVNUX0lOREVYXSAhPT0gMDtcbn0pKCk7XG5cbi8vIG5vbnBhcnRpY2lwYXRpbmcgY2FwdHVyaW5nIGdyb3VwLCBjb3BpZWQgZnJvbSBlczUtc2hpbSdzIFN0cmluZyNzcGxpdCBwYXRjaC5cbnZhciBOUENHX0lOQ0xVREVEID0gLygpPz8vLmV4ZWMoJycpWzFdICE9PSB1bmRlZmluZWQ7XG5cbnZhciBQQVRDSCA9IFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyB8fCBOUENHX0lOQ0xVREVEO1xuXG5pZiAoUEFUQ0gpIHtcbiAgcGF0Y2hlZEV4ZWMgPSBmdW5jdGlvbiBleGVjKHN0cikge1xuICAgIHZhciByZSA9IHRoaXM7XG4gICAgdmFyIGxhc3RJbmRleCwgcmVDb3B5LCBtYXRjaCwgaTtcblxuICAgIGlmIChOUENHX0lOQ0xVREVEKSB7XG4gICAgICByZUNvcHkgPSBuZXcgUmVnRXhwKCdeJyArIHJlLnNvdXJjZSArICckKD8hXFxcXHMpJywgcmVnZXhwRmxhZ3MuY2FsbChyZSkpO1xuICAgIH1cbiAgICBpZiAoVVBEQVRFU19MQVNUX0lOREVYX1dST05HKSBsYXN0SW5kZXggPSByZVtMQVNUX0lOREVYXTtcblxuICAgIG1hdGNoID0gbmF0aXZlRXhlYy5jYWxsKHJlLCBzdHIpO1xuXG4gICAgaWYgKFVQREFURVNfTEFTVF9JTkRFWF9XUk9ORyAmJiBtYXRjaCkge1xuICAgICAgcmVbTEFTVF9JTkRFWF0gPSByZS5nbG9iYWwgPyBtYXRjaC5pbmRleCArIG1hdGNoWzBdLmxlbmd0aCA6IGxhc3RJbmRleDtcbiAgICB9XG4gICAgaWYgKE5QQ0dfSU5DTFVERUQgJiYgbWF0Y2ggJiYgbWF0Y2gubGVuZ3RoID4gMSkge1xuICAgICAgLy8gRml4IGJyb3dzZXJzIHdob3NlIGBleGVjYCBtZXRob2RzIGRvbid0IGNvbnNpc3RlbnRseSByZXR1cm4gYHVuZGVmaW5lZGBcbiAgICAgIC8vIGZvciBOUENHLCBsaWtlIElFOC4gTk9URTogVGhpcyBkb2Vzbicgd29yayBmb3IgLyguPyk/L1xuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWxvb3AtZnVuY1xuICAgICAgbmF0aXZlUmVwbGFjZS5jYWxsKG1hdGNoWzBdLCByZUNvcHksIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgZm9yIChpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGggLSAyOyBpKyspIHtcbiAgICAgICAgICBpZiAoYXJndW1lbnRzW2ldID09PSB1bmRlZmluZWQpIG1hdGNoW2ldID0gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gbWF0Y2g7XG4gIH07XG59XG5cbm1vZHVsZS5leHBvcnRzID0gcGF0Y2hlZEV4ZWM7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChyZWdFeHAsIHJlcGxhY2UpIHtcbiAgdmFyIHJlcGxhY2VyID0gcmVwbGFjZSA9PT0gT2JqZWN0KHJlcGxhY2UpID8gZnVuY3Rpb24gKHBhcnQpIHtcbiAgICByZXR1cm4gcmVwbGFjZVtwYXJ0XTtcbiAgfSA6IHJlcGxhY2U7XG4gIHJldHVybiBmdW5jdGlvbiAoaXQpIHtcbiAgICByZXR1cm4gU3RyaW5nKGl0KS5yZXBsYWNlKHJlZ0V4cCwgcmVwbGFjZXIpO1xuICB9O1xufTtcbiIsIi8vIDcuMi45IFNhbWVWYWx1ZSh4LCB5KVxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3QuaXMgfHwgZnVuY3Rpb24gaXMoeCwgeSkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIHJldHVybiB4ID09PSB5ID8geCAhPT0gMCB8fCAxIC8geCA9PT0gMSAvIHkgOiB4ICE9IHggJiYgeSAhPSB5O1xufTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKENPTExFQ1RJT04pIHtcbiAgJGV4cG9ydCgkZXhwb3J0LlMsIENPTExFQ1RJT04sIHsgZnJvbTogZnVuY3Rpb24gZnJvbShzb3VyY2UgLyogLCBtYXBGbiwgdGhpc0FyZyAqLykge1xuICAgIHZhciBtYXBGbiA9IGFyZ3VtZW50c1sxXTtcbiAgICB2YXIgbWFwcGluZywgQSwgbiwgY2I7XG4gICAgYUZ1bmN0aW9uKHRoaXMpO1xuICAgIG1hcHBpbmcgPSBtYXBGbiAhPT0gdW5kZWZpbmVkO1xuICAgIGlmIChtYXBwaW5nKSBhRnVuY3Rpb24obWFwRm4pO1xuICAgIGlmIChzb3VyY2UgPT0gdW5kZWZpbmVkKSByZXR1cm4gbmV3IHRoaXMoKTtcbiAgICBBID0gW107XG4gICAgaWYgKG1hcHBpbmcpIHtcbiAgICAgIG4gPSAwO1xuICAgICAgY2IgPSBjdHgobWFwRm4sIGFyZ3VtZW50c1syXSwgMik7XG4gICAgICBmb3JPZihzb3VyY2UsIGZhbHNlLCBmdW5jdGlvbiAobmV4dEl0ZW0pIHtcbiAgICAgICAgQS5wdXNoKGNiKG5leHRJdGVtLCBuKyspKTtcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBmb3JPZihzb3VyY2UsIGZhbHNlLCBBLnB1c2gsIEEpO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IHRoaXMoQSk7XG4gIH0gfSk7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoQ09MTEVDVElPTikge1xuICAkZXhwb3J0KCRleHBvcnQuUywgQ09MTEVDVElPTiwgeyBvZjogZnVuY3Rpb24gb2YoKSB7XG4gICAgdmFyIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIEEgPSBuZXcgQXJyYXkobGVuZ3RoKTtcbiAgICB3aGlsZSAobGVuZ3RoLS0pIEFbbGVuZ3RoXSA9IGFyZ3VtZW50c1tsZW5ndGhdO1xuICAgIHJldHVybiBuZXcgdGhpcyhBKTtcbiAgfSB9KTtcbn07XG4iLCIvLyBXb3JrcyB3aXRoIF9fcHJvdG9fXyBvbmx5LiBPbGQgdjggY2FuJ3Qgd29yayB3aXRoIG51bGwgcHJvdG8gb2JqZWN0cy5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGNoZWNrID0gZnVuY3Rpb24gKE8sIHByb3RvKSB7XG4gIGFuT2JqZWN0KE8pO1xuICBpZiAoIWlzT2JqZWN0KHByb3RvKSAmJiBwcm90byAhPT0gbnVsbCkgdGhyb3cgVHlwZUVycm9yKHByb3RvICsgXCI6IGNhbid0IHNldCBhcyBwcm90b3R5cGUhXCIpO1xufTtcbm1vZHVsZS5leHBvcnRzID0ge1xuICBzZXQ6IE9iamVjdC5zZXRQcm90b3R5cGVPZiB8fCAoJ19fcHJvdG9fXycgaW4ge30gPyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lXG4gICAgZnVuY3Rpb24gKHRlc3QsIGJ1Z2d5LCBzZXQpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIHNldCA9IHJlcXVpcmUoJy4vX2N0eCcpKEZ1bmN0aW9uLmNhbGwsIHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZihPYmplY3QucHJvdG90eXBlLCAnX19wcm90b19fJykuc2V0LCAyKTtcbiAgICAgICAgc2V0KHRlc3QsIFtdKTtcbiAgICAgICAgYnVnZ3kgPSAhKHRlc3QgaW5zdGFuY2VvZiBBcnJheSk7XG4gICAgICB9IGNhdGNoIChlKSB7IGJ1Z2d5ID0gdHJ1ZTsgfVxuICAgICAgcmV0dXJuIGZ1bmN0aW9uIHNldFByb3RvdHlwZU9mKE8sIHByb3RvKSB7XG4gICAgICAgIGNoZWNrKE8sIHByb3RvKTtcbiAgICAgICAgaWYgKGJ1Z2d5KSBPLl9fcHJvdG9fXyA9IHByb3RvO1xuICAgICAgICBlbHNlIHNldChPLCBwcm90byk7XG4gICAgICAgIHJldHVybiBPO1xuICAgICAgfTtcbiAgICB9KHt9LCBmYWxzZSkgOiB1bmRlZmluZWQpLFxuICBjaGVjazogY2hlY2tcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgU1BFQ0lFUyA9IHJlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEtFWSkge1xuICB2YXIgQyA9IGdsb2JhbFtLRVldO1xuICBpZiAoREVTQ1JJUFRPUlMgJiYgQyAmJiAhQ1tTUEVDSUVTXSkgZFAuZihDLCBTUEVDSUVTLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpczsgfVxuICB9KTtcbn07XG4iLCJ2YXIgZGVmID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQsIHRhZywgc3RhdCkge1xuICBpZiAoaXQgJiYgIWhhcyhpdCA9IHN0YXQgPyBpdCA6IGl0LnByb3RvdHlwZSwgVEFHKSkgZGVmKGl0LCBUQUcsIHsgY29uZmlndXJhYmxlOiB0cnVlLCB2YWx1ZTogdGFnIH0pO1xufTtcbiIsInZhciBzaGFyZWQgPSByZXF1aXJlKCcuL19zaGFyZWQnKSgna2V5cycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoa2V5KSB7XG4gIHJldHVybiBzaGFyZWRba2V5XSB8fCAoc2hhcmVkW2tleV0gPSB1aWQoa2V5KSk7XG59O1xuIiwidmFyIGNvcmUgPSByZXF1aXJlKCcuL19jb3JlJyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgU0hBUkVEID0gJ19fY29yZS1qc19zaGFyZWRfXyc7XG52YXIgc3RvcmUgPSBnbG9iYWxbU0hBUkVEXSB8fCAoZ2xvYmFsW1NIQVJFRF0gPSB7fSk7XG5cbihtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChrZXksIHZhbHVlKSB7XG4gIHJldHVybiBzdG9yZVtrZXldIHx8IChzdG9yZVtrZXldID0gdmFsdWUgIT09IHVuZGVmaW5lZCA/IHZhbHVlIDoge30pO1xufSkoJ3ZlcnNpb25zJywgW10pLnB1c2goe1xuICB2ZXJzaW9uOiBjb3JlLnZlcnNpb24sXG4gIG1vZGU6IHJlcXVpcmUoJy4vX2xpYnJhcnknKSA/ICdwdXJlJyA6ICdnbG9iYWwnLFxuICBjb3B5cmlnaHQ6ICfCqSAyMDIwIERlbmlzIFB1c2hrYXJldiAoemxvaXJvY2sucnUpJ1xufSk7XG4iLCIvLyA3LjMuMjAgU3BlY2llc0NvbnN0cnVjdG9yKE8sIGRlZmF1bHRDb25zdHJ1Y3RvcilcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBTUEVDSUVTID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKE8sIEQpIHtcbiAgdmFyIEMgPSBhbk9iamVjdChPKS5jb25zdHJ1Y3RvcjtcbiAgdmFyIFM7XG4gIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgKFMgPSBhbk9iamVjdChDKVtTUEVDSUVTXSkgPT0gdW5kZWZpbmVkID8gRCA6IGFGdW5jdGlvbihTKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChtZXRob2QsIGFyZykge1xuICByZXR1cm4gISFtZXRob2QgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11c2VsZXNzLWNhbGxcbiAgICBhcmcgPyBtZXRob2QuY2FsbChudWxsLCBmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0sIDEpIDogbWV0aG9kLmNhbGwobnVsbCk7XG4gIH0pO1xufTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbi8vIHRydWUgIC0+IFN0cmluZyNhdFxuLy8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChUT19TVFJJTkcpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uICh0aGF0LCBwb3MpIHtcbiAgICB2YXIgcyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKTtcbiAgICB2YXIgaSA9IHRvSW50ZWdlcihwb3MpO1xuICAgIHZhciBsID0gcy5sZW5ndGg7XG4gICAgdmFyIGEsIGI7XG4gICAgaWYgKGkgPCAwIHx8IGkgPj0gbCkgcmV0dXJuIFRPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbCB8fCAoYiA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGIgPiAweGRmZmZcbiAgICAgID8gVE9fU1RSSU5HID8gcy5jaGFyQXQoaSkgOiBhXG4gICAgICA6IFRPX1NUUklORyA/IHMuc2xpY2UoaSwgaSArIDIpIDogKGEgLSAweGQ4MDAgPDwgMTApICsgKGIgLSAweGRjMDApICsgMHgxMDAwMDtcbiAgfTtcbn07XG4iLCIvLyBoZWxwZXIgZm9yIFN0cmluZyN7c3RhcnRzV2l0aCwgZW5kc1dpdGgsIGluY2x1ZGVzfVxudmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi9faXMtcmVnZXhwJyk7XG52YXIgZGVmaW5lZCA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAodGhhdCwgc2VhcmNoU3RyaW5nLCBOQU1FKSB7XG4gIGlmIChpc1JlZ0V4cChzZWFyY2hTdHJpbmcpKSB0aHJvdyBUeXBlRXJyb3IoJ1N0cmluZyMnICsgTkFNRSArIFwiIGRvZXNuJ3QgYWNjZXB0IHJlZ2V4IVwiKTtcbiAgcmV0dXJuIFN0cmluZyhkZWZpbmVkKHRoYXQpKTtcbn07XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xudmFyIHF1b3QgPSAvXCIvZztcbi8vIEIuMi4zLjIuMSBDcmVhdGVIVE1MKHN0cmluZywgdGFnLCBhdHRyaWJ1dGUsIHZhbHVlKVxudmFyIGNyZWF0ZUhUTUwgPSBmdW5jdGlvbiAoc3RyaW5nLCB0YWcsIGF0dHJpYnV0ZSwgdmFsdWUpIHtcbiAgdmFyIFMgPSBTdHJpbmcoZGVmaW5lZChzdHJpbmcpKTtcbiAgdmFyIHAxID0gJzwnICsgdGFnO1xuICBpZiAoYXR0cmlidXRlICE9PSAnJykgcDEgKz0gJyAnICsgYXR0cmlidXRlICsgJz1cIicgKyBTdHJpbmcodmFsdWUpLnJlcGxhY2UocXVvdCwgJyZxdW90OycpICsgJ1wiJztcbiAgcmV0dXJuIHAxICsgJz4nICsgUyArICc8LycgKyB0YWcgKyAnPic7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoTkFNRSwgZXhlYykge1xuICB2YXIgTyA9IHt9O1xuICBPW05BTUVdID0gZXhlYyhjcmVhdGVIVE1MKTtcbiAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHRlc3QgPSAnJ1tOQU1FXSgnXCInKTtcbiAgICByZXR1cm4gdGVzdCAhPT0gdGVzdC50b0xvd2VyQ2FzZSgpIHx8IHRlc3Quc3BsaXQoJ1wiJykubGVuZ3RoID4gMztcbiAgfSksICdTdHJpbmcnLCBPKTtcbn07XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1zdHJpbmctcGFkLXN0YXJ0LWVuZFxudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgcmVwZWF0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLXJlcGVhdCcpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKHRoYXQsIG1heExlbmd0aCwgZmlsbFN0cmluZywgbGVmdCkge1xuICB2YXIgUyA9IFN0cmluZyhkZWZpbmVkKHRoYXQpKTtcbiAgdmFyIHN0cmluZ0xlbmd0aCA9IFMubGVuZ3RoO1xuICB2YXIgZmlsbFN0ciA9IGZpbGxTdHJpbmcgPT09IHVuZGVmaW5lZCA/ICcgJyA6IFN0cmluZyhmaWxsU3RyaW5nKTtcbiAgdmFyIGludE1heExlbmd0aCA9IHRvTGVuZ3RoKG1heExlbmd0aCk7XG4gIGlmIChpbnRNYXhMZW5ndGggPD0gc3RyaW5nTGVuZ3RoIHx8IGZpbGxTdHIgPT0gJycpIHJldHVybiBTO1xuICB2YXIgZmlsbExlbiA9IGludE1heExlbmd0aCAtIHN0cmluZ0xlbmd0aDtcbiAgdmFyIHN0cmluZ0ZpbGxlciA9IHJlcGVhdC5jYWxsKGZpbGxTdHIsIE1hdGguY2VpbChmaWxsTGVuIC8gZmlsbFN0ci5sZW5ndGgpKTtcbiAgaWYgKHN0cmluZ0ZpbGxlci5sZW5ndGggPiBmaWxsTGVuKSBzdHJpbmdGaWxsZXIgPSBzdHJpbmdGaWxsZXIuc2xpY2UoMCwgZmlsbExlbik7XG4gIHJldHVybiBsZWZ0ID8gc3RyaW5nRmlsbGVyICsgUyA6IFMgKyBzdHJpbmdGaWxsZXI7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIHJlcGVhdChjb3VudCkge1xuICB2YXIgc3RyID0gU3RyaW5nKGRlZmluZWQodGhpcykpO1xuICB2YXIgcmVzID0gJyc7XG4gIHZhciBuID0gdG9JbnRlZ2VyKGNvdW50KTtcbiAgaWYgKG4gPCAwIHx8IG4gPT0gSW5maW5pdHkpIHRocm93IFJhbmdlRXJyb3IoXCJDb3VudCBjYW4ndCBiZSBuZWdhdGl2ZVwiKTtcbiAgZm9yICg7biA+IDA7IChuID4+Pj0gMSkgJiYgKHN0ciArPSBzdHIpKSBpZiAobiAmIDEpIHJlcyArPSBzdHI7XG4gIHJldHVybiByZXM7XG59O1xuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBzcGFjZXMgPSByZXF1aXJlKCcuL19zdHJpbmctd3MnKTtcbnZhciBzcGFjZSA9ICdbJyArIHNwYWNlcyArICddJztcbnZhciBub24gPSAnXFx1MjAwYlxcdTAwODUnO1xudmFyIGx0cmltID0gUmVnRXhwKCdeJyArIHNwYWNlICsgc3BhY2UgKyAnKicpO1xudmFyIHJ0cmltID0gUmVnRXhwKHNwYWNlICsgc3BhY2UgKyAnKiQnKTtcblxudmFyIGV4cG9ydGVyID0gZnVuY3Rpb24gKEtFWSwgZXhlYywgQUxJQVMpIHtcbiAgdmFyIGV4cCA9IHt9O1xuICB2YXIgRk9SQ0UgPSBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuICEhc3BhY2VzW0tFWV0oKSB8fCBub25bS0VZXSgpICE9IG5vbjtcbiAgfSk7XG4gIHZhciBmbiA9IGV4cFtLRVldID0gRk9SQ0UgPyBleGVjKHRyaW0pIDogc3BhY2VzW0tFWV07XG4gIGlmIChBTElBUykgZXhwW0FMSUFTXSA9IGZuO1xuICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIEZPUkNFLCAnU3RyaW5nJywgZXhwKTtcbn07XG5cbi8vIDEgLT4gU3RyaW5nI3RyaW1MZWZ0XG4vLyAyIC0+IFN0cmluZyN0cmltUmlnaHRcbi8vIDMgLT4gU3RyaW5nI3RyaW1cbnZhciB0cmltID0gZXhwb3J0ZXIudHJpbSA9IGZ1bmN0aW9uIChzdHJpbmcsIFRZUEUpIHtcbiAgc3RyaW5nID0gU3RyaW5nKGRlZmluZWQoc3RyaW5nKSk7XG4gIGlmIChUWVBFICYgMSkgc3RyaW5nID0gc3RyaW5nLnJlcGxhY2UobHRyaW0sICcnKTtcbiAgaWYgKFRZUEUgJiAyKSBzdHJpbmcgPSBzdHJpbmcucmVwbGFjZShydHJpbSwgJycpO1xuICByZXR1cm4gc3RyaW5nO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBleHBvcnRlcjtcbiIsIm1vZHVsZS5leHBvcnRzID0gJ1xceDA5XFx4MEFcXHgwQlxceDBDXFx4MERcXHgyMFxceEEwXFx1MTY4MFxcdTE4MEVcXHUyMDAwXFx1MjAwMVxcdTIwMDJcXHUyMDAzJyArXG4gICdcXHUyMDA0XFx1MjAwNVxcdTIwMDZcXHUyMDA3XFx1MjAwOFxcdTIwMDlcXHUyMDBBXFx1MjAyRlxcdTIwNUZcXHUzMDAwXFx1MjAyOFxcdTIwMjlcXHVGRUZGJztcbiIsInZhciBjdHggPSByZXF1aXJlKCcuL19jdHgnKTtcbnZhciBpbnZva2UgPSByZXF1aXJlKCcuL19pbnZva2UnKTtcbnZhciBodG1sID0gcmVxdWlyZSgnLi9faHRtbCcpO1xudmFyIGNlbCA9IHJlcXVpcmUoJy4vX2RvbS1jcmVhdGUnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgc2V0VGFzayA9IGdsb2JhbC5zZXRJbW1lZGlhdGU7XG52YXIgY2xlYXJUYXNrID0gZ2xvYmFsLmNsZWFySW1tZWRpYXRlO1xudmFyIE1lc3NhZ2VDaGFubmVsID0gZ2xvYmFsLk1lc3NhZ2VDaGFubmVsO1xudmFyIERpc3BhdGNoID0gZ2xvYmFsLkRpc3BhdGNoO1xudmFyIGNvdW50ZXIgPSAwO1xudmFyIHF1ZXVlID0ge307XG52YXIgT05SRUFEWVNUQVRFQ0hBTkdFID0gJ29ucmVhZHlzdGF0ZWNoYW5nZSc7XG52YXIgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG52YXIgcnVuID0gZnVuY3Rpb24gKCkge1xuICB2YXIgaWQgPSArdGhpcztcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXByb3RvdHlwZS1idWlsdGluc1xuICBpZiAocXVldWUuaGFzT3duUHJvcGVydHkoaWQpKSB7XG4gICAgdmFyIGZuID0gcXVldWVbaWRdO1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gICAgZm4oKTtcbiAgfVxufTtcbnZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uIChldmVudCkge1xuICBydW4uY2FsbChldmVudC5kYXRhKTtcbn07XG4vLyBOb2RlLmpzIDAuOSsgJiBJRTEwKyBoYXMgc2V0SW1tZWRpYXRlLCBvdGhlcndpc2U6XG5pZiAoIXNldFRhc2sgfHwgIWNsZWFyVGFzaykge1xuICBzZXRUYXNrID0gZnVuY3Rpb24gc2V0SW1tZWRpYXRlKGZuKSB7XG4gICAgdmFyIGFyZ3MgPSBbXTtcbiAgICB2YXIgaSA9IDE7XG4gICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgIHF1ZXVlWysrY291bnRlcl0gPSBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgICAgIGludm9rZSh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pLCBhcmdzKTtcbiAgICB9O1xuICAgIGRlZmVyKGNvdW50ZXIpO1xuICAgIHJldHVybiBjb3VudGVyO1xuICB9O1xuICBjbGVhclRhc2sgPSBmdW5jdGlvbiBjbGVhckltbWVkaWF0ZShpZCkge1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZiAocmVxdWlyZSgnLi9fY29mJykocHJvY2VzcykgPT0gJ3Byb2Nlc3MnKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIHByb2Nlc3MubmV4dFRpY2soY3R4KHJ1biwgaWQsIDEpKTtcbiAgICB9O1xuICAvLyBTcGhlcmUgKEpTIGdhbWUgZW5naW5lKSBEaXNwYXRjaCBBUElcbiAgfSBlbHNlIGlmIChEaXNwYXRjaCAmJiBEaXNwYXRjaC5ub3cpIHtcbiAgICBkZWZlciA9IGZ1bmN0aW9uIChpZCkge1xuICAgICAgRGlzcGF0Y2gubm93KGN0eChydW4sIGlkLCAxKSk7XG4gICAgfTtcbiAgLy8gQnJvd3NlcnMgd2l0aCBNZXNzYWdlQ2hhbm5lbCwgaW5jbHVkZXMgV2ViV29ya2Vyc1xuICB9IGVsc2UgaWYgKE1lc3NhZ2VDaGFubmVsKSB7XG4gICAgY2hhbm5lbCA9IG5ldyBNZXNzYWdlQ2hhbm5lbCgpO1xuICAgIHBvcnQgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGlzdGVuZXI7XG4gICAgZGVmZXIgPSBjdHgocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCwgMSk7XG4gIC8vIEJyb3dzZXJzIHdpdGggcG9zdE1lc3NhZ2UsIHNraXAgV2ViV29ya2Vyc1xuICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0J1xuICB9IGVsc2UgaWYgKGdsb2JhbC5hZGRFdmVudExpc3RlbmVyICYmIHR5cGVvZiBwb3N0TWVzc2FnZSA9PSAnZnVuY3Rpb24nICYmICFnbG9iYWwuaW1wb3J0U2NyaXB0cykge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBnbG9iYWwucG9zdE1lc3NhZ2UoaWQgKyAnJywgJyonKTtcbiAgICB9O1xuICAgIGdsb2JhbC5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgbGlzdGVuZXIsIGZhbHNlKTtcbiAgLy8gSUU4LVxuICB9IGVsc2UgaWYgKE9OUkVBRFlTVEFURUNIQU5HRSBpbiBjZWwoJ3NjcmlwdCcpKSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbiAoaWQpIHtcbiAgICAgIGh0bWwuYXBwZW5kQ2hpbGQoY2VsKCdzY3JpcHQnKSlbT05SRUFEWVNUQVRFQ0hBTkdFXSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaHRtbC5yZW1vdmVDaGlsZCh0aGlzKTtcbiAgICAgICAgcnVuLmNhbGwoaWQpO1xuICAgICAgfTtcbiAgICB9O1xuICAvLyBSZXN0IG9sZCBicm93c2Vyc1xuICB9IGVsc2Uge1xuICAgIGRlZmVyID0gZnVuY3Rpb24gKGlkKSB7XG4gICAgICBzZXRUaW1lb3V0KGN0eChydW4sIGlkLCAxKSwgMCk7XG4gICAgfTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogc2V0VGFzayxcbiAgY2xlYXI6IGNsZWFyVGFza1xufTtcbiIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpbmRleCwgbGVuZ3RoKSB7XG4gIGluZGV4ID0gdG9JbnRlZ2VyKGluZGV4KTtcbiAgcmV0dXJuIGluZGV4IDwgMCA/IG1heChpbmRleCArIGxlbmd0aCwgMCkgOiBtaW4oaW5kZXgsIGxlbmd0aCk7XG59O1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtdG9pbmRleFxudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgaWYgKGl0ID09PSB1bmRlZmluZWQpIHJldHVybiAwO1xuICB2YXIgbnVtYmVyID0gdG9JbnRlZ2VyKGl0KTtcbiAgdmFyIGxlbmd0aCA9IHRvTGVuZ3RoKG51bWJlcik7XG4gIGlmIChudW1iZXIgIT09IGxlbmd0aCkgdGhyb3cgUmFuZ2VFcnJvcignV3JvbmcgbGVuZ3RoIScpO1xuICByZXR1cm4gbGVuZ3RoO1xufTtcbiIsIi8vIDcuMS40IFRvSW50ZWdlclxudmFyIGNlaWwgPSBNYXRoLmNlaWw7XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59O1xuIiwiLy8gdG8gaW5kZXhlZCBvYmplY3QsIHRvT2JqZWN0IHdpdGggZmFsbGJhY2sgZm9yIG5vbi1hcnJheS1saWtlIEVTMyBzdHJpbmdzXG52YXIgSU9iamVjdCA9IHJlcXVpcmUoJy4vX2lvYmplY3QnKTtcbnZhciBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIElPYmplY3QoZGVmaW5lZChpdCkpO1xufTtcbiIsIi8vIDcuMS4xNSBUb0xlbmd0aFxudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciBtaW4gPSBNYXRoLm1pbjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGl0KSB7XG4gIHJldHVybiBpdCA+IDAgPyBtaW4odG9JbnRlZ2VyKGl0KSwgMHgxZmZmZmZmZmZmZmZmZikgOiAwOyAvLyBwb3coMiwgNTMpIC0gMSA9PSA5MDA3MTk5MjU0NzQwOTkxXG59O1xuIiwiLy8gNy4xLjEzIFRvT2JqZWN0KGFyZ3VtZW50KVxudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCkge1xuICByZXR1cm4gT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07XG4iLCIvLyA3LjEuMSBUb1ByaW1pdGl2ZShpbnB1dCBbLCBQcmVmZXJyZWRUeXBlXSlcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuLy8gaW5zdGVhZCBvZiB0aGUgRVM2IHNwZWMgdmVyc2lvbiwgd2UgZGlkbid0IGltcGxlbWVudCBAQHRvUHJpbWl0aXZlIGNhc2Vcbi8vIGFuZCB0aGUgc2Vjb25kIGFyZ3VtZW50IC0gZmxhZyAtIHByZWZlcnJlZCB0eXBlIGlzIGEgc3RyaW5nXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgUykge1xuICBpZiAoIWlzT2JqZWN0KGl0KSkgcmV0dXJuIGl0O1xuICB2YXIgZm4sIHZhbDtcbiAgaWYgKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIGlmICh0eXBlb2YgKGZuID0gaXQudmFsdWVPZikgPT0gJ2Z1bmN0aW9uJyAmJiAhaXNPYmplY3QodmFsID0gZm4uY2FsbChpdCkpKSByZXR1cm4gdmFsO1xuICBpZiAoIVMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpIHJldHVybiB2YWw7XG4gIHRocm93IFR5cGVFcnJvcihcIkNhbid0IGNvbnZlcnQgb2JqZWN0IHRvIHByaW1pdGl2ZSB2YWx1ZVwiKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5pZiAocmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSkge1xuICB2YXIgTElCUkFSWSA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKTtcbiAgdmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xuICB2YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xuICB2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuICB2YXIgJHR5cGVkID0gcmVxdWlyZSgnLi9fdHlwZWQnKTtcbiAgdmFyICRidWZmZXIgPSByZXF1aXJlKCcuL190eXBlZC1idWZmZXInKTtcbiAgdmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xuICB2YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG4gIHZhciBwcm9wZXJ0eURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG4gIHZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xuICB2YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbiAgdmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbiAgdmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG4gIHZhciB0b0luZGV4ID0gcmVxdWlyZSgnLi9fdG8taW5kZXgnKTtcbiAgdmFyIHRvQWJzb2x1dGVJbmRleCA9IHJlcXVpcmUoJy4vX3RvLWFic29sdXRlLWluZGV4Jyk7XG4gIHZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xuICB2YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG4gIHZhciBjbGFzc29mID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpO1xuICB2YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbiAgdmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG4gIHZhciBpc0FycmF5SXRlciA9IHJlcXVpcmUoJy4vX2lzLWFycmF5LWl0ZXInKTtcbiAgdmFyIGNyZWF0ZSA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKTtcbiAgdmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xuICB2YXIgZ09QTiA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZjtcbiAgdmFyIGdldEl0ZXJGbiA9IHJlcXVpcmUoJy4vY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kJyk7XG4gIHZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbiAgdmFyIHdrcyA9IHJlcXVpcmUoJy4vX3drcycpO1xuICB2YXIgY3JlYXRlQXJyYXlNZXRob2QgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJyk7XG4gIHZhciBjcmVhdGVBcnJheUluY2x1ZGVzID0gcmVxdWlyZSgnLi9fYXJyYXktaW5jbHVkZXMnKTtcbiAgdmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKTtcbiAgdmFyIEFycmF5SXRlcmF0b3JzID0gcmVxdWlyZSgnLi9lczYuYXJyYXkuaXRlcmF0b3InKTtcbiAgdmFyIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xuICB2YXIgJGl0ZXJEZXRlY3QgPSByZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpO1xuICB2YXIgc2V0U3BlY2llcyA9IHJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJyk7XG4gIHZhciBhcnJheUZpbGwgPSByZXF1aXJlKCcuL19hcnJheS1maWxsJyk7XG4gIHZhciBhcnJheUNvcHlXaXRoaW4gPSByZXF1aXJlKCcuL19hcnJheS1jb3B5LXdpdGhpbicpO1xuICB2YXIgJERQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJyk7XG4gIHZhciAkR09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG4gIHZhciBkUCA9ICREUC5mO1xuICB2YXIgZ09QRCA9ICRHT1BELmY7XG4gIHZhciBSYW5nZUVycm9yID0gZ2xvYmFsLlJhbmdlRXJyb3I7XG4gIHZhciBUeXBlRXJyb3IgPSBnbG9iYWwuVHlwZUVycm9yO1xuICB2YXIgVWludDhBcnJheSA9IGdsb2JhbC5VaW50OEFycmF5O1xuICB2YXIgQVJSQVlfQlVGRkVSID0gJ0FycmF5QnVmZmVyJztcbiAgdmFyIFNIQVJFRF9CVUZGRVIgPSAnU2hhcmVkJyArIEFSUkFZX0JVRkZFUjtcbiAgdmFyIEJZVEVTX1BFUl9FTEVNRU5UID0gJ0JZVEVTX1BFUl9FTEVNRU5UJztcbiAgdmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xuICB2YXIgQXJyYXlQcm90byA9IEFycmF5W1BST1RPVFlQRV07XG4gIHZhciAkQXJyYXlCdWZmZXIgPSAkYnVmZmVyLkFycmF5QnVmZmVyO1xuICB2YXIgJERhdGFWaWV3ID0gJGJ1ZmZlci5EYXRhVmlldztcbiAgdmFyIGFycmF5Rm9yRWFjaCA9IGNyZWF0ZUFycmF5TWV0aG9kKDApO1xuICB2YXIgYXJyYXlGaWx0ZXIgPSBjcmVhdGVBcnJheU1ldGhvZCgyKTtcbiAgdmFyIGFycmF5U29tZSA9IGNyZWF0ZUFycmF5TWV0aG9kKDMpO1xuICB2YXIgYXJyYXlFdmVyeSA9IGNyZWF0ZUFycmF5TWV0aG9kKDQpO1xuICB2YXIgYXJyYXlGaW5kID0gY3JlYXRlQXJyYXlNZXRob2QoNSk7XG4gIHZhciBhcnJheUZpbmRJbmRleCA9IGNyZWF0ZUFycmF5TWV0aG9kKDYpO1xuICB2YXIgYXJyYXlJbmNsdWRlcyA9IGNyZWF0ZUFycmF5SW5jbHVkZXModHJ1ZSk7XG4gIHZhciBhcnJheUluZGV4T2YgPSBjcmVhdGVBcnJheUluY2x1ZGVzKGZhbHNlKTtcbiAgdmFyIGFycmF5VmFsdWVzID0gQXJyYXlJdGVyYXRvcnMudmFsdWVzO1xuICB2YXIgYXJyYXlLZXlzID0gQXJyYXlJdGVyYXRvcnMua2V5cztcbiAgdmFyIGFycmF5RW50cmllcyA9IEFycmF5SXRlcmF0b3JzLmVudHJpZXM7XG4gIHZhciBhcnJheUxhc3RJbmRleE9mID0gQXJyYXlQcm90by5sYXN0SW5kZXhPZjtcbiAgdmFyIGFycmF5UmVkdWNlID0gQXJyYXlQcm90by5yZWR1Y2U7XG4gIHZhciBhcnJheVJlZHVjZVJpZ2h0ID0gQXJyYXlQcm90by5yZWR1Y2VSaWdodDtcbiAgdmFyIGFycmF5Sm9pbiA9IEFycmF5UHJvdG8uam9pbjtcbiAgdmFyIGFycmF5U29ydCA9IEFycmF5UHJvdG8uc29ydDtcbiAgdmFyIGFycmF5U2xpY2UgPSBBcnJheVByb3RvLnNsaWNlO1xuICB2YXIgYXJyYXlUb1N0cmluZyA9IEFycmF5UHJvdG8udG9TdHJpbmc7XG4gIHZhciBhcnJheVRvTG9jYWxlU3RyaW5nID0gQXJyYXlQcm90by50b0xvY2FsZVN0cmluZztcbiAgdmFyIElURVJBVE9SID0gd2tzKCdpdGVyYXRvcicpO1xuICB2YXIgVEFHID0gd2tzKCd0b1N0cmluZ1RhZycpO1xuICB2YXIgVFlQRURfQ09OU1RSVUNUT1IgPSB1aWQoJ3R5cGVkX2NvbnN0cnVjdG9yJyk7XG4gIHZhciBERUZfQ09OU1RSVUNUT1IgPSB1aWQoJ2RlZl9jb25zdHJ1Y3RvcicpO1xuICB2YXIgQUxMX0NPTlNUUlVDVE9SUyA9ICR0eXBlZC5DT05TVFI7XG4gIHZhciBUWVBFRF9BUlJBWSA9ICR0eXBlZC5UWVBFRDtcbiAgdmFyIFZJRVcgPSAkdHlwZWQuVklFVztcbiAgdmFyIFdST05HX0xFTkdUSCA9ICdXcm9uZyBsZW5ndGghJztcblxuICB2YXIgJG1hcCA9IGNyZWF0ZUFycmF5TWV0aG9kKDEsIGZ1bmN0aW9uIChPLCBsZW5ndGgpIHtcbiAgICByZXR1cm4gYWxsb2NhdGUoc3BlY2llc0NvbnN0cnVjdG9yKE8sIE9bREVGX0NPTlNUUlVDVE9SXSksIGxlbmd0aCk7XG4gIH0pO1xuXG4gIHZhciBMSVRUTEVfRU5ESUFOID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgIHJldHVybiBuZXcgVWludDhBcnJheShuZXcgVWludDE2QXJyYXkoWzFdKS5idWZmZXIpWzBdID09PSAxO1xuICB9KTtcblxuICB2YXIgRk9SQ0VEX1NFVCA9ICEhVWludDhBcnJheSAmJiAhIVVpbnQ4QXJyYXlbUFJPVE9UWVBFXS5zZXQgJiYgZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIG5ldyBVaW50OEFycmF5KDEpLnNldCh7fSk7XG4gIH0pO1xuXG4gIHZhciB0b09mZnNldCA9IGZ1bmN0aW9uIChpdCwgQllURVMpIHtcbiAgICB2YXIgb2Zmc2V0ID0gdG9JbnRlZ2VyKGl0KTtcbiAgICBpZiAob2Zmc2V0IDwgMCB8fCBvZmZzZXQgJSBCWVRFUykgdGhyb3cgUmFuZ2VFcnJvcignV3Jvbmcgb2Zmc2V0IScpO1xuICAgIHJldHVybiBvZmZzZXQ7XG4gIH07XG5cbiAgdmFyIHZhbGlkYXRlID0gZnVuY3Rpb24gKGl0KSB7XG4gICAgaWYgKGlzT2JqZWN0KGl0KSAmJiBUWVBFRF9BUlJBWSBpbiBpdCkgcmV0dXJuIGl0O1xuICAgIHRocm93IFR5cGVFcnJvcihpdCArICcgaXMgbm90IGEgdHlwZWQgYXJyYXkhJyk7XG4gIH07XG5cbiAgdmFyIGFsbG9jYXRlID0gZnVuY3Rpb24gKEMsIGxlbmd0aCkge1xuICAgIGlmICghKGlzT2JqZWN0KEMpICYmIFRZUEVEX0NPTlNUUlVDVE9SIGluIEMpKSB7XG4gICAgICB0aHJvdyBUeXBlRXJyb3IoJ0l0IGlzIG5vdCBhIHR5cGVkIGFycmF5IGNvbnN0cnVjdG9yIScpO1xuICAgIH0gcmV0dXJuIG5ldyBDKGxlbmd0aCk7XG4gIH07XG5cbiAgdmFyIHNwZWNpZXNGcm9tTGlzdCA9IGZ1bmN0aW9uIChPLCBsaXN0KSB7XG4gICAgcmV0dXJuIGZyb21MaXN0KHNwZWNpZXNDb25zdHJ1Y3RvcihPLCBPW0RFRl9DT05TVFJVQ1RPUl0pLCBsaXN0KTtcbiAgfTtcblxuICB2YXIgZnJvbUxpc3QgPSBmdW5jdGlvbiAoQywgbGlzdCkge1xuICAgIHZhciBpbmRleCA9IDA7XG4gICAgdmFyIGxlbmd0aCA9IGxpc3QubGVuZ3RoO1xuICAgIHZhciByZXN1bHQgPSBhbGxvY2F0ZShDLCBsZW5ndGgpO1xuICAgIHdoaWxlIChsZW5ndGggPiBpbmRleCkgcmVzdWx0W2luZGV4XSA9IGxpc3RbaW5kZXgrK107XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICB2YXIgYWRkR2V0dGVyID0gZnVuY3Rpb24gKGl0LCBrZXksIGludGVybmFsKSB7XG4gICAgZFAoaXQsIGtleSwgeyBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRoaXMuX2RbaW50ZXJuYWxdOyB9IH0pO1xuICB9O1xuXG4gIHZhciAkZnJvbSA9IGZ1bmN0aW9uIGZyb20oc291cmNlIC8qICwgbWFwZm4sIHRoaXNBcmcgKi8pIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHNvdXJjZSk7XG4gICAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBtYXBmbiA9IGFMZW4gPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAgIHZhciBtYXBwaW5nID0gbWFwZm4gIT09IHVuZGVmaW5lZDtcbiAgICB2YXIgaXRlckZuID0gZ2V0SXRlckZuKE8pO1xuICAgIHZhciBpLCBsZW5ndGgsIHZhbHVlcywgcmVzdWx0LCBzdGVwLCBpdGVyYXRvcjtcbiAgICBpZiAoaXRlckZuICE9IHVuZGVmaW5lZCAmJiAhaXNBcnJheUl0ZXIoaXRlckZuKSkge1xuICAgICAgZm9yIChpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKE8pLCB2YWx1ZXMgPSBbXSwgaSA9IDA7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgaSsrKSB7XG4gICAgICAgIHZhbHVlcy5wdXNoKHN0ZXAudmFsdWUpO1xuICAgICAgfSBPID0gdmFsdWVzO1xuICAgIH1cbiAgICBpZiAobWFwcGluZyAmJiBhTGVuID4gMikgbWFwZm4gPSBjdHgobWFwZm4sIGFyZ3VtZW50c1syXSwgMik7XG4gICAgZm9yIChpID0gMCwgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpLCByZXN1bHQgPSBhbGxvY2F0ZSh0aGlzLCBsZW5ndGgpOyBsZW5ndGggPiBpOyBpKyspIHtcbiAgICAgIHJlc3VsdFtpXSA9IG1hcHBpbmcgPyBtYXBmbihPW2ldLCBpKSA6IE9baV07XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG4gIH07XG5cbiAgdmFyICRvZiA9IGZ1bmN0aW9uIG9mKC8qIC4uLml0ZW1zICovKSB7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgbGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgcmVzdWx0ID0gYWxsb2NhdGUodGhpcywgbGVuZ3RoKTtcbiAgICB3aGlsZSAobGVuZ3RoID4gaW5kZXgpIHJlc3VsdFtpbmRleF0gPSBhcmd1bWVudHNbaW5kZXgrK107XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfTtcblxuICAvLyBpT1MgU2FmYXJpIDYueCBmYWlscyBoZXJlXG4gIHZhciBUT19MT0NBTEVfQlVHID0gISFVaW50OEFycmF5ICYmIGZhaWxzKGZ1bmN0aW9uICgpIHsgYXJyYXlUb0xvY2FsZVN0cmluZy5jYWxsKG5ldyBVaW50OEFycmF5KDEpKTsgfSk7XG5cbiAgdmFyICR0b0xvY2FsZVN0cmluZyA9IGZ1bmN0aW9uIHRvTG9jYWxlU3RyaW5nKCkge1xuICAgIHJldHVybiBhcnJheVRvTG9jYWxlU3RyaW5nLmFwcGx5KFRPX0xPQ0FMRV9CVUcgPyBhcnJheVNsaWNlLmNhbGwodmFsaWRhdGUodGhpcykpIDogdmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gIH07XG5cbiAgdmFyIHByb3RvID0ge1xuICAgIGNvcHlXaXRoaW46IGZ1bmN0aW9uIGNvcHlXaXRoaW4odGFyZ2V0LCBzdGFydCAvKiAsIGVuZCAqLykge1xuICAgICAgcmV0dXJuIGFycmF5Q29weVdpdGhpbi5jYWxsKHZhbGlkYXRlKHRoaXMpLCB0YXJnZXQsIHN0YXJ0LCBhcmd1bWVudHMubGVuZ3RoID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBldmVyeTogZnVuY3Rpb24gZXZlcnkoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIHJldHVybiBhcnJheUV2ZXJ5KHZhbGlkYXRlKHRoaXMpLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBmaWxsOiBmdW5jdGlvbiBmaWxsKHZhbHVlIC8qICwgc3RhcnQsIGVuZCAqLykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4gYXJyYXlGaWxsLmFwcGx5KHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgZmlsdGVyOiBmdW5jdGlvbiBmaWx0ZXIoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIHJldHVybiBzcGVjaWVzRnJvbUxpc3QodGhpcywgYXJyYXlGaWx0ZXIodmFsaWRhdGUodGhpcyksIGNhbGxiYWNrZm4sXG4gICAgICAgIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKSk7XG4gICAgfSxcbiAgICBmaW5kOiBmdW5jdGlvbiBmaW5kKHByZWRpY2F0ZSAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIHJldHVybiBhcnJheUZpbmQodmFsaWRhdGUodGhpcyksIHByZWRpY2F0ZSwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgZmluZEluZGV4OiBmdW5jdGlvbiBmaW5kSW5kZXgocHJlZGljYXRlIC8qICwgdGhpc0FyZyAqLykge1xuICAgICAgcmV0dXJuIGFycmF5RmluZEluZGV4KHZhbGlkYXRlKHRoaXMpLCBwcmVkaWNhdGUsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGZvckVhY2g6IGZ1bmN0aW9uIGZvckVhY2goY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICAgIGFycmF5Rm9yRWFjaCh2YWxpZGF0ZSh0aGlzKSwgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICAgIH0sXG4gICAgaW5kZXhPZjogZnVuY3Rpb24gaW5kZXhPZihzZWFyY2hFbGVtZW50IC8qICwgZnJvbUluZGV4ICovKSB7XG4gICAgICByZXR1cm4gYXJyYXlJbmRleE9mKHZhbGlkYXRlKHRoaXMpLCBzZWFyY2hFbGVtZW50LCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoc2VhcmNoRWxlbWVudCAvKiAsIGZyb21JbmRleCAqLykge1xuICAgICAgcmV0dXJuIGFycmF5SW5jbHVkZXModmFsaWRhdGUodGhpcyksIHNlYXJjaEVsZW1lbnQsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkKTtcbiAgICB9LFxuICAgIGpvaW46IGZ1bmN0aW9uIGpvaW4oc2VwYXJhdG9yKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHJldHVybiBhcnJheUpvaW4uYXBwbHkodmFsaWRhdGUodGhpcyksIGFyZ3VtZW50cyk7XG4gICAgfSxcbiAgICBsYXN0SW5kZXhPZjogZnVuY3Rpb24gbGFzdEluZGV4T2Yoc2VhcmNoRWxlbWVudCAvKiAsIGZyb21JbmRleCAqLykgeyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICByZXR1cm4gYXJyYXlMYXN0SW5kZXhPZi5hcHBseSh2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIG1hcDogZnVuY3Rpb24gbWFwKG1hcGZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgICAgcmV0dXJuICRtYXAodmFsaWRhdGUodGhpcyksIG1hcGZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICByZWR1Y2U6IGZ1bmN0aW9uIHJlZHVjZShjYWxsYmFja2ZuIC8qICwgaW5pdGlhbFZhbHVlICovKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHJldHVybiBhcnJheVJlZHVjZS5hcHBseSh2YWxpZGF0ZSh0aGlzKSwgYXJndW1lbnRzKTtcbiAgICB9LFxuICAgIHJlZHVjZVJpZ2h0OiBmdW5jdGlvbiByZWR1Y2VSaWdodChjYWxsYmFja2ZuIC8qICwgaW5pdGlhbFZhbHVlICovKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICAgIHJldHVybiBhcnJheVJlZHVjZVJpZ2h0LmFwcGx5KHZhbGlkYXRlKHRoaXMpLCBhcmd1bWVudHMpO1xuICAgIH0sXG4gICAgcmV2ZXJzZTogZnVuY3Rpb24gcmV2ZXJzZSgpIHtcbiAgICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICAgIHZhciBsZW5ndGggPSB2YWxpZGF0ZSh0aGF0KS5sZW5ndGg7XG4gICAgICB2YXIgbWlkZGxlID0gTWF0aC5mbG9vcihsZW5ndGggLyAyKTtcbiAgICAgIHZhciBpbmRleCA9IDA7XG4gICAgICB2YXIgdmFsdWU7XG4gICAgICB3aGlsZSAoaW5kZXggPCBtaWRkbGUpIHtcbiAgICAgICAgdmFsdWUgPSB0aGF0W2luZGV4XTtcbiAgICAgICAgdGhhdFtpbmRleCsrXSA9IHRoYXRbLS1sZW5ndGhdO1xuICAgICAgICB0aGF0W2xlbmd0aF0gPSB2YWx1ZTtcbiAgICAgIH0gcmV0dXJuIHRoYXQ7XG4gICAgfSxcbiAgICBzb21lOiBmdW5jdGlvbiBzb21lKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgICByZXR1cm4gYXJyYXlTb21lKHZhbGlkYXRlKHRoaXMpLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gICAgfSxcbiAgICBzb3J0OiBmdW5jdGlvbiBzb3J0KGNvbXBhcmVmbikge1xuICAgICAgcmV0dXJuIGFycmF5U29ydC5jYWxsKHZhbGlkYXRlKHRoaXMpLCBjb21wYXJlZm4pO1xuICAgIH0sXG4gICAgc3ViYXJyYXk6IGZ1bmN0aW9uIHN1YmFycmF5KGJlZ2luLCBlbmQpIHtcbiAgICAgIHZhciBPID0gdmFsaWRhdGUodGhpcyk7XG4gICAgICB2YXIgbGVuZ3RoID0gTy5sZW5ndGg7XG4gICAgICB2YXIgJGJlZ2luID0gdG9BYnNvbHV0ZUluZGV4KGJlZ2luLCBsZW5ndGgpO1xuICAgICAgcmV0dXJuIG5ldyAoc3BlY2llc0NvbnN0cnVjdG9yKE8sIE9bREVGX0NPTlNUUlVDVE9SXSkpKFxuICAgICAgICBPLmJ1ZmZlcixcbiAgICAgICAgTy5ieXRlT2Zmc2V0ICsgJGJlZ2luICogTy5CWVRFU19QRVJfRUxFTUVOVCxcbiAgICAgICAgdG9MZW5ndGgoKGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuZ3RoIDogdG9BYnNvbHV0ZUluZGV4KGVuZCwgbGVuZ3RoKSkgLSAkYmVnaW4pXG4gICAgICApO1xuICAgIH1cbiAgfTtcblxuICB2YXIgJHNsaWNlID0gZnVuY3Rpb24gc2xpY2Uoc3RhcnQsIGVuZCkge1xuICAgIHJldHVybiBzcGVjaWVzRnJvbUxpc3QodGhpcywgYXJyYXlTbGljZS5jYWxsKHZhbGlkYXRlKHRoaXMpLCBzdGFydCwgZW5kKSk7XG4gIH07XG5cbiAgdmFyICRzZXQgPSBmdW5jdGlvbiBzZXQoYXJyYXlMaWtlIC8qICwgb2Zmc2V0ICovKSB7XG4gICAgdmFsaWRhdGUodGhpcyk7XG4gICAgdmFyIG9mZnNldCA9IHRvT2Zmc2V0KGFyZ3VtZW50c1sxXSwgMSk7XG4gICAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoO1xuICAgIHZhciBzcmMgPSB0b09iamVjdChhcnJheUxpa2UpO1xuICAgIHZhciBsZW4gPSB0b0xlbmd0aChzcmMubGVuZ3RoKTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIGlmIChsZW4gKyBvZmZzZXQgPiBsZW5ndGgpIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfTEVOR1RIKTtcbiAgICB3aGlsZSAoaW5kZXggPCBsZW4pIHRoaXNbb2Zmc2V0ICsgaW5kZXhdID0gc3JjW2luZGV4KytdO1xuICB9O1xuXG4gIHZhciAkaXRlcmF0b3JzID0ge1xuICAgIGVudHJpZXM6IGZ1bmN0aW9uIGVudHJpZXMoKSB7XG4gICAgICByZXR1cm4gYXJyYXlFbnRyaWVzLmNhbGwodmFsaWRhdGUodGhpcykpO1xuICAgIH0sXG4gICAga2V5czogZnVuY3Rpb24ga2V5cygpIHtcbiAgICAgIHJldHVybiBhcnJheUtleXMuY2FsbCh2YWxpZGF0ZSh0aGlzKSk7XG4gICAgfSxcbiAgICB2YWx1ZXM6IGZ1bmN0aW9uIHZhbHVlcygpIHtcbiAgICAgIHJldHVybiBhcnJheVZhbHVlcy5jYWxsKHZhbGlkYXRlKHRoaXMpKTtcbiAgICB9XG4gIH07XG5cbiAgdmFyIGlzVEFJbmRleCA9IGZ1bmN0aW9uICh0YXJnZXQsIGtleSkge1xuICAgIHJldHVybiBpc09iamVjdCh0YXJnZXQpXG4gICAgICAmJiB0YXJnZXRbVFlQRURfQVJSQVldXG4gICAgICAmJiB0eXBlb2Yga2V5ICE9ICdzeW1ib2wnXG4gICAgICAmJiBrZXkgaW4gdGFyZ2V0XG4gICAgICAmJiBTdHJpbmcoK2tleSkgPT0gU3RyaW5nKGtleSk7XG4gIH07XG4gIHZhciAkZ2V0RGVzYyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0YXJnZXQsIGtleSkge1xuICAgIHJldHVybiBpc1RBSW5kZXgodGFyZ2V0LCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKVxuICAgICAgPyBwcm9wZXJ0eURlc2MoMiwgdGFyZ2V0W2tleV0pXG4gICAgICA6IGdPUEQodGFyZ2V0LCBrZXkpO1xuICB9O1xuICB2YXIgJHNldERlc2MgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eSh0YXJnZXQsIGtleSwgZGVzYykge1xuICAgIGlmIChpc1RBSW5kZXgodGFyZ2V0LCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKVxuICAgICAgJiYgaXNPYmplY3QoZGVzYylcbiAgICAgICYmIGhhcyhkZXNjLCAndmFsdWUnKVxuICAgICAgJiYgIWhhcyhkZXNjLCAnZ2V0JylcbiAgICAgICYmICFoYXMoZGVzYywgJ3NldCcpXG4gICAgICAvLyBUT0RPOiBhZGQgdmFsaWRhdGlvbiBkZXNjcmlwdG9yIHcvbyBjYWxsaW5nIGFjY2Vzc29yc1xuICAgICAgJiYgIWRlc2MuY29uZmlndXJhYmxlXG4gICAgICAmJiAoIWhhcyhkZXNjLCAnd3JpdGFibGUnKSB8fCBkZXNjLndyaXRhYmxlKVxuICAgICAgJiYgKCFoYXMoZGVzYywgJ2VudW1lcmFibGUnKSB8fCBkZXNjLmVudW1lcmFibGUpXG4gICAgKSB7XG4gICAgICB0YXJnZXRba2V5XSA9IGRlc2MudmFsdWU7XG4gICAgICByZXR1cm4gdGFyZ2V0O1xuICAgIH0gcmV0dXJuIGRQKHRhcmdldCwga2V5LCBkZXNjKTtcbiAgfTtcblxuICBpZiAoIUFMTF9DT05TVFJVQ1RPUlMpIHtcbiAgICAkR09QRC5mID0gJGdldERlc2M7XG4gICAgJERQLmYgPSAkc2V0RGVzYztcbiAgfVxuXG4gICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIUFMTF9DT05TVFJVQ1RPUlMsICdPYmplY3QnLCB7XG4gICAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkZ2V0RGVzYyxcbiAgICBkZWZpbmVQcm9wZXJ0eTogJHNldERlc2NcbiAgfSk7XG5cbiAgaWYgKGZhaWxzKGZ1bmN0aW9uICgpIHsgYXJyYXlUb1N0cmluZy5jYWxsKHt9KTsgfSkpIHtcbiAgICBhcnJheVRvU3RyaW5nID0gYXJyYXlUb0xvY2FsZVN0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgICAgcmV0dXJuIGFycmF5Sm9pbi5jYWxsKHRoaXMpO1xuICAgIH07XG4gIH1cblxuICB2YXIgJFR5cGVkQXJyYXlQcm90b3R5cGUkID0gcmVkZWZpbmVBbGwoe30sIHByb3RvKTtcbiAgcmVkZWZpbmVBbGwoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCAkaXRlcmF0b3JzKTtcbiAgaGlkZSgkVHlwZWRBcnJheVByb3RvdHlwZSQsIElURVJBVE9SLCAkaXRlcmF0b3JzLnZhbHVlcyk7XG4gIHJlZGVmaW5lQWxsKCRUeXBlZEFycmF5UHJvdG90eXBlJCwge1xuICAgIHNsaWNlOiAkc2xpY2UsXG4gICAgc2V0OiAkc2V0LFxuICAgIGNvbnN0cnVjdG9yOiBmdW5jdGlvbiAoKSB7IC8qIG5vb3AgKi8gfSxcbiAgICB0b1N0cmluZzogYXJyYXlUb1N0cmluZyxcbiAgICB0b0xvY2FsZVN0cmluZzogJHRvTG9jYWxlU3RyaW5nXG4gIH0pO1xuICBhZGRHZXR0ZXIoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCAnYnVmZmVyJywgJ2InKTtcbiAgYWRkR2V0dGVyKCRUeXBlZEFycmF5UHJvdG90eXBlJCwgJ2J5dGVPZmZzZXQnLCAnbycpO1xuICBhZGRHZXR0ZXIoJFR5cGVkQXJyYXlQcm90b3R5cGUkLCAnYnl0ZUxlbmd0aCcsICdsJyk7XG4gIGFkZEdldHRlcigkVHlwZWRBcnJheVByb3RvdHlwZSQsICdsZW5ndGgnLCAnZScpO1xuICBkUCgkVHlwZWRBcnJheVByb3RvdHlwZSQsIFRBRywge1xuICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpc1tUWVBFRF9BUlJBWV07IH1cbiAgfSk7XG5cbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG1heC1zdGF0ZW1lbnRzXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKEtFWSwgQllURVMsIHdyYXBwZXIsIENMQU1QRUQpIHtcbiAgICBDTEFNUEVEID0gISFDTEFNUEVEO1xuICAgIHZhciBOQU1FID0gS0VZICsgKENMQU1QRUQgPyAnQ2xhbXBlZCcgOiAnJykgKyAnQXJyYXknO1xuICAgIHZhciBHRVRURVIgPSAnZ2V0JyArIEtFWTtcbiAgICB2YXIgU0VUVEVSID0gJ3NldCcgKyBLRVk7XG4gICAgdmFyIFR5cGVkQXJyYXkgPSBnbG9iYWxbTkFNRV07XG4gICAgdmFyIEJhc2UgPSBUeXBlZEFycmF5IHx8IHt9O1xuICAgIHZhciBUQUMgPSBUeXBlZEFycmF5ICYmIGdldFByb3RvdHlwZU9mKFR5cGVkQXJyYXkpO1xuICAgIHZhciBGT1JDRUQgPSAhVHlwZWRBcnJheSB8fCAhJHR5cGVkLkFCVjtcbiAgICB2YXIgTyA9IHt9O1xuICAgIHZhciBUeXBlZEFycmF5UHJvdG90eXBlID0gVHlwZWRBcnJheSAmJiBUeXBlZEFycmF5W1BST1RPVFlQRV07XG4gICAgdmFyIGdldHRlciA9IGZ1bmN0aW9uICh0aGF0LCBpbmRleCkge1xuICAgICAgdmFyIGRhdGEgPSB0aGF0Ll9kO1xuICAgICAgcmV0dXJuIGRhdGEudltHRVRURVJdKGluZGV4ICogQllURVMgKyBkYXRhLm8sIExJVFRMRV9FTkRJQU4pO1xuICAgIH07XG4gICAgdmFyIHNldHRlciA9IGZ1bmN0aW9uICh0aGF0LCBpbmRleCwgdmFsdWUpIHtcbiAgICAgIHZhciBkYXRhID0gdGhhdC5fZDtcbiAgICAgIGlmIChDTEFNUEVEKSB2YWx1ZSA9ICh2YWx1ZSA9IE1hdGgucm91bmQodmFsdWUpKSA8IDAgPyAwIDogdmFsdWUgPiAweGZmID8gMHhmZiA6IHZhbHVlICYgMHhmZjtcbiAgICAgIGRhdGEudltTRVRURVJdKGluZGV4ICogQllURVMgKyBkYXRhLm8sIHZhbHVlLCBMSVRUTEVfRU5ESUFOKTtcbiAgICB9O1xuICAgIHZhciBhZGRFbGVtZW50ID0gZnVuY3Rpb24gKHRoYXQsIGluZGV4KSB7XG4gICAgICBkUCh0aGF0LCBpbmRleCwge1xuICAgICAgICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICByZXR1cm4gZ2V0dGVyKHRoaXMsIGluZGV4KTtcbiAgICAgICAgfSxcbiAgICAgICAgc2V0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICByZXR1cm4gc2V0dGVyKHRoaXMsIGluZGV4LCB2YWx1ZSk7XG4gICAgICAgIH0sXG4gICAgICAgIGVudW1lcmFibGU6IHRydWVcbiAgICAgIH0pO1xuICAgIH07XG4gICAgaWYgKEZPUkNFRCkge1xuICAgICAgVHlwZWRBcnJheSA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGRhdGEsICRvZmZzZXQsICRsZW5ndGgpIHtcbiAgICAgICAgYW5JbnN0YW5jZSh0aGF0LCBUeXBlZEFycmF5LCBOQU1FLCAnX2QnKTtcbiAgICAgICAgdmFyIGluZGV4ID0gMDtcbiAgICAgICAgdmFyIG9mZnNldCA9IDA7XG4gICAgICAgIHZhciBidWZmZXIsIGJ5dGVMZW5ndGgsIGxlbmd0aCwga2xhc3M7XG4gICAgICAgIGlmICghaXNPYmplY3QoZGF0YSkpIHtcbiAgICAgICAgICBsZW5ndGggPSB0b0luZGV4KGRhdGEpO1xuICAgICAgICAgIGJ5dGVMZW5ndGggPSBsZW5ndGggKiBCWVRFUztcbiAgICAgICAgICBidWZmZXIgPSBuZXcgJEFycmF5QnVmZmVyKGJ5dGVMZW5ndGgpO1xuICAgICAgICB9IGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiAkQXJyYXlCdWZmZXIgfHwgKGtsYXNzID0gY2xhc3NvZihkYXRhKSkgPT0gQVJSQVlfQlVGRkVSIHx8IGtsYXNzID09IFNIQVJFRF9CVUZGRVIpIHtcbiAgICAgICAgICBidWZmZXIgPSBkYXRhO1xuICAgICAgICAgIG9mZnNldCA9IHRvT2Zmc2V0KCRvZmZzZXQsIEJZVEVTKTtcbiAgICAgICAgICB2YXIgJGxlbiA9IGRhdGEuYnl0ZUxlbmd0aDtcbiAgICAgICAgICBpZiAoJGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAoJGxlbiAlIEJZVEVTKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgICAgICAgICBieXRlTGVuZ3RoID0gJGxlbiAtIG9mZnNldDtcbiAgICAgICAgICAgIGlmIChieXRlTGVuZ3RoIDwgMCkgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBieXRlTGVuZ3RoID0gdG9MZW5ndGgoJGxlbmd0aCkgKiBCWVRFUztcbiAgICAgICAgICAgIGlmIChieXRlTGVuZ3RoICsgb2Zmc2V0ID4gJGxlbikgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19MRU5HVEgpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBsZW5ndGggPSBieXRlTGVuZ3RoIC8gQllURVM7XG4gICAgICAgIH0gZWxzZSBpZiAoVFlQRURfQVJSQVkgaW4gZGF0YSkge1xuICAgICAgICAgIHJldHVybiBmcm9tTGlzdChUeXBlZEFycmF5LCBkYXRhKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gJGZyb20uY2FsbChUeXBlZEFycmF5LCBkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBoaWRlKHRoYXQsICdfZCcsIHtcbiAgICAgICAgICBiOiBidWZmZXIsXG4gICAgICAgICAgbzogb2Zmc2V0LFxuICAgICAgICAgIGw6IGJ5dGVMZW5ndGgsXG4gICAgICAgICAgZTogbGVuZ3RoLFxuICAgICAgICAgIHY6IG5ldyAkRGF0YVZpZXcoYnVmZmVyKVxuICAgICAgICB9KTtcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgbGVuZ3RoKSBhZGRFbGVtZW50KHRoYXQsIGluZGV4KyspO1xuICAgICAgfSk7XG4gICAgICBUeXBlZEFycmF5UHJvdG90eXBlID0gVHlwZWRBcnJheVtQUk9UT1RZUEVdID0gY3JlYXRlKCRUeXBlZEFycmF5UHJvdG90eXBlJCk7XG4gICAgICBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsICdjb25zdHJ1Y3RvcicsIFR5cGVkQXJyYXkpO1xuICAgIH0gZWxzZSBpZiAoIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIFR5cGVkQXJyYXkoMSk7XG4gICAgfSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgICAgIG5ldyBUeXBlZEFycmF5KC0xKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICB9KSB8fCAhJGl0ZXJEZXRlY3QoZnVuY3Rpb24gKGl0ZXIpIHtcbiAgICAgIG5ldyBUeXBlZEFycmF5KCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgICBuZXcgVHlwZWRBcnJheShudWxsKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICAgIG5ldyBUeXBlZEFycmF5KDEuNSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgICBuZXcgVHlwZWRBcnJheShpdGVyKTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICB9LCB0cnVlKSkge1xuICAgICAgVHlwZWRBcnJheSA9IHdyYXBwZXIoZnVuY3Rpb24gKHRoYXQsIGRhdGEsICRvZmZzZXQsICRsZW5ndGgpIHtcbiAgICAgICAgYW5JbnN0YW5jZSh0aGF0LCBUeXBlZEFycmF5LCBOQU1FKTtcbiAgICAgICAgdmFyIGtsYXNzO1xuICAgICAgICAvLyBgd3NgIG1vZHVsZSBidWcsIHRlbXBvcmFyaWx5IHJlbW92ZSB2YWxpZGF0aW9uIGxlbmd0aCBmb3IgVWludDhBcnJheVxuICAgICAgICAvLyBodHRwczovL2dpdGh1Yi5jb20vd2Vic29ja2V0cy93cy9wdWxsLzY0NVxuICAgICAgICBpZiAoIWlzT2JqZWN0KGRhdGEpKSByZXR1cm4gbmV3IEJhc2UodG9JbmRleChkYXRhKSk7XG4gICAgICAgIGlmIChkYXRhIGluc3RhbmNlb2YgJEFycmF5QnVmZmVyIHx8IChrbGFzcyA9IGNsYXNzb2YoZGF0YSkpID09IEFSUkFZX0JVRkZFUiB8fCBrbGFzcyA9PSBTSEFSRURfQlVGRkVSKSB7XG4gICAgICAgICAgcmV0dXJuICRsZW5ndGggIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyBuZXcgQmFzZShkYXRhLCB0b09mZnNldCgkb2Zmc2V0LCBCWVRFUyksICRsZW5ndGgpXG4gICAgICAgICAgICA6ICRvZmZzZXQgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICA/IG5ldyBCYXNlKGRhdGEsIHRvT2Zmc2V0KCRvZmZzZXQsIEJZVEVTKSlcbiAgICAgICAgICAgICAgOiBuZXcgQmFzZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoVFlQRURfQVJSQVkgaW4gZGF0YSkgcmV0dXJuIGZyb21MaXN0KFR5cGVkQXJyYXksIGRhdGEpO1xuICAgICAgICByZXR1cm4gJGZyb20uY2FsbChUeXBlZEFycmF5LCBkYXRhKTtcbiAgICAgIH0pO1xuICAgICAgYXJyYXlGb3JFYWNoKFRBQyAhPT0gRnVuY3Rpb24ucHJvdG90eXBlID8gZ09QTihCYXNlKS5jb25jYXQoZ09QTihUQUMpKSA6IGdPUE4oQmFzZSksIGZ1bmN0aW9uIChrZXkpIHtcbiAgICAgICAgaWYgKCEoa2V5IGluIFR5cGVkQXJyYXkpKSBoaWRlKFR5cGVkQXJyYXksIGtleSwgQmFzZVtrZXldKTtcbiAgICAgIH0pO1xuICAgICAgVHlwZWRBcnJheVtQUk9UT1RZUEVdID0gVHlwZWRBcnJheVByb3RvdHlwZTtcbiAgICAgIGlmICghTElCUkFSWSkgVHlwZWRBcnJheVByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFR5cGVkQXJyYXk7XG4gICAgfVxuICAgIHZhciAkbmF0aXZlSXRlcmF0b3IgPSBUeXBlZEFycmF5UHJvdG90eXBlW0lURVJBVE9SXTtcbiAgICB2YXIgQ09SUkVDVF9JVEVSX05BTUUgPSAhISRuYXRpdmVJdGVyYXRvclxuICAgICAgJiYgKCRuYXRpdmVJdGVyYXRvci5uYW1lID09ICd2YWx1ZXMnIHx8ICRuYXRpdmVJdGVyYXRvci5uYW1lID09IHVuZGVmaW5lZCk7XG4gICAgdmFyICRpdGVyYXRvciA9ICRpdGVyYXRvcnMudmFsdWVzO1xuICAgIGhpZGUoVHlwZWRBcnJheSwgVFlQRURfQ09OU1RSVUNUT1IsIHRydWUpO1xuICAgIGhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgVFlQRURfQVJSQVksIE5BTUUpO1xuICAgIGhpZGUoVHlwZWRBcnJheVByb3RvdHlwZSwgVklFVywgdHJ1ZSk7XG4gICAgaGlkZShUeXBlZEFycmF5UHJvdG90eXBlLCBERUZfQ09OU1RSVUNUT1IsIFR5cGVkQXJyYXkpO1xuXG4gICAgaWYgKENMQU1QRUQgPyBuZXcgVHlwZWRBcnJheSgxKVtUQUddICE9IE5BTUUgOiAhKFRBRyBpbiBUeXBlZEFycmF5UHJvdG90eXBlKSkge1xuICAgICAgZFAoVHlwZWRBcnJheVByb3RvdHlwZSwgVEFHLCB7XG4gICAgICAgIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gTkFNRTsgfVxuICAgICAgfSk7XG4gICAgfVxuXG4gICAgT1tOQU1FXSA9IFR5cGVkQXJyYXk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqIChUeXBlZEFycmF5ICE9IEJhc2UpLCBPKTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5TLCBOQU1FLCB7XG4gICAgICBCWVRFU19QRVJfRUxFTUVOVDogQllURVNcbiAgICB9KTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24gKCkgeyBCYXNlLm9mLmNhbGwoVHlwZWRBcnJheSwgMSk7IH0pLCBOQU1FLCB7XG4gICAgICBmcm9tOiAkZnJvbSxcbiAgICAgIG9mOiAkb2ZcbiAgICB9KTtcblxuICAgIGlmICghKEJZVEVTX1BFUl9FTEVNRU5UIGluIFR5cGVkQXJyYXlQcm90b3R5cGUpKSBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsIEJZVEVTX1BFUl9FTEVNRU5ULCBCWVRFUyk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUCwgTkFNRSwgcHJvdG8pO1xuXG4gICAgc2V0U3BlY2llcyhOQU1FKTtcblxuICAgICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogRk9SQ0VEX1NFVCwgTkFNRSwgeyBzZXQ6ICRzZXQgfSk7XG5cbiAgICAkZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFDT1JSRUNUX0lURVJfTkFNRSwgTkFNRSwgJGl0ZXJhdG9ycyk7XG5cbiAgICBpZiAoIUxJQlJBUlkgJiYgVHlwZWRBcnJheVByb3RvdHlwZS50b1N0cmluZyAhPSBhcnJheVRvU3RyaW5nKSBUeXBlZEFycmF5UHJvdG90eXBlLnRvU3RyaW5nID0gYXJyYXlUb1N0cmluZztcblxuICAgICRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgbmV3IFR5cGVkQXJyYXkoMSkuc2xpY2UoKTtcbiAgICB9KSwgTkFNRSwgeyBzbGljZTogJHNsaWNlIH0pO1xuXG4gICAgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgcmV0dXJuIFsxLCAyXS50b0xvY2FsZVN0cmluZygpICE9IG5ldyBUeXBlZEFycmF5KFsxLCAyXSkudG9Mb2NhbGVTdHJpbmcoKTtcbiAgICB9KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgICAgVHlwZWRBcnJheVByb3RvdHlwZS50b0xvY2FsZVN0cmluZy5jYWxsKFsxLCAyXSk7XG4gICAgfSkpLCBOQU1FLCB7IHRvTG9jYWxlU3RyaW5nOiAkdG9Mb2NhbGVTdHJpbmcgfSk7XG5cbiAgICBJdGVyYXRvcnNbTkFNRV0gPSBDT1JSRUNUX0lURVJfTkFNRSA/ICRuYXRpdmVJdGVyYXRvciA6ICRpdGVyYXRvcjtcbiAgICBpZiAoIUxJQlJBUlkgJiYgIUNPUlJFQ1RfSVRFUl9OQU1FKSBoaWRlKFR5cGVkQXJyYXlQcm90b3R5cGUsIElURVJBVE9SLCAkaXRlcmF0b3IpO1xuICB9O1xufSBlbHNlIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9O1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIERFU0NSSVBUT1JTID0gcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKTtcbnZhciBMSUJSQVJZID0gcmVxdWlyZSgnLi9fbGlicmFyeScpO1xudmFyICR0eXBlZCA9IHJlcXVpcmUoJy4vX3R5cGVkJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciByZWRlZmluZUFsbCA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lLWFsbCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBhbkluc3RhbmNlID0gcmVxdWlyZSgnLi9fYW4taW5zdGFuY2UnKTtcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciB0b0luZGV4ID0gcmVxdWlyZSgnLi9fdG8taW5kZXgnKTtcbnZhciBnT1BOID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciBhcnJheUZpbGwgPSByZXF1aXJlKCcuL19hcnJheS1maWxsJyk7XG52YXIgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpO1xudmFyIEFSUkFZX0JVRkZFUiA9ICdBcnJheUJ1ZmZlcic7XG52YXIgREFUQV9WSUVXID0gJ0RhdGFWaWV3JztcbnZhciBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcbnZhciBXUk9OR19MRU5HVEggPSAnV3JvbmcgbGVuZ3RoISc7XG52YXIgV1JPTkdfSU5ERVggPSAnV3JvbmcgaW5kZXghJztcbnZhciAkQXJyYXlCdWZmZXIgPSBnbG9iYWxbQVJSQVlfQlVGRkVSXTtcbnZhciAkRGF0YVZpZXcgPSBnbG9iYWxbREFUQV9WSUVXXTtcbnZhciBNYXRoID0gZ2xvYmFsLk1hdGg7XG52YXIgUmFuZ2VFcnJvciA9IGdsb2JhbC5SYW5nZUVycm9yO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNoYWRvdy1yZXN0cmljdGVkLW5hbWVzXG52YXIgSW5maW5pdHkgPSBnbG9iYWwuSW5maW5pdHk7XG52YXIgQmFzZUJ1ZmZlciA9ICRBcnJheUJ1ZmZlcjtcbnZhciBhYnMgPSBNYXRoLmFicztcbnZhciBwb3cgPSBNYXRoLnBvdztcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgbG9nID0gTWF0aC5sb2c7XG52YXIgTE4yID0gTWF0aC5MTjI7XG52YXIgQlVGRkVSID0gJ2J1ZmZlcic7XG52YXIgQllURV9MRU5HVEggPSAnYnl0ZUxlbmd0aCc7XG52YXIgQllURV9PRkZTRVQgPSAnYnl0ZU9mZnNldCc7XG52YXIgJEJVRkZFUiA9IERFU0NSSVBUT1JTID8gJ19iJyA6IEJVRkZFUjtcbnZhciAkTEVOR1RIID0gREVTQ1JJUFRPUlMgPyAnX2wnIDogQllURV9MRU5HVEg7XG52YXIgJE9GRlNFVCA9IERFU0NSSVBUT1JTID8gJ19vJyA6IEJZVEVfT0ZGU0VUO1xuXG4vLyBJRUVFNzU0IGNvbnZlcnNpb25zIGJhc2VkIG9uIGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvaWVlZTc1NFxuZnVuY3Rpb24gcGFja0lFRUU3NTQodmFsdWUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgYnVmZmVyID0gbmV3IEFycmF5KG5CeXRlcyk7XG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxO1xuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMTtcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxO1xuICB2YXIgcnQgPSBtTGVuID09PSAyMyA/IHBvdygyLCAtMjQpIC0gcG93KDIsIC03NykgOiAwO1xuICB2YXIgaSA9IDA7XG4gIHZhciBzID0gdmFsdWUgPCAwIHx8IHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDAgPyAxIDogMDtcbiAgdmFyIGUsIG0sIGM7XG4gIHZhbHVlID0gYWJzKHZhbHVlKTtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICBpZiAodmFsdWUgIT0gdmFsdWUgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXNlbGYtY29tcGFyZVxuICAgIG0gPSB2YWx1ZSAhPSB2YWx1ZSA/IDEgOiAwO1xuICAgIGUgPSBlTWF4O1xuICB9IGVsc2Uge1xuICAgIGUgPSBmbG9vcihsb2codmFsdWUpIC8gTE4yKTtcbiAgICBpZiAodmFsdWUgKiAoYyA9IHBvdygyLCAtZSkpIDwgMSkge1xuICAgICAgZS0tO1xuICAgICAgYyAqPSAyO1xuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gYztcbiAgICB9IGVsc2Uge1xuICAgICAgdmFsdWUgKz0gcnQgKiBwb3coMiwgMSAtIGVCaWFzKTtcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKys7XG4gICAgICBjIC89IDI7XG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDA7XG4gICAgICBlID0gZU1heDtcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKHZhbHVlICogYyAtIDEpICogcG93KDIsIG1MZW4pO1xuICAgICAgZSA9IGUgKyBlQmlhcztcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogcG93KDIsIGVCaWFzIC0gMSkgKiBwb3coMiwgbUxlbik7XG4gICAgICBlID0gMDtcbiAgICB9XG4gIH1cbiAgZm9yICg7IG1MZW4gPj0gODsgYnVmZmVyW2krK10gPSBtICYgMjU1LCBtIC89IDI1NiwgbUxlbiAtPSA4KTtcbiAgZSA9IGUgPDwgbUxlbiB8IG07XG4gIGVMZW4gKz0gbUxlbjtcbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbaSsrXSA9IGUgJiAyNTUsIGUgLz0gMjU2LCBlTGVuIC09IDgpO1xuICBidWZmZXJbLS1pXSB8PSBzICogMTI4O1xuICByZXR1cm4gYnVmZmVyO1xufVxuZnVuY3Rpb24gdW5wYWNrSUVFRTc1NChidWZmZXIsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMTtcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDE7XG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMTtcbiAgdmFyIG5CaXRzID0gZUxlbiAtIDc7XG4gIHZhciBpID0gbkJ5dGVzIC0gMTtcbiAgdmFyIHMgPSBidWZmZXJbaS0tXTtcbiAgdmFyIGUgPSBzICYgMTI3O1xuICB2YXIgbTtcbiAgcyA+Pj0gNztcbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IGUgKiAyNTYgKyBidWZmZXJbaV0sIGktLSwgbkJpdHMgLT0gOCk7XG4gIG0gPSBlICYgKDEgPDwgLW5CaXRzKSAtIDE7XG4gIGUgPj49IC1uQml0cztcbiAgbkJpdHMgKz0gbUxlbjtcbiAgZm9yICg7IG5CaXRzID4gMDsgbSA9IG0gKiAyNTYgKyBidWZmZXJbaV0sIGktLSwgbkJpdHMgLT0gOCk7XG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhcztcbiAgfSBlbHNlIGlmIChlID09PSBlTWF4KSB7XG4gICAgcmV0dXJuIG0gPyBOYU4gOiBzID8gLUluZmluaXR5IDogSW5maW5pdHk7XG4gIH0gZWxzZSB7XG4gICAgbSA9IG0gKyBwb3coMiwgbUxlbik7XG4gICAgZSA9IGUgLSBlQmlhcztcbiAgfSByZXR1cm4gKHMgPyAtMSA6IDEpICogbSAqIHBvdygyLCBlIC0gbUxlbik7XG59XG5cbmZ1bmN0aW9uIHVucGFja0kzMihieXRlcykge1xuICByZXR1cm4gYnl0ZXNbM10gPDwgMjQgfCBieXRlc1syXSA8PCAxNiB8IGJ5dGVzWzFdIDw8IDggfCBieXRlc1swXTtcbn1cbmZ1bmN0aW9uIHBhY2tJOChpdCkge1xuICByZXR1cm4gW2l0ICYgMHhmZl07XG59XG5mdW5jdGlvbiBwYWNrSTE2KGl0KSB7XG4gIHJldHVybiBbaXQgJiAweGZmLCBpdCA+PiA4ICYgMHhmZl07XG59XG5mdW5jdGlvbiBwYWNrSTMyKGl0KSB7XG4gIHJldHVybiBbaXQgJiAweGZmLCBpdCA+PiA4ICYgMHhmZiwgaXQgPj4gMTYgJiAweGZmLCBpdCA+PiAyNCAmIDB4ZmZdO1xufVxuZnVuY3Rpb24gcGFja0Y2NChpdCkge1xuICByZXR1cm4gcGFja0lFRUU3NTQoaXQsIDUyLCA4KTtcbn1cbmZ1bmN0aW9uIHBhY2tGMzIoaXQpIHtcbiAgcmV0dXJuIHBhY2tJRUVFNzU0KGl0LCAyMywgNCk7XG59XG5cbmZ1bmN0aW9uIGFkZEdldHRlcihDLCBrZXksIGludGVybmFsKSB7XG4gIGRQKENbUFJPVE9UWVBFXSwga2V5LCB7IGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gdGhpc1tpbnRlcm5hbF07IH0gfSk7XG59XG5cbmZ1bmN0aW9uIGdldCh2aWV3LCBieXRlcywgaW5kZXgsIGlzTGl0dGxlRW5kaWFuKSB7XG4gIHZhciBudW1JbmRleCA9ICtpbmRleDtcbiAgdmFyIGludEluZGV4ID0gdG9JbmRleChudW1JbmRleCk7XG4gIGlmIChpbnRJbmRleCArIGJ5dGVzID4gdmlld1skTEVOR1RIXSkgdGhyb3cgUmFuZ2VFcnJvcihXUk9OR19JTkRFWCk7XG4gIHZhciBzdG9yZSA9IHZpZXdbJEJVRkZFUl0uX2I7XG4gIHZhciBzdGFydCA9IGludEluZGV4ICsgdmlld1skT0ZGU0VUXTtcbiAgdmFyIHBhY2sgPSBzdG9yZS5zbGljZShzdGFydCwgc3RhcnQgKyBieXRlcyk7XG4gIHJldHVybiBpc0xpdHRsZUVuZGlhbiA/IHBhY2sgOiBwYWNrLnJldmVyc2UoKTtcbn1cbmZ1bmN0aW9uIHNldCh2aWV3LCBieXRlcywgaW5kZXgsIGNvbnZlcnNpb24sIHZhbHVlLCBpc0xpdHRsZUVuZGlhbikge1xuICB2YXIgbnVtSW5kZXggPSAraW5kZXg7XG4gIHZhciBpbnRJbmRleCA9IHRvSW5kZXgobnVtSW5kZXgpO1xuICBpZiAoaW50SW5kZXggKyBieXRlcyA+IHZpZXdbJExFTkdUSF0pIHRocm93IFJhbmdlRXJyb3IoV1JPTkdfSU5ERVgpO1xuICB2YXIgc3RvcmUgPSB2aWV3WyRCVUZGRVJdLl9iO1xuICB2YXIgc3RhcnQgPSBpbnRJbmRleCArIHZpZXdbJE9GRlNFVF07XG4gIHZhciBwYWNrID0gY29udmVyc2lvbigrdmFsdWUpO1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGJ5dGVzOyBpKyspIHN0b3JlW3N0YXJ0ICsgaV0gPSBwYWNrW2lzTGl0dGxlRW5kaWFuID8gaSA6IGJ5dGVzIC0gaSAtIDFdO1xufVxuXG5pZiAoISR0eXBlZC5BQlYpIHtcbiAgJEFycmF5QnVmZmVyID0gZnVuY3Rpb24gQXJyYXlCdWZmZXIobGVuZ3RoKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkQXJyYXlCdWZmZXIsIEFSUkFZX0JVRkZFUik7XG4gICAgdmFyIGJ5dGVMZW5ndGggPSB0b0luZGV4KGxlbmd0aCk7XG4gICAgdGhpcy5fYiA9IGFycmF5RmlsbC5jYWxsKG5ldyBBcnJheShieXRlTGVuZ3RoKSwgMCk7XG4gICAgdGhpc1skTEVOR1RIXSA9IGJ5dGVMZW5ndGg7XG4gIH07XG5cbiAgJERhdGFWaWV3ID0gZnVuY3Rpb24gRGF0YVZpZXcoYnVmZmVyLCBieXRlT2Zmc2V0LCBieXRlTGVuZ3RoKSB7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkRGF0YVZpZXcsIERBVEFfVklFVyk7XG4gICAgYW5JbnN0YW5jZShidWZmZXIsICRBcnJheUJ1ZmZlciwgREFUQV9WSUVXKTtcbiAgICB2YXIgYnVmZmVyTGVuZ3RoID0gYnVmZmVyWyRMRU5HVEhdO1xuICAgIHZhciBvZmZzZXQgPSB0b0ludGVnZXIoYnl0ZU9mZnNldCk7XG4gICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gYnVmZmVyTGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKCdXcm9uZyBvZmZzZXQhJyk7XG4gICAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggPT09IHVuZGVmaW5lZCA/IGJ1ZmZlckxlbmd0aCAtIG9mZnNldCA6IHRvTGVuZ3RoKGJ5dGVMZW5ndGgpO1xuICAgIGlmIChvZmZzZXQgKyBieXRlTGVuZ3RoID4gYnVmZmVyTGVuZ3RoKSB0aHJvdyBSYW5nZUVycm9yKFdST05HX0xFTkdUSCk7XG4gICAgdGhpc1skQlVGRkVSXSA9IGJ1ZmZlcjtcbiAgICB0aGlzWyRPRkZTRVRdID0gb2Zmc2V0O1xuICAgIHRoaXNbJExFTkdUSF0gPSBieXRlTGVuZ3RoO1xuICB9O1xuXG4gIGlmIChERVNDUklQVE9SUykge1xuICAgIGFkZEdldHRlcigkQXJyYXlCdWZmZXIsIEJZVEVfTEVOR1RILCAnX2wnKTtcbiAgICBhZGRHZXR0ZXIoJERhdGFWaWV3LCBCVUZGRVIsICdfYicpO1xuICAgIGFkZEdldHRlcigkRGF0YVZpZXcsIEJZVEVfTEVOR1RILCAnX2wnKTtcbiAgICBhZGRHZXR0ZXIoJERhdGFWaWV3LCBCWVRFX09GRlNFVCwgJ19vJyk7XG4gIH1cblxuICByZWRlZmluZUFsbCgkRGF0YVZpZXdbUFJPVE9UWVBFXSwge1xuICAgIGdldEludDg6IGZ1bmN0aW9uIGdldEludDgoYnl0ZU9mZnNldCkge1xuICAgICAgcmV0dXJuIGdldCh0aGlzLCAxLCBieXRlT2Zmc2V0KVswXSA8PCAyNCA+PiAyNDtcbiAgICB9LFxuICAgIGdldFVpbnQ4OiBmdW5jdGlvbiBnZXRVaW50OChieXRlT2Zmc2V0KSB7XG4gICAgICByZXR1cm4gZ2V0KHRoaXMsIDEsIGJ5dGVPZmZzZXQpWzBdO1xuICAgIH0sXG4gICAgZ2V0SW50MTY6IGZ1bmN0aW9uIGdldEludDE2KGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHZhciBieXRlcyA9IGdldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pO1xuICAgICAgcmV0dXJuIChieXRlc1sxXSA8PCA4IHwgYnl0ZXNbMF0pIDw8IDE2ID4+IDE2O1xuICAgIH0sXG4gICAgZ2V0VWludDE2OiBmdW5jdGlvbiBnZXRVaW50MTYoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgdmFyIGJ5dGVzID0gZ2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSk7XG4gICAgICByZXR1cm4gYnl0ZXNbMV0gPDwgOCB8IGJ5dGVzWzBdO1xuICAgIH0sXG4gICAgZ2V0SW50MzI6IGZ1bmN0aW9uIGdldEludDMyKGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHJldHVybiB1bnBhY2tJMzIoZ2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIGFyZ3VtZW50c1sxXSkpO1xuICAgIH0sXG4gICAgZ2V0VWludDMyOiBmdW5jdGlvbiBnZXRVaW50MzIoYnl0ZU9mZnNldCAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgcmV0dXJuIHVucGFja0kzMihnZXQodGhpcywgNCwgYnl0ZU9mZnNldCwgYXJndW1lbnRzWzFdKSkgPj4+IDA7XG4gICAgfSxcbiAgICBnZXRGbG9hdDMyOiBmdW5jdGlvbiBnZXRGbG9hdDMyKGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHJldHVybiB1bnBhY2tJRUVFNzU0KGdldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pLCAyMywgNCk7XG4gICAgfSxcbiAgICBnZXRGbG9hdDY0OiBmdW5jdGlvbiBnZXRGbG9hdDY0KGJ5dGVPZmZzZXQgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHJldHVybiB1bnBhY2tJRUVFNzU0KGdldCh0aGlzLCA4LCBieXRlT2Zmc2V0LCBhcmd1bWVudHNbMV0pLCA1MiwgOCk7XG4gICAgfSxcbiAgICBzZXRJbnQ4OiBmdW5jdGlvbiBzZXRJbnQ4KGJ5dGVPZmZzZXQsIHZhbHVlKSB7XG4gICAgICBzZXQodGhpcywgMSwgYnl0ZU9mZnNldCwgcGFja0k4LCB2YWx1ZSk7XG4gICAgfSxcbiAgICBzZXRVaW50ODogZnVuY3Rpb24gc2V0VWludDgoYnl0ZU9mZnNldCwgdmFsdWUpIHtcbiAgICAgIHNldCh0aGlzLCAxLCBieXRlT2Zmc2V0LCBwYWNrSTgsIHZhbHVlKTtcbiAgICB9LFxuICAgIHNldEludDE2OiBmdW5jdGlvbiBzZXRJbnQxNihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDIsIGJ5dGVPZmZzZXQsIHBhY2tJMTYsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH0sXG4gICAgc2V0VWludDE2OiBmdW5jdGlvbiBzZXRVaW50MTYoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHNldCh0aGlzLCAyLCBieXRlT2Zmc2V0LCBwYWNrSTE2LCB2YWx1ZSwgYXJndW1lbnRzWzJdKTtcbiAgICB9LFxuICAgIHNldEludDMyOiBmdW5jdGlvbiBzZXRJbnQzMihieXRlT2Zmc2V0LCB2YWx1ZSAvKiAsIGxpdHRsZUVuZGlhbiAqLykge1xuICAgICAgc2V0KHRoaXMsIDQsIGJ5dGVPZmZzZXQsIHBhY2tJMzIsIHZhbHVlLCBhcmd1bWVudHNbMl0pO1xuICAgIH0sXG4gICAgc2V0VWludDMyOiBmdW5jdGlvbiBzZXRVaW50MzIoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHNldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBwYWNrSTMyLCB2YWx1ZSwgYXJndW1lbnRzWzJdKTtcbiAgICB9LFxuICAgIHNldEZsb2F0MzI6IGZ1bmN0aW9uIHNldEZsb2F0MzIoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHNldCh0aGlzLCA0LCBieXRlT2Zmc2V0LCBwYWNrRjMyLCB2YWx1ZSwgYXJndW1lbnRzWzJdKTtcbiAgICB9LFxuICAgIHNldEZsb2F0NjQ6IGZ1bmN0aW9uIHNldEZsb2F0NjQoYnl0ZU9mZnNldCwgdmFsdWUgLyogLCBsaXR0bGVFbmRpYW4gKi8pIHtcbiAgICAgIHNldCh0aGlzLCA4LCBieXRlT2Zmc2V0LCBwYWNrRjY0LCB2YWx1ZSwgYXJndW1lbnRzWzJdKTtcbiAgICB9XG4gIH0pO1xufSBlbHNlIHtcbiAgaWYgKCFmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgJEFycmF5QnVmZmVyKDEpO1xuICB9KSB8fCAhZmFpbHMoZnVuY3Rpb24gKCkge1xuICAgIG5ldyAkQXJyYXlCdWZmZXIoLTEpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICB9KSB8fCBmYWlscyhmdW5jdGlvbiAoKSB7XG4gICAgbmV3ICRBcnJheUJ1ZmZlcigpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLW5ld1xuICAgIG5ldyAkQXJyYXlCdWZmZXIoMS41KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1uZXdcbiAgICBuZXcgJEFycmF5QnVmZmVyKE5hTik7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgcmV0dXJuICRBcnJheUJ1ZmZlci5uYW1lICE9IEFSUkFZX0JVRkZFUjtcbiAgfSkpIHtcbiAgICAkQXJyYXlCdWZmZXIgPSBmdW5jdGlvbiBBcnJheUJ1ZmZlcihsZW5ndGgpIHtcbiAgICAgIGFuSW5zdGFuY2UodGhpcywgJEFycmF5QnVmZmVyKTtcbiAgICAgIHJldHVybiBuZXcgQmFzZUJ1ZmZlcih0b0luZGV4KGxlbmd0aCkpO1xuICAgIH07XG4gICAgdmFyIEFycmF5QnVmZmVyUHJvdG8gPSAkQXJyYXlCdWZmZXJbUFJPVE9UWVBFXSA9IEJhc2VCdWZmZXJbUFJPVE9UWVBFXTtcbiAgICBmb3IgKHZhciBrZXlzID0gZ09QTihCYXNlQnVmZmVyKSwgaiA9IDAsIGtleTsga2V5cy5sZW5ndGggPiBqOykge1xuICAgICAgaWYgKCEoKGtleSA9IGtleXNbaisrXSkgaW4gJEFycmF5QnVmZmVyKSkgaGlkZSgkQXJyYXlCdWZmZXIsIGtleSwgQmFzZUJ1ZmZlcltrZXldKTtcbiAgICB9XG4gICAgaWYgKCFMSUJSQVJZKSBBcnJheUJ1ZmZlclByb3RvLmNvbnN0cnVjdG9yID0gJEFycmF5QnVmZmVyO1xuICB9XG4gIC8vIGlPUyBTYWZhcmkgNy54IGJ1Z1xuICB2YXIgdmlldyA9IG5ldyAkRGF0YVZpZXcobmV3ICRBcnJheUJ1ZmZlcigyKSk7XG4gIHZhciAkc2V0SW50OCA9ICREYXRhVmlld1tQUk9UT1RZUEVdLnNldEludDg7XG4gIHZpZXcuc2V0SW50OCgwLCAyMTQ3NDgzNjQ4KTtcbiAgdmlldy5zZXRJbnQ4KDEsIDIxNDc0ODM2NDkpO1xuICBpZiAodmlldy5nZXRJbnQ4KDApIHx8ICF2aWV3LmdldEludDgoMSkpIHJlZGVmaW5lQWxsKCREYXRhVmlld1tQUk9UT1RZUEVdLCB7XG4gICAgc2V0SW50ODogZnVuY3Rpb24gc2V0SW50OChieXRlT2Zmc2V0LCB2YWx1ZSkge1xuICAgICAgJHNldEludDguY2FsbCh0aGlzLCBieXRlT2Zmc2V0LCB2YWx1ZSA8PCAyNCA+PiAyNCk7XG4gICAgfSxcbiAgICBzZXRVaW50ODogZnVuY3Rpb24gc2V0VWludDgoYnl0ZU9mZnNldCwgdmFsdWUpIHtcbiAgICAgICRzZXRJbnQ4LmNhbGwodGhpcywgYnl0ZU9mZnNldCwgdmFsdWUgPDwgMjQgPj4gMjQpO1xuICAgIH1cbiAgfSwgdHJ1ZSk7XG59XG5zZXRUb1N0cmluZ1RhZygkQXJyYXlCdWZmZXIsIEFSUkFZX0JVRkZFUik7XG5zZXRUb1N0cmluZ1RhZygkRGF0YVZpZXcsIERBVEFfVklFVyk7XG5oaWRlKCREYXRhVmlld1tQUk9UT1RZUEVdLCAkdHlwZWQuVklFVywgdHJ1ZSk7XG5leHBvcnRzW0FSUkFZX0JVRkZFUl0gPSAkQXJyYXlCdWZmZXI7XG5leHBvcnRzW0RBVEFfVklFV10gPSAkRGF0YVZpZXc7XG4iLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGlkZSA9IHJlcXVpcmUoJy4vX2hpZGUnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbnZhciBUWVBFRCA9IHVpZCgndHlwZWRfYXJyYXknKTtcbnZhciBWSUVXID0gdWlkKCd2aWV3Jyk7XG52YXIgQUJWID0gISEoZ2xvYmFsLkFycmF5QnVmZmVyICYmIGdsb2JhbC5EYXRhVmlldyk7XG52YXIgQ09OU1RSID0gQUJWO1xudmFyIGkgPSAwO1xudmFyIGwgPSA5O1xudmFyIFR5cGVkO1xuXG52YXIgVHlwZWRBcnJheUNvbnN0cnVjdG9ycyA9IChcbiAgJ0ludDhBcnJheSxVaW50OEFycmF5LFVpbnQ4Q2xhbXBlZEFycmF5LEludDE2QXJyYXksVWludDE2QXJyYXksSW50MzJBcnJheSxVaW50MzJBcnJheSxGbG9hdDMyQXJyYXksRmxvYXQ2NEFycmF5J1xuKS5zcGxpdCgnLCcpO1xuXG53aGlsZSAoaSA8IGwpIHtcbiAgaWYgKFR5cGVkID0gZ2xvYmFsW1R5cGVkQXJyYXlDb25zdHJ1Y3RvcnNbaSsrXV0pIHtcbiAgICBoaWRlKFR5cGVkLnByb3RvdHlwZSwgVFlQRUQsIHRydWUpO1xuICAgIGhpZGUoVHlwZWQucHJvdG90eXBlLCBWSUVXLCB0cnVlKTtcbiAgfSBlbHNlIENPTlNUUiA9IGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgQUJWOiBBQlYsXG4gIENPTlNUUjogQ09OU1RSLFxuICBUWVBFRDogVFlQRUQsXG4gIFZJRVc6IFZJRVdcbn07XG4iLCJ2YXIgaWQgPSAwO1xudmFyIHB4ID0gTWF0aC5yYW5kb20oKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKGtleSkge1xuICByZXR1cm4gJ1N5bWJvbCgnLmNvbmNhdChrZXkgPT09IHVuZGVmaW5lZCA/ICcnIDoga2V5LCAnKV8nLCAoKytpZCArIHB4KS50b1N0cmluZygzNikpO1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBuYXZpZ2F0b3IgPSBnbG9iYWwubmF2aWdhdG9yO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5hdmlnYXRvciAmJiBuYXZpZ2F0b3IudXNlckFnZW50IHx8ICcnO1xuIiwidmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChpdCwgVFlQRSkge1xuICBpZiAoIWlzT2JqZWN0KGl0KSB8fCBpdC5fdCAhPT0gVFlQRSkgdGhyb3cgVHlwZUVycm9yKCdJbmNvbXBhdGlibGUgcmVjZWl2ZXIsICcgKyBUWVBFICsgJyByZXF1aXJlZCEnKTtcbiAgcmV0dXJuIGl0O1xufTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIExJQlJBUlkgPSByZXF1aXJlKCcuL19saWJyYXJ5Jyk7XG52YXIgd2tzRXh0ID0gcmVxdWlyZSgnLi9fd2tzLWV4dCcpO1xudmFyIGRlZmluZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgdmFyICRTeW1ib2wgPSBjb3JlLlN5bWJvbCB8fCAoY29yZS5TeW1ib2wgPSBMSUJSQVJZID8ge30gOiBnbG9iYWwuU3ltYm9sIHx8IHt9KTtcbiAgaWYgKG5hbWUuY2hhckF0KDApICE9ICdfJyAmJiAhKG5hbWUgaW4gJFN5bWJvbCkpIGRlZmluZVByb3BlcnR5KCRTeW1ib2wsIG5hbWUsIHsgdmFsdWU6IHdrc0V4dC5mKG5hbWUpIH0pO1xufTtcbiIsImV4cG9ydHMuZiA9IHJlcXVpcmUoJy4vX3drcycpO1xuIiwidmFyIHN0b3JlID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ3drcycpO1xudmFyIHVpZCA9IHJlcXVpcmUoJy4vX3VpZCcpO1xudmFyIFN5bWJvbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLlN5bWJvbDtcbnZhciBVU0VfU1lNQk9MID0gdHlwZW9mIFN5bWJvbCA9PSAnZnVuY3Rpb24nO1xuXG52YXIgJGV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gIHJldHVybiBzdG9yZVtuYW1lXSB8fCAoc3RvcmVbbmFtZV0gPVxuICAgIFVTRV9TWU1CT0wgJiYgU3ltYm9sW25hbWVdIHx8IChVU0VfU1lNQk9MID8gU3ltYm9sIDogdWlkKSgnU3ltYm9sLicgKyBuYW1lKSk7XG59O1xuXG4kZXhwb3J0cy5zdG9yZSA9IHN0b3JlO1xuIiwidmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgSVRFUkFUT1IgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKTtcbnZhciBJdGVyYXRvcnMgPSByZXF1aXJlKCcuL19pdGVyYXRvcnMnKTtcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29yZScpLmdldEl0ZXJhdG9yTWV0aG9kID0gZnVuY3Rpb24gKGl0KSB7XG4gIGlmIChpdCAhPSB1bmRlZmluZWQpIHJldHVybiBpdFtJVEVSQVRPUl1cbiAgICB8fCBpdFsnQEBpdGVyYXRvciddXG4gICAgfHwgSXRlcmF0b3JzW2NsYXNzb2YoaXQpXTtcbn07XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vYmVuamFtaW5nci9SZXhFeHAuZXNjYXBlXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRyZSA9IHJlcXVpcmUoJy4vX3JlcGxhY2VyJykoL1tcXFxcXiQqKz8uKCl8W1xcXXt9XS9nLCAnXFxcXCQmJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVnRXhwJywgeyBlc2NhcGU6IGZ1bmN0aW9uIGVzY2FwZShpdCkgeyByZXR1cm4gJHJlKGl0KTsgfSB9KTtcbiIsIi8vIDIyLjEuMy4zIEFycmF5LnByb3RvdHlwZS5jb3B5V2l0aGluKHRhcmdldCwgc3RhcnQsIGVuZCA9IHRoaXMubGVuZ3RoKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdBcnJheScsIHsgY29weVdpdGhpbjogcmVxdWlyZSgnLi9fYXJyYXktY29weS13aXRoaW4nKSB9KTtcblxucmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJykoJ2NvcHlXaXRoaW4nKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGV2ZXJ5ID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDQpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10uZXZlcnksIHRydWUpLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy41IC8gMTUuNC40LjE2IEFycmF5LnByb3RvdHlwZS5ldmVyeShjYWxsYmFja2ZuIFssIHRoaXNBcmddKVxuICBldmVyeTogZnVuY3Rpb24gZXZlcnkoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICByZXR1cm4gJGV2ZXJ5KHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c1sxXSk7XG4gIH1cbn0pO1xuIiwiLy8gMjIuMS4zLjYgQXJyYXkucHJvdG90eXBlLmZpbGwodmFsdWUsIHN0YXJ0ID0gMCwgZW5kID0gdGhpcy5sZW5ndGgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ0FycmF5JywgeyBmaWxsOiByZXF1aXJlKCcuL19hcnJheS1maWxsJykgfSk7XG5cbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKCdmaWxsJyk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRmaWx0ZXIgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoMik7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5maWx0ZXIsIHRydWUpLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy43IC8gMTUuNC40LjIwIEFycmF5LnByb3RvdHlwZS5maWx0ZXIoY2FsbGJhY2tmbiBbLCB0aGlzQXJnXSlcbiAgZmlsdGVyOiBmdW5jdGlvbiBmaWx0ZXIoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICByZXR1cm4gJGZpbHRlcih0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHNbMV0pO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIDIyLjEuMy45IEFycmF5LnByb3RvdHlwZS5maW5kSW5kZXgocHJlZGljYXRlLCB0aGlzQXJnID0gdW5kZWZpbmVkKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkZmluZCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSg2KTtcbnZhciBLRVkgPSAnZmluZEluZGV4JztcbnZhciBmb3JjZWQgPSB0cnVlO1xuLy8gU2hvdWxkbid0IHNraXAgaG9sZXNcbmlmIChLRVkgaW4gW10pIEFycmF5KDEpW0tFWV0oZnVuY3Rpb24gKCkgeyBmb3JjZWQgPSBmYWxzZTsgfSk7XG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIGZvcmNlZCwgJ0FycmF5Jywge1xuICBmaW5kSW5kZXg6IGZ1bmN0aW9uIGZpbmRJbmRleChjYWxsYmFja2ZuIC8qICwgdGhhdCA9IHVuZGVmaW5lZCAqLykge1xuICAgIHJldHVybiAkZmluZCh0aGlzLCBjYWxsYmFja2ZuLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xucmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJykoS0VZKTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIDIyLjEuMy44IEFycmF5LnByb3RvdHlwZS5maW5kKHByZWRpY2F0ZSwgdGhpc0FyZyA9IHVuZGVmaW5lZClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGZpbmQgPSByZXF1aXJlKCcuL19hcnJheS1tZXRob2RzJykoNSk7XG52YXIgS0VZID0gJ2ZpbmQnO1xudmFyIGZvcmNlZCA9IHRydWU7XG4vLyBTaG91bGRuJ3Qgc2tpcCBob2xlc1xuaWYgKEtFWSBpbiBbXSkgQXJyYXkoMSlbS0VZXShmdW5jdGlvbiAoKSB7IGZvcmNlZCA9IGZhbHNlOyB9KTtcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogZm9yY2VkLCAnQXJyYXknLCB7XG4gIGZpbmQ6IGZ1bmN0aW9uIGZpbmQoY2FsbGJhY2tmbiAvKiAsIHRoYXQgPSB1bmRlZmluZWQgKi8pIHtcbiAgICByZXR1cm4gJGZpbmQodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcbnJlcXVpcmUoJy4vX2FkZC10by11bnNjb3BhYmxlcycpKEtFWSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRmb3JFYWNoID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDApO1xudmFyIFNUUklDVCA9IHJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5mb3JFYWNoLCB0cnVlKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAhU1RSSUNULCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy4xMCAvIDE1LjQuNC4xOCBBcnJheS5wcm90b3R5cGUuZm9yRWFjaChjYWxsYmFja2ZuIFssIHRoaXNBcmddKVxuICBmb3JFYWNoOiBmdW5jdGlvbiBmb3JFYWNoKGNhbGxiYWNrZm4gLyogLCB0aGlzQXJnICovKSB7XG4gICAgcmV0dXJuICRmb3JFYWNoKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c1sxXSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGN0eCA9IHJlcXVpcmUoJy4vX2N0eCcpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIGNhbGwgPSByZXF1aXJlKCcuL19pdGVyLWNhbGwnKTtcbnZhciBpc0FycmF5SXRlciA9IHJlcXVpcmUoJy4vX2lzLWFycmF5LWl0ZXInKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fY3JlYXRlLXByb3BlcnR5Jyk7XG52YXIgZ2V0SXRlckZuID0gcmVxdWlyZSgnLi9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9faXRlci1kZXRlY3QnKShmdW5jdGlvbiAoaXRlcikgeyBBcnJheS5mcm9tKGl0ZXIpOyB9KSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjIuMSBBcnJheS5mcm9tKGFycmF5TGlrZSwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQpXG4gIGZyb206IGZ1bmN0aW9uIGZyb20oYXJyYXlMaWtlIC8qICwgbWFwZm4gPSB1bmRlZmluZWQsIHRoaXNBcmcgPSB1bmRlZmluZWQgKi8pIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KGFycmF5TGlrZSk7XG4gICAgdmFyIEMgPSB0eXBlb2YgdGhpcyA9PSAnZnVuY3Rpb24nID8gdGhpcyA6IEFycmF5O1xuICAgIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgbWFwZm4gPSBhTGVuID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZDtcbiAgICB2YXIgbWFwcGluZyA9IG1hcGZuICE9PSB1bmRlZmluZWQ7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgaXRlckZuID0gZ2V0SXRlckZuKE8pO1xuICAgIHZhciBsZW5ndGgsIHJlc3VsdCwgc3RlcCwgaXRlcmF0b3I7XG4gICAgaWYgKG1hcHBpbmcpIG1hcGZuID0gY3R4KG1hcGZuLCBhTGVuID4gMiA/IGFyZ3VtZW50c1syXSA6IHVuZGVmaW5lZCwgMik7XG4gICAgLy8gaWYgb2JqZWN0IGlzbid0IGl0ZXJhYmxlIG9yIGl0J3MgYXJyYXkgd2l0aCBkZWZhdWx0IGl0ZXJhdG9yIC0gdXNlIHNpbXBsZSBjYXNlXG4gICAgaWYgKGl0ZXJGbiAhPSB1bmRlZmluZWQgJiYgIShDID09IEFycmF5ICYmIGlzQXJyYXlJdGVyKGl0ZXJGbikpKSB7XG4gICAgICBmb3IgKGl0ZXJhdG9yID0gaXRlckZuLmNhbGwoTyksIHJlc3VsdCA9IG5ldyBDKCk7ICEoc3RlcCA9IGl0ZXJhdG9yLm5leHQoKSkuZG9uZTsgaW5kZXgrKykge1xuICAgICAgICBjcmVhdGVQcm9wZXJ0eShyZXN1bHQsIGluZGV4LCBtYXBwaW5nID8gY2FsbChpdGVyYXRvciwgbWFwZm4sIFtzdGVwLnZhbHVlLCBpbmRleF0sIHRydWUpIDogc3RlcC52YWx1ZSk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIGxlbmd0aCA9IHRvTGVuZ3RoKE8ubGVuZ3RoKTtcbiAgICAgIGZvciAocmVzdWx0ID0gbmV3IEMobGVuZ3RoKTsgbGVuZ3RoID4gaW5kZXg7IGluZGV4KyspIHtcbiAgICAgICAgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgbWFwcGluZyA/IG1hcGZuKE9baW5kZXhdLCBpbmRleCkgOiBPW2luZGV4XSk7XG4gICAgICB9XG4gICAgfVxuICAgIHJlc3VsdC5sZW5ndGggPSBpbmRleDtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGluZGV4T2YgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpKGZhbHNlKTtcbnZhciAkbmF0aXZlID0gW10uaW5kZXhPZjtcbnZhciBORUdBVElWRV9aRVJPID0gISEkbmF0aXZlICYmIDEgLyBbMV0uaW5kZXhPZigxLCAtMCkgPCAwO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIChORUdBVElWRV9aRVJPIHx8ICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoJG5hdGl2ZSkpLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy4xMSAvIDE1LjQuNC4xNCBBcnJheS5wcm90b3R5cGUuaW5kZXhPZihzZWFyY2hFbGVtZW50IFssIGZyb21JbmRleF0pXG4gIGluZGV4T2Y6IGZ1bmN0aW9uIGluZGV4T2Yoc2VhcmNoRWxlbWVudCAvKiAsIGZyb21JbmRleCA9IDAgKi8pIHtcbiAgICByZXR1cm4gTkVHQVRJVkVfWkVST1xuICAgICAgLy8gY29udmVydCAtMCB0byArMFxuICAgICAgPyAkbmF0aXZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgMFxuICAgICAgOiAkaW5kZXhPZih0aGlzLCBzZWFyY2hFbGVtZW50LCBhcmd1bWVudHNbMV0pO1xuICB9XG59KTtcbiIsIi8vIDIyLjEuMi4yIC8gMTUuNC4zLjIgQXJyYXkuaXNBcnJheShhcmcpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ0FycmF5JywgeyBpc0FycmF5OiByZXF1aXJlKCcuL19pcy1hcnJheScpIH0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGFkZFRvVW5zY29wYWJsZXMgPSByZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKTtcbnZhciBzdGVwID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xuXG4vLyAyMi4xLjMuNCBBcnJheS5wcm90b3R5cGUuZW50cmllcygpXG4vLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmtleXMoKVxuLy8gMjIuMS4zLjI5IEFycmF5LnByb3RvdHlwZS52YWx1ZXMoKVxuLy8gMjIuMS4zLjMwIEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uIChpdGVyYXRlZCwga2luZCkge1xuICB0aGlzLl90ID0gdG9JT2JqZWN0KGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4gIHRoaXMuX2sgPSBraW5kOyAgICAgICAgICAgICAgICAvLyBraW5kXG4vLyAyMi4xLjUuMi4xICVBcnJheUl0ZXJhdG9yUHJvdG90eXBlJS5uZXh0KClcbn0sIGZ1bmN0aW9uICgpIHtcbiAgdmFyIE8gPSB0aGlzLl90O1xuICB2YXIga2luZCA9IHRoaXMuX2s7XG4gIHZhciBpbmRleCA9IHRoaXMuX2krKztcbiAgaWYgKCFPIHx8IGluZGV4ID49IE8ubGVuZ3RoKSB7XG4gICAgdGhpcy5fdCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gc3RlcCgxKTtcbiAgfVxuICBpZiAoa2luZCA9PSAna2V5cycpIHJldHVybiBzdGVwKDAsIGluZGV4KTtcbiAgaWYgKGtpbmQgPT0gJ3ZhbHVlcycpIHJldHVybiBzdGVwKDAsIE9baW5kZXhdKTtcbiAgcmV0dXJuIHN0ZXAoMCwgW2luZGV4LCBPW2luZGV4XV0pO1xufSwgJ3ZhbHVlcycpO1xuXG4vLyBhcmd1bWVudHNMaXN0W0BAaXRlcmF0b3JdIGlzICVBcnJheVByb3RvX3ZhbHVlcyUgKDkuNC40LjYsIDkuNC40LjcpXG5JdGVyYXRvcnMuQXJndW1lbnRzID0gSXRlcmF0b3JzLkFycmF5O1xuXG5hZGRUb1Vuc2NvcGFibGVzKCdrZXlzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCd2YWx1ZXMnKTtcbmFkZFRvVW5zY29wYWJsZXMoJ2VudHJpZXMnKTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIDIyLjEuMy4xMyBBcnJheS5wcm90b3R5cGUuam9pbihzZXBhcmF0b3IpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciBhcnJheUpvaW4gPSBbXS5qb2luO1xuXG4vLyBmYWxsYmFjayBmb3Igbm90IGFycmF5LWxpa2Ugc3RyaW5nc1xuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAocmVxdWlyZSgnLi9faW9iamVjdCcpICE9IE9iamVjdCB8fCAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKGFycmF5Sm9pbikpLCAnQXJyYXknLCB7XG4gIGpvaW46IGZ1bmN0aW9uIGpvaW4oc2VwYXJhdG9yKSB7XG4gICAgcmV0dXJuIGFycmF5Sm9pbi5jYWxsKHRvSU9iamVjdCh0aGlzKSwgc2VwYXJhdG9yID09PSB1bmRlZmluZWQgPyAnLCcgOiBzZXBhcmF0b3IpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyICRuYXRpdmUgPSBbXS5sYXN0SW5kZXhPZjtcbnZhciBORUdBVElWRV9aRVJPID0gISEkbmF0aXZlICYmIDEgLyBbMV0ubGFzdEluZGV4T2YoMSwgLTApIDwgMDtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoTkVHQVRJVkVfWkVSTyB8fCAhcmVxdWlyZSgnLi9fc3RyaWN0LW1ldGhvZCcpKCRuYXRpdmUpKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMTQgLyAxNS40LjQuMTUgQXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mKHNlYXJjaEVsZW1lbnQgWywgZnJvbUluZGV4XSlcbiAgbGFzdEluZGV4T2Y6IGZ1bmN0aW9uIGxhc3RJbmRleE9mKHNlYXJjaEVsZW1lbnQgLyogLCBmcm9tSW5kZXggPSBAWyotMV0gKi8pIHtcbiAgICAvLyBjb252ZXJ0IC0wIHRvICswXG4gICAgaWYgKE5FR0FUSVZFX1pFUk8pIHJldHVybiAkbmF0aXZlLmFwcGx5KHRoaXMsIGFyZ3VtZW50cykgfHwgMDtcbiAgICB2YXIgTyA9IHRvSU9iamVjdCh0aGlzKTtcbiAgICB2YXIgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBpbmRleCA9IGxlbmd0aCAtIDE7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPiAxKSBpbmRleCA9IE1hdGgubWluKGluZGV4LCB0b0ludGVnZXIoYXJndW1lbnRzWzFdKSk7XG4gICAgaWYgKGluZGV4IDwgMCkgaW5kZXggPSBsZW5ndGggKyBpbmRleDtcbiAgICBmb3IgKDtpbmRleCA+PSAwOyBpbmRleC0tKSBpZiAoaW5kZXggaW4gTykgaWYgKE9baW5kZXhdID09PSBzZWFyY2hFbGVtZW50KSByZXR1cm4gaW5kZXggfHwgMDtcbiAgICByZXR1cm4gLTE7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkbWFwID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDEpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10ubWFwLCB0cnVlKSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjMuMTUgLyAxNS40LjQuMTkgQXJyYXkucHJvdG90eXBlLm1hcChjYWxsYmFja2ZuIFssIHRoaXNBcmddKVxuICBtYXA6IGZ1bmN0aW9uIG1hcChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHJldHVybiAkbWFwKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c1sxXSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjcmVhdGVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX2NyZWF0ZS1wcm9wZXJ0eScpO1xuXG4vLyBXZWJLaXQgQXJyYXkub2YgaXNuJ3QgZ2VuZXJpY1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgZnVuY3Rpb24gRigpIHsgLyogZW1wdHkgKi8gfVxuICByZXR1cm4gIShBcnJheS5vZi5jYWxsKEYpIGluc3RhbmNlb2YgRik7XG59KSwgJ0FycmF5Jywge1xuICAvLyAyMi4xLjIuMyBBcnJheS5vZiggLi4uaXRlbXMpXG4gIG9mOiBmdW5jdGlvbiBvZigvKiAuLi5hcmdzICovKSB7XG4gICAgdmFyIGluZGV4ID0gMDtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIHJlc3VsdCA9IG5ldyAodHlwZW9mIHRoaXMgPT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiBBcnJheSkoYUxlbik7XG4gICAgd2hpbGUgKGFMZW4gPiBpbmRleCkgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBpbmRleCwgYXJndW1lbnRzW2luZGV4KytdKTtcbiAgICByZXN1bHQubGVuZ3RoID0gYUxlbjtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHJlZHVjZSA9IHJlcXVpcmUoJy4vX2FycmF5LXJlZHVjZScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10ucmVkdWNlUmlnaHQsIHRydWUpLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy4xOSAvIDE1LjQuNC4yMiBBcnJheS5wcm90b3R5cGUucmVkdWNlUmlnaHQoY2FsbGJhY2tmbiBbLCBpbml0aWFsVmFsdWVdKVxuICByZWR1Y2VSaWdodDogZnVuY3Rpb24gcmVkdWNlUmlnaHQoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykge1xuICAgIHJldHVybiAkcmVkdWNlKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3VtZW50c1sxXSwgdHJ1ZSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcmVkdWNlID0gcmVxdWlyZSgnLi9fYXJyYXktcmVkdWNlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKShbXS5yZWR1Y2UsIHRydWUpLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy4xOCAvIDE1LjQuNC4yMSBBcnJheS5wcm90b3R5cGUucmVkdWNlKGNhbGxiYWNrZm4gWywgaW5pdGlhbFZhbHVlXSlcbiAgcmVkdWNlOiBmdW5jdGlvbiByZWR1Y2UoY2FsbGJhY2tmbiAvKiAsIGluaXRpYWxWYWx1ZSAqLykge1xuICAgIHJldHVybiAkcmVkdWNlKHRoaXMsIGNhbGxiYWNrZm4sIGFyZ3VtZW50cy5sZW5ndGgsIGFyZ3VtZW50c1sxXSwgZmFsc2UpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgaHRtbCA9IHJlcXVpcmUoJy4vX2h0bWwnKTtcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcbnZhciB0b0Fic29sdXRlSW5kZXggPSByZXF1aXJlKCcuL190by1hYnNvbHV0ZS1pbmRleCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgYXJyYXlTbGljZSA9IFtdLnNsaWNlO1xuXG4vLyBmYWxsYmFjayBmb3Igbm90IGFycmF5LWxpa2UgRVMzIHN0cmluZ3MgYW5kIERPTSBvYmplY3RzXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICBpZiAoaHRtbCkgYXJyYXlTbGljZS5jYWxsKGh0bWwpO1xufSksICdBcnJheScsIHtcbiAgc2xpY2U6IGZ1bmN0aW9uIHNsaWNlKGJlZ2luLCBlbmQpIHtcbiAgICB2YXIgbGVuID0gdG9MZW5ndGgodGhpcy5sZW5ndGgpO1xuICAgIHZhciBrbGFzcyA9IGNvZih0aGlzKTtcbiAgICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IGVuZDtcbiAgICBpZiAoa2xhc3MgPT0gJ0FycmF5JykgcmV0dXJuIGFycmF5U2xpY2UuY2FsbCh0aGlzLCBiZWdpbiwgZW5kKTtcbiAgICB2YXIgc3RhcnQgPSB0b0Fic29sdXRlSW5kZXgoYmVnaW4sIGxlbik7XG4gICAgdmFyIHVwVG8gPSB0b0Fic29sdXRlSW5kZXgoZW5kLCBsZW4pO1xuICAgIHZhciBzaXplID0gdG9MZW5ndGgodXBUbyAtIHN0YXJ0KTtcbiAgICB2YXIgY2xvbmVkID0gbmV3IEFycmF5KHNpemUpO1xuICAgIHZhciBpID0gMDtcbiAgICBmb3IgKDsgaSA8IHNpemU7IGkrKykgY2xvbmVkW2ldID0ga2xhc3MgPT0gJ1N0cmluZydcbiAgICAgID8gdGhpcy5jaGFyQXQoc3RhcnQgKyBpKVxuICAgICAgOiB0aGlzW3N0YXJ0ICsgaV07XG4gICAgcmV0dXJuIGNsb25lZDtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRzb21lID0gcmVxdWlyZSgnLi9fYXJyYXktbWV0aG9kcycpKDMpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19zdHJpY3QtbWV0aG9kJykoW10uc29tZSwgdHJ1ZSksICdBcnJheScsIHtcbiAgLy8gMjIuMS4zLjIzIC8gMTUuNC40LjE3IEFycmF5LnByb3RvdHlwZS5zb21lKGNhbGxiYWNrZm4gWywgdGhpc0FyZ10pXG4gIHNvbWU6IGZ1bmN0aW9uIHNvbWUoY2FsbGJhY2tmbiAvKiAsIHRoaXNBcmcgKi8pIHtcbiAgICByZXR1cm4gJHNvbWUodGhpcywgY2FsbGJhY2tmbiwgYXJndW1lbnRzWzFdKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciAkc29ydCA9IFtdLnNvcnQ7XG52YXIgdGVzdCA9IFsxLCAyLCAzXTtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoZmFpbHMoZnVuY3Rpb24gKCkge1xuICAvLyBJRTgtXG4gIHRlc3Quc29ydCh1bmRlZmluZWQpO1xufSkgfHwgIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gVjggYnVnXG4gIHRlc3Quc29ydChudWxsKTtcbiAgLy8gT2xkIFdlYktpdFxufSkgfHwgIXJlcXVpcmUoJy4vX3N0cmljdC1tZXRob2QnKSgkc29ydCkpLCAnQXJyYXknLCB7XG4gIC8vIDIyLjEuMy4yNSBBcnJheS5wcm90b3R5cGUuc29ydChjb21wYXJlZm4pXG4gIHNvcnQ6IGZ1bmN0aW9uIHNvcnQoY29tcGFyZWZuKSB7XG4gICAgcmV0dXJuIGNvbXBhcmVmbiA9PT0gdW5kZWZpbmVkXG4gICAgICA/ICRzb3J0LmNhbGwodG9PYmplY3QodGhpcykpXG4gICAgICA6ICRzb3J0LmNhbGwodG9PYmplY3QodGhpcyksIGFGdW5jdGlvbihjb21wYXJlZm4pKTtcbiAgfVxufSk7XG4iLCJyZXF1aXJlKCcuL19zZXQtc3BlY2llcycpKCdBcnJheScpO1xuIiwiLy8gMjAuMy4zLjEgLyAxNS45LjQuNCBEYXRlLm5vdygpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ0RhdGUnLCB7IG5vdzogZnVuY3Rpb24gKCkgeyByZXR1cm4gbmV3IERhdGUoKS5nZXRUaW1lKCk7IH0gfSk7XG4iLCIvLyAyMC4zLjQuMzYgLyAxNS45LjUuNDMgRGF0ZS5wcm90b3R5cGUudG9JU09TdHJpbmcoKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b0lTT1N0cmluZyA9IHJlcXVpcmUoJy4vX2RhdGUtdG8taXNvLXN0cmluZycpO1xuXG4vLyBQaGFudG9tSlMgLyBvbGQgV2ViS2l0IGhhcyBhIGJyb2tlbiBpbXBsZW1lbnRhdGlvbnNcbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKERhdGUucHJvdG90eXBlLnRvSVNPU3RyaW5nICE9PSB0b0lTT1N0cmluZyksICdEYXRlJywge1xuICB0b0lTT1N0cmluZzogdG9JU09TdHJpbmdcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBuZXcgRGF0ZShOYU4pLnRvSlNPTigpICE9PSBudWxsXG4gICAgfHwgRGF0ZS5wcm90b3R5cGUudG9KU09OLmNhbGwoeyB0b0lTT1N0cmluZzogZnVuY3Rpb24gKCkgeyByZXR1cm4gMTsgfSB9KSAhPT0gMTtcbn0pLCAnRGF0ZScsIHtcbiAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVudXNlZC12YXJzXG4gIHRvSlNPTjogZnVuY3Rpb24gdG9KU09OKGtleSkge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIHB2ID0gdG9QcmltaXRpdmUoTyk7XG4gICAgcmV0dXJuIHR5cGVvZiBwdiA9PSAnbnVtYmVyJyAmJiAhaXNGaW5pdGUocHYpID8gbnVsbCA6IE8udG9JU09TdHJpbmcoKTtcbiAgfVxufSk7XG4iLCJ2YXIgVE9fUFJJTUlUSVZFID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvUHJpbWl0aXZlJyk7XG52YXIgcHJvdG8gPSBEYXRlLnByb3RvdHlwZTtcblxuaWYgKCEoVE9fUFJJTUlUSVZFIGluIHByb3RvKSkgcmVxdWlyZSgnLi9faGlkZScpKHByb3RvLCBUT19QUklNSVRJVkUsIHJlcXVpcmUoJy4vX2RhdGUtdG8tcHJpbWl0aXZlJykpO1xuIiwidmFyIERhdGVQcm90byA9IERhdGUucHJvdG90eXBlO1xudmFyIElOVkFMSURfREFURSA9ICdJbnZhbGlkIERhdGUnO1xudmFyIFRPX1NUUklORyA9ICd0b1N0cmluZyc7XG52YXIgJHRvU3RyaW5nID0gRGF0ZVByb3RvW1RPX1NUUklOR107XG52YXIgZ2V0VGltZSA9IERhdGVQcm90by5nZXRUaW1lO1xuaWYgKG5ldyBEYXRlKE5hTikgKyAnJyAhPSBJTlZBTElEX0RBVEUpIHtcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShEYXRlUHJvdG8sIFRPX1NUUklORywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgdmFyIHZhbHVlID0gZ2V0VGltZS5jYWxsKHRoaXMpO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICByZXR1cm4gdmFsdWUgPT09IHZhbHVlID8gJHRvU3RyaW5nLmNhbGwodGhpcykgOiBJTlZBTElEX0RBVEU7XG4gIH0pO1xufVxuIiwiLy8gMTkuMi4zLjIgLyAxNS4zLjQuNSBGdW5jdGlvbi5wcm90b3R5cGUuYmluZCh0aGlzQXJnLCBhcmdzLi4uKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdGdW5jdGlvbicsIHsgYmluZDogcmVxdWlyZSgnLi9fYmluZCcpIH0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgSEFTX0lOU1RBTkNFID0gcmVxdWlyZSgnLi9fd2tzJykoJ2hhc0luc3RhbmNlJyk7XG52YXIgRnVuY3Rpb25Qcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbi8vIDE5LjIuMy42IEZ1bmN0aW9uLnByb3RvdHlwZVtAQGhhc0luc3RhbmNlXShWKVxuaWYgKCEoSEFTX0lOU1RBTkNFIGluIEZ1bmN0aW9uUHJvdG8pKSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mKEZ1bmN0aW9uUHJvdG8sIEhBU19JTlNUQU5DRSwgeyB2YWx1ZTogZnVuY3Rpb24gKE8pIHtcbiAgaWYgKHR5cGVvZiB0aGlzICE9ICdmdW5jdGlvbicgfHwgIWlzT2JqZWN0KE8pKSByZXR1cm4gZmFsc2U7XG4gIGlmICghaXNPYmplY3QodGhpcy5wcm90b3R5cGUpKSByZXR1cm4gTyBpbnN0YW5jZW9mIHRoaXM7XG4gIC8vIGZvciBlbnZpcm9ubWVudCB3L28gbmF0aXZlIGBAQGhhc0luc3RhbmNlYCBsb2dpYyBlbm91Z2ggYGluc3RhbmNlb2ZgLCBidXQgYWRkIHRoaXM6XG4gIHdoaWxlIChPID0gZ2V0UHJvdG90eXBlT2YoTykpIGlmICh0aGlzLnByb3RvdHlwZSA9PT0gTykgcmV0dXJuIHRydWU7XG4gIHJldHVybiBmYWxzZTtcbn0gfSk7XG4iLCJ2YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mO1xudmFyIEZQcm90byA9IEZ1bmN0aW9uLnByb3RvdHlwZTtcbnZhciBuYW1lUkUgPSAvXlxccypmdW5jdGlvbiAoW14gKF0qKS87XG52YXIgTkFNRSA9ICduYW1lJztcblxuLy8gMTkuMi40LjIgbmFtZVxuTkFNRSBpbiBGUHJvdG8gfHwgcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiBkUChGUHJvdG8sIE5BTUUsIHtcbiAgY29uZmlndXJhYmxlOiB0cnVlLFxuICBnZXQ6IGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgcmV0dXJuICgnJyArIHRoaXMpLm1hdGNoKG5hbWVSRSlbMV07XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuICcnO1xuICAgIH1cbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgc3Ryb25nID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbi1zdHJvbmcnKTtcbnZhciB2YWxpZGF0ZSA9IHJlcXVpcmUoJy4vX3ZhbGlkYXRlLWNvbGxlY3Rpb24nKTtcbnZhciBNQVAgPSAnTWFwJztcblxuLy8gMjMuMSBNYXAgT2JqZWN0c1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb2xsZWN0aW9uJykoTUFQLCBmdW5jdGlvbiAoZ2V0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBNYXAoKSB7IHJldHVybiBnZXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpOyB9O1xufSwge1xuICAvLyAyMy4xLjMuNiBNYXAucHJvdG90eXBlLmdldChrZXkpXG4gIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgIHZhciBlbnRyeSA9IHN0cm9uZy5nZXRFbnRyeSh2YWxpZGF0ZSh0aGlzLCBNQVApLCBrZXkpO1xuICAgIHJldHVybiBlbnRyeSAmJiBlbnRyeS52O1xuICB9LFxuICAvLyAyMy4xLjMuOSBNYXAucHJvdG90eXBlLnNldChrZXksIHZhbHVlKVxuICBzZXQ6IGZ1bmN0aW9uIHNldChrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHN0cm9uZy5kZWYodmFsaWRhdGUodGhpcywgTUFQKSwga2V5ID09PSAwID8gMCA6IGtleSwgdmFsdWUpO1xuICB9XG59LCBzdHJvbmcsIHRydWUpO1xuIiwiLy8gMjAuMi4yLjMgTWF0aC5hY29zaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBsb2cxcCA9IHJlcXVpcmUoJy4vX21hdGgtbG9nMXAnKTtcbnZhciBzcXJ0ID0gTWF0aC5zcXJ0O1xudmFyICRhY29zaCA9IE1hdGguYWNvc2g7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogISgkYWNvc2hcbiAgLy8gVjggYnVnOiBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL3Y4L2lzc3Vlcy9kZXRhaWw/aWQ9MzUwOVxuICAmJiBNYXRoLmZsb29yKCRhY29zaChOdW1iZXIuTUFYX1ZBTFVFKSkgPT0gNzEwXG4gIC8vIFRvciBCcm93c2VyIGJ1ZzogTWF0aC5hY29zaChJbmZpbml0eSkgLT4gTmFOXG4gICYmICRhY29zaChJbmZpbml0eSkgPT0gSW5maW5pdHlcbiksICdNYXRoJywge1xuICBhY29zaDogZnVuY3Rpb24gYWNvc2goeCkge1xuICAgIHJldHVybiAoeCA9ICt4KSA8IDEgPyBOYU4gOiB4ID4gOTQ5MDYyNjUuNjI0MjUxNTZcbiAgICAgID8gTWF0aC5sb2coeCkgKyBNYXRoLkxOMlxuICAgICAgOiBsb2cxcCh4IC0gMSArIHNxcnQoeCAtIDEpICogc3FydCh4ICsgMSkpO1xuICB9XG59KTtcbiIsIi8vIDIwLjIuMi41IE1hdGguYXNpbmgoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGFzaW5oID0gTWF0aC5hc2luaDtcblxuZnVuY3Rpb24gYXNpbmgoeCkge1xuICByZXR1cm4gIWlzRmluaXRlKHggPSAreCkgfHwgeCA9PSAwID8geCA6IHggPCAwID8gLWFzaW5oKC14KSA6IE1hdGgubG9nKHggKyBNYXRoLnNxcnQoeCAqIHggKyAxKSk7XG59XG5cbi8vIFRvciBCcm93c2VyIGJ1ZzogTWF0aC5hc2luaCgwKSAtPiAtMFxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhKCRhc2luaCAmJiAxIC8gJGFzaW5oKDApID4gMCksICdNYXRoJywgeyBhc2luaDogYXNpbmggfSk7XG4iLCIvLyAyMC4yLjIuNyBNYXRoLmF0YW5oKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRhdGFuaCA9IE1hdGguYXRhbmg7XG5cbi8vIFRvciBCcm93c2VyIGJ1ZzogTWF0aC5hdGFuaCgtMCkgLT4gMFxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhKCRhdGFuaCAmJiAxIC8gJGF0YW5oKC0wKSA8IDApLCAnTWF0aCcsIHtcbiAgYXRhbmg6IGZ1bmN0aW9uIGF0YW5oKHgpIHtcbiAgICByZXR1cm4gKHggPSAreCkgPT0gMCA/IHggOiBNYXRoLmxvZygoMSArIHgpIC8gKDEgLSB4KSkgLyAyO1xuICB9XG59KTtcbiIsIi8vIDIwLjIuMi45IE1hdGguY2JydCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBzaWduID0gcmVxdWlyZSgnLi9fbWF0aC1zaWduJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgY2JydDogZnVuY3Rpb24gY2JydCh4KSB7XG4gICAgcmV0dXJuIHNpZ24oeCA9ICt4KSAqIE1hdGgucG93KE1hdGguYWJzKHgpLCAxIC8gMyk7XG4gIH1cbn0pO1xuIiwiLy8gMjAuMi4yLjExIE1hdGguY2x6MzIoeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgY2x6MzI6IGZ1bmN0aW9uIGNsejMyKHgpIHtcbiAgICByZXR1cm4gKHggPj4+PSAwKSA/IDMxIC0gTWF0aC5mbG9vcihNYXRoLmxvZyh4ICsgMC41KSAqIE1hdGguTE9HMkUpIDogMzI7XG4gIH1cbn0pO1xuIiwiLy8gMjAuMi4yLjEyIE1hdGguY29zaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBleHAgPSBNYXRoLmV4cDtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBjb3NoOiBmdW5jdGlvbiBjb3NoKHgpIHtcbiAgICByZXR1cm4gKGV4cCh4ID0gK3gpICsgZXhwKC14KSkgLyAyO1xuICB9XG59KTtcbiIsIi8vIDIwLjIuMi4xNCBNYXRoLmV4cG0xKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRleHBtMSA9IHJlcXVpcmUoJy4vX21hdGgtZXhwbTEnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoJGV4cG0xICE9IE1hdGguZXhwbTEpLCAnTWF0aCcsIHsgZXhwbTE6ICRleHBtMSB9KTtcbiIsIi8vIDIwLjIuMi4xNiBNYXRoLmZyb3VuZCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywgeyBmcm91bmQ6IHJlcXVpcmUoJy4vX21hdGgtZnJvdW5kJykgfSk7XG4iLCIvLyAyMC4yLjIuMTcgTWF0aC5oeXBvdChbdmFsdWUxWywgdmFsdWUyWywg4oCmIF1dXSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYWJzID0gTWF0aC5hYnM7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgaHlwb3Q6IGZ1bmN0aW9uIGh5cG90KHZhbHVlMSwgdmFsdWUyKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB2YXIgc3VtID0gMDtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGFMZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICAgIHZhciBsYXJnID0gMDtcbiAgICB2YXIgYXJnLCBkaXY7XG4gICAgd2hpbGUgKGkgPCBhTGVuKSB7XG4gICAgICBhcmcgPSBhYnMoYXJndW1lbnRzW2krK10pO1xuICAgICAgaWYgKGxhcmcgPCBhcmcpIHtcbiAgICAgICAgZGl2ID0gbGFyZyAvIGFyZztcbiAgICAgICAgc3VtID0gc3VtICogZGl2ICogZGl2ICsgMTtcbiAgICAgICAgbGFyZyA9IGFyZztcbiAgICAgIH0gZWxzZSBpZiAoYXJnID4gMCkge1xuICAgICAgICBkaXYgPSBhcmcgLyBsYXJnO1xuICAgICAgICBzdW0gKz0gZGl2ICogZGl2O1xuICAgICAgfSBlbHNlIHN1bSArPSBhcmc7XG4gICAgfVxuICAgIHJldHVybiBsYXJnID09PSBJbmZpbml0eSA/IEluZmluaXR5IDogbGFyZyAqIE1hdGguc3FydChzdW0pO1xuICB9XG59KTtcbiIsIi8vIDIwLjIuMi4xOCBNYXRoLmltdWwoeCwgeSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGltdWwgPSBNYXRoLmltdWw7XG5cbi8vIHNvbWUgV2ViS2l0IHZlcnNpb25zIGZhaWxzIHdpdGggYmlnIG51bWJlcnMsIHNvbWUgaGFzIHdyb25nIGFyaXR5XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gJGltdWwoMHhmZmZmZmZmZiwgNSkgIT0gLTUgfHwgJGltdWwubGVuZ3RoICE9IDI7XG59KSwgJ01hdGgnLCB7XG4gIGltdWw6IGZ1bmN0aW9uIGltdWwoeCwgeSkge1xuICAgIHZhciBVSU5UMTYgPSAweGZmZmY7XG4gICAgdmFyIHhuID0gK3g7XG4gICAgdmFyIHluID0gK3k7XG4gICAgdmFyIHhsID0gVUlOVDE2ICYgeG47XG4gICAgdmFyIHlsID0gVUlOVDE2ICYgeW47XG4gICAgcmV0dXJuIDAgfCB4bCAqIHlsICsgKChVSU5UMTYgJiB4biA+Pj4gMTYpICogeWwgKyB4bCAqIChVSU5UMTYgJiB5biA+Pj4gMTYpIDw8IDE2ID4+PiAwKTtcbiAgfVxufSk7XG4iLCIvLyAyMC4yLjIuMjEgTWF0aC5sb2cxMCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBsb2cxMDogZnVuY3Rpb24gbG9nMTAoeCkge1xuICAgIHJldHVybiBNYXRoLmxvZyh4KSAqIE1hdGguTE9HMTBFO1xuICB9XG59KTtcbiIsIi8vIDIwLjIuMi4yMCBNYXRoLmxvZzFwKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7IGxvZzFwOiByZXF1aXJlKCcuL19tYXRoLWxvZzFwJykgfSk7XG4iLCIvLyAyMC4yLjIuMjIgTWF0aC5sb2cyKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGxvZzI6IGZ1bmN0aW9uIGxvZzIoeCkge1xuICAgIHJldHVybiBNYXRoLmxvZyh4KSAvIE1hdGguTE4yO1xuICB9XG59KTtcbiIsIi8vIDIwLjIuMi4yOCBNYXRoLnNpZ24oeClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHsgc2lnbjogcmVxdWlyZSgnLi9fbWF0aC1zaWduJykgfSk7XG4iLCIvLyAyMC4yLjIuMzAgTWF0aC5zaW5oKHgpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGV4cG0xID0gcmVxdWlyZSgnLi9fbWF0aC1leHBtMScpO1xudmFyIGV4cCA9IE1hdGguZXhwO1xuXG4vLyBWOCBuZWFyIENocm9taXVtIDM4IGhhcyBhIHByb2JsZW0gd2l0aCB2ZXJ5IHNtYWxsIG51bWJlcnNcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAhTWF0aC5zaW5oKC0yZS0xNykgIT0gLTJlLTE3O1xufSksICdNYXRoJywge1xuICBzaW5oOiBmdW5jdGlvbiBzaW5oKHgpIHtcbiAgICByZXR1cm4gTWF0aC5hYnMoeCA9ICt4KSA8IDFcbiAgICAgID8gKGV4cG0xKHgpIC0gZXhwbTEoLXgpKSAvIDJcbiAgICAgIDogKGV4cCh4IC0gMSkgLSBleHAoLXggLSAxKSkgKiAoTWF0aC5FIC8gMik7XG4gIH1cbn0pO1xuIiwiLy8gMjAuMi4yLjMzIE1hdGgudGFuaCh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBleHBtMSA9IHJlcXVpcmUoJy4vX21hdGgtZXhwbTEnKTtcbnZhciBleHAgPSBNYXRoLmV4cDtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICB0YW5oOiBmdW5jdGlvbiB0YW5oKHgpIHtcbiAgICB2YXIgYSA9IGV4cG0xKHggPSAreCk7XG4gICAgdmFyIGIgPSBleHBtMSgteCk7XG4gICAgcmV0dXJuIGEgPT0gSW5maW5pdHkgPyAxIDogYiA9PSBJbmZpbml0eSA/IC0xIDogKGEgLSBiKSAvIChleHAoeCkgKyBleHAoLXgpKTtcbiAgfVxufSk7XG4iLCIvLyAyMC4yLjIuMzQgTWF0aC50cnVuYyh4KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICB0cnVuYzogZnVuY3Rpb24gdHJ1bmMoaXQpIHtcbiAgICByZXR1cm4gKGl0ID4gMCA/IE1hdGguZmxvb3IgOiBNYXRoLmNlaWwpKGl0KTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgaGFzID0gcmVxdWlyZSgnLi9faGFzJyk7XG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG52YXIgaW5oZXJpdElmUmVxdWlyZWQgPSByZXF1aXJlKCcuL19pbmhlcml0LWlmLXJlcXVpcmVkJyk7XG52YXIgdG9QcmltaXRpdmUgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgZ09QTiA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZjtcbnZhciBnT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKS5mO1xudmFyIGRQID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZjtcbnZhciAkdHJpbSA9IHJlcXVpcmUoJy4vX3N0cmluZy10cmltJykudHJpbTtcbnZhciBOVU1CRVIgPSAnTnVtYmVyJztcbnZhciAkTnVtYmVyID0gZ2xvYmFsW05VTUJFUl07XG52YXIgQmFzZSA9ICROdW1iZXI7XG52YXIgcHJvdG8gPSAkTnVtYmVyLnByb3RvdHlwZTtcbi8vIE9wZXJhIH4xMiBoYXMgYnJva2VuIE9iamVjdCN0b1N0cmluZ1xudmFyIEJST0tFTl9DT0YgPSBjb2YocmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpKHByb3RvKSkgPT0gTlVNQkVSO1xudmFyIFRSSU0gPSAndHJpbScgaW4gU3RyaW5nLnByb3RvdHlwZTtcblxuLy8gNy4xLjMgVG9OdW1iZXIoYXJndW1lbnQpXG52YXIgdG9OdW1iZXIgPSBmdW5jdGlvbiAoYXJndW1lbnQpIHtcbiAgdmFyIGl0ID0gdG9QcmltaXRpdmUoYXJndW1lbnQsIGZhbHNlKTtcbiAgaWYgKHR5cGVvZiBpdCA9PSAnc3RyaW5nJyAmJiBpdC5sZW5ndGggPiAyKSB7XG4gICAgaXQgPSBUUklNID8gaXQudHJpbSgpIDogJHRyaW0oaXQsIDMpO1xuICAgIHZhciBmaXJzdCA9IGl0LmNoYXJDb2RlQXQoMCk7XG4gICAgdmFyIHRoaXJkLCByYWRpeCwgbWF4Q29kZTtcbiAgICBpZiAoZmlyc3QgPT09IDQzIHx8IGZpcnN0ID09PSA0NSkge1xuICAgICAgdGhpcmQgPSBpdC5jaGFyQ29kZUF0KDIpO1xuICAgICAgaWYgKHRoaXJkID09PSA4OCB8fCB0aGlyZCA9PT0gMTIwKSByZXR1cm4gTmFOOyAvLyBOdW1iZXIoJysweDEnKSBzaG91bGQgYmUgTmFOLCBvbGQgVjggZml4XG4gICAgfSBlbHNlIGlmIChmaXJzdCA9PT0gNDgpIHtcbiAgICAgIHN3aXRjaCAoaXQuY2hhckNvZGVBdCgxKSkge1xuICAgICAgICBjYXNlIDY2OiBjYXNlIDk4OiByYWRpeCA9IDI7IG1heENvZGUgPSA0OTsgYnJlYWs7IC8vIGZhc3QgZXF1YWwgL14wYlswMV0rJC9pXG4gICAgICAgIGNhc2UgNzk6IGNhc2UgMTExOiByYWRpeCA9IDg7IG1heENvZGUgPSA1NTsgYnJlYWs7IC8vIGZhc3QgZXF1YWwgL14wb1swLTddKyQvaVxuICAgICAgICBkZWZhdWx0OiByZXR1cm4gK2l0O1xuICAgICAgfVxuICAgICAgZm9yICh2YXIgZGlnaXRzID0gaXQuc2xpY2UoMiksIGkgPSAwLCBsID0gZGlnaXRzLmxlbmd0aCwgY29kZTsgaSA8IGw7IGkrKykge1xuICAgICAgICBjb2RlID0gZGlnaXRzLmNoYXJDb2RlQXQoaSk7XG4gICAgICAgIC8vIHBhcnNlSW50IHBhcnNlcyBhIHN0cmluZyB0byBhIGZpcnN0IHVuYXZhaWxhYmxlIHN5bWJvbFxuICAgICAgICAvLyBidXQgVG9OdW1iZXIgc2hvdWxkIHJldHVybiBOYU4gaWYgYSBzdHJpbmcgY29udGFpbnMgdW5hdmFpbGFibGUgc3ltYm9sc1xuICAgICAgICBpZiAoY29kZSA8IDQ4IHx8IGNvZGUgPiBtYXhDb2RlKSByZXR1cm4gTmFOO1xuICAgICAgfSByZXR1cm4gcGFyc2VJbnQoZGlnaXRzLCByYWRpeCk7XG4gICAgfVxuICB9IHJldHVybiAraXQ7XG59O1xuXG5pZiAoISROdW1iZXIoJyAwbzEnKSB8fCAhJE51bWJlcignMGIxJykgfHwgJE51bWJlcignKzB4MScpKSB7XG4gICROdW1iZXIgPSBmdW5jdGlvbiBOdW1iZXIodmFsdWUpIHtcbiAgICB2YXIgaXQgPSBhcmd1bWVudHMubGVuZ3RoIDwgMSA/IDAgOiB2YWx1ZTtcbiAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgcmV0dXJuIHRoYXQgaW5zdGFuY2VvZiAkTnVtYmVyXG4gICAgICAvLyBjaGVjayBvbiAxLi5jb25zdHJ1Y3Rvcihmb28pIGNhc2VcbiAgICAgICYmIChCUk9LRU5fQ09GID8gZmFpbHMoZnVuY3Rpb24gKCkgeyBwcm90by52YWx1ZU9mLmNhbGwodGhhdCk7IH0pIDogY29mKHRoYXQpICE9IE5VTUJFUilcbiAgICAgICAgPyBpbmhlcml0SWZSZXF1aXJlZChuZXcgQmFzZSh0b051bWJlcihpdCkpLCB0aGF0LCAkTnVtYmVyKSA6IHRvTnVtYmVyKGl0KTtcbiAgfTtcbiAgZm9yICh2YXIga2V5cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBnT1BOKEJhc2UpIDogKFxuICAgIC8vIEVTMzpcbiAgICAnTUFYX1ZBTFVFLE1JTl9WQUxVRSxOYU4sTkVHQVRJVkVfSU5GSU5JVFksUE9TSVRJVkVfSU5GSU5JVFksJyArXG4gICAgLy8gRVM2IChpbiBjYXNlLCBpZiBtb2R1bGVzIHdpdGggRVM2IE51bWJlciBzdGF0aWNzIHJlcXVpcmVkIGJlZm9yZSk6XG4gICAgJ0VQU0lMT04saXNGaW5pdGUsaXNJbnRlZ2VyLGlzTmFOLGlzU2FmZUludGVnZXIsTUFYX1NBRkVfSU5URUdFUiwnICtcbiAgICAnTUlOX1NBRkVfSU5URUdFUixwYXJzZUZsb2F0LHBhcnNlSW50LGlzSW50ZWdlcidcbiAgKS5zcGxpdCgnLCcpLCBqID0gMCwga2V5OyBrZXlzLmxlbmd0aCA+IGo7IGorKykge1xuICAgIGlmIChoYXMoQmFzZSwga2V5ID0ga2V5c1tqXSkgJiYgIWhhcygkTnVtYmVyLCBrZXkpKSB7XG4gICAgICBkUCgkTnVtYmVyLCBrZXksIGdPUEQoQmFzZSwga2V5KSk7XG4gICAgfVxuICB9XG4gICROdW1iZXIucHJvdG90eXBlID0gcHJvdG87XG4gIHByb3RvLmNvbnN0cnVjdG9yID0gJE51bWJlcjtcbiAgcmVxdWlyZSgnLi9fcmVkZWZpbmUnKShnbG9iYWwsIE5VTUJFUiwgJE51bWJlcik7XG59XG4iLCIvLyAyMC4xLjIuMSBOdW1iZXIuRVBTSUxPTlxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7IEVQU0lMT046IE1hdGgucG93KDIsIC01MikgfSk7XG4iLCIvLyAyMC4xLjIuMiBOdW1iZXIuaXNGaW5pdGUobnVtYmVyKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBfaXNGaW5pdGUgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5pc0Zpbml0ZTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7XG4gIGlzRmluaXRlOiBmdW5jdGlvbiBpc0Zpbml0ZShpdCkge1xuICAgIHJldHVybiB0eXBlb2YgaXQgPT0gJ251bWJlcicgJiYgX2lzRmluaXRlKGl0KTtcbiAgfVxufSk7XG4iLCIvLyAyMC4xLjIuMyBOdW1iZXIuaXNJbnRlZ2VyKG51bWJlcilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywgeyBpc0ludGVnZXI6IHJlcXVpcmUoJy4vX2lzLWludGVnZXInKSB9KTtcbiIsIi8vIDIwLjEuMi40IE51bWJlci5pc05hTihudW1iZXIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHtcbiAgaXNOYU46IGZ1bmN0aW9uIGlzTmFOKG51bWJlcikge1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zZWxmLWNvbXBhcmVcbiAgICByZXR1cm4gbnVtYmVyICE9IG51bWJlcjtcbiAgfVxufSk7XG4iLCIvLyAyMC4xLjIuNSBOdW1iZXIuaXNTYWZlSW50ZWdlcihudW1iZXIpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGlzSW50ZWdlciA9IHJlcXVpcmUoJy4vX2lzLWludGVnZXInKTtcbnZhciBhYnMgPSBNYXRoLmFicztcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdOdW1iZXInLCB7XG4gIGlzU2FmZUludGVnZXI6IGZ1bmN0aW9uIGlzU2FmZUludGVnZXIobnVtYmVyKSB7XG4gICAgcmV0dXJuIGlzSW50ZWdlcihudW1iZXIpICYmIGFicyhudW1iZXIpIDw9IDB4MWZmZmZmZmZmZmZmZmY7XG4gIH1cbn0pO1xuIiwiLy8gMjAuMS4yLjYgTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVJcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTnVtYmVyJywgeyBNQVhfU0FGRV9JTlRFR0VSOiAweDFmZmZmZmZmZmZmZmZmIH0pO1xuIiwiLy8gMjAuMS4yLjEwIE51bWJlci5NSU5fU0FGRV9JTlRFR0VSXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ051bWJlcicsIHsgTUlOX1NBRkVfSU5URUdFUjogLTB4MWZmZmZmZmZmZmZmZmYgfSk7XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRwYXJzZUZsb2F0ID0gcmVxdWlyZSgnLi9fcGFyc2UtZmxvYXQnKTtcbi8vIDIwLjEuMi4xMiBOdW1iZXIucGFyc2VGbG9hdChzdHJpbmcpXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIChOdW1iZXIucGFyc2VGbG9hdCAhPSAkcGFyc2VGbG9hdCksICdOdW1iZXInLCB7IHBhcnNlRmxvYXQ6ICRwYXJzZUZsb2F0IH0pO1xuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcGFyc2VJbnQgPSByZXF1aXJlKCcuL19wYXJzZS1pbnQnKTtcbi8vIDIwLjEuMi4xMyBOdW1iZXIucGFyc2VJbnQoc3RyaW5nLCByYWRpeClcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKE51bWJlci5wYXJzZUludCAhPSAkcGFyc2VJbnQpLCAnTnVtYmVyJywgeyBwYXJzZUludDogJHBhcnNlSW50IH0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgYU51bWJlclZhbHVlID0gcmVxdWlyZSgnLi9fYS1udW1iZXItdmFsdWUnKTtcbnZhciByZXBlYXQgPSByZXF1aXJlKCcuL19zdHJpbmctcmVwZWF0Jyk7XG52YXIgJHRvRml4ZWQgPSAxLjAudG9GaXhlZDtcbnZhciBmbG9vciA9IE1hdGguZmxvb3I7XG52YXIgZGF0YSA9IFswLCAwLCAwLCAwLCAwLCAwXTtcbnZhciBFUlJPUiA9ICdOdW1iZXIudG9GaXhlZDogaW5jb3JyZWN0IGludm9jYXRpb24hJztcbnZhciBaRVJPID0gJzAnO1xuXG52YXIgbXVsdGlwbHkgPSBmdW5jdGlvbiAobiwgYykge1xuICB2YXIgaSA9IC0xO1xuICB2YXIgYzIgPSBjO1xuICB3aGlsZSAoKytpIDwgNikge1xuICAgIGMyICs9IG4gKiBkYXRhW2ldO1xuICAgIGRhdGFbaV0gPSBjMiAlIDFlNztcbiAgICBjMiA9IGZsb29yKGMyIC8gMWU3KTtcbiAgfVxufTtcbnZhciBkaXZpZGUgPSBmdW5jdGlvbiAobikge1xuICB2YXIgaSA9IDY7XG4gIHZhciBjID0gMDtcbiAgd2hpbGUgKC0taSA+PSAwKSB7XG4gICAgYyArPSBkYXRhW2ldO1xuICAgIGRhdGFbaV0gPSBmbG9vcihjIC8gbik7XG4gICAgYyA9IChjICUgbikgKiAxZTc7XG4gIH1cbn07XG52YXIgbnVtVG9TdHJpbmcgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBpID0gNjtcbiAgdmFyIHMgPSAnJztcbiAgd2hpbGUgKC0taSA+PSAwKSB7XG4gICAgaWYgKHMgIT09ICcnIHx8IGkgPT09IDAgfHwgZGF0YVtpXSAhPT0gMCkge1xuICAgICAgdmFyIHQgPSBTdHJpbmcoZGF0YVtpXSk7XG4gICAgICBzID0gcyA9PT0gJycgPyB0IDogcyArIHJlcGVhdC5jYWxsKFpFUk8sIDcgLSB0Lmxlbmd0aCkgKyB0O1xuICAgIH1cbiAgfSByZXR1cm4gcztcbn07XG52YXIgcG93ID0gZnVuY3Rpb24gKHgsIG4sIGFjYykge1xuICByZXR1cm4gbiA9PT0gMCA/IGFjYyA6IG4gJSAyID09PSAxID8gcG93KHgsIG4gLSAxLCBhY2MgKiB4KSA6IHBvdyh4ICogeCwgbiAvIDIsIGFjYyk7XG59O1xudmFyIGxvZyA9IGZ1bmN0aW9uICh4KSB7XG4gIHZhciBuID0gMDtcbiAgdmFyIHgyID0geDtcbiAgd2hpbGUgKHgyID49IDQwOTYpIHtcbiAgICBuICs9IDEyO1xuICAgIHgyIC89IDQwOTY7XG4gIH1cbiAgd2hpbGUgKHgyID49IDIpIHtcbiAgICBuICs9IDE7XG4gICAgeDIgLz0gMjtcbiAgfSByZXR1cm4gbjtcbn07XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogKCEhJHRvRml4ZWQgJiYgKFxuICAwLjAwMDA4LnRvRml4ZWQoMykgIT09ICcwLjAwMCcgfHxcbiAgMC45LnRvRml4ZWQoMCkgIT09ICcxJyB8fFxuICAxLjI1NS50b0ZpeGVkKDIpICE9PSAnMS4yNScgfHxcbiAgMTAwMDAwMDAwMDAwMDAwMDEyOC4wLnRvRml4ZWQoMCkgIT09ICcxMDAwMDAwMDAwMDAwMDAwMTI4J1xuKSB8fCAhcmVxdWlyZSgnLi9fZmFpbHMnKShmdW5jdGlvbiAoKSB7XG4gIC8vIFY4IH4gQW5kcm9pZCA0LjMtXG4gICR0b0ZpeGVkLmNhbGwoe30pO1xufSkpLCAnTnVtYmVyJywge1xuICB0b0ZpeGVkOiBmdW5jdGlvbiB0b0ZpeGVkKGZyYWN0aW9uRGlnaXRzKSB7XG4gICAgdmFyIHggPSBhTnVtYmVyVmFsdWUodGhpcywgRVJST1IpO1xuICAgIHZhciBmID0gdG9JbnRlZ2VyKGZyYWN0aW9uRGlnaXRzKTtcbiAgICB2YXIgcyA9ICcnO1xuICAgIHZhciBtID0gWkVSTztcbiAgICB2YXIgZSwgeiwgaiwgaztcbiAgICBpZiAoZiA8IDAgfHwgZiA+IDIwKSB0aHJvdyBSYW5nZUVycm9yKEVSUk9SKTtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gICAgaWYgKHggIT0geCkgcmV0dXJuICdOYU4nO1xuICAgIGlmICh4IDw9IC0xZTIxIHx8IHggPj0gMWUyMSkgcmV0dXJuIFN0cmluZyh4KTtcbiAgICBpZiAoeCA8IDApIHtcbiAgICAgIHMgPSAnLSc7XG4gICAgICB4ID0gLXg7XG4gICAgfVxuICAgIGlmICh4ID4gMWUtMjEpIHtcbiAgICAgIGUgPSBsb2coeCAqIHBvdygyLCA2OSwgMSkpIC0gNjk7XG4gICAgICB6ID0gZSA8IDAgPyB4ICogcG93KDIsIC1lLCAxKSA6IHggLyBwb3coMiwgZSwgMSk7XG4gICAgICB6ICo9IDB4MTAwMDAwMDAwMDAwMDA7XG4gICAgICBlID0gNTIgLSBlO1xuICAgICAgaWYgKGUgPiAwKSB7XG4gICAgICAgIG11bHRpcGx5KDAsIHopO1xuICAgICAgICBqID0gZjtcbiAgICAgICAgd2hpbGUgKGogPj0gNykge1xuICAgICAgICAgIG11bHRpcGx5KDFlNywgMCk7XG4gICAgICAgICAgaiAtPSA3O1xuICAgICAgICB9XG4gICAgICAgIG11bHRpcGx5KHBvdygxMCwgaiwgMSksIDApO1xuICAgICAgICBqID0gZSAtIDE7XG4gICAgICAgIHdoaWxlIChqID49IDIzKSB7XG4gICAgICAgICAgZGl2aWRlKDEgPDwgMjMpO1xuICAgICAgICAgIGogLT0gMjM7XG4gICAgICAgIH1cbiAgICAgICAgZGl2aWRlKDEgPDwgaik7XG4gICAgICAgIG11bHRpcGx5KDEsIDEpO1xuICAgICAgICBkaXZpZGUoMik7XG4gICAgICAgIG0gPSBudW1Ub1N0cmluZygpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbXVsdGlwbHkoMCwgeik7XG4gICAgICAgIG11bHRpcGx5KDEgPDwgLWUsIDApO1xuICAgICAgICBtID0gbnVtVG9TdHJpbmcoKSArIHJlcGVhdC5jYWxsKFpFUk8sIGYpO1xuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZiA+IDApIHtcbiAgICAgIGsgPSBtLmxlbmd0aDtcbiAgICAgIG0gPSBzICsgKGsgPD0gZiA/ICcwLicgKyByZXBlYXQuY2FsbChaRVJPLCBmIC0gaykgKyBtIDogbS5zbGljZSgwLCBrIC0gZikgKyAnLicgKyBtLnNsaWNlKGsgLSBmKSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSBzICsgbTtcbiAgICB9IHJldHVybiBtO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcbnZhciBhTnVtYmVyVmFsdWUgPSByZXF1aXJlKCcuL19hLW51bWJlci12YWx1ZScpO1xudmFyICR0b1ByZWNpc2lvbiA9IDEuMC50b1ByZWNpc2lvbjtcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoJGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgLy8gSUU3LVxuICByZXR1cm4gJHRvUHJlY2lzaW9uLmNhbGwoMSwgdW5kZWZpbmVkKSAhPT0gJzEnO1xufSkgfHwgISRmYWlscyhmdW5jdGlvbiAoKSB7XG4gIC8vIFY4IH4gQW5kcm9pZCA0LjMtXG4gICR0b1ByZWNpc2lvbi5jYWxsKHt9KTtcbn0pKSwgJ051bWJlcicsIHtcbiAgdG9QcmVjaXNpb246IGZ1bmN0aW9uIHRvUHJlY2lzaW9uKHByZWNpc2lvbikge1xuICAgIHZhciB0aGF0ID0gYU51bWJlclZhbHVlKHRoaXMsICdOdW1iZXIjdG9QcmVjaXNpb246IGluY29ycmVjdCBpbnZvY2F0aW9uIScpO1xuICAgIHJldHVybiBwcmVjaXNpb24gPT09IHVuZGVmaW5lZCA/ICR0b1ByZWNpc2lvbi5jYWxsKHRoYXQpIDogJHRvUHJlY2lzaW9uLmNhbGwodGhhdCwgcHJlY2lzaW9uKTtcbiAgfVxufSk7XG4iLCIvLyAxOS4xLjMuMSBPYmplY3QuYXNzaWduKHRhcmdldCwgc291cmNlKVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYsICdPYmplY3QnLCB7IGFzc2lnbjogcmVxdWlyZSgnLi9fb2JqZWN0LWFzc2lnbicpIH0pO1xuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxuJGV4cG9ydCgkZXhwb3J0LlMsICdPYmplY3QnLCB7IGNyZWF0ZTogcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpIH0pO1xuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbi8vIDE5LjEuMi4zIC8gMTUuMi4zLjcgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcylcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyksICdPYmplY3QnLCB7IGRlZmluZVByb3BlcnRpZXM6IHJlcXVpcmUoJy4vX29iamVjdC1kcHMnKSB9KTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4vLyAxOS4xLjIuNCAvIDE1LjIuMy42IE9iamVjdC5kZWZpbmVQcm9wZXJ0eShPLCBQLCBBdHRyaWJ1dGVzKVxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhcmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSwgJ09iamVjdCcsIHsgZGVmaW5lUHJvcGVydHk6IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmYgfSk7XG4iLCIvLyAxOS4xLjIuNSBPYmplY3QuZnJlZXplKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBtZXRhID0gcmVxdWlyZSgnLi9fbWV0YScpLm9uRnJlZXplO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2ZyZWV6ZScsIGZ1bmN0aW9uICgkZnJlZXplKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmcmVlemUoaXQpIHtcbiAgICByZXR1cm4gJGZyZWV6ZSAmJiBpc09iamVjdChpdCkgPyAkZnJlZXplKG1ldGEoaXQpKSA6IGl0O1xuICB9O1xufSk7XG4iLCIvLyAxOS4xLjIuNiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKE8sIFApXG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyICRnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpLmY7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGl0LCBrZXkpIHtcbiAgICByZXR1cm4gJGdldE93blByb3BlcnR5RGVzY3JpcHRvcih0b0lPYmplY3QoaXQpLCBrZXkpO1xuICB9O1xufSk7XG4iLCIvLyAxOS4xLjIuNyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdnZXRPd25Qcm9wZXJ0eU5hbWVzJywgZnVuY3Rpb24gKCkge1xuICByZXR1cm4gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4tZXh0JykuZjtcbn0pO1xuIiwiLy8gMTkuMS4yLjkgT2JqZWN0LmdldFByb3RvdHlwZU9mKE8pXG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciAkZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnZ2V0UHJvdG90eXBlT2YnLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBnZXRQcm90b3R5cGVPZihpdCkge1xuICAgIHJldHVybiAkZ2V0UHJvdG90eXBlT2YodG9PYmplY3QoaXQpKTtcbiAgfTtcbn0pO1xuIiwiLy8gMTkuMS4yLjExIE9iamVjdC5pc0V4dGVuc2libGUoTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2lzRXh0ZW5zaWJsZScsIGZ1bmN0aW9uICgkaXNFeHRlbnNpYmxlKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpc0V4dGVuc2libGUoaXQpIHtcbiAgICByZXR1cm4gaXNPYmplY3QoaXQpID8gJGlzRXh0ZW5zaWJsZSA/ICRpc0V4dGVuc2libGUoaXQpIDogdHJ1ZSA6IGZhbHNlO1xuICB9O1xufSk7XG4iLCIvLyAxOS4xLjIuMTIgT2JqZWN0LmlzRnJvemVuKE8pXG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcblxucmVxdWlyZSgnLi9fb2JqZWN0LXNhcCcpKCdpc0Zyb3plbicsIGZ1bmN0aW9uICgkaXNGcm96ZW4pIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGlzRnJvemVuKGl0KSB7XG4gICAgcmV0dXJuIGlzT2JqZWN0KGl0KSA/ICRpc0Zyb3plbiA/ICRpc0Zyb3plbihpdCkgOiBmYWxzZSA6IHRydWU7XG4gIH07XG59KTtcbiIsIi8vIDE5LjEuMi4xMyBPYmplY3QuaXNTZWFsZWQoTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2lzU2VhbGVkJywgZnVuY3Rpb24gKCRpc1NlYWxlZCkge1xuICByZXR1cm4gZnVuY3Rpb24gaXNTZWFsZWQoaXQpIHtcbiAgICByZXR1cm4gaXNPYmplY3QoaXQpID8gJGlzU2VhbGVkID8gJGlzU2VhbGVkKGl0KSA6IGZhbHNlIDogdHJ1ZTtcbiAgfTtcbn0pO1xuIiwiLy8gMTkuMS4zLjEwIE9iamVjdC5pcyh2YWx1ZTEsIHZhbHVlMilcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHsgaXM6IHJlcXVpcmUoJy4vX3NhbWUtdmFsdWUnKSB9KTtcbiIsIi8vIDE5LjEuMi4xNCBPYmplY3Qua2V5cyhPKVxudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgJGtleXMgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xuXG5yZXF1aXJlKCcuL19vYmplY3Qtc2FwJykoJ2tleXMnLCBmdW5jdGlvbiAoKSB7XG4gIHJldHVybiBmdW5jdGlvbiBrZXlzKGl0KSB7XG4gICAgcmV0dXJuICRrZXlzKHRvT2JqZWN0KGl0KSk7XG4gIH07XG59KTtcbiIsIi8vIDE5LjEuMi4xNSBPYmplY3QucHJldmVudEV4dGVuc2lvbnMoTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIG1ldGEgPSByZXF1aXJlKCcuL19tZXRhJykub25GcmVlemU7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgncHJldmVudEV4dGVuc2lvbnMnLCBmdW5jdGlvbiAoJHByZXZlbnRFeHRlbnNpb25zKSB7XG4gIHJldHVybiBmdW5jdGlvbiBwcmV2ZW50RXh0ZW5zaW9ucyhpdCkge1xuICAgIHJldHVybiAkcHJldmVudEV4dGVuc2lvbnMgJiYgaXNPYmplY3QoaXQpID8gJHByZXZlbnRFeHRlbnNpb25zKG1ldGEoaXQpKSA6IGl0O1xuICB9O1xufSk7XG4iLCIvLyAxOS4xLjIuMTcgT2JqZWN0LnNlYWwoTylcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIG1ldGEgPSByZXF1aXJlKCcuL19tZXRhJykub25GcmVlemU7XG5cbnJlcXVpcmUoJy4vX29iamVjdC1zYXAnKSgnc2VhbCcsIGZ1bmN0aW9uICgkc2VhbCkge1xuICByZXR1cm4gZnVuY3Rpb24gc2VhbChpdCkge1xuICAgIHJldHVybiAkc2VhbCAmJiBpc09iamVjdChpdCkgPyAkc2VhbChtZXRhKGl0KSkgOiBpdDtcbiAgfTtcbn0pO1xuIiwiLy8gMTkuMS4zLjE5IE9iamVjdC5zZXRQcm90b3R5cGVPZihPLCBwcm90bylcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHsgc2V0UHJvdG90eXBlT2Y6IHJlcXVpcmUoJy4vX3NldC1wcm90bycpLnNldCB9KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNsYXNzb2YgPSByZXF1aXJlKCcuL19jbGFzc29mJyk7XG52YXIgdGVzdCA9IHt9O1xudGVzdFtyZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKV0gPSAneic7XG5pZiAodGVzdCArICcnICE9ICdbb2JqZWN0IHpdJykge1xuICByZXF1aXJlKCcuL19yZWRlZmluZScpKE9iamVjdC5wcm90b3R5cGUsICd0b1N0cmluZycsIGZ1bmN0aW9uIHRvU3RyaW5nKCkge1xuICAgIHJldHVybiAnW29iamVjdCAnICsgY2xhc3NvZih0aGlzKSArICddJztcbiAgfSwgdHJ1ZSk7XG59XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRwYXJzZUZsb2F0ID0gcmVxdWlyZSgnLi9fcGFyc2UtZmxvYXQnKTtcbi8vIDE4LjIuNCBwYXJzZUZsb2F0KHN0cmluZylcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5GICogKHBhcnNlRmxvYXQgIT0gJHBhcnNlRmxvYXQpLCB7IHBhcnNlRmxvYXQ6ICRwYXJzZUZsb2F0IH0pO1xuIiwidmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkcGFyc2VJbnQgPSByZXF1aXJlKCcuL19wYXJzZS1pbnQnKTtcbi8vIDE4LjIuNSBwYXJzZUludChzdHJpbmcsIHJhZGl4KVxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LkYgKiAocGFyc2VJbnQgIT0gJHBhcnNlSW50KSwgeyBwYXJzZUludDogJHBhcnNlSW50IH0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIExJQlJBUlkgPSByZXF1aXJlKCcuL19saWJyYXJ5Jyk7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgY3R4ID0gcmVxdWlyZSgnLi9fY3R4Jyk7XG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG52YXIgZm9yT2YgPSByZXF1aXJlKCcuL19mb3Itb2YnKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgdGFzayA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXQ7XG52YXIgbWljcm90YXNrID0gcmVxdWlyZSgnLi9fbWljcm90YXNrJykoKTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eU1vZHVsZSA9IHJlcXVpcmUoJy4vX25ldy1wcm9taXNlLWNhcGFiaWxpdHknKTtcbnZhciBwZXJmb3JtID0gcmVxdWlyZSgnLi9fcGVyZm9ybScpO1xudmFyIHVzZXJBZ2VudCA9IHJlcXVpcmUoJy4vX3VzZXItYWdlbnQnKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4vX3Byb21pc2UtcmVzb2x2ZScpO1xudmFyIFBST01JU0UgPSAnUHJvbWlzZSc7XG52YXIgVHlwZUVycm9yID0gZ2xvYmFsLlR5cGVFcnJvcjtcbnZhciBwcm9jZXNzID0gZ2xvYmFsLnByb2Nlc3M7XG52YXIgdmVyc2lvbnMgPSBwcm9jZXNzICYmIHByb2Nlc3MudmVyc2lvbnM7XG52YXIgdjggPSB2ZXJzaW9ucyAmJiB2ZXJzaW9ucy52OCB8fCAnJztcbnZhciAkUHJvbWlzZSA9IGdsb2JhbFtQUk9NSVNFXTtcbnZhciBpc05vZGUgPSBjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJztcbnZhciBlbXB0eSA9IGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfTtcbnZhciBJbnRlcm5hbCwgbmV3R2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5LCBPd25Qcm9taXNlQ2FwYWJpbGl0eSwgV3JhcHBlcjtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmY7XG5cbnZhciBVU0VfTkFUSVZFID0gISFmdW5jdGlvbiAoKSB7XG4gIHRyeSB7XG4gICAgLy8gY29ycmVjdCBzdWJjbGFzc2luZyB3aXRoIEBAc3BlY2llcyBzdXBwb3J0XG4gICAgdmFyIHByb21pc2UgPSAkUHJvbWlzZS5yZXNvbHZlKDEpO1xuICAgIHZhciBGYWtlUHJvbWlzZSA9IChwcm9taXNlLmNvbnN0cnVjdG9yID0ge30pW3JlcXVpcmUoJy4vX3drcycpKCdzcGVjaWVzJyldID0gZnVuY3Rpb24gKGV4ZWMpIHtcbiAgICAgIGV4ZWMoZW1wdHksIGVtcHR5KTtcbiAgICB9O1xuICAgIC8vIHVuaGFuZGxlZCByZWplY3Rpb25zIHRyYWNraW5nIHN1cHBvcnQsIE5vZGVKUyBQcm9taXNlIHdpdGhvdXQgaXQgZmFpbHMgQEBzcGVjaWVzIHRlc3RcbiAgICByZXR1cm4gKGlzTm9kZSB8fCB0eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50ID09ICdmdW5jdGlvbicpXG4gICAgICAmJiBwcm9taXNlLnRoZW4oZW1wdHkpIGluc3RhbmNlb2YgRmFrZVByb21pc2VcbiAgICAgIC8vIHY4IDYuNiAoTm9kZSAxMCBhbmQgQ2hyb21lIDY2KSBoYXZlIGEgYnVnIHdpdGggcmVzb2x2aW5nIGN1c3RvbSB0aGVuYWJsZXNcbiAgICAgIC8vIGh0dHBzOi8vYnVncy5jaHJvbWl1bS5vcmcvcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTgzMDU2NVxuICAgICAgLy8gd2UgY2FuJ3QgZGV0ZWN0IGl0IHN5bmNocm9ub3VzbHksIHNvIGp1c3QgY2hlY2sgdmVyc2lvbnNcbiAgICAgICYmIHY4LmluZGV4T2YoJzYuNicpICE9PSAwXG4gICAgICAmJiB1c2VyQWdlbnQuaW5kZXhPZignQ2hyb21lLzY2JykgPT09IC0xO1xuICB9IGNhdGNoIChlKSB7IC8qIGVtcHR5ICovIH1cbn0oKTtcblxuLy8gaGVscGVyc1xudmFyIGlzVGhlbmFibGUgPSBmdW5jdGlvbiAoaXQpIHtcbiAgdmFyIHRoZW47XG4gIHJldHVybiBpc09iamVjdChpdCkgJiYgdHlwZW9mICh0aGVuID0gaXQudGhlbikgPT0gJ2Z1bmN0aW9uJyA/IHRoZW4gOiBmYWxzZTtcbn07XG52YXIgbm90aWZ5ID0gZnVuY3Rpb24gKHByb21pc2UsIGlzUmVqZWN0KSB7XG4gIGlmIChwcm9taXNlLl9uKSByZXR1cm47XG4gIHByb21pc2UuX24gPSB0cnVlO1xuICB2YXIgY2hhaW4gPSBwcm9taXNlLl9jO1xuICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3Y7XG4gICAgdmFyIG9rID0gcHJvbWlzZS5fcyA9PSAxO1xuICAgIHZhciBpID0gMDtcbiAgICB2YXIgcnVuID0gZnVuY3Rpb24gKHJlYWN0aW9uKSB7XG4gICAgICB2YXIgaGFuZGxlciA9IG9rID8gcmVhY3Rpb24ub2sgOiByZWFjdGlvbi5mYWlsO1xuICAgICAgdmFyIHJlc29sdmUgPSByZWFjdGlvbi5yZXNvbHZlO1xuICAgICAgdmFyIHJlamVjdCA9IHJlYWN0aW9uLnJlamVjdDtcbiAgICAgIHZhciBkb21haW4gPSByZWFjdGlvbi5kb21haW47XG4gICAgICB2YXIgcmVzdWx0LCB0aGVuLCBleGl0ZWQ7XG4gICAgICB0cnkge1xuICAgICAgICBpZiAoaGFuZGxlcikge1xuICAgICAgICAgIGlmICghb2spIHtcbiAgICAgICAgICAgIGlmIChwcm9taXNlLl9oID09IDIpIG9uSGFuZGxlVW5oYW5kbGVkKHByb21pc2UpO1xuICAgICAgICAgICAgcHJvbWlzZS5faCA9IDE7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChoYW5kbGVyID09PSB0cnVlKSByZXN1bHQgPSB2YWx1ZTtcbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlmIChkb21haW4pIGRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7IC8vIG1heSB0aHJvd1xuICAgICAgICAgICAgaWYgKGRvbWFpbikge1xuICAgICAgICAgICAgICBkb21haW4uZXhpdCgpO1xuICAgICAgICAgICAgICBleGl0ZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKSB7XG4gICAgICAgICAgICByZWplY3QoVHlwZUVycm9yKCdQcm9taXNlLWNoYWluIGN5Y2xlJykpO1xuICAgICAgICAgIH0gZWxzZSBpZiAodGhlbiA9IGlzVGhlbmFibGUocmVzdWx0KSkge1xuICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgaWYgKGRvbWFpbiAmJiAhZXhpdGVkKSBkb21haW4uZXhpdCgpO1xuICAgICAgICByZWplY3QoZSk7XG4gICAgICB9XG4gICAgfTtcbiAgICB3aGlsZSAoY2hhaW4ubGVuZ3RoID4gaSkgcnVuKGNoYWluW2krK10pOyAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIHByb21pc2UuX2MgPSBbXTtcbiAgICBwcm9taXNlLl9uID0gZmFsc2U7XG4gICAgaWYgKGlzUmVqZWN0ICYmICFwcm9taXNlLl9oKSBvblVuaGFuZGxlZChwcm9taXNlKTtcbiAgfSk7XG59O1xudmFyIG9uVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgdGFzay5jYWxsKGdsb2JhbCwgZnVuY3Rpb24gKCkge1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3Y7XG4gICAgdmFyIHVuaGFuZGxlZCA9IGlzVW5oYW5kbGVkKHByb21pc2UpO1xuICAgIHZhciByZXN1bHQsIGhhbmRsZXIsIGNvbnNvbGU7XG4gICAgaWYgKHVuaGFuZGxlZCkge1xuICAgICAgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmIChpc05vZGUpIHtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGlmIChoYW5kbGVyID0gZ2xvYmFsLm9udW5oYW5kbGVkcmVqZWN0aW9uKSB7XG4gICAgICAgICAgaGFuZGxlcih7IHByb21pc2U6IHByb21pc2UsIHJlYXNvbjogdmFsdWUgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoKGNvbnNvbGUgPSBnbG9iYWwuY29uc29sZSkgJiYgY29uc29sZS5lcnJvcikge1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBCcm93c2VycyBzaG91bGQgbm90IHRyaWdnZXIgYHJlamVjdGlvbkhhbmRsZWRgIGV2ZW50IGlmIGl0IHdhcyBoYW5kbGVkIGhlcmUsIE5vZGVKUyAtIHNob3VsZFxuICAgICAgcHJvbWlzZS5faCA9IGlzTm9kZSB8fCBpc1VuaGFuZGxlZChwcm9taXNlKSA/IDIgOiAxO1xuICAgIH0gcHJvbWlzZS5fYSA9IHVuZGVmaW5lZDtcbiAgICBpZiAodW5oYW5kbGVkICYmIHJlc3VsdC5lKSB0aHJvdyByZXN1bHQudjtcbiAgfSk7XG59O1xudmFyIGlzVW5oYW5kbGVkID0gZnVuY3Rpb24gKHByb21pc2UpIHtcbiAgcmV0dXJuIHByb21pc2UuX2ggIT09IDEgJiYgKHByb21pc2UuX2EgfHwgcHJvbWlzZS5fYykubGVuZ3RoID09PSAwO1xufTtcbnZhciBvbkhhbmRsZVVuaGFuZGxlZCA9IGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gIHRhc2suY2FsbChnbG9iYWwsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaGFuZGxlcjtcbiAgICBpZiAoaXNOb2RlKSB7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgaWYgKGhhbmRsZXIgPSBnbG9iYWwub25yZWplY3Rpb25oYW5kbGVkKSB7XG4gICAgICBoYW5kbGVyKHsgcHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiBwcm9taXNlLl92IH0pO1xuICAgIH1cbiAgfSk7XG59O1xudmFyICRyZWplY3QgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICBpZiAocHJvbWlzZS5fZCkgcmV0dXJuO1xuICBwcm9taXNlLl9kID0gdHJ1ZTtcbiAgcHJvbWlzZSA9IHByb21pc2UuX3cgfHwgcHJvbWlzZTsgLy8gdW53cmFwXG4gIHByb21pc2UuX3YgPSB2YWx1ZTtcbiAgcHJvbWlzZS5fcyA9IDI7XG4gIGlmICghcHJvbWlzZS5fYSkgcHJvbWlzZS5fYSA9IHByb21pc2UuX2Muc2xpY2UoKTtcbiAgbm90aWZ5KHByb21pc2UsIHRydWUpO1xufTtcbnZhciAkcmVzb2x2ZSA9IGZ1bmN0aW9uICh2YWx1ZSkge1xuICB2YXIgcHJvbWlzZSA9IHRoaXM7XG4gIHZhciB0aGVuO1xuICBpZiAocHJvbWlzZS5fZCkgcmV0dXJuO1xuICBwcm9taXNlLl9kID0gdHJ1ZTtcbiAgcHJvbWlzZSA9IHByb21pc2UuX3cgfHwgcHJvbWlzZTsgLy8gdW53cmFwXG4gIHRyeSB7XG4gICAgaWYgKHByb21pc2UgPT09IHZhbHVlKSB0aHJvdyBUeXBlRXJyb3IoXCJQcm9taXNlIGNhbid0IGJlIHJlc29sdmVkIGl0c2VsZlwiKTtcbiAgICBpZiAodGhlbiA9IGlzVGhlbmFibGUodmFsdWUpKSB7XG4gICAgICBtaWNyb3Rhc2soZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgd3JhcHBlciA9IHsgX3c6IHByb21pc2UsIF9kOiBmYWxzZSB9OyAvLyB3cmFwXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgdGhlbi5jYWxsKHZhbHVlLCBjdHgoJHJlc29sdmUsIHdyYXBwZXIsIDEpLCBjdHgoJHJlamVjdCwgd3JhcHBlciwgMSkpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgJHJlamVjdC5jYWxsKHdyYXBwZXIsIGUpO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJvbWlzZS5fdiA9IHZhbHVlO1xuICAgICAgcHJvbWlzZS5fcyA9IDE7XG4gICAgICBub3RpZnkocHJvbWlzZSwgZmFsc2UpO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgICRyZWplY3QuY2FsbCh7IF93OiBwcm9taXNlLCBfZDogZmFsc2UgfSwgZSk7IC8vIHdyYXBcbiAgfVxufTtcblxuLy8gY29uc3RydWN0b3IgcG9seWZpbGxcbmlmICghVVNFX05BVElWRSkge1xuICAvLyAyNS40LjMuMSBQcm9taXNlKGV4ZWN1dG9yKVxuICAkUHJvbWlzZSA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICBhbkluc3RhbmNlKHRoaXMsICRQcm9taXNlLCBQUk9NSVNFLCAnX2gnKTtcbiAgICBhRnVuY3Rpb24oZXhlY3V0b3IpO1xuICAgIEludGVybmFsLmNhbGwodGhpcyk7XG4gICAgdHJ5IHtcbiAgICAgIGV4ZWN1dG9yKGN0eCgkcmVzb2x2ZSwgdGhpcywgMSksIGN0eCgkcmVqZWN0LCB0aGlzLCAxKSk7XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAkcmVqZWN0LmNhbGwodGhpcywgZXJyKTtcbiAgICB9XG4gIH07XG4gIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bnVzZWQtdmFyc1xuICBJbnRlcm5hbCA9IGZ1bmN0aW9uIFByb21pc2UoZXhlY3V0b3IpIHtcbiAgICB0aGlzLl9jID0gW107ICAgICAgICAgICAgIC8vIDwtIGF3YWl0aW5nIHJlYWN0aW9uc1xuICAgIHRoaXMuX2EgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gY2hlY2tlZCBpbiBpc1VuaGFuZGxlZCByZWFjdGlvbnNcbiAgICB0aGlzLl9zID0gMDsgICAgICAgICAgICAgIC8vIDwtIHN0YXRlXG4gICAgdGhpcy5fZCA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBkb25lXG4gICAgdGhpcy5fdiA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSB2YWx1ZVxuICAgIHRoaXMuX2ggPSAwOyAgICAgICAgICAgICAgLy8gPC0gcmVqZWN0aW9uIHN0YXRlLCAwIC0gZGVmYXVsdCwgMSAtIGhhbmRsZWQsIDIgLSB1bmhhbmRsZWRcbiAgICB0aGlzLl9uID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIG5vdGlmeVxuICB9O1xuICBJbnRlcm5hbC5wcm90b3R5cGUgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKSgkUHJvbWlzZS5wcm90b3R5cGUsIHtcbiAgICAvLyAyNS40LjUuMyBQcm9taXNlLnByb3RvdHlwZS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKVxuICAgIHRoZW46IGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpIHtcbiAgICAgIHZhciByZWFjdGlvbiA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCAkUHJvbWlzZSkpO1xuICAgICAgcmVhY3Rpb24ub2sgPSB0eXBlb2Ygb25GdWxmaWxsZWQgPT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogdHJ1ZTtcbiAgICAgIHJlYWN0aW9uLmZhaWwgPSB0eXBlb2Ygb25SZWplY3RlZCA9PSAnZnVuY3Rpb24nICYmIG9uUmVqZWN0ZWQ7XG4gICAgICByZWFjdGlvbi5kb21haW4gPSBpc05vZGUgPyBwcm9jZXNzLmRvbWFpbiA6IHVuZGVmaW5lZDtcbiAgICAgIHRoaXMuX2MucHVzaChyZWFjdGlvbik7XG4gICAgICBpZiAodGhpcy5fYSkgdGhpcy5fYS5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmICh0aGlzLl9zKSBub3RpZnkodGhpcywgZmFsc2UpO1xuICAgICAgcmV0dXJuIHJlYWN0aW9uLnByb21pc2U7XG4gICAgfSxcbiAgICAvLyAyNS40LjUuMSBQcm9taXNlLnByb3RvdHlwZS5jYXRjaChvblJlamVjdGVkKVxuICAgICdjYXRjaCc6IGZ1bmN0aW9uIChvblJlamVjdGVkKSB7XG4gICAgICByZXR1cm4gdGhpcy50aGVuKHVuZGVmaW5lZCwgb25SZWplY3RlZCk7XG4gICAgfVxuICB9KTtcbiAgT3duUHJvbWlzZUNhcGFiaWxpdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHByb21pc2UgPSBuZXcgSW50ZXJuYWwoKTtcbiAgICB0aGlzLnByb21pc2UgPSBwcm9taXNlO1xuICAgIHRoaXMucmVzb2x2ZSA9IGN0eCgkcmVzb2x2ZSwgcHJvbWlzZSwgMSk7XG4gICAgdGhpcy5yZWplY3QgPSBjdHgoJHJlamVjdCwgcHJvbWlzZSwgMSk7XG4gIH07XG4gIG5ld1Byb21pc2VDYXBhYmlsaXR5TW9kdWxlLmYgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uIChDKSB7XG4gICAgcmV0dXJuIEMgPT09ICRQcm9taXNlIHx8IEMgPT09IFdyYXBwZXJcbiAgICAgID8gbmV3IE93blByb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICA6IG5ld0dlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgfTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgeyBQcm9taXNlOiAkUHJvbWlzZSB9KTtcbnJlcXVpcmUoJy4vX3NldC10by1zdHJpbmctdGFnJykoJFByb21pc2UsIFBST01JU0UpO1xucmVxdWlyZSgnLi9fc2V0LXNwZWNpZXMnKShQUk9NSVNFKTtcbldyYXBwZXIgPSByZXF1aXJlKCcuL19jb3JlJylbUFJPTUlTRV07XG5cbi8vIHN0YXRpY3NcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIFBST01JU0UsIHtcbiAgLy8gMjUuNC40LjUgUHJvbWlzZS5yZWplY3QocilcbiAgcmVqZWN0OiBmdW5jdGlvbiByZWplY3Qocikge1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcyk7XG4gICAgdmFyICQkcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgJCRyZWplY3Qocik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIChMSUJSQVJZIHx8ICFVU0VfTkFUSVZFKSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNiBQcm9taXNlLnJlc29sdmUoeClcbiAgcmVzb2x2ZTogZnVuY3Rpb24gcmVzb2x2ZSh4KSB7XG4gICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKExJQlJBUlkgJiYgdGhpcyA9PT0gV3JhcHBlciA/ICRQcm9taXNlIDogdGhpcywgeCk7XG4gIH1cbn0pO1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhKFVTRV9OQVRJVkUgJiYgcmVxdWlyZSgnLi9faXRlci1kZXRlY3QnKShmdW5jdGlvbiAoaXRlcikge1xuICAkUHJvbWlzZS5hbGwoaXRlcilbJ2NhdGNoJ10oZW1wdHkpO1xufSkpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC4xIFByb21pc2UuYWxsKGl0ZXJhYmxlKVxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSkge1xuICAgIHZhciBDID0gdGhpcztcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpO1xuICAgIHZhciByZXNvbHZlID0gY2FwYWJpbGl0eS5yZXNvbHZlO1xuICAgIHZhciByZWplY3QgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgcmVzdWx0ID0gcGVyZm9ybShmdW5jdGlvbiAoKSB7XG4gICAgICB2YXIgdmFsdWVzID0gW107XG4gICAgICB2YXIgaW5kZXggPSAwO1xuICAgICAgdmFyIHJlbWFpbmluZyA9IDE7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uIChwcm9taXNlKSB7XG4gICAgICAgIHZhciAkaW5kZXggPSBpbmRleCsrO1xuICAgICAgICB2YXIgYWxyZWFkeUNhbGxlZCA9IGZhbHNlO1xuICAgICAgICB2YWx1ZXMucHVzaCh1bmRlZmluZWQpO1xuICAgICAgICByZW1haW5pbmcrKztcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oZnVuY3Rpb24gKHZhbHVlKSB7XG4gICAgICAgICAgaWYgKGFscmVhZHlDYWxsZWQpIHJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkID0gdHJ1ZTtcbiAgICAgICAgICB2YWx1ZXNbJGluZGV4XSA9IHZhbHVlO1xuICAgICAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgIH0pO1xuICAgICAgLS1yZW1haW5pbmcgfHwgcmVzb2x2ZSh2YWx1ZXMpO1xuICAgIH0pO1xuICAgIGlmIChyZXN1bHQuZSkgcmVqZWN0KHJlc3VsdC52KTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9LFxuICAvLyAyNS40LjQuNCBQcm9taXNlLnJhY2UoaXRlcmFibGUpXG4gIHJhY2U6IGZ1bmN0aW9uIHJhY2UoaXRlcmFibGUpIHtcbiAgICB2YXIgQyA9IHRoaXM7XG4gICAgdmFyIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKTtcbiAgICB2YXIgcmVqZWN0ID0gY2FwYWJpbGl0eS5yZWplY3Q7XG4gICAgdmFyIHJlc3VsdCA9IHBlcmZvcm0oZnVuY3Rpb24gKCkge1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbiAocHJvbWlzZSkge1xuICAgICAgICBDLnJlc29sdmUocHJvbWlzZSkudGhlbihjYXBhYmlsaXR5LnJlc29sdmUsIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICB9KTtcbiAgICBpZiAocmVzdWx0LmUpIHJlamVjdChyZXN1bHQudik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4iLCIvLyAyNi4xLjEgUmVmbGVjdC5hcHBseSh0YXJnZXQsIHRoaXNBcmd1bWVudCwgYXJndW1lbnRzTGlzdClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgckFwcGx5ID0gKHJlcXVpcmUoJy4vX2dsb2JhbCcpLlJlZmxlY3QgfHwge30pLmFwcGx5O1xudmFyIGZBcHBseSA9IEZ1bmN0aW9uLmFwcGx5O1xuLy8gTVMgRWRnZSBhcmd1bWVudHNMaXN0IGFyZ3VtZW50IGlzIG9wdGlvbmFsXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgckFwcGx5KGZ1bmN0aW9uICgpIHsgLyogZW1wdHkgKi8gfSk7XG59KSwgJ1JlZmxlY3QnLCB7XG4gIGFwcGx5OiBmdW5jdGlvbiBhcHBseSh0YXJnZXQsIHRoaXNBcmd1bWVudCwgYXJndW1lbnRzTGlzdCkge1xuICAgIHZhciBUID0gYUZ1bmN0aW9uKHRhcmdldCk7XG4gICAgdmFyIEwgPSBhbk9iamVjdChhcmd1bWVudHNMaXN0KTtcbiAgICByZXR1cm4gckFwcGx5ID8gckFwcGx5KFQsIHRoaXNBcmd1bWVudCwgTCkgOiBmQXBwbHkuY2FsbChULCB0aGlzQXJndW1lbnQsIEwpO1xuICB9XG59KTtcbiIsIi8vIDI2LjEuMiBSZWZsZWN0LmNvbnN0cnVjdCh0YXJnZXQsIGFyZ3VtZW50c0xpc3QgWywgbmV3VGFyZ2V0XSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIGJpbmQgPSByZXF1aXJlKCcuL19iaW5kJyk7XG52YXIgckNvbnN0cnVjdCA9IChyZXF1aXJlKCcuL19nbG9iYWwnKS5SZWZsZWN0IHx8IHt9KS5jb25zdHJ1Y3Q7XG5cbi8vIE1TIEVkZ2Ugc3VwcG9ydHMgb25seSAyIGFyZ3VtZW50cyBhbmQgYXJndW1lbnRzTGlzdCBhcmd1bWVudCBpcyBvcHRpb25hbFxuLy8gRkYgTmlnaHRseSBzZXRzIHRoaXJkIGFyZ3VtZW50IGFzIGBuZXcudGFyZ2V0YCwgYnV0IGRvZXMgbm90IGNyZWF0ZSBgdGhpc2AgZnJvbSBpdFxudmFyIE5FV19UQVJHRVRfQlVHID0gZmFpbHMoZnVuY3Rpb24gKCkge1xuICBmdW5jdGlvbiBGKCkgeyAvKiBlbXB0eSAqLyB9XG4gIHJldHVybiAhKHJDb25zdHJ1Y3QoZnVuY3Rpb24gKCkgeyAvKiBlbXB0eSAqLyB9LCBbXSwgRikgaW5zdGFuY2VvZiBGKTtcbn0pO1xudmFyIEFSR1NfQlVHID0gIWZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgckNvbnN0cnVjdChmdW5jdGlvbiAoKSB7IC8qIGVtcHR5ICovIH0pO1xufSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKE5FV19UQVJHRVRfQlVHIHx8IEFSR1NfQlVHKSwgJ1JlZmxlY3QnLCB7XG4gIGNvbnN0cnVjdDogZnVuY3Rpb24gY29uc3RydWN0KFRhcmdldCwgYXJncyAvKiAsIG5ld1RhcmdldCAqLykge1xuICAgIGFGdW5jdGlvbihUYXJnZXQpO1xuICAgIGFuT2JqZWN0KGFyZ3MpO1xuICAgIHZhciBuZXdUYXJnZXQgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IFRhcmdldCA6IGFGdW5jdGlvbihhcmd1bWVudHNbMl0pO1xuICAgIGlmIChBUkdTX0JVRyAmJiAhTkVXX1RBUkdFVF9CVUcpIHJldHVybiByQ29uc3RydWN0KFRhcmdldCwgYXJncywgbmV3VGFyZ2V0KTtcbiAgICBpZiAoVGFyZ2V0ID09IG5ld1RhcmdldCkge1xuICAgICAgLy8gdy9vIGFsdGVyZWQgbmV3VGFyZ2V0LCBvcHRpbWl6YXRpb24gZm9yIDAtNCBhcmd1bWVudHNcbiAgICAgIHN3aXRjaCAoYXJncy5sZW5ndGgpIHtcbiAgICAgICAgY2FzZSAwOiByZXR1cm4gbmV3IFRhcmdldCgpO1xuICAgICAgICBjYXNlIDE6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0pO1xuICAgICAgICBjYXNlIDI6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0pO1xuICAgICAgICBjYXNlIDM6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0pO1xuICAgICAgICBjYXNlIDQ6IHJldHVybiBuZXcgVGFyZ2V0KGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICAgICAgfVxuICAgICAgLy8gdy9vIGFsdGVyZWQgbmV3VGFyZ2V0LCBsb3Qgb2YgYXJndW1lbnRzIGNhc2VcbiAgICAgIHZhciAkYXJncyA9IFtudWxsXTtcbiAgICAgICRhcmdzLnB1c2guYXBwbHkoJGFyZ3MsIGFyZ3MpO1xuICAgICAgcmV0dXJuIG5ldyAoYmluZC5hcHBseShUYXJnZXQsICRhcmdzKSkoKTtcbiAgICB9XG4gICAgLy8gd2l0aCBhbHRlcmVkIG5ld1RhcmdldCwgbm90IHN1cHBvcnQgYnVpbHQtaW4gY29uc3RydWN0b3JzXG4gICAgdmFyIHByb3RvID0gbmV3VGFyZ2V0LnByb3RvdHlwZTtcbiAgICB2YXIgaW5zdGFuY2UgPSBjcmVhdGUoaXNPYmplY3QocHJvdG8pID8gcHJvdG8gOiBPYmplY3QucHJvdG90eXBlKTtcbiAgICB2YXIgcmVzdWx0ID0gRnVuY3Rpb24uYXBwbHkuY2FsbChUYXJnZXQsIGluc3RhbmNlLCBhcmdzKTtcbiAgICByZXR1cm4gaXNPYmplY3QocmVzdWx0KSA/IHJlc3VsdCA6IGluc3RhbmNlO1xuICB9XG59KTtcbiIsIi8vIDI2LjEuMyBSZWZsZWN0LmRlZmluZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXksIGF0dHJpYnV0ZXMpXG52YXIgZFAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xuXG4vLyBNUyBFZGdlIGhhcyBicm9rZW4gUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eSAtIHRocm93aW5nIGluc3RlYWQgb2YgcmV0dXJuaW5nIGZhbHNlXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgUmVmbGVjdC5kZWZpbmVQcm9wZXJ0eShkUC5mKHt9LCAxLCB7IHZhbHVlOiAxIH0pLCAxLCB7IHZhbHVlOiAyIH0pO1xufSksICdSZWZsZWN0Jywge1xuICBkZWZpbmVQcm9wZXJ0eTogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcykge1xuICAgIGFuT2JqZWN0KHRhcmdldCk7XG4gICAgcHJvcGVydHlLZXkgPSB0b1ByaW1pdGl2ZShwcm9wZXJ0eUtleSwgdHJ1ZSk7XG4gICAgYW5PYmplY3QoYXR0cmlidXRlcyk7XG4gICAgdHJ5IHtcbiAgICAgIGRQLmYodGFyZ2V0LCBwcm9wZXJ0eUtleSwgYXR0cmlidXRlcyk7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG59KTtcbiIsIi8vIDI2LjEuNCBSZWZsZWN0LmRlbGV0ZVByb3BlcnR5KHRhcmdldCwgcHJvcGVydHlLZXkpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGdPUEQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpLmY7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBkZWxldGVQcm9wZXJ0eTogZnVuY3Rpb24gZGVsZXRlUHJvcGVydHkodGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgIHZhciBkZXNjID0gZ09QRChhbk9iamVjdCh0YXJnZXQpLCBwcm9wZXJ0eUtleSk7XG4gICAgcmV0dXJuIGRlc2MgJiYgIWRlc2MuY29uZmlndXJhYmxlID8gZmFsc2UgOiBkZWxldGUgdGFyZ2V0W3Byb3BlcnR5S2V5XTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyAyNi4xLjUgUmVmbGVjdC5lbnVtZXJhdGUodGFyZ2V0KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIEVudW1lcmF0ZSA9IGZ1bmN0aW9uIChpdGVyYXRlZCkge1xuICB0aGlzLl90ID0gYW5PYmplY3QoaXRlcmF0ZWQpOyAvLyB0YXJnZXRcbiAgdGhpcy5faSA9IDA7ICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB2YXIga2V5cyA9IHRoaXMuX2sgPSBbXTsgICAgICAvLyBrZXlzXG4gIHZhciBrZXk7XG4gIGZvciAoa2V5IGluIGl0ZXJhdGVkKSBrZXlzLnB1c2goa2V5KTtcbn07XG5yZXF1aXJlKCcuL19pdGVyLWNyZWF0ZScpKEVudW1lcmF0ZSwgJ09iamVjdCcsIGZ1bmN0aW9uICgpIHtcbiAgdmFyIHRoYXQgPSB0aGlzO1xuICB2YXIga2V5cyA9IHRoYXQuX2s7XG4gIHZhciBrZXk7XG4gIGRvIHtcbiAgICBpZiAodGhhdC5faSA+PSBrZXlzLmxlbmd0aCkgcmV0dXJuIHsgdmFsdWU6IHVuZGVmaW5lZCwgZG9uZTogdHJ1ZSB9O1xuICB9IHdoaWxlICghKChrZXkgPSBrZXlzW3RoYXQuX2krK10pIGluIHRoYXQuX3QpKTtcbiAgcmV0dXJuIHsgdmFsdWU6IGtleSwgZG9uZTogZmFsc2UgfTtcbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIGVudW1lcmF0ZTogZnVuY3Rpb24gZW51bWVyYXRlKHRhcmdldCkge1xuICAgIHJldHVybiBuZXcgRW51bWVyYXRlKHRhcmdldCk7XG4gIH1cbn0pO1xuIiwiLy8gMjYuMS43IFJlZmxlY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHRhcmdldCwgcHJvcGVydHlLZXkpXG52YXIgZ09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IodGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgIHJldHVybiBnT1BELmYoYW5PYmplY3QodGFyZ2V0KSwgcHJvcGVydHlLZXkpO1xuICB9XG59KTtcbiIsIi8vIDI2LjEuOCBSZWZsZWN0LmdldFByb3RvdHlwZU9mKHRhcmdldClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZ2V0UHJvdG8gPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0Jywge1xuICBnZXRQcm90b3R5cGVPZjogZnVuY3Rpb24gZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSB7XG4gICAgcmV0dXJuIGdldFByb3RvKGFuT2JqZWN0KHRhcmdldCkpO1xuICB9XG59KTtcbiIsIi8vIDI2LjEuNiBSZWZsZWN0LmdldCh0YXJnZXQsIHByb3BlcnR5S2V5IFssIHJlY2VpdmVyXSlcbnZhciBnT1BEID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdvcGQnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xuXG5mdW5jdGlvbiBnZXQodGFyZ2V0LCBwcm9wZXJ0eUtleSAvKiAsIHJlY2VpdmVyICovKSB7XG4gIHZhciByZWNlaXZlciA9IGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdGFyZ2V0IDogYXJndW1lbnRzWzJdO1xuICB2YXIgZGVzYywgcHJvdG87XG4gIGlmIChhbk9iamVjdCh0YXJnZXQpID09PSByZWNlaXZlcikgcmV0dXJuIHRhcmdldFtwcm9wZXJ0eUtleV07XG4gIGlmIChkZXNjID0gZ09QRC5mKHRhcmdldCwgcHJvcGVydHlLZXkpKSByZXR1cm4gaGFzKGRlc2MsICd2YWx1ZScpXG4gICAgPyBkZXNjLnZhbHVlXG4gICAgOiBkZXNjLmdldCAhPT0gdW5kZWZpbmVkXG4gICAgICA/IGRlc2MuZ2V0LmNhbGwocmVjZWl2ZXIpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgaWYgKGlzT2JqZWN0KHByb3RvID0gZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSkpIHJldHVybiBnZXQocHJvdG8sIHByb3BlcnR5S2V5LCByZWNlaXZlcik7XG59XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHsgZ2V0OiBnZXQgfSk7XG4iLCIvLyAyNi4xLjkgUmVmbGVjdC5oYXModGFyZ2V0LCBwcm9wZXJ0eUtleSlcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgaGFzOiBmdW5jdGlvbiBoYXModGFyZ2V0LCBwcm9wZXJ0eUtleSkge1xuICAgIHJldHVybiBwcm9wZXJ0eUtleSBpbiB0YXJnZXQ7XG4gIH1cbn0pO1xuIiwiLy8gMjYuMS4xMCBSZWZsZWN0LmlzRXh0ZW5zaWJsZSh0YXJnZXQpXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgJGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGU7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgaXNFeHRlbnNpYmxlOiBmdW5jdGlvbiBpc0V4dGVuc2libGUodGFyZ2V0KSB7XG4gICAgYW5PYmplY3QodGFyZ2V0KTtcbiAgICByZXR1cm4gJGlzRXh0ZW5zaWJsZSA/ICRpc0V4dGVuc2libGUodGFyZ2V0KSA6IHRydWU7XG4gIH1cbn0pO1xuIiwiLy8gMjYuMS4xMSBSZWZsZWN0Lm93bktleXModGFyZ2V0KVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0JywgeyBvd25LZXlzOiByZXF1aXJlKCcuL19vd24ta2V5cycpIH0pO1xuIiwiLy8gMjYuMS4xMiBSZWZsZWN0LnByZXZlbnRFeHRlbnNpb25zKHRhcmdldClcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciAkcHJldmVudEV4dGVuc2lvbnMgPSBPYmplY3QucHJldmVudEV4dGVuc2lvbnM7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUmVmbGVjdCcsIHtcbiAgcHJldmVudEV4dGVuc2lvbnM6IGZ1bmN0aW9uIHByZXZlbnRFeHRlbnNpb25zKHRhcmdldCkge1xuICAgIGFuT2JqZWN0KHRhcmdldCk7XG4gICAgdHJ5IHtcbiAgICAgIGlmICgkcHJldmVudEV4dGVuc2lvbnMpICRwcmV2ZW50RXh0ZW5zaW9ucyh0YXJnZXQpO1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgfVxufSk7XG4iLCIvLyAyNi4xLjE0IFJlZmxlY3Quc2V0UHJvdG90eXBlT2YodGFyZ2V0LCBwcm90bylcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgc2V0UHJvdG8gPSByZXF1aXJlKCcuL19zZXQtcHJvdG8nKTtcblxuaWYgKHNldFByb3RvKSAkZXhwb3J0KCRleHBvcnQuUywgJ1JlZmxlY3QnLCB7XG4gIHNldFByb3RvdHlwZU9mOiBmdW5jdGlvbiBzZXRQcm90b3R5cGVPZih0YXJnZXQsIHByb3RvKSB7XG4gICAgc2V0UHJvdG8uY2hlY2sodGFyZ2V0LCBwcm90byk7XG4gICAgdHJ5IHtcbiAgICAgIHNldFByb3RvLnNldCh0YXJnZXQsIHByb3RvKTtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cbn0pO1xuIiwiLy8gMjYuMS4xMyBSZWZsZWN0LnNldCh0YXJnZXQsIHByb3BlcnR5S2V5LCBWIFssIHJlY2VpdmVyXSlcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyIGdPUEQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIGhhcyA9IHJlcXVpcmUoJy4vX2hhcycpO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjcmVhdGVEZXNjID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgaXNPYmplY3QgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKTtcblxuZnVuY3Rpb24gc2V0KHRhcmdldCwgcHJvcGVydHlLZXksIFYgLyogLCByZWNlaXZlciAqLykge1xuICB2YXIgcmVjZWl2ZXIgPSBhcmd1bWVudHMubGVuZ3RoIDwgNCA/IHRhcmdldCA6IGFyZ3VtZW50c1szXTtcbiAgdmFyIG93bkRlc2MgPSBnT1BELmYoYW5PYmplY3QodGFyZ2V0KSwgcHJvcGVydHlLZXkpO1xuICB2YXIgZXhpc3RpbmdEZXNjcmlwdG9yLCBwcm90bztcbiAgaWYgKCFvd25EZXNjKSB7XG4gICAgaWYgKGlzT2JqZWN0KHByb3RvID0gZ2V0UHJvdG90eXBlT2YodGFyZ2V0KSkpIHtcbiAgICAgIHJldHVybiBzZXQocHJvdG8sIHByb3BlcnR5S2V5LCBWLCByZWNlaXZlcik7XG4gICAgfVxuICAgIG93bkRlc2MgPSBjcmVhdGVEZXNjKDApO1xuICB9XG4gIGlmIChoYXMob3duRGVzYywgJ3ZhbHVlJykpIHtcbiAgICBpZiAob3duRGVzYy53cml0YWJsZSA9PT0gZmFsc2UgfHwgIWlzT2JqZWN0KHJlY2VpdmVyKSkgcmV0dXJuIGZhbHNlO1xuICAgIGlmIChleGlzdGluZ0Rlc2NyaXB0b3IgPSBnT1BELmYocmVjZWl2ZXIsIHByb3BlcnR5S2V5KSkge1xuICAgICAgaWYgKGV4aXN0aW5nRGVzY3JpcHRvci5nZXQgfHwgZXhpc3RpbmdEZXNjcmlwdG9yLnNldCB8fCBleGlzdGluZ0Rlc2NyaXB0b3Iud3JpdGFibGUgPT09IGZhbHNlKSByZXR1cm4gZmFsc2U7XG4gICAgICBleGlzdGluZ0Rlc2NyaXB0b3IudmFsdWUgPSBWO1xuICAgICAgZFAuZihyZWNlaXZlciwgcHJvcGVydHlLZXksIGV4aXN0aW5nRGVzY3JpcHRvcik7XG4gICAgfSBlbHNlIGRQLmYocmVjZWl2ZXIsIHByb3BlcnR5S2V5LCBjcmVhdGVEZXNjKDAsIFYpKTtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuICByZXR1cm4gb3duRGVzYy5zZXQgPT09IHVuZGVmaW5lZCA/IGZhbHNlIDogKG93bkRlc2Muc2V0LmNhbGwocmVjZWl2ZXIsIFYpLCB0cnVlKTtcbn1cblxuJGV4cG9ydCgkZXhwb3J0LlMsICdSZWZsZWN0JywgeyBzZXQ6IHNldCB9KTtcbiIsInZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBpbmhlcml0SWZSZXF1aXJlZCA9IHJlcXVpcmUoJy4vX2luaGVyaXQtaWYtcmVxdWlyZWQnKTtcbnZhciBkUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpLmY7XG52YXIgZ09QTiA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BuJykuZjtcbnZhciBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4vX2lzLXJlZ2V4cCcpO1xudmFyICRmbGFncyA9IHJlcXVpcmUoJy4vX2ZsYWdzJyk7XG52YXIgJFJlZ0V4cCA9IGdsb2JhbC5SZWdFeHA7XG52YXIgQmFzZSA9ICRSZWdFeHA7XG52YXIgcHJvdG8gPSAkUmVnRXhwLnByb3RvdHlwZTtcbnZhciByZTEgPSAvYS9nO1xudmFyIHJlMiA9IC9hL2c7XG4vLyBcIm5ld1wiIGNyZWF0ZXMgYSBuZXcgb2JqZWN0LCBvbGQgd2Via2l0IGJ1Z2d5IGhlcmVcbnZhciBDT1JSRUNUX05FVyA9IG5ldyAkUmVnRXhwKHJlMSkgIT09IHJlMTtcblxuaWYgKHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgKCFDT1JSRUNUX05FVyB8fCByZXF1aXJlKCcuL19mYWlscycpKGZ1bmN0aW9uICgpIHtcbiAgcmUyW3JlcXVpcmUoJy4vX3drcycpKCdtYXRjaCcpXSA9IGZhbHNlO1xuICAvLyBSZWdFeHAgY29uc3RydWN0b3IgY2FuIGFsdGVyIGZsYWdzIGFuZCBJc1JlZ0V4cCB3b3JrcyBjb3JyZWN0IHdpdGggQEBtYXRjaFxuICByZXR1cm4gJFJlZ0V4cChyZTEpICE9IHJlMSB8fCAkUmVnRXhwKHJlMikgPT0gcmUyIHx8ICRSZWdFeHAocmUxLCAnaScpICE9ICcvYS9pJztcbn0pKSkge1xuICAkUmVnRXhwID0gZnVuY3Rpb24gUmVnRXhwKHAsIGYpIHtcbiAgICB2YXIgdGlSRSA9IHRoaXMgaW5zdGFuY2VvZiAkUmVnRXhwO1xuICAgIHZhciBwaVJFID0gaXNSZWdFeHAocCk7XG4gICAgdmFyIGZpVSA9IGYgPT09IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gIXRpUkUgJiYgcGlSRSAmJiBwLmNvbnN0cnVjdG9yID09PSAkUmVnRXhwICYmIGZpVSA/IHBcbiAgICAgIDogaW5oZXJpdElmUmVxdWlyZWQoQ09SUkVDVF9ORVdcbiAgICAgICAgPyBuZXcgQmFzZShwaVJFICYmICFmaVUgPyBwLnNvdXJjZSA6IHAsIGYpXG4gICAgICAgIDogQmFzZSgocGlSRSA9IHAgaW5zdGFuY2VvZiAkUmVnRXhwKSA/IHAuc291cmNlIDogcCwgcGlSRSAmJiBmaVUgPyAkZmxhZ3MuY2FsbChwKSA6IGYpXG4gICAgICAsIHRpUkUgPyB0aGlzIDogcHJvdG8sICRSZWdFeHApO1xuICB9O1xuICB2YXIgcHJveHkgPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAga2V5IGluICRSZWdFeHAgfHwgZFAoJFJlZ0V4cCwga2V5LCB7XG4gICAgICBjb25maWd1cmFibGU6IHRydWUsXG4gICAgICBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIEJhc2Vba2V5XTsgfSxcbiAgICAgIHNldDogZnVuY3Rpb24gKGl0KSB7IEJhc2Vba2V5XSA9IGl0OyB9XG4gICAgfSk7XG4gIH07XG4gIGZvciAodmFyIGtleXMgPSBnT1BOKEJhc2UpLCBpID0gMDsga2V5cy5sZW5ndGggPiBpOykgcHJveHkoa2V5c1tpKytdKTtcbiAgcHJvdG8uY29uc3RydWN0b3IgPSAkUmVnRXhwO1xuICAkUmVnRXhwLnByb3RvdHlwZSA9IHByb3RvO1xuICByZXF1aXJlKCcuL19yZWRlZmluZScpKGdsb2JhbCwgJ1JlZ0V4cCcsICRSZWdFeHApO1xufVxuXG5yZXF1aXJlKCcuL19zZXQtc3BlY2llcycpKCdSZWdFeHAnKTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciByZWdleHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMnKTtcbnJlcXVpcmUoJy4vX2V4cG9ydCcpKHtcbiAgdGFyZ2V0OiAnUmVnRXhwJyxcbiAgcHJvdG86IHRydWUsXG4gIGZvcmNlZDogcmVnZXhwRXhlYyAhPT0gLy4vLmV4ZWNcbn0sIHtcbiAgZXhlYzogcmVnZXhwRXhlY1xufSk7XG4iLCIvLyAyMS4yLjUuMyBnZXQgUmVnRXhwLnByb3RvdHlwZS5mbGFncygpXG5pZiAocmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAvLi9nLmZsYWdzICE9ICdnJykgcmVxdWlyZSgnLi9fb2JqZWN0LWRwJykuZihSZWdFeHAucHJvdG90eXBlLCAnZmxhZ3MnLCB7XG4gIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgZ2V0OiByZXF1aXJlKCcuL19mbGFncycpXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBhZHZhbmNlU3RyaW5nSW5kZXggPSByZXF1aXJlKCcuL19hZHZhbmNlLXN0cmluZy1pbmRleCcpO1xudmFyIHJlZ0V4cEV4ZWMgPSByZXF1aXJlKCcuL19yZWdleHAtZXhlYy1hYnN0cmFjdCcpO1xuXG4vLyBAQG1hdGNoIGxvZ2ljXG5yZXF1aXJlKCcuL19maXgtcmUtd2tzJykoJ21hdGNoJywgMSwgZnVuY3Rpb24gKGRlZmluZWQsIE1BVENILCAkbWF0Y2gsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLm1hdGNoYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLm1hdGNoXG4gICAgZnVuY3Rpb24gbWF0Y2gocmVnZXhwKSB7XG4gICAgICB2YXIgTyA9IGRlZmluZWQodGhpcyk7XG4gICAgICB2YXIgZm4gPSByZWdleHAgPT0gdW5kZWZpbmVkID8gdW5kZWZpbmVkIDogcmVnZXhwW01BVENIXTtcbiAgICAgIHJldHVybiBmbiAhPT0gdW5kZWZpbmVkID8gZm4uY2FsbChyZWdleHAsIE8pIDogbmV3IFJlZ0V4cChyZWdleHApW01BVENIXShTdHJpbmcoTykpO1xuICAgIH0sXG4gICAgLy8gYFJlZ0V4cC5wcm90b3R5cGVbQEBtYXRjaF1gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUtQEBtYXRjaFxuICAgIGZ1bmN0aW9uIChyZWdleHApIHtcbiAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUoJG1hdGNoLCByZWdleHAsIHRoaXMpO1xuICAgICAgaWYgKHJlcy5kb25lKSByZXR1cm4gcmVzLnZhbHVlO1xuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuICAgICAgaWYgKCFyeC5nbG9iYWwpIHJldHVybiByZWdFeHBFeGVjKHJ4LCBTKTtcbiAgICAgIHZhciBmdWxsVW5pY29kZSA9IHJ4LnVuaWNvZGU7XG4gICAgICByeC5sYXN0SW5kZXggPSAwO1xuICAgICAgdmFyIEEgPSBbXTtcbiAgICAgIHZhciBuID0gMDtcbiAgICAgIHZhciByZXN1bHQ7XG4gICAgICB3aGlsZSAoKHJlc3VsdCA9IHJlZ0V4cEV4ZWMocngsIFMpKSAhPT0gbnVsbCkge1xuICAgICAgICB2YXIgbWF0Y2hTdHIgPSBTdHJpbmcocmVzdWx0WzBdKTtcbiAgICAgICAgQVtuXSA9IG1hdGNoU3RyO1xuICAgICAgICBpZiAobWF0Y2hTdHIgPT09ICcnKSByeC5sYXN0SW5kZXggPSBhZHZhbmNlU3RyaW5nSW5kZXgoUywgdG9MZW5ndGgocngubGFzdEluZGV4KSwgZnVsbFVuaWNvZGUpO1xuICAgICAgICBuKys7XG4gICAgICB9XG4gICAgICByZXR1cm4gbiA9PT0gMCA/IG51bGwgOiBBO1xuICAgIH1cbiAgXTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpO1xudmFyIGFkdmFuY2VTdHJpbmdJbmRleCA9IHJlcXVpcmUoJy4vX2FkdmFuY2Utc3RyaW5nLWluZGV4Jyk7XG52YXIgcmVnRXhwRXhlYyA9IHJlcXVpcmUoJy4vX3JlZ2V4cC1leGVjLWFic3RyYWN0Jyk7XG52YXIgbWF4ID0gTWF0aC5tYXg7XG52YXIgbWluID0gTWF0aC5taW47XG52YXIgZmxvb3IgPSBNYXRoLmZsb29yO1xudmFyIFNVQlNUSVRVVElPTl9TWU1CT0xTID0gL1xcJChbJCZgJ118XFxkXFxkP3w8W14+XSo+KS9nO1xudmFyIFNVQlNUSVRVVElPTl9TWU1CT0xTX05PX05BTUVEID0gL1xcJChbJCZgJ118XFxkXFxkPykvZztcblxudmFyIG1heWJlVG9TdHJpbmcgPSBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0ID09PSB1bmRlZmluZWQgPyBpdCA6IFN0cmluZyhpdCk7XG59O1xuXG4vLyBAQHJlcGxhY2UgbG9naWNcbnJlcXVpcmUoJy4vX2ZpeC1yZS13a3MnKSgncmVwbGFjZScsIDIsIGZ1bmN0aW9uIChkZWZpbmVkLCBSRVBMQUNFLCAkcmVwbGFjZSwgbWF5YmVDYWxsTmF0aXZlKSB7XG4gIHJldHVybiBbXG4gICAgLy8gYFN0cmluZy5wcm90b3R5cGUucmVwbGFjZWAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtc3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlXG4gICAgZnVuY3Rpb24gcmVwbGFjZShzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKSB7XG4gICAgICB2YXIgTyA9IGRlZmluZWQodGhpcyk7XG4gICAgICB2YXIgZm4gPSBzZWFyY2hWYWx1ZSA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiBzZWFyY2hWYWx1ZVtSRVBMQUNFXTtcbiAgICAgIHJldHVybiBmbiAhPT0gdW5kZWZpbmVkXG4gICAgICAgID8gZm4uY2FsbChzZWFyY2hWYWx1ZSwgTywgcmVwbGFjZVZhbHVlKVxuICAgICAgICA6ICRyZXBsYWNlLmNhbGwoU3RyaW5nKE8pLCBzZWFyY2hWYWx1ZSwgcmVwbGFjZVZhbHVlKTtcbiAgICB9LFxuICAgIC8vIGBSZWdFeHAucHJvdG90eXBlW0BAcmVwbGFjZV1gIG1ldGhvZFxuICAgIC8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLXJlZ2V4cC5wcm90b3R5cGUtQEByZXBsYWNlXG4gICAgZnVuY3Rpb24gKHJlZ2V4cCwgcmVwbGFjZVZhbHVlKSB7XG4gICAgICB2YXIgcmVzID0gbWF5YmVDYWxsTmF0aXZlKCRyZXBsYWNlLCByZWdleHAsIHRoaXMsIHJlcGxhY2VWYWx1ZSk7XG4gICAgICBpZiAocmVzLmRvbmUpIHJldHVybiByZXMudmFsdWU7XG5cbiAgICAgIHZhciByeCA9IGFuT2JqZWN0KHJlZ2V4cCk7XG4gICAgICB2YXIgUyA9IFN0cmluZyh0aGlzKTtcbiAgICAgIHZhciBmdW5jdGlvbmFsUmVwbGFjZSA9IHR5cGVvZiByZXBsYWNlVmFsdWUgPT09ICdmdW5jdGlvbic7XG4gICAgICBpZiAoIWZ1bmN0aW9uYWxSZXBsYWNlKSByZXBsYWNlVmFsdWUgPSBTdHJpbmcocmVwbGFjZVZhbHVlKTtcbiAgICAgIHZhciBnbG9iYWwgPSByeC5nbG9iYWw7XG4gICAgICBpZiAoZ2xvYmFsKSB7XG4gICAgICAgIHZhciBmdWxsVW5pY29kZSA9IHJ4LnVuaWNvZGU7XG4gICAgICAgIHJ4Lmxhc3RJbmRleCA9IDA7XG4gICAgICB9XG4gICAgICB2YXIgcmVzdWx0cyA9IFtdO1xuICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgdmFyIHJlc3VsdCA9IHJlZ0V4cEV4ZWMocngsIFMpO1xuICAgICAgICBpZiAocmVzdWx0ID09PSBudWxsKSBicmVhaztcbiAgICAgICAgcmVzdWx0cy5wdXNoKHJlc3VsdCk7XG4gICAgICAgIGlmICghZ2xvYmFsKSBicmVhaztcbiAgICAgICAgdmFyIG1hdGNoU3RyID0gU3RyaW5nKHJlc3VsdFswXSk7XG4gICAgICAgIGlmIChtYXRjaFN0ciA9PT0gJycpIHJ4Lmxhc3RJbmRleCA9IGFkdmFuY2VTdHJpbmdJbmRleChTLCB0b0xlbmd0aChyeC5sYXN0SW5kZXgpLCBmdWxsVW5pY29kZSk7XG4gICAgICB9XG4gICAgICB2YXIgYWNjdW11bGF0ZWRSZXN1bHQgPSAnJztcbiAgICAgIHZhciBuZXh0U291cmNlUG9zaXRpb24gPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCByZXN1bHRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHJlc3VsdCA9IHJlc3VsdHNbaV07XG4gICAgICAgIHZhciBtYXRjaGVkID0gU3RyaW5nKHJlc3VsdFswXSk7XG4gICAgICAgIHZhciBwb3NpdGlvbiA9IG1heChtaW4odG9JbnRlZ2VyKHJlc3VsdC5pbmRleCksIFMubGVuZ3RoKSwgMCk7XG4gICAgICAgIHZhciBjYXB0dXJlcyA9IFtdO1xuICAgICAgICAvLyBOT1RFOiBUaGlzIGlzIGVxdWl2YWxlbnQgdG9cbiAgICAgICAgLy8gICBjYXB0dXJlcyA9IHJlc3VsdC5zbGljZSgxKS5tYXAobWF5YmVUb1N0cmluZylcbiAgICAgICAgLy8gYnV0IGZvciBzb21lIHJlYXNvbiBgbmF0aXZlU2xpY2UuY2FsbChyZXN1bHQsIDEsIHJlc3VsdC5sZW5ndGgpYCAoY2FsbGVkIGluXG4gICAgICAgIC8vIHRoZSBzbGljZSBwb2x5ZmlsbCB3aGVuIHNsaWNpbmcgbmF0aXZlIGFycmF5cykgXCJkb2Vzbid0IHdvcmtcIiBpbiBzYWZhcmkgOSBhbmRcbiAgICAgICAgLy8gY2F1c2VzIGEgY3Jhc2ggKGh0dHBzOi8vcGFzdGViaW4uY29tL04yMVF6ZVFBKSB3aGVuIHRyeWluZyB0byBkZWJ1ZyBpdC5cbiAgICAgICAgZm9yICh2YXIgaiA9IDE7IGogPCByZXN1bHQubGVuZ3RoOyBqKyspIGNhcHR1cmVzLnB1c2gobWF5YmVUb1N0cmluZyhyZXN1bHRbal0pKTtcbiAgICAgICAgdmFyIG5hbWVkQ2FwdHVyZXMgPSByZXN1bHQuZ3JvdXBzO1xuICAgICAgICBpZiAoZnVuY3Rpb25hbFJlcGxhY2UpIHtcbiAgICAgICAgICB2YXIgcmVwbGFjZXJBcmdzID0gW21hdGNoZWRdLmNvbmNhdChjYXB0dXJlcywgcG9zaXRpb24sIFMpO1xuICAgICAgICAgIGlmIChuYW1lZENhcHR1cmVzICE9PSB1bmRlZmluZWQpIHJlcGxhY2VyQXJncy5wdXNoKG5hbWVkQ2FwdHVyZXMpO1xuICAgICAgICAgIHZhciByZXBsYWNlbWVudCA9IFN0cmluZyhyZXBsYWNlVmFsdWUuYXBwbHkodW5kZWZpbmVkLCByZXBsYWNlckFyZ3MpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXBsYWNlbWVudCA9IGdldFN1YnN0aXR1dGlvbihtYXRjaGVkLCBTLCBwb3NpdGlvbiwgY2FwdHVyZXMsIG5hbWVkQ2FwdHVyZXMsIHJlcGxhY2VWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHBvc2l0aW9uID49IG5leHRTb3VyY2VQb3NpdGlvbikge1xuICAgICAgICAgIGFjY3VtdWxhdGVkUmVzdWx0ICs9IFMuc2xpY2UobmV4dFNvdXJjZVBvc2l0aW9uLCBwb3NpdGlvbikgKyByZXBsYWNlbWVudDtcbiAgICAgICAgICBuZXh0U291cmNlUG9zaXRpb24gPSBwb3NpdGlvbiArIG1hdGNoZWQubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gYWNjdW11bGF0ZWRSZXN1bHQgKyBTLnNsaWNlKG5leHRTb3VyY2VQb3NpdGlvbik7XG4gICAgfVxuICBdO1xuXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtZ2V0c3Vic3RpdHV0aW9uXG4gIGZ1bmN0aW9uIGdldFN1YnN0aXR1dGlvbihtYXRjaGVkLCBzdHIsIHBvc2l0aW9uLCBjYXB0dXJlcywgbmFtZWRDYXB0dXJlcywgcmVwbGFjZW1lbnQpIHtcbiAgICB2YXIgdGFpbFBvcyA9IHBvc2l0aW9uICsgbWF0Y2hlZC5sZW5ndGg7XG4gICAgdmFyIG0gPSBjYXB0dXJlcy5sZW5ndGg7XG4gICAgdmFyIHN5bWJvbHMgPSBTVUJTVElUVVRJT05fU1lNQk9MU19OT19OQU1FRDtcbiAgICBpZiAobmFtZWRDYXB0dXJlcyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICBuYW1lZENhcHR1cmVzID0gdG9PYmplY3QobmFtZWRDYXB0dXJlcyk7XG4gICAgICBzeW1ib2xzID0gU1VCU1RJVFVUSU9OX1NZTUJPTFM7XG4gICAgfVxuICAgIHJldHVybiAkcmVwbGFjZS5jYWxsKHJlcGxhY2VtZW50LCBzeW1ib2xzLCBmdW5jdGlvbiAobWF0Y2gsIGNoKSB7XG4gICAgICB2YXIgY2FwdHVyZTtcbiAgICAgIHN3aXRjaCAoY2guY2hhckF0KDApKSB7XG4gICAgICAgIGNhc2UgJyQnOiByZXR1cm4gJyQnO1xuICAgICAgICBjYXNlICcmJzogcmV0dXJuIG1hdGNoZWQ7XG4gICAgICAgIGNhc2UgJ2AnOiByZXR1cm4gc3RyLnNsaWNlKDAsIHBvc2l0aW9uKTtcbiAgICAgICAgY2FzZSBcIidcIjogcmV0dXJuIHN0ci5zbGljZSh0YWlsUG9zKTtcbiAgICAgICAgY2FzZSAnPCc6XG4gICAgICAgICAgY2FwdHVyZSA9IG5hbWVkQ2FwdHVyZXNbY2guc2xpY2UoMSwgLTEpXTtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgZGVmYXVsdDogLy8gXFxkXFxkP1xuICAgICAgICAgIHZhciBuID0gK2NoO1xuICAgICAgICAgIGlmIChuID09PSAwKSByZXR1cm4gbWF0Y2g7XG4gICAgICAgICAgaWYgKG4gPiBtKSB7XG4gICAgICAgICAgICB2YXIgZiA9IGZsb29yKG4gLyAxMCk7XG4gICAgICAgICAgICBpZiAoZiA9PT0gMCkgcmV0dXJuIG1hdGNoO1xuICAgICAgICAgICAgaWYgKGYgPD0gbSkgcmV0dXJuIGNhcHR1cmVzW2YgLSAxXSA9PT0gdW5kZWZpbmVkID8gY2guY2hhckF0KDEpIDogY2FwdHVyZXNbZiAtIDFdICsgY2guY2hhckF0KDEpO1xuICAgICAgICAgICAgcmV0dXJuIG1hdGNoO1xuICAgICAgICAgIH1cbiAgICAgICAgICBjYXB0dXJlID0gY2FwdHVyZXNbbiAtIDFdO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGNhcHR1cmUgPT09IHVuZGVmaW5lZCA/ICcnIDogY2FwdHVyZTtcbiAgICB9KTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHNhbWVWYWx1ZSA9IHJlcXVpcmUoJy4vX3NhbWUtdmFsdWUnKTtcbnZhciByZWdFeHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMtYWJzdHJhY3QnKTtcblxuLy8gQEBzZWFyY2ggbG9naWNcbnJlcXVpcmUoJy4vX2ZpeC1yZS13a3MnKSgnc2VhcmNoJywgMSwgZnVuY3Rpb24gKGRlZmluZWQsIFNFQVJDSCwgJHNlYXJjaCwgbWF5YmVDYWxsTmF0aXZlKSB7XG4gIHJldHVybiBbXG4gICAgLy8gYFN0cmluZy5wcm90b3R5cGUuc2VhcmNoYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnNlYXJjaFxuICAgIGZ1bmN0aW9uIHNlYXJjaChyZWdleHApIHtcbiAgICAgIHZhciBPID0gZGVmaW5lZCh0aGlzKTtcbiAgICAgIHZhciBmbiA9IHJlZ2V4cCA9PSB1bmRlZmluZWQgPyB1bmRlZmluZWQgOiByZWdleHBbU0VBUkNIXTtcbiAgICAgIHJldHVybiBmbiAhPT0gdW5kZWZpbmVkID8gZm4uY2FsbChyZWdleHAsIE8pIDogbmV3IFJlZ0V4cChyZWdleHApW1NFQVJDSF0oU3RyaW5nKE8pKTtcbiAgICB9LFxuICAgIC8vIGBSZWdFeHAucHJvdG90eXBlW0BAc2VhcmNoXWAgbWV0aG9kXG4gICAgLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtcmVnZXhwLnByb3RvdHlwZS1AQHNlYXJjaFxuICAgIGZ1bmN0aW9uIChyZWdleHApIHtcbiAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUoJHNlYXJjaCwgcmVnZXhwLCB0aGlzKTtcbiAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcbiAgICAgIHZhciByeCA9IGFuT2JqZWN0KHJlZ2V4cCk7XG4gICAgICB2YXIgUyA9IFN0cmluZyh0aGlzKTtcbiAgICAgIHZhciBwcmV2aW91c0xhc3RJbmRleCA9IHJ4Lmxhc3RJbmRleDtcbiAgICAgIGlmICghc2FtZVZhbHVlKHByZXZpb3VzTGFzdEluZGV4LCAwKSkgcngubGFzdEluZGV4ID0gMDtcbiAgICAgIHZhciByZXN1bHQgPSByZWdFeHBFeGVjKHJ4LCBTKTtcbiAgICAgIGlmICghc2FtZVZhbHVlKHJ4Lmxhc3RJbmRleCwgcHJldmlvdXNMYXN0SW5kZXgpKSByeC5sYXN0SW5kZXggPSBwcmV2aW91c0xhc3RJbmRleDtcbiAgICAgIHJldHVybiByZXN1bHQgPT09IG51bGwgPyAtMSA6IHJlc3VsdC5pbmRleDtcbiAgICB9XG4gIF07XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGlzUmVnRXhwID0gcmVxdWlyZSgnLi9faXMtcmVnZXhwJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgYWR2YW5jZVN0cmluZ0luZGV4ID0gcmVxdWlyZSgnLi9fYWR2YW5jZS1zdHJpbmctaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGNhbGxSZWdFeHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMtYWJzdHJhY3QnKTtcbnZhciByZWdleHBFeGVjID0gcmVxdWlyZSgnLi9fcmVnZXhwLWV4ZWMnKTtcbnZhciBmYWlscyA9IHJlcXVpcmUoJy4vX2ZhaWxzJyk7XG52YXIgJG1pbiA9IE1hdGgubWluO1xudmFyICRwdXNoID0gW10ucHVzaDtcbnZhciAkU1BMSVQgPSAnc3BsaXQnO1xudmFyIExFTkdUSCA9ICdsZW5ndGgnO1xudmFyIExBU1RfSU5ERVggPSAnbGFzdEluZGV4JztcbnZhciBNQVhfVUlOVDMyID0gMHhmZmZmZmZmZjtcblxuLy8gYmFiZWwtbWluaWZ5IHRyYW5zcGlsZXMgUmVnRXhwKCd4JywgJ3knKSAtPiAveC95IGFuZCBpdCBjYXVzZXMgU3ludGF4RXJyb3JcbnZhciBTVVBQT1JUU19ZID0gIWZhaWxzKGZ1bmN0aW9uICgpIHsgUmVnRXhwKE1BWF9VSU5UMzIsICd5Jyk7IH0pO1xuXG4vLyBAQHNwbGl0IGxvZ2ljXG5yZXF1aXJlKCcuL19maXgtcmUtd2tzJykoJ3NwbGl0JywgMiwgZnVuY3Rpb24gKGRlZmluZWQsIFNQTElULCAkc3BsaXQsIG1heWJlQ2FsbE5hdGl2ZSkge1xuICB2YXIgaW50ZXJuYWxTcGxpdDtcbiAgaWYgKFxuICAgICdhYmJjJ1skU1BMSVRdKC8oYikqLylbMV0gPT0gJ2MnIHx8XG4gICAgJ3Rlc3QnWyRTUExJVF0oLyg/OikvLCAtMSlbTEVOR1RIXSAhPSA0IHx8XG4gICAgJ2FiJ1skU1BMSVRdKC8oPzphYikqLylbTEVOR1RIXSAhPSAyIHx8XG4gICAgJy4nWyRTUExJVF0oLyguPykoLj8pLylbTEVOR1RIXSAhPSA0IHx8XG4gICAgJy4nWyRTUExJVF0oLygpKCkvKVtMRU5HVEhdID4gMSB8fFxuICAgICcnWyRTUExJVF0oLy4/LylbTEVOR1RIXVxuICApIHtcbiAgICAvLyBiYXNlZCBvbiBlczUtc2hpbSBpbXBsZW1lbnRhdGlvbiwgbmVlZCB0byByZXdvcmsgaXRcbiAgICBpbnRlcm5hbFNwbGl0ID0gZnVuY3Rpb24gKHNlcGFyYXRvciwgbGltaXQpIHtcbiAgICAgIHZhciBzdHJpbmcgPSBTdHJpbmcodGhpcyk7XG4gICAgICBpZiAoc2VwYXJhdG9yID09PSB1bmRlZmluZWQgJiYgbGltaXQgPT09IDApIHJldHVybiBbXTtcbiAgICAgIC8vIElmIGBzZXBhcmF0b3JgIGlzIG5vdCBhIHJlZ2V4LCB1c2UgbmF0aXZlIHNwbGl0XG4gICAgICBpZiAoIWlzUmVnRXhwKHNlcGFyYXRvcikpIHJldHVybiAkc3BsaXQuY2FsbChzdHJpbmcsIHNlcGFyYXRvciwgbGltaXQpO1xuICAgICAgdmFyIG91dHB1dCA9IFtdO1xuICAgICAgdmFyIGZsYWdzID0gKHNlcGFyYXRvci5pZ25vcmVDYXNlID8gJ2knIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3IubXVsdGlsaW5lID8gJ20nIDogJycpICtcbiAgICAgICAgICAgICAgICAgIChzZXBhcmF0b3IudW5pY29kZSA/ICd1JyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAoc2VwYXJhdG9yLnN0aWNreSA/ICd5JyA6ICcnKTtcbiAgICAgIHZhciBsYXN0TGFzdEluZGV4ID0gMDtcbiAgICAgIHZhciBzcGxpdExpbWl0ID0gbGltaXQgPT09IHVuZGVmaW5lZCA/IE1BWF9VSU5UMzIgOiBsaW1pdCA+Pj4gMDtcbiAgICAgIC8vIE1ha2UgYGdsb2JhbGAgYW5kIGF2b2lkIGBsYXN0SW5kZXhgIGlzc3VlcyBieSB3b3JraW5nIHdpdGggYSBjb3B5XG4gICAgICB2YXIgc2VwYXJhdG9yQ29weSA9IG5ldyBSZWdFeHAoc2VwYXJhdG9yLnNvdXJjZSwgZmxhZ3MgKyAnZycpO1xuICAgICAgdmFyIG1hdGNoLCBsYXN0SW5kZXgsIGxhc3RMZW5ndGg7XG4gICAgICB3aGlsZSAobWF0Y2ggPSByZWdleHBFeGVjLmNhbGwoc2VwYXJhdG9yQ29weSwgc3RyaW5nKSkge1xuICAgICAgICBsYXN0SW5kZXggPSBzZXBhcmF0b3JDb3B5W0xBU1RfSU5ERVhdO1xuICAgICAgICBpZiAobGFzdEluZGV4ID4gbGFzdExhc3RJbmRleCkge1xuICAgICAgICAgIG91dHB1dC5wdXNoKHN0cmluZy5zbGljZShsYXN0TGFzdEluZGV4LCBtYXRjaC5pbmRleCkpO1xuICAgICAgICAgIGlmIChtYXRjaFtMRU5HVEhdID4gMSAmJiBtYXRjaC5pbmRleCA8IHN0cmluZ1tMRU5HVEhdKSAkcHVzaC5hcHBseShvdXRwdXQsIG1hdGNoLnNsaWNlKDEpKTtcbiAgICAgICAgICBsYXN0TGVuZ3RoID0gbWF0Y2hbMF1bTEVOR1RIXTtcbiAgICAgICAgICBsYXN0TGFzdEluZGV4ID0gbGFzdEluZGV4O1xuICAgICAgICAgIGlmIChvdXRwdXRbTEVOR1RIXSA+PSBzcGxpdExpbWl0KSBicmVhaztcbiAgICAgICAgfVxuICAgICAgICBpZiAoc2VwYXJhdG9yQ29weVtMQVNUX0lOREVYXSA9PT0gbWF0Y2guaW5kZXgpIHNlcGFyYXRvckNvcHlbTEFTVF9JTkRFWF0rKzsgLy8gQXZvaWQgYW4gaW5maW5pdGUgbG9vcFxuICAgICAgfVxuICAgICAgaWYgKGxhc3RMYXN0SW5kZXggPT09IHN0cmluZ1tMRU5HVEhdKSB7XG4gICAgICAgIGlmIChsYXN0TGVuZ3RoIHx8ICFzZXBhcmF0b3JDb3B5LnRlc3QoJycpKSBvdXRwdXQucHVzaCgnJyk7XG4gICAgICB9IGVsc2Ugb3V0cHV0LnB1c2goc3RyaW5nLnNsaWNlKGxhc3RMYXN0SW5kZXgpKTtcbiAgICAgIHJldHVybiBvdXRwdXRbTEVOR1RIXSA+IHNwbGl0TGltaXQgPyBvdXRwdXQuc2xpY2UoMCwgc3BsaXRMaW1pdCkgOiBvdXRwdXQ7XG4gICAgfTtcbiAgLy8gQ2hha3JhLCBWOFxuICB9IGVsc2UgaWYgKCcwJ1skU1BMSVRdKHVuZGVmaW5lZCwgMClbTEVOR1RIXSkge1xuICAgIGludGVybmFsU3BsaXQgPSBmdW5jdGlvbiAoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgcmV0dXJuIHNlcGFyYXRvciA9PT0gdW5kZWZpbmVkICYmIGxpbWl0ID09PSAwID8gW10gOiAkc3BsaXQuY2FsbCh0aGlzLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9O1xuICB9IGVsc2Uge1xuICAgIGludGVybmFsU3BsaXQgPSAkc3BsaXQ7XG4gIH1cblxuICByZXR1cm4gW1xuICAgIC8vIGBTdHJpbmcucHJvdG90eXBlLnNwbGl0YCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1zdHJpbmcucHJvdG90eXBlLnNwbGl0XG4gICAgZnVuY3Rpb24gc3BsaXQoc2VwYXJhdG9yLCBsaW1pdCkge1xuICAgICAgdmFyIE8gPSBkZWZpbmVkKHRoaXMpO1xuICAgICAgdmFyIHNwbGl0dGVyID0gc2VwYXJhdG9yID09IHVuZGVmaW5lZCA/IHVuZGVmaW5lZCA6IHNlcGFyYXRvcltTUExJVF07XG4gICAgICByZXR1cm4gc3BsaXR0ZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICA/IHNwbGl0dGVyLmNhbGwoc2VwYXJhdG9yLCBPLCBsaW1pdClcbiAgICAgICAgOiBpbnRlcm5hbFNwbGl0LmNhbGwoU3RyaW5nKE8pLCBzZXBhcmF0b3IsIGxpbWl0KTtcbiAgICB9LFxuICAgIC8vIGBSZWdFeHAucHJvdG90eXBlW0BAc3BsaXRdYCBtZXRob2RcbiAgICAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1yZWdleHAucHJvdG90eXBlLUBAc3BsaXRcbiAgICAvL1xuICAgIC8vIE5PVEU6IFRoaXMgY2Fubm90IGJlIHByb3Blcmx5IHBvbHlmaWxsZWQgaW4gZW5naW5lcyB0aGF0IGRvbid0IHN1cHBvcnRcbiAgICAvLyB0aGUgJ3knIGZsYWcuXG4gICAgZnVuY3Rpb24gKHJlZ2V4cCwgbGltaXQpIHtcbiAgICAgIHZhciByZXMgPSBtYXliZUNhbGxOYXRpdmUoaW50ZXJuYWxTcGxpdCwgcmVnZXhwLCB0aGlzLCBsaW1pdCwgaW50ZXJuYWxTcGxpdCAhPT0gJHNwbGl0KTtcbiAgICAgIGlmIChyZXMuZG9uZSkgcmV0dXJuIHJlcy52YWx1ZTtcblxuICAgICAgdmFyIHJ4ID0gYW5PYmplY3QocmVnZXhwKTtcbiAgICAgIHZhciBTID0gU3RyaW5nKHRoaXMpO1xuICAgICAgdmFyIEMgPSBzcGVjaWVzQ29uc3RydWN0b3IocngsIFJlZ0V4cCk7XG5cbiAgICAgIHZhciB1bmljb2RlTWF0Y2hpbmcgPSByeC51bmljb2RlO1xuICAgICAgdmFyIGZsYWdzID0gKHJ4Lmlnbm9yZUNhc2UgPyAnaScgOiAnJykgK1xuICAgICAgICAgICAgICAgICAgKHJ4Lm11bHRpbGluZSA/ICdtJyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAocngudW5pY29kZSA/ICd1JyA6ICcnKSArXG4gICAgICAgICAgICAgICAgICAoU1VQUE9SVFNfWSA/ICd5JyA6ICdnJyk7XG5cbiAgICAgIC8vIF4oPyArIHJ4ICsgKSBpcyBuZWVkZWQsIGluIGNvbWJpbmF0aW9uIHdpdGggc29tZSBTIHNsaWNpbmcsIHRvXG4gICAgICAvLyBzaW11bGF0ZSB0aGUgJ3knIGZsYWcuXG4gICAgICB2YXIgc3BsaXR0ZXIgPSBuZXcgQyhTVVBQT1JUU19ZID8gcnggOiAnXig/OicgKyByeC5zb3VyY2UgKyAnKScsIGZsYWdzKTtcbiAgICAgIHZhciBsaW0gPSBsaW1pdCA9PT0gdW5kZWZpbmVkID8gTUFYX1VJTlQzMiA6IGxpbWl0ID4+PiAwO1xuICAgICAgaWYgKGxpbSA9PT0gMCkgcmV0dXJuIFtdO1xuICAgICAgaWYgKFMubGVuZ3RoID09PSAwKSByZXR1cm4gY2FsbFJlZ0V4cEV4ZWMoc3BsaXR0ZXIsIFMpID09PSBudWxsID8gW1NdIDogW107XG4gICAgICB2YXIgcCA9IDA7XG4gICAgICB2YXIgcSA9IDA7XG4gICAgICB2YXIgQSA9IFtdO1xuICAgICAgd2hpbGUgKHEgPCBTLmxlbmd0aCkge1xuICAgICAgICBzcGxpdHRlci5sYXN0SW5kZXggPSBTVVBQT1JUU19ZID8gcSA6IDA7XG4gICAgICAgIHZhciB6ID0gY2FsbFJlZ0V4cEV4ZWMoc3BsaXR0ZXIsIFNVUFBPUlRTX1kgPyBTIDogUy5zbGljZShxKSk7XG4gICAgICAgIHZhciBlO1xuICAgICAgICBpZiAoXG4gICAgICAgICAgeiA9PT0gbnVsbCB8fFxuICAgICAgICAgIChlID0gJG1pbih0b0xlbmd0aChzcGxpdHRlci5sYXN0SW5kZXggKyAoU1VQUE9SVFNfWSA/IDAgOiBxKSksIFMubGVuZ3RoKSkgPT09IHBcbiAgICAgICAgKSB7XG4gICAgICAgICAgcSA9IGFkdmFuY2VTdHJpbmdJbmRleChTLCBxLCB1bmljb2RlTWF0Y2hpbmcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIEEucHVzaChTLnNsaWNlKHAsIHEpKTtcbiAgICAgICAgICBpZiAoQS5sZW5ndGggPT09IGxpbSkgcmV0dXJuIEE7XG4gICAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPD0gei5sZW5ndGggLSAxOyBpKyspIHtcbiAgICAgICAgICAgIEEucHVzaCh6W2ldKTtcbiAgICAgICAgICAgIGlmIChBLmxlbmd0aCA9PT0gbGltKSByZXR1cm4gQTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcSA9IHAgPSBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICBBLnB1c2goUy5zbGljZShwKSk7XG4gICAgICByZXR1cm4gQTtcbiAgICB9XG4gIF07XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnJlcXVpcmUoJy4vZXM2LnJlZ2V4cC5mbGFncycpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgJGZsYWdzID0gcmVxdWlyZSgnLi9fZmxhZ3MnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgVE9fU1RSSU5HID0gJ3RvU3RyaW5nJztcbnZhciAkdG9TdHJpbmcgPSAvLi9bVE9fU1RSSU5HXTtcblxudmFyIGRlZmluZSA9IGZ1bmN0aW9uIChmbikge1xuICByZXF1aXJlKCcuL19yZWRlZmluZScpKFJlZ0V4cC5wcm90b3R5cGUsIFRPX1NUUklORywgZm4sIHRydWUpO1xufTtcblxuLy8gMjEuMi41LjE0IFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcoKVxuaWYgKHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkgeyByZXR1cm4gJHRvU3RyaW5nLmNhbGwoeyBzb3VyY2U6ICdhJywgZmxhZ3M6ICdiJyB9KSAhPSAnL2EvYic7IH0pKSB7XG4gIGRlZmluZShmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICB2YXIgUiA9IGFuT2JqZWN0KHRoaXMpO1xuICAgIHJldHVybiAnLycuY29uY2F0KFIuc291cmNlLCAnLycsXG4gICAgICAnZmxhZ3MnIGluIFIgPyBSLmZsYWdzIDogIURFU0NSSVBUT1JTICYmIFIgaW5zdGFuY2VvZiBSZWdFeHAgPyAkZmxhZ3MuY2FsbChSKSA6IHVuZGVmaW5lZCk7XG4gIH0pO1xuLy8gRkY0NC0gUmVnRXhwI3RvU3RyaW5nIGhhcyBhIHdyb25nIG5hbWVcbn0gZWxzZSBpZiAoJHRvU3RyaW5nLm5hbWUgIT0gVE9fU1RSSU5HKSB7XG4gIGRlZmluZShmdW5jdGlvbiB0b1N0cmluZygpIHtcbiAgICByZXR1cm4gJHRvU3RyaW5nLmNhbGwodGhpcyk7XG4gIH0pO1xufVxuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHN0cm9uZyA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tc3Ryb25nJyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgU0VUID0gJ1NldCc7XG5cbi8vIDIzLjIgU2V0IE9iamVjdHNcbm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKFNFVCwgZnVuY3Rpb24gKGdldCkge1xuICByZXR1cm4gZnVuY3Rpb24gU2V0KCkgeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuMi4zLjEgU2V0LnByb3RvdHlwZS5hZGQodmFsdWUpXG4gIGFkZDogZnVuY3Rpb24gYWRkKHZhbHVlKSB7XG4gICAgcmV0dXJuIHN0cm9uZy5kZWYodmFsaWRhdGUodGhpcywgU0VUKSwgdmFsdWUgPSB2YWx1ZSA9PT0gMCA/IDAgOiB2YWx1ZSwgdmFsdWUpO1xuICB9XG59LCBzdHJvbmcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuMiBTdHJpbmcucHJvdG90eXBlLmFuY2hvcihuYW1lKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnYW5jaG9yJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGFuY2hvcihuYW1lKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2EnLCAnbmFtZScsIG5hbWUpO1xuICB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4zIFN0cmluZy5wcm90b3R5cGUuYmlnKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2JpZycsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBiaWcoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2JpZycsICcnLCAnJyk7XG4gIH07XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjQgU3RyaW5nLnByb3RvdHlwZS5ibGluaygpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdibGluaycsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBibGluaygpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnYmxpbmsnLCAnJywgJycpO1xuICB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy41IFN0cmluZy5wcm90b3R5cGUuYm9sZCgpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdib2xkJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGJvbGQoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ2InLCAnJywgJycpO1xuICB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRhdCA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKGZhbHNlKTtcbiRleHBvcnQoJGV4cG9ydC5QLCAnU3RyaW5nJywge1xuICAvLyAyMS4xLjMuMyBTdHJpbmcucHJvdG90eXBlLmNvZGVQb2ludEF0KHBvcylcbiAgY29kZVBvaW50QXQ6IGZ1bmN0aW9uIGNvZGVQb2ludEF0KHBvcykge1xuICAgIHJldHVybiAkYXQodGhpcywgcG9zKTtcbiAgfVxufSk7XG4iLCIvLyAyMS4xLjMuNiBTdHJpbmcucHJvdG90eXBlLmVuZHNXaXRoKHNlYXJjaFN0cmluZyBbLCBlbmRQb3NpdGlvbl0pXG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgY29udGV4dCA9IHJlcXVpcmUoJy4vX3N0cmluZy1jb250ZXh0Jyk7XG52YXIgRU5EU19XSVRIID0gJ2VuZHNXaXRoJztcbnZhciAkZW5kc1dpdGggPSAnJ1tFTkRTX1dJVEhdO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzLWlzLXJlZ2V4cCcpKEVORFNfV0lUSCksICdTdHJpbmcnLCB7XG4gIGVuZHNXaXRoOiBmdW5jdGlvbiBlbmRzV2l0aChzZWFyY2hTdHJpbmcgLyogLCBlbmRQb3NpdGlvbiA9IEBsZW5ndGggKi8pIHtcbiAgICB2YXIgdGhhdCA9IGNvbnRleHQodGhpcywgc2VhcmNoU3RyaW5nLCBFTkRTX1dJVEgpO1xuICAgIHZhciBlbmRQb3NpdGlvbiA9IGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkO1xuICAgIHZhciBsZW4gPSB0b0xlbmd0aCh0aGF0Lmxlbmd0aCk7XG4gICAgdmFyIGVuZCA9IGVuZFBvc2l0aW9uID09PSB1bmRlZmluZWQgPyBsZW4gOiBNYXRoLm1pbih0b0xlbmd0aChlbmRQb3NpdGlvbiksIGxlbik7XG4gICAgdmFyIHNlYXJjaCA9IFN0cmluZyhzZWFyY2hTdHJpbmcpO1xuICAgIHJldHVybiAkZW5kc1dpdGhcbiAgICAgID8gJGVuZHNXaXRoLmNhbGwodGhhdCwgc2VhcmNoLCBlbmQpXG4gICAgICA6IHRoYXQuc2xpY2UoZW5kIC0gc2VhcmNoLmxlbmd0aCwgZW5kKSA9PT0gc2VhcmNoO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjYgU3RyaW5nLnByb3RvdHlwZS5maXhlZCgpXG5yZXF1aXJlKCcuL19zdHJpbmctaHRtbCcpKCdmaXhlZCcsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBmaXhlZCgpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAndHQnLCAnJywgJycpO1xuICB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy43IFN0cmluZy5wcm90b3R5cGUuZm9udGNvbG9yKGNvbG9yKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnZm9udGNvbG9yJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZvbnRjb2xvcihjb2xvcikge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdmb250JywgJ2NvbG9yJywgY29sb3IpO1xuICB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy44IFN0cmluZy5wcm90b3R5cGUuZm9udHNpemUoc2l6ZSlcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ2ZvbnRzaXplJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGZvbnRzaXplKHNpemUpIHtcbiAgICByZXR1cm4gY3JlYXRlSFRNTCh0aGlzLCAnZm9udCcsICdzaXplJywgc2l6ZSk7XG4gIH07XG59KTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciBmcm9tQ2hhckNvZGUgPSBTdHJpbmcuZnJvbUNoYXJDb2RlO1xudmFyICRmcm9tQ29kZVBvaW50ID0gU3RyaW5nLmZyb21Db2RlUG9pbnQ7XG5cbi8vIGxlbmd0aCBzaG91bGQgYmUgMSwgb2xkIEZGIHByb2JsZW1cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKCEhJGZyb21Db2RlUG9pbnQgJiYgJGZyb21Db2RlUG9pbnQubGVuZ3RoICE9IDEpLCAnU3RyaW5nJywge1xuICAvLyAyMS4xLjIuMiBTdHJpbmcuZnJvbUNvZGVQb2ludCguLi5jb2RlUG9pbnRzKVxuICBmcm9tQ29kZVBvaW50OiBmdW5jdGlvbiBmcm9tQ29kZVBvaW50KHgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIHZhciByZXMgPSBbXTtcbiAgICB2YXIgYUxlbiA9IGFyZ3VtZW50cy5sZW5ndGg7XG4gICAgdmFyIGkgPSAwO1xuICAgIHZhciBjb2RlO1xuICAgIHdoaWxlIChhTGVuID4gaSkge1xuICAgICAgY29kZSA9ICthcmd1bWVudHNbaSsrXTtcbiAgICAgIGlmICh0b0Fic29sdXRlSW5kZXgoY29kZSwgMHgxMGZmZmYpICE9PSBjb2RlKSB0aHJvdyBSYW5nZUVycm9yKGNvZGUgKyAnIGlzIG5vdCBhIHZhbGlkIGNvZGUgcG9pbnQnKTtcbiAgICAgIHJlcy5wdXNoKGNvZGUgPCAweDEwMDAwXG4gICAgICAgID8gZnJvbUNoYXJDb2RlKGNvZGUpXG4gICAgICAgIDogZnJvbUNoYXJDb2RlKCgoY29kZSAtPSAweDEwMDAwKSA+PiAxMCkgKyAweGQ4MDAsIGNvZGUgJSAweDQwMCArIDB4ZGMwMClcbiAgICAgICk7XG4gICAgfSByZXR1cm4gcmVzLmpvaW4oJycpO1xuICB9XG59KTtcbiIsIi8vIDIxLjEuMy43IFN0cmluZy5wcm90b3R5cGUuaW5jbHVkZXMoc2VhcmNoU3RyaW5nLCBwb3NpdGlvbiA9IDApXG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGNvbnRleHQgPSByZXF1aXJlKCcuL19zdHJpbmctY29udGV4dCcpO1xudmFyIElOQ0xVREVTID0gJ2luY2x1ZGVzJztcblxuJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiByZXF1aXJlKCcuL19mYWlscy1pcy1yZWdleHAnKShJTkNMVURFUyksICdTdHJpbmcnLCB7XG4gIGluY2x1ZGVzOiBmdW5jdGlvbiBpbmNsdWRlcyhzZWFyY2hTdHJpbmcgLyogLCBwb3NpdGlvbiA9IDAgKi8pIHtcbiAgICByZXR1cm4gISF+Y29udGV4dCh0aGlzLCBzZWFyY2hTdHJpbmcsIElOQ0xVREVTKVxuICAgICAgLmluZGV4T2Yoc2VhcmNoU3RyaW5nLCBhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gQi4yLjMuOSBTdHJpbmcucHJvdG90eXBlLml0YWxpY3MoKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnaXRhbGljcycsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBpdGFsaWNzKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdpJywgJycsICcnKTtcbiAgfTtcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRhdCA9IHJlcXVpcmUoJy4vX3N0cmluZy1hdCcpKHRydWUpO1xuXG4vLyAyMS4xLjMuMjcgU3RyaW5nLnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5yZXF1aXJlKCcuL19pdGVyLWRlZmluZScpKFN0cmluZywgJ1N0cmluZycsIGZ1bmN0aW9uIChpdGVyYXRlZCkge1xuICB0aGlzLl90ID0gU3RyaW5nKGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4vLyAyMS4xLjUuMi4xICVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbiAoKSB7XG4gIHZhciBPID0gdGhpcy5fdDtcbiAgdmFyIGluZGV4ID0gdGhpcy5faTtcbiAgdmFyIHBvaW50O1xuICBpZiAoaW5kZXggPj0gTy5sZW5ndGgpIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgcG9pbnQgPSAkYXQoTywgaW5kZXgpO1xuICB0aGlzLl9pICs9IHBvaW50Lmxlbmd0aDtcbiAgcmV0dXJuIHsgdmFsdWU6IHBvaW50LCBkb25lOiBmYWxzZSB9O1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4xMCBTdHJpbmcucHJvdG90eXBlLmxpbmsodXJsKVxucmVxdWlyZSgnLi9fc3RyaW5nLWh0bWwnKSgnbGluaycsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBsaW5rKHVybCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdhJywgJ2hyZWYnLCB1cmwpO1xuICB9O1xufSk7XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvSU9iamVjdCA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ1N0cmluZycsIHtcbiAgLy8gMjEuMS4yLjQgU3RyaW5nLnJhdyhjYWxsU2l0ZSwgLi4uc3Vic3RpdHV0aW9ucylcbiAgcmF3OiBmdW5jdGlvbiByYXcoY2FsbFNpdGUpIHtcbiAgICB2YXIgdHBsID0gdG9JT2JqZWN0KGNhbGxTaXRlLnJhdyk7XG4gICAgdmFyIGxlbiA9IHRvTGVuZ3RoKHRwbC5sZW5ndGgpO1xuICAgIHZhciBhTGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgICB2YXIgcmVzID0gW107XG4gICAgdmFyIGkgPSAwO1xuICAgIHdoaWxlIChsZW4gPiBpKSB7XG4gICAgICByZXMucHVzaChTdHJpbmcodHBsW2krK10pKTtcbiAgICAgIGlmIChpIDwgYUxlbikgcmVzLnB1c2goU3RyaW5nKGFyZ3VtZW50c1tpXSkpO1xuICAgIH0gcmV0dXJuIHJlcy5qb2luKCcnKTtcbiAgfVxufSk7XG4iLCJ2YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ1N0cmluZycsIHtcbiAgLy8gMjEuMS4zLjEzIFN0cmluZy5wcm90b3R5cGUucmVwZWF0KGNvdW50KVxuICByZXBlYXQ6IHJlcXVpcmUoJy4vX3N0cmluZy1yZXBlYXQnKVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBCLjIuMy4xMSBTdHJpbmcucHJvdG90eXBlLnNtYWxsKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ3NtYWxsJywgZnVuY3Rpb24gKGNyZWF0ZUhUTUwpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIHNtYWxsKCkge1xuICAgIHJldHVybiBjcmVhdGVIVE1MKHRoaXMsICdzbWFsbCcsICcnLCAnJyk7XG4gIH07XG59KTtcbiIsIi8vIDIxLjEuMy4xOCBTdHJpbmcucHJvdG90eXBlLnN0YXJ0c1dpdGgoc2VhcmNoU3RyaW5nIFssIHBvc2l0aW9uIF0pXG4ndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvTGVuZ3RoID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJyk7XG52YXIgY29udGV4dCA9IHJlcXVpcmUoJy4vX3N0cmluZy1jb250ZXh0Jyk7XG52YXIgU1RBUlRTX1dJVEggPSAnc3RhcnRzV2l0aCc7XG52YXIgJHN0YXJ0c1dpdGggPSAnJ1tTVEFSVFNfV0lUSF07XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogcmVxdWlyZSgnLi9fZmFpbHMtaXMtcmVnZXhwJykoU1RBUlRTX1dJVEgpLCAnU3RyaW5nJywge1xuICBzdGFydHNXaXRoOiBmdW5jdGlvbiBzdGFydHNXaXRoKHNlYXJjaFN0cmluZyAvKiAsIHBvc2l0aW9uID0gMCAqLykge1xuICAgIHZhciB0aGF0ID0gY29udGV4dCh0aGlzLCBzZWFyY2hTdHJpbmcsIFNUQVJUU19XSVRIKTtcbiAgICB2YXIgaW5kZXggPSB0b0xlbmd0aChNYXRoLm1pbihhcmd1bWVudHMubGVuZ3RoID4gMSA/IGFyZ3VtZW50c1sxXSA6IHVuZGVmaW5lZCwgdGhhdC5sZW5ndGgpKTtcbiAgICB2YXIgc2VhcmNoID0gU3RyaW5nKHNlYXJjaFN0cmluZyk7XG4gICAgcmV0dXJuICRzdGFydHNXaXRoXG4gICAgICA/ICRzdGFydHNXaXRoLmNhbGwodGhhdCwgc2VhcmNoLCBpbmRleClcbiAgICAgIDogdGhhdC5zbGljZShpbmRleCwgaW5kZXggKyBzZWFyY2gubGVuZ3RoKSA9PT0gc2VhcmNoO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjEyIFN0cmluZy5wcm90b3R5cGUuc3RyaWtlKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ3N0cmlrZScsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzdHJpa2UoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3N0cmlrZScsICcnLCAnJyk7XG4gIH07XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjEzIFN0cmluZy5wcm90b3R5cGUuc3ViKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ3N1YicsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzdWIoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3N1YicsICcnLCAnJyk7XG4gIH07XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEIuMi4zLjE0IFN0cmluZy5wcm90b3R5cGUuc3VwKClcbnJlcXVpcmUoJy4vX3N0cmluZy1odG1sJykoJ3N1cCcsIGZ1bmN0aW9uIChjcmVhdGVIVE1MKSB7XG4gIHJldHVybiBmdW5jdGlvbiBzdXAoKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUhUTUwodGhpcywgJ3N1cCcsICcnLCAnJyk7XG4gIH07XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIDIxLjEuMy4yNSBTdHJpbmcucHJvdG90eXBlLnRyaW0oKVxucmVxdWlyZSgnLi9fc3RyaW5nLXRyaW0nKSgndHJpbScsIGZ1bmN0aW9uICgkdHJpbSkge1xuICByZXR1cm4gZnVuY3Rpb24gdHJpbSgpIHtcbiAgICByZXR1cm4gJHRyaW0odGhpcywgMyk7XG4gIH07XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIEVDTUFTY3JpcHQgNiBzeW1ib2xzIHNoaW1cbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBoYXMgPSByZXF1aXJlKCcuL19oYXMnKTtcbnZhciBERVNDUklQVE9SUyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJyk7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbnZhciBNRVRBID0gcmVxdWlyZSgnLi9fbWV0YScpLktFWTtcbnZhciAkZmFpbHMgPSByZXF1aXJlKCcuL19mYWlscycpO1xudmFyIHNoYXJlZCA9IHJlcXVpcmUoJy4vX3NoYXJlZCcpO1xudmFyIHNldFRvU3RyaW5nVGFnID0gcmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKTtcbnZhciB1aWQgPSByZXF1aXJlKCcuL191aWQnKTtcbnZhciB3a3MgPSByZXF1aXJlKCcuL193a3MnKTtcbnZhciB3a3NFeHQgPSByZXF1aXJlKCcuL193a3MtZXh0Jyk7XG52YXIgd2tzRGVmaW5lID0gcmVxdWlyZSgnLi9fd2tzLWRlZmluZScpO1xudmFyIGVudW1LZXlzID0gcmVxdWlyZSgnLi9fZW51bS1rZXlzJyk7XG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJy4vX2lzLWFycmF5Jyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIHRvUHJpbWl0aXZlID0gcmVxdWlyZSgnLi9fdG8tcHJpbWl0aXZlJyk7XG52YXIgY3JlYXRlRGVzYyA9IHJlcXVpcmUoJy4vX3Byb3BlcnR5LWRlc2MnKTtcbnZhciBfY3JlYXRlID0gcmVxdWlyZSgnLi9fb2JqZWN0LWNyZWF0ZScpO1xudmFyIGdPUE5FeHQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wbi1leHQnKTtcbnZhciAkR09QRCA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJyk7XG52YXIgJEdPUFMgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wcycpO1xudmFyICREUCA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xudmFyICRrZXlzID0gcmVxdWlyZSgnLi9fb2JqZWN0LWtleXMnKTtcbnZhciBnT1BEID0gJEdPUEQuZjtcbnZhciBkUCA9ICREUC5mO1xudmFyIGdPUE4gPSBnT1BORXh0LmY7XG52YXIgJFN5bWJvbCA9IGdsb2JhbC5TeW1ib2w7XG52YXIgJEpTT04gPSBnbG9iYWwuSlNPTjtcbnZhciBfc3RyaW5naWZ5ID0gJEpTT04gJiYgJEpTT04uc3RyaW5naWZ5O1xudmFyIFBST1RPVFlQRSA9ICdwcm90b3R5cGUnO1xudmFyIEhJRERFTiA9IHdrcygnX2hpZGRlbicpO1xudmFyIFRPX1BSSU1JVElWRSA9IHdrcygndG9QcmltaXRpdmUnKTtcbnZhciBpc0VudW0gPSB7fS5wcm9wZXJ0eUlzRW51bWVyYWJsZTtcbnZhciBTeW1ib2xSZWdpc3RyeSA9IHNoYXJlZCgnc3ltYm9sLXJlZ2lzdHJ5Jyk7XG52YXIgQWxsU3ltYm9scyA9IHNoYXJlZCgnc3ltYm9scycpO1xudmFyIE9QU3ltYm9scyA9IHNoYXJlZCgnb3Atc3ltYm9scycpO1xudmFyIE9iamVjdFByb3RvID0gT2JqZWN0W1BST1RPVFlQRV07XG52YXIgVVNFX05BVElWRSA9IHR5cGVvZiAkU3ltYm9sID09ICdmdW5jdGlvbicgJiYgISEkR09QUy5mO1xudmFyIFFPYmplY3QgPSBnbG9iYWwuUU9iamVjdDtcbi8vIERvbid0IHVzZSBzZXR0ZXJzIGluIFF0IFNjcmlwdCwgaHR0cHM6Ly9naXRodWIuY29tL3psb2lyb2NrL2NvcmUtanMvaXNzdWVzLzE3M1xudmFyIHNldHRlciA9ICFRT2JqZWN0IHx8ICFRT2JqZWN0W1BST1RPVFlQRV0gfHwgIVFPYmplY3RbUFJPVE9UWVBFXS5maW5kQ2hpbGQ7XG5cbi8vIGZhbGxiYWNrIGZvciBvbGQgQW5kcm9pZCwgaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC92OC9pc3N1ZXMvZGV0YWlsP2lkPTY4N1xudmFyIHNldFN5bWJvbERlc2MgPSBERVNDUklQVE9SUyAmJiAkZmFpbHMoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gX2NyZWF0ZShkUCh7fSwgJ2EnLCB7XG4gICAgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBkUCh0aGlzLCAnYScsIHsgdmFsdWU6IDcgfSkuYTsgfVxuICB9KSkuYSAhPSA3O1xufSkgPyBmdW5jdGlvbiAoaXQsIGtleSwgRCkge1xuICB2YXIgcHJvdG9EZXNjID0gZ09QRChPYmplY3RQcm90bywga2V5KTtcbiAgaWYgKHByb3RvRGVzYykgZGVsZXRlIE9iamVjdFByb3RvW2tleV07XG4gIGRQKGl0LCBrZXksIEQpO1xuICBpZiAocHJvdG9EZXNjICYmIGl0ICE9PSBPYmplY3RQcm90bykgZFAoT2JqZWN0UHJvdG8sIGtleSwgcHJvdG9EZXNjKTtcbn0gOiBkUDtcblxudmFyIHdyYXAgPSBmdW5jdGlvbiAodGFnKSB7XG4gIHZhciBzeW0gPSBBbGxTeW1ib2xzW3RhZ10gPSBfY3JlYXRlKCRTeW1ib2xbUFJPVE9UWVBFXSk7XG4gIHN5bS5fayA9IHRhZztcbiAgcmV0dXJuIHN5bTtcbn07XG5cbnZhciBpc1N5bWJvbCA9IFVTRV9OQVRJVkUgJiYgdHlwZW9mICRTeW1ib2wuaXRlcmF0b3IgPT0gJ3N5bWJvbCcgPyBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIHR5cGVvZiBpdCA9PSAnc3ltYm9sJztcbn0gOiBmdW5jdGlvbiAoaXQpIHtcbiAgcmV0dXJuIGl0IGluc3RhbmNlb2YgJFN5bWJvbDtcbn07XG5cbnZhciAkZGVmaW5lUHJvcGVydHkgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0eShpdCwga2V5LCBEKSB7XG4gIGlmIChpdCA9PT0gT2JqZWN0UHJvdG8pICRkZWZpbmVQcm9wZXJ0eShPUFN5bWJvbHMsIGtleSwgRCk7XG4gIGFuT2JqZWN0KGl0KTtcbiAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcbiAgYW5PYmplY3QoRCk7XG4gIGlmIChoYXMoQWxsU3ltYm9scywga2V5KSkge1xuICAgIGlmICghRC5lbnVtZXJhYmxlKSB7XG4gICAgICBpZiAoIWhhcyhpdCwgSElEREVOKSkgZFAoaXQsIEhJRERFTiwgY3JlYXRlRGVzYygxLCB7fSkpO1xuICAgICAgaXRbSElEREVOXVtrZXldID0gdHJ1ZTtcbiAgICB9IGVsc2Uge1xuICAgICAgaWYgKGhhcyhpdCwgSElEREVOKSAmJiBpdFtISURERU5dW2tleV0pIGl0W0hJRERFTl1ba2V5XSA9IGZhbHNlO1xuICAgICAgRCA9IF9jcmVhdGUoRCwgeyBlbnVtZXJhYmxlOiBjcmVhdGVEZXNjKDAsIGZhbHNlKSB9KTtcbiAgICB9IHJldHVybiBzZXRTeW1ib2xEZXNjKGl0LCBrZXksIEQpO1xuICB9IHJldHVybiBkUChpdCwga2V5LCBEKTtcbn07XG52YXIgJGRlZmluZVByb3BlcnRpZXMgPSBmdW5jdGlvbiBkZWZpbmVQcm9wZXJ0aWVzKGl0LCBQKSB7XG4gIGFuT2JqZWN0KGl0KTtcbiAgdmFyIGtleXMgPSBlbnVtS2V5cyhQID0gdG9JT2JqZWN0KFApKTtcbiAgdmFyIGkgPSAwO1xuICB2YXIgbCA9IGtleXMubGVuZ3RoO1xuICB2YXIga2V5O1xuICB3aGlsZSAobCA+IGkpICRkZWZpbmVQcm9wZXJ0eShpdCwga2V5ID0ga2V5c1tpKytdLCBQW2tleV0pO1xuICByZXR1cm4gaXQ7XG59O1xudmFyICRjcmVhdGUgPSBmdW5jdGlvbiBjcmVhdGUoaXQsIFApIHtcbiAgcmV0dXJuIFAgPT09IHVuZGVmaW5lZCA/IF9jcmVhdGUoaXQpIDogJGRlZmluZVByb3BlcnRpZXMoX2NyZWF0ZShpdCksIFApO1xufTtcbnZhciAkcHJvcGVydHlJc0VudW1lcmFibGUgPSBmdW5jdGlvbiBwcm9wZXJ0eUlzRW51bWVyYWJsZShrZXkpIHtcbiAgdmFyIEUgPSBpc0VudW0uY2FsbCh0aGlzLCBrZXkgPSB0b1ByaW1pdGl2ZShrZXksIHRydWUpKTtcbiAgaWYgKHRoaXMgPT09IE9iamVjdFByb3RvICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICFoYXMoT1BTeW1ib2xzLCBrZXkpKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBFIHx8ICFoYXModGhpcywga2V5KSB8fCAhaGFzKEFsbFN5bWJvbHMsIGtleSkgfHwgaGFzKHRoaXMsIEhJRERFTikgJiYgdGhpc1tISURERU5dW2tleV0gPyBFIDogdHJ1ZTtcbn07XG52YXIgJGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5RGVzY3JpcHRvcihpdCwga2V5KSB7XG4gIGl0ID0gdG9JT2JqZWN0KGl0KTtcbiAga2V5ID0gdG9QcmltaXRpdmUoa2V5LCB0cnVlKTtcbiAgaWYgKGl0ID09PSBPYmplY3RQcm90byAmJiBoYXMoQWxsU3ltYm9scywga2V5KSAmJiAhaGFzKE9QU3ltYm9scywga2V5KSkgcmV0dXJuO1xuICB2YXIgRCA9IGdPUEQoaXQsIGtleSk7XG4gIGlmIChEICYmIGhhcyhBbGxTeW1ib2xzLCBrZXkpICYmICEoaGFzKGl0LCBISURERU4pICYmIGl0W0hJRERFTl1ba2V5XSkpIEQuZW51bWVyYWJsZSA9IHRydWU7XG4gIHJldHVybiBEO1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlOYW1lcyA9IGZ1bmN0aW9uIGdldE93blByb3BlcnR5TmFtZXMoaXQpIHtcbiAgdmFyIG5hbWVzID0gZ09QTih0b0lPYmplY3QoaXQpKTtcbiAgdmFyIHJlc3VsdCA9IFtdO1xuICB2YXIgaSA9IDA7XG4gIHZhciBrZXk7XG4gIHdoaWxlIChuYW1lcy5sZW5ndGggPiBpKSB7XG4gICAgaWYgKCFoYXMoQWxsU3ltYm9scywga2V5ID0gbmFtZXNbaSsrXSkgJiYga2V5ICE9IEhJRERFTiAmJiBrZXkgIT0gTUVUQSkgcmVzdWx0LnB1c2goa2V5KTtcbiAgfSByZXR1cm4gcmVzdWx0O1xufTtcbnZhciAkZ2V0T3duUHJvcGVydHlTeW1ib2xzID0gZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSB7XG4gIHZhciBJU19PUCA9IGl0ID09PSBPYmplY3RQcm90bztcbiAgdmFyIG5hbWVzID0gZ09QTihJU19PUCA/IE9QU3ltYm9scyA6IHRvSU9iamVjdChpdCkpO1xuICB2YXIgcmVzdWx0ID0gW107XG4gIHZhciBpID0gMDtcbiAgdmFyIGtleTtcbiAgd2hpbGUgKG5hbWVzLmxlbmd0aCA+IGkpIHtcbiAgICBpZiAoaGFzKEFsbFN5bWJvbHMsIGtleSA9IG5hbWVzW2krK10pICYmIChJU19PUCA/IGhhcyhPYmplY3RQcm90bywga2V5KSA6IHRydWUpKSByZXN1bHQucHVzaChBbGxTeW1ib2xzW2tleV0pO1xuICB9IHJldHVybiByZXN1bHQ7XG59O1xuXG4vLyAxOS40LjEuMSBTeW1ib2woW2Rlc2NyaXB0aW9uXSlcbmlmICghVVNFX05BVElWRSkge1xuICAkU3ltYm9sID0gZnVuY3Rpb24gU3ltYm9sKCkge1xuICAgIGlmICh0aGlzIGluc3RhbmNlb2YgJFN5bWJvbCkgdGhyb3cgVHlwZUVycm9yKCdTeW1ib2wgaXMgbm90IGEgY29uc3RydWN0b3IhJyk7XG4gICAgdmFyIHRhZyA9IHVpZChhcmd1bWVudHMubGVuZ3RoID4gMCA/IGFyZ3VtZW50c1swXSA6IHVuZGVmaW5lZCk7XG4gICAgdmFyICRzZXQgPSBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgIGlmICh0aGlzID09PSBPYmplY3RQcm90bykgJHNldC5jYWxsKE9QU3ltYm9scywgdmFsdWUpO1xuICAgICAgaWYgKGhhcyh0aGlzLCBISURERU4pICYmIGhhcyh0aGlzW0hJRERFTl0sIHRhZykpIHRoaXNbSElEREVOXVt0YWddID0gZmFsc2U7XG4gICAgICBzZXRTeW1ib2xEZXNjKHRoaXMsIHRhZywgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xuICAgIH07XG4gICAgaWYgKERFU0NSSVBUT1JTICYmIHNldHRlcikgc2V0U3ltYm9sRGVzYyhPYmplY3RQcm90bywgdGFnLCB7IGNvbmZpZ3VyYWJsZTogdHJ1ZSwgc2V0OiAkc2V0IH0pO1xuICAgIHJldHVybiB3cmFwKHRhZyk7XG4gIH07XG4gIHJlZGVmaW5lKCRTeW1ib2xbUFJPVE9UWVBFXSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKSB7XG4gICAgcmV0dXJuIHRoaXMuX2s7XG4gIH0pO1xuXG4gICRHT1BELmYgPSAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yO1xuICAkRFAuZiA9ICRkZWZpbmVQcm9wZXJ0eTtcbiAgcmVxdWlyZSgnLi9fb2JqZWN0LWdvcG4nKS5mID0gZ09QTkV4dC5mID0gJGdldE93blByb3BlcnR5TmFtZXM7XG4gIHJlcXVpcmUoJy4vX29iamVjdC1waWUnKS5mID0gJHByb3BlcnR5SXNFbnVtZXJhYmxlO1xuICAkR09QUy5mID0gJGdldE93blByb3BlcnR5U3ltYm9scztcblxuICBpZiAoREVTQ1JJUFRPUlMgJiYgIXJlcXVpcmUoJy4vX2xpYnJhcnknKSkge1xuICAgIHJlZGVmaW5lKE9iamVjdFByb3RvLCAncHJvcGVydHlJc0VudW1lcmFibGUnLCAkcHJvcGVydHlJc0VudW1lcmFibGUsIHRydWUpO1xuICB9XG5cbiAgd2tzRXh0LmYgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHJldHVybiB3cmFwKHdrcyhuYW1lKSk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHsgU3ltYm9sOiAkU3ltYm9sIH0pO1xuXG5mb3IgKHZhciBlczZTeW1ib2xzID0gKFxuICAvLyAxOS40LjIuMiwgMTkuNC4yLjMsIDE5LjQuMi40LCAxOS40LjIuNiwgMTkuNC4yLjgsIDE5LjQuMi45LCAxOS40LjIuMTAsIDE5LjQuMi4xMSwgMTkuNC4yLjEyLCAxOS40LjIuMTMsIDE5LjQuMi4xNFxuICAnaGFzSW5zdGFuY2UsaXNDb25jYXRTcHJlYWRhYmxlLGl0ZXJhdG9yLG1hdGNoLHJlcGxhY2Usc2VhcmNoLHNwZWNpZXMsc3BsaXQsdG9QcmltaXRpdmUsdG9TdHJpbmdUYWcsdW5zY29wYWJsZXMnXG4pLnNwbGl0KCcsJyksIGogPSAwOyBlczZTeW1ib2xzLmxlbmd0aCA+IGo7KXdrcyhlczZTeW1ib2xzW2orK10pO1xuXG5mb3IgKHZhciB3ZWxsS25vd25TeW1ib2xzID0gJGtleXMod2tzLnN0b3JlKSwgayA9IDA7IHdlbGxLbm93blN5bWJvbHMubGVuZ3RoID4gazspIHdrc0RlZmluZSh3ZWxsS25vd25TeW1ib2xzW2srK10pO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICFVU0VfTkFUSVZFLCAnU3ltYm9sJywge1xuICAvLyAxOS40LjIuMSBTeW1ib2wuZm9yKGtleSlcbiAgJ2Zvcic6IGZ1bmN0aW9uIChrZXkpIHtcbiAgICByZXR1cm4gaGFzKFN5bWJvbFJlZ2lzdHJ5LCBrZXkgKz0gJycpXG4gICAgICA/IFN5bWJvbFJlZ2lzdHJ5W2tleV1cbiAgICAgIDogU3ltYm9sUmVnaXN0cnlba2V5XSA9ICRTeW1ib2woa2V5KTtcbiAgfSxcbiAgLy8gMTkuNC4yLjUgU3ltYm9sLmtleUZvcihzeW0pXG4gIGtleUZvcjogZnVuY3Rpb24ga2V5Rm9yKHN5bSkge1xuICAgIGlmICghaXNTeW1ib2woc3ltKSkgdGhyb3cgVHlwZUVycm9yKHN5bSArICcgaXMgbm90IGEgc3ltYm9sIScpO1xuICAgIGZvciAodmFyIGtleSBpbiBTeW1ib2xSZWdpc3RyeSkgaWYgKFN5bWJvbFJlZ2lzdHJ5W2tleV0gPT09IHN5bSkgcmV0dXJuIGtleTtcbiAgfSxcbiAgdXNlU2V0dGVyOiBmdW5jdGlvbiAoKSB7IHNldHRlciA9IHRydWU7IH0sXG4gIHVzZVNpbXBsZTogZnVuY3Rpb24gKCkgeyBzZXR0ZXIgPSBmYWxzZTsgfVxufSk7XG5cbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsICdPYmplY3QnLCB7XG4gIC8vIDE5LjEuMi4yIE9iamVjdC5jcmVhdGUoTyBbLCBQcm9wZXJ0aWVzXSlcbiAgY3JlYXRlOiAkY3JlYXRlLFxuICAvLyAxOS4xLjIuNCBPYmplY3QuZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcylcbiAgZGVmaW5lUHJvcGVydHk6ICRkZWZpbmVQcm9wZXJ0eSxcbiAgLy8gMTkuMS4yLjMgT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcylcbiAgZGVmaW5lUHJvcGVydGllczogJGRlZmluZVByb3BlcnRpZXMsXG4gIC8vIDE5LjEuMi42IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgUClcbiAgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yOiAkZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yLFxuICAvLyAxOS4xLjIuNyBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhPKVxuICBnZXRPd25Qcm9wZXJ0eU5hbWVzOiAkZ2V0T3duUHJvcGVydHlOYW1lcyxcbiAgLy8gMTkuMS4yLjggT2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9scyhPKVxuICBnZXRPd25Qcm9wZXJ0eVN5bWJvbHM6ICRnZXRPd25Qcm9wZXJ0eVN5bWJvbHNcbn0pO1xuXG4vLyBDaHJvbWUgMzggYW5kIDM5IGBPYmplY3QuZ2V0T3duUHJvcGVydHlTeW1ib2xzYCBmYWlscyBvbiBwcmltaXRpdmVzXG4vLyBodHRwczovL2J1Z3MuY2hyb21pdW0ub3JnL3AvdjgvaXNzdWVzL2RldGFpbD9pZD0zNDQzXG52YXIgRkFJTFNfT05fUFJJTUlUSVZFUyA9ICRmYWlscyhmdW5jdGlvbiAoKSB7ICRHT1BTLmYoMSk7IH0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqIEZBSUxTX09OX1BSSU1JVElWRVMsICdPYmplY3QnLCB7XG4gIGdldE93blByb3BlcnR5U3ltYm9sczogZnVuY3Rpb24gZ2V0T3duUHJvcGVydHlTeW1ib2xzKGl0KSB7XG4gICAgcmV0dXJuICRHT1BTLmYodG9PYmplY3QoaXQpKTtcbiAgfVxufSk7XG5cbi8vIDI0LjMuMiBKU09OLnN0cmluZ2lmeSh2YWx1ZSBbLCByZXBsYWNlciBbLCBzcGFjZV1dKVxuJEpTT04gJiYgJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAoIVVTRV9OQVRJVkUgfHwgJGZhaWxzKGZ1bmN0aW9uICgpIHtcbiAgdmFyIFMgPSAkU3ltYm9sKCk7XG4gIC8vIE1TIEVkZ2UgY29udmVydHMgc3ltYm9sIHZhbHVlcyB0byBKU09OIGFzIHt9XG4gIC8vIFdlYktpdCBjb252ZXJ0cyBzeW1ib2wgdmFsdWVzIHRvIEpTT04gYXMgbnVsbFxuICAvLyBWOCB0aHJvd3Mgb24gYm94ZWQgc3ltYm9sc1xuICByZXR1cm4gX3N0cmluZ2lmeShbU10pICE9ICdbbnVsbF0nIHx8IF9zdHJpbmdpZnkoeyBhOiBTIH0pICE9ICd7fScgfHwgX3N0cmluZ2lmeShPYmplY3QoUykpICE9ICd7fSc7XG59KSksICdKU09OJywge1xuICBzdHJpbmdpZnk6IGZ1bmN0aW9uIHN0cmluZ2lmeShpdCkge1xuICAgIHZhciBhcmdzID0gW2l0XTtcbiAgICB2YXIgaSA9IDE7XG4gICAgdmFyIHJlcGxhY2VyLCAkcmVwbGFjZXI7XG4gICAgd2hpbGUgKGFyZ3VtZW50cy5sZW5ndGggPiBpKSBhcmdzLnB1c2goYXJndW1lbnRzW2krK10pO1xuICAgICRyZXBsYWNlciA9IHJlcGxhY2VyID0gYXJnc1sxXTtcbiAgICBpZiAoIWlzT2JqZWN0KHJlcGxhY2VyKSAmJiBpdCA9PT0gdW5kZWZpbmVkIHx8IGlzU3ltYm9sKGl0KSkgcmV0dXJuOyAvLyBJRTggcmV0dXJucyBzdHJpbmcgb24gdW5kZWZpbmVkXG4gICAgaWYgKCFpc0FycmF5KHJlcGxhY2VyKSkgcmVwbGFjZXIgPSBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgaWYgKHR5cGVvZiAkcmVwbGFjZXIgPT0gJ2Z1bmN0aW9uJykgdmFsdWUgPSAkcmVwbGFjZXIuY2FsbCh0aGlzLCBrZXksIHZhbHVlKTtcbiAgICAgIGlmICghaXNTeW1ib2wodmFsdWUpKSByZXR1cm4gdmFsdWU7XG4gICAgfTtcbiAgICBhcmdzWzFdID0gcmVwbGFjZXI7XG4gICAgcmV0dXJuIF9zdHJpbmdpZnkuYXBwbHkoJEpTT04sIGFyZ3MpO1xuICB9XG59KTtcblxuLy8gMTkuNC4zLjQgU3ltYm9sLnByb3RvdHlwZVtAQHRvUHJpbWl0aXZlXShoaW50KVxuJFN5bWJvbFtQUk9UT1RZUEVdW1RPX1BSSU1JVElWRV0gfHwgcmVxdWlyZSgnLi9faGlkZScpKCRTeW1ib2xbUFJPVE9UWVBFXSwgVE9fUFJJTUlUSVZFLCAkU3ltYm9sW1BST1RPVFlQRV0udmFsdWVPZik7XG4vLyAxOS40LjMuNSBTeW1ib2wucHJvdG90eXBlW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZygkU3ltYm9sLCAnU3ltYm9sJyk7XG4vLyAyMC4yLjEuOSBNYXRoW0BAdG9TdHJpbmdUYWddXG5zZXRUb1N0cmluZ1RhZyhNYXRoLCAnTWF0aCcsIHRydWUpO1xuLy8gMjQuMy4zIEpTT05bQEB0b1N0cmluZ1RhZ11cbnNldFRvU3RyaW5nVGFnKGdsb2JhbC5KU09OLCAnSlNPTicsIHRydWUpO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkdHlwZWQgPSByZXF1aXJlKCcuL190eXBlZCcpO1xudmFyIGJ1ZmZlciA9IHJlcXVpcmUoJy4vX3R5cGVkLWJ1ZmZlcicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgdG9BYnNvbHV0ZUluZGV4ID0gcmVxdWlyZSgnLi9fdG8tYWJzb2x1dGUtaW5kZXgnKTtcbnZhciB0b0xlbmd0aCA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgQXJyYXlCdWZmZXIgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5BcnJheUJ1ZmZlcjtcbnZhciBzcGVjaWVzQ29uc3RydWN0b3IgPSByZXF1aXJlKCcuL19zcGVjaWVzLWNvbnN0cnVjdG9yJyk7XG52YXIgJEFycmF5QnVmZmVyID0gYnVmZmVyLkFycmF5QnVmZmVyO1xudmFyICREYXRhVmlldyA9IGJ1ZmZlci5EYXRhVmlldztcbnZhciAkaXNWaWV3ID0gJHR5cGVkLkFCViAmJiBBcnJheUJ1ZmZlci5pc1ZpZXc7XG52YXIgJHNsaWNlID0gJEFycmF5QnVmZmVyLnByb3RvdHlwZS5zbGljZTtcbnZhciBWSUVXID0gJHR5cGVkLlZJRVc7XG52YXIgQVJSQVlfQlVGRkVSID0gJ0FycmF5QnVmZmVyJztcblxuJGV4cG9ydCgkZXhwb3J0LkcgKyAkZXhwb3J0LlcgKyAkZXhwb3J0LkYgKiAoQXJyYXlCdWZmZXIgIT09ICRBcnJheUJ1ZmZlciksIHsgQXJyYXlCdWZmZXI6ICRBcnJheUJ1ZmZlciB9KTtcblxuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhJHR5cGVkLkNPTlNUUiwgQVJSQVlfQlVGRkVSLCB7XG4gIC8vIDI0LjEuMy4xIEFycmF5QnVmZmVyLmlzVmlldyhhcmcpXG4gIGlzVmlldzogZnVuY3Rpb24gaXNWaWV3KGl0KSB7XG4gICAgcmV0dXJuICRpc1ZpZXcgJiYgJGlzVmlldyhpdCkgfHwgaXNPYmplY3QoaXQpICYmIFZJRVcgaW4gaXQ7XG4gIH1cbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuVSArICRleHBvcnQuRiAqIHJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24gKCkge1xuICByZXR1cm4gIW5ldyAkQXJyYXlCdWZmZXIoMikuc2xpY2UoMSwgdW5kZWZpbmVkKS5ieXRlTGVuZ3RoO1xufSksIEFSUkFZX0JVRkZFUiwge1xuICAvLyAyNC4xLjQuMyBBcnJheUJ1ZmZlci5wcm90b3R5cGUuc2xpY2Uoc3RhcnQsIGVuZClcbiAgc2xpY2U6IGZ1bmN0aW9uIHNsaWNlKHN0YXJ0LCBlbmQpIHtcbiAgICBpZiAoJHNsaWNlICE9PSB1bmRlZmluZWQgJiYgZW5kID09PSB1bmRlZmluZWQpIHJldHVybiAkc2xpY2UuY2FsbChhbk9iamVjdCh0aGlzKSwgc3RhcnQpOyAvLyBGRiBmaXhcbiAgICB2YXIgbGVuID0gYW5PYmplY3QodGhpcykuYnl0ZUxlbmd0aDtcbiAgICB2YXIgZmlyc3QgPSB0b0Fic29sdXRlSW5kZXgoc3RhcnQsIGxlbik7XG4gICAgdmFyIGZpbiA9IHRvQWJzb2x1dGVJbmRleChlbmQgPT09IHVuZGVmaW5lZCA/IGxlbiA6IGVuZCwgbGVuKTtcbiAgICB2YXIgcmVzdWx0ID0gbmV3IChzcGVjaWVzQ29uc3RydWN0b3IodGhpcywgJEFycmF5QnVmZmVyKSkodG9MZW5ndGgoZmluIC0gZmlyc3QpKTtcbiAgICB2YXIgdmlld1MgPSBuZXcgJERhdGFWaWV3KHRoaXMpO1xuICAgIHZhciB2aWV3VCA9IG5ldyAkRGF0YVZpZXcocmVzdWx0KTtcbiAgICB2YXIgaW5kZXggPSAwO1xuICAgIHdoaWxlIChmaXJzdCA8IGZpbikge1xuICAgICAgdmlld1Quc2V0VWludDgoaW5kZXgrKywgdmlld1MuZ2V0VWludDgoZmlyc3QrKykpO1xuICAgIH0gcmV0dXJuIHJlc3VsdDtcbiAgfVxufSk7XG5cbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoQVJSQVlfQlVGRkVSKTtcbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuVyArICRleHBvcnQuRiAqICFyZXF1aXJlKCcuL190eXBlZCcpLkFCViwge1xuICBEYXRhVmlldzogcmVxdWlyZSgnLi9fdHlwZWQtYnVmZmVyJykuRGF0YVZpZXdcbn0pO1xuIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnRmxvYXQzMicsIDQsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBGbG9hdDMyQXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnRmxvYXQ2NCcsIDgsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBGbG9hdDY0QXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnSW50MTYnLCAyLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gSW50MTZBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG4iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdJbnQzMicsIDQsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBJbnQzMkFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ0ludDgnLCAxLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gSW50OEFycmF5KGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCkge1xuICAgIHJldHVybiBpbml0KHRoaXMsIGRhdGEsIGJ5dGVPZmZzZXQsIGxlbmd0aCk7XG4gIH07XG59KTtcbiIsInJlcXVpcmUoJy4vX3R5cGVkLWFycmF5JykoJ1VpbnQxNicsIDIsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50MTZBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG4iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdVaW50MzInLCA0LCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gVWludDMyQXJyYXkoZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gICAgcmV0dXJuIGluaXQodGhpcywgZGF0YSwgYnl0ZU9mZnNldCwgbGVuZ3RoKTtcbiAgfTtcbn0pO1xuIiwicmVxdWlyZSgnLi9fdHlwZWQtYXJyYXknKSgnVWludDgnLCAxLCBmdW5jdGlvbiAoaW5pdCkge1xuICByZXR1cm4gZnVuY3Rpb24gVWludDhBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSk7XG4iLCJyZXF1aXJlKCcuL190eXBlZC1hcnJheScpKCdVaW50OCcsIDEsIGZ1bmN0aW9uIChpbml0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBVaW50OENsYW1wZWRBcnJheShkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgICByZXR1cm4gaW5pdCh0aGlzLCBkYXRhLCBieXRlT2Zmc2V0LCBsZW5ndGgpO1xuICB9O1xufSwgdHJ1ZSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJyk7XG52YXIgZWFjaCA9IHJlcXVpcmUoJy4vX2FycmF5LW1ldGhvZHMnKSgwKTtcbnZhciByZWRlZmluZSA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJyk7XG52YXIgbWV0YSA9IHJlcXVpcmUoJy4vX21ldGEnKTtcbnZhciBhc3NpZ24gPSByZXF1aXJlKCcuL19vYmplY3QtYXNzaWduJyk7XG52YXIgd2VhayA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24td2VhaycpO1xudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG52YXIgdmFsaWRhdGUgPSByZXF1aXJlKCcuL192YWxpZGF0ZS1jb2xsZWN0aW9uJyk7XG52YXIgTkFUSVZFX1dFQUtfTUFQID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIElTX0lFMTEgPSAhZ2xvYmFsLkFjdGl2ZVhPYmplY3QgJiYgJ0FjdGl2ZVhPYmplY3QnIGluIGdsb2JhbDtcbnZhciBXRUFLX01BUCA9ICdXZWFrTWFwJztcbnZhciBnZXRXZWFrID0gbWV0YS5nZXRXZWFrO1xudmFyIGlzRXh0ZW5zaWJsZSA9IE9iamVjdC5pc0V4dGVuc2libGU7XG52YXIgdW5jYXVnaHRGcm96ZW5TdG9yZSA9IHdlYWsudWZzdG9yZTtcbnZhciBJbnRlcm5hbE1hcDtcblxudmFyIHdyYXBwZXIgPSBmdW5jdGlvbiAoZ2V0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBXZWFrTWFwKCkge1xuICAgIHJldHVybiBnZXQodGhpcywgYXJndW1lbnRzLmxlbmd0aCA+IDAgPyBhcmd1bWVudHNbMF0gOiB1bmRlZmluZWQpO1xuICB9O1xufTtcblxudmFyIG1ldGhvZHMgPSB7XG4gIC8vIDIzLjMuMy4zIFdlYWtNYXAucHJvdG90eXBlLmdldChrZXkpXG4gIGdldDogZnVuY3Rpb24gZ2V0KGtleSkge1xuICAgIGlmIChpc09iamVjdChrZXkpKSB7XG4gICAgICB2YXIgZGF0YSA9IGdldFdlYWsoa2V5KTtcbiAgICAgIGlmIChkYXRhID09PSB0cnVlKSByZXR1cm4gdW5jYXVnaHRGcm96ZW5TdG9yZSh2YWxpZGF0ZSh0aGlzLCBXRUFLX01BUCkpLmdldChrZXkpO1xuICAgICAgcmV0dXJuIGRhdGEgPyBkYXRhW3RoaXMuX2ldIDogdW5kZWZpbmVkO1xuICAgIH1cbiAgfSxcbiAgLy8gMjMuMy4zLjUgV2Vha01hcC5wcm90b3R5cGUuc2V0KGtleSwgdmFsdWUpXG4gIHNldDogZnVuY3Rpb24gc2V0KGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gd2Vhay5kZWYodmFsaWRhdGUodGhpcywgV0VBS19NQVApLCBrZXksIHZhbHVlKTtcbiAgfVxufTtcblxuLy8gMjMuMyBXZWFrTWFwIE9iamVjdHNcbnZhciAkV2Vha01hcCA9IG1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKFdFQUtfTUFQLCB3cmFwcGVyLCBtZXRob2RzLCB3ZWFrLCB0cnVlLCB0cnVlKTtcblxuLy8gSUUxMSBXZWFrTWFwIGZyb3plbiBrZXlzIGZpeFxuaWYgKE5BVElWRV9XRUFLX01BUCAmJiBJU19JRTExKSB7XG4gIEludGVybmFsTWFwID0gd2Vhay5nZXRDb25zdHJ1Y3Rvcih3cmFwcGVyLCBXRUFLX01BUCk7XG4gIGFzc2lnbihJbnRlcm5hbE1hcC5wcm90b3R5cGUsIG1ldGhvZHMpO1xuICBtZXRhLk5FRUQgPSB0cnVlO1xuICBlYWNoKFsnZGVsZXRlJywgJ2hhcycsICdnZXQnLCAnc2V0J10sIGZ1bmN0aW9uIChrZXkpIHtcbiAgICB2YXIgcHJvdG8gPSAkV2Vha01hcC5wcm90b3R5cGU7XG4gICAgdmFyIG1ldGhvZCA9IHByb3RvW2tleV07XG4gICAgcmVkZWZpbmUocHJvdG8sIGtleSwgZnVuY3Rpb24gKGEsIGIpIHtcbiAgICAgIC8vIHN0b3JlIGZyb3plbiBvYmplY3RzIG9uIGludGVybmFsIHdlYWttYXAgc2hpbVxuICAgICAgaWYgKGlzT2JqZWN0KGEpICYmICFpc0V4dGVuc2libGUoYSkpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9mKSB0aGlzLl9mID0gbmV3IEludGVybmFsTWFwKCk7XG4gICAgICAgIHZhciByZXN1bHQgPSB0aGlzLl9mW2tleV0oYSwgYik7XG4gICAgICAgIHJldHVybiBrZXkgPT0gJ3NldCcgPyB0aGlzIDogcmVzdWx0O1xuICAgICAgLy8gc3RvcmUgYWxsIHRoZSByZXN0IG9uIG5hdGl2ZSB3ZWFrbWFwXG4gICAgICB9IHJldHVybiBtZXRob2QuY2FsbCh0aGlzLCBhLCBiKTtcbiAgICB9KTtcbiAgfSk7XG59XG4iLCIndXNlIHN0cmljdCc7XG52YXIgd2VhayA9IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24td2VhaycpO1xudmFyIHZhbGlkYXRlID0gcmVxdWlyZSgnLi9fdmFsaWRhdGUtY29sbGVjdGlvbicpO1xudmFyIFdFQUtfU0VUID0gJ1dlYWtTZXQnO1xuXG4vLyAyMy40IFdlYWtTZXQgT2JqZWN0c1xucmVxdWlyZSgnLi9fY29sbGVjdGlvbicpKFdFQUtfU0VULCBmdW5jdGlvbiAoZ2V0KSB7XG4gIHJldHVybiBmdW5jdGlvbiBXZWFrU2V0KCkgeyByZXR1cm4gZ2V0KHRoaXMsIGFyZ3VtZW50cy5sZW5ndGggPiAwID8gYXJndW1lbnRzWzBdIDogdW5kZWZpbmVkKTsgfTtcbn0sIHtcbiAgLy8gMjMuNC4zLjEgV2Vha1NldC5wcm90b3R5cGUuYWRkKHZhbHVlKVxuICBhZGQ6IGZ1bmN0aW9uIGFkZCh2YWx1ZSkge1xuICAgIHJldHVybiB3ZWFrLmRlZih2YWxpZGF0ZSh0aGlzLCBXRUFLX1NFVCksIHZhbHVlLCB0cnVlKTtcbiAgfVxufSwgd2VhaywgZmFsc2UsIHRydWUpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1mbGF0TWFwLyNzZWMtQXJyYXkucHJvdG90eXBlLmZsYXRNYXBcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZmxhdHRlbkludG9BcnJheSA9IHJlcXVpcmUoJy4vX2ZsYXR0ZW4taW50by1hcnJheScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBhRnVuY3Rpb24gPSByZXF1aXJlKCcuL19hLWZ1bmN0aW9uJyk7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gcmVxdWlyZSgnLi9fYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdBcnJheScsIHtcbiAgZmxhdE1hcDogZnVuY3Rpb24gZmxhdE1hcChjYWxsYmFja2ZuIC8qICwgdGhpc0FyZyAqLykge1xuICAgIHZhciBPID0gdG9PYmplY3QodGhpcyk7XG4gICAgdmFyIHNvdXJjZUxlbiwgQTtcbiAgICBhRnVuY3Rpb24oY2FsbGJhY2tmbik7XG4gICAgc291cmNlTGVuID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIEEgPSBhcnJheVNwZWNpZXNDcmVhdGUoTywgMCk7XG4gICAgZmxhdHRlbkludG9BcnJheShBLCBPLCBPLCBzb3VyY2VMZW4sIDAsIDEsIGNhbGxiYWNrZm4sIGFyZ3VtZW50c1sxXSk7XG4gICAgcmV0dXJuIEE7XG4gIH1cbn0pO1xuXG5yZXF1aXJlKCcuL19hZGQtdG8tdW5zY29wYWJsZXMnKSgnZmxhdE1hcCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1mbGF0TWFwLyNzZWMtQXJyYXkucHJvdG90eXBlLmZsYXR0ZW5cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgZmxhdHRlbkludG9BcnJheSA9IHJlcXVpcmUoJy4vX2ZsYXR0ZW4taW50by1hcnJheScpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJyk7XG52YXIgYXJyYXlTcGVjaWVzQ3JlYXRlID0gcmVxdWlyZSgnLi9fYXJyYXktc3BlY2llcy1jcmVhdGUnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlAsICdBcnJheScsIHtcbiAgZmxhdHRlbjogZnVuY3Rpb24gZmxhdHRlbigvKiBkZXB0aEFyZyA9IDEgKi8pIHtcbiAgICB2YXIgZGVwdGhBcmcgPSBhcmd1bWVudHNbMF07XG4gICAgdmFyIE8gPSB0b09iamVjdCh0aGlzKTtcbiAgICB2YXIgc291cmNlTGVuID0gdG9MZW5ndGgoTy5sZW5ndGgpO1xuICAgIHZhciBBID0gYXJyYXlTcGVjaWVzQ3JlYXRlKE8sIDApO1xuICAgIGZsYXR0ZW5JbnRvQXJyYXkoQSwgTywgTywgc291cmNlTGVuLCAwLCBkZXB0aEFyZyA9PT0gdW5kZWZpbmVkID8gMSA6IHRvSW50ZWdlcihkZXB0aEFyZykpO1xuICAgIHJldHVybiBBO1xuICB9XG59KTtcblxucmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJykoJ2ZsYXR0ZW4nKTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L0FycmF5LnByb3RvdHlwZS5pbmNsdWRlc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkaW5jbHVkZXMgPSByZXF1aXJlKCcuL19hcnJheS1pbmNsdWRlcycpKHRydWUpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCwgJ0FycmF5Jywge1xuICBpbmNsdWRlczogZnVuY3Rpb24gaW5jbHVkZXMoZWwgLyogLCBmcm9tSW5kZXggPSAwICovKSB7XG4gICAgcmV0dXJuICRpbmNsdWRlcyh0aGlzLCBlbCwgYXJndW1lbnRzLmxlbmd0aCA+IDEgPyBhcmd1bWVudHNbMV0gOiB1bmRlZmluZWQpO1xuICB9XG59KTtcblxucmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJykoJ2luY2x1ZGVzJyk7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vcndhbGRyb24vdGMzOS1ub3Rlcy9ibG9iL21hc3Rlci9lczYvMjAxNC0wOS9zZXB0LTI1Lm1kIzUxMC1nbG9iYWxhc2FwLWZvci1lbnF1ZXVpbmctYS1taWNyb3Rhc2tcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgbWljcm90YXNrID0gcmVxdWlyZSgnLi9fbWljcm90YXNrJykoKTtcbnZhciBwcm9jZXNzID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykucHJvY2VzcztcbnZhciBpc05vZGUgPSByZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG5cbiRleHBvcnQoJGV4cG9ydC5HLCB7XG4gIGFzYXA6IGZ1bmN0aW9uIGFzYXAoZm4pIHtcbiAgICB2YXIgZG9tYWluID0gaXNOb2RlICYmIHByb2Nlc3MuZG9tYWluO1xuICAgIG1pY3JvdGFzayhkb21haW4gPyBkb21haW4uYmluZChmbikgOiBmbik7XG4gIH1cbn0pO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL2xqaGFyYi9wcm9wb3NhbC1pcy1lcnJvclxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjb2YgPSByZXF1aXJlKCcuL19jb2YnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdFcnJvcicsIHtcbiAgaXNFcnJvcjogZnVuY3Rpb24gaXNFcnJvcihpdCkge1xuICAgIHJldHVybiBjb2YoaXQpID09PSAnRXJyb3InO1xuICB9XG59KTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLWdsb2JhbFxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LkcsIHsgZ2xvYmFsOiByZXF1aXJlKCcuL19nbG9iYWwnKSB9KTtcbiIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLW1hcC5mcm9tXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1mcm9tJykoJ01hcCcpO1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtbWFwLm9mXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1vZicpKCdNYXAnKTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EYXZpZEJydWFudC9NYXAtU2V0LnByb3RvdHlwZS50b0pTT05cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5SLCAnTWFwJywgeyB0b0pTT046IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tdG8tanNvbicpKCdNYXAnKSB9KTtcbiIsIi8vIGh0dHBzOi8vcndhbGRyb24uZ2l0aHViLmlvL3Byb3Bvc2FsLW1hdGgtZXh0ZW5zaW9ucy9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgY2xhbXA6IGZ1bmN0aW9uIGNsYW1wKHgsIGxvd2VyLCB1cHBlcikge1xuICAgIHJldHVybiBNYXRoLm1pbih1cHBlciwgTWF0aC5tYXgobG93ZXIsIHgpKTtcbiAgfVxufSk7XG4iLCIvLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7IERFR19QRVJfUkFEOiBNYXRoLlBJIC8gMTgwIH0pO1xuIiwiLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBSQURfUEVSX0RFRyA9IDE4MCAvIE1hdGguUEk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgZGVncmVlczogZnVuY3Rpb24gZGVncmVlcyhyYWRpYW5zKSB7XG4gICAgcmV0dXJuIHJhZGlhbnMgKiBSQURfUEVSX0RFRztcbiAgfVxufSk7XG4iLCIvLyBodHRwczovL3J3YWxkcm9uLmdpdGh1Yi5pby9wcm9wb3NhbC1tYXRoLWV4dGVuc2lvbnMvXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHNjYWxlID0gcmVxdWlyZSgnLi9fbWF0aC1zY2FsZScpO1xudmFyIGZyb3VuZCA9IHJlcXVpcmUoJy4vX21hdGgtZnJvdW5kJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgZnNjYWxlOiBmdW5jdGlvbiBmc2NhbGUoeCwgaW5Mb3csIGluSGlnaCwgb3V0TG93LCBvdXRIaWdoKSB7XG4gICAgcmV0dXJuIGZyb3VuZChzY2FsZSh4LCBpbkxvdywgaW5IaWdoLCBvdXRMb3csIG91dEhpZ2gpKTtcbiAgfVxufSk7XG4iLCIvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwM1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBpYWRkaDogZnVuY3Rpb24gaWFkZGgoeDAsIHgxLCB5MCwgeTEpIHtcbiAgICB2YXIgJHgwID0geDAgPj4+IDA7XG4gICAgdmFyICR4MSA9IHgxID4+PiAwO1xuICAgIHZhciAkeTAgPSB5MCA+Pj4gMDtcbiAgICByZXR1cm4gJHgxICsgKHkxID4+PiAwKSArICgoJHgwICYgJHkwIHwgKCR4MCB8ICR5MCkgJiB+KCR4MCArICR5MCA+Pj4gMCkpID4+PiAzMSkgfCAwO1xuICB9XG59KTtcbiIsIi8vIGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL0JyZW5kYW5FaWNoLzQyOTRkNWMyMTJhNmQyMjU0NzAzXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIGltdWxoOiBmdW5jdGlvbiBpbXVsaCh1LCB2KSB7XG4gICAgdmFyIFVJTlQxNiA9IDB4ZmZmZjtcbiAgICB2YXIgJHUgPSArdTtcbiAgICB2YXIgJHYgPSArdjtcbiAgICB2YXIgdTAgPSAkdSAmIFVJTlQxNjtcbiAgICB2YXIgdjAgPSAkdiAmIFVJTlQxNjtcbiAgICB2YXIgdTEgPSAkdSA+PiAxNjtcbiAgICB2YXIgdjEgPSAkdiA+PiAxNjtcbiAgICB2YXIgdCA9ICh1MSAqIHYwID4+PiAwKSArICh1MCAqIHYwID4+PiAxNik7XG4gICAgcmV0dXJuIHUxICogdjEgKyAodCA+PiAxNikgKyAoKHUwICogdjEgPj4+IDApICsgKHQgJiBVSU5UMTYpID4+IDE2KTtcbiAgfVxufSk7XG4iLCIvLyBodHRwczovL2dpc3QuZ2l0aHViLmNvbS9CcmVuZGFuRWljaC80Mjk0ZDVjMjEyYTZkMjI1NDcwM1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywge1xuICBpc3ViaDogZnVuY3Rpb24gaXN1YmgoeDAsIHgxLCB5MCwgeTEpIHtcbiAgICB2YXIgJHgwID0geDAgPj4+IDA7XG4gICAgdmFyICR4MSA9IHgxID4+PiAwO1xuICAgIHZhciAkeTAgPSB5MCA+Pj4gMDtcbiAgICByZXR1cm4gJHgxIC0gKHkxID4+PiAwKSAtICgofiR4MCAmICR5MCB8IH4oJHgwIF4gJHkwKSAmICR4MCAtICR5MCA+Pj4gMCkgPj4+IDMxKSB8IDA7XG4gIH1cbn0pO1xuIiwiLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywgeyBSQURfUEVSX0RFRzogMTgwIC8gTWF0aC5QSSB9KTtcbiIsIi8vIGh0dHBzOi8vcndhbGRyb24uZ2l0aHViLmlvL3Byb3Bvc2FsLW1hdGgtZXh0ZW5zaW9ucy9cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgREVHX1BFUl9SQUQgPSBNYXRoLlBJIC8gMTgwO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7XG4gIHJhZGlhbnM6IGZ1bmN0aW9uIHJhZGlhbnMoZGVncmVlcykge1xuICAgIHJldHVybiBkZWdyZWVzICogREVHX1BFUl9SQUQ7XG4gIH1cbn0pO1xuIiwiLy8gaHR0cHM6Ly9yd2FsZHJvbi5naXRodWIuaW8vcHJvcG9zYWwtbWF0aC1leHRlbnNpb25zL1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcblxuJGV4cG9ydCgkZXhwb3J0LlMsICdNYXRoJywgeyBzY2FsZTogcmVxdWlyZSgnLi9fbWF0aC1zY2FsZScpIH0pO1xuIiwiLy8gaHR0cDovL2pmYmFzdGllbi5naXRodWIuaW8vcGFwZXJzL01hdGguc2lnbmJpdC5odG1sXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ01hdGgnLCB7IHNpZ25iaXQ6IGZ1bmN0aW9uIHNpZ25iaXQoeCkge1xuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2VsZi1jb21wYXJlXG4gIHJldHVybiAoeCA9ICt4KSAhPSB4ID8geCA6IHggPT0gMCA/IDEgLyB4ID09IEluZmluaXR5IDogeCA+IDA7XG59IH0pO1xuIiwiLy8gaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vQnJlbmRhbkVpY2gvNDI5NGQ1YzIxMmE2ZDIyNTQ3MDNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnTWF0aCcsIHtcbiAgdW11bGg6IGZ1bmN0aW9uIHVtdWxoKHUsIHYpIHtcbiAgICB2YXIgVUlOVDE2ID0gMHhmZmZmO1xuICAgIHZhciAkdSA9ICt1O1xuICAgIHZhciAkdiA9ICt2O1xuICAgIHZhciB1MCA9ICR1ICYgVUlOVDE2O1xuICAgIHZhciB2MCA9ICR2ICYgVUlOVDE2O1xuICAgIHZhciB1MSA9ICR1ID4+PiAxNjtcbiAgICB2YXIgdjEgPSAkdiA+Pj4gMTY7XG4gICAgdmFyIHQgPSAodTEgKiB2MCA+Pj4gMCkgKyAodTAgKiB2MCA+Pj4gMTYpO1xuICAgIHJldHVybiB1MSAqIHYxICsgKHQgPj4+IDE2KSArICgodTAgKiB2MSA+Pj4gMCkgKyAodCAmIFVJTlQxNikgPj4+IDE2KTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIHRvT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyICRkZWZpbmVQcm9wZXJ0eSA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpO1xuXG4vLyBCLjIuMi4yIE9iamVjdC5wcm90b3R5cGUuX19kZWZpbmVHZXR0ZXJfXyhQLCBnZXR0ZXIpXG5yZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpICYmICRleHBvcnQoJGV4cG9ydC5QICsgcmVxdWlyZSgnLi9fb2JqZWN0LWZvcmNlZC1wYW0nKSwgJ09iamVjdCcsIHtcbiAgX19kZWZpbmVHZXR0ZXJfXzogZnVuY3Rpb24gX19kZWZpbmVHZXR0ZXJfXyhQLCBnZXR0ZXIpIHtcbiAgICAkZGVmaW5lUHJvcGVydHkuZih0b09iamVjdCh0aGlzKSwgUCwgeyBnZXQ6IGFGdW5jdGlvbihnZXR0ZXIpLCBlbnVtZXJhYmxlOiB0cnVlLCBjb25maWd1cmFibGU6IHRydWUgfSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciB0b09iamVjdCA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpO1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbnZhciAkZGVmaW5lUHJvcGVydHkgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKTtcblxuLy8gQi4yLjIuMyBPYmplY3QucHJvdG90eXBlLl9fZGVmaW5lU2V0dGVyX18oUCwgc2V0dGVyKVxucmVxdWlyZSgnLi9fZGVzY3JpcHRvcnMnKSAmJiAkZXhwb3J0KCRleHBvcnQuUCArIHJlcXVpcmUoJy4vX29iamVjdC1mb3JjZWQtcGFtJyksICdPYmplY3QnLCB7XG4gIF9fZGVmaW5lU2V0dGVyX186IGZ1bmN0aW9uIF9fZGVmaW5lU2V0dGVyX18oUCwgc2V0dGVyKSB7XG4gICAgJGRlZmluZVByb3BlcnR5LmYodG9PYmplY3QodGhpcyksIFAsIHsgc2V0OiBhRnVuY3Rpb24oc2V0dGVyKSwgZW51bWVyYWJsZTogdHJ1ZSwgY29uZmlndXJhYmxlOiB0cnVlIH0pO1xuICB9XG59KTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC12YWx1ZXMtZW50cmllc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkZW50cmllcyA9IHJlcXVpcmUoJy4vX29iamVjdC10by1hcnJheScpKHRydWUpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtcbiAgZW50cmllczogZnVuY3Rpb24gZW50cmllcyhpdCkge1xuICAgIHJldHVybiAkZW50cmllcyhpdCk7XG4gIH1cbn0pO1xuIiwiLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtb2JqZWN0LWdldG93bnByb3BlcnR5ZGVzY3JpcHRvcnNcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgb3duS2V5cyA9IHJlcXVpcmUoJy4vX293bi1rZXlzJyk7XG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xudmFyIGdPUEQgPSByZXF1aXJlKCcuL19vYmplY3QtZ29wZCcpO1xudmFyIGNyZWF0ZVByb3BlcnR5ID0gcmVxdWlyZSgnLi9fY3JlYXRlLXByb3BlcnR5Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnT2JqZWN0Jywge1xuICBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzOiBmdW5jdGlvbiBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKG9iamVjdCkge1xuICAgIHZhciBPID0gdG9JT2JqZWN0KG9iamVjdCk7XG4gICAgdmFyIGdldERlc2MgPSBnT1BELmY7XG4gICAgdmFyIGtleXMgPSBvd25LZXlzKE8pO1xuICAgIHZhciByZXN1bHQgPSB7fTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGtleSwgZGVzYztcbiAgICB3aGlsZSAoa2V5cy5sZW5ndGggPiBpKSB7XG4gICAgICBkZXNjID0gZ2V0RGVzYyhPLCBrZXkgPSBrZXlzW2krK10pO1xuICAgICAgaWYgKGRlc2MgIT09IHVuZGVmaW5lZCkgY3JlYXRlUHJvcGVydHkocmVzdWx0LCBrZXksIGRlc2MpO1xuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcblxuLy8gQi4yLjIuNCBPYmplY3QucHJvdG90eXBlLl9fbG9va3VwR2V0dGVyX18oUClcbnJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgJGV4cG9ydCgkZXhwb3J0LlAgKyByZXF1aXJlKCcuL19vYmplY3QtZm9yY2VkLXBhbScpLCAnT2JqZWN0Jywge1xuICBfX2xvb2t1cEdldHRlcl9fOiBmdW5jdGlvbiBfX2xvb2t1cEdldHRlcl9fKFApIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgIHZhciBLID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gICAgdmFyIEQ7XG4gICAgZG8ge1xuICAgICAgaWYgKEQgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgSykpIHJldHVybiBELmdldDtcbiAgICB9IHdoaWxlIChPID0gZ2V0UHJvdG90eXBlT2YoTykpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdG9PYmplY3QgPSByZXF1aXJlKCcuL190by1vYmplY3QnKTtcbnZhciB0b1ByaW1pdGl2ZSA9IHJlcXVpcmUoJy4vX3RvLXByaW1pdGl2ZScpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIGdldE93blByb3BlcnR5RGVzY3JpcHRvciA9IHJlcXVpcmUoJy4vX29iamVjdC1nb3BkJykuZjtcblxuLy8gQi4yLjIuNSBPYmplY3QucHJvdG90eXBlLl9fbG9va3VwU2V0dGVyX18oUClcbnJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgJGV4cG9ydCgkZXhwb3J0LlAgKyByZXF1aXJlKCcuL19vYmplY3QtZm9yY2VkLXBhbScpLCAnT2JqZWN0Jywge1xuICBfX2xvb2t1cFNldHRlcl9fOiBmdW5jdGlvbiBfX2xvb2t1cFNldHRlcl9fKFApIHtcbiAgICB2YXIgTyA9IHRvT2JqZWN0KHRoaXMpO1xuICAgIHZhciBLID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gICAgdmFyIEQ7XG4gICAgZG8ge1xuICAgICAgaWYgKEQgPSBnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoTywgSykpIHJldHVybiBELnNldDtcbiAgICB9IHdoaWxlIChPID0gZ2V0UHJvdG90eXBlT2YoTykpO1xuICB9XG59KTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLW9iamVjdC12YWx1ZXMtZW50cmllc1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciAkdmFsdWVzID0gcmVxdWlyZSgnLi9fb2JqZWN0LXRvLWFycmF5JykoZmFsc2UpO1xuXG4kZXhwb3J0KCRleHBvcnQuUywgJ09iamVjdCcsIHtcbiAgdmFsdWVzOiBmdW5jdGlvbiB2YWx1ZXMoaXQpIHtcbiAgICByZXR1cm4gJHZhbHVlcyhpdCk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3plbnBhcnNpbmcvZXMtb2JzZXJ2YWJsZVxudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIG1pY3JvdGFzayA9IHJlcXVpcmUoJy4vX21pY3JvdGFzaycpKCk7XG52YXIgT0JTRVJWQUJMRSA9IHJlcXVpcmUoJy4vX3drcycpKCdvYnNlcnZhYmxlJyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgYW5JbnN0YW5jZSA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJyk7XG52YXIgcmVkZWZpbmVBbGwgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKTtcbnZhciBoaWRlID0gcmVxdWlyZSgnLi9faGlkZScpO1xudmFyIGZvck9mID0gcmVxdWlyZSgnLi9fZm9yLW9mJyk7XG52YXIgUkVUVVJOID0gZm9yT2YuUkVUVVJOO1xuXG52YXIgZ2V0TWV0aG9kID0gZnVuY3Rpb24gKGZuKSB7XG4gIHJldHVybiBmbiA9PSBudWxsID8gdW5kZWZpbmVkIDogYUZ1bmN0aW9uKGZuKTtcbn07XG5cbnZhciBjbGVhbnVwU3Vic2NyaXB0aW9uID0gZnVuY3Rpb24gKHN1YnNjcmlwdGlvbikge1xuICB2YXIgY2xlYW51cCA9IHN1YnNjcmlwdGlvbi5fYztcbiAgaWYgKGNsZWFudXApIHtcbiAgICBzdWJzY3JpcHRpb24uX2MgPSB1bmRlZmluZWQ7XG4gICAgY2xlYW51cCgpO1xuICB9XG59O1xuXG52YXIgc3Vic2NyaXB0aW9uQ2xvc2VkID0gZnVuY3Rpb24gKHN1YnNjcmlwdGlvbikge1xuICByZXR1cm4gc3Vic2NyaXB0aW9uLl9vID09PSB1bmRlZmluZWQ7XG59O1xuXG52YXIgY2xvc2VTdWJzY3JpcHRpb24gPSBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uKSB7XG4gIGlmICghc3Vic2NyaXB0aW9uQ2xvc2VkKHN1YnNjcmlwdGlvbikpIHtcbiAgICBzdWJzY3JpcHRpb24uX28gPSB1bmRlZmluZWQ7XG4gICAgY2xlYW51cFN1YnNjcmlwdGlvbihzdWJzY3JpcHRpb24pO1xuICB9XG59O1xuXG52YXIgU3Vic2NyaXB0aW9uID0gZnVuY3Rpb24gKG9ic2VydmVyLCBzdWJzY3JpYmVyKSB7XG4gIGFuT2JqZWN0KG9ic2VydmVyKTtcbiAgdGhpcy5fYyA9IHVuZGVmaW5lZDtcbiAgdGhpcy5fbyA9IG9ic2VydmVyO1xuICBvYnNlcnZlciA9IG5ldyBTdWJzY3JpcHRpb25PYnNlcnZlcih0aGlzKTtcbiAgdHJ5IHtcbiAgICB2YXIgY2xlYW51cCA9IHN1YnNjcmliZXIob2JzZXJ2ZXIpO1xuICAgIHZhciBzdWJzY3JpcHRpb24gPSBjbGVhbnVwO1xuICAgIGlmIChjbGVhbnVwICE9IG51bGwpIHtcbiAgICAgIGlmICh0eXBlb2YgY2xlYW51cC51bnN1YnNjcmliZSA9PT0gJ2Z1bmN0aW9uJykgY2xlYW51cCA9IGZ1bmN0aW9uICgpIHsgc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCk7IH07XG4gICAgICBlbHNlIGFGdW5jdGlvbihjbGVhbnVwKTtcbiAgICAgIHRoaXMuX2MgPSBjbGVhbnVwO1xuICAgIH1cbiAgfSBjYXRjaCAoZSkge1xuICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgIHJldHVybjtcbiAgfSBpZiAoc3Vic2NyaXB0aW9uQ2xvc2VkKHRoaXMpKSBjbGVhbnVwU3Vic2NyaXB0aW9uKHRoaXMpO1xufTtcblxuU3Vic2NyaXB0aW9uLnByb3RvdHlwZSA9IHJlZGVmaW5lQWxsKHt9LCB7XG4gIHVuc3Vic2NyaWJlOiBmdW5jdGlvbiB1bnN1YnNjcmliZSgpIHsgY2xvc2VTdWJzY3JpcHRpb24odGhpcyk7IH1cbn0pO1xuXG52YXIgU3Vic2NyaXB0aW9uT2JzZXJ2ZXIgPSBmdW5jdGlvbiAoc3Vic2NyaXB0aW9uKSB7XG4gIHRoaXMuX3MgPSBzdWJzY3JpcHRpb247XG59O1xuXG5TdWJzY3JpcHRpb25PYnNlcnZlci5wcm90b3R5cGUgPSByZWRlZmluZUFsbCh7fSwge1xuICBuZXh0OiBmdW5jdGlvbiBuZXh0KHZhbHVlKSB7XG4gICAgdmFyIHN1YnNjcmlwdGlvbiA9IHRoaXMuX3M7XG4gICAgaWYgKCFzdWJzY3JpcHRpb25DbG9zZWQoc3Vic2NyaXB0aW9uKSkge1xuICAgICAgdmFyIG9ic2VydmVyID0gc3Vic2NyaXB0aW9uLl9vO1xuICAgICAgdHJ5IHtcbiAgICAgICAgdmFyIG0gPSBnZXRNZXRob2Qob2JzZXJ2ZXIubmV4dCk7XG4gICAgICAgIGlmIChtKSByZXR1cm4gbS5jYWxsKG9ic2VydmVyLCB2YWx1ZSk7XG4gICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgY2xvc2VTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9LFxuICBlcnJvcjogZnVuY3Rpb24gZXJyb3IodmFsdWUpIHtcbiAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhpcy5fcztcbiAgICBpZiAoc3Vic2NyaXB0aW9uQ2xvc2VkKHN1YnNjcmlwdGlvbikpIHRocm93IHZhbHVlO1xuICAgIHZhciBvYnNlcnZlciA9IHN1YnNjcmlwdGlvbi5fbztcbiAgICBzdWJzY3JpcHRpb24uX28gPSB1bmRlZmluZWQ7XG4gICAgdHJ5IHtcbiAgICAgIHZhciBtID0gZ2V0TWV0aG9kKG9ic2VydmVyLmVycm9yKTtcbiAgICAgIGlmICghbSkgdGhyb3cgdmFsdWU7XG4gICAgICB2YWx1ZSA9IG0uY2FsbChvYnNlcnZlciwgdmFsdWUpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRocm93IGU7XG4gICAgICB9XG4gICAgfSBjbGVhbnVwU3Vic2NyaXB0aW9uKHN1YnNjcmlwdGlvbik7XG4gICAgcmV0dXJuIHZhbHVlO1xuICB9LFxuICBjb21wbGV0ZTogZnVuY3Rpb24gY29tcGxldGUodmFsdWUpIHtcbiAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhpcy5fcztcbiAgICBpZiAoIXN1YnNjcmlwdGlvbkNsb3NlZChzdWJzY3JpcHRpb24pKSB7XG4gICAgICB2YXIgb2JzZXJ2ZXIgPSBzdWJzY3JpcHRpb24uX287XG4gICAgICBzdWJzY3JpcHRpb24uX28gPSB1bmRlZmluZWQ7XG4gICAgICB0cnkge1xuICAgICAgICB2YXIgbSA9IGdldE1ldGhvZChvYnNlcnZlci5jb21wbGV0ZSk7XG4gICAgICAgIHZhbHVlID0gbSA/IG0uY2FsbChvYnNlcnZlciwgdmFsdWUpIDogdW5kZWZpbmVkO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICAgICAgfSBmaW5hbGx5IHtcbiAgICAgICAgICB0aHJvdyBlO1xuICAgICAgICB9XG4gICAgICB9IGNsZWFudXBTdWJzY3JpcHRpb24oc3Vic2NyaXB0aW9uKTtcbiAgICAgIHJldHVybiB2YWx1ZTtcbiAgICB9XG4gIH1cbn0pO1xuXG52YXIgJE9ic2VydmFibGUgPSBmdW5jdGlvbiBPYnNlcnZhYmxlKHN1YnNjcmliZXIpIHtcbiAgYW5JbnN0YW5jZSh0aGlzLCAkT2JzZXJ2YWJsZSwgJ09ic2VydmFibGUnLCAnX2YnKS5fZiA9IGFGdW5jdGlvbihzdWJzY3JpYmVyKTtcbn07XG5cbnJlZGVmaW5lQWxsKCRPYnNlcnZhYmxlLnByb3RvdHlwZSwge1xuICBzdWJzY3JpYmU6IGZ1bmN0aW9uIHN1YnNjcmliZShvYnNlcnZlcikge1xuICAgIHJldHVybiBuZXcgU3Vic2NyaXB0aW9uKG9ic2VydmVyLCB0aGlzLl9mKTtcbiAgfSxcbiAgZm9yRWFjaDogZnVuY3Rpb24gZm9yRWFjaChmbikge1xuICAgIHZhciB0aGF0ID0gdGhpcztcbiAgICByZXR1cm4gbmV3IChjb3JlLlByb21pc2UgfHwgZ2xvYmFsLlByb21pc2UpKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgIGFGdW5jdGlvbihmbik7XG4gICAgICB2YXIgc3Vic2NyaXB0aW9uID0gdGhhdC5zdWJzY3JpYmUoe1xuICAgICAgICBuZXh0OiBmdW5jdGlvbiAodmFsdWUpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmV0dXJuIGZuKHZhbHVlKTtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgICAgIGVycm9yOiByZWplY3QsXG4gICAgICAgIGNvbXBsZXRlOiByZXNvbHZlXG4gICAgICB9KTtcbiAgICB9KTtcbiAgfVxufSk7XG5cbnJlZGVmaW5lQWxsKCRPYnNlcnZhYmxlLCB7XG4gIGZyb206IGZ1bmN0aW9uIGZyb20oeCkge1xuICAgIHZhciBDID0gdHlwZW9mIHRoaXMgPT09ICdmdW5jdGlvbicgPyB0aGlzIDogJE9ic2VydmFibGU7XG4gICAgdmFyIG1ldGhvZCA9IGdldE1ldGhvZChhbk9iamVjdCh4KVtPQlNFUlZBQkxFXSk7XG4gICAgaWYgKG1ldGhvZCkge1xuICAgICAgdmFyIG9ic2VydmFibGUgPSBhbk9iamVjdChtZXRob2QuY2FsbCh4KSk7XG4gICAgICByZXR1cm4gb2JzZXJ2YWJsZS5jb25zdHJ1Y3RvciA9PT0gQyA/IG9ic2VydmFibGUgOiBuZXcgQyhmdW5jdGlvbiAob2JzZXJ2ZXIpIHtcbiAgICAgICAgcmV0dXJuIG9ic2VydmFibGUuc3Vic2NyaWJlKG9ic2VydmVyKTtcbiAgICAgIH0pO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEMoZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICB2YXIgZG9uZSA9IGZhbHNlO1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFkb25lKSB7XG4gICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGlmIChmb3JPZih4LCBmYWxzZSwgZnVuY3Rpb24gKGl0KSB7XG4gICAgICAgICAgICAgIG9ic2VydmVyLm5leHQoaXQpO1xuICAgICAgICAgICAgICBpZiAoZG9uZSkgcmV0dXJuIFJFVFVSTjtcbiAgICAgICAgICAgIH0pID09PSBSRVRVUk4pIHJldHVybjtcbiAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICBpZiAoZG9uZSkgdGhyb3cgZTtcbiAgICAgICAgICAgIG9ic2VydmVyLmVycm9yKGUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgIH0gb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyBkb25lID0gdHJ1ZTsgfTtcbiAgICB9KTtcbiAgfSxcbiAgb2Y6IGZ1bmN0aW9uIG9mKCkge1xuICAgIGZvciAodmFyIGkgPSAwLCBsID0gYXJndW1lbnRzLmxlbmd0aCwgaXRlbXMgPSBuZXcgQXJyYXkobCk7IGkgPCBsOykgaXRlbXNbaV0gPSBhcmd1bWVudHNbaSsrXTtcbiAgICByZXR1cm4gbmV3ICh0eXBlb2YgdGhpcyA9PT0gJ2Z1bmN0aW9uJyA/IHRoaXMgOiAkT2JzZXJ2YWJsZSkoZnVuY3Rpb24gKG9ic2VydmVyKSB7XG4gICAgICB2YXIgZG9uZSA9IGZhbHNlO1xuICAgICAgbWljcm90YXNrKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCFkb25lKSB7XG4gICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBpdGVtcy5sZW5ndGg7ICsraikge1xuICAgICAgICAgICAgb2JzZXJ2ZXIubmV4dChpdGVtc1tqXSk7XG4gICAgICAgICAgICBpZiAoZG9uZSkgcmV0dXJuO1xuICAgICAgICAgIH0gb2JzZXJ2ZXIuY29tcGxldGUoKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICByZXR1cm4gZnVuY3Rpb24gKCkgeyBkb25lID0gdHJ1ZTsgfTtcbiAgICB9KTtcbiAgfVxufSk7XG5cbmhpZGUoJE9ic2VydmFibGUucHJvdG90eXBlLCBPQlNFUlZBQkxFLCBmdW5jdGlvbiAoKSB7IHJldHVybiB0aGlzOyB9KTtcblxuJGV4cG9ydCgkZXhwb3J0LkcsIHsgT2JzZXJ2YWJsZTogJE9ic2VydmFibGUgfSk7XG5cbnJlcXVpcmUoJy4vX3NldC1zcGVjaWVzJykoJ09ic2VydmFibGUnKTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXByb21pc2UtZmluYWxseVxuJ3VzZSBzdHJpY3QnO1xudmFyICRleHBvcnQgPSByZXF1aXJlKCcuL19leHBvcnQnKTtcbnZhciBjb3JlID0gcmVxdWlyZSgnLi9fY29yZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKTtcbnZhciBwcm9taXNlUmVzb2x2ZSA9IHJlcXVpcmUoJy4vX3Byb21pc2UtcmVzb2x2ZScpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuUiwgJ1Byb21pc2UnLCB7ICdmaW5hbGx5JzogZnVuY3Rpb24gKG9uRmluYWxseSkge1xuICB2YXIgQyA9IHNwZWNpZXNDb25zdHJ1Y3Rvcih0aGlzLCBjb3JlLlByb21pc2UgfHwgZ2xvYmFsLlByb21pc2UpO1xuICB2YXIgaXNGdW5jdGlvbiA9IHR5cGVvZiBvbkZpbmFsbHkgPT0gJ2Z1bmN0aW9uJztcbiAgcmV0dXJuIHRoaXMudGhlbihcbiAgICBpc0Z1bmN0aW9uID8gZnVuY3Rpb24gKHgpIHtcbiAgICAgIHJldHVybiBwcm9taXNlUmVzb2x2ZShDLCBvbkZpbmFsbHkoKSkudGhlbihmdW5jdGlvbiAoKSB7IHJldHVybiB4OyB9KTtcbiAgICB9IDogb25GaW5hbGx5LFxuICAgIGlzRnVuY3Rpb24gPyBmdW5jdGlvbiAoZSkge1xuICAgICAgcmV0dXJuIHByb21pc2VSZXNvbHZlKEMsIG9uRmluYWxseSgpKS50aGVuKGZ1bmN0aW9uICgpIHsgdGhyb3cgZTsgfSk7XG4gICAgfSA6IG9uRmluYWxseVxuICApO1xufSB9KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXByb21pc2UtdHJ5XG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIG5ld1Byb21pc2VDYXBhYmlsaXR5ID0gcmVxdWlyZSgnLi9fbmV3LXByb21pc2UtY2FwYWJpbGl0eScpO1xudmFyIHBlcmZvcm0gPSByZXF1aXJlKCcuL19wZXJmb3JtJyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnUHJvbWlzZScsIHsgJ3RyeSc6IGZ1bmN0aW9uIChjYWxsYmFja2ZuKSB7XG4gIHZhciBwcm9taXNlQ2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5LmYodGhpcyk7XG4gIHZhciByZXN1bHQgPSBwZXJmb3JtKGNhbGxiYWNrZm4pO1xuICAocmVzdWx0LmUgPyBwcm9taXNlQ2FwYWJpbGl0eS5yZWplY3QgOiBwcm9taXNlQ2FwYWJpbGl0eS5yZXNvbHZlKShyZXN1bHQudik7XG4gIHJldHVybiBwcm9taXNlQ2FwYWJpbGl0eS5wcm9taXNlO1xufSB9KTtcbiIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciB0b01ldGFLZXkgPSBtZXRhZGF0YS5rZXk7XG52YXIgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSA9IG1ldGFkYXRhLnNldDtcblxubWV0YWRhdGEuZXhwKHsgZGVmaW5lTWV0YWRhdGE6IGZ1bmN0aW9uIGRlZmluZU1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCB0YXJnZXQsIHRhcmdldEtleSkge1xuICBvcmRpbmFyeURlZmluZU93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCBtZXRhZGF0YVZhbHVlLCBhbk9iamVjdCh0YXJnZXQpLCB0b01ldGFLZXkodGFyZ2V0S2V5KSk7XG59IH0pO1xuIiwidmFyIG1ldGFkYXRhID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIHRvTWV0YUtleSA9IG1ldGFkYXRhLmtleTtcbnZhciBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwID0gbWV0YWRhdGEubWFwO1xudmFyIHN0b3JlID0gbWV0YWRhdGEuc3RvcmU7XG5cbm1ldGFkYXRhLmV4cCh7IGRlbGV0ZU1ldGFkYXRhOiBmdW5jdGlvbiBkZWxldGVNZXRhZGF0YShtZXRhZGF0YUtleSwgdGFyZ2V0IC8qICwgdGFyZ2V0S2V5ICovKSB7XG4gIHZhciB0YXJnZXRLZXkgPSBhcmd1bWVudHMubGVuZ3RoIDwgMyA/IHVuZGVmaW5lZCA6IHRvTWV0YUtleShhcmd1bWVudHNbMl0pO1xuICB2YXIgbWV0YWRhdGFNYXAgPSBnZXRPckNyZWF0ZU1ldGFkYXRhTWFwKGFuT2JqZWN0KHRhcmdldCksIHRhcmdldEtleSwgZmFsc2UpO1xuICBpZiAobWV0YWRhdGFNYXAgPT09IHVuZGVmaW5lZCB8fCAhbWV0YWRhdGFNYXBbJ2RlbGV0ZSddKG1ldGFkYXRhS2V5KSkgcmV0dXJuIGZhbHNlO1xuICBpZiAobWV0YWRhdGFNYXAuc2l6ZSkgcmV0dXJuIHRydWU7XG4gIHZhciB0YXJnZXRNZXRhZGF0YSA9IHN0b3JlLmdldCh0YXJnZXQpO1xuICB0YXJnZXRNZXRhZGF0YVsnZGVsZXRlJ10odGFyZ2V0S2V5KTtcbiAgcmV0dXJuICEhdGFyZ2V0TWV0YWRhdGEuc2l6ZSB8fCBzdG9yZVsnZGVsZXRlJ10odGFyZ2V0KTtcbn0gfSk7XG4iLCJ2YXIgU2V0ID0gcmVxdWlyZSgnLi9lczYuc2V0Jyk7XG52YXIgZnJvbSA9IHJlcXVpcmUoJy4vX2FycmF5LWZyb20taXRlcmFibGUnKTtcbnZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyA9IG1ldGFkYXRhLmtleXM7XG52YXIgdG9NZXRhS2V5ID0gbWV0YWRhdGEua2V5O1xuXG52YXIgb3JkaW5hcnlNZXRhZGF0YUtleXMgPSBmdW5jdGlvbiAoTywgUCkge1xuICB2YXIgb0tleXMgPSBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyhPLCBQKTtcbiAgdmFyIHBhcmVudCA9IGdldFByb3RvdHlwZU9mKE8pO1xuICBpZiAocGFyZW50ID09PSBudWxsKSByZXR1cm4gb0tleXM7XG4gIHZhciBwS2V5cyA9IG9yZGluYXJ5TWV0YWRhdGFLZXlzKHBhcmVudCwgUCk7XG4gIHJldHVybiBwS2V5cy5sZW5ndGggPyBvS2V5cy5sZW5ndGggPyBmcm9tKG5ldyBTZXQob0tleXMuY29uY2F0KHBLZXlzKSkpIDogcEtleXMgOiBvS2V5cztcbn07XG5cbm1ldGFkYXRhLmV4cCh7IGdldE1ldGFkYXRhS2V5czogZnVuY3Rpb24gZ2V0TWV0YWRhdGFLZXlzKHRhcmdldCAvKiAsIHRhcmdldEtleSAqLykge1xuICByZXR1cm4gb3JkaW5hcnlNZXRhZGF0YUtleXMoYW5PYmplY3QodGFyZ2V0KSwgYXJndW1lbnRzLmxlbmd0aCA8IDIgPyB1bmRlZmluZWQgOiB0b01ldGFLZXkoYXJndW1lbnRzWzFdKSk7XG59IH0pO1xuIiwidmFyIG1ldGFkYXRhID0gcmVxdWlyZSgnLi9fbWV0YWRhdGEnKTtcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xudmFyIGdldFByb3RvdHlwZU9mID0gcmVxdWlyZSgnLi9fb2JqZWN0LWdwbycpO1xudmFyIG9yZGluYXJ5SGFzT3duTWV0YWRhdGEgPSBtZXRhZGF0YS5oYXM7XG52YXIgb3JkaW5hcnlHZXRPd25NZXRhZGF0YSA9IG1ldGFkYXRhLmdldDtcbnZhciB0b01ldGFLZXkgPSBtZXRhZGF0YS5rZXk7XG5cbnZhciBvcmRpbmFyeUdldE1ldGFkYXRhID0gZnVuY3Rpb24gKE1ldGFkYXRhS2V5LCBPLCBQKSB7XG4gIHZhciBoYXNPd24gPSBvcmRpbmFyeUhhc093bk1ldGFkYXRhKE1ldGFkYXRhS2V5LCBPLCBQKTtcbiAgaWYgKGhhc093bikgcmV0dXJuIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICB2YXIgcGFyZW50ID0gZ2V0UHJvdG90eXBlT2YoTyk7XG4gIHJldHVybiBwYXJlbnQgIT09IG51bGwgPyBvcmRpbmFyeUdldE1ldGFkYXRhKE1ldGFkYXRhS2V5LCBwYXJlbnQsIFApIDogdW5kZWZpbmVkO1xufTtcblxubWV0YWRhdGEuZXhwKHsgZ2V0TWV0YWRhdGE6IGZ1bmN0aW9uIGdldE1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgcmV0dXJuIG9yZGluYXJ5R2V0TWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldCksIGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1syXSkpO1xufSB9KTtcbiIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBvcmRpbmFyeU93bk1ldGFkYXRhS2V5cyA9IG1ldGFkYXRhLmtleXM7XG52YXIgdG9NZXRhS2V5ID0gbWV0YWRhdGEua2V5O1xuXG5tZXRhZGF0YS5leHAoeyBnZXRPd25NZXRhZGF0YUtleXM6IGZ1bmN0aW9uIGdldE93bk1ldGFkYXRhS2V5cyh0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgcmV0dXJuIG9yZGluYXJ5T3duTWV0YWRhdGFLZXlzKGFuT2JqZWN0KHRhcmdldCksIGFyZ3VtZW50cy5sZW5ndGggPCAyID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1sxXSkpO1xufSB9KTtcbiIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBvcmRpbmFyeUdldE93bk1ldGFkYXRhID0gbWV0YWRhdGEuZ2V0O1xudmFyIHRvTWV0YUtleSA9IG1ldGFkYXRhLmtleTtcblxubWV0YWRhdGEuZXhwKHsgZ2V0T3duTWV0YWRhdGE6IGZ1bmN0aW9uIGdldE93bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgcmV0dXJuIG9yZGluYXJ5R2V0T3duTWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldClcbiAgICAsIGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1syXSkpO1xufSB9KTtcbiIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBnZXRQcm90b3R5cGVPZiA9IHJlcXVpcmUoJy4vX29iamVjdC1ncG8nKTtcbnZhciBvcmRpbmFyeUhhc093bk1ldGFkYXRhID0gbWV0YWRhdGEuaGFzO1xudmFyIHRvTWV0YUtleSA9IG1ldGFkYXRhLmtleTtcblxudmFyIG9yZGluYXJ5SGFzTWV0YWRhdGEgPSBmdW5jdGlvbiAoTWV0YWRhdGFLZXksIE8sIFApIHtcbiAgdmFyIGhhc093biA9IG9yZGluYXJ5SGFzT3duTWV0YWRhdGEoTWV0YWRhdGFLZXksIE8sIFApO1xuICBpZiAoaGFzT3duKSByZXR1cm4gdHJ1ZTtcbiAgdmFyIHBhcmVudCA9IGdldFByb3RvdHlwZU9mKE8pO1xuICByZXR1cm4gcGFyZW50ICE9PSBudWxsID8gb3JkaW5hcnlIYXNNZXRhZGF0YShNZXRhZGF0YUtleSwgcGFyZW50LCBQKSA6IGZhbHNlO1xufTtcblxubWV0YWRhdGEuZXhwKHsgaGFzTWV0YWRhdGE6IGZ1bmN0aW9uIGhhc01ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgcmV0dXJuIG9yZGluYXJ5SGFzTWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldCksIGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1syXSkpO1xufSB9KTtcbiIsInZhciBtZXRhZGF0YSA9IHJlcXVpcmUoJy4vX21ldGFkYXRhJyk7XG52YXIgYW5PYmplY3QgPSByZXF1aXJlKCcuL19hbi1vYmplY3QnKTtcbnZhciBvcmRpbmFyeUhhc093bk1ldGFkYXRhID0gbWV0YWRhdGEuaGFzO1xudmFyIHRvTWV0YUtleSA9IG1ldGFkYXRhLmtleTtcblxubWV0YWRhdGEuZXhwKHsgaGFzT3duTWV0YWRhdGE6IGZ1bmN0aW9uIGhhc093bk1ldGFkYXRhKG1ldGFkYXRhS2V5LCB0YXJnZXQgLyogLCB0YXJnZXRLZXkgKi8pIHtcbiAgcmV0dXJuIG9yZGluYXJ5SGFzT3duTWV0YWRhdGEobWV0YWRhdGFLZXksIGFuT2JqZWN0KHRhcmdldClcbiAgICAsIGFyZ3VtZW50cy5sZW5ndGggPCAzID8gdW5kZWZpbmVkIDogdG9NZXRhS2V5KGFyZ3VtZW50c1syXSkpO1xufSB9KTtcbiIsInZhciAkbWV0YWRhdGEgPSByZXF1aXJlKCcuL19tZXRhZGF0YScpO1xudmFyIGFuT2JqZWN0ID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0Jyk7XG52YXIgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpO1xudmFyIHRvTWV0YUtleSA9ICRtZXRhZGF0YS5rZXk7XG52YXIgb3JkaW5hcnlEZWZpbmVPd25NZXRhZGF0YSA9ICRtZXRhZGF0YS5zZXQ7XG5cbiRtZXRhZGF0YS5leHAoeyBtZXRhZGF0YTogZnVuY3Rpb24gbWV0YWRhdGEobWV0YWRhdGFLZXksIG1ldGFkYXRhVmFsdWUpIHtcbiAgcmV0dXJuIGZ1bmN0aW9uIGRlY29yYXRvcih0YXJnZXQsIHRhcmdldEtleSkge1xuICAgIG9yZGluYXJ5RGVmaW5lT3duTWV0YWRhdGEoXG4gICAgICBtZXRhZGF0YUtleSwgbWV0YWRhdGFWYWx1ZSxcbiAgICAgICh0YXJnZXRLZXkgIT09IHVuZGVmaW5lZCA/IGFuT2JqZWN0IDogYUZ1bmN0aW9uKSh0YXJnZXQpLFxuICAgICAgdG9NZXRhS2V5KHRhcmdldEtleSlcbiAgICApO1xuICB9O1xufSB9KTtcbiIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLXNldC5mcm9tXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1mcm9tJykoJ1NldCcpO1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtc2V0Lm9mXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1vZicpKCdTZXQnKTtcbiIsIi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9EYXZpZEJydWFudC9NYXAtU2V0LnByb3RvdHlwZS50b0pTT05cbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5SLCAnU2V0JywgeyB0b0pTT046IHJlcXVpcmUoJy4vX2NvbGxlY3Rpb24tdG8tanNvbicpKCdTZXQnKSB9KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXRoaWFzYnluZW5zL1N0cmluZy5wcm90b3R5cGUuYXRcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJGF0ID0gcmVxdWlyZSgnLi9fc3RyaW5nLWF0JykodHJ1ZSk7XG52YXIgJGZhaWxzID0gcmVxdWlyZSgnLi9fZmFpbHMnKTtcblxudmFyIEZPUkNFRCA9ICRmYWlscyhmdW5jdGlvbiAoKSB7XG4gIHJldHVybiAn8KCutycuYXQoMCkgIT09ICfwoK63Jztcbn0pO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIEZPUkNFRCwgJ1N0cmluZycsIHtcbiAgYXQ6IGZ1bmN0aW9uIGF0KHBvcykge1xuICAgIHJldHVybiAkYXQodGhpcywgcG9zKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL1N0cmluZy5wcm90b3R5cGUubWF0Y2hBbGwvXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG52YXIgdG9MZW5ndGggPSByZXF1aXJlKCcuL190by1sZW5ndGgnKTtcbnZhciBpc1JlZ0V4cCA9IHJlcXVpcmUoJy4vX2lzLXJlZ2V4cCcpO1xudmFyIGdldEZsYWdzID0gcmVxdWlyZSgnLi9fZmxhZ3MnKTtcbnZhciBSZWdFeHBQcm90byA9IFJlZ0V4cC5wcm90b3R5cGU7XG5cbnZhciAkUmVnRXhwU3RyaW5nSXRlcmF0b3IgPSBmdW5jdGlvbiAocmVnZXhwLCBzdHJpbmcpIHtcbiAgdGhpcy5fciA9IHJlZ2V4cDtcbiAgdGhpcy5fcyA9IHN0cmluZztcbn07XG5cbnJlcXVpcmUoJy4vX2l0ZXItY3JlYXRlJykoJFJlZ0V4cFN0cmluZ0l0ZXJhdG9yLCAnUmVnRXhwIFN0cmluZycsIGZ1bmN0aW9uIG5leHQoKSB7XG4gIHZhciBtYXRjaCA9IHRoaXMuX3IuZXhlYyh0aGlzLl9zKTtcbiAgcmV0dXJuIHsgdmFsdWU6IG1hdGNoLCBkb25lOiBtYXRjaCA9PT0gbnVsbCB9O1xufSk7XG5cbiRleHBvcnQoJGV4cG9ydC5QLCAnU3RyaW5nJywge1xuICBtYXRjaEFsbDogZnVuY3Rpb24gbWF0Y2hBbGwocmVnZXhwKSB7XG4gICAgZGVmaW5lZCh0aGlzKTtcbiAgICBpZiAoIWlzUmVnRXhwKHJlZ2V4cCkpIHRocm93IFR5cGVFcnJvcihyZWdleHAgKyAnIGlzIG5vdCBhIHJlZ2V4cCEnKTtcbiAgICB2YXIgUyA9IFN0cmluZyh0aGlzKTtcbiAgICB2YXIgZmxhZ3MgPSAnZmxhZ3MnIGluIFJlZ0V4cFByb3RvID8gU3RyaW5nKHJlZ2V4cC5mbGFncykgOiBnZXRGbGFncy5jYWxsKHJlZ2V4cCk7XG4gICAgdmFyIHJ4ID0gbmV3IFJlZ0V4cChyZWdleHAuc291cmNlLCB+ZmxhZ3MuaW5kZXhPZignZycpID8gZmxhZ3MgOiAnZycgKyBmbGFncyk7XG4gICAgcngubGFzdEluZGV4ID0gdG9MZW5ndGgocmVnZXhwLmxhc3RJbmRleCk7XG4gICAgcmV0dXJuIG5ldyAkUmVnRXhwU3RyaW5nSXRlcmF0b3IocngsIFMpO1xuICB9XG59KTtcbiIsIid1c2Ugc3RyaWN0Jztcbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90YzM5L3Byb3Bvc2FsLXN0cmluZy1wYWQtc3RhcnQtZW5kXG52YXIgJGV4cG9ydCA9IHJlcXVpcmUoJy4vX2V4cG9ydCcpO1xudmFyICRwYWQgPSByZXF1aXJlKCcuL19zdHJpbmctcGFkJyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi9fdXNlci1hZ2VudCcpO1xuXG4vLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvMjgwXG52YXIgV0VCS0lUX0JVRyA9IC9WZXJzaW9uXFwvMTBcXC5cXGQrKFxcLlxcZCspPyggTW9iaWxlXFwvXFx3Kyk/IFNhZmFyaVxcLy8udGVzdCh1c2VyQWdlbnQpO1xuXG4kZXhwb3J0KCRleHBvcnQuUCArICRleHBvcnQuRiAqIFdFQktJVF9CVUcsICdTdHJpbmcnLCB7XG4gIHBhZEVuZDogZnVuY3Rpb24gcGFkRW5kKG1heExlbmd0aCAvKiAsIGZpbGxTdHJpbmcgPSAnICcgKi8pIHtcbiAgICByZXR1cm4gJHBhZCh0aGlzLCBtYXhMZW5ndGgsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCBmYWxzZSk7XG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RjMzkvcHJvcG9zYWwtc3RyaW5nLXBhZC1zdGFydC1lbmRcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHBhZCA9IHJlcXVpcmUoJy4vX3N0cmluZy1wYWQnKTtcbnZhciB1c2VyQWdlbnQgPSByZXF1aXJlKCcuL191c2VyLWFnZW50Jyk7XG5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS96bG9pcm9jay9jb3JlLWpzL2lzc3Vlcy8yODBcbnZhciBXRUJLSVRfQlVHID0gL1ZlcnNpb25cXC8xMFxcLlxcZCsoXFwuXFxkKyk/KCBNb2JpbGVcXC9cXHcrKT8gU2FmYXJpXFwvLy50ZXN0KHVzZXJBZ2VudCk7XG5cbiRleHBvcnQoJGV4cG9ydC5QICsgJGV4cG9ydC5GICogV0VCS0lUX0JVRywgJ1N0cmluZycsIHtcbiAgcGFkU3RhcnQ6IGZ1bmN0aW9uIHBhZFN0YXJ0KG1heExlbmd0aCAvKiAsIGZpbGxTdHJpbmcgPSAnICcgKi8pIHtcbiAgICByZXR1cm4gJHBhZCh0aGlzLCBtYXhMZW5ndGgsIGFyZ3VtZW50cy5sZW5ndGggPiAxID8gYXJndW1lbnRzWzFdIDogdW5kZWZpbmVkLCB0cnVlKTtcbiAgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG4vLyBodHRwczovL2dpdGh1Yi5jb20vc2VibWFya2JhZ2UvZWNtYXNjcmlwdC1zdHJpbmctbGVmdC1yaWdodC10cmltXG5yZXF1aXJlKCcuL19zdHJpbmctdHJpbScpKCd0cmltTGVmdCcsIGZ1bmN0aW9uICgkdHJpbSkge1xuICByZXR1cm4gZnVuY3Rpb24gdHJpbUxlZnQoKSB7XG4gICAgcmV0dXJuICR0cmltKHRoaXMsIDEpO1xuICB9O1xufSwgJ3RyaW1TdGFydCcpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL3NlYm1hcmtiYWdlL2VjbWFzY3JpcHQtc3RyaW5nLWxlZnQtcmlnaHQtdHJpbVxucmVxdWlyZSgnLi9fc3RyaW5nLXRyaW0nKSgndHJpbVJpZ2h0JywgZnVuY3Rpb24gKCR0cmltKSB7XG4gIHJldHVybiBmdW5jdGlvbiB0cmltUmlnaHQoKSB7XG4gICAgcmV0dXJuICR0cmltKHRoaXMsIDIpO1xuICB9O1xufSwgJ3RyaW1FbmQnKTtcbiIsInJlcXVpcmUoJy4vX3drcy1kZWZpbmUnKSgnYXN5bmNJdGVyYXRvcicpO1xuIiwicmVxdWlyZSgnLi9fd2tzLWRlZmluZScpKCdvYnNlcnZhYmxlJyk7XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdGMzOS9wcm9wb3NhbC1nbG9iYWxcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG5cbiRleHBvcnQoJGV4cG9ydC5TLCAnU3lzdGVtJywgeyBnbG9iYWw6IHJlcXVpcmUoJy4vX2dsb2JhbCcpIH0pO1xuIiwiLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9wcm9wb3NhbC1zZXRtYXAtb2Zmcm9tLyNzZWMtd2Vha21hcC5mcm9tXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1mcm9tJykoJ1dlYWtNYXAnKTtcbiIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLXdlYWttYXAub2ZcbnJlcXVpcmUoJy4vX3NldC1jb2xsZWN0aW9uLW9mJykoJ1dlYWtNYXAnKTtcbiIsIi8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vcHJvcG9zYWwtc2V0bWFwLW9mZnJvbS8jc2VjLXdlYWtzZXQuZnJvbVxucmVxdWlyZSgnLi9fc2V0LWNvbGxlY3Rpb24tZnJvbScpKCdXZWFrU2V0Jyk7XG4iLCIvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL3Byb3Bvc2FsLXNldG1hcC1vZmZyb20vI3NlYy13ZWFrc2V0Lm9mXG5yZXF1aXJlKCcuL19zZXQtY29sbGVjdGlvbi1vZicpKCdXZWFrU2V0Jyk7XG4iLCJ2YXIgJGl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vZXM2LmFycmF5Lml0ZXJhdG9yJyk7XG52YXIgZ2V0S2V5cyA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzJyk7XG52YXIgcmVkZWZpbmUgPSByZXF1aXJlKCcuL19yZWRlZmluZScpO1xudmFyIGdsb2JhbCA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpO1xudmFyIGhpZGUgPSByZXF1aXJlKCcuL19oaWRlJyk7XG52YXIgSXRlcmF0b3JzID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJyk7XG52YXIgd2tzID0gcmVxdWlyZSgnLi9fd2tzJyk7XG52YXIgSVRFUkFUT1IgPSB3a3MoJ2l0ZXJhdG9yJyk7XG52YXIgVE9fU1RSSU5HX1RBRyA9IHdrcygndG9TdHJpbmdUYWcnKTtcbnZhciBBcnJheVZhbHVlcyA9IEl0ZXJhdG9ycy5BcnJheTtcblxudmFyIERPTUl0ZXJhYmxlcyA9IHtcbiAgQ1NTUnVsZUxpc3Q6IHRydWUsIC8vIFRPRE86IE5vdCBzcGVjIGNvbXBsaWFudCwgc2hvdWxkIGJlIGZhbHNlLlxuICBDU1NTdHlsZURlY2xhcmF0aW9uOiBmYWxzZSxcbiAgQ1NTVmFsdWVMaXN0OiBmYWxzZSxcbiAgQ2xpZW50UmVjdExpc3Q6IGZhbHNlLFxuICBET01SZWN0TGlzdDogZmFsc2UsXG4gIERPTVN0cmluZ0xpc3Q6IGZhbHNlLFxuICBET01Ub2tlbkxpc3Q6IHRydWUsXG4gIERhdGFUcmFuc2Zlckl0ZW1MaXN0OiBmYWxzZSxcbiAgRmlsZUxpc3Q6IGZhbHNlLFxuICBIVE1MQWxsQ29sbGVjdGlvbjogZmFsc2UsXG4gIEhUTUxDb2xsZWN0aW9uOiBmYWxzZSxcbiAgSFRNTEZvcm1FbGVtZW50OiBmYWxzZSxcbiAgSFRNTFNlbGVjdEVsZW1lbnQ6IGZhbHNlLFxuICBNZWRpYUxpc3Q6IHRydWUsIC8vIFRPRE86IE5vdCBzcGVjIGNvbXBsaWFudCwgc2hvdWxkIGJlIGZhbHNlLlxuICBNaW1lVHlwZUFycmF5OiBmYWxzZSxcbiAgTmFtZWROb2RlTWFwOiBmYWxzZSxcbiAgTm9kZUxpc3Q6IHRydWUsXG4gIFBhaW50UmVxdWVzdExpc3Q6IGZhbHNlLFxuICBQbHVnaW46IGZhbHNlLFxuICBQbHVnaW5BcnJheTogZmFsc2UsXG4gIFNWR0xlbmd0aExpc3Q6IGZhbHNlLFxuICBTVkdOdW1iZXJMaXN0OiBmYWxzZSxcbiAgU1ZHUGF0aFNlZ0xpc3Q6IGZhbHNlLFxuICBTVkdQb2ludExpc3Q6IGZhbHNlLFxuICBTVkdTdHJpbmdMaXN0OiBmYWxzZSxcbiAgU1ZHVHJhbnNmb3JtTGlzdDogZmFsc2UsXG4gIFNvdXJjZUJ1ZmZlckxpc3Q6IGZhbHNlLFxuICBTdHlsZVNoZWV0TGlzdDogdHJ1ZSwgLy8gVE9ETzogTm90IHNwZWMgY29tcGxpYW50LCBzaG91bGQgYmUgZmFsc2UuXG4gIFRleHRUcmFja0N1ZUxpc3Q6IGZhbHNlLFxuICBUZXh0VHJhY2tMaXN0OiBmYWxzZSxcbiAgVG91Y2hMaXN0OiBmYWxzZVxufTtcblxuZm9yICh2YXIgY29sbGVjdGlvbnMgPSBnZXRLZXlzKERPTUl0ZXJhYmxlcyksIGkgPSAwOyBpIDwgY29sbGVjdGlvbnMubGVuZ3RoOyBpKyspIHtcbiAgdmFyIE5BTUUgPSBjb2xsZWN0aW9uc1tpXTtcbiAgdmFyIGV4cGxpY2l0ID0gRE9NSXRlcmFibGVzW05BTUVdO1xuICB2YXIgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXTtcbiAgdmFyIHByb3RvID0gQ29sbGVjdGlvbiAmJiBDb2xsZWN0aW9uLnByb3RvdHlwZTtcbiAgdmFyIGtleTtcbiAgaWYgKHByb3RvKSB7XG4gICAgaWYgKCFwcm90b1tJVEVSQVRPUl0pIGhpZGUocHJvdG8sIElURVJBVE9SLCBBcnJheVZhbHVlcyk7XG4gICAgaWYgKCFwcm90b1tUT19TVFJJTkdfVEFHXSkgaGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG4gICAgSXRlcmF0b3JzW05BTUVdID0gQXJyYXlWYWx1ZXM7XG4gICAgaWYgKGV4cGxpY2l0KSBmb3IgKGtleSBpbiAkaXRlcmF0b3JzKSBpZiAoIXByb3RvW2tleV0pIHJlZGVmaW5lKHByb3RvLCBrZXksICRpdGVyYXRvcnNba2V5XSwgdHJ1ZSk7XG4gIH1cbn1cbiIsInZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgJHRhc2sgPSByZXF1aXJlKCcuL190YXNrJyk7XG4kZXhwb3J0KCRleHBvcnQuRyArICRleHBvcnQuQiwge1xuICBzZXRJbW1lZGlhdGU6ICR0YXNrLnNldCxcbiAgY2xlYXJJbW1lZGlhdGU6ICR0YXNrLmNsZWFyXG59KTtcbiIsIi8vIGllOS0gc2V0VGltZW91dCAmIHNldEludGVydmFsIGFkZGl0aW9uYWwgcGFyYW1ldGVycyBmaXhcbnZhciBnbG9iYWwgPSByZXF1aXJlKCcuL19nbG9iYWwnKTtcbnZhciAkZXhwb3J0ID0gcmVxdWlyZSgnLi9fZXhwb3J0Jyk7XG52YXIgdXNlckFnZW50ID0gcmVxdWlyZSgnLi9fdXNlci1hZ2VudCcpO1xudmFyIHNsaWNlID0gW10uc2xpY2U7XG52YXIgTVNJRSA9IC9NU0lFIC5cXC4vLnRlc3QodXNlckFnZW50KTsgLy8gPC0gZGlydHkgaWU5LSBjaGVja1xudmFyIHdyYXAgPSBmdW5jdGlvbiAoc2V0KSB7XG4gIHJldHVybiBmdW5jdGlvbiAoZm4sIHRpbWUgLyogLCAuLi5hcmdzICovKSB7XG4gICAgdmFyIGJvdW5kQXJncyA9IGFyZ3VtZW50cy5sZW5ndGggPiAyO1xuICAgIHZhciBhcmdzID0gYm91bmRBcmdzID8gc2xpY2UuY2FsbChhcmd1bWVudHMsIDIpIDogZmFsc2U7XG4gICAgcmV0dXJuIHNldChib3VuZEFyZ3MgPyBmdW5jdGlvbiAoKSB7XG4gICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tbmV3LWZ1bmNcbiAgICAgICh0eXBlb2YgZm4gPT0gJ2Z1bmN0aW9uJyA/IGZuIDogRnVuY3Rpb24oZm4pKS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgICB9IDogZm4sIHRpbWUpO1xuICB9O1xufTtcbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5CICsgJGV4cG9ydC5GICogTVNJRSwge1xuICBzZXRUaW1lb3V0OiB3cmFwKGdsb2JhbC5zZXRUaW1lb3V0KSxcbiAgc2V0SW50ZXJ2YWw6IHdyYXAoZ2xvYmFsLnNldEludGVydmFsKVxufSk7XG4iLCJyZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN5bWJvbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuY3JlYXRlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5kZWZpbmUtcHJvcGVydHknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmRlZmluZS1wcm9wZXJ0aWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5nZXQtb3duLXByb3BlcnR5LWRlc2NyaXB0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmdldC1wcm90b3R5cGUtb2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmtleXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmdldC1vd24tcHJvcGVydHktbmFtZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmZyZWV6ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3Quc2VhbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QucHJldmVudC1leHRlbnNpb25zJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5pcy1mcm96ZW4nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYub2JqZWN0LmlzLXNlYWxlZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuaXMtZXh0ZW5zaWJsZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QuYXNzaWduJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm9iamVjdC5pcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3Quc2V0LXByb3RvdHlwZS1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmZ1bmN0aW9uLmJpbmQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZnVuY3Rpb24ubmFtZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5mdW5jdGlvbi5oYXMtaW5zdGFuY2UnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucGFyc2UtaW50Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnBhcnNlLWZsb2F0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5jb25zdHJ1Y3RvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIudG8tZml4ZWQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLnRvLXByZWNpc2lvbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuZXBzaWxvbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIuaXMtZmluaXRlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5pcy1pbnRlZ2VyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm51bWJlci5pcy1uYW4nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLmlzLXNhZmUtaW50ZWdlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIubWF4LXNhZmUtaW50ZWdlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIubWluLXNhZmUtaW50ZWdlcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5udW1iZXIucGFyc2UtZmxvYXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubnVtYmVyLnBhcnNlLWludCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmFjb3NoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguYXNpbmgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5hdGFuaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmNicnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5jbHozMicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmNvc2gnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5leHBtMScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmZyb3VuZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmh5cG90Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguaW11bCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLmxvZzEwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGgubG9nMXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC5sb2cyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGguc2lnbicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5tYXRoLnNpbmgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYubWF0aC50YW5oJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hdGgudHJ1bmMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmZyb20tY29kZS1wb2ludCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcucmF3Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy50cmltJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuY29kZS1wb2ludC1hdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuZW5kcy13aXRoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5pbmNsdWRlcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcucmVwZWF0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5zdGFydHMtd2l0aCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuYW5jaG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5iaWcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLmJsaW5rJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5ib2xkJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5maXhlZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuZm9udGNvbG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5mb250c2l6ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuaXRhbGljcycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcubGluaycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuc21hbGwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuc3RyaW5nLnN0cmlrZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zdHJpbmcuc3ViJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnN0cmluZy5zdXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZGF0ZS5ub3cnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuZGF0ZS50by1qc29uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmRhdGUudG8taXNvLXN0cmluZycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5kYXRlLnRvLXN0cmluZycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5kYXRlLnRvLXByaW1pdGl2ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5pcy1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5mcm9tJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5Lm9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmpvaW4nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuc2xpY2UnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuc29ydCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5mb3ItZWFjaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5tYXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZmlsdGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LnNvbWUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZXZlcnknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkucmVkdWNlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LnJlZHVjZS1yaWdodCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5pbmRleC1vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5sYXN0LWluZGV4LW9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmNvcHktd2l0aGluJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LmZpbGwnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuZmluZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5hcnJheS5maW5kLWluZGV4Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LmFycmF5LnNwZWNpZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYuYXJyYXkuaXRlcmF0b3InKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLmNvbnN0cnVjdG9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5leGVjJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVnZXhwLmZsYWdzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5tYXRjaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAucmVwbGFjZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWdleHAuc2VhcmNoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZ2V4cC5zcGxpdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5wcm9taXNlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2Lm1hcCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5zZXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYud2Vhay1tYXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYud2Vhay1zZXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQuYXJyYXktYnVmZmVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmRhdGEtdmlldycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC5pbnQ4LWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQ4LWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQ4LWNsYW1wZWQtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQuaW50MTYtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYudHlwZWQudWludDE2LWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmludDMyLWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLnVpbnQzMi1hcnJheScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi50eXBlZC5mbG9hdDMyLWFycmF5Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnR5cGVkLmZsb2F0NjQtYXJyYXknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5hcHBseScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmNvbnN0cnVjdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmRlZmluZS1wcm9wZXJ0eScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmRlbGV0ZS1wcm9wZXJ0eScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmVudW1lcmF0ZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1vd24tcHJvcGVydHktZGVzY3JpcHRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNi5yZWZsZWN0LmdldC1wcm90b3R5cGUtb2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5oYXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5pcy1leHRlbnNpYmxlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM2LnJlZmxlY3Qub3duLWtleXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5wcmV2ZW50LWV4dGVuc2lvbnMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5zZXQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczYucmVmbGVjdC5zZXQtcHJvdG90eXBlLW9mJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LmFycmF5LmluY2x1ZGVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LmFycmF5LmZsYXQtbWFwJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LmFycmF5LmZsYXR0ZW4nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLmF0Jyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN0cmluZy5wYWQtc3RhcnQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLnBhZC1lbmQnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc3RyaW5nLnRyaW0tbGVmdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zdHJpbmcudHJpbS1yaWdodCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zdHJpbmcubWF0Y2gtYWxsJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnN5bWJvbC5hc3luYy1pdGVyYXRvcicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zeW1ib2wub2JzZXJ2YWJsZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QuZ2V0LW93bi1wcm9wZXJ0eS1kZXNjcmlwdG9ycycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYmplY3QudmFsdWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5lbnRyaWVzJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5kZWZpbmUtZ2V0dGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5kZWZpbmUtc2V0dGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5sb29rdXAtZ2V0dGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm9iamVjdC5sb29rdXAtc2V0dGVyJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hcC50by1qc29uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnNldC50by1qc29uJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hcC5vZicpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zZXQub2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcud2Vhay1tYXAub2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcud2Vhay1zZXQub2YnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWFwLmZyb20nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuc2V0LmZyb20nKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcud2Vhay1tYXAuZnJvbScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy53ZWFrLXNldC5mcm9tJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lmdsb2JhbCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5zeXN0ZW0uZ2xvYmFsJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LmVycm9yLmlzLWVycm9yJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGguY2xhbXAnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5kZWctcGVyLXJhZCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLmRlZ3JlZXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5mc2NhbGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5pYWRkaCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLmlzdWJoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGguaW11bGgnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5yYWQtcGVyLWRlZycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLnJhZGlhbnMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcubWF0aC5zY2FsZScpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5tYXRoLnVtdWxoJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3Lm1hdGguc2lnbmJpdCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5wcm9taXNlLmZpbmFsbHknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucHJvbWlzZS50cnknKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5kZWZpbmUtbWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5kZWxldGUtbWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtbWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtbWV0YWRhdGEta2V5cycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5yZWZsZWN0LmdldC1vd24tbWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5nZXQtb3duLW1ldGFkYXRhLWtleXMnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5oYXMtbWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcucmVmbGVjdC5oYXMtb3duLW1ldGFkYXRhJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvZXM3LnJlZmxlY3QubWV0YWRhdGEnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy9lczcuYXNhcCcpO1xucmVxdWlyZSgnLi9tb2R1bGVzL2VzNy5vYnNlcnZhYmxlJyk7XG5yZXF1aXJlKCcuL21vZHVsZXMvd2ViLnRpbWVycycpO1xucmVxdWlyZSgnLi9tb2R1bGVzL3dlYi5pbW1lZGlhdGUnKTtcbnJlcXVpcmUoJy4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbW9kdWxlcy9fY29yZScpO1xuIiwibW9kdWxlLmV4cG9ydHM9e1xuICAgIFwicnVcIjoge1xuICAgICAgICBcIm5hbWVcIjogXCLRgNGD0YHRgdC60LjQuVwiXG4gICAgfSxcbiAgICBcInJ1LVJVXCI6IHtcbiAgICAgICAgXCJuYW1lXCI6IFwi0YDRg9GB0YHQutC40LlcIlxuICAgIH0sXG4gICAgXCJhclwiOiB7XG4gICAgICAgIFwibmFtZVwiOiBcIlwiXG4gICAgfSxcbiAgICBcImhlXCI6IHtcbiAgICAgICAgXCJuYW1lXCI6IFwiXCJcbiAgICB9LFxuICAgIFwiemgtSGFuc1wiOiB7XG4gICAgICAgIFwibmFtZVwiOiBcIuS4reaWhyjnroDkvZMpXCJcbiAgICB9LFxuICAgIFwiemgtQ05cIjoge1xuICAgICAgICBcIm5hbWVcIjogXCLkuK3mloco566A5L2TKVwiXG4gICAgfSxcbiAgICBcInpoLVNHXCI6IHtcbiAgICAgICAgXCJuYW1lXCI6IFwi5Lit5paHKOeugOS9kylcIlxuICAgIH0sXG4gICAgXCJ6aC1IYW50XCI6IHtcbiAgICAgICAgXCJuYW1lXCI6IFwi5Lit5paHKOe5gemrlClcIlxuICAgIH0sXG4gICAgXCJ6aC1IS1wiOiB7XG4gICAgICAgIFwibmFtZVwiOiBcIuS4reaWhyjnuYHpq5QpXCJcbiAgICB9LFxuICAgIFwiemgtTU9cIjoge1xuICAgICAgICBcIm5hbWVcIjogXCLkuK3mloco57mB6auUKVwiXG4gICAgfSxcbiAgICBcInpoLVRXXCI6IHtcbiAgICAgICAgXCJuYW1lXCI6IFwi5Lit5paHKOe5gemrlClcIlxuICAgIH0sXG4gICAgXCJqYVwiOiB7XG4gICAgICAgIFwibmFtZVwiOiBcIuaXpeacrOiqnlwiXG4gICAgfSxcbiAgICBcImphLUpQXCI6IHtcbiAgICAgICAgXCJuYW1lXCI6IFwi5pel5pys6KqeXCJcbiAgICB9LFxuICAgIFwidGFcIjoge1xuICAgICAgICBcIm5hbWVcIjogXCLgrq7gr4bgrr7grrTgrr9cIlxuICAgIH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzPXtcbiAgICBcImFkdmFudGFnZVwiOiB7IFwiZW5hYmxlZFwiOiB0cnVlLCBcInRlc3RhYmxlXCI6IHRydWUgfSxcbiAgICBcImF1dG9jb21wbGV0ZVwiOiB7IFwiZW5hYmxlZFwiOiB0cnVlLCBcInRlc3RhYmxlXCI6IHRydWUgfSxcbiAgICBcInJlZGlzLWNhY2hlXCI6IHtcbiAgICAgICAgXCJlbmFibGVkXCI6IHRydWUsXG4gICAgICAgIFwiX2NvbW1lbnRcIjogXCJ0aGlzIGZlYXR1cmUgY2Fubm90IGJlIHRlc3RhYmxlLCBhbmQgY2Fubm90IHVzZSB0aGUgZmVhdHVyZU1hbmFnZXJcIlxuICAgIH0sXG4gICAgXCJjb250ZW50LWhvbGRzXCI6IHsgXCJlbmFibGVkXCI6IHRydWUsIFwidGVzdGFibGVcIjogdHJ1ZSB9LFxuICAgIFwiYmFja1RvTWFpbkNvbGxlY3Rpb25MaW5rXCI6IHsgXCJlbmFibGVkXCI6IHRydWUsIFwidGVzdGFibGVcIjogdHJ1ZSB9LFxuICAgIFwibGliYnlUb3V0XCI6IHsgXCJlbmFibGVkXCI6IHRydWUsIFwidGVzdGFibGVcIjogdHJ1ZSB9LFxuICAgIFwicHJvbW90ZUxpYmJ5XCI6IHsgXCJlbmFibGVkXCI6IHRydWUsIFwidGVzdGFibGVcIjogdHJ1ZSB9LFxuICAgIFwic3dpdGNoVG9MaWJieVwiOiB7IFwiZW5hYmxlZFwiOiB0cnVlLCBcInRlc3RhYmxlXCI6IHRydWUgfSxcbiAgICBcInJlYWRpbmdIaXN0b3J5XCI6IHtcbiAgICAgICAgXCJlbmFibGVkXCI6IHRydWUsXG4gICAgICAgIFwidGVzdGFibGVcIjogdHJ1ZSxcbiAgICAgICAgXCJfY29tbWVudFwiOiBcIkxIVE5HLTE4MDlcIlxuICAgIH0sXG4gICAgXCJhdG9zTGV2ZWxzXCI6IHsgXCJlbmFibGVkXCI6IHRydWUsIFwidGVzdGFibGVcIjogdHJ1ZSB9LFxuICAgIFwibGV4aWxlU2NvcmVzXCI6IHsgXCJlbmFibGVkXCI6IHRydWUsIFwidGVzdGFibGVcIjogdHJ1ZSB9LFxuICAgIFwiZ3JhZGVMZXZlbHNcIjogeyBcImVuYWJsZWRcIjogdHJ1ZSwgXCJ0ZXN0YWJsZVwiOiB0cnVlIH0sXG4gICAgXCJpbnRlcmVzdExldmVsc1wiOiB7IFwiZW5hYmxlZFwiOiB0cnVlLCBcInRlc3RhYmxlXCI6IHRydWUgfSxcbiAgICBcImJhbm5lcklzU2Vjb25kYXJ5Q29sb3JcIjoge1xuICAgICAgICBcImVuYWJsZWRcIjogdHJ1ZSxcbiAgICAgICAgXCJ0ZXN0YWJsZVwiOiB0cnVlLFxuICAgICAgICBcIl9jb21tZW50XCI6IFwidGhpcyBmZWF0dXJlIG1ha2VzIHRoZSBiYW5uZXIgdGhlIHNlY29uZGFyeSBjb2xvciBhbmQgdGhlIHRvYXN0IGRhcmtlclwiXG4gICAgfSxcbiAgICBcImtpbmRsZUZvb3RlclwiOiB7XG4gICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICBcInRlc3RhYmxlXCI6IHRydWUsXG4gICAgICAgIFwiX2NvbW1lbnRcIjogXCJMSFRORy0yMzE1IC0ga2luZGxlIGZvb3RlclwiXG4gICAgfSxcbiAgICBcImtpbmRsZU5hdlwiOiB7XG4gICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICBcInRlc3RhYmxlXCI6IHRydWUsXG4gICAgICAgIFwiX2NvbW1lbnRcIjogXCJMSFRORy0yMzE1IC0ga2luZGxlIG5hdiBwcm9tb3Rpb25cIlxuICAgIH0sXG4gICAgXCJraW5kbGVMb2FuRm9ybWF0TGltaXRcIjoge1xuICAgICAgICBcImVuYWJsZWRcIjogdHJ1ZSxcbiAgICAgICAgXCJ0ZXN0YWJsZVwiOiB0cnVlLFxuICAgICAgICBcIl9jb21tZW50XCI6IFwiTEhUTkctMjMxNSAtIGtpbmRsZSBsb2FucyBmb3JtYXQgbGltaXRcIlxuICAgIH0sXG4gICAgXCJraW5kbGVTZWFyY2hPZmZlclwiOiB7XG4gICAgICAgIFwiZW5hYmxlZFwiOiB0cnVlLFxuICAgICAgICBcInRlc3RhYmxlXCI6IHRydWUsXG4gICAgICAgIFwiX2NvbW1lbnRcIjogXCJMSFRORy0yMzE1IC0gb2ZmZXIgdG8gc2V0IGZyb20gc2VhcmNoXCJcbiAgICB9LFxuICAgIFwia2luZGxlTG9hbk9mZmVyXCI6IHtcbiAgICAgICAgXCJlbmFibGVkXCI6IHRydWUsXG4gICAgICAgIFwidGVzdGFibGVcIjogdHJ1ZSxcbiAgICAgICAgXCJfY29tbWVudFwiOiBcIkxIVE5HLTIzMTUgLSBvZmZlciB0byBzZXQgZnJvbSBmdWxmaWxsXCJcbiAgICB9LFxuICAgIFwiZ2V0QUNhcmRcIjoge1xuICAgICAgICBcImVuYWJsZWRcIjogdHJ1ZSxcbiAgICAgICAgXCJ0ZXN0YWJsZVwiOiB0cnVlLFxuICAgICAgICBcIl9jb21tZW50XCI6IFwiTEhUTkctMjQ3OSAtIGdldCBhIGNhcmQgcHJvbW90aW9uIG1vZGFsXCJcbiAgICB9LFxuICAgIFwiZW5oYW5jZWRMaWJieVByb21vXCI6IHsgXCJlbmFibGVkXCI6IHRydWUsIFwidGVzdGFibGVcIjogdHJ1ZSB9LFxuICAgIFwic2hvd0xpYmJ5SW50ZXJjZXB0XCI6IHsgXCJlbmFibGVkXCI6IGZhbHNlLCBcInRlc3RhYmxlXCI6IHRydWUgfSxcbiAgICBcImVuaGFuY2VkU2VyaWVzXCI6IHsgXCJlbmFibGVkXCI6IGZhbHNlLCBcInRlc3RhYmxlXCI6IHRydWUgfSxcbiAgICBcInNhbXBsZU9ubHlNb2RlXCI6IHsgXCJlbmFibGVkXCI6IHRydWUsIFwidGVzdGFibGVcIjogdHJ1ZSB9LFxuICAgIFwicmVjaXByb2NhbExlbmRpbmdcIjogeyBcImVuYWJsZWRcIjogdHJ1ZSwgXCJ0ZXN0YWJsZVwiOiB0cnVlIH0sXG4gICAgXCJMSFRORy0yODYzXCI6IHsgXCJlbmFibGVkXCI6IGZhbHNlLCBcInRlc3RhYmxlXCI6IHRydWUgfSxcbiAgICBcImRpc2FibGVPZEFwcEFjY2Vzc1wiOiB7IFwiZW5hYmxlZFwiOiBmYWxzZSwgXCJ0ZXN0YWJsZVwiOiB0cnVlIH1cbn1cbiIsIm1vZHVsZS5leHBvcnRzPXtcbiAgICBcImNvZGVzXCI6IFtcbiAgICAgICAgXCJCSFwiLFxuICAgICAgICBcIkNZXCIsXG4gICAgICAgIFwiRUdcIixcbiAgICAgICAgXCJJUVwiLFxuICAgICAgICBcIklSXCIsXG4gICAgICAgIFwiSUxcIixcbiAgICAgICAgXCJKT1wiLFxuICAgICAgICBcIktXXCIsXG4gICAgICAgIFwiTEJcIixcbiAgICAgICAgXCJPTVwiLFxuICAgICAgICBcIlBTXCIsXG4gICAgICAgIFwiUUFcIixcbiAgICAgICAgXCJTQVwiLFxuICAgICAgICBcIlNZXCIsXG4gICAgICAgIFwiS1dcIixcbiAgICAgICAgXCJMWVwiLFxuICAgICAgICBcIk1SXCIsXG4gICAgICAgIFwiTUFcIixcbiAgICAgICAgXCJTRFwiLFxuICAgICAgICBcIlROXCIsXG4gICAgICAgIFwiVFJcIixcbiAgICAgICAgXCJBRVwiLFxuICAgICAgICBcIllFXCJcbiAgICBdXG59XG4iLCJtb2R1bGUuZXhwb3J0cz17XG4gICAgXCIyMzdcIjogeyBcInVybFwiOiBcImh0dHA6Ly9wcmluY2V3aWxsaWFtLW5nLmxpYnJhcnlyZXNlcnZlLmNvbS9cIiB9LFxuICAgIFwiMTAwNTAxXCI6IHsgXCJ1cmxcIjogXCJodHRwOi8vcWFpbnRlZ3JhdGlvbi1uZy5saWJyYXJ5cmVzZXJ2ZS5jb20vXCIgfVxufVxuIiwibW9kdWxlLmV4cG9ydHM9e1xuICAgIFwic3VwcG9ydGVkTGFuZ3VhZ2VzXCI6IFtcbiAgICAgICAge1xuICAgICAgICAgICAgXCJsYW5ndWFnZUNvZGVzXCI6IFtcbiAgICAgICAgICAgICAgICBcImVuXCIsXG4gICAgICAgICAgICAgICAgXCJlbi0wMjlcIixcbiAgICAgICAgICAgICAgICBcImVuLUFVXCIsXG4gICAgICAgICAgICAgICAgXCJlbi1CWlwiLFxuICAgICAgICAgICAgICAgIFwiZW4tQ0FcIixcbiAgICAgICAgICAgICAgICBcImVuLUdCXCIsXG4gICAgICAgICAgICAgICAgXCJlbi1JRVwiLFxuICAgICAgICAgICAgICAgIFwiZW4tSU5cIixcbiAgICAgICAgICAgICAgICBcImVuLUpNXCIsXG4gICAgICAgICAgICAgICAgXCJlbi1NWVwiLFxuICAgICAgICAgICAgICAgIFwiZW4tTlpcIixcbiAgICAgICAgICAgICAgICBcImVuLVBIXCIsXG4gICAgICAgICAgICAgICAgXCJlbi1TR1wiLFxuICAgICAgICAgICAgICAgIFwiZW4tVFRcIixcbiAgICAgICAgICAgICAgICBcImVuLVVTXCIsXG4gICAgICAgICAgICAgICAgXCJlbi1aQVwiLFxuICAgICAgICAgICAgICAgIFwiZW4tWldcIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZGVmYXVsdExhbmd1YWdlQ29kZVwiOiBcImVuXCIsXG4gICAgICAgICAgICBcIm5hdGl2ZURpc3BsYXlOYW1lXCI6IFwiRW5nbGlzaFwiLFxuICAgICAgICAgICAgXCJkaXNwbGF5TmFtZVwiOiBcIkVuZ2xpc2hcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImxhbmd1YWdlQ29kZXNcIjogW1xuICAgICAgICAgICAgICAgIFwiZXNcIixcbiAgICAgICAgICAgICAgICBcImVzLUFSXCIsXG4gICAgICAgICAgICAgICAgXCJlcy1CT1wiLFxuICAgICAgICAgICAgICAgIFwiZXMtQ0xcIixcbiAgICAgICAgICAgICAgICBcImVzLUNPXCIsXG4gICAgICAgICAgICAgICAgXCJlcy1DUlwiLFxuICAgICAgICAgICAgICAgIFwiZXMtRE9cIixcbiAgICAgICAgICAgICAgICBcImVzLUVDXCIsXG4gICAgICAgICAgICAgICAgXCJlcy1FU1wiLFxuICAgICAgICAgICAgICAgIFwiZXMtR1RcIixcbiAgICAgICAgICAgICAgICBcImVzLUhOXCIsXG4gICAgICAgICAgICAgICAgXCJlcy1NWFwiLFxuICAgICAgICAgICAgICAgIFwiZXMtTklcIixcbiAgICAgICAgICAgICAgICBcImVzLVBBXCIsXG4gICAgICAgICAgICAgICAgXCJlcy1QRVwiLFxuICAgICAgICAgICAgICAgIFwiZXMtUFJcIixcbiAgICAgICAgICAgICAgICBcImVzLVBZXCIsXG4gICAgICAgICAgICAgICAgXCJlcy1TVlwiLFxuICAgICAgICAgICAgICAgIFwiZXMtVVNcIixcbiAgICAgICAgICAgICAgICBcImVzLVVZXCIsXG4gICAgICAgICAgICAgICAgXCJlcy1WRVwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJkZWZhdWx0TGFuZ3VhZ2VDb2RlXCI6IFwiZXNcIixcbiAgICAgICAgICAgIFwibmF0aXZlRGlzcGxheU5hbWVcIjogXCJFc3Bhw7FvbFwiLFxuICAgICAgICAgICAgXCJkaXNwbGF5TmFtZVwiOiBcIlNwYW5pc2hcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImxhbmd1YWdlQ29kZXNcIjogW1xuICAgICAgICAgICAgICAgIFwiZnItQ0FcIixcbiAgICAgICAgICAgICAgICBcImZyXCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImRlZmF1bHRMYW5ndWFnZUNvZGVcIjogXCJmci1DQVwiLFxuICAgICAgICAgICAgXCJuYXRpdmVEaXNwbGF5TmFtZVwiOiBcIkZyYW7Dp2FpcyAoQ2FuYWRhKVwiLFxuICAgICAgICAgICAgXCJkaXNwbGF5TmFtZVwiOiBcIkZyZW5jaCAoQ2FuYWRpYW4pXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJsYW5ndWFnZUNvZGVzXCI6IFtcbiAgICAgICAgICAgICAgICBcInpoLUNOXCIsXG4gICAgICAgICAgICAgICAgXCJ6aC1IYW5zXCIsXG4gICAgICAgICAgICAgICAgXCJ6aC1TR1wiLFxuICAgICAgICAgICAgICAgIFwiemhcIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZGVmYXVsdExhbmd1YWdlQ29kZVwiOiBcInpoLUhhbnNcIixcbiAgICAgICAgICAgIFwibmF0aXZlRGlzcGxheU5hbWVcIjogXCLkuK3mloco566A5L2TKVwiLFxuICAgICAgICAgICAgXCJkaXNwbGF5TmFtZVwiOiBcIkNoaW5lc2UgKFNpbXBsaWZpZWQpXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJsYW5ndWFnZUNvZGVzXCI6IFtcbiAgICAgICAgICAgICAgICBcInpoLUhhbnRcIixcbiAgICAgICAgICAgICAgICBcInpoLUhLXCIsXG4gICAgICAgICAgICAgICAgXCJ6aC1NT1wiLFxuICAgICAgICAgICAgICAgIFwiemgtVFdcIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZGVmYXVsdExhbmd1YWdlQ29kZVwiOiBcInpoLUhhbnRcIixcbiAgICAgICAgICAgIFwibmF0aXZlRGlzcGxheU5hbWVcIjogXCLkuK3mloco57mB6auUKVwiLFxuICAgICAgICAgICAgXCJkaXNwbGF5TmFtZVwiOiBcIkNoaW5lc2UgKFRyYWRpdGlvbmFsKVwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibGFuZ3VhZ2VDb2Rlc1wiOiBbXG4gICAgICAgICAgICAgICAgXCJqYVwiLFxuICAgICAgICAgICAgICAgIFwiamEtSlBcIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZGVmYXVsdExhbmd1YWdlQ29kZVwiOiBcImphXCIsXG4gICAgICAgICAgICBcIm5hdGl2ZURpc3BsYXlOYW1lXCI6IFwi5pel5pys6KqeXCIsXG4gICAgICAgICAgICBcImRpc3BsYXlOYW1lXCI6IFwiSmFwYW5lc2VcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImxhbmd1YWdlQ29kZXNcIjogW1xuICAgICAgICAgICAgICAgIFwibXNcIixcbiAgICAgICAgICAgICAgICBcIm1zLUJOXCIsXG4gICAgICAgICAgICAgICAgXCJtcy1NWVwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJkZWZhdWx0TGFuZ3VhZ2VDb2RlXCI6IFwibXNcIixcbiAgICAgICAgICAgIFwibmF0aXZlRGlzcGxheU5hbWVcIjogXCJCYWhhc2EgTWVsYXl1XCIsXG4gICAgICAgICAgICBcImRpc3BsYXlOYW1lXCI6IFwiTWFsYXlcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImxhbmd1YWdlQ29kZXNcIjogW1xuICAgICAgICAgICAgICAgIFwicnVcIixcbiAgICAgICAgICAgICAgICBcInJ1LVJVXCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImRlZmF1bHRMYW5ndWFnZUNvZGVcIjogXCJydVwiLFxuICAgICAgICAgICAgXCJuYXRpdmVEaXNwbGF5TmFtZVwiOiBcItCg0YPRgdGB0LrQuNC5XCIsXG4gICAgICAgICAgICBcImRpc3BsYXlOYW1lXCI6IFwiUnVzc2lhblwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibGFuZ3VhZ2VDb2Rlc1wiOiBbXG4gICAgICAgICAgICAgICAgXCJzdlwiLFxuICAgICAgICAgICAgICAgIFwic3YtRklcIixcbiAgICAgICAgICAgICAgICBcInN2LVNFXCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImRlZmF1bHRMYW5ndWFnZUNvZGVcIjogXCJzdlwiLFxuICAgICAgICAgICAgXCJuYXRpdmVEaXNwbGF5TmFtZVwiOiBcIlN2ZW5za2FcIixcbiAgICAgICAgICAgIFwiZGlzcGxheU5hbWVcIjogXCJTd2VkaXNoXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJsYW5ndWFnZUNvZGVzXCI6IFtcbiAgICAgICAgICAgICAgICBcImZpXCIsXG4gICAgICAgICAgICAgICAgXCJmaS1GSVwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJkZWZhdWx0TGFuZ3VhZ2VDb2RlXCI6IFwiZmlcIixcbiAgICAgICAgICAgIFwibmF0aXZlRGlzcGxheU5hbWVcIjogXCJTdW9taVwiLFxuICAgICAgICAgICAgXCJkaXNwbGF5TmFtZVwiOiBcIkZpbm5pc2hcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImxhbmd1YWdlQ29kZXNcIjogW1xuICAgICAgICAgICAgICAgIFwiaXRcIixcbiAgICAgICAgICAgICAgICBcIml0LUNIXCIsXG4gICAgICAgICAgICAgICAgXCJpdC1JVFwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJkZWZhdWx0TGFuZ3VhZ2VDb2RlXCI6IFwiaXRcIixcbiAgICAgICAgICAgIFwibmF0aXZlRGlzcGxheU5hbWVcIjogXCJJdGFsaWFub1wiLFxuICAgICAgICAgICAgXCJkaXNwbGF5TmFtZVwiOiBcIkl0YWxpYW5cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImxhbmd1YWdlQ29kZXNcIjogW1xuICAgICAgICAgICAgICAgIFwiZGVcIixcbiAgICAgICAgICAgICAgICBcImRlLUFUXCIsXG4gICAgICAgICAgICAgICAgXCJkZS1DSFwiLFxuICAgICAgICAgICAgICAgIFwiZGUtREVcIixcbiAgICAgICAgICAgICAgICBcImRlLUxJXCIsXG4gICAgICAgICAgICAgICAgXCJkZS1MVVwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJkZWZhdWx0TGFuZ3VhZ2VDb2RlXCI6IFwiZGVcIixcbiAgICAgICAgICAgIFwibmF0aXZlRGlzcGxheU5hbWVcIjogXCJEZXV0c2NoXCIsXG4gICAgICAgICAgICBcImRpc3BsYXlOYW1lXCI6IFwiR2VybWFuXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJsYW5ndWFnZUNvZGVzXCI6IFtcbiAgICAgICAgICAgICAgICBcImRhXCIsXG4gICAgICAgICAgICAgICAgXCJkYS1ES1wiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJkZWZhdWx0TGFuZ3VhZ2VDb2RlXCI6IFwiZGFcIixcbiAgICAgICAgICAgIFwibmF0aXZlRGlzcGxheU5hbWVcIjogXCJEYW5za1wiLFxuICAgICAgICAgICAgXCJkaXNwbGF5TmFtZVwiOiBcIkRhbmlzaFwiXG4gICAgICAgIH0sXG4gICAgICAgIHtcbiAgICAgICAgICAgIFwibGFuZ3VhZ2VDb2Rlc1wiOiBbXG4gICAgICAgICAgICAgICAgXCJ0clwiLFxuICAgICAgICAgICAgICAgIFwidHItVFJcIlxuICAgICAgICAgICAgXSxcbiAgICAgICAgICAgIFwiZGVmYXVsdExhbmd1YWdlQ29kZVwiOiBcInRyXCIsXG4gICAgICAgICAgICBcIm5hdGl2ZURpc3BsYXlOYW1lXCI6IFwiVMO8cmvDp2VcIixcbiAgICAgICAgICAgIFwiZGlzcGxheU5hbWVcIjogXCJUdXJraXNoXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJsYW5ndWFnZUNvZGVzXCI6IFtcbiAgICAgICAgICAgICAgICBcImtvXCIsXG4gICAgICAgICAgICAgICAgXCJrby1LUlwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJkZWZhdWx0TGFuZ3VhZ2VDb2RlXCI6IFwia29cIixcbiAgICAgICAgICAgIFwibmF0aXZlRGlzcGxheU5hbWVcIjogXCLtlZzqta3slrRcIixcbiAgICAgICAgICAgIFwiZGlzcGxheU5hbWVcIjogXCJLb3JlYW5cIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImxhbmd1YWdlQ29kZXNcIjogW1xuICAgICAgICAgICAgICAgIFwibmxcIixcbiAgICAgICAgICAgICAgICBcIm5sLUJFXCIsXG4gICAgICAgICAgICAgICAgXCJubC1OTFwiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJkZWZhdWx0TGFuZ3VhZ2VDb2RlXCI6IFwibmxcIixcbiAgICAgICAgICAgIFwibmF0aXZlRGlzcGxheU5hbWVcIjogXCJOZWRlcmxhbmRzXCIsXG4gICAgICAgICAgICBcImRpc3BsYXlOYW1lXCI6IFwiRHV0Y2hcIlxuICAgICAgICB9LFxuICAgICAgICB7XG4gICAgICAgICAgICBcImxhbmd1YWdlQ29kZXNcIjogW1xuICAgICAgICAgICAgICAgIFwidGFcIixcbiAgICAgICAgICAgICAgICBcInRhLUlOXCJcbiAgICAgICAgICAgIF0sXG4gICAgICAgICAgICBcImRlZmF1bHRMYW5ndWFnZUNvZGVcIjogXCJ0YVwiLFxuICAgICAgICAgICAgXCJuYXRpdmVEaXNwbGF5TmFtZVwiOiBcIuCupOCuruCuv+CutOCvjVwiLFxuICAgICAgICAgICAgXCJkaXNwbGF5TmFtZVwiOiBcIlRhbWlsXCJcbiAgICAgICAgfSxcbiAgICAgICAge1xuICAgICAgICAgICAgXCJsYW5ndWFnZUNvZGVzXCI6IFtcbiAgICAgICAgICAgICAgICBcImlzXCIsXG4gICAgICAgICAgICAgICAgXCJpcy1JU1wiXG4gICAgICAgICAgICBdLFxuICAgICAgICAgICAgXCJkZWZhdWx0TGFuZ3VhZ2VDb2RlXCI6IFwiaXNcIixcbiAgICAgICAgICAgIFwibmF0aXZlRGlzcGxheU5hbWVcIjogXCLDjXNsZW5za2FcIixcbiAgICAgICAgICAgIFwiZGlzcGxheU5hbWVcIjogXCJJY2VsYW5kaWNcIlxuICAgICAgICB9XG4gICAgXVxufVxuIiwiJ3VzZSBzdHJpY3QnO1xuY29uc3QgXyA9IHJlcXVpcmUoJ3VuZGVyc2NvcmUnKTtcblxuY2xhc3MgQWNjb3VudExpbWl0cyB7XG4gICAgY29uc3RydWN0b3IocHJvcHMpIHtcbiAgICAgICAgdGhpcy5sb2Fuc0xpbWl0ID0gMDtcbiAgICAgICAgdGhpcy5sb2Fuc0NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5ob2xkc0xpbWl0ID0gMDtcbiAgICAgICAgdGhpcy5ob2xkc0NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5yZW5ld2FsRGF5TGltaXQgPSAzO1xuICAgICAgICAvLyBUaGlzIGlzIGFuIGFjY2VwdGVkIGNvbnN0YW50IHZhbHVlLCBidXQgaXQgbm90IHByb3ZpZGVkIHZpYSB0aGUgdGh1bmRlciBpbnRlcmZhY2UgYXQgdGhpcyB0aW1lIC0gZXR1bmc6MjAxNjExMjNcbiAgICAgICAgdGhpcy53aXNobGlzdExpbWl0ID0gNTAwMDtcbiAgICAgICAgdGhpcy53aXNobGlzdENvdW50ID0gMDtcbiAgICAgICAgdGhpcy50b3RhbEl0ZW1zQ291bnRlZFRvd2FyZHNDaGVja291dExpbWl0ID0gMDtcblxuICAgICAgICBfLmV4dGVuZCh0aGlzLCBwcm9wcyk7XG4gICAgfVxuXG4gICAgZ2V0IGxvYW5zUmVtYWluaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2Fuc0xpbWl0IC0gdGhpcy50b3RhbEl0ZW1zQ291bnRlZFRvd2FyZHNDaGVja291dExpbWl0O1xuICAgIH1cblxuICAgIGdldCBob2xkc1JlbWFpbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaG9sZHNMaW1pdCAtIHRoaXMuaG9sZHNDb3VudDtcbiAgICB9XG5cbiAgICBnZXQgd2lzaGxpc3RSZW1haW5pbmcoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndpc2hsaXN0TGltaXQgLSB0aGlzLndpc2hsaXN0Q291bnQ7XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlRnJvbVRodW5kZXIoY2FyZCwgbG9hbnMsIGhvbGRzLCB3aXNobGlzdCkge1xuICAgICAgICBsZXQgYWNjb3VudExpbWl0cyA9IG5ldyBBY2NvdW50TGltaXRzKCk7XG5cbiAgICAgICAgYWNjb3VudExpbWl0cy5ob2xkc0NvdW50ID0gaG9sZHMudG90YWxJdGVtcztcbiAgICAgICAgYWNjb3VudExpbWl0cy5ob2xkc0xpbWl0ID0gY2FyZC5ob2xkTGltaXQ7XG5cbiAgICAgICAgYWNjb3VudExpbWl0cy5sb2Fuc0NvdW50ID0gbG9hbnMudG90YWxJdGVtcztcbiAgICAgICAgYWNjb3VudExpbWl0cy50b3RhbEl0ZW1zQ291bnRlZFRvd2FyZHNDaGVja291dExpbWl0ID1cbiAgICAgICAgICAgIGxvYW5zLnRvdGFsSXRlbXNDb3VudGVkVG93YXJkc0NoZWNrb3V0TGltaXQ7XG5cbiAgICAgICAgaWYgKGNhcmQuY2hlY2tvdXRMaW1pdHNCeU1lZGlhVHlwZSkge1xuICAgICAgICAgICAgdmFyIGMgPSBjYXJkLmNoZWNrb3V0TGltaXRzQnlNZWRpYVR5cGU7XG4gICAgICAgICAgICBhY2NvdW50TGltaXRzLmxvYW5zTGltaXQgPVxuICAgICAgICAgICAgICAgIGMuZWJvb2sgfHwgYy5hdWRpb2Jvb2sgfHwgYy52aWRlbyB8fCBhY2NvdW50TGltaXRzLmxvYW5zTGltaXQ7XG4gICAgICAgIH1cblxuICAgICAgICBhY2NvdW50TGltaXRzLndpc2hsaXN0Q291bnQgPSB3aXNobGlzdC50b3RhbEl0ZW1zO1xuICAgICAgICByZXR1cm4gYWNjb3VudExpbWl0cztcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gQWNjb3VudExpbWl0cztcbiIsInZhciBfID0gcmVxdWlyZSgndW5kZXJzY29yZScpO1xuY29uc3Qgc2VtdmVyID0gcmVxdWlyZSgnc2VtdmVyJyk7XG5cbi8vIFZpZXcgbW9kZWwgZm9yIGxvYW5zIHBhZ2UuICBJJ20gbm90IHJlYWxseSBzdXJlIHdoZXJlIHRoaXMgYmVsb25ncyBpbiBvdXIgcHJvamVjdCBzdHJ1Y3R1cmUuICBBIGdvb2QgbmFtZSBhbHNvIGVsdWRlcyBtZS5cbi8vXG4vLyBJIHRyaWVkIHB1dHRpbmcgdGhpcyBsb2dpYyBpbiB0aGUgc3dpZyBhbmQgcmFuIGludG8gc29tZSBmcnVzdHJhdGluZyBsaW1pdGF0aW9ucy5cblxuXG5jbGFzcyBMb2FuVGl0bGUge1xuICAgIGNvbnN0cnVjdG9yKHRpdGxlLCBsaW1pdERpc3BsYXlGb3JtYXRzLCBwcmVmZXJLaW5kbGUsIGlzSW5PREFwcCwgaXNNYWMsIG1hY09zQXVkaW9Eb3dubG9hZHNEaXNhYmxlZCwgbWFjT1NBdWRpb0Rvd25sb2FkUmVlbmFibGVkUHJlQ2F0YWxpbmEsXG4gICAgICAgIGlzUHJlQ2F0YWxpbmFNYWMsIHJlc3RyaWN0VmlkZW8sIGhpZGVEaXNhYmxlZEZvcm1hdHMsIG9kQXBwU3Vuc2V0LCBmaXhNYWdhemluZURpc3BsYXksIG9kcmVhZEZ1bGZpbGxtZW50Rmlyc3QpIHtcbiAgICAgICAgdGhpcy5saW1pdERpc3BsYXlGb3JtYXRzID0gbGltaXREaXNwbGF5Rm9ybWF0cztcbiAgICAgICAgdGhpcy5wcmVmZXJLaW5kbGUgPSBwcmVmZXJLaW5kbGU7XG4gICAgICAgIHRoaXMuaXNJbk9EQXBwID0gaXNJbk9EQXBwO1xuICAgICAgICB0aGlzLmlzTWFjID0gaXNNYWM7XG4gICAgICAgIHRoaXMubWFjT3NBdWRpb0Rvd25sb2Fkc0Rpc2FibGVkID0gbWFjT3NBdWRpb0Rvd25sb2Fkc0Rpc2FibGVkOyAvLyBmZWF0dXJlIGZsYWcgZm9yIExIVE5HLTM3MDIgJ25vQXVkaW9ib29rc0Zvck1hY09TJ1xuICAgICAgICB0aGlzLm1hY09TQXVkaW9Eb3dubG9hZFJlZW5hYmxlZFByZUNhdGFsaW5hID0gbWFjT1NBdWRpb0Rvd25sb2FkUmVlbmFibGVkUHJlQ2F0YWxpbmE7ICAvLyBmZWF0dXJlIGZsYWcgZm9yIExIVE5HLTM3ODlcbiAgICAgICAgdGhpcy5pc1ByZUNhdGFsaW5hTWFjID0gaXNQcmVDYXRhbGluYU1hYztcbiAgICAgICAgdGhpcy5yZXN0cmljdFZpZGVvID0gcmVzdHJpY3RWaWRlbzsgLy8gZmVhdHVyZSBmbGFnIGZvciBMSFRORy00MDQyXG4gICAgICAgIHRoaXMuaGlkZURpc2FibGVkRm9ybWF0cyA9IGhpZGVEaXNhYmxlZEZvcm1hdHM7IC8vIGZlYXR1cmUgZmxhZyBmb3IgTEhUTkctNDIxOFxuICAgICAgICB0aGlzLm9kQXBwU3Vuc2V0ID0gb2RBcHBTdW5zZXQ7IC8vIGZlYXR1cmUgZmxhZyBmb3IgTEhUTkctNDE5MVxuICAgICAgICB0aGlzLmZpeE1hZ2F6aW5lRGlzcGxheSA9IGZpeE1hZ2F6aW5lRGlzcGxheTsgLy8gZmVhdHVyZSBmbGFnIGZvciBMSFRORy00Mjc4XG4gICAgICAgIHRoaXMub2RyZWFkRnVsZmlsbG1lbnRGaXJzdCA9IG9kcmVhZEZ1bGZpbGxtZW50Rmlyc3Q7IC8vIGZlYXR1cmUgZmxhZyBmb3IgTEhUTkctNDQzN1xuICAgICAgICBPYmplY3QuYXNzaWduKHRoaXMsIHRpdGxlKTtcbiAgICB9XG5cbiAgICBnZXQgYWx0ZXJuYXRpdmVUb0tpbmRsZSgpIHtcbiAgICAgICAgbGV0IGFsdGVybmF0aXZlRm9ybWF0ID0gJyc7XG4gICAgICAgIGlmICh0aGlzLmhhc092ZXJkcml2ZUZvcm1hdCkge1xuICAgICAgICAgICAgYWx0ZXJuYXRpdmVGb3JtYXQgPSAnb2RyZWFkJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLmhhc05vbktpbmRsZU5vblJlYWRGb3JtYXQpIHtcbiAgICAgICAgICAgIGFsdGVybmF0aXZlRm9ybWF0ID0gdGhpcy5ub25LaW5kbGVOb25SZWFkRm9ybWF0c1swXS5pZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYWx0ZXJuYXRpdmVGb3JtYXQ7XG4gICAgfVxuICAgIFxuICAgIGdldCBzaG93S2luZGxlVHJvdWJsZUFjY29yZGlhbigpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLnNob3dOb25LaW5kbGVOb25SZWFkRm9ybWF0cyAmJiAhdGhpcy5zaG93T0RGb3JtYXRCdXR0b24gJiYgISh0aGlzLnJlc3RyaWN0ZWRGb3JtYXRzICYmIHRoaXMucmVzdHJpY3RlZEZvcm1hdHMubGVuZ3RoID4gMCk7XG4gICAgfVxuXG4gICAgZ2V0IGlzTG9ja2VkT25LaW5kbGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmlzRm9ybWF0TG9ja2VkSW4gJiYgdGhpcy5vdGhlckZvcm1hdHMgIT0gbnVsbCAmJiB0aGlzLm90aGVyRm9ybWF0cy5sZW5ndGggPiAwICYmIHRoaXMub3RoZXJGb3JtYXRzWzBdLmlkID09PSAnZWJvb2sta2luZGxlJztcbiAgICB9XG5cbiAgICBnZXQgaXNFYm9vaygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudHlwZS5pZCA9PT0gJ2Vib29rJztcbiAgICB9XG5cbiAgICBnZXQgaXNBdWRpb2Jvb2soKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUuaWQgPT09ICdhdWRpb2Jvb2snO1xuICAgIH1cblxuICAgIGdldCBpc1ZpZGVvKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlLmlkID09PSAndmlkZW8nO1xuICAgIH1cblxuICAgIGdldCBpc01hZ2F6aW5lKCkge1xuICAgICAgICByZXR1cm4gdGhpcy50eXBlLmlkID09PSAnbWFnYXppbmUnO1xuICAgIH1cblxuICAgIGdldCBoYXNSZWFkYWxvbmcoKSB7XG4gICAgICAgIHJldHVybiAhISh0aGlzLm92ZXJEcml2ZUZvcm1hdCAmJiB0aGlzLm92ZXJEcml2ZUZvcm1hdC5oYXNBdWRpb1N5bmNocm9uaXplZFRleHQpO1xuICAgIH1cblxuICAgIGdldCBoYXNLaW5kbGVGb3JtYXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhpZGVEaXNhYmxlZEZvcm1hdHNcbiAgICAgICAgICAgID8gdGhpcy5mb3JtYXRzLmZpbmRJbmRleCgoZm9ybWF0KSA9PiBmb3JtYXQuaWQgPT09ICdlYm9vay1raW5kbGUnKSAhPT0gLTEgXG4gICAgICAgICAgICA6IHRoaXMub3RoZXJGb3JtYXRzLmZpbmRJbmRleCgoZm9ybWF0KSA9PiBmb3JtYXQuaWQgPT09ICdlYm9vay1raW5kbGUnKSAhPT0gLTE7XG4gICAgfVxuXG4gICAgZ2V0IGhhc01wM0Zvcm1hdCgpIHtcbiAgICAgICAgcmV0dXJuICB0aGlzLmZvcm1hdHMuZmluZEluZGV4KChmb3JtYXQpID0+IGZvcm1hdC5pZCA9PT0gJ2F1ZGlvYm9vay1tcDMnKSAhPT0gLTEgfHwgdGhpcy5vdGhlckZvcm1hdHMuZmluZEluZGV4KChmb3JtYXQpID0+IGZvcm1hdC5pZCA9PT0gJ2F1ZGlvYm9vay1tcDMnKSAhPT0gLTE7XG4gICAgfVxuXG4gICAgZ2V0IGhhc01lZGlhRG9Gb3JtYXQoKSB7XG4gICAgICAgIHJldHVybiAgdGhpcy5mb3JtYXRzLmZpbmRJbmRleCgoZm9ybWF0KSA9PiBmb3JtYXQuaWQgPT09ICdlYm9vay1tZWRpYS1kbycpICE9PSAtMSB8fCB0aGlzLm90aGVyRm9ybWF0cy5maW5kSW5kZXgoKGZvcm1hdCkgPT4gZm9ybWF0LmlkID09PSAnZWJvb2stbWVkaWEtZG8nKSAhPT0gLTE7XG4gICAgfVxuXG4gICAgZ2V0IGhhc05vbktpbmRsZU5vblJlYWRGb3JtYXQoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMubm9uS2luZGxlTm9uUmVhZEZvcm1hdHMubGVuZ3RoID4gMDtcbiAgICB9XG5cbiAgICBnZXQga2luZGxlRm9ybWF0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5vdGhlckZvcm1hdHMuZmluZCgoZm9ybWF0KSA9PiBmb3JtYXQuaWQgPT09ICdlYm9vay1raW5kbGUnKTtcbiAgICB9XG5cbiAgICBnZXQgc2hvd05vbktpbmRsZUJ1dHRvbkFib3ZlRGl2aWRlcigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuc2hvd05vbktpbmRsZURvd25sb2FkQnV0dG9uXG4gICAgICAgICAgICAmJiAhdGhpcy5oYXNLaW5kbGVGb3JtYXRcbiAgICAgICAgICAgICYmICgodGhpcy5vZHJlYWRGdWxmaWxsbWVudEZpcnN0ICYmICF0aGlzLnNob3dPREZvcm1hdEJ1dHRvbikgfHwgKCF0aGlzLm9kcmVhZEZ1bGZpbGxtZW50Rmlyc3QgJiYgdGhpcy5zaG93T0RGb3JtYXRCdXR0b24pKSBcbiAgICAgICAgICAgICYmICF0aGlzLnNob3dOb0tpbmRsZU1lc3NhZ2VcbiAgICAgICAgICAgICYmICF0aGlzLnNob3dPbmx5T3ZlckRyaXZlRm9ybWF0O1xuICAgIH1cblxuICAgIGdldCBzaG93Tm9uS2luZGxlQnV0dG9uQmVsb3dEaXZpZGVyKCl7XG4gICAgICAgIHJldHVybiB0aGlzLnNob3dOb25LaW5kbGVEb3dubG9hZEJ1dHRvbiAmJiAhdGhpcy5zaG93Tm9uS2luZGxlQnV0dG9uQWJvdmVEaXZpZGVyICYmICF0aGlzLnNob3dPbmx5T3ZlckRyaXZlRm9ybWF0O1xuICAgIH1cblxuICAgIGdldCBzaG93Tm9uS2luZGxlRG93bmxvYWRCdXR0b24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnNob3dOb25LaW5kbGVOb25SZWFkRm9ybWF0c1xuICAgICAgICAgICAgJiYgdGhpcy5ub25LaW5kbGVOb25SZWFkRm9ybWF0cy5sZW5ndGggPT09IDE7XG4gICAgfVxuXG4gICAgZ2V0IHNob3dEb3dubG9hZERyb3Bkb3duKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5pc0Vib29rXG4gICAgICAgICAgICAmJiB0aGlzLnNob3dOb25LaW5kbGVOb25SZWFkRm9ybWF0c1xuICAgICAgICAgICAgJiYgdGhpcy5ub25LaW5kbGVOb25SZWFkRm9ybWF0cy5sZW5ndGggPiAxO1xuICAgIH1cblxuICAgIGdldCBzaG93Tm9uS2luZGxlTm9uUmVhZEZvcm1hdHMoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5pc0Vib29rIHx8ICh0aGlzLmlzQXVkaW9ib29rICYmIHRoaXMub2RyZWFkRnVsZmlsbG1lbnRGaXJzdCkpICYmICF0aGlzLmlzRm9ybWF0TG9ja2VkSW5cbiAgICAgICAgICAgICYmIHRoaXMubm9uS2luZGxlTm9uUmVhZEZvcm1hdHNcbiAgICAgICAgICAgICYmIHRoaXMubm9uS2luZGxlTm9uUmVhZEZvcm1hdHMubGVuZ3RoID4gMFxuICAgICAgICAgICAgJiYgKCF0aGlzLnByZWZlcktpbmRsZSB8fCAhdGhpcy5saW1pdERpc3BsYXlGb3JtYXRzIHx8ICF0aGlzLmhhc0tpbmRsZUZvcm1hdCk7XG4gICAgfVxuXG4gICAgZ2V0IHNob3dOb0tpbmRsZU1lc3NhZ2UoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5pc0Zvcm1hdExvY2tlZEluICYmICF0aGlzLmhhc0tpbmRsZUZvcm1hdCAmJiB0aGlzLnByZWZlcktpbmRsZSAmJiB0aGlzLmlzRWJvb2s7XG4gICAgfVxuXG4gICAgZ2V0IG5vbktpbmRsZUZvcm1hdHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZvcm1hdHMuZmlsdGVyKChmb3JtYXQpID0+IGZvcm1hdC5pZCAhPT0gJ2Vib29rLWtpbmRsZScgJiYgZm9ybWF0LmlkICE9PSAnZWJvb2sta29ibycpO1xuICAgIH1cblxuICAgIGdldCBub25LaW5kbGVOb25SZWFkRm9ybWF0cygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGlkZURpc2FibGVkRm9ybWF0c1xuICAgICAgICAgICAgPyB0aGlzLmZvcm1hdHMuZmlsdGVyKChmb3JtYXQpID0+IGZvcm1hdC5pZCAhPT0gJ2Vib29rLWtpbmRsZSdcbiAgICAgICAgICAgICAgJiYgZm9ybWF0LmlkICE9PSAnZWJvb2sta29ibydcbiAgICAgICAgICAgICAgJiYgZm9ybWF0LmlkICE9PSAnZWJvb2stb3ZlcmRyaXZlJ1xuICAgICAgICAgICAgICAmJiBmb3JtYXQuaWQgIT09ICdhdWRpb2Jvb2stb3ZlcmRyaXZlJ1xuICAgICAgICAgICAgICAmJiBmb3JtYXQuaWQgIT09ICd2aWRlby1zdHJlYW1pbmcnXG4gICAgICAgICAgICAgICYmICEodGhpcy5maXhNYWdhemluZURpc3BsYXkgJiYgZm9ybWF0LmlkID09PSAnbWFnYXppbmUtb3ZlcmRyaXZlJylcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIDogdGhpcy5vdGhlckZvcm1hdHMuZmlsdGVyKChmb3JtYXQpID0+IGZvcm1hdC5pZCAhPT0gJ2Vib29rLWtpbmRsZScgJiYgZm9ybWF0LmlkICE9PSAnZWJvb2sta29ibycpO1xuICAgIH1cblxuICAgIGdldCB0b2xpbm9TdXBwb3J0ZWREcm9wZG93bkZvcm1hdHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm5vbktpbmRsZU5vblJlYWRGb3JtYXRzLmZpbHRlcigoZm9ybWF0KSA9PiBmb3JtYXQuaWQgIT09ICdhdWRpb2Jvb2stbXAzJyk7XG4gICAgfVxuXG4gICAgZ2V0IGhhc092ZXJkcml2ZUZvcm1hdCgpIHtcbiAgICAgICAgcmV0dXJuICEhKHRoaXMub3ZlckRyaXZlRm9ybWF0ICYmIHRoaXMub3ZlckRyaXZlRm9ybWF0LmlkICE9IG51bGwpO1xuICAgIH1cblxuICAgIGdldCBzaG93T25seU92ZXJEcml2ZUZvcm1hdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGlkZURpc2FibGVkRm9ybWF0cyAmJiBcbiAgICAgICAgICAgICgodGhpcy5pc0Zvcm1hdExvY2tlZEluICYmICghdGhpcy5vZHJlYWRGdWxmaWxsbWVudEZpcnN0IHx8ICF0aGlzLmlzTG9ja2VkT25LaW5kbGUpICYmIHRoaXMubm9uS2luZGxlTm9uUmVhZEZvcm1hdHMubGVuZ3RoID09PSAwKSB8fFxuICAgICAgICAgICAgKCh0aGlzLmlzRWJvb2sgJiYgIXRoaXMuaGFzS2luZGxlRm9ybWF0ICYmIHRoaXMubm9uS2luZGxlRm9ybWF0cy5sZW5ndGggPT09IDEgJiYgdGhpcy5ub25LaW5kbGVGb3JtYXRzWzBdLmlkID09PSBcImVib29rLW92ZXJkcml2ZVwiKVxuICAgICAgICAgICAgfHwgKHRoaXMuaXNBdWRpb2Jvb2sgJiYgdGhpcy5mb3JtYXRzLmxlbmd0aCA9PT0gMSAmJiB0aGlzLmZvcm1hdHNbMF0uaWQgPT09IFwiYXVkaW9ib29rLW92ZXJkcml2ZVwiKSkpO1xuICAgIH1cblxuICAgIGdldCBzaG93T0RGb3JtYXRCdXR0b24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmhhc092ZXJkcml2ZUZvcm1hdCAmJiB0aGlzLm92ZXJkcml2ZUZvcm1hdEFsbG93ZWQgJiYgIXRoaXMudmlkZW9Jc1Jlc3RyaWN0ZWQgJiZcbiAgICAgICAgICAgICghdGhpcy5oYXNLaW5kbGVGb3JtYXQgfHwgIXRoaXMucHJlZmVyS2luZGxlIHx8IHRoaXMub3ZlckRyaXZlRm9ybWF0Lmhhc0F1ZGlvU3luY2hyb25pemVkVGV4dCk7XG4gICAgfVxuXG4gICAgZ2V0IHN1cHByZXNzQXVkaW9ib29rRG93bmxvYWRCdXR0b24oKSB7XG4gICAgICAgIC8vIFRoaXMgaXMgc29tZXdoYXQgb2RkLiAgSW4gdGhlIGNhc2Ugd2hlcmUgeW91J3JlIG9uIGEgTWFjIGJ1dCB0aGVyZSBpcyBhbHNvIGEgTGlzdGVuIGZvcm1hdCBhdmFpbGFibGUsIHdlIHJlbmRlciB0aGUgbXAzXG4gICAgICAgIC8vIGRvd25sb2FkIGJ1dHRvbiBzZXJ2ZXIgc2lkZSBzbyB0aGF0IHRoZSBjbGllbnQtc2lkZSBjb2RlIHRvIHJlcGxhY2UgaXQgd2l0aCBhIGZvcm1hdCB3YXJuaW5nIHdpbGwgY29udGludWUgdG8gd29ya1xuICAgICAgICAvLyBUaGlzIGlzIG9idmlvdXNseSBub3QgdmVyeSBtYWludGFpbmFibGUsIGJ1dCB3ZSBoYXZlIHBsYW5zIHRvIGNvbXBsZXRlbHkgcmVwbGFjZSB0aGlzIHBhZ2Ugd2l0aCBjbGllbnQtc2lkZVxuICAgICAgICAvLyByZW5kZXJlZCBiYWNrYm9uZSBjb21wb25lbnRzLCBzbyBJIGZlZWwgYSBrbHVkZ2UgaXMganVzdGlmaWVkIHVuZGVyIHRoZSBjaXJjdW1zdGFuY2VzLlxuICAgICAgICByZXR1cm4gdGhpcy5pc0F1ZGlvYm9vayAmJiB0aGlzLmlzTWFjICYmIHRoaXMuaGFzTXAzRm9ybWF0ICYmIHRoaXMuaGFzT3ZlcmRyaXZlRm9ybWF0ICAmJiB0aGlzLm92ZXJkcml2ZUZvcm1hdEFsbG93ZWQgJiYgdGhpcy5tYWNPc0F1ZGlvRG93bmxvYWRzRGlzYWJsZWRcbiAgICAgICAgICAgICAgICAmJiAoIXRoaXMubWFjT1NBdWRpb0Rvd25sb2FkUmVlbmFibGVkUHJlQ2F0YWxpbmEgfHwgIXRoaXMuaXNQcmVDYXRhbGluYU1hYyk7XG4gICAgfVxuXG4gICAgZ2V0IG92ZXJkcml2ZUZvcm1hdEFsbG93ZWQoKXtcbiAgICAgICAgLy8gVGhlIE9EIFJlYWQgZm9ybWF0IGlzIGdlbmVyYWxseSBzdXBwcmVzc2VkIGluIHRoZSBhcHAgYnV0IHRoZXJlIGFyZSBhIGZldyBleGNlcHRpb25zXG4gICAgICAgIGlmICh0aGlzLm90aGVyRm9ybWF0cyAmJiB0aGlzLm90aGVyRm9ybWF0cy5sZW5ndGggPT09IDEgJiYgdGhpcy5pc0luT0RBcHAgJiZcbiAgICAgICAgICAgICh0aGlzLm90aGVyRm9ybWF0c1swXS5pZCA9PT0gJ2Vib29rLXBkZi1hZG9iZScgfHwgdGhpcy5vdGhlckZvcm1hdHNbMF0uaWQgPT09ICdlYm9vay1wZGYtb3BlbicgfHwgdGhpcy5vdGhlckZvcm1hdHNbMF0uaWQgPT09ICdlYm9vay1raW5kbGUnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5vdmVyRHJpdmVGb3JtYXQgJiYgdGhpcy5vdmVyRHJpdmVGb3JtYXQuaGFzQXVkaW9TeW5jaHJvbml6ZWRUZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gIHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gISh0aGlzLmlzSW5PREFwcCAmJiB0aGlzLm90aGVyRm9ybWF0cyAmJiB0aGlzLm90aGVyRm9ybWF0cy5sZW5ndGggPiAwKSB8fCAodGhpcy5pc0luT0RBcHAgJiYgdGhpcy5zaG93T25seU92ZXJEcml2ZUZvcm1hdCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgZmlyc3RCdXR0b25TbG90T2NjdXBpZWQoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5pc0Vib29rICYmICgodGhpcy5pc0Zvcm1hdExvY2tlZEluICYmICF0aGlzLnNob3dPbmx5T3ZlckRyaXZlRm9ybWF0KSBcbiAgICAgICAgICAgICAgICB8fCB0aGlzLmhhc0tpbmRsZUZvcm1hdCBcbiAgICAgICAgICAgICAgICB8fCB0aGlzLnNob3dOb0tpbmRsZU1lc3NhZ2UgXG4gICAgICAgICAgICAgICAgfHwgKHRoaXMub2RyZWFkRnVsZmlsbG1lbnRGaXJzdCAmJiAhdGhpcy5oYXNLaW5kbGVGb3JtYXQgJiYgdGhpcy5zaG93T0RGb3JtYXRCdXR0b24pIFxuICAgICAgICAgICAgICAgIHx8IHRoaXMuc2hvd05vbktpbmRsZUJ1dHRvbkFib3ZlRGl2aWRlcikpXG4gICAgICAgICAgICB8fCAoIXRoaXMuaXNFYm9vayAmJiB0aGlzLmhhc05vbktpbmRsZU5vblJlYWRGb3JtYXQgJiYgIXRoaXMuc3VwcHJlc3NBdWRpb2Jvb2tEb3dubG9hZEJ1dHRvbik7XG4gICAgfVxuXG4gICAgZ2V0IHNlY29uZEJ1dHRvblNsb3RPY2N1cGllZCgpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLnNob3dPREZvcm1hdEJ1dHRvbiAmJiAhdGhpcy5vZHJlYWRGdWxmaWxsbWVudEZpcnN0KSBcbiAgICAgICAgICAgIHx8ICh0aGlzLm9kcmVhZEZ1bGZpbGxtZW50Rmlyc3QgJiYgdGhpcy5zaG93T0RGb3JtYXRCdXR0b24gJiYgIXRoaXMuc2hvd09ubHlPdmVyRHJpdmVGb3JtYXQpIFxuICAgICAgICAgICAgfHwgKHRoaXMuc2hvd05vbktpbmRsZU5vblJlYWRGb3JtYXRzICYmICF0aGlzLnNob3dOb25LaW5kbGVCdXR0b25BYm92ZURpdmlkZXIpO1xuICAgIH1cblxuICAgIGdldCBzaG93RGl2aWRlcigpIHtcbiAgICAgICAgcmV0dXJuICh0aGlzLmZpcnN0QnV0dG9uU2xvdE9jY3VwaWVkICYmIHRoaXMuc2Vjb25kQnV0dG9uU2xvdE9jY3VwaWVkKSB8fCAodGhpcy5pc0F1ZGlvYm9vayAmJiAhdGhpcy5pc0luT0RBcHAgJiYgdGhpcy5vZEFwcFN1bnNldCAmJiB0aGlzLnNob3dPREZvcm1hdEJ1dHRvbiAmJiB0aGlzLmhpZGVEaXNhYmxlZEZvcm1hdHMpO1xuICAgIH1cblxuICAgIGdldCB1c2VGaXJzdFBsYXlUZXh0KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb25zdHJhaW50cyAmJiB0aGlzLmNvbnN0cmFpbnRzLndhdGNoRXhwaXJhdGlvbkhvdXJzO1xuICAgIH1cblxuICAgIGdldCB2aWRlb0lzUmVzdHJpY3RlZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaXNWaWRlbyAmJiB0aGlzLnJlc3RyaWN0VmlkZW87IFxuICAgIH1cblxuICAgIGdldCBpc1BkZk9ubHkoKSB7XG4gICAgICAgIGxldCBub25QZGZGb3JtYXRzID0gdGhpcy5mb3JtYXRzLmZpbHRlcihmb3JtYXQgPT4gIWZvcm1hdC5pZC5pbmNsdWRlcyhcInBkZlwiKSAmJiAhZm9ybWF0LmlkLmluY2x1ZGVzKFwia29ib1wiKSk7XG4gICAgICAgIHJldHVybiBub25QZGZGb3JtYXRzLmxlbmd0aCA9PT0gMDtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gTG9hblRpdGxlO1xuIiwiY2xhc3MgQXBwUHJvbW9NYW5hZ2VyIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5BUFBMSUNBVElPTlMgPSB7XG4gICAgICAgICAgICBMSUJCWTogJ2xpYmJ5JyxcbiAgICAgICAgICAgIFNPUkE6ICdzb3JhJyxcbiAgICAgICAgICAgIEtJTkRMRTogJ2tpbmRsZScsXG4gICAgICAgICAgICBLSU5ETEVQUkVGOiAna2luZGxlLXByZWZlcmVuY2UnLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIEFwcCBQcm9tb3Rpb24gTWFuYWdlciwgY2hlY2sgZm9yIFRvbGlubyBEZXZpY2UgU3RhdHVzXG4gICAgICogQHBhcmFtIHJlcSAtIEV4cHJlc3Mgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VydmVyIHJlcXVlc3Qgb2JqZWN0XG4gICAgICogQHBhcmFtIHJlcyAtIEV4cHJlc3Mgb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgc2VydmVyIHJlc3BvbnNlIG9iamVjdFxuICAgICAqL1xuICAgIGNoZWNrSWZUb2xpbm8ocmVxKSB7XG4gICAgICAgIGxldCB1c2VyQWdlbnQgPSByZXEuaGVhZGVyc1sndXNlci1hZ2VudCddO1xuICAgICAgICBsZXQgdG9saW5vQ29va2llT3ZlcnJpZGUgPSByZXEuY29va2llc1snaXMtdG9saW5vLWRldmljZSddID09IDE7XG4gICAgICAgIGxldCBpc1RvbGlub1ByZXZpZXdXZWJzaXRlID1cbiAgICAgICAgICAgIHJlcS5saWJyYXJ5ICYmXG4gICAgICAgICAgICByZXEubGlicmFyeS53ZWJzaXRlSWQgJiZcbiAgICAgICAgICAgIHJlcS5pbnRUb2xpbm9TaXRlcyAmJlxuICAgICAgICAgICAgcmVxLmludFRvbGlub1NpdGVzLmluY2x1ZGVzKFN0cmluZyhyZXEubGlicmFyeS53ZWJzaXRlSWQpKTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuZmVhdHVyZU1hbmFnZXIgJiZcbiAgICAgICAgICAgICh0aGlzLmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgndG9saW5vJykgfHxcbiAgICAgICAgICAgICAgICBpc1RvbGlub1ByZXZpZXdXZWJzaXRlKSAmJlxuICAgICAgICAgICAgKHRvbGlub0Nvb2tpZU92ZXJyaWRlIHx8XG4gICAgICAgICAgICAgICAgL3RvbGluby9pLnRlc3QodXNlckFnZW50KSB8fFxuICAgICAgICAgICAgICAgIC9lUmVhZGVyL2kudGVzdCh1c2VyQWdlbnQpKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBBcHAgUHJvbW90aW9uIE1hbmFnZXIgKFNlcnZlcilcbiAgICAgKiBAcGFyYW0gcmVxIC0gRXhwcmVzcyBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJ2ZXIgcmVxdWVzdCBvYmplY3RcbiAgICAgKiBAcGFyYW0gcmVzIC0gRXhwcmVzcyBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJ2ZXIgcmVzcG9uc2Ugb2JqZWN0XG4gICAgICogQHBhcmFtIGZlYXR1cmVNYW5hZ2VyIC0gRXhwcmVzcyBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBzZXJ2ZXIgc2lkZSBmZWF0dXJlTWFuYWdlclxuICAgICAqL1xuICAgIHN0YXRpYyBjcmVhdGVTZXJ2ZXIocmVxLCByZXMsIGZlYXR1cmVNYW5hZ2VyKSB7XG4gICAgICAgIGxldCBpbnN0YW5jZSA9IG5ldyB0aGlzKCk7XG4gICAgICAgIGluc3RhbmNlLmZlYXR1cmVNYW5hZ2VyID0gZmVhdHVyZU1hbmFnZXI7XG4gICAgICAgIGluc3RhbmNlLnNldHRpbmdzID0gcmVzLmxvY2FscztcbiAgICAgICAgaW5zdGFuY2Uuc2V0dGluZ3MuaXNUb2xpbm9EZXZpY2UgPSBpbnN0YW5jZS5jaGVja0lmVG9saW5vKHJlcSk7XG4gICAgICAgIHJldHVybiBpbnN0YW5jZTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGUgQXBwIFByb21vdGlvbiBNYW5hZ2VyIChDbGllbnQpXG4gICAgICogQHBhcmFtIGZlYXR1cmVNYW5hZ2VyXG4gICAgICogQHBhcmFtIHdpbmRvdyAtIGNsaWVudCB3aW5kb3cgb2JqZWN0IHRoYXQgd2UgZ2V0IG5lZWRlZCBpbmZvcm1hdGlvbiBmcm9tXG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBzdGF0aWMgY3JlYXRlQ2xpZW50KHdpbmRvdykge1xuICAgICAgICBsZXQgaW5zdGFuY2UgPSBuZXcgdGhpcygpO1xuICAgICAgICBpbnN0YW5jZS5mZWF0dXJlTWFuYWdlciA9IHdpbmRvdy5mZWF0dXJlTWFuYWdlcjtcbiAgICAgICAgaW5zdGFuY2Uuc2V0dGluZ3MgPSB3aW5kb3cuT3ZlckRyaXZlO1xuICAgICAgICByZXR1cm4gaW5zdGFuY2U7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogTWV0aG9kIGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIG9yIG5vdCB0byBzaG93IEFwcGxpY2F0aW9uIFByb21vdGlvbnNcbiAgICAgKiBAbWV0aG9kXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFwcGxpY2F0aW9uIC0gYXBwbGljYXRpb24gdG8gY2hlY2suIFVzZSBBcHBsaWNhdGlvbiBwcm9wZXJ0eSBvZmYgRmVhdHVyZU1hbmFnZXJcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBpc0FwcFByb21vRW5hYmxlZChhcHBsaWNhdGlvbikge1xuICAgICAgICBzd2l0Y2ggKGFwcGxpY2F0aW9uKSB7XG4gICAgICAgICAgICBjYXNlIHRoaXMuQVBQTElDQVRJT05TLkxJQkJZOlxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLnNldHRpbmdzLmlzVG9saW5vRGV2aWNlICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdwcm9tb3RlTGliYnknKSAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHRpbmdzLmVuYWJsZWRQbGF0Zm9ybXMuaW5jbHVkZXMoJ2xpYmJ5JylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY2FzZSB0aGlzLkFQUExJQ0FUSU9OUy5TT1JBOlxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgICF0aGlzLnNldHRpbmdzLmlzVG9saW5vRGV2aWNlICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MuZW5hYmxlZFBsYXRmb3Jtcy5pbmNsdWRlcygnc29yYScpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGNhc2UgdGhpcy5BUFBMSUNBVElPTlMuS0lORExFOlxuICAgICAgICAgICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MuaGFzTGlua2VkQ2FyZHMgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXR0aW5ncy5pc0F1dGhlbnRpY2F0ZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgIXRoaXMuc2V0dGluZ3MuaXNUb2xpbm9EZXZpY2VcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgY2FzZSB0aGlzLktJTkRMRVBSRUY6XG4gICAgICAgICAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgICAgICAgICAgIXRoaXMuc2V0dGluZ3MuaXNUb2xpbm9EZXZpY2UgJiZcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ2tpbmRsZUxvYW5PZmZlcicpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBBcHBQcm9tb01hbmFnZXI7XG4iLCJjb25zdCBudW1iZXJzID0gcmVxdWlyZSgnLi9udW1iZXJzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIGhpZGVMaWJieUludGVyY2VwdDoge1xuICAgICAgICBuYW1lOiAnaGlkZUxpYmJ5SW50ZXJjZXB0JyxcbiAgICAgICAgZHVyYXRpb25NUzogbnVtYmVycy5kYXlJbk1pbGxpU2Vjb25kcyAqIDU2LFxuICAgICAgICBzbGlkaW5nOiB0cnVlLFxuICAgIH0sXG4gICAgaGlkZUxpYmJ5SW50ZXJjZXB0TG9uZzoge1xuICAgICAgICBuYW1lOiAnaGlkZUxpYmJ5SW50ZXJjZXB0TG9uZycsXG4gICAgICAgIGR1cmF0aW9uTVM6IG51bWJlcnMueWVhckluTWlsbGlzZWNvbmRzLFxuICAgICAgICBzbGlkaW5nOiB0cnVlLFxuICAgIH0sXG4gICAgaGlkZUxvYW5zUGFnZUxpYmJ5UHJvbW86IHtcbiAgICAgICAgbmFtZTogJ2hpZGVMb2Fuc1BhZ2VMaWJieVByb21vJyxcbiAgICAgICAgZHVyYXRpb25NUzogbnVtYmVycy5kYXlJbk1pbGxpU2Vjb25kcyAqIDE0LFxuICAgICAgICBzbGlkaW5nOiB0cnVlLFxuICAgIH0sXG4gICAgb2RUcmFjazoge1xuICAgICAgICBuYW1lOiAnb2RfdHJhY2snLFxuICAgICAgICBkdXJhdGlvbk1TOiBudW1iZXJzLnllYXJJbk1pbGxpc2Vjb25kcyAqIDEwLFxuICAgICAgICBzbGlkaW5nOiB0cnVlLFxuICAgICAgICBkb21haW46ICdvdmVyZHJpdmUuY29tJyxcbiAgICAgICAgaHR0cE9ubHk6IGZhbHNlLFxuICAgIH0sXG4gICAgdmlzaXRlZEZlYXR1cmVzOiB7XG4gICAgICAgIG5hbWU6ICd2aXNpdGVkRmVhdHVyZXMnLFxuICAgICAgICBkdXJhdGlvbk1TOiBudW1iZXJzLnllYXJJbk1pbGxpc2Vjb25kcyAqIDEwLFxuICAgICAgICBzbGlkaW5nOiB0cnVlLFxuICAgIH0sXG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkZlYXR1cmVNYW5hZ2VyID0gdm9pZCAwO1xudmFyIGNsb25lX3RzXzEgPSByZXF1aXJlKFwiLi91dGlsaXR5L2Nsb25lLXRzXCIpO1xuLyoqXG4gKiBGZWF0dXJlIG1hbmFnZXJcbiAqL1xudmFyIEZlYXR1cmVNYW5hZ2VyID0gLyoqIEBjbGFzcyAqLyAoZnVuY3Rpb24gKCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIEZlYXR1cmVNYW5hZ2VyLlxuICAgICAqIEBwYXJhbSB7RmVhdHVyZU1hcH0gZmVhdHMgLSBBIHNldCBvZiBmZWF0dXJlcyBhbmQgd2hldGhlciBvciBub3QgdGhleSBhcmUgZW5hYmxlZCBhbmQvb3IgdGVzdGFibGUuXG4gICAgICogQHBhcmFtIHtMaWJyYXJ5RmVhdHVyZU1hcH0gbGlicmFyeUNvbmZpZ3VyYXRpb25zIC0gQSBzZXQgb2YgZmVhdHVyZXMgZW5hYmxlZCBmb3IgYSBsaWJyYXJ5LlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0ZW5hbnQgLSBUaGUgdGVuYW50IGlkLlxuICAgICAqIEBwYXJhbSB7QWxsRmVhdHVyZXN9IGFsbEZlYXR1cmVzIC0gVGhlIGFsbEZlYXR1cmVzIHNlY3JldCBjb29raWUgdmFsdWUuIFRoaXMgc2hvdWxkIGJlICcwJyBmb3Igb2ZmIG9yICcxJyBmb3Igb24uXG4gICAgICogQHBhcmFtIHthcnJheX0gZHluYW1pY0NvbmZpZ3VyYXRpb25GdW5jdGlvbnMgLSBBIHNldCBvZiBmdW5jdGlvbnMgdG8gcmVjb25maWd1cmUgZmVhdHVyZXMgZm9yIHRoaXMgbWFuYWdlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBGZWF0dXJlTWFuYWdlcihmZWF0cywgbGlicmFyeUNvbmZpZ3VyYXRpb25zLCB0ZW5hbnQsIGFsbEZlYXR1cmVzLCBkeW5hbWljQ29uZmlndXJhdGlvbkZ1bmN0aW9ucykge1xuICAgICAgICB0aGlzLmxpYnJhcnlDb25maWd1cmF0aW9ucyA9IGxpYnJhcnlDb25maWd1cmF0aW9ucztcbiAgICAgICAgdGhpcy51c2VUZXN0YWJsZSA9IHRoaXMuc2hvdWxkVXNlVGVzdGFibGUodGVuYW50LCBhbGxGZWF0dXJlcyk7XG4gICAgICAgIHZhciBmZWF0dXJlcyA9ICgwLCBjbG9uZV90c18xLmxpZ2h0Q2xvbmUpKGZlYXRzKTtcbiAgICAgICAgZHluYW1pY0NvbmZpZ3VyYXRpb25GdW5jdGlvbnMgJiZcbiAgICAgICAgICAgIGR5bmFtaWNDb25maWd1cmF0aW9uRnVuY3Rpb25zLmZvckVhY2goZnVuY3Rpb24gKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICBmZWF0dXJlcyA9IGl0ZW0uY29uZmlndXJlRHluYW1pY0ZlYXR1cmUoZmVhdHVyZXMsIGxpYnJhcnlDb25maWd1cmF0aW9ucywgdGVuYW50LCBhbGxGZWF0dXJlcyk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5mZWF0dXJlcyA9IGZlYXR1cmVzO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGZWF0dXJlIG1hbmFnZXIgbWV0aG9kIGZvciBkZXRlcm1pbmluZyB3aGV0aGVyIG9yIG5vdCB0byBzaG93IGEgZmVhdHVyZS5cbiAgICAgKiBUaGlzIGlzIHRoZSBzaW5nbGUgc291cmNlIG9mIHRydXRoIGZvciBwZXJtaXNzaW9ucy5cbiAgICAgKiBAbWV0aG9kXG4gICAgICogQHBhcmFtIHtGZWF0dXJlTmFtZX0gZmVhdHVyZSAtIFRoZSBmZWF0dXJlIGluIHF1ZXN0aW9uXG4gICAgICogQHJldHVybnMge2Jvb2xlYW59XG4gICAgICovXG4gICAgRmVhdHVyZU1hbmFnZXIucHJvdG90eXBlLmlzRW5hYmxlZCA9IGZ1bmN0aW9uIChmZWF0dXJlKSB7XG4gICAgICAgIHJldHVybiAhISh0aGlzLmlzT2tGb3JMaWJyYXJ5KGZlYXR1cmUpICYmXG4gICAgICAgICAgICAodGhpcy51c2VUZXN0YWJsZVxuICAgICAgICAgICAgICAgID8gdGhpcy5pc1N0cmljdGx5VGVzdGFibGUoZmVhdHVyZSlcbiAgICAgICAgICAgICAgICA6IHRoaXMuaXNTdHJpY3RseUVuYWJsZWQoZmVhdHVyZSkpKTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZlYXR1cmUgbWFuYWdlciBtZXRob2QgcmV0dXJuaW5nIHRoZSBzdHJpY3RseSBgZW5hYmxlZGAgdmFsdWUuXG4gICAgICogTm90ZTogZHVlIHRvIGR5bmFtaWMgY29uZmlndXJhdGlvbnMsIHRoaXMgc2hvdWxkIG5vdCBiZSBhc3N1bWVkIHRvIGJlXG4gICAgICogdGhlIGNvbmZpZy9mZWF0dXJlcy5qc29uIGBlbmFibGVkYCB2YWx1ZSwgdGhvdWdoIHRoYXQgaXMgdGhlIGRlZmF1bHQuXG4gICAgICogQHBhcmFtIHtGZWF0dXJlTmFtZX0gZmVhdHVyZSAtIFRoZSBmZWF0dXJlIHRvIGxvb2t1cFxuICAgICAqIEByZXR1cm5zIHtib29sZWFufVxuICAgICAqL1xuICAgIEZlYXR1cmVNYW5hZ2VyLnByb3RvdHlwZS5pc1N0cmljdGx5RW5hYmxlZCA9IGZ1bmN0aW9uIChmZWF0dXJlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmVzW2ZlYXR1cmVdICYmIHRoaXMuZmVhdHVyZXNbZmVhdHVyZV0uZW5hYmxlZDtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIEZlYXR1cmUgbWFuYWdlciBtZXRob2QgcmV0dXJuaW5nIHRoZSBzdHJpY3RseSBgdGVzdGFibGVgIHZhbHVlLlxuICAgICAqIE5vdGU6IGR1ZSB0byBkeW5hbWljIGNvbmZpZ3VyYXRpb25zLCB0aGlzIHNob3VsZCBub3QgYmUgYXNzdW1lZCB0byBiZVxuICAgICAqIHRoZSBjb25maWcvZmVhdHVyZXMuanNvbiBgZW5hYmxlZGAgdmFsdWUsIHRob3VnaCB0aGF0IGlzIHRoZSBkZWZhdWx0LlxuICAgICAqIEBwYXJhbSB7RmVhdHVyZU5hbWV9IGZlYXR1cmUgLSBUaGUgZmVhdHVyZSB0byBsb29rdXBcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBGZWF0dXJlTWFuYWdlci5wcm90b3R5cGUuaXNTdHJpY3RseVRlc3RhYmxlID0gZnVuY3Rpb24gKGZlYXR1cmUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmVhdHVyZXNbZmVhdHVyZV0gJiYgdGhpcy5mZWF0dXJlc1tmZWF0dXJlXS50ZXN0YWJsZTtcbiAgICB9O1xuICAgIC8qKlxuICAgICAqIFByaXZhdGUgbWV0aG9kIHJldHVybmluZyB3aGV0aGVyIGxpYnJhcnlDb25maWd1cmF0aW9ucyBwZXJtaXRzIHRoaXMgZmVhdHVyZS5cbiAgICAgKiBAcGFyYW0ge0ZlYXR1cmVOYW1lfSBmZWF0dXJlIC0gVGhlIGZlYXR1cmUgaW4gcXVlc3Rpb25cbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBGZWF0dXJlTWFuYWdlci5wcm90b3R5cGUuaXNPa0ZvckxpYnJhcnkgPSBmdW5jdGlvbiAoZmVhdHVyZSkge1xuICAgICAgICB2YXIgbGliRmVhdCA9IHRoaXMubGlicmFyeUNvbmZpZ3VyYXRpb25zW2ZlYXR1cmVdO1xuICAgICAgICByZXR1cm4gIWxpYkZlYXQgfHwgbGliRmVhdC5lbmFibGVkIHx8IGZhbHNlO1xuICAgIH07XG4gICAgLyoqXG4gICAgICogUHJpdmF0ZSBtZXRob2QgcmV0dXJuaW5nIHdoZXRoZXIgdG8gdXNlIHRoZSBjb25maWcvZmVhdHVyZXMuanNvblxuICAgICAqIGBlbmFibGVkYCBvciBgdGVzdGFibGVgIHZhbHVlLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSB0ZW5hbnQgLSBUaGUgdGVuYW50IGlkXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGFsbEZlYXR1cmVzIC0gVGhlIGFsbEZlYXR1cmVzIHNlY3JldCBjb29raWUgdmFsdWVcbiAgICAgKiBAcmV0dXJucyB7Ym9vbGVhbn1cbiAgICAgKi9cbiAgICBGZWF0dXJlTWFuYWdlci5wcm90b3R5cGUuc2hvdWxkVXNlVGVzdGFibGUgPSBmdW5jdGlvbiAodGVuYW50LCBhbGxGZWF0dXJlcykge1xuICAgICAgICByZXR1cm4gKHRlbmFudCA9PT0gMTAwNTAxIHx8XG4gICAgICAgICAgICB0ZW5hbnQgPT09IDEwMDMwMCB8fFxuICAgICAgICAgICAgKHRlbmFudCA+PSA4MDAwMDAgJiYgdGVuYW50IDwgOTAwMDAwKSB8fFxuICAgICAgICAgICAgYWxsRmVhdHVyZXMgPT09ICcxJyk7XG4gICAgfTtcbiAgICByZXR1cm4gRmVhdHVyZU1hbmFnZXI7XG59KCkpO1xuZXhwb3J0cy5GZWF0dXJlTWFuYWdlciA9IEZlYXR1cmVNYW5hZ2VyO1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1mZWF0dXJlTWFuYWdlci10cy5qcy5tYXBcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZmVhdHVyZU1hbmFnZXItdHMuanMubWFwXG4iLCJjb25zdCBGZWF0dXJlTWFuYWdlciA9IHJlcXVpcmUoJy4vZmVhdHVyZU1hbmFnZXItdHMuanMnKS5GZWF0dXJlTWFuYWdlcjtcblxubW9kdWxlLmV4cG9ydHMgPSBGZWF0dXJlTWFuYWdlcjtcbiIsInZhciBfID0gcmVxdWlyZSgndW5kZXJzY29yZScpO1xudmFyIGZlYXR1cmVzID0gcmVxdWlyZSgnbGlnaHRuaW5nLWNvbW1vbi9saWIvY29uZmlndXJhdGlvbi9mZWF0dXJlcy5qc29uJyk7XG52YXIgcmV2ZXJzZVByZXZpZXdTaXRlcyA9IHJlcXVpcmUoJ2xpZ2h0bmluZy1jb21tb24vbGliL2NvbmZpZ3VyYXRpb24vcmV2ZXJzZVByZXZpZXdTaXRlcy5qc29uJyk7XG52YXIgRmVhdHVyZU1hbmFnZXIgPSByZXF1aXJlKCcuL2ZlYXR1cmVNYW5hZ2VyJyk7XG5cbi8qKlxuICogRnVuY3Rpb24gZm9yIGdldHRpbmcgY29uZmlndXJlZCBmZWF0dXJlcyBmb3IgcmV2ZXJzZS1wcmV2aWV3XG4gKiB3aGljaCBpcyBhIGR5bmFtaWMgZmVhdHVyZSBmcm9tIGNvbmZpZy9mZWF0dXJlcy5qc29uLlxuICogQHBhcmFtIHtudW1iZXJ9IHRlbmFudCAtIFRoZSB0ZW5hbnQgaWRcbiAqIEBwYXJhbSB7c3RyaW5nfSBhbGxGZWF0dXJlcyAtIFRoZSBhbGxGZWF0dXJlcyBzZWNyZXQgY29va2llIHZhbHVlXG4gKi9cbnZhciBnZXRGZWF0dXJlc0NvbmZpZ3VyZWRGb3JSZXZlcnNlUHJldmlldyA9IGZ1bmN0aW9uKGZlYXRzLCBsaWJyYXJ5Q29uZmlndXJhdGlvbiwgdGVuYW50KSB7XG4gICAgdmFyIHJldHVybkZlYXR1cmVzID0gXy5leHRlbmQoe30sIGZlYXRzKTtcbiAgICB2YXIgcmV2ZXJzZVByZXZpZXdTaXRlID0gcmV2ZXJzZVByZXZpZXdTaXRlcyAmJiByZXZlcnNlUHJldmlld1NpdGVzW3RlbmFudF07XG4gICAgdmFyIGlzUmV2ZXJzZVByZXZpZXdFbmFibGVkID0gKHJldmVyc2VQcmV2aWV3U2l0ZSAmJiByZXZlcnNlUHJldmlld1NpdGUudXJsKTtcblxuICAgIHJldHVybkZlYXR1cmVzWydyZXZlcnNlLXByZXZpZXcnXSA9IHtlbmFibGVkOiBpc1JldmVyc2VQcmV2aWV3RW5hYmxlZCwgdGVzdGFibGU6IGlzUmV2ZXJzZVByZXZpZXdFbmFibGVkfTtcbiAgICByZXR1cm4gcmV0dXJuRmVhdHVyZXM7XG59O1xuXG52YXIgYnVpbGRGZWF0dXJlTWFuYWdlciA9IGZ1bmN0aW9uKGxpYnJhcnlDb25maWd1cmF0aW9ucywgdGVuYW50LCBhbGxGZWF0dXJlcywgYXBpRmVhdHVyZXMpIHtcbiAgICBpZiAoISFhcGlGZWF0dXJlcykge1xuICAgICAgICBmZWF0dXJlcyA9IGFwaUZlYXR1cmVzO1xuICAgIH1cbiAgICByZXR1cm4gbmV3IEZlYXR1cmVNYW5hZ2VyKGZlYXR1cmVzLCBsaWJyYXJ5Q29uZmlndXJhdGlvbnMsIHRlbmFudCwgYWxsRmVhdHVyZXMsIFtcbiAgICAgICAge2NvbmZpZ3VyZUR5bmFtaWNGZWF0dXJlOiBfLnBhcnRpYWwoZ2V0RmVhdHVyZXNDb25maWd1cmVkRm9yUmV2ZXJzZVByZXZpZXcpfVxuICAgIF0pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBidWlsZEZlYXR1cmVNYW5hZ2VyO1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG52YXIgX19hc3NpZ24gPSAodGhpcyAmJiB0aGlzLl9fYXNzaWduKSB8fCBmdW5jdGlvbiAoKSB7XG4gICAgX19hc3NpZ24gPSBPYmplY3QuYXNzaWduIHx8IGZ1bmN0aW9uKHQpIHtcbiAgICAgICAgZm9yICh2YXIgcywgaSA9IDEsIG4gPSBhcmd1bWVudHMubGVuZ3RoOyBpIDwgbjsgaSsrKSB7XG4gICAgICAgICAgICBzID0gYXJndW1lbnRzW2ldO1xuICAgICAgICAgICAgZm9yICh2YXIgcCBpbiBzKSBpZiAoT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsIHApKVxuICAgICAgICAgICAgICAgIHRbcF0gPSBzW3BdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0O1xuICAgIH07XG4gICAgcmV0dXJuIF9fYXNzaWduLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG59O1xudmFyIF9faW1wb3J0RGVmYXVsdCA9ICh0aGlzICYmIHRoaXMuX19pbXBvcnREZWZhdWx0KSB8fCBmdW5jdGlvbiAobW9kKSB7XG4gICAgcmV0dXJuIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpID8gbW9kIDogeyBcImRlZmF1bHRcIjogbW9kIH07XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRUaXRsZUZ1bGZpbGxtZW50QnV0dG9uTGF5b3V0ID0gZXhwb3J0cy5nZXRBcGlGdWxmaWxsbWVudEJ1dHRvbkxheW91dCA9IGV4cG9ydHMuZ2V0RnVsZmlsbG1lbnRCdXR0b25MYXlvdXQgPSB2b2lkIDA7XG52YXIgbWVDb3VudHJ5Q29kZXNfanNvbl8xID0gX19pbXBvcnREZWZhdWx0KHJlcXVpcmUoXCJsaWdodG5pbmctY29tbW9uL2xpYi9jb25maWd1cmF0aW9uL21lQ291bnRyeUNvZGVzLmpzb25cIikpO1xudmFyIGdldEZvcm1hdEZvckxheW91dCA9IGZ1bmN0aW9uIChtZWRpYSkge1xuICAgIGlmIChtZWRpYS5pc0Zvcm1hdExvY2tlZEluICYmXG4gICAgICAgIG1lZGlhLm90aGVyRm9ybWF0cyAmJlxuICAgICAgICBtZWRpYS5vdGhlckZvcm1hdHMubGVuZ3RoID4gMCkge1xuICAgICAgICByZXR1cm4gbWVkaWEub3RoZXJGb3JtYXRzWzBdLmlkO1xuICAgIH1cbiAgICBlbHNlIGlmIChtZWRpYS5oYXNOb25LaW5kbGVOb25SZWFkRm9ybWF0ICYmXG4gICAgICAgIG1lZGlhLm5vbktpbmRsZU5vblJlYWRGb3JtYXRzICE9IHVuZGVmaW5lZCAmJlxuICAgICAgICBtZWRpYS5ub25LaW5kbGVOb25SZWFkRm9ybWF0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBtZWRpYS5ub25LaW5kbGVOb25SZWFkRm9ybWF0c1swXS5pZDtcbiAgICB9XG4gICAgZWxzZSBpZiAobWVkaWEuZm9ybWF0cyAhPSB1bmRlZmluZWQgJiYgbWVkaWEuZm9ybWF0cy5sZW5ndGggPiAwKSB7XG4gICAgICAgIHJldHVybiBtZWRpYS5mb3JtYXRzWzBdLmlkO1xuICAgIH1cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xufTtcbnZhciBzZXRNYWluQnV0dG9uRm9ybWF0ID0gZnVuY3Rpb24gKGJ1dHRvbkxheW91dCwgbWVkaWEsIGZlYXR1cmVNYW5hZ2VyKSB7XG4gICAgaWYgKGZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnc3Vuc2V0LWF1ZGlvYm9vay1yZXdyaXRlJykpIHtcbiAgICAgICAgaWYgKGJ1dHRvbkxheW91dC5tYWluQnV0dG9uID09ICdvdGhlcicgfHxcbiAgICAgICAgICAgIGJ1dHRvbkxheW91dC5tYWluQnV0dG9uID09ICd1bnN1cHBvcnRlZCcgfHxcbiAgICAgICAgICAgIGJ1dHRvbkxheW91dC5tYWluQnV0dG9uID09ICdkb3dubG9hZCcgfHxcbiAgICAgICAgICAgIGJ1dHRvbkxheW91dC5tYWluQnV0dG9uID09ICdhdWRpb2Jvb2snIHx8XG4gICAgICAgICAgICBidXR0b25MYXlvdXQuc2hvd090aGVyQnV0dG9uQmVsb3dEaXZpZGVyIHx8XG4gICAgICAgICAgICBidXR0b25MYXlvdXQuc3ViQnV0dG9uID09ICdhdWRpb2Jvb2snKSB7XG4gICAgICAgICAgICBidXR0b25MYXlvdXQuZm9ybWF0SUQgPSBnZXRGb3JtYXRGb3JMYXlvdXQobWVkaWEpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2UgaWYgKGJ1dHRvbkxheW91dC5tYWluQnV0dG9uID09ICdvdGhlcicgfHxcbiAgICAgICAgYnV0dG9uTGF5b3V0Lm1haW5CdXR0b24gPT0gJ3Vuc3VwcG9ydGVkJyB8fFxuICAgICAgICBidXR0b25MYXlvdXQuc2hvd090aGVyQnV0dG9uQmVsb3dEaXZpZGVyIHx8XG4gICAgICAgIGJ1dHRvbkxheW91dC5zdWJCdXR0b24gPT0gJ2F1ZGlvYm9vaycpIHtcbiAgICAgICAgYnV0dG9uTGF5b3V0LmZvcm1hdElEID0gZ2V0Rm9ybWF0Rm9yTGF5b3V0KG1lZGlhKTtcbiAgICB9XG4gICAgcmV0dXJuIGJ1dHRvbkxheW91dDtcbn07XG52YXIgc2V0QXVkaW9ib29rTWFpbkJ1dHRvbkxheW91dCA9IGZ1bmN0aW9uIChjdXJyZW50TGF5b3V0LCBzaG93T0RGb3JtYXRCdXR0b24sIGlzQXVkaW9ib29rQWZ0ZXJTdW5zZXQpIHtcbiAgICBpZiAoc2hvd09ERm9ybWF0QnV0dG9uKSB7XG4gICAgICAgIGN1cnJlbnRMYXlvdXQubWFpbkJ1dHRvbiA9ICdvZHJlYWQnO1xuICAgIH1cbiAgICBlbHNlIGlmIChpc0F1ZGlvYm9va0FmdGVyU3Vuc2V0KSB7XG4gICAgICAgIGN1cnJlbnRMYXlvdXQubWFpbkJ1dHRvbiA9ICdhdWRpb2Jvb2snO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgY3VycmVudExheW91dC5tYWluQnV0dG9uID0gJ2Rvd25sb2FkJztcbiAgICB9XG4gICAgcmV0dXJuIGN1cnJlbnRMYXlvdXQ7XG59O1xudmFyIHNldEF1ZGlvYm9va1N1YkJ1dHRvbkxheW91dCA9IGZ1bmN0aW9uIChjdXJyZW50TGF5b3V0LCBtZWRpYSwgaXNBdWRpb2Jvb2tBZnRlclN1bnNldCwgc2hvd0RpdmlkZXIpIHtcbiAgICBpZiAoaXNBdWRpb2Jvb2tBZnRlclN1bnNldCAmJiBjdXJyZW50TGF5b3V0Lm1haW5CdXR0b24gIT0gJ2F1ZGlvYm9vaycpIHtcbiAgICAgICAgcmV0dXJuIFsnYXVkaW9ib29rJywgdHJ1ZSwgZmFsc2VdO1xuICAgIH1cbiAgICBlbHNlIGlmIChtZWRpYS5pc0F1ZGlvYm9vayAmJlxuICAgICAgICBtZWRpYS5pc0Zvcm1hdExvY2tlZEluICYmXG4gICAgICAgIGN1cnJlbnRMYXlvdXQubWFpbkJ1dHRvbiAhPSAnYXVkaW9ib29rJyAmJlxuICAgICAgICBjdXJyZW50TGF5b3V0Lm1haW5CdXR0b24gIT0gJ2Rvd25sb2FkJyAmJlxuICAgICAgICBtZWRpYS5oYXNNcDNGb3JtYXQpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIGlzQXVkaW9ib29rQWZ0ZXJTdW5zZXQgPyAnYXVkaW9ib29rJyA6ICdkb3dubG9hZCcsXG4gICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgaXNBdWRpb2Jvb2tBZnRlclN1bnNldCA/IGZhbHNlIDogdHJ1ZSxcbiAgICAgICAgXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHJldHVybiBbdW5kZWZpbmVkLCBzaG93RGl2aWRlciwgZmFsc2VdO1xuICAgIH1cbn07XG52YXIgZ2V0Q2xlYW5NYWNXYXJuaW5nRGlzcGxheSA9IGZ1bmN0aW9uIChwcmVDbGVhbkxheW91dCwgbWVkaWEsIGZlYXR1cmVNYW5hZ2VyKSB7XG4gICAgaWYgKG1lZGlhLmlzQXVkaW9ib29rKSB7XG4gICAgICAgIHByZUNsZWFuTGF5b3V0LmZvcm1hdElEID0gJ2F1ZGlvYm9vay1tcDMnO1xuICAgIH1cbiAgICBpZiAocHJlQ2xlYW5MYXlvdXQuc2hvd01hY09zQXVkaW9ib29rU3VwcHJlc3Npb25TdHlsZSA9PSAnd2FybicgJiZcbiAgICAgICAgcHJlQ2xlYW5MYXlvdXQuc3ViQnV0dG9uID09ICdtcDNPbmx5Jykge1xuICAgICAgICBwcmVDbGVhbkxheW91dC5tYWluQnV0dG9uID0gJ2Rvd25sb2FkJztcbiAgICAgICAgcHJlQ2xlYW5MYXlvdXQuc3ViQnV0dG9uID0gdW5kZWZpbmVkO1xuICAgICAgICByZXR1cm4gc2V0TWFpbkJ1dHRvbkZvcm1hdChwcmVDbGVhbkxheW91dCwgbWVkaWEsIGZlYXR1cmVNYW5hZ2VyKTtcbiAgICB9XG4gICAgZWxzZSBpZiAocHJlQ2xlYW5MYXlvdXQuc2hvd01hY09zQXVkaW9ib29rU3VwcHJlc3Npb25TdHlsZSA9PSB1bmRlZmluZWQgfHxcbiAgICAgICAgcHJlQ2xlYW5MYXlvdXQuc2hvd01hY09zQXVkaW9ib29rU3VwcHJlc3Npb25TdHlsZSA9PSAnd2FybicpIHtcbiAgICAgICAgcmV0dXJuIHNldE1haW5CdXR0b25Gb3JtYXQocHJlQ2xlYW5MYXlvdXQsIG1lZGlhLCBmZWF0dXJlTWFuYWdlcik7XG4gICAgfVxuICAgIHZhciBtYWluQnV0dG9uO1xuICAgIGlmIChwcmVDbGVhbkxheW91dC5tYWluQnV0dG9uID09ICdvZHJlYWQnIHx8XG4gICAgICAgIHByZUNsZWFuTGF5b3V0LnN1YkJ1dHRvbiA9PSAnb2RyZWFkJykge1xuICAgICAgICBtYWluQnV0dG9uID0gJ29kcmVhZCc7XG4gICAgfVxuICAgIGVsc2UgaWYgKHByZUNsZWFuTGF5b3V0LnN1YkJ1dHRvbiA9PSAnbXAzT25seScgfHxcbiAgICAgICAgKG1lZGlhLmhhc01wM0Zvcm1hdCAmJiAhbWVkaWEuaGFzT3ZlcmRyaXZlRm9ybWF0KSkge1xuICAgICAgICBtYWluQnV0dG9uID0gJ3Vuc3VwcG9ydGVkJztcbiAgICB9XG4gICAgdmFyIG5ld0xheW91dCA9IHtcbiAgICAgICAgbWFpbkJ1dHRvbjogbWFpbkJ1dHRvbixcbiAgICAgICAgbWFpbkRyb3Bkb3duTGlzdEl0ZW1zOiBbXSxcbiAgICAgICAgc2hvd0RpdmlkZXI6IGZhbHNlLFxuICAgICAgICBzaG93RG93bmxvYWREcm9wZG93bkJlbG93RGl2aWRlcjogZmFsc2UsXG4gICAgICAgIHNob3dNYWNPc0F1ZGlvYm9va1N1cHByZXNzaW9uU3R5bGU6IHByZUNsZWFuTGF5b3V0LnNob3dNYWNPc0F1ZGlvYm9va1N1cHByZXNzaW9uU3R5bGUsXG4gICAgICAgIHNob3dOb0tpbmRsZVdhcm5pbmc6IGZhbHNlLFxuICAgICAgICBzaG93T3RoZXJCdXR0b25CZWxvd0RpdmlkZXI6IGZhbHNlLFxuICAgICAgICBzdWJCdXR0b246IHVuZGVmaW5lZCxcbiAgICAgICAgc3ViRHJvcGRvd25MaXN0SXRlbXM6IHVuZGVmaW5lZCxcbiAgICAgICAgc3VwcHJlc3NBdWRpb2Jvb2tCdXR0b246IG1lZGlhLnN1cHByZXNzQXVkaW9ib29rRG93bmxvYWRCdXR0b24sXG4gICAgfTtcbiAgICBpZiAobWVkaWEuaXNBdWRpb2Jvb2spIHtcbiAgICAgICAgbmV3TGF5b3V0LmZvcm1hdElEID0gJ2F1ZGlvYm9vay1tcDMnO1xuICAgIH1cbiAgICByZXR1cm4gc2V0TWFpbkJ1dHRvbkZvcm1hdChuZXdMYXlvdXQsIG1lZGlhLCBmZWF0dXJlTWFuYWdlcik7XG59O1xudmFyIGdldENsZWFuTm9uRG93bmxvYWRGb3JtYXRzID0gZnVuY3Rpb24gKG1lZGlhLCBsYXlvdXQsIGZlYXR1cmVNYW5hZ2VyLCBlbmFibGVkUGxhdGZvcm1zKSB7XG4gICAgaWYgKGZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnTEhUTkctNTY4MScpKSB7XG4gICAgICAgIC8vIG9ubHkgcmV0YWluIGRvd25sb2FkIGZvcm1hdHMgaWYgbm8gb3RoZXIgcGxhdGZvcm1zIGFyZSBlbmFibGVkXG4gICAgICAgIGlmICgoZW5hYmxlZFBsYXRmb3JtcyA9PT0gbnVsbCB8fCBlbmFibGVkUGxhdGZvcm1zID09PSB2b2lkIDAgPyB2b2lkIDAgOiBlbmFibGVkUGxhdGZvcm1zLmluY2x1ZGVzKCdsaWJieScpKSB8fFxuICAgICAgICAgICAgKGVuYWJsZWRQbGF0Zm9ybXMgPT09IG51bGwgfHwgZW5hYmxlZFBsYXRmb3JtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZW5hYmxlZFBsYXRmb3Jtcy5pbmNsdWRlcygnc29yYScpKSB8fFxuICAgICAgICAgICAgKGVuYWJsZWRQbGF0Zm9ybXMgPT09IG51bGwgfHwgZW5hYmxlZFBsYXRmb3JtcyA9PT0gdm9pZCAwID8gdm9pZCAwIDogZW5hYmxlZFBsYXRmb3Jtcy5pbmNsdWRlcygnZWxyb25kJykpKSB7XG4gICAgICAgICAgICBpZiAobWVkaWEuaXNBdWRpb2Jvb2sgJiYgbGF5b3V0Lm1haW5CdXR0b24gPT09ICdkb3dubG9hZCcpIHtcbiAgICAgICAgICAgICAgICBsYXlvdXQubWFpbkJ1dHRvbiA9ICd1bnN1cHBvcnRlZCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAobGF5b3V0LnN1YkJ1dHRvbiA9PT0gJ2F1ZGlvYm9vaycpIHtcbiAgICAgICAgICAgICAgICBsYXlvdXQuc3ViQnV0dG9uID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGxheW91dC5zaG93T3RoZXJCdXR0b25CZWxvd0RpdmlkZXIpIHtcbiAgICAgICAgICAgICAgICBsYXlvdXQuc2hvd090aGVyQnV0dG9uQmVsb3dEaXZpZGVyID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbGF5b3V0LnNob3dQZGZFcHViRG93bmxvYWRNZXNzYWdlID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGF5b3V0O1xufTtcbnZhciBnZXRGdWxmaWxsbWVudE1haW5CdXR0b25MYXlvdXQgPSBmdW5jdGlvbiAoZmVhdHVyZU1hbmFnZXIsIG1lZGlhLCBvbWMsIGlzQXVkaW9ib29rQWZ0ZXJTdW5zZXQpIHtcbiAgICB2YXIgbGF5b3V0ID0ge1xuICAgICAgICBtYWluQnV0dG9uOiB1bmRlZmluZWQsXG4gICAgICAgIG1haW5Ecm9wZG93bkxpc3RJdGVtczogW10sXG4gICAgICAgIHNob3dOb0tpbmRsZVdhcm5pbmc6IGZhbHNlLFxuICAgIH07XG4gICAgaWYgKG1lZGlhLmlzRm9ybWF0TG9ja2VkSW4pIHtcbiAgICAgICAgaWYgKG1lZGlhLm90aGVyRm9ybWF0cyA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gbGF5b3V0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChtZWRpYS5oYXNLaW5kbGVGb3JtYXQgJiYgbWVkaWEuaXNMb2NrZWRPbktpbmRsZSkge1xuICAgICAgICAgICAgbGF5b3V0Lm1haW5CdXR0b24gPSAna2luZGxlJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChmZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ3N1bnNldC1hdWRpb2Jvb2stcmV3cml0ZScpICYmXG4gICAgICAgICAgICBtZWRpYS5pc0F1ZGlvYm9vaykge1xuICAgICAgICAgICAgcmV0dXJuIHNldEF1ZGlvYm9va01haW5CdXR0b25MYXlvdXQobGF5b3V0LCBtZWRpYS5zaG93T0RGb3JtYXRCdXR0b24sIGlzQXVkaW9ib29rQWZ0ZXJTdW5zZXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1lZGlhLmlzQXVkaW9ib29rICYmXG4gICAgICAgICAgICAhb21jICYmXG4gICAgICAgICAgICBmZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ29kYXBwLXN1bnNldCcpKSB7XG4gICAgICAgICAgICBpZiAobWVkaWEuc2hvd09ERm9ybWF0QnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgbGF5b3V0Lm1haW5CdXR0b24gPSAnb2RyZWFkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghbWVkaWEuc3VwcHJlc3NBdWRpb2Jvb2tEb3dubG9hZEJ1dHRvbiAmJlxuICAgICAgICAgICAgIW1lZGlhLnNob3dPbmx5T3ZlckRyaXZlRm9ybWF0KSB7XG4gICAgICAgICAgICBsYXlvdXQubWFpbkJ1dHRvbiA9ICdvdGhlcic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxheW91dDtcbiAgICB9XG4gICAgaWYgKG1lZGlhLmlzRWJvb2spIHtcbiAgICAgICAgaWYgKG1lZGlhLmhhc0tpbmRsZUZvcm1hdCkge1xuICAgICAgICAgICAgbGF5b3V0Lm1haW5CdXR0b24gPSAna2luZGxlJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZWRpYS5zaG93Tm9LaW5kbGVNZXNzYWdlKSB7XG4gICAgICAgICAgICBsYXlvdXQuc2hvd05vS2luZGxlV2FybmluZyA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWVkaWEuc2hvd09ERm9ybWF0QnV0dG9uICYmXG4gICAgICAgICAgICBmZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ29kcmVhZC1mdWxmaWxsbWVudC1maXJzdCcpKSB7XG4gICAgICAgICAgICBsYXlvdXQubWFpbkJ1dHRvbiA9ICdvZHJlYWQnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1lZGlhLnNob3dOb25LaW5kbGVCdXR0b25BYm92ZURpdmlkZXIpIHtcbiAgICAgICAgICAgIGxheW91dC5tYWluQnV0dG9uID0gJ290aGVyJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGF5b3V0O1xuICAgIH1cbiAgICBpZiAoZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdzdW5zZXQtYXVkaW9ib29rLXJld3JpdGUnKSAmJlxuICAgICAgICBtZWRpYS5pc0F1ZGlvYm9vaykge1xuICAgICAgICByZXR1cm4gc2V0QXVkaW9ib29rTWFpbkJ1dHRvbkxheW91dChsYXlvdXQsIG1lZGlhLnNob3dPREZvcm1hdEJ1dHRvbiwgaXNBdWRpb2Jvb2tBZnRlclN1bnNldCk7XG4gICAgfVxuICAgIGVsc2UgaWYgKG1lZGlhLmlzQXVkaW9ib29rICYmXG4gICAgICAgICFvbWMgJiZcbiAgICAgICAgZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdvZGFwcC1zdW5zZXQnKSkge1xuICAgICAgICBpZiAobWVkaWEuc2hvd09ERm9ybWF0QnV0dG9uKSB7XG4gICAgICAgICAgICBsYXlvdXQubWFpbkJ1dHRvbiA9ICdvZHJlYWQnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXlvdXQ7XG4gICAgfVxuICAgIGlmICghbWVkaWEuaXNNYWdhemluZSAmJiAhbWVkaWEuc2hvd09ubHlPdmVyRHJpdmVGb3JtYXQpIHtcbiAgICAgICAgaWYgKG1lZGlhLnNob3dPREZvcm1hdEJ1dHRvbiAmJlxuICAgICAgICAgICAgZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdvZHJlYWQtZnVsZmlsbG1lbnQtZmlyc3QnKSkge1xuICAgICAgICAgICAgbGF5b3V0Lm1haW5CdXR0b24gPSAnb2RyZWFkJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghIW1lZGlhLm90aGVyRm9ybWF0cyAmJlxuICAgICAgICAgICAgbWVkaWEub3RoZXJGb3JtYXRzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgbWVkaWEuaGFzTm9uS2luZGxlTm9uUmVhZEZvcm1hdCAmJlxuICAgICAgICAgICAgIW1lZGlhLnN1cHByZXNzQXVkaW9ib29rRG93bmxvYWRCdXR0b24pIHtcbiAgICAgICAgICAgIGxheW91dC5tYWluQnV0dG9uID0gJ290aGVyJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghIW1lZGlhLm90aGVyRm9ybWF0cyAmJiBtZWRpYS5vdGhlckZvcm1hdHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgbGF5b3V0Lm1haW5CdXR0b24gPSAnZG93bmxvYWQnO1xuICAgICAgICAgICAgbGF5b3V0Lm1haW5Ecm9wZG93bkxpc3RJdGVtcyA9IG1lZGlhLm5vbktpbmRsZU5vblJlYWRGb3JtYXRzIHx8IFtdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsYXlvdXQ7XG59O1xudmFyIGdldEFwaUZ1bGZpbGxtZW50TWFpbkJ1dHRvbkxheW91dCA9IGZ1bmN0aW9uIChmZWF0dXJlTWFuYWdlciwgbWVkaWEsIGlzQXVkaW9ib29rQWZ0ZXJTdW5zZXQpIHtcbiAgICB2YXIgbGF5b3V0ID0ge1xuICAgICAgICBtYWluQnV0dG9uOiB1bmRlZmluZWQsXG4gICAgICAgIG1haW5Ecm9wZG93bkxpc3RJdGVtczogW10sXG4gICAgICAgIHNob3dOb0tpbmRsZVdhcm5pbmc6IGZhbHNlLFxuICAgIH07XG4gICAgaWYgKG1lZGlhLmlzRm9ybWF0TG9ja2VkSW4pIHtcbiAgICAgICAgLy8gY3VyaW91cyB3aHkgd2UncmUgbWlzc2luZyBhZG9iZSBjaGVjayBoZXJlIHRoYXQncyBpbiBUaXRsZSBGdWxmaWxsbWVudD9cbiAgICAgICAgaWYgKG1lZGlhLm90aGVyRm9ybWF0cyAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAobWVkaWEuaGFzS2luZGxlRm9ybWF0ICYmIG1lZGlhLmlzTG9ja2VkT25LaW5kbGUpIHtcbiAgICAgICAgICAgICAgICBsYXlvdXQubWFpbkJ1dHRvbiA9ICdraW5kbGUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdzdW5zZXQtYXVkaW9ib29rLXJld3JpdGUnKSAmJlxuICAgICAgICAgICAgICAgIG1lZGlhLmlzQXVkaW9ib29rKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHNldEF1ZGlvYm9va01haW5CdXR0b25MYXlvdXQobGF5b3V0LCBtZWRpYS5zaG93T0RGb3JtYXRCdXR0b24sIGlzQXVkaW9ib29rQWZ0ZXJTdW5zZXQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAobWVkaWEuaXNBdWRpb2Jvb2spIHtcbiAgICAgICAgICAgICAgICBpZiAobWVkaWEuc2hvd09ERm9ybWF0QnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGxheW91dC5tYWluQnV0dG9uID0gJ29kcmVhZCc7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIW1lZGlhLnN1cHByZXNzQXVkaW9ib29rRG93bmxvYWRCdXR0b24gJiZcbiAgICAgICAgICAgICAgICAhbWVkaWEuc2hvd09ubHlPdmVyRHJpdmVGb3JtYXQpIHtcbiAgICAgICAgICAgICAgICBsYXlvdXQubWFpbkJ1dHRvbiA9ICdkb3dubG9hZCc7XG4gICAgICAgICAgICAgICAgbGF5b3V0Lm1haW5Ecm9wZG93bkxpc3RJdGVtcyA9IG1lZGlhLm90aGVyRm9ybWF0cyB8fCBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGF5b3V0O1xuICAgIH1cbiAgICBpZiAobWVkaWEuaXNFYm9vaykge1xuICAgICAgICBpZiAobWVkaWEuaGFzS2luZGxlRm9ybWF0KSB7XG4gICAgICAgICAgICBsYXlvdXQubWFpbkJ1dHRvbiA9ICdraW5kbGUnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1lZGlhLnNob3dPREZvcm1hdEJ1dHRvbiAmJlxuICAgICAgICAgICAgZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdvZHJlYWQtZnVsZmlsbG1lbnQtZmlyc3QnKSkge1xuICAgICAgICAgICAgbGF5b3V0Lm1haW5CdXR0b24gPSAnb2RyZWFkJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZWRpYS5zaG93Tm9uS2luZGxlQnV0dG9uQWJvdmVEaXZpZGVyKSB7XG4gICAgICAgICAgICBsYXlvdXQubWFpbkJ1dHRvbiA9ICdkb3dubG9hZCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxheW91dDtcbiAgICB9XG4gICAgaWYgKGZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnc3Vuc2V0LWF1ZGlvYm9vay1yZXdyaXRlJykgJiZcbiAgICAgICAgbWVkaWEuaXNBdWRpb2Jvb2spIHtcbiAgICAgICAgcmV0dXJuIHNldEF1ZGlvYm9va01haW5CdXR0b25MYXlvdXQobGF5b3V0LCBtZWRpYS5zaG93T0RGb3JtYXRCdXR0b24sIGlzQXVkaW9ib29rQWZ0ZXJTdW5zZXQpO1xuICAgIH1cbiAgICBlbHNlIGlmIChtZWRpYS5pc0F1ZGlvYm9vayAmJiBtZWRpYS5oYXNPdmVyZHJpdmVGb3JtYXQpIHtcbiAgICAgICAgaWYgKG1lZGlhLnNob3dPREZvcm1hdEJ1dHRvbikge1xuICAgICAgICAgICAgbGF5b3V0Lm1haW5CdXR0b24gPSAnb2RyZWFkJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGF5b3V0O1xuICAgIH1cbiAgICBpZiAoIShtZWRpYS5oYXNNcDNGb3JtYXQgJiYgIW1lZGlhLmhhc092ZXJkcml2ZUZvcm1hdCkgJiZcbiAgICAgICAgIW1lZGlhLmlzTWFnYXppbmUgJiZcbiAgICAgICAgIW1lZGlhLnNob3dPbmx5T3ZlckRyaXZlRm9ybWF0KSB7XG4gICAgICAgIGlmICghIW1lZGlhLm90aGVyRm9ybWF0cyAmJlxuICAgICAgICAgICAgbWVkaWEub3RoZXJGb3JtYXRzLmxlbmd0aCA9PT0gMSAmJlxuICAgICAgICAgICAgbWVkaWEuaGFzTm9uS2luZGxlTm9uUmVhZEZvcm1hdCAmJlxuICAgICAgICAgICAgIW1lZGlhLnN1cHByZXNzQXVkaW9ib29rRG93bmxvYWRCdXR0b24pIHtcbiAgICAgICAgICAgIGxheW91dC5tYWluQnV0dG9uID0gJ2Rvd25sb2FkJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghIW1lZGlhLm90aGVyRm9ybWF0cyAmJiBtZWRpYS5vdGhlckZvcm1hdHMubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgbGF5b3V0Lm1haW5CdXR0b24gPSAnZG93bmxvYWQnO1xuICAgICAgICAgICAgbGF5b3V0Lm1haW5Ecm9wZG93bkxpc3RJdGVtcyA9IG1lZGlhLm5vbktpbmRsZU5vblJlYWRGb3JtYXRzIHx8IFtdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsYXlvdXQ7XG59O1xudmFyIGdldFRpdGxlRnVsZmlsbG1lbnRNYWluQnV0dG9uTGF5b3V0ID0gZnVuY3Rpb24gKGZlYXR1cmVNYW5hZ2VyLCBtZWRpYSwgaXNJcGFkLCBpc0F1ZGlvYm9va0FmdGVyU3Vuc2V0LCBpbkFwcCwgc3VwcHJlc3NBdWRpb2Jvb2tCdXR0b24pIHtcbiAgICB2YXIgbGF5b3V0ID0ge1xuICAgICAgICBtYWluQnV0dG9uOiB1bmRlZmluZWQsXG4gICAgICAgIG1haW5Ecm9wZG93bkxpc3RJdGVtczogW10sXG4gICAgICAgIHNob3dNYWluRHJvcGRvd246IGZhbHNlLFxuICAgICAgICBzaG93Tm9LaW5kbGVXYXJuaW5nOiBmYWxzZSxcbiAgICB9O1xuICAgIC8vRm9ybWF0IGxvY2tlZCBpbiBzaG91bGQgbmV2ZXIgaGFwcGVuIGZvciBUaXRsZSBGdWxmaWxsbWVudC5cbiAgICBpZiAobWVkaWEuaXNGb3JtYXRMb2NrZWRJbiAmJlxuICAgICAgICAhZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdzdW5zZXQtYXVkaW9ib29rLXJld3JpdGUnKSkge1xuICAgICAgICBpZiAobWVkaWEub3RoZXJGb3JtYXRzICYmXG4gICAgICAgICAgICBtZWRpYS5vdGhlckZvcm1hdHNbMF0uaWQgPT09ICdlYm9vay1lcHViLWFkb2JlJykge1xuICAgICAgICAgICAgbGF5b3V0Lm1haW5CdXR0b24gPSAna2luZGxlJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0F1ZGlvYm9va0FmdGVyU3Vuc2V0KSB7XG4gICAgICAgICAgICBpZiAobWVkaWEuc2hvd09ERm9ybWF0QnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgbGF5b3V0Lm1haW5CdXR0b24gPSAnb2RyZWFkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdoaWRlLWRpc2FibGVkLWZvcm1hdHMnKSB8fFxuICAgICAgICAgICAgbWVkaWEuaGFzTm9uS2luZGxlTm9uUmVhZEZvcm1hdCkge1xuICAgICAgICAgICAgbGF5b3V0Lm1haW5CdXR0b24gPSAnb3RoZXInO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXlvdXQ7XG4gICAgfVxuICAgIGlmIChtZWRpYS5pc0Vib29rKSB7XG4gICAgICAgIGlmIChtZWRpYS5oYXNLaW5kbGVGb3JtYXQpIHtcbiAgICAgICAgICAgIGxheW91dC5tYWluQnV0dG9uID0gJ2tpbmRsZSc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWVkaWEuc2hvd05vS2luZGxlTWVzc2FnZSkge1xuICAgICAgICAgICAgbGF5b3V0LnNob3dOb0tpbmRsZVdhcm5pbmcgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1lZGlhLnNob3dPREZvcm1hdEJ1dHRvbiAmJlxuICAgICAgICAgICAgZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdvZHJlYWQtZnVsZmlsbG1lbnQtZmlyc3QnKSkge1xuICAgICAgICAgICAgbGF5b3V0Lm1haW5CdXR0b24gPSAnb2RyZWFkJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZWRpYS5zaG93Tm9uS2luZGxlQnV0dG9uQWJvdmVEaXZpZGVyKSB7XG4gICAgICAgICAgICBsYXlvdXQubWFpbkJ1dHRvbiA9ICdkb3dubG9hZCc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGxheW91dDtcbiAgICB9XG4gICAgaWYgKG1lZGlhLmlzQXVkaW9ib29rKSB7XG4gICAgICAgIGlmIChpc0lwYWQgJiYgbWVkaWEuaGFzTXAzRm9ybWF0KSB7XG4gICAgICAgICAgICAvLyDwn5isXG4gICAgICAgICAgICBpZiAoISFtZWRpYS5vdGhlckZvcm1hdHMpIHtcbiAgICAgICAgICAgICAgICBtZWRpYS5vdGhlckZvcm1hdHMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICdNUDMgYXVkaW9ib29rJyxcbiAgICAgICAgICAgICAgICAgICAgaWQ6ICdhdWRpb2Jvb2stbXAzJyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdzdW5zZXQtYXVkaW9ib29rLXJld3JpdGUnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHNldEF1ZGlvYm9va01haW5CdXR0b25MYXlvdXQobGF5b3V0LCBtZWRpYS5zaG93T0RGb3JtYXRCdXR0b24sIGlzQXVkaW9ib29rQWZ0ZXJTdW5zZXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGlzQXVkaW9ib29rQWZ0ZXJTdW5zZXQpIHtcbiAgICAgICAgICAgIGlmIChtZWRpYS5zaG93T0RGb3JtYXRCdXR0b24pIHtcbiAgICAgICAgICAgICAgICBsYXlvdXQubWFpbkJ1dHRvbiA9ICdvZHJlYWQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1lZGlhLnNob3dPREZvcm1hdEJ1dHRvbiAmJlxuICAgICAgICAgICAgZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdvZHJlYWQtZnVsZmlsbG1lbnQtZmlyc3QnKSkge1xuICAgICAgICAgICAgbGF5b3V0Lm1haW5CdXR0b24gPSAnb2RyZWFkJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICghbWVkaWEuc2hvd09ubHlPdmVyRHJpdmVGb3JtYXQpIHtcbiAgICAgICAgICAgIGxheW91dC5tYWluQnV0dG9uID0gJ2Rvd25sb2FkJztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGF5b3V0O1xuICAgIH1cbiAgICBpZiAoIW1lZGlhLmlzTWFnYXppbmUpIHtcbiAgICAgICAgaWYgKCEhbWVkaWEub3RoZXJGb3JtYXRzICYmXG4gICAgICAgICAgICAobWVkaWEub3RoZXJGb3JtYXRzLmxlbmd0aCA9PT0gMSB8fFxuICAgICAgICAgICAgICAgIChtZWRpYS5vdGhlckZvcm1hdHMubGVuZ3RoID09PSAxICYmIGluQXBwKSkgJiZcbiAgICAgICAgICAgICFzdXBwcmVzc0F1ZGlvYm9va0J1dHRvbikge1xuICAgICAgICAgICAgbGF5b3V0Lm1haW5CdXR0b24gPSAnZG93bmxvYWQnO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCEhbWVkaWEub3RoZXJGb3JtYXRzICYmIG1lZGlhLm90aGVyRm9ybWF0cy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICBsYXlvdXQuc2hvd01haW5Ecm9wZG93biA9IHRydWU7XG4gICAgICAgICAgICBsYXlvdXQubWFpbkRyb3Bkb3duTGlzdEl0ZW1zID0gbWVkaWEubm9uS2luZGxlTm9uUmVhZEZvcm1hdHMgfHwgW107XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGxheW91dDtcbn07XG52YXIgaXNUb2xpbm9VbnN1cHBvcnRlZEJ1dHRvblR5cGUgPSBmdW5jdGlvbiAoYnV0dG9uKSB7XG4gICAgcmV0dXJuIChidXR0b24gPT09ICdhdWRpb2Jvb2snIHx8IGJ1dHRvbiA9PT0gJ2tpbmRsZScgfHwgYnV0dG9uID09PSAnbXAzT25seScpO1xufTtcbnZhciBpc1Vuc3VwcG9ydGVkVG9saW5vRm9ybWF0ID0gZnVuY3Rpb24gKGZvcm1hdCkge1xuICAgIGlmIChmb3JtYXQgPT09IHVuZGVmaW5lZClcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgdmFyIGZvcm1hdFBhcnRzID0gZm9ybWF0LnNwbGl0KCctJyk7XG4gICAgcmV0dXJuIGZvcm1hdC5pbmRleE9mKCdlYm9vaycpID4gLTEgJiYgZm9ybWF0UGFydHMubGVuZ3RoID49IDJcbiAgICAgICAgPyBbJ2tvYm8nLCAnbWVkaWEnLCAna2luZGxlJ10uaW5jbHVkZXMoZm9ybWF0UGFydHNbMV0pXG4gICAgICAgIDogdHJ1ZTtcbn07XG52YXIgbW9kaWZ5QnV0dG9uc0ZvclRvbGlubyA9IGZ1bmN0aW9uIChtZWRpYSwgZmVhdHVyZU1hbmFnZXIsIGN1cnJlbnRMYXlvdXQpIHtcbiAgICBpZiAoY3VycmVudExheW91dC5zaG93TWFpbkRyb3Bkb3duKSB7XG4gICAgICAgIGN1cnJlbnRMYXlvdXQubWFpbkRyb3Bkb3duTGlzdEl0ZW1zID1cbiAgICAgICAgICAgIG1lZGlhLnRvbGlub1N1cHBvcnRlZERyb3Bkb3duRm9ybWF0cyB8fCBbXTtcbiAgICAgICAgY3VycmVudExheW91dC5zaG93TWFpbkRyb3Bkb3duID1cbiAgICAgICAgICAgIGN1cnJlbnRMYXlvdXQubWFpbkRyb3Bkb3duTGlzdEl0ZW1zLmxlbmd0aCA+IDA7XG4gICAgfVxuICAgIGlmIChjdXJyZW50TGF5b3V0LnNob3dEb3dubG9hZERyb3Bkb3duQmVsb3dEaXZpZGVyKSB7XG4gICAgICAgIGN1cnJlbnRMYXlvdXQuc3ViRHJvcGRvd25MaXN0SXRlbXMgPVxuICAgICAgICAgICAgbWVkaWEudG9saW5vU3VwcG9ydGVkRHJvcGRvd25Gb3JtYXRzIHx8IFtdO1xuICAgICAgICBjdXJyZW50TGF5b3V0LnNob3dEb3dubG9hZERyb3Bkb3duQmVsb3dEaXZpZGVyID1cbiAgICAgICAgICAgIGN1cnJlbnRMYXlvdXQuc3ViRHJvcGRvd25MaXN0SXRlbXMubGVuZ3RoID4gMDtcbiAgICB9XG4gICAgY3VycmVudExheW91dC5zaG93T3RoZXJCdXR0b25CZWxvd0RpdmlkZXIgPVxuICAgICAgICBjdXJyZW50TGF5b3V0LnNob3dPdGhlckJ1dHRvbkJlbG93RGl2aWRlclxuICAgICAgICAgICAgPyAhaXNVbnN1cHBvcnRlZFRvbGlub0Zvcm1hdChnZXRGb3JtYXRGb3JMYXlvdXQobWVkaWEpKVxuICAgICAgICAgICAgOiBmYWxzZTtcbiAgICBpZiAoaXNUb2xpbm9VbnN1cHBvcnRlZEJ1dHRvblR5cGUoY3VycmVudExheW91dC5tYWluQnV0dG9uKSB8fFxuICAgICAgICBjdXJyZW50TGF5b3V0Lm1haW5CdXR0b24gPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAoY3VycmVudExheW91dC5tYWluQnV0dG9uID09PSAnb2RyZWFkJyAmJiBtZWRpYS5pc0F1ZGlvYm9vaykgfHxcbiAgICAgICAgKChjdXJyZW50TGF5b3V0Lm1haW5CdXR0b24gPT09ICdvdGhlcicgfHxcbiAgICAgICAgICAgIGN1cnJlbnRMYXlvdXQubWFpbkJ1dHRvbiA9PT0gJ2Rvd25sb2FkJykgJiZcbiAgICAgICAgICAgIGlzVW5zdXBwb3J0ZWRUb2xpbm9Gb3JtYXQoZ2V0Rm9ybWF0Rm9yTGF5b3V0KG1lZGlhKSkpKSB7XG4gICAgICAgIGlmIChjdXJyZW50TGF5b3V0LnN1YkJ1dHRvbiA9PT0gJ29kcmVhZCcpIHtcbiAgICAgICAgICAgIGN1cnJlbnRMYXlvdXQubWFpbkJ1dHRvbiA9ICdvZHJlYWQnO1xuICAgICAgICAgICAgY3VycmVudExheW91dC5zdWJCdXR0b24gPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoY3VycmVudExheW91dC5zaG93T3RoZXJCdXR0b25CZWxvd0RpdmlkZXIpIHtcbiAgICAgICAgICAgIGN1cnJlbnRMYXlvdXQubWFpbkJ1dHRvbiA9PSAnZG93bmxvYWQnO1xuICAgICAgICAgICAgY3VycmVudExheW91dC5zdWJCdXR0b24gPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjdXJyZW50TGF5b3V0LnNob3dPdGhlckJ1dHRvbkJlbG93RGl2aWRlciA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGN1cnJlbnRMYXlvdXQuc2hvd0Rvd25sb2FkRHJvcGRvd25CZWxvd0RpdmlkZXIpIHtcbiAgICAgICAgICAgIGN1cnJlbnRMYXlvdXQubWFpbkJ1dHRvbiA9IGN1cnJlbnRMYXlvdXQuc3ViQnV0dG9uID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgY3VycmVudExheW91dC5zaG93RGl2aWRlciA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY3VycmVudExheW91dC5tYWluQnV0dG9uID0gJ3Vuc3VwcG9ydGVkJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIGlmIChjdXJyZW50TGF5b3V0LnN1YkJ1dHRvbiAhPSB1bmRlZmluZWQgJiZcbiAgICAgICAgaXNUb2xpbm9VbnN1cHBvcnRlZEJ1dHRvblR5cGUoY3VycmVudExheW91dC5zdWJCdXR0b24pKSB7XG4gICAgICAgIGN1cnJlbnRMYXlvdXQuc3ViQnV0dG9uID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBjdXJyZW50TGF5b3V0LnNob3dEaXZpZGVyID1cbiAgICAgICAgY3VycmVudExheW91dC5zaG93T3RoZXJCdXR0b25CZWxvd0RpdmlkZXIgfHxcbiAgICAgICAgICAgIGN1cnJlbnRMYXlvdXQuc2hvd0Rvd25sb2FkRHJvcGRvd25CZWxvd0RpdmlkZXI7XG4gICAgcmV0dXJuIGN1cnJlbnRMYXlvdXQ7XG59O1xuLyoqXG4gKiBHZW5lcmF0ZXMgdGhlIGxheW91dCBvZiB0aGUgZnVsZmlsbG1lbnQgYnV0dG9ucyBmb3IgdGhlIGdpdmVuIG1lZGlhLlxuICogQHBhcmFtIHtGZWF0dXJlTWFuYWdlcn0gZmVhdHVyZU1hbmFnZXIgRmVhdHVyZSBtYW5hZ2VyXG4gKiBAcGFyYW0ge01lZGlhfSBtZWRpYSBCb29rIG1ldGFkYXRhXG4gKiBAcGFyYW0geyp9IG9wdGlvbnMgSW5jbHVkZXMgYWRkaXRpb25hbCBjb250ZXh0IGluZm9ybWF0aW9uIGZvciB0aGUgbWVkaWEgdGl0bGVcbiAqIEByZXR1cm5zIEEgbWFwIG9mIHdoYXQgZnVsZmlsbG1lbnQgYnV0dG9ucyB0byBkaXNwbGF5IHRvIHRoZSB1c2VyXG4gKi9cbnZhciBnZXRGdWxmaWxsbWVudEJ1dHRvbkxheW91dCA9IGZ1bmN0aW9uIChmZWF0dXJlTWFuYWdlciwgbWVkaWEsIG9wdGlvbnMpIHtcbiAgICB2YXIgX2E7XG4gICAgdmFyIGlzQXVkaW9ib29rQWZ0ZXJTdW5zZXQgPSAhb3B0aW9ucy5vbWMgJiZcbiAgICAgICAgbWVkaWEuaXNBdWRpb2Jvb2sgJiZcbiAgICAgICAgKGZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnZGlzYWJsZU9kQXBwQWNjZXNzJykgfHxcbiAgICAgICAgICAgIGZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgncHJvbW90ZUxpYmJ5JykpO1xuICAgIHZhciBtYWluQnV0dG9uTGF5b3V0ID0gZ2V0RnVsZmlsbG1lbnRNYWluQnV0dG9uTGF5b3V0KGZlYXR1cmVNYW5hZ2VyLCBtZWRpYSwgb3B0aW9ucy5vbWMsIGlzQXVkaW9ib29rQWZ0ZXJTdW5zZXQpO1xuICAgIHZhciBzdWJCdXR0b247XG4gICAgdmFyIHNob3dEaXZpZGVyID0gbWVkaWEuc2hvd0RpdmlkZXI7XG4gICAgdmFyIHNob3dPdGhlckJ1dHRvbkJlbG93RGl2aWRlciA9IGZhbHNlO1xuICAgIGlmIChmZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ3N1bnNldC1hdWRpb2Jvb2stcmV3cml0ZScpKSB7XG4gICAgICAgIGlmIChtZWRpYS5zaG93T0RGb3JtYXRCdXR0b24gJiZcbiAgICAgICAgICAgIG1haW5CdXR0b25MYXlvdXQubWFpbkJ1dHRvbiAhPSAnb2RyZWFkJykge1xuICAgICAgICAgICAgc3ViQnV0dG9uID0gJ29kcmVhZCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWVkaWEuaXNBdWRpb2Jvb2spIHtcbiAgICAgICAgICAgIF9hID0gc2V0QXVkaW9ib29rU3ViQnV0dG9uTGF5b3V0KG1haW5CdXR0b25MYXlvdXQsIG1lZGlhLCBpc0F1ZGlvYm9va0FmdGVyU3Vuc2V0LCBzaG93RGl2aWRlciksIHN1YkJ1dHRvbiA9IF9hWzBdLCBzaG93RGl2aWRlciA9IF9hWzFdLCBzaG93T3RoZXJCdXR0b25CZWxvd0RpdmlkZXIgPSBfYVsyXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKG1lZGlhLmlzQXVkaW9ib29rICYmXG4gICAgICAgICAgICAhb3B0aW9ucy5vbWMgJiZcbiAgICAgICAgICAgIGZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnb2RhcHAtc3Vuc2V0JykpIHtcbiAgICAgICAgICAgIHN1YkJ1dHRvbiA9ICdhdWRpb2Jvb2snO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1lZGlhLnNob3dPREZvcm1hdEJ1dHRvbiAmJlxuICAgICAgICAgICAgbWFpbkJ1dHRvbkxheW91dC5tYWluQnV0dG9uICE9ICdvZHJlYWQnKSB7XG4gICAgICAgICAgICBzdWJCdXR0b24gPSAnb2RyZWFkJztcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgc2hvd0Rvd25sb2FkRHJvcGRvd25CZWxvd0RpdmlkZXIgPSBmYWxzZTtcbiAgICB2YXIgc3ViRHJvcGRvd25MaXN0SXRlbXMgPSBbXTtcbiAgICBpZiAobWVkaWEuc2hvd05vbktpbmRsZUJ1dHRvbkJlbG93RGl2aWRlciAmJiBzdWJCdXR0b24gIT0gJ2F1ZGlvYm9vaycpIHtcbiAgICAgICAgc2hvd090aGVyQnV0dG9uQmVsb3dEaXZpZGVyID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAobWVkaWEuc2hvd0Rvd25sb2FkRHJvcGRvd24pIHtcbiAgICAgICAgc2hvd0Rvd25sb2FkRHJvcGRvd25CZWxvd0RpdmlkZXIgPSB0cnVlO1xuICAgICAgICBzdWJEcm9wZG93bkxpc3RJdGVtcyA9IG1lZGlhLm5vbktpbmRsZU5vblJlYWRGb3JtYXRzIHx8IFtdO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pc1RvbGlub0RldmljZSkge1xuICAgICAgICB2YXIgbmV3TGF5b3V0ID0gbW9kaWZ5QnV0dG9uc0ZvclRvbGlubyhtZWRpYSwgZmVhdHVyZU1hbmFnZXIsIHtcbiAgICAgICAgICAgIG1haW5CdXR0b246IG1haW5CdXR0b25MYXlvdXQubWFpbkJ1dHRvbixcbiAgICAgICAgICAgIHNob3dNYWluRHJvcGRvd246IG1haW5CdXR0b25MYXlvdXQuc2hvd01haW5Ecm9wZG93bixcbiAgICAgICAgICAgIG1haW5Ecm9wZG93bkxpc3RJdGVtczogbWFpbkJ1dHRvbkxheW91dC5tYWluRHJvcGRvd25MaXN0SXRlbXMsXG4gICAgICAgICAgICBzaG93RGl2aWRlcjogc2hvd0RpdmlkZXIsXG4gICAgICAgICAgICBzaG93RG93bmxvYWREcm9wZG93bkJlbG93RGl2aWRlcjogc2hvd0Rvd25sb2FkRHJvcGRvd25CZWxvd0RpdmlkZXIsXG4gICAgICAgICAgICBzaG93T3RoZXJCdXR0b25CZWxvd0RpdmlkZXI6IHNob3dPdGhlckJ1dHRvbkJlbG93RGl2aWRlcixcbiAgICAgICAgICAgIHN1YkJ1dHRvbjogc3ViQnV0dG9uLFxuICAgICAgICAgICAgc3ViRHJvcGRvd25MaXN0SXRlbXM6IHN1YkRyb3Bkb3duTGlzdEl0ZW1zLFxuICAgICAgICB9KTtcbiAgICAgICAgbWFpbkJ1dHRvbkxheW91dC5tYWluQnV0dG9uID0gbmV3TGF5b3V0Lm1haW5CdXR0b247XG4gICAgICAgIHN1YkJ1dHRvbiA9IG5ld0xheW91dC5zdWJCdXR0b247XG4gICAgICAgIHNob3dEaXZpZGVyID0gbmV3TGF5b3V0LnNob3dEaXZpZGVyO1xuICAgICAgICBzaG93RG93bmxvYWREcm9wZG93bkJlbG93RGl2aWRlciA9XG4gICAgICAgICAgICBuZXdMYXlvdXQuc2hvd0Rvd25sb2FkRHJvcGRvd25CZWxvd0RpdmlkZXI7XG4gICAgICAgIHN1YkRyb3Bkb3duTGlzdEl0ZW1zID0gbmV3TGF5b3V0LnN1YkRyb3Bkb3duTGlzdEl0ZW1zIHx8IFtdO1xuICAgICAgICBzaG93T3RoZXJCdXR0b25CZWxvd0RpdmlkZXIgPSBuZXdMYXlvdXQuc2hvd090aGVyQnV0dG9uQmVsb3dEaXZpZGVyO1xuICAgICAgICBtYWluQnV0dG9uTGF5b3V0Lm1haW5Ecm9wZG93bkxpc3RJdGVtcyA9XG4gICAgICAgICAgICBuZXdMYXlvdXQubWFpbkRyb3Bkb3duTGlzdEl0ZW1zIHx8IFtdO1xuICAgICAgICBtYWluQnV0dG9uTGF5b3V0LnNob3dNYWluRHJvcGRvd24gPSBuZXdMYXlvdXQuc2hvd01haW5Ecm9wZG93bjtcbiAgICB9XG4gICAgdmFyIHNob3dNYWNPc0F1ZGlvYm9va1N1cHByZXNzaW9uU3R5bGU7XG4gICAgaWYgKG1lZGlhLmlzTWFjICYmXG4gICAgICAgIG1lZGlhLmlzQXVkaW9ib29rICYmXG4gICAgICAgIGZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnbWFjT1NBdWRpb2Jvb2tNZXNzYWdpbmcnKSAmJlxuICAgICAgICAhb3B0aW9ucy5pbkFwcCkge1xuICAgICAgICBzaG93TWFjT3NBdWRpb2Jvb2tTdXBwcmVzc2lvblN0eWxlID0gIW1lZGlhLmlzUHJlQ2F0YWxpbmFNYWNcbiAgICAgICAgICAgID8gJ3N1cHByZXNzJ1xuICAgICAgICAgICAgOiAnd2Fybic7XG4gICAgfVxuICAgIHZhciBtYWNDbGVhbkxheW91dCA9IGdldENsZWFuTWFjV2FybmluZ0Rpc3BsYXkoe1xuICAgICAgICBtYWluQnV0dG9uOiBtYWluQnV0dG9uTGF5b3V0Lm1haW5CdXR0b24sXG4gICAgICAgIG1haW5Ecm9wZG93bkxpc3RJdGVtczogbWFpbkJ1dHRvbkxheW91dC5tYWluRHJvcGRvd25MaXN0SXRlbXMsXG4gICAgICAgIHNob3dEaXZpZGVyOiBzaG93RGl2aWRlcixcbiAgICAgICAgc2hvd0Rvd25sb2FkRHJvcGRvd25CZWxvd0RpdmlkZXI6IHNob3dEb3dubG9hZERyb3Bkb3duQmVsb3dEaXZpZGVyLFxuICAgICAgICBzaG93TWFjT3NBdWRpb2Jvb2tTdXBwcmVzc2lvblN0eWxlOiBzaG93TWFjT3NBdWRpb2Jvb2tTdXBwcmVzc2lvblN0eWxlLFxuICAgICAgICBzaG93Tm9LaW5kbGVXYXJuaW5nOiBtYWluQnV0dG9uTGF5b3V0LnNob3dOb0tpbmRsZVdhcm5pbmcsXG4gICAgICAgIHNob3dPdGhlckJ1dHRvbkJlbG93RGl2aWRlcjogc2hvd090aGVyQnV0dG9uQmVsb3dEaXZpZGVyLFxuICAgICAgICBzdWJCdXR0b246IHN1YkJ1dHRvbixcbiAgICAgICAgc3ViRHJvcGRvd25MaXN0SXRlbXM6IHN1YkRyb3Bkb3duTGlzdEl0ZW1zLFxuICAgICAgICBzdXBwcmVzc0F1ZGlvYm9va0J1dHRvbjogc2hvd01hY09zQXVkaW9ib29rU3VwcHJlc3Npb25TdHlsZSAhPT0gdW5kZWZpbmVkLFxuICAgIH0sIG1lZGlhLCBmZWF0dXJlTWFuYWdlcik7XG4gICAgaWYgKG1lZGlhLmlzQXVkaW9ib29rICYmXG4gICAgICAgIG1hY0NsZWFuTGF5b3V0Lm1haW5CdXR0b24gPT09ICdvZHJlYWQnICYmXG4gICAgICAgIG1hY0NsZWFuTGF5b3V0LnN1YkJ1dHRvbiA9PT0gJ2F1ZGlvYm9vaycgJiZcbiAgICAgICAgbWVkaWEuaGFzTm9uS2luZGxlTm9uUmVhZEZvcm1hdCAmJlxuICAgICAgICAhZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdwcm9tb3RlTGliYnknKSkge1xuICAgICAgICBtYWNDbGVhbkxheW91dC5zaG93RGl2aWRlciA9IGZhbHNlO1xuICAgICAgICBtYWNDbGVhbkxheW91dC5zaG93T3RoZXJCdXR0b25CZWxvd0RpdmlkZXIgPSBmYWxzZTtcbiAgICB9XG4gICAgdmFyIGF1ZGlvYm9va0FuZE5vdEluQXBwID0gbWVkaWEuaXNBdWRpb2Jvb2sgJiZcbiAgICAgICAgZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdtcDMtaW4tYXBwLW9ubHknKSAmJlxuICAgICAgICAhb3B0aW9ucy5pbkFwcDtcbiAgICB2YXIgc2hvd01wM0Rlc2t0b3BNZXNzYWdlID0gZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdkaXNhYmxlT2RBcHBBY2Nlc3MnKSAmJlxuICAgICAgICBmZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ3Nob3ctb2QtZGVza3RvcC1tZXNzYWdlJyk7XG4gICAgaWYgKGF1ZGlvYm9va0FuZE5vdEluQXBwICYmXG4gICAgICAgIChzaG93TXAzRGVza3RvcE1lc3NhZ2UgfHwgbWFjQ2xlYW5MYXlvdXQuc3ViQnV0dG9uID09PSB1bmRlZmluZWQpKSB7XG4gICAgICAgIG1hY0NsZWFuTGF5b3V0LnNob3dEaXZpZGVyID0gZmFsc2U7XG4gICAgICAgIG1hY0NsZWFuTGF5b3V0LnNob3dPdGhlckJ1dHRvbkJlbG93RGl2aWRlciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAobWVkaWEuaXNBdWRpb2Jvb2sgJiZcbiAgICAgICAgbWFjQ2xlYW5MYXlvdXQuc3ViQnV0dG9uID09PSB1bmRlZmluZWQgJiZcbiAgICAgICAgIW9wdGlvbnMuaW5BcHApIHtcbiAgICAgICAgbWFjQ2xlYW5MYXlvdXQuc2hvd090aGVyQnV0dG9uQmVsb3dEaXZpZGVyID0gZmFsc2U7XG4gICAgfVxuICAgIG1hY0NsZWFuTGF5b3V0LnN1cHByZXNzQXVkaW9ib29rQnV0dG9uID1cbiAgICAgICAgbWVkaWEuc3VwcHJlc3NBdWRpb2Jvb2tEb3dubG9hZEJ1dHRvbjtcbiAgICByZXR1cm4gbWFjQ2xlYW5MYXlvdXQ7XG59O1xuZXhwb3J0cy5nZXRGdWxmaWxsbWVudEJ1dHRvbkxheW91dCA9IGdldEZ1bGZpbGxtZW50QnV0dG9uTGF5b3V0O1xudmFyIGdldEFwaUZ1bGZpbGxtZW50QnV0dG9uTGF5b3V0ID0gZnVuY3Rpb24gKGZlYXR1cmVNYW5hZ2VyLCBtZWRpYSwgb3B0aW9ucykge1xuICAgIHZhciBfYTtcbiAgICB2YXIgaXNBdWRpb2Jvb2tBZnRlclN1bnNldCA9ICFvcHRpb25zLmluQXBwICYmXG4gICAgICAgIG1lZGlhLmlzQXVkaW9ib29rICYmXG4gICAgICAgIChmZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ2Rpc2FibGVPZEFwcEFjY2VzcycpIHx8XG4gICAgICAgICAgICBmZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ3Byb21vdGVMaWJieScpKTtcbiAgICB2YXIgbWFpbkJ1dHRvbkxheW91dCA9IGdldEFwaUZ1bGZpbGxtZW50TWFpbkJ1dHRvbkxheW91dChmZWF0dXJlTWFuYWdlciwgbWVkaWEsIGlzQXVkaW9ib29rQWZ0ZXJTdW5zZXQpO1xuICAgIHZhciBzdWJCdXR0b247XG4gICAgdmFyIHNob3dEaXZpZGVyID0gbWVkaWEuc2hvd0RpdmlkZXI7XG4gICAgdmFyIHNob3dPdGhlckJ1dHRvbkJlbG93RGl2aWRlciA9IGZhbHNlO1xuICAgIGlmIChmZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ3N1bnNldC1hdWRpb2Jvb2stcmV3cml0ZScpKSB7XG4gICAgICAgIGlmIChtZWRpYS5zaG93T0RGb3JtYXRCdXR0b24gJiZcbiAgICAgICAgICAgIG1haW5CdXR0b25MYXlvdXQubWFpbkJ1dHRvbiAhPSAnb2RyZWFkJykge1xuICAgICAgICAgICAgc3ViQnV0dG9uID0gJ29kcmVhZCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWFpbkJ1dHRvbkxheW91dC5tYWluQnV0dG9uID09ICdhdWRpb2Jvb2snICYmXG4gICAgICAgICAgICBvcHRpb25zLmFwcE5hbWUgIT09ICdPdmVyRHJpdmUnICYmXG4gICAgICAgICAgICAhb3B0aW9ucy5pbkFwcCkge1xuICAgICAgICAgICAgbWFpbkJ1dHRvbkxheW91dC5tYWluQnV0dG9uID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgc3ViQnV0dG9uID0gJ21wM09ubHknO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKG1lZGlhLmlzQXVkaW9ib29rKSB7XG4gICAgICAgICAgICBfYSA9IHNldEF1ZGlvYm9va1N1YkJ1dHRvbkxheW91dChtYWluQnV0dG9uTGF5b3V0LCBtZWRpYSwgaXNBdWRpb2Jvb2tBZnRlclN1bnNldCwgc2hvd0RpdmlkZXIpLCBzdWJCdXR0b24gPSBfYVswXSwgc2hvd0RpdmlkZXIgPSBfYVsxXSwgc2hvd090aGVyQnV0dG9uQmVsb3dEaXZpZGVyID0gX2FbMl07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGlmIChtZWRpYS5pc0F1ZGlvYm9vaykge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY291bnRyeUNvZGUgJiZcbiAgICAgICAgICAgICAgICAobWVDb3VudHJ5Q29kZXNfanNvbl8xLmRlZmF1bHQuY29kZXMuaW5kZXhPZihvcHRpb25zLmNvdW50cnlDb2RlKSA+IC0xIHx8XG4gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuY291bnRyeUNvZGUgPT09ICdDTicpKSB7XG4gICAgICAgICAgICAgICAgc3ViQnV0dG9uID0gJ2Rvd25sb2FkJztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChtZWRpYS5oYXNNcDNGb3JtYXQgJiZcbiAgICAgICAgICAgICAgICAgICAgIW1lZGlhLmhhc092ZXJkcml2ZUZvcm1hdCAmJlxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmFwcE5hbWUgIT09ICdPdmVyRHJpdmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIHN1YkJ1dHRvbiA9ICdtcDNPbmx5JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5hcHBOYW1lICE9PSAnT3ZlckRyaXZlJyAmJlxuICAgICAgICAgICAgICAgICAgICBvcHRpb25zLmFwcE5hbWUgIT09ICdTb3JhJykge1xuICAgICAgICAgICAgICAgICAgICBzdWJCdXR0b24gPSAnYXVkaW9ib29rJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5hcHBOYW1lICE9PSAnU29yYScpIHtcbiAgICAgICAgICAgICAgICAgICAgc3ViQnV0dG9uID0gJ2Rvd25sb2FkJztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWVkaWEuc2hvd09ERm9ybWF0QnV0dG9uICYmXG4gICAgICAgICAgICBtYWluQnV0dG9uTGF5b3V0Lm1haW5CdXR0b24gIT0gJ29kcmVhZCcpIHtcbiAgICAgICAgICAgIHN1YkJ1dHRvbiA9ICdvZHJlYWQnO1xuICAgICAgICB9XG4gICAgfVxuICAgIHZhciBzaG93TWFjT3NBdWRpb2Jvb2tTdXBwcmVzc2lvblN0eWxlO1xuICAgIGlmIChtZWRpYS5pc01hYyAmJlxuICAgICAgICBtZWRpYS5pc0F1ZGlvYm9vayAmJlxuICAgICAgICBmZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ21hY09TQXVkaW9ib29rTWVzc2FnaW5nJykgJiZcbiAgICAgICAgIW9wdGlvbnMuaW5BcHApIHtcbiAgICAgICAgc2hvd01hY09zQXVkaW9ib29rU3VwcHJlc3Npb25TdHlsZSA9ICFtZWRpYS5pc1ByZUNhdGFsaW5hTWFjXG4gICAgICAgICAgICA/ICdzdXBwcmVzcydcbiAgICAgICAgICAgIDogJ3dhcm4nO1xuICAgIH1cbiAgICB2YXIgc2hvd0Rvd25sb2FkRHJvcGRvd25CZWxvd0RpdmlkZXIgPSBmYWxzZTtcbiAgICB2YXIgc3ViRHJvcGRvd25MaXN0SXRlbXMgPSBbXTtcbiAgICBpZiAobWVkaWEuc2hvd05vbktpbmRsZUJ1dHRvbkJlbG93RGl2aWRlciAmJiBzdWJCdXR0b24gIT0gJ2F1ZGlvYm9vaycpIHtcbiAgICAgICAgc2hvd090aGVyQnV0dG9uQmVsb3dEaXZpZGVyID0gdHJ1ZTtcbiAgICB9XG4gICAgZWxzZSBpZiAobWVkaWEuc2hvd0Rvd25sb2FkRHJvcGRvd24pIHtcbiAgICAgICAgc2hvd0Rvd25sb2FkRHJvcGRvd25CZWxvd0RpdmlkZXIgPSB0cnVlO1xuICAgICAgICBzdWJEcm9wZG93bkxpc3RJdGVtcyA9IG1lZGlhLm5vbktpbmRsZU5vblJlYWRGb3JtYXRzIHx8IFtdO1xuICAgIH1cbiAgICBpZiAob3B0aW9ucy5pc1RvbGlub0RldmljZSkge1xuICAgICAgICB2YXIgbmV3TGF5b3V0ID0gbW9kaWZ5QnV0dG9uc0ZvclRvbGlubyhtZWRpYSwgZmVhdHVyZU1hbmFnZXIsIHtcbiAgICAgICAgICAgIG1haW5CdXR0b246IG1haW5CdXR0b25MYXlvdXQubWFpbkJ1dHRvbixcbiAgICAgICAgICAgIHNob3dNYWluRHJvcGRvd246IG1haW5CdXR0b25MYXlvdXQuc2hvd01haW5Ecm9wZG93bixcbiAgICAgICAgICAgIG1haW5Ecm9wZG93bkxpc3RJdGVtczogbWFpbkJ1dHRvbkxheW91dC5tYWluRHJvcGRvd25MaXN0SXRlbXMsXG4gICAgICAgICAgICBzaG93RGl2aWRlcjogc2hvd0RpdmlkZXIsXG4gICAgICAgICAgICBzaG93RG93bmxvYWREcm9wZG93bkJlbG93RGl2aWRlcjogc2hvd0Rvd25sb2FkRHJvcGRvd25CZWxvd0RpdmlkZXIsXG4gICAgICAgICAgICBzaG93T3RoZXJCdXR0b25CZWxvd0RpdmlkZXI6IHNob3dPdGhlckJ1dHRvbkJlbG93RGl2aWRlcixcbiAgICAgICAgICAgIHN1YkJ1dHRvbjogc3ViQnV0dG9uLFxuICAgICAgICAgICAgc3ViRHJvcGRvd25MaXN0SXRlbXM6IHN1YkRyb3Bkb3duTGlzdEl0ZW1zLFxuICAgICAgICB9KTtcbiAgICAgICAgbWFpbkJ1dHRvbkxheW91dC5tYWluQnV0dG9uID0gbmV3TGF5b3V0Lm1haW5CdXR0b247XG4gICAgICAgIHN1YkJ1dHRvbiA9IG5ld0xheW91dC5zdWJCdXR0b247XG4gICAgICAgIHNob3dEaXZpZGVyID0gbmV3TGF5b3V0LnNob3dEaXZpZGVyO1xuICAgICAgICBzaG93RG93bmxvYWREcm9wZG93bkJlbG93RGl2aWRlciA9XG4gICAgICAgICAgICBuZXdMYXlvdXQuc2hvd0Rvd25sb2FkRHJvcGRvd25CZWxvd0RpdmlkZXI7XG4gICAgICAgIHN1YkRyb3Bkb3duTGlzdEl0ZW1zID0gbmV3TGF5b3V0LnN1YkRyb3Bkb3duTGlzdEl0ZW1zIHx8IFtdO1xuICAgICAgICBzaG93T3RoZXJCdXR0b25CZWxvd0RpdmlkZXIgPSBuZXdMYXlvdXQuc2hvd090aGVyQnV0dG9uQmVsb3dEaXZpZGVyO1xuICAgICAgICBtYWluQnV0dG9uTGF5b3V0Lm1haW5Ecm9wZG93bkxpc3RJdGVtcyA9XG4gICAgICAgICAgICBuZXdMYXlvdXQubWFpbkRyb3Bkb3duTGlzdEl0ZW1zIHx8IFtdO1xuICAgICAgICBtYWluQnV0dG9uTGF5b3V0LnNob3dNYWluRHJvcGRvd24gPSBuZXdMYXlvdXQuc2hvd01haW5Ecm9wZG93bjtcbiAgICB9XG4gICAgdmFyIG1hY0NsZWFuTGF5b3V0ID0gZ2V0Q2xlYW5NYWNXYXJuaW5nRGlzcGxheSh7XG4gICAgICAgIG1haW5CdXR0b246IG1haW5CdXR0b25MYXlvdXQubWFpbkJ1dHRvbixcbiAgICAgICAgbWFpbkRyb3Bkb3duTGlzdEl0ZW1zOiBtYWluQnV0dG9uTGF5b3V0Lm1haW5Ecm9wZG93bkxpc3RJdGVtcyxcbiAgICAgICAgc2hvd0RpdmlkZXI6IHNob3dEaXZpZGVyLFxuICAgICAgICBzaG93RG93bmxvYWREcm9wZG93bkJlbG93RGl2aWRlcjogc2hvd0Rvd25sb2FkRHJvcGRvd25CZWxvd0RpdmlkZXIsXG4gICAgICAgIHNob3dNYWNPc0F1ZGlvYm9va1N1cHByZXNzaW9uU3R5bGU6IHNob3dNYWNPc0F1ZGlvYm9va1N1cHByZXNzaW9uU3R5bGUsXG4gICAgICAgIHNob3dOb0tpbmRsZVdhcm5pbmc6IG1haW5CdXR0b25MYXlvdXQuc2hvd05vS2luZGxlV2FybmluZyxcbiAgICAgICAgc2hvd090aGVyQnV0dG9uQmVsb3dEaXZpZGVyOiBzaG93T3RoZXJCdXR0b25CZWxvd0RpdmlkZXIsXG4gICAgICAgIHN1YkJ1dHRvbjogc3ViQnV0dG9uLFxuICAgICAgICBzdWJEcm9wZG93bkxpc3RJdGVtczogc3ViRHJvcGRvd25MaXN0SXRlbXMsXG4gICAgICAgIHN1cHByZXNzQXVkaW9ib29rQnV0dG9uOiBzaG93TWFjT3NBdWRpb2Jvb2tTdXBwcmVzc2lvblN0eWxlICE9PSB1bmRlZmluZWQsXG4gICAgfSwgbWVkaWEsIGZlYXR1cmVNYW5hZ2VyKTtcbiAgICB2YXIgZG93bmxvYWRDbGVhbkxheW91dCA9IGdldENsZWFuTm9uRG93bmxvYWRGb3JtYXRzKG1lZGlhLCBtYWNDbGVhbkxheW91dCwgZmVhdHVyZU1hbmFnZXIsIG9wdGlvbnMuZW5hYmxlZFBsYXRmb3Jtcyk7XG4gICAgcmV0dXJuIGRvd25sb2FkQ2xlYW5MYXlvdXQ7XG59O1xuZXhwb3J0cy5nZXRBcGlGdWxmaWxsbWVudEJ1dHRvbkxheW91dCA9IGdldEFwaUZ1bGZpbGxtZW50QnV0dG9uTGF5b3V0O1xudmFyIGdldFRpdGxlRnVsZmlsbG1lbnRCdXR0b25MYXlvdXQgPSBmdW5jdGlvbiAoZmVhdHVyZU1hbmFnZXIsIG1lZGlhLCBvcHRpb25zKSB7XG4gICAgdmFyIF9hO1xuICAgIHZhciBfYjtcbiAgICB2YXIgaXNJcGFkID0gZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdzdG9wLXRyZWF0aW5nLWlwYWQtbGlrZS1tYWMnKSAmJlxuICAgICAgICBvcHRpb25zLmlzSXBhZFVzZXJBZ2VudDtcbiAgICB2YXIgaXBhZFdpdGhSZXN0cmljdGVkTXAzRm9ybWF0ID0gaXNJcGFkICYmXG4gICAgICAgICEhbWVkaWEucmVzdHJpY3RlZEZvcm1hdHMgJiZcbiAgICAgICAgbWVkaWEucmVzdHJpY3RlZEZvcm1hdHMubGVuZ3RoID09PSAxICYmXG4gICAgICAgIG1lZGlhLnJlc3RyaWN0ZWRGb3JtYXRzWzBdLmlkID09PSAnYXVkaW9ib29rLW1wMyc7XG4gICAgdmFyIGlwYWRXaXRoTVAzRm9ybWF0ID0gaXNJcGFkICYmIG1lZGlhLmhhc01wM0Zvcm1hdDtcbiAgICB2YXIgaXNBdWRpb2Jvb2tBZnRlclN1bnNldCA9ICFvcHRpb25zLmluQXBwICYmXG4gICAgICAgIG1lZGlhLmlzQXVkaW9ib29rICYmXG4gICAgICAgIChmZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ2Rpc2FibGVPZEFwcEFjY2VzcycpIHx8XG4gICAgICAgICAgICBmZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ3Byb21vdGVMaWJieScpKTtcbiAgICB2YXIgbWFpbkJ1dHRvbkxheW91dCA9IGdldFRpdGxlRnVsZmlsbG1lbnRNYWluQnV0dG9uTGF5b3V0KGZlYXR1cmVNYW5hZ2VyLCBtZWRpYSwgaXNJcGFkLCBpc0F1ZGlvYm9va0FmdGVyU3Vuc2V0LCBvcHRpb25zLmluQXBwLCBvcHRpb25zLnN1cHByZXNzQXVkaW9ib29rQnV0dG9uKTtcbiAgICB2YXIgc2hvd0RpdmlkZXIgPSAhb3B0aW9ucy5zdXBwcmVzc0F1ZGlvYm9va0J1dHRvbiAmJlxuICAgICAgICBtZWRpYS5zaG93RGl2aWRlciAmJlxuICAgICAgICAhb3B0aW9ucy5raW5kbGVPbmx5O1xuICAgIHZhciBzdWJCdXR0b247XG4gICAgdmFyIHNob3dPdGhlckJ1dHRvbkJlbG93RGl2aWRlciA9IGZhbHNlO1xuICAgIGlmIChmZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ3N1bnNldC1hdWRpb2Jvb2stcmV3cml0ZScpKSB7XG4gICAgICAgIGlmIChtZWRpYS5zaG93T0RGb3JtYXRCdXR0b24gJiZcbiAgICAgICAgICAgICFvcHRpb25zLmtpbmRsZU9ubHkgJiZcbiAgICAgICAgICAgICFpcGFkV2l0aE1QM0Zvcm1hdCAmJlxuICAgICAgICAgICAgIWlzQXVkaW9ib29rQWZ0ZXJTdW5zZXQgJiZcbiAgICAgICAgICAgIG1haW5CdXR0b25MYXlvdXQubWFpbkJ1dHRvbiAhPSAnb2RyZWFkJykge1xuICAgICAgICAgICAgc3ViQnV0dG9uID0gJ29kcmVhZCc7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAobWVkaWEuaXNBdWRpb2Jvb2spIHtcbiAgICAgICAgICAgIF9hID0gc2V0QXVkaW9ib29rU3ViQnV0dG9uTGF5b3V0KG1haW5CdXR0b25MYXlvdXQsIG1lZGlhLCBpc0F1ZGlvYm9va0FmdGVyU3Vuc2V0LCBzaG93RGl2aWRlciksIHN1YkJ1dHRvbiA9IF9hWzBdLCBzaG93RGl2aWRlciA9IF9hWzFdLCBzaG93T3RoZXJCdXR0b25CZWxvd0RpdmlkZXIgPSBfYVsyXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgaWYgKG1lZGlhLnNob3dPREZvcm1hdEJ1dHRvbiAmJlxuICAgICAgICAgICAgIW9wdGlvbnMua2luZGxlT25seSAmJlxuICAgICAgICAgICAgIWlwYWRXaXRoTVAzRm9ybWF0ICYmXG4gICAgICAgICAgICAhaXNBdWRpb2Jvb2tBZnRlclN1bnNldCAmJlxuICAgICAgICAgICAgbWFpbkJ1dHRvbkxheW91dC5tYWluQnV0dG9uICE9ICdvZHJlYWQnKSB7XG4gICAgICAgICAgICBzdWJCdXR0b24gPSAnb2RyZWFkJztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpc0F1ZGlvYm9va0FmdGVyU3Vuc2V0KSB7XG4gICAgICAgICAgICBzdWJCdXR0b24gPSAnYXVkaW9ib29rJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBpZiAobWVkaWEuc2hvd05vbktpbmRsZUJ1dHRvbkJlbG93RGl2aWRlciAmJiBzdWJCdXR0b24gIT0gJ2F1ZGlvYm9vaycpIHtcbiAgICAgICAgc2hvd090aGVyQnV0dG9uQmVsb3dEaXZpZGVyID0gdHJ1ZTtcbiAgICB9XG4gICAgdmFyIHNob3dEb3dubG9hZERyb3Bkb3duQmVsb3dEaXZpZGVyID0gIW1lZGlhLnNob3dOb25LaW5kbGVCdXR0b25CZWxvd0RpdmlkZXIgJiYgbWVkaWEuc2hvd0Rvd25sb2FkRHJvcGRvd247XG4gICAgaWYgKG9wdGlvbnMuaXNUb2xpbm9EZXZpY2UpIHtcbiAgICAgICAgdmFyIG5ld0xheW91dCA9IG1vZGlmeUJ1dHRvbnNGb3JUb2xpbm8obWVkaWEsIGZlYXR1cmVNYW5hZ2VyLCB7XG4gICAgICAgICAgICBtYWluQnV0dG9uOiBtYWluQnV0dG9uTGF5b3V0Lm1haW5CdXR0b24sXG4gICAgICAgICAgICBzaG93TWFpbkRyb3Bkb3duOiBtYWluQnV0dG9uTGF5b3V0LnNob3dNYWluRHJvcGRvd24sXG4gICAgICAgICAgICBtYWluRHJvcGRvd25MaXN0SXRlbXM6IG1haW5CdXR0b25MYXlvdXQubWFpbkRyb3Bkb3duTGlzdEl0ZW1zLFxuICAgICAgICAgICAgc2hvd0RpdmlkZXI6IHNob3dEaXZpZGVyLFxuICAgICAgICAgICAgc2hvd0Rvd25sb2FkRHJvcGRvd25CZWxvd0RpdmlkZXI6IHNob3dEb3dubG9hZERyb3Bkb3duQmVsb3dEaXZpZGVyLFxuICAgICAgICAgICAgc2hvd090aGVyQnV0dG9uQmVsb3dEaXZpZGVyOiBzaG93T3RoZXJCdXR0b25CZWxvd0RpdmlkZXIsXG4gICAgICAgICAgICBzdWJCdXR0b246IHN1YkJ1dHRvbixcbiAgICAgICAgfSk7XG4gICAgICAgIG1haW5CdXR0b25MYXlvdXQubWFpbkJ1dHRvbiA9IG5ld0xheW91dC5tYWluQnV0dG9uO1xuICAgICAgICBzdWJCdXR0b24gPSBuZXdMYXlvdXQuc3ViQnV0dG9uO1xuICAgICAgICBzaG93RGl2aWRlciA9IG5ld0xheW91dC5zaG93RGl2aWRlcjtcbiAgICAgICAgc2hvd0Rvd25sb2FkRHJvcGRvd25CZWxvd0RpdmlkZXIgPVxuICAgICAgICAgICAgbmV3TGF5b3V0LnNob3dEb3dubG9hZERyb3Bkb3duQmVsb3dEaXZpZGVyO1xuICAgICAgICBzaG93T3RoZXJCdXR0b25CZWxvd0RpdmlkZXIgPSBuZXdMYXlvdXQuc2hvd090aGVyQnV0dG9uQmVsb3dEaXZpZGVyO1xuICAgICAgICBtYWluQnV0dG9uTGF5b3V0Lm1haW5Ecm9wZG93bkxpc3RJdGVtcyA9XG4gICAgICAgICAgICBuZXdMYXlvdXQubWFpbkRyb3Bkb3duTGlzdEl0ZW1zIHx8IFtdO1xuICAgICAgICBtYWluQnV0dG9uTGF5b3V0LnNob3dNYWluRHJvcGRvd24gPSBuZXdMYXlvdXQuc2hvd01haW5Ecm9wZG93bjtcbiAgICB9XG4gICAgdmFyIHNob3dSZXN0cmljdGVkVmlkZW9XYXJuaW5nID0gbWVkaWEudmlkZW9Jc1Jlc3RyaWN0ZWQ7XG4gICAgdmFyIHNob3dSZXN0cmljdGVkRm9ybWF0V2FybmluZyA9ICFpcGFkV2l0aFJlc3RyaWN0ZWRNcDNGb3JtYXQgJiZcbiAgICAgICAgISFtZWRpYS5yZXN0cmljdGVkRm9ybWF0cyAmJlxuICAgICAgICBtZWRpYS5yZXN0cmljdGVkRm9ybWF0cy5sZW5ndGggPiAwICYmXG4gICAgICAgICFtZWRpYS5oYXNOb25LaW5kbGVOb25SZWFkRm9ybWF0ICYmXG4gICAgICAgICFtZWRpYS5wcmVmZXJLaW5kbGU7XG4gICAgdmFyIHNob3dNYWNPc0F1ZGlvYm9va1N1cHByZXNzaW9uU3R5bGU7XG4gICAgaWYgKG1lZGlhLmlzTWFjICYmXG4gICAgICAgIG1lZGlhLmlzQXVkaW9ib29rICYmXG4gICAgICAgIGZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnbWFjT1NBdWRpb2Jvb2tNZXNzYWdpbmcnKSAmJlxuICAgICAgICAhb3B0aW9ucy5pbkFwcCkge1xuICAgICAgICBzaG93TWFjT3NBdWRpb2Jvb2tTdXBwcmVzc2lvblN0eWxlID0gIW1lZGlhLmlzUHJlQ2F0YWxpbmFNYWNcbiAgICAgICAgICAgID8gJ3N1cHByZXNzJ1xuICAgICAgICAgICAgOiAnd2Fybic7XG4gICAgfVxuICAgIHZhciBsYXlvdXQgPSBfX2Fzc2lnbihfX2Fzc2lnbih7fSwgZ2V0Q2xlYW5NYWNXYXJuaW5nRGlzcGxheSh7XG4gICAgICAgIG1haW5CdXR0b246IG1haW5CdXR0b25MYXlvdXQubWFpbkJ1dHRvbixcbiAgICAgICAgbWFpbkRyb3Bkb3duTGlzdEl0ZW1zOiBtYWluQnV0dG9uTGF5b3V0Lm1haW5Ecm9wZG93bkxpc3RJdGVtcyxcbiAgICAgICAgc2hvd0RpdmlkZXI6IHNob3dEaXZpZGVyLFxuICAgICAgICBzdWJCdXR0b246IHN1YkJ1dHRvbixcbiAgICAgICAgc2hvd01hY09zQXVkaW9ib29rU3VwcHJlc3Npb25TdHlsZTogc2hvd01hY09zQXVkaW9ib29rU3VwcHJlc3Npb25TdHlsZSxcbiAgICAgICAgc2hvd0Rvd25sb2FkRHJvcGRvd25CZWxvd0RpdmlkZXI6IHNob3dEb3dubG9hZERyb3Bkb3duQmVsb3dEaXZpZGVyLFxuICAgICAgICBzaG93Tm9LaW5kbGVXYXJuaW5nOiBtYWluQnV0dG9uTGF5b3V0LnNob3dOb0tpbmRsZVdhcm5pbmcsXG4gICAgICAgIHNob3dPdGhlckJ1dHRvbkJlbG93RGl2aWRlcjogc2hvd090aGVyQnV0dG9uQmVsb3dEaXZpZGVyLFxuICAgIH0sIG1lZGlhLCBmZWF0dXJlTWFuYWdlcikpLCB7IHNob3dNYWluRHJvcGRvd246IHNob3dNYWNPc0F1ZGlvYm9va1N1cHByZXNzaW9uU3R5bGUgPT0gJ3N1cHByZXNzJ1xuICAgICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgICAgOiAoX2IgPSBtYWluQnV0dG9uTGF5b3V0LnNob3dNYWluRHJvcGRvd24pICE9PSBudWxsICYmIF9iICE9PSB2b2lkIDAgPyBfYiA6IGZhbHNlLCBzaG93UmVzdHJpY3RlZFZpZGVvV2FybmluZzogc2hvd01hY09zQXVkaW9ib29rU3VwcHJlc3Npb25TdHlsZSA9PSAnc3VwcHJlc3MnXG4gICAgICAgICAgICA/IGZhbHNlXG4gICAgICAgICAgICA6IHNob3dSZXN0cmljdGVkVmlkZW9XYXJuaW5nLCBzaG93UmVzdHJpY3RlZEZvcm1hdFdhcm5pbmc6IHNob3dNYWNPc0F1ZGlvYm9va1N1cHByZXNzaW9uU3R5bGUgPT0gJ3N1cHByZXNzJ1xuICAgICAgICAgICAgPyBmYWxzZVxuICAgICAgICAgICAgOiBzaG93UmVzdHJpY3RlZEZvcm1hdFdhcm5pbmcgfSk7XG4gICAgdmFyIGF1ZGlvYm9va0FuZE5vdEluQXBwID0gbWVkaWEuaXNBdWRpb2Jvb2sgJiZcbiAgICAgICAgZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdtcDMtaW4tYXBwLW9ubHknKSAmJlxuICAgICAgICAhb3B0aW9ucy5pbkFwcCAmJlxuICAgICAgICBtZWRpYS5oYXNOb25LaW5kbGVOb25SZWFkRm9ybWF0O1xuICAgIHZhciBtYWluQnV0dG9uSXNBdWRpb2Jvb2sgPSBsYXlvdXQubWFpbkJ1dHRvbiA9PT0gJ29kcmVhZCcgJiYgbGF5b3V0LnN1YkJ1dHRvbiA9PT0gJ2F1ZGlvYm9vayc7XG4gICAgaWYgKGF1ZGlvYm9va0FuZE5vdEluQXBwICYmXG4gICAgICAgIChtYWluQnV0dG9uSXNBdWRpb2Jvb2sgfHwgbGF5b3V0LnN1YkJ1dHRvbiA9PT0gdW5kZWZpbmVkKSkge1xuICAgICAgICBsYXlvdXQuc2hvd090aGVyQnV0dG9uQmVsb3dEaXZpZGVyID0gZmFsc2U7XG4gICAgICAgIGxheW91dC5zaG93RGl2aWRlciA9IGZhbHNlO1xuICAgIH1cbiAgICBpZiAobWVkaWEuaXNBdWRpb2Jvb2sgJiYgbGF5b3V0LnN1YkJ1dHRvbiA9PT0gdW5kZWZpbmVkICYmICFvcHRpb25zLmluQXBwKSB7XG4gICAgICAgIGxheW91dC5zaG93T3RoZXJCdXR0b25CZWxvd0RpdmlkZXIgPSBmYWxzZTtcbiAgICB9XG4gICAgcmV0dXJuIGxheW91dDtcbn07XG5leHBvcnRzLmdldFRpdGxlRnVsZmlsbG1lbnRCdXR0b25MYXlvdXQgPSBnZXRUaXRsZUZ1bGZpbGxtZW50QnV0dG9uTGF5b3V0O1xuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1mdWxmaWxsbWVudC10cy5qcy5tYXBcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9ZnVsZmlsbG1lbnQtdHMuanMubWFwXG4iLCJcInVzZSBzdHJpY3RcIjtcbnZhciBfX2NyZWF0ZUJpbmRpbmcgPSAodGhpcyAmJiB0aGlzLl9fY3JlYXRlQmluZGluZykgfHwgKE9iamVjdC5jcmVhdGUgPyAoZnVuY3Rpb24obywgbSwgaywgazIpIHtcbiAgICBpZiAoazIgPT09IHVuZGVmaW5lZCkgazIgPSBrO1xuICAgIHZhciBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihtLCBrKTtcbiAgICBpZiAoIWRlc2MgfHwgKFwiZ2V0XCIgaW4gZGVzYyA/ICFtLl9fZXNNb2R1bGUgOiBkZXNjLndyaXRhYmxlIHx8IGRlc2MuY29uZmlndXJhYmxlKSkge1xuICAgICAgZGVzYyA9IHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIG1ba107IH0gfTtcbiAgICB9XG4gICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KG8sIGsyLCBkZXNjKTtcbn0pIDogKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICBvW2syXSA9IG1ba107XG59KSk7XG52YXIgX19zZXRNb2R1bGVEZWZhdWx0ID0gKHRoaXMgJiYgdGhpcy5fX3NldE1vZHVsZURlZmF1bHQpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkobywgXCJkZWZhdWx0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgdmFsdWU6IHYgfSk7XG59KSA6IGZ1bmN0aW9uKG8sIHYpIHtcbiAgICBvW1wiZGVmYXVsdFwiXSA9IHY7XG59KTtcbnZhciBfX2ltcG9ydFN0YXIgPSAodGhpcyAmJiB0aGlzLl9faW1wb3J0U3RhcikgfHwgZnVuY3Rpb24gKG1vZCkge1xuICAgIGlmIChtb2QgJiYgbW9kLl9fZXNNb2R1bGUpIHJldHVybiBtb2Q7XG4gICAgdmFyIHJlc3VsdCA9IHt9O1xuICAgIGlmIChtb2QgIT0gbnVsbCkgZm9yICh2YXIgayBpbiBtb2QpIGlmIChrICE9PSBcImRlZmF1bHRcIiAmJiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwobW9kLCBrKSkgX19jcmVhdGVCaW5kaW5nKHJlc3VsdCwgbW9kLCBrKTtcbiAgICBfX3NldE1vZHVsZURlZmF1bHQocmVzdWx0LCBtb2QpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5nZXRPcHRpbWl6ZWRDb3ZlcnMgPSB2b2lkIDA7XG52YXIgXyA9IF9faW1wb3J0U3RhcihyZXF1aXJlKFwidW5kZXJzY29yZVwiKSk7XG5mdW5jdGlvbiBnZXRPcHRpbWl6ZWRDb3ZlcnMoY292ZXJzLCBkZXNpcmVkU2l6ZSkge1xuICAgIC8vIGNvdmVyc0J5U2l6ZSBpcyBub3cgYW4gYXJyYXkgb2YgY292ZXJzLCBmcm9tIHNtYWxsZXN0IHRvIGxhcmdlc3RcbiAgICB2YXIgY292ZXJzQnlTaXplID0gXy5zb3J0QnkoY292ZXJzLCAnd2lkdGgnKTtcbiAgICAvLyBTdGFydCB3aXRoIHRoZSBiaWdnZXN0IGNvdmVyXG4gICAgLy8gQ29weSBvYmplY3Qgd2l0aCBPYmplY3QuYXNzaWduKCkgc28gd2UgZG9udCBkYW1hZ2UgcmVmZXJlbmNlXG4gICAgdmFyIG9wdGltaXplZENvdmVyID0gT2JqZWN0LmFzc2lnbih7fSwgXy5sYXN0KGNvdmVyc0J5U2l6ZSkpO1xuICAgIGlmIChvcHRpbWl6ZWRDb3ZlciAmJiBvcHRpbWl6ZWRDb3Zlci5ocmVmKSB7XG4gICAgICAgIHZhciBsZWdhY3lUb09wdGltaXplZEltYWdlSG9zdHNNYXAgPSB7XG4gICAgICAgICAgICAnaHR0cHM6Ly9pbWcxLm9kLWNkbi5jb20vJzogJ2h0dHBzOi8vaWMub2QtY2RuLmNvbS9yZXNpemUnLFxuICAgICAgICAgICAgJ2h0dHBzOi8vaW1hZ2VzLm92ZXJkcml2ZWNoaW5hLmNuLyc6ICdodHRwczovL2ltYWdlcy5vdmVyZHJpdmVjaGluYS5jbi9yZXNpemUnXG4gICAgICAgIH07XG4gICAgICAgIHZhciBob3N0TWFwS2V5ID0gXy5maW5kKE9iamVjdC5rZXlzKGxlZ2FjeVRvT3B0aW1pemVkSW1hZ2VIb3N0c01hcCksIGZ1bmN0aW9uIChsZWdhY3kpIHsgcmV0dXJuIG9wdGltaXplZENvdmVyLmhyZWYuc3RhcnRzV2l0aChsZWdhY3kpOyB9KTtcbiAgICAgICAgaWYgKGhvc3RNYXBLZXkpIHtcbiAgICAgICAgICAgIC8vIGxvb2sgdXAgdGhlIGNvcnJlc3BvbmRpbmcgb3B0aW1pemVkIHJvb3QsIGUuZy4gaHR0cHM6Ly9pbWcxLm9kLWNkbi5jb20vIC0+IGh0dHBzOi8vaWMub2QtY2RuLmNvbS9yZXNpemVcbiAgICAgICAgICAgIHZhciBvcHRpbWl6ZWRJbWFnZUhvc3QgPSBsZWdhY3lUb09wdGltaXplZEltYWdlSG9zdHNNYXBbaG9zdE1hcEtleV07XG4gICAgICAgICAgICB2YXIgb3B0aW1pemF0aW9ucyA9ICd0eXBlPWF1dG8nOyAvLyBmb3JtYXQgPSBhdXRvIC0+IHVzZSB3ZWJwIGlmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgaXRcbiAgICAgICAgICAgIHZhciBwYXRoID0gJyc7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGRvY3VtZW50ID09PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIC8vIG5vZGUuanMgdXNhZ2Ugc2hvdWxkIGJlIGZpbmUgd2l0aCB0aGUgVVJMIGFwaVxuICAgICAgICAgICAgICAgIHZhciB1cmwgPSBuZXcgVVJMKG9wdGltaXplZENvdmVyLmhyZWYpO1xuICAgICAgICAgICAgICAgIHBhdGggPSB1cmwucGF0aG5hbWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBoYWNrIHRvIGdldCB1cmwgcGF0aG5hbWUgc2luY2UgSUUgZG9lc24ndCBzdXBwb3J0IHRoZSBVUkwgYXBpLiAgSSBkaWRuJ3Qgd2FudCB0byBhZGQgYSBwb2x5ZmlsbFxuICAgICAgICAgICAgICAgIHZhciBhID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnYScpO1xuICAgICAgICAgICAgICAgIGEuaHJlZiA9IG9wdGltaXplZENvdmVyLmhyZWY7XG4gICAgICAgICAgICAgICAgcGF0aCA9IGEucGF0aG5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKCFwYXRoLnN0YXJ0c1dpdGgoJy8nKSkgeyAvLyBicm93c2VycyBhcmUgaW5jb25zaXN0ZW50IGFib3V0IHdoZXRoZXIgdGhlIHBhdGhuYW1lIGluY2x1ZGVzIGEgbGVhZGluZyBzbGFzaCwgYnV0IHRoZSBjYWNoZWZseSBhcGkgcmVxdWlyZXMgZXhhY3RseSBvbmUgb24gdGhlIHVybCBwYXJhbVxuICAgICAgICAgICAgICAgICAgICBwYXRoID0gXCIvXCIuY29uY2F0KHBhdGgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHZhciBlbmNvZGVkU3JjVXJsID0gZW5jb2RlVVJJQ29tcG9uZW50KHBhdGgpO1xuICAgICAgICAgICAgdmFyIGNvdmVySHJlZldpdGhvdXRTaXplID0gXCJcIi5jb25jYXQob3B0aW1pemVkSW1hZ2VIb3N0LCBcIj9cIikuY29uY2F0KG9wdGltaXphdGlvbnMsIFwiJnVybD1cIikuY29uY2F0KGVuY29kZWRTcmNVcmwsIFwiJnN0cmlwbWV0YT10cnVlXCIpO1xuICAgICAgICAgICAgb3B0aW1pemVkQ292ZXIuaHJlZiA9IFwiXCIuY29uY2F0KGNvdmVySHJlZldpdGhvdXRTaXplLCBcIiZ3aWR0aD1cIikuY29uY2F0KGRlc2lyZWRTaXplKTtcbiAgICAgICAgICAgIG9wdGltaXplZENvdmVyLnNyY3NldCA9IFwiXCIuY29uY2F0KGNvdmVySHJlZldpdGhvdXRTaXplLCBcIiZ3aWR0aD1cIikuY29uY2F0KE1hdGguZmxvb3IoZGVzaXJlZFNpemUgKiAyKSwgXCIgMngsIFwiKSArXG4gICAgICAgICAgICAgICAgXCJcIi5jb25jYXQoY292ZXJIcmVmV2l0aG91dFNpemUsIFwiJndpZHRoPVwiKS5jb25jYXQoTWF0aC5mbG9vcihkZXNpcmVkU2l6ZSAqIDEuNSksIFwiIDEuNXgsIFwiKSArXG4gICAgICAgICAgICAgICAgXCJcIi5jb25jYXQoY292ZXJIcmVmV2l0aG91dFNpemUsIFwiJndpZHRoPVwiKS5jb25jYXQoZGVzaXJlZFNpemUsIFwiIDF4XCIpO1xuICAgICAgICAgICAgcmV0dXJuIG9wdGltaXplZENvdmVyO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBfLmZpbmQoY292ZXJzQnlTaXplLCBmdW5jdGlvbiAoY292ZXIpIHsgcmV0dXJuIGNvdmVyLndpZHRoID49IGRlc2lyZWRTaXplOyB9KSB8fFxuICAgICAgICBfLmxhc3QoY292ZXJzQnlTaXplKTsgLy8gZmluZHMgdGhlIGZpcnN0IGNvdmVyIHRoYXQgaXMgYmlnIGVub3VnaFxufVxuZXhwb3J0cy5nZXRPcHRpbWl6ZWRDb3ZlcnMgPSBnZXRPcHRpbWl6ZWRDb3ZlcnM7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWdldE9wdGltaXplZENvdmVyLXRzLmpzLm1hcFxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1nZXRPcHRpbWl6ZWRDb3Zlci10cy5qcy5tYXBcbiIsIlxuLyogZXNsaW50LWVudiBicm93c2VyICovXG5cbnZhciBUcmFuc2xhdGVyID0gcmVxdWlyZSgnLi4vdHJhbnNsYXRlcicpO1xudmFyIHV0aWxpdHkgPSByZXF1aXJlKCcuLi91dGlsaXR5Jyk7XG5cbnZhciBfbG9nZ2VyID0gZnVuY3Rpb24obGV2ZWwsIG1lc3NhZ2UsIGFyZ3MpIHtcbiAgICB0cnkge1xuICAgICAgICB2YXIgZXJyb3IgPSBsZXZlbCAmJiBsZXZlbC50b0xvd2VyQ2FzZSgpID09PSAnZXJyb3InO1xuXG4gICAgICAgIGlmIChlcnJvciAmJiB3aW5kb3cuTlJFVU0pIHtcbiAgICAgICAgICAgIHZhciBlcnJvck1lc3NhZ2UgPSBtZXNzYWdlICsgJyAnICsgd2luZG93LkpTT04uc3RyaW5naWZ5KGFyZ3MpO1xuICAgICAgICAgICAgd2luZG93Lk5SRVVNLm5vdGljZUVycm9yKGVycm9yTWVzc2FnZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAod2luZG93ICYmIHdpbmRvdy5jb25zb2xlKSB7XG4gICAgICAgICAgICBpZiAoZXJyb3IgJiYgd2luZG93LmNvbnNvbGUuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuY29uc29sZS5lcnJvcihtZXNzYWdlLCBhcmdzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmNvbnNvbGUubG9nKG1lc3NhZ2UsIGFyZ3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAvLyDCr1xcXyjjg4QpXy/Cr1xuICAgIH1cbn07XG5cbnZhciBfZ2V0TG9jYWxlID0gZnVuY3Rpb24oKSB7XG4gICAgaWYgKHdpbmRvdy5PdmVyRHJpdmUgJiYgd2luZG93Lk92ZXJEcml2ZS5fbG9jYWxlKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuT3ZlckRyaXZlLl9sb2NhbGU7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuICdlbic7XG4gICAgfVxufTtcblxudmFyIF90cmFuc2xhdGVyU2luZ2xldG9uID0gbmV3IFRyYW5zbGF0ZXIod2luZG93Lk92ZXJEcml2ZS50cmFuc2xhdGlvbnMsIF9sb2dnZXIsIHdpbmRvdy5PdmVyRHJpdmUudGVuYW50KTtcblxudmFyIF90ZXh0ID0gZnVuY3Rpb24oZXhwZWN0SHRtbCwga2V5LCBhcmdzKSB7XG4gICAgdmFyIGxvY2FsZSA9IF9nZXRMb2NhbGUoKTtcbiAgICB2YXIgb3B0aW9ucyA9IHV0aWxpdHkuZ2V0VHJhbnNsYXRpb25PcHRpb25zKGxvY2FsZSwgZXhwZWN0SHRtbCk7XG5cbiAgICByZXR1cm4gX3RyYW5zbGF0ZXJTaW5nbGV0b24udHJhbnNsYXRlKGtleSwgbG9jYWxlLCBhcmdzLCBvcHRpb25zKTtcbn07XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgdG8gZmluZCB0aGUgdHJhbnNsYXRpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byB1c2UgZm9yIHRoZSB0ZW1wbGF0ZVxuICovXG52YXIgaHRtbCA9IF90ZXh0LmJpbmQobnVsbCwgdHJ1ZSk7XG5cbi8qKlxuICogQHBhcmFtIHtzdHJpbmd9IGtleSAtIFRoZSBrZXkgdG8gZmluZCB0aGUgdHJhbnNsYXRpb25cbiAqIEBwYXJhbSB7b2JqZWN0fSBhcmdzIC0gVGhlIGFyZ3VtZW50cyB0byB1c2UgZm9yIHRoZSB0ZW1wbGF0ZVxuICovXG52YXIgdGV4dCA9IF90ZXh0LmJpbmQobnVsbCwgZmFsc2UpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBodG1sLFxuICAgIHRleHRcbn07XG4iLCJcbnZhciBNZXNzYWdlRm9ybWF0ID0gcmVxdWlyZSgnbWVzc2FnZWZvcm1hdCcpO1xuXG52YXIgY29tcGlsZVRlbXBsYXRlID0gZnVuY3Rpb24odGVtcGxhdGUsIGxvY2FsZSkge1xuICAgIGxvY2FsZSA9IGxvY2FsZSB8fCAnZW4nO1xuXG4gICAgcmV0dXJuIG5ldyBNZXNzYWdlRm9ybWF0KGxvY2FsZSkuc2V0SW50bFN1cHBvcnQodHJ1ZSkuY29tcGlsZSh0ZW1wbGF0ZSk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBjb21waWxlVGVtcGxhdGVcbn07XG4iLCJcbnZhciBtZXNzYWdlZm9ybWF0ID0gcmVxdWlyZSgnLi9tZXNzYWdlZm9ybWF0Jyk7XG52YXIgdXRpbGl0eSA9IHJlcXVpcmUoJy4vdXRpbGl0eScpO1xuXG4vKipcbiAqIEBwYXJhbSB7VHJhbnNsYXRpb25zfSB0cmFuc2xhdGlvbnMgLSBUaGUgdHJhbnNsYXRpb25zIGNvbmZpZ3VyYXRpb24gb2JqZWN0XG4gKiBAcGFyYW0ge0xvZ2dlcn0gbG9nZ2VyIC0gQW4gb3B0aW9uYWwgb2JqZWN0LWxvZ2dlclxuICovXG5mdW5jdGlvbiBUcmFuc2xhdGVyKHRyYW5zbGF0aW9ucywgbG9nZ2VyLCB3ZWJzaXRlSWQ9MCkge1xuICAgIC8vIHRlbXBsYXRlIHRleHQgLT4gbG9jYWxlIC0+IHRlbXBsYXRlRnVuY3Rpb25cbiAgICAvLyBOT1RFOiBXZSBtYXAgdXNpbmcgdGhlIHRlbXBsYXRlIHRleHQgdG8gcmVkdWNlIGNhY2hlIGtleSB1bmlxdWVuZXNzIGVycm9yc1xuICAgIC8vIE5PVEU6IFdlIGluY2x1ZGUgdGhlIGxvY2FsZSBpbiB0aGUgY2FjaGUgYXMgdGhlIHNhbWUgdGV4dCBjYW4gYmUgdXNlZCBmb3IgbXVsdGlwbGUgbG9jYWxlcztcbiAgICAvLyAgICAgICBmb3IgZXhhbXBsZSB0aGUgZm9sbG93aW5nIHdvdWxkIGNhY2hlIHRoZSBmaXJzdCBsb2NhbGUgdG8gdXNlIGl0OiB7eCwgbnVtYmVyfS5cbiAgICB0aGlzLl9jb21waWxlZFRlbXBsYXRlcyA9IHt9O1xuXG4gICAgLy8ga2V5ICgtPiBzdWJrZXkpKiAtPiAoZW5nbGlzaCB0ZW1wbGF0ZSB8IGxvY2FsZSAtPiB0ZW1wbGF0ZSlcbiAgICB0aGlzLl90cmFuc2xhdGlvbnMgPSB0cmFuc2xhdGlvbnM7XG5cbiAgICAvLyAobGV2ZWw6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nLCBhcmdzOiBzdHJpbmcgLT4gb2JqZWN0KTogdm9pZFxuICAgIHRoaXMuX2xvZ2dlciA9IGxvZ2dlcjtcblxuICAgIHRoaXMud2Vic2l0ZUlkID0gd2Vic2l0ZUlkO1xufVxuXG5UcmFuc2xhdGVyLnByb3RvdHlwZS50cmFuc2xhdGUgPSBmdW5jdGlvbihrZXksIGxvY2FsZSwgYXJncywgb3B0aW9ucywgcmVxdWVzdFVybCkge1xuICAgIGxvY2FsZSA9IGxvY2FsZSB8fCAnZW4nO1xuICAgIGFyZ3MgPSBhcmdzIHx8IHt9O1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgLy8gU291bGQgbmV2ZXIgYmUgdmFsaWQsIGJ1dCBhbHNvIGd1YXJkIGFnYWluc3QgbGF0ZXIgY29kZSB0cnlpbmcga2V5c1xuICAgIC8vIHRoYXQgYXBwZW5kIHN0cmluZ3Mgb250byBub3RoaW5nLCB3aGljaCBjb3VsZCBiZSBmYWxzZSBwb3NpdGl2ZXMuXG4gICAgaWYgKCFrZXkpIHtcbiAgICAgICAgdmFyIGtleURlc2NyaXB0aW9uID0ga2V5ID09PSAnJyA/ICcoZW1wdHkgc3RyaW5nKScgOiBrZXkgPT09IG51bGwgPyAnKG51bGwpJyA6ICcodW5kZWZpbmVkKSc7XG4gICAgICAgIHRoaXMuX2xvZygnZXJyb3InLCAnRXhwZWN0ZWQgYSBub24tZW1wdHkga2V5Jywge2tleURlc2NyaXB0aW9uLCByZXF1ZXN0VXJsfSk7XG5cbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgdmFyIHJlc3VsdCA9IG51bGw7XG5cbiAgICB0cnkge1xuICAgICAgICByZXN1bHQgPSB0aGlzLl90cmFuc2xhdGUoa2V5LCBsb2NhbGUsIGFyZ3MsIG9wdGlvbnMsIHJlcXVlc3RVcmwpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgLy8gYWxyZWFkeSBsb2dnZWQ7IGp1c3QgZ290dGEgZ2l2ZSB0aGVtIG5vdGhpbmcgZm9yIG5vd1xuICAgIH1cblxuICAgIGlmIChyZXN1bHQpIHtcbiAgICAgICAgLy8gcmVzdWx0IHNob3VsZCBhbHJlYWR5IGJlIGZvcm1hdHRlZFxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHN0aWxsIGdvdHRhIGZvcm1hdCBub3RoaW5nIGZvciBhbGwgdGhlIGxvZ2ljIHRvIHdvcmsgb3V0XG4gICAgICAgIHJldHVybiB1dGlsaXR5LmZvcm1hdExvY2FsaXplZFRleHQoa2V5LCByZXN1bHQsIG9wdGlvbnMpO1xuICAgIH1cbn07XG5cblRyYW5zbGF0ZXIucHJvdG90eXBlLl90cmFuc2xhdGUgPSBmdW5jdGlvbihyZXF1ZXN0S2V5LCBsb2NhbGUsIGFyZ3MsIG9wdGlvbnMsIHJlcXVlc3RVcmwpIHtcbiAgICB2YXIga2V5c1RvVHJ5ID0gdGhpcy5fZ2V0S2V5c1RvVHJ5KHJlcXVlc3RLZXkpO1xuXG4gICAgZm9yICh2YXIga2V5IG9mIGtleXNUb1RyeSkge1xuICAgICAgICB2YXIgdHJhbnNsYXRpb24gPSB0aGlzLl90cnlHZXRUcmFuc2xhdGlvbihrZXkpO1xuXG4gICAgICAgIGlmICh0cmFuc2xhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YXIgdGVtcGxhdGVGdW5jdGlvbiA9IHRoaXMuX2NvbXBpbGVUZW1wbGF0ZShrZXksIGxvY2FsZSwgdHJhbnNsYXRpb24sIHJlcXVlc3RVcmwpO1xuXG4gICAgICAgICAgICBpZiAodGVtcGxhdGVGdW5jdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdmFyIHRyYW5zbGF0ZWQgPSB0ZW1wbGF0ZUZ1bmN0aW9uKGFyZ3MpO1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB1dGlsaXR5LmZvcm1hdExvY2FsaXplZFRleHQoa2V5LCB0cmFuc2xhdGVkLCBvcHRpb25zKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBubyBrZXlzIGNvdWxkIHByb2R1Y2UgYSByZXN1bHRcbiAgICB0aGlzLl9sb2coJ2Vycm9yJywgJ0NvdWxkIG5vdCBmaW5kIGEgdHJhbnNsYXRpb24gZm9yIGFueSBvZiB0aGUgZm9sbG93aW5nIGtleXMnLCB7d2Vic2l0ZUlkOiB0aGlzLndlYnNpdGVJZCwga2V5c1RvVHJ5LCBrZXk6IHJlcXVlc3RLZXksIGxvY2FsZSwgYXJncywgcmVxdWVzdFVybH0pO1xuXG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG5UcmFuc2xhdGVyLnByb3RvdHlwZS5fY29tcGlsZVRlbXBsYXRlID0gZnVuY3Rpb24oa2V5LCByYXdMb2NhbGUsIHRyYW5zbGF0aW9uLCByZXF1ZXN0VXJsKSB7XG4gICAgdmFyIGxvY2FsZXNUb1RyeSA9IHRoaXMuX2dldExvY2FsZXNUb1RyeShyYXdMb2NhbGUpO1xuXG4gICAgZm9yICh2YXIgbG9jYWxlIG9mIGxvY2FsZXNUb1RyeSkge1xuICAgICAgICB2YXIgdGVtcGxhdGUgPSB0cmFuc2xhdGlvbltsb2NhbGVdO1xuXG4gICAgICAgIGlmICh0ZW1wbGF0ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY29tcGlsZWRUZW1wbGF0ZXNbdGVtcGxhdGVdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb21waWxlZFRlbXBsYXRlc1t0ZW1wbGF0ZV0gPSB7fTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHRoaXMuX2NvbXBpbGVkVGVtcGxhdGVzW3RlbXBsYXRlXVtsb2NhbGVdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jb21waWxlZFRlbXBsYXRlc1t0ZW1wbGF0ZV1bbG9jYWxlXSA9IG1lc3NhZ2Vmb3JtYXQuY29tcGlsZVRlbXBsYXRlKHRlbXBsYXRlLCBsb2NhbGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29tcGlsZWRUZW1wbGF0ZXNbdGVtcGxhdGVdW2xvY2FsZV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgXG4gICAgdGhpcy5fbG9nKCdlcnJvcicsICdGb3VuZCBhIHRyYW5zbGF0aW9uIGJ1dCBubyB0ZW1wbGF0ZSBmb3IgYW55IG9mIHRoZSBmb2xsb3dpbmcgbG9jYWxlcycsIHt0cmFuc2xhdGlvbiwgbG9jYWxlc1RvVHJ5LCByYXdMb2NhbGUsIGtleSwgcmVxdWVzdFVybH0pO1xuXG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG5UcmFuc2xhdGVyLnByb3RvdHlwZS5fdHJ5R2V0VHJhbnNsYXRpb24gPSBmdW5jdGlvbihrZXkpIHtcbiAgICB2YXIgcGFydHMgPSBrZXkuc3BsaXQoJy4nKTtcbiAgICB2YXIgY3Vyc29yID0gdGhpcy5fdHJhbnNsYXRpb25zO1xuICAgIGZvciAodmFyIHBhcnQgb2YgcGFydHMpIHtcbiAgICAgICAgY3Vyc29yID0gY3Vyc29yW3BhcnRdO1xuXG4gICAgICAgIGlmIChjdXJzb3IgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB2YXIgdHJhbnNsYXRpb24gPSBjdXJzb3I7XG5cbiAgICAvLyBJZiB0aGUgdHJhbnNsYXRpb24gbWFwcGluZyBpcyBqdXN0IGEgc3RyaW5nLCB0cmVhdCBpdCBhcyBhIG1hcHBpbmdcbiAgICAvLyBvZiBlbmdsaXNoIHRvIHRoYXQgc3RyaW5nLlxuICAgIGlmICh0eXBlb2YgdHJhbnNsYXRpb24gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHRyYW5zbGF0aW9uID0ge2VuOiB0cmFuc2xhdGlvbn07XG4gICAgfVxuXG4gICAgcmV0dXJuIHRyYW5zbGF0aW9uO1xufTtcblxuVHJhbnNsYXRlci5wcm90b3R5cGUuX2dldExvY2FsZXNUb1RyeSA9IGZ1bmN0aW9uKGxvY2FsZSkge1xuICAgIGlmIChsb2NhbGUgJiYgbG9jYWxlICE9PSAnZW4nKSB7XG4gICAgICAgIHZhciBkYXNoSW5kZXggPSBsb2NhbGUuaW5kZXhPZignLScpO1xuXG4gICAgICAgIGlmIChkYXNoSW5kZXggPT09IC0xKSB7XG4gICAgICAgICAgICByZXR1cm4gW2xvY2FsZSwgJ2VuJ107XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgbGFuZ3VhZ2UgPSBsb2NhbGUuc3Vic3RyKDAsIGRhc2hJbmRleCk7XG5cbiAgICAgICAgICAgIGlmIChsYW5ndWFnZS50b0xvd2VyQ2FzZSgpID09PSAnZW4nKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtsb2NhbGUsICdlbiddO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gW2xvY2FsZSwgbGFuZ3VhZ2UsICdlbiddO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFsnZW4nXTtcbiAgICB9XG59O1xuXG5UcmFuc2xhdGVyLnByb3RvdHlwZS5fZ2V0S2V5c1RvVHJ5ID0gZnVuY3Rpb24oa2V5KSB7XG4gICAgcmV0dXJuIFtrZXkgKyAnSHRtbCcsIGtleV07XG59O1xuXG5UcmFuc2xhdGVyLnByb3RvdHlwZS5fbG9nID0gZnVuY3Rpb24obGV2ZWwsIG1lc3NhZ2UsIGFyZ3MpIHtcbiAgICBpZiAodGhpcy5fbG9nZ2VyKSB7XG4gICAgICAgIHRoaXMuX2xvZ2dlcihsZXZlbCwgbWVzc2FnZSwgYXJncyk7XG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBUcmFuc2xhdGVyO1xuIiwidmFyIGVzY2FwZUh0bWwgPSByZXF1aXJlKCdlc2NhcGUtaHRtbCcpO1xudmFyIF8gPSByZXF1aXJlKCd1bmRlcnNjb3JlJyk7XG52YXIgbG9jYWxlID0gcmVxdWlyZSgnbG9jYWxlJyk7XG5jb25zdCBBcHBQcm9tb01hbmFnZXIgPSByZXF1aXJlKCcuLi9hcHBQcm9tb01hbmFnZXInKTtcblxudmFyIGFsbExvY2FsZXMgPVxuICAgIHJlcXVpcmUoJ2xpZ2h0bmluZy1jb21tb24vbGliL2NvbmZpZ3VyYXRpb24vc3VwcG9ydGVkTGFuZ3VhZ2VzLmpzb24nKS5zdXBwb3J0ZWRMYW5ndWFnZXM7XG5cbnZhciBfaHRtbEVzY2FwZSA9IGZ1bmN0aW9uICh0ZXh0LCBzaG91bGRFc2NhcGVIdG1sKSB7XG4gICAgaWYgKHNob3VsZEVzY2FwZUh0bWwgJiYgdGV4dCkge1xuICAgICAgICByZXR1cm4gZXNjYXBlSHRtbCh0ZXh0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG59O1xuXG52YXIgX3dyYXAgPSBmdW5jdGlvbiAodGV4dCwgc2hvdWxkV3JhcCkge1xuICAgIGlmIChzaG91bGRXcmFwKSB7XG4gICAgICAgIGlmICh0ZXh0ID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiAnWCAoTUlTU0lORyBURU1QTEFURSkgWCc7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gJ+KckyAnICsgdGV4dCArICcg4pyTJztcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbn07XG5cbnZhciBfaXNIdG1sVHJhbnNsYXRpb24gPSBmdW5jdGlvbiAoa2V5KSB7XG4gICAgcmV0dXJuIGtleSAmJiBrZXkudG9Mb3dlckNhc2UoKS5lbmRzV2l0aCgnaHRtbCcpO1xufTtcblxudmFyIGZvcm1hdExvY2FsaXplZFRleHQgPSBmdW5jdGlvbiAoa2V5LCB0ZXh0LCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgICB2YXIgc2hvdWxkRXNjYXBlSHRtbCA9IG9wdGlvbnMuZXhwZWN0SHRtbCAmJiAhX2lzSHRtbFRyYW5zbGF0aW9uKGtleSk7XG4gICAgdmFyIHNob3VsZFdyYXAgPSAhIW9wdGlvbnMud3JhcDtcblxuICAgIHZhciBwb3NzaWJseUh0bWxFc2NhcGVkID0gX2h0bWxFc2NhcGUodGV4dCwgc2hvdWxkRXNjYXBlSHRtbCk7XG4gICAgdmFyIHBvc3NpYmx5V3JhcHBlZCA9IF93cmFwKHBvc3NpYmx5SHRtbEVzY2FwZWQsIHNob3VsZFdyYXApO1xuXG4gICAgcmV0dXJuIHBvc3NpYmx5V3JhcHBlZCB8fCAnJztcbn07XG5cbnZhciBnZXRMYW5ndWFnZUhlYWRlckxvY2FsZSA9IGZ1bmN0aW9uIChyZXEsIGxpYnJhcnlQcmltYXJ5TG9jYWxlKSB7XG4gICAgLy8gR2V0IGFsbCBzdXBwb3J0ZWQgbGFuZ3VhZ2VzXG4gICAgdmFyIHN1cHBvcnRlZExhbmd1YWdlcyA9IG5ldyBsb2NhbGUuTG9jYWxlcyhcbiAgICAgICAgXy5mbGF0dGVuKF8ucGx1Y2soYWxsTG9jYWxlcywgJ2RlZmF1bHRMYW5ndWFnZUNvZGUnKSksXG4gICAgICAgIGxpYnJhcnlQcmltYXJ5TG9jYWxlXG4gICAgKTtcbiAgICBjb25zdCBhY2NlcHRMYW5ndWFnZUhlYWRlciA9IHJlcS5oZWFkZXJzWydhY2NlcHQtbGFuZ3VhZ2UnXTtcbiAgICB2YXIgbG9jYWxlcyA9IG5ldyBsb2NhbGUuTG9jYWxlcyhhY2NlcHRMYW5ndWFnZUhlYWRlcik7XG4gICAgdmFyIGJlc3RMYW5ndWFnZSA9IGxvY2FsZXMuYmVzdChzdXBwb3J0ZWRMYW5ndWFnZXMpLnRvU3RyaW5nKCk7XG5cbiAgICBpZiAoYmVzdExhbmd1YWdlID09PSAnemgtSGFucycpIHtcbiAgICAgICAgLy8gTEhUTkctNDE5OCB6aC1IYW5zIGlzIHJldHVybmVkIGFzIGJlc3QgZXZlbiB3aGVuIHpoLUhhbnQgaXMgcHJlZmVycmVkICYgdGhlIGxpYnJhcnkgZG9lc24ndCBzdXBwb3J0IHpoLUhhbnNcbiAgICAgICAgdmFyIHpoSGFudFByZWZlcnJlZCA9XG4gICAgICAgICAgICBsb2NhbGVzLmxlbmd0aCA+IDAgJiZcbiAgICAgICAgICAgIChsb2NhbGVzWzBdLmNvZGUgPT0gJ3poLVRXJyB8fFxuICAgICAgICAgICAgICAgIGxvY2FsZXNbMF0uY29kZSA9PSAnemgtSEsnIHx8XG4gICAgICAgICAgICAgICAgbG9jYWxlc1swXS5jb2RlID09ICd6aC1NTycgfHxcbiAgICAgICAgICAgICAgICBsb2NhbGVzWzBdLmNvZGUgPT0gJ3poLUhhbnQnKTtcblxuICAgICAgICBpZiAoemhIYW50UHJlZmVycmVkICYmIHJlcS5saWJyYXJ5ICYmIHJlcS5saWJyYXJ5LnN1cHBvcnRlZExhbmd1YWdlcykge1xuICAgICAgICAgICAgdmFyIHpoSGFuc0V4aXN0cyA9IGZhbHNlO1xuXG4gICAgICAgICAgICByZXEubGlicmFyeS5zdXBwb3J0ZWRMYW5ndWFnZXMuZm9yRWFjaCgobGFuZ3VhZ2UpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAobGFuZ3VhZ2UuZGVmYXVsdExhbmd1YWdlQ29kZSA9PSAnemgtSGFucycpIHtcbiAgICAgICAgICAgICAgICAgICAgemhIYW5zRXhpc3RzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKCF6aEhhbnNFeGlzdHMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3poLUhhbnQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgYWNjZXB0TGFuZ3VhZ2VIZWFkZXIgJiZcbiAgICAgICAgICAgIGFjY2VwdExhbmd1YWdlSGVhZGVyLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoJ3poJykgJiZcbiAgICAgICAgICAgIChsaWJyYXJ5UHJpbWFyeUxvY2FsZSA9PT0gJ3poLUhhbnMnIHx8XG4gICAgICAgICAgICAgICAgbGlicmFyeVByaW1hcnlMb2NhbGUgPT09ICd6aC1IYW50JylcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBiZXN0TGFuZ3VhZ2UgPSBsaWJyYXJ5UHJpbWFyeUxvY2FsZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBiZXN0TGFuZ3VhZ2U7XG59O1xuXG5jb25zdCBwYXJzZVVzZXJBZ2VudFN5c3RlbUluZm9ybWF0aW9uID0gZnVuY3Rpb24gKHVzZXJBZ2VudCkge1xuICAgIGNvbnN0IGZpcnN0T3BlblBhcmVuID0gdXNlckFnZW50LmluZGV4T2YoJygnKTtcbiAgICBjb25zdCBmaXJzdENsb3NlUGFyZW4gPSB1c2VyQWdlbnQuaW5kZXhPZignKScpO1xuICAgIGlmIChmaXJzdE9wZW5QYXJlbiA9PT0gLTEgfHwgZmlyc3RDbG9zZVBhcmVuID09PSAtMSkge1xuICAgICAgICByZXR1cm4gW107XG4gICAgfVxuICAgIGNvbnN0IHN5c3RlbUluZm8gPSB1c2VyQWdlbnQuc3Vic3RyaW5nKFxuICAgICAgICBmaXJzdE9wZW5QYXJlbiArIDEsXG4gICAgICAgIGZpcnN0Q2xvc2VQYXJlbiAtIDFcbiAgICApO1xuICAgIHJldHVybiBzeXN0ZW1JbmZvLnNwbGl0KCc7JykubWFwKChpbmZvKSA9PiBpbmZvLnRyaW0oKSk7XG59O1xuXG5jb25zdCBnZXRUb2xpbm9Mb2NhbGUgPSBmdW5jdGlvbiAocmVxKSB7XG4gICAgLy8gVG9saW5vIGRldmljZXMgZG9uJ3Qgc2VuZCBvdmVyIHRoZSBjb3JyZWN0IGFjY2VwdC1sYW5ndWFnZSBoZWFkZXIsIGJ1dCB3ZSBjYW4gcHVsbCB0aGlzIHZhbHVlIG9mZiBvZiB0aGUgc3lzdGVtIGluZm9ybWF0aW9uLlxuICAgIC8vIFRoZSBzeXN0ZW0gaW5mb3JtYXRpb24gY29udGFpbnMgdGhlIGxhbmd1YWdlIGNvZGUgZm9sbG93ZWQgYnkgYSBoeXBlbiAoZS5nLjogYGRlLWAsIGBlbi1gLCBgZXMtYCwgZXRjKVxuICAgIGNvbnN0IHVzZXJBZ2VudCA9IHJlcS5oZWFkZXJzWyd1c2VyLWFnZW50J107XG4gICAgY29uc3Qgc3lzdGVtSW5mbyA9IHBhcnNlVXNlckFnZW50U3lzdGVtSW5mb3JtYXRpb24odXNlckFnZW50KTtcbiAgICBjb25zdCBsYW5nID0gc3lzdGVtSW5mb1xuICAgICAgICAuZmlsdGVyKChsKSA9PiBsLmVuZHNXaXRoKCctJykpXG4gICAgICAgIC5tYXAoKGwpID0+IGwuc3Vic3RyKDAsIGwubGVuZ3RoIC0gMSkpWzBdO1xuICAgIHJldHVybiBsYW5nIHx8ICdlbic7XG59O1xuXG52YXIgZ2V0TG9jYWxlID0gZnVuY3Rpb24gKHJlcSwgcmVzLCBsaWJyYXJ5UHJpbWFyeUxvY2FsZSkge1xuICAgIGNvbnN0IGFwcFByb21vTWFuYWdlciA9IEFwcFByb21vTWFuYWdlci5jcmVhdGVTZXJ2ZXIoXG4gICAgICAgIHJlcSxcbiAgICAgICAgcmVzLFxuICAgICAgICByZXEuZmVhdHVyZU1hbmFnZXJcbiAgICApO1xuXG4gICAgaWYgKHJlcS5xdWVyeSAmJiByZXEucXVlcnkuX2xvY2FsZSkge1xuICAgICAgICByZXR1cm4gcmVxLnF1ZXJ5Ll9sb2NhbGU7XG4gICAgfSBlbHNlIGlmIChcbiAgICAgICAgcmVxLnByb2ZpbGUgJiZcbiAgICAgICAgcmVxLnByb2ZpbGUuc2V0dGluZ3MgJiZcbiAgICAgICAgcmVxLnByb2ZpbGUuc2V0dGluZ3NbJ2xhbmd1YWdlLXNlbGVjdGlvbiddXG4gICAgKSB7XG4gICAgICAgIHJldHVybiByZXEucHJvZmlsZS5zZXR0aW5nc1snbGFuZ3VhZ2Utc2VsZWN0aW9uJ107XG4gICAgfSBlbHNlIGlmIChyZXEuY29va2llcyAmJiByZXEuY29va2llc1snbGFuZ3VhZ2Utc2VsZWN0aW9uJ10pIHtcbiAgICAgICAgcmV0dXJuIHJlcS5jb29raWVzWydsYW5ndWFnZS1zZWxlY3Rpb24nXTtcbiAgICB9IGVsc2UgaWYgKGFwcFByb21vTWFuYWdlci5zZXR0aW5ncy5pc1RvbGlub0RldmljZSkge1xuICAgICAgICByZXR1cm4gZ2V0VG9saW5vTG9jYWxlKHJlcSk7XG4gICAgfSBlbHNlIGlmIChyZXEuaGVhZGVyc1snYWNjZXB0LWxhbmd1YWdlJ10pIHtcbiAgICAgICAgcmV0dXJuIGdldExhbmd1YWdlSGVhZGVyTG9jYWxlKHJlcSwgbGlicmFyeVByaW1hcnlMb2NhbGUpO1xuICAgIH0gZWxzZSBpZiAobGlicmFyeVByaW1hcnlMb2NhbGUpIHtcbiAgICAgICAgcmV0dXJuIGxpYnJhcnlQcmltYXJ5TG9jYWxlO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiAnZW4nO1xuICAgIH1cbn07XG5cbi8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1zaGFkb3dcbnZhciBnZXRUcmFuc2xhdGlvbk9wdGlvbnMgPSBmdW5jdGlvbiAobG9jYWxlLCBleHBlY3RIdG1sKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgZXhwZWN0SHRtbDogZXhwZWN0SHRtbCxcbiAgICAgICAgd3JhcDogbG9jYWxlICYmIGxvY2FsZS50b0xvd2VyQ2FzZSgpID09PSAnZW4tcWEnLFxuICAgIH07XG59O1xuXG4vLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tc2hhZG93XG52YXIgaXNSdGwgPSBmdW5jdGlvbiAobG9jYWxlKSB7XG4gICAgc3dpdGNoIChsb2NhbGUudG9Mb3dlckNhc2UoKSkge1xuICAgICAgICBjYXNlICdlbi1ydGwnOlxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgZm9ybWF0TG9jYWxpemVkVGV4dCxcbiAgICBnZXRMb2NhbGUsXG4gICAgZ2V0VHJhbnNsYXRpb25PcHRpb25zLFxuICAgIGdldExhbmd1YWdlSGVhZGVyTG9jYWxlLFxuICAgIGlzUnRsLFxufTtcbiIsInZhciBfID0gcmVxdWlyZSgndW5kZXJzY29yZScpO1xuXG52YXIgdXJsSm9pbiA9IHJlcXVpcmUoJ3VybC1qb2luJyk7XG52YXIgcm91dGVzID0gcmVxdWlyZSgnLi4vLi4vcm91dGVzL3JvdXRpbmctY29uZmlndXJhdGlvbicpLnJvdXRlcztcblxuLy8gQ29udmVydHMgbmVzdGVkIHJvdXRlIG1hcCBpbnRvIGZsYXR0ZW5lZCByb3V0ZSBoYXNoIHRhYmxlXG52YXIgbWFwUm91dGVQYXRocyA9IGZ1bmN0aW9uKHJvdXRlTWFwKSB7XG4gICAgdmFyIHJlc3BvbnNlID0ge307XG5cbiAgICB2YXIgbWFwUm91dGVzID0gZnVuY3Rpb24oY3VycmVudFJvdXRlTWFwLCB0YXJnZXRPYmplY3QpIHtcbiAgICAgICAgXy5lYWNoKGN1cnJlbnRSb3V0ZU1hcCwgZnVuY3Rpb24ocm91dGUpIHtcbiAgICAgICAgICAgIGlmIChfLmlzT2JqZWN0KHJvdXRlKSkge1xuICAgICAgICAgICAgICAgIG1hcFJvdXRlcyhyb3V0ZSwgdGFyZ2V0T2JqZWN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldE9iamVjdFtyb3V0ZV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgbWFwUm91dGVzKHJvdXRlTWFwLCByZXNwb25zZSk7XG5cbiAgICByZXR1cm4gcmVzcG9uc2U7XG59O1xuXG5cbi8vIFRoZXNlIHJvdXRlcyBzaG91bGQgbm90IGJlIHByZWZpeGVkIHdpdGggYWR2YW50YWdlIGtleXMuXG52YXIgX3VucHJlZml4ZWRSb3V0ZXMgPSBbcm91dGVzLmFjY291bnRTaWduSW4sIHJvdXRlcy5hY2NvdW50TGlua0xpYnJhcnlDYXJkQ29tcGxldGUsIHJvdXRlcy5hc3NldHMuY3NzLmNvbG9ycywgcm91dGVzLmFzc2V0cy5jc3MudmVyc2lvbmVkQ29sb3JzLCByb3V0ZXMuYWNjb3VudFNpZ25JbkNvbXBsZXRlLCByb3V0ZXMub3pvbmUuYWNjb3VudFNpZ25vdXRDb21wbGV0ZV07XG5cbnZhciBfY2FzZUluc2Vuc2l0aXZlTG9va3VwID0gZnVuY3Rpb24gKG9iaiwga2V5TG9va3VwKSB7XG4gICAgaWYgKG9iaiAhPSBudWxsICYmIGtleUxvb2t1cCAhPSBudWxsKSB7XG4gICAgICAgIGZvciAodmFyIHByb3AgaW4gb2JqKSB7XG4gICAgICAgICAgICBpZiAoa2V5TG9va3VwLnRvTG93ZXJDYXNlKCkgPT0gcHJvcC50b0xvd2VyQ2FzZSgpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtrZXk6IHByb3AsIHZhbHVlOiBvYmpbcHJvcF19O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG52YXIgcm91dGVSZXZlcnNlTG9vcGt1cCA9IG1hcFJvdXRlUGF0aHMocm91dGVzKTtcblxudmFyIF9nZW5lcmF0ZVVybFdpdGhQYXJhbWV0ZXJzID0gZnVuY3Rpb24gKHBhdGhUZW1wbGF0ZSwgb3JpZ2luYWxQYXJhbWV0ZXJEaWN0aW9uYXJ5KSB7XG4gICAgaWYgKHBhdGhUZW1wbGF0ZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgcm91dGUgcGFzc2VkIGluIGlzIGluIG91ciByb3V0aW5nLWNvbmZpZ3VyYXRpb25cbiAgICBpZiAoIXJvdXRlUmV2ZXJzZUxvb3BrdXBbcGF0aFRlbXBsYXRlXSkge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBtYWtlIGEgc2hhbGxvdyBjbG9uZSBvZiB0aGUgcGFyYW1ldGVyIGRpY3Rpb25hcnlcbiAgICB2YXIgcGFyYW1ldGVyRGljdGlvbmFyeSA9IHt9O1xuICAgIGZvciAodmFyIG9yaWdpbmFsS2V5IGluIG9yaWdpbmFsUGFyYW1ldGVyRGljdGlvbmFyeSkge1xuICAgICAgICBpZiAoe30uaGFzT3duUHJvcGVydHkuY2FsbChvcmlnaW5hbFBhcmFtZXRlckRpY3Rpb25hcnksIG9yaWdpbmFsS2V5KSkge1xuICAgICAgICAgICAgcGFyYW1ldGVyRGljdGlvbmFyeVtvcmlnaW5hbEtleV0gPSBvcmlnaW5hbFBhcmFtZXRlckRpY3Rpb25hcnlbb3JpZ2luYWxLZXldO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHNhdGlzZmllZEFsbFBhcmFtZXRlcnMgPSB0cnVlO1xuICAgIHZhciBwYXRoID0gcGF0aFRlbXBsYXRlLnJlcGxhY2UoLzpcXHcrXFw/Py9nLCBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgdmFyIGlzT3B0aW9uYWwgPSBtYXRjaFttYXRjaC5sZW5ndGggLSAxXSA9PT0gJz8nO1xuXG4gICAgICAgIC8vIHRoZSBsZW5ndGggb2YgdGhlIGtleSBpcyBvbmUgbGVzcyB0aGFuIHRoZSBtYXRjaCBiZWNhdXNlIG9mIHRoZSBjb2xvbiBwcmVmaXhcbiAgICAgICAgdmFyIGtleUxlbmd0aCA9IG1hdGNoLmxlbmd0aCAtIDE7XG4gICAgICAgIGlmIChpc09wdGlvbmFsKSB7XG4gICAgICAgICAgICAvLyBhbmQgb25lIGxlc3MgaWYgb3B0aW9uYWwgdG8gbm90IGluY2x1ZGUgdGhlIHF1ZXN0aW9uIG1hcmtcbiAgICAgICAgICAgIC0ta2V5TGVuZ3RoO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc3RhcnQgZnJvbSAxIHRvIHNraXAgdGhlIGNvbG9uIHByZWZpeFxuICAgICAgICB2YXIga2V5ID0gbWF0Y2guc3Vic3RyKDEsIGtleUxlbmd0aCk7XG5cbiAgICAgICAgdmFyIHR1cGxlID0gX2Nhc2VJbnNlbnNpdGl2ZUxvb2t1cChwYXJhbWV0ZXJEaWN0aW9uYXJ5LCBrZXkpO1xuXG4gICAgICAgIGlmICh0dXBsZSA9PSBudWxsIHx8IHR1cGxlLnZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIGlmIChpc09wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHBhcmFtZXRlckRpY3Rpb25hcnlba2V5XTsgIC8vIHJlbW92ZSBpdCBzbyBpdCdzIG5vdCBpbiB0aGUgcXVlcnlzdHJpbmdcblxuICAgICAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgc2F0aXNmaWVkQWxsUGFyYW1ldGVycyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBkZWxldGUgcGFyYW1ldGVyRGljdGlvbmFyeVt0dXBsZS5rZXldOyAgLy8gcmVtb3ZlIGl0IHNvIGl0J3Mgbm90IGluIHRoZSBxdWVyeXN0cmluZ1xuXG4gICAgICAgICAgICByZXR1cm4gdHVwbGUudmFsdWU7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vIFRPRE86IGxvZz8gIGVycm9yP1xuICAgIGlmICghc2F0aXNmaWVkQWxsUGFyYW1ldGVycykge1xuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICAvLyB1cmwtam9pbiB3aWxsIHRyaW0gb2ZmIGEgdHJhaWxpbmcgc2xhc2ggT05MWSB3aGVuIHRoZXJlJ3MgYSBxdWVyeXN0cmluZzsgd2UnZFxuICAgIC8vIHJhdGhlciBiZSBjb25zaXN0ZW50IGFuZCBqdXN0IGFsd2F5cyB0cmltIGl0IG91cnNlbHZlcyB0byBhdm9pZCBjb25mdXNpb25cbiAgICAvLyBOT1RFOiB0aGUgaW5kZXggcGF0aCBpcyB0aGUgb25seSBjYXNlIHdoZXJlIGVuZGluZyBpbiBhIHNsYXNoIGlzbid0IHRyYWlsaW5nXG4gICAgdmFyIGxhc3RQYXRoQ2hhciA9IHBhdGhbcGF0aC5sZW5ndGggLSAxXTtcbiAgICBpZiAobGFzdFBhdGhDaGFyID09PSAnLycgJiYgcGF0aCAhPT0gJy8nKSB7XG4gICAgICAgIHBhdGggPSBwYXRoLnN1YnN0cigwLCBwYXRoLmxlbmd0aCAtIDEpO1xuICAgIH1cblxuICAgIC8vIFRPRE86IFN1cHBvcnQgYXJyYXlzIGFzIHF1ZXJ5c3RyaW5nIHZhbHVlc1xuICAgIC8vIFRPRE86IENvbnZlcnQgbm9uLXN0cmluZ3MgdG8gc3RyaW5nc1xuICAgIHZhciBxdWVyeVBhcnRzID0gW107XG4gICAgZm9yICh2YXIga2V5IGluIHBhcmFtZXRlckRpY3Rpb25hcnkpIHtcbiAgICAgICAgaWYgKHt9Lmhhc093blByb3BlcnR5LmNhbGwocGFyYW1ldGVyRGljdGlvbmFyeSwga2V5KSkge1xuICAgICAgICAgICAgcXVlcnlQYXJ0cy5wdXNoKGtleSArICc9JyArIGVuY29kZVVSSUNvbXBvbmVudChwYXJhbWV0ZXJEaWN0aW9uYXJ5W2tleV0pKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICB2YXIgcXVlcnkgPSBxdWVyeVBhcnRzLmxlbmd0aCA9PT0gMCA/ICcnIDogJz8nICsgcXVlcnlQYXJ0cy5qb2luKCcmJyk7XG5cbiAgICByZXR1cm4gcGF0aCArIHF1ZXJ5O1xufTtcblxudmFyIF9wcmVwZW5kUm9vdCA9IGZ1bmN0aW9uIChyZXEsIHJvdXRlKSB7XG4gICAgdmFyIGJhc2VVcmwgPSByZXEuYmFzZVVybCB8fCAnLyc7XG4gICAgaWYgKGJhc2VVcmwgPT09ICcvJykge1xuICAgICAgICByZXR1cm4gcm91dGU7XG4gICAgfSBlbHNlIGlmIChyb3V0ZSA9PT0gJy8nKSB7XG4gICAgICAgIHJldHVybiBiYXNlVXJsO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiB1cmxKb2luKGJhc2VVcmwsIHJvdXRlKTtcbiAgICB9XG59O1xuXG52YXIgZ2V0Um91dGVVcmwgPSBmdW5jdGlvbiAocmVxLCByb3V0ZSwgcGFyYW1ldGVycykge1xuICAgIHZhciBmdWxsUm91dGUgPSBfZ2VuZXJhdGVVcmxXaXRoUGFyYW1ldGVycyhyb3V0ZSwgcGFyYW1ldGVycyB8fCB7fSk7XG4gICAgaWYgKGZ1bGxSb3V0ZSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBpc1ByZWZpeGVkID0gX3VucHJlZml4ZWRSb3V0ZXMuaW5kZXhPZihyb3V0ZSkgPT09IC0xO1xuICAgICAgICBpZiAoaXNQcmVmaXhlZCkge1xuICAgICAgICAgICAgcmV0dXJuIF9wcmVwZW5kUm9vdChyZXEsIGZ1bGxSb3V0ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZnVsbFJvdXRlO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gcHJvYmFibHkgbG9nIGhlcmVcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgcm91dGVzOiByb3V0ZXMsXG4gICAgZ2V0Um91dGVVcmw6IGdldFJvdXRlVXJsLFxuXG4gICAgX2Nhc2VJbnNlbnNpdGl2ZUxvb2t1cDogX2Nhc2VJbnNlbnNpdGl2ZUxvb2t1cFxufTtcbiIsIm1vZHVsZS5leHBvcnRzID0ge1xuICAgIHllYXJJblNlY29uZHM6IDM2NSAqIDI0ICogNjAgKiA2MCxcbiAgICB5ZWFySW5NaWxsaXNlY29uZHM6IDM2NSAqIDI0ICogNjAgKiA2MCAqIDEwMDAsXG4gICAgbWludXRlSW5NaWxsaXNlY29uZHM6IDYwICogMTAwMCxcbiAgICBkYXlJbk1pbGxpU2Vjb25kczogMjQgKiA2MCAqIDYwICogMTAwMFxufTtcbiIsInZhciBTaW1wbGVIYXNoID0ge1xuICAgIGhhc2g6IGZ1bmN0aW9uKHRvSGFzaCkge1xuICAgICAgICB2YXIgaGFzaCA9IDAsIGksIGNociwgbGVuID0gdG9IYXNoLmxlbmd0aDtcbiAgICAgICAgaWYgKHRvSGFzaC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBoYXNoO1xuICAgICAgICB9XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgY2hyICAgPSB0b0hhc2guY2hhckNvZGVBdChpKTtcbiAgICAgICAgICAgIGhhc2ggID0gKChoYXNoIDw8IDUpIC0gaGFzaCkgKyBjaHI7XG4gICAgICAgICAgICBoYXNoIHw9IDA7IC8vIENvbnZlcnQgdG8gMzJiaXQgaW50ZWdlclxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBoYXNoO1xuXG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBTaW1wbGVIYXNoO1xuIiwidmFyIHF1ZXJ5c3RyaW5nID0gcmVxdWlyZSgncXVlcnlzdHJpbmcnKTtcblxudmFyIHN1cHBvcnRVcmwgPSBmdW5jdGlvbihwcmVmZXJyZWRMYW5nLCBhcnRpY2xlLCBwYXJhbXMpIHtcbiAgICB2YXIgbGFuZ3VhZ2UgPSBwcmVmZXJyZWRMYW5nIHx8ICdlbic7XG4gICAgdmFyIHVybCA9ICdodHRwczovL2hlbHAub3ZlcmRyaXZlLmNvbSc7XG4gICAgaWYgKGxhbmd1YWdlID09PSAnZnInIHx8IGxhbmd1YWdlID09PSAnZnItQ0EnKSB7XG4gICAgICAgIHVybCArPSAnL2N1c3RvbWVyL2ZyL3BvcnRhbC9hcnRpY2xlcy8nO1xuICAgICAgICBpZiAoISFhcnRpY2xlKSB7XG4gICAgICAgICAgICB1cmwgKz0gYXJ0aWNsZTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoISFhcnRpY2xlKSB7XG4gICAgICAgIHVybCArPSAnL2N1c3RvbWVyL3BvcnRhbC9hcnRpY2xlcy8nICsgYXJ0aWNsZTtcbiAgICB9XG4gICAgaWYgKCEhcGFyYW1zKSB7XG4gICAgICAgIHZhciBxdWVyeVN0cmluZyA9IHF1ZXJ5c3RyaW5nLnN0cmluZ2lmeShwYXJhbXMpO1xuICAgICAgICBpZiAocXVlcnlTdHJpbmcpIHtcbiAgICAgICAgICAgIHVybCArPSAnPycgKyBxdWVyeVN0cmluZztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdXJsO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBzdXBwb3J0VXJsO1xuIiwiLyoqXG4qIEZsaXBzIHRoZSB2YWx1ZSBvZiBhIGJpdCBhdCB0aGUgaW5kZXhcbiogQHBhcmFtIGluZGV4IC0gaW5kZXggb2YgYml0IHRvIGZsaXAuIDAgaXMgdGhlIExTQlxuKiBAcGFyYW0gZmxhZ1N0cmluZyAtIEVuY29kZWQgc3RyaW5nLCBiaXRzIGFyZSByZXByZXNlbnRlZCBieSBiYXNlIDEwIGludGVnZXJcbiogQHJldHVybiBmbGFnU3RyaW5nIC0gdGhlIHVwZGF0ZWQgYW5kIGVuY29kZWQgc3RyaW5nXG4qL1xudmFyIGJpdEZsaXAgPSBmdW5jdGlvbihpbmRleCwgZmxhZ1N0cmluZykge1xuICAgIHZhciBwb3cgPSBNYXRoLnBvdygyLCBpbmRleCk7XG4gICAgcmV0dXJuIChwYXJzZUludChmbGFnU3RyaW5nLCAxMCkgXiBwb3cpLnRvU3RyaW5nKCk7XG59O1xuXG4vKipcbiogUmV0dXJucyB0aGUgdmFsdWUgb2YgYSBiaXQgYXQgdGhlIGluZGV4IHNwZWNpZmllZCBmcm9tIHRoZSBlbmNvZGVkIGZsYWdTdHJpbmdcbiogQHBhcmFtIGluZGV4IC0gaW5kZXggb2YgYml0IGZsYWcuIDAgaXMgdGhlIExTQlxuKiBAcGFyYW0gZmxhZ1N0cmluZyAtIEVuY29kZWQgc3RyaW5nLCBiaXRzIGFyZSByZXByZXNlbnRlZCBieSBiYXNlIDEwIGludGVnZXJcbiogQHJldHVybiBib29sZWFuIHZhbHVlIGF0IGluZGV4XG4qL1xudmFyIGJpdERlY29kZSA9IGZ1bmN0aW9uKGluZGV4LCBmbGFnU3RyaW5nKSB7XG4gICAgdmFyIHBvdyA9IE1hdGgucG93KDIsIGluZGV4KTtcbiAgICByZXR1cm4gKHBhcnNlSW50KGZsYWdTdHJpbmcsMTApICYgcG93KSA9PT0gcG93O1xufTtcblxuLyoqXG4qIEVuY29kZXMgdGhlIGJpdCBhdCB0aGUgaW5kZXggb24vb2ZmIGludG8gYSBmbGFnU3RyaW5nXG4qIEBwYXJhbSB2YWx1ZSAtIHZhbHVlIHRvIGJlIGVuY29kZWQgKHRydWUvZmFsc2UpXG4qIEBwYXJhbSBpbmRleCAtIGluZGV4IG9mIGJpdCB0byBzZXQuIDAgaXMgdGhlIExTQlxuKiBAcGFyYW0gZmxhZ1N0cmluZyAtIG9wdGlvbmFsIGlmIHVwZGF0aW5nIGV4aXN0aW5nIGZsYWdTdHJpbmdcbiogQHJldHVybiB0aGUgZW5jb2RlZCBzdHJpbmcgb2YgYml0c1xuKi9cbnZhciBiaXRFbmNvZGUgPSBmdW5jdGlvbih2YWx1ZSwgaW5kZXgsIGZsYWdTdHJpbmcgPSAnMCcpIHtcbiAgICByZXR1cm4gYml0RGVjb2RlKGluZGV4LCBmbGFnU3RyaW5nKSA9PT0gdmFsdWUgPyBmbGFnU3RyaW5nIDogYml0RmxpcChpbmRleCwgZmxhZ1N0cmluZyk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBiaXRGbGlwOiBiaXRGbGlwLFxuICAgIGJpdERlY29kZTogYml0RGVjb2RlLFxuICAgIGJpdEVuY29kZTogYml0RW5jb2RlXG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmxpZ2h0Q2xvbmUgPSBleHBvcnRzLmpzb25DbG9uZSA9IHZvaWQgMDtcbi8qKlxuICogUmV0dXJucyBhIHNoYWxsb3ctaXNoIGNsb25lIG9mIHBhcmFtLlxuICogVXNlcyBqc29uIHBhcnNlLCBzdHJpbmdpZnkgc28gbm8gc3VwcG9ydCBmb3JcbiAqIGVzNiBzdHJ1Y3R1cmVzIChzeW1ib2xzLCBzZXRzLCBtYXBzLCBldGMpLCBkYXRlcywgZnVuY3Rpb25zLCB1bmRlZmluZWRcbiAqIEBwYXJhbSB7b2JqfGFycmF5fHN0cmluZ3xudW1iZXJ8bnVsbH0gb2JqIC0gVGhlIHRoaW5nIHRvIGJlIGNsb25lZFxuICogQHJldHVybiB7b2JqfGFycmF5fHN0cmluZ3xudW1iZXJ8bnVsbH0gQSBjbG9uZWQgdGhpbmdcbiAqL1xudmFyIGpzb25DbG9uZSA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShvYmopKTtcbn07XG5leHBvcnRzLmpzb25DbG9uZSA9IGpzb25DbG9uZTtcbi8qKlxuICogUmV0dXJucyBhIHNoYWxsb3ctaXNoIGNsb25lIG9mIHBhcmFtXG4gKiBDdXJyZW50bHkgbm8gc3VwcG9ydCBmb3IgZXM2IHN0cnVjdHVyZXMgKHN5bWJvbHMsIHNldHMsIG1hcHMsIGV0YyksXG4gKiBkYXRlcywgZnVuY3Rpb25zXG4gKiBAcGFyYW0ge29ianxhcnJheXxzdHJpbmd8bnVtYmVyfG51bGx8dW5kZWZpbmVkfSBvYmogLSBUaGUgdGhpbmcgdG8gYmUgY2xvbmVkXG4gKiBAcmV0dXJuIHtvYmp8YXJyYXl8c3RyaW5nfG51bWJlcnxudWxsfHVuZGVmaW5lZH0gQSBjbG9uZWQgdGhpbmdcbiAqL1xudmFyIGxpZ2h0Q2xvbmUgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgcmV0dXJuIG9iaiA9PT0gdm9pZCAwID8gb2JqIDogKDAsIGV4cG9ydHMuanNvbkNsb25lKShvYmopO1xufTtcbmV4cG9ydHMubGlnaHRDbG9uZSA9IGxpZ2h0Q2xvbmU7XG5cbi8vIyBzb3VyY2VNYXBwaW5nVVJMPWNsb25lLXRzLmpzLm1hcFxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1jbG9uZS10cy5qcy5tYXBcbiIsIi8vIE9yaWdpbmFsOiBodHRwczovL2ppcmEuaHEub3ZlcmRyaXZlLmNvbS9icm93c2UvTEhUTkctMzgwOSBSZWxvY2F0aW9uOiBodHRwczovL2ppcmEuaHEub3ZlcmRyaXZlLmNvbS9icm93c2UvTEhUTkctMzg2MlxuXG5jb25zdCBNYWNtaWxsYW5NZXNzYWdlID0gZnVuY3Rpb24obW9kZWwpIHtcbiAgICBsZXQgYmFkUHVibGlzaGVyID0gcGFyc2VJbnQobW9kZWwuZ2V0KFwicHVibGlzaGVyQWNjb3VudFwiKS5pZCwgMTApID09PSA2MjIyO1xuICAgIGxldCB0b2RheSA9IG5ldyBEYXRlKCk7XG4gICAgbGV0IHJlbGVhc2VEYXRlID0gbmV3IERhdGUobW9kZWwuZ2V0KFwiZXN0aW1hdGVkUmVsZWFzZURhdGVcIikpO1xuICAgIGxldCBtYWNtaWxsYW5MaWNlbnNpbmdDaGFuZ2VJbkVmZmVjdCA9IHJlbGVhc2VEYXRlID49IG5ldyBEYXRlKDIwMTksIDEwLCAxKTtcbiAgICBsZXQgcmVsZWFzZURhdGVQbHVzOFdlZWtzID0gbmV3IERhdGUocmVsZWFzZURhdGUpO1xuICAgIHJlbGVhc2VEYXRlUGx1czhXZWVrcy5zZXREYXRlKHJlbGVhc2VEYXRlLmdldERhdGUoKSArICg4ICogNykpO1xuICAgIGxldCByZWxlYXNlRGF0ZVdpdGhpbkVpZ2h0V2Vla3MgPSAocmVsZWFzZURhdGUgPCB0b2RheSkgJiYgKHRvZGF5IDwgcmVsZWFzZURhdGVQbHVzOFdlZWtzKTtcblxuICAgIHJldHVybiB3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdtYWNtaWxsYW5NZXNzYWdpbmcnKVxuICAgICAgICAgICAgJiYgbWFjbWlsbGFuTGljZW5zaW5nQ2hhbmdlSW5FZmZlY3RcbiAgICAgICAgICAgICYmIGJhZFB1Ymxpc2hlclxuICAgICAgICAgICAgJiYgKHJlbGVhc2VEYXRlV2l0aGluRWlnaHRXZWVrcyB8fCAobWFjbWlsbGFuTGljZW5zaW5nQ2hhbmdlSW5FZmZlY3QgJiYgbW9kZWwuZ2V0KFwiaXNQcmVyZWxlYXNlVGl0bGVcIikpKVxuICAgICAgICA/IGh0bWwoJ21hY21pbGxhbk1lc3NhZ2UnLCB7ZGF0ZSA6IHJlbGVhc2VEYXRlUGx1czhXZWVrcyB9KVxuICAgICAgICA6ICcnO1xufVxuXG5leHBvcnQgZGVmYXVsdCBNYWNtaWxsYW5NZXNzYWdlO1xuIiwiXG5sZXQgYml0RmxhZyA9IHJlcXVpcmUoJy4uL2xpYi91dGlsaXR5L2JpdEZsYWcuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBIaWdobGlnaHRlZEZlYXR1cmVTdGF0ZSB7XG5cbiAgICBjb25zdHJ1Y3RvcihmbGFncywgZmVhdHVyZU1hbmFnZXIsIGhhc1BhcnRuZXJMaWJyYXJpZXMpIHtcbiAgICAgICAgdGhpcy5mZWF0dXJlTWFuYWdlciA9IGZlYXR1cmVNYW5hZ2VyO1xuICAgICAgICB0aGlzLmhhc1BhcnRuZXJMaWJyYXJpZXMgPSBoYXNQYXJ0bmVyTGlicmFyaWVzO1xuXG4gICAgICAgIGlmIChmbGFncyl7XG4gICAgICAgICAgICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmZsYWdzID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBmZWF0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHBhcnRuZXJMaWJyYXJpZXNNZW51OiB7ZmxhZ0JpdDogMCwgYWN0aXZlOiB0aGlzLmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgncmVjaXByb2NhbExlbmRpbmcnKSAmJiB0aGlzLmhhc1BhcnRuZXJMaWJyYXJpZXN9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgd2FzVmlzaXRlZChmZWF0dXJlTmFtZSl7XG4gICAgICAgIGlmICghdGhpcy5mZWF0dXJlcy5oYXNPd25Qcm9wZXJ0eShmZWF0dXJlTmFtZSkpe1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGAnJHtmZWF0dXJlTmFtZX0nIGlzIG5vdCBhIGtub3duIGZlYXR1cmUuYCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYml0RmxhZy5iaXREZWNvZGUodGhpcy5mZWF0dXJlc1tmZWF0dXJlTmFtZV0uZmxhZ0JpdCwgdGhpcy5mbGFncyk7XG4gICAgfVxuXG4gICAgdmlzaXQoZmVhdHVyZU5hbWUpe1xuICAgICAgICBpZiAoIXRoaXMuZmVhdHVyZXMuaGFzT3duUHJvcGVydHkoZmVhdHVyZU5hbWUpKXtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgJyR7ZmVhdHVyZU5hbWV9JyBpcyBub3QgYSBrbm93biBmZWF0dXJlLmApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBiaXRGbGFnLmJpdEVuY29kZSh0cnVlLCB0aGlzLmZlYXR1cmVzW2ZlYXR1cmVOYW1lXS5mbGFnQml0LCB0aGlzLmZsYWdzKTtcbiAgICB9XG5cbiAgICB2aXNpdEFsbEFjdGl2ZUZlYXR1cmVzKCl7XG4gICAgICAgIGxldCBhY3RpdmVGZWF0dXJlTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzLmZlYXR1cmVzKS5maWx0ZXIoKGZlYXR1cmVOYW1lID0+IHRoaXMuZmVhdHVyZXNbZmVhdHVyZU5hbWVdLmFjdGl2ZSkpO1xuICAgICAgICBhY3RpdmVGZWF0dXJlTmFtZXMuZm9yRWFjaCgoZmVhdHVyZU5hbWUpID0+IHRoaXMudmlzaXQoZmVhdHVyZU5hbWUpKTtcbiAgICB9XG5cbiAgICBnZXQgdW52aXNpdGVkRmVhdHVyZVByZXNlbnQoKSB7XG4gICAgICAgIGxldCBhY3RpdmVGZWF0dXJlTmFtZXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzLmZlYXR1cmVzKS5maWx0ZXIoKGZlYXR1cmVOYW1lID0+IHRoaXMuZmVhdHVyZXNbZmVhdHVyZU5hbWVdLmFjdGl2ZSkpO1xuICAgICAgICByZXR1cm4gYWN0aXZlRmVhdHVyZU5hbWVzLmxlbmd0aCAhPT0gMCAmJiBhY3RpdmVGZWF0dXJlTmFtZXMuc29tZSgoZmVhdHVyZU5hbWUpID0+ICF0aGlzLndhc1Zpc2l0ZWQoZmVhdHVyZU5hbWUpKTtcbiAgICB9XG59O1xuIiwiXG5sZXQgYml0RmxhZyA9IHJlcXVpcmUoJy4uL2xpYi91dGlsaXR5L2JpdEZsYWcuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBjbGFzcyBPZFRyYWNrIHtcblxuICAgIGNvbnN0cnVjdG9yKGZsYWdzLCBpc0dkcHJDb3V0bnJ5KSB7XG4gICAgICAgIGlmIChmbGFncyl7XG4gICAgICAgICAgICB0aGlzLmZsYWdzID0gZmxhZ3M7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBkZWZhdWx0c1xuICAgICAgICAgICAgdGhpcy5mbGFncyA9IDA7XG4gICAgICAgICAgICBpZiAoIWlzR2RwckNvdXRucnkpe1xuICAgICAgICAgICAgICAgIHRoaXMucGVyZlRyYWNraW5nRW5hYmxlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5hbmFseXRpY3NUcmFja2luZ0VuYWJsZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wZXJmVHJhY2tpbmdFbmFibGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgdGhpcy5hbmFseXRpY3NUcmFja2luZ0VuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldCBwZXJmVHJhY2tpbmdFbmFibGVkKCl7XG4gICAgICAgIHJldHVybiBiaXRGbGFnLmJpdERlY29kZSgwLCB0aGlzLmZsYWdzKTtcbiAgICB9XG5cbiAgICBzZXQgcGVyZlRyYWNraW5nRW5hYmxlZChlbmFibGVkKXtcbiAgICAgICAgdGhpcy5mbGFncyA9IGJpdEZsYWcuYml0RW5jb2RlKGVuYWJsZWQsIDAsIHRoaXMuZmxhZ3MpO1xuICAgIH1cblxuICAgIGdldCBhbmFseXRpY3NUcmFja2luZ0VuYWJsZWQoKXtcbiAgICAgICAgcmV0dXJuIGJpdEZsYWcuYml0RGVjb2RlKDEsIHRoaXMuZmxhZ3MpO1xuICAgIH1cblxuICAgIHNldCBhbmFseXRpY3NUcmFja2luZ0VuYWJsZWQoZW5hYmxlZCl7XG4gICAgICAgIHRoaXMuZmxhZ3MgPSBiaXRGbGFnLmJpdEVuY29kZShlbmFibGVkLCAxLCB0aGlzLmZsYWdzKTtcbiAgICB9XG5cbn1cbiIsImNvbnN0IF8gPSByZXF1aXJlKCd1bmRlcnNjb3JlJyk7XG5cbi8qKlxuICogRGVmaW5lcyBhbGwgdGhlIGF2YWlsYWJsZSBpbnB1dCBwYXJhbWV0ZXJzIGZvciB0aGUgbWVkaWEgZW5kcG9pbnRcbiAqIEBjbGFzcyBNZWRpYVBhcmFtZXRlcnNcbiAqIHJlZjogaHR0cHM6Ly90aHVuZGVyLmFwaS50ZXN0Lm92ZXJkcml2ZS5jb20vZG9jcy91aS9pbmRleCMhL01lZGlhL1YyTWVkaWFfSW5kZXhNZWRpYVxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGNsYXNzIE1lZGlhUGFyYW1ldGVycyB7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5xdWVyeSAgICAgICAgICAgICAgICAgICAgICA9ICcnO1xuICAgICAgICB0aGlzLm1lZGlhVHlwZSAgICAgICAgICAgICAgICAgID0gJyc7XG4gICAgICAgIHRoaXMubWVkaWFUeXBlcyAgICAgICAgICAgICAgICAgPSAnJztcbiAgICAgICAgdGhpcy50aXRsZSAgICAgICAgICAgICAgICAgICAgICA9ICcnO1xuICAgICAgICB0aGlzLnNlcmllcyAgICAgICAgICAgICAgICAgICAgID0gJyc7XG4gICAgICAgIHRoaXMucHVibGlzaGVySWQgICAgICAgICAgICAgICAgPSAnJztcbiAgICAgICAgdGhpcy5wdWJsaXNoZXJFbnRpdHlJZCAgICAgICAgICA9IG51bGw7XG4gICAgICAgIHRoaXMuaW1wcmludElkICAgICAgICAgICAgICAgICAgPSAnJztcbiAgICAgICAgdGhpcy5pZGVudGlmaWVyICAgICAgICAgICAgICAgICA9ICcnO1xuICAgICAgICB0aGlzLmNyZWF0b3IgICAgICAgICAgICAgICAgICAgID0gJyc7XG4gICAgICAgIHRoaXMuY3JlYXRvcklkICAgICAgICAgICAgICAgICAgPSBudWxsO1xuICAgICAgICB0aGlzLmFkZGVkRGF0ZSAgICAgICAgICAgICAgICAgID0gJyc7XG4gICAgICAgIHRoaXMuYXZhaWxhYmxlRmlyc3QgICAgICAgICAgICAgPSBudWxsO1xuICAgICAgICB0aGlzLnNob3dPbmx5QXZhaWxhYmxlICAgICAgICAgID0gZmFsc2U7XG4gICAgICAgIHRoaXMuc2hvd09ubHlQcmVyZWxlYXNlICAgICAgICAgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5zaG93T25seUx1Y2t5RGF5QXZhaWxhYmxlICA9IGZhbHNlO1xuICAgICAgICB0aGlzLmhhc0F1ZGlvU3luY2hyb25pemVkVGV4dCAgID0gbnVsbDtcbiAgICAgICAgdGhpcy5jb2xsZWN0aW9uSWQgICAgICAgICAgICAgICA9IDA7XG5cbiAgICAgICAgLy8gQWxsIG9mIHRoZSBmb2xsb3dpbmcgYXJyYXlzIGFyZSBzdHJpbmcgYXJyYXlzXG4gICAgICAgIHRoaXMuZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgPSBbXTtcbiAgICAgICAgdGhpcy5zdWJqZWN0ICAgICAgICAgICAgICAgICAgICA9IFtdO1xuICAgICAgICB0aGlzLmJpc2FjQ29kZSAgICAgICAgICAgICAgICAgID0gW107XG4gICAgICAgIHRoaXMubWF0dXJpdHlMZXZlbCAgICAgICAgICAgICAgPSBbXTtcbiAgICAgICAgdGhpcy5sYW5ndWFnZSAgICAgICAgICAgICAgICAgICA9IFtdO1xuICAgICAgICB0aGlzLmF0b3NMZXZlbCAgICAgICAgICAgICAgICAgID0gW107XG4gICAgICAgIHRoaXMubGV4aWxlU2NvcmUgICAgICAgICAgICAgICAgPSBbXTtcbiAgICAgICAgdGhpcy5pbnRlcmVzdExldmVsICAgICAgICAgICAgICA9IFtdO1xuICAgICAgICB0aGlzLmdyYWRlTGV2ZWwgICAgICAgICAgICAgICAgID0gW107XG4gICAgICAgIHRoaXMuaW5jbHVkZWRGYWNldHMgICAgICAgICAgICAgPSBbXTtcblxuICAgICAgICB0aGlzLnNvcnRCeSAgICAgICAgICAgICAgICAgICAgID0gJ3JlbGV2YW5jZSc7XG4gICAgICAgIHRoaXMuc2hvdyAgICAgICAgICAgICAgICAgICAgICAgPSAnb3duZWQnO1xuICAgICAgICB0aGlzLnBhZ2UgICAgICAgICAgICAgICAgICAgICAgID0gMTtcbiAgICAgICAgdGhpcy5wZXJQYWdlICAgICAgICAgICAgICAgICAgICA9IDI0O1xuICAgICAgICB0aGlzLmluY2x1ZGVGYWNldHMgICAgICAgICAgICAgID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5pbmNsdWRlTm9Gb3JtYXRUaXRsZXMgICAgICA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZpbHRlckNwY1RpdGxlcyAgICAgICAgICAgID0gZmFsc2U7XG4gICAgICAgIHRoaXMubWF4SXRlbXMgICAgICAgICAgICAgICAgICAgPSAwO1xuXG4gICAgICAgIE9iamVjdC5hc3NpZ24odGhpcywgLi4uYXJndW1lbnRzKTtcbiAgICB9XG5cbiAgICBhcHBseVJvb21GaWx0ZXJzQW5kVXNlclByZWZzKHJvb21GaWx0ZXJzLCB1c2VyUHJlZmVyZW5jZXMpIHtcbiAgICAgICAgaWYgKHJvb21GaWx0ZXJzKSB7XG4gICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhlIG5hbWVzIGRvbid0IG1hdGNoIHVwIHNvIHdlIGNhbid0IGp1c3QgZXh0ZW5kXG4gICAgICAgICAgICBpZiAocm9vbUZpbHRlcnMubWF0dXJpdHlMZXZlbHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hdHVyaXR5TGV2ZWwgPSByb29tRmlsdGVycy5tYXR1cml0eUxldmVscztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyb29tRmlsdGVycy5zdWJqZWN0cykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3ViamVjdCA9IHJvb21GaWx0ZXJzLnN1YmplY3RzO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJvb21GaWx0ZXJzLmxhbmd1YWdlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sYW5ndWFnZSA9IHJvb21GaWx0ZXJzLmxhbmd1YWdlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHJvb21GaWx0ZXJzLm1lZGlhVHlwZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWVkaWFUeXBlID0gcm9vbUZpbHRlcnMubWVkaWFUeXBlO1xuICAgICAgICAgICAgICAgIHRoaXMubWVkaWFUeXBlcyA9IHJvb21GaWx0ZXJzLm1lZGlhVHlwZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1c2VyUHJlZmVyZW5jZXMpIHtcbiAgICAgICAgICAgIC8vIFRoZXJlIG1heSBiZSBtb3JlIHVzZXIgcHJlZnMgdG8gYXBwbHkgYmVzaWRlcyBhdWRpZW5jZS1zZXR0aW5ncyBidXQgdGhpc1xuICAgICAgICAgICAgLy8gd2FzIHRoZSBpbW1lZGlhdGUgbmVlZC4gIFdlIGNhbiBhZGQgbW9yZSBhcyB0aGV5IGNvbWUgdXAuXG4gICAgICAgICAgICBpZiAodXNlclByZWZlcmVuY2VzWydhdWRpZW5jZS1zZXR0aW5nJ10gJiYgdGhpcy5tYXR1cml0eUxldmVsLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICAgIGxldCBhdWRpZW5jZSA9IHVzZXJQcmVmZXJlbmNlc1snYXVkaWVuY2Utc2V0dGluZyddO1xuICAgICAgICAgICAgICAgIGxldCBtYXR1cml0eUxldmVscyA9IFtdO1xuICAgICAgICAgICAgICAgIF8uZWFjaChfLmtleXMoYXVkaWVuY2UpLCBmdW5jdGlvbihrZXkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGllbmNlW2tleV0gJiYga2V5ICE9PSAnYWxsJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF0dXJpdHlMZXZlbHMucHVzaChrZXkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKG1hdHVyaXR5TGV2ZWxzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5tYXR1cml0eUxldmVsID0gbWF0dXJpdHlMZXZlbHM7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2VyaWFsaXplKCkge1xuICAgICAgICBsZXQgcmVzcG9uc2UgPSBfLmV4dGVuZCh7fSwgdGhpcyk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIGFsbCBwcm9wZXJ0aWVzIHRoYXQgZG8gbm90IGhhdmUgYSB2YWx1ZSBzZXRcbiAgICAgICAgT2JqZWN0LmtleXMocmVzcG9uc2UpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgIXRoaXMuX2hhc1ZhbHVlKHJlc3BvbnNlW2tleV0pICYmIGRlbGV0ZSByZXNwb25zZVtrZXldO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuXG4gICAgX2hhc1ZhbHVlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiAhKChfKHZhbHVlKS5pc09iamVjdCgpICYmIF8odmFsdWUpLmlzRW1wdHkoKSkgfHwgIXZhbHVlKSB8fCB2YWx1ZSA9PT0gZmFsc2U7XG4gICAgfVxufTtcbiIsIi8vIGltcG9ydCB3aGVuIHdlIG1vdmUgbW9yZSB0byBtb2R1bGVzXG5leHBvcnQgZGVmYXVsdCB3aW5kb3cuQmFja2JvbmUuQ29sbGVjdGlvbjtcbiIsImltcG9ydCB7IE1vZGFsIH0gZnJvbSAgJy4uL2NvbW1vbi9tb2RhbCc7XG5cbmNvbnN0IHsgaHRtbCB9ID0gd2luZG93O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIb2xkQ2FuY2VsTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoe1xuICAgICAgICAgICAgdGl0bGUgICA6IGh0bWwoJ2NhbmNlbEhvbGRNb2RhbC5yZW1vdmVIb2xkJyksXG4gICAgICAgICAgICBjb250ZW50IDogYFxuICAgICAgICAgICAgICAgIDxwPiR7IGh0bWwoJ2NhbmNlbEhvbGRNb2RhbC5yZW1vdmVDb25maXJtJykgfTwvcD5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWNvbnRhaW5lclwiPjwvZGl2PmBcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy4kYnV0dG9uQ29uZmlybSA9ICQoYFxuICAgICAgICAgICAgPGJ1dHRvbiBhcmlhLWxhYmVsPVwiJHsgaHRtbCgnY2FuY2VsSG9sZE1vZGFsLmNvbmZpcm1BcmlhTGFiZWwnKSB9XCIgY2xhc3M9XCJidXR0b24gbWFyZ2luLXNtYWxsIHJhZGl1cyBzZWNvbmRhcnkgdS1hbGxDYXBzXCI+XG4gICAgICAgICAgICAgICAgJHsgaHRtbCgnY2FuY2VsSG9sZE1vZGFsLnJlbW92ZUhvbGQnKSB9XG4gICAgICAgICAgICA8L2J1dHRvbj5gKVxuICAgICAgICAgICAgLm9uKCdjbGljayBrZXlkb3duJywgKGUpID0+IHsgdGhpcy5pc1NlbGVjdEV2ZW50KGUpICYmIHRoaXMudHJpZ2dlcignY29uZmlybScsIHRoaXMpOyB9KTtcblxuICAgICAgICB0aGlzLiRidXR0b25DYW5jZWwgID0gJChgXG4gICAgICAgICAgICA8YnV0dG9uIGNsYXNzPVwiYnV0dG9uIHJhZGl1cyBtYXJnaW4tc21hbGwgb3V0bGluZSBncmF5IGNhbmNlbCB1LWFsbENhcHNcIj4keyBodG1sKCdjYW5jZWwnKSB9PC9idXR0b24+YFxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9uKCdjbGljayBrZXlkb3duJywgKGUpID0+IHsgdGhpcy5pc1NlbGVjdEV2ZW50KGUpICYmIHRoaXMudHJpZ2dlcignY2FuY2VsJywgdGhpcyk7IH0pO1xuXG4gICAgICAgIHRoaXMuJGNvbnRlbnQuZmluZCgnLmJ1dHRvbi1jb250YWluZXInKS5hcHBlbmQoW1xuICAgICAgICAgICAgdGhpcy4kYnV0dG9uQ29uZmlybSxcbiAgICAgICAgICAgIHRoaXMuJGJ1dHRvbkNhbmNlbFxuICAgICAgICBdKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgUG9wb3ZlciAgZnJvbSAgICcuLi8uLi9jb21wb25lbnRzL3BvcG92ZXIvcG9wb3Zlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE1hY09TQXVkaW9ib29rU3VwcG9ydFBvcG92ZXJ7XG4gICAgXG4gICAgY29uc3RydWN0b3IoZWwpIHtcbiAgICAgICAgdGhpcy50ZW1wbGF0ZSA9IGA8cD4ke2h0bWwoXCJtYWNPc0F1ZGlvYm9va1N1cHByZXNzaW9uLnN1cHBvcnRlZFZlcnNpb25zXCIpfTwvcD5gO1xuXG4gICAgICAgIHRoaXMuZWwgPSBlbDtcbiAgICB9XG5cbiAgICByZW5kZXIoKXtcbiAgICAgICAgcmV0dXJuIG5ldyBQb3BvdmVyKHtcbiAgICAgICAgICAgIHRhcmdldDogdGhpcy5lbCxcbiAgICAgICAgICAgIGNvbnRlbnRzOiB0aGlzLnRlbXBsYXRlLFxuICAgICAgICAgICAgd2lkdGg6IDM3NVxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgdGVtcGxhdGUgZnJvbSAnLi9SZW1vdmVTdXNwZW5kSG9sZE1vZGFsVGVtcGxhdGUuaHRtbCc7XG5pbXBvcnQge01vZGFsfSBmcm9tICcuLi9jb21tb24vbW9kYWwnO1xuY29uc3QgeyBodG1sIH0gPSB3aW5kb3c7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFN1c3BlbmRIb2xkTW9kYWwgZXh0ZW5kcyBCYWNrYm9uZS5WaWV3IHtcbiAgICBjb25zdHJ1Y3Rvcihtb2RlbCwgaXNOb3RpZmljYXRpb24gPSBmYWxzZSl7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgICAgICAgdGhpcy5pc05vdGlmaWNhdGlvbiA9IGlzTm90aWZpY2F0aW9uO1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cblxuICAgIHJlbmRlcigpe1xuICAgICAgICBsZXQgbW9kYWxDb250ZW50cyA9IHtcbiAgICAgICAgICAgIHRpdGxlOiBodG1sKCdyZW1vdmVTdXNwZW5zaW9uTW9kYWwuaGVhZGluZycpLFxuICAgICAgICAgICAgYXV0b1Nob3c6IGZhbHNlLFxuICAgICAgICAgICAgY2xhc3NlczogWydzbWFsbCcsICdyZW1vdmUtc3VzcGVuc2lvbi1tb2RhbCddLFxuICAgICAgICAgICAgY29udGVudDogdGVtcGxhdGUodGhpcy5tb2RlbC5nZXQoJ3RpdGxlJyksIHRoaXMubW9kZWwuZ2V0KFwib3duZWRDb3BpZXNcIikgPT09IDAgPyBodG1sKFwiaG9sZFJlZGVsaXZlcnkucmVtb3ZlU3VzcGVuc2lvbkxhcHNlZE1BXCIpIDogaHRtbChcImhvbGRSZWRlbGl2ZXJ5LnJlbW92ZVN1c3BlbnNpb25cIikpXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5tb2RhbCA9IG5ldyBNb2RhbChtb2RhbENvbnRlbnRzKTtcbiAgICAgICAgdGhpcy5hdHRhY2hFdmVudHModGhpcy5tb2RhbC4kZWwpO1xuICAgICAgICB0aGlzLm1vZGFsLnNob3coKTtcbiAgICB9XG4gICAgXG4gICAgYXR0YWNoRXZlbnRzKG1vZGFsKXtcbiAgICAgICAgbW9kYWwuZmluZChcIiNyZW1vdmUtc3VzcGVuZFwiKS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICBmZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoXCJob2xkUmVkZWxpdmVyeVwiKSA/IHdpbmRvdy5yZW1vdmVTdXNwZW5zaW9uKHRoaXMubW9kZWwuZ2V0KCdpZCcpKSA6IHdpbmRvdy5yZW1vdmVTdXNwZW5kZWRIb2xkKHRoaXMubW9kZWwuZ2V0KCdpZCcpKTtcbiAgICAgICAgICAgIHdpbmRvdy5nbG9iYWxFdmVudHMudHJpZ2dlcihcInRpdGxlOnN1c3BlbmQ6Y2FuY2VsbGVkXCIsIHsgdGl0bGVNb2RlbDogdGhpcy5tb2RlbCwgY29udGV4dDogeyBpc05vdGlmaWNhdGlvbjogdGhpcy5pc05vdGlmaWNhdGlvbiB9fSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG1vZGFsLmZpbmQoXCIuY2FuY2VsXCIpLm9uKCdjbGljaycsICgpID0+IHsgICAgICAgICAgIFxuICAgICAgICAgICAgbW9kYWwuZmluZCgnLmNsb3NlLXJldmVhbC1tb2RhbCcpLmNsaWNrKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImNvbnN0IHsgaHRtbCB9ID0gd2luZG93O1xuZXhwb3J0IGRlZmF1bHQgKHRpdGxlLCB0ZXh0KSA9PiBgXG48ZGl2IGNsYXNzPVwibW9kYWwtY29udGFpbmVyXCIgYXJpYS1kZXNjcmliZWRieT1cInJlbW92ZS1zdXNwZW5zaW9uLWxhYmVsXCI+XG4gICAgPGRpdiBjbGFzcz1cImxhcmdlLTEyIGNvbHVtbnMgbm8tcGFkZGluZy1sZWZ0XCI+XG4gICAgICAgIDxoMyBjbGFzcz1cIm1lZGlhVGl0bGVcIiB0YWJpbmRleD1cIi0xXCI+JHt0aXRsZX08L2gzPlxuICAgICAgICA8cCBjbGFzcz1cInJlbW92ZUhvbGRTdXNwZW5zaW9uVGV4dFwiPiR7dGV4dH08L3A+XG4gICAgICAgIDxzcGFuIGlkPVwicmVtb3ZlLXN1c3BlbnNpb24tbGFiZWxcIj5cbiAgICAgICAgICAgICR7aHRtbCgnaG9sZFJlZGVsaXZlcnkuYXJlWW91U3VyZScpfVxuICAgICAgICA8L3NwYW4+PGJyLz5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJidXR0b24tY29udGFpbmVyXCI+XG4gICAgICAgIDxidXR0b24gdGFiaW5kZXg9XCIwXCIgaWQ9XCJyZW1vdmUtc3VzcGVuZFwiIGNsYXNzPVwiYnV0dG9uIG1hcmdpbi1zbWFsbCByYWRpdXMgc2Vjb25kYXJ5IGNvbnRyYXN0IHUtYWxsQ2Fwc1wiIHJvbGU9XCJidXR0b25cIiBhcmlhLWxhYmVsPVwiJHsgaHRtbCgncmVtb3ZlU3VzcGVuc2lvbk1vZGFsLnJlbW92ZScpIH1cIj5cbiAgICAgICAgICAgIDxzcGFuPiR7IGh0bWwoJ3JlbW92ZVN1c3BlbnNpb25Nb2RhbC5yZW1vdmUnKSB9PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgZGF0YS1yZXZlYWwtaWQ9XCJzdXNwZW5zaW9uLW1vZGFsXCIgY2xhc3M9XCJidXR0b24gcmFkaXVzIG1hcmdpbi1zbWFsbCBvdXRsaW5lIGdyYXkgY2FuY2VsIHUtYWxsQ2FwcyBqcy1sYXN0LWZvY3VzXCI+JHsgaHRtbCgnY2FuY2VsJykgfTwvYnV0dG9uPlxuICAgIDwvZGl2PlxuPC9kaXY+XG4gYDtcbiIsImltcG9ydCB0ZW1wbGF0ZSBmcm9tICcuL1N1c3BlbmRIb2xkTW9kYWxUZW1wbGF0ZS5odG1sJztcbmltcG9ydCB7IE1vZGFsIH0gZnJvbSAnLi4vY29tbW9uL21vZGFsJztcbmltcG9ydCBSZW1vdmVTdXNwZW5kZWRIb2xkTW9kYWwgZnJvbSAnLi4vUmVtb3ZlU3VzcGVuZGVkSG9sZE1vZGFsL1JlbW92ZVN1c3BlbmRIb2xkTW9kYWwnO1xuaW1wb3J0IFN1c3BlbmRIb2xkU3VjY2Vzc01vZGFsIGZyb20gJy4uL1N1c3BlbmRIb2xkU3VjY2Vzc01vZGFsL1N1c3BlbmRIb2xkU3VjY2Vzc01vZGFsJztcbmltcG9ydCBhZGREYXlzIGZyb20gJy4uLy4uL3V0aWwvZGF0ZXMvYWRkRGF5cyc7XG5jb25zdCB7IGh0bWwgfSA9IHdpbmRvdztcblxuLy8gVGhlcmUgYXJlIDMgcG9zc2libGUgc3RhdGVzIGZvciB0aGlzIHdoaWNoIGFmZmVjdCBjb3B5OlxuLy8gU3VzcGVuZGVkIGFuZCBuZXZlciBkZWxpdmVyZWQgLS0+IFN0YW5kYXJkIFN1c3BlbmQgSG9sZCBtb2RhbFxuLy8gU3VzcGVuZGVkIGFuZCBoYXMgYmVlbiBkZWxpZXZlcmVkIGJlZm9yZSAtLT4gR2V0cyBzb21lIGR5bmFtaWMgZGF0ZSB1cGRhdGVzIGFuZCBhIG5ldyBsYWJlbFxuLy8gQXZhaWxhYmxlIC0tPiBTYW1lIGFzIHRoZSBvcHRpb24gYWJvdmUgKHdpdGggYSBuZXcgbGFiZWwpLCBidXQgYWxzbyBjb21lcyB3aXRoIGEgbmV3IGRyb3Bkb3duIG9wdGlvblxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBTdXNwZW5kSG9sZE1vZGFsIGV4dGVuZHMgQmFja2JvbmUuVmlldyB7XG4gICAgY29uc3RydWN0b3IobW9kZWwsIHJlZGVsaXZlcnksIGlzTm90aWZpY2F0aW9uID0gZmFsc2UpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsO1xuICAgICAgICB0aGlzLnJlZGVsaXZlcnkgPSByZWRlbGl2ZXJ5O1xuICAgICAgICB0aGlzLmlzQXZhaWxhYmxlID0gbW9kZWwuZ2V0KCdpc0F2YWlsYWJsZScpO1xuICAgICAgICAvLyBDaGVja3MgZm9yIGlmIGEgc3VzcGVuZGVkIHRpdGxlIGhhcyBiZWNvbWUgYXZhaWxhYmxlIHRvIHRoZSB1c2VyIGF0IGFueSBwb2ludFxuICAgICAgICB0aGlzLmRlbGl2ZXJlZFByZXZpb3VzbHkgPVxuICAgICAgICAgICAgbW9kZWwuZ2V0KCdzdXNwZW5zaW9uRmxhZycpICYmXG4gICAgICAgICAgICAobW9kZWwuZ2V0KCdpc0F2YWlsYWJsZScpIHx8XG4gICAgICAgICAgICAgICAgbW9kZWwuZ2V0KCdyZWRlbGl2ZXJpZXNBdXRvbWF0ZWRDb3VudCcpID4gMCB8fFxuICAgICAgICAgICAgICAgIG1vZGVsLmdldCgncmVkZWxpdmVyaWVzUmVxdWVzdGVkQ291bnQnKSA+IDApO1xuICAgICAgICB0aGlzLmlzTm90aWZpY2F0aW9uID0gaXNOb3RpZmljYXRpb247XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBsZXQgbW9kYWxDb250ZW50cyA9IHtcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLl9nZXRUaXRsZSgpLFxuICAgICAgICAgICAgYXV0b1Nob3c6IGZhbHNlLFxuICAgICAgICAgICAgY2xhc3NlczogWydzbWFsbCcsICdzdXNwZW5zaW9uLW1vZGFsJywgJ3ZlcnNpb24tdHdvJ10sXG4gICAgICAgICAgICBjb250ZW50OiB0ZW1wbGF0ZShcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICAgICAgdGhpcy5pc0F2YWlsYWJsZSxcbiAgICAgICAgICAgICAgICB0aGlzLmRlbGl2ZXJlZFByZXZpb3VzbHksXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5nZXQoJ3N1c3BlbnNpb25GbGFnJylcbiAgICAgICAgICAgICksXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKHdpbmRvdy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ3N1c3BlbmQtbW9kYWwtZGF0YS1hZGp1c3RtZW50JykpIHtcbiAgICAgICAgICAgIGxldCBjb3ZlciA9IHRoaXMubW9kZWwuZ2V0Q292ZXIoMTUwKTtcbiAgICAgICAgICAgIG1vZGFsQ29udGVudHMuY29udGVudCA9IHRlbXBsYXRlKFxuICAgICAgICAgICAgICAgIG51bGwsXG4gICAgICAgICAgICAgICAgY292ZXIgJiYgY292ZXIuaHJlZixcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmdldCgndGl0bGUnKSxcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmdldCgnZmlyc3RDcmVhdG9yTmFtZScpLFxuICAgICAgICAgICAgICAgIHRoaXMuaXNBdmFpbGFibGUsXG4gICAgICAgICAgICAgICAgdGhpcy5kZWxpdmVyZWRQcmV2aW91c2x5LFxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZ2V0KCdzdXNwZW5zaW9uRmxhZycpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tb2RhbCA9IG5ldyBNb2RhbChtb2RhbENvbnRlbnRzKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyVGV4dCh0aGlzLm1vZGFsLiRlbCk7XG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKHRoaXMubW9kYWwuJGVsKTtcbiAgICAgICAgdGhpcy5tb2RhbC5zaG93KCk7XG4gICAgfVxuXG4gICAgYXR0YWNoRXZlbnRzKG1vZGFsKSB7XG4gICAgICAgIG1vZGFsLmZpbmQoJyNzdXNwZW5kLWhvbGQnKS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICBsZXQgZGF5cyA9IG1vZGFsLmZpbmQoJyNzZWxlY3Qtc3VzcGVuc2lvbicpLnZhbCgpO1xuXG4gICAgICAgICAgICBpZiAoZGF5cyA+IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9zdXNwZW5kSG9sZChkYXlzKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVtb3ZlU3VzcGVuc2lvbih0aGlzLm1vZGVsLmdldCgnaWQnKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG1vZGFsLmZpbmQoJy5yZW1vdmUtc3VzcGVuc2lvbi1idXR0b24nKS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICBuZXcgUmVtb3ZlU3VzcGVuZGVkSG9sZE1vZGFsKHRoaXMubW9kZWwsIHRoaXMuaXNOb3RpZmljYXRpb24pO1xuICAgICAgICB9KTtcblxuICAgICAgICBtb2RhbC5maW5kKCcuY2FuY2VsJykub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgbW9kYWwuZmluZCgnLmNsb3NlLXJldmVhbC1tb2RhbCcpLmNsaWNrKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG1vZGFsLmZpbmQoJyNzZWxlY3Qtc3VzcGVuc2lvbicpLm9uKCdjaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9yZW5kZXJUZXh0KG1vZGFsKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2dldFRpdGxlKCkge1xuICAgICAgICBpZiAodGhpcy5pc0F2YWlsYWJsZSkge1xuICAgICAgICAgICAgcmV0dXJuIGh0bWwoJ3N1c3BlbmRIb2xkTW9kYWwuYXZhaWxhYmxlVGl0bGUnKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmRlbGl2ZXJlZFByZXZpb3VzbHkpIHtcbiAgICAgICAgICAgIHJldHVybiBodG1sKCdzdXNwZW5kSG9sZE1vZGFsLnByZXZpb3VzbHlEZWxpdmVyZWRUaXRsZScpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGh0bWwoJ3N1c3BlbmRIb2xkTW9kYWwuaGVhZGluZycpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX3JlbmRlclRleHQobW9kYWwpIHtcbiAgICAgICAgY29uc3QgZGVzY3JpcHRpb24gPSBtb2RhbC5maW5kKCcjc3VzcGVuZC1kZXNjcmlwdGlvbicpO1xuICAgICAgICBkZXNjcmlwdGlvbi5lbXB0eSgpO1xuXG4gICAgICAgIGxldCBkYXlzID0gbW9kYWwuZmluZCgnI3NlbGVjdC1zdXNwZW5zaW9uJykudmFsKCk7XG4gICAgICAgIGxldCB0ZXh0ID0gJyc7XG5cbiAgICAgICAgaWYgKGRheXMgPiAwKSB7XG4gICAgICAgICAgICBsZXQgZGF0ZSA9IGFkZERheXMoZGF5cyk7XG4gICAgICAgICAgICB0aGlzLmlzQXZhaWxhYmxlIHx8IHRoaXMuZGVsaXZlcmVkUHJldmlvdXNseVxuICAgICAgICAgICAgICAgID8gKHRleHQgPSBodG1sKCdob2xkUmVkZWxpdmVyeS5zdXNwZW5kSG9sZFRleHQnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgZXhwaXJhdGlvbkRhdGU6IGh0bWwoJ2RhdGUtbG9uZycsIHsgZDogZGF0ZSB9KSxcbiAgICAgICAgICAgICAgICAgIH0pKVxuICAgICAgICAgICAgICAgIDogKHRleHQgPSBodG1sKCdzdXNwZW5kSG9sZE1vZGFsLmV4cGxhbmF0aW9uRHluYW1pYycsIHtcbiAgICAgICAgICAgICAgICAgICAgICBleHBpcmF0aW9uRGF0ZTogaHRtbCgnZGF0ZS1sb25nJywgeyBkOiBkYXRlIH0pLFxuICAgICAgICAgICAgICAgICAgfSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGV4dCA9IGh0bWwoJ2hvbGRSZWRlbGl2ZXJ5LnN1c3BlbmRIb2xkUmVtb3ZlVGV4dCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVzY3JpcHRpb24uYXBwZW5kKHRleHQpO1xuICAgIH1cblxuICAgIF9zdXNwZW5kSG9sZChkYXlzKSB7XG4gICAgICAgIHdpbmRvdy5zdXNwZW5kSG9sZCh0aGlzLm1vZGVsLmdldCgnaWQnKSwgZGF5cyk7XG5cbiAgICAgICAgdmFyIG1vZGVsID0gdGhpcy5tb2RlbDtcbiAgICAgICAgdmFyIG51bWJlck9mRGF5cyA9IGRheXM7XG4gICAgICAgIHZhciBpc1JlZGVsaXZlcnkgPSB0aGlzLmlzQXZhaWxhYmxlO1xuICAgICAgICB2YXIgaXNTdXNwZW5kZWQgPSB0aGlzLm1vZGVsLmdldCgnc3VzcGVuc2lvbkZsYWcnKTtcbiAgICAgICAgdmFyIGNvbnRleHQgPSB7XG4gICAgICAgICAgICBudW1PZkRheXM6IG51bWJlck9mRGF5cyxcbiAgICAgICAgICAgIGlzUmVkZWxpdmVyeTogaXNSZWRlbGl2ZXJ5LFxuICAgICAgICAgICAgaXNTdXNwZW5kZWQ6IGlzU3VzcGVuZGVkLFxuICAgICAgICAgICAgaXNOb3RpZmljYXRpb246IHRoaXMuaXNOb3RpZmljYXRpb24sXG4gICAgICAgIH07XG4gICAgICAgIHdpbmRvdy5nbG9iYWxFdmVudHMudHJpZ2dlcigndGl0bGU6c3VzcGVuZCcsIHtcbiAgICAgICAgICAgIHRpdGxlTW9kZWw6IG1vZGVsLFxuICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNBdmFpbGFibGUgfHwgdGhpcy5kZWxpdmVyZWRQcmV2aW91c2x5KSB7XG4gICAgICAgICAgICBuZXcgU3VzcGVuZEhvbGRTdWNjZXNzTW9kYWwodGhpcy5tb2RlbCwgYWRkRGF5cyhkYXlzKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm1vZGFsLiRlbC5maW5kKCcuY2xvc2UtcmV2ZWFsLW1vZGFsJykuY2xpY2soKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9yZW1vdmVTdXNwZW5zaW9uID0gZnVuY3Rpb24gKG1lZGlhSWQpIHtcbiAgICAgICAgbGV0IHByb21pc2UgPSB3aW5kb3cuY2FsbFRvUmVtb3ZlU3VzcGVuc2lvbihtZWRpYUlkKTtcblxuICAgICAgICBwcm9taXNlXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgd2luZG93Lmdsb2JhbEV2ZW50cy50cmlnZ2VyKCd0aXRsZTpzdXNwZW5kOmNhbmNlbGxlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVNb2RlbDogdGhpcy5tb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDogeyBpc05vdGlmaWNhdGlvbjogdGhpcy5pc05vdGlmaWNhdGlvbiB9LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIG5ldyBTdXNwZW5kSG9sZFN1Y2Nlc3NNb2RhbCh0aGlzLm1vZGVsLCAndG9kYXknKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5Mb2dnZXIubG9nKCdlcnJvcicsICdFcnJvciByZW1vdmluZyBob2xkIHN1c3BlbnNpb24nLCB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGVyci5zdGF0dXNUZXh0IHx8IGVycixcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAodG9hc3Rlcikge1xuICAgICAgICAgICAgICAgICAgICB0b2FzdGVyLnB1c2god2luZG93LnRleHQoJ2Vycm9yT2NjdXJyZWQnKSwgJ2Vycm9yJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMubW9kYWwuJGVsLmZpbmQoJy5jbG9zZS1yZXZlYWwtbW9kYWwnKS5jbGljaygpO1xuICAgICAgICAgICAgfSk7XG4gICAgfTtcbn1cbiIsImNvbnN0IHsgaHRtbCB9ID0gd2luZG93O1xuZXhwb3J0IGRlZmF1bHQgKGF0dHMsIGNvdmVyLCB0aXRsZSwgYXV0aG9yLCBpc0F2YWlsYWJsZSwgZGVsaXZlcmVkUHJldmlvdXNseSwgaXNTdXNwZW5kZWQpID0+IGBcblxuPGRpdiBjbGFzcz1cImxhcmdlLTEyIGNvbHVtbnMgbm8tcGFkZGluZy1sZWZ0IHN1c3BlbmQtdGl0bGVcIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgJHsgd2luZG93LmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnc3VzcGVuZC1tb2RhbC1kYXRhLWFkanVzdG1lbnQnKSA/IFxuICAgICAgICBgPGltZyBzcmM9XCIke2NvdmVyfVwiIGNsYXNzPVwibWVkaWFDb3ZlclwiIC8+XG4gICAgICAgIDxoNSBjbGFzcz1cInRpdGxlXCI+PHN0cm9uZz4ke3RpdGxlfTwvc3Ryb25nPjwvaDU+XG4gICAgICAgIDxwIGNsYXNzPVwibWVkaWFBdXRob3JcIj4ke2F1dGhvcn08L3A+YFxuICAgICAgICA6XG4gICAgICAgIGA8aW1nIHNyYz1cIiR7YXR0cy5jb3ZlcnMuY292ZXIxNTBXaWRlLmhyZWZ9XCIgY2xhc3M9XCJtZWRpYUNvdmVyXCIgLz5cbiAgICAgICAgPGg1IGNsYXNzPVwidGl0bGVcIj48c3Ryb25nPiR7YXR0cy50aXRsZX08L3N0cm9uZz48L2g1PlxuICAgICAgICA8cCBjbGFzcz1cIm1lZGlhQXV0aG9yXCI+JHthdHRzLmZpcnN0Q3JlYXRvck5hbWV9PC9wPmBcbiAgICB9XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cInJvdyBzdXNwZW5kLW9wdGlvbnNcIj5cbiAgICA8ZGl2IGNsYXNzPVwic3VzcGVuZC1zZWxlY3QtY29udGFpbmVyXCI+XG4gICAgICAgICR7aXNBdmFpbGFibGUgfHwgZGVsaXZlcmVkUHJldmlvdXNseSA/IFxuICAgICAgICAgICAgYDxsYWJlbCBpZD1cInNlbGVjdC1zdXNwZW5zaW9uLWxhYmVsXCI+JHtodG1sKCdob2xkUmVkZWxpdmVyeS5zdXNwZW5kU2VsZWN0RGVsaXZlcmVkTGFiZWwnKX08L2xhYmVsPmBcbiAgICAgICAgICAgIDogJydcbiAgICAgICAgfVxuICAgICAgICA8c2VsZWN0IGlkPVwic2VsZWN0LXN1c3BlbnNpb25cIiBkYXRhLW9wZW49XCJmYWxzZVwiPlxuICAgICAgICAgICAgJHtkZWxpdmVyZWRQcmV2aW91c2x5ID8gXG4gICAgICAgICAgICAgICAgYDxvcHRpb24gdmFsdWU9XCIwXCIgc2VsZWN0ZWQ+JHtodG1sKCdzdXNwZW5kSG9sZE1vZGFsLnN1c3BlbmRIb2xkUmVtb3ZlJyl9PC9vcHRpb24+YFxuICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDxvcHRpb24gdmFsdWU9XCI3XCIgJHtkZWxpdmVyZWRQcmV2aW91c2x5ID8gJycgOiAnc2VsZWN0ZWQnfT4ke2lzQXZhaWxhYmxlIHx8IGRlbGl2ZXJlZFByZXZpb3VzbHkgPyBodG1sKCdzdXNwZW5kSG9sZE1vZGFsLnN1c3BlbmRIb2xkQWZ0ZXInLCB7bnVtOiA3fSkgOiBodG1sKCdzdXNwZW5kSG9sZE1vZGFsLnN1c3BlbmRIb2xkRm9yJywge251bTogN30pfTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjE0XCI+JHtpc0F2YWlsYWJsZSB8fCBkZWxpdmVyZWRQcmV2aW91c2x5ID8gaHRtbCgnc3VzcGVuZEhvbGRNb2RhbC5zdXNwZW5kSG9sZEFmdGVyJywge251bTogMTR9KSA6IGh0bWwoJ3N1c3BlbmRIb2xkTW9kYWwuc3VzcGVuZEhvbGRGb3InLCB7bnVtOiAxNH0pfTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjIxXCI+JHtpc0F2YWlsYWJsZSB8fCBkZWxpdmVyZWRQcmV2aW91c2x5ID8gaHRtbCgnc3VzcGVuZEhvbGRNb2RhbC5zdXNwZW5kSG9sZEFmdGVyJywge251bTogMjF9KSA6IGh0bWwoJ3N1c3BlbmRIb2xkTW9kYWwuc3VzcGVuZEhvbGRGb3InLCB7bnVtOiAyMX0pfTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjI4XCI+JHtpc0F2YWlsYWJsZSB8fCBkZWxpdmVyZWRQcmV2aW91c2x5ID8gaHRtbCgnc3VzcGVuZEhvbGRNb2RhbC5zdXNwZW5kSG9sZEFmdGVyJywge251bTogMjh9KSA6IGh0bWwoJ3N1c3BlbmRIb2xkTW9kYWwuc3VzcGVuZEhvbGRGb3InLCB7bnVtOiAyOH0pfTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjYwXCI+JHtpc0F2YWlsYWJsZSB8fCBkZWxpdmVyZWRQcmV2aW91c2x5ID8gaHRtbCgnc3VzcGVuZEhvbGRNb2RhbC5zdXNwZW5kSG9sZEFmdGVyJywge251bTogNjB9KSA6IGh0bWwoJ3N1c3BlbmRIb2xkTW9kYWwuc3VzcGVuZEhvbGRGb3InLCB7bnVtOiA2MH0pfTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjkwXCI+JHtpc0F2YWlsYWJsZSB8fCBkZWxpdmVyZWRQcmV2aW91c2x5ID8gaHRtbCgnc3VzcGVuZEhvbGRNb2RhbC5zdXNwZW5kSG9sZEFmdGVyJywge251bTogOTB9KSA6IGh0bWwoJ3N1c3BlbmRIb2xkTW9kYWwuc3VzcGVuZEhvbGRGb3InLCB7bnVtOiA5MH0pfTwvb3B0aW9uPlxuICAgICAgICAgICAgPG9wdGlvbiB2YWx1ZT1cIjE4MFwiPiR7aXNBdmFpbGFibGUgfHwgZGVsaXZlcmVkUHJldmlvdXNseSA/IGh0bWwoJ3N1c3BlbmRIb2xkTW9kYWwuc3VzcGVuZEhvbGRBZnRlcicsIHtudW06IDE4MH0pIDogaHRtbCgnc3VzcGVuZEhvbGRNb2RhbC5zdXNwZW5kSG9sZEZvcicsIHtudW06IDE4MH0pfTwvb3B0aW9uPlxuICAgICAgICA8L3NlbGVjdD5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuXG48ZGl2IGNsYXNzPVwibGFyZ2UtMTIgY29sdW1ucyBuby1wYWRkaW5nLWxlZnRcIj5cbiAgICA8cCBpZD1cInN1c3BlbmQtZGVzY3JpcHRpb25cIiBhcmlhLWxhYmVsbGVkYnk9XCJzdXNwZW5kLWRlc2NyaXB0aW9uXCI+PC9wPlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJidXR0b24tY29udGFpbmVyXCI+XG4gICAgPGJ1dHRvbiB0YWJpbmRleD1cIjBcIiBpZD1cInN1c3BlbmQtaG9sZFwiIGFyaWEtYnVzeT1cImZhbHNlXCIgYXJpYS1sYWJlbD1cIiR7aXNBdmFpbGFibGUgfHwgZGVsaXZlcmVkUHJldmlvdXNseSA/IGh0bWwoJ2NvbmZpcm0nKSA6IGh0bWwoJ3N1c3BlbmRIb2xkTW9kYWwuc3VzcGVuZCcpfVwiXG4gICAgICAgICAgICBjbGFzcz1cImJ1dHRvbiByYWRpdXMgbWFyZ2luLXNtYWxsIHNlY29uZGFyeSB1LWFsbENhcHNcIj5cbiAgICAgICAgPHNwYW4+JHtpc0F2YWlsYWJsZSB8fCBkZWxpdmVyZWRQcmV2aW91c2x5ID8gaHRtbCgnY29uZmlybScpIDogaHRtbCgnc3VzcGVuZEhvbGRNb2RhbC5zdXNwZW5kJyl9PC9zcGFuPlxuICAgIDwvYnV0dG9uPlxuICAgICR7aXNBdmFpbGFibGUgfHwgZGVsaXZlcmVkUHJldmlvdXNseSB8fCAhaXNTdXNwZW5kZWQgP1xuICAgICAgICAgJycgOiBcbiAgICAgICAgYDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtcmV2ZWFsLWlkPVwicmVtb3ZlLXN1c3BlbnNpb24tbW9kYWxcIiBjbGFzcz1cImJ1dHRvbiByYWRpdXMgbWFyZ2luLXNtYWxsIHNlY29uZGFyeSByZW1vdmUtc3VzcGVuc2lvbi1idXR0b24gdS1hbGxDYXBzXCI+XG4gICAgICAgICAgICA8c3Bhbj4keyBodG1sKCdzdXNwZW5kSG9sZE1vZGFsLnJlbW92ZVN1c3BlbmQnKSB9PC9zcGFuPlxuICAgICAgICA8L2J1dHRvbj5gfVxuICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtY2FuY2VsIGNsYXNzPVwiYnV0dG9uIHJhZGl1cyBtYXJnaW4tc21hbGwgb3V0bGluZSBncmF5IGNhbmNlbCB1LWFsbENhcHMganMtbGFzdC1mb2N1c1wiPiR7IGh0bWwoJ2NhbmNlbCcpIH08L2J1dHRvbj5cbjwvZGl2PlxuYDtcbiIsImltcG9ydCB0ZW1wbGF0ZSBmcm9tICcuL1N1c3BlbmRIb2xkU3VjY2Vzc01vZGFsVGVtcGxhdGUuaHRtbCc7XG5pbXBvcnQge01vZGFsfSBmcm9tICcuLi9jb21tb24vbW9kYWwnO1xuY29uc3QgeyBodG1sLCBnbG9iYWxFdmVudHMgfSA9IHdpbmRvdztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU3VzcGVuZEhvbGRTdWNjZXNzTW9kYWwgZXh0ZW5kcyBCYWNrYm9uZS5WaWV3IHtcbiAgICBjb25zdHJ1Y3Rvcihtb2RlbCwgZXhwaXJhdGlvbkRhdGUpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsO1xuICAgICAgICB0aGlzLmV4cGlyYXRpb25EYXRlID0gZXhwaXJhdGlvbkRhdGU7XG4gICAgICAgIHRoaXMuYnVzID0gZ2xvYmFsRXZlbnRzO1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cblxuICAgIHJlbmRlcigpe1xuICAgICAgICBsZXQgbW9kYWxDb250ZW50cyA9IHtcbiAgICAgICAgICAgIHRpdGxlOiBodG1sKCdzdXNwZW5kSG9sZE1vZGFsLmhlYWRpbmdTdWNjZXNzJyksXG4gICAgICAgICAgICBhdXRvU2hvdzogZmFsc2UsXG4gICAgICAgICAgICBjbGFzc2VzOiBbJ3NtYWxsJywgJ3N1c3BlbnNpb24tbW9kYWwnLCAndmVyc2lvbi10d28nXSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IHRlbXBsYXRlKHRoaXMubW9kZWwuYXR0cmlidXRlcywgXCJcIiwgXCJcIiwgXCJcIiwgdGhpcy5leHBpcmF0aW9uRGF0ZSlcbiAgICAgICAgfTtcblxuICAgICAgICBpZih3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdzdXNwZW5kLW1vZGFsLWRhdGEtYWRqdXN0bWVudCcpKXtcbiAgICAgICAgICAgIGxldCBjb3ZlciA9IHRoaXMubW9kZWwuZ2V0Q292ZXIoMTUwKTtcbiAgICAgICAgICAgIG1vZGFsQ29udGVudHMuY29udGVudCA9IHRlbXBsYXRlKG51bGwsIGNvdmVyICYmIGNvdmVyLmhyZWYsIHRoaXMubW9kZWwuZ2V0KCd0aXRsZScpLCB0aGlzLm1vZGVsLmdldCgnZmlyc3RDcmVhdG9yTmFtZScpLCB0aGlzLmV4cGlyYXRpb25EYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubW9kYWwgPSBuZXcgTW9kYWwobW9kYWxDb250ZW50cyk7XG4gICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKHRoaXMubW9kYWwuJGVsKTtcbiAgICAgICAgdGhpcy5tb2RhbC5zaG93KCk7XG4gICAgfVxuXG4gICAgYXR0YWNoRXZlbnRzKG1vZGFsKXtcbiAgICAgICAgbW9kYWwuZmluZChcIi5jYW5jZWxcIikub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgbW9kYWwuZmluZCgnLmNsb3NlLXJldmVhbC1tb2RhbCcpLmNsaWNrKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubW9kYWwub24oJ2Nsb3NlIGNhbmNlbCcsICgpID0+IHRoaXMuYnVzLnRyaWdnZXIoJ2hvbGQ6c3VzcGVuZDpjb21wbGV0ZWQnKSk7XG4gICAgfVxufVxuIiwiY29uc3QgeyBodG1sIH0gPSB3aW5kb3c7XG5leHBvcnQgZGVmYXVsdCAoYXR0cywgY292ZXIsIHRpdGxlLCBhdXRob3IsIGV4cGlyYXRpb25EYXRlKSA9PiBgXG5cbjxkaXYgY2xhc3M9XCJsYXJnZS0xMiBjb2x1bW5zIG5vLXBhZGRpbmctbGVmdCBzdXNwZW5kLXRpdGxlXCIgdGFiaW5kZXg9XCItMVwiPlxuICAgICR7IHdpbmRvdy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ3N1c3BlbmQtbW9kYWwtZGF0YS1hZGp1c3RtZW50JykgPyBcbiAgICAgICAgYDxpbWcgc3JjPVwiJHtjb3Zlcn1cIiBjbGFzcz1cIm1lZGlhQ292ZXJcIiAvPlxuICAgICAgICA8aDUgY2xhc3M9XCJ0aXRsZVwiPjxzdHJvbmc+JHt0aXRsZX08L3N0cm9uZz48L2g1PlxuICAgICAgICA8cCBjbGFzcz1cIm1lZGlhQXV0aG9yXCI+JHthdXRob3J9PC9wPmBcbiAgICAgICAgOlxuICAgICAgICBgPGltZyBzcmM9XCIke2F0dHMuY292ZXJzLmNvdmVyMTUwV2lkZS5ocmVmfVwiIGNsYXNzPVwibWVkaWFDb3ZlclwiIC8+XG4gICAgICAgIDxoNSBjbGFzcz1cInRpdGxlXCI+PHN0cm9uZz4ke2F0dHMudGl0bGV9PC9zdHJvbmc+PC9oNT5cbiAgICAgICAgPHAgY2xhc3M9XCJtZWRpYUF1dGhvclwiPiR7YXR0cy5maXJzdENyZWF0b3JOYW1lfTwvcD5gXG4gICAgfVxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJsYXJnZS0xMiBjb2x1bW5zIG5vLXBhZGRpbmctbGVmdFwiPlxuICAgIDxwIGlkPVwic3VzcGVuZC1kZXNjcmlwdGlvblwiIGFyaWEtbGFiZWxsZWRieT1cInN1c3BlbmQtZGVzY3JpcHRpb25cIj5cbiAgICAgICAgJHtleHBpcmF0aW9uRGF0ZSA9PT0gJ3RvZGF5JyA/XG4gICAgICAgICAgICBgJHtodG1sKCdob2xkUmVkZWxpdmVyeS5zdXNwZW5kSG9sZFJlbW92ZUNvbmZpcm1hdGlvbkh0bWwnKX1gIDpcbiAgICAgICAgICAgIGAke2h0bWwoJ2hvbGRSZWRlbGl2ZXJ5LnN1c3BlbmRIb2xkQ29uZmlybWF0aW9uSHRtbCcsIHtleHBpcmF0aW9uRGF0ZTogaHRtbCgnZGF0ZS1sb25nJywge2Q6IGV4cGlyYXRpb25EYXRlfSl9KX1gXG4gICAgICAgIH1cbiAgICA8L3A+XG48L2Rpdj5cblxuPGRpdiBjbGFzcz1cImJ1dHRvbi1jb250YWluZXJcIj5cbiAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNhbmNlbCBjbGFzcz1cImJ1dHRvbiByYWRpdXMgbWFyZ2luLXNtYWxsIG91dGxpbmUgZ3JheSBjYW5jZWwgdS1hbGxDYXBzIGpzLWxhc3QtZm9jdXNcIj4keyBodG1sKCdjbG9zZScpIH08L2J1dHRvbj5cbjwvZGl2PlxuYDsiLCJjb25zdCBCYWNrYm9uZSA9IHdpbmRvdy5CYWNrYm9uZTtcbmNvbnN0IHRleHQgPSB3aW5kb3cudGV4dDtcbmNvbnN0IHVybCA9IHdpbmRvdy51cmw7XG5jb25zdCBhY2NlcHRhYmxlVHlwZXMgPSBbJ2Vib29rJywgJ2F1ZGlvYm9vaycsICd2aWRlbycsICdtYWdhemluZSddO1xuXG5pbXBvcnQgeyBNb2RhbCB9IGZyb20gJy4uL2NvbW1vbi9tb2RhbCc7XG5pbXBvcnQgVGl0bGVGb3JtYXRCYWRnZSBmcm9tICcuLi9tZWRpYS92aWV3cy9UaXRsZUluZm8vVGl0bGVGb3JtYXRCYWRnZSc7XG5pbXBvcnQgQ292ZXIgZnJvbSAnLi4vbWVkaWEvQ292ZXInO1xuaW1wb3J0IEtpbmRsZVByZWZlcmVuY2UgZnJvbSAnLi4va2luZGxlX3ByZWZlcmVuY2VfbW9kYWwvS2luZGxlUHJlZmVyZW5jZSc7XG5pbXBvcnQgRG93bmxvYWRXYXJuaW5nTW9kYWwgZnJvbSAnLi4vbWVkaWEvdmlld3MvRG93bmxvYWRXYXJuaW5nTW9kYWwnO1xuaW1wb3J0IHsgZ2V0VGl0bGVGdWxmaWxsbWVudEJ1dHRvbkxheW91dCB9IGZyb20gJy4uLy4uLy4uLy4uL2xpYi9mdWxmaWxsbWVudC10cy5qcyc7XG5pbXBvcnQgTWFjT1NBdWRpb2Jvb2tTdXBwb3J0UG9wb3ZlciBmcm9tICcuLi9NYWNPU0F1ZGlvYm9va1N1cHBvcnRQb3BvdmVyL01hY09TQXVkaW9ib29rU3VwcG9ydFBvcG92ZXInO1xuaW1wb3J0IHsgdG9TdGF0aWNVcmwgfSBmcm9tICcuLi8uLi8uLi8uLi9saWIvYXNzZXRNYXBwZXInO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaXRsZUZ1bGZpbGxtZW50TW9kYWwgZXh0ZW5kcyBCYWNrYm9uZS5WaWV3IHtcbiAgICBjb25zdHJ1Y3Rvcih7XG4gICAgICAgIGxvYW4sXG4gICAgICAgIHRpdGxlLFxuICAgICAgICBidXMsXG4gICAgICAgIGZlYXR1cmVNYW5hZ2VyLFxuICAgICAgICBwYXRyb25TZXR0aW5ncyxcbiAgICAgICAgYWNjb3VudExpbWl0cyxcbiAgICAgICAgaXNSZW5ld2FsID0gZmFsc2UsXG4gICAgICAgIGZvcm1hdExvY2sgPSBudWxsLFxuICAgIH0pIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5sb2FuID0gbG9hbjtcbiAgICAgICAgdGhpcy50aXRsZSA9IHRpdGxlO1xuICAgICAgICB0aGlzLmJ1cyA9IGJ1cztcbiAgICAgICAgdGhpcy5mZWF0dXJlTWFuYWdlciA9IGZlYXR1cmVNYW5hZ2VyO1xuICAgICAgICB0aGlzLnBhdHJvblNldHRpbmdzID0gcGF0cm9uU2V0dGluZ3M7XG4gICAgICAgIHRoaXMuYWNjb3VudExpbWl0cyA9IGFjY291bnRMaW1pdHM7XG4gICAgICAgIHRoaXMuaXNSZW5ld2FsID0gaXNSZW5ld2FsO1xuICAgICAgICB0aGlzLmZvcm1hdExvY2sgPSBmb3JtYXRMb2NrO1xuICAgICAgICB0aGlzLl92aWV3cyA9IFtdO1xuXG4gICAgICAgIGxldCBpbkFwcCA9IHdpbmRvdy5PdmVyRHJpdmUuaW5BcHA7XG4gICAgICAgIHRoaXMuYWxsb3dNcDNBdWRpb2Jvb2tEb3dubG9hZHMgPSAhKFxuICAgICAgICAgICAgdGhpcy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ21wMy1pbi1hcHAtb25seScpICYmICFpbkFwcFxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNob3dOb01QM0xpYmJ5UHJvbW8gPVxuICAgICAgICAgICAgdGhpcy5sb2FuLmlzQXVkaW9ib29rICYmXG4gICAgICAgICAgICB0aGlzLmxvYW4uaGFzTXAzRm9ybWF0ICYmXG4gICAgICAgICAgICB0aGlzLmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnbXAzLWluLWFwcC1vbmx5JykgJiZcbiAgICAgICAgICAgICFpbkFwcCAmJlxuICAgICAgICAgICAgdGhpcy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ3Byb21vdGVMaWJieScpO1xuICAgICAgICB0aGlzLl92aWV3cy5wdXNoKFxuICAgICAgICAgICAgKHRoaXMuY292ZXIgPSBuZXcgQ292ZXIoe1xuICAgICAgICAgICAgICAgIG1vZGVsOiB0aGlzLnRpdGxlLFxuICAgICAgICAgICAgICAgIGNvdmVyV2lkdGhzOiB7IG1vYmlsZTogMjUwLCB0YWJsZXQ6IDI1MCwgZGVza3RvcDogMjUwIH0sXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5fdmlld3MucHVzaChcbiAgICAgICAgICAgICh0aGlzLmZvcm1hdEJhZGdlID0gbmV3IFRpdGxlRm9ybWF0QmFkZ2Uoe1xuICAgICAgICAgICAgICAgIHR5cGVJZDogdGhpcy50aXRsZS5nZXQoJ3R5cGUnKS5pZCxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgaWYgKGFjY2VwdGFibGVUeXBlcy5pbmNsdWRlcyh0aGlzLmxvYW4udHlwZS5pZCkpIHtcbiAgICAgICAgICAgIHRoaXMuZm9ybWF0QmFkZ2UucmVuZGVyKCk7XG5cbiAgICAgICAgICAgIGxldCBodG1sID0gdGhpcy5yZW5kZXJUZW1wbGF0ZSgpO1xuXG4gICAgICAgICAgICBsZXQgbW9kYWxDb250ZW50cyA9IHtcbiAgICAgICAgICAgICAgICB0aXRsZTogdGV4dCgnZ2VuZXJpY1N1Y2Nlc3MnKSxcbiAgICAgICAgICAgICAgICBhdXRvU2hvdzogZmFsc2UsXG4gICAgICAgICAgICAgICAgY2xhc3NlczogWydsYXJnZScsICdUaXRsZUZ1bGZpbGxtZW50TW9kYWwnXSxcbiAgICAgICAgICAgICAgICBjb250ZW50OiBodG1sLFxuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgdGhpcy5tb2RhbCA9IG5ldyBNb2RhbChtb2RhbENvbnRlbnRzKTtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNoRXZlbnRzKHRoaXMubW9kYWwuJGVsKTtcbiAgICAgICAgICAgIHRoaXMubW9kYWwuc2hvdygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2luZG93LkxvZ2dlci5sb2coJ2Vycm9yJywgJ1RpdGxlIGhhcyB1bmV4cGVjdGVkIG1lZGlhIHR5cGUnLCB7XG4gICAgICAgICAgICAgICAgc291cmNlOiAnZnVsZmlsbG1lbnQgbW9kYWwnLFxuICAgICAgICAgICAgICAgIHRpdGxlOiB0aGlzLmxvYW4udGl0bGUsXG4gICAgICAgICAgICAgICAgaWQ6IHRoaXMubG9hbi5pZCxcbiAgICAgICAgICAgICAgICB0eXBlOiB0aGlzLmxvYW4udHlwZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKHRvYXN0ZXIpIHtcbiAgICAgICAgICAgICAgICB0b2FzdGVyLnB1c2godGV4dCgnZ2VuZXJpY0Vycm9yJyksICdlcnJvcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXR0YWNoRXZlbnRzKG5vZGUpIHtcbiAgICAgICAgbGV0IHRpdGxlTW9kZWwgPSB0aGlzLnRpdGxlO1xuICAgICAgICBub2RlLmZpbmQoJy5raW5kbGVGdWxmaWxsbWVudEJ1dHRvbicpLmNsaWNrKChldnQpID0+IHtcbiAgICAgICAgICAgIGxldCBmb3JtYXRJZCA9ICQoZXZ0LmN1cnJlbnRUYXJnZXQpLmF0dHIoJ2RhdGEtZm9ybWF0LWlkJyk7XG5cbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICB3aW5kb3cuYXBwUHJvbW9NYW5hZ2VyLmlzQXBwUHJvbW9FbmFibGVkKFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuYXBwUHJvbW9NYW5hZ2VyLkFQUExJQ0FUSU9OUy5LSU5ETEVQUkVGXG4gICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgIENvb2tpZXMuZ2V0KCdraW5kbGVGdWxmaWxsbWVudEFwcE92ZXJyaWRlJykgJiZcbiAgICAgICAgICAgICAgICAgICAgQ29va2llcy5nZXQoJ2tpbmRsZUZ1bGZpbGxtZW50QXBwT3ZlcnJpZGUnKSA9PT0gJzEnXG4gICAgICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgICAgIHdpbmRvdy5nbG9iYWxQcmVmZXJlbmNlcy5nZXQoJ2tpbmRsZUZ1bGZpbGxtZW50JykgPT0gbnVsbFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gZG9uJ3QgZm9sbG93IHRoZSBocmVmIG9uIHRoZSBraW5kbGUgYnV0dG9uIHNpbmNlIHdlIG5lZWQgdG8gc2hvdyBhIG1vZGFsIHNlcXVlbmNlIGZpcnN0LlxuICAgICAgICAgICAgICAgIGV2dC5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAgICAgbGV0IGZ1bGZpbGxUYXJnZXQgPSB1cmwod2luZG93LnJvdXRlcy5tZWRpYURvd25sb2FkLCB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdDogZm9ybWF0SWQsXG4gICAgICAgICAgICAgICAgICAgIG1lZGlhSWQ6IHRoaXMubG9hbi5pZCxcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIG5ldyBLaW5kbGVQcmVmZXJlbmNlKHtcbiAgICAgICAgICAgICAgICAgICAgYnVzOiB0aGlzLmJ1cyxcbiAgICAgICAgICAgICAgICAgICAgZ2xvYmFsUHJlZmVyZW5jZXM6IHdpbmRvdy5nbG9iYWxQcmVmZXJlbmNlcyxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiAnY29udGVudF9mdWxmaWxsbWVudCcsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25UYXJnZXRVcmw6IGZ1bGZpbGxUYXJnZXQsXG4gICAgICAgICAgICAgICAgfSkucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmJ1cy50cmlnZ2VyKCd0aXRsZTpkb3dubG9hZCcsIHtcbiAgICAgICAgICAgICAgICB0aXRsZU1vZGVsLFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgZm9ybWF0SWQgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICBub2RlLmZpbmQoJy5vZC1mb3JtYXQtYnV0dG9uJykuY2xpY2soKGV2dCkgPT4ge1xuICAgICAgICAgICAgbGV0IGZvcm1hdElkID0gJChldnQuY3VycmVudFRhcmdldCkuYXR0cignZGF0YS1mb3JtYXQtaWQnKTtcbiAgICAgICAgICAgIHRoaXMuYnVzLnRyaWdnZXIoJ3RpdGxlOmRvd25sb2FkJywge1xuICAgICAgICAgICAgICAgIHRpdGxlTW9kZWwsXG4gICAgICAgICAgICAgICAgY29udGV4dDogeyBmb3JtYXRJZCB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG5vZGUuZmluZCgnLmxvYW4tYnV0dG9uLW5vbmtpbmRsZSwgLkxvYW5zLWJ1bmRsZWRCdXR0b24nKS5jbGljayhcbiAgICAgICAgICAgIChldnQpID0+IHtcbiAgICAgICAgICAgICAgICBuZXcgRG93bmxvYWRXYXJuaW5nTW9kYWwoJChldnQuY3VycmVudFRhcmdldCkpO1xuICAgICAgICAgICAgICAgIGxldCBmb3JtYXRJZCA9ICQoZXZ0LmN1cnJlbnRUYXJnZXQpLmF0dHIoJ2RhdGEtZm9ybWF0LWlkJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndGl0bGU6ZG93bmxvYWQnLCB7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlTW9kZWwsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHsgZm9ybWF0SWQgfSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICBsZXQgcG9wb3ZlckVsbSA9IG5vZGUuZmluZCgnLm1hY09TQXVkaW9ib29rRG93bmxvYWRTdXBwb3J0Jyk7XG4gICAgICAgIGlmIChwb3BvdmVyRWxtKSB7XG4gICAgICAgICAgICBuZXcgTWFjT1NBdWRpb2Jvb2tTdXBwb3J0UG9wb3Zlcihwb3BvdmVyRWxtKS5yZW5kZXIoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vZGUuZmluZCgnLnVuYWJsZS10by1kb3dubG9hZCcpLmNsaWNrKCgpID0+XG4gICAgICAgICAgICB0aGlzLm9uVW5hYmxlVG9Eb3dubG9hZENsaWNrKClcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXQgc3VwcHJlc3NBdWRpb2Jvb2tCdXR0b24oKSB7XG4gICAgICAgIGNvbnN0IGlzTWFjID0gISEoXG4gICAgICAgICAgICB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTWFjLykgJiYgIWJvd3Nlci5pb3NcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMubG9hbi5pc0F1ZGlvYm9vayAmJlxuICAgICAgICAgICAgdGhpcy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ25vQXVkaW9ib29rc0Zvck1hY09TJykgJiZcbiAgICAgICAgICAgIGlzTWFjICYmXG4gICAgICAgICAgICAhYm93c2VyLmlvcyAmJlxuICAgICAgICAgICAgKCF0aGlzLmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZChcbiAgICAgICAgICAgICAgICAncmVlbmFibGVNcDNEb3dubG9hZE1hY09TUHJlQ2F0YWxpbmEnXG4gICAgICAgICAgICApIHx8XG4gICAgICAgICAgICAgICAgIXdpbmRvdy5PdmVyRHJpdmUuaXNQcmVDYXRhbGluYU1hYykgJiZcbiAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ3N0b3AtdHJlYXRpbmctaXBhZC1saWtlLW1hYycpICYmXG4gICAgICAgICAgICAgICAgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goXG4gICAgICAgICAgICAgICAgICAgIC9BcHAgU3RvcmUgT3ZlckRyaXZlIE1lZGlhIENvbnNvbGUvXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldCBpc0F1ZGlvYm9va09uTWFjKCkge1xuICAgICAgICBjb25zdCBpc01hYyA9ICEhKFxuICAgICAgICAgICAgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL01hYy8pICYmICFib3dzZXIuaW9zXG4gICAgICAgICk7XG4gICAgICAgIGNvbnN0IGlzSXBhZCA9XG4gICAgICAgICAgICB0aGlzLmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnc3RvcC10cmVhdGluZy1pcGFkLWxpa2UtbWFjJykgJiZcbiAgICAgICAgICAgIHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKFxuICAgICAgICAgICAgICAgIC9BcHAgU3RvcmUgT3ZlckRyaXZlIE1lZGlhIENvbnNvbGUvXG4gICAgICAgICAgICApO1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5sb2FuLmlzQXVkaW9ib29rICYmXG4gICAgICAgICAgICB0aGlzLmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnbm9BdWRpb2Jvb2tzRm9yTWFjT1MnKSAmJlxuICAgICAgICAgICAgaXNNYWMgJiZcbiAgICAgICAgICAgICFib3dzZXIuaW9zICYmXG4gICAgICAgICAgICAhaXNJcGFkXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgb25VbmFibGVUb0Rvd25sb2FkQ2xpY2soKSB7XG4gICAgICAgIGNvbnN0IG1vZGFsID0gdGhpcy5tb2RhbC4kZWw7XG4gICAgICAgIGNvbnN0IG1vZGFsQmFja2Ryb3AgPSB0aGlzLm1vZGFsLiRlbC5kYXRhKCdyZXZlYWwtaW5pdCcpLmJnO1xuXG4gICAgICAgIG1vZGFsLmFkZENsYXNzKCdUaXRsZUZ1bGZpbGxtZW50TW9kYWwtLW5vLXotaW5kZXgnKTtcbiAgICAgICAgbW9kYWxCYWNrZHJvcC5oaWRlKCk7XG5cbiAgICAgICAgd2luZG93LndpbmRvd3NBcHBEb3dubG9hZE1lc3NhZ2UudXBkYXRlKHtcbiAgICAgICAgICAgIG9uQ2xvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICB3aW5kb3cud2luZG93c0FwcERvd25sb2FkTWVzc2FnZS51cGRhdGUoe1xuICAgICAgICAgICAgICAgICAgICBvbkNsb3NlOiB3aW5kb3cuaGlkZVdpbmRvd3NBcHBEb3dubG9hZE1lc3NhZ2UsXG4gICAgICAgICAgICAgICAgICAgIG9wZW46IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgbW9kYWxCYWNrZHJvcC5zaG93KCk7XG4gICAgICAgICAgICAgICAgbW9kYWwucmVtb3ZlQ2xhc3MoJ1RpdGxlRnVsZmlsbG1lbnRNb2RhbC0tbm8tei1pbmRleCcpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9wZW46IHRydWUsXG4gICAgICAgICAgICBpc0F1ZGlvYm9vazogdGhpcy5sb2FuLmlzQXVkaW9ib29rLFxuICAgICAgICAgICAgaXNFYm9vazogdGhpcy5sb2FuLmlzRWJvb2ssXG4gICAgICAgICAgICBkaXNwbGF5UmVhZE5vd0luQnJvd3NlcjogISEoXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FuLnNob3dPREZvcm1hdEJ1dHRvbiB8fCB0aGlzLmxvYW4uaGFzTWVkaWFEb0Zvcm1hdFxuICAgICAgICAgICAgKSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgcmVuZGVyVGVtcGxhdGUoKSB7XG4gICAgICAgIGNvbnN0IGtpbmRsZU9ubHkgPSB0aGlzLmlzUmVuZXdhbCAmJiB0aGlzLmZvcm1hdExvY2sgPT09ICdlYm9vay1raW5kbGUnO1xuICAgICAgICBjb25zdCBidXR0b25zID0gdGhpcy5nZXRCdXR0b25zSHRtbChraW5kbGVPbmx5KTtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyRnVsbFRlbXBsYXRlKGJ1dHRvbnMsIGtpbmRsZU9ubHkpO1xuICAgIH1cblxuICAgIGdldEJ1dHRvbnNIdG1sKGtpbmRsZU9ubHkpIHtcbiAgICAgICAgdGhpcy5maWx0ZXJSZXN0cmljdGVkRm9ybWF0cygpO1xuXG4gICAgICAgIGxldCBidXR0b25MYXlvdXQgPSB7fTtcbiAgICAgICAgbGV0IGZpcnN0QnV0dG9uID0gJyc7XG4gICAgICAgIGJ1dHRvbkxheW91dCA9IGdldFRpdGxlRnVsZmlsbG1lbnRCdXR0b25MYXlvdXQoXG4gICAgICAgICAgICB0aGlzLmZlYXR1cmVNYW5hZ2VyLFxuICAgICAgICAgICAgdGhpcy5sb2FuLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGluQXBwOiB3aW5kb3cuT3ZlckRyaXZlLmluQXBwLFxuICAgICAgICAgICAgICAgIGlzQXVkaW9ib29rT25NYWM6IHRoaXMuaXNBdWRpb2Jvb2tPbk1hYyxcbiAgICAgICAgICAgICAgICBpc0lwYWRVc2VyQWdlbnQ6IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKFxuICAgICAgICAgICAgICAgICAgICAvQXBwIFN0b3JlIE92ZXJEcml2ZSBNZWRpYSBDb25zb2xlL1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgaXNUb2xpbm9EZXZpY2U6IHdpbmRvdy5PdmVyRHJpdmUuaXNUb2xpbm9EZXZpY2UsXG4gICAgICAgICAgICAgICAga2luZGxlT25seSxcbiAgICAgICAgICAgICAgICBzdXBwcmVzc0F1ZGlvYm9va0J1dHRvbjogdGhpcy5zdXBwcmVzc0F1ZGlvYm9va0J1dHRvbixcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICByZXR1cm4gYFxuICAgICAgICAgICAgJHtmaXJzdEJ1dHRvbn1cbiAgICAgICAgICAgICR7XG4gICAgICAgICAgICAgICAgYnV0dG9uTGF5b3V0Lm1haW5CdXR0b24gPT09ICdraW5kbGUnXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5yZW5kZXJLaW5kbGVCdXR0b24oKVxuICAgICAgICAgICAgICAgICAgICA6ICcnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAke1xuICAgICAgICAgICAgICAgIGJ1dHRvbkxheW91dC5tYWluQnV0dG9uID09PSAnZG93bmxvYWQnXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5yZW5kZXJEb3dubG9hZEJ1dHRvbihidXR0b25MYXlvdXQuZm9ybWF0SUQpXG4gICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICR7XG4gICAgICAgICAgICAgICAgYnV0dG9uTGF5b3V0Lm1haW5CdXR0b24gPT09ICd1bnN1cHBvcnRlZCdcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnJlbmRlckRvd25sb2FkQnV0dG9uKGJ1dHRvbkxheW91dC5mb3JtYXRJRCwgdHJ1ZSlcbiAgICAgICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJHtcbiAgICAgICAgICAgICAgICBidXR0b25MYXlvdXQubWFpbkJ1dHRvbiA9PT0gJ29kcmVhZCdcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnJlbmRlck9EUmVhZEJ1dHRvbigpXG4gICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICR7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGxvd01wM0F1ZGlvYm9va0Rvd25sb2FkcyAmJlxuICAgICAgICAgICAgICAgIGJ1dHRvbkxheW91dC5zaG93TWFjT3NBdWRpb2Jvb2tTdXBwcmVzc2lvblN0eWxlID09PSAnc3VwcHJlc3MnXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5yZW5kZXJNYWNPU1N1cHByZXNzaW9uKClcbiAgICAgICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJHtcbiAgICAgICAgICAgICAgICBidXR0b25MYXlvdXQuc2hvd05vS2luZGxlV2FybmluZ1xuICAgICAgICAgICAgICAgICAgICA/IGA8ZGl2IGNsYXNzPSduby1raW5kbGUtd2FybmluZyc+JHt0ZXh0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAnYWNjb3VudExvYW5zLmtpbmRsZUZ1bGZpbGxtZW50Lm5vbmVBdmFpbGFibGUnXG4gICAgICAgICAgICAgICAgICAgICAgKX08L2Rpdj5gXG4gICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICR7XG4gICAgICAgICAgICAgICAgYnV0dG9uTGF5b3V0LnNob3dNYWluRHJvcGRvd25cbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnJlbmRlckRvd25sb2FkRHJvcGRvd24oKVxuICAgICAgICAgICAgICAgICAgICA6ICcnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAke1xuICAgICAgICAgICAgICAgIGJ1dHRvbkxheW91dC5zaG93RGl2aWRlciAmJiAhdGhpcy5zaG93Tm9NUDNMaWJieVByb21vXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5yZW5kZXJCdXR0b25EaXZpZGVyKClcbiAgICAgICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgJHt0aGlzLnNob3dOb01QM0xpYmJ5UHJvbW8gPyB0aGlzLnJlbmRlck5vTVAzTGliYnlQcm9tbygpIDogJyd9XG4gICAgICAgICAgICAke1xuICAgICAgICAgICAgICAgIGJ1dHRvbkxheW91dC5zdWJCdXR0b24gPT09ICdvZHJlYWQnXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5yZW5kZXJPRFJlYWRCdXR0b24oKVxuICAgICAgICAgICAgICAgICAgICA6ICcnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAke1xuICAgICAgICAgICAgICAgIGJ1dHRvbkxheW91dC5hdWRpb2Jvb2tBZnRlclN1bnNldCB8fFxuICAgICAgICAgICAgICAgIGJ1dHRvbkxheW91dC5zdWJCdXR0b24gPT09ICdhdWRpb2Jvb2snIHx8XG4gICAgICAgICAgICAgICAgKGJ1dHRvbkxheW91dC5tYWluQnV0dG9uID09PSAnYXVkaW9ib29rJyAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZChcbiAgICAgICAgICAgICAgICAgICAgICAgICdzdW5zZXQtYXVkaW9ib29rLXJld3JpdGUnXG4gICAgICAgICAgICAgICAgICAgICkpIHx8XG4gICAgICAgICAgICAgICAgKGJ1dHRvbkxheW91dC5mb3JtYXRJRCA9PT0gJ2F1ZGlvYm9vay1tcDMnICYmXG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbkxheW91dC5tYWluQnV0dG9uID09PSAnb2RyZWFkJylcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnJlbmRlckF1ZGlvYm9va0FjY29yZGlvbigpXG4gICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICR7XG4gICAgICAgICAgICAgICAgYnV0dG9uTGF5b3V0LnNob3dPdGhlckJ1dHRvbkJlbG93RGl2aWRlclxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMucmVuZGVyRG93bmxvYWRCdXR0b24oKVxuICAgICAgICAgICAgICAgICAgICA6ICcnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAke1xuICAgICAgICAgICAgICAgIGJ1dHRvbkxheW91dC5zaG93RG93bmxvYWREcm9wZG93bkJlbG93RGl2aWRlclxuICAgICAgICAgICAgICAgICAgICA/IHRoaXMucmVuZGVyRG93bmxvYWREcm9wZG93bigpXG4gICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICR7XG4gICAgICAgICAgICAgICAgYnV0dG9uTGF5b3V0LnNob3dSZXN0cmljdGVkVmlkZW9XYXJuaW5nXG4gICAgICAgICAgICAgICAgICAgID8gdGhpcy5yZW5kZXJTdHJlYW1pbmdWaWRlb1dhcm5pbmcoKVxuICAgICAgICAgICAgICAgICAgICA6ICcnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAke1xuICAgICAgICAgICAgICAgIGJ1dHRvbkxheW91dC5zaG93UmVzdHJpY3RlZEZvcm1hdFdhcm5pbmdcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnJlbmRlclJlc3RyaWN0ZWRGb3JtYXRXYXJuaW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYW4ucmVzdHJpY3RlZEZvcm1hdHNcbiAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICR7XG4gICAgICAgICAgICAgICAgdGhpcy5hbGxvd01wM0F1ZGlvYm9va0Rvd25sb2FkcyAmJlxuICAgICAgICAgICAgICAgIGJ1dHRvbkxheW91dC5zaG93TWFjT3NBdWRpb2Jvb2tTdXBwcmVzc2lvblN0eWxlID09PSAnd2FybidcbiAgICAgICAgICAgICAgICAgICAgPyB0aGlzLnJlbmRlckF1ZGlvYm9va1dhcm5pbmcoKVxuICAgICAgICAgICAgICAgICAgICA6ICcnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAke3RoaXMucmVuZGVyV2luZG93c0FwcERvd25sb2FkTWVzc2FnZSgpfVxuICAgICAgICBgO1xuICAgIH1cblxuICAgIHJlbmRlck5vTVAzTGliYnlQcm9tbygpIHtcbiAgICAgICAgaWYgKHRoaXMuc2hvd05vTVAzTGliYnlQcm9tbykge1xuICAgICAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwiTm9NcDNMaWJieVByb21vXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiQXVkaW9ib29rUmVwbGFjZW1lbnRMaWJieVByb21vXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImxvZ29Cb3hcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGltZyBhbHQ9XCJMb2dvIGZvciBMaWJieVwiIHNyYz1cIiR7dG9TdGF0aWNVcmwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaW1nL2xpYmJ5LW1hc2NvdC10YWxraW5nLnN2ZydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cIiBjbGFzcz1cImxpYmJ5LWhlYWRcIj48L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dEJveFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8cD4ke3RleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZnVsZmlsbG1lbnRWaWV3LmdldExpYmJ5QXVkaW9ib29rJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfTwvcD4gICAgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+YDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlckF1ZGlvYm9va1dhcm5pbmcoKSB7XG4gICAgICAgIHJldHVybiBgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJtYWNPc0F1ZGlvYm9va1dhcm5pbmdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzdXBwb3J0ZWRWZXJzaW9uc1wiPiR7aHRtbChcbiAgICAgICAgICAgICAgICAnbWFjT3NBdWRpb2Jvb2tTdXBwcmVzc2lvbi5zdXBwb3J0ZWRWZXJzaW9ucydcbiAgICAgICAgICAgICl9PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICBgO1xuICAgIH1cblxuICAgIHJlbmRlck1hY09TU3VwcHJlc3Npb24oKSB7XG4gICAgICAgIHJldHVybiBgXG4gICAgICAgIDxkaXYgY2xhc3M9XCJzZWNvbmRhcnktY29sb3IgbWFjT1NBdWRpb2Jvb2tEb3dubG9hZFN1cHBvcnRcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0Q29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgPHA+JHtodG1sKCdtYWNPc0F1ZGlvYm9va1N1cHByZXNzaW9uLmFib3V0TWFjT1MnKX08L3A+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIGA7XG4gICAgfVxuXG4gICAgcmVuZGVyRnVsbFRlbXBsYXRlKGJ1dHRvblN0YWNrLCBraW5kbGVPbmx5KSB7XG4gICAgICAgIGxldCB0aXRsZVNwYW4gPSBgPHNwYW4gY2xhc3M9J3RpdGxlJz4ke3RoaXMudGl0bGUuZ2V0KCd0aXRsZScpfTwvc3Bhbj5gO1xuICAgICAgICBsZXQgbG9hbnNSZW1haW5pbmcgPSB0aGlzLmFjY291bnRMaW1pdHMubG9hbnNSZW1haW5pbmc7XG5cbiAgICAgICAgbGV0IHlvdUNhbkJvcnJvd1RleHQgPSAnJztcbiAgICAgICAgaWYgKGxvYW5zUmVtYWluaW5nID4gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMubG9hbi5pc01hZ2F6aW5lKSB7XG4gICAgICAgICAgICAgICAgeW91Q2FuQm9ycm93VGV4dCA9IHRleHQoXG4gICAgICAgICAgICAgICAgICAgICdhY2NvdW50TG9hbnMubWFnYXppbmVzRG9udENvdW50QWdhaW5zdENoZWNrb3V0JyxcbiAgICAgICAgICAgICAgICAgICAgeyBsb2FuczogbG9hbnNSZW1haW5pbmcgfVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHlvdUNhbkJvcnJvd1RleHQgPSB0ZXh0KCdhY2NvdW50TG9hbnMueW91Q2FuQm9ycm93TW9yZVRpdGxlcycsIHtcbiAgICAgICAgICAgICAgICAgICAgbG9hbnM6IGxvYW5zUmVtYWluaW5nLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZChcbiAgICAgICAgICAgICAgICAgICAgJ2ZpeC10aXRsZW1vZGFsLW1hZ2F6aW5lLWRpc3BsYXknXG4gICAgICAgICAgICAgICAgKSAmJiB0aGlzLmxvYW4uaXNNYWdhemluZVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHlvdUNhbkJvcnJvd1RleHQgPSB0ZXh0KCdhY2NvdW50TG9hbnMueW91Q2FuQm9ycm93Tm9Nb3JlVGl0bGVzJyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYFxuICAgICAgICA8ZGl2IGNsYXNzPVwiY29udGVudFwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJzbWFsbC01IGNvbHVtbnNcIj4ke3RoaXMuY292ZXIuJGVsLmh0bWwoKX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic21hbGwtNyBjb2x1bW5zIG1ldGFkYXRhLWNvbHVtblwiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYm9ycm93ZWQtdW50aWxcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+JHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYW4udXNlRmlyc3RQbGF5VGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdib3Jyb3dTdWNjZXNzTW9kYWwubG9hbmVkVW50aWxGaXJzdFBsYXknLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlOiB0aGlzLmxvYW4uZXhwaXJlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZVNwYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3VyczogdGhpcy5sb2FuLmNvbnN0cmFpbnRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLndhdGNoRXhwaXJhdGlvbkhvdXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRoaXMuaXNSZW5ld2FsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGV4dCgncmVuZXdhbC50aXRsZU5vd0V4cGlyZXMnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZVNwYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGlyYXRpb25EYXRlOiB0aGlzLmxvYW4uZXhwaXJlcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRleHQoJ2JvcnJvd1N1Y2Nlc3NNb2RhbC5sb2FuZWRVbnRpbCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0ZTogdGhpcy5sb2FuLmV4cGlyZXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZVNwYW4sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgIH08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1JlbmV3YWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGA8ZGl2IGNsYXNzPSdsb2Fucy1yZW1haW5pbmcnPiR7eW91Q2FuQm9ycm93VGV4dH08L2Rpdj5gXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAke1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FuLmJ1bmRsZWRDb250ZW50Lmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHRoaXMucmVuZGVyQnVuZGxlZENvbnRlbnQoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9ucyBzaG93LWZvci1tZWRpdW0tdXBcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5pc1JlbmV3YWwgJiYgISF0aGlzLmZvcm1hdExvY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBraW5kbGVPbmx5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGA8ZGl2IGNsYXNzPVwibmV3RHVlRGF0ZSBraW5kbGVTdGVwcyBib2xkXCI+JHtodG1sKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlbmV3YWwua2luZGxlUmVuZXdhbEluc3RydWN0aW9ucy5oZWFkZXInXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImtpbmRsZVN0ZXBzXCI+PGEgaHJlZj0naHR0cHM6Ly93d3cuYW1hem9uLmNvbS9tbi9kY3cvbXl4Lmh0bWwjL2hvbWUvY29udGVudC9ib29rc0FsbC9kYXRlRHNjLycgdGFyZ2V0PSdfYmxhbmsnIHJlbD0nbm9yZWZlcnJlcic+JHtodG1sKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZW5ld2FsLmtpbmRsZVJlbmV3YWxJbnN0cnVjdGlvbnMucmV0dXJuTGlua1RleHQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfTwvYT48L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwia2luZGxlU3RlcHNcIj4ke2h0bWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlbmV3YWwua2luZGxlUmVuZXdhbEluc3RydWN0aW9ucy5zZW5kQm9vaydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9PC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9vbD5gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGA8ZGl2IGNsYXNzPVwibmV3RHVlRGF0ZSBib2xkXCI+JHtodG1sKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlbmV3YWwuZG93bmxvYWRBZ2FpblRleHQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9PC9kaXY+YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICcnXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAke2J1dHRvblN0YWNrfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJidXR0b25zIGZ1bGwtbW9kYWwtd2lkdGggc2hvdy1mb3Itc21hbGwtb25seVwiPlxuICAgICAgICAgICAgICAgICR7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNSZW5ld2FsICYmICEhdGhpcy5mb3JtYXRMb2NrXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGtpbmRsZU9ubHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGA8ZGl2IGNsYXNzPVwibmV3RHVlRGF0ZSBraW5kbGVTdGVwcyBib2xkXCI+JHtodG1sKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdyZW5ld2FsLmtpbmRsZVJlbmV3YWxJbnN0cnVjdGlvbnMuaGVhZGVyJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKX08L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxvbD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJraW5kbGVTdGVwc1wiPjxhIGhyZWY9J2h0dHBzOi8vd3d3LmFtYXpvbi5jb20vbW4vZGN3L215eC5odG1sIy9ob21lL2NvbnRlbnQvYm9va3NBbGwvZGF0ZURzYy8nIHRhcmdldD0nX2JsYW5rJyByZWw9J25vcmVmZXJyZXInPiR7aHRtbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlbmV3YWwua2luZGxlUmVuZXdhbEluc3RydWN0aW9ucy5yZXR1cm5MaW5rVGV4dCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApfTwvYT48L2xpPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImtpbmRsZVN0ZXBzXCI+JHtodG1sKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVuZXdhbC5raW5kbGVSZW5ld2FsSW5zdHJ1Y3Rpb25zLnNlbmRCb29rJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9PC9saT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvb2w+YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogYDxkaXYgY2xhc3M9XCJuZXdEdWVEYXRlIGJvbGRcIj4ke2h0bWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlbmV3YWwuZG93bmxvYWRBZ2FpblRleHQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfTwvZGl2PmBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJHtidXR0b25TdGFja31cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5gO1xuICAgIH1cblxuICAgIHJlbmRlckJ1dHRvbkRpdmlkZXIoKSB7XG4gICAgICAgIC8vIElmIHdlJ3JlIHNob3dpbmcgdGhlIGRpdmlkZXIgdXN1YWxseSB0aGVyZSBhcmUgdHdvIGZ1bGZpbGxtZW50IG9wdGlvbnMgYmVpbmcgcHJlc2VudGVkLiAgVGhlIGV4Y2VwdGlvbiBpcyB0aGUgY2FzZVxuICAgICAgICAvLyB3aGVyZSB0aGUgZmlyc3Qgc2xvdCBpcyBmaWxsZWQgYnkgdGhlIFwia2luZGxlIG5vdCBhdmFpbGFibGVcIiBtZXNzYWdlLlxuICAgICAgICByZXR1cm4gYDxkaXYgY2xhc3M9XCJidXR0b24tZGl2aWRlci1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbi1kaXZpZGVyXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICR7XG4gICAgICAgICAgICAgICAgICAgICAgICAhdGhpcy5sb2FuLnNob3dOb0tpbmRsZU1lc3NhZ2VcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGBcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkaXZpZGVyLXRleHQgdS1hbGxDYXBzXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke2h0bWwoJ29yJyl9XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+YDtcbiAgICB9XG5cbiAgICByZW5kZXJLaW5kbGVCdXR0b24oKSB7XG4gICAgICAgIHJldHVybiBgPGEgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9yZWZlcnJlclwiIGhyZWY9XCIke3VybChcbiAgICAgICAgICAgIHdpbmRvdy5yb3V0ZXMubWVkaWFEb3dubG9hZCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBmb3JtYXQ6IHRoaXMubG9hbi5raW5kbGVGb3JtYXQuaWQsXG4gICAgICAgICAgICAgICAgbWVkaWFJZDogdGhpcy5sb2FuLmlkLFxuICAgICAgICAgICAgfVxuICAgICAgICApfVwiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uIHJhZGl1cyBraW5kbGVGdWxmaWxsbWVudEJ1dHRvblwiIGRhdGEtZG93bmxvYWQgdGFiaW5kZXg9XCIwXCIgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtZm9ybWF0LWlkPVwiJHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hbi5raW5kbGVGb3JtYXQuaWRcbiAgICAgICAgICAgICAgICAgICAgfVwiIGRhdGEtbWVkaWEtaWQ9XCIke3RoaXMubG9hbi5pZH1cIlxuICAgICAgICAgICAgICAgICAgICBkYXRhLWZvcm1hdC1uYW1lPVwiJHtodG1sKFxuICAgICAgICAgICAgICAgICAgICAgICAgYGZvcm1hdHMuJHt0aGlzLmxvYW4ua2luZGxlRm9ybWF0LmlkfWBcbiAgICAgICAgICAgICAgICAgICAgKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+ICR7dGV4dCgna2luZGxlRnVsZmlsbG1lbnQucmVhZE5vdycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIEtpbmRsZTogYDxpIGNsYXNzPVwiaWNvbi1raW5kbGUtbG9nb1wiIGFyaWEtbGFiZWw9XCIke2h0bWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2tpbmRsZUZ1bGZpbGxtZW50LmtpbmRsZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICl9XCI+PC9pPmAsXG4gICAgICAgICAgICAgICAgICAgIH0pfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0na2luZGxlLXJlYWQtb24nPlxuICAgICAgICAgICAgICAgICAgICA8c3Bhbj4ke3RleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAnYWNjb3VudExvYW5zLmtpbmRsZUZ1bGZpbGxtZW50LmtpbmRsZVJlYWRPbidcbiAgICAgICAgICAgICAgICAgICAgKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPVwiZGlzcGxheTppbmxpbmUtYmxvY2tcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSdpY29uLWFuZHJvaWQnPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPSdpY29uLWFwcGxlJz48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0naWNvbi13aW5kb3dzJz48L2k+XG4gICAgICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAke1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYW4uc2hvd0tpbmRsZVRyb3VibGVBY2NvcmRpYW5cbiAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5yZW5kZXJLaW5kbGVUcm91YmxlQWNjb3JkaW9uKClcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYDtcbiAgICB9XG5cbiAgICByZW5kZXJLaW5kbGVUcm91YmxlQWNjb3JkaW9uKCkge1xuICAgICAgICBsZXQgZW1iZWRkZWRCdXR0b24gPSAnJztcbiAgICAgICAgaWYgKHRoaXMubG9hbi5oYXNPdmVyZHJpdmVGb3JtYXQpIHtcbiAgICAgICAgICAgIGVtYmVkZGVkQnV0dG9uID0gdGhpcy5yZW5kZXJPRFJlYWRCdXR0b24oKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgPHVsIGNsYXNzPVwiYWNjb3JkaW9uIGtpbmRsZS10cm91YmxlLWNvbnRhaW5lclwiIGRhdGEtYWNjb3JkaW9uPlxuICAgICAgICAgICAgICAgICAgICA8bGkgY2xhc3M9XCJhY2NvcmRpb24tbmF2aWdhdGlvblwiID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGNsYXNzPVwiYWNjb3JkaW9uLXRpdGxlXCIgaHJlZj1cIiNoYXZpbmdUcm91YmxlUGFuZWwke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hbi5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nc21hbGwtMTAgY29sdW1ucyB0aXRsZS10ZXh0Jz4ke3RleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWNjb3VudExvYW5zLmhhdmluZ1Ryb3VibGUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J3NtYWxsLTIgY29sdW1ucyBkb3duLWFycm93LWNvbnRhaW5lcic+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImljb24tZG93bi1hcnJvd1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiaGF2aW5nVHJvdWJsZVBhbmVsJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYW4uaWRcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cIiBjbGFzcz1cImNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2VtYmVkZGVkQnV0dG9ufVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgPC91bD5gO1xuICAgIH1cblxuICAgIHJlbmRlckF1ZGlvYm9va0FjY29yZGlvbigpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdkaXNhYmxlT2RBcHBBY2Nlc3MnKSAmJlxuICAgICAgICAgICAgIXRoaXMuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdwcm9tb3RlTGliYnknKSAmJlxuICAgICAgICAgICAgdGhpcy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ2tlZXAtb2QtYXBwLWZ1bGZpbGxtZW50JykgJiZcbiAgICAgICAgICAgIHRoaXMuYWxsb3dNcDNBdWRpb2Jvb2tEb3dubG9hZHNcbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gYDxkaXYgY2xhc3M9XCJsb2FuLWJ1dHRvbi1hdWRpb2Jvb2tcIj5cbiAgICAgICAgICAgICR7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FuLmhhc05vbktpbmRsZU5vblJlYWRGb3JtYXRcbiAgICAgICAgICAgICAgICAgICAgPyBgPGRpdiBjbGFzcz1cImNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5idWlsZEF1ZGlvYm9va0FjY29yZGlvbkNvbXBvbmVudCgpfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gXG4gICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5gO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdwcm9tb3RlTGliYnknKSAmJlxuICAgICAgICAgICAgdGhpcy5hbGxvd01wM0F1ZGlvYm9va0Rvd25sb2FkcyAmJlxuICAgICAgICAgICAgIXRoaXMuc3VwcHJlc3NBdWRpb2Jvb2tCdXR0b25cbiAgICAgICAgKSB7XG4gICAgICAgICAgICByZXR1cm4gYDxkaXYgY2xhc3M9XCJsb2FuLWJ1dHRvbi1hdWRpb2Jvb2tcIj5cbiAgICAgICAgICAgICAgICAgICAgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hbi5oYXNOb25LaW5kbGVOb25SZWFkRm9ybWF0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBgPHVsIGNsYXNzPVwiYWNjb3JkaW9uIGtpbmRsZS10cm91YmxlLWNvbnRhaW5lclwiIGRhdGEtYWNjb3JkaW9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGxpIGNsYXNzPVwiYWNjb3JkaW9uLW5hdmlnYXRpb25cIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJhY2NvcmRpb24tdGl0bGVcIiBocmVmPVwiI2hhdmluZ1Ryb3VibGVQYW5lbCR7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hbi5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nc21hbGwtMTEgY29sdW1ucyB0aXRsZS10ZXh0Jz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXNhYmxlT2RBcHBBY2Nlc3MnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGV4dChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhY2NvdW50TG9hbnMuTXAzRnVsZmlsbG1lbnRXYXJuaW5nJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYWNjb3VudExvYW5zLk9kQXBwSW5zdGFsbGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdzbWFsbC0xIGNvbHVtbnMgZG93bi1hcnJvdy1jb250YWluZXInPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbi1kb3duLWFycm93XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGlkPVwiaGF2aW5nVHJvdWJsZVBhbmVsJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FuLmlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVwiIGNsYXNzPVwiY29udGVudFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3RoaXMucmVuZGVyRG93bmxvYWRCdXR0b24oKX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICAgICAgICAgIDwvdWw+YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvZGl2PmA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYDxkaXYgY2xhc3M9XCJsb2FuLWJ1dHRvbi1hdWRpb2Jvb2tcIj5cbiAgICAgICAgICAgICAgICAgICAgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdwcm9tb3RlTGliYnknKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gdGhpcy5idWlsZEF1ZGlvYm9va0FjY29yZGlvbkxpYmJ5UHJvbW8oKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcbiAgICAgICAgICAgICAgICAgICAgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hbi5oYXNOb25LaW5kbGVOb25SZWFkRm9ybWF0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB0aGlzLmJ1aWxkQXVkaW9ib29rQWNjb3JkaW9uQ29tcG9uZW50KClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICcnXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5gO1xuICAgIH1cblxuICAgIGJ1aWxkQXVkaW9ib29rQWNjb3JkaW9uTGliYnlQcm9tbygpIHtcbiAgICAgICAgaWYgKCF0aGlzLnNob3dOb01QM0xpYmJ5UHJvbW8pIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnZG93bmxvYWQtbGliYnktbW9kYWwnKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBgPHAgY2xhc3M9XCJkb3dubG9hZFRleHRcIj4ke3RleHQoXG4gICAgICAgICAgICAgICAgICAgICdhY2NvdW50TG9hbnMuRG93bmxvYWRJbkFwcCdcbiAgICAgICAgICAgICAgICApfTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCJodHRwczovL2hlbHAubGliYnlhcHAuY29tL2VuLXVzLzYxMDMuaHRtXCIgY2xhc3M9XCJsaWJieS1saW5rIGJvbGRcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub3JlZmVycmVyXCIgcm9sZT1cImxpbmtcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3RleHQoJ2FjY291bnRMb2Fucy5HZXRMaWJieScpfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC9hPmA7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBgPGEgaHJlZj1cImh0dHBzOi8vbWVldC5saWJieWFwcC5jb20vXCIgY2xhc3M9XCJsaWJieS1saW5rIGJvbGRcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub3JlZmVycmVyXCIgcm9sZT1cImxpbmtcIj5cbiAgICAgICAgICAgICAgICAgICAgJHt0ZXh0KCdhY2NvdW50TG9hbnMuR2V0TGliYnknKX1cbiAgICAgICAgICAgICAgICA8L2E+YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGJ1aWxkQXVkaW9ib29rQWNjb3JkaW9uQ29tcG9uZW50KCkge1xuICAgICAgICBsZXQgZHJvcGRvd25UZXh0ID0gd2luZG93LmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnZGlzYWJsZU9kQXBwQWNjZXNzJylcbiAgICAgICAgICAgID8gdGV4dCgnYWNjb3VudExvYW5zLk1wM0Z1bGZpbGxtZW50V2FybmluZycpXG4gICAgICAgICAgICA6IHRleHQoJ2FjY291bnRMb2Fucy5PZEFwcEluc3RhbGxlZCcpO1xuICAgICAgICBsZXQgZHJvcGRvd25FbGVtZW50ID1cbiAgICAgICAgICAgIHRoaXMuYWxsb3dNcDNBdWRpb2Jvb2tEb3dubG9hZHMgJiYgIXRoaXMuc3VwcHJlc3NBdWRpb2Jvb2tCdXR0b25cbiAgICAgICAgICAgICAgICA/IHRoaXMucmVuZGVyRG93bmxvYWRCdXR0b24oKVxuICAgICAgICAgICAgICAgIDogJyc7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgdGhpcy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ3Nob3ctb2QtZGVza3RvcC1tZXNzYWdlJykgJiZcbiAgICAgICAgICAgICF0aGlzLmFsbG93TXAzQXVkaW9ib29rRG93bmxvYWRzXG4gICAgICAgICkge1xuICAgICAgICAgICAgZHJvcGRvd25UZXh0ID0gdGV4dCgnYWNjb3VudExvYW5zLk1wM0Z1bGZpbGxtZW50V2FybmluZycpO1xuICAgICAgICAgICAgZHJvcGRvd25FbGVtZW50ID0gYDxwIGNsYXNzPVwibm9Eb3dubG9hZEJ1dHRvbk1lc3NhZ2VcIj4gXG4gICAgICAgICAgICAke3RleHQoJ2FjY291bnRMb2Fucy5kb3dubG9hZEF1ZGlvYm9va3NXaXRoTGliYnknKX0gPC9wPmA7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoZHJvcGRvd25FbGVtZW50ICE9PSAnJykge1xuICAgICAgICAgICAgcmV0dXJuIGA8dWwgY2xhc3M9XCJhY2NvcmRpb24ga2luZGxlLXRyb3VibGUtY29udGFpbmVyXCIgZGF0YS1hY2NvcmRpb24+XG4gICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cImFjY29yZGlvbi1uYXZpZ2F0aW9uXCIgPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGEgY2xhc3M9XCJhY2NvcmRpb24tdGl0bGVcIiBocmVmPVwiI2hhdmluZ1Ryb3VibGVQYW5lbCR7dGhpcy5sb2FuLmlkfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJyb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nc21hbGwtMTEgY29sdW1ucyB0aXRsZS10ZXh0Jz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7ZHJvcGRvd25UZXh0fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nc21hbGwtMSBjb2x1bW5zIGRvd24tYXJyb3ctY29udGFpbmVyJz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbi1kb3duLWFycm93XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgaWQ9XCJoYXZpbmdUcm91YmxlUGFuZWwke3RoaXMubG9hbi5pZH1cIiBjbGFzcz1cImNvbnRlbnRcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2Ryb3Bkb3duRWxlbWVudH1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8L2xpPlxuICAgICAgICAgICAgICAgIDwvdWw+YDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAnJztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlckRvd25sb2FkQnV0dG9uKFxuICAgICAgICBmb3JtYXRJZCA9IHRoaXMubG9hbi5ub25LaW5kbGVOb25SZWFkRm9ybWF0c1swXS5pZCxcbiAgICAgICAgdW5zdXBwb3J0ZWRGb3JtYXQgPSBmYWxzZVxuICAgICkge1xuICAgICAgICBpZiAodW5zdXBwb3J0ZWRGb3JtYXQpIHtcbiAgICAgICAgICAgIHJldHVybiBgXG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIG5vLWRvd25sb2FkXCI+JHt3aW5kb3cudGV4dChcbiAgICAgICAgICAgICAgICAgICAgYGZvcm1hdHMuJHtmb3JtYXRJZH1gXG4gICAgICAgICAgICAgICAgKX08YnIvPlxuICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPiR7d2luZG93LnRleHQoJ2FjY291bnRMb2Fucy51bnN1cHBvcnRlZEZvcm1hdCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHM6IDEsXG4gICAgICAgICAgICAgICAgICAgIH0pfTwvc3Ryb25nPlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgYDtcbiAgICAgICAgfSBlbHNlIGlmICghdGhpcy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ3RvbGluby1vdGhlci1idXR0b24nKSkge1xuICAgICAgICAgICAgY29uc3QgdW5zdXBwb3J0ZWRUb2xpbm9Gb3JtYXREZXRhaWxzID1cbiAgICAgICAgICAgICAgICB0aGlzLl9oaWRlVW5zdXBwb3J0ZWREb3dubG9hZE9wdGlvbnNGb3JUb2xpbm8oZm9ybWF0SWQpO1xuICAgICAgICAgICAgaWYgKHVuc3VwcG9ydGVkVG9saW5vRm9ybWF0RGV0YWlscy5oaWRlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgbm8tZG93bmxvYWRcIj4ke1xuICAgICAgICAgICAgICAgICAgICB1bnN1cHBvcnRlZFRvbGlub0Zvcm1hdERldGFpbHMuZm9ybWF0XG4gICAgICAgICAgICAgICAgfTxici8+XG4gICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+JHt3aW5kb3cudGV4dCgnYWNjb3VudExvYW5zLnVuc3VwcG9ydGVkRm9ybWF0Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0czogMSxcbiAgICAgICAgICAgICAgICAgICAgfSl9PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBgO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGA8YSB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub3JlZmVycmVyXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJidXR0b24gbG9hbi1idXR0b24tbm9ua2luZGxlIHJhZGl1cyBwcmltYXJ5XCIgdGFiaW5kZXg9XCIwXCIgcm9sZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGRhdGEtZm9ybWF0LWlkPVwiJHtmb3JtYXRJZH1cIiBkYXRhLW1lZGlhLWlkPVwiJHt0aGlzLmxvYW4uaWR9XCJcbiAgICAgICAgICAgICAgICAgICAgZGF0YS1mb3JtYXQtbmFtZT1cIiR7aHRtbChgZm9ybWF0cy4ke2Zvcm1hdElkfWApfVwiPlxuICAgICAgICAgICAgICAgICAgICA8Yj4ke1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0SWQgPT09ICdlYm9vay1tZWRpYS1kbydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGh0bWwoJ3JlYWROb3cnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdGhpcy5pc1JlbmV3YWwgJiYgISF0aGlzLmZvcm1hdExvY2tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGh0bWwoJ3JlbmV3YWwuZG93bmxvYWRBZ2FpbicpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBodG1sKCdhY2NvdW50TG9hbnMuZG93bmxvYWQnKVxuICAgICAgICAgICAgICAgICAgICB9PC9iPjxici8+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZGwtdGV4dFwiPiR7aHRtbChgZm9ybWF0cy4ke2Zvcm1hdElkfWApfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICA8L2E+YDtcbiAgICB9XG5cbiAgICByZW5kZXJPRFJlYWRCdXR0b24oKSB7XG4gICAgICAgIGxldCBidG5TdWJUZXh0ID0gJyc7XG4gICAgICAgIGxldCBidG5BY3Rpb25OYW1lID0gJyc7XG5cbiAgICAgICAgaWYgKHRoaXMubG9hbi5pc0Vib29rIHx8IHRoaXMubG9hbi5pc01hZ2F6aW5lKSB7XG4gICAgICAgICAgICBidG5BY3Rpb25OYW1lID0gdGV4dCgncmVhZE5vdycpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMubG9hbi5pc1ZpZGVvKSB7XG4gICAgICAgICAgICBidG5BY3Rpb25OYW1lID0gd2luZG93Lk92ZXJEcml2ZS5pbkFwcFxuICAgICAgICAgICAgICAgID8gdGV4dCgnYWRkVG9Cb29rc2hlbGYnKVxuICAgICAgICAgICAgICAgIDogdGV4dCgnd2F0Y2hOb3cnKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmxvYW4uaXNBdWRpb2Jvb2spIHtcbiAgICAgICAgICAgIGJ0bkFjdGlvbk5hbWUgPSB0ZXh0KCdsaXN0ZW5Ob3cnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxvYW4uaGFzUmVhZGFsb25nKSB7XG4gICAgICAgICAgICBidG5TdWJUZXh0ID0gYDxiciAvPjxzcGFuIGNsYXNzPVwiZGwtdGV4dFwiPiR7aHRtbChcbiAgICAgICAgICAgICAgICAnbmFycmF0ZWRNb2RhbC5oZWFkaW5nJ1xuICAgICAgICAgICAgKX08L3NwYW4+YDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBgPGEgJHtcbiAgICAgICAgICAgIHRoaXMubG9hbi5vdmVyRHJpdmVGb3JtYXQuaWQgPT09ICd2aWRlby1zdHJlYW1pbmcnXG4gICAgICAgICAgICAgICAgPyAnZGF0YS1hcnRpZmljaWFsLWxvY2snXG4gICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICB9XG4gICAgICAgICAgICAgICAgaHJlZj0gXCIke3VybCh3aW5kb3cucm91dGVzLm1lZGlhRG93bmxvYWQsIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiB0aGlzLmxvYW4ub3ZlckRyaXZlRm9ybWF0LmlkLFxuICAgICAgICAgICAgICAgICAgICBtZWRpYUlkOiB0aGlzLmxvYW4uaWQsXG4gICAgICAgICAgICAgICAgfSl9XCJcbiAgICAgICAgICAgICAgICB0YXJnZXQgPSBcIl9ibGFua1wiIHJlbD1cIm5vcmVmZXJyZXJcIlxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uIHNlY29uZGFyeSByYWRpdXMgb2QtZm9ybWF0LWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgcm9sZSA9IFwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICBkYXRhLWZvcm1hdC1pZD1cIiR7dGhpcy5sb2FuLm92ZXJEcml2ZUZvcm1hdC5pZH1cIlxuICAgICAgICAgICAgICAgIGRhdGEtbWVkaWEtaWQ9XCIke1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYW4uaWRcbiAgICAgICAgICAgICAgICB9XCIgPiA8Yj4ke2J0bkFjdGlvbk5hbWV9PC9iPiR7YnRuU3ViVGV4dH1cbiAgICAgICAgICAgIDwvYT5gO1xuICAgIH1cblxuICAgIHJlbmRlckRvd25sb2FkRHJvcGRvd24oKSB7XG4gICAgICAgIGxldCBvcHRpb25zID0gJyc7XG5cbiAgICAgICAgdGhpcy5sb2FuLm5vbktpbmRsZU5vblJlYWRGb3JtYXRzLmZvckVhY2goKGZvcm1hdCkgPT4ge1xuICAgICAgICAgICAgb3B0aW9ucyA9IGAke29wdGlvbnN9XG4gICAgICAgICAgICAgICAgICAgICAgICA8bGkgcm9sZT1cImxpc3RpdGVtXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgZGF0YS1hcnRpZmljaWFsLWxvY2sgdGFiaW5kZXg9XCItMVwiIGRhdGEtZm9ybWF0PVwiJHtodG1sKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZm9ybWF0cy4ke2Zvcm1hdC5pZH1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cIiBkYXRhLWZvcm1hdC1pZD1cIiR7Zm9ybWF0LmlkfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS1tZWRpYS1pZD1cIiR7dGhpcy5sb2FuLmlkfVwiIGFyaWEtbGFiZWw9XCIke2h0bWwoXG4gICAgICAgICAgICAgICAgJ2FjY291bnRMb2Fucy5kb3dubG9hZEFzJyxcbiAgICAgICAgICAgICAgICB7IGZvcm1hdDogaHRtbChgZm9ybWF0cy4ke2Zvcm1hdC5pZH1gKSB9XG4gICAgICAgICAgICApfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FuLm90aGVyRm9ybWF0c1swXS5pZCA9PT0gJ2Vib29rLWtpbmRsZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ3RhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vcmVmZXJyZXJcIidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJmb3JtYXRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY9XCIke3VybCh3aW5kb3cucm91dGVzLm1lZGlhRG93bmxvYWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OiBmb3JtYXQuaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSWQ6IHRoaXMubG9hbi5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX1cIj4ke2h0bWwoYGZvcm1hdHMuJHtmb3JtYXQuaWR9YCl9PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5gO1xuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgY29udGVudCA9IGA8YnV0dG9uIHJvbGU9XCJidXR0b25cIiBkYXRhLWRyb3Bkb3duPVwiZm9ybWF0cy0ke1xuICAgICAgICAgICAgdGhpcy5sb2FuLmlkXG4gICAgICAgIH1tXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1jb250cm9scz1cImZvcm1hdHMtJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hbi5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCIgaWQ9XCJkb3dubG9hZC1kcm9wZG93blwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiYnV0dG9uIGRyb3Bkb3duIHJhZGl1cyBkb3dubG9hZC1kcm9wZG93blwiPjxiPiR7aHRtbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdhY2NvdW50TG9hbnMuZG93bmxvYWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9PC9iPjxiciAvPjwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHVsIGlkPVwiZm9ybWF0cy0ke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubG9hbi5pZFxuICAgICAgICAgICAgICAgICAgICAgICAgfW1cIiBkYXRhLWRyb3Bkb3duLWNvbnRlbnQgY2xhc3M9XCJmLWRyb3Bkb3duIGRvd25sb2FkLWRyb3Bkb3duLWZvcm1hdHNcIiBhcmlhLWhpZGRlbj1cInRydWVcIiByb2xlPVwibGlzdFwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtvcHRpb25zfVxuICAgICAgICAgICAgICAgICAgICAgICAgPC91bCA+YDtcbiAgICAgICAgcmV0dXJuIGNvbnRlbnQ7XG4gICAgfVxuXG4gICAgcmVuZGVyQnVuZGxlZENvbnRlbnQoKSB7XG4gICAgICAgIGxldCBidW5kbGVkQnV0dG9ucyA9ICcnO1xuICAgICAgICBsZXQgcmVzdHJpY3RlZEJ1bmRsZSA9IFtdO1xuICAgICAgICB0aGlzLmxvYW4uYnVuZGxlZENvbnRlbnQuZm9yRWFjaCgoc3ViY29udGVudCkgPT4ge1xuICAgICAgICAgICAgbGV0IGZvcm1hdCA9IHN1YmNvbnRlbnQub3RoZXJGb3JtYXRzWzBdO1xuICAgICAgICAgICAgbGV0IGxhYmVsID0gJyc7XG4gICAgICAgICAgICBzd2l0Y2ggKGZvcm1hdC5pZCkge1xuICAgICAgICAgICAgICAgIGNhc2UgJ2Vib29rLW92ZXJkcml2ZSc6XG4gICAgICAgICAgICAgICAgY2FzZSAnbWFnYXppbmUtb3ZlcmRyaXZlJzpcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBodG1sKCdyZWFkTm93Jyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgJ2F1ZGlvYm9vay1vdmVyZHJpdmUnOlxuICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGh0bWwoJ2xpc3Rlbk5vdycpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlICd2aWRlby1zdHJlYW1pbmcnOlxuICAgICAgICAgICAgICAgICAgICBsYWJlbCA9IGh0bWwoJ3dhdGNoTm93Jyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsID0gYCR7aHRtbChgZm9ybWF0cy4ke2Zvcm1hdC5pZH1gKX08c3Bhbj4gJHtodG1sKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2FjY291bnRMb2Fucy5kb3dubG9hZCdcbiAgICAgICAgICAgICAgICAgICAgKX08L3NwYW4+YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLmlzUmVzdHJpY3RlZChmb3JtYXQpKSB7XG4gICAgICAgICAgICAgICAgcmVzdHJpY3RlZEJ1bmRsZS5wdXNoKGZvcm1hdCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHN1YmNvbnRlbnQuaWQpIHtcbiAgICAgICAgICAgICAgICBidW5kbGVkQnV0dG9ucyArPSBgPGxpIGNsYXNzPVwiTG9hbnMtYnVuZGxlTGlzdEl0ZW1cIj48YSBjbGFzcz1cIkxvYW5zLWJ1bmRsZWRCdXR0b24gYnV0dG9uIHByaW1hcnkgcmFkaXVzXCIgZGF0YS1tZWRpYS1pZD1cIiR7XG4gICAgICAgICAgICAgICAgICAgIHN1YmNvbnRlbnQuaWRcbiAgICAgICAgICAgICAgICB9XCIgZGF0YS1mb3JtYXQtaWQ9XCIke1xuICAgICAgICAgICAgICAgICAgICBmb3JtYXQuaWQgfHwgc3ViY29udGVudC5vdmVyRHJpdmVGb3JtYXQuaWRcbiAgICAgICAgICAgICAgICB9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViY29udGVudC50eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGA8aSBjbGFzcz1cImljb24tJHtzdWJjb250ZW50LnR5cGUuaWR9IExvYW5zLWJ1bmRsZWRGb3JtYXRJY29uXCI+PC9pPmBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtsYWJlbH08L2E+PC9saT5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVGh1bmRlciBpc24ndCBwYXNzaW5nIHVzIHRoZSBidW5kbGVkIGNvbnRlbnQgSUQncyB5ZXQsIHNvIHdlIGhhdmUgdG8gdXNlIGEgXCJHbyB0byBsb2Fuc1wiIGJ1dHRvbiBmb3Igbm93XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBidW5kbGVkQnV0dG9ucyA9IGA8bGkgY2xhc3M9XCJMb2Fucy1idW5kbGVMaXN0SXRlbVwiPjxhIGhyZWY9XCIvYWNjb3VudC9sb2Fuc1wiIGNsYXNzPVwiTG9hbnMtYnVuZGxlZEJ1dHRvbiBidXR0b24gcHJpbWFyeSByYWRpdXMgdS1hbGxDYXBzXCI+JHt0ZXh0KFxuICAgICAgICAgICAgICAgICAgICAnZ29Ub0xvYW5zJ1xuICAgICAgICAgICAgICAgICl9PC9hPjwvbGk+YDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGA8YSBjbGFzcz1cIkxvYW5zLWJ1bmRsZUljb25MaW5rXCIgZGF0YS1kcm9wZG93bj1cImJ1bmRsZURyb3AtJHtcbiAgICAgICAgICAgIHRoaXMubG9hbi5pZFxuICAgICAgICB9XCIgYXJpYS1jb250cm9scz1cImJ1bmRsZURyb3AtJHtcbiAgICAgICAgICAgIHRoaXMubG9hbi5pZFxuICAgICAgICB9XCIgYXJpYS1leHBhbmRlZD1cImZhbHNlXCIgYXJpYS1sYWJlbD1cIiR7aHRtbChcbiAgICAgICAgICAgICdhY2NvdW50TG9hbnMuYnVuZGxlZExhYmVsJ1xuICAgICAgICApfVwiPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImljb24tYXR0YWNobWVudCBMb2Fucy1idW5kbGVkSWNvblwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAgICAgICAgICAgICA8L2E+XG4gICAgICAgICAgICAgICAgPHVsIGlkPVwiYnVuZGxlRHJvcC0ke1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmxvYW4uaWRcbiAgICAgICAgICAgICAgICB9XCIgY2xhc3M9XCJmLWRyb3Bkb3duIExvYW5zLWJ1bmRsZWRDb250ZW50TGlzdFwiIGRhdGEtZHJvcGRvd24tY29udGVudCBhcmlhLWhpZGRlbj1cInRydWVcIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgICAgICAgICAgICAgICAgIDxsaSBjbGFzcz1cIkxvYW5zLWJ1bmRsZWRMYWJlbFwiPiR7aHRtbChcbiAgICAgICAgICAgICAgICAgICAgICAgICdhY2NvdW50TG9hbnMuYnVuZGxlZExhYmVsJ1xuICAgICAgICAgICAgICAgICAgICApfTwvbGk+XG4gICAgICAgICAgICAgICAgICAgICR7YnVuZGxlZEJ1dHRvbnN9XG4gICAgICAgICAgICAgICAgICAgICR7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkQnVuZGxlLmxlbmd0aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGA8bGkgY2xhc3M9XCJMb2Fucy1idW5kbGVMaXN0SXRlbVwiPiR7dGhpcy5yZW5kZXJSZXN0cmljdGVkRm9ybWF0V2FybmluZyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN0cmljdGVkQnVuZGxlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApfTwvbGk+YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdWw+XG4gICAgICAgIGA7XG4gICAgfVxuXG4gICAgcmVuZGVyUmVzdHJpY3RlZEZvcm1hdFdhcm5pbmcoZm9ybWF0cykge1xuICAgICAgICBsZXQgZm9ybWF0TmFtZXMgPSBbXTtcbiAgICAgICAgZm9ybWF0cy5mb3JFYWNoKChmb3JtYXQpID0+IHtcbiAgICAgICAgICAgIGZvcm1hdE5hbWVzLnB1c2goZm9ybWF0Lm5hbWUpO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGZvcm1hdHNUZXh0ID0gZm9ybWF0TmFtZXMuam9pbignIHwgJyk7XG4gICAgICAgIHJldHVybiBgPGRpdiBjbGFzcz1cInRleHQtY2VudGVyIG5vLWRvd25sb2FkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxzcGFuPiR7Zm9ybWF0c1RleHR9PC9zcGFuPlxuICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPiR7d2luZG93LnRleHQoJ2FjY291bnRMb2Fucy51bnN1cHBvcnRlZEZvcm1hdCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHM6IGZvcm1hdHMubGVuZ3RoLFxuICAgICAgICAgICAgICAgICAgICB9KX08L3N0cm9uZz5cbiAgICAgICAgICAgICAgICA8L2Rpdj5gO1xuICAgIH1cblxuICAgIHJlbmRlclN0cmVhbWluZ1ZpZGVvV2FybmluZygpIHtcbiAgICAgICAgcmV0dXJuIGA8ZGl2IGNsYXNzPVwidGV4dC1jZW50ZXIgbm8tZG93bmxvYWRcIj5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+JHt3aW5kb3cudGV4dCgnZm9ybWF0cy52aWRlby1zdHJlYW1pbmcnKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxzdHJvbmc+JHt3aW5kb3cudGV4dChcbiAgICAgICAgICAgICAgICAgICAgICAgICdhY2NvdW50TG9hbnMudXBkYXRlRm9yVmlkZW8nXG4gICAgICAgICAgICAgICAgICAgICl9PC9zdHJvbmc+XG4gICAgICAgICAgICAgICAgPC9kaXY+YDtcbiAgICB9XG5cbiAgICByZW5kZXJXaW5kb3dzQXBwRG93bmxvYWRNZXNzYWdlKCkge1xuICAgICAgICBsZXQgaXNXaW5kb3dzID0gd2luZG93Lk92ZXJEcml2ZS5pc1dpbmRvd3M7XG4gICAgICAgIGxldCBpbkFwcCA9IHdpbmRvdy5PdmVyRHJpdmUuaW5BcHA7XG4gICAgICAgIGxldCBpc0Vib29rT3JBdWRpb2Jvb2sgPSB0aGlzLmxvYW4uaXNFYm9vayB8fCB0aGlzLmxvYW4uaXNBdWRpb2Jvb2s7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgaXNXaW5kb3dzICYmXG4gICAgICAgICAgICBpbkFwcCAmJlxuICAgICAgICAgICAgaXNFYm9va09yQXVkaW9ib29rICYmXG4gICAgICAgICAgICB0aGlzLmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnd2luZG93cy1hcHAtZG93bmxvYWQtbWVzc2FnZScpXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIGBcbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZG93bmxvYWQtaXNzdWUtbWVzc2FnZVwiPlxuICAgICAgICAgICAgICAgICAgICA8YnI+PGltZyBjbGFzcz1cImRvd25sb2FkLWlzc3VlLWljb25cIiBzcmM9XCIke3RvU3RhdGljVXJsKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2ltZy9kb3dubG9hZC1pc3N1ZS1pY29uLnN2ZydcbiAgICAgICAgICAgICAgICAgICAgKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cInVuYWJsZS10by1kb3dubG9hZFwiPiAke2h0bWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAnd2luZG93c0FwcERvd25sb2FkTWVzc2FnZS5oZWFkbGluZSdcbiAgICAgICAgICAgICAgICAgICAgKX0gPC9idXR0b24+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICBgO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZW1vdmUoKSB7XG4gICAgICAgIHRoaXMuX3ZpZXdzLmZvckVhY2goKHZpZXcpID0+IHZpZXcucmVtb3ZlKCkpO1xuICAgICAgICBzdXBlci5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICBmaWx0ZXJSZXN0cmljdGVkRm9ybWF0cygpIHtcbiAgICAgICAgdGhpcy5sb2FuLnJlc3RyaWN0ZWRGb3JtYXRzID0gW107XG4gICAgICAgIGlmICh0aGlzLmZvcm1hdExvY2spIHtcbiAgICAgICAgICAgIHRoaXMubG9hbi5vdGhlckZvcm1hdHMgPSB0aGlzLmxvYW4ub3RoZXJGb3JtYXRzLmZpbHRlcihcbiAgICAgICAgICAgICAgICAoZm9ybWF0KSA9PiBmb3JtYXQuaWQgPT09IHRoaXMuZm9ybWF0TG9ja1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxvYW4ub3RoZXJGb3JtYXRzID0gdGhpcy5sb2FuLm90aGVyRm9ybWF0cy5maWx0ZXIoKGZvcm1hdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGlzUmVzdHJpY3RlZCA9IHRoaXMuaXNSZXN0cmljdGVkKGZvcm1hdCk7XG4gICAgICAgICAgICBpZiAoaXNSZXN0cmljdGVkKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5sb2FuLnJlc3RyaWN0ZWRGb3JtYXRzLnB1c2goZm9ybWF0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAhaXNSZXN0cmljdGVkO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpc1Jlc3RyaWN0ZWQoZm9ybWF0KSB7XG4gICAgICAgIGxldCBkZXZpY2UgPSB3aW5kb3cuYm93c2VyO1xuICAgICAgICBsZXQgaXNDaHJvbWVib29rID0gISF3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvQ3JPUy8pO1xuICAgICAgICBsZXQgaXNXaW5kb3dzID1cbiAgICAgICAgICAgIHdpbmRvdy5uYXZpZ2F0b3IucGxhdGZvcm0ubWF0Y2goL1dpbi8pICYmICFkZXZpY2Uud2luZG93c3Bob25lO1xuICAgICAgICBsZXQgaW5BcHAgPSB3aW5kb3cuT3ZlckRyaXZlLmluQXBwO1xuICAgICAgICBsZXQgaXNNYWMgPSB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTWFjLykgJiYgIWRldmljZS5pb3M7XG4gICAgICAgIGxldCBpc0lwYWQgPVxuICAgICAgICAgICAgdGhpcy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ3N0b3AtdHJlYXRpbmctaXBhZC1saWtlLW1hYycpICYmXG4gICAgICAgICAgICB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaChcbiAgICAgICAgICAgICAgICAvQXBwIFN0b3JlIE92ZXJEcml2ZSBNZWRpYSBDb25zb2xlL1xuICAgICAgICAgICAgKTtcblxuICAgICAgICBzd2l0Y2ggKGZvcm1hdC5pZCkge1xuICAgICAgICAgICAgY2FzZSAnZWJvb2stcGRmLWFkb2JlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICBkZXZpY2UuaW9zIHx8XG4gICAgICAgICAgICAgICAgICAgIGRldmljZS5hbmRyb2lkIHx8XG4gICAgICAgICAgICAgICAgICAgIGRldmljZS53aW5kb3dzcGhvbmUgfHxcbiAgICAgICAgICAgICAgICAgICAgZGV2aWNlLmJsYWNrYmVycnkgfHxcbiAgICAgICAgICAgICAgICAgICAgaXNDaHJvbWVib29rIHx8XG4gICAgICAgICAgICAgICAgICAgIChpc1dpbmRvd3MgJiYgaW5BcHApIHx8XG4gICAgICAgICAgICAgICAgICAgIGlzSXBhZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjYXNlICdlYm9vay1lcHViLWFkb2JlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaXNDaHJvbWVib29rICYmICFpbkFwcDtcbiAgICAgICAgICAgIGNhc2UgJ2Vib29rLXBkZi1vcGVuJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAoKGRldmljZS5pb3MgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS5hbmRyb2lkIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBpc1dpbmRvd3MgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzQ2hyb21lYm9vaykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIGluQXBwKSB8fFxuICAgICAgICAgICAgICAgICAgICBkZXZpY2Uud2luZG93c3Bob25lIHx8XG4gICAgICAgICAgICAgICAgICAgIGRldmljZS5ibGFja2JlcnJ5IHx8XG4gICAgICAgICAgICAgICAgICAgIGlzSXBhZFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjYXNlICdhdWRpb2Jvb2stbXAzJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgICAgICAgICAoaXNDaHJvbWVib29rICYmICFpbkFwcCkgfHxcbiAgICAgICAgICAgICAgICAgICAgKGlzTWFjICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAodGhpcy50aXRsZS5nZXQoJ2Zvcm1hdHMnKS5sZW5ndGggPT09IDEgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW5BcHAgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50aXRsZS5nZXQoJ2Zvcm1hdHMnKS5sZW5ndGggPT09IDIpKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ25vQXVkaW9ib29rc0Zvck1hY09TJykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICghdGhpcy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlZW5hYmxlTXAzRG93bmxvYWRNYWNPU1ByZUNhdGFsaW5hJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICF3aW5kb3cuT3ZlckRyaXZlLmlzUHJlQ2F0YWxpbmFNYWMpKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9oaWRlVW5zdXBwb3J0ZWREb3dubG9hZE9wdGlvbnNGb3JUb2xpbm8oZm9ybWF0SWQpIHtcbiAgICAgICAgaWYgKCF3aW5kb3cuT3ZlckRyaXZlLmlzVG9saW5vRGV2aWNlKSB7XG4gICAgICAgICAgICByZXR1cm4geyBoaWRlOiBmYWxzZSwgZm9ybWF0OiAnJyB9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGZvcm1hdElkID09PSAnZWJvb2stbWVkaWEtZG8nKSB7XG4gICAgICAgICAgICByZXR1cm4geyBoaWRlOiB0cnVlLCBmb3JtYXQ6IHdpbmRvdy50ZXh0KGBmb3JtYXRzLiR7Zm9ybWF0SWR9YCkgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7IGhpZGU6IGZhbHNlLCBmb3JtYXQ6ICcnIH07XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgTW9kYWwgfSBmcm9tICcuLi8uLi9jb21tb24vbW9kYWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBJbXBvcnRGcm9tUmF0ZWRDb21wbGV0ZU1vZGFsIGV4dGVuZHMgQmFja2JvbmUuVmlldyB7XG4gICAgdGl0bGVzSW1wb3J0ZWRUZW1wbGF0ZSA9IChpbXBvcnRlZFRpdGxlQ291bnQpID0+XG4gICAgICAgIGA8cD48c3BhbiBjbGFzcz1cImljb24tY2hlY2tcIi8+Jm5ic3A7JHtodG1sKFxuICAgICAgICAgICAgJ3JlYWRpbmdIaXN0b3J5LmFkZFJhdGVkVGl0bGVzU3VjY2VzcycsXG4gICAgICAgICAgICB7IGNvdW50OiBpbXBvcnRlZFRpdGxlQ291bnQgfVxuICAgICAgICApfTwvcD5gO1xuXG4gICAgbm9UaXRsZXNJbXBvcnRlZFRlbXBsYXRlID0gKCkgPT4gYFxuICAgICAgICA8cD4ke2h0bWwoJ3JlYWRpbmdIaXN0b3J5LmFsbFJhdGVkVGl0bGVzQWRkZWQnKX08L3A+XG4gICAgICAgIDxwPiR7d2luZG93LnRleHQoJ3JlYWRpbmdIaXN0b3J5LmlmWW91ZExpa2UnLCB7XG4gICAgICAgICAgICBsaW5rOiBgPGEgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9yZWZlcnJlclwiIGhyZWY9XCJodHRwczovL2hlbHAub3ZlcmRyaXZlLmNvbS9jdXN0b21lci9wb3J0YWwvYXJ0aWNsZXMvMjgzMzQ3N1wiPiAke3dpbmRvdy50ZXh0KFxuICAgICAgICAgICAgICAgICdyZWFkaW5nSGlzdG9yeS5tYW51YWxseUFkZCdcbiAgICAgICAgICAgICl9PC9hPmAsXG4gICAgICAgIH0pfVxuICAgICAgICA8L3A+YDtcblxuICAgIG5vVGl0bGVzUmF0ZWRUZW1wbGF0ZSA9ICgpID0+IGBcbiAgICAgICAgPHA+JHtodG1sKCdyZWFkaW5nSGlzdG9yeS5ub25lUmF0ZWQnKX08L3A+XG4gICAgYDtcblxuICAgIGNvbnN0cnVjdG9yKGltcG9ydGVkVGl0bGVDb3VudCwgcGF0cm9uSGFzUmF0ZWRUaXRsZXMpIHtcbiAgICAgICAgc3VwZXIoKTtcblxuICAgICAgICB0aGlzLl9yZW5kZXIoaW1wb3J0ZWRUaXRsZUNvdW50LCBwYXRyb25IYXNSYXRlZFRpdGxlcyk7XG5cbiAgICAgICAgbGV0IHRpdGxlID0gJyc7XG4gICAgICAgIGlmIChpbXBvcnRlZFRpdGxlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICB0aXRsZSA9IGh0bWwoJ2dlbmVyaWNTdWNjZXNzJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aXRsZSA9IGh0bWwoJ3JlYWRpbmdIaXN0b3J5LmFkZFJhdGVkVGl0bGVzRmFpbHVyZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1vZGFsQ29udGVudHMgPSB7XG4gICAgICAgICAgICBhdXRvU2hvdzogZmFsc2UsXG4gICAgICAgICAgICB0aXRsZTogdGl0bGUsXG4gICAgICAgICAgICBjbGFzc2VzOiBbJ3NtYWxsJ10sXG4gICAgICAgICAgICBjb250ZW50OiB0aGlzLiRlbCxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLm1vZGFsID0gbmV3IE1vZGFsKG1vZGFsQ29udGVudHMpO1xuICAgICAgICB0aGlzLm1vZGFsLnNob3coKTtcbiAgICB9XG5cbiAgICBfcmVuZGVyKGltcG9ydGVkVGl0bGVDb3VudCwgcGF0cm9uSGFzUmF0ZWRUaXRsZXMpIHtcbiAgICAgICAgaWYgKGltcG9ydGVkVGl0bGVDb3VudCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuJGVsLmFwcGVuZCh0aGlzLnRpdGxlc0ltcG9ydGVkVGVtcGxhdGUoaW1wb3J0ZWRUaXRsZUNvdW50KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoISFwYXRyb25IYXNSYXRlZFRpdGxlcykge1xuICAgICAgICAgICAgdGhpcy4kZWwuYXBwZW5kKHRoaXMubm9UaXRsZXNJbXBvcnRlZFRlbXBsYXRlKGltcG9ydGVkVGl0bGVDb3VudCkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4kZWwuYXBwZW5kKHRoaXMubm9UaXRsZXNSYXRlZFRlbXBsYXRlKCkpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgdG9TdGF0aWNVcmwgfSBmcm9tICcuLi8uLi8uLi8uLi9saWIvYXNzZXRNYXBwZXInO1xuXG5jb25zdCBnZXRMb2NhbGVXaXRob3V0U3VidGFnID0gKGxvY2FsZSkgPT4ge1xuICAgIGNvbnN0IHN1YnRhZ0luZGV4ID0gbG9jYWxlLmluZGV4T2YoJy0nKTtcbiAgICByZXR1cm4gc3VidGFnSW5kZXggPiAwID8gbG9jYWxlLnN1YnN0cigwLCBzdWJ0YWdJbmRleCkgOiBsb2NhbGU7XG59O1xuXG5jb25zdCBnZXRMb2NhbGVTcGVjaWZpY1VybCA9IChsb2NhbGUsIHVybEhhbmRsZXIpID0+XG4gICAgdXJsSGFuZGxlcihsb2NhbGUpIHx8XG4gICAgdXJsSGFuZGxlcihnZXRMb2NhbGVXaXRob3V0U3VidGFnKGxvY2FsZSkpIHx8XG4gICAgdXJsSGFuZGxlcignZW4nKTtcblxuY29uc3QgZ2V0U3RhdGljVXJsSGFuZGxlciA9ICh1cmxSZXNvbHZlcikgPT4gKGxvY2FsZSkgPT4ge1xuICAgIGNvbnN0IHVybCA9IHRvU3RhdGljVXJsKHVybFJlc29sdmVyKGxvY2FsZSkpO1xuICAgIHJldHVybiB1cmwuZW5kc1dpdGgoJ3VuZGVmaW5lZCcpID8gdW5kZWZpbmVkIDogdXJsO1xufTtcblxuY29uc3QgZ2V0TG9jYWxlU3RhdGljVXJsID0gKGxvY2FsZSwgdXJsUmVzb2x2ZXIpID0+XG4gICAgZ2V0TG9jYWxlU3BlY2lmaWNVcmwobG9jYWxlLCBnZXRTdGF0aWNVcmxIYW5kbGVyKHVybFJlc29sdmVyKSk7XG5cbmNvbnN0IGFwcEJhZGdlID0gKHsgYWx0LCBocmVmLCBpZCwgc3JjIH0pID0+IGBcbjxhIGNsYXNzPVwiYXBwLXN0b3JlLWJhZGdlX19saW5rXCJcbiAgIGhyZWY9XCIke2hyZWZ9XCJcbiAgIHJlbD1cIm5vcmVmZXJyZXJcIlxuICAgdGFyZ2V0PVwiX2JsYW5rXCI+XG4gICAgPGltZyBhbHQ9XCIke2FsdH1cIiAgXG4gICAgICAgIGNsYXNzPVwiYXBwLXN0b3JlLWJhZGdlX19pY29uXCJcbiAgICAgICAgJHtpZCA/IGBpZD1cIiR7aWR9XCJgIDogJyd9XG4gICAgICAgIHNyYz1cIiR7c3JjfVwiIC8+XG48L2E+XG5gO1xuXG5leHBvcnQgY29uc3QgYXBwbGVBcHBTdG9yZUJhZGdlID0gKHtcbiAgICBoaWdoQ29udHJhc3QsXG4gICAgaHJlZixcbiAgICBpZCxcbiAgICB1c2VyTGFuZ3VhZ2VDb2RlLFxufSkgPT4ge1xuICAgIGNvbnN0IHNyYyA9IGhpZ2hDb250cmFzdFxuICAgICAgICA/IGdldExvY2FsZVN0YXRpY1VybChcbiAgICAgICAgICAgICAgdXNlckxhbmd1YWdlQ29kZSxcbiAgICAgICAgICAgICAgKGxvY2FsZSkgPT4gYGltZy9hcHBsZS1hcHAtc3RvcmUvYmFkZ2VzLyR7bG9jYWxlfS1oY20uc3ZnYFxuICAgICAgICAgIClcbiAgICAgICAgOiBnZXRMb2NhbGVTdGF0aWNVcmwoXG4gICAgICAgICAgICAgIHVzZXJMYW5ndWFnZUNvZGUsXG4gICAgICAgICAgICAgIChsb2NhbGUpID0+IGBpbWcvYXBwbGUtYXBwLXN0b3JlL2JhZGdlcy8ke2xvY2FsZX0uc3ZnYFxuICAgICAgICAgICk7XG4gICAgcmV0dXJuIGFwcEJhZGdlKHtcbiAgICAgICAgYWx0OiBodG1sKCdhcHBzLmJhZGdlcy5hcHBsZUFwcFN0b3JlJyksXG4gICAgICAgIGhyZWYsXG4gICAgICAgIGlkLFxuICAgICAgICBzcmMsXG4gICAgfSk7XG59O1xuXG5leHBvcnQgY29uc3QgZ29vZ2xlUGxheVN0b3JlQmFkZ2UgPSAoe1xuICAgIGhpZ2hDb250cmFzdCxcbiAgICBocmVmLFxuICAgIGlkLFxuICAgIHVzZXJMYW5ndWFnZUNvZGUsXG59KSA9PiB7XG4gICAgY29uc3Qgc3JjID0gaGlnaENvbnRyYXN0XG4gICAgICAgID8gZ2V0TG9jYWxlU3RhdGljVXJsKFxuICAgICAgICAgICAgICB1c2VyTGFuZ3VhZ2VDb2RlLFxuICAgICAgICAgICAgICAobG9jYWxlKSA9PiBgaW1nL2dvb2dsZS1wbGF5LXN0b3JlL2JhZGdlcy8ke2xvY2FsZX0taGNtLnN2Z2BcbiAgICAgICAgICApXG4gICAgICAgIDogZ2V0TG9jYWxlU3RhdGljVXJsKFxuICAgICAgICAgICAgICB1c2VyTGFuZ3VhZ2VDb2RlLFxuICAgICAgICAgICAgICAobG9jYWxlKSA9PiBgaW1nL2dvb2dsZS1wbGF5LXN0b3JlL2JhZGdlcy8ke2xvY2FsZX0uc3ZnYFxuICAgICAgICAgICk7XG4gICAgcmV0dXJuIGFwcEJhZGdlKHtcbiAgICAgICAgYWx0OiBodG1sKCdhcHBzLmJhZGdlcy5nb29nbGVQbGF5U3RvcmUnKSxcbiAgICAgICAgaHJlZixcbiAgICAgICAgaWQsXG4gICAgICAgIHNyYyxcbiAgICB9KTtcbn07XG4iLCJpbXBvcnQgSGlzdG9yeUV2ZW50TGlzdGVuZXIgZnJvbSAnLi4vaGlzdG9yeV9ldmVudF90cmFja2VyL0hpc3RvcnlFdmVudExpc3RlbmVyJztcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEF1dG9TY3JvbGwgZXh0ZW5kcyBIaXN0b3J5RXZlbnRMaXN0ZW5lciB7XG4gICAgY29uc3RydWN0b3IodHJhY2tlcikge1xuICAgICAgICBzdXBlcih0cmFja2VyKTtcbiAgICAgICAgdGhpcy5fY2FuY2VsTG9vcCA9IGZhbHNlO1xuICAgIH1cblxuICAgIG9uTG9hZChzdGF0ZXMpIHtcbiAgICAgICAgdGhpcy5fY2hlY2tBZ2FpbigpO1xuICAgICAgICB0aGlzLl9zdGFydExvb3BUaW1lcigpO1xuICAgIH1cblxuICAgIG9uVW5sb2FkKCkge1xuICAgICAgICB0aGlzLl9zZXRTY3JvbGxDb29raWUoKTtcbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIFNjcm9sbHMgdGhlIHVzZXIgZG93biB0aGUgcGFnZSBiYXNlZCBvbiB0aGUgcGFyYW1cbiAgICAgKi9cbiAgICBfc2Nyb2xsVXNlcigpIHtcbiAgICAgICAgaWYgKCQod2luZG93KSAmJiAkKHdpbmRvdykuc2Nyb2xsVG9wICYmIHRoaXMuZ2V0VHJhY2tlcigpLmdldERhdGEoMCkgJiYgdGhpcy5nZXRUcmFja2VyKCkud2FzQmFja0J1dHRvbkhpdCgpICYmXG4gICAgICAgICAgICB0aGlzLmdldFRyYWNrZXIoKS5nZXREYXRhKDApLnNjcm9sbCkge1xuICAgICAgICAgICAgJCh3aW5kb3cpLnNjcm9sbFRvcCh0aGlzLmdldFRyYWNrZXIoKS5nZXREYXRhKDApLnNjcm9sbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBDaGVja3MgaWYgdGhlIGR5bmFtaWMgY29udGVudCBoYXMgYmVlbiBzaG93biB5ZXRcbiAgICAgKi9cbiAgICBfY2hlY2tEeW5hbWljQ29udGVudFN0YXRlKCkge1xuICAgICAgICB2YXIgZHluYW1pY0NvbnRlbnQgPSAkKCcuanMtZHluYW1pYy1jb250ZW50Jyk7XG4gICAgICAgIHZhciBkeW5hbWljUGFyZW50ID0gJCgnLmpzLWR5bmFtaWMtcGFyZW50Jyk7IC8vIE5lY2Vzc2FyeSBmb3IgZHluYW1pY2FsbHkgYXBwZW5kZWQgY29udGVudFxuXG4gICAgICAgIGlmICgoZHluYW1pY1BhcmVudC5sZW5ndGggfHwgZHluYW1pY0NvbnRlbnQubGVuZ3RoKSAmJiAhZHluYW1pY0NvbnRlbnQuaXMoJzp2aXNpYmxlJykgJiYgIXRoaXMuX2NhbmNlbExvb3ApIHtcbiAgICAgICAgICAgIHRoaXMuX2NoZWNrQWdhaW4oKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNsZWFyVGltZW91dCh0aGlzLmxvb3BUaW1lcik7XG4gICAgICAgICAgICB0aGlzLl9zY3JvbGxVc2VyKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBMb29wIGJhY2sgdG8gY2hlY2sgZm9yIHZpc2libGUgZHluYW1pYyBjb250ZW50XG4gICAgICogSWYgcmVxdWVzdEFuaW1hdGlvbkZyYW1lIGlzIHN1cHBvcnRlZCBjaGVjayBmb3IgdmlzaWJsZSBjb250ZW50IG9uIHRoZSBuZXh0IGZyYW1lLlxuICAgICAqIE90aGVyd2lzZSBmYWxsYmFjayB0byBzZXRUaW1lb3V0XG4gICAgICovXG4gICAgX2NoZWNrQWdhaW4oKSB7XG4gICAgICAgIHJldHVybiAhIXJlcXVlc3RBbmltYXRpb25GcmFtZSA/XG4gICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUodGhpcy5fY2hlY2tEeW5hbWljQ29udGVudFN0YXRlLmJpbmQodGhpcykpIDpcbiAgICAgICAgICAgIHNldFRpbWVvdXQodGhpcy5fY2hlY2tEeW5hbWljQ29udGVudFN0YXRlLmJpbmQodGhpcyksIDUwKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBFeGl0IHRoZSBsb29wIGlmIGNvbnRlbnQgZG9lcyBub3QgYXBwZWFyIHdpdGhpbiAzMCBzZWNvbmRzXG4gICAgICogU3RhcnRzIHRoZSB0aW1lciB0byBjYW5jZWwgdGhlIGxvb3BcbiAgICAgKi9cbiAgICBfc3RhcnRMb29wVGltZXIoKSB7XG4gICAgICAgIHRoaXMubG9vcHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9jYW5jZWxMb29wID0gdHJ1ZTtcbiAgICAgICAgfSwgMzAwMDApO1xuICAgIH1cblxuICAgIF9zZXRTY3JvbGxDb29raWUoKSB7XG4gICAgICAgIGlmICgkKHdpbmRvdykgJiYgJCh3aW5kb3cpLnNjcm9sbFRvcCkge1xuICAgICAgICAgICAgdGhpcy5nZXRUcmFja2VyKCkuYWRkRGF0YVRvTGF0ZXN0KCdzY3JvbGwnLCAkKHdpbmRvdykuc2Nyb2xsVG9wKCkpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IEhpc3RvcnlFdmVudExpc3RlbmVyIGZyb20gJy4uL2hpc3RvcnlfZXZlbnRfdHJhY2tlci9IaXN0b3J5RXZlbnRMaXN0ZW5lcic7XG4vKipcbiAqIGNsYXNzIHRvIGltcGxlbWVudCBwcm9wZXIgYmVoYXZpb3IgdG8gZXhpdCBzdGlja3kgcm9vbXMgd2hlbiB0aGUgYmFjayBidXR0b24gaXMgaGl0XG4gKiB0aGUgbm9uLWNhY2hlZCBsb2dpYyBpcyBpbiBzdGlja3ktcm9vbS5qc1xuICovXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBCYWNrQnV0dG9uUmVkaXJlY3QgZXh0ZW5kcyBIaXN0b3J5RXZlbnRMaXN0ZW5lciB7XG4gICAgY29uc3RydWN0b3IodHJhY2tlcikge1xuICAgICAgICBzdXBlcih0cmFja2VyKTtcbiAgICAgICAgdGhpcy5fY2FjaGVGYWxsYmFjaygpO1xuICAgIH1cblxuICAgIG9uTG9hZChzdGF0ZXMpIHtcbiAgICAgICAgaWYgKHdpbmRvdy5PdmVyRHJpdmUuY3VycmVudFJvb20pIHtcbiAgICAgICAgICAgIHRoaXMuZ2V0VHJhY2tlcigpLmFkZERhdGFUb0xhdGVzdCgncm9vbUtleScsIHdpbmRvdy5PdmVyRHJpdmUuY3VycmVudFJvb20udXJsUGF0aCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdldFRyYWNrZXIoKS5hZGREYXRhVG9MYXRlc3QoJ3Jvb21LZXknLCAnc2l0ZS1kZWZhdWx0Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cblxuICAgIC8qKlxuICAgICAqIERlbGV0ZSBwZXJzaXN0ZW50IHJvb20gY29va2llIGlmIHVzZXIgZW5kcyB1cCBvbiBtYWluIHNpdGUgd2hpbGUgaGF2aW5nIGEgcHJlZmVycmVkIHJvb21cbiAgICAgKiBPbmx5IGFwcGxpY2FibGUgd2hlbiB0aGUgdXNlciBoaXRzIHRoZSBicm93c2VyJ3MgYmFjayBidXR0b24gYW5kIHRoZSBwYWdlIGlzIGxvYWRlZCBieSBicm93c2VyIGNhY2hlXG4gICAgICovXG4gICAgX2NhY2hlRmFsbGJhY2soKSB7XG4gICAgICAgIHdpbmRvdy5oYXNQcmVmZXJyZWRSb29tID0gISFDb29raWVzLmdldCgncHJlZmVycmVkLXJvb20nKTtcbiAgICAgICAgaWYgKCF3aW5kb3cuT3ZlckRyaXZlLmN1cnJlbnRSb29tICYmIHdpbmRvdy5oYXNQcmVmZXJyZWRSb29tKSB7XG4gICAgICAgICAgICBDb29raWVzLnJlbW92ZSgncHJlZmVycmVkLXJvb20nLCB7cGF0aDogJy8nLCBkb21haW46IGxvY2F0aW9uLmhvc3RuYW1lfSk7XG4gICAgICAgICAgICB3aW5kb3cuaGFzUHJlZmVycmVkUm9vbSA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2hlY2tib3ggZXh0ZW5kcyBCYWNrYm9uZS5WaWV3IHtcbiAgICB0ZW1wbGF0ZSh7Y2xhc3NOYW1lLCBuYW1lLCBsYWJlbCwgYXJpYUxhYmVsfSkge1xuICAgICAgICByZXR1cm4gYFxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSdjdXN0b20tY2hlY2tib3gnPlxuICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSdjaGVja2JveCcgbmFtZT0nJHtuYW1lfScgY2xhc3M9JyR7Y2xhc3NOYW1lfScgYXJpYS1sYWJlbD0nJHthcmlhTGFiZWx9Jy8+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9J2ljb24gaWNvbi1jaGVja2VkJz48L2k+XG4gICAgICAgICAgICAgICAgPGkgY2xhc3M9J2ljb24gaWNvbi11bmNoZWNrZWQnPjwvaT5cbiAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0nY2hlY2tib3gtbGFiZWwnPiR7bGFiZWx9PC9zcGFuPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwianMtc2F2ZWQgU2F2ZWQtY29udGFpbmVyXCI+PC9zcGFuPlxuICAgICAgICAgICAgPC9sYWJlbD5gO1xuICAgIH1cblxuICAgIGdldCBldmVudHMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAnY2hhbmdlIFt0eXBlPWNoZWNrYm94XSc6IChlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdjaGFuZ2UnLCBlLmN1cnJlbnRUYXJnZXQuY2hlY2tlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoeyBjbGFzc05hbWUsIG5hbWUsIGxhYmVsLCBhcmlhTGFiZWx9KSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG5cbiAgICAgICAgXy5leHRlbmQodGhpcywgYXJndW1lbnRzWzBdKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIHRoaXMuJGVsLmVtcHR5KCkuYXBwZW5kKHRoaXMudGVtcGxhdGUodGhpcykpO1xuXG4gICAgICAgIHRoaXMuJGNoZWNrYm94ID0gdGhpcy4kZWwuZmluZCgnW3R5cGU9Y2hlY2tib3hdOmZpcnN0Jyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgc2V0KGNoZWNrZWQpIHtcbiAgICAgICAgdGhpcy4kY2hlY2tib3gucHJvcCgnY2hlY2tlZCcsIGNoZWNrZWQpLmNoYW5nZSgpO1xuICAgIH1cbn1cbiIsImltcG9ydCBRdWVyeVN0cmluZyBmcm9tICdxdWVyeXN0cmluZyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhhc2hNYW5hZ2VyIHtcblxuICAgIHN0YXRpYyBwYXJzZSgpIHtcbiAgICAgICAgbGV0IGhhc2hPYmplY3QgPSBRdWVyeVN0cmluZy5wYXJzZShsb2NhdGlvbi5oYXNoLnN1YnN0cigxKSk7XG5cbiAgICAgICAgXy5rZXlzKGhhc2hPYmplY3QpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgaGFzaE9iamVjdFtrZXldID0gXy5mbGF0dGVuKFtoYXNoT2JqZWN0W2tleV0gfHwgW11dKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIGhhc2hPYmplY3Q7XG4gICAgfVxuXG4gICAgc3RhdGljIHVwZGF0ZShvYmplY3QpIHtcbiAgICAgICAgbGV0IG5ld0hhc2ggPSBRdWVyeVN0cmluZy5zdHJpbmdpZnkob2JqZWN0KTtcbiAgICAgICAgaWYgKG5ld0hhc2ggIT09ICcmJyl7XG4gICAgICAgICAgICBsb2NhdGlvbi5oYXNoID0gbmV3SGFzaDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHN0YXRpYyBnZXQoa2V5KSB7XG4gICAgICAgIGxldCByZXNwb25zZSA9IHRoaXMucGFyc2UoKTtcblxuICAgICAgICBpZiAoXy5pc1N0cmluZyhrZXkpKSB7XG4gICAgICAgICAgICByZXR1cm4gcmVzcG9uc2Vba2V5XTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICB9XG5cbiAgICBzdGF0aWMgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgbGV0IGhhc2ggPSB0aGlzLnBhcnNlKCk7XG5cbiAgICAgICAgaGFzaFtrZXldID0gXy5mbGF0dGVuKFt2YWx1ZV0pO1xuXG4gICAgICAgIHRoaXMudXBkYXRlKGhhc2gpO1xuICAgIH1cblxuICAgIHN0YXRpYyBwdXNoKGtleSwgdmFsdWUpIHtcbiAgICAgICAgbGV0IGhhc2ggPSB0aGlzLnBhcnNlKCk7XG5cbiAgICAgICAgaGFzaFtrZXldID0gaGFzaFtrZXldIHx8IFtdO1xuICAgICAgICBoYXNoW2tleV0ucHVzaCh2YWx1ZSk7XG5cbiAgICAgICAgdGhpcy51cGRhdGUoaGFzaCk7XG4gICAgfVxuXG4gICAgc3RhdGljIHJlbW92ZShrZXkpIHtcbiAgICAgICAgbGV0IGhhc2ggPSB0aGlzLnBhcnNlKCk7XG5cbiAgICAgICAgaGFzaFtrZXldICYmIGRlbGV0ZSBoYXNoW2tleV07XG5cbiAgICAgICAgdGhpcy51cGRhdGUoaGFzaCk7XG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgUmFkaW9CdXR0b24gZXh0ZW5kcyBCYWNrYm9uZS5WaWV3IHtcbiAgICB0ZW1wbGF0ZSh7dmFsdWUsIGNoZWNrZWQsIGNsYXNzTmFtZSwgbmFtZSwgbGFiZWwsIGFyaWFMYWJlbCwgcmlkfSkge1xuICAgICAgICByZXR1cm4gYFxuICAgICAgICAgICAgPGxhYmVsIGNsYXNzPSdjdXN0b20tcmFkaW8nPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPSdjdXN0b20tcmFkaW8tYnV0dG9uJz5cbiAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9J3JhZGlvJyB2YWx1ZT0nJHt2YWx1ZX0nIG5hbWU9JyR7bmFtZX0tJHtyaWR9JyBjbGFzcz0nJHtjbGFzc05hbWV9JyBhcmlhLWxhYmVsPScke2FyaWFMYWJlbH0nICR7Y2hlY2tlZCA/ICdjaGVja2VkJyA6ICcnfSAvPlxuICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz0naWNvbiBpY29uLXJhZGlvLXVuc2VsZWN0ZWQnPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgPGkgY2xhc3M9J2ljb24gaWNvbi1yYWRpby1zZWxlY3RlZCBzZWNvbmRhcnktY29sb3InPjwvaT5cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9J2N1c3RvbS1yYWRpby10ZXh0Jz5cbiAgICAgICAgICAgICAgICAgICAgJHtsYWJlbH1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2xhYmVsPmA7XG4gICAgfVxuXG4gICAgZ2V0IGV2ZW50cygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICdjaGFuZ2UgW3R5cGU9cmFkaW9dJzogKGUpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2NoYW5nZScsIGUuY3VycmVudFRhcmdldC5jaGVja2VkKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcih7IGNsYXNzTmFtZSwgbmFtZSwgbGFiZWwsIGFyaWFMYWJlbCwgcmlkfSkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuXG4gICAgICAgIF8uZXh0ZW5kKHRoaXMsIGFyZ3VtZW50c1swXSk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICB0aGlzLiRlbC5lbXB0eSgpLmFwcGVuZCh0aGlzLnRlbXBsYXRlKHRoaXMpKTtcblxuICAgICAgICB0aGlzLiRyYWRpbyA9IHRoaXMuJGVsLmZpbmQoJ1t0eXBlPXJhZGlvXTpmaXJzdCcpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHNldChjaGVja2VkKSB7XG4gICAgICAgIHRoaXMuJHJhZGlvLnByb3AoJ2NoZWNrZWQnLCBjaGVja2VkKS5jaGFuZ2UoKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBNb2RhbCB9IGZyb20gJy4vbW9kYWwnO1xuXG5jbGFzcyBDb25maXJtRGlhbG9nIGV4dGVuZHMgTW9kYWwge1xuICAgIGNvbnN0cnVjdG9yKG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIob3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy4kZWwuYXBwZW5kKCQodGhpcy5idXR0b25UZW1wbGF0ZSkpO1xuXG4gICAgICAgIHRoaXMuJGJ1dHRvblN1Ym1pdCAgPSB0aGlzLiRlbC5maW5kKCcuYnV0dG9uLnN1Ym1pdCcpO1xuICAgICAgICB0aGlzLiRidXR0b25DYW5jZWwgID0gdGhpcy4kZWwuZmluZCgnLmJ1dHRvbi5jYW5jZWwnKTtcblxuICAgICAgICB0aGlzLmJpbmRFdmVudHMoKTtcblxuICAgICAgICB0aGlzLl9yZW5kZXIoKTtcbiAgICB9XG5cbiAgICAvLyBXZSBkb250IGFjdHVhbGx5IHdhbnQgdG8gdXNlIHRoZSBGb3VuZGF0aW9uIG1vZGFsIGV2ZW50cyBzaW5jZSB0aGV5IGdldCB3ZWlyZCBmYXN0Li4uXG4gICAgLy8gbGV0cyB1c2Ugb3VyIG93biBzbyBjb25zdW1lcnMgZG9udCBoYXZlIHRvIGtub3cgaXRzIGZvdW5kYXRpb25cbiAgICBiaW5kRXZlbnRzKCkge1xuICAgICAgICB0aGlzLiRidXR0b25TdWJtaXQub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdzdWJtaXQnLCB0aGlzKTtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignY2xvc2UnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy4kYnV0dG9uQ2FuY2VsLm9uKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2NhbmNlbCcsIHRoaXMpO1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdjbG9zZScpO1xuICAgICAgICB9KS5vbigna2V5ZG93bicsIChlKSA9PiBlLnN0b3BQcm9wYWdhdGlvbik7XG4gICAgfVxuXG4gICAgZ2V0IGJ1dHRvblRlbXBsYXRlKCkge1xuICAgICAgICByZXR1cm4gJChgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWNvbnRhaW5lciAke3RoaXMuYnV0dG9uQWxpZ24gfHwgJ3JpZ2h0J31cIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ1dHRvbiBzdWJtaXQgcmFkaXVzIG1hcmdpbi1zbWFsbCB1LWFsbENhcHMgc2Vjb25kYXJ5XCI+JHt0aGlzLnN1Ym1pdFRleHR9PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidXR0b24gY2FuY2VsIHJhZGl1cyBtYXJnaW4tc21hbGwgdS1hbGxDYXBzIG91dGxpbmUgZ3JheVwiPiR7dGhpcy5jYW5jZWxUZXh0fTwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIGApO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQ29uZmlybURpYWxvZztcbiIsImltcG9ydCBrZXlzICAgICAgICAgICAgIGZyb20gJy4uLy4uL3V0aWwva2V5Y29kZXMnO1xuaW1wb3J0IE1vZGFsVGVtcGxhdGUgICAgZnJvbSAnLi90ZW1wbGF0ZXMvbW9kYWwuaHRtbCc7XG5cbmNsYXNzIE1vZGFsIGV4dGVuZHMgQmFja2JvbmUuVmlldyB7XG5cbiAgICBnZXQgZGVmYXVsdHMoKSB7XG4gICAgICAgIC8vIFdoZW4gdGhlIGZsYWcgaXMgZW5hYmxlZCwgY2xvc2VPbkVzYyBtdXN0IGFsd2F5cyBiZSBGQUxTRVxuICAgICAgICAvLyB0byBlbnN1cmUgdGhhdCB0aGUgRVNDIGtleSBiZWhhdmlvciBkZWZpbmVkIGluIF9iaW5kRXZlbnRzKCkgZXhlY3V0ZXMgcHJvcGVybHkuXG4gICAgICAgIC8vIERvIG5vdCBtb2RpZnkgdGhpcyB2YWx1ZSB3aGVuIGNhbGxpbmcgYSBuZXcgbW9kYWwuXG4gICAgICAgIHZhciBjbG9zZU1vZGFsT25Fc2MgPSB3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdjbG9zZS1kcm9wZG93bnMtb24tZXNjJykgPyBmYWxzZSA6IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGF1dG9TaG93ICAgICAgICAgICAgICAgIDogdHJ1ZSxcbiAgICAgICAgICAgIGF1dG9SZW5kZXIgICAgICAgICAgICAgIDogdHJ1ZSxcbiAgICAgICAgICAgIGNsb3NlT25Fc2MgICAgICAgICAgICAgIDogY2xvc2VNb2RhbE9uRXNjLFxuICAgICAgICAgICAgY2xvc2VPbkJsdXIgICAgICAgICAgICAgOiB0cnVlLFxuXG4gICAgICAgICAgICBpZCAgICAgICAgICAgICAgICAgICAgICA6ICcnLFxuICAgICAgICAgICAgY2xhc3NlcyAgICAgICAgICAgICAgICAgOiBbJ3NtYWxsJ10sXG4gICAgICAgICAgICBidXR0b25BbGlnbiAgICAgICAgICAgICA6ICdyaWdodCcsXG4gICAgICAgICAgICB0aXRsZSAgICAgICAgICAgICAgICAgICA6ICdUaXRsZScsXG4gICAgICAgICAgICBoaWRkZW5UaXRsZSAgICAgICAgICAgICA6IGZhbHNlLFxuICAgICAgICAgICAgY29udGVudCAgICAgICAgICAgICAgICAgOiAnU29tZSBDb250ZW50JyxcbiAgICAgICAgICAgIHN1Ym1pdFRleHQgICAgICAgICAgICAgIDogaHRtbCgnb2snKSxcbiAgICAgICAgICAgIGNhbmNlbFRleHQgICAgICAgICAgICAgIDogaHRtbCgnY2FuY2VsJyksXG4gICAgICAgICAgICBhdHRhY2hUb0RvY3VtZW50ICAgICAgICA6IHRydWUsXG4gICAgICAgICAgICBkZWZhdWx0QnV0dG9uQmVoYXZpb3VyICA6IHRydWUsXG4gICAgICAgICAgICBzaG93Q2xvc2VCdXR0b24gICAgICAgICA6IHRydWVcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBpbml0aWFsaXplKG9wdGlvbnMpIHtcbiAgICAgICAgXy5leHRlbmQodGhpcywgdGhpcy5kZWZhdWx0cywgb3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy50cGwgPSBNb2RhbFRlbXBsYXRlO1xuICAgICAgICB0aGlzLnNldEVsZW1lbnQodGhpcy50cGwodGhpcykpO1xuXG4gICAgICAgIGlmICh0aGlzLmlkLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy4kZWwuYXR0cignaWQnLCB0aGlzLmlkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuJGNvbnRlbnQgPSB0aGlzLiRlbC5maW5kKCcubW9kYWwtY29udGFpbmVyJyk7XG5cbiAgICAgICAgdGhpcy4kY29udGVudC5lbXB0eSgpLmFwcGVuZCh0aGlzLmNvbnRlbnQpO1xuXG4gICAgICAgIHRoaXMuJGVsLmFkZENsYXNzKHRoaXMuY2xhc3Nlcy5qb2luKCcgJykpO1xuXG4gICAgICAgIHRoaXMuJHRpdGxlID0gdGhpcy4kZWwuZmluZCgnLm1vZGFsLXRpdGxlJyk7XG5cbiAgICAgICAgaWYgKHRoaXMuaGlkZGVuVGl0bGUpIHtcbiAgICAgICAgICAgIHRoaXMuJHRpdGxlLmNzcyhcIm9wYWNpdHlcIiwgXCIwXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYXV0b1JlbmRlcikge1xuICAgICAgICAgICAgdGhpcy5fcmVuZGVyKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLl9iaW5kRXZlbnRzKCk7XG4gICAgfVxuXG4gICAgX3JlbmRlcigpIHtcbiAgICAgICAgaWYgKHRoaXMuYXR0YWNoVG9Eb2N1bWVudCkge1xuICAgICAgICAgICAgLy8gRm9yIEZvdW5kYXRpb24gdG8gd29yayBhcyBleHBlY3RlZCB3ZSBuZWVkIHRvIGhhdmUgdGhlIGVsZW1lbnQgYXR0YWNoZWQgdG8gdGhlIERPTSBiZWZvcmUgY2FsbGluZyAuZm91bmRhdGlvbigncmV2ZWFsJywgJ29wZW4nKVxuICAgICAgICAgICAgJCgnYm9keScpLmFwcGVuZCh0aGlzLmVsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmF1dG9TaG93KSB7XG4gICAgICAgICAgICB0aGlzLnNob3coKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlzU2VsZWN0RXZlbnQgPSAoZSkgPT4gKGUudHlwZSA9PT0gJ2NsaWNrJyB8fCBlLndoaWNoID09PSAxMyB8fCBlLndoaWNoID09PSAzMikgJiYgKGUucHJldmVudERlZmF1bHQoKSB8fCB0cnVlKTtcblxuICAgIC8vIFdlIGRvbnQgYWN0dWFsbHkgd2FudCB0byB1c2UgdGhlIEZvdW5kYXRpb24gbW9kYWwgZXZlbnRzIHNpbmNlIHRoZXkgZ2V0IHdlaXJkIGZhc3QuLi5cbiAgICAvLyBsZXRzIHVzZSBvdXIgb3duIHNvIGNvbnN1bWVycyBkb250IGhhdmUgdG8ga25vdyBpdHMgZm91bmRhdGlvblxuICAgIF9iaW5kRXZlbnRzKCkge1xuICAgICAgICB0aGlzLiRlbC5vbignY2xpY2sga2V5ZG93bicsICcuanMtY2xvc2UnLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc1NlbGVjdEV2ZW50KGUpICYmIHRoaXMudHJpZ2dlcignY2FuY2VsJywgdGhpcyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLmRlZmF1bHRCdXR0b25CZWhhdmlvdXIpIHtcbiAgICAgICAgICAgIHRoaXMub24oJ2Nsb3NlIGNhbmNlbCcsICgpID0+IHsgdGhpcy5jbG9zZSgpOyB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuJGVsLm9uKCdrZXlwcmVzcycsICcqJywgKGUpID0+IHtcbiAgICAgICAgICAgIGlmIChlLndoaWNoID09PSBrZXlzLlRBQikge1xuICAgICAgICAgICAgICAgIHRoaXMuX2tlZXBGb2N1cyhlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYod2luZG93LmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnY2xvc2UtZHJvcGRvd25zLW9uLWVzYycpKSB7XG4gICAgICAgICAgICAvLyBQcmV2ZW50IEVTQyBmcm9tIGNsb3NpbmcgbW9kYWwgd2hlbiA8c2VsZWN0PiBlbGVtZW50cyBhcmUgb3BlblxuICAgICAgICAgICAgdGhpcy4kZWwub24oJ2NsaWNrIGtleWRvd24ga2V5dXAnLCAnc2VsZWN0JywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHZhciBjb3JyZWN0RXZlbnRUeXBlID0gZS50eXBlID09PSAnY2xpY2snIHx8IGUud2hpY2ggPT09IGtleXMuRU5URVIgfHwgZS53aGljaCA9PT0ga2V5cy5FU0M7XG4gICAgICAgICAgICAgICAgaWYoIWNvcnJlY3RFdmVudFR5cGUpIHJldHVybjtcblxuICAgICAgICAgICAgICAgIHZhciBzZWxlY3RPcGVuID0gJCh0aGlzKS5hdHRyKCdkYXRhLW9wZW4nKTtcblxuICAgICAgICAgICAgICAgIGlmKHNlbGVjdE9wZW4gPT09IFwidHJ1ZVwiKSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cignZGF0YS1vcGVuJywgXCJmYWxzZVwiKTtcbiAgICAgICAgICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgXG4gICAgICAgICAgICAgICAgaWYoKHNlbGVjdE9wZW4gPT09IFwiZmFsc2VcIiB8fCBzZWxlY3RPcGVuID09IG51bGwpICYmIGUud2hpY2ggIT09IGtleXMuRVNDKSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cignZGF0YS1vcGVuJywgXCJ0cnVlXCIpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLiRlbC5vbignYmx1cicsICdzZWxlY3QnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMpLmF0dHIoJ2RhdGEtb3BlbicsIFwiZmFsc2VcIik7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gQ2xvc2UgbW9kYWxzIHdpdGggRVNDXG4gICAgICAgICAgICB0aGlzLiRlbC5vbigna2V5dXAnLCAoZSkgPT4ge1xuICAgICAgICAgICAgICAgIHZhciBzZWxlY3RJc05vdE9wZW4gPSAhJCgnc2VsZWN0JykuaXMoXCI6Zm9jdXNcIikgfHwgJChcIjpmb2N1c1wiKS5hdHRyKCdkYXRhLW9wZW4nKSAhPT0gXCJ0cnVlXCI7XG4gICAgICAgICAgICAgICAgaWYgKGUud2hpY2ggPT09IGtleXMuRVNDICYmIHNlbGVjdElzTm90T3BlbiAmJiAkKCcuZi1vcGVuLWRyb3Bkb3duJykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlcignY2FuY2VsJywgdGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzaG93KCkge1xuICAgICAgICB0aGlzLl9iZWZvcmVTaG93KCk7XG4gICAgICAgIHRoaXMuJGVsLmZvdW5kYXRpb24oJ3JldmVhbCcsICdvcGVuJyk7XG4gICAgICAgIHRoaXMudHJpZ2dlcignc2hvdycsIHRoaXMpO1xuXG4gICAgICAgIHRoaXMuJGVsLm9uKCdrZXlkb3duJywgKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX2tlZXBGb2N1cyhlKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRXhlY3V0ZSBjb2RlIGFmdGVyIHRoZSBtb2RhbCBpcyBkaXNwbGF5ZWRcbiAgICAgICAgdGhpcy4kZWwub24oJ29wZW5lZC5mbmR0bi5yZXZlYWwnLCAoKSA9PiB0aGlzLl9hZnRlclNob3coKSk7XG5cbiAgICAgICAgLy8gVHJhcHMgZm91bmRhdGlvbiBidWcgdGhhdCBjbG9zZXMgbW9kYWwgb24gZHJvcGRvd24gXCJjbG9zZWRcIiwgbm90IGFuIGlzc3VlIGluIDUuNS4zK1xuICAgICAgICB0aGlzLiRlbC5vZmYoJ2Nsb3NlZCcpO1xuXG4gICAgICAgIC8vIEhhbmRsZSBmb3VuZGF0aW9uICBjbG9zZSBldmVudHMgZnJvbSBFU0MgYW5kIEJHIGNsaWNrc1xuICAgICAgICB0aGlzLiRlbC5vbignY2xvc2UuZm5kdG4ucmV2ZWFsJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy4kZWwub2ZmKCdjbG9zZS5mbmR0bi5yZXZlYWwnKTtcbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignY2xvc2UnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2JlZm9yZVNob3coKSB7XG4gICAgICAgIHRoaXMuZm9jdXNlZCA9ICQoZG9jdW1lbnQuYWN0aXZlRWxlbWVudCk7XG4gICAgfVxuXG4gICAgX2FmdGVyU2hvdygpIHtcbiAgICAgICAgdGhpcy4kZWwuYXR0cignYXJpYS1oaWRkZW4nLCBmYWxzZSk7XG4gICAgICAgICQoJy5jb250YWluZXInKS5hdHRyKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG4gICAgICAgICQoJy5yb3cuZm9vdGVyJykuYXR0cignYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgICAgICAkKCcubmF2LWNvbnRhaW5lcicpLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcblxuICAgICAgICB0aGlzLiR0aXRsZS5mb2N1cygpO1xuICAgICAgICB0aGlzLl9zZXRTY3JvbGwoKTtcbiAgICB9XG5cbiAgICBfc2V0U2Nyb2xsKCkge1xuICAgICAgICBsZXQgb2Zmc2V0ID0gd2luZG93LnBhZ2VZT2Zmc2V0IC0gcGFyc2VJbnQodGhpcy4kZWwuY3NzKCd0b3AnKS5zbGljZSgwLCAtMiksIDEwKTsgLy8gdGhlICd0b3AnIHN0eWxpbmcgaXMgYmFrZWQgaW4gYnkgZm91bmRhdGlvblxuICAgICAgICBpZiAod2luZG93LmlubmVySGVpZ2h0IDwgdGhpcy5lbC5vZmZzZXRIZWlnaHQgLSBvZmZzZXQpIHsgLy8gc2Nyb2xsIHRhbGwgbW9kYWxzIGludG8gdmlldyBhcyBtdWNoIGFzIGZpdHNcbiAgICAgICAgICAgIG9mZnNldCA9IE1hdGgubWluKHRoaXMuZWwub2Zmc2V0SGVpZ2h0IC0gd2luZG93LmlubmVySGVpZ2h0ICsgMTAsIC01KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh3aW5kb3cuaW5uZXJXaWR0aCA8IDY0MSkgeyAvLyBtb2JpbGUgdmlldyBwYWRkaW5nXG4gICAgICAgICAgICBvZmZzZXQgLT0gNTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVsLnNjcm9sbEludG9WaWV3KCk7IC8vIHNldHMgc2Nyb2xsIHRvIHRvcCBvZiBtb2RhbFxuICAgICAgICB3aW5kb3cuc2Nyb2xsQnkoMCwgb2Zmc2V0KTsgLy8gYWRqdXN0cyBzY3JvbGwgYWNjb3JkaW5nIHRvIGNhbGN1bGF0ZWQgb2Zmc2V0XG4gICAgfVxuXG4gICAgX2tlZXBGb2N1cyhlKSB7XG4gICAgICAgIGNvbnN0IGFjdGl2ZUVsZW0gPSAkKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuICAgICAgICBjb25zdCBmaXJzdEZvY3VzYWJsZSA9IHRoaXMuJHRpdGxlIHx8IHRoaXMuJGVsLmZpbmQoJzpmb2N1c2FibGU6dmlzaWJsZScpLmZpcnN0KCk7XG4gICAgICAgIGNvbnN0IGxhc3RGb2N1c2FibGUgPSB0aGlzLiRlbC5maW5kKCc6Zm9jdXNhYmxlOnZpc2libGUnKS5sYXN0KCk7XG5cbiAgICAgICAgaWYgKGFjdGl2ZUVsZW0uaXMoZmlyc3RGb2N1c2FibGUpICYmIGUud2hpY2ggPT09IGtleXMuVEFCICYmIGUuc2hpZnRLZXkpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGxhc3RGb2N1c2FibGUuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIGlmICgkKGFjdGl2ZUVsZW0pLmlzKGxhc3RGb2N1c2FibGUpICYmIGUud2hpY2ggPT09IGtleXMuVEFCICYmICFlLnNoaWZ0S2V5KSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICBmaXJzdEZvY3VzYWJsZS5mb2N1cygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy4kZWwuZm91bmRhdGlvbigncmV2ZWFsJywgJ2Nsb3NlJyk7XG4gICAgICAgIHRoaXMudHJpZ2dlcignaGlkZScsIHRoaXMpO1xuICAgICAgICAkKCcuY29udGFpbmVyJykuYXR0cignYXJpYS1oaWRkZW4nLCAnZmFsc2UnKTtcbiAgICAgICAgJCgnLnJvdy5mb290ZXInKS5hdHRyKCdhcmlhLWhpZGRlbicsICdmYWxzZScpO1xuICAgICAgICAkKCcubmF2LWNvbnRhaW5lcicpLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7XG4gICAgICAgIHRoaXMuZm9jdXNlZC5mb2N1cygpO1xuICAgIH1cblxuICAgIGNsb3NlKCkge1xuICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICB9XG59XG5cbmV4cG9ydCB7IE1vZGFsIH07XG4iLCJleHBvcnQgZGVmYXVsdCAoe3RpdGxlLCBjbG9zZU9uRXNjLCBjbG9zZU9uQmx1ciwgc2hvd0Nsb3NlQnV0dG9ufSkgPT4gYDxkaXYgY2xhc3M9XCJyZXZlYWwtbW9kYWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIiByb2xlPVwiZGlhbG9nXCIgZGF0YS1yZXZlYWwgZGF0YS1vcHRpb25zPVwiY2xvc2Vfb25fZXNjOiR7IGNsb3NlT25Fc2MgfTtjbG9zZV9vbl9iYWNrZ3JvdW5kX2NsaWNrOiR7IGNsb3NlT25CbHVyIH07XCI+XG4gICAgPGRpdiBjbGFzcz1cIm1vZGFsLWhlYWRlclwiPlxuICAgICAgICA8aDIgY2xhc3M9XCJtb2RhbC10aXRsZSBwcmltYXJ5LWNvbG9yXCIgdGFiaW5kZXg9XCIwXCI+JHsgdGl0bGUgfTwvaDI+XG4gICAgICAgICR7c2hvd0Nsb3NlQnV0dG9uID8gYDxhIGNsYXNzPVwiY2xvc2UtcmV2ZWFsLW1vZGFsIGpzLWNsb3NlXCIgcm9sZT1cImJ1dHRvblwiIGFyaWEtbGFiZWw9XCIkeyB3aW5kb3cuaHRtbCgnY2xvc2UnKSB9XCIgdGFiaW5kZXg9XCIwXCI+JiMyMTU7PC9hPmAgOiAnJ31cbiAgICA8L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJtb2RhbC1jb250YWluZXJcIj48L2Rpdj5cbjwvZGl2PmA7XG4iLCJjb25zdCB7IHRleHQgfSA9IHdpbmRvdztcblxuY29uc3QgX2dldEFjY2Vzc2liaWxpdHlTZXR0aW5ncyA9ICgpID0+IHtcbiAgICBjb25zdCB7IGhpZ2hDb250cmFzdCwgZHlzbGV4aWMgfSA9IHdpbmRvdy5PdmVyRHJpdmU7XG4gICAgY29uc3QgYWNjZXNzaWJpbGl0eVNldHRpbmdzID0gW107XG4gICAgaWYgKGhpZ2hDb250cmFzdCkge1xuICAgICAgICBhY2Nlc3NpYmlsaXR5U2V0dGluZ3MucHVzaCgnaGlnaC1jb250cmFzdD0xJyk7XG4gICAgfVxuICAgIGlmIChkeXNsZXhpYykge1xuICAgICAgICBhY2Nlc3NpYmlsaXR5U2V0dGluZ3MucHVzaCgnZHlzbGV4aWM9MScpO1xuICAgIH1cblxuICAgIGlmIChhY2Nlc3NpYmlsaXR5U2V0dGluZ3MubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICByZXR1cm4gYD8ke2FjY2Vzc2liaWxpdHlTZXR0aW5ncy5qb2luKCcmJyl9YDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCBhY2Nlc3NpYmlsaXR5U2V0dGluZ3MgPSBfZ2V0QWNjZXNzaWJpbGl0eVNldHRpbmdzKCk7XG5cbiAgICByZXR1cm4gYFxuICAgIDxkaXY+JHt0ZXh0KCdnZHByLnNldHRpbmdzUGFuZWwuc3VtbWFyeScpfTwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJvcHRpb25Db250YWluZXJcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJpY29uLWNoZWNrXCI+PC9pPlxuICAgICAgICA8aDMgY2xhc3M9XCJyZXF1aXJlZEhlYWRpbmdcIj4ke3RleHQoXG4gICAgICAgICAgICAnZ2Rwci5zZXR0aW5nc1BhbmVsLnJlcXVpcmVkSGVhZGluZydcbiAgICAgICAgKX08L2gzPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsU3VidGV4dCByZXF1aXJlZFN1YnRleHRcIj4ke3RleHQoXG4gICAgICAgICAgICAnZ2Rwci5zZXR0aW5nc1BhbmVsLnJlcXVpcmVkQm9keSdcbiAgICAgICAgKX08L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm9wdGlvbkNvbnRhaW5lclwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cInBlcmZDb29raWVDaGVja2JveFwiPjwvc3Bhbj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJsYWJlbFN1YnRleHRcIj4ke3RleHQoXG4gICAgICAgICAgICAnZ2Rwci5zZXR0aW5nc1BhbmVsLnBlcmZvcm1hbmNlQm9keSdcbiAgICAgICAgKX08L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIm9wdGlvbkNvbnRhaW5lclwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImFuYWx5dGljc0Nvb2tpZUNoZWNrYm94XCI+PC9zcGFuPlxuICAgICAgICA8c3BhbiBjbGFzcz1cImxhYmVsU3VidGV4dFwiPiR7dGV4dChcbiAgICAgICAgICAgICdnZHByLnNldHRpbmdzUGFuZWwuYW5hbHl0aWNzQm9keSdcbiAgICAgICAgKX08L3NwYW4+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImRpdmlkZXJcIj48L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiYWRkZW5kdW1cIj5cbiAgICAgICAgJHt0ZXh0KCdnZHByLnNldHRpbmdzUGFuZWwuYWRkZW5kdW0nLCB7XG4gICAgICAgICAgICBjb29raWVQb2xpY3lMaW5rOiBgPGEgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9yZWZlcnJlclwiIGhyZWY9XCJodHRwczovL2NvbXBhbnkuY2RuLm92ZXJkcml2ZS5jb20vcG9saWNpZXMvY29va2llLXBvbGljeS5odG0ke2FjY2Vzc2liaWxpdHlTZXR0aW5nc31cIj4ke3RleHQoXG4gICAgICAgICAgICAgICAgJ2dkcHIuY29va2llUG9saWN5J1xuICAgICAgICAgICAgKX08L2E+YCxcbiAgICAgICAgICAgIHByaXZhY3lQb2xpY3lMaW5rOiBgPGEgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9yZWZlcnJlclwiIGhyZWY9XCJodHRwczovL2NvbXBhbnkuY2RuLm92ZXJkcml2ZS5jb20vcG9saWNpZXMvcHJpdmFjeS1wb2xpY3kuaHRtJHthY2Nlc3NpYmlsaXR5U2V0dGluZ3N9XCI+JHt0ZXh0KFxuICAgICAgICAgICAgICAgICdmb290ZXJQcml2YWN5UG9saWN5J1xuICAgICAgICAgICAgKX08L2E+YCxcbiAgICAgICAgfSl9XG4gICAgPC9kaXY+XG5cblxuICAgIDxidXR0b24gY2xhc3M9XCJjb25maXJtIGJ1dHRvbiByYWRpdXMgbWFyZ2luLXNtYWxsIHNlY29uZGFyeSByaWdodFwiPiR7dGV4dChcbiAgICAgICAgJ2dkcHIuc2V0dGluZ3NQYW5lbC5jb25maXJtJ1xuICAgICl9PC9idXR0b24+XG5cbmA7XG59XG4iLCJpbXBvcnQge01vZGFsIH0gZnJvbSAnLi4vY29tbW9uL21vZGFsJztcbmltcG9ydCBDaGVja2JveCBmcm9tICcuLi9jb21tb24vQ2hlY2tib3gnO1xuaW1wb3J0IHRlbXBsYXRlIGZyb20gJy4vY29va2llU2V0dGluZ3NNb2RhbC5odG1sJztcbmltcG9ydCBPZFRyYWNrIGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9PZFRyYWNrJztcbmltcG9ydCBDb29raWVDb25maWcgZnJvbSAnLi4vLi4vLi4vLi4vbGliL2Nvb2tpZUNvbmZpZyc7XG5cbmNvbnN0IHsgQ29va2llcywgT3ZlckRyaXZlIH0gPSB3aW5kb3c7XG5jb25zdCB7IHJlbG9hZCB9ID0gbG9jYXRpb247XG5jb25zdCB7IG9kVHJhY2sgfSA9IENvb2tpZUNvbmZpZztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29va2llU2V0dGluZ3NNb2RhbCBleHRlbmRzIEJhY2tib25lLlZpZXcge1xuXG4gICAgQ09PS0lFX05BTUUgPSAnb2RfdHJhY2snO1xuXG4gICAgY29uc3RydWN0b3Iob3B0cyl7XG4gICAgICAgIHN1cGVyKG9wdHMpO1xuXG4gICAgICAgIHRoaXMub2RUcmFjayA9IG5ldyBPZFRyYWNrKENvb2tpZXMuZ2V0KHRoaXMuQ09PS0lFX05BTUUpLCBPdmVyRHJpdmUuaXNHZHByQ291bnRyeSk7XG4gICAgICAgIHRoaXMuaXNEaXNtaXNzYWJsZSA9IG9wdHMuaXNEaXNtaXNzYWJsZTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG5cbiAgICAgICAgdGhpcy4kZWwuZW1wdHkoKS5hcHBlbmQodGVtcGxhdGUoKSk7XG5cbiAgICAgICAgdGhpcy5wZXJmQ29va2llQ2hlY2tib3ggPSBuZXcgQ2hlY2tib3goe1xuICAgICAgICAgICAgZWw6IHRoaXMuJGVsLmZpbmQoJy5wZXJmQ29va2llQ2hlY2tib3gnKSxcbiAgICAgICAgICAgIGxhYmVsOiBodG1sKCdnZHByLnNldHRpbmdzUGFuZWwucGVyZm9ybWFuY2VIZWFkaW5nJyksXG4gICAgICAgICAgICBhcmlhTGFiZWw6IGh0bWwoJ2dkcHIuc2V0dGluZ3NQYW5lbC5wZXJmb3JtYW5jZUhlYWRpbmcnKVxuICAgICAgICB9KS5yZW5kZXIoKTtcbiAgICAgICAgdGhpcy5wZXJmQ29va2llQ2hlY2tib3guc2V0KHRoaXMub2RUcmFjay5wZXJmVHJhY2tpbmdFbmFibGVkKTtcbiAgICAgICAgdGhpcy5wZXJmQ29va2llQ2hlY2tib3gub24oJ2NoYW5nZScsICh2YWwpID0+IHtcbiAgICAgICAgICAgIHRoaXMub2RUcmFjay5wZXJmVHJhY2tpbmdFbmFibGVkID0gdmFsO1xuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLmFuYWx5dGljc0Nvb2tpZUNoZWNrYm94ID0gbmV3IENoZWNrYm94KHtcbiAgICAgICAgICAgIGVsOiB0aGlzLiRlbC5maW5kKCcuYW5hbHl0aWNzQ29va2llQ2hlY2tib3gnKSxcbiAgICAgICAgICAgIGxhYmVsOiBodG1sKCdnZHByLnNldHRpbmdzUGFuZWwuYW5hbHl0aWNzSGVhZGluZycpLFxuICAgICAgICAgICAgYXJpYUxhYmVsOiBodG1sKCdnZHByLnNldHRpbmdzUGFuZWwuYW5hbHl0aWNzSGVhZGluZycpXG4gICAgICAgIH0pLnJlbmRlcigpO1xuICAgICAgICB0aGlzLmFuYWx5dGljc0Nvb2tpZUNoZWNrYm94LnNldCh0aGlzLm9kVHJhY2suYW5hbHl0aWNzVHJhY2tpbmdFbmFibGVkKTtcbiAgICAgICAgdGhpcy5hbmFseXRpY3NDb29raWVDaGVja2JveC5vbignY2hhbmdlJywgKHZhbCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5vZFRyYWNrLmFuYWx5dGljc1RyYWNraW5nRW5hYmxlZCA9IHZhbDtcbiAgICAgICAgfSk7XG5cblxuICAgICAgICB0aGlzLiRlbC5maW5kKCcuY29uZmlybScpLm9uKCdjbGljaycsICgpID0+IHRoaXMuY29uZmlybSgpKTtcblxuICAgICAgICBsZXQgb3B0cyA9IHtcbiAgICAgICAgICAgIGF1dG9TaG93OiBmYWxzZSxcbiAgICAgICAgICAgIHRpdGxlOiBodG1sKCdnZHByLnNldHRpbmdzUGFuZWwudGl0bGUnKSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IHRoaXMuJGVsLFxuICAgICAgICAgICAgY2xhc3NlczogWydjb29raWVTZXR0aW5nc01vZGFsJ10sXG4gICAgICAgICAgICBjbG9zZU9uRXNjIDogdGhpcy5pc0Rpc21pc3NhYmxlLFxuICAgICAgICAgICAgY2xvc2VPbkJsdXIgOiB0aGlzLmlzRGlzbWlzc2FibGUsXG4gICAgICAgICAgICBzaG93Q2xvc2VCdXR0b246IHRoaXMuaXNEaXNtaXNzYWJsZVxuICAgICAgICB9O1xuXG5cbiAgICAgICAgdGhpcy4kZWwuZmluZCgnLnJhaW5ib3dUZXh0JykuaHRtbCgoaSwgaHRtbCkgPT4ge1xuICAgICAgICAgICAgbGV0IGNoYXJzID0gJC50cmltKGh0bWwpLnNwbGl0KCcnKTtcbiAgICAgICAgICAgIHJldHVybiBgPHNwYW4+JHtjaGFycy5qb2luKCc8L3NwYW4+PHNwYW4+Jyl9PC9zcGFuPmA7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubW9kYWwgPSBuZXcgTW9kYWwob3B0cyk7XG4gICAgICAgIHRoaXMubW9kYWwuc2hvdygpO1xuICAgIH1cblxuICAgIGNvbmZpcm0oKXtcbiAgICAgICAgQ29va2llcy5zZXQob2RUcmFjay5uYW1lLCB0aGlzLm9kVHJhY2suZmxhZ3Mse1xuICAgICAgICAgICAgZG9tYWluOiB3aW5kb3cuT3ZlckRyaXZlLmlzTG9jYWwgPyAnbGlnaHRuaW5nLnRlc3QnIDogb2RUcmFjay5kb21haW4sXG4gICAgICAgICAgICBleHBpcmVzOiBuZXcgRGF0ZShEYXRlLm5vdygpICsgb2RUcmFjay5kdXJhdGlvbk1TKVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5tb2RhbC5oaWRlKCk7XG5cbiAgICAgICAgLy8gV2UgbmVlZCB0byBzZW5kIHRoZSBjb29raWUgdG8gdGhlIHNlcnZlciBiZWZvcmUgaXQgY2FuIHRha2UgZWZmZWN0XG4gICAgICAgIGxvY2F0aW9uLnJlbG9hZCgpO1xuICAgIH1cbn1cblxuXG4iLCJleHBvcnQgZGVmYXVsdCBjbGFzcyBIaXN0b3J5Q29va2llTGlzdGVuZXIge1xuICAgIGNvbnN0cnVjdG9yKHRyYWNrZXIpIHtcbiAgICAgICAgdGhpcy5fdHJhY2tlciA9IHRyYWNrZXI7XG4gICAgfVxuXG4gICAgb25Mb2FkKHN0YXRlcykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgb25VbmxvYWQoKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBnZXRUcmFja2VyKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdHJhY2tlcjtcbiAgICB9XG5cbn1cbiIsImltcG9ydCBBdXRvU2Nyb2xsIGZyb20gJy4uL2F1dG9fc2Nyb2xsL2F1dG9TY3JvbGwnO1xuaW1wb3J0IEJhY2tCdXR0b25SZWRpcmVjdCBmcm9tICcuLi9iYWNrX2J1dHRvbl9yZWRpcmVjdC9CYWNrQnV0dG9uUmVkaXJlY3QnO1xuaW1wb3J0IFNpbXBsZUhhc2ggZnJvbSAnLi4vLi4vLi4vLi4vbGliL3NpbXBsZUhhc2gnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIaXN0b3J5Q29va2llVHJhY2tlciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucGFnZVVubG9hZGVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuTUFYX0xFTkdUSCA9IDM7XG4gICAgICAgIHRoaXMuX2luaXRDb29raWVRdWV1ZShbbmV3IEF1dG9TY3JvbGwodGhpcyksIG5ldyBCYWNrQnV0dG9uUmVkaXJlY3QodGhpcyldKTtcblxuXG4gICAgfVxuXG4gICAgX2luaXRDb29raWVRdWV1ZShsaXN0ZW5lcnMpIHtcbiAgICAgICAgbGV0IHByZXZpb3VzU3RhdGVTdHJpbmcgPSBDb29raWVzLmdldCgndXJsSGlzdG9yeScpO1xuICAgICAgICBsZXQgc3RhdGVzID0gcHJldmlvdXNTdGF0ZVN0cmluZyA/IEpTT04ucGFyc2UocHJldmlvdXNTdGF0ZVN0cmluZykgOiBbXTtcbiAgICAgICAgd2hpbGUgKHN0YXRlcy5sZW5ndGggPiB0aGlzLk1BWF9MRU5HVEggLSAxKSB7XG4gICAgICAgICAgICBzdGF0ZXMuc2hpZnQoKTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwYXRobmFtZSA9IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSA/IHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSA6ICcvJztcbiAgICAgICAgY29uc3Qgc2VhcmNoID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaCA/IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggOiAnJztcbiAgICAgICAgY29uc3QgaGFzaCA9IHdpbmRvdy5sb2NhdGlvbi5oYXNoID8gd2luZG93LmxvY2F0aW9uLmhhc2ggOiAnJztcbiAgICAgICAgY29uc3Qgcm91dGUgPSBwYXRobmFtZSArIHNlYXJjaCArIGhhc2g7XG4gICAgICAgIHN0YXRlcy5wdXNoKEpTT04uc3RyaW5naWZ5KHsgJ3JvdXRlJzogU2ltcGxlSGFzaC5oYXNoKHJvdXRlKSB9KSk7XG4gICAgICAgIENvb2tpZXMuc2V0KCd1cmxIaXN0b3J5Jywgc3RhdGVzLCB7IHBhdGg6ICcvJyB9KTtcbiAgICAgICAgdGhpcy5fYWRkRXZlbnRMaXN0ZW5lcnMobGlzdGVuZXJzLCBzdGF0ZXMpO1xuXG4gICAgfVxuXG4gICAgd2FzQmFja0J1dHRvbkhpdCgpIHtcbiAgICAgICAgbGV0IHN0YXRlcyA9IHRoaXMuZ2V0RGF0YSgpO1xuICAgICAgICBpZiAoc3RhdGVzLmxlbmd0aCA8IDMpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBhbnRlUGVudWx0aW1hdGVSb3V0ZSA9IHN0YXRlc1tzdGF0ZXMubGVuZ3RoIC0gM10ucm91dGU7XG4gICAgICAgIGNvbnN0IHBlbnVsdGltYXRlUm91dGUgPSBzdGF0ZXNbc3RhdGVzLmxlbmd0aCAtIDJdLnJvdXRlO1xuICAgICAgICBjb25zdCB1bHRpbWF0ZVJvdXRlID0gc3RhdGVzW3N0YXRlcy5sZW5ndGggLSAxXS5yb3V0ZTtcbiAgICAgICAgcmV0dXJuIChzdGF0ZXMubGVuZ3RoID49IDMgJiYgYW50ZVBlbnVsdGltYXRlUm91dGUgPT09IHVsdGltYXRlUm91dGUgJiYgdWx0aW1hdGVSb3V0ZSAhPT0gcGVudWx0aW1hdGVSb3V0ZSk7XG4gICAgfVxuXG4gICAgYWRkRGF0YVRvTGF0ZXN0KG5hbWUsIHZhbHVlKSB7XG4gICAgICAgIGxldCBwcmV2aW91c1N0YXRlU3RyaW5nID0gQ29va2llcy5nZXQoJ3VybEhpc3RvcnknKTtcbiAgICAgICAgaWYgKHByZXZpb3VzU3RhdGVTdHJpbmcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGV0IHN0YXRlcyA9IEpTT04ucGFyc2UocHJldmlvdXNTdGF0ZVN0cmluZyk7XG4gICAgICAgICAgICAvLyBzb21ldGltZXMgYSBzdHJpbmcgc29tZXRpbWVzIGFuIG9iamVjdCBidXQgbmVlZHMgdG8gYmUgYW4gb2JqZWN0IGV2ZXJ5IHRpbWVcbiAgICAgICAgICAgIGxldCBzdGF0ZSA9IHR5cGVvZiBzdGF0ZXNbc3RhdGVzLmxlbmd0aCAtIDFdID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2Uoc3RhdGVzW3N0YXRlcy5sZW5ndGggLSAxXSkgOiBzdGF0ZXNbc3RhdGVzLmxlbmd0aCAtIDFdO1xuICAgICAgICAgICAgc3RhdGVbbmFtZV0gPSAodmFsdWUpO1xuICAgICAgICAgICAgc3RhdGVzW3N0YXRlcy5sZW5ndGggLSAxXSA9IHN0YXRlO1xuICAgICAgICAgICAgQ29va2llcy5zZXQoJ3VybEhpc3RvcnknLCBKU09OLnN0cmluZ2lmeShzdGF0ZXMpLCB7IHBhdGg6ICcvJyB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldERhdGEoaW5kZXgpIHtcbiAgICAgICAgaWYgKENvb2tpZXMuZ2V0KCd1cmxIaXN0b3J5JykpIHtcbiAgICAgICAgICAgIGxldCBwcmV2aW91c1N0YXRlU3RyaW5nID0gQ29va2llcy5nZXQoJ3VybEhpc3RvcnknKTtcbiAgICAgICAgICAgIGxldCBzdGF0ZXMgPSBKU09OLnBhcnNlKHByZXZpb3VzU3RhdGVTdHJpbmcpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzdGF0ZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBzdGF0ZXNbaV0gPSB0eXBlb2Ygc3RhdGVzW2ldID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2Uoc3RhdGVzW2ldKSA6IHN0YXRlc1tpXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xICYmIHN0YXRlc1tpbmRleF0pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc3RhdGVzW2luZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKCFpbmRleCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZXM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIF9hZGRFdmVudExpc3RlbmVycyhsaXN0ZW5lcnMsIHN0YXRlcykge1xuICAgICAgICBmb3IgKGxldCBsaXN0ZW5lciBvZiBsaXN0ZW5lcnMpIHtcbiAgICAgICAgICAgIGxpc3RlbmVyLm9uTG9hZChzdGF0ZXMpO1xuICAgICAgICAgICAgLy8gRm9yIGJyb3dzZXJzIHRoYXQgc3VwcG9ydCBiZWZvcmV1bmxvYWRcbiAgICAgICAgICAgIHdpbmRvdy5hZGRFdmVudExpc3RlbmVyKCdiZWZvcmV1bmxvYWQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBhZ2VVbmxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vblVubG9hZCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2VVbmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgZmFsc2UpO1xuXG4gICAgICAgICAgICAvLyBGb3IgU2FmYXJpXG4gICAgICAgICAgICB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigncGFnZWhpZGUnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnBhZ2VVbmxvYWRlZCkge1xuICAgICAgICAgICAgICAgICAgICBsaXN0ZW5lci5vblVubG9hZCgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhZ2VVbmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgZmFsc2UpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IEhvbGRJbmZvcm1hdGlvbk1vZGFsIGZyb20gJy4vdmlld3MvSG9sZEluZm9ybWF0aW9uTW9kYWwnO1xuaW1wb3J0IEhvbGRJbmZvcm1hdGlvbk1vZGFsVjIgZnJvbSAnLi4vaG9sZEluZm9ybWF0aW9uVjIvSG9sZEluZm9ybWF0aW9uTW9kYWxWMic7XG5pbXBvcnQgTWVkaWFJbnRlcmZhY2UgZnJvbSAnLi4vbWVkaWEvTWVkaWFJbnRlcmZhY2UnO1xuaW1wb3J0IFRpdGxlIGZyb20gJy4uL21lZGlhL21vZGVscy9UaXRsZSc7XG5cbmNvbnN0IGNyZWF0ZUhvbGRzUmF0aW9Nb2RhbENvbXBvbmVudCA9ICh7ZWx9KSA9PiB7XG4gICAgLy8gVGhlIHJlZmFjdG9yZWQgc3R1ZmYgZG9lc24ndCB1c2UgdGhpcywgYnV0IHRoZSBhY2NvdW50IHBhZ2Ugd2lsbCBuZWVkIHRvIHN0aWxsXG4gICAgLy8gS2lsbCB0aGlzIHdpdGggc28gbXVjaCBmaXJlIHdoZW4gdGhhdCdzIGRvbmUuXG4gICAgJChkb2N1bWVudCkub24oJ2NsaWNrJywgJy5qcy1ob2xkcy1yYXRpby1oZWxwLWljb24uanMtaG9sZHMtcmF0aW8tYWNjb3VudCcsIChlKSA9PiB7XG4gICAgICAgIGNvbnN0IG1lZGlhSW50ZXJmYWNlID0gbmV3IE1lZGlhSW50ZXJmYWNlKCk7XG5cbiAgICAgICAgY29uc3QgJHRhcmdldCA9ICQoZS50YXJnZXQpLmNsb3Nlc3QoJy5qcy1ob2xkcy1yYXRpby1oZWxwLWljb24uanMtaG9sZHMtcmF0aW8tYWNjb3VudCcpO1xuICAgICAgICBjb25zdCBtZWRpYUlkID0gJHRhcmdldC5kYXRhKCdtZWRpYS1pZCcpO1xuXG4gICAgICAgIG1lZGlhSW50ZXJmYWNlLnNlYXJjaCh7dGl0bGVJZDogbWVkaWFJZH0pLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBtb2RlbCA9IG5ldyBUaXRsZShyZXNwb25zZSk7XG5cbiAgICAgICAgICAgIC8vIG1ha2luZyB0aGUgYXNzdW1wdGlvbiB0aGF0IHRpdGxlcyBvbiB0aGUgaG9sZHMgcGFnZSBhcmUgb24gaG9sZFxuICAgICAgICAgICAgbW9kZWwuc2V0KHt0aXRsZVN0YXRlOiAnb25Ib2xkJ30pO1xuXG4gICAgICAgICAgICB3aW5kb3cuYWpheC5nZXRIb2xkKG1vZGVsLmdldCgnaWQnKSkuZG9uZSgoaG9sZERhdGEpID0+IHsgLy8gc2hvdWxkIGJlIGNvbmZpcm1pbmcgdGhhdCB0aGlzIGlzIG9uIGhvbGRcbiAgICAgICAgICAgICAgICBtb2RlbC5zZXQoe1xuICAgICAgICAgICAgICAgICAgICBob2xkc1JhdGlvOiBob2xkRGF0YS5ob2xkc1JhdGlvLFxuICAgICAgICAgICAgICAgICAgICBob2xkc0NvdW50OiBob2xkRGF0YS5ob2xkc0NvdW50LFxuICAgICAgICAgICAgICAgICAgICBob2xkTGlzdFBvc2l0aW9uOiBob2xkRGF0YS5ob2xkTGlzdFBvc2l0aW9uXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZiAod2luZG93LmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnTEhUTkctMjg2MycpKXtcbiAgICAgICAgICAgICAgICAgICAgbmV3IEhvbGRJbmZvcm1hdGlvbk1vZGFsVjIoe21vZGVsLCBoaWRlSG9sZHNMaW5rOiB0cnVlLCBlbH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG5ldyBIb2xkSW5mb3JtYXRpb25Nb2RhbCh7bW9kZWwsIHR5cGU6ICdiYXNpY1Bvc2l0aW9uJywgZWx9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUhvbGRzUmF0aW9Nb2RhbENvbXBvbmVudDtcbiIsImV4cG9ydCBkZWZhdWx0ICh7IGV4cGlyYXRpb25XYXJuaW5nLCBkZXNjcmlwdGlvbiwgZGV0YWlscywgbm90ZSB9KSA9PiBgXG4gICAgJHtleHBpcmF0aW9uV2FybmluZy5sZW5ndGggPiAwID8gYDxwIGNsYXNzPSdleHBpcmF0aW9uLXdhcm5pbmcnPiR7ZXhwaXJhdGlvbldhcm5pbmd9PC9wPmAgOiAnJ31cbiAgICAke2Rlc2NyaXB0aW9uLmxlbmd0aCA+IDAgPyBgPHAgY2xhc3M9J2Rlc2NyaXB0aW9uJz4ke2Rlc2NyaXB0aW9ufTwvcD5gIDogJyd9XG4gICAgJHtkZXRhaWxzLm1hcCgoZGV0YWlsKSA9PiBgPHAgY2xhc3M9J2RldGFpbCc+JHtkZXRhaWx9PC9wPmApLmpvaW4oJycpfVxuICAgICR7bm90ZS5sZW5ndGggPiAwID8gYDxwIGNsYXNzPSdub3RlJz4ke25vdGV9PC9wPmAgOiAnJ31cbmA7XG4iLCJpbXBvcnQgSG9sZEluZm9ybWF0aW9uVGVtcGxhdGUgICAgICAgICAgICAgIGZyb20gJy4uL3RlbXBsYXRlcy9Ib2xkSW5mb3JtYXRpb24uaHRtbCc7XG5cbmNvbnN0IHsgaHRtbCwgdXJsLCByb3V0ZXMgfSA9IHdpbmRvdztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSG9sZEluZm9ybWF0aW9uIGV4dGVuZHMgQmFja2JvbmUuVmlldyB7XG4gICAgZ2V0IGV4cGlyYXRpb25XYXJuaW5nKCkge1xuICAgICAgICBjb25zdCBpc0V4cGlyZWRDb250ZW50ID0gdGhpcy5tb2RlbC5nZXQoJ2lzT3duZWQnKSAmJiAhdGhpcy5tb2RlbC5nZXQoJ293bmVkQ29waWVzJyk7XG4gICAgICAgIGlmIChpc0V4cGlyZWRDb250ZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpcy50eXBlID09PSAnc3VjY2Vzc1Bvc2l0aW9uJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBgJHtodG1sKCdob2xkc1JhdGlvSGVscE1vZGFsLm5vQ29waWVzT25QbGFjZUhvbGQnKX0gPGEgY2xhc3M9J0hvbGRTdWNjZXNzTW9kYWwtbGluaycgaHJlZj0nJHt1cmwocm91dGVzLmFjY291bnRIb2xkcyl9Jz4ke2h0bWwoJ2hvbGRTdWNjZXNzTW9kYWwubWFuYWdlSG9sZHMnKX08L2E+YDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAod2luZG93LmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnYmV0dGVyUGF0cm9uU3RhdGUnKSA/IHRoaXMubW9kZWwuZ2V0KCdpc09uSG9sZCcpIDogdGhpcy5tb2RlbC5nZXQoJ3RpdGxlU3RhdGUnKSA9PT0gJ29uSG9sZCcpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbCgnaG9sZHNSYXRpb0hlbHBNb2RhbC5ub0NvcGllc1RleHRIZWxkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaHRtbCgnaG9sZHNSYXRpb0hlbHBNb2RhbC5ub0NvcGllc1RleHQnKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJyc7XG4gICAgfVxuXG4gICAgZ2V0IGRlc2NyaXB0aW9uKCkge1xuICAgICAgICBjb25zdCBob2xkc1JhdGlvID0gdGhpcy5tb2RlbC5nZXQoJ2hvbGRzUmF0aW8nKTtcbiAgICAgICAgY29uc3QgaG9sZExpc3RQb3NpdGlvbiA9IHRoaXMubW9kZWwuZ2V0KCdob2xkTGlzdFBvc2l0aW9uJykgfHwgMDtcblxuICAgICAgICBpZiAodGhpcy5tb2RlbC5nZXQoJ2lzUHJlUmVsZWFzZVRpdGxlJykgJiYgaG9sZExpc3RQb3NpdGlvbiA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGh0bWwoJ3ByZVJlbGVhc2VNb2RhbC5ib3Jyb3dVcG9uUmVsZWFzZScpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ3JhdGlvJzpcbiAgICAgICAgICAgICAgICBpZiAoaG9sZHNSYXRpbykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaG9sZHNSYXRpbyA+PSAxXG4gICAgICAgICAgICAgICAgICAgICAgICA/IGh0bWwoJ2hvbGRzUmF0aW9IZWxwTW9kYWwubGlzdFBvc2l0aW9uSHRtbCcsIHsgaG9sZHNSYXRpbzogdGhpcy5tb2RlbC5nZXQoJ2hvbGRzUmF0aW8nKSB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgOiBodG1sKCdob2xkc1JhdGlvSGVscE1vZGFsLm5leHRBdmFpbGFibGUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICAgICAgY2FzZSAnYmFzaWNQb3NpdGlvbic6XG4gICAgICAgICAgICBjYXNlICdzdWNjZXNzUG9zaXRpb24nOlxuICAgICAgICAgICAgY2FzZSAnYmFzaWMnOlxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgZGV0YWlscygpIHtcbiAgICAgICAgY29uc3QgaG9sZHNDb3VudCA9IHRoaXMubW9kZWwuZ2V0KCdob2xkc0NvdW50JykgfHwgMDtcbiAgICAgICAgY29uc3Qgb3duZWRDb3BpZXMgPSB0aGlzLm1vZGVsLmdldCgnb3duZWRDb3BpZXMnKSB8fCAwO1xuICAgICAgICBjb25zdCBob2xkTGlzdFBvc2l0aW9uID0gdGhpcy5tb2RlbC5nZXQoJ2hvbGRMaXN0UG9zaXRpb24nKSB8fCAwO1xuICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnYmFzaWNQb3NpdGlvbic6XG4gICAgICAgICAgICBjYXNlICdzdWNjZXNzUG9zaXRpb24nOlxuICAgICAgICAgICAgICAgIHJldHVybiBbXG4gICAgICAgICAgICAgICAgICAgIGh0bWwoJ2hvbGRzUmF0aW9IZWxwTW9kYWwueW91ckhvbGRzUG9zaXRpb25IdG1sJywgeyBob2xkTGlzdFBvc2l0aW9uLCBob2xkc0NvdW50IH0pLFxuICAgICAgICAgICAgICAgICAgICBodG1sKCdob2xkc1JhdGlvSGVscE1vZGFsLmxpYnJhcnlDb3BpZXMnLCB7IG93bmVkQ29waWVzIH0pXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgIGNhc2UgJ3JhdGlvJzpcbiAgICAgICAgICAgIGNhc2UgJ2Jhc2ljJzpcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgICAgICAgICAgaHRtbCgnaG9sZHNSYXRpb0hlbHBNb2RhbC50b3RhbEhvbGRzSHRtbCcsIHsgaG9sZHNDb3VudCB9KSxcbiAgICAgICAgICAgICAgICAgICAgaHRtbCgnaG9sZHNSYXRpb0hlbHBNb2RhbC5saWJyYXJ5Q29waWVzJywgeyBvd25lZENvcGllcyB9KVxuICAgICAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgbm90ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWwuZ2V0KCdpc0Zhc3RsYW5lJykgPyBodG1sKCdhZHZhbnRhZ2VGYXN0UGFzc0h0bWwnKSA6ICcnO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHsgdHlwZSB9KSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuZWwgPSB0aGlzLmVsIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0aGlzLmVsLmNsYXNzTmFtZSA9IGAke3RoaXMuZWwuY2xhc3NOYW1lfSBIb2xkSW5mb3JtYXRpb25gO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlIHx8ICdiYXNpYyc7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCB2aWV3ID0gSG9sZEluZm9ybWF0aW9uVGVtcGxhdGUoe1xuICAgICAgICAgICAgZXhwaXJhdGlvbldhcm5pbmc6IHRoaXMuZXhwaXJhdGlvbldhcm5pbmcsXG4gICAgICAgICAgICBkZXNjcmlwdGlvbjogdGhpcy5kZXNjcmlwdGlvbixcbiAgICAgICAgICAgIGRldGFpbHM6IHRoaXMuZGV0YWlscyxcbiAgICAgICAgICAgIG5vdGU6IHRoaXMubm90ZVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4kZWwuZW1wdHkoKS5hcHBlbmQodmlldyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgTW9kYWwgfSBmcm9tICcuLi8uLi9jb21tb24vbW9kYWwnO1xuaW1wb3J0IEhvbGRJbmZvcm1hdGlvbiBmcm9tICcuL0hvbGRJbmZvcm1hdGlvbic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhvbGRJbmZvcm1hdGlvbk1vZGFsIGV4dGVuZHMgTW9kYWwge1xuICAgIGNvbnN0cnVjdG9yKHsgbW9kZWwsIHR5cGUgfSkge1xuICAgICAgICBjb25zdCBpbmZvcm1hdGlvbiA9IG5ldyBIb2xkSW5mb3JtYXRpb24oeyBtb2RlbCwgdHlwZSB9KS5yZW5kZXIoKTtcbiAgICAgICAgY29uc3QgbW9kYWxDb250ZW50cyA9IHtcbiAgICAgICAgICAgIGNsYXNzZXM6IFsnSG9sZEluZm9ybWF0aW9uTW9kYWwnXSxcbiAgICAgICAgICAgIHRpdGxlOiB3aW5kb3cuaHRtbCgnaG9sZHNSYXRpb0hlbHBNb2RhbC5oZWFkaW5nJyksXG4gICAgICAgICAgICBjb250ZW50OiBpbmZvcm1hdGlvbi5lbFxuICAgICAgICB9O1xuICAgICAgICBzdXBlcihtb2RhbENvbnRlbnRzKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBNb2RhbCB9IGZyb20gJy4uL2NvbW1vbi9tb2RhbCc7XG5pbXBvcnQgSG9sZEluZm9ybWF0aW9uVjIgZnJvbSAnLi9Ib2xkSW5mb3JtYXRpb25WMic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhvbGRJbmZvcm1hdGlvbk1vZGFsVjIgZXh0ZW5kcyBNb2RhbCB7XG4gICAgY29uc3RydWN0b3IoeyBtb2RlbCwgaGlkZUhvbGRzTGluayA9IGZhbHNlfSkge1xuICAgICAgICBjb25zdCBpbmZvcm1hdGlvbiA9IG5ldyBIb2xkSW5mb3JtYXRpb25WMih7bW9kZWwsIGhpZGVIb2xkc0xpbmssIGlzVmlzaXRvcjogd2luZG93Lk92ZXJEcml2ZS5pc1Zpc2l0b3J9KS5yZW5kZXIoKTtcbiAgICAgICAgY29uc3QgbW9kYWxDb250ZW50cyA9IHtcbiAgICAgICAgICAgIGNsYXNzZXM6IFsnSG9sZEluZm9ybWF0aW9uTW9kYWxWMiddLFxuICAgICAgICAgICAgdGl0bGU6IHdpbmRvdy5odG1sKCdob2xkc1JhdGlvSGVscE1vZGFsLmhlYWRpbmcnKSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGluZm9ybWF0aW9uLmVsXG4gICAgICAgIH07XG4gICAgICAgIHN1cGVyKG1vZGFsQ29udGVudHMpO1xuICAgIH1cbn1cbiIsImNvbnN0IHsgaHRtbCwgdGV4dCB9ID0gd2luZG93O1xuZXhwb3J0IGRlZmF1bHQgKHsgZGVzY3JpcHRpb24sIGRldGFpbHMsIG5vdGUsIE1hY21pbGxhbk1lc3NhZ2UgfSkgPT4gYFxuICAgICR7ZGVzY3JpcHRpb24gJiYgZGVzY3JpcHRpb24ubGVuZ3RoID4gMCA/IGA8cCBjbGFzcz0nZGVzY3JpcHRpb24nPiR7ZGVzY3JpcHRpb259PC9wPmAgOiAnJ31cbiAgICAke2RldGFpbHMgJiYgZGV0YWlscy5tYXAoKGRldGFpbCkgPT4gYDxwIGNsYXNzPSdkZXRhaWwnPjxzcGFuIGNsYXNzPSdob2xkSW5mb0xhYmVsJz4ke2RldGFpbC5sYWJlbH06IDwvc3Bhbj48c3Bhbj4ke2RldGFpbC52YWx1ZX08L3NwYW4+PC9wPmApLmpvaW4oJycpfVxuICAgICR7bm90ZSAmJiBub3RlLmxlbmd0aCA+IDAgPyBgPHAgY2xhc3M9J25vdGUnPiR7bm90ZX08L3A+YCA6ICcnfVxuICAgICR7TWFjbWlsbGFuTWVzc2FnZSAmJiBNYWNtaWxsYW5NZXNzYWdlLmxlbmd0aCA+IDAgPyBgPHAgY2xhc3M9XCJtYWNtaWxsYW5NZXNzYWdlXCI+JHtNYWNtaWxsYW5NZXNzYWdlfTwvcD5gIDogJyd9XG5gO1xuIiwiaW1wb3J0IEhvbGRJbmZvcm1hdGlvblRlbXBsYXRlIGZyb20gJy4vSG9sZEluZm9ybWF0aW9uVjIuaHRtbCc7XG5pbXBvcnQgTWFjbWlsbGFuTWVzc2FnZSBmcm9tICcuLi8uLi8uLi8uLi9saWIvdXRpbGl0eS9tYWNtaWxsYW5NZXNzYWdlJztcbmNvbnN0IHsgdGV4dCB9ID0gd2luZG93O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBIb2xkSW5mb3JtYXRpb25WMiBleHRlbmRzIEJhY2tib25lLlZpZXcge1xuICAgIGNvbnN0cnVjdG9yKHsgaGlkZUhvbGRzTGluayA9IGZhbHNlLCBpc1Zpc2l0b3IgPSBmYWxzZSB9KSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuZWwgPSB0aGlzLmVsIHx8IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICAgICAgICB0aGlzLmhpZGVIb2xkc0xpbmsgPSBoaWRlSG9sZHNMaW5rO1xuICAgICAgICB0aGlzLmlzVmlzaXRvciA9IGlzVmlzaXRvcjtcbiAgICAgICAgdGhpcy5NQVhfV0FJVF9NT05USFNfVE9fU0hPVyA9IDY7XG4gICAgICAgIHRoaXMuTUFYX1dBSVRfV0VFS1NfVE9fU0hPVyA9IDI2O1xuICAgICAgICB0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsICdjaGFuZ2U6dGl0bGVTdGF0ZScsIHRoaXMucmVtb3ZlV2FpdFRpbWUpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3QgdmlldyA9IEhvbGRJbmZvcm1hdGlvblRlbXBsYXRlKHtcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiB0aGlzLmRlc2NyaXB0aW9uLFxuICAgICAgICAgICAgZGV0YWlsczogdGhpcy5kZXRhaWxzLFxuICAgICAgICAgICAgbm90ZTogdGhpcy5ub3RlLFxuICAgICAgICAgICAgTWFjbWlsbGFuTWVzc2FnZTogdGhpcy5NYWNtaWxsYW5NZXNzYWdlLFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4kZWwuZW1wdHkoKS5hcHBlbmQodmlldyk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmVtb3ZlV2FpdFRpbWUoKSB7XG4gICAgICAgIGlmICh0aGlzLmhpZGVXYWl0VGltZSkge1xuICAgICAgICAgICAgdGhpcy4kZWwuaGlkZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0IGRlc2NyaXB0aW9uKCkge1xuICAgICAgICBpZiAodGhpcy5pc1ByZXJlbGVhc2VUaXRsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRleHQoJ2V4cGVjdGVkV2FpdFRpbWUucHJlcmVsZWFzZU5vV2FpdFRpbWUnKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzRXhwaXJlZFRpdGxlKSB7XG4gICAgICAgICAgICBsZXQgdGhlVGV4dCA9ICcnO1xuICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwuZ2V0KCd0aXRsZVN0YXRlJykgPT09ICdvbkhvbGQnKSB7XG4gICAgICAgICAgICAgICAgdGhlVGV4dCA9IHRleHQoJ2hvbGRzUmF0aW9IZWxwTW9kYWwubm9Db3BpZXNPblBsYWNlSG9sZCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGVUZXh0ID0gdGV4dCgnaG9sZHNSYXRpb0hlbHBNb2RhbC5ub0NvcGllc1RleHQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmhpZGVIb2xkc0xpbmtcbiAgICAgICAgICAgICAgICA/IHRoZVRleHRcbiAgICAgICAgICAgICAgICA6IGA8c3Bhbj4ke3RoZVRleHR9PGEgY2xhc3M9XCJtYW5hZ2VIb2xkc0xpbmtcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub3JlZmVycmVyXCIgaHJlZj1cIi9hY2NvdW50L2hvbGRzXCI+JHt0ZXh0KFxuICAgICAgICAgICAgICAgICAgICAgICdob2xkU3VjY2Vzc01vZGFsLm1hbmFnZUhvbGRzJ1xuICAgICAgICAgICAgICAgICAgKX08L2E+PC9zcGFuPmA7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICB0aGlzLm1vZGVsLmFsbENvcGllc0FyZUx1Y2t5RGF5ICYmXG4gICAgICAgICAgICB0aGlzLm1vZGVsLmdldCgndGl0bGVTdGF0ZScpID09PSAnb25Ib2xkJ1xuICAgICAgICApIHtcbiAgICAgICAgICAgIGxldCBkZXRhaWxzVXJsID0gd2luZG93LnVybCh3aW5kb3cucm91dGVzLm1lZGlhSWQsIHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5tb2RlbC5nZXQoJ2lkJyksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGxldCBkZXRhaWxzTGluayA9IGA8YSBzdHlsZT1cInRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lXCIgaHJlZj1cIiR7ZGV0YWlsc1VybH1cIj4ke3RleHQoXG4gICAgICAgICAgICAgICAgJ2x1Y2t5RGF5LmFsbEx1Y2t5RGF5SG9sZHNJbmZvTGlua1RleHQnXG4gICAgICAgICAgICApfTwvYT5gO1xuICAgICAgICAgICAgcmV0dXJuIHRleHQoJ2x1Y2t5RGF5LmFsbEx1Y2t5RGF5SG9sZHNJbmZvJywgeyBsaW5rOiBkZXRhaWxzTGluayB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmlzRmFzdExhbmVUaXRsZSkge1xuICAgICAgICAgICAgcmV0dXJuIHRleHQoJ2V4cGVjdGVkV2FpdFRpbWUuYWR2YW50YWdlQ2F2ZWF0Jyk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5pc1Zpc2l0b3IpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0KCdleHBlY3RlZFdhaXRUaW1lLnJsYUNhdmVhdCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiAnJztcbiAgICB9XG5cbiAgICBnZXQgZGV0YWlscygpIHtcbiAgICAgICAgbGV0IGRldGFpbHMgPSBbXTtcbiAgICAgICAgaWYgKCF0aGlzLnNob3dXYWl0VGltZVVuYXZhaWxhYmxlICYmICF0aGlzLmhpZGVXYWl0VGltZSkge1xuICAgICAgICAgICAgZGV0YWlscy5wdXNoKHtcbiAgICAgICAgICAgICAgICBsYWJlbDogdGV4dCgnZXhwZWN0ZWRXYWl0VGltZS53YWl0VGltZScpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0aGlzLndhaXRUaW1lVGV4dCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMubW9kZWwuZ2V0KCdob2xkTGlzdFBvc2l0aW9uJykpIHtcbiAgICAgICAgICAgIGRldGFpbHMucHVzaCh7XG4gICAgICAgICAgICAgICAgbGFiZWw6IHRleHQoJ2V4cGVjdGVkV2FpdFRpbWUucGxhY2VJbkxpbmUnKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdGhpcy5tb2RlbC5nZXQoJ2hvbGRMaXN0UG9zaXRpb24nKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG93bmVkQ29waWVzID0gdGhpcy5tb2RlbC5nZXQoJ293bmVkQ29waWVzJykgfHwgMDtcbiAgICAgICAgbGV0IHRvdGFsSG9sZHMgPSB0aGlzLm1vZGVsLmdldCgnaG9sZHNDb3VudCcpIHx8IDA7XG5cbiAgICAgICAgZGV0YWlscy5wdXNoKHtcbiAgICAgICAgICAgIGxhYmVsOiB0ZXh0KCdleHBlY3RlZFdhaXRUaW1lLmxpYnJhcnlDb3BpZXMnKSxcbiAgICAgICAgICAgIHZhbHVlOiBvd25lZENvcGllcyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKG93bmVkQ29waWVzID4gMSkge1xuICAgICAgICAgICAgbGV0IGhvbGRzUmF0aW8gPVxuICAgICAgICAgICAgICAgIG93bmVkQ29waWVzICYmIHRvdGFsSG9sZHMgPyB0b3RhbEhvbGRzIC8gb3duZWRDb3BpZXMgOiAwO1xuICAgICAgICAgICAgbGV0IHJhdGlvRGlzcGxheVZhbHVlID1cbiAgICAgICAgICAgICAgICBob2xkc1JhdGlvID4gMCAmJiBob2xkc1JhdGlvIDwgMVxuICAgICAgICAgICAgICAgICAgICA/ICc8IDEnXG4gICAgICAgICAgICAgICAgICAgIDogTWF0aC5yb3VuZChob2xkc1JhdGlvKTtcbiAgICAgICAgICAgIGRldGFpbHMucHVzaCh7XG4gICAgICAgICAgICAgICAgbGFiZWw6IHRleHQoJ2V4cGVjdGVkV2FpdFRpbWUucGVvcGxlV2FpdGluZ1RvdGFsJyksXG4gICAgICAgICAgICAgICAgdmFsdWU6IHRvdGFsSG9sZHMsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRldGFpbHMucHVzaCh7XG4gICAgICAgICAgICAgICAgbGFiZWw6IHRleHQoJ2V4cGVjdGVkV2FpdFRpbWUucG9lcGxlV2FpdGluZ1BlckNvcHknKSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogcmF0aW9EaXNwbGF5VmFsdWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGRldGFpbHMucHVzaCh7XG4gICAgICAgICAgICAgICAgbGFiZWw6IHRleHQoJ2V4cGVjdGVkV2FpdFRpbWUucGVvcGxlV2FpdGluZycpLFxuICAgICAgICAgICAgICAgIHZhbHVlOiB0b3RhbEhvbGRzLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRldGFpbHM7XG4gICAgfVxuXG4gICAgZ2V0IHdhaXRUaW1lSHRtbCgpIHtcbiAgICAgICAgdmFyIGh0bWwgPSAnJztcbiAgICAgICAgaWYgKCF0aGlzLmhpZGVXYWl0VGltZSkge1xuICAgICAgICAgICAgaHRtbCA9IGA8c3BhbiBjbGFzcz0nd2FpdGluZ1RleHQnPiR7d2luZG93LnRleHQoXG4gICAgICAgICAgICAgICAgJ2V4cGVjdGVkV2FpdFRpbWUud2FpdFRpbWUnXG4gICAgICAgICAgICApfTogJHt0aGlzLndhaXRUaW1lVGV4dH08L3NwYW4+YDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaHRtbDtcbiAgICB9XG5cbiAgICBnZXQgd2FpdFRpbWVUZXh0KCkge1xuICAgICAgICBsZXQgd2FpdFRpbWVUZXh0ID0gJyc7XG5cbiAgICAgICAgaWYgKCF0aGlzLmhpZGVXYWl0VGltZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2hvd1dhaXRUaW1lVW5hdmFpbGFibGUpIHtcbiAgICAgICAgICAgICAgICB3YWl0VGltZVRleHQgPSB0ZXh0KCdleHBlY3RlZFdhaXRUaW1lLm5vdEF2YWlsYWJsZScpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBsZXQgZXN0aW1hdGVkV2FpdERheXMgPSBOdW1iZXIoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZ2V0KCdlc3RpbWF0ZWRXYWl0RGF5cycpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBpZiAoZXN0aW1hdGVkV2FpdERheXMgPD0gNykge1xuICAgICAgICAgICAgICAgICAgICB3YWl0VGltZVRleHQgPSB0ZXh0KCdleHBlY3RlZFdhaXRUaW1lLmF2YWlsYWJsZVNvb24nKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICBlc3RpbWF0ZWRXYWl0RGF5cyA8XG4gICAgICAgICAgICAgICAgICAgIDcgKiB0aGlzLk1BWF9XQUlUX1dFRUtTX1RPX1NIT1dcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgd2FpdFRpbWVUZXh0ID0gdGV4dCgnZXhwZWN0ZWRXYWl0VGltZS5hYm91dFhXZWVrcycsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtzOiBNYXRoLmNlaWwoZXN0aW1hdGVkV2FpdERheXMgLyA3KSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gd2UgaW50ZW50aW9uYWxseSBtYXggb3V0IGF0IFwiYXQgbGVhc3QgNiBtb250aHNcIlxuICAgICAgICAgICAgICAgICAgICB3YWl0VGltZVRleHQgPSB0ZXh0KCdleHBlY3RlZFdhaXRUaW1lLmF0TGVhc3RZTW9udGhzJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9udGhzOiBNYXRoLm1pbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXRoLmNlaWwoZXN0aW1hdGVkV2FpdERheXMgLyAzMCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5NQVhfV0FJVF9NT05USFNfVE9fU0hPV1xuICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdhaXRUaW1lVGV4dDtcbiAgICB9XG5cbiAgICBnZXQgc2hvd1dhaXRUaW1lVW5hdmFpbGFibGUoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLm1vZGVsLmdldCgnZXN0aW1hdGVkV2FpdERheXMnKSA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICB0aGlzLm1vZGVsLmdldCgnZXN0aW1hdGVkV2FpdERheXMnKSA9PT0gbnVsbCB8fFxuICAgICAgICAgICAgdGhpcy5pc1ByZXJlbGVhc2VUaXRsZSB8fFxuICAgICAgICAgICAgdGhpcy5pc1Zpc2l0b3IgfHxcbiAgICAgICAgICAgIHRoaXMuaXNFeHBpcmVkVGl0bGVcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXQgaGlkZVdhaXRUaW1lKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5pc0Zhc3RMYW5lVGl0bGUgfHxcbiAgICAgICAgICAgIHRoaXMubW9kZWwuZ2V0KCd0aXRsZVN0YXRlJykgPT09ICdvbkhvbGQnIHx8XG4gICAgICAgICAgICAod2luZG93LmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnYmV0dGVyUGF0cm9uU3RhdGUnKVxuICAgICAgICAgICAgICAgID8gdGhpcy5tb2RlbC5nZXQoJ2lzQm9ycm93ZWQnKVxuICAgICAgICAgICAgICAgIDogdGhpcy5tb2RlbC5nZXQoJ3RpdGxlU3RhdGUnKSA9PT0gJ2JvcnJvd2VkJylcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXQgaXNFeHBpcmVkVGl0bGUoKSB7XG4gICAgICAgIHJldHVybiB3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdkb250LW1hcmstc3UtYXMtZXhwaXJlZCcpXG4gICAgICAgICAgICA/IHRoaXMubW9kZWwuaXNFeHBpcmVkXG4gICAgICAgICAgICA6IHRoaXMubW9kZWwuZ2V0KCdpc093bmVkJykgJiZcbiAgICAgICAgICAgICAgICAgICF0aGlzLm1vZGVsLmdldCgnb3duZWRDb3BpZXMnKSAmJlxuICAgICAgICAgICAgICAgICAgIXRoaXMubW9kZWwuYWxsQ29waWVzQXJlTHVja3lEYXk7XG4gICAgfVxuXG4gICAgZ2V0IGlzRmFzdExhbmVUaXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWwuZ2V0KCdpc0Zhc3RsYW5lJyk7XG4gICAgfVxuXG4gICAgZ2V0IGlzUHJlcmVsZWFzZVRpdGxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5nZXQoJ2lzUHJlUmVsZWFzZVRpdGxlJyk7XG4gICAgfVxuXG4gICAgZ2V0IG5vdGUoKSB7XG4gICAgICAgIHJldHVybiBbXTtcbiAgICB9XG5cbiAgICBnZXQgTWFjbWlsbGFuTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIE1hY21pbGxhbk1lc3NhZ2UodGhpcy5tb2RlbCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgdG9TdGF0aWNVcmwgfSBmcm9tICcuLi8uLi8uLi8uLi9saWIvYXNzZXRNYXBwZXInO1xuXG5jb25zdCBiYW5uZXJUaXRsZUltYWdlID0gKHsgc3JjIH0pID0+IGBcbjxpbWcgcm9sZT1cInByZXNlbnRhdGlvblwiIHNyYz1cIiR7c3JjfVwiLz5cbmA7XG5cbmV4cG9ydCBjb25zdCBrYW5vcHlNZW51QWRUZW1wbGF0ZSA9ICh7XG4gICAga2Fub3B5U2lnblVwVXJsLFxuICAgIHByb21vdGVTaWduVXAsXG4gICAgc2hvd1RpdGxlcyxcbiAgICB0aXRsZXNCb3R0b21Sb3csXG4gICAgdGl0bGVzVG9wUm93LFxufSkgPT4gYFxuPHNlY3Rpb24gY2xhc3M9XCJrYW5vcHktbWVudS1hZFwiXG4gICAgICAgICBvbmNsaWNrPVwiZXZlbnQuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKClcIj5cbiAgICA8ZGl2IGNsYXNzPVwia2Fub3B5LW1lbnUtYWRfX2NvbHVtbi1jb250ZW50XCI+XG4gICAgICAgIDxoMSBjbGFzcz1cImthbm9weS1tZW51LWFkX19oZWFkaW5nXCI+XG4gICAgICAgICAgICAke3dpbmRvdy5odG1sKCdrYW5vcHktbWVudS1hZC5oZWFkZXInKX1cbiAgICAgICAgPC9oMT5cblxuICAgICAgICA8cCBjbGFzcz1cImthbm9weS1tZW51LWFkX19jb250ZW50XCI+XG4gICAgICAgICAgICAke3dpbmRvdy5odG1sKCdrYW5vcHktbWVudS1hZC5zdWJoZWFkZXInKX1cbiAgICAgICAgPC9wPlxuXG4gICAgICAgIDxwIGNsYXNzPVwia2Fub3B5LW1lbnUtYWRfX2NvbnRlbnRcIj5cbiAgICAgICAgICAgIDxhIGNsYXNzPVwia2Fub3B5LWJ1dHRvbi0tY3RhXCJcbiAgICAgICAgICAgICAgICBocmVmPVwiJHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbW90ZVNpZ25VcCA/IGthbm9weVNpZ25VcFVybCA6IHdpbmRvdy5yb3V0ZXMua2Fub3B5LnByb21vXG4gICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgaWQ9XCJrYW5vcHktbWVudS1hZC1jdGEtYnV0dG9uXCJcbiAgICAgICAgICAgICAgICByZWw9XCJub3JlZmVycmVyXCJcbiAgICAgICAgICAgICAgICB0YXJnZXQ9XCJfYmxhbmtcIj5cbiAgICAgICAgICAgICAgICAke1xuICAgICAgICAgICAgICAgICAgICBwcm9tb3RlU2lnblVwXG4gICAgICAgICAgICAgICAgICAgICAgICA/IHdpbmRvdy5odG1sKCdrYW5vcHktbWVudS1hZC5nZXRTdGFydGVkJylcbiAgICAgICAgICAgICAgICAgICAgICAgIDogd2luZG93Lmh0bWwoJ2thbm9weS1tZW51LWFkLmxlYXJuTW9yZScpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICA8L3A+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwia2Fub3B5LW1lbnUtYWRfX2NvdmVyc1wiPlxuICAgICAgICAke1xuICAgICAgICAgICAgc2hvd1RpdGxlc1xuICAgICAgICAgICAgICAgID8gYFxuICAgICAgICA8ZGl2IGNsYXNzPVwia2Fub3B5LW1lbnUtYWRfX2NvdmVyLXJvd1wiPlxuICAgICAgICAgICAgJHt0aXRsZXNUb3BSb3cubWFwKChzcmMpID0+IGJhbm5lclRpdGxlSW1hZ2UoeyBzcmMgfSkpLmpvaW4oJycpfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImthbm9weS1tZW51LWFkX19jb3Zlci1yb3dcIj5cbiAgICAgICAgICAgICR7dGl0bGVzQm90dG9tUm93Lm1hcCgoc3JjKSA9PiBiYW5uZXJUaXRsZUltYWdlKHsgc3JjIH0pKS5qb2luKCcnKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIGBcbiAgICAgICAgICAgICAgICA6ICcnXG4gICAgICAgIH1cbiAgICA8L2Rpdj5cbiAgICBcbiAgICA8ZGl2IGNsYXNzPVwia2Fub3B5LW1lbnUtYWRfX2xvZ29cIj5cbiAgICAgICAgPGltZyBhbHQ9XCIke2h0bWwoJ2thbm9weS5rYW5vcHknKX1cIiBcbiAgICAgICAgICAgIHNyYz1cIiR7dG9TdGF0aWNVcmwoJ2ltZy9rYW5vcHkvbG9nby1rYW5vcHktd2hpdGUuc3ZnJyl9XCIgLz5cbiAgICA8L2Rpdj5cbjwvc2VjdGlvbj5cbmA7XG4iLCJpbXBvcnQgeyBrYW5vcHlNZW51QWRUZW1wbGF0ZSB9IGZyb20gJy4va2Fub3B5LW1lbnUtYWQtdmlldy5odG1sJztcbmltcG9ydCB7IHRvU3RhdGljVXJsIH0gZnJvbSAnLi4vLi4vLi4vLi4vbGliL2Fzc2V0TWFwcGVyJztcblxuY29uc3QgeyBib3dzZXIgfSA9IHdpbmRvdztcblxuZXhwb3J0IGNsYXNzIEthbm9weU1lbnVBZFZpZXcgZXh0ZW5kcyBCYWNrYm9uZS5WaWV3IHtcbiAgICBoaWdoQ29udHJhc3Q7XG4gICAgaXNUb2xpbm9EZXZpY2U7XG4gICAga2Fub3B5U2lnblVwVXJsO1xuXG4gICAgY29uc3RydWN0b3IoeyBoaWdoQ29udHJhc3QsIGlzVG9saW5vRGV2aWNlLCBrYW5vcHlTaWduVXBVcmwgfSkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuXG4gICAgICAgIHRoaXMuaGlnaENvbnRyYXN0ID0gaGlnaENvbnRyYXN0O1xuICAgICAgICB0aGlzLmlzVG9saW5vRGV2aWNlID0gaXNUb2xpbm9EZXZpY2U7XG4gICAgICAgIHRoaXMua2Fub3B5U2lnblVwVXJsID0ga2Fub3B5U2lnblVwVXJsO1xuXG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCB0aXRsZXNUb3BSb3cgPSBbXTtcbiAgICAgICAgY29uc3QgdGl0bGVzQm90dG9tUm93ID0gW107XG5cbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAxOyBpbmRleCA8PSAxMDsgaW5kZXgrKykge1xuICAgICAgICAgICAgY29uc3QgdGl0bGVTcmMgPSB0b1N0YXRpY1VybChcbiAgICAgICAgICAgICAgICBgaW1nL2thbm9weS9tZW51LWFkL2thbm9weS1pbWctJHtpbmRleH0uanBlZ2BcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAoaW5kZXggPD0gNSkge1xuICAgICAgICAgICAgICAgIHRpdGxlc1RvcFJvdy5wdXNoKHRpdGxlU3JjKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGl0bGVzQm90dG9tUm93LnB1c2godGl0bGVTcmMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgeyBtb2JpbGUsIHRhYmxldCB9ID0gYm93c2VyO1xuICAgICAgICBjb25zdCBwcm9tb3RlU2lnblVwID1cbiAgICAgICAgICAgICFtb2JpbGUgJiYgIXRhYmxldCAmJiAhdGhpcy5pbkFwcCAmJiAhdGhpcy5pc1RvbGlub0RldmljZTtcbiAgICAgICAgY29uc3Qga2Fub3B5U2lnblVwVXJsID0gcHJvbW90ZVNpZ25VcFxuICAgICAgICAgICAgPyB0aGlzLmthbm9weVNpZ25VcFVybFxuICAgICAgICAgICAgOiAnaHR0cHM6Ly93d3cua2Fub3B5LmNvbSc7XG5cbiAgICAgICAgY29uc3QgdmlldyA9IGthbm9weU1lbnVBZFRlbXBsYXRlKHtcbiAgICAgICAgICAgIGthbm9weVNpZ25VcFVybCxcbiAgICAgICAgICAgIHByb21vdGVTaWduVXAsXG4gICAgICAgICAgICBzaG93VGl0bGVzOlxuICAgICAgICAgICAgICAgICF0aGlzLmlzVG9saW5vRGV2aWNlICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuaGlnaENvbnRyYXN0ICYmXG4gICAgICAgICAgICAgICAgIXdpbmRvdy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ2hpZGUta2Fub3B5LWNvdmVycycpLFxuICAgICAgICAgICAgdGl0bGVzQm90dG9tUm93LFxuICAgICAgICAgICAgdGl0bGVzVG9wUm93LFxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy4kZWwuZW1wdHkoKS5hcHBlbmQodmlldyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IEtpbmRsZVByZWZlcmVuY2VNb2RhbCAgICAgICAgZnJvbSAnLi92aWV3cy9LaW5kbGVQcmVmZXJlbmNlTW9kYWwnO1xuaW1wb3J0IEtpbmRsZVByZWZlcmVuY2VSZXN1bHRNb2RhbCAgZnJvbSAnLi92aWV3cy9LaW5kbGVQcmVmZXJlbmNlUmVzdWx0TW9kYWwnO1xuXG5jb25zdCB7IHVybCwgcm91dGVzIH0gPSB3aW5kb3c7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEtpbmRsZVByZWZlcmVuY2Uge1xuICAgIGNvbnN0cnVjdG9yKHtidXMsIGdsb2JhbFByZWZlcmVuY2VzLCBzb3VyY2UsIGNvbXBsZXRpb25UYXJnZXRVcmx9KSB7XG4gICAgICAgIHRoaXMuYnVzID0gYnVzO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgdGhpcy5nbG9iYWxQcmVmZXJlbmNlcyA9IGdsb2JhbFByZWZlcmVuY2VzO1xuICAgICAgICB0aGlzLmNvbXBsZXRpb25UYXJnZXRVcmwgPSBjb21wbGV0aW9uVGFyZ2V0VXJsO1xuICAgIH1cblxuICAgIHJ1bigpIHtcbiAgICAgICAgdGhpcy5wcmVmZXJlbmNlTW9kYWwgPSBuZXcgS2luZGxlUHJlZmVyZW5jZU1vZGFsKHRoaXMuY29tcGxldGlvblRhcmdldFVybCk7XG5cbiAgICAgICAgdGhpcy5wcmVmZXJlbmNlTW9kYWwuJGVsLmZpbmQoJy5jb25maXJtLWJ1dHRvbicpLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdEJ1dHRvblRleHQgPSB0aGlzLnNvdXJjZSA9PT0gJ2NvbnRlbnRfZnVsZmlsbG1lbnQnID8gaHRtbCgna2luZGxlRnVsZmlsbG1lbnQuc2V0UHJlZk1vZGFsLmNvbnRpbnVlJykgOiBodG1sKCdvaycpO1xuICAgICAgICAgICAgbGV0IHNob3dSZXN1bHQgPSB0aGlzLl91cGRhdGVQcmVmZXJlbmNlKHRydWUpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucHJlZmVyZW5jZU1vZGFsLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXN1bHRNb2RhbCA9IG5ldyBLaW5kbGVQcmVmZXJlbmNlUmVzdWx0TW9kYWwoe2tpbmRsZVNlbGVjdGVkOiB0cnVlLCB3YXNTdWNjZXNzZnVsOiB0cnVlLCBidXR0b25UZXh0OiByZXN1bHRCdXR0b25UZXh0LCBjb250aW51ZVRhcmdldFVybDogdGhpcy5jb21wbGV0aW9uVGFyZ2V0VXJsfSk7XG4gICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVmZXJlbmNlTW9kYWwuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB0aGlzLnJlc3VsdE1vZGFsID0gbmV3IEtpbmRsZVByZWZlcmVuY2VSZXN1bHRNb2RhbCh7a2luZGxlU2VsZWN0ZWQ6IHRydWUsIHdhc1N1Y2Nlc3NmdWw6IGZhbHNlLCBidXR0b25UZXh0OiByZXN1bHRCdXR0b25UZXh0LCBjb250aW51ZVRhcmdldFVybDogdGhpcy5jb21wbGV0aW9uVGFyZ2V0VXJsfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5wcmVmZXJlbmNlTW9kYWwuJGVsLmZpbmQoJy5kZW55LWJ1dHRvbicpLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3VwZGF0ZVByZWZlcmVuY2UoZmFsc2UpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucHJlZmVyZW5jZU1vZGFsLmNsb3NlKCk7XG4gICAgICAgICAgICB9KS5jYXRjaCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcmVmZXJlbmNlTW9kYWwuY2xvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfdXBkYXRlUHJlZmVyZW5jZSh2YWwpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2xvYmFsUHJlZmVyZW5jZXMuc2V0S2luZGxlRnVsZmlsbG1lbnRQcmVmZXJlbmNlKHZhbCwgdGhpcy5zb3VyY2UpO1xuICAgIH1cbn1cbiIsImNvbnN0IHsgaHRtbCB9ID0gd2luZG93O1xuXG5leHBvcnQgZGVmYXVsdCAobm9UaGFua3NUYXJnZXRVcmwpID0+IGBcbjxkaXYgY2xhc3M9J2luZm8tY29udGFpbmVyJz5cbiAgICA8cD5cbiAgICAgICAgJHtodG1sKCdraW5kbGVGdWxmaWxsbWVudC5zZXRQcmVmTW9kYWwub2ZmZXInKX1cbiAgICAgICAgJHtodG1sKCdraW5kbGVGdWxmaWxsbWVudC5zZXRQcmVmTW9kYWwuYWRqdXN0SW5mb0h0bWwnLCB7XG4gICAgICAgICAgICBzZXR0aW5nc0xpbms6IGh0bWwoJ3NldHRpbmdzJyksXG4gICAgICAgIH0pfVxuICAgIDwvcD5cbjwvZGl2PlxuPGRpdiBjbGFzcz0nYnV0dG9uLWNvbnRhaW5lcic+XG4gICAgJHtcbiAgICAgICAgbm9UaGFua3NUYXJnZXRVcmxcbiAgICAgICAgICAgID8gYDxhIGhyZWY9JHtub1RoYW5rc1RhcmdldFVybH0gdGFyZ2V0PSdfYmxhbmsnIHJlbD0nbm9yZWZlcnJlcicgY2xhc3M9J2RlbnktYnV0dG9uIGJ1dHRvbiBtYXJnaW4tc21hbGwgcmFkaXVzIG91dGxpbmUgZ3JheSB1LWFsbENhcHMgc2hvdy1kZXNrdG9wJz4ke2h0bWwoXG4gICAgICAgICAgICAgICAgICAnbm9UaGFua3MnXG4gICAgICAgICAgICAgICl9PC9hPmBcbiAgICAgICAgICAgIDogYDxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0nZGVueS1idXR0b24gYnV0dG9uIG1hcmdpbi1zbWFsbCByYWRpdXMgb3V0bGluZSBncmF5IHUtYWxsQ2FwcyBzaG93LWRlc2t0b3AnPiR7aHRtbChcbiAgICAgICAgICAgICAgICAgICdub1RoYW5rcydcbiAgICAgICAgICAgICAgKX08L2J1dHRvbj5gXG4gICAgfVxuXG4gICAgPGJ1dHRvbiB0eXBlPSdidXR0b24nIGNsYXNzPSdjb25maXJtLWJ1dHRvbiBidXR0b24gbWFyZ2luLXNtYWxsIHJhZGl1cyBzZWNvbmRhcnkgY29udHJhc3QgdS1hbGxDYXBzJz4ke2h0bWwoXG4gICAgICAgICdraW5kbGVGdWxmaWxsbWVudC5zZXRQcmVmTW9kYWwuc2V0UHJlZidcbiAgICApfTwvYnV0dG9uPlxuXG4gICAgJHtcbiAgICAgICAgbm9UaGFua3NUYXJnZXRVcmxcbiAgICAgICAgICAgID8gYDxhIGhyZWY9JHtub1RoYW5rc1RhcmdldFVybH0gdGFyZ2V0PSdfYmxhbmsnIHJlbD0nbm9yZWZlcnJlcicgY2xhc3M9J2RlbnktYnV0dG9uIGJ1dHRvbiBtYXJnaW4tc21hbGwgcmFkaXVzIG91dGxpbmUgZ3JheSB1LWFsbENhcHMgc2hvdy1tb2JpbGUnPiR7aHRtbChcbiAgICAgICAgICAgICAgICAgICdub1RoYW5rcydcbiAgICAgICAgICAgICAgKX08L2E+YFxuICAgICAgICAgICAgOiBgPGJ1dHRvbiB0eXBlPSdidXR0b24nIGNsYXNzPSdkZW55LWJ1dHRvbiBidXR0b24gbWFyZ2luLXNtYWxsIHJhZGl1cyBvdXRsaW5lIGdyYXkgdS1hbGxDYXBzIHNob3ctbW9iaWxlJz4ke2h0bWwoXG4gICAgICAgICAgICAgICAgICAnbm9UaGFua3MnXG4gICAgICAgICAgICAgICl9PC9idXR0b24+YFxuICAgIH1cbjwvZGl2PlxuYDtcbiIsImNvbnN0IHsgaHRtbCwgdXJsLCByb3V0ZXMgfSA9IHdpbmRvdztcblxuZXhwb3J0IGRlZmF1bHQgKHsgd2FzU3VjY2Vzc2Z1bCwgYnV0dG9uVGV4dCwgY29udGludWVUYXJnZXRVcmwgfSkgPT4gYFxuPGRpdiBjbGFzcz0naW5mby1jb250YWluZXInPlxuICAgICR7XG4gICAgICAgIHdhc1N1Y2Nlc3NmdWxcbiAgICAgICAgICAgID8gYFxuICAgICAgICA8cD4ke2h0bWwoJ2tpbmRsZUZ1bGZpbGxtZW50LnNldFByZWZTdWNjZXNzTW9kYWwuc3VjY2Vzc01zZycpfTwvcD5cbiAgICBgXG4gICAgICAgICAgICA6IGBcbiAgICAgICAgPHA+JHtodG1sKCdraW5kbGVGdWxmaWxsbWVudC5zZXRQcmVmRXJyb3JNb2RhbC5lcnJvck1zZycsIHtcbiAgICAgICAgICAgIGFjY291bnRTZXR0aW5nc0xpbms6IGA8YSBocmVmPScke3VybChcbiAgICAgICAgICAgICAgICByb3V0ZXMuYWNjb3VudFNldHRpbmdzXG4gICAgICAgICAgICApfSc+JHtodG1sKCdhY2NvdW50U2V0dGluZ3MuYWNjb3VudFNldHRpbmdzJyl9PC9hPmAsXG4gICAgICAgIH0pfTwvcD5cbiAgICBgXG4gICAgfVxuPC9kaXY+XG48ZGl2IGNsYXNzPSdidXR0b24tY29udGFpbmVyJz5cbiAgICAke1xuICAgICAgICBjb250aW51ZVRhcmdldFVybFxuICAgICAgICAgICAgPyBgPGEgaHJlZj0ke2NvbnRpbnVlVGFyZ2V0VXJsfSB0YXJnZXQ9J19ibGFuaycgcmVsPSdub3JlZmVycmVyJyBjbGFzcz0nY29udGludWUtYnV0dG9uIGJ1dHRvbiBtYXJnaW4tc21hbGwgcmFkaXVzIHNlY29uZGFyeSBjb250cmFzdCB1LWFsbENhcHMnPlxuICAgICAgICAgICAgICAgICR7YnV0dG9uVGV4dH1cbiAgICAgICAgICAgPC9hPmBcbiAgICAgICAgICAgIDogYDxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0nY29udGludWUtYnV0dG9uIGJ1dHRvbiBtYXJnaW4tc21hbGwgcmFkaXVzIHNlY29uZGFyeSBjb250cmFzdCB1LWFsbENhcHMnPlxuICAgICAgICAgICAgICAgICR7YnV0dG9uVGV4dH1cbiAgICAgICAgICAgPC9idXR0b24+YFxuICAgIH1cbjwvZGl2PlxuYDtcbiIsImltcG9ydCB7IE1vZGFsIH0gICAgICAgICAgICAgICAgICAgICAgICBmcm9tICcuLi8uLi9jb21tb24vbW9kYWwnO1xuaW1wb3J0IEtpbmRsZVByZWZlcmVuY2VNb2RhbFRlbXBsYXRlICAgIGZyb20gJy4uL3RlbXBsYXRlcy9LaW5kbGVQcmVmZXJlbmNlTW9kYWwuaHRtbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEtpbmRsZVByZWZlcmVuY2VNb2RhbCBleHRlbmRzIE1vZGFsIHtcbiAgICBjb25zdHJ1Y3Rvcihub1RoYW5rc1RhcmdldFVybCkge1xuICAgICAgICBjb25zdCBtb2RhbENvbnRlbnRzID0ge1xuICAgICAgICAgICAgY2xhc3NlczogWydLaW5kbGVQcmVmZXJlbmNlTW9kYWwnXSxcbiAgICAgICAgICAgIHRpdGxlOiB3aW5kb3cuaHRtbCgna2luZGxlRnVsZmlsbG1lbnQuc2V0UHJlZk1vZGFsLmhlYWRpbmcnKSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IEtpbmRsZVByZWZlcmVuY2VNb2RhbFRlbXBsYXRlKG5vVGhhbmtzVGFyZ2V0VXJsKSxcbiAgICAgICAgICAgIGNsb3NlT25Fc2M6IGZhbHNlLFxuICAgICAgICAgICAgY2xvc2VPbkJsdXI6IGZhbHNlXG4gICAgICAgIH07XG4gICAgICAgIHN1cGVyKG1vZGFsQ29udGVudHMpO1xuXG4gICAgICAgIGxldCBraW5kbGVMb2dvID0gYDxkaXYgY2xhc3M9J2xvZ28tY29udGFpbmVyJz48aW1nIHNyYz0naHR0cHM6Ly9pbWFnZXMub3ZlcmRyaXZlLmNvbS9taXNjL2tpbmRsZS9LaW5kbGUtaWNvbi5wbmcnIGFsdD0nJHtodG1sKCdraW5kbGVGdWxmaWxsbWVudC5raW5kbGUnKX0nIC8+PC9kaXY+YDtcbiAgICAgICAgdGhpcy4kdGl0bGUuYmVmb3JlKGtpbmRsZUxvZ28pO1xuXG4gICAgICAgIHRoaXMuJGVsLmZpbmQoJy5jbG9zZS1yZXZlYWwtbW9kYWwnKS5yZW1vdmUoKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgeyBNb2RhbCB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyb20gJy4uLy4uL2NvbW1vbi9tb2RhbCc7XG5pbXBvcnQgS2luZGxlUHJlZmVyZW5jZVJlc3VsdE1vZGFsVGVtcGxhdGUgIGZyb20gJy4uL3RlbXBsYXRlcy9LaW5kbGVQcmVmZXJlbmNlUmVzdWx0TW9kYWwuaHRtbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEtpbmRsZVByZWZlcmVuY2VTdWNjZXNzTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XG4gICAgY29uc3RydWN0b3IoeyB3YXNTdWNjZXNzZnVsLCBidXR0b25UZXh0LCBjb250aW51ZVRhcmdldFVybCB9KSB7XG4gICAgICAgIGNvbnN0IG1vZGFsQ29udGVudHMgPSB7XG4gICAgICAgICAgICBjbGFzc2VzOiBbJ0tpbmRsZVByZWZlcmVuY2VSZXN1bHRNb2RhbCddLFxuICAgICAgICAgICAgdGl0bGU6IHdhc1N1Y2Nlc3NmdWwgPyB3aW5kb3cuaHRtbCgnZ2VuZXJpY1N1Y2Nlc3MnKSA6IHdpbmRvdy5odG1sKCdnZW5lcmljRXJyb3InKSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IEtpbmRsZVByZWZlcmVuY2VSZXN1bHRNb2RhbFRlbXBsYXRlKHt3YXNTdWNjZXNzZnVsLCBidXR0b25UZXh0LCBjb250aW51ZVRhcmdldFVybH0pXG4gICAgICAgIH07XG4gICAgICAgIHN1cGVyKG1vZGFsQ29udGVudHMpO1xuXG4gICAgICAgIGxldCBraW5kbGVMb2dvID0gYDxkaXYgY2xhc3M9J2xvZ28tY29udGFpbmVyJz48aW1nIHNyYz0naHR0cHM6Ly9pbWFnZXMub3ZlcmRyaXZlLmNvbS9taXNjL2tpbmRsZS9LaW5kbGUtaWNvbi5wbmcnIGFsdD0nJHtodG1sKCdraW5kbGVGdWxmaWxsbWVudC5raW5kbGUnKX0nIC8+PC9kaXY+YDtcbiAgICAgICAgdGhpcy4kdGl0bGUuYmVmb3JlKGtpbmRsZUxvZ28pO1xuXG4gICAgICAgIHRoaXMuJGVsLmZpbmQoJy5jb250aW51ZS1idXR0b24nKS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2Nsb3NlJyk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCBMYW5ndWFnZVNlbGVjdGlvblZpZXcgZnJvbSAnLi92aWV3cy9sYW5ndWFnZV9zZWxlY3Rpb24nO1xuaW1wb3J0IFByZWZlcmVuY2VzTW9kZWwgZnJvbSAnLi4vLi4vbW9kZWxzL3ByZWZlcmVuY2VzJztcblxuY29uc3QgY3JlYXRlQ29tcG9uZW50ID0gKHtlbCwgZm9vdGVyRWwsIG1vYmlsZUVsLCBtb2JpbGVGb290ZXJFbH0pID0+IHtcbiAgICBjb25zdCBwcmVmZXJlbmNlc01vZGVsID0gbmV3IFByZWZlcmVuY2VzTW9kZWwoKTtcbiAgICBwcmVmZXJlbmNlc01vZGVsLnBhcnNlQm9vdHN0cmFwcGVkRGF0YShPdmVyRHJpdmUpO1xuICAgIGNvbnN0IHNlbGVjdGlvblZpZXcgPSBuZXcgTGFuZ3VhZ2VTZWxlY3Rpb25WaWV3KHtlbCwgcHJlZmVyZW5jZXNNb2RlbH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgY29uc3QgZm9vdGVyVmlldyA9IG5ldyBMYW5ndWFnZVNlbGVjdGlvblZpZXcoe2VsOiBmb290ZXJFbCwgcHJlZmVyZW5jZXNNb2RlbH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgY29uc3QgbW9iaWxlVmlldyA9IG5ldyBMYW5ndWFnZVNlbGVjdGlvblZpZXcoe2VsOiBtb2JpbGVFbCwgcHJlZmVyZW5jZXNNb2RlbH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgY29uc3QgbW9iaWxlRm9vdGVyVmlldyA9IG5ldyBMYW5ndWFnZVNlbGVjdGlvblZpZXcoe2VsOiBtb2JpbGVGb290ZXJFbCwgcHJlZmVyZW5jZXNNb2RlbH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG59O1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVDb21wb25lbnQ7XG4iLCJpbXBvcnQgZHlzbGV4aWNCbGFja2xpc3QgZnJvbSAnbGlnaHRuaW5nLWNvbW1vbi9saWIvY29uZmlndXJhdGlvbi9keXNsZXhpY0JsYWNrbGlzdC5qc29uJztcbmltcG9ydCBCYXNlVmlldyBmcm9tICcuLi8uLi8uLi92aWV3cy9iYXNlJztcbmltcG9ydCBrZXljb2RlcyBmcm9tICcuLi8uLi8uLi91dGlsL2tleWNvZGVzJztcbmNvbnN0IG51bWJlcnMgPSByZXF1aXJlKCcuLi8uLi8uLi8uLi8uLi9saWIvbnVtYmVycy5qcycpO1xuXG5jb25zdCBMYW5ndWFnZVNlbGVjdGlvblZpZXcgPSBCYXNlVmlldy5leHRlbmQoe1xuICAgIGV2ZW50czoge1xuICAgICAgICAnY2xpY2sgLmpzLWxhbmd1YWdlTGluayc6ICdsYW5ndWFnZUxpbmtDbGlja2VkJyxcbiAgICAgICAgJ2tleXByZXNzIC5qcy1sYW5ndWFnZUxpbmsnOiAnbGFuZ3VhZ2VMaW5rUHJlc3NlZCdcbiAgICB9LFxuICAgIGluaXRpYWxpemUoe3ByZWZlcmVuY2VzTW9kZWx9KSB7XG4gICAgICAgIHRoaXMubW9kZWwgPSBwcmVmZXJlbmNlc01vZGVsO1xuICAgICAgICB0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsICdjaGFuZ2UnLCB0aGlzLm1vZGVsU2F2ZSk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTGFuZ0xpbmsgPSB0aGlzLiRlbC5maW5kKCcuanMtbGFuZ3VhZ2VMaW5rLnNlbGVjdGVkJyk7XG4gICAgICAgIGNvbnN0IHNlbGVjdGVkTGFuZ05hbWUgPSBzZWxlY3RlZExhbmdMaW5rLnRleHQoKTtcbiAgICAgICAgY29uc3QgbGFuZ3VhZ2VDb2RlID0gdGhpcy5tb2RlbC5nZXQoJ2xhbmd1YWdlU2VsZWN0aW9uJyk7XG4gICAgICAgIGlmIChzZWxlY3RlZExhbmdOYW1lKSB7XG4gICAgICAgICAgICB0aGlzLiRlbC5maW5kKCcuanMtbGFuZ0Rpc3BsYXlUZXh0JykudGV4dChzZWxlY3RlZExhbmdOYW1lKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVwZGF0ZSBsYW5ndWFnZSBpZiBDb29raWUgZG9lcyBub3QgbWF0Y2ggc2VsZWN0ZWQgbGFuZ3VhZ2VcbiAgICAgICAgaWYgKENvb2tpZXMuZ2V0KCdsYW5ndWFnZS1zZWxlY3Rpb24nKSAmJiBsYW5ndWFnZUNvZGUgIT09IENvb2tpZXMuZ2V0KCdsYW5ndWFnZS1zZWxlY3Rpb24nKSkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVMYW5ndWFnZVByZWZlcmVuY2UoQ29va2llcy5nZXQoJ2xhbmd1YWdlLXNlbGVjdGlvbicpLCBmYWxzZSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIGxhbmd1YWdlTGlua0NsaWNrZWQoZSkge1xuICAgICAgICB0aGlzLnVwZGF0ZUxhbmd1YWdlUHJlZmVyZW5jZSgkKGUuY3VycmVudFRhcmdldCkuZGF0YSgnY29kZScpLCB0cnVlKTtcbiAgICB9LFxuICAgIGxhbmd1YWdlTGlua1ByZXNzZWQoZSkge1xuICAgICAgICBpZiAoZS5rZXlDb2RlID09PSBrZXljb2Rlcy5FTlRFUikge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVMYW5ndWFnZVByZWZlcmVuY2UoJChlLmN1cnJlbnRUYXJnZXQpLmRhdGEoJ2NvZGUnKSwgdHJ1ZSk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHVwZGF0ZUxhbmd1YWdlUHJlZmVyZW5jZShjb2RlLCBjbGlja2VkKSB7XG4gICAgICAgIGNvbnN0IHVwZGF0ZWRQcmVmcyA9IHtcbiAgICAgICAgICAgIGxhbmd1YWdlU2VsZWN0aW9uOiBjb2RlXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gSWYgdGhlIGxhbmd1YWdlIGRvZXMgbm90IHN1cHBvcnQgZHlzbGV4aWMgZm9udCwgcmVtb3ZlIHRoZSBkeXNsZXhpYyBjb29raWVcbiAgICAgICAgaWYgKGR5c2xleGljQmxhY2tsaXN0W2NvZGVdKSB7XG4gICAgICAgICAgICBpZiAoQ29va2llcy5nZXQoJ2R5c2xleGljLXNldHRpbmcnKSkge1xuICAgICAgICAgICAgICAgIC8vIElmIG9uIHRoZSBzZXR0aW5ncyBwYWdlIGFuZCB0aGUgdXNlciBjaGFuZ2VkIHRoZSBkeXNsZXhpYyBzZXR0aW5nLFxuICAgICAgICAgICAgICAgIC8vIHRoZSBsYW5ndWFnZSBzZWxlY3Rpb24gcHJlZmVyZW5jZU1vZGVsIHdvdWxkIG5vdCBiZSB1cGRhdGVkLCBvbmx5IHRoZVxuICAgICAgICAgICAgICAgIC8vIHNldHRpbmdzIHBhZ2UgcHJlZmVyZW5jZXNNb2RlbCB3b3VsZC4gIFRoaXMgYWNjb3VudHMgZm9yIHRoYXQgY2hhbmdlLlxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuYXR0cmlidXRlcy5keXNsZXhpYyA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIENvb2tpZXMucmVtb3ZlKCdkeXNsZXhpYy1zZXR0aW5nJywge3BhdGg6ICcvJ30pO1xuICAgICAgICAgICAgdXBkYXRlZFByZWZzLmR5c2xleGljID0gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm1vZGVsLnNldCh1cGRhdGVkUHJlZnMpO1xuXG4gICAgICAgIGlmICh3aW5kb3cuT3ZlckRyaXZlLmlzQXV0aGVudGljYXRlZCkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5zYXZlKHRoaXMubW9kZWwuZ2V0UGF0Y2hEYXRhKCksIHtcbiAgICAgICAgICAgICAgICBwYXRjaDogdHJ1ZSwgc3VjY2VzczogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldENvb2tpZUFuZFJlZnJlc2goY29kZSwgY2xpY2tlZCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnNldENvb2tpZUFuZFJlZnJlc2goY29kZSwgY2xpY2tlZCk7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIHNldENvb2tpZUFuZFJlZnJlc2gobGFuZ3VhZ2VTZWxlY3Rpb25WYWx1ZSwgY2xpY2tlZCkge1xuICAgICAgICAvLyBEZWxldGUgYW55IGV4aXN0aW5nIGxhbmd1YWdlIHNlbGVjdGlvbiBjb29raWUgdG8gcHJldmVudCBlZGdlIGNhc2Ugd2hlcmUgbXVsdGlwbGUgY29va2llcyBhcmUgc2V0XG4gICAgICAgIENvb2tpZXMucmVtb3ZlKCdsYW5ndWFnZS1zZWxlY3Rpb24nLCB7cGF0aDogJy8nfSk7XG5cbiAgICAgICAgbGV0IGRvbWFpbiA9IHdpbmRvdy5sb2NhdGlvbi5ob3N0bmFtZSB8fCAnb3ZlcmRyaXZlLmNvbSc7XG4gICAgICAgIGRvbWFpbiA9ICcuJyArIGRvbWFpbi5zcGxpdCgnLicpLnNwbGljZSgtMikuam9pbignLicpOyAvLyBncmFiIGV2ZXJ5dGhpbmcgYWZ0ZXIgc2Vjb25kLXRvLWxhc3QgcGVyaW9kXG5cbiAgICAgICAgQ29va2llcy5zZXQoJ2xhbmd1YWdlLXNlbGVjdGlvbicsIGxhbmd1YWdlU2VsZWN0aW9uVmFsdWUsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaHR0cE9ubHk6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGV4cGlyZXM6IG5ldyBEYXRlKERhdGUubm93KCkgKyBudW1iZXJzLnllYXJJbk1pbGxpc2Vjb25kcyksXG4gICAgICAgICAgICAgICAgZG9tYWluOiBkb21haW4sXG4gICAgICAgICAgICAgICAgb3ZlcndyaXRlOiB0cnVlLFxuICAgICAgICAgICAgICAgIHBhdGg6ICcvJ1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFByZXZlbnRzIHJlZnJlc2ggbG9vcCB3aGVuIGVycm9ycyBvY2N1ciBvciBjYW5ub3QgcmV0cmlldmUgYXV0aFxuICAgICAgICBpZiAod2luZG93Lk92ZXJEcml2ZS5hdXRoVHlwZSAhPT0gJ2Vycm9yJyB8fCBjbGlja2VkKSB7XG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgTGFuZ3VhZ2VTZWxlY3Rpb25WaWV3O1xuIiwiaW1wb3J0IExlbmRpbmdQZXJpb2QgZnJvbSAnLi4vbWVkaWEvbW9kZWxzL0xlbmRpbmdQZXJpb2QnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMZW5kaW5nUGVyaW9kQ29sbGVjdGlvbiBleHRlbmRzIEJhY2tib25lLkNvbGxlY3Rpb24ge1xuICAgIGdldCBtb2RlbCgpIHtcbiAgICAgICAgcmV0dXJuIExlbmRpbmdQZXJpb2Q7XG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgKHtcbiAgICB0aXRsZSxcbiAgICBjb3ZlcixcbiAgICBsZW5kaW5nUGVyaW9kcyxcbiAgICBpc1JlbmV3YWwsXG4gICAgc2hvd1JlbW92ZUhvbGRPcHRpb24sXG4gICAgcmVtb3ZpbmdIb2xkLFxuICAgIGlzTHVja3lEYXlSZXN0cmljdGVkLFxuICAgIGlzTHVja3lEYXlIb2xkYWJsZSxcbiAgICBsdWNreURheUxlbmRpbmdQZXJpb2QsXG4gICAgY2xhc3NpZmljYXRpb25zLFxufSkgPT4gYFxuPGRpdiBjbGFzcz0nY29udGVudCc+XG4gICAgPGRpdiBjbGFzcz0ncm93Jz5cbiAgICAgICAgPGRpdiBjbGFzcz0nc21hbGwtNSBjb2x1bW5zIGNvdmVyJz5cbiAgICAgICAgICAgICR7Y292ZXIuJGVsLmh0bWwoKX1cbiAgICAgICAgPC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9J3NtYWxsLTcgY29sdW1ucyBkYXRhJz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9J3Jvdyc+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nc21hbGwtMTIgY29sdW1ucyB0aXRsZSc+JHt0aXRsZS5nZXQoJ3RpdGxlJyl9PC9kaXY+XG4gICAgICAgICAgICAgICAgJHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGUuZ2V0KCdzZXJpZXMnKSAmJiAhdGl0bGUuaXNNYWdhemluZVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgPGRpdiBjbGFzcz0nc21hbGwtMTIgY29sdW1ucyc+JHt0aXRsZS5nZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc2VyaWVzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICApfTwvZGl2PmBcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGUuaXNNYWdhemluZSAmJiB0aXRsZS5nZXQoJ2VkaXRpb24nKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgPGRpdiBjbGFzcz0nc21hbGwtMTIgY29sdW1ucyc+JHt0aXRsZS5nZXQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZWRpdGlvbidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKX08L2Rpdj5gXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICcnXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZS1mb3JtYXQtYmFkZ2UgY29udHJhc3QgdS1hbGxDYXBzXCI+PGkgY2xhc3M9XCJpY29uLSR7XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlLmdldCgndHlwZScpLmlkXG4gICAgICAgICAgICAgICAgfVwiPjwvaT4ke3dpbmRvdy5odG1sKHRpdGxlLmdldCgndHlwZScpLmlkKX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdzbWFsbC0xMiBjb2x1bW5zIGxlbmRpbmctcGVyaW9kJz5cbiAgICAgICAgICAgICAgICAgICAgJHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxlbmRpbmdQZXJpb2RzLmxlbmd0aCA+IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHdpbmRvdy5odG1sKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVuZXdhbFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdyZW5ld2FsLnJlbmV3Rm9yVGV4dEh0bWwnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ2JvcnJvd0ZvclRleHRIdG1sJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IGBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J2xlbmRpbmctcGVyaW9kLWRyb3Bkb3duJz48c2VsZWN0IGNsYXNzPSdsZW5kaW5nLXBlcmlvZC1zZWxlY3QnIGRhdGEtb3Blbj1cImZhbHNlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtsZW5kaW5nUGVyaW9kcy5tYXAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsZW5kaW5nUGVyaW9kKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDxvcHRpb24gdmFsdWU9JyR7bGVuZGluZ1BlcmlvZC5jaWR9JyAke1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmRpbmdQZXJpb2QuZ2V0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaXNQcmVmZXJyZWRMZW5kaW5nUGVyaW9kJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAnc2VsZWN0ZWQnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3dpbmRvdy5odG1sKCdhY2NvdW50TG9hbnMuZXhwaXJlc0RheXMnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZTogbGVuZGluZ1BlcmlvZC5wZXJpb2QuZGF5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L29wdGlvbj5gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvc2VsZWN0PjxpIGNsYXNzPSdpY29uLWRvd24tYXJyb3cnPjwvaT48L2Rpdj5gLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGlzTHVja3lEYXlSZXN0cmljdGVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBpc0x1Y2t5RGF5SG9sZGFibGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyB3aW5kb3cuaHRtbCgnbHVja3lEYXkucmVzdHJpY3RlZEFsbG93SG9sZHMnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheXM6IGx1Y2t5RGF5TGVuZGluZ1BlcmlvZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRpdGxlLmdldCgnaXNPbkhvbGQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHdpbmRvdy5odG1sKCdsdWNreURheS5yZXN0cmljdGVkT25Ib2xkJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXlzOiBsdWNreURheUxlbmRpbmdQZXJpb2QsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB3aW5kb3cuaHRtbCgnbHVja3lEYXkucmVzdHJpY3RlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5czogbHVja3lEYXlMZW5kaW5nUGVyaW9kLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBsZW5kaW5nUGVyaW9kcy5maXJzdCgpLmxhYmVsXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPSdyb3cgbWF0dXJpdHktcmF0aW5ncyc+XG4gICAgICAgICR7Y2xhc3NpZmljYXRpb25zXG4gICAgICAgICAgICAubWFwKFxuICAgICAgICAgICAgICAgIChjbGFzc2lmaWNhdGlvbikgPT5cbiAgICAgICAgICAgICAgICAgICAgYDxkaXYgY2xhc3M9J3JhdGluZy1jbGFzc2lmaWNhdGlvbic+XG4gICAgICAgICAgICAgICAgICAgICAgICA8aW1nIHNyYz0nJHtjbGFzc2lmaWNhdGlvbi5yYXRpbmdJbWFnZX0nIGFsdD0nJHtjbGFzc2lmaWNhdGlvbi5yYXRpbmdJbWFnZUFsdH0nIC8+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdyYXRpbmcnIGFyaWEtaGlkZGVuPSd0cnVlJz4gJHtjbGFzc2lmaWNhdGlvbi5yYXRpbmdUZXh0fSA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J3JhdGVkLXRpdGxlLXRleHQnIGFyaWEtaGlkZGVuPSd0cnVlJz4gJHtjbGFzc2lmaWNhdGlvbi50aXRsZVJhdGVkfSA8L2Rpdj5gXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuam9pbignJyl9XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz0ncm93IGJ1dHRvbnMnPlxuICAgICR7XG4gICAgICAgIHNob3dSZW1vdmVIb2xkT3B0aW9uXG4gICAgICAgICAgICA/IGA8ZGl2IGNsYXNzPSdidXR0b24tY29sdW1uIG9uSG9sZFJhZGlvQ29udGFpbmVyJz5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9J2hvbGRPcHRpb24gcmVtb3ZlSG9sZCc+PC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPSdob2xkT3B0aW9uIHN0YXlPbkhvbGQnPjwvZGl2PlxuICAgICAgICA8L2Rpdj5gXG4gICAgICAgICAgICA6ICcnXG4gICAgfVxuICAgICR7XG4gICAgICAgIHJlbW92aW5nSG9sZFxuICAgICAgICAgICAgPyBgPGRpdiBjbGFzcz1cInJlbW92aW5nSG9sZFdhcm5pbmdcIj4ke3dpbmRvdy5odG1sKFxuICAgICAgICAgICAgICAgICAgJ2x1Y2t5RGF5LnlvdXJIb2xkUmVtb3ZlZCdcbiAgICAgICAgICAgICAgKX08L2Rpdj5gXG4gICAgICAgICAgICA6ICcnXG4gICAgfVxuICAgIDxkaXYgY2xhc3M9J3NtYWxsLTEyIGNvbHVtbnMgYnV0dG9uLWNvbHVtbic+XG4gICAgICAgIDxidXR0b24gdHlwZT0nYnV0dG9uJyAke1xuICAgICAgICAgICAgaXNMdWNreURheVJlc3RyaWN0ZWRcbiAgICAgICAgICAgICAgICA/ICcnXG4gICAgICAgICAgICAgICAgOiBgYXJpYS1sYWJlbD0nJHt3aW5kb3cuaHRtbChcbiAgICAgICAgICAgICAgICAgICAgICBpc1JlbmV3YWwgPyAncmVuZXdhbC5yZW5ld1RpdGxlJyA6ICdib3Jyb3dUaXRsZScsXG4gICAgICAgICAgICAgICAgICAgICAgeyB0aXRsZTogdGl0bGUuZ2V0KCd0aXRsZScpIH1cbiAgICAgICAgICAgICAgICAgICl9J2BcbiAgICAgICAgfSBjbGFzcz0nYnV0dG9uIHJhZGl1cyBzZWNvbmRhcnkgY29udHJhc3QgdS1hbGxDYXBzIGJvcnJvdy1idXR0b24nPlxuICAgICAgICAgICAgJHtcbiAgICAgICAgICAgICAgICBpc1JlbmV3YWxcbiAgICAgICAgICAgICAgICAgICAgPyB3aW5kb3cuaHRtbCgncmVuZXdhbC5yZW5ldycpXG4gICAgICAgICAgICAgICAgICAgIDogaXNMdWNreURheVJlc3RyaWN0ZWRcbiAgICAgICAgICAgICAgICAgICAgPyB3aW5kb3cuaHRtbCgnbHVja3lEYXkuYm9ycm93Rm9yJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICBkYXlzOiBsdWNreURheUxlbmRpbmdQZXJpb2QsXG4gICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgOiB3aW5kb3cuaHRtbCgnYm9ycm93JylcbiAgICAgICAgICAgIH1cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgJHtcbiAgICAgICAgaXNMdWNreURheUhvbGRhYmxlXG4gICAgICAgICAgICA/IGA8ZGl2IGNsYXNzPSdzbWFsbC0xMiBjb2x1bW5zIGJ1dHRvbi1jb2x1bW4nPlxuICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSdidXR0b24nIGNsYXNzPSdidXR0b24gcmFkaXVzIG91dGxpbmUgdS1hbGxDYXBzIGhvbGQtYnV0dG9uJz5cbiAgICAgICAgICAgICAgICAke3dpbmRvdy5odG1sKCdwbGFjZUhvbGQnKX1cbiAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8L2Rpdj5gXG4gICAgICAgICAgICA6ICcnXG4gICAgfVxuICAgIDxkaXYgY2xhc3M9J3NtYWxsLTEyIGNvbHVtbnMgYnV0dG9uLWNvbHVtbic+XG4gICAgICAgIDxidXR0b24gdHlwZT0nYnV0dG9uJyBhcmlhLWxhYmVsPScke3dpbmRvdy5odG1sKFxuICAgICAgICAgICAgJ2NhbmNlbCdcbiAgICAgICAgKX0nIGNsYXNzPSdidXR0b24gcmFkaXVzIG91dGxpbmUgZ3JheSB1LWFsbENhcHMgY2FuY2VsLWJ1dHRvbic+XG4gICAgICAgICAgICAke3dpbmRvdy5odG1sKCdjYW5jZWwnKX1cbiAgICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gICAgPC9kaXY+XG48ZGl2PlxuYDtcbiIsImltcG9ydCB7IE1vZGFsIH0gZnJvbSAnLi4vY29tbW9uL21vZGFsJztcbmltcG9ydCBQYXRyb25UaXRsZUxlbmRpbmdQZXJpb2RzIGZyb20gJy4vUGF0cm9uVGl0bGVMZW5kaW5nUGVyaW9kcyc7XG5pbXBvcnQgQ292ZXIgZnJvbSAnLi4vbWVkaWEvQ292ZXInO1xuaW1wb3J0IFJhZGlvQnV0dG9uIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvY29tbW9uL1JhZGlvQnV0dG9uJztcblxuaW1wb3J0IExlbmRpbmdQZXJpb2RNb2RhbFRlbXBsYXRlIGZyb20gJy4vTGVuZGluZ1BlcmlvZE1vZGFsLmh0bWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMZW5kaW5nUGVyaW9kTW9kYWwgZXh0ZW5kcyBCYWNrYm9uZS5WaWV3IHtcbiAgICBjb25zdHJ1Y3Rvcih7IGJ1cywgYWN0aW9uLCBvbkVycm9yLCBpc1JlbmV3YWwgPSBmYWxzZSB9KSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG5cbiAgICAgICAgdGhpcy5idXMgPSBidXM7XG4gICAgICAgIHRoaXMuYWN0aW9uID0gYWN0aW9uIHx8ICgoKSA9PiB7fSk7XG4gICAgICAgIHRoaXMub25FcnJvciA9IG9uRXJyb3IgfHwgKCgpID0+IHt9KTtcbiAgICAgICAgdGhpcy5pc1JlbmV3YWwgPSBpc1JlbmV3YWw7XG5cbiAgICAgICAgdGhpcy5jb3ZlciA9IG5ldyBDb3Zlcih7IG1vZGVsOiB0aGlzLm1vZGVsIH0pO1xuICAgICAgICAvLyBFeHBlY3RzIGEgVGl0bGUgb2JqZWN0IGFzIGl0cyBtb2RlbFxuICAgICAgICB0aGlzLnBhdHJvblRpdGxlTGVuZGluZ1BlcmlvZHMgPSBuZXcgUGF0cm9uVGl0bGVMZW5kaW5nUGVyaW9kcyh7XG4gICAgICAgICAgICBtZWRpYUlkOiB0aGlzLm1vZGVsLmdldCgnaWQnKSxcbiAgICAgICAgfSk7XG4gICAgICAgIHRoaXMucGF0cm9uVGl0bGVMZW5kaW5nUGVyaW9kc1xuICAgICAgICAgICAgLmZldGNoRGF0YSgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgbGVuZGluZ1BlcmlvZHMgPVxuICAgICAgICAgICAgICAgICAgICB0aGlzLnBhdHJvblRpdGxlTGVuZGluZ1BlcmlvZHMuZ2V0KCdsZW5kaW5nUGVyaW9kcycpO1xuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc2V0KFxuICAgICAgICAgICAgICAgICAgICAndGl0bGVTdGF0ZScsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaXNSZW5ld2FsID8gJ3JlbmV3JyA6ICdib3Jyb3cnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9vcGVuTW9kYWwobGVuZGluZ1BlcmlvZHMpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLm9uRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX29wZW5Nb2RhbChsZW5kaW5nUGVyaW9kcykge1xuICAgICAgICBsZXQgbWF5YmVDaGVja0hvbGRTdGF0dXMgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMubW9kZWwuZ2V0KCdpc09uSG9sZCcpKSB7XG4gICAgICAgICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgICAgICAgICAgdXJsOiB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMuZ2V0U2luZ2xlSG9sZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJZDogdGhpcy5tb2RlbC5nZXQoJ2lkJyksXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnR0VUJyxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAuZG9uZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuc2V0KCdpc1JlbGVhc2VkSG9sZCcsIHJlc3BvbnNlLmlzQXZhaWxhYmxlKTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLmFsd2F5cygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG1heWJlQ2hlY2tIb2xkU3RhdHVzLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgbGV0IGlzTHVja3lEYXlSZXN0cmljdGVkID1cbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmlzTHVja3lEYXlDaGVja291dCAmJlxuICAgICAgICAgICAgICAgICEhd2luZG93Lk92ZXJEcml2ZS5MdWNreURheUxlbmRpbmdQZXJpb2RzQnlGb3JtYXQgJiZcbiAgICAgICAgICAgICAgICAhIXdpbmRvdy5PdmVyRHJpdmUuTHVja3lEYXlMZW5kaW5nUGVyaW9kc0J5Rm9ybWF0W1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmdldCgndHlwZScpLmlkXG4gICAgICAgICAgICAgICAgXSAmJlxuICAgICAgICAgICAgICAgICF0aGlzLmlzUmVuZXdhbDtcblxuICAgICAgICAgICAgbGV0IGlzTHVja3lEYXlIb2xkYWJsZSA9XG4gICAgICAgICAgICAgICAgaXNMdWNreURheVJlc3RyaWN0ZWQgJiZcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmNhblBsYWNlSG9sZCAmJlxuICAgICAgICAgICAgICAgICF0aGlzLm1vZGVsLmFsbENvcGllc0FyZUx1Y2t5RGF5O1xuXG4gICAgICAgICAgICBsZXQgbHVja3lEYXlMZW5kaW5nUGVyaW9kO1xuICAgICAgICAgICAgaWYgKGlzTHVja3lEYXlSZXN0cmljdGVkKSB7XG4gICAgICAgICAgICAgICAgbHVja3lEYXlMZW5kaW5nUGVyaW9kID1cbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lk92ZXJEcml2ZS5MdWNreURheUxlbmRpbmdQZXJpb2RzQnlGb3JtYXRbXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmdldCgndHlwZScpLmlkXG4gICAgICAgICAgICAgICAgICAgIF07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBzaG93UmVtb3ZlSG9sZE9wdGlvbiA9XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5pc0x1Y2t5RGF5Q2hlY2tvdXQgJiZcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmdldCgnaXNPbkhvbGQnKSAmJlxuICAgICAgICAgICAgICAgICF0aGlzLm1vZGVsLmdldCgnaXNSZWxlYXNlZEhvbGQnKSAmJlxuICAgICAgICAgICAgICAgIGlzTHVja3lEYXlSZXN0cmljdGVkO1xuXG4gICAgICAgICAgICBsZXQgcmVtb3ZlSG9sZCA9XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5pc0x1Y2t5RGF5Q2hlY2tvdXQgJiZcbiAgICAgICAgICAgICAgICAhc2hvd1JlbW92ZUhvbGRPcHRpb24gJiZcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmdldCgnaXNPbkhvbGQnKTtcblxuICAgICAgICAgICAgbGV0IG1vZGFsVGl0bGU7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1JlbmV3YWwpIHtcbiAgICAgICAgICAgICAgICBtb2RhbFRpdGxlID0gd2luZG93Lmh0bWwoJ3JlbmV3YWwucmVuZXdIZWFkaW5nJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzTHVja3lEYXlSZXN0cmljdGVkKSB7XG4gICAgICAgICAgICAgICAgbW9kYWxUaXRsZSA9IHdpbmRvdy5odG1sKCdsdWNreURheS54RGF5TG9hbicsIHtcbiAgICAgICAgICAgICAgICAgICAgZGF5czogbHVja3lEYXlMZW5kaW5nUGVyaW9kLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtb2RhbFRpdGxlID0gd2luZG93Lmh0bWwoJ2JvcnJvdycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBjbGFzc2lmaWNhdGlvbnMgPSBbXTtcbiAgICAgICAgICAgIGxldCB0aXRsZVJhdGluZ3MgPSB0aGlzLm1vZGVsLmF0dHJpYnV0ZXMuY2xhc3NpZmljYXRpb25zO1xuICAgICAgICAgICAgaWYgKHdpbmRvdy5PdmVyRHJpdmUuY2xhc3NpZmllcklkcyAmJiB0aXRsZVJhdGluZ3MpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGlkIG9mIHdpbmRvdy5PdmVyRHJpdmUuY2xhc3NpZmllcklkcykge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGl0bGVSYXRpbmdzW2lkXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmV3Q2xhc3NpZmljYXRpb24gPSB7fTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NsYXNzaWZpY2F0aW9uLnJhdGluZ1RleHQgPSB3aW5kb3cuaHRtbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgbWF0dXJpdHlSYXRpbmdzLiR7aWR9LiR7dGl0bGVSYXRpbmdzW2lkXS5sYWJlbH0gSGVhZGVyYFxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NsYXNzaWZpY2F0aW9uLnRpdGxlUmF0ZWQgPSB3aW5kb3cuaHRtbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgbWF0dXJpdHlSYXRpbmdzLiR7aWR9LnRpdGxlUmF0ZWRgXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2xhc3NpZmljYXRpb24ucmF0aW5nSW1hZ2UgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlUmF0aW5nc1tpZF0uaW1hZ2VQYXRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q2xhc3NpZmljYXRpb24ucmF0aW5nSW1hZ2VBbHQgPSB3aW5kb3cuaHRtbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgbWF0dXJpdHlSYXRpbmdzLiR7aWR9LnNjcmVlblJlYWRlclJhdGluZ2AsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXRlZ29yeTogd2luZG93Lmh0bWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgbWF0dXJpdHlSYXRpbmdzLiR7aWR9LiR7dGl0bGVSYXRpbmdzW2lkXS5sYWJlbH1gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzaWZpY2F0aW9ucy5wdXNoKG5ld0NsYXNzaWZpY2F0aW9uKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgY29uc3QgbW9kYWxDb250ZW50cyA9IHtcbiAgICAgICAgICAgICAgICBjbGFzc2VzOiBbJ0xlbmRpbmdQZXJpb2RNb2RhbCcsICdzbWFsbCddLFxuICAgICAgICAgICAgICAgIHRpdGxlOiBtb2RhbFRpdGxlLFxuICAgICAgICAgICAgICAgIGhpZGRlblRpdGxlOiAhaXNMdWNreURheVJlc3RyaWN0ZWQsXG4gICAgICAgICAgICAgICAgY29udGVudDogTGVuZGluZ1BlcmlvZE1vZGFsVGVtcGxhdGUoe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZTogdGhpcy5tb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgY292ZXI6IHRoaXMuY292ZXIsXG4gICAgICAgICAgICAgICAgICAgIGxlbmRpbmdQZXJpb2RzOiBpc0x1Y2t5RGF5UmVzdHJpY3RlZCA/IFtdIDogbGVuZGluZ1BlcmlvZHMsXG4gICAgICAgICAgICAgICAgICAgIGlzUmVuZXdhbDogdGhpcy5pc1JlbmV3YWwsXG4gICAgICAgICAgICAgICAgICAgIHNob3dSZW1vdmVIb2xkT3B0aW9uLFxuICAgICAgICAgICAgICAgICAgICByZW1vdmluZ0hvbGQ6IHJlbW92ZUhvbGQsXG4gICAgICAgICAgICAgICAgICAgIGlzTHVja3lEYXlSZXN0cmljdGVkLFxuICAgICAgICAgICAgICAgICAgICBpc0x1Y2t5RGF5SG9sZGFibGUsXG4gICAgICAgICAgICAgICAgICAgIGx1Y2t5RGF5TGVuZGluZ1BlcmlvZCxcbiAgICAgICAgICAgICAgICAgICAgY2xhc3NpZmljYXRpb25zLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRoaXMubW9kYWwgPSBuZXcgTW9kYWwobW9kYWxDb250ZW50cyk7XG4gICAgICAgICAgICBjb25zdCAkbW9kYWxFbCA9IHRoaXMubW9kYWwuJGVsO1xuXG4gICAgICAgICAgICBpZiAoc2hvd1JlbW92ZUhvbGRPcHRpb24pIHtcbiAgICAgICAgICAgICAgICBuZXcgUmFkaW9CdXR0b24oe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY2hlY2tlZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZWw6ICcucmVtb3ZlSG9sZCcsXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzTmFtZTogJ3JlbW92ZUhvbGRPcHRpb24nLFxuICAgICAgICAgICAgICAgICAgICBuYW1lOiAncmVtb3ZlSG9sZE9wdGlvbicsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiB3aW5kb3cuaHRtbCgnYWNjb3VudEhvbGRzLnJlbW92ZUhvbGRMYWJlbCcpLFxuICAgICAgICAgICAgICAgICAgICByaWQ6IDAsXG4gICAgICAgICAgICAgICAgfSkucmVuZGVyKCk7XG5cbiAgICAgICAgICAgICAgICBuZXcgUmFkaW9CdXR0b24oe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIGVsOiAnLnN0YXlPbkhvbGQnLFxuICAgICAgICAgICAgICAgICAgICBjbGFzc05hbWU6ICdyZW1vdmVIb2xkT3B0aW9uJyxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJ3JlbW92ZUhvbGRPcHRpb24nLFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogd2luZG93Lmh0bWwoJ2FjY291bnRIb2xkcy5zdGF5T25Ib2xkJyksXG4gICAgICAgICAgICAgICAgICAgIHJpZDogMCxcbiAgICAgICAgICAgICAgICB9KS5yZW5kZXIoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJG1vZGFsRWwub24oJ2NsaWNrJywgJy5jYW5jZWwtYnV0dG9uJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kYWwuY2xvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAkbW9kYWxFbC5vbignY2xpY2snLCAnLmJvcnJvdy1idXR0b24nLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IHNlbGVjdGVkTGVuZGluZ1BlcmlvZDtcbiAgICAgICAgICAgICAgICBpZiAoaXNMdWNreURheVJlc3RyaWN0ZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRMZW5kaW5nUGVyaW9kID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHM6ICdkYXlzJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJlZmVycmVkTGVuZGluZ1BlcmlvZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZW5kaW5nUGVyaW9kOiBsdWNreURheUxlbmRpbmdQZXJpb2QsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRMZW5kaW5nUGVyaW9kID1cbiAgICAgICAgICAgICAgICAgICAgICAgIGxlbmRpbmdQZXJpb2RzLmxlbmd0aCA+IDFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGxlbmRpbmdQZXJpb2RzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG1vZGFsRWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5maW5kKCcubGVuZGluZy1wZXJpb2Qtc2VsZWN0JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC52YWwoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9KU09OKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGxlbmRpbmdQZXJpb2RzLmZpcnN0KCkudG9KU09OKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5zZXQoJ2xlbmRpbmdQZXJpb2QnLCBzZWxlY3RlZExlbmRpbmdQZXJpb2QpO1xuXG4gICAgICAgICAgICAgICAgJG1vZGFsRWxcbiAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5ib3Jyb3ctYnV0dG9uJylcbiAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCd3YWl0aW5nJylcbiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj4nKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuYWN0aW9uKHRoaXMubW9kYWwpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICRtb2RhbEVsLm9uKCdjbGljaycsICcuaG9sZC1idXR0b24nLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC50cmlnZ2VyKCd0aXRsZTphY3Rpb24nLCB7XG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbjogJ2hvbGQnLFxuICAgICAgICAgICAgICAgICAgICBtb2RlbDogdGhpcy5tb2RlbCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAkbW9kYWxFbFxuICAgICAgICAgICAgICAgICAgICAuZmluZCgnLmhvbGQtYnV0dG9uJylcbiAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCd3YWl0aW5nJylcbiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgnPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj4nKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1cy5vbigndGl0bGU6aG9sZDplbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kYWwuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAkbW9kYWxFbC5vbignY2hhbmdlJywgJy5yZW1vdmVIb2xkT3B0aW9uJywgKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlSG9sZCA9IGV2ZW50LnRhcmdldC52YWx1ZSA9PT0gJ3RydWUnO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCAnLi4vLi4vdXRpbC9Qcm9taXNlJztcbmltcG9ydCBMZW5kaW5nUGVyaW9kQ29sbGVjdGlvbiAgZnJvbSAnLi9MZW5kaW5nUGVyaW9kQ29sbGVjdGlvbic7XG5cbmNvbnN0IHsgTG9nZ2VyLCB1cmwsIHJvdXRlcyB9ID0gd2luZG93O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBQYXRyb25UaXRsZUxlbmRpbmdQZXJpb2RzIGV4dGVuZHMgQmFja2JvbmUuTW9kZWwge1xuICAgIGRlZmF1bHRzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWVkaWFJZDogMCxcbiAgICAgICAgICAgIGxlbmRpbmdQZXJpb2RzOiBuZXcgTGVuZGluZ1BlcmlvZENvbGxlY3Rpb24oKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGZldGNoRGF0YSgpIHtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWpheCh7XG4gICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgdXJsOiB1cmwocm91dGVzLnBhdHJvbkxlbmRpbmdQZXJpb2QsIHttZWRpYUlkOiB0aGlzLmdldCgnbWVkaWFJZCcpfSksXG4gICAgICAgICAgICB0aW1lb3V0OiAxMDAwMFxuICAgICAgICB9KVxuICAgICAgICAvLyBTZXQgb3VyIG1vZGVsIGJ1dCBwYXNzIHRoZSBkYXRhIGFsb25nIGluIGNhc2UgdGhlIGNhbGxlciB3YW50cyB0byB1c2UgaXQgZm9yIHNvbWV0aGluZyBlbHNlXG4gICAgICAgICAgICAudGhlbigocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmdldCgnbGVuZGluZ1BlcmlvZHMnKS5zZXQocmVzcG9uc2UpO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXNwb25zZTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAvLyBDYXRjaCBlcnJvcnMsIGxvZyB0aGVtLCBhbmQgdGhlbiBsZXQgdGhlIGNhbGwgZmFpbFxuICAgICAgICAgICAgLmNhdGNoKChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIExvZ2dlci5sb2coJ2Vycm9yJywgJ0ZhaWx1cmUgZmV0Y2hpbmcgcGF0cm9uIGxlbmRpbmcgcGVyaW9kcyBmb3IgdGl0bGUnLCB7bWVkaWFJZDogdGhpcy5nZXQoJ21lZGlhSWQnKSwgZXJyb3J9KTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCB7IHRvU3RhdGljVXJsIH0gZnJvbSAnLi4vLi4vLi4vLi4vbGliL2Fzc2V0TWFwcGVyJztcblxuY29uc3QgYXdhcmRCYWRnZSA9ICh7IGFsdCwgc3JjIH0pID0+XG4gICAgYDxpbWcgYWx0PVwiJHthbHR9XCIgY2xhc3M9XCJsaWJieS1hcHAtZ3JvdXBfX2F3YXJkLWljb25cIiBzcmM9XCIke3RvU3RhdGljVXJsKHNyYyl9XCIgLz5gO1xuXG5jb25zdCBhcHBsZUFwcFN0b3JlQXdhcmRCYWRnZSA9IChoaWdoQ29udHJhc3QpID0+IHtcbiAgICBjb25zdCBzcmMgPSBoaWdoQ29udHJhc3RcbiAgICAgICAgPyAnaW1nL2FwcGxlLWFwcC1zdG9yZS9hcHAtb2YtdGhlLWRheS0td2hpdGUuc3ZnJ1xuICAgICAgICA6ICdpbWcvYXBwbGUtYXBwLXN0b3JlL2FwcC1vZi10aGUtZGF5LS1ibGFjay5zdmcnO1xuICAgIHJldHVybiBhd2FyZEJhZGdlKHsgYWx0OiBodG1sKCdsaWJieS5hd2FyZEFwcGxlQXBwU3RvcmUnKSwgc3JjIH0pO1xufTtcblxuY29uc3QgZ29vZ2xlUGxheVN0b3JlQXdhcmRCYWRnZSA9IChoaWdoQ29udHJhc3QpID0+IHtcbiAgICBjb25zdCBzcmMgPSBoaWdoQ29udHJhc3RcbiAgICAgICAgPyAnaW1nL2dvb2dsZS1wbGF5LXN0b3JlL2VkaXRvcnMtY2hvaWNlLS13aGl0ZS5zdmcnXG4gICAgICAgIDogJ2ltZy9nb29nbGUtcGxheS1zdG9yZS9lZGl0b3JzLWNob2ljZS0tYmxhY2suc3ZnJztcbiAgICByZXR1cm4gYXdhcmRCYWRnZSh7IGFsdDogaHRtbCgnbGliYnkuYXdhcmRHb29nbGVQbGF5U3RvcmUnKSwgc3JjIH0pO1xufTtcblxuZXhwb3J0IGNvbnN0IGF3YXJkcyA9IChoaWdoQ29udHJhc3QpID0+IGBcbiAgICA8ZGl2IGNsYXNzPVwibGliYnktYXBwLWdyb3VwX19yb3cgSUUtbWFyZ2luXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsaWJieS1hcHAtZ3JvdXBfX2NvbHVtbiBsaWJieS1hcHAtZ3JvdXBfX2F3YXJkLWNvbHVtblwiPlxuICAgICAgICAgICAgJHthcHBsZUFwcFN0b3JlQXdhcmRCYWRnZShoaWdoQ29udHJhc3QpfVxuICAgICAgICAgICAgJHtnb29nbGVQbGF5U3RvcmVBd2FyZEJhZGdlKGhpZ2hDb250cmFzdCl9XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuYDtcbiIsImltcG9ydCB7IHRvU3RhdGljVXJsIH0gZnJvbSAnLi4vLi4vLi4vLi4vbGliL2Fzc2V0TWFwcGVyJztcbmltcG9ydCB7IGFwcGxlQXBwU3RvcmVCYWRnZSwgZ29vZ2xlUGxheVN0b3JlQmFkZ2UgfSBmcm9tICcuLi9hcHAtYmFkZ2UvYXBwLWJhZGdlLmh0bWwnO1xuaW1wb3J0IHsgYXdhcmRzIH0gZnJvbSAnLi9hcHAtc3RvcmUtYXdhcmRzLmh0bWwnO1xuXG5jb25zdCBodG1sID0gKGtleSkgPT4gd2luZG93Lmh0bWwoa2V5KTtcbmNvbnN0IHRleHQgPSAoa2V5KSA9PiB3aW5kb3cudGV4dChrZXkpO1xuXG5jb25zdCBnZXRMb2NhbGUgPSAoKSA9PiAoKHdpbmRvdy5PdmVyRHJpdmUgJiYgd2luZG93Lk92ZXJEcml2ZS5fbG9jYWxlKSB8fCAnZW4nKS50b0xvd2VyQ2FzZSgpO1xuXG5jb25zdCBhcHBTdG9yZUxpbmtzID0gKGFwcGxlQXBwU3RvcmVIcmVmLCBnb29nbGVQbGF5U3RvcmVIcmVmLCBoaWdoQ29udHJhc3QpID0+IGBcbiAgICA8ZGl2IGNsYXNzPVwibGliYnktYXBwLWdyb3VwX19yb3cgSUUtbWFyZ2luXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsaWJieS1hcHAtZ3JvdXBfX2NvbHVtbiBsaWJieS1hcHAtZ3JvdXBfX2FwcC1jb2x1bW5cIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJsaWJieS1hcHAtZ3JvdXBfX2FwcC1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGliYnktYXBwLWdyb3VwX19hcHAtbGliYnlcIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyBhbHQ9XCIke2h0bWwoJ2xpYmJ5LmxpYmJ5SWNvbicpfVwiIGNsYXNzPVwibGliYnktYXBwLWdyb3VwX19hcHAtbGliYnktaWNvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBzcmM9XCIke3RvU3RhdGljVXJsKCdpbWcvTGliYnktQXBwLUljb24uc3ZnJyl9XCIgLz5cblxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz1cImxpYmJ5LWFwcC1ncm91cF9fYXBwLWxpYmJ5LWhlYWRsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3RleHQoJ2xpYmJ5LmxpYmJ5SGVhZGxpbmUnKX1cbiAgICAgICAgICAgICAgICAgICAgPC9zcGFuPiAgICBcbiAgICAgICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJsaWJieS1hcHAtZ3JvdXBfX2FwcC1saWJieS10YWdsaW5lXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3RleHQoJ2xpYmJ5LmxpYmJ5VGFnbGluZScpfVxuICAgICAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGliYnktYXBwLWdyb3VwX19hcHAtbGluay1jb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgJHthcHBsZUFwcFN0b3JlQmFkZ2UoeyBocmVmOiBhcHBsZUFwcFN0b3JlSHJlZiwgaGlnaENvbnRyYXN0LCB1c2VyTGFuZ3VhZ2VDb2RlOiBnZXRMb2NhbGUoKSB9KX1cbiAgICAgICAgICAgICAgICAgICAgJHtnb29nbGVQbGF5U3RvcmVCYWRnZSh7IGhyZWY6IGdvb2dsZVBsYXlTdG9yZUhyZWYsIGhpZ2hDb250cmFzdCwgdXNlckxhbmd1YWdlQ29kZTogZ2V0TG9jYWxlKCkgfSl9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5gO1xuXG5jb25zdCBraW5kbGVGaXJlID0gKHsgaXNLaW5kbGUgfSkgPT5cbiAgICBpc0tpbmRsZSA/ICcnIDpcbiAgICAgICAgYDxkaXYgY2xhc3M9XCJsaWJieS1hcHAtZ3JvdXBfX3JvdyBsaWJieS1hcHAtZ3JvdXBfX2tpbmRsZS1maXJlLXJvd1wiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibGliYnktYXBwLWdyb3VwX19jb2x1bW4gbGliYnktYXBwLWdyb3VwX19raW5kbGUtZmlyZS1jb2x1bW5cIj5cbiAgICAgICAgICAgPHA+XG4gICAgICAgICAgICAgICA8YSBjbGFzcz1cImxpYmJ5LWFwcC1ncm91cF9fa2luZGxlLWZpcmUtbGlua1wiIFxuICAgICAgICAgICAgICAgICAgICBocmVmPVwiaHR0cHM6Ly93d3cub3ZlcmRyaXZlLmNvbS9hcHBzL2xpYmJ5L2tpbmRsZWZpcmVcIiBcbiAgICAgICAgICAgICAgICAgICAgcmVsPVwibm9yZWZlcnJlclwiXG4gICAgICAgICAgICAgICAgICAgIHRhcmdldD1cIl9ibGFua1wiPlxuICAgICAgICAgICAgICAgICAgICAke3RleHQoJ2xpYmJ5LmRvd25sb2FkRnJvbUFtYXpvbkFwcHN0b3JlJyl9XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICA8L3A+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuYDtcblxuZXhwb3J0IGNvbnN0IGxpYmJ5QXBwR3JvdXAgPSAoe1xuICAgIGFwcGxlQXBwU3RvcmVIcmVmLCBnb29nbGVQbGF5U3RvcmVIcmVmLCBoaWdoQ29udHJhc3QsIHNob3dBd2FyZHMsIHNob3dLaW5kbGVGaXJlTGluaywgaXNLaW5kbGVcbn0pID0+IGBcbiAgICA8ZGl2IGNsYXNzPVwibGliYnktYXBwLWdyb3VwXCI+XG4gICAgICAgICR7YXBwU3RvcmVMaW5rcyhhcHBsZUFwcFN0b3JlSHJlZiwgZ29vZ2xlUGxheVN0b3JlSHJlZiwgaGlnaENvbnRyYXN0KX1cbiAgICAgICAgJHtzaG93QXdhcmRzID8gYXdhcmRzKGhpZ2hDb250cmFzdCkgOiAnJ31cbiAgICAgICAgJHtzaG93S2luZGxlRmlyZUxpbmsgPyBraW5kbGVGaXJlKHsgaXNLaW5kbGUgfSkgOiAnJ31cbiAgICA8L2Rpdj5cbmA7XG4iLCJpbXBvcnQgQ29udGV4dE1lbnVUZW1wbGF0ZSBmcm9tICcuL3RlbXBsYXRlcy9Db250ZXh0TWVudS5odG1sJztcbmNvbnN0IHsgZmVhdHVyZU1hbmFnZXIsIHVybCwgcm91dGVzLCBPdmVyRHJpdmUsIHRleHQsIGh0bWwgfSA9IHdpbmRvdztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ29udGV4dE1lbnUgZXh0ZW5kcyBCYWNrYm9uZS5WaWV3IHtcbiAgICB0ZW1wbGF0ZSA9IENvbnRleHRNZW51VGVtcGxhdGU7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcblxuICAgICAgICB0aGlzLnJpZCA9IE1hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZyg3KTtcblxuICAgICAgICB0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsICdjaGFuZ2U6aXNJbkhpc3RvcnknLCAoKSA9PiB0aGlzLnJlbmRlcigpKTtcblxuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cblxuICAgIGV2ZW50cygpIHtcbiAgICAgICAgbGV0IGV2ZW50cyA9IHtcbiAgICAgICAgICAgICdjbGljayAuanMtaGlzdG9yeUFjdGlvbic6ICdfaGFuZGxlQ2xpY2snLFxuICAgICAgICAgICAgJ2tleWRvd24gLmpzLWhpc3RvcnlBY3Rpb24nOiAnX2hhbmRsZUtleUhpc3RvcnknLFxuICAgICAgICAgICAgJ2tleWRvd24gLmpzLWNvbnRleHQtYnV0dG9uJzogJ3RvZ2dsZScsXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnY2xlYW51cENvbnRleHRNZW51VG9nZ2xlJykpIHtcbiAgICAgICAgICAgIGV2ZW50c1sna2V5dXAgLmpzLWNvbnRleHQtZHJvcCddID0gJ19oYW5kbGVLZXlVcENvbnRhaW5lcic7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGV2ZW50cztcbiAgICB9XG5cbiAgICBfaGFuZGxlS2V5VXBDb250YWluZXIoZSkge1xuICAgICAgICBpZiAoZS5rZXlDb2RlID09PSAyNyAvKkVTQyovKSB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfaGFuZGxlQ2xpY2soKSB7XG4gICAgICAgIHRoaXMubW9kZWwudHJpZ2dlcigndGl0bGU6YWN0aW9uJywge1xuICAgICAgICAgICAgYWN0aW9uOiAnaGlzdG9yeScsXG4gICAgICAgICAgICBtb2RlbDogdGhpcy5tb2RlbCxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2hhbmRsZUtleUhpc3RvcnkoZSkge1xuICAgICAgICBpZiAoIXdpbmRvdy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ2NsZWFudXBDb250ZXh0TWVudVRvZ2dsZScpKSB7XG4gICAgICAgICAgICBlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMTMgfHwgZS5rZXlDb2RlID09PSAzMikge1xuICAgICAgICAgICAgaWYgKHdpbmRvdy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ2NsZWFudXBDb250ZXh0TWVudVRvZ2dsZScpKSB7XG4gICAgICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMubW9kZWwudHJpZ2dlcigndGl0bGU6YWN0aW9uJywge1xuICAgICAgICAgICAgICAgIGFjdGlvbjogJ2hpc3RvcnknLFxuICAgICAgICAgICAgICAgIG1vZGVsOiB0aGlzLm1vZGVsLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgdmlld01vZGVsKCkge1xuICAgICAgICBsZXQgc2VyaWVzU2VhcmNoVXJsID0gJyc7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbC5pc01hZ2F6aW5lICYmXG4gICAgICAgICAgICAgICAgZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdtYWdhemluZS1yb2xsdXAnKVxuICAgICAgICAgICAgKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBmZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ2VuaGFuY2VkU2VyaWVzJykgJiZcbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmdldCgnZGV0YWlsZWRTZXJpZXMnKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgc2VyaWVzU2VhcmNoVXJsID0gdXJsKHJvdXRlcy5zZWFyY2hCeVR5cGUsIHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3Nlcmllc0lkJyxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnk6IHRoaXMubW9kZWwuZ2V0KCdkZXRhaWxlZFNlcmllcycpLnNlcmllc0lkLFxuICAgICAgICAgICAgICAgICAgICBzb3J0Qnk6ICdyZWFkaW5nT3JkZXInLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLm1vZGVsLmdldCgnc2VyaWVzJykpIHtcbiAgICAgICAgICAgICAgICBzZXJpZXNTZWFyY2hVcmwgPSB1cmwocm91dGVzLnNlYXJjaEJ5VHlwZSwge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnc2VyaWVzJyxcbiAgICAgICAgICAgICAgICAgICAgcXVlcnk6IHRoaXMubW9kZWwuZ2V0KCdzZXJpZXMnKSxcbiAgICAgICAgICAgICAgICAgICAgc29ydEJ5OiAnbmV3bHlhZGRlZCcsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgaGFzTWVkaWFEb0Zvcm1hdCA9IGZhbHNlO1xuICAgICAgICB0aGlzLm1vZGVsLmdldCgnZm9ybWF0cycpLmZvckVhY2goKGZvcm1hdCkgPT4ge1xuICAgICAgICAgICAgaWYgKGZvcm1hdC5pZCA9PT0gJ2Vib29rLW1lZGlhLWRvJykge1xuICAgICAgICAgICAgICAgIGhhc01lZGlhRG9Gb3JtYXQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgbWF0dXJpdHlMZXZlbCA9IHRoaXMubW9kZWwuYXR0cmlidXRlcy5yYXRpbmdzLm1hdHVyaXR5TGV2ZWwuaWQ7XG5cbiAgICAgICAgY29uc3QgcmVsYXRlZFRpdGxlc1BhZ2VVcmwgPSBgJHt3aW5kb3cudXJsKFxuICAgICAgICAgICAgd2luZG93LnJvdXRlcy5tZWRpYVJlbGF0ZWRJZCxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZDogdGhpcy5tb2RlbC5nZXQoJ2lkJyksXG4gICAgICAgICAgICB9XG4gICAgICAgICl9JHttYXR1cml0eUxldmVsID8gYD9tYXR1cml0eUxldmVsPSR7bWF0dXJpdHlMZXZlbH1gIDogJyd9YDtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaXNPd25lZDogdGhpcy5tb2RlbC5nZXQoJ2lzT3duZWQnKSxcbiAgICAgICAgICAgIHJlbGF0ZWRUaXRsZXNQYWdlVXJsLFxuICAgICAgICAgICAgaWQ6IHRoaXMubW9kZWwuaWQsXG4gICAgICAgICAgICByaWQ6IHRoaXMucmlkLFxuICAgICAgICAgICAgdGl0bGU6IHRoaXMubW9kZWwuZ2V0KCd0aXRsZScpLFxuICAgICAgICAgICAgdHlwZUlkOiB0aGlzLm1vZGVsLmdldCgndHlwZScpLmlkLFxuICAgICAgICAgICAgc2FtcGxlSHJlZjogdGhpcy5tb2RlbC5nZXQoJ3NhbXBsZScpLmhyZWYgfHwgJycsXG4gICAgICAgICAgICBzYW1wbGVUZXh0OiB0aGlzLl9nZXRTYW1wbGVUZXh0KCksXG4gICAgICAgICAgICBhbGlnbm1lbnQ6ICdib3R0b20nLFxuICAgICAgICAgICAgaGlzdG9yeUFjdGlvbkxhYmVsOiB0aGlzLl9nZXRIaXN0b3J5QWN0aW9uTGFiZWwoKSxcbiAgICAgICAgICAgIGhpc3RvcnlBY3Rpb25UZXh0OiB0aGlzLl9nZXRIaXN0b3J5QWN0aW9uVGV4dCgpLFxuICAgICAgICAgICAgaGlzdG9yeUVuYWJsZWQ6XG4gICAgICAgICAgICAgICAgT3ZlckRyaXZlLnNob3dIaXN0b3J5RmVhdHVyZSAmJlxuICAgICAgICAgICAgICAgICF0aGlzLm1vZGVsLmdldCgnaXNQcmVSZWxlYXNlVGl0bGUnKSxcbiAgICAgICAgICAgIGdhSGlzdG9yeUFjdGlvbjogdGhpcy5tb2RlbC5nZXQoJ2lzSW5IaXN0b3J5JylcbiAgICAgICAgICAgICAgICA/ICdoaXN0b3J5LXJlbW92ZSdcbiAgICAgICAgICAgICAgICA6ICdoaXN0b3J5LWFkZCcsXG4gICAgICAgICAgICBzZXJpZXNTZWFyY2hVcmwsXG4gICAgICAgICAgICBoYXNNZWRpYURvRm9ybWF0LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIF9nZXRTYW1wbGVUZXh0KCkge1xuICAgICAgICBjb25zdCB0eXBlID0gdGhpcy5tb2RlbC5nZXQoJ3R5cGUnKS5pZDtcblxuICAgICAgICBpZiAodHlwZSA9PT0gJ2F1ZGlvYm9vaycgfHwgdHlwZSA9PT0gJ211c2ljJykge1xuICAgICAgICAgICAgcmV0dXJuIHRleHQoJ3NhbXBsZUxpc3RlbicpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICd2aWRlbycpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0KCdzYW1wbGVXYXRjaCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRleHQoJ3NhbXBsZVJlYWQnKTtcbiAgICB9XG5cbiAgICBfZ2V0SGlzdG9yeUFjdGlvbkxhYmVsKCkge1xuICAgICAgICBjb25zdCB0aXRsZSA9IHRoaXMubW9kZWwuZ2V0KCd0aXRsZScpO1xuICAgICAgICBpZiAodGhpcy5tb2RlbC5nZXQoJ2lzSW5IaXN0b3J5JykpIHtcbiAgICAgICAgICAgIHJldHVybiBodG1sKCdyZWFkaW5nSGlzdG9yeS5yZW1vdmVUaXRsZScsIHsgdGl0bGUgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gaHRtbCgncmVhZGluZ0hpc3RvcnkuYWRkVGl0bGUnLCB7IHRpdGxlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2dldEhpc3RvcnlBY3Rpb25UZXh0KCkge1xuICAgICAgICBpZiAodGhpcy5tb2RlbC5nZXQoJ2lzSW5IaXN0b3J5JykpIHtcbiAgICAgICAgICAgIHJldHVybiBodG1sKCdyZWFkaW5nSGlzdG9yeS5yZW1vdmUnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBodG1sKCdyZWFkaW5nSGlzdG9yeS5hZGQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgdGhpcy4kZWwuZW1wdHkoKS5hcHBlbmQodGhpcy50ZW1wbGF0ZSh0aGlzLnZpZXdNb2RlbCkpO1xuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIGlzS2V5Ym9hcmRTZWxlY3RFdmVudCA9IChlKSA9PlxuICAgICAgICAoZS53aGljaCA9PT0gMTMgfHwgZS53aGljaCA9PT0gMzIpICYmIChlLnByZXZlbnREZWZhdWx0KCkgfHwgdHJ1ZSk7XG5cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgd2luZG93LkZvdW5kYXRpb24ubGlicy5kcm9wZG93bi5jbG9zZShcbiAgICAgICAgICAgIHRoaXMuJGVsLmZpbmQoJy5qcy1jb250ZXh0LWRyb3AnKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHRvZ2dsZShlKSB7XG4gICAgICAgIGlmICh0aGlzLmlzS2V5Ym9hcmRTZWxlY3RFdmVudChlKSkge1xuICAgICAgICAgICAgd2luZG93LkZvdW5kYXRpb24ubGlicy5kcm9wZG93bi50b2dnbGUoXG4gICAgICAgICAgICAgICAgdGhpcy4kZWwuZmluZCgnLmpzLWNvbnRleHQtYnV0dG9uJylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgQ292ZXJUZW1wbGF0ZSBmcm9tICcuL3RlbXBsYXRlcy9Db3Zlci5odG1sJztcbmltcG9ydCBOb0NvdmVyVGVtcGxhdGUgZnJvbSAnLi90ZW1wbGF0ZXMvTm9Db3Zlci5odG1sJztcbmltcG9ydCB7IHRvU3RhdGljVXJsIH0gZnJvbSAnLi4vLi4vLi4vLi4vbGliL2Fzc2V0TWFwcGVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ292ZXIgZXh0ZW5kcyBCYWNrYm9uZS5WaWV3IHtcbiAgICBjb25zdHJ1Y3Rvcih7IGNvdmVyV2lkdGhzLCBpc0luSGVybywgaXNUaXRsZUhpc3RvcnkgPSBmYWxzZSB9KSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG5cbiAgICAgICAgdGhpcy5jb3ZlcldpZHRocyA9IF8uZXh0ZW5kKFxuICAgICAgICAgICAgeyBtb2JpbGU6IDE0NSwgdGFibGV0OiAxNjAsIGRlc2t0b3A6IDE5MCB9LFxuICAgICAgICAgICAgY292ZXJXaWR0aHNcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5pc0luSGVybyA9IGlzSW5IZXJvO1xuICAgICAgICB0aGlzLmlzVGl0bGVIaXN0b3J5ID0gaXNUaXRsZUhpc3Rvcnk7XG5cbiAgICAgICAgdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCAnY2hhbmdlJywgdGhpcy5fcmVuZGVyKTtcbiAgICAgICAgdGhpcy5fcmVuZGVyKCk7XG4gICAgfVxuXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICAkKHdpbmRvdykub2ZmKGByZXNpemUuJHt0aGlzLm1vZGVsLmlkfWApO1xuICAgIH1cblxuICAgIF9yZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IG1lZGlhID0gdGhpcy5tb2RlbC50b0pTT04oKTtcbiAgICAgICAgY29uc3QgY292ZXJXaWR0aCA9IGJvd3Nlci5tb2JpbGVcbiAgICAgICAgICAgID8gdGhpcy5jb3ZlcldpZHRocy5tb2JpbGVcbiAgICAgICAgICAgIDogYm93c2VyLnRhYmxldFxuICAgICAgICAgICAgPyB0aGlzLmNvdmVyV2lkdGhzLnRhYmxldFxuICAgICAgICAgICAgOiB0aGlzLmNvdmVyV2lkdGhzLmRlc2t0b3A7XG4gICAgICAgIGNvbnN0IGNvdmVyID0gdGhpcy5tb2RlbC5nZXRDb3Zlcihjb3ZlcldpZHRoKTtcblxuICAgICAgICBpZiAodGhpcy5tb2RlbC5pc1BsYWNlaG9sZGVyKSB7XG4gICAgICAgICAgICBsZXQgJGNvdmVyID0gYDxkaXYgY2xhc3M9XCJDb3ZlckltYWdlQ29udGFpbmVyXCI+PC9kaXY+YDtcbiAgICAgICAgICAgIHRoaXMuJGVsLmVtcHR5KCkuYXBwZW5kKCRjb3Zlcik7XG4gICAgICAgIH0gZWxzZSBpZiAoY292ZXIgJiYgY292ZXIuaHJlZikge1xuICAgICAgICAgICAgbGV0ICRjb3ZlciA9ICQoXG4gICAgICAgICAgICAgICAgQ292ZXJUZW1wbGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIG1lZGlhLFxuICAgICAgICAgICAgICAgICAgICBjb3ZlckNvbG9yOlxuICAgICAgICAgICAgICAgICAgICAgICAgKGNvdmVyICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY292ZXIucHJpbWFyeUNvbG9yICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY292ZXIucHJpbWFyeUNvbG9yLmhleCkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICdpbmhlcml0JyxcbiAgICAgICAgICAgICAgICAgICAgc3JjOiBjb3ZlciAmJiBjb3Zlci5ocmVmLFxuICAgICAgICAgICAgICAgICAgICBocmVmOiB0aGlzLm1vZGVsLnRpdGxlRGV0YWlsc1VybCxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHdpbmRvdy50ZXh0KCdjb3Zlci5jb3ZlckltYWdlTGFiZWwnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogbWVkaWEudGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjcmVhdG9yOiBtZWRpYS5maXJzdENyZWF0b3JOYW1lLFxuICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgbm9TYW1wbGVDbGFzczpcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhLnNhbXBsZS5ocmVmID09IG51bGwgPyAnaXMtbm9TYW1wbGUnIDogJycsXG4gICAgICAgICAgICAgICAgICAgIHNyY3NldDogY292ZXIgJiYgY292ZXIuc3Jjc2V0LFxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvLyBMSFRORy0yMTA1OiBJbiB0aGUgZXZlbnQgdGhhdCBhbiBpbWFnZSBmYWlscyB0byBsb2FkLCB3aXBlIG91dCB0aGUgaHJlZidzIGFuZCB1cGRhdGUgdGhlIG1vZGVsIHRvIHRyaWdnZXIgYSByZW5kZXIoKVxuICAgICAgICAgICAgJGNvdmVyLmZpbmQoJ2ltZycpLm9uKCdlcnJvcicsICgpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaW1hZ2VzUmVtb3ZlZCA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KHRoaXMubW9kZWwuYXR0cmlidXRlcy5jb3ZlcnMpXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIF8oaW1hZ2VzUmVtb3ZlZCkuZWFjaCgoaW1hZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGltYWdlLmhyZWY7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLnNldCh7IGNvdmVyczogaW1hZ2VzUmVtb3ZlZCB9KTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLiRlbC5lbXB0eSgpLmFwcGVuZCgkY292ZXIpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaXNUaXRsZUhpc3RvcnkpIHtcbiAgICAgICAgICAgIHRoaXMuJGVsLmVtcHR5KCkuYXBwZW5kKFxuICAgICAgICAgICAgICAgIGA8YSBocmVmPVwiJHt0aGlzLm1vZGVsLnRpdGxlRGV0YWlsc1VybH1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGltZyBhbHQ9XCIke3dpbmRvdy5odG1sKCdjb3ZlckltYWdlRm9yVGl0bGUnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZTogbWVkaWEudGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIH0pfVwiIGNsYXNzPVwiaGlzdG9yeS1ub0NvdmVyXCIgc3JjPVwiJHt0b1N0YXRpY1VybChcbiAgICAgICAgICAgICAgICAgICAgJ2ltZy9uby1jb3Zlcl9lbl9VUy5qcGcnXG4gICAgICAgICAgICAgICAgKX1cIj5cbiAgICAgICAgICAgICAgICA8L2E+YFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBjcmVhdG9yVGV4dCA9IHRoaXMubW9kZWwuaXNNYWdhemluZVxuICAgICAgICAgICAgICAgID8gdGhpcy5tb2RlbC5nZXQoJ2VkaXRpb24nKVxuICAgICAgICAgICAgICAgIDogdGhpcy5tb2RlbC5nZXQoJ2ZpcnN0Q3JlYXRvck5hbWUnKTtcbiAgICAgICAgICAgIHRoaXMuJGVsLmVtcHR5KCkuYXBwZW5kKFxuICAgICAgICAgICAgICAgIE5vQ292ZXJUZW1wbGF0ZSh7XG4gICAgICAgICAgICAgICAgICAgIG1lZGlhLFxuICAgICAgICAgICAgICAgICAgICBocmVmOiB0aGlzLm1vZGVsLnRpdGxlRGV0YWlsc1VybCxcbiAgICAgICAgICAgICAgICAgICAgaXNJbkhlcm86IHRoaXMuaXNJbkhlcm8sXG4gICAgICAgICAgICAgICAgICAgIGNvdmVyV2lkdGg6IGNvdmVyV2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGNvdmVySGVpZ2h0OiAoY292ZXJXaWR0aCAqIDI5MykgLyAyMjAsXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0b3JUZXh0OiBjcmVhdG9yVGV4dCxcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICQod2luZG93KS5vbihcbiAgICAgICAgICAgICAgICBgcmVzaXplLiR7dGhpcy5tb2RlbC5pZH1gLFxuICAgICAgICAgICAgICAgIF8uYmluZChcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fbWFuYWdlT3ZlcmZsb3csXG4gICAgICAgICAgICAgICAgICAgIHRoaXMsXG4gICAgICAgICAgICAgICAgICAgICcuQ292ZXJJbWFnZUNvbnRhaW5lciAubm9Db3ZlckF2YWlsYWJsZSAudGl0bGUnLFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm1vZGVsLmdldCgndGl0bGUnKVxuICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAkKHdpbmRvdykub24oXG4gICAgICAgICAgICAgICAgYHJlc2l6ZS4ke3RoaXMubW9kZWwuaWR9YCxcbiAgICAgICAgICAgICAgICBfLmJpbmQoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hbmFnZU92ZXJmbG93LFxuICAgICAgICAgICAgICAgICAgICB0aGlzLFxuICAgICAgICAgICAgICAgICAgICAnLkNvdmVySW1hZ2VDb250YWluZXIgLm5vQ292ZXJBdmFpbGFibGUgLmF1dGhvcicsXG4gICAgICAgICAgICAgICAgICAgIGNyZWF0b3JUZXh0XG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICQod2luZG93KS5vbihcbiAgICAgICAgICAgICAgICBgcmVzaXplLiR7dGhpcy5tb2RlbC5pZH1gLFxuICAgICAgICAgICAgICAgIF8uYmluZCh0aGlzLl9yZXNpemVDbGVhckltYWdlLCB0aGlzKVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy8gdGltZW91dCBnaXZlcyBicm93c2VyIGNoYW5jZSB0byBkcmF3IGFuZCBzZXQgaW5uZXJIVE1MIHZhbHVlcyB1c2VkXG4gICAgICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYW5hZ2VPdmVyZmxvdyhcbiAgICAgICAgICAgICAgICAgICAgJy5Db3ZlckltYWdlQ29udGFpbmVyIC5ub0NvdmVyQXZhaWxhYmxlIC50aXRsZScsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuZ2V0KCd0aXRsZScpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9tYW5hZ2VPdmVyZmxvdyhcbiAgICAgICAgICAgICAgICAgICAgJy5Db3ZlckltYWdlQ29udGFpbmVyIC5ub0NvdmVyQXZhaWxhYmxlIC5hdXRob3InLFxuICAgICAgICAgICAgICAgICAgICBjcmVhdG9yVGV4dFxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdGhpcy5fcmVzaXplQ2xlYXJJbWFnZSgpO1xuICAgICAgICAgICAgfSwgMSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfcmVzaXplQ2xlYXJJbWFnZSgpIHtcbiAgICAgICAgY29uc3QgaW1hZ2UgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJ2ltZycpO1xuICAgICAgICBpZiAoaW1hZ2UpIHtcbiAgICAgICAgICAgICQoaW1hZ2UpLmhlaWdodCgoJChpbWFnZSkucGFyZW50KCkud2lkdGgoKSAqIDI5MykgLyAyMjApO1xuICAgICAgICB9XG4gICAgfVxuICAgIF9tYW5hZ2VPdmVyZmxvdyhzZWxlY3RvciwgcmVzZXRUZXh0KSB7XG4gICAgICAgIGNvbnN0IGVsZW1lbnQgPSB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3Ioc2VsZWN0b3IpO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgZWxlbWVudC5pbm5lckhUTUwgPSByZXNldFRleHQ7XG4gICAgICAgICAgICBpZiAoc2VsZWN0b3IuaW5kZXhPZignLnRpdGxlJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKCQoZWxlbWVudCkud2lkdGgoKSA8IDEwMCkge1xuICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLmNzcygnZm9udC1zaXplJywgJzE0cHgnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLndpZHRoKCkgPCAxMjUgJiZcbiAgICAgICAgICAgICAgICAgICAgJChlbGVtZW50KS53aWR0aCgpID49IDEwMFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLmNzcygnZm9udC1zaXplJywgJzE2cHgnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLndpZHRoKCkgPCAxNTAgJiZcbiAgICAgICAgICAgICAgICAgICAgJChlbGVtZW50KS53aWR0aCgpID49IDEyNVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLmNzcygnZm9udC1zaXplJywgJzE4cHgnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCQoZWxlbWVudCkud2lkdGgoKSA+PSAxNTApIHtcbiAgICAgICAgICAgICAgICAgICAgJChlbGVtZW50KS5jc3MoJ2ZvbnQtc2l6ZScsICcyMHB4Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxlY3Rvci5pbmRleE9mKCcuYXV0aG9yJykgIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgaWYgKCQoZWxlbWVudCkud2lkdGgoKSA8IDExMCkge1xuICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLmNzcygnZm9udC1zaXplJywgJzEwcHgnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLndpZHRoKCkgPCAxMzUgJiZcbiAgICAgICAgICAgICAgICAgICAgJChlbGVtZW50KS53aWR0aCgpID49IDExMFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLmNzcygnZm9udC1zaXplJywgJzEycHgnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLndpZHRoKCkgPCAxNjAgJiZcbiAgICAgICAgICAgICAgICAgICAgJChlbGVtZW50KS53aWR0aCgpID49IDEzNVxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLmNzcygnZm9udC1zaXplJywgJzE0cHgnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCQoZWxlbWVudCkud2lkdGgoKSA+PSAxNjApIHtcbiAgICAgICAgICAgICAgICAgICAgJChlbGVtZW50KS5jc3MoJ2ZvbnQtc2l6ZScsICcxNnB4Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGVsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gMCAmJlxuICAgICAgICAgICAgICAgIGVsZW1lbnQuc2Nyb2xsSGVpZ2h0ID4gZWxlbWVudC5jbGllbnRIZWlnaHRcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0ID0gZWxlbWVudC5pbm5lckhUTUw7XG4gICAgICAgICAgICAgICAgdGV4dCA9IGAke3RleHQucmVwbGFjZSgvXFxXKyQvZywgJycpfS4uLmA7IC8vIHJlbW92ZSB0cmFpbGluZyBzcGVjaWFsIGNoYXJhY3RlcnMgYW5kIGFkZCBlbGxpcHNpc1xuICAgICAgICAgICAgICAgIHdoaWxlIChcbiAgICAgICAgICAgICAgICAgICAgdGV4dCAhPT0gJy4uLicgJiZcbiAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5zY3JvbGxIZWlnaHQgPiBlbGVtZW50LmNsaWVudEhlaWdodFxuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5yZXBsYWNlKC9cXFcqXFx3XFxXKihcXC57M30pJC9nLCAnJDEnKTsgLy8gcmVtb3ZlIGEgbm9uLWVsbGlwc2lzIGNoYXJhY3RlciBhbmQgdW53YW50ZWQgY2hhcmFjdGVycyBhcm91bmQgaXTOqVxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IHRleHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHRvZG86IHB1dCBhIG1pbiB3aWR0aCBhbiBoZWlnaHQgb24gdGhpcyEgV2Uga25vdyB3aGF0IHRoZSBoZWlnaHRzIGFyZSBmb3IgcGFydGljdWxhciBzY3JlZW4gd2lkdGhzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgTWVkaWFQYXJhbWV0ZXJzIGZyb20gJy4uLy4uLy4uLy4uL21vZGVscy9kYW8vTWVkaWFQYXJhbWV0ZXJzJztcbmltcG9ydCBUaXRsZUNvbGxlY3Rpb24gZnJvbSAnLi9tb2RlbHMvVGl0bGVDb2xsZWN0aW9uJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgTWVkaWFJbnRlcmZhY2Uge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIF8uZXh0ZW5kKHRoaXMsIEJhY2tib25lLkV2ZW50cyk7XG5cbiAgICAgICAgdGhpcy5pdGVtcyAgICAgICAgICA9IG5ldyBUaXRsZUNvbGxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5mYWNldHMgICAgICAgICA9IHt9O1xuICAgICAgICB0aGlzLnNvcnRPcHRpb25zICAgID0gW107XG4gICAgfVxuXG4gICAgcXVpY2tTZWFyY2godGVybSwgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmV0Y2goXy5leHRlbmQoe30sIHsgcXVlcnk6IHRlcm0gfSwgb3B0aW9ucykpO1xuICAgIH1cblxuICAgIHNlYXJjaChwYXJhbWV0ZXJzLCBvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9mZXRjaChfLmV4dGVuZCh7fSwgcGFyYW1ldGVycywgb3B0aW9ucykpO1xuICAgIH1cblxuICAgIGZldGNoQ29sbGVjdGlvbkJ5SWQoaWQsIG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2ZldGNoKF8uZXh0ZW5kKHt9LCB7IGNvbGxlY3Rpb25JZDogaWQgfSwgb3B0aW9ucykpO1xuICAgIH1cblxuICAgIGZldGNoQ29sbGVjdGlvbkJ5UGFyYW1ldGVycyhjb2xsZWN0aW9uRmlsdGVycywgb3B0aW9ucykge1xuICAgICAgICByZXR1cm4gdGhpcy5fZmV0Y2goXy5leHRlbmQoe30sIGNvbGxlY3Rpb25GaWx0ZXJzLCBvcHRpb25zKSk7XG4gICAgfVxuXG4gICAgLyoqIFV0aWxpdHkgZnVuY3Rpb24gdG8gc2ltdWxhdGUgYSBkYXRhIGNhbGwsIGJ1dCBkZWxpYmVyYXRsZXkgcmV0dXJuIGFuIGVtcHR5IHJlc3VsdCBzZXQgKi9cbiAgICBmZXRjaEVtcHR5UmVzcG9uc2UoKSB7XG4gICAgICAgIHRoaXMudHJpZ2dlcignc3luYzpzdGFydCcsIHRoaXMsIHsgbWVkaWFQYXJhbWV0ZXJzOiBudWxsIH0pO1xuXG4gICAgICAgIGxldCBlbXB0eVJlc3BvbnNlID0ge1xuICAgICAgICAgICAgaXRlbXMgICAgICAgOiBbXSxcbiAgICAgICAgICAgIGZhY2V0cyAgICAgIDoge30sXG4gICAgICAgICAgICBzb3J0T3B0aW9ucyA6IFtdXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fZmV0Y2hEb25lKGVtcHR5UmVzcG9uc2UsICdzeW50aGV0aWMnKTtcblxuICAgICAgICB0aGlzLnRyaWdnZXIoJ3N5bmM6ZW5kJywgdGhpcyk7XG5cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShlbXB0eVJlc3BvbnNlKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBAcGFyYW0ge01lZGlhUGFyYW1ldGVyc30gcGFyYW1ldGVyc1xuICAgICAqIEBtZW1iZXJvZiBNZWRpYUludGVyZmFjZVxuICAgICAqL1xuICAgIF9mZXRjaChwYXJhbWV0ZXJzKSB7XG5cbiAgICAgICAgaWYgKCFwYXJhbWV0ZXJzKXtcbiAgICAgICAgICAgIHBhcmFtZXRlcnMgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIGEgdGl0bGUgaWQgaXMgc3BlY2lmaWNlZCB0aGVuIG5vIGZhY2V0cyB3aWxsIGJlIGNhbGN1bGF0ZWQgcmVnYXJkbGVzcyBvZiB0aGUgcGFyYW1zIHNlbnQuXG4gICAgICAgIGlmICghcGFyYW1ldGVycy5pbmNsdWRlZEZhY2V0cyAmJiAhcGFyYW1ldGVycy50aXRsZUlkKXtcbiAgICAgICAgICAgIHBhcmFtZXRlcnMuaW5jbHVkZWRGYWNldHMgPSB3aW5kb3cuT3ZlckRyaXZlLnN1cHBvcnRlZEZhY2V0cztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdMdWNreURheScpICYmIHBhcmFtZXRlcnMuc2h1ZmZsZSl7XG4gICAgICAgICAgICBjb25zdCBzb3J0cyA9IFsnbW9zdHBvcHVsYXInLCAncmVsZWFzZWRhdGUnLCAndGl0bGUnLCAnYXV0aG9yJywgJ25ld2x5YWRkZWQnLCAnbG93Y2lyY3VsYXRpbmcnLCAnbW9zdHBvcHVsYXItc2l0ZSddO1xuICAgICAgICAgICAgcGFyYW1ldGVycy5zb3J0QnkgPSBzb3J0c1tNYXRoLmZsb29yKE1hdGgucmFuZG9tKCkgKiBzb3J0cy5sZW5ndGgpXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtZWRpYVBhcmFtZXRlcnMgPSBuZXcgTWVkaWFQYXJhbWV0ZXJzKHBhcmFtZXRlcnMpO1xuXG4gICAgICAgIGlmICghIXdpbmRvdy5PdmVyRHJpdmUuc2hvd09ubHlBdmFpbGFibGUpIHtcbiAgICAgICAgICAgIG1lZGlhUGFyYW1ldGVycy5zaG93T25seUF2YWlsYWJsZSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnRyaWdnZXIoJ3N5bmM6c3RhcnQnLCB0aGlzLCB7IG1lZGlhUGFyYW1ldGVycyB9KTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgICAgICB1cmw6IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5yZXN0Lm1lZGlhLmluZGV4KSxcbiAgICAgICAgICAgICAgICBtZXRob2QgIDogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGRhdGFUeXBlOiAnanNvbicsXG4gICAgICAgICAgICAgICAgY29udGVudFR5cGU6ICdhcHBsaWNhdGlvbi9qc29uOyBjaGFyc2V0PXV0Zi04JyxcbiAgICAgICAgICAgICAgICBkYXRhICAgIDogSlNPTi5zdHJpbmdpZnkobWVkaWFQYXJhbWV0ZXJzLnNlcmlhbGl6ZSgpKSxcbiAgICAgICAgICAgICAgICB0aW1lb3V0OiAxMDAwMFxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5kb25lKChkYXRhLCB0ZXh0U3RhdHVzLCBqcVhIUikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdMdWNreURheScpICYmIHBhcmFtZXRlcnMuc2h1ZmZsZSl7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEuaXRlbXMgPSBkYXRhLml0ZW1zICYmIF8uc2h1ZmZsZShkYXRhLml0ZW1zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ29ubHktc2hvdy1vd25lZC1jb250ZW50JykgJiYgZGF0YS5pdGVtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLml0ZW1zID0gZGF0YS5pdGVtcy5maWx0ZXIoKHgpID0+IHguaXNPd25lZCA9PT0gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2ZldGNoRG9uZShkYXRhLCB0ZXh0U3RhdHVzLCBqcVhIUik7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdzeW5jOmVuZCcsIHRoaXMpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZhaWwoKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2ZldGNoRmFpbChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pO1xuICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlcignc3luYzplbmQnLCB0aGlzKTtcbiAgICAgICAgICAgICAgICByZWplY3QoanFYSFIpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9mZXRjaERvbmUoZGF0YSwgdGV4dFN0YXR1cywganFYSFIpIHtcbiAgICAgICAgdGhpcy5pdGVtcy5yZXNldChkYXRhLml0ZW1zKTtcbiAgICAgICAgdGhpcy50cmlnZ2VyKCdzeW5jOnN1Y2Nlc3MnLCB0aGlzLCB7IGRhdGEsIHRleHRTdGF0dXMsIGpxWEhSIH0pO1xuICAgIH1cblxuICAgIF9mZXRjaEZhaWwoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7XG4gICAgICAgIHRoaXMudHJpZ2dlcignc3luYzpmYWlsJywgdGhpcywgeyBqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24gfSk7XG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGl0bGVBY3Rpb25CdXR0b24gZXh0ZW5kcyBCYWNrYm9uZS5WaWV3IHtcbiAgICBjb25zdHJ1Y3Rvcih7IHR5cGUgPSAnbGluaycsIGFjdGlvbiwgc3R5bGUgfSkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuXG4gICAgICAgIHRoaXMudHlwZSA9IHR5cGU7XG5cbiAgICAgICAgdGhpcy5oYXNDdXN0b21BY3Rpb24gPSBmYWxzZTtcbiAgICAgICAgaWYgKCEhYWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmFjdGlvbiA9IGFjdGlvbjtcbiAgICAgICAgICAgIHRoaXMuaGFzQ3VzdG9tQWN0aW9uID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuc3R5bGUgPSBzdHlsZTtcblxuICAgICAgICB0aGlzLiRidXR0b24gPSAkKCc8YnV0dG9uIC8+Jyk7XG5cbiAgICAgICAgdGhpcy5saXN0ZW5Ubyh0aGlzLm1vZGVsLCAnY2hhbmdlOnRpdGxlU3RhdGUnLCB0aGlzLnJlbmRlcik7XG5cbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG5cbiAgICBnZXQgaXNCdXR0b24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdidXR0b24nO1xuICAgIH1cblxuICAgIGdldCBpc0xpbmsoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09ICdsaW5rJztcbiAgICB9XG5cbiAgICBnZXQgc3RhdGUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsLmdldCgndGl0bGVTdGF0ZScpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgdGhpcy4kYnV0dG9uLm9mZigpO1xuICAgICAgICB0aGlzLiRlbC5vZmYoKTtcblxuICAgICAgICBsZXQgYXR0cmlidXRlcyA9IHRoaXMuZ2V0QnV0dG9uQXR0cnMoKTtcbiAgICAgICAgaWYgKF8oYXR0cmlidXRlcy5ocmVmKS5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIHRoaXMuJGJ1dHRvbiA9ICQoJzxidXR0b24gLz4nLCBhdHRyaWJ1dGVzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuJGJ1dHRvbiA9ICQoJzxhIC8+JywgYXR0cmlidXRlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBdHRhY2ggZXZlbnQgaGFuZGxlcnMgaWYgZWl0aGVyIGlzIHRydWVcbiAgICAgICAgLy8gLSBCdXR0b24gaXMgbm90IGEgbGlua1xuICAgICAgICAvLyAtIEN1c3RvbSBhY3Rpb24gaGFzIGJlZW4gcHJvdmlkZWRcbiAgICAgICAgaWYgKF8oYXR0cmlidXRlcy5ocmVmKS5pc0VtcHR5KCkgfHwgdGhpcy5oYXNDdXN0b21BY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuX2F0dGFjaEV2ZW50SGFuZGxlcnModGhpcy4kYnV0dG9uKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuJGVsLmVtcHR5KCkuYXBwZW5kKHRoaXMuJGJ1dHRvbik7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgd2FpdGluZyhpc1dhaXRpbmcgPSB0cnVlKSB7XG4gICAgICAgIGlmIChpc1dhaXRpbmcpIHtcbiAgICAgICAgICAgIHRoaXMuJGJ1dHRvblxuICAgICAgICAgICAgICAgIC5vZmYoJy50aXRsZUFjdGlvbkJ1dHRvbicpXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKCd3YWl0aW5nJylcbiAgICAgICAgICAgICAgICAuYXR0cignZGlzYWJsZWQnLCBpc1dhaXRpbmcpXG4gICAgICAgICAgICAgICAgLmFwcGVuZCgnPGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj4nKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuJGJ1dHRvblxuICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnd2FpdGluZycpXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2Rpc2FibGVkJywgaXNXYWl0aW5nKVxuICAgICAgICAgICAgICAgIC5maW5kKCcuc3Bpbm5lcicpXG4gICAgICAgICAgICAgICAgLnJlbW92ZSgpO1xuXG4gICAgICAgICAgICB0aGlzLl9hdHRhY2hFdmVudEhhbmRsZXJzKHRoaXMuJGJ1dHRvbik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBpc1NlbGVjdEV2ZW50ID0gKGUpID0+XG4gICAgICAgIChlLnR5cGUgPT09ICdjbGljaycgfHwgZS53aGljaCA9PT0gMTMgfHwgZS53aGljaCA9PT0gMzIpICYmXG4gICAgICAgIChlLnByZXZlbnREZWZhdWx0KCkgfHwgdHJ1ZSk7XG5cbiAgICBfYXR0YWNoRXZlbnRIYW5kbGVycygkZWwpIHtcbiAgICAgICAgJGVsLm9mZignLnRpdGxlQWN0aW9uQnV0dG9uJyk7XG5cbiAgICAgICAgJGVsLm9uKCdjbGljay50aXRsZUFjdGlvbkJ1dHRvbicsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmlzU2VsZWN0RXZlbnQoZSkgJiYgdGhpcy5hY3Rpb24oZSk7XG4gICAgICAgIH0pO1xuICAgICAgICAkZWwub24oJ2tleWRvd24udGl0bGVBY3Rpb25CdXR0b24nLCAoZSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5pc1NlbGVjdEV2ZW50KGUpICYmIHRoaXMuYWN0aW9uKGUpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBhY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgdGhpcy5pc1NlbGVjdEV2ZW50KGV2ZW50KSAmJiB0aGlzLl90cmlnZ2VyVGl0bGVBY3Rpb24oKTtcbiAgICB9XG5cbiAgICBfdHJpZ2dlclRpdGxlQWN0aW9uKCkge1xuICAgICAgICB0aGlzLm1vZGVsLnRyaWdnZXIoJ3RpdGxlOmFjdGlvbicsIHtcbiAgICAgICAgICAgIGFjdGlvbjogdGhpcy5zdGF0ZSxcbiAgICAgICAgICAgIG1vZGVsOiB0aGlzLm1vZGVsLFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfZ2V0Qm9ycm93QnV0dG9uVGV4dCgpIHtcbiAgICAgICAgaWYgKHdpbmRvdy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ2dlby1pZGMnKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubW9kZWwuYXR0cmlidXRlcy50eXBlLmlkID09PSAnYXVkaW9ib29rJ1xuICAgICAgICAgICAgICAgID8gd2luZG93Lmh0bWwoJ2xpc3RlbicpXG4gICAgICAgICAgICAgICAgOiB3aW5kb3cuaHRtbCgncmVhZCcpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3aW5kb3cuaHRtbCgnYm9ycm93Jyk7XG4gICAgfVxuXG4gICAgX2dldEJvcnJvd0J1dHRvbkFyaWFMYWJlbCh0aXRsZSkge1xuICAgICAgICBpZiAod2luZG93LmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnZ2VvLWlkYycpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5hdHRyaWJ1dGVzLnR5cGUuaWQgPT09ICdhdWRpb2Jvb2snXG4gICAgICAgICAgICAgICAgPyB3aW5kb3cuaHRtbCgnbGlzdGVuVG9UaXRsZScsIHsgdGl0bGUgfSlcbiAgICAgICAgICAgICAgICA6IHdpbmRvdy5odG1sKCdyZWFkVGl0bGUnLCB7IHRpdGxlIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3aW5kb3cuaHRtbCgnYm9ycm93VGl0bGUnLCB7IHRpdGxlIH0pO1xuICAgIH1cblxuICAgIGdldEJ1dHRvbkF0dHJzKCkge1xuICAgICAgICBsZXQgYnV0dG9uQXR0cnMgPSB7XG4gICAgICAgICAgICAnZGF0YS1tZWRpYS1pZCc6IHRoaXMubW9kZWwuaWQsXG4gICAgICAgICAgICAnZGF0YS10eXBlJzogdGhpcy5tb2RlbC5hdHRyaWJ1dGVzLnR5cGUuaWQsXG4gICAgICAgICAgICAnZGF0YS10eXBlLW5hbWUnOlxuICAgICAgICAgICAgICAgICh0aGlzLm1vZGVsLmF0dHJpYnV0ZXMudHlwZS5pZCAmJlxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaHRtbCh0aGlzLm1vZGVsLmF0dHJpYnV0ZXMudHlwZS5pZCkpIHx8XG4gICAgICAgICAgICAgICAgJycsXG4gICAgICAgICAgICBodG1sOiAodGhpcy4kYnV0dG9uLmh0bWwgJiYgdGhpcy4kYnV0dG9uLmh0bWwoKSkgfHwgJycsXG4gICAgICAgICAgICB0YWJpbmRleDogMCxcbiAgICAgICAgfTtcblxuICAgICAgICBsZXQgdGl0bGUgPSB0aGlzLm1vZGVsLmF0dHJpYnV0ZXMudGl0bGU7XG5cbiAgICAgICAgbGV0IGNsYXNzZXMgPSBbJ1RpdGxlQWN0aW9uQnV0dG9uJywgJ3UtYWxsQ2FwcyddO1xuXG4gICAgICAgIGlmICh0aGlzLmlzQnV0dG9uKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goLi4uWydidXR0b24nLCAncmFkaXVzJywgJ2lzLWJ1dHRvbicsICdzZWNvbmRhcnknXSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5zdHlsZSA9PT0gJ2ZpbGwnKSB7XG4gICAgICAgICAgICBjbGFzc2VzLnB1c2goJ2ZpbGwnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN3aXRjaCAodGhpcy5zdGF0ZSkge1xuICAgICAgICAgICAgY2FzZSAndW5hdmFpbGFibGUnOlxuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnaXMtdW5hdmFpbGFibGUganMtdW5hdmFpbGFibGUgZGlzYWJsZWQnKTtcbiAgICAgICAgICAgICAgICBpZiAod2luZG93LmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnZ2VvLWlkYycpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgndmlzaWJsZS11bmF2YWlsYWJsZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBidXR0b25BdHRycy5odG1sID0gYDxzcGFuPiR7d2luZG93Lmh0bWwoXG4gICAgICAgICAgICAgICAgICAgICdhdmFpbGFiaWxpdHlVbmF2YWlsYWJsZSdcbiAgICAgICAgICAgICAgICApfTwvc3Bhbj5gO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbm9vayc6XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdpcy1ub29rIGpzLW5vb2snKTtcbiAgICAgICAgICAgICAgICBidXR0b25BdHRycy5odG1sID0gYDxzcGFuPiR7d2luZG93Lmh0bWwoJ3NlbmRUb05vb2snKX08L3NwYW4+YDtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3ByZXZpZXcnOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTGluaykge1xuICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goJ3NlY29uZGFyeS1jb2xvcicpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnaXMtcHJldmlldyBqcy1wcmV2aWV3IHNlY29uZGFyeScpO1xuICAgICAgICAgICAgICAgIGJ1dHRvbkF0dHJzLmh0bWwgPSBgPHNwYW4+JHt3aW5kb3cuaHRtbChcbiAgICAgICAgICAgICAgICAgICAgJ2RlbW9Nb2RlLnByZXZpZXcnXG4gICAgICAgICAgICAgICAgKX08L3NwYW4+YDtcbiAgICAgICAgICAgICAgICBidXR0b25BdHRyc1snYXJpYS1sYWJlbCddID0gd2luZG93Lmh0bWwoXG4gICAgICAgICAgICAgICAgICAgICdkZW1vTW9kZS5wcmV2aWV3VGl0bGUnLFxuICAgICAgICAgICAgICAgICAgICB7IHRpdGxlIH1cbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYm9ycm93JzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0xpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdzZWNvbmRhcnktY29sb3InKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goJ2lzLWJvcnJvdyBqcy1ib3Jyb3cgc2Vjb25kYXJ5Jyk7XG4gICAgICAgICAgICAgICAgYnV0dG9uQXR0cnMuaHRtbCA9IGA8c3Bhbj4ke3RoaXMuX2dldEJvcnJvd0J1dHRvblRleHQoKX08L3NwYW4+YDtcbiAgICAgICAgICAgICAgICBidXR0b25BdHRyc1snYXJpYS1sYWJlbCddID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZ2V0Qm9ycm93QnV0dG9uQXJpYUxhYmVsKHRpdGxlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2JvcnJvd2VkJzpcbiAgICAgICAgICAgICAgICBpZiAod2luZG93LmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnZ2VvLWlkYycpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnaXMtb3BlbkJvb2sgYmlnJyk7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbkF0dHJzLmh0bWwgPSBgPHNwYW4+JHt3aW5kb3cuaHRtbChcbiAgICAgICAgICAgICAgICAgICAgICAgICdvcGVuQm9vaydcbiAgICAgICAgICAgICAgICAgICAgKX08L3NwYW4+YDtcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uQXR0cnMuaHJlZiA9IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5tZWRpYURvd25sb2FkLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IHRoaXMubW9kZWwuYXR0cmlidXRlcy5mb3JtYXRzWzBdLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJZDogdGhpcy5tb2RlbC5pZCxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbkF0dHJzWydhcmlhLWxhYmVsJ10gPSB3aW5kb3cuaHRtbCgnb3BlbkJvb2tMYWJlbCcsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlTmFtZTogdGl0bGUsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBidXR0b25BdHRycy50YXJnZXQgPSAnX2JsYW5rJztcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uQXR0cnMucmVsID0gJ25vcmVmZXJyZXInO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnaXMtYm9ycm93ZWQganMtYm9ycm93ZWQnKTtcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uQXR0cnMuaHRtbCA9IGA8c3Bhbj4ke3dpbmRvdy5odG1sKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2dvVG9Mb2FucydcbiAgICAgICAgICAgICAgICAgICAgKX08L3NwYW4+YDtcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uQXR0cnMuaHJlZiA9IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5hY2NvdW50TG9hbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2hvbGQnOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzTGluaykge1xuICAgICAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goJ3NlY29uZGFyeS1jb2xvci1ob3ZlcicpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnaXMtaG9sZCBqcy1ob2xkJyk7XG4gICAgICAgICAgICAgICAgYnV0dG9uQXR0cnMuaHRtbCA9IGA8c3Bhbj4ke3dpbmRvdy5odG1sKCdwbGFjZUFIb2xkJyl9PC9zcGFuPmA7XG4gICAgICAgICAgICAgICAgYnV0dG9uQXR0cnNbJ2FyaWEtbGFiZWwnXSA9IHdpbmRvdy5odG1sKCdwbGFjZUFIb2xkT25UaXRsZScsIHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGUsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdvbkhvbGQnOlxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmlzQnV0dG9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgncHJpbWFyeScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnaXMtb25Ib2xkIGpzLW9uSG9sZCcpO1xuICAgICAgICAgICAgICAgIGJ1dHRvbkF0dHJzLmh0bWwgPSBgPHNwYW4+JHt3aW5kb3cuaHRtbCgnZ29Ub0hvbGRzJyl9PC9zcGFuPmA7XG4gICAgICAgICAgICAgICAgYnV0dG9uQXR0cnMuaHJlZiA9IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5hY2NvdW50SG9sZHMpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncmVuZXcnOlxuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnaXMtcmVuZXcgcmVuZXdhbEJ1dHRvbicpO1xuICAgICAgICAgICAgICAgIGNsYXNzZXMgPSBjbGFzc2VzLmZpbHRlcigoYykgPT4gYyAhPT0gJ3UtYWxsQ2FwcycpO1xuICAgICAgICAgICAgICAgIGJ1dHRvbkF0dHJzLmh0bWwgPSBgPHNwYW4+PGkgY2xhc3M9XCJpY29uIGljb24tcmVuZXdcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+JHt3aW5kb3cuaHRtbChcbiAgICAgICAgICAgICAgICAgICAgJ3JlbmV3YWwucmVuZXdUaXRsZScsXG4gICAgICAgICAgICAgICAgICAgIHsgdGl0bGU6ICcnIH1cbiAgICAgICAgICAgICAgICApfTwvc3Bhbj5gO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncmVxdWVzdEFnYWluJzpcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goJ2lzLXJlcXVlc3RBZ2FpbiByZW5ld2FsQnV0dG9uJyk7XG4gICAgICAgICAgICAgICAgY2xhc3NlcyA9IGNsYXNzZXMuZmlsdGVyKChjKSA9PiBjICE9PSAndS1hbGxDYXBzJyk7XG4gICAgICAgICAgICAgICAgYnV0dG9uQXR0cnMuaHRtbCA9IGA8c3Bhbj48aSBjbGFzcz1cImljb24gaWNvbi1yZW5ld1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT4ke3dpbmRvdy5odG1sKFxuICAgICAgICAgICAgICAgICAgICAnYWNjb3VudExvYW5zLnJlcXVlc3RBZ2FpbidcbiAgICAgICAgICAgICAgICApfTwvc3Bhbj5gO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncmVxdWVzdGVkJzpcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goJ2lzLXJlcXVlc3RlZCByZW5ld2FsQnV0dG9uJyk7XG4gICAgICAgICAgICAgICAgY2xhc3NlcyA9IGNsYXNzZXMuZmlsdGVyKChjKSA9PiBjICE9PSAndS1hbGxDYXBzJyk7XG4gICAgICAgICAgICAgICAgYnV0dG9uQXR0cnMuaHRtbCA9IGA8c3Bhbj48aSBjbGFzcz1cImljb24gaWNvbi1yZW5ld1wiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT4ke3dpbmRvdy5odG1sKFxuICAgICAgICAgICAgICAgICAgICAnYWNjb3VudExvYW5zLnJlcXVlc3RlZCdcbiAgICAgICAgICAgICAgICApfTwvc3Bhbj5gO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAncmVuZXdlZCc6XG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdpcy1yZW5ld2VkIHJlbmV3YWxCdXR0b24nKTtcbiAgICAgICAgICAgICAgICBjbGFzc2VzID0gY2xhc3Nlcy5maWx0ZXIoKGMpID0+IGMgIT09ICd1LWFsbENhcHMnKTtcbiAgICAgICAgICAgICAgICBidXR0b25BdHRycy5odG1sID0gYDxzcGFuPjxpIGNsYXNzPVwiaWNvbiBpY29uLXJlbmV3XCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPiR7d2luZG93Lmh0bWwoXG4gICAgICAgICAgICAgICAgICAgICdhY2NvdW50TG9hbnMucmVuZXdlZCdcbiAgICAgICAgICAgICAgICApfTwvc3Bhbj5gO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbGlzdGVuTm93JzpcbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goJ2lzLWxpc3Rlbk5vdycpO1xuICAgICAgICAgICAgICAgIGJ1dHRvbkF0dHJzLmh0bWwgPSBgPHNwYW4+JHt3aW5kb3cuaHRtbCgnbGlzdGVuTm93Jyl9PC9zcGFuPmA7XG4gICAgICAgICAgICAgICAgYnV0dG9uQXR0cnMuaHJlZiA9IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5tZWRpYURvd25sb2FkLCB7XG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdDogJ2F1ZGlvYm9vay1vdmVyZHJpdmUnLFxuICAgICAgICAgICAgICAgICAgICBtZWRpYUlkOiB0aGlzLm1vZGVsLmlkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJ1dHRvbkF0dHJzLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgICAgIGJ1dHRvbkF0dHJzLnJlbCA9ICdub3JlZmVycmVyJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3JlYWROb3cnOlxuICAgICAgICAgICAgICAgIGNsYXNzZXMucHVzaCgnaXMtcmVhZE5vdycpO1xuICAgICAgICAgICAgICAgIGJ1dHRvbkF0dHJzLmh0bWwgPSBgPHNwYW4+JHt3aW5kb3cuaHRtbCgncmVhZE5vdycpfTwvc3Bhbj5gO1xuICAgICAgICAgICAgICAgIGJ1dHRvbkF0dHJzLmhyZWYgPSB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMubWVkaWFEb3dubG9hZCwge1xuICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6ICdlYm9vay1vdmVyZHJpdmUnLFxuICAgICAgICAgICAgICAgICAgICBtZWRpYUlkOiB0aGlzLm1vZGVsLmlkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJ1dHRvbkF0dHJzLnRhcmdldCA9ICdfYmxhbmsnO1xuICAgICAgICAgICAgICAgIGJ1dHRvbkF0dHJzLnJlbCA9ICdub3JlZmVycmVyJztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2FkZFRvQXBwJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5pc0xpbmspIHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCdzZWNvbmRhcnktY29sb3ItaG92ZXInKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjbGFzc2VzLnB1c2goJ2lzLWFkZFRvQXBwJyk7XG4gICAgICAgICAgICAgICAgYnV0dG9uQXR0cnMuaHRtbCA9IGA8c3Bhbj4ke3dpbmRvdy5odG1sKCdhZGRUb0FwcCcpfTwvc3Bhbj5gO1xuICAgICAgICAgICAgICAgIGJ1dHRvbkF0dHJzLmhyZWYgPSB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMubWVkaWFEb3dubG9hZCwge1xuICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6IHRoaXMubW9kZWwuZ2V0KCdhZGRUb0FwcEZvcm1hdCcpLFxuICAgICAgICAgICAgICAgICAgICBtZWRpYUlkOiB0aGlzLm1vZGVsLmlkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnd2FpdGluZyc6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuaXNMaW5rKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkb3RTcGlubmVyID0gJCh3aW5kb3cucHJpbWFyeUFjdGlvbkxvYWRpbmdHaWYpO1xuICAgICAgICAgICAgICAgICAgICBkb3RTcGlubmVyLmNzcygnd2lkdGgnLCAnaW5oZXJpdCcpO1xuICAgICAgICAgICAgICAgICAgICBidXR0b25BdHRycy5odG1sID0gZG90U3Bpbm5lcjtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2xhc3Nlcy5wdXNoKCd3YWl0aW5nIHNlY29uZGFyeScpO1xuICAgICAgICAgICAgICAgIGJ1dHRvbkF0dHJzLmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBidXR0b25BdHRycy5odG1sID1cbiAgICAgICAgICAgICAgICAgICAgJzxzcGFuPndvcmtpbmc8L3NwYW4+PGRpdiBjbGFzcz1cInNwaW5uZXJcIj48L2Rpdj4nO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgYnV0dG9uQXR0cnMuY2xhc3MgPSBjbGFzc2VzLmpvaW4oJyAnKTtcblxuICAgICAgICByZXR1cm4gYnV0dG9uQXR0cnM7XG4gICAgfVxufVxuIiwiaW1wb3J0IFRpdGxlQ2FyZFRlbXBsYXRlIGZyb20gJy4vdGVtcGxhdGVzL1RpdGxlQ2FyZC5odG1sJztcblxuaW1wb3J0IFRpdGxlSW5mbyBmcm9tICcuL3ZpZXdzL1RpdGxlSW5mbyc7XG5pbXBvcnQgVGl0bGVBY3Rpb25CdXR0b24gZnJvbSAnLi9UaXRsZUFjdGlvbkJ1dHRvbic7XG5pbXBvcnQgV2lzaExpc3RCdXR0b24gZnJvbSAnLi9XaXNoTGlzdEJ1dHRvbic7XG5pbXBvcnQgVGl0bGVIZWFkZXJCYXIgZnJvbSAnLi9UaXRsZUhlYWRlckJhcic7XG5pbXBvcnQgQ292ZXIgZnJvbSAnLi9Db3Zlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpdGxlQ2FyZCBleHRlbmRzIEJhY2tib25lLlZpZXcge1xuICAgIGdldCBjbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiAndGl0bGUtY29udGFpbmVyIHRpdGxlJztcbiAgICB9XG5cbiAgICB0ZW1wbGF0ZSA9IFRpdGxlQ2FyZFRlbXBsYXRlO1xuXG4gICAgY29uc3RydWN0b3IoeyBjb3ZlcldpZHRocywgaXNJbkhlcm8gPSBmYWxzZSB9KSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX3ZpZXdzID0gW107XG5cbiAgICAgICAgdGhpcy5jb3ZlcldpZHRocyA9IGNvdmVyV2lkdGhzO1xuICAgICAgICB0aGlzLmlzSW5IZXJvID0gaXNJbkhlcm87XG5cbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHsgbW9kZWwsIGNvdmVyV2lkdGhzLCBpc0luSGVybyB9ID0gdGhpcztcblxuICAgICAgICB0aGlzLiRlbC5lbXB0eSgpO1xuXG4gICAgICAgIHRoaXMuX3ZpZXdzLmZvckVhY2goKHZpZXcpID0+IHZpZXcucmVtb3ZlKCkpO1xuICAgICAgICB0aGlzLl92aWV3cyA9IFtdO1xuXG4gICAgICAgIGNvbnN0ICR0bXAgPSAkKFxuICAgICAgICAgICAgdGhpcy50ZW1wbGF0ZSh7XG4gICAgICAgICAgICAgICAgZ2VvSWRjQ2xhc3M6IHdpbmRvdy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ2dlby1pZGMnKVxuICAgICAgICAgICAgICAgICAgICA/ICdnZW9JZGMnXG4gICAgICAgICAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFRPRE86IFRoaXMgd2lsbCBub3Qgd29yayAgd2l0aCBDU1MgdHJhbnNpdGlvbiBhbmltYXRpb25zXG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmlzUGxhY2Vob2xkZXIpIHtcbiAgICAgICAgICAgIHRoaXMuJGVsLmFkZENsYXNzKCdwbGFjZWhvbGRlcicpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCF3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdnZW8taWRjJykpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdzLnB1c2goXG4gICAgICAgICAgICAgICAgKHRoaXMudGl0bGVIZWFkZXJCYXIgPSBuZXcgVGl0bGVIZWFkZXJCYXIoe1xuICAgICAgICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgZWw6ICR0bXAuZmluZCgnLlRpdGxlSGVhZGVyQmFyJyksXG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdmlld3MucHVzaChcbiAgICAgICAgICAgICh0aGlzLmNvdmVyID0gbmV3IENvdmVyKHtcbiAgICAgICAgICAgICAgICBtb2RlbCxcbiAgICAgICAgICAgICAgICBlbDogJHRtcC5maW5kKCcuQ292ZXJJbWFnZScpLFxuICAgICAgICAgICAgICAgIGNvdmVyV2lkdGhzLFxuICAgICAgICAgICAgICAgIGlzSW5IZXJvLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy5fdmlld3MucHVzaChcbiAgICAgICAgICAgICh0aGlzLnRpdGxlSW5mbyA9IG5ldyBUaXRsZUluZm8oe1xuICAgICAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgICAgIGVsOiAkdG1wLmZpbmQoJy5UaXRsZUluZm8nKSxcbiAgICAgICAgICAgIH0pKVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMuX3ZpZXdzLnB1c2goXG4gICAgICAgICAgICAodGhpcy50aXRsZUFjdGlvbkJ1dHRvbiA9IG5ldyBUaXRsZUFjdGlvbkJ1dHRvbih7XG4gICAgICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICAgICAgZWw6ICR0bXAuZmluZCgnLlRpdGxlQWN0aW9uJyksXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAhd2luZG93LmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnc2FtcGxlT25seU1vZGUnKSAmJlxuICAgICAgICAgICAgIShcbiAgICAgICAgICAgICAgICB3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdtYWdhemluZS1yb2xsdXAnKSAmJlxuICAgICAgICAgICAgICAgIHRoaXMubW9kZWwuaXNNYWdhemluZVxuICAgICAgICAgICAgKSAmJlxuICAgICAgICAgICAgIXdpbmRvdy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ2Rpc2FibGVXaXNobGlzdCcpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5fdmlld3MucHVzaChcbiAgICAgICAgICAgICAgICAodGhpcy53aXNobGlzdEJ1dHRvbiA9IG5ldyBXaXNoTGlzdEJ1dHRvbih7XG4gICAgICAgICAgICAgICAgICAgIG1vZGVsLFxuICAgICAgICAgICAgICAgICAgICBlbDogJHRtcC5maW5kKCcuVGl0bGVXaXNobGlzdCcpLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnaWNvbi1vbmx5JyxcbiAgICAgICAgICAgICAgICB9KS5yZW5kZXIoKSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLiRlbC5hcHBlbmQoJHRtcCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgcmVtb3ZlKCkge1xuICAgICAgICB0aGlzLl92aWV3cy5mb3JFYWNoKCh2aWV3KSA9PiB2aWV3LnJlbW92ZSgpKTtcbiAgICAgICAgc3VwZXIucmVtb3ZlKCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IFByb2Nlc3NGb3J3YXJkZWRBY3Rpb24gICAgICAgZnJvbSAnLi4vLi4vdXRpbC90aXRsZS1hY3Rpb25zL3Byb2Nlc3NGb3J3YXJkZWRBY3Rpb24nO1xuaW1wb3J0IEhhc2hNYW5hZ2VyICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9jb21tb24vSGFzaE1hbmFnZXInO1xuXG5pbXBvcnQgVGl0bGVDYXJkICAgIGZyb20gJy4vVGl0bGVDYXJkJztcbmltcG9ydCBUaXRsZUFjdGlvbnMgZnJvbSAnLi4vLi4vdGl0bGUtYWN0aW9ucy9UaXRsZUFjdGlvbnMnO1xuY29uc3QgaGUgPSByZXF1aXJlKCdoZScpO1xuLy8gVGhpcyBhc3N1bWVzIHRoYXQgdGhlIGNhbGxpbmcgY29kZSBwYXNzZXMgYSBCYWNrYm9uZS5Db2xsZWN0aW9uIHdpdGggYSBtb2RlbCB0eXBlIG9mIFRpdGxlXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaXRsZUNvbGxlY3Rpb25WaWV3IGV4dGVuZHMgQmFja2JvbmUuVmlldyB7XG5cbiAgICBjb25zdHJ1Y3Rvcih7IGJ1cywgcGF0cm9uTWVkaWFJdGVtc01vZGVsLCBWaWV3LCBhdHRyaWJ1dGVzLCBjb3ZlcldpZHRocywgaXNJbkhlcm8sIGNvbnRleHQgfSkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuXG4gICAgICAgIHRoaXMuX3ZpZXdzICAgICAgICAgPSBbXTtcblxuICAgICAgICB0aGlzLmJ1cyAgICAgICAgICAgID0gYnVzO1xuICAgICAgICB0aGlzLlZpZXcgICAgICAgICAgID0gVmlldyB8fCBUaXRsZUNhcmQ7XG4gICAgICAgIHRoaXMuYXR0cmlidXRlcyAgICAgPSBfLmV4dGVuZCh7fSwgYXR0cmlidXRlcyk7XG4gICAgICAgIHRoaXMuY292ZXJXaWR0aHMgICAgPSBjb3ZlcldpZHRocztcbiAgICAgICAgdGhpcy5pc0luSGVybyAgICAgICA9IGlzSW5IZXJvO1xuICAgICAgICB0aGlzLmNvbnRleHQgICAgICAgID0gY29udGV4dDtcblxuICAgICAgICB0aGlzLnRpdGxlQWN0aW9ucyAgID0gbmV3IFRpdGxlQWN0aW9ucyh7IGJ1czogdGhpcy5idXMsIGNvbnRleHQgfSk7XG5cbiAgICAgICAgdGhpcy5saXN0ZW5Ubyh0aGlzLmNvbGxlY3Rpb24sICd0aXRsZTphY3Rpb24nLCB0aGlzLl9oYW5kbGVUaXRsZUFjdGlvbik7XG5cbiAgICAgICAgLy8gVE9ETzogPj4+IFJlbW92ZSB0aGlzIGNhbGwgYW5kIF91cGRhdGVNZWRpYVN0YXRlcygpIGxvZ2ljIGFuZCB1cGRhdGUgZGVwZW5kYW50IGNvbnN1bWVycyB0byB1c2UgUGF0cm9uVGl0bGVTdGF0dXNcbiAgICAgICAgLy8gRmV0Y2ggcGF0cm9uIGRhdGEgYW5kIHRyaWdnZXIgc3RhdGUgdXBkYXRlcy5cbiAgICAgICAgLy8gT25seSBmZXRjaCBwYXRyb24gZGF0YSBpZiBhdXRoZWQgYW5kIGhhcyBsaW5rZWQgY2FyZHMuXG4gICAgICAgIGlmIChwYXRyb25NZWRpYUl0ZW1zTW9kZWwgJiYgd2luZG93Lk92ZXJEcml2ZS5pc0F1dGhlbnRpY2F0ZWQgJiYgd2luZG93Lk92ZXJEcml2ZS5oYXNMaW5rZWRDYXJkcykge1xuICAgICAgICAgICAgcGF0cm9uTWVkaWFJdGVtc01vZGVsXG4gICAgICAgICAgICAgICAgLmluaXRpYWxGZXRjaCgpXG4gICAgICAgICAgICAgICAgLnRoZW4oKHBhdHJvbkRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRlTWVkaWFTdGF0ZXMocGF0cm9uRGF0YSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cbiAgICBnZXQgdGFnTmFtZSgpIHtcbiAgICAgICAgcmV0dXJuICd1bCc7XG4gICAgfVxuXG4gICAgX2hhbmRsZVRpdGxlQWN0aW9uKHsgYWN0aW9uLCBtb2RlbCB9KSB7XG4gICAgICAgIHRoaXMudGl0bGVBY3Rpb25zLnBlcmZvcm0oYWN0aW9uLCBtb2RlbCk7XG4gICAgfVxuXG4gICAgX3VwZGF0ZU1lZGlhU3RhdGVzKHBhdHJvbkRhdGEpIHtcbiAgICAgICAgbGV0IGlkcyA9IFtdO1xuICAgICAgICBfKF8udmFsdWVzKHBhdHJvbkRhdGEpKS5lYWNoKChpdGVtKSA9PiB7XG4gICAgICAgICAgICBpZiAoXy5pc0FycmF5KGl0ZW0pKSB7XG4gICAgICAgICAgICAgICAgaWRzLnB1c2goLi4uaXRlbSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKF8uaXNPYmplY3QoaXRlbSkpIHtcbiAgICAgICAgICAgICAgICBpZHMucHVzaCguLi5fLmtleXMoaXRlbSkubWFwKE51bWJlcikpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZHMucHVzaChpdGVtKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIGlkcyA9IF8udW5pcShpZHMpO1xuXG4gICAgICAgIGlkcy5mb3JFYWNoKChpZCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLmNvbGxlY3Rpb24uZ2V0KGlkKTtcblxuICAgICAgICAgICAgaWYgKG1vZGVsKSB7XG4gICAgICAgICAgICAgICAgbW9kZWwudXBkYXRlUGF0cm9uU3RhdGUocGF0cm9uRGF0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuX3BlcmZvcm1Gb3J3YXJkZWRBY3Rpb24oKTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGxldCBmcmFnID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpO1xuXG4gICAgICAgIHRoaXMuX3ZpZXdzLmZvckVhY2goKHZpZXcpID0+IHZpZXcucmVtb3ZlKCkpO1xuICAgICAgICB0aGlzLl92aWV3cyA9IFtdO1xuXG4gICAgICAgIHRoaXMuY29sbGVjdGlvbi5mb3JFYWNoKCh0aXRsZSkgPT4ge1xuXG4gICAgICAgICAgICB0aXRsZS5zZXQoJ3RpdGxlJywgaGUuZGVjb2RlKHRpdGxlLmdldCgndGl0bGUnKSkpO1xuXG4gICAgICAgICAgICB0aXRsZS5zZXRDb250ZXh0KHRoaXMuY29udGV4dCk7XG5cbiAgICAgICAgICAgIGxldCB2aWV3ID0gbmV3IHRoaXMuVmlldyh7XG4gICAgICAgICAgICAgICAgbW9kZWwgICAgICAgOiB0aXRsZSxcbiAgICAgICAgICAgICAgICBidXMgICAgICAgICA6IHRoaXMuYnVzLFxuICAgICAgICAgICAgICAgIGNvdmVyV2lkdGhzIDogdGhpcy5jb3ZlcldpZHRocyxcbiAgICAgICAgICAgICAgICBpc0luSGVybyAgICA6IHRoaXMuaXNJbkhlcm9cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBmcmFnLmFwcGVuZENoaWxkKFxuICAgICAgICAgICAgICAgICQoJzxsaSAvPicsIHtcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M6ICdqcy10aXRsZUNhcmQgSXRlbSdcbiAgICAgICAgICAgICAgICB9KS5hcHBlbmQodmlldy4kZWwpWzBdXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB0aGlzLl92aWV3cy5wdXNoKHZpZXcpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoIXdpbmRvdy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ3N0b3BTdGVhbGluZ0NvbGxlY3Rpb25UaXRsZScpKXtcbiAgICAgICAgICAgIC8vIEkgdGhpbmsgd2UgbmV2ZXIgbm90aWNlZCB0aGlzIG9kZCBsb2dpYyBiZWNhdXNlIGluIG1vc3QgY2FzZXMgd2hlcmUgdGhpcyB2aWV3IGlzIHVzZWQgdGhlIHNlbGVjdG9yXG4gICAgICAgICAgICAvLyBiZWxvdyBkb2Vzbid0IG1hdGNoIGFueXRoaW5nIG9uIHRoZSBwYWdlLlxuICAgICAgICAgICAgY29uc3QgJGNvbGxlY3Rpb25UaXRsZSA9ICQoJy5jb2xsZWN0aW9uLXRpdGxlLWNvbnRhaW5lcicpO1xuICAgICAgICAgICAgdGhpcy4kZWwuYXR0cih0aGlzLmF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgdGhpcy4kZWwuZW1wdHkoKS5hcHBlbmQoJGNvbGxlY3Rpb25UaXRsZSkuYXBwZW5kKGZyYWcpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4kZWwuYXR0cih0aGlzLmF0dHJpYnV0ZXMpO1xuICAgICAgICAgICAgdGhpcy4kZWwuZW1wdHkoKS5hcHBlbmQoZnJhZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmUoKSB7XG4gICAgICAgIHRoaXMuX3ZpZXdzLmZvckVhY2goKHZpZXcpID0+IHZpZXcucmVtb3ZlKCkpO1xuICAgICAgICBzdXBlci5yZW1vdmUoKTtcbiAgICB9XG5cbiAgICBfcGVyZm9ybUZvcndhcmRlZEFjdGlvbigpIHtcbiAgICAgICAgaWYgKHdpbmRvdy5PdmVyRHJpdmUuaXNBdXRoZW50aWNhdGVkICYmIHdpbmRvdy5PdmVyRHJpdmUuaGFzTGlua2VkQ2FyZHMgJiYgSGFzaE1hbmFnZXIuZ2V0KCdhY3Rpb24nKSkge1xuICAgICAgICAgICAgY29uc3QgZm9yd2FyZGVkQWN0aW9uID0gbmV3IFByb2Nlc3NGb3J3YXJkZWRBY3Rpb24odGhpcy5jb2xsZWN0aW9uLCB0aGlzLmJ1cyk7XG4gICAgICAgICAgICBmb3J3YXJkZWRBY3Rpb24uZXhlY3V0ZUFjdGlvbigpO1xuICAgICAgICAgICAgd2luZG93LmZvcndhcmRlZEFjdGlvbiA9IGZvcndhcmRlZEFjdGlvbjtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImNvbnN0IEJhY2tib25lID0gd2luZG93LkJhY2tib25lO1xuXG5jb25zdCBUaXRsZUhlYWRlckJhciA9IEJhY2tib25lLlZpZXcuZXh0ZW5kKHtcbiAgICBpbml0aWFsaXplKCkge1xuICAgICAgICB0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsICdjaGFuZ2UnLCB0aGlzLnJlbmRlcik7XG5cbiAgICAgICAgdGhpcy4kdGl0bGVIZWFkZXJCYXIgPSAkKCc8ZGl2IC8+Jyk7XG5cbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9LFxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBjb25zdCBhID0gdGhpcy5yZXR1cm5TdGF0ZSgpO1xuXG4gICAgICAgIHRoaXMuJHRpdGxlSGVhZGVyQmFyID0gJCgnPGRpdiAvPicsIGEuY29udGFpbmVyKS5hcHBlbmQoXG4gICAgICAgICAgICAkKCc8YSAvPicsIGEubGluaylcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy4kZWwuaHRtbCh0aGlzLiR0aXRsZUhlYWRlckJhcik7XG4gICAgICAgIHRoaXMuJGVsLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgcmV0dXJuU3RhdGUoKSB7XG4gICAgICAgIGxldCBiYW5uZXIgPSB7XG4gICAgICAgICAgICBjb250YWluZXI6IHtcbiAgICAgICAgICAgICAgICBjbGFzc2VzOiBbJ3RpdGxlLWhlYWRlci1iYXInLCAndS1hbGxDYXBzJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbGluazoge1xuICAgICAgICAgICAgICAgIHRleHQ6ICcnLFxuICAgICAgICAgICAgICAgIGhyZWY6IHRoaXMubW9kZWwudGl0bGVEZXRhaWxzVXJsLFxuICAgICAgICAgICAgICAgIHRhYmluZGV4OiAtMSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5hY3Rpb24gPSB0aGlzLm1vZGVsLmdldCgndGl0bGVTdGF0ZScpO1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy5hY3Rpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJ3VuYXZhaWxhYmxlJzpcbiAgICAgICAgICAgICAgICBiYW5uZXIuY29udGFpbmVyLmNsYXNzZXMucHVzaChcbiAgICAgICAgICAgICAgICAgICAgJ2lzLXVuYXZhaWxhYmxlIHVuYXZhaWxhYmxlLXRpdGxlJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgYmFubmVyLmxpbmsudGV4dCA9IHdpbmRvdy5odG1sKCdhdmFpbGFiaWxpdHlVbmF2YWlsYWJsZScpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnbm9vayc6XG4gICAgICAgICAgICAgICAgYmFubmVyLmNvbnRhaW5lci5jbGFzc2VzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICdpcy1ub29rIGF2YWlsYWJsZS10aXRsZSBzZWNvbmRhcnktYmFja2dyb3VuZCdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJhbm5lci5saW5rLnRleHQgPSB3aW5kb3cuaHRtbCgnYXZhaWxhYmlsaXR5QXZhaWxhYmxlJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdib3Jyb3cnOlxuICAgICAgICAgICAgICAgIGJhbm5lci5jb250YWluZXIuY2xhc3Nlcy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAnYXZhaWxhYmxlLXRpdGxlIHNlY29uZGFyeS1iYWNrZ3JvdW5kIGlzLWJvcnJvdydcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGJhbm5lci5saW5rLnRleHQgPSB3aW5kb3cuaHRtbCgnYXZhaWxhYmlsaXR5QXZhaWxhYmxlJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdib3Jyb3dlZCc6XG4gICAgICAgICAgICBjYXNlICdhZGRUb0FwcCc6XG4gICAgICAgICAgICBjYXNlICdsaXN0ZW5Ob3cnOlxuICAgICAgICAgICAgY2FzZSAncmVhZE5vdyc6XG4gICAgICAgICAgICAgICAgYmFubmVyLmNvbnRhaW5lci5jbGFzc2VzLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICdpcy1ib3Jyb3dlZCBhdmFpbGFibGUtdGl0bGUgc2Vjb25kYXJ5LWJhY2tncm91bmQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICBiYW5uZXIubGluay50ZXh0ID0gd2luZG93Lmh0bWwoJ2JvcnJvd2VkJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdob2xkJzpcbiAgICAgICAgICAgICAgICBiYW5uZXIuY29udGFpbmVyLmNsYXNzZXMucHVzaCgnaXMtaG9sZCB1bmF2YWlsYWJsZS10aXRsZScpO1xuICAgICAgICAgICAgICAgIGJhbm5lci5saW5rLnRleHQgPSB0aGlzLm1vZGVsLmdldCgnaXNQcmVSZWxlYXNlVGl0bGUnKVxuICAgICAgICAgICAgICAgICAgICA/IHdpbmRvdy5odG1sKCdhdmFpbGFiaWxpdHlDb21pbmdTb29uJylcbiAgICAgICAgICAgICAgICAgICAgOiB3aW5kb3cudGV4dCgnYXZhaWxhYmlsaXR5V2FpdExpc3QnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ29uSG9sZCc6XG4gICAgICAgICAgICAgICAgYmFubmVyLmNvbnRhaW5lci5jbGFzc2VzLnB1c2goJ2lzLW9uSG9sZCB1bmF2YWlsYWJsZS10aXRsZScpO1xuICAgICAgICAgICAgICAgIGJhbm5lci5saW5rLnRleHQgPSB3aW5kb3cuaHRtbCgnb25Ib2xkJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICd3YWl0aW5nJzpcbiAgICAgICAgICAgICAgICBiYW5uZXIuY29udGFpbmVyLmNsYXNzZXMgPSB0aGlzLiR0aXRsZUhlYWRlckJhclxuICAgICAgICAgICAgICAgICAgICAuYXR0cignY2xhc3MnKVxuICAgICAgICAgICAgICAgICAgICAuc3BsaXQoJyAnKTtcbiAgICAgICAgICAgICAgICBiYW5uZXIubGluay50ZXh0ID0gdGhpcy4kdGl0bGVIZWFkZXJCYXIuZmluZCgnYTpmaXJzdCcpLnRleHQoKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGJhbm5lci5jb250YWluZXIuY2xhc3MgPSBiYW5uZXIuY29udGFpbmVyLmNsYXNzZXMuam9pbignICcpO1xuXG4gICAgICAgIHJldHVybiBiYW5uZXI7XG4gICAgfSxcbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBUaXRsZUhlYWRlckJhcjtcbiIsImltcG9ydCBXaXNoTGlzdEJ1dHRvblRlbXBsYXRlIGZyb20gJy4vdGVtcGxhdGVzL1dpc2hMaXN0QnV0dG9uLmh0bWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBXaXNoTGlzdEJ1dHRvbiBleHRlbmRzIEJhY2tib25lLlZpZXcge1xuICAgIGdldCBjb250cmFzdENsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jb250cmFzdCA9PT0gJ2RlZmF1bHQnID8gJycgOiAnY29udHJhc3QtYWx0ZXJuYXRlJztcbiAgICB9XG5cbiAgICBnZXQgYXJpYUxhYmVsKCkge1xuICAgICAgICBjb25zdCB0aXRsZSA9IHRoaXMubW9kZWwuYXR0cmlidXRlcy50aXRsZTtcbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWwuZ2V0KCd3aXNobGlzdFN0YXRlJykgPT09ICd3aXNobGlzdEFkZCdcbiAgICAgICAgICAgID8gd2luZG93Lmh0bWwoJ2FkZFRpdGxlVG9XaXNoTGlzdCcsIHsgdGl0bGUgfSlcbiAgICAgICAgICAgIDogd2luZG93Lmh0bWwoJ3JlbW92ZVRpdGxlRnJvbVdpc2hMaXN0JywgeyB0aXRsZSB9KTtcbiAgICB9XG5cbiAgICBnZXQgaWNvbkNsYXNzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5nZXQoJ3dpc2hsaXN0U3RhdGUnKSA9PT0gJ3dpc2hsaXN0QWRkJ1xuICAgICAgICAgICAgPyAnaWNvbi13aXNoLWxpc3QnXG4gICAgICAgICAgICA6ICdpY29uLXdpc2gtbGlzdC1hZGRlZCc7XG4gICAgfVxuXG4gICAgZ2V0IHRleHQoKSB7XG4gICAgICAgIGlmICh0aGlzLnR5cGUgPT09ICdpY29uLW9ubHknKSB7XG4gICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMubW9kZWwuZ2V0KCd3aXNobGlzdFN0YXRlJykgPT09ICd3aXNobGlzdEFkZCdcbiAgICAgICAgICAgID8gd2luZG93Lmh0bWwoJ2FkZFRvV2lzaExpc3QnKVxuICAgICAgICAgICAgOiB3aW5kb3cuaHRtbCgncmVtb3ZlRnJvbVdpc2hMaXN0Jyk7XG4gICAgfVxuXG4gICAgZ2V0IGdhKCkge1xuICAgICAgICBjb25zdCBpc0FkZCA9IHRoaXMubW9kZWwuZ2V0KCd3aXNobGlzdFN0YXRlJykgPT09ICd3aXNobGlzdEFkZCc7XG4gICAgICAgIGlmIChpc0FkZCkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBtZWRpYUlkOiB0aGlzLm1vZGVsLmF0dHJpYnV0ZXMuaWQsXG4gICAgICAgICAgICAgICAgZm9ybWF0VHlwZTogdGhpcy5tb2RlbC5hdHRyaWJ1dGVzLnR5cGUuaWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKHsgdHlwZSwgY29udHJhc3QgfSkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlIHx8ICdpY29uLW9ubHknO1xuICAgICAgICB0aGlzLmNvbnRyYXN0ID0gY29udHJhc3QgfHwgJ2RlZmF1bHQnO1xuXG4gICAgICAgIHRoaXMubGlzdGVuVG8odGhpcy5tb2RlbCwgJ2NoYW5nZTp3aXNobGlzdFN0YXRlJywgdGhpcy5yZW5kZXIpO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlIHx8ICdpY29uLW9ubHknO1xuICAgIH1cblxuICAgIGV2ZW50cygpIHtcbiAgICAgICAgcmV0dXJuIHsgY2xpY2s6ICdfaGFuZGxlQ2xpY2snIH07XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICBpZiAoIXRoaXMuZWwgfHwgdGhpcy4kZWwubGVuZ3RoIDwgMSkge1xuICAgICAgICAgICAgcmV0dXJuOyAvLyB3ZSBoYXZlIG5vIHRhcmdldCB0byByZW5kZXIgYW55dGhpbmcgaW50b1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcmV0YWluIGZvY3VzIG9uIHJlcmVuZGVyXG4gICAgICAgIGNvbnN0IG5lZWRzUmVmb2N1cyA9XG4gICAgICAgICAgICB0aGlzLmVsLnF1ZXJ5U2VsZWN0b3IoJy5XaXNoTGlzdEJ1dHRvbicpID09PSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXG4gICAgICAgIHRoaXMuJGVsLmVtcHR5KCk7XG5cbiAgICAgICAgY29uc3QgYnV0dG9uSHRtbCA9IFdpc2hMaXN0QnV0dG9uVGVtcGxhdGUoe1xuICAgICAgICAgICAgZ2E6IHRoaXMuZ2EsXG4gICAgICAgICAgICBjb250cmFzdENsYXNzOiB0aGlzLmNvbnRyYXN0Q2xhc3MsXG4gICAgICAgICAgICBhcmlhTGFiZWw6IHRoaXMuYXJpYUxhYmVsLFxuICAgICAgICAgICAgaWNvbkNsYXNzOiB0aGlzLmljb25DbGFzcyxcbiAgICAgICAgICAgIHRleHQ6IHRoaXMudGV4dCxcbiAgICAgICAgICAgIGljb25BbmltYXRpb25DbGFzc2VzOiB3aW5kb3cuT3ZlckRyaXZlLmlzVG9saW5vRGV2aWNlXG4gICAgICAgICAgICAgICAgPyAnJ1xuICAgICAgICAgICAgICAgIDogJ2FuaW1hdGVkIGJvdW5jZUluJyxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy4kZWwuYXBwZW5kKGJ1dHRvbkh0bWwpO1xuXG4gICAgICAgIGlmIChuZWVkc1JlZm9jdXMpIHtcbiAgICAgICAgICAgIHRoaXMuZWwucXVlcnlTZWxlY3RvcignLldpc2hMaXN0QnV0dG9uJykuZm9jdXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIF9oYW5kbGVDbGljaygpIHtcbiAgICAgICAgdGhpcy5tb2RlbC50cmlnZ2VyKCd0aXRsZTphY3Rpb24nLCB7XG4gICAgICAgICAgICBhY3Rpb246ICd3aXNoJyxcbiAgICAgICAgICAgIG1vZGVsOiB0aGlzLm1vZGVsLFxuICAgICAgICB9KTtcbiAgICAgICAgaWYgKCF3aW5kb3cuT3ZlckRyaXZlLmlzVG9saW5vRGV2aWNlKSB7XG4gICAgICAgICAgICB0aGlzLl9hbmltYXRlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfYW5pbWF0ZSgpIHtcbiAgICAgICAgdGhpcy4kZWxcbiAgICAgICAgICAgIC5maW5kKCdpJylcbiAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnYW5pbWF0ZWQgYm91bmNlSW4gYm91bmNlT3V0JylcbiAgICAgICAgICAgIC5hZGRDbGFzcygnYW5pbWF0ZWQgYm91bmNlT3V0Jyk7XG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgTGVuZGluZ1BlcmlvZCBleHRlbmRzIEJhY2tib25lLk1vZGVsIHtcbiAgICBnZXQgZGVmYXVsdHMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpc1ByZWZlcnJlZExlbmRpbmdQZXJpb2Q6IGZhbHNlLFxuICAgICAgICAgICAgbGVuZGluZ1BlcmlvZCAgICAgICAgICAgOiAxLFxuICAgICAgICAgICAgdW5pdHMgICAgICAgICAgICAgICAgICAgOiAnZGF5cycsXG4gICAgICAgICAgICBzZWxlY3RlZCAgICAgICAgICAgICAgICA6IGZhbHNlIC8vIE5vbiBBUEkgcHJvcGVydHlcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBnZXQgcGVyaW9kKCkge1xuICAgICAgICBsZXQgbGVuZGluZ1BlcmlvZCA9IHRoaXMuZ2V0KCdsZW5kaW5nUGVyaW9kJyk7XG4gICAgICAgIGlmICh0aGlzLmdldCgndW5pdHMnKSA9PT0gJ21pbnV0ZXMnKSB7XG5cbiAgICAgICAgICAgIGxldCBkYXlSZW1haW5kZXJNaW51dGVzID0gKGxlbmRpbmdQZXJpb2QgJSAoNjAgKiAyNCkpO1xuXG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGRheXM6IChsZW5kaW5nUGVyaW9kIC0gZGF5UmVtYWluZGVyTWludXRlcykgLyAoNjAgKiAyNCksXG4gICAgICAgICAgICAgICAgaG91cnM6IE1hdGguY2VpbChkYXlSZW1haW5kZXJNaW51dGVzIC8gNjApXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkYXlzOiBsZW5kaW5nUGVyaW9kXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLyoqIEB0eXBlIHtzdHJpbmd9IC0gTG9jYWxpemVkIGRpc3BsYXkgbGFiZWwgZm9yIGxlbmRpbmcgcGVyaW9kICovXG4gICAgZ2V0IGxhYmVsKCkge1xuICAgICAgICAvLyByZWY6IExIVE5HLTE3ODkgLSBgRm9yIFt7bn0gZGF5c10gW3tkfSBob3Vyc11gXG4gICAgICAgIGxldCB0ZXh0UGFydHMgPSBbXTtcbiAgICAgICAgISF0aGlzLnBlcmlvZC5kYXlzICYmIHRoaXMucGVyaW9kLmRheXMgPiAwICAmJiB0ZXh0UGFydHMucHVzaCh3aW5kb3cuaHRtbCgnYWNjb3VudExvYW5zLmV4cGlyZXNEYXlzJywgIHsgdGltZTogdGhpcy5wZXJpb2QuZGF5cyB9KSk7XG4gICAgICAgICEhdGhpcy5wZXJpb2QuaG91cnMgJiYgdGhpcy5wZXJpb2QuaG91cnMgPiAwICYmIHRleHRQYXJ0cy5wdXNoKHdpbmRvdy5odG1sKCdhY2NvdW50TG9hbnMuZXhwaXJlc0hvdXJzJywgeyB0aW1lOiB0aGlzLnBlcmlvZC5ob3VycyB9KSk7XG5cbiAgICAgICAgcmV0dXJuIHdpbmRvdy5odG1sKCdib3Jyb3dGb3JUZXh0SHRtbCcsIHsgdGV4dDogdGV4dFBhcnRzLmpvaW4oJyAnKSB9KTtcblxuICAgIH1cbn1cbiIsImltcG9ydCBUaXRsZVN0YXRlIGZyb20gJy4uLy4uLy4uL3RpdGxlLWFjdGlvbnMvVGl0bGVTdGF0ZSc7XG5pbXBvcnQgTWVkaWFJbnRlcmZhY2UgZnJvbSAnLi4vTWVkaWFJbnRlcmZhY2UnO1xuaW1wb3J0IHsgdG9TdGF0aWNVcmwgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9saWIvYXNzZXRNYXBwZXInO1xuaW1wb3J0IHsgZ2V0T3B0aW1pemVkQ292ZXJzIH0gZnJvbSAnLi4vLi4vLi4vLi4vLi4vbGliL2dldE9wdGltaXplZENvdmVyLXRzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGl0bGUgZXh0ZW5kcyBCYWNrYm9uZS5Nb2RlbCB7XG4gICAgZ2V0IGlkQXR0cmlidXRlKCkge1xuICAgICAgICByZXR1cm4gJ2lkJztcbiAgICB9XG5cbiAgICBkZWZhdWx0cygpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGlkOiAwLFxuICAgICAgICAgICAgZmlyc3RDcmVhdG9yTmFtZTogbnVsbCxcbiAgICAgICAgICAgIHRpdGxlOiAnVGl0bGUnLFxuICAgICAgICAgICAgZmlyc3RDcmVhdG9ySWQ6IDAsXG4gICAgICAgICAgICBmb3JtYXRzOiBbXSxcbiAgICAgICAgICAgIGlzT3duZWQ6IGZhbHNlLFxuICAgICAgICAgICAgaXNIb2xkYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBpc1ByZVJlbGVhc2VUaXRsZTogZmFsc2UsXG4gICAgICAgICAgICBpc0F2YWlsYWJsZTogZmFsc2UsXG4gICAgICAgICAgICBzdGFyUmF0aW5nOiAwLjAsXG4gICAgICAgICAgICB1c2VyU3RhclJhdGluZzogMCxcbiAgICAgICAgICAgIHN0YXJSYXRpbmdDb3VudDogMCxcbiAgICAgICAgICAgIGhvbGRzUmF0aW86IDAsXG4gICAgICAgICAgICBob2xkc0NvdW50OiAwLFxuICAgICAgICAgICAgb3duZWRDb3BpZXM6IDAsXG4gICAgICAgICAgICBhdmFpbGFibGVDb3BpZXM6IDAsXG4gICAgICAgICAgICBsdWNreURheU93bmVkQ29waWVzOiAwLFxuICAgICAgICAgICAgbHVja3lEYXlBdmFpbGFibGVDb3BpZXM6IDAsXG4gICAgICAgICAgICBlc3RpbWF0ZWRSZWxlYXNlRGF0ZTogJycsXG4gICAgICAgICAgICBhdmFpbGFiaWxpdHlUeXBlOiAnJyxcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICAgICAgICAgIHNhbXBsZToge30sIC8vIFNhbXBsZVxuICAgICAgICAgICAgcHVibGlzaGVyOiB7fSwgLy8gUHVibGlzaGVyXG4gICAgICAgICAgICB0eXBlOiB7IGlkOiAnZWJvb2snIH0sIC8vIFR5cGVcbiAgICAgICAgICAgIGNvdmVyczoge30sIC8vIENvdmVyc1xuICAgICAgICAgICAgcGFyZW50TWFnYXppbmVUaXRsZUlkOiAwLFxuICAgICAgICAgICAgcmF0aW5nczoge1xuICAgICAgICAgICAgICAgIG1hdHVyaXR5TGV2ZWw6IHt9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIC8vIEN1c3RvbSBMaWdodG5pbmcgUHJvcGVydGllc1xuICAgICAgICAgICAgdGl0bGVTdGF0ZTogJ3dhaXRpbmcnLFxuICAgICAgICAgICAgd2lzaGxpc3RTdGF0ZTogJ3dpc2hsaXN0QWRkJyxcbiAgICAgICAgICAgIGlzSW5IaXN0b3J5OiBmYWxzZSxcbiAgICAgICAgICAgIGFkZFRvQXBwRm9ybWF0OiBudWxsLFxuICAgICAgICAgICAgaXNPbkhvbGQ6IGZhbHNlLFxuICAgICAgICAgICAgaXNSZWxlYXNlZEhvbGQ6IGZhbHNlLFxuICAgICAgICAgICAgaXNCb3Jyb3dlZDogZmFsc2UsXG4gICAgICAgICAgICBpc01vc3RSZWNlbnRNYWdhemluZTogZmFsc2UsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0IGlzUGxhY2Vob2xkZXIoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldCgncGxhY2Vob2xkZXInKTtcbiAgICB9XG5cbiAgICBzZXRDb250ZXh0KGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gY29udGV4dDtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3Rvcihtb2RlbCwgb3B0aW9ucywgY29udGV4dCkge1xuICAgICAgICBsZXQgeyBwYXRyb25JdGVtcyB9ID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICBzdXBlcihtb2RlbCwgb3B0aW9ucyk7XG5cbiAgICAgICAgdGhpcy5zZXRDb250ZXh0KGNvbnRleHQpO1xuXG4gICAgICAgIHRoaXMuc2V0KFxuICAgICAgICAgICAgXy5leHRlbmQoe30sIG1vZGVsLCB7IHRpdGxlU3RhdGU6IHRoaXMuX2dldFN0YXRlKHBhdHJvbkl0ZW1zKSB9KVxuICAgICAgICApO1xuICAgICAgICBpZiAoIXRoaXMuaXNQbGFjZWhvbGRlcikge1xuICAgICAgICAgICAgdGhpcy5saW5rKHdpbmRvdy5nbG9iYWxFdmVudHMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbGluayhidXMpIHtcbiAgICAgICAgLy8gVW5saW5rIHRoZSBvbGQgYnVzIGlmIHRoZXJlIGlzIG9uZVxuICAgICAgICBpZiAodGhpcy5idXMpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcExpc3RlbmluZyh0aGlzLmJ1cywgJ3RpdGxlOnVwZGF0ZScpO1xuICAgICAgICAgICAgdGhpcy5idXMgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQXR0YWNoIG5ldyBidXMgaWYgcGFzc2VkXG4gICAgICAgIGlmIChidXMpIHtcbiAgICAgICAgICAgIHRoaXMuYnVzID0gYnVzO1xuICAgICAgICAgICAgdGhpcy5saXN0ZW5Ubyh0aGlzLmJ1cywgJ3RpdGxlOnVwZGF0ZScsICh0aXRsZU1vZGVsKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5fYXBwbHlVcGRhdGVzKHRpdGxlTW9kZWwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBfYXBwbHlVcGRhdGVzKHRpdGxlTW9kZWwpIHtcbiAgICAgICAgaWYgKHRpdGxlTW9kZWwgIT09IHRoaXMgJiYgdGl0bGVNb2RlbC5pZCA9PT0gdGhpcy5pZCkge1xuICAgICAgICAgICAgc3VwZXIuc2V0KHRpdGxlTW9kZWwuY2hhbmdlZEF0dHJpYnV0ZXMoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzZXQoKSB7XG4gICAgICAgIHN1cGVyLnNldCguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLmJ1cyAmJiB0aGlzLmJ1cy50cmlnZ2VyKCd0aXRsZTp1cGRhdGUnLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvLyBBbiBleGFtcGxlIG9mIHRoaXMgY2FuIGJlIHNlZW4gaW4gQ29sbGVjdGlvbkhpZ2h0bGlnaHQuanM6NjEgKHdoZXJlIFRpdGxlQ29sbGVjdGlvblZpZXcgZ2V0cyBuZXcnZWQgdXApXG4gICAgZ2V0IGNvbnRleHRDb2xsZWN0aW9uSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbnRleHQgJiYgdGhpcy5jb250ZXh0LmNvbGxlY3Rpb25EZWZpbml0aW9uXG4gICAgICAgICAgICA/IHRoaXMuY29udGV4dC5jb2xsZWN0aW9uRGVmaW5pdGlvbi5pZFxuICAgICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZ2V0IHRpdGxlRGV0YWlsc1VybCgpIHtcbiAgICAgICAgLy8gTEhUTkctMzAxOCBSZWZlcmVuY2Ugb3B0aW9uYWwgY29udGV4dENvbGxlY3Rpb25JZCB2YWx1ZSB3aGVuIGNyZWF0aW5nIGEgdGl0bGUgZGV0YWlscyBsaW5rXG4gICAgICAgIGxldCBwcm9wcyA9IHsgaWQ6IHRoaXMuaWQgfTtcblxuICAgICAgICBpZiAodGhpcy5jb250ZXh0Q29sbGVjdGlvbklkKSB7XG4gICAgICAgICAgICBwcm9wcy5jaWQgPSB0aGlzLmNvbnRleHRDb2xsZWN0aW9uSWQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gd2luZG93LnVybCh3aW5kb3cucm91dGVzLm1lZGlhSWQsIHByb3BzKTtcbiAgICB9XG5cbiAgICBnZXQgaGFzTHVja3lEYXlDb3BpZXMoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdMdWNreURheScpICYmXG4gICAgICAgICAgICB0aGlzLmdldCgnbHVja3lEYXlPd25lZENvcGllcycpID4gMFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldCBhbGxDb3BpZXNBcmVMdWNreURheSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuaGFzTHVja3lEYXlDb3BpZXMgJiYgdGhpcy5nZXQoJ293bmVkQ29waWVzJykgPT09IDA7XG4gICAgfVxuXG4gICAgZ2V0IGlzTHVja3lEYXlDaGVja291dCgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuaGFzQXZhaWxhYmxlTHVja3lEYXlDb3BpZXMgJiZcbiAgICAgICAgICAgIHRoaXMuZ2V0KCdhdmFpbGFibGVDb3BpZXMnKSA9PT0gMCAmJlxuICAgICAgICAgICAgIXRoaXMuZ2V0KCdpc1JlbGVhc2VkSG9sZCcpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0IGNhblBsYWNlSG9sZCgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuZ2V0KCdpc0hvbGRhYmxlJykgJiZcbiAgICAgICAgICAgICF0aGlzLmdldCgnaXNPbkhvbGQnKSAmJlxuICAgICAgICAgICAgd2luZG93LmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnY29udGVudC1ob2xkcycpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgZ2V0IGlzQXZhaWxhYmxlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ2lzQXZhaWxhYmxlJykgfHwgdGhpcy5oYXNBdmFpbGFibGVMdWNreURheUNvcGllcztcbiAgICB9XG5cbiAgICBnZXQgaGFzQXZhaWxhYmxlTHVja3lEYXlDb3BpZXMoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLmhhc0x1Y2t5RGF5Q29waWVzICYmIHRoaXMuZ2V0KCdsdWNreURheUF2YWlsYWJsZUNvcGllcycpID4gMFxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldCBpc0V4cGlyZWQoKSB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLmdldCgnaXNPd25lZCcpICYmXG4gICAgICAgICAgICAodGhpcy5pc0V4cGlyZWRTdVRpdGxlIHx8IHRoaXMuaXNFeHBpcmVkTm9uU3VUaXRsZSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXQgaXNFeHBpcmVkU3VUaXRsZSgpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHRoaXMuZ2V0KCdhdmFpbGFiaWxpdHlUeXBlJykgPT09ICdhbHdheXMnICYmXG4gICAgICAgICAgICAhdGhpcy5nZXQoJ2lzUHJlUmVsZWFzZVRpdGxlJykgJiZcbiAgICAgICAgICAgICF0aGlzLmdldCgnaXNBdmFpbGFibGUnKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIGdldCBpc0V4cGlyZWROb25TdVRpdGxlKCkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5nZXQoJ2F2YWlsYWJpbGl0eVR5cGUnKSAhPT0gJ2Fsd2F5cycgJiZcbiAgICAgICAgICAgICF0aGlzLmdldCgnb3duZWRDb3BpZXMnKVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHVwZGF0ZVBhdHJvblN0YXRlKHBhdHJvbkl0ZW1zLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgdGhpcy5zZXQoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGl0bGVTdGF0ZTogdGhpcy5fZ2V0U3RhdGUocGF0cm9uSXRlbXMpLFxuICAgICAgICAgICAgICAgIHdpc2hsaXN0U3RhdGU6IFRpdGxlU3RhdGUuaXNPbldpc2hsaXN0KFxuICAgICAgICAgICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICAgICAgICAgIHBhdHJvbkl0ZW1zXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICA/ICd3aXNobGlzdFJlbW92ZSdcbiAgICAgICAgICAgICAgICAgICAgOiAnd2lzaGxpc3RBZGQnLFxuICAgICAgICAgICAgICAgIHVzZXJTdGFyUmF0aW5nOiBUaXRsZVN0YXRlLnN0YXJSYXRpbmcoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICAgICAgcGF0cm9uSXRlbXNcbiAgICAgICAgICAgICAgICApLCAvLyAwIGlmIG5vdCByYXRlZFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgcmVhZGluZ0hpc3RvcnlTdGF0ZSA9IFRpdGxlU3RhdGUuaXNPblJlYWRpbmdIaXN0b3J5KFxuICAgICAgICAgICAgdGhpcy5hdHRyaWJ1dGVzLFxuICAgICAgICAgICAgcGF0cm9uSXRlbXNcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zZXQoJ2lzSW5IaXN0b3J5JywgcmVhZGluZ0hpc3RvcnlTdGF0ZSwgb3B0aW9ucyB8fCB7fSk7XG5cbiAgICAgICAgY29uc3QgdXNlclN0YXJSYXRpbmcgPSBUaXRsZVN0YXRlLnN0YXJSYXRpbmcoXG4gICAgICAgICAgICB0aGlzLmF0dHJpYnV0ZXMsXG4gICAgICAgICAgICBwYXRyb25JdGVtc1xuICAgICAgICApO1xuICAgICAgICB0aGlzLnNldCgndXNlclN0YXJSYXRpbmcnLCB1c2VyU3RhclJhdGluZywgb3B0aW9ucyB8fCB7fSk7IC8vIDAgaWYgbm90IHJhdGVkXG4gICAgfVxuXG4gICAgZ2V0Q292ZXIoZGVzaXJlZFNpemUpIHtcbiAgICAgICAgY29uc3QgY292ZXJzID0gXy5tYXAodGhpcy5nZXQoJ2NvdmVycycpLCAoY292ZXIpID0+IGNvdmVyKTsgLy8gbWFwcyB0byBjb2xsZWN0aW9uIG9mIGNvdmVyc1xuICAgICAgICByZXR1cm4gZ2V0T3B0aW1pemVkQ292ZXJzKGNvdmVycywgZGVzaXJlZFNpemUpO1xuICAgIH1cblxuICAgIGdldENvdmVyU3JjKGRlc2lyZWRTaXplKSB7XG4gICAgICAgIGNvbnN0IGNvdmVyID0gdGhpcy5nZXRDb3ZlcihkZXNpcmVkU2l6ZSk7XG4gICAgICAgIHJldHVybiAoY292ZXIgJiYgY292ZXIuaHJlZikgfHwgdG9TdGF0aWNVcmwoJ2ltZy9uby1jb3Zlcl9lbl9VUy5qcGcnKTtcbiAgICB9XG5cbiAgICBnZXRDdXJyZW50QXZhaWxhYmlsaXR5KCkge1xuICAgICAgICByZXR1cm4gJC5hamF4KHtcbiAgICAgICAgICAgIHVybDogd2luZG93LnVybCh3aW5kb3cucm91dGVzLm1lZGlhQXZhaWxhYmlsaXR5SWQsIHsgaWQ6IHRoaXMuaWQgfSksXG4gICAgICAgICAgICB0eXBlOiAnR0VUJyxcbiAgICAgICAgICAgIHRpbWVvdXQ6IDAsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldE1pc3NpbmdBdHRyaWJ1dGUoYXR0cmlidXRlKSB7XG4gICAgICAgIGlmICghdGhpcy5fbWVkaWFJbnRlcmZhY2UpIHtcbiAgICAgICAgICAgIHRoaXMuX21lZGlhSW50ZXJmYWNlID0gbmV3IE1lZGlhSW50ZXJmYWNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX21lZGlhSW50ZXJmYWNlXG4gICAgICAgICAgICAuc2VhcmNoKHsgdGl0bGVJZDogdGhpcy5nZXQoJ2lkJykgfSlcbiAgICAgICAgICAgIC50aGVuKChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0KGF0dHJpYnV0ZSwgcmVzcG9uc2VbYXR0cmlidXRlXSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgYXZhaWxhYmlsaXR5VGV4dCgpIHtcbiAgICAgICAgbGV0IGFjdGlvbiA9IHRoaXMuZ2V0KCd0aXRsZVN0YXRlJyk7XG4gICAgICAgIGxldCBhdmFpbGFiaWxpdHlUZXh0ID0gJyc7XG5cbiAgICAgICAgc3dpdGNoIChhY3Rpb24pIHtcbiAgICAgICAgICAgIGNhc2UgJ3VuYXZhaWxhYmxlJzpcbiAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlUZXh0ID0gd2luZG93Lmh0bWwoJ2F2YWlsYWJpbGl0eVVuYXZhaWxhYmxlJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdub29rJzpcbiAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlUZXh0ID0gd2luZG93Lmh0bWwoJ2F2YWlsYWJpbGl0eUF2YWlsYWJsZScpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnYm9ycm93JyB8fCAncHJldmlldyc6XG4gICAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5VGV4dCA9IHdpbmRvdy5odG1sKCdhdmFpbGFiaWxpdHlBdmFpbGFibGUnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ2JvcnJvd2VkJzpcbiAgICAgICAgICAgIGNhc2UgJ2FkZFRvQXBwJzpcbiAgICAgICAgICAgIGNhc2UgJ2xpc3Rlbk5vdyc6XG4gICAgICAgICAgICBjYXNlICdyZWFkTm93JzpcbiAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlUZXh0ID0gd2luZG93Lmh0bWwoJ2JvcnJvd2VkJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdob2xkJzpcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXQoJ2lzUHJlUmVsZWFzZVRpdGxlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5VGV4dCA9IHdpbmRvdy5odG1sKCdhdmFpbGFiaWxpdHlDb21pbmdTb29uJyk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVRleHQgPSB0aGlzLmdldCgnaXNQcmVSZWxlYXNlVGl0bGUnKVxuICAgICAgICAgICAgICAgICAgICA/IHdpbmRvdy5odG1sKCdhdmFpbGFiaWxpdHlDb21pbmdTb29uJylcbiAgICAgICAgICAgICAgICAgICAgOiB3aW5kb3cuaHRtbCgnYXZhaWxhYmlsaXR5V2FpdExpc3QnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ29uSG9sZCc6XG4gICAgICAgICAgICAgICAgYXZhaWxhYmlsaXR5VGV4dCA9IHdpbmRvdy5odG1sKCdvbkhvbGQnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3dhaXRpbmcnOlxuICAgICAgICAgICAgICAgIGF2YWlsYWJpbGl0eVRleHQgPSB3aW5kb3cuaHRtbCgnbG9hZGluZycpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGF2YWlsYWJpbGl0eVRleHQ7XG4gICAgfVxuXG4gICAgX2dldFN0YXRlKHBhdHJvbkl0ZW1zKSB7XG4gICAgICAgIHRoaXMuc2V0UGF0cm9uU3RhdGUocGF0cm9uSXRlbXMpO1xuICAgICAgICByZXR1cm4gVGl0bGVTdGF0ZS5nZXRTdGF0ZSh0aGlzLmF0dHJpYnV0ZXMsIHBhdHJvbkl0ZW1zKTtcbiAgICB9XG5cbiAgICBzZXRQYXRyb25TdGF0ZShwYXRyb25JdGVtcykge1xuICAgICAgICB0aGlzLnNldCh7XG4gICAgICAgICAgICBpc09uSG9sZDogcGF0cm9uSXRlbXMgJiYgcGF0cm9uSXRlbXMub25Ib2xkcy5pbmRleE9mKHRoaXMuaWQpID4gLTEsXG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnNldCh7XG4gICAgICAgICAgICBpc0JvcnJvd2VkOlxuICAgICAgICAgICAgICAgIHBhdHJvbkl0ZW1zICYmIHBhdHJvbkl0ZW1zLm9uQ2hlY2tvdXRzLmluZGV4T2YodGhpcy5pZCkgPiAtMSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgc2FuaXRpemVkRGVzYygpIHtcbiAgICAgICAgbGV0IGRlc2MgPSB0aGlzLmdldCgnZGVzY3JpcHRpb24nKS5yZXBsYWNlKFxuICAgICAgICAgICAgLyg8YnJcXHMqW1xcL10/Pil8KFxccj9cXG58XFxyKS9naW0sXG4gICAgICAgICAgICAnICdcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuICQoYDxkaXY+JHtkZXNjfTwvZGl2PmApLnRleHQoKTtcbiAgICB9XG5cbiAgICBnZXRUaXRsZUFzeW5jKG1lZGlhSWQsIHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMubWVkaWFJbmZvSWQsIHsgaWQ6IG1lZGlhSWQgfSksXG4gICAgICAgICAgICB0eXBlOiAnR0VUJyxcbiAgICAgICAgICAgIHRpbWVvdXQ6IDEwMDAwLFxuICAgICAgICAgICAgc3VjY2VzczogKGRhdGEpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLnNldChkYXRhKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldCgndGl0bGVTdGF0ZScsIHRoaXMuX2dldFN0YXRlKG51bGwpKTtcbiAgICAgICAgICAgICAgICByZXNvbHZlKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZmFpbDogKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdChlcnIpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0IGlzTWFnYXppbmUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldCgndHlwZScpLmlkID09PSAnbWFnYXppbmUnO1xuICAgIH1cbn1cbiIsIlxuaW1wb3J0IFRpdGxlIGZyb20gJy4vVGl0bGUnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaXRsZUNvbGxlY3Rpb24gZXh0ZW5kcyBCYWNrYm9uZS5Db2xsZWN0aW9uIHtcbiAgICBnZXQgbW9kZWwoKSB7IHJldHVybiBUaXRsZTsgfVxufVxuXG4iLCJjb25zdCB7IGZlYXR1cmVNYW5hZ2VyLCBodG1sLCB1cmwsIHJvdXRlcyB9ID0gd2luZG93O1xuXG5leHBvcnQgZGVmYXVsdCAoe1xuICAgIGlzT3duZWQsXG4gICAgcmVsYXRlZFRpdGxlc1BhZ2VVcmwsXG4gICAgaWQsXG4gICAgcmlkLFxuICAgIHR5cGVJZCxcbiAgICB0aXRsZSxcbiAgICBhbGlnbm1lbnQsXG4gICAgc2FtcGxlSHJlZixcbiAgICBzYW1wbGVUZXh0LFxuICAgIGhpc3RvcnlBY3Rpb25MYWJlbCxcbiAgICBoaXN0b3J5QWN0aW9uVGV4dCxcbiAgICBoaXN0b3J5RW5hYmxlZCxcbiAgICBnYUhpc3RvcnlBY3Rpb24sXG4gICAgc2VyaWVzU2VhcmNoVXJsLFxuICAgIGhhc01lZGlhRG9Gb3JtYXQsXG59KSA9PiBgXG48ZGl2IGNsYXNzPVwiQ29udGV4dE1lbnVcIj5cbiAgICA8ZGl2IHRhYmluZGV4PVwiMFwiIGNsYXNzPVwiQ29udGV4dE1lbnUtYnV0dG9uIGpzLWNvbnRleHQtYnV0dG9uXCIgZGF0YS1tZWRpYS1pZD1cIiR7aWR9XCJcbiAgICAgICAgIGRhdGEtdGl0bGU9XCIke3RpdGxlfVwiXG4gICAgICAgICBkYXRhLWRyb3Bkb3duPVwiY29udGV4dC1tZW51LSR7aWR9LSR7cmlkfVwiXG4gICAgICAgICBkYXRhLW9wdGlvbnM9XCJhbGlnbjoke2FsaWdubWVudH1cIlxuICAgICAgICAgYXJpYS1jb250cm9scz1cIm1vcmUtYWN0aW9ucy1kcm9wLSR7aWR9XCJcbiAgICAgICAgIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiXG4gICAgICAgICBhcmlhLWxhYmVsPVwiJHtodG1sKCdjb3Zlci50aXRsZUluZm8nLCB7IHRpdGxlIH0pfVwiXG4gICAgICAgICByb2xlPVwiYnV0dG9uXCI+XG4gICAgICAgIDxpIGNsYXNzPVwiaWNvbiBpY29uLW1vcmVcIiB0YWJpbmRleD1cIi0xXCI+PC9pPlxuICAgIDwvZGl2PlxuXG4gICAgPHVsIGlkPVwiY29udGV4dC1tZW51LSR7aWR9LSR7cmlkfVwiIGNsYXNzPVwiQ29udGV4dE1lbnUtZHJvcCBqcy1jb250ZXh0LWRyb3AgZi1kcm9wZG93biB0ZXh0LWxlZnRcIiBkYXRhLWRyb3Bkb3duLWNvbnRlbnQgYXJpYS1oaWRkZW49XCJmYWxzZVwiIHRhYmluZGV4PVwiLTFcIiByb2xlPVwibGlzdFwiIGFyaWEtaGFzcG9wdXA9XCJ0cnVlXCI+XG4gICAgICAgICR7XG4gICAgICAgICAgICAoIXdpbmRvdy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ2hpZGUtdW5vd25lZC1zYW1wbGVzJykgfHxcbiAgICAgICAgICAgICAgICBpc093bmVkKSAmJlxuICAgICAgICAgICAgc2FtcGxlSHJlZiAhPT0gJydcbiAgICAgICAgICAgICAgICA/IGBcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cInJlYWQtc2FtcGxlIENvbnRleHRNZW51LWl0ZW1cIj5cbiAgICAgICAgICAgICAgICA8YSBkYXRhLWhyZWY9XCIke3NhbXBsZUhyZWZ9XCIgZGF0YS1tZWRpYS1pZD1cIiR7aWR9XCIgZGF0YS10aXRsZT1cIiR7dGl0bGV9XCJcbiAgICAgICAgICAgICAgICBkYXRhLW9mLWRyb3Bkb3duPVwibW9yZS1hY3Rpb25zLWRyb3AtJHtpZH1cIiBkYXRhLXR5cGU9XCIke3R5cGVJZH1cIiBtZWRpYS1kby1mb3JtYXQ9XCIke2hhc01lZGlhRG9Gb3JtYXR9XCJcbiAgICAgICAgICAgICAgICB0YWJpbmRleD1cIi0xXCIgaHJlZj1cImphdmFzY3JpcHQ6dm9pZCgwKVwiIGFyaWEtbGFiZWw9XCIke2h0bWwoXG4gICAgICAgICAgICAgICAgICAgICdjb3Zlci5zYW1wbGVMYWJlbCcsXG4gICAgICAgICAgICAgICAgICAgIHsgc2FtcGxlOiBzYW1wbGVUZXh0LCB0aXRsZSB9XG4gICAgICAgICAgICAgICAgKX1cIj5cbiAgICAgICAgICAgICAgICAgICAgJHtzYW1wbGVUZXh0fVxuICAgICAgICAgICAgICAgIDwvYT5cbiAgICAgICAgICAgIDwvbGk+YFxuICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgfVxuICAgICAgICA8bGkgY2xhc3M9XCJDb250ZXh0TWVudS1pdGVtXCI+XG4gICAgICAgICAgICA8YSB0YWJpbmRleD1cIi0xXCIgaHJlZj1cIiR7dXJsKHJvdXRlcy5tZWRpYUlkLCB7XG4gICAgICAgICAgICAgICAgaWQsXG4gICAgICAgICAgICB9KX1cIiBhcmlhLWxhYmVsPVwiJHtodG1sKCd2aWV3RGV0YWlsc0Fib3V0VGl0bGUnLCB7XG4gICAgdGl0bGUsXG59KX1cIj4ke2h0bWwoJ3ZpZXdEZXRhaWxzJyl9PC9hPlxuICAgICAgICA8L2xpPlxuICAgICAgICAke1xuICAgICAgICAgICAgc2VyaWVzU2VhcmNoVXJsICYmIHNlcmllc1NlYXJjaFVybCAhPT0gJydcbiAgICAgICAgICAgICAgICA/IGBcbiAgICAgICAgICAgIDxsaSBjbGFzcz1cIkNvbnRleHRNZW51LWl0ZW1cIj48YSB0YWJpbmRleD1cIi0xXCIgaHJlZj1cIiR7c2VyaWVzU2VhcmNoVXJsfVwiPiR7aHRtbChcbiAgICAgICAgICAgICAgICAgICAgICAndmlld1NlcmllcydcbiAgICAgICAgICAgICAgICAgICl9PC9hPjwvbGk+YFxuICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgfVxuICAgICAgICAke1xuICAgICAgICAgICAgaGlzdG9yeUVuYWJsZWRcbiAgICAgICAgICAgICAgICA/IGA8bGkgY2xhc3M9XCJDb250ZXh0TWVudS1pdGVtIGpzLWhpc3RvcnlBY3Rpb25cIiBkYXRhLWdhLWFjdGlvbj1cIiR7Z2FIaXN0b3J5QWN0aW9ufVwiIGRhdGEtbWVkaWEtaWQ9XCIke2lkfVwiPjxhIHRhYmluZGV4PVwiLTFcIiByb2xlPVwiYnV0dG9uXCIgYXJpYS1sYWJlbD1cIiR7aGlzdG9yeUFjdGlvbkxhYmVsfVwiPiR7aGlzdG9yeUFjdGlvblRleHR9PC9hPjwvbGk+YFxuICAgICAgICAgICAgICAgIDogYGBcbiAgICAgICAgfVxuICAgICAgICA8bGkgY2xhc3M9XCJDb250ZXh0TWVudS1pdGVtXCI+PGEgdGFiaW5kZXg9XCItMVwiIGhyZWY9XCIke3JlbGF0ZWRUaXRsZXNQYWdlVXJsfVwiIGFyaWEtbGFiZWw9XCIke2h0bWwoXG4gICAgJ3ZpZXdSZWxhdGVkVG9UaXRsZScsXG4gICAgeyB0aXRsZSB9XG4pfVwiPiR7aHRtbCgneW91TWF5QWxzb0xpa2UnKX08L2E+PC9saT5cbiAgICA8L3VsPlxuPC9kaXY+YDtcbiIsImV4cG9ydCBkZWZhdWx0ICh7IG1lZGlhLCBzcmMsIGhyZWYsIGNvdmVyQ29sb3IsIG5vU2FtcGxlQ2xhc3MsIHNyY3NldCB9KSA9PiBgXG48ZGl2IGNsYXNzPVwiQ292ZXJJbWFnZUNvbnRhaW5lclwiIHN0eWxlPVwiYmFja2dyb3VuZC1jb2xvcjogJHtjb3ZlckNvbG9yfVwiPlxuICAgIDxhIGhyZWY9XCIke2hyZWZ9XCJcbiAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgIGRhdGEtaHJlZiAgICA9XCIke2hyZWZ9XCJcbiAgICAgICAgICAgZGF0YS1tZWRpYS1pZD1cIiR7bWVkaWEuaWR9XCJcbiAgICAgICAgICAgZGF0YS10aXRsZSAgID1cIiR7bWVkaWEudGl0bGV9XCJcbiAgICAgICAgICAgZGF0YS10eXBlICAgID1cIiR7bWVkaWEudHlwZS5pZH1cIj5cbiAgICAgICAgPGltZ1xuICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiJHttZWRpYS50aXRsZX0gLSAke2h0bWwobWVkaWEudHlwZS5pZCl9XCJcbiAgICAgICAgICAgIHRhYmluZGV4PVwiMFwiXG4gICAgICAgICAgICBjbGFzcz1cImxhcmdlLXRpdGxlIGpzLWRldGFpbHMtY292ZXItaW1hZ2UgJHtub1NhbXBsZUNsYXNzfSBcIlxuICAgICAgICAgICAgc3JjPVwiJHtzcmN9XCJcbiAgICAgICAgICAgICR7c3Jjc2V0ICYmIGBzcmNzZXQ9XCIke3NyY3NldH1cImB9XG4gICAgICAgICAgICBhbHQ9XCIke21lZGlhLnRpdGxlfSAtICR7aHRtbChtZWRpYS50eXBlLmlkKX1cIlxuICAgICAgICAgICAgc3R5bGU9XCJiYWNrZ3JvdW5kLWNvbG9yOiAke2NvdmVyQ29sb3J9OyBtYXgtaGVpZ2h0OiBub25lICFpbXBvcnRhbnQ7XCIvPlxuICAgIDwvYT5cbjwvZGl2PmA7XG4iLCJleHBvcnQgZGVmYXVsdCh7bWVzc2FnZSwgZG93bmxvYWRVcmx9KSA9PiBgXG4gICAgPHAgZGF0YS1tc2c+XG4gICAgICAgICR7bWVzc2FnZX1cbiAgICA8L3A+XG4gICAgPGRpdiBjbGFzcz1cImJ1dHRvbi1jb250YWluZXJcIj5cbiAgICAgICAgPGEgZGF0YS1kb3dubG9hZC1jb25maXJtIGRhdGEtY2FuY2VsIGhyZWY9XCIke2Rvd25sb2FkVXJsfVwiIHJvbGU9XCJidXR0b25cIiBjbGFzcz1cImJ1dHRvbiBtYXJnaW4tc21hbGwgcmFkaXVzIHNlY29uZGFyeSBjb250cmFzdCB1LWFsbENhcHMgY29uZmlybSBcIiBhcmlhLWxhYmVsPVwiJHtodG1sKCdjb25maXJtJyl9XCI+JHtodG1sKCdjb25maXJtJyl9PC9hPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBkYXRhLWNhbmNlbCBjbGFzcz1cImJ1dHRvbiByYWRpdXMgbWFyZ2luLXNtYWxsIG91dGxpbmUgZ3JheSBjYW5jZWwgdS1hbGxDYXBzIFwiPiR7aHRtbCgnY2FuY2VsJyl9PC9idXR0b24+XG4gICAgPC9kaXY+XG5gO1xuIiwiY29uc3QgeyBodG1sIH0gPSB3aW5kb3c7XG5cbmV4cG9ydCBkZWZhdWx0KHtoZWFkaW5nLCBzcmMsIGlzTHVja3lEYXl9KSA9PiBgXG4gICAgPGRpdiBpZD1cIm5vdy11bmF2YWlsYWJsZS1tb2RhbC10aXRsZVwiIGNsYXNzPVwidGl0bGUtdGV4dFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibm93LXVuYXZhaWxhYmxlLXRleHRcIj4ke2hlYWRpbmd9XG4gICAgICAgICAgICAke2lzTHVja3lEYXkgP1xuICAgICAgICAgICAgICAgIGA8ZGl2IHN0eWxlPVwiZGlzcGxheTogaW5saW5lLWJsb2NrOyBwb3NpdGlvbjogcmVsYXRpdmVcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGlubGluZS1ibG9jazsgZmxvYXQ6IHJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YSByb2xlPVwiYnV0dG9uXCIgaWQ9XCJsdWNreURheVRvb2x0aXBcIiBjbGFzcz1cImhlbHAtdGlwIHNlY29uZGFyeS1iYWNrZ3JvdW5kXCIgc3R5bGU9XCJmbG9hdDogcmlnaHRcIj48L2E+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PmBcbiAgICAgICAgICAgIDogJyd9XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImltZy1jb250YWluZXJcIj5cbiAgICAgICAgPGltZyBkYXRhLWlkPVwiY292ZXItaW1hZ2VcIiBzcmM9XCIke3NyY31cIiBhbHQ9XCIke2h0bWwoJ2NvdmVySW1hZ2UnKX1cIi8+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2IGNsYXNzPVwibWVkaXVtLTggbWVkaXVtLWNlbnRlcmVkIGNvbHVtbnMgYnV0dG9uLWNvbnRhaW5lclwiPlxuICAgICAgICA8c3BhbiBjbGFzcz1cIlRpdGxlQWN0aW9uXCIgLz5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidXR0b24ganMtY2FuY2VsIGNhbmNlbCByYWRpdXMgdS1hbGxDYXBzIG91dGxpbmUgZ3JheVwiPiR7aHRtbCgnY2FuY2VsJyl9PC9idXR0b24+XG4gICAgPC9kaXY+XG5gO1xuIiwiZXhwb3J0IGRlZmF1bHQgKHsgc2VlTW9yZUxpbmsgfSkgPT4gYFxuICAgIDxkaXYgY2xhc3M9XCJIb2xkU3VjY2Vzc01vZGFsLXJlbGF0ZWRUaXRsZXNQcm9tcHRcIiB0YWJpbmRleD1cIjBcIj4ke3dpbmRvdy5odG1sKFxuICAgICAgICAnaG9sZFN1Y2Nlc3NNb2RhbC53YW50VG9Cb3Jyb3dTdWJoZWFkaW5nJ1xuICAgICl9PC9kaXY+XG5cbiAgICA8c2VjdGlvbiBjbGFzcz1cInJlbGF0ZWRUaXRsZXNcIj48L3NlY3Rpb24+XG5cbiAgICA8ZGl2IGNsYXNzPVwiSG9sZFN1Y2Nlc3NNb2RhbC1jYWxsVG9BY3Rpb25Db250YWluZXJcIj5cbiAgICAgICAgPGEgY2xhc3M9XCJidXR0b24gcmFkaXVzIEhvbGRTdWNjZXNzTW9kYWwtY2FsbFRvQWN0aW9uXCIgaHJlZj1cIiR7c2VlTW9yZUxpbmt9XCIgdGFiaW5kZXg9XCIwXCI+JHt3aW5kb3cuaHRtbChcbiAgICAnaG9sZFN1Y2Nlc3NNb2RhbC5zaG93TW9yZSdcbil9PC9hPlxuICAgIDwvZGl2PlxuYDtcbiIsIlxuY29uc3QgeyBodG1sLCB0ZXh0LCB1cmwsIHJvdXRlcyB9ID0gd2luZG93O1xuXG5leHBvcnQgZGVmYXVsdCAoe3N1Y2Nlc3NNZXNzYWdlVGV4dEtleSwgbWFuYWdlSG9sZHNVcmwsIGVtYWlsLCB0aXRsZU1vZGVsLCBjcmVhdG9yU2VhcmNoVXJsLCBob2xkc0luZm8sIG93bmVkQ29waWVzLCBtYWNtaWxsYW5NZXNzYWdlfSkgPT4gIGBcbiAgICA8aDQgY2xhc3M9XCJIb2xkU3VjZXNzTW9kYWwtbWVkaWFUaXRsZVwiPiR7dGl0bGVNb2RlbC50aXRsZX08L2g0PlxuICAgIDxkaXYgY2xhc3M9XCJIb2xkU3VjY2Vzc01vZGFsLWF1dGhvclwiID5cbiAgICAgICAgJHt0ZXh0KCdieUxpbmUnLCB7Y3JlYXRvcjogYDxhIGNsYXNzPVwiSG9sZFN1Y2Nlc3NNb2RhbC1saW5rXCIgaHJlZj1cIiR7Y3JlYXRvclNlYXJjaFVybH1cIiBhcmlhLWxhYmVsPVwiJHtodG1sKCdjb3Zlci5zZWFyY2hCeUF1dGhvcicsIHthdXRob3I6IHRpdGxlTW9kZWwuZmlyc3RDcmVhdG9yTmFtZX0pfVwiPiR7dGl0bGVNb2RlbC5maXJzdENyZWF0b3JOYW1lfTwvYT5gfSl9XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIkhvbGRTdWNjZXNzTW9kYWwtaG9sZEluZm9cIj5cbiAgICAgICAgJHtob2xkc0luZm99XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cIkhvbGRTdWNjZXNzTW9kYWwtc3VjY2Vzc01lc3NhZ2VcIj5cbiAgICAgICAgJHsgb3duZWRDb3BpZXMgIT09IDBcbiAgICAgICAgICAgID8gaHRtbChzdWNjZXNzTWVzc2FnZVRleHRLZXksIHtlbWFpbDogZW1haWwsIG1hbmFnZUhvbGRzTGluazogYDxhIGNsYXNzPVwiSG9sZFN1Y2Nlc3NNb2RhbC1saW5rXCIgaHJlZj1cIiR7bWFuYWdlSG9sZHNVcmx9XCI+JHt3aW5kb3cuaHRtbCgnaG9sZFN1Y2Nlc3NNb2RhbC5tYW5hZ2VIb2xkcycpfTwvYT5gfSkgXG4gICAgICAgICAgICA6IGBgfVxuICAgIDwvZGl2PlxuICAgICR7KG1hY21pbGxhbk1lc3NhZ2UgJiYgbWFjbWlsbGFuTWVzc2FnZS5sZW5ndGggPiAwKSA/IGA8cCBjbGFzcz1cIm1hY21pbGxhbk1lc3NhZ2VcIj4ke21hY21pbGxhbk1lc3NhZ2V9PC9wPmAgOmBgfVxuICAgIDxkaXYgY2xhc3M9XCJyZWxhdGVkVGl0bGVzQ29udGFpbmVyXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJsb2FkZXJcIj48L2Rpdj5cbiAgICA8L2Rpdj5gO1xuIiwiaW1wb3J0IHsgdG9TdGF0aWNVcmwgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9saWIvYXNzZXRNYXBwZXInO1xuXG5leHBvcnQgZGVmYXVsdCAoeyBtZWRpYSwgaHJlZiwgaXNJbkhlcm8sIGNvdmVyV2lkdGgsIGNvdmVySGVpZ2h0LCBjcmVhdG9yVGV4dCB9KSA9PiBgXG48ZGl2IGNsYXNzPVwiQ292ZXJJbWFnZUNvbnRhaW5lclwiPlxuPGEgY2xhc3M9XCJDb3ZlckltYWdlQ29udGFpbmVyIG5vQ292ZXJBdmFpbGFibGUgJHsgaXNJbkhlcm8gPyAnc2Vjb25kYXJ5LWJhY2tncm91bmQnIDogJ3ByaW1hcnktYmFja2dyb3VuZCcgfVwiXG4gICAgaHJlZj1cIiR7IGhyZWYgfVwiXG4gICAgdGFiaW5kZXg9XCItMVwiXG4gICAgZGF0YS1ocmVmICAgID1cIiR7IGhyZWYgfVwiXG4gICAgZGF0YS1tZWRpYS1pZD1cIiR7IG1lZGlhLmlkIH1cIlxuICAgIGRhdGEtdGl0bGUgICA9XCIkeyBtZWRpYS50aXRsZSB9XCJcbiAgICBkYXRhLXR5cGUgICAgPVwiJHsgbWVkaWEudHlwZS5pZCB9XCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ0aXRsZSAkeyBpc0luSGVybyA/ICdzZWNvbmRhcnktZm9udC1oaWdobGlnaHQtYm94JyA6ICdwcmltYXJ5LWZvbnQgcHJpbWFyeS1mb250LWhpZ2hsaWdodC1ib3gnIH1cIj4keyBtZWRpYS50aXRsZSB9PC9kaXY+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJhdXRob3IgJHsgaXNJbkhlcm8gPyAnJyA6ICdwcmltYXJ5LWZvbnQnIH1cIj4keyBjcmVhdG9yVGV4dCB9PC9kaXY+XG5cbiAgICAgICAgPGltZ1xuICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICBhcmlhLWxhYmVsPVwiJHsgbWVkaWEudGl0bGUgfSAtICR7IGh0bWwobWVkaWEudHlwZS5pZCkgfVwiXG4gICAgICAgICAgICB0YWJpbmRleD1cIjBcIlxuICAgICAgICAgICAgY2xhc3M9XCJsYXJnZS10aXRsZSBqcy1kZXRhaWxzLWNvdmVyLWltYWdlXCJcbiAgICAgICAgICAgIHNyYz1cIiR7IHRvU3RhdGljVXJsKCdpbWcvY2xlYXIuZ2lmJykgfVwiXG4gICAgICAgICAgICBhbHQ9XCIkeyBtZWRpYS50aXRsZSB9IC0gJHsgaHRtbChtZWRpYS50eXBlLmlkKSB9XCJcbiAgICAgICAgICAgIC8+XG5cbjwvYT5cbjwvZGl2PlxuXG5gO1xuIiwiY29uc3QgeyBodG1sLCB0ZXh0IH0gPSB3aW5kb3c7XG5cbmV4cG9ydCBkZWZhdWx0ICh7IHRpdGxlLCB0eXBlLCBjb3ZlclNyYywgaWQsIGlzUHJlUmVsZWFzZVRpdGxlLCBwcmVyZWxlYXNlRGF0ZSwgb3duZWRDb3BpZXMsIGxpYnJhcnlOYW1lLCBpc1JlcXVlc3RBZ2FpbiB9KSA9PiBgXG48ZGl2IGNsYXNzPVwibGFyZ2UtMTIgY29sdW1ucyBuby1wYWRkaW5nLWxlZnRcIj5cbiAgICA8aDI+JHsgdGl0bGUgfTwvaDI+XG4gICAgPHNwYW4gY2xhc3M9XCJ0aXRsZS1mb3JtYXQtYmFkZ2VcIj48aSBjbGFzcz1cImljb24tJHsgdHlwZS5pZCB9XCI+PC9pPiA8c3Bhbj4keyBodG1sKHR5cGUuaWQpIH08L3NwYW4+PC9zcGFuPlxuPC9kaXY+XG5cbjxkaXYgY2xhc3M9XCJtZWRpdW0tNCBjb2x1bW5zIG5vLXBhZGRpbmctbGVmdFwiPlxuICAgIDxpbWcgZGF0YS1pZD1cImNvdmVyLWltYWdlXCIgc3JjPVwiJHsgY292ZXJTcmMgfVwiIGFsdD1cIiR7IGh0bWwoJ2NvdmVySW1hZ2UnKSB9XCIvPlxuPC9kaXY+XG5cbjxmb3JtIGlkPVwiaG9sZC1keW5hbWljLWZvcm0tJHsgaWQgfVwiIGRhdGEtYWJpZGU9XCJhamF4XCIgZGF0YS1tZWRpYS1pZD1cIiR7IGlkIH1cIj5cbiAgICA8ZGl2IGNsYXNzPVwibWVkaXVtLTggY29sdW1uc1wiPlxuICAgICAgICAkeyghaXNQcmVSZWxlYXNlVGl0bGUgPyAnJyA6XG4gICAgICAgICAgICBgPHAgY2xhc3M9XCJoZWFkZXIteHh4c21hbGwgcHJlcmVsZWFzZSB0ZXh0LXJlZCBtb2RhbFwiPiR7IHRleHQoJ3ByZXJlbGVhc2VMYWJlbCcsIHsgcHJlcmVsZWFzZURhdGUgfSkgfTwvcD5gXG4gICAgICAgICl9XG4gICAgICAgIDxwIGlkPVwiaG9sZC1tb2RhbC1sYWJlbFwiIGNsYXNzPVwianMtZGlhbG9nLWxhYmVsXCI+XG4gICAgICAgICAgICAkeyhvd25lZENvcGllcyA9PT0gMFxuICAgICAgICAgICAgICAgID8gaHRtbCgnaG9sZHNSYXRpb0hlbHBNb2RhbC5ub0NvcGllc1RleHQnKVxuICAgICAgICAgICAgICAgIDogaXNSZXF1ZXN0QWdhaW4gP1xuICAgICAgICAgICAgICAgICAgICBodG1sKCdyZXF1ZXN0QWdhaW5Nb2RhbC5yZXF1ZXN0QWdhaW5EZXNjJywgeyBsaWJyYXJ5TmFtZSB9KSA6XG4gICAgICAgICAgICAgICAgICAgIGh0bWwoJ2R5bmFtaWNIb2xkTW9kYWwucGxhY2VIb2xkRGVzYycsIHsgbGlicmFyeU5hbWUgfSlcbiAgICAgICAgICAgICl9XG4gICAgICAgIDwvcD5cblxuICAgICAgICA8bGFiZWw+XG4gICAgICAgICAgICA8aW5wdXQgZGF0YS1maXJzdC1mb2N1cyB0eXBlPVwiZW1haWxcIiBpZD1cImVtYWlsLWR5bmFtaWMtJHsgaWQgfVwiIGNsYXNzPVwicGF0cm9uLWhvbGQtZW1haWwtZHluYW1pYyBqcy1maXJzdC1mb2N1c1wiIGF1dG9mb2N1cyBwbGFjZWhvbGRlcj1cIiR7IGh0bWwoJ2VtYWlsQWRkcmVzcycpIH1cIiB0aXRsZT1cIiR7IGh0bWwoJ2VtYWlsQWRkcmVzcycpIH1cIiBhcmlhLWxhYmVsPVwiJHsgaHRtbCgnZW1haWxBZGRyZXNzJykgfVwiIGFyaWEtbGFiZWxsZWRieT1cImhvbGQtbW9kYWwtbGFiZWxcIiByZXF1aXJlZCAvPlxuICAgICAgICA8L2xhYmVsPlxuICAgICAgICA8c21hbGwgY2xhc3M9XCJlcnJvclwiPiR7IGh0bWwoJ2VtYWlsUmVxdWlyZWRFcnJvcicpIH08L3NtYWxsPlxuXG4gICAgICAgIDxsYWJlbD5cbiAgICAgICAgICAgIDxpbnB1dCB0eXBlPVwiZW1haWxcIiBpZD1cImVtYWlsLWNvbmYtZHluYW1pYy0keyBpZCB9XCIgY2xhc3M9XCJwYXRyb24taG9sZC1lbWFpbC1jb25mLWR5bmFtaWMganMtZW1haWwtY29uZmlybVwiIHBsYWNlaG9sZGVyPVwiJHsgaHRtbCgnY29uZmlybUVtYWlsJykgfVwiIHRpdGxlPVwiJHsgaHRtbCgnY29uZmlybUVtYWlsJykgfVwiIGFyaWEtbGFiZWw9XCIkeyBodG1sKCdjb25maXJtRW1haWwnKSB9XCIgcmVxdWlyZWQgZGF0YS1lcXVhbHRvPVwiZW1haWwtZHluYW1pYy0keyBpZCB9XCIgLz5cbiAgICAgICAgPC9sYWJlbD5cbiAgICAgICAgPHNtYWxsIGNsYXNzPVwiZXJyb3JcIj4keyBodG1sKCdlbWFpbHNNdXN0TWF0Y2hFcnJvcicpIH08L3NtYWxsPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjbGVhclwiIC8+XG5cbiAgICA8ZGl2IGNsYXNzPVwiYnV0dG9uLWNvbnRhaW5lciBqcy1idXR0b25zXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwiVGl0bGVBY3Rpb25cIiAvPlxuICAgICAgICA8YnV0dG9uIHR5cGU9XCJidXR0b25cIiBjbGFzcz1cImJ1dHRvbiBjYW5jZWwgcmFkaXVzIG1hcmdpbi1zbWFsbCB1LWFsbENhcHMgb3V0bGluZSBncmF5IGpzLWNsb3NlXCI+JHsgaHRtbCgnY2FuY2VsJykgfTwvYnV0dG9uPlxuICAgIDwvZGl2PlxuICAgIDxkaXYgY2xhc3M9XCJjbGVhclwiIC8+XG48L2Zvcm0+YDtcbiIsImV4cG9ydCBkZWZhdWx0ICh7dGV4dCwgYXJpYUxhYmVsLCByZW1vdmVCdXR0b24sIGNhbmNlbEJ1dHRvbn0pID0+IGBcbiAgICAgICAgPHA+JHt0ZXh0fTwvcD5cbiAgICBcbiAgICAgICAgPGRpdiBjbGFzcz1cImJ1dHRvbi1jb250YWluZXJcIj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtcmVtb3ZlIGFyaWEtbGFiZWw9XCIke2FyaWFMYWJlbH1cIiBjbGFzcz1cImpzLXJlbW92ZS1oaXN0b3J5IGJ1dHRvbiBtYXJnaW4tc21hbGwgcmFkaXVzIHNlY29uZGFyeSBjb250cmFzdCB1LWFsbENhcHNcIj5cbiAgICAgICAgICAgICAgICA8c3Bhbj4ke3JlbW92ZUJ1dHRvbn08L3NwYW4+XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgIDxidXR0b24gdHlwZT1cImJ1dHRvblwiIGRhdGEtY2FuY2VsIGRhdGEtcmV2ZWFsLWlkPVwiaGlzdG9yeS1tb2RhbFwiIGNsYXNzPVwiYnV0dG9uIHJhZGl1cyBtYXJnaW4tc21hbGwgb3V0bGluZSBncmF5IGNhbmNlbCB1LWFsbENhcHMganMtY2FuY2VsXCIgdGFiaW5kZXg9XCIwXCI+JHtjYW5jZWxCdXR0b259PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuYDtcbiIsImV4cG9ydCBkZWZhdWx0ICh7IGdlb0lkY0NsYXNzIH0pID0+IGBcbjxkaXYgY2xhc3M9XCJ0aXRsZS1jb250ZW50cyBjYXJkIFRpdGxlQ2FyZCAke2dlb0lkY0NsYXNzfVwiPlxuICAgIDxkaXYgY2xhc3M9XCJUaXRsZUhlYWRlckJhclwiPjwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cIkNvdmVySW1hZ2VcIj48L2Rpdj5cblxuICAgIDxkaXYgY2xhc3M9XCJJbmZvUGFuZWxcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIlRpdGxlSW5mb1wiPjwvZGl2PlxuXG4gICAgICAgIDxkaXYgY2xhc3M9XCJUaXRsZUFjdGlvbiBpcy1ncmlkXCI+PC9kaXY+XG5cbiAgICAgICAgPGRpdiBjbGFzcz1cIlRpdGxlV2lzaGxpc3QgaXMtZ3JpZFwiPjwvZGl2PlxuICAgIDwvZGl2PlxuXG4gICAgPGRpdiBjbGFzcz1cImNsZWFyXCIgLz5cbjwvZGl2PmA7XG4iLCJleHBvcnQgZGVmYXVsdCAoe3R5cGVJZH0pID0+IGBcbiR7dHlwZUlkID8gYFxuICAgIDxzcGFuIGNsYXNzPVwidGl0bGUtZm9ybWF0LWJhZGdlIGNvbnRyYXN0IHUtYWxsQ2Fwc1wiPjxpIGNsYXNzPVwiaWNvbi0ke3R5cGVJZH1cIj48L2k+JHt3aW5kb3cuaHRtbCh0eXBlSWQpfTwvc3Bhbj5cbmAgOiAnJyB9XG5gO1xuIiwiZXhwb3J0IGRlZmF1bHQgKHsgdGl0bGVJZCwgdGl0bGUsIGhyZWYsIGFyaWFMYWJlbCB9KSA9PiBgPGgzIHRpdGxlPVwiJHsgdGl0bGUgfVwiIGNsYXNzPVwidGl0bGUtbmFtZVwiIGRhdGEtbWVkaWEtaWQ9XCIkeyB0aXRsZUlkIH1cIiB0YWJpbmRleD1cIi0xXCI+XG4gICAgPGEgdGFiaW5kZXg9XCIwXCIgaHJlZj1cIiR7IGhyZWYgfVwiIHJvbGU9XCJsaW5rXCIgYXJpYS1sYWJlbD1cIiR7IGFyaWFMYWJlbCB9XCI+XG4gICAgICAgICR7IHRpdGxlIH1cbiAgICA8L2E+XG48L2gzPmA7XG4iLCJleHBvcnQgZGVmYXVsdCAoe2dhLCBjb250cmFzdENsYXNzLCBhcmlhTGFiZWwsIGljb25DbGFzcywgdGV4dCwgaWNvbkFuaW1hdGlvbkNsYXNzZXN9KSA9PiBgXG48YnV0dG9uICR7Z2EgPyBgZGF0YS1nYS10cmFjaz1cIndpc2hsaXN0XCIgZGF0YS1nYS1tZWRpYUlEPVwiJHtnYS5tZWRpYUlkfVwiIGRhdGEtZ2EtdHlwZT0ke2dhLmZvcm1hdFR5cGV9YCA6ICcnfVxuY2xhc3M9XCJXaXNoTGlzdEJ1dHRvbiAke2NvbnRyYXN0Q2xhc3N9XCIgXG50eXBlPVwiYnV0dG9uXCIgXG5hcmlhLWxhYmVsPVwiJHthcmlhTGFiZWx9XCI+XG4gICAgPGkgY2xhc3M9XCIke2ljb25DbGFzc30gaWNvbiAke2ljb25BbmltYXRpb25DbGFzc2VzfVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPjwvaT5cbiAgICAke3RleHQgPyBgPHNwYW4gY2xhc3M9XCJ1LWFsbENhcHMgV2lzaExpc3RCdXR0b24tdGV4dFwiPiR7dGV4dH08L3NwYW4+YCA6ICcnfVxuPC9idXR0b24+YDtcbiIsImltcG9ydCB7IE1vZGFsIH0gZnJvbSAnLi4vLi4vY29tbW9uL21vZGFsJztcbmltcG9ydCBEb3dubG9hZFdhcm5pbmdUZW1wbGF0ZSBmcm9tICcuLi90ZW1wbGF0ZXMvRG93bmxvYWRXYXJuaW5nTW9kYWwuaHRtbCc7XG5cbmxldCBmZWF0dXJlTWFuYWdlciA9IHdpbmRvdy5mZWF0dXJlTWFuYWdlcjtcblxuY29uc3QgeyBfbG9jYWxlLCBzdXBwb3J0QXJ0aWNsZXMgfSA9IHdpbmRvdy5PdmVyRHJpdmU7XG5jb25zdCB7IENvb2tpZXMgfSA9IHdpbmRvdztcblxuY29uc3QgaXNJcGFkSW5BcHAgPSAhIShcbiAgICBmZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ3N0b3AtdHJlYXRpbmctaXBhZC1saWtlLW1hYycpICYmXG4gICAgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0FwcCBTdG9yZSBPdmVyRHJpdmUgTWVkaWEgQ29uc29sZS8pXG4pO1xuY29uc3QgaXNNYWMgPSAhIShcbiAgICB3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaCgvTWFjLykgJiZcbiAgICAhYm93c2VyLmlvcyAmJlxuICAgICFpc0lwYWRJbkFwcFxuKTtcbmNvbnN0IGlzV2luZG93cyA9XG4gICAgISEod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1dpbi8pICYmICFib3dzZXIud2luZG93c3Bob25lKSAmJlxuICAgICF3aW5kb3cuT3ZlckRyaXZlLmlzVG9saW5vRGV2aWNlO1xuY29uc3QgaXNXaW5kb3dzOEFuZFVwID0gISF3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaChcbiAgICAvKFdpbmRvd3MgMTAuMHxXaW5kb3dzIE5UIDEwLjB8V2luZG93cyA4LjF8V2luZG93cyBOVCA2LjN8V2luZG93cyA4fFdpbmRvd3MgTlQgNi4yKS9cbik7XG5jb25zdCBpbkFwcCA9IENvb2tpZXMuZ2V0KCdvbWNicm93c2UnKSAhPT0gdW5kZWZpbmVkO1xuY29uc3QgaXNXaW5kb3dzUGhvbmUxMEFuZFVwID0gISEoXG4gICAgYm93c2VyLndpbmRvd3NwaG9uZSAmJiBwYXJzZUludChib3dzZXIub3N2ZXJzaW9uLCAxMCkgPj0gMTAuMFxuKTtcbmNvbnN0IGlzV2luZG93c1Bob25lOCA9ICEhKFxuICAgIGJvd3Nlci53aW5kb3dzcGhvbmUgJiYgcGFyc2VJbnQoYm93c2VyLm9zdmVyc2lvbiwgMTApIDwgMTAuMFxuKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRG93bmxvYWRXYXJuaW5nTW9kYWwgZXh0ZW5kcyBCYWNrYm9uZS5WaWV3IHtcbiAgICBpbml0aWFsaXplKGVsKSB7XG4gICAgICAgIGxldCBmb3JtYXQgPSBlbC5kYXRhKCdmb3JtYXQtaWQnKTtcbiAgICAgICAgbGV0IG1lZGlhSWQgPSBlbC5kYXRhKCdtZWRpYUlkJyk7XG5cbiAgICAgICAgbGV0IHdhcm5pbmcgPSB0aGlzLmdldFdhcm5pbmcoZm9ybWF0KTtcbiAgICAgICAgbGV0IGRvd25sb2FkVXJsID0gd2luZG93LnVybCh3aW5kb3cucm91dGVzLm1lZGlhRG93bmxvYWQsIHtcbiAgICAgICAgICAgIGZvcm1hdCxcbiAgICAgICAgICAgIG1lZGlhSWQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICh3YXJuaW5nICE9PSAnJyAmJiAhdGhpcy5pc1dhcm5pbmdDb29raWVTZXQod2FybmluZykpIHtcbiAgICAgICAgICAgIGxldCB2aWV3RGF0YSA9IHsgbWVzc2FnZTogdGhpcy53YXJuaW5nVGV4dCh3YXJuaW5nKSwgZG93bmxvYWRVcmwgfTtcblxuICAgICAgICAgICAgY29uc3QgY29udGVudCA9ICQoRG93bmxvYWRXYXJuaW5nVGVtcGxhdGUodmlld0RhdGEpKTtcblxuICAgICAgICAgICAgdGhpcy5tb2RhbCA9IG5ldyBNb2RhbCh7XG4gICAgICAgICAgICAgICAgdGl0bGU6IGh0bWwoJ2Rvd25sb2FkV2FybmluZ01vZGFsLmhlYWRpbmcnKSxcbiAgICAgICAgICAgICAgICBjb250ZW50OiBjb250ZW50LFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMubW9kYWwuc2hvdygpO1xuXG4gICAgICAgICAgICB0aGlzLm1vZGFsLiRlbC5maW5kKCcuY2FuY2VsJykub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMubW9kYWwuY2xvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5tb2RhbC4kZWwuZmluZCgnLmNvbmZpcm0nKS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRXYXJuaW5nQ29va2llKHdhcm5pbmcpO1xuICAgICAgICAgICAgICAgIHRoaXMubW9kYWwuY2xvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJ2Vib29rLW1lZGlhLWRvJykge1xuICAgICAgICAgICAgaWYgKGluQXBwKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBkb3dubG9hZFVybDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgd2luZG93Lm9wZW4oZG93bmxvYWRVcmwsICdfYmxhbmsnLCAnbm9yZWZlcnJlcicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gaWYgbm8gd2FybmluZyBuZWVkcyBkaXNwbGF5ZWQsIGRvd25sb2FkIHRpdGxlXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uaHJlZiA9IGRvd25sb2FkVXJsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgd2FybmluZ1RleHQod2FybmluZykge1xuICAgICAgICBzd2l0Y2ggKHdhcm5pbmcpIHtcbiAgICAgICAgICAgIGNhc2UgJ09EYXBwJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbCgnZG93bmxvYWRXYXJuaW5nTW9kYWwucmVxdWlyZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgIGxpbms6XG4gICAgICAgICAgICAgICAgICAgICAgICAnPGEgaHJlZj1cImh0dHA6Ly9hcHAub3ZlcmRyaXZlLmNvbS9cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub3JlZmVycmVyXCIgY2xhc3M9XCJtb2RhbC1saW5rXCIgYXJpYS1sYWJlbD1cIicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCgnb3ZlcmRyaXZlQXBwJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1wiIHJvbGU9XCJsaW5rXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sKCdvdmVyZHJpdmVBcHAnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPC9hPicsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjYXNlICdBREUnOlxuICAgICAgICAgICAgICAgIHJldHVybiBodG1sKCdkb3dubG9hZFdhcm5pbmdNb2RhbC5yZXF1aXJlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgbGluazpcbiAgICAgICAgICAgICAgICAgICAgICAgICc8YSBocmVmPVwiaHR0cDovL3d3dy5vdmVyZHJpdmUuY29tL3BhcnRuZXJzL3JlZGlyZWN0cy5hc3B4P3Byb2R1Y3Q9YWRvYmVkZVwiJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAnIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vcmVmZXJyZXJcIiBjbGFzcz1cIm1vZGFsLWxpbmtcIiBhcmlhLWxhYmVsPVwiQWRvYmUgRGlnaXRhbCBFZGl0aW9uc1wiIHJvbGU9XCJsaW5rXCI+QWRvYmUgRGlnaXRhbCBFZGl0aW9uczwvYT4nLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY2FzZSAnT0RhcHAtZXB1Yic6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGh0bWwoJ2Rvd25sb2FkV2FybmluZ01vZGFsLmVwdWJSZXF1aXJlZCcsIHtcbiAgICAgICAgICAgICAgICAgICAgbGluazpcbiAgICAgICAgICAgICAgICAgICAgICAgICc8YSBocmVmPVwiaHR0cDovL2FwcC5vdmVyZHJpdmUuY29tL1wiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vcmVmZXJyZXJcIiBjbGFzcz1cIm1vZGFsLWxpbmtcIiBhcmlhLWxhYmVsPVwiJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sKCdvdmVyZHJpdmVBcHAnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXCIgcm9sZT1cImxpbmtcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWwoJ292ZXJkcml2ZUFwcCcpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8L2E+JyxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNhc2UgJ3ZpZGVvJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbCgnZG93bmxvYWRXYXJuaW5nTW9kYWwueW91TWF5TmVlZE9kQXBwJywge1xuICAgICAgICAgICAgICAgICAgICBsaW5rOlxuICAgICAgICAgICAgICAgICAgICAgICAgJzxhIGhyZWY9XCJodHRwOi8vYXBwLm92ZXJkcml2ZS5jb20vXCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9yZWZlcnJlclwiIGNsYXNzPVwibW9kYWwtbGlua1wiIGFyaWEtbGFiZWw9XCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWwoJ292ZXJkcml2ZUFwcCcpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdcIiByb2xlPVwibGlua1wiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCgnb3ZlcmRyaXZlQXBwJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzwvYT4nLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY2FzZSAnbXNlZGdlJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbCgnZG93bmxvYWRXYXJuaW5nTW9kYWwubWF5V29ya09uRGlmZkJyb3dzZXInLCB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmsxOlxuICAgICAgICAgICAgICAgICAgICAgICAgJzxhIGhyZWY9XCJodHRwczovL3d3dy5taWNyb3NvZnQuY29tL2VuLXVzL2Rvd25sb2FkL2ludGVybmV0LWV4cGxvcmVyLmFzcHhcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub3JlZmVycmVyXCIgY2xhc3M9XCJtb2RhbC1saW5rXCIgYXJpYS1sYWJlbD1cIicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCgnZG93bmxvYWRXYXJuaW5nTW9kYWwuZG93bmxvYWRCcm93c2VyJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXI6ICdJbnRlcm5ldCBFeHBsb3JlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXCIgcm9sZT1cImxpbmtcIj5JbnRlcm5ldCBFeHBsb3JlcjwvYT4nLFxuICAgICAgICAgICAgICAgICAgICBsaW5rMjpcbiAgICAgICAgICAgICAgICAgICAgICAgICc8YSBocmVmPVwiaHR0cDovL3d3dy5nb29nbGUuY29tL2Nocm9tZS9cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub3JlZmVycmVyXCIgY2xhc3M9XCJtb2RhbC1saW5rXCIgYXJpYS1sYWJlbD1cIicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCgnZG93bmxvYWRXYXJuaW5nTW9kYWwuZG93bmxvYWRCcm93c2VyJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyb3dzZXI6ICdDaHJvbWUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1wiIHJvbGU9XCJsaW5rXCI+Q2hyb21lPC9hPicsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjYXNlICdPRHJlYWQnOlxuICAgICAgICAgICAgICAgIHJldHVybiBodG1sKCdkb3dubG9hZFdhcm5pbmdNb2RhbC5tZXNzYWdlRm9yT0RSZWFkJyk7XG4gICAgICAgICAgICBjYXNlICdMaWJieSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGh0bWwoJ2Rvd25sb2FkV2FybmluZ01vZGFsLmxpYmJ5UmVxdWlyZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgIGxpbms6XG4gICAgICAgICAgICAgICAgICAgICAgICAnPGEgaHJlZj0gXCJodHRwczovL21lZXQubGliYnlhcHAuY29tL1wiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vcmVmZXJyZXJcIiBjbGFzcz1cIm1vZGFsLWxpbmtcIiBhcmlhLWxhYmVsPVwiJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBodG1sKCdsaWJieS5saWJieUFwcCcpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdcIiByb2xlPVwibGlua1wiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCgnbGliYnkubGliYnlBcHAnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPC9hPicsXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjYXNlICdub3RTdXBwb3J0ZWQnOlxuICAgICAgICAgICAgICAgIHJldHVybiBodG1sKCdkb3dubG9hZFdhcm5pbmdNb2RhbC5ub3RTdXBwb3J0ZWQnLCB7XG4gICAgICAgICAgICAgICAgICAgIGxpbms6XG4gICAgICAgICAgICAgICAgICAgICAgICAnPGEgaHJlZj1cIicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnN1cHBvcnRVcmwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgX2xvY2FsZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0QXJ0aWNsZXMubm9XaW5kb3dzUGhvbmVTdXBwb3J0XG4gICAgICAgICAgICAgICAgICAgICAgICApICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub3JlZmVycmVyXCIgY2xhc3M9XCJtb2RhbC1saW5rXCIgYXJpYS1sYWJlbD1cIicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgaHRtbCgnbmFycmF0ZWRNb2RhbC5sZWFybk1vcmUnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXCIgcm9sZT1cImxpbmtcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGh0bWwoJ25hcnJhdGVkTW9kYWwubGVhcm5Nb3JlJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzwvYT4nLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0V2FybmluZyhmb3JtYXQpIHtcbiAgICAgICAgbGV0IHdhcm5pbmcgPSAnJztcbiAgICAgICAgaWYgKGZvcm1hdCA9PT0gJ2Vib29rLWVwdWItYWRvYmUnKSB7XG4gICAgICAgICAgICBpZiAoaXNNYWMpIHtcbiAgICAgICAgICAgICAgICB3YXJuaW5nID0gJ0FERSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGlzV2luZG93cyAmJiAhaW5BcHApIHtcbiAgICAgICAgICAgICAgICB3YXJuaW5nID0gJ0FERSc7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIChib3dzZXIuaW9zIHx8XG4gICAgICAgICAgICAgICAgICAgIChib3dzZXIuYW5kcm9pZCAmJiAhd2luZG93Lk92ZXJEcml2ZS5pc1RvbGlub0RldmljZSkpICYmXG4gICAgICAgICAgICAgICAgIWluQXBwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB3YXJuaW5nID0gJ09EYXBwJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNXaW5kb3dzUGhvbmUxMEFuZFVwICYmICFpbkFwcCkge1xuICAgICAgICAgICAgICAgIHdhcm5pbmcgPSAnTGliYnknO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1dpbmRvd3NQaG9uZTggJiYgIWluQXBwKSB7XG4gICAgICAgICAgICAgICAgd2FybmluZyA9ICdub3RTdXBwb3J0ZWQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgZm9ybWF0ID09PSAnZWJvb2stcGRmLWFkb2JlJyAmJlxuICAgICAgICAgICAgKGlzTWFjIHx8IChpc1dpbmRvd3MgJiYgIWluQXBwKSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB3YXJuaW5nID0gJ0FERSc7XG4gICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0ID09PSAnZWJvb2stZXB1Yi1vcGVuJykge1xuICAgICAgICAgICAgaWYgKGlzTWFjKSB7XG4gICAgICAgICAgICAgICAgd2FybmluZyA9ICdBREUnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1dpbmRvd3MgJiYgIWluQXBwKSB7XG4gICAgICAgICAgICAgICAgd2FybmluZyA9ICdBREUnO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAoYm93c2VyLmlvcyB8fFxuICAgICAgICAgICAgICAgICAgICAoYm93c2VyLmFuZHJvaWQgJiYgIXdpbmRvdy5PdmVyRHJpdmUuaXNUb2xpbm9EZXZpY2UpKSAmJlxuICAgICAgICAgICAgICAgICFpbkFwcFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgd2FybmluZyA9ICdPRGFwcC1lcHViJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNXaW5kb3dzUGhvbmUxMEFuZFVwICYmICFpbkFwcCkge1xuICAgICAgICAgICAgICAgIHdhcm5pbmcgPSAnTGliYnknO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1dpbmRvd3NQaG9uZTggJiYgIWluQXBwKSB7XG4gICAgICAgICAgICAgICAgd2FybmluZyA9ICdub3RTdXBwb3J0ZWQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgZm9ybWF0ID09PSAnYXVkaW9ib29rLW1wMycgJiZcbiAgICAgICAgICAgICEoZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdvZGFwcC1zdW5zZXQnKSAmJiAhaW5BcHApXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICgoYm93c2VyLmlvcyB8fCBib3dzZXIuYW5kcm9pZCkgJiYgIWluQXBwKSB8fFxuICAgICAgICAgICAgICAgIGlzTWFjIHx8XG4gICAgICAgICAgICAgICAgKGlzV2luZG93cyAmJiAhaW5BcHApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB3YXJuaW5nID0gJ09EYXBwJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNXaW5kb3dzUGhvbmUxMEFuZFVwICYmICFpbkFwcCkge1xuICAgICAgICAgICAgICAgIHdhcm5pbmcgPSAnTGliYnknO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChpc1dpbmRvd3NQaG9uZTggJiYgIWluQXBwKSB7XG4gICAgICAgICAgICAgICAgd2FybmluZyA9ICdub3RTdXBwb3J0ZWQnO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB3YXJuaW5nO1xuICAgIH1cblxuICAgIGlzV2FybmluZ0Nvb2tpZVNldCh3YXJuaW5nKSB7XG4gICAgICAgIGNvbnN0IGNvb2tpZSA9IENvb2tpZXMuZ2V0KCduby1kZXZpY2Utd2FybmluZycpO1xuICAgICAgICBpZiAoY29va2llID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBhcnIgPSBjb29raWUuc3BsaXQoJzsnKTtcbiAgICAgICAgICAgIHJldHVybiBhcnIuaW5kZXhPZih3YXJuaW5nKSA+IC0xO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0V2FybmluZ0Nvb2tpZSh3YXJuaW5nKSB7XG4gICAgICAgIGxldCBjb29raWUgPSBDb29raWVzLmdldCgnbm8tZGV2aWNlLXdhcm5pbmcnKTtcbiAgICAgICAgaWYgKGNvb2tpZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBDb29raWVzLnNldCgnbm8tZGV2aWNlLXdhcm5pbmcnLCB3YXJuaW5nICsgJzsnLCB7XG4gICAgICAgICAgICAgICAgcGF0aDogJy8nLFxuICAgICAgICAgICAgICAgIGV4cGlyZXM6IDM2NSxcbiAgICAgICAgICAgICAgICBvdmVyd3JpdGU6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIENvb2tpZXMuc2V0KCduby1kZXZpY2Utd2FybmluZycsIGNvb2tpZSArIHdhcm5pbmcgKyAnOycsIHtcbiAgICAgICAgICAgICAgICBwYXRoOiAnLycsXG4gICAgICAgICAgICAgICAgZXhwaXJlczogMzY1LFxuICAgICAgICAgICAgICAgIG92ZXJ3cml0ZTogdHJ1ZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiY29uc3QgQmFja2JvbmUgID0gd2luZG93LkJhY2tib25lO1xuXG5pbXBvcnQgeyBNb2RhbCB9IGZyb20gJy4uLy4uL2NvbW1vbi9tb2RhbCc7XG5pbXBvcnQgVGl0bGVBY3Rpb25CdXR0b24gZnJvbSAnLi4vVGl0bGVBY3Rpb25CdXR0b24nO1xuaW1wb3J0IEhvbGRDb25mbGljdFBhbmVsIGZyb20gJy4uL3RlbXBsYXRlcy9Ib2xkQ29uZmxpY3RQYW5lbC5odG1sJztcbmltcG9ydCBQb3BvdmVyICBmcm9tICAgJy4uLy4uLy4uL2NvbXBvbmVudHMvcG9wb3Zlci9wb3BvdmVyJztcblxuY29uc3QgSG9sZENvbmZsaWN0TW9kYWwgPSBCYWNrYm9uZS5WaWV3LmV4dGVuZCh7XG4gICAgaW5pdGlhbGl6ZShidXMsIHRpdGxlTW9kZWwsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmJ1cyA9IGJ1cztcblxuICAgICAgICBjb25zdCB2aWV3RGF0YSA9IHtcbiAgICAgICAgICAgIGhlYWRpbmc6IHdpbmRvdy5odG1sKCEhb3B0aW9ucy5pc0x1Y2t5RGF5ID8gJ25vd1VuYXZhaWxhYmxlTW9kYWwubHVja3lEYXlOb3RBdmFpbGFibGVIdG1sJyA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdub3dVbmF2YWlsYWJsZU1vZGFsLmlzTm90Q3VycmVudGx5QXZhaWxhYmxlSHRtbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtzcGFuOiBgPHNwYW4+JHt0aXRsZU1vZGVsLmdldCgndGl0bGUnKX08L3NwYW4+YH0pLFxuICAgICAgICAgICAgc3JjOiB0aXRsZU1vZGVsLmdldENvdmVyU3JjKDUxMCksXG4gICAgICAgICAgICBpc0x1Y2t5RGF5OiAhIW9wdGlvbnMuaXNMdWNreURheVxuICAgICAgICB9O1xuXG4gICAgICAgIGxldCBtb2RhbENvbnRlbnRzID0ge1xuICAgICAgICAgICAgYXV0b1Nob3c6IGZhbHNlLFxuICAgICAgICAgICAgdGl0bGU6IHdpbmRvdy5odG1sKCdub3dVbmF2YWlsYWJsZU1vZGFsLmhlYWRpbmcnKSxcbiAgICAgICAgICAgIGNsYXNzZXM6IFsnbm93LXVuYXZhaWxhYmxlLW1vZGFsJ10sXG4gICAgICAgICAgICBjb250ZW50OiBIb2xkQ29uZmxpY3RQYW5lbCh2aWV3RGF0YSksXG4gICAgICAgICAgICBpZDogJ25vdy11bmF2YWlsYWJsZS1tb2RhbCcsXG4gICAgICAgICAgICBsYWJlbGxlZEJ5OiAnbm93LXVuYXZhaWxhYmxlLW1vZGFsLXRpdGxlJ1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLm1vZGFsID0gbmV3IE1vZGFsKG1vZGFsQ29udGVudHMpO1xuXG4gICAgICAgIHRoaXMubW9kYWwuJCgnLmpzLWNhbmNlbCcpLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMubW9kYWwuY2xvc2UoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5saXN0ZW5Ubyh0aGlzLmJ1cywgJ3RpdGxlOmhvbGQ6ZmFpbCcsICgpID0+IHtcbiAgICAgICAgICAgdGhpcy5tb2RhbC5jbG9zZSAoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy50aXRsZUFjdGlvbkJ1dHRvbiA9IG5ldyBUaXRsZUFjdGlvbkJ1dHRvbih7IG1vZGVsOiB0aXRsZU1vZGVsLCB0eXBlOiAnYnV0dG9uJywgZWw6IHRoaXMubW9kYWwuJCgnLlRpdGxlQWN0aW9uJyksIHN0eWxlOiAnZmlsbCcgfSk7XG5cbiAgICAgICAgdGhpcy5tb2RhbC5zaG93KCk7XG5cbiAgICAgICAgaWYgKG9wdGlvbnMuaXNMdWNreURheSl7XG4gICAgICAgICAgICB0aGlzLmxkdG9vbHRpcCA9IG5ldyBQb3BvdmVyKHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6IHRoaXMubW9kYWwuJGVsLmZpbmQoJyNsdWNreURheVRvb2x0aXAnKSxcbiAgICAgICAgICAgICAgICBjb250ZW50czogYDxwPiR7aHRtbCgnbm9uSG9sZENvbmZsaWN0TW9kYWwubHVja3lEYXlJbmZvJyl9PC9wPmBcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gSG9sZENvbmZsaWN0TW9kYWw7XG4iLCJpbXBvcnQgeyBNb2RhbCB9IGZyb20gJy4uLy4uL2NvbW1vbi9tb2RhbCc7XG5pbXBvcnQgUGxhY2VIb2xkUGFuZWwgZnJvbSAnLi9QbGFjZUhvbGRQYW5lbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhvbGRNb2RhbCBleHRlbmRzIEJhY2tib25lLlZpZXcge1xuICAgIGNvbnN0cnVjdG9yKHsgYnVzLCB0aXRsZU1vZGVsLCBjb250ZXh0IH0pIHtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5idXMgPSBidXM7XG5cbiAgICAgICAgdGhpcy5wbGFjZUhvbGRQYW5lbCA9IG5ldyBQbGFjZUhvbGRQYW5lbCh7IGJ1cywgdGl0bGVNb2RlbCwgY29udGV4dCwgaXNSZXF1ZXN0QWdhaW46ICEhY29udGV4dC5pc1JlcXVlc3RBZ2FpbiB9KTtcblxuICAgICAgICB0aGlzLm1vZGFsID0gbmV3IE1vZGFsKHtcbiAgICAgICAgICAgIGF1dG9TaG93ICAgOiBmYWxzZSxcbiAgICAgICAgICAgIHRpdGxlICAgICAgOiB3aW5kb3cuaHRtbCgnZHluYW1pY0hvbGRNb2RhbC5wbGFjZUFIb2xkJyksXG4gICAgICAgICAgICBjbGFzc2VzICAgIDogWydzbWFsbCcsICdIb2xkTW9kYWwnXSxcbiAgICAgICAgICAgIGNvbnRlbnQgICAgOiB0aGlzLnBsYWNlSG9sZFBhbmVsLiRlbCxcbiAgICAgICAgICAgIGZpcnN0Rm9jdXMgOiB0aGlzLnBsYWNlSG9sZFBhbmVsLiRlbC5maW5kKCcuanMtZmlyc3QtZm9jdXMnKVxuICAgICAgICB9KTtcblxuICAgICAgICB0aGlzLm1vZGFsLnNob3coKTtcblxuICAgICAgICB0aGlzLmxpc3RlblRvKHRoaXMuYnVzLCAndGl0bGU6aG9sZDplbmQnLCAoKSA9PiB7IHRoaXMubW9kYWwuY2xvc2UoKTsgfSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IFRpdGxlQ2FyZCBmcm9tICcuLi9UaXRsZUNhcmQnO1xuaW1wb3J0IFRpdGxlQ29sbGVjdGlvbiBmcm9tICcuLi9tb2RlbHMvVGl0bGVDb2xsZWN0aW9uJztcbmltcG9ydCBUaXRsZUNvbGxlY3Rpb25WaWV3IGZyb20gJy4uL1RpdGxlQ29sbGVjdGlvblZpZXcnO1xuaW1wb3J0IEhvbGRJbmZvcm1hdGlvbiBmcm9tICcuLi8uLi9ob2xkSW5mb3JtYXRpb24vdmlld3MvSG9sZEluZm9ybWF0aW9uJztcbmltcG9ydCBDb250YWluZXJUZW1wbGF0ZSBmcm9tICcuLi90ZW1wbGF0ZXMvSG9sZFN1Y2Nlc3NUZW1wbGF0ZS5odG1sJztcbmltcG9ydCB7IE1vZGFsIH0gZnJvbSAnLi4vLi4vY29tbW9uL21vZGFsJztcblxuY29uc3QgeyBmZWF0dXJlTWFuYWdlciwgdGV4dCB9ID0gd2luZG93O1xuY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IGNvbnRhaW5lclRlbXBsYXRlSHRtbCA9IGZzLnJlYWRGaWxlU3luYyhcbiAgICBwYXRoLmpvaW4oX19kaXJuYW1lLCAnLi4vdGVtcGxhdGVzL0hvbGRTdWNjZXNzLmh0bWwnKSxcbiAgICAndXRmOCdcbik7XG5pbXBvcnQgcmVsYXRlZFRpdGxlc1RlbXBsYXRlIGZyb20gJy4uL3RlbXBsYXRlcy9Ib2xkU3VjY2Vzc1JlbGF0ZWRUaXRsZXMuaHRtbCc7XG5pbXBvcnQgTWFjbWlsbGFuTWVzc2FnZSBmcm9tICcuLi8uLi8uLi8uLi8uLi9saWIvdXRpbGl0eS9tYWNtaWxsYW5NZXNzYWdlJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSG9sZFN1Y2Nlc3NNb2RhbCBleHRlbmRzIEJhY2tib25lLlZpZXcge1xuICAgIHRvcExldmVsVGVtcGxhdGUgPSBmZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ2ZpeEh0bWxUYWdzSW5Db3B5JylcbiAgICAgICAgPyBDb250YWluZXJUZW1wbGF0ZVxuICAgICAgICA6IF8udGVtcGxhdGUoY29udGFpbmVyVGVtcGxhdGVIdG1sKTtcblxuICAgIGNvbnN0cnVjdG9yKHsgYnVzLCB0aXRsZU1vZGVsLCBlbWFpbCwgYXV0b0NoZWNrb3V0RW5hYmxlZCB9KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuYnVzID0gYnVzO1xuICAgICAgICB0aGlzLnRpdGxlTW9kZWwgPSB0aXRsZU1vZGVsO1xuICAgICAgICB0aGlzLmVtYWlsID0gZW1haWw7XG4gICAgICAgIHRoaXMuYXV0b0NoZWNrb3V0RW5hYmxlZCA9IGF1dG9DaGVja291dEVuYWJsZWQ7XG4gICAgICAgIHRoaXMuY29sbGVjdGlvbiA9IG5ldyBUaXRsZUNvbGxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5tYXR1cml0eUxldmVsID0gdGl0bGVNb2RlbC5hdHRyaWJ1dGVzLnJhdGluZ3MubWF0dXJpdHlMZXZlbC5pZDtcblxuICAgICAgICB0aGlzLmNvbGxlY3Rpb24udXJsID0gYCR7d2luZG93LnVybChcbiAgICAgICAgICAgIHdpbmRvdy5yb3V0ZXMucmVzdC5tZWRpYS5hdmFpbGFibGVSZWxhdGVkLFxuICAgICAgICAgICAgeyBpZDogdGl0bGVNb2RlbC5pZCB9XG4gICAgICAgICl9P21heD00JHtcbiAgICAgICAgICAgIHRoaXMubWF0dXJpdHlMZXZlbCA/IGAmbWF0dXJpdHlMZXZlbD0ke3RoaXMubWF0dXJpdHlMZXZlbH1gIDogJydcbiAgICAgICAgfWA7XG4gICAgICAgIHRoaXMuY29sbGVjdGlvbi5wYXJzZSA9IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgbGV0IGNvbGxlY3Rpb25UaXRsZXMgPSByZXNwb25zZS50aXRsZXM7XG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgd2luZG93LmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnb25seS1zaG93LW93bmVkLWNvbnRlbnQnKSAmJlxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLnRpdGxlc1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgY29sbGVjdGlvblRpdGxlcyA9IHJlc3BvbnNlLnRpdGxlcy5maWx0ZXIoXG4gICAgICAgICAgICAgICAgICAgICh4KSA9PiB4LmlzT3duZWQgPT09IHRydWVcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIF8udmFsdWVzKGNvbGxlY3Rpb25UaXRsZXMpO1xuICAgICAgICB9O1xuICAgICAgICB0aGlzLm93bmVkQ29waWVzID0gdGhpcy50aXRsZU1vZGVsLmdldCgnb3duZWRDb3BpZXMnKSB8fCAwO1xuICAgICAgICB0aGlzLm1hY21pbGxhbk1lc3NhZ2UgPSBNYWNtaWxsYW5NZXNzYWdlKHRoaXMudGl0bGVNb2RlbCk7XG5cbiAgICAgICAgdGhpcy5yZW5kZXJDb250YWluZXIoKTtcbiAgICAgICAgdGhpcy4kdGl0bGVDb250YWluZXIgPSB0aGlzLiQoJy5yZWxhdGVkVGl0bGVzQ29udGFpbmVyJyk7XG5cbiAgICAgICAgY29uc3Qgd2F5cG9pbnQgPSBuZXcgd2luZG93LldheXBvaW50Lkludmlldyh7XG4gICAgICAgICAgICBlbGVtZW50OiB0aGlzLiR0aXRsZUNvbnRhaW5lcixcbiAgICAgICAgICAgIGVudGVyOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgd2F5cG9pbnQuZGVzdHJveSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2hSZWxhdGVkVGl0bGVzKCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBsZXQgbW9kYWxDb250ZW50cyA9IHtcbiAgICAgICAgICAgIGF1dG9TaG93OiBmYWxzZSxcbiAgICAgICAgICAgIHRpdGxlOiBodG1sKCdnZW5lcmljU3VjY2VzcycpLFxuICAgICAgICAgICAgY2xhc3NlczogWydsYXJnZSwgSG9sZFN1Y2Nlc3NNb2RhbCddLFxuICAgICAgICAgICAgY29udGVudDogdGhpcy4kZWwsXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5tb2RhbCA9IG5ldyBNb2RhbChtb2RhbENvbnRlbnRzKTtcbiAgICAgICAgdGhpcy5tb2RhbC5zaG93KCk7XG4gICAgfVxuXG4gICAgZmV0Y2hSZWxhdGVkVGl0bGVzKCkge1xuICAgICAgICB0aGlzLmNvbGxlY3Rpb25cbiAgICAgICAgICAgIC5mZXRjaCgpXG4gICAgICAgICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKF8ocmVzLnRpdGxlcykuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLmVtcHR5KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJSZWxhdGVkVGl0bGVzKCk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZhaWwoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLmVtcHR5KCk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRIb2xkSW5mb0h0bWwoKSB7XG4gICAgICAgIGlmIChmZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ0xIVE5HLTI4NjMnKSkge1xuICAgICAgICAgICAgbGV0IG5vdGUgPSBudWxsO1xuICAgICAgICAgICAgbGV0IGlzRXhwaXJlZCA9IGZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnZG9udC1tYXJrLXN1LWFzLWV4cGlyZWQnKVxuICAgICAgICAgICAgICAgID8gdGhpcy50aXRsZU1vZGVsLmlzRXhwaXJlZFxuICAgICAgICAgICAgICAgIDogdGhpcy50aXRsZU1vZGVsLmdldCgnaXNPd25lZCcpICYmXG4gICAgICAgICAgICAgICAgICAhdGhpcy50aXRsZU1vZGVsLmdldCgnb3duZWRDb3BpZXMnKTtcblxuICAgICAgICAgICAgaWYgKGlzRXhwaXJlZCkge1xuICAgICAgICAgICAgICAgIG5vdGUgPSBgPHNwYW4+JHt0ZXh0KFxuICAgICAgICAgICAgICAgICAgICAnaG9sZHNSYXRpb0hlbHBNb2RhbC5ub0NvcGllc09uUGxhY2VIb2xkJ1xuICAgICAgICAgICAgICAgICl9PGEgY2xhc3M9XCJtYW5hZ2VIb2xkc0xpbmtcIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub3JlZmVycmVyXCIgaHJlZj1cIi9hY2NvdW50L2hvbGRzXCI+JHt0ZXh0KFxuICAgICAgICAgICAgICAgICAgICAnaG9sZFN1Y2Nlc3NNb2RhbC5tYW5hZ2VIb2xkcydcbiAgICAgICAgICAgICAgICApfTwvYT48L3NwYW4+YDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy50aXRsZU1vZGVsLmdldCgnaXNGYXN0bGFuZScpKSB7XG4gICAgICAgICAgICAgICAgbm90ZSA9IHRleHQoJ2V4cGVjdGVkV2FpdFRpbWUuYWR2YW50YWdlQ2F2ZWF0Jyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5PdmVyRHJpdmUuaXNWaXNpdG9yKSB7XG4gICAgICAgICAgICAgICAgbm90ZSA9IHRleHQoJ2V4cGVjdGVkV2FpdFRpbWUucmxhQ2F2ZWF0Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBgPHAgY2xhc3M9XCJob2xkUG9zaXRpb25cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwidGV4dExhYmVsXCI+JHt0ZXh0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdleHBlY3RlZFdhaXRUaW1lLmhvbGRQb3NpdGlvbkxhYmVsJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKX08L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgICAgICA8c3Bhbj4ke3RleHQoJ2FjY291bnRIb2xkcy5ob2xkTGlzdFBvc2l0aW9uJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhvbGRMaXN0UG9zaXRpb246XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMudGl0bGVNb2RlbC5nZXQoJ2hvbGRMaXN0UG9zaXRpb24nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBvd25lZENvcGllczogdGhpcy50aXRsZU1vZGVsLmdldCgnb3duZWRDb3BpZXMnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pfTwvc3Bhbj5cbiAgICAgICAgICAgICAgICAgICAgPC9wPlxuICAgICAgICAgICAgICAgICAgICAke1xuICAgICAgICAgICAgICAgICAgICAgICAgbm90ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYDxwIGNsYXNzPVwibm90ZVwiPjxzcGFuIGNsYXNzPVwidGV4dExhYmVsXCI+JHt0ZXh0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdub3RlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKX08L3NwYW4+PHNwYW4+JHtub3RlfTwvc3Bhbj48L3A+YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJydcbiAgICAgICAgICAgICAgICAgICAgfWA7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsZXQgaW5mbyA9IG5ldyBIb2xkSW5mb3JtYXRpb24oe1xuICAgICAgICAgICAgICAgIG1vZGVsOiB0aGlzLnRpdGxlTW9kZWwsXG4gICAgICAgICAgICAgICAgdHlwZTogJ3N1Y2Nlc3NQb3NpdGlvbicsXG4gICAgICAgICAgICB9KS5yZW5kZXIoKTtcbiAgICAgICAgICAgIHJldHVybiBpbmZvLiRlbC5odG1sKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW5kZXJSZWxhdGVkVGl0bGVzKCkge1xuICAgICAgICB0aGlzLiR0aXRsZUNvbnRhaW5lci5lbXB0eSgpO1xuXG4gICAgICAgIGNvbnN0IHNlZU1vcmVMaW5rID0gYCR7d2luZG93LnVybCh3aW5kb3cucm91dGVzLm1lZGlhUmVsYXRlZElkLCB7XG4gICAgICAgICAgICBpZDogdGhpcy50aXRsZU1vZGVsLmF0dHJpYnV0ZXMuaWQsXG4gICAgICAgIH0pfSR7dGhpcy5tYXR1cml0eUxldmVsID8gYD9tYXR1cml0eUxldmVsPSR7dGhpcy5tYXR1cml0eUxldmVsfWAgOiAnJ31gO1xuXG4gICAgICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLmFwcGVuZChyZWxhdGVkVGl0bGVzVGVtcGxhdGUoeyBzZWVNb3JlTGluayB9KSk7XG5cbiAgICAgICAgdGhpcy50aXRsZUNvbGxlY3Rpb25WaWV3ID0gbmV3IFRpdGxlQ29sbGVjdGlvblZpZXcoe1xuICAgICAgICAgICAgZWw6IHRoaXMuJHRpdGxlQ29udGFpbmVyLmZpbmQoJy5yZWxhdGVkVGl0bGVzJyksXG4gICAgICAgICAgICBidXM6IHRoaXMuYnVzLFxuICAgICAgICAgICAgVmlldzogVGl0bGVDYXJkLFxuICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICAgIGNsYXNzOiAndGl0bGVDb250YWluZXIgc21hbGwtYmxvY2stZ3JpZC0yIG1lZGl1bS1ibG9jay1ncmlkLTQgbGFyZ2UtYmxvY2stZ3JpZC00JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLmNvbGxlY3Rpb24sXG4gICAgICAgICAgICBjb3ZlcldpZHRoczogeyBtb2JpbGU6IDE1MCwgdGFibGV0OiAxODUsIGRlc2t0b3A6IDIyMCB9LFxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZW5kZXJDb250YWluZXIoKSB7XG4gICAgICAgIGxldCBzZWFyY2hCeUNyZWF0b3JVcmwgPSB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMuc2VhcmNoQnlUeXBlLCB7XG4gICAgICAgICAgICB0eXBlOiAnY3JlYXRvcklkJyxcbiAgICAgICAgICAgIHF1ZXJ5OiB0aGlzLnRpdGxlTW9kZWwuZ2V0KCdmaXJzdENyZWF0b3JJZCcpLFxuICAgICAgICAgICAgc29ydEJ5OiAnbmV3bHlhZGRlZCcsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMuJGVsLmFwcGVuZChcbiAgICAgICAgICAgIHRoaXMudG9wTGV2ZWxUZW1wbGF0ZSh7XG4gICAgICAgICAgICAgICAgc3VjY2Vzc01lc3NhZ2VUZXh0S2V5OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmF1dG9DaGVja291dEVuYWJsZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgIWZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnaG9sZFJlZGVsaXZlcnknKVxuICAgICAgICAgICAgICAgICAgICAgICAgPyAndG9hc3RzLmhvbGRTdWNjZXNzQXV0b0NoZWNrb3V0SHRtbCdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJ3RvYXN0cy5ob2xkU3VjY2Vzc0h0bWwnLFxuICAgICAgICAgICAgICAgIG1hbmFnZUhvbGRzVXJsOiB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMuYWNjb3VudEhvbGRzKSxcbiAgICAgICAgICAgICAgICBlbWFpbDogdGhpcy5lbWFpbCxcbiAgICAgICAgICAgICAgICB0aXRsZU1vZGVsOiB0aGlzLnRpdGxlTW9kZWwuYXR0cmlidXRlcyxcbiAgICAgICAgICAgICAgICBjcmVhdG9yU2VhcmNoVXJsOiBzZWFyY2hCeUNyZWF0b3JVcmwsXG4gICAgICAgICAgICAgICAgaG9sZHNJbmZvOiB0aGlzLmdldEhvbGRJbmZvSHRtbCgpLFxuICAgICAgICAgICAgICAgIG93bmVkQ29waWVzOiB0aGlzLm93bmVkQ29waWVzLFxuICAgICAgICAgICAgICAgIG1hY21pbGxhbk1lc3NhZ2U6IHRoaXMubWFjbWlsbGFuTWVzc2FnZSxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgfVxufVxuIiwiY29uc3QgQmFja2JvbmUgID0gd2luZG93LkJhY2tib25lO1xuXG5pbXBvcnQgQ29uZmlybURpYWxvZyBmcm9tICcuLi8uLi9jb21tb24vY29uZmlybURpYWxvZyc7XG5pbXBvcnQgeyB0b1N0YXRpY1VybCB9IGZyb20gJy4uLy4uLy4uLy4uLy4uL2xpYi9hc3NldE1hcHBlcic7XG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBOb29rRXVsYVRlbXBsYXRlID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi90ZW1wbGF0ZXMvTm9va0V1bGEuaHRtbCcpLCAndXRmOCcpO1xuXG5jb25zdCBOb29rRXVsYU1vZGFsID0gQmFja2JvbmUuVmlldy5leHRlbmQoe1xuICAgIHRlbXBsYXRlOiBfLnRlbXBsYXRlKE5vb2tFdWxhVGVtcGxhdGUpLFxuXG4gICAgaW5pdGlhbGl6ZShidXMsIHRpdGxlTW9kZWwpIHtcbiAgICAgICAgdGhpcy5idXMgPSBidXM7XG5cbiAgICAgICAgY29uc3Qgdmlld0RhdGEgPSB7XG4gICAgICAgICAgICBibkxvZ29Vcmw6IHRvU3RhdGljVXJsKCdpbWcvYm4tbG9nby5qcGcnKSxcbiAgICAgICAgICAgIGh0bWw6IHdpbmRvdy5odG1sLFxuICAgICAgICAgICAgdGV4dDogd2luZG93LnRleHRcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLiRlbC5odG1sKHRoaXMudGVtcGxhdGUodmlld0RhdGEpKTtcblxuICAgICAgICBsZXQgbW9kYWxDb250ZW50cyA9IHtcbiAgICAgICAgICAgIGF1dG9TaG93OiBmYWxzZSxcbiAgICAgICAgICAgIHN1Ym1pdFRleHQ6IHdpbmRvdy5odG1sKCdub29rRVVMQU1vZGFsLmFjY2VwdFRvQ29udGludWUnKSxcbiAgICAgICAgICAgIHRpdGxlOiB3aW5kb3cuaHRtbCgnc2VuZFRvTm9vaycpLFxuICAgICAgICAgICAgY2xhc3NlczogWydzbWFsbCcsICdOb29rRXVsYU1vZGFsJ10sXG4gICAgICAgICAgICBjb250ZW50OiB0aGlzLiRlbFxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMubW9kYWwgPSBuZXcgQ29uZmlybURpYWxvZyhtb2RhbENvbnRlbnRzKTtcblxuICAgICAgICB0aGlzLm1vZGFsLnNob3coKTtcblxuICAgICAgICB0aGlzLm1vZGFsLm9uKCdzdWJtaXQnLCAoKSA9PiB0aGlzLmJ1cy50cmlnZ2VyKCd0aXRsZTpub29rOmV1bGEtYWNjZXB0ZWQnLCB7IHRpdGxlOiB0aXRsZU1vZGVsIH0pKTtcblxuICAgICAgICB0aGlzLmxpc3RlblRvKHRoaXMuYnVzLCAndGl0bGU6bm9vazplbmQnLCAoKSA9PiB7IHRoaXMubW9kYWwuY2xvc2UoKTsgfSk7XG4gICAgfVxufSk7XG5cbm1vZHVsZS5leHBvcnRzID0gTm9va0V1bGFNb2RhbDtcbiIsImltcG9ydCBUaXRsZUFjdGlvbkJ1dHRvbiAgICAgICAgZnJvbSAnLi4vVGl0bGVBY3Rpb25CdXR0b24nO1xuaW1wb3J0IFBsYWNlSG9sZFBhbmVsVGVtcGxhdGUgICBmcm9tICcuLi90ZW1wbGF0ZXMvUGxhY2VIb2xkUGFuZWwuaHRtbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFBsYWNlSG9sZFBhbmVsIGV4dGVuZHMgQmFja2JvbmUuVmlldyB7XG4gICAgdGVtcGxhdGUgPSBQbGFjZUhvbGRQYW5lbFRlbXBsYXRlXG5cbiAgICBjb25zdHJ1Y3Rvcih7IGJ1cywgdGl0bGVNb2RlbCwgY29udGV4dCwgaXNSZXF1ZXN0QWdhaW4gPSBmYWxzZSB9KSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG5cbiAgICAgICAgdGhpcy50aXRsZU1vZGVsID0gdGl0bGVNb2RlbDtcbiAgICAgICAgdGhpcy5jb250ZXh0ICAgID0gY29udGV4dDtcbiAgICAgICAgdGhpcy5idXMgICAgICAgID0gYnVzO1xuICAgICAgICB0aGlzLmNhcmQgICAgICAgPSB3aW5kb3cuY2FyZDtcbiAgICAgICAgdGhpcy5pc1JlcXVlc3RBZ2FpbiA9IGlzUmVxdWVzdEFnYWluO1xuXG4gICAgICAgIHRoaXMuY2FyZC5fZmV0Y2gudGhlbigoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICAgICAgdGhpcy5fYmluZEV2ZW50cygpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGNvbnN0IHZpZXdEYXRhID0ge1xuICAgICAgICAgICAgdGl0bGUgICAgICAgICAgICAgOiB0aGlzLnRpdGxlTW9kZWwuZ2V0KCd0aXRsZScpLFxuICAgICAgICAgICAgdHlwZSAgICAgICAgICAgICAgOiB0aGlzLnRpdGxlTW9kZWwuZ2V0KCd0eXBlJyksXG4gICAgICAgICAgICBjb3ZlclNyYyAgICAgICAgICA6IHRoaXMudGl0bGVNb2RlbC5nZXRDb3ZlclNyYyg1MTApLFxuICAgICAgICAgICAgaWQgICAgICAgICAgICAgICAgOiB0aGlzLnRpdGxlTW9kZWwuaWQsXG4gICAgICAgICAgICBpc1ByZVJlbGVhc2VUaXRsZSA6IHRoaXMudGl0bGVNb2RlbC5nZXQoJ2lzUHJlUmVsZWFzZVRpdGxlJyksXG4gICAgICAgICAgICBwcmVyZWxlYXNlRGF0ZSAgICA6IHRoaXMudGl0bGVNb2RlbC5nZXQoJ2VzdGltYXRlZFJlbGVhc2VEYXRlJyksXG4gICAgICAgICAgICBvd25lZENvcGllcyAgICAgICA6IHRoaXMudGl0bGVNb2RlbC5nZXQoJ293bmVkQ29waWVzJyksXG4gICAgICAgICAgICAvL1Nob3VsZCBmaXggdGhlIGlzc3VlIHdpdGggdGhlIGFwb3N0cm9waGUncyBub3QgcHJvcGVybHkgZW5jb2RpbmcuIFxuICAgICAgICAgICAgbGlicmFyeU5hbWUgICAgICAgOiBTdHJpbmcod2luZG93Lk92ZXJEcml2ZS5saWJyYXJ5TmFtZSkucmVwbGFjZSgnJiMzOTsnLCAnXFwnJyksXG4gICAgICAgICAgICBodG1sICAgICAgICAgICAgICA6IHdpbmRvdy5odG1sLFxuICAgICAgICAgICAgdGV4dCAgICAgICAgICAgICAgOiB3aW5kb3cudGV4dCxcbiAgICAgICAgICAgIGlzUmVxdWVzdEFnYWluICAgIDogdGhpcy5pc1JlcXVlc3RBZ2FpblxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuJGVsLmh0bWwodGhpcy50ZW1wbGF0ZSh2aWV3RGF0YSkpO1xuXG4gICAgICAgIHRoaXMuJGZvcm0gPSB0aGlzLiRlbC5maW5kKCdmb3JtJyk7XG5cbiAgICAgICAgaWYgKHRoaXMudGl0bGVNb2RlbC5pc0x1Y2t5RGF5Q2hlY2tvdXQpIHtcbiAgICAgICAgICAgIHRoaXMudGl0bGVNb2RlbC5zZXQoJ3RpdGxlU3RhdGUnLCAnaG9sZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50aXRsZUFjdGlvbkJ1dHRvbiA9IG5ldyBUaXRsZUFjdGlvbkJ1dHRvbih7XG4gICAgICAgICAgICBtb2RlbCAgIDogdGhpcy50aXRsZU1vZGVsLFxuICAgICAgICAgICAgdHlwZSAgICA6ICdidXR0b24nLFxuICAgICAgICAgICAgZWwgICAgICA6IHRoaXMuJGZvcm0uZmluZCgnLlRpdGxlQWN0aW9uJyksXG4gICAgICAgICAgICBhY3Rpb24gIDogKCkgPT4gdGhpcy4kZm9ybS5zdWJtaXQoKVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBfYmluZEV2ZW50cygpIHtcbiAgICAgICAgdGhpcy4kZm9ybVxuICAgICAgICAgICAgLmZvdW5kYXRpb24oJ2FiaWRlJywgJ3JlZmxvdycpXG4gICAgICAgICAgICAub24oJ3ZhbGlkLmZuZHRuLmFiaWRlJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuY2FyZC5zZXRIb2xkRW1haWwodGhpcy4kZWwuZmluZCgnaW5wdXRbdHlwZT1cImVtYWlsXCJdOmZpcnN0JykudmFsKCkudHJpbSgpKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1cy50cmlnZ2VyKCd0aXRsZTpob2xkJywgdGhpcy50aXRsZU1vZGVsLCB0aGlzLmNvbnRleHQpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgTW9kYWwgfSBmcm9tICcuLi8uLi9jb21tb24vbW9kYWwnO1xuaW1wb3J0IFJlbW92ZUhpc3RvcnlNb2RhbFRlbXBsYXRlIGZyb20gJy4uL3RlbXBsYXRlcy9SZW1vdmVIaXN0b3J5Lmh0bWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZW1vdmVIaXN0b3J5TW9kYWwgZXh0ZW5kcyBCYWNrYm9uZS5WaWV3IHtcbiAgICBpbml0aWFsaXplKHtidXMsIHRpdGxlLCBhY3Rpb259KSB7XG4gICAgICAgIHRoaXMuYnVzICAgICAgICA9IGJ1cztcbiAgICAgICAgdGhpcy5hY3Rpb24gICAgID0gYWN0aW9uIHx8ICgoKSA9PiB7fSk7XG5cbiAgICAgICAgY29uc3Qgdmlld0RhdGEgID0ge1xuICAgICAgICAgICAgdGV4dCAgICAgICAgICAgIDogd2luZG93Lmh0bWwoJ3JlYWRpbmdIaXN0b3J5LnJlbW92ZVdhcm5pbmcnKSxcbiAgICAgICAgICAgIGFyaWFMYWJlbCAgICAgICA6IHdpbmRvdy5odG1sKCdyZWFkaW5nSGlzdG9yeS5yZW1vdmVUaXRsZScsIHsgdGl0bGU6IHRpdGxlLmF0dHJpYnV0ZXMudGl0bGUgfSksXG4gICAgICAgICAgICByZW1vdmVCdXR0b24gICAgOiB3aW5kb3cuaHRtbCgncmVhZGluZ0hpc3RvcnkucmVtb3ZlJyksXG4gICAgICAgICAgICBjYW5jZWxCdXR0b24gICAgOiB3aW5kb3cuaHRtbCgnY2FuY2VsJylcbiAgICAgICAgfTtcblxuICAgICAgICBjb25zdCBjb250ZW50ID0gJChSZW1vdmVIaXN0b3J5TW9kYWxUZW1wbGF0ZSh2aWV3RGF0YSkpO1xuXG4gICAgICAgIGxldCBtb2RhbENvbnRlbnRzID0ge1xuICAgICAgICAgICAgYXV0b1Nob3c6IGZhbHNlLFxuICAgICAgICAgICAgdGl0bGU6IHdpbmRvdy5odG1sKCdyZWFkaW5nSGlzdG9yeS5yZW1vdmUnKSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGNvbnRlbnQsXG4gICAgICAgICAgICBpZDogJ3JlbW92ZUhpc3RvcnlNb2RhbCdcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLm1vZGFsID0gbmV3IE1vZGFsKG1vZGFsQ29udGVudHMpO1xuXG4gICAgICAgIHRoaXMubW9kYWwuJGVsLmZpbmQoJy5qcy1jYW5jZWwnKS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLm1vZGFsLmNsb3NlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubW9kYWwuJGVsLmZpbmQoJy5qcy1yZW1vdmUtaGlzdG9yeScpLm9uKCdjbGljaycsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYWN0aW9uKCk7XG4gICAgICAgICAgICB0aGlzLm1vZGFsLmNsb3NlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHRoaXMubW9kYWwuc2hvdygpO1xuICAgIH1cbn1cbiIsImltcG9ydCBDb250ZXh0TWVudSBmcm9tICcuLi9Db250ZXh0TWVudSc7XG5pbXBvcnQgVGl0bGVBdXRob3IgZnJvbSAnLi9UaXRsZUluZm8vVGl0bGVBdXRob3InO1xuaW1wb3J0IFRpdGxlRWRpdGlvbiBmcm9tICcuL1RpdGxlSW5mby9UaXRsZUVkaXRpb24nO1xuaW1wb3J0IFRpdGxlTmFtZSBmcm9tICcuL1RpdGxlSW5mby9UaXRsZU5hbWUnO1xuaW1wb3J0IFRpdGxlRm9ybWF0QmFkZ2UgZnJvbSAnLi9UaXRsZUluZm8vVGl0bGVGb3JtYXRCYWRnZSc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpdGxlSW5mbyBleHRlbmRzIEJhY2tib25lLlZpZXcge1xuICAgIGdldCBjbGFzc05hbWUoKSB7XG4gICAgICAgIHJldHVybiAndGl0bGUtaW5mbyc7XG4gICAgfVxuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuX3ZpZXdzID0gW107XG5cbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG5cbiAgICBfcmVzZXQoKSB7XG4gICAgICAgIHRoaXMuX3ZpZXdzLmZvckVhY2goKHZpZXcpID0+IHZpZXcucmVtb3ZlKCkpO1xuICAgICAgICB0aGlzLl92aWV3cyA9IFtdO1xuICAgIH1cblxuICAgIHJlbW92ZSgpIHtcbiAgICAgICAgdGhpcy5fcmVzZXQoKTtcbiAgICAgICAgc3VwZXIucmVtb3ZlKCk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICB0aGlzLl9yZXNldCgpO1xuXG4gICAgICAgIHRoaXMuX3ZpZXdzLnB1c2goXG4gICAgICAgICAgICAodGhpcy50aXRsZU5hbWUgPSBuZXcgVGl0bGVOYW1lKHsgbW9kZWw6IHRoaXMubW9kZWwgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKCF3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdnZW8taWRjJykpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdzLnB1c2goXG4gICAgICAgICAgICAgICAgKHRoaXMuY29udGV4dE1lbnUgPSBuZXcgQ29udGV4dE1lbnUoeyBtb2RlbDogdGhpcy5tb2RlbCB9KSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHRNZW51LiRlbC5hZGRDbGFzcygndGV4dC1yaWdodCcpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLm1vZGVsLmlzTWFnYXppbmUpIHtcbiAgICAgICAgICAgIHRoaXMuX3ZpZXdzLnB1c2goXG4gICAgICAgICAgICAgICAgKHRoaXMudGl0bGVFZGl0aW9uID0gbmV3IFRpdGxlRWRpdGlvbih7IG1vZGVsOiB0aGlzLm1vZGVsIH0pKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfSBlbHNlIGlmICghd2luZG93LmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnZ2VvLWlkYycpKSB7XG4gICAgICAgICAgICB0aGlzLl92aWV3cy5wdXNoKFxuICAgICAgICAgICAgICAgICh0aGlzLnRpdGxlQXV0aG9yID0gbmV3IFRpdGxlQXV0aG9yKHsgbW9kZWw6IHRoaXMubW9kZWwgfSkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5fdmlld3MucHVzaChcbiAgICAgICAgICAgICh0aGlzLnRpdGxlRm9ybWF0QmFkZ2UgPSBuZXcgVGl0bGVGb3JtYXRCYWRnZSh7XG4gICAgICAgICAgICAgICAgdHlwZUlkOiB0aGlzLm1vZGVsLmdldCgndHlwZScpLmlkLFxuICAgICAgICAgICAgfSkpXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy4kZWwuZW1wdHkoKTtcbiAgICAgICAgdGhpcy4kZWwuYXBwZW5kKC4uLnRoaXMuX3ZpZXdzLm1hcCgodmlldykgPT4gdmlldy4kZWwpKTtcbiAgICB9XG59XG4iLCJjb25zdCBCYWNrYm9uZSAgPSB3aW5kb3cuQmFja2JvbmU7XG5jb25zdCBmZWF0dXJlTWFuYWdlciAgICAgICAgPSB3aW5kb3cuZmVhdHVyZU1hbmFnZXI7XG5cbmNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBUaXRsZUF1dGhvclRlbXBsYXRlID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcuLi8uLi90ZW1wbGF0ZXMvVGl0bGVBdXRob3IuaHRtbCcpLCAndXRmOCcpO1xuXG5jb25zdCBUaXRsZUF1dGhvciA9IEJhY2tib25lLlZpZXcuZXh0ZW5kKHtcbiAgICB0ZW1wbGF0ZTogXy50ZW1wbGF0ZShUaXRsZUF1dGhvclRlbXBsYXRlKSxcblxuICAgIGNsYXNzTmFtZTogJ3RpdGxlLWF1dGhvcicsXG5cbiAgICB0YWdOYW1lOiAncCcsXG5cbiAgICBpbml0aWFsaXplKCkge1xuICAgICAgICBpZiAodGhpcy5tb2RlbC5nZXQoJ3R5cGUnKS5pZCAhPT0gJ3BlcmlvZGljYWxzJykge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGxldCB0aXRsZSA9IHRoaXMubW9kZWwudG9KU09OKCk7XG5cbiAgICAgICAgaWYgKHRpdGxlLmZpcnN0Q3JlYXRvck5hbWUgIT0gbnVsbCAmJiAhXy5pc0VtcHR5KHRpdGxlLmZpcnN0Q3JlYXRvck5hbWUpKSB7XG4gICAgICAgICAgICBsZXQgY3JlYXRvck5hbWUgPSBmZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ2ZpeEh0bWxUYWdzSW5Db3B5JykgPyB0aXRsZS5maXJzdENyZWF0b3JOYW1lIDogXy5lc2NhcGUodGl0bGUuZmlyc3RDcmVhdG9yTmFtZSk7XG5cbiAgICAgICAgICAgIGNvbnN0IHZpZXdEYXRhID0ge1xuICAgICAgICAgICAgICAgIGhyZWYgICAgICAgIDogd2luZG93LnVybCh3aW5kb3cucm91dGVzLnNlYXJjaEJ5VHlwZSwgeyB0eXBlOiAnY3JlYXRvcklkJywgcXVlcnk6IHRpdGxlLmZpcnN0Q3JlYXRvcklkLCBzb3J0Qnk6ICduZXdseWFkZGVkJyB9KSxcbiAgICAgICAgICAgICAgICBsYWJlbCAgICAgICA6IHdpbmRvdy50ZXh0KCdjb3Zlci5zZWFyY2hCeUF1dGhvcicsIHsgYXV0aG9yOiBjcmVhdG9yTmFtZSB9KSxcbiAgICAgICAgICAgICAgICB0ZXh0ICAgICAgICA6IGNyZWF0b3JOYW1lXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICB0aGlzLiRlbC5odG1sKHdpbmRvdy50ZXh0KCdieUxpbmUnLCB7IGNyZWF0b3I6IHRoaXMudGVtcGxhdGUodmlld0RhdGEpIH0pKTtcbiAgICAgICAgfWVsc2V7XG4gICAgICAgICAgICBpZighZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCduby1hdXRob3ItZml4Jykpe1xuICAgICAgICAgICAgICAgIHRoaXMuJGVsLmh0bWwod2luZG93Lmh0bWwoJ2NvdmVyLm5vQXV0aG9yQXZhaWxhYmxlJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgVGl0bGVBdXRob3I7XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpdGxlRWRpdGlvbiBleHRlbmRzIEJhY2tib25lLlZpZXcge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgbGV0IG5vZGUgPSAkKGA8ZGl2IGNsYXNzPVwidGl0bGUtZWRpdGlvblwiPiR7dGhpcy5tb2RlbC5nZXQoJ2VkaXRpb24nKX08L2Rpdj5gKTtcbiAgICAgICAgdGhpcy5zZXRFbGVtZW50KG5vZGUpO1xuICAgIH1cbn1cbiIsImltcG9ydCBUaXRsZUZvcm1hdEJhZGdlVGVtcGxhdGUgZnJvbSAnLi4vLi4vdGVtcGxhdGVzL1RpdGxlRm9ybWF0QmFkZ2UuaHRtbCc7XG5cbmNvbnN0IFRpdGxlRm9ybWF0QmFkZ2UgPSBCYWNrYm9uZS5WaWV3LmV4dGVuZCh7XG4gICAgaW5pdGlhbGl6ZSh7dHlwZUlkfSkge1xuICAgICAgICB0aGlzLnR5cGVJZCA9IHR5cGVJZDtcbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9LFxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICB0aGlzLnNldEVsZW1lbnQoJChUaXRsZUZvcm1hdEJhZGdlVGVtcGxhdGUoe3R5cGVJZDogdGhpcy50eXBlSWR9KSkpO1xuICAgIH1cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBUaXRsZUZvcm1hdEJhZGdlO1xuIiwiaW1wb3J0IFRpdGxlTmFtZVRlbXBsYXRlIGZyb20gJy4uLy4uL3RlbXBsYXRlcy9UaXRsZU5hbWUuaHRtbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpdGxlTmFtZSBleHRlbmRzIEJhY2tib25lLlZpZXcge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuXG4gICAgICAgIHRoaXMudGVtcGxhdGUgPSBUaXRsZU5hbWVUZW1wbGF0ZTtcbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICB9XG5cbiAgICBfYXNzZW1ibGVMYWJlbCgpIHtcbiAgICAgICAgbGV0IGxhYmVsUGFydHMgPSBbXTtcblxuICAgICAgICBsYWJlbFBhcnRzLnB1c2godGhpcy5tb2RlbC5nZXQoJ3RpdGxlJykpO1xuXG4gICAgICAgIGlmICghIXRoaXMubW9kZWwuZ2V0KCdmaXJzdENyZWF0b3JOYW1lJykpIHtcbiAgICAgICAgICAgIGxhYmVsUGFydHMucHVzaCh3aW5kb3cuaHRtbCgnYnlMaW5lJywge2NyZWF0b3I6IHRoaXMubW9kZWwuaXNNYWdhemluZSA/IHRoaXMubW9kZWwuZ2V0KCdwdWJsaXNoZXInKS5uYW1lIDogdGhpcy5tb2RlbC5nZXQoJ2ZpcnN0Q3JlYXRvck5hbWUnKX0pKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxhYmVsUGFydHMucHVzaCh0aGlzLm1vZGVsLmF2YWlsYWJpbGl0eVRleHQoKSk7XG5cbiAgICAgICAgbGFiZWxQYXJ0cy5wdXNoKHRoaXMubW9kZWwuZ2V0KCd0eXBlJykubmFtZSk7XG5cbiAgICAgICAgcmV0dXJuIGxhYmVsUGFydHMuam9pbignICcpO1xuICAgIH1cblxuICAgIHJlbmRlcigpIHtcbiAgICAgICAgY29uc3Qgdmlld0RhdGEgPSB7XG4gICAgICAgICAgICB0aXRsZUlkICAgOiB0aGlzLm1vZGVsLmlkLFxuICAgICAgICAgICAgaHJlZiAgICAgIDogdGhpcy5tb2RlbC50aXRsZURldGFpbHNVcmwsXG4gICAgICAgICAgICBhcmlhTGFiZWwgOiBfLmVzY2FwZSh0aGlzLl9hc3NlbWJsZUxhYmVsKCkpLFxuICAgICAgICAgICAgdGl0bGUgICAgIDogdGhpcy5tb2RlbC5nZXQoJ3RpdGxlJylcbiAgICAgICAgfTtcbiAgICAgICAgXG4gICAgICAgIHRoaXMuc2V0RWxlbWVudCgkKHRoaXMudGVtcGxhdGUodmlld0RhdGEpKSk7XG4gICAgfVxufVxuXG4iLCJpbXBvcnQgQWNjb3VudE1lbnVNb2JpbGVWaWV3IGZyb20gJy4vdmlld3MvYWNjb3VudF9tZW51X21vYmlsZSc7XG5cbmNvbnN0IGNyZWF0ZUNvbXBvbmVudCA9ICh7ZWx9KSA9PiB7XG4gICAgY29uc3QgdmlldyA9IG5ldyBBY2NvdW50TWVudU1vYmlsZVZpZXcoe2VsfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tdW51c2VkLXZhcnNcbiAgICB3aW5kb3cuQWNjb3VudE1lbnVNb2JpbGVWaWV3ID0gdmlldztcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUNvbXBvbmVudDtcbiIsImltcG9ydCBCYXNlVmlldyBmcm9tICcuLi8uLi8uLi92aWV3cy9iYXNlJztcblxuY29uc3QgQWNjb3VudE1lbnVNb2JpbGVWaWV3ID0gQmFzZVZpZXcuZXh0ZW5kKHtcbiAgICBldmVudHM6IHtcbiAgICAgICAgJ2NsaWNrIC5qcy1hY2NvdW50LW1lbnUtbGluayc6ICd0b2dnbGVBY2NvdW50RHJvcGRvd24nXG4gICAgfSxcbiAgICBpbml0aWFsaXplKHtlbH0pIHtcbiAgICAgICAgdGhpcy5lbCA9IGVsO1xuICAgICAgICB0aGlzLiRhY2NvdW50TWVudUxpbmsgPSAkKCcuanMtYWNjb3VudC1tZW51LWxpbmsnKTtcbiAgICAgICAgdGhpcy4kYWNjb3VudE1lbnVDb250ZW50ID0gJCgnLmpzLWFjY291bnQtbWVudS1tb2JpbGUnKTtcbiAgICB9LFxuICAgIG9wZW4oKSB7XG4gICAgICAgICQoJy5pY29uLWFjY291bnQubW9iaWxlJykuYWRkQ2xhc3MoJ3NlY29uZGFyeS1jb2xvcicpO1xuICAgICAgICB0aGlzLiRhY2NvdW50TWVudUxpbmsuYWRkKHRoaXMuJGFjY291bnRNZW51Q29udGVudFswXSkuYWRkQ2xhc3MoJ2lzLW9wZW4nKTtcblxuICAgICAgICAvLyBDbG9zZSBhbGwgb3BlbiBmb3VuZGF0aW9uIGRyb3Bkb3ducy4gaG9wZWZ1bGx5IHdlIGNhbiBraWxsIHRoaXMgZXZlbnR1YWxseS5cbiAgICAgICAgJChkb2N1bWVudCkuZm91bmRhdGlvbignZHJvcGRvd24nLCAnY2xvc2UnLCAkKCdbZGF0YS1kcm9wZG93bi1jb250ZW50XScpKTtcbiAgICAgICAgaWYgKHRvYXN0ZXIpIHRvYXN0ZXIuX3N0aWNrVG9hc3QoKTtcbiAgICB9LFxuICAgIGNsb3NlKCkge1xuICAgICAgICAkKCcuaWNvbi1hY2NvdW50Lm1vYmlsZScpLnJlbW92ZUNsYXNzKCdzZWNvbmRhcnktY29sb3InKTtcbiAgICAgICAgdGhpcy4kYWNjb3VudE1lbnVMaW5rLmFkZCh0aGlzLiRhY2NvdW50TWVudUNvbnRlbnRbMF0pLnJlbW92ZUNsYXNzKCdpcy1vcGVuJyk7XG4gICAgICAgIGlmICh0b2FzdGVyKSB0b2FzdGVyLl9zdGlja1RvYXN0KCk7XG4gICAgfSxcbiAgICB0b2dnbGVBY2NvdW50RHJvcGRvd24oKSB7XG4gICAgICAgIGlmICh0aGlzLiRhY2NvdW50TWVudUxpbmsuaGFzQ2xhc3MoJ2lzLW9wZW4nKSkge1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5vcGVuKCk7XG4gICAgICAgIH1cbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQWNjb3VudE1lbnVNb2JpbGVWaWV3O1xuIiwiaW1wb3J0IHsgTW9kYWwgfSBmcm9tICcuLi9jb21tb24vbW9kYWwnO1xuaW1wb3J0IHRlbXBsYXRlIGZyb20gJy4vTm9uSG9sZENvbmxpY3RNb2RhbC5odG1sJztcbmltcG9ydCBUaXRsZUNhcmQgZnJvbSAnLi4vbWVkaWEvVGl0bGVDYXJkJztcbmltcG9ydCBUaXRsZUNvbGxlY3Rpb24gZnJvbSAnLi4vbWVkaWEvbW9kZWxzL1RpdGxlQ29sbGVjdGlvbic7XG5pbXBvcnQgVGl0bGVDb2xsZWN0aW9uVmlldyBmcm9tICcuLi9tZWRpYS9UaXRsZUNvbGxlY3Rpb25WaWV3JztcbmltcG9ydCByZWxhdGVkVGl0bGVzVGVtcGxhdGUgZnJvbSAnLi4vbWVkaWEvdGVtcGxhdGVzL0hvbGRTdWNjZXNzUmVsYXRlZFRpdGxlcy5odG1sJztcbmltcG9ydCBQb3BvdmVyIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvcG9wb3Zlci9wb3BvdmVyJztcblxuY29uc3QgeyBodG1sIH0gPSB3aW5kb3c7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5vbkhvbGRDb25mbGljdE1vZGFsIGV4dGVuZHMgTW9kYWwge1xuICAgIGNvbnN0cnVjdG9yKHRpdGxlTW9kZWwsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBjb25zdCBtZXNzYWdlID0gaHRtbChcbiAgICAgICAgICAgIG9wdGlvbnMuaXNMdWNreURheVxuICAgICAgICAgICAgICAgID8gJ25vbkhvbGRDb25mbGljdE1vZGFsLmx1Y2t5RGF5TWVzc2FnZUh0bWwnXG4gICAgICAgICAgICAgICAgOiAnbm9uSG9sZENvbmZsaWN0TW9kYWwubWVzc2FnZUh0bWwnLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRpdGxlOiBgPHNwYW4gc3R5bGU9XCJmb250LXdlaWdodDogYm9sZFwiPiR7dGl0bGVNb2RlbC5nZXQoXG4gICAgICAgICAgICAgICAgICAgICd0aXRsZSdcbiAgICAgICAgICAgICAgICApfTwvc3Bhbj5gLFxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuXG4gICAgICAgIGNvbnN0IG1vZGFsQ29udGVudHMgPSB7XG4gICAgICAgICAgICBjbGFzc2VzOiBbJ25vbkhvbGRDb25mbGljdE1vZGFsJ10sXG4gICAgICAgICAgICB0aXRsZTogaHRtbCgnbm9uSG9sZENvbmZsaWN0TW9kYWwuaGVhZGluZycpLFxuICAgICAgICAgICAgY29udGVudDogdGVtcGxhdGUoeyB0aXRsZU1vZGVsLCBvcHRpb25zLCBtZXNzYWdlIH0pLFxuICAgICAgICB9O1xuXG4gICAgICAgIHN1cGVyKG1vZGFsQ29udGVudHMpO1xuXG4gICAgICAgIHRoaXMuY29sbGVjdGlvbiA9IG5ldyBUaXRsZUNvbGxlY3Rpb24oKTtcbiAgICAgICAgdGhpcy5jb2xsZWN0aW9uLnVybCA9IGAke3dpbmRvdy51cmwoXG4gICAgICAgICAgICB3aW5kb3cucm91dGVzLnJlc3QubWVkaWEuYXZhaWxhYmxlUmVsYXRlZCxcbiAgICAgICAgICAgIHsgaWQ6IHRpdGxlTW9kZWwuaWQgfVxuICAgICAgICApfT9tYXg9NGA7XG4gICAgICAgIHRoaXMuY29sbGVjdGlvbi5wYXJzZSA9IChyZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIF8udmFsdWVzKHJlc3BvbnNlLnRpdGxlcyk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyID0gdGhpcy4kKCcucmVsYXRlZFRpdGxlc0NvbnRhaW5lcicpO1xuICAgICAgICB0aGlzLnRpdGxlTW9kZWwgPSB0aXRsZU1vZGVsO1xuICAgICAgICB0aGlzLmZldGNoUmVsYXRlZFRpdGxlcygpO1xuXG4gICAgICAgIGlmIChvcHRpb25zLmlzTHVja3lEYXkpIHtcbiAgICAgICAgICAgIHRoaXMubGR0b29sdGlwID0gbmV3IFBvcG92ZXIoe1xuICAgICAgICAgICAgICAgIHRhcmdldDogdGhpcy4kZWwuZmluZCgnI2x1Y2t5RGF5VG9vbHRpcCcpLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBgPHA+JHtodG1sKCdub25Ib2xkQ29uZmxpY3RNb2RhbC5sdWNreURheUluZm8nKX08L3A+YCxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZmV0Y2hSZWxhdGVkVGl0bGVzKCkge1xuICAgICAgICB0aGlzLmNvbGxlY3Rpb25cbiAgICAgICAgICAgIC5mZXRjaCgpXG4gICAgICAgICAgICAudGhlbigocmVzKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKF8ocmVzLnRpdGxlcykuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLmVtcHR5KCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlclJlbGF0ZWRUaXRsZXMoKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZmFpbCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy4kdGl0bGVDb250YWluZXIuZW1wdHkoKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJlbmRlclJlbGF0ZWRUaXRsZXMoKSB7XG4gICAgICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLmVtcHR5KCk7XG4gICAgICAgIHRoaXMuJHRpdGxlQ29udGFpbmVyLmFwcGVuZChcbiAgICAgICAgICAgIHJlbGF0ZWRUaXRsZXNUZW1wbGF0ZSh7IHRpdGxlTW9kZWw6IHRoaXMudGl0bGVNb2RlbC5hdHRyaWJ1dGVzIH0pXG4gICAgICAgICk7XG5cbiAgICAgICAgdGhpcy50aXRsZUNvbGxlY3Rpb25WaWV3ID0gbmV3IFRpdGxlQ29sbGVjdGlvblZpZXcoe1xuICAgICAgICAgICAgZWw6IHRoaXMuJHRpdGxlQ29udGFpbmVyLmZpbmQoJy5yZWxhdGVkVGl0bGVzJyksXG4gICAgICAgICAgICBidXM6IHRoaXMuYnVzLFxuICAgICAgICAgICAgVmlldzogVGl0bGVDYXJkLFxuICAgICAgICAgICAgYXR0cmlidXRlczoge1xuICAgICAgICAgICAgICAgIGNsYXNzOiAndGl0bGVDb250YWluZXIgc21hbGwtYmxvY2stZ3JpZC0yIG1lZGl1bS1ibG9jay1ncmlkLTQgbGFyZ2UtYmxvY2stZ3JpZC00JyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBjb2xsZWN0aW9uOiB0aGlzLmNvbGxlY3Rpb24sXG4gICAgICAgICAgICBjb3ZlcldpZHRoczogeyBtb2JpbGU6IDE1MCwgdGFibGV0OiAxODUsIGRlc2t0b3A6IDIyMCB9LFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCJleHBvcnQgZGVmYXVsdCh7dGl0bGVNb2RlbCwgb3B0aW9ucywgbWVzc2FnZX0pID0+IGBcbiAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZUNvbnRhaW5lclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibWVzc2FnZVwiPlxuICAgICAgICAgICAgJHttZXNzYWdlfVxuICAgICAgICAgICAgJHtvcHRpb25zLmlzTHVja3lEYXkgJiYgIXRpdGxlTW9kZWwuZ2V0KCdpc09uSG9sZCcpID9cbiAgICAgICAgICAgICAgICAgICAgYDxkaXYgc3R5bGU9XCJkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IHBvc2l0aW9uOiByZWxhdGl2ZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBzdHlsZT1cImRpc3BsYXk6IGlubGluZS1ibG9jazsgZmxvYXQ6IHJpZ2h0XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgcm9sZT1cImJ1dHRvblwiIGlkPVwibHVja3lEYXlUb29sdGlwXCIgY2xhc3M9XCJoZWxwLXRpcCBzZWNvbmRhcnktYmFja2dyb3VuZFwiIHN0eWxlPVwiZmxvYXQ6IHJpZ2h0XCI+PC9hPlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PmBcbiAgICAgICAgICAgICAgICA6ICcnIH1cbiAgICAgICAgICAgICR7dGl0bGVNb2RlbC5nZXQoJ2lzT25Ib2xkJykgPyBgXG4gICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJzdGlsbE9uSG9sZE1lc3NhZ2VcIj4ke3dpbmRvdy5odG1sKCdub25Ib2xkQ29uZmxpY3RNb2RhbC5zdGlsbE9uSG9sZCcsIHt0aXRsZTogdGl0bGVNb2RlbC50aXRsZX0pfTwvcD5cbiAgICAgICAgICAgIGAgOiAnJ31cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cInJlbGF0ZWRUaXRsZXNDb250YWluZXJcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cImxvYWRlclwiPjwvZGl2PlxuICAgIDwvZGl2PlxuYDtcbiIsImltcG9ydCBzdmdMb2FkZXIgZnJvbSAnLi4vLi4vdXRpbC9zdmdMb2FkZXInO1xuaW1wb3J0IE5vdGlmaWNhdGlvbkl0ZW0gZnJvbSAnLi9Ob3RpZmljYXRpb25zSXRlbSc7XG5pbXBvcnQga2V5cyBmcm9tICcuLi8uLi91dGlsL2tleWNvZGVzJztcbmNvbnN0IHsgdGV4dCwgdXJsIH0gPSB3aW5kb3c7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIE5vdGlmaWNhdGlvbkRyYXdlciBleHRlbmRzIEJhY2tib25lLlZpZXcge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuICAgICAgICB0aGlzLiR0cmlnZ2VyRWwgPSAkKCcuanMtbm90aWZpY2F0aW9uc0J1dHRvbicpO1xuICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLlBBR0VfU0laRSA9IDU7XG4gICAgICAgIHRoaXMudG90YWxOb3RpZmljYXRpb25zID0gMDtcbiAgICAgICAgdGhpcy5wYWdlTnVtID0gMDtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zID0gW107XG5cbiAgICAgICAgdGhpcy5yZW5kZXJTaGVsbCgpO1xuICAgICAgICB0aGlzLmxvYWRQYWdlKCk7XG5cbiAgICAgICAgdGhpcy4kZWwub24oJ2NsaWNrJywgKGUpID0+IHtcbiAgICAgICAgICAgIC8vIGNsaWNrcyBpbnNpZGUgdGhlIGNvbnRhaW5lciBhcmUgdHJhcHBlZCBzbyB0aGV5IGNhbid0IHRyaWdnZXIgdGhlIGNsb3NlIGhhbmRsZXIuXG4gICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICB9KTtcblxuICAgICAgICAkKCdib2R5Jykub24oJ2NsaWNrJywgKGUpID0+IHRoaXMudHJ5Q2xvc2UoZSkpO1xuICAgICAgICB0aGlzLiR0cmlnZ2VyRWwub24oJ2NsaWNrJywgKGUpID0+IHRoaXMudG9nZ2xlKGUpKTtcblxuICAgICAgICB0aGlzLiRlbC5vbigna2V5dXAnLCAoZSkgPT4ge1xuICAgICAgICAgICAgaWYgKGUud2hpY2ggPT09IGtleXMuRVNDKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50cnlDbG9zZShlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2xvc2UoKSB7XG4gICAgICAgIHRoaXMuJGVsLmRldGFjaCgpO1xuICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRyeUNsb3NlKGUpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNPcGVuICYmIGUgJiYgIWUub3JpZ2luYWxFdmVudC5pc0RyYXdlck9wZW5DbGljaykge1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb3BlbihlKSB7XG4gICAgICAgIGlmICghdGhpcy5pc09wZW4pIHtcbiAgICAgICAgICAgIGUub3JpZ2luYWxFdmVudC5pc0RyYXdlck9wZW5DbGljayA9IHRydWU7XG4gICAgICAgICAgICAvLyBUaGVyZSBhcmUgdHdvIHBvdGVudGlhbCBjbGljayB0YXJnZXRzOiBvbmUgZm9yIHRoZSBtb2JpbGUgbmF2IGFuZCBvbmUgZm9yIHRoZSBkZXNrdG9wIG5hdlxuICAgICAgICAgICAgJChlLmN1cnJlbnRUYXJnZXQpXG4gICAgICAgICAgICAgICAgLnNpYmxpbmdzKCcuTm90aWZpY2F0aW9ucy1Ecm9wZG93bicpXG4gICAgICAgICAgICAgICAgLmFwcGVuZCh0aGlzLiRlbCk7XG4gICAgICAgICAgICB0aGlzLmlzT3BlbiA9IHRydWU7XG4gICAgICAgICAgICAkKCcuaWNvbi1ub3RpZmljYXRpb24nKS5yZW1vdmVDbGFzcygncmluZycpO1xuICAgICAgICAgICAgc3ZnTG9hZGVyKCk7XG5cbiAgICAgICAgICAgIHRoaXMuJGVsLmZpbmQoJzpmb2N1c2FibGU6dmlzaWJsZScpLmZpcnN0KCkuZm9jdXMoKTtcblxuICAgICAgICAgICAgdGhpcy4kZWwub24oJ2tleWRvd24nLCAoZXYpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXYud2hpY2ggPT09IGtleXMuVEFCKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMua2VlcEZvY3VzKGV2KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHRvZ2dsZShlKSB7XG4gICAgICAgIGlmICh0aGlzLmlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy50cnlDbG9zZShlKTtcbiAgICAgICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLm9wZW4oZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBrZWVwRm9jdXMoZSkge1xuICAgICAgICBjb25zdCBhY3RpdmVFbGVtID0gJChkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgICAgICAgY29uc3QgZmlyc3RGb2N1c2FibGUgPVxuICAgICAgICAgICAgdGhpcy4kKCcuTm90aWZpY2F0aW9uLWl0ZW0nKVswXSB8fFxuICAgICAgICAgICAgdGhpcy4kZWwuZmluZCgnOmZvY3VzYWJsZTp2aXNpYmxlJykuZmlyc3QoKTtcbiAgICAgICAgY29uc3QgbGFzdEZvY3VzYWJsZSA9IHRoaXMuJGVsLmZpbmQoJzpmb2N1c2FibGU6dmlzaWJsZTp0YWJiYWJsZScpW1xuICAgICAgICAgICAgdGhpcy4kZWwuZmluZCgnOmZvY3VzYWJsZTp2aXNpYmxlOnRhYmJhYmxlJykubGVuZ3RoIC0gMVxuICAgICAgICBdO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGFjdGl2ZUVsZW0uaXMoZmlyc3RGb2N1c2FibGUpICYmXG4gICAgICAgICAgICBlLndoaWNoID09PSBrZXlzLlRBQiAmJlxuICAgICAgICAgICAgZS5zaGlmdEtleVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGxhc3RGb2N1c2FibGUuZm9jdXMoKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICQoYWN0aXZlRWxlbSkuaXMobGFzdEZvY3VzYWJsZSkgJiZcbiAgICAgICAgICAgIGUud2hpY2ggPT09IGtleXMuVEFCICYmXG4gICAgICAgICAgICAhZS5zaGlmdEtleVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIGZpcnN0Rm9jdXNhYmxlLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGFydFNwaW5uZXIodGFyZ2V0KSB7XG4gICAgICAgIHRhcmdldC5hcHBlbmQodGhpcy4kc3Bpbm5lcik7XG4gICAgfVxuXG4gICAgc3RvcFNwaW5uZXIoKSB7XG4gICAgICAgIHRoaXMuJHNwaW5uZXIuZGV0YWNoKCk7XG4gICAgfVxuXG4gICAgc3RhcnROYWdnaW5nKHJlc3VsdENvdW50KSB7XG4gICAgICAgICQoJy5ub3RpZmljYXRpb25Eb3RDb250YWluZXInKS5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTtcbiAgICAgICAgJCgnLm5vdGlmaWNhdGlvbkRvdENvbnRhaW5lci5tb2JpbGUnKS5jc3MoJ2Rpc3BsYXknLCAnaW5saW5lLWJsb2NrJyk7XG4gICAgICAgICQoJy5qcy1ub3RpZmljYXRpb25zQnV0dG9uJykuYXR0cihcbiAgICAgICAgICAgICdhcmlhLWxhYmVsJyxcbiAgICAgICAgICAgIHRleHQoJ25vdGlmaWNhdGlvbnMuYWN0aXZlTm90aWZpY2F0aW9uc0xhYmVsJywgeyBudW06IHJlc3VsdENvdW50IH0pXG4gICAgICAgICk7XG4gICAgICAgICQoJy5qcy1ub3RpZmljYXRpb25zQnV0dG9uJykuYXR0cigncm9sZScsICdidXR0b24gYWxlcnQnKTtcbiAgICAgICAgJCgnLmljb24tbm90aWZpY2F0aW9uJykuYWRkQ2xhc3MoJ3JpbmcnKTtcbiAgICB9XG5cbiAgICByZW5kZXJTaGVsbCgpIHtcbiAgICAgICAgdGhpcy4kZWwuZW1wdHkoKTtcbiAgICAgICAgdGhpcy4kZWwuYXBwZW5kKGA8ZGl2IGNsYXNzPSdOb3RpZmljYXRpb25zQ2FyZXQgd2hpdGUnPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIk5vdGlmaWNhdGlvbnNDb250YWluZXJcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwic3Bpbm5lckJveFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdTcGlubmVyQ29udGFpbmVyJz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J3NwaW5uZXInPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PmApO1xuICAgICAgICB0aGlzLiRzcGlubmVyID0gdGhpcy4kZWwuZmluZCgnLnNwaW5uZXJCb3gnKTtcbiAgICAgICAgdGhpcy4kbWFpbkNvbnRhaW5lciA9IHRoaXMuJGVsLmZpbmQoJy5Ob3RpZmljYXRpb25zQ29udGFpbmVyJyk7XG4gICAgICAgIHRoaXMuJGNhcmV0ID0gdGhpcy4kZWwuZmluZCgnLk5vdGlmaWNhdGlvbnNDYXJldCcpO1xuICAgIH1cblxuICAgIGdldCBoYXNNb3JlUGFnZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnBhZ2VOdW0gPCB0aGlzLm51bVBhZ2VzIC0gMTtcbiAgICB9XG5cbiAgICBsb2FkUGFnZSgpIHtcbiAgICAgICAgdGhpcy5nZXROb3RpZmljYXRpb25zKClcbiAgICAgICAgICAgIC50aGVuKChyZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5wYWdlTnVtID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudG90YWxOb3RpZmljYXRpb25zID0gcmVzLnRvdGFsUmVzdWx0Q291bnQ7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMubnVtUGFnZXMgPSBNYXRoLmNlaWwoXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRvdGFsTm90aWZpY2F0aW9ucyAvIHRoaXMuUEFHRV9TSVpFXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gSXQncyBwb3NzaWJsZSBmb3IgaW52YWxpZCBub3RpaWZpY2F0aW9ucyB0byBiZSBwcnVuZWQgZnJvbSB0aGUgcmVzcG9uc2UgYmVmb3JlIGl0IHJlYWNoZXMgdGhlIGNsaWVudC5cbiAgICAgICAgICAgICAgICAvLyBUaGVyZSBpcyBhbiBlZGdlIGNhc2Ugd2VocmUgYW4gZW50aXJlIHBhZ2Ugb2YgcmVzdWx0cyBtYXkgYmUgZW1wdHkgYmVjYXVzZSBhbGwgb2YgdGhlIGl0ZW1zIHdlcmUgcHJ1bmVkLCBidXRcbiAgICAgICAgICAgICAgICAvLyB0aGVyZSBhcmUgc3RpbGwgbW9yZSBwYWdlcyBhdmFpbGFibGUuICBJbiB0aGlzIGNhc2Ugd2Ugd2lsbCBhdXRvbWF0aWNhbGx5IGFkdmFuY2UgdG8gdGhlIG5leHQgcGFnZSB3aXRob3V0IGZ1cnRoZXJcbiAgICAgICAgICAgICAgICAvLyB1c2VyIGludGVyYWN0aW9uLlxuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgcmVzICYmXG4gICAgICAgICAgICAgICAgICAgIHJlcy5pdGVtcyAmJlxuICAgICAgICAgICAgICAgICAgICByZXMuaXRlbXMubGVuZ3RoID09PSAwICYmXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuaGFzTW9yZVBhZ2VzXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucGFnZU51bSArPSAxO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkUGFnZSgpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHRoaXMuc3RvcFNwaW5uZXIoKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzICYmIHR5cGVvZiByZXMuaXRlbXMgIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBuZXdOb3RpZmljYXRpb25zID0gW107XG4gICAgICAgICAgICAgICAgICAgIHJlcy5pdGVtcy5mb3JFYWNoKChuKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgaXRlbSA9IG5ldyBOb3RpZmljYXRpb25JdGVtKG4pO1xuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5yZWdpc3RlckRpc21pc3NDYWxsYmFjaygoKSA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubm90aWZpY2F0aW9uRGlzbWlzc2VkKClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICBuZXdOb3RpZmljYXRpb25zLnB1c2goaXRlbSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm5vdGlmaWNhdGlvbnMgPVxuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zLmNvbmNhdChuZXdOb3RpZmljYXRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW5kZXJQYWdlKG5ld05vdGlmaWNhdGlvbnMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdG9wU3Bpbm5lcigpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5Mb2dnZXIubG9nKCdlcnJvcicsICdGYWlsZWQgdG8gc2hvdyBub3RpZmljYXRpb25zJywge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBlcnJvci5zdGF0dXNUZXh0IHx8IGVycm9yLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnBhZ2VOdW0gPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbWFpbkNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgLmVtcHR5KClcbiAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDxkaXYgY2xhc3M9J05vLU5vdGlmaWNhdGlvbnMnPjxwPiR7dGV4dChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdub3RpZmljYXRpb25zLmZldGNoaW5nRXJyb3InLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBsaW5rOiB0aGlzLmdldENvbnRhY3RTdXBwb3J0TGluaygpIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKX08L3A+PC9kaXY+YFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbG9hZE1vcmVCb3hcbiAgICAgICAgICAgICAgICAgICAgICAgIC5lbXB0eSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGA8YnV0dG9uIHRhYmluZGV4PScwJyBjbGFzcz0nTm90aWZpY2F0aW9ucy1sb2FkTW9yZSc+JHt0ZXh0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm90aWZpY2F0aW9ucy5sb2FkTW9yZUVycm9yJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9ICR7dGV4dChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vdGlmaWNhdGlvbnMubG9hZE1vcmVUcnlBZ2FpbidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApfTwvYnV0dG9uPmBcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGxvYWRNb3JlQm94XG4gICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnLk5vdGlmaWNhdGlvbnMtbG9hZE1vcmUnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLm9uKCdjbGljaycsIChlKSA9PiB0aGlzLmxvYWRNb3JlQ2xpY2soZSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIGdldE5vdGlmaWNhdGlvbnMoKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PlxuICAgICAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICdHRVQnLFxuICAgICAgICAgICAgICAgIHVybDogd2luZG93LnVybCh3aW5kb3cucm91dGVzLnJlc3QucGF0cm9uTm90aWZpY2F0aW9ucy5nZXQpLFxuICAgICAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICAgICAgcGFnZU51bWJlcjogdGhpcy5wYWdlTnVtLFxuICAgICAgICAgICAgICAgICAgICBwYWdlU2l6ZTogdGhpcy5QQUdFX1NJWkUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB0aW1lb3V0OiAxMDAwMCxcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmRvbmUoKHJlc3BvbnNlKSA9PiByZXNvbHZlKHJlc3BvbnNlKSlcbiAgICAgICAgICAgICAgICAuZmFpbCgoeGhyLCBzdGF0dXMsIGVycikgPT4gcmVqZWN0KGVycikpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcmVuZGVyUGFnZShub3RpZmljYXRpb25zKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHRoaXMucGFnZU51bSA9PT0gMCAmJlxuICAgICAgICAgICAgKCFub3RpZmljYXRpb25zIHx8IG5vdGlmaWNhdGlvbnMubGVuZ3RoID09PSAwKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheU5vTm90aWZpY2F0aW9uc01lc3NhZ2UoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLm5vdGlmaWNhdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFnZU51bSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuJG1haW5Db250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChgPGRpdiBjbGFzcz0nTm90aWZpY2F0aW9uc0NvdW50SXRlbSc+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9J05vdGlmaWNhdGlvbnNMaXN0Q29udGFpbmVyJz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1bCBjbGFzcz0nTm90aWZpY2F0aW9uc0xpc3QnPjwvdWw+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PmApO1xuXG4gICAgICAgICAgICAgICAgdGhpcy4kbm90aWZpY2F0aW9uQ29udGFpbmVyID1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kbWFpbkNvbnRhaW5lci5maW5kKCcuTm90aWZpY2F0aW9uc0xpc3QnKTtcbiAgICAgICAgICAgICAgICB0aGlzLiRjb3VudENvbnRhaW5lciA9IHRoaXMuJG1haW5Db250YWluZXIuZmluZChcbiAgICAgICAgICAgICAgICAgICAgJy5Ob3RpZmljYXRpb25zQ291bnRJdGVtJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudG90YWxOb3RpZmljYXRpb25zID4gMCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXJ0TmFnZ2luZyh0aGlzLnRvdGFsTm90aWZpY2F0aW9ucyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNvdW50KCk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUNhcmV0KCk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLiRsb2FkTW9yZUJveCkge1xuICAgICAgICAgICAgICAgIHRoaXMuJGxvYWRNb3JlQm94LnJlbW92ZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBub3RpZmljYXRpb25zLmZvckVhY2goKG4pID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLiRub3RpZmljYXRpb25Db250YWluZXIuYXBwZW5kKG4ucmVuZGVyKCkpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmhhc01vcmVQYWdlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuJGxvYWRNb3JlQm94ID0gJChgPGxpIGNsYXNzPSdsb2FkTW9yZUl0ZW0nPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHRhYmluZGV4PScwJyBjbGFzcz0nTm90aWZpY2F0aW9ucy1sb2FkTW9yZSc+JHt0ZXh0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ25vdGlmaWNhdGlvbnMubG9hZE1vcmUnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9PC9idXR0b24+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9saT5gKTtcbiAgICAgICAgICAgICAgICB0aGlzLiRub3RpZmljYXRpb25Db250YWluZXIuYXBwZW5kKHRoaXMuJGxvYWRNb3JlQm94KTtcbiAgICAgICAgICAgICAgICB0aGlzLiRsb2FkTW9yZUJveFxuICAgICAgICAgICAgICAgICAgICAuZmluZCgnLk5vdGlmaWNhdGlvbnMtbG9hZE1vcmUnKVxuICAgICAgICAgICAgICAgICAgICAub24oJ2NsaWNrJywgKGUpID0+IHRoaXMubG9hZE1vcmVDbGljayhlKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnBhZ2VOdW0gIT09IDApIHtcbiAgICAgICAgICAgICAgICAkKCcuTm90aWZpY2F0aW9uLWl0ZW0nKVt0aGlzLnBhZ2VOdW0gKiB0aGlzLlBBR0VfU0laRV0uZm9jdXMoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5wYWdlTnVtICs9IDE7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNwbGF5Tm9Ob3RpZmljYXRpb25zTWVzc2FnZSgpIHtcbiAgICAgICAgdGhpcy4kbWFpbkNvbnRhaW5lci5lbXB0eSgpXG4gICAgICAgICAgICAuYXBwZW5kKGA8ZGl2IGNsYXNzPSdOby1Ob3RpZmljYXRpb25zJyB0YWJpbmRleD0nMCc+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPSdOby1Ob3RpZmljYXRpb25JbWFnZUNvbnRhaW5lciBzdmcgZHluYW1pYy1sb2FkZXInIGRhdGEtc3JjPSduby1ub3RpZmljYXRpb25zLWltYWdlLnN2Zyc+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGg1IGNsYXNzPSdOby1Ob3RpZmljYXRpb25zLUhlYWRlcic+JHt0ZXh0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbm90aWZpY2F0aW9ucy5ub05vdGlmaWNhdGlvbnNMYWJlbCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApfTwvaDU+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHA+JHt0ZXh0KCdub3RpZmljYXRpb25zLm5vTm90aWZpY2F0aW9ucycpfTwvcD5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PmApO1xuICAgIH1cblxuICAgIGxvYWRNb3JlQ2xpY2soKSB7XG4gICAgICAgIHRoaXMuJGxvYWRNb3JlQm94LmVtcHR5KCk7XG4gICAgICAgIHRoaXMuc3RhcnRTcGlubmVyKHRoaXMuJGxvYWRNb3JlQm94KTtcbiAgICAgICAgdGhpcy5sb2FkUGFnZSgpO1xuICAgIH1cblxuICAgIHVwZGF0ZUNhcmV0KCkge1xuICAgICAgICBpZiAodGhpcy5ub3RpZmljYXRpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuJGNhcmV0LnJlbW92ZUNsYXNzKCd3aGl0ZScpO1xuICAgICAgICB9IGVsc2UgaWYgKCF0aGlzLiRjYXJldC5oYXNDbGFzcygnd2hpdGUnKSkge1xuICAgICAgICAgICAgdGhpcy4kY2FyZXQuYWRkQ2xhc3MoJ3doaXRlJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVDb3VudCgpIHtcbiAgICAgICAgdGhpcy4kY291bnRDb250YWluZXIuZW1wdHkoKTtcbiAgICAgICAgdGhpcy4kY291bnRDb250YWluZXIuYXBwZW5kKFxuICAgICAgICAgICAgYDxoMj4ke3RleHQoJ25vdGlmaWNhdGlvbnMubm90aWZpY2F0aW9uQ291bnQnLCB7XG4gICAgICAgICAgICAgICAgbnVtOiB0aGlzLm5vdGlmaWNhdGlvbnMubGVuZ3RoLFxuICAgICAgICAgICAgICAgIHRvdGFsOiB0aGlzLnRvdGFsTm90aWZpY2F0aW9ucyxcbiAgICAgICAgICAgIH0pfTwvaDI+YFxuICAgICAgICApO1xuICAgIH1cblxuICAgIG5vdGlmaWNhdGlvbkRpc21pc3NlZCgpIHtcbiAgICAgICAgdGhpcy50b3RhbE5vdGlmaWNhdGlvbnMgLT0gMTtcbiAgICAgICAgdGhpcy5ub3RpZmljYXRpb25zID0gdGhpcy5ub3RpZmljYXRpb25zLmZpbHRlcigoeCkgPT4gIXguaXNEaXNtaXNzZWQpO1xuXG4gICAgICAgIGlmICh0aGlzLnRvdGFsTm90aWZpY2F0aW9ucyA8IDEpIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcGxheU5vTm90aWZpY2F0aW9uc01lc3NhZ2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlQ291bnQoKTtcbiAgICB9XG5cbiAgICBnZXRDb250YWN0U3VwcG9ydExpbmsoKSB7XG4gICAgICAgIGxldCBsaW5rID0gJyc7XG4gICAgICAgIGlmICh3aW5kb3cuT3ZlckRyaXZlLmxpYnJhcnlTdXBwb3J0VXJsICE9PSAnJykge1xuICAgICAgICAgICAgbGluayA9IHdpbmRvdy5PdmVyRHJpdmUubGlicmFyeVN1cHBvcnRVcmw7XG4gICAgICAgIH0gZWxzZSBpZiAod2luZG93Lk92ZXJEcml2ZS5saWJyYXJ5U3VwcG9ydEVtYWlsICE9PSAnJykge1xuICAgICAgICAgICAgbGluayA9IHdpbmRvdy5PdmVyRHJpdmUubGlicmFyeVN1cHBvcnRFbWFpbDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxpbmsgPSB1cmwod2luZG93LnJvdXRlcy5zdXBwb3J0TWVtYmVycyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGA8YSBjbGFzcz0ncHJpbWFyeS1jb2xvcicgaHJlZj0nJHtsaW5rfScgdGFyZ2V0PSdfYmxhbmsnIHJlbD0nbm9yZWZlcnJlcic+JHt0ZXh0KFxuICAgICAgICAgICAgJ2NvbnRhY3RTdXBwb3J0J1xuICAgICAgICApLnRvTG93ZXJDYXNlKCl9PC9hPmA7XG4gICAgfVxufVxuIiwiaW1wb3J0IFRpdGxlQWN0aW9uQnV0dG9uICAgICAgICBmcm9tICcuLi8uLi9jb21wb25lbnRzL21lZGlhL1RpdGxlQWN0aW9uQnV0dG9uJztcbmltcG9ydCBUaXRsZSAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vbWVkaWEvbW9kZWxzL1RpdGxlJztcbmltcG9ydCBTdXNwZW5zaW9uTW9kYWwgICAgICAgICAgZnJvbSAnLi4vU3VzcGVuZEhvbGRNb2RhbC9TdXNwZW5kSG9sZE1vZGFsJztcbmltcG9ydCBIb2xkQ2FuY2VsTW9kYWwgICAgICAgICAgZnJvbSAnLi4vSG9sZENhbmNlbE1vZGFsL0hvbGRDYW5jZWxNb2RhbCc7XG5pbXBvcnQgQm9ycm93ICAgICAgICAgICAgICAgICAgIGZyb20gJy4uLy4uL3RpdGxlLWFjdGlvbnMvYm9ycm93L0JvcnJvdyc7XG5cbmNvbnN0IHsgdGV4dCB9ID0gd2luZG93O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOb3RpZmljYXRpb25zSXRlbSBleHRlbmRzIEJhY2tib25lLlZpZXd7XG4gICAgY29uc3RydWN0b3Ioe2lkLCB0aXRsZUlkLCB0eXBlLCB0aW1lVVRDLCBkYXRhLCBpc05vdGlmaWNhdGlvbiA9IHRydWV9KXtcbiAgICAgICAgc3VwZXIoLi4uYXJndW1lbnRzKTtcbiAgICAgICAgdGhpcy5pZCA9IGlkO1xuICAgICAgICB0aGlzLnRpdGxlSWQgPSB0aXRsZUlkO1xuICAgICAgICB0aGlzLnR5cGUgPSB0eXBlO1xuICAgICAgICB0aGlzLnRpbWUgPSB0aW1lVVRDO1xuICAgICAgICB0aGlzLmRhdGEgPSBkYXRhIHx8IHt9O1xuICAgICAgICB0aGlzLm1vZGVsID0gbmV3IFRpdGxlKGRhdGEpO1xuICAgICAgICB0aGlzLnN5c3RlbSA9IHR5cGUgPT09IFwiU2l0ZU1lc3NhZ2VcIjtcbiAgICAgICAgdGhpcy5idXMgPSB3aW5kb3cuZ2xvYmFsRXZlbnRzO1xuICAgICAgICB0aGlzLmlzTm90aWZpY2F0aW9uID0gaXNOb3RpZmljYXRpb247XG4gICAgICAgIHRoaXMuZGlzbWlzc2VkID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGlzbWlzc0NhbGxiYWNrcyA9IFtdO1xuXG4gICAgICAgIHRoaXMuc2V0U3RhdGVPZlRpdGxlKCk7XG4gICAgfVxuXG4gICAgcmVuZGVyKCl7XG4gICAgICAgIHRoaXMuJGVsID0gdGhpcy50ZW1wbGF0ZSgpO1xuICAgICAgICB0aGlzLmFkZEFjdGlvbmJ1dHRvbnModGhpcy4kZWwpO1xuICAgICAgICB0aGlzLmF0dGFjaERpc21pc3NIYW5kbGVycygpO1xuICAgICAgICB0aGlzLiRlbC5maW5kKCcuQ2xlYXJOb3RpZmljYXRpb24nKS5vbignY2xpY2snLCAoKSA9PiB0aGlzLmRpc21pc3NOb3RpZmljYXRpb24oKSk7XG4gICAgICAgIHJldHVybiB0aGlzLiRlbDtcbiAgICB9XG5cbiAgICBzZXRTdGF0ZU9mVGl0bGUoKXtcbiAgICAgICAgaWYoW1wiSG9sZFN1c3BlbmRlZEF1dG9cIiwgXCJIb2xkUmVhZHlcIiwgXCJIb2xkU3VzcGVuZGVkTWFudWFsXCIsIFwiSG9sZFN1c3BlbmRlZE1hbnVhbFwiXS5pbmNsdWRlcyh0aGlzLnR5cGUpKXtcbiAgICAgICAgICAgIC8qVGhlIHVzdWFsIG1ldGhvZCBmb3IgdXBkYXRpbmcgdGhlIHRpdGxlJ3Mgc3RhdGUgdGhyb3VnaCB0aGUgUGF0cm9uVGl0bGVTdGF0dXMgY29tcG9uZW50IGlzIG92ZXJraWxsIFxuICAgICAgICAgICAgICBoZXJlIHNpbmNlIHdlIGNhbiBpbmZlciB0aGVzZSBhcmUgaG9sZHMgYnkgdGhlIG5vdGlmaWNhdGlvbiB0eXBlLiBIb3dldmVyLCB0aGUgbG9naWMgZm9yIHBlcmZvcm1pbmcgXG4gICAgICAgICAgICAgIGFjdGlvbnMgb24gaG9sZHMgd2lsbCBub3QgZnVuY3Rpb24gY29ycmVjdGx5IHdpdGhvdXQgdGhpcyBwcm9wZXJ0eSBzZXQuKi9cbiAgICAgICAgICAgIHRoaXMubW9kZWwuc2V0KCdpc09uSG9sZCcsIHRydWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJEaXNtaXNzQ2FsbGJhY2soY2FsbGJhY2spe1xuICAgICAgICB0aGlzLmRpc21pc3NDYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgfVxuXG4gICAgZGlzbWlzc05vdGlmaWNhdGlvbigpe1xuICAgICAgICB0aGlzLnJlbW92ZSgpOyAvLyB3ZSBoaWRlIHRoZSBub3RpZmljYXRpb24gcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBkaXNtaXNzIGNhbGwgc3VjY2VlZHMsIHNvIHdlIG1heSBhcyB3ZWxsIG1ha2UgaXQgc25hcHB5XG4gICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5yZXN0LnBhdHJvbk5vdGlmaWNhdGlvbnMuZGlzbWlzcywge2lkOiB0aGlzLmlkfSksXG4gICAgICAgICAgICB0eXBlOiAnREVMRVRFJ1xuICAgICAgICB9KVxuICAgICAgICAuZG9uZSgoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXJEaXNtaXNzRXZlbnQoKTtcbiAgICAgICAgfSkuZmFpbCgoeGhyLCBzdGF0dXMsIGVycikgPT4ge1xuICAgICAgICAgICAgd2luZG93LkxvZ2dlci5sb2coJ2Vycm9yJywgJ0Vycm9yIGRpc21pc3Npbmcgbm90aWZpY2F0aW9uJywge21lc3NhZ2U6IGVyci5zdGF0dXNUZXh0IHx8IGVycn0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICByZW1vdmUoKXtcbiAgICAgICAgdGhpcy5pc0Rpc21pc3NlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuJGVsLmZpbmQoJy5Ob3RpZmljYXRpb24nKS5hZGRDbGFzcygnbm90aWZpY2F0aW9uRGlzYXBwZWFyJyk7IC8vIGZhZGVcbiAgICAgICAgdGhpcy4kZWwuYWRkQ2xhc3MoJ25vdGlmaWNhdGlvblNodXQnKTsgLy8gY29sbGFwc2VcbiAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHRoaXMuJGVsLmhpZGUoKTsgfSwgNDUwKTsgLy8gdmFuaXNoXG4gICAgICAgIHRoaXMuZGlzbWlzc0NhbGxiYWNrcy5mb3JFYWNoKChjYWxsYmFjaykgPT4ge1xuICAgICAgICAgICAgY2FsbGJhY2soKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgdHJpZ2dlckRpc21pc3NFdmVudCgpIHtcbiAgICAgICAgc3dpdGNoKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcIkhvbGRTdXNwZW5kZWRBdXRvXCI6XG4gICAgICAgICAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndGl0bGU6c3VzcGVuZDpkaXNtaXNzJywge3RpdGxlTW9kZWw6IHRoaXMubW9kZWwsIGNvbnRleHQ6IHsgaXNOb3RpZmljYXRpb246IHRoaXMuaXNOb3RpZmljYXRpb24gfX0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcIkhvbGRMYXBzZWRcIjpcbiAgICAgICAgICAgICAgICB0aGlzLmJ1cy50cmlnZ2VyKCd0aXRsZTpob2xkLWxhcHNlZDpkaXNtaXNzJywge3RpdGxlTW9kZWw6IHRoaXMubW9kZWwsIGNvbnRleHQ6IHsgaXNOb3RpZmljYXRpb246IHRoaXMuaXNOb3RpZmljYXRpb24gfX0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIHRyaWdnZXJcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGdldERhdGVPZk5vdGlmaWNhdGlvbigpe1xuICAgICAgICByZXR1cm4gbmV3IERhdGUodGhpcy50aW1lKTtcbiAgICB9XG5cbiAgICBnZXRUaXRsZUltYWdlKCl7XG4gICAgICAgIGlmKHRoaXMuZGF0YSl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5tb2RlbC5nZXRDb3ZlclNyYygxNTApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0Tm90aWZpY2F0aW9uVGV4dCh0aXRsZU5hbWUpe1xuICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSBcIkhvbGRSZWFkeVwiOntcbiAgICAgICAgICAgICAgICBsZXQgZXhwRGF0ZSA9IG5ldyBEYXRlKHRoaXMubW9kZWwuZ2V0KFwiZXhwaXJlRGF0ZVwiKSk7XG4gICAgICAgICAgICAgICAgbGV0IG5vdyA9IG5ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgbGV0IGhlYWRlciA9IFwiXCI7XG4gICAgICAgICAgICAgICAgbGV0IGhvdXJzTGVmdCA9IE1hdGguZmxvb3IoKGV4cERhdGUuZ2V0VGltZSgpIC0gbm93LmdldFRpbWUoKSkgLyAzLjZlKzYpO1xuICAgICAgICAgICAgICAgIGlmIChob3Vyc0xlZnQgPj0gMjUpIHsgLy9kaXNwbGF5IGRheXNcbiAgICAgICAgICAgICAgICAgICAgbGV0IGRheXNMZWZ0ID0gTWF0aC5mbG9vcigoZXhwRGF0ZS5nZXRUaW1lKCkgLSBub3cuZ2V0VGltZSgpKSAvIDguNjRlKzcpO1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXIgPSB0ZXh0KFwibm90aWZpY2F0aW9ucy5Ib2xkUmVhZHkuaGVhZGVyLmRheXNcIiwge3RpdGxlOiB0aXRsZU5hbWUsIHRpbWU6IGRheXNMZWZ0fSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGhvdXJzTGVmdCA+PSAxKXsgLy9kaXNwbGF5IGhvdXJzXG4gICAgICAgICAgICAgICAgICAgIGhlYWRlciA9IHRleHQoXCJub3RpZmljYXRpb25zLkhvbGRSZWFkeS5oZWFkZXIuaG91cnNcIiwge3RpdGxlOiB0aXRsZU5hbWUsIHRpbWU6IGhvdXJzTGVmdH0pO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vZGlzcGxheSBtaW5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG1pbnV0ZXNMZWZ0ID0gTWF0aC5mbG9vcigoZXhwRGF0ZS5nZXRUaW1lKCkgLSBub3cuZ2V0VGltZSgpKSAvIDYwMDAwKTtcbiAgICAgICAgICAgICAgICAgICAgaGVhZGVyID0gdGV4dChcIm5vdGlmaWNhdGlvbnMuSG9sZFJlYWR5LmhlYWRlci5taW5zXCIsIHt0aXRsZTogdGl0bGVOYW1lLCB0aW1lOiBtaW51dGVzTGVmdH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXIgOiBoZWFkZXIsXG4gICAgICAgICAgICAgICAgICAgIG1haW5UZXh0IDogdGV4dChcIm5vdGlmaWNhdGlvbnMuSG9sZFJlYWR5Lm1haW5UZXh0XCIpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgXCJIb2xkU3VzcGVuZGVkQXV0b1wiOntcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXIgOiB0ZXh0KFwibm90aWZpY2F0aW9ucy5Ib2xkU3VzcGVuZGVkQXV0by5oZWFkZXJcIiwge3RpdGxlOiB0aXRsZU5hbWUsIGRhdGU6IHRoaXMubW9kZWwuZ2V0KFwic3VzcGVuc2lvbkVuZFwiKX0pLFxuICAgICAgICAgICAgICAgICAgICBtYWluVGV4dCA6IHRleHQoXCJub3RpZmljYXRpb25zLkhvbGRTdXNwZW5kZWRBdXRvLm1haW5UZXh0XCIsIHtkYXRlOiB0aGlzLm1vZGVsLmdldChcInN1c3BlbnNpb25FbmRcIil9KVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXNlIFwiSG9sZExhcHNlZFwiOntcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXI6IHRleHQoXCJub3RpZmljYXRpb25zLkhvbGRMYXBzZWQuaGVhZGVyXCIsIHt0aXRsZTogdGl0bGVOYW1lfSksXG4gICAgICAgICAgICAgICAgICAgIG1haW5UZXh0IDogdGV4dChcIm5vdGlmaWNhdGlvbnMuSG9sZExhcHNlZC5tYWluVGV4dFwiKVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkZWZhdWx0OntcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBoZWFkZXIgOiBgJHt0aXRsZU5hbWV9IGlzIHJlYWR5IGZvciBzb21lIGFjdGlvbi4gRG8gc29tZXRoaW5nIHdpdGggaXQuYCxcbiAgICAgICAgICAgICAgICAgICAgbWFpblRleHQgOiBcIkxvb2sgYXQgdGhlIGJ1dHRvbnMgYmVsb3cgYW5kIHBpY2sgdGhlIGFwcHJvcHJpYXRlIGFjdGlvbiB0byBkaXNtaXNzIHRoaXMgbm90aWZpY2F0aW9uLlwiXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlzRGlzbWlzc2FibGUoKXtcbiAgICAgICAgcmV0dXJuIHRoaXMuc3lzdGVtIHx8IHRoaXMudHlwZSA9PT0gXCJIb2xkU3VzcGVuZGVkQXV0b1wiIHx8IHRoaXMudHlwZSA9PT0gXCJIb2xkTGFwc2VkXCI7XG4gICAgfVxuXG4gICAgdGVtcGxhdGUoKXtcbiAgICAgICAgbGV0IG5vdGlmaWNhdGlvbkRhdGUgPSB0ZXh0KFwibm90aWZpY2F0aW9ucy5kYXRlXCIgLHtkYXRlOiB0aGlzLmdldERhdGVPZk5vdGlmaWNhdGlvbigpfSk7XG4gICAgICAgIGxldCB0aXRsZUltYWdlID0gdGhpcy5nZXRUaXRsZUltYWdlKCk7XG4gICAgICAgIGxldCBjb3ZlckxpbmsgPSB0aGlzLm1vZGVsLnRpdGxlRGV0YWlsc1VybDtcbiAgICAgICAgbGV0IHRpdGxlTmFtZSA9IHRoaXMubW9kZWwuZ2V0KFwidGl0bGVcIik7XG5cbiAgICAgICAgbGV0IHRleHRPYmogPSB0aGlzLmdldE5vdGlmaWNhdGlvblRleHQodGl0bGVOYW1lKTtcbiAgICAgICAgbGV0IGhlYWRlciA9IHRleHRPYmouaGVhZGVyO1xuICAgICAgICBsZXQgbWFpblRleHQgPSB0ZXh0T2JqLm1haW5UZXh0O1xuXG4gICAgICAgIHJldHVybiAkKGBcbiAgICAgICAgPGxpIGNsYXNzPVwiTm90aWZpY2F0aW9uLWl0ZW1cIiB0YWJpbmRleD1cIjBcIiBhcmlhLWxhYmVsPVwiJHt0ZXh0KFwibm90aWZpY2F0aW9ucy5ub3RpZmljYXRpb25MYWJlbFwiLCB7dGl0bGU6IHRpdGxlTmFtZX0pfVwiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIk5vdGlmaWNhdGlvbiBzaG93LWZvci1tZWRpdW0tdXBcIj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiTm90aWZpY2F0aW9uLU1haW5JbmZvICR7dGhpcy5pc0Rpc21pc3NhYmxlKCkgPyBcImNsZWFyLWJ1dHRvbi1hZGRlZFwiIDogXCJcIn1cIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInRvcFJvd1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIkltYWdlQ29udGFpbmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGEgaHJlZj1cIiR7Y292ZXJMaW5rfVwiPjxpbWcgYWx0PVwiJHt0aXRsZU5hbWV9XCIgc3JjPVwiJHt0aXRsZUltYWdlfVwiPjwvYT5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIk5vdGlmaWNhdGlvbkluZm9cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZGF0ZVwiPjxwPiR7bm90aWZpY2F0aW9uRGF0ZX08L3A+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGgzIGNsYXNzPVwidGl0bGVJbmZvXCI+JHtoZWFkZXJ9PC9oMz5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJhY3Rpb25JbmZvXCI+JHttYWluVGV4dH08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7dGhpcy5pc0Rpc21pc3NhYmxlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYDxidXR0b24gdGFiaW5kZXg9XCIwXCIgYXJpYS1sYWJlbD1cIiR7dGV4dChcIm5vdGlmaWNhdGlvbnMuY2xlYXJOb3RpZmljYXRpb25MYWJlbFwiLCB7dGl0bGU6IHRpdGxlTmFtZX0pfVwiIGNsYXNzPVwiQ2xlYXJOb3RpZmljYXRpb25cIiBkYXRhLW5vdElkPVwiJHt0aGlzLmlkfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aSBjbGFzcz1cImljb24tY2xlYXJcIj48L2k+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+YCA6ICcnfVxuICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgICAgICAgICAkeyF0aGlzLnN5c3RlbVxuICAgICAgICAgICAgICAgICAgICAgICAgPyBgPGRpdiBjbGFzcz1cImFjdGlvbkJ1dHRvbnNcIj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+YCA6ICcnfVxuICAgICAgICAgICAgICAgIDwvZGl2PlxuXG4gICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cIk5vdGlmaWNhdGlvbiBzaG93LWZvci1zbWFsbC1vbmx5XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cIk5vdGlmaWNhdGlvbi1NYWluSW5mbyAke3RoaXMuaXNEaXNtaXNzYWJsZSgpID8gXCJjbGVhci1idXR0b24tYWRkZWRcIiA6IFwiXCJ9XCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ0b3BSb3dcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJJbWFnZUNvbnRhaW5lclwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9XCIke2NvdmVyTGlua31cIj48aW1nIGFsdD1cIiR7dGl0bGVOYW1lfVwiIHNyYz1cIiR7dGl0bGVJbWFnZX1cIj48L2E+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJOb3RpZmljYXRpb25JbmZvXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRhdGVcIj48cD4ke25vdGlmaWNhdGlvbkRhdGV9PC9wPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxwIGNsYXNzPVwidGl0bGVJbmZvXCI+JHtoZWFkZXJ9PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3RoaXMuaXNEaXNtaXNzYWJsZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBgPGRpdiB0YWJpbmRleD1cIjBcIiBhcmlhLWxhYmVsPVwiJHt0ZXh0KFwibm90aWZpY2F0aW9ucy5jbGVhck5vdGlmaWNhdGlvbkxhYmVsXCIsIHt0aXRsZTogdGl0bGVOYW1lfSl9XCIgY2xhc3M9XCJDbGVhck5vdGlmaWNhdGlvblwiIGRhdGEtbm90SWQ9XCIke3RoaXMuaWR9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpIGNsYXNzPVwiaWNvbi1jbGVhclwiPjwvaT5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5gIDogJyd9XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwibW9iaWxlLWJvdHRvbS1ub3RpZmljYXRpb24tcGFydFwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPHAgY2xhc3M9XCJhY3Rpb25JbmZvXCI+JHttYWluVGV4dH08L3A+XG4gICAgICAgICAgICAgICAgICAgICAgICAkeyF0aGlzLnN5c3RlbSA/ICc8ZGl2IGNsYXNzPVwiYWN0aW9uQnV0dG9uc1wiPjwvZGl2PicgOiAnJ31cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgICAgICAgICA8L2Rpdj5cblxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbGk+XG4gICAgICAgIGApO1xuICAgIH1cblxuICAgIGF0dGFjaERpc21pc3NIYW5kbGVycygpIHtcbiAgICAgICAgbGV0IGJvcnJvd0FjdGlvbiA9ICd0aXRsZTpib3Jyb3c6c3VjY2Vzcyc7XG4gICAgICAgIGxldCBjYW5jZWxIb2xkQWN0aW9uID0gJ3RpdGxlOmhvbGQtY2FuY2VsOnN1Y2Nlc3MnO1xuICAgICAgICBsZXQgcmVtb3ZlU3VzcGVuc2lvbkFjdGlvbiA9ICd0aXRsZTpzdXNwZW5kOmNhbmNlbGxlZCc7XG4gICAgICAgIGxldCBzdXNwZW5kSG9sZEFjdGlvbiA9ICd0aXRsZTpzdXNwZW5kJzsgLy8gdGhpcyBpbmNsdWRlcyBlZGl0aW5nIGEgc3VzcGVuc2lvbiBhcyB3ZWxsIGFzIGFkZGluZyBhIG5ldyBvbmVcbiAgICAgICAgbGV0IHBsYWNlSG9sZEFjdGlvbiA9ICd0aXRsZTpob2xkOnN1Y2Nlc3MnO1xuXG4gICAgICAgIGxldCBkaXNtaXNzQWN0aW9ucyA9IFtdO1xuICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgY2FzZSAnSG9sZFJlYWR5JzpcbiAgICAgICAgICAgICAgICBkaXNtaXNzQWN0aW9ucyA9IFtib3Jyb3dBY3Rpb24sIHN1c3BlbmRIb2xkQWN0aW9uLCBjYW5jZWxIb2xkQWN0aW9uXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ0hvbGRMYXBzZWQnOlxuICAgICAgICAgICAgICAgIGRpc21pc3NBY3Rpb25zID0gW3BsYWNlSG9sZEFjdGlvbl07XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdIb2xkU3VzcGVuZGVkQXV0byc6XG4gICAgICAgICAgICAgICAgZGlzbWlzc0FjdGlvbnMgPSBbY2FuY2VsSG9sZEFjdGlvbiwgc3VzcGVuZEhvbGRBY3Rpb24sIHJlbW92ZVN1c3BlbnNpb25BY3Rpb25dO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vdGlmaWNhdGlvbiB0eXBlICcke3RoaXMudHlwZX0gaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuYCk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgZGlzbWlzc0lmVGl0bGVNYXRjaGVzID0gKHt0aXRsZU1vZGVsfSkgPT4ge1xuICAgICAgICAgICAgaWYgKHRpdGxlTW9kZWwgJiYgdGl0bGVNb2RlbC5nZXQoJ2lkJykgPT09IHRoaXMubW9kZWwuZ2V0KCdpZCcpKXtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc21pc3NOb3RpZmljYXRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcblxuICAgICAgICBkaXNtaXNzQWN0aW9ucy5mb3JFYWNoKChhY3Rpb24pID0+IHtcbiAgICAgICAgICAgIHRoaXMuYnVzLm9uKGFjdGlvbiwgZGlzbWlzc0lmVGl0bGVNYXRjaGVzKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICBhZGRBY3Rpb25idXR0b25zKHRlbXBsYXRlKXtcbiAgICAgICAgbGV0IGJ1dHRvbnNDb250YWluZXIgPSB0ZW1wbGF0ZS5maW5kKFwiLmFjdGlvbkJ1dHRvbnNcIik7XG4gICAgICAgIGxldCB0aXRsZUlkID0gdGhpcy5tb2RlbC5nZXQoXCJpZFwiKTtcbiAgICAgICAgbGV0IHRpdGxlTmFtZSA9IHRoaXMubW9kZWwuZ2V0KFwidGl0bGVcIik7XG4gICAgICAgIGlmKGJ1dHRvbnNDb250YWluZXIubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICBzd2l0Y2ggKHRoaXMudHlwZSkge1xuICAgICAgICAgICAgICAgIGNhc2UgXCJIb2xkUmVhZHlcIjpcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uc0NvbnRhaW5lci5hcHBlbmQodGhpcy5ib3Jyb3dCdXR0b24odGl0bGVJZCwgdGl0bGVOYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbnNDb250YWluZXIuYXBwZW5kKHRoaXMuc3VzcGVuZEhvbGRCdXR0b24odGl0bGVJZCwgdGl0bGVOYW1lKSk7XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbnNDb250YWluZXIuYXBwZW5kKHRoaXMuY2FuY2VsSG9sZEJ1dHRvbih0aXRsZUlkLCB0aXRsZU5hbWUpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgICAgICBjYXNlIFwiSG9sZExhcHNlZFwiOlxuICAgICAgICAgICAgICAgICAgICBidXR0b25zQ29udGFpbmVyLmFwcGVuZCh0aGlzLnBsYWNlSG9sZEJ1dHRvbih0aXRsZUlkLCB0aXRsZU5hbWUpKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBcIkhvbGRTdXNwZW5kZWRBdXRvXCI6XG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbnNDb250YWluZXIuYXBwZW5kKHRoaXMuZGlzbWlzc05vdGlmaWNhdGlvbkJ1dHRvbigpKTtcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uc0NvbnRhaW5lci5hcHBlbmQodGhpcy5zdXNwZW5kSG9sZEJ1dHRvbih0aXRsZUlkLCB0aXRsZU5hbWUsIHRleHQoXCJub3RpZmljYXRpb25zLmVkaXREZWxpdmVyeURhdGVcIikpKTtcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uc0NvbnRhaW5lci5hcHBlbmQodGhpcy5jYW5jZWxIb2xkQnV0dG9uKHRpdGxlSWQsIHRpdGxlTmFtZSkpO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vdGlmaWNhdGlvbiB0eXBlICcke3RoaXMudHlwZX0gaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNtaXNzTm90aWZpY2F0aW9uQnV0dG9uKCl7XG4gICAgICAgIGxldCB0ZW1wbGF0ZSA9ICQoYDxidXR0b24gdGFiaW5kZXg9XCIwXCIgY2xhc3M9XCJOb3RpZmljYXRpb25CdXR0b24gZGlzbWlzcyBzZWNvbmRhcnktYmFja2dyb3VuZCBmdWxsXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dGV4dChcIm9rXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPmApO1xuICAgICAgICB0ZW1wbGF0ZS5vbignY2xpY2snLCAoKSA9PiB0aGlzLmRpc21pc3NOb3RpZmljYXRpb24oKSk7XG4gICAgICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICBib3Jyb3dCdXR0b24odGl0bGVJZCwgdGl0bGVOYW1lKXtcbiAgICAgICAgbGV0IHRlbXBsYXRlID0gJChgPGJ1dHRvbiB0YWJpbmRleD1cIjBcIiBjbGFzcz1cIk5vdGlmaWNhdGlvbkJ1dHRvbiBib3Jyb3cgc2Vjb25kYXJ5LWJhY2tncm91bmQgZnVsbFwiIGRhdGEtdGl0bGVJZD1cIiR7dGl0bGVJZH1cIiBhcmlhLWxhYmVsPVwiJHt0ZXh0KFwiYm9ycm93VGl0bGVcIiwge3RpdGxlOiB0aXRsZU5hbWV9KX1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt0ZXh0KFwiYm9ycm93XCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPmApO1xuXG4gICAgICAgIHRlbXBsYXRlLm9uKFwiY2xpY2tcIiwgKGUpID0+IHtcbiAgICAgICAgICAgIG5ldyBCb3Jyb3codGhpcy5idXMpLmJvcnJvd1RpdGxlKHRoaXMubW9kZWwsIHsgaXNOb3RpZmljYXRpb246IHRoaXMuaXNOb3RpZmljYXRpb24gfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0ZW1wbGF0ZTtcbiAgICB9XG5cbiAgICBjYW5jZWxIb2xkQnV0dG9uKHRpdGxlSWQsIHRpdGxlTmFtZSl7XG4gICAgICAgIGxldCB0ZW1wbGF0ZSA9ICQoYDxidXR0b24gdGFiaW5kZXg9XCIwXCIgY2xhc3M9XCJOb3RpZmljYXRpb25CdXR0b24gc2Vjb25kYXJ5LWJhY2tncm91bmQgZnVsbCBjYW5jZWwtaG9sZFwiIGRhdGEtdGl0bGVJZD1cIiR7dGl0bGVJZH1cIiBhcmlhLWxhYmVsPVwiJHt0ZXh0KFwiYWNjb3VudEhvbGRzLnJlbW92ZUhvbGRPblRpdGxlXCIsIHt0aXRsZTogdGl0bGVOYW1lfSl9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dGV4dChcImFjY291bnRIb2xkcy5yZW1vdmVIb2xkTGFiZWxcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9idXR0b24+YCk7XG5cblxuICAgICAgICB0ZW1wbGF0ZS5vbihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIChuZXcgSG9sZENhbmNlbE1vZGFsKCkpLm9uKCdjb25maXJtJywgKG1vZGFsKSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gLi4uIGJlY2F1c2Ugb2xkIGNvZGVcbiAgICAgICAgICAgICAgICB0aGlzLmJ1cy50cmlnZ2VyKCd0aXRsZTpob2xkLWNhbmNlbCcsIHRoaXMubW9kZWwsIHsgaXNOb3RpZmljYXRpb246IHRoaXMuaXNOb3RpZmljYXRpb24gfSk7XG4gICAgICAgICAgICAgICAgbW9kYWwuY2xvc2UoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgc3VzcGVuZEhvbGRCdXR0b24odGl0bGVJZCwgdGl0bGVOYW1lLCB3b3Jkcz1cIlwiKXtcbiAgICAgICAgbGV0IGNvcHlUb1VzZSA9IHdvcmRzID09PSBcIlwiID8gdGV4dChcIm5vdGlmaWNhdGlvbnMuZGVsaXZlckxhdGVyXCIpIDogd29yZHM7XG4gICAgICAgIGxldCB0ZW1wbGF0ZSA9ICQoYDxidXR0b24gdGFiaW5kZXg9XCIwXCIgY2xhc3M9XCJOb3RpZmljYXRpb25CdXR0b24gc3VzcGVuZCBib3JkZXJcIiBkYXRhLXRpdGxlSWQ9XCIke3RpdGxlSWR9XCIgYXJpYS1sYWJlbD1cIiR7Y29weVRvVXNlfSAtICR7dGl0bGVOYW1lfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke2NvcHlUb1VzZX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5gKTtcblxuICAgICAgICB0ZW1wbGF0ZS5vbihcImNsaWNrXCIsICgpID0+IHtcbiAgICAgICAgICAgIG5ldyBTdXNwZW5zaW9uTW9kYWwodGhpcy5tb2RlbCwgZmFsc2UsIHRoaXMuaXNOb3RpZmljYXRpb24pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgcGxhY2VIb2xkQnV0dG9uKHRpdGxlSWQsIHRpdGxlTmFtZSl7XG4gICAgICAgIGxldCB0ZW1wbGF0ZSA9ICQoYDxidXR0b24gdGFiaW5kZXg9XCIwXCIgY2xhc3M9XCJOb3RpZmljYXRpb25CdXR0b24gcGxhY2UtaG9sZCBzZWNvbmRhcnktYmFja2dyb3VuZCBmdWxsXCIgZGF0YS10aXRsZUlkPVwiJHt0aXRsZUlkfVwiIGFyaWEtbGFiZWw9XCIke3RleHQoXCJwbGFjZUFIb2xkT25UaXRsZVwiLCB7dGl0bGU6IHRpdGxlTmFtZX0pfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3RleHQoXCJwbGFjZUFIb2xkXCIpfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPmApO1xuXG4gICAgICAgIHRlbXBsYXRlLm9uKFwiY2xpY2tcIiwgKGUpID0+IHtcbiAgICAgICAgICAgIHRoaXMuYnVzLnRyaWdnZXIoJ3RpdGxlOmhvbGQnLCB0aGlzLm1vZGVsLCB7IGlzTm90aWZpY2F0aW9uOiB0aGlzLmlzTm90aWZpY2F0aW9uIH0pO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgcmVuZXdUaXRsZUJ1dHRvbih0aXRsZU5hbWUpe1xuICAgICAgICBsZXQgdGVtcGxhdGUgPSAkKGA8YnV0dG9uIHRhYmluZGV4PVwiMFwiIGNsYXNzPVwiTm90aWZpY2F0aW9uQnV0dG9uIHNlY29uZGFyeS1iYWNrZ3JvdW5kIGZ1bGxcIiBhcmlhLWxhYmVsPVwiJHt0ZXh0KFwicmV0dXJuTW9kYWwuaGVhZGluZ1wiKX0gJHt0aXRsZU5hbWV9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt0ZXh0KFwiYWNjb3VudEhvbGRzLnJldHVyblwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPmApO1xuICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgfVxuXG4gICAgcmV0dXJuQnV0dG9uKHRpdGxlTmFtZSl7XG4gICAgICAgIGxldCB0ZW1wbGF0ZSA9ICQoYDxidXR0b24gdGFiaW5kZXg9XCIwXCIgY2xhc3M9XCJOb3RpZmljYXRpb25CdXR0b24gc2Vjb25kYXJ5LWJhY2tncm91bmQgZnVsbFwiIGFyaWEtbGFiZWw9XCIke3RleHQoXCJyZW5ld01vZGFsLnJlbmV3U3BlY2lmaWNUaXRsZUFyaWFMYWJlbFwiLCB7dGl0bGU6IHRpdGxlTmFtZX0pfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dGV4dChcInJlbmV3YWwucmVuZXdcIil9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5gKTtcbiAgICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgIH1cblxuICAgIHJldHVybkVhcmx5QnV0dG9uKHRpdGxlTmFtZSl7XG4gICAgICAgIGxldCB0ZW1wbGF0ZSA9ICQoYDxidXR0b24gdGFiaW5kZXg9XCIwXCIgY2xhc3M9XCJOb3RpZmljYXRpb25CdXR0b24gYm9yZGVyXCIgYXJpYS1sYWJlbD1cIiR7dGV4dChcImFjY291bnRIb2xkcy5yZXR1cm5cIil9ICR7dGl0bGVOYW1lfVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dGV4dChcImFjY291bnRIb2xkcy5yZXR1cm5cIil9XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5gKTtcbiAgICAgICAgcmV0dXJuIHRlbXBsYXRlO1xuICAgIH1cblxuICAgIHJlcXVlc3RBZ2FpbkJ1dHRvbih0aXRsZU5hbWUpe1xuICAgICAgICBsZXQgdGVtcGxhdGUgPSAkKGA8YnV0dG9uIHRhYmluZGV4PVwiMFwiIGNsYXNzPVwiTm90aWZpY2F0aW9uQnV0dG9uIHNlY29uZGFyeS1iYWNrZ3JvdW5kIGZ1bGxcIiBhcmlhLWxhYmVsPVwiJHt0ZXh0KFwiYWNjb3VudExvYW5zLnJlcXVlc3RUaXRsZUFnYWluXCIsIHt0aXRsZTogdGl0bGVOYW1lfSl9XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt0ZXh0KFwiYWNjb3VudExvYW5zLnJlcXVlc3RBZ2FpblwiKX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPmApO1xuICAgICAgICByZXR1cm4gdGVtcGxhdGU7XG4gICAgfVxufVxuIiwiY29uc3QgeyB1cmwsIHJvdXRlcyB9ID0gd2luZG93O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBOb3RpZmljYXRpb25zRXZlbnRUcmFja2VyIHtcbiAgICBjb25zdHJ1Y3RvcihidXMpIHtcblxuICAgICAgICB0aGlzLmJ1cyA9IGJ1cztcbiAgICAgICAgdGhpcy5fd2Vic2l0ZUlkID0gd2luZG93Lk92ZXJEcml2ZS50ZW5hbnQ7XG5cbiAgICAgICAgdGhpcy5idXNcbiAgICAgICAgICAgIC5vbigndGl0bGU6Ym9ycm93OnN1Y2Nlc3MnLCAgICAgICAgIChwYXJhbXMpID0+IHRoaXMucHVzaERpc21pc3NhbE5vdGlmaWNhdGlvbihwYXJhbXMsICdib3Jyb3cnKSlcbiAgICAgICAgICAgIC5vbigndGl0bGU6aG9sZDpzdWNjZXNzJywgICAgICAgICAgIChwYXJhbXMpID0+IHRoaXMucHVzaERpc21pc3NhbE5vdGlmaWNhdGlvbihwYXJhbXMsICdob2xkJykpXG4gICAgICAgICAgICAub24oJ3RpdGxlOmhvbGQtY2FuY2VsOnN1Y2Nlc3MnLCAgICAocGFyYW1zKSA9PiB0aGlzLnB1c2hEaXNtaXNzYWxOb3RpZmljYXRpb24ocGFyYW1zLCAnY2FuY2VsLWhvbGQnKSlcbiAgICAgICAgICAgIC5vbigndGl0bGU6c3VzcGVuZCcsICAgICAgICAgICAgICAgIChwYXJhbXMpID0+IHRoaXMucHVzaERpc21pc3NhbE5vdGlmaWNhdGlvbihwYXJhbXMsICdzdXNwZW5kLWhvbGQnKSlcbiAgICAgICAgICAgIC5vbigndGl0bGU6c3VzcGVuZDpjYW5jZWxsZWQnLCAgICAgIChwYXJhbXMpID0+IHRoaXMucHVzaERpc21pc3NhbE5vdGlmaWNhdGlvbihwYXJhbXMsICdjYW5jZWwtc3VzcGVuZGVkLWhvbGQnKSlcbiAgICAgICAgO1xuICAgIH1cblxuICAgIHB1c2hEaXNtaXNzYWxOb3RpZmljYXRpb24oe3RpdGxlTW9kZWwsIGNvbnRleHR9LCBldmVudCl7XG4gICAgICAgIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+XG4gICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6IHVybChyb3V0ZXMucmVzdC5wYXRyb25Ob3RpZmljYXRpb25zLmRpc21pc3NCeUFjdGlvbiksXG4gICAgICAgICAgICB0eXBlOiAnUE9TVCcsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBldmVudCxcbiAgICAgICAgICAgICAgICB3ZWJzaXRlSWQ6IHRoaXMuX3dlYnNpdGVJZCxcbiAgICAgICAgICAgICAgICB0aXRsZUlkOiB0aXRsZU1vZGVsLmlkXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5kb25lKChyZXNwb25zZSkgPT4gcmVzb2x2ZShyZXNwb25zZSkpXG4gICAgICAgIC5mYWlsKCh4aHIsIHN0YXR1cywgZXJyKSA9PiByZWplY3QoZXJyKSkpXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgIHdpbmRvdy5Mb2dnZXIubG9nKCdlcnJvcicsICdGYWlsZWQgdG8gc2VuZCBkaXNtaXNzLWJ5LWNpcmMtYWN0aW9uIG5vdGlmaWNhdGlvbicsIHttZXNzYWdlOiBlcnJvci5zdGF0dXNUZXh0IHx8IGVycm9yfSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn0iLCJpbXBvcnQgc3ZnTG9hZGVyIGZyb20gJy4uLy4uL3V0aWwvc3ZnTG9hZGVyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUG9wb3ZlciBleHRlbmRzIEJhY2tib25lLlZpZXcge1xuXG4gICAgY29uc3RydWN0b3Iob3B0cyl7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG5cbiAgICAgICAgaWYoIW9wdHMudGFyZ2V0KXtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigneW91IG11c3Qgc3BlY2lmeSBhIHRhcmdldCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb250ZW50cyA9IG9wdHMuY29udGVudHM7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gb3B0cy50YXJnZXQ7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNsYXNzTmFtZSA9IG9wdHMuY2xhc3NOYW1lO1xuICAgICAgICB0aGlzLnJlcXVlc3RlZFdpZHRoID0gb3B0cy53aWR0aCB8fCAzMDA7XG4gICAgICAgIHRoaXMucmVuZGVyU3ZnT25Ub2dnbGUgPSBvcHRzLnJlbmRlclN2Z09uVG9nZ2xlIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLmFjdGlvbnMgPSBvcHRzLmFjdGlvbnM7XG4gICAgICAgIHRoaXMuaGlkZUFjdGlvbnMgPSBvcHRzLmhpZGVBY3Rpb25zO1xuXG4gICAgICAgIHRoaXMudGFyZ2V0Lm9uKCdjbGljaycsIChlKSA9PiB7XG4gICAgICAgICAgICB0aGlzLnRvZ2dsZSgpO1xuICAgICAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0UGFyYW1zKCkge1xuICAgICAgICBsZXQgdG9wTWFyZ2luID0gNjtcbiAgICAgICAgbGV0IHNpZGVNYXJnaW4gPSA1O1xuICAgICAgICBsZXQgY2FyZXRTcGFjZXIgPSA0O1xuICAgICAgICBsZXQgdGFyZ2V0T2Zmc2V0ID0gdGhpcy50YXJnZXQub2Zmc2V0KCk7XG4gICAgICAgIGxldCB0YXJnZXRXaWR0aCA9IHRoaXMudGFyZ2V0LndpZHRoKCk7XG4gICAgICAgIHRhcmdldE9mZnNldC5yaWdodCA9IHRhcmdldE9mZnNldC5sZWZ0ICsgdGFyZ2V0V2lkdGg7XG4gICAgICAgIGxldCB0YXJnZXRIZWlnaHQgPSB0aGlzLnRhcmdldC5oZWlnaHQoKTtcbiAgICAgICAgbGV0IHZpZXdwb3J0V2lkdGggPSAkKHdpbmRvdykud2lkdGgoKTtcbiAgICAgICAgbGV0IHZpZXdwb3J0SGVpZ2h0ID0gJCh3aW5kb3cpLmhlaWdodCgpO1xuICAgICAgICBsZXQgd2lkdGggPSBNYXRoLm1pbih0aGlzLnJlcXVlc3RlZFdpZHRoIC0gKDIgKiBzaWRlTWFyZ2luKSwgdmlld3BvcnRXaWR0aCk7XG4gICAgICAgIGxldCB4T3ZlcmxhcCA9IHdpZHRoIC0gdGFyZ2V0V2lkdGg7XG4gICAgICAgIGxldCBzcGFjZVRvTGVmdCA9IHRhcmdldE9mZnNldC5sZWZ0O1xuICAgICAgICBsZXQgc3BhY2VUb1JpZ2h0ID0gdmlld3BvcnRXaWR0aCAtIHRhcmdldE9mZnNldC5yaWdodDtcbiAgICAgICAgbGV0IGxlZnRIYXNSb29tID0gc3BhY2VUb0xlZnQgPj0gKHhPdmVybGFwIC8gMik7XG4gICAgICAgIGxldCByaWdodEhhc1Jvb20gPSBzcGFjZVRvUmlnaHQgPj0gKHhPdmVybGFwIC8gMik7XG5cblxuICAgICAgICAvLyBwcmVmZXIgY2VudGVyaW5nIG9uIHRoZSB0YXJnZXQuICBUaGlzIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBmb3VuZGF0aW9uIHBvcG92ZXJzIGJ1dCBtdWNoIGVhc2llciB0byByZWFzb24gYWJvdXQuXG4gICAgICAgIGxldCBsZWZ0LCByaWdodCwgdG9wLCBib3R0b20sIGNhcmV0TGVmdCwgY2FyZXRSaWdodCwgYWxpZ25tZW50Q2xhc3M7XG5cbiAgICAgICAgaWYgKGxlZnRIYXNSb29tICYmIHJpZ2h0SGFzUm9vbSl7XG4gICAgICAgICAgICAvLyBob3Jpem9udGFsbHkgY2VudGVyZWQgb24gdGhlIHRhcmdldCBlbGVtZW50XG4gICAgICAgICAgICBsZWZ0ID0gdGFyZ2V0T2Zmc2V0LmxlZnQgLSAoeE92ZXJsYXAgLyAyKTtcbiAgICAgICAgICAgIHJpZ2h0ID0gdmlld3BvcnRXaWR0aCAtIHRhcmdldE9mZnNldC5yaWdodCAtICh4T3ZlcmxhcCAvIDIpO1xuICAgICAgICAgICAgY2FyZXRMZWZ0ID0gd2lkdGggLyAyO1xuICAgICAgICAgICAgYWxpZ25tZW50Q2xhc3MgPSAncG9wb3ZlckNlbnRlcic7XG4gICAgICAgIH0gZWxzZSBpZiAoc3BhY2VUb1JpZ2h0ID49IHhPdmVybGFwKXtcbiAgICAgICAgICAgIC8vIGFsaWduIHRoZSBsZWZ0IGVkZ2UgdG8gdGhlIHRhcmdldCdzIGxlZnQgZWRnZVxuICAgICAgICAgICAgbGVmdCA9IHRhcmdldE9mZnNldC5sZWZ0O1xuICAgICAgICAgICAgcmlnaHQgPSB2aWV3cG9ydFdpZHRoIC0gdGFyZ2V0T2Zmc2V0LnJpZ2h0IC0geE92ZXJsYXA7XG4gICAgICAgICAgICBjYXJldExlZnQgPSBjYXJldFNwYWNlcjtcbiAgICAgICAgICAgIGFsaWdubWVudENsYXNzID0gJ3BvcG92ZXJMZWZ0JztcbiAgICAgICAgfSBlbHNlIGlmIChzcGFjZVRvTGVmdCA+PSB4T3ZlcmxhcCl7XG4gICAgICAgICAgICAvLyBhbGlnbiB0aGUgcmlnaHQgZWRnZSB0byB0aGUgdGFyZ2V0J3MgcmlnaHQgZWRnZVxuICAgICAgICAgICAgbGVmdCA9IHRhcmdldE9mZnNldC5sZWZ0IC0geE92ZXJsYXA7XG4gICAgICAgICAgICByaWdodCA9IHZpZXdwb3J0V2lkdGggLSB0YXJnZXRPZmZzZXQucmlnaHQ7XG4gICAgICAgICAgICBjYXJldFJpZ2h0ID0gY2FyZXRTcGFjZXI7XG4gICAgICAgICAgICBhbGlnbm1lbnRDbGFzcyA9ICdwb3BvdmVyUmlnaHQnO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gdGhlIHZpZXdwb3J0IGlzIG5hcnJvd2VyIHRoYW4gdGhlIGRlc2lyZWQgcG9wb3ZlciB3aWR0aC4gRmlsbCB0aGUgYXZhaWxhYmxlIHNwYWNlLlxuICAgICAgICAgICAgbGVmdCA9IDA7XG4gICAgICAgICAgICByaWdodCA9IDA7XG4gICAgICAgICAgICBjYXJldExlZnQgPSB0YXJnZXRPZmZzZXQubGVmdCArICh0YXJnZXRXaWR0aCAvIDIpO1xuICAgICAgICAgICAgYWxpZ25tZW50Q2xhc3MgPSAncG9wb3ZlckZpdCc7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgb3BlblVwID0gKCh0aGlzLnRhcmdldFswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS50b3AgKyAodGFyZ2V0SGVpZ2h0IC8gMikpIC8gdmlld3BvcnRIZWlnaHQpID4gMC42NjY2NjY7XG4gICAgICAgIGlmICghb3BlblVwKXtcbiAgICAgICAgICAgIHRvcCA9IHRhcmdldE9mZnNldC50b3AgKyB0b3BNYXJnaW4gKyB0YXJnZXRIZWlnaHQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBib3R0b20gPSB2aWV3cG9ydEhlaWdodCAtIHRhcmdldE9mZnNldC50b3AgKyB0b3BNYXJnaW47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWFpbjoge1xuICAgICAgICAgICAgICAgIHRvcCxcbiAgICAgICAgICAgICAgICBib3R0b20sXG4gICAgICAgICAgICAgICAgbGVmdCxcbiAgICAgICAgICAgICAgICByaWdodFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGNhcmV0OiB7XG4gICAgICAgICAgICAgICAgbGVmdDogY2FyZXRMZWZ0LFxuICAgICAgICAgICAgICAgIHJpZ2h0OiBjYXJldFJpZ2h0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZGlyZWN0aW9uQ2xhc3M6IG9wZW5VcCA/ICdwb3BvdmVyVXAnIDogJ3BvcG92ZXJEb3duJyxcbiAgICAgICAgICAgIGFsaWdubWVudENsYXNzXG4gICAgICAgIH07XG4gICAgfVxuXG5cbiAgICByZW5kZXIoKSB7XG4gICAgICAgIGxldCBwYXJhbXMgPSB0aGlzLmdldFBhcmFtcygpO1xuXG4gICAgICAgIHRoaXMuJGVsLmVtcHR5KCk7XG4gICAgICAgIHRoaXMuJGVsID0gJChgXG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiJHt0aGlzLmNsYXNzTmFtZX0gcG9wb3ZlckNhbnZhcyAke3BhcmFtcy5kaXJlY3Rpb25DbGFzc30gJHtwYXJhbXMuYWxpZ25tZW50Q2xhc3N9XCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcG92ZXJcIiBzdHlsZT1cIlxuICAgICAgICAgICAgICAgICAgICAke3BhcmFtcy5tYWluLnRvcCA/ICBgdG9wOiR7cGFyYW1zLm1haW4udG9wfXB4O2AgOiAnJ31cbiAgICAgICAgICAgICAgICAgICAgJHtwYXJhbXMubWFpbi5ib3R0b20gPyAgYGJvdHRvbToke3BhcmFtcy5tYWluLmJvdHRvbX1weDtgIDogJyd9XG4gICAgICAgICAgICAgICAgICAgIGxlZnQ6JHtwYXJhbXMubWFpbi5sZWZ0fXB4O1xuICAgICAgICAgICAgICAgICAgICByaWdodDoke3BhcmFtcy5tYWluLnJpZ2h0fXB4XCJcbiAgICAgICAgICAgICAgICAgICAgYXJpYS1saXZlPVwicG9saXRlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwicG9wb3ZlckNhcmV0XCIgc3R5bGU9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwYXJhbXMuY2FyZXQucmlnaHQgPyAgYHJpZ2h0OiR7cGFyYW1zLmNhcmV0LnJpZ2h0fXB4O2AgOiAnJ31cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJHtwYXJhbXMuY2FyZXQubGVmdCA/ICBgbGVmdDoke3BhcmFtcy5jYXJldC5sZWZ0fXB4O2AgOiAnJ31cIiA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cInBvcG92ZXJDYXJldFRpcFwiPjwvZGl2PlxuICAgICAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAke3RoaXMuY29udGVudHN9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgYCk7XG5cbiAgICAgICAgJCgnYm9keScpLmFwcGVuZCh0aGlzLiRlbCk7XG4gICAgICAgICQoJ2JvZHknKS5jbGljaygoKSA9PiB0aGlzLmhpZGUoKSk7XG4gICAgfVxuXG4gICAgaGlkZSgpIHtcbiAgICAgICAgdGhpcy4kZWwucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMuZW5hYmxlZCA9IGZhbHNlO1xuICAgIH1cblxuICAgIHNob3coKXtcbiAgICAgICAgdGhpcy5yZW5kZXIoKTtcbiAgICAgICAgaWYodGhpcy5yZW5kZXJTdmdPblRvZ2dsZSl7XG4gICAgICAgICAgICBzdmdMb2FkZXIoKTtcbiAgICAgICAgfVxuICAgICAgICBpZih0aGlzLmFjdGlvbnMpe1xuICAgICAgICAgICAgdGhpcy5hY3Rpb25zKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lbmFibGVkID0gdHJ1ZTtcbiAgICB9XG5cbiAgICB0b2dnbGUoKXtcbiAgICAgICAgaWYgKHRoaXMuZW5hYmxlZCl7XG4gICAgICAgICAgICBpZih0aGlzLmhpZGVBY3Rpb25zKXtcbiAgICAgICAgICAgICAgICB0aGlzLmhpZGVBY3Rpb25zKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2hvdygpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiaW1wb3J0IEJhc2VDb2xsZWN0aW9uIGZyb20gJy4uLy4uLy4uL2NvbGxlY3Rpb25zL2Jhc2UnO1xuaW1wb3J0IEF1dG9jb21wbGV0aW9uTW9kZWwgZnJvbSAnLi4vbW9kZWxzL2F1dG9jb21wbGV0aW9uJztcbmltcG9ydCB7ZGVjb2RlRW50aXRpZXN9IGZyb20gJy4uLy4uLy4uL3V0aWwvdGV4dCc7XG5pbXBvcnQgZW5zdXJlU2ltcGxlUmVxdWVzdCBmcm9tICcuLi8uLi8uLi91dGlsL3JlcXVlc3RzL2Vuc3VyZVNpbXBsZVJlcXVlc3QnO1xuXG5jb25zdCBBdXRvY29tcGxldGlvbnNDb2xsZWN0aW9uID0gQmFzZUNvbGxlY3Rpb24uZXh0ZW5kKHtcblxuICAgIG1vZGVsOiBBdXRvY29tcGxldGlvbk1vZGVsLFxuXG4gICAgdXJsKCkge1xuICAgICAgICByZXR1cm4gYCR7T3ZlckRyaXZlLmF1dG9jb21wbGV0ZUhvc3R9L2F1dG9jb21wbGV0ZWA7XG4gICAgfSxcblxuICAgIGluaXRpYWxpemUobW9kZWxzLCB7cXVlcnksIGNvdW50ID0gMTUsIHNvcnRCeSA9ICdzY29yZSd9KSB7XG4gICAgICAgIHRoaXMucXVlcnkgPSBxdWVyeTtcbiAgICAgICAgdGhpcy5jb3VudCA9IGNvdW50O1xuICAgICAgICB0aGlzLnNvcnRCeSA9IHNvcnRCeTtcbiAgICAgICAgdGhpcy5hcGlLZXkgPSBPdmVyRHJpdmUuYXV0b2NvbXBsZXRlQXBpS2V5O1xuXG4gICAgICAgIHRoaXMubWVkaWFUeXBlID0gdGhpcy5fZ2V0U3VwcG9ydGVkTWVkaWFUeXBlcygpO1xuXG4gICAgICAgIHRoaXMubGlzdGVuVG8odGhpcy5xdWVyeSwgJ2NoYW5nZTp0ZXh0JywgdGhpcy50ZXh0Q2hhbmdlSGFuZGxlci5iaW5kKHRoaXMpKTtcbiAgICAgICAgdGhpcy5vbignc3luYycsIHRoaXMuc21hcnRTeW5jVHJpZ2dlcik7XG4gICAgfSxcblxuICAgIHRleHRDaGFuZ2VIYW5kbGVyKCkge1xuICAgICAgICBpZiAodGhpcy5xdWVyeS5pc1ZhbGlkRm9yQXV0b2NvbXBsZXRlKCkpIHtcbiAgICAgICAgICAgIC8vIFRyeSB0byBjYW5jZWwgdGhlIHByZXZpb3VzIFhIUiByZXF1ZXN0IGlmIGl0IGhhcyBub3QgYWxyZWFkeSByZXNvbHZlZCwgb3RoZXJ3aXNlIG5vb3BcbiAgICAgICAgICAgIHRoaXMuX2xhc3RGZXRjaCAmJiB0aGlzLl9sYXN0RmV0Y2guYWJvcnQoKTtcblxuICAgICAgICAgICAgdGhpcy5fbGFzdEZldGNoID0gdGhpcy5mZXRjaCgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHF1ZXJ5UGFyYW1zKCkge1xuICAgICAgICBsZXQgcGFyYW1zID0ge3F1ZXJ5OiB0aGlzLnF1ZXJ5LmdldCgndGV4dCcpLCBtYXhTaXplOiB0aGlzLmNvdW50LCBjYXRlZ29yeVNpemU6IHRoaXMuY291bnQsIHNvcnRCeTogdGhpcy5zb3J0QnksIG1lZGlhVHlwZTogdGhpcy5tZWRpYVR5cGV9O1xuICAgICAgICBpZiAoT3ZlckRyaXZlLmF1dG9jb21wbGV0ZUhvc3QgIT09IE92ZXJEcml2ZS50aHVuZGVySG9zdCkge1xuICAgICAgICAgICAgcGFyYW1zWydhcGkta2V5J10gPSB0aGlzLmFwaUtleTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCByZXN1bHQgPSB3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdmaWx0ZXItb3V0LW50YycpID8gJC5wYXJhbShwYXJhbXMsIHRydWUpIDogJC5wYXJhbShwYXJhbXMpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0sXG5cbiAgICBmZXRjaCgpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IHRoaXMucXVlcnlQYXJhbXMoKTtcbiAgICAgICAgcmV0dXJuIGVuc3VyZVNpbXBsZVJlcXVlc3QoQmFzZUNvbGxlY3Rpb24ucHJvdG90eXBlLmZldGNoLmJpbmQodGhpcywge2RhdGF9KSk7XG4gICAgfSxcblxuICAgIHNtYXJ0U3luY1RyaWdnZXIoY29sbGVjdGlvbiwgcmVzcG9uc2UsIG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKG9wdGlvbnMuZGF0YSA9PT0gdGhpcy5xdWVyeVBhcmFtcygpKSB7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ3NtYXJ0c3luYycpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHBhcnNlKHJlc3BvbnNlKSB7XG4gICAgICAgIGNvbnN0IG1hcHBlZCA9IF8ubWFwKHJlc3BvbnNlLml0ZW1zLCAoaXRlbSwgaW5kZXgpID0+ICh7dGV4dDogZGVjb2RlRW50aXRpZXMoaXRlbS50ZXh0KSwgZmllbGQ6IGl0ZW0uZmllbGQsIGluZGV4fSkpO1xuICAgICAgICByZXR1cm4gXy51bmlxKG1hcHBlZCwgKGl0ZW0pID0+IGl0ZW0udGV4dC50b1VwcGVyQ2FzZSgpKTtcbiAgICB9LFxuXG4gICAgX2dldFN1cHBvcnRlZE1lZGlhVHlwZXMoKSB7XG4gICAgICAgIGxldCBtZWRpYVR5cGUgPSBbXTtcblxuICAgICAgICBjb25zdCBzdXBwb3J0ZWRGb3JtYXRzID0gd2luZG93Lk92ZXJEcml2ZS5zdXBwb3J0ZWRGb3JtYXRzO1xuICAgICAgICBpZiAoc3VwcG9ydGVkRm9ybWF0cyAmJiBfLmlzQXJyYXkoc3VwcG9ydGVkRm9ybWF0cykpIHtcbiAgICAgICAgICAgIC8vIFJvb21zIG9ubHkgaGF2ZSB0aGUgZm9ybWF0IGNsYXNzLCBzbyB3ZSdyZSBkb2luZyBzb21ldGhpbmcgZ3Jvc3MgYW5kXG4gICAgICAgICAgICAvLyBzdHJpcHBpbmcgdGhlIGZvcm1hdCBjbGFzcyBvZmYgb2YgZWFjaCBmb3JtYXQgYmFzZWQgb24gc3RyaW5nIGNvbnZlbnRpb25cbiAgICAgICAgICAgIG1lZGlhVHlwZSA9IHN1cHBvcnRlZEZvcm1hdHMubWFwKChmb3JtYXQpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgZm9ybWF0Q2xhc3MgPSBmb3JtYXQuaWQ7XG4gICAgICAgICAgICAgICAgY29uc3QgY2xhc3NFbmRJbmRleCA9IGZvcm1hdENsYXNzLmluZGV4T2YoJy0nKTtcbiAgICAgICAgICAgICAgICBpZiAoY2xhc3NFbmRJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0Q2xhc3MgPSBmb3JtYXRDbGFzcy5zdWJzdHJpbmcoMCwgY2xhc3NFbmRJbmRleCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBmb3JtYXRDbGFzcztcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgbWVkaWFUeXBlID0gbWVkaWFUeXBlLmZpbHRlcigodmFsdWUsIGluZGV4KSA9PiBtZWRpYVR5cGUuaW5kZXhPZih2YWx1ZSkgPT09IGluZGV4KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IHJvb20gPSB3aW5kb3cuT3ZlckRyaXZlLmN1cnJlbnRSb29tO1xuICAgICAgICBjb25zdCByb29tRm9ybWF0cyA9IHJvb20gJiYgcm9vbS5maWx0ZXJzICYmIHJvb20uZmlsdGVycy5tZWRpYVR5cGU7XG4gICAgICAgIGlmIChyb29tRm9ybWF0cykge1xuICAgICAgICAgICAgbWVkaWFUeXBlID0gXyhtZWRpYVR5cGUpLmludGVyc2VjdGlvbihyb29tRm9ybWF0cyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZih3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdmaWx0ZXItb3V0LW50YycpKSB7XG4gICAgICAgICAgICB2YXIgd2hpdGVsaXN0ZWRNZWRpYVR5cGVzID0gd2luZG93Lk92ZXJEcml2ZS53aGl0ZWxpc3RlZE1lZGlhVHlwZXMuc3BsaXQoJywnKTtcbiAgICAgICAgICAgIG1lZGlhVHlwZSA9IG1lZGlhVHlwZS5maWx0ZXIodHlwZSA9PiB3aGl0ZWxpc3RlZE1lZGlhVHlwZXMuaW5jbHVkZXModHlwZSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG1lZGlhVHlwZTtcbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQXV0b2NvbXBsZXRpb25zQ29sbGVjdGlvbjtcbiIsImltcG9ydCBRdWlja1NlYXJjaE1vZGVsIGZyb20gJy4vbW9kZWxzL3F1aWNrX3NlYXJjaCc7XG5pbXBvcnQgQXV0b2NvbXBsZXRpb25zQ29sbGVjdGlvbiBmcm9tICcuL2NvbGxlY3Rpb25zL2F1dG9jb21wbGV0aW9ucyc7XG5pbXBvcnQgU2VhcmNoQmFyVmlldyBmcm9tICcuL3ZpZXdzL3NlYXJjaF9iYXInO1xuaW1wb3J0IFNlYXJjaEJhckF1dG9jb21wbGV0ZVZpZXcgZnJvbSAnLi92aWV3cy9zZWFyY2hfYmFyX2F1dG9jb21wbGV0ZSc7XG5pbXBvcnQgQXV0b2NvbXBsZXRpb25zVmlldyBmcm9tICcuL3ZpZXdzL2F1dG9jb21wbGV0aW9ucyc7XG5jb25zdCBCYWNrYm9uZSA9IHdpbmRvdy5CYWNrYm9uZTtcblxuY29uc3QgY3JlYXRlQ29tcG9uZW50ID0gKHtzZWFyY2hFbCwgYXV0b2NvbXBsZXRpb25zRWwsIHRvZ2dsZVNlYXJjaEVsLCBvcHRpb25zfSkgPT4ge1xuICAgIGNvbnN0IHF1ZXJ5ID0gbmV3IFF1aWNrU2VhcmNoTW9kZWwoKTtcbiAgICBjb25zdCBmZWF0dXJlTWFuYWdlciA9IHdpbmRvdy5mZWF0dXJlTWFuYWdlcjtcblxuICAgIC8vIERpc2FibGUgYXV0b2NvbXBsZXRlIGZvciByb29tc1xuICAgIGlmIChmZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ2F1dG9jb21wbGV0ZScpKSB7XG4gICAgICAgIGNvbnN0IGF1dG9jb21wbGV0ZUJ1cyA9IF8uZXh0ZW5kKHt9LCBCYWNrYm9uZS5FdmVudHMpO1xuICAgICAgICBjb25zdCBzZWFyY2hCYXJBdXRvY29tcGxldGUgPSBuZXcgU2VhcmNoQmFyQXV0b2NvbXBsZXRlVmlldyh7ZWw6IHNlYXJjaEVsLCB0b2dnbGVTZWFyY2hFbCwgcXVlcnksIGF1dG9jb21wbGV0ZUJ1c30pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgICAgIGNvbnN0IGF1dG9jb21wbGV0aW9ucyA9IG5ldyBBdXRvY29tcGxldGlvbnNDb2xsZWN0aW9uKG51bGwsIHtxdWVyeX0pO1xuICAgICAgICBjb25zdCB2aWV3T3B0aW9ucyA9IHtcbiAgICAgICAgICAgIHF1ZXJ5LFxuICAgICAgICAgICAgYXV0b2NvbXBsZXRlQnVzLFxuICAgICAgICAgICAgZWw6IGF1dG9jb21wbGV0aW9uc0VsLFxuICAgICAgICAgICAgY29sbGVjdGlvbjogYXV0b2NvbXBsZXRpb25zLFxuICAgICAgICAgICAgb3B0aW9uc1xuICAgICAgICB9O1xuICAgICAgICBjb25zdCBhdXRvY29tcGxldGlvbnNWaWV3ID0gbmV3IEF1dG9jb21wbGV0aW9uc1ZpZXcodmlld09wdGlvbnMpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVudXNlZC12YXJzXG4gICAgfSBlbHNlIHtcbiAgICAgICAgY29uc3Qgc2VhcmNoQmFyID0gbmV3IFNlYXJjaEJhclZpZXcoe2VsOiBzZWFyY2hFbCwgcXVlcnksIG9wdGlvbnM6IHskdG9nZ2xlU2VhcmNoOiB0b2dnbGVTZWFyY2hFbH19KTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bnVzZWQtdmFyc1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUNvbXBvbmVudDtcbiIsImltcG9ydCBCYXNlTW9kZWwgZnJvbSAnLi4vLi4vLi4vbW9kZWxzL2Jhc2UnO1xuXG5jb25zdCBBdXRvY29tcGxldGlvbiA9IEJhc2VNb2RlbC5leHRlbmQoe1xuXG4gICAgZGVmYXVsdHMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0ZXh0OiAnJyxcbiAgICAgICAgICAgIGFjdGl2ZTogZmFsc2VcbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgcGFyc2UocmVzdWx0KSB7XG4gICAgICAgIHJlc3VsdC50ZXh0ID0gdGhpcy5yZXBsYWNlSHRtbChyZXN1bHQudGV4dCk7XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIHJlcGxhY2VIdG1sKHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHRleHQucmVwbGFjZSgnPHN1cD5UTTwvc3VwPicsICfihKInKTtcbiAgICB9XG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQXV0b2NvbXBsZXRpb247XG4iLCJpbXBvcnQgQmFzZU1vZGVsIGZyb20gJy4uLy4uLy4uL21vZGVscy9iYXNlJztcblxuY29uc3QgQVVUT0NPTVBMRVRFX01JTklNVU0gPSAxO1xuY29uc3QgU0VBUkNIX01JTklNVU0gPSAxO1xuXG5jb25zdCBRdWlja1NlYXJjaE1vZGVsID0gQmFzZU1vZGVsLmV4dGVuZCh7XG4gICAgZGVmYXVsdHMoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0ZXh0OiAnJyxcbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgaXNWYWxpZEZvckF1dG9jb21wbGV0ZSgpIHtcbiAgICAgICAgY29uc3QgcXVlcnkgPSB0aGlzLmdldCgndGV4dCcpO1xuICAgICAgICBjb25zdCBxdWVyeUlzT25seVNwYWNlcyA9IHF1ZXJ5LnJlcGxhY2UoL1xccy9nLCAnJykubGVuZ3RoID09PSAwO1xuICAgICAgICBjb25zdCBxdWVyeU1lZXRzQXV0b0NvbXBsZXRlTWluID1cbiAgICAgICAgICAgIHRoaXMuZ2V0KCd0ZXh0JykubGVuZ3RoID49IEFVVE9DT01QTEVURV9NSU5JTVVNO1xuXG4gICAgICAgIHJldHVybiAhcXVlcnlJc09ubHlTcGFjZXMgJiYgcXVlcnlNZWV0c0F1dG9Db21wbGV0ZU1pbjtcbiAgICB9LFxuXG4gICAgaXNWYWxpZEZvclNlYXJjaCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KCd0ZXh0JykubGVuZ3RoID49IFNFQVJDSF9NSU5JTVVNO1xuICAgIH0sXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgUXVpY2tTZWFyY2hNb2RlbDtcbiIsImltcG9ydCBCYXNlVmlldyBmcm9tICcuLi8uLi8uLi92aWV3cy9iYXNlJztcbmltcG9ydCB7c3Vycm91bmRTdWJ0ZXh0fSBmcm9tICcuLi8uLi8uLi91dGlsL3RleHQnO1xuY29uc3QgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3QgcGF0aCA9IHJlcXVpcmUoJ3BhdGgnKTtcbmNvbnN0IHRlbXBsYXRlID0gZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcvLi4vdGVtcGxhdGVzL2F1dG9jb21wbGV0aW9uLmh0bWwnKSwgJ3V0ZjgnKTtcblxuY29uc3QgQXV0b2NvbXBsZXRpb24gPSBCYXNlVmlldy5leHRlbmQoe1xuXG4gICAgdGVtcGxhdGU6IF8udGVtcGxhdGUodGVtcGxhdGUsIHt2YXJpYWJsZTogJ2RhdGEnfSksXG5cbiAgICBpbml0aWFsaXplKHttb2RlbCwgcXVlcnl9KSB7XG4gICAgICAgIHRoaXMubW9kZWwgPSBtb2RlbDtcbiAgICAgICAgdGhpcy5xdWVyeSA9IHF1ZXJ5O1xuICAgICAgICB0aGlzLmxpc3RlblRvKHRoaXMubW9kZWwsICdjaGFuZ2U6YWN0aXZlJywgdGhpcy5yZW5kZXIpO1xuICAgIH0sXG5cbiAgICBkZWxldGVWaWV3QW5kTW9kZWwoKSB7XG4gICAgICAgIHRoaXMubW9kZWwuZGVzdHJveSgpO1xuICAgICAgICB0aGlzLmRlbGV0ZVZpZXcoKTtcbiAgICB9LFxuXG4gICAgZGVsZXRlVmlldygpIHtcbiAgICAgICAgdGhpcy5yZW1vdmUoKTtcbiAgICAgICAgdGhpcy51bmJpbmQoKTtcbiAgICB9LFxuXG4gICAgZ2V0VGVtcGxhdGVEYXRhKCkge1xuICAgICAgICBjb25zdCBocmVmID0gd2luZG93LnVybCh3aW5kb3cucm91dGVzLnNlYXJjaCwge1xuICAgICAgICAgICAgcXVlcnk6IHRoaXMubW9kZWwuZ2V0KCd0ZXh0JylcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIF8uZXh0ZW5kKHt9LCB0aGlzLm1vZGVsLmF0dHJpYnV0ZXMsIHtcbiAgICAgICAgICAgIGhyZWYsXG4gICAgICAgICAgICByZXN1bHRUZXh0OiBzdXJyb3VuZFN1YnRleHQoe1xuICAgICAgICAgICAgICAgIHRleHQ6IHRoaXMubW9kZWwuZ2V0KCd0ZXh0JyksXG4gICAgICAgICAgICAgICAgbWF0Y2hlcjogdGhpcy5xdWVyeS5nZXQoJ3RleHQnKSxcbiAgICAgICAgICAgICAgICB0YWc6ICdiJyxcbiAgICAgICAgICAgICAgICBpZ25vcmVDYXNlOiB0cnVlXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIGZpZWxkOiB3aW5kb3cuaHRtbCgnYXV0b0NvbXBsZXRlLicgKyB0aGlzLm1vZGVsLmdldCgnZmllbGQnKSlcbiAgICAgICAgfSk7XG4gICAgfVxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IEF1dG9jb21wbGV0aW9uO1xuIiwiaW1wb3J0IENvbGxlY3Rpb25WaWV3IGZyb20gJy4uLy4uLy4uL3ZpZXdzL2NvbGxlY3Rpb24nO1xuaW1wb3J0IEF1dG9jb21wbGV0ZVZpZXcgZnJvbSAnLi9hdXRvY29tcGxldGlvbic7XG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3QgdGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmMocGF0aC5qb2luKF9fZGlybmFtZSwgJy8uLi90ZW1wbGF0ZXMvYXV0b2NvbXBsZXRpb25zLmh0bWwnKSwgJ3V0ZjgnKTtcblxuY29uc3QgQXV0b2NvbXBsZXRpb25zID0gQ29sbGVjdGlvblZpZXcuZXh0ZW5kKHtcblxuICAgIHRlbXBsYXRlOiBfLnRlbXBsYXRlKHRlbXBsYXRlKSxcblxuICAgIGluaXRpYWxpemUoe2VsLCBxdWVyeSwgY29sbGVjdGlvbiwgYXV0b2NvbXBsZXRlQnVzLCBvcHRpb25zID0ge319KSB7XG4gICAgICAgIHRoaXMuZWwgPSBlbDtcbiAgICAgICAgdGhpcy5jb2xsZWN0aW9uID0gY29sbGVjdGlvbjtcbiAgICAgICAgdGhpcy5xdWVyeSA9IHF1ZXJ5O1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJ1cyA9IGF1dG9jb21wbGV0ZUJ1cztcbiAgICAgICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgdGhpcy4kYWR2YW5jZWRTZWFyY2ggPSAkKCcuanMtZGVza3RvcEFkdmFuY2VkU2VhcmNoJyk7XG4gICAgICAgIHRoaXMuJGljb25DbGVhciA9ICQoJy5pY29uLWNsZWFyJyk7XG4gICAgICAgIHRoaXMubGlzdGVuVG8odGhpcy5jb2xsZWN0aW9uLCAncmVzZXQnLCB0aGlzLmVtcHR5RWxBbmRDbGVhckFjdGl2ZSk7XG4gICAgICAgIHRoaXMubGlzdGVuVG8odGhpcy5jb2xsZWN0aW9uLCAnc21hcnRzeW5jJywgdGhpcy5zbWFydFJlbmRlcik7XG4gICAgICAgIHRoaXMubGlzdGVuVG8oYXV0b2NvbXBsZXRlQnVzLCAncXVpY2tzZWFyY2g6Ymx1cicsIHRoaXMuZW1wdHlFbEFuZENsZWFyQWN0aXZlKTtcbiAgICAgICAgdGhpcy5saXN0ZW5UbyhhdXRvY29tcGxldGVCdXMsICdxdWlja3NlYXJjaDpmb2N1cycsIHRoaXMuc21hcnRSZW5kZXIpO1xuICAgICAgICB0aGlzLmxpc3RlblRvKGF1dG9jb21wbGV0ZUJ1cywgJ3F1aWNrc2VhcmNoOmhpZ2hsaWdodEl0ZW0nLCB0aGlzLmhpZ2hsaWdodEl0ZW0pO1xuICAgIH0sXG5cbiAgICBlbXB0eUVsQW5kQ2xlYXJBY3RpdmUoKSB7XG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMuZGVza3RvcCkge1xuICAgICAgICAgICAgdGhpcy4kYWR2YW5jZWRTZWFyY2guc2hvdygpO1xuICAgICAgICB9XG4gICAgICAgIC8vIEhhY2sgdW50aWwgYWxsIHRoZSBsb2dpYyBpcyBtb3ZlZCBpbnRvIHZpZXdzXG4gICAgICAgIGlmICh0aGlzLm9wdGlvbnMubW9iaWxlKSB7XG4gICAgICAgICAgICB0aGlzLnJlc2V0TW9iaWxlU2VhcmNoQmFyKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb2xsZWN0aW9uLmludm9rZSgnc2V0Jywge2FjdGl2ZTogZmFsc2V9KTtcbiAgICAgICAgdGhpcy5lbXB0eUVsKCk7XG4gICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXggPSBudWxsO1xuICAgIH0sXG5cbiAgICByZXNldE1vYmlsZVNlYXJjaEJhcigpIHtcbiAgICAgICAgLy8gTWVzcyBvZiBqcXVlcnkgdW50aWwgbmF2YmFyIGNhbiBiZSBzeXN0ZW1hdGljYWxseSByZWZhY3RvcmVkXG4gICAgICAgICQoJy5hY2NvdW50LWRyb3Bkb3duLW1vYmlsZSBhJykucmVtb3ZlQ2xhc3MoJ2hpZGVNZUltcG9ydGFudCcpO1xuICAgICAgICAkKCcudG9nZ2xlLXRvcGJhci5zZWFyY2gnKS5hZGRDbGFzcygnaW52aXNpYmxlJyk7XG4gICAgICAgICQoJy50b2dnbGUtdG9wYmFyLm1lbnUtaWNvbicpLnJlbW92ZUNsYXNzKCdpbnZpc2libGUnKTtcbiAgICAgICAgJCgnLnRvZ2dsZS10b3BiYXIuYnJvd3NlJykucmVtb3ZlQ2xhc3MoJ2ludmlzaWJsZScpO1xuICAgIH0sXG5cbiAgICBoaWdobGlnaHRJdGVtKGRpcmVjdGlvbikge1xuICAgICAgICBpZiAodGhpcy5jb2xsZWN0aW9uLm1vZGVscy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4ID0gZGlyZWN0aW9uID4gMCA/IDAgOiBkaXJlY3Rpb247XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4ICs9IGRpcmVjdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCA8IDApIHtcbiAgICAgICAgICAgIHRoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXggPSB0aGlzLnZpZXdzLmxlbmd0aCAtIDE7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCA+PSB0aGlzLmNvbGxlY3Rpb24ubW9kZWxzLmxlbmd0aCkge1xuICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZEl0ZW1JbmRleCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbW9kZWwgPSB0aGlzLmNvbGxlY3Rpb24ubW9kZWxzW3RoaXMuaGlnaGxpZ2h0ZWRJdGVtSW5kZXhdO1xuICAgICAgICB0aGlzLmNvbGxlY3Rpb24uaW52b2tlKCdzZXQnLCB7YWN0aXZlOiBmYWxzZX0pO1xuICAgICAgICBtb2RlbC5zZXQoJ2FjdGl2ZScsIHRydWUpO1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJ1cy50cmlnZ2VyKCdxdWlja3NlYXJjaDpmaWxsJywgbW9kZWwuZ2V0KCd0ZXh0JykpO1xuICAgIH0sXG5cbiAgICBhcHBlbmRJdGVtcygpIHtcbiAgICAgICAgY29uc3QgY2xhc3NOYW1lID0gJy5qcy1hdXRvY29tcGxldGlvbnNMaXN0JztcbiAgICAgICAgdGhpcy4kKGNsYXNzTmFtZSkuYXBwZW5kKHRoaXMudGVtcCk7XG4gICAgfSxcblxuICAgIHNtYXJ0UmVuZGVyKCkge1xuICAgICAgICB0aGlzLmhpZ2hsaWdodGVkSXRlbUluZGV4ID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMucXVlcnkuZ2V0KCd0ZXh0JykubGVuZ3RoICYmIHRoaXMuY29sbGVjdGlvbi5tb2RlbHMubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLnJlbmRlcigpO1xuICAgICAgICAgICAgdGhpcy4kYWR2YW5jZWRTZWFyY2guaGlkZSgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5lbXB0eUVsKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgY3JlYXRlSXRlbVZpZXcoe21vZGVsfSkge1xuICAgICAgICByZXR1cm4gbmV3IEF1dG9jb21wbGV0ZVZpZXcoe1xuICAgICAgICAgICAgbW9kZWwsXG4gICAgICAgICAgICBxdWVyeTogdGhpcy5xdWVyeVxuICAgICAgICB9KTtcbiAgICB9XG5cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBBdXRvY29tcGxldGlvbnM7XG4iLCJpbXBvcnQgQmFzZVZpZXcgZnJvbSAnLi4vLi4vLi4vdmlld3MvYmFzZSc7XG5pbXBvcnQga2V5Y29kZXMgZnJvbSAnLi4vLi4vLi4vdXRpbC9rZXljb2Rlcyc7XG5cbmNvbnN0IF8gPSB3aW5kb3cuXztcblxuY29uc3QgU2VhcmNoQmFyID0gQmFzZVZpZXcuZXh0ZW5kKHtcblxuICAgIGV2ZW50czoge1xuICAgICAgICAnY2xpY2sgLmpzLWRvUXVpY2tTZWFyY2gnOiAnc3VibWl0Rm9ybScsXG4gICAgICAgICdrZXl1cCAuanMtcXVpY2tTZWFyY2hJbnB1dCc6ICdrZXl1cCcsXG4gICAgICAgICdjaGFuZ2UgLmpzLXF1aWNrU2VhcmNoSW5wdXQnOiAnY2hhbmdlJyxcbiAgICAgICAgJ2lucHV0IC5qcy1xdWlja1NlYXJjaElucHV0JzogJ2lucHV0JyxcbiAgICAgICAgJ2NsaWNrIC5qcy1jbGVhclNlYXJjaCc6ICdjbGVhclNlYXJjaCdcbiAgICB9LFxuXG4gICAgaW5pdGlhbGl6ZSh7ZWwsIHF1ZXJ5LCBvcHRpb25zfSkge1xuICAgICAgICB0aGlzLl9pbmplY3RDdXN0b21GdW5jdGlvYW5saXR5KCk7XG5cbiAgICAgICAgdGhpcy5zZXRFbGVtZW50KGVsKTtcbiAgICAgICAgdGhpcy5kZWxlZ2F0ZUV2ZW50cygpO1xuICAgICAgICB0aGlzLnF1ZXJ5ID0gcXVlcnk7XG5cbiAgICAgICAgdGhpcy4kaW5wdXQgICAgICAgICA9IHRoaXMuJGVsLmZpbmQoJy5qcy1xdWlja1NlYXJjaElucHV0Jyk7XG4gICAgICAgIHRoaXMuJGZvcm0gICAgICAgICAgPSB0aGlzLiRlbC5maW5kKCcuanMtcXVpY2tTZWFyY2hGb3JtJyk7XG4gICAgICAgIHRoaXMuJHRvZ2dsZVNlYXJjaCAgPSB0aGlzLiRlbC5maW5kKCcuanMtdG9nZ2xlU2VhcmNoJyk7XG4gICAgICAgIHRoaXMuJGNsZWFyU2VhcmNoICAgPSB0aGlzLiRlbC5maW5kKCcuanMtY2xlYXJTZWFyY2gnKTtcblxuICAgICAgICAvLyBMSFRORy0xMjE1IC0gU3luYyBhbnkgaW5wdXQgcHJvdmlkZWQgc3RhdGljYWx5IGZyb20gdGhlIGZvcm0gbWFya3VwXG4gICAgICAgIHRoaXMucXVlcnkuc2V0KCd0ZXh0JywgdGhpcy4kaW5wdXQudmFsKCkpO1xuXG4gICAgICAgIF8uZXh0ZW5kKHRoaXMsIChvcHRpb25zIHx8IHt9KSk7XG5cbiAgICAgICAgdGhpcy4kdG9nZ2xlU2VhcmNoLm9uKCdjbGljayBrZXlwcmVzcycsIChldikgPT4geyB0aGlzLnRvZ2dsZVNlYXJjaChldik7IH0pO1xuICAgIH0sXG5cbiAgICBfaW5qZWN0Q3VzdG9tRnVuY3Rpb2FubGl0eSgpIHtcbiAgICAgICAgJC5mbi5zZXRDdXJzb3JUb1RleHRFbmQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGNvbnN0ICRpbml0aWFsVmFsID0gdGhpcy52YWwoKTtcbiAgICAgICAgICAgIHRoaXMudmFsKCcnKS52YWwoJGluaXRpYWxWYWwpO1xuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICBzdWJtaXRGb3JtKGV2KSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXJ5LmlzVmFsaWRGb3JTZWFyY2goKSkge1xuICAgICAgICAgICAgdGhpcy4kZm9ybS5zdWJtaXQoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBrZXl1cChldikge1xuICAgICAgICB0aGlzLnRvZ2dsZUNsZWFySWNvbigpO1xuXG4gICAgICAgIGlmICh0aGlzLmtleXVwTWFwLmhhcyhldi53aGljaCkpIHtcbiAgICAgICAgICAgIHRoaXMua2V5dXBNYXAuZ2V0KGV2LndoaWNoKSh0aGlzKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucXVlcnkuc2V0KCd0ZXh0JywgZXYudGFyZ2V0LnZhbHVlKTtcbiAgICAgICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAgICAgZXYucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBpbnB1dChldikge1xuICAgICAgICB0aGlzLnRvZ2dsZUNsZWFySWNvbigpO1xuICAgICAgICB0aGlzLnF1ZXJ5LnNldCgndGV4dCcsIGV2LnRhcmdldC52YWx1ZSk7XG4gICAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH0sXG5cbiAgICB0b2dnbGVDbGVhckljb24oKSB7XG4gICAgICAgIGlmICh0aGlzLiRpbnB1dC52YWwoKSkge1xuICAgICAgICAgICAgdGhpcy4kY2xlYXJTZWFyY2guc2hvdygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy4kY2xlYXJTZWFyY2guaGlkZSgpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNsZWFyU2VhcmNoKCkge1xuICAgICAgICB0aGlzLiRpbnB1dC52YWwoJycpLmZvY3VzKCk7XG4gICAgICAgIHRoaXMuJGNsZWFyU2VhcmNoLmhpZGUoKTtcbiAgICB9LFxuXG4gICAga2V5dXBNYXA6IG5ldyBNYXAoW1xuICAgICAgICBba2V5Y29kZXMuRU5URVIsIChzZWxmKSA9PiBzZWxmLnN1Ym1pdEZvcm0oKV1cbiAgICBdKSxcblxuICAgIHRvZ2dsZVNlYXJjaChldikge1xuICAgICAgICBpZiAoZXYud2hpY2ggPT09IGtleWNvZGVzLlNQQUNFIHx8IGV2LndoaWNoID09PSBrZXljb2Rlcy5FTlRFUiB8fCBldi50eXBlID09PSAnY2xpY2snKSB7XG4gICAgICAgICAgICB0aGlzLiRlbC50b2dnbGVDbGFzcygnaGlkZU1lJyk7XG4gICAgICAgICAgICB0aGlzLiRpbnB1dC5mb2N1cygpLnNldEN1cnNvclRvVGV4dEVuZCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy50b2dnbGVDbGVhckljb24oKTtcblxuICAgICAgICBpZiAodG9hc3RlcikgdG9hc3Rlci5fc3RpY2tUb2FzdCgpO1xuICAgIH1cblxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IFNlYXJjaEJhcjtcbiIsImltcG9ydCBTZWFyY2hCYXIgZnJvbSAnLi9zZWFyY2hfYmFyJztcbmltcG9ydCBrZXljb2RlcyBmcm9tICcuLi8uLi8uLi91dGlsL2tleWNvZGVzJztcblxuY29uc3QgQXV0b2NvbXBsZXRlU2VhcmNoQmFyID0gU2VhcmNoQmFyLmV4dGVuZCh7XG5cbiAgICBldmVudHMoKSB7XG4gICAgICAgIHJldHVybiBfLmV4dGVuZCh7fSwgXy5yZXN1bHQoU2VhcmNoQmFyLnByb3RvdHlwZSwgJ2V2ZW50cycpLCB7XG4gICAgICAgICAgICAnYmx1ciAuanMtcXVpY2tTZWFyY2hJbnB1dCc6ICdibHVyJyxcbiAgICAgICAgICAgICdmb2N1cyAuanMtcXVpY2tTZWFyY2hJbnB1dCc6ICdmb2N1cycsXG4gICAgICAgICAgICAna2V5ZG93biAuanMtcXVpY2tTZWFyY2hJbnB1dCc6ICdrZXlkb3duJ1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgaW5pdGlhbGl6ZSh7ZWwsIHRvZ2dsZVNlYXJjaEVsLCBxdWVyeSwgYXV0b2NvbXBsZXRlQnVzfSkge1xuICAgICAgICBsZXQgb3B0aW9ucyA9IHt9O1xuICAgICAgICBpZiAodG9nZ2xlU2VhcmNoRWwpIHtcbiAgICAgICAgICAgIG9wdGlvbnMuJHRvZ2dsZVNlYXJjaCA9IHRvZ2dsZVNlYXJjaEVsO1xuICAgICAgICB9XG5cbiAgICAgICAgU2VhcmNoQmFyLnByb3RvdHlwZS5pbml0aWFsaXplLmNhbGwodGhpcywge2VsLCBxdWVyeSwgb3B0aW9uc30pO1xuICAgICAgICB0aGlzLmF1dG9jb21wbGV0ZUJ1cyA9IGF1dG9jb21wbGV0ZUJ1cztcbiAgICAgICAgdGhpcy5saXN0ZW5Ubyh0aGlzLmF1dG9jb21wbGV0ZUJ1cywgJ3F1aWNrc2VhcmNoOmZpbGwnLCB0aGlzLnVwZGF0ZVRleHQpO1xuICAgIH0sXG5cbiAgICB1cGRhdGVUZXh0KHRleHQpIHtcbiAgICAgICAgdGhpcy4kaW5wdXQudmFsKHRleHQpO1xuICAgIH0sXG5cbiAgICBzaG91bGRUcmlnZ2VyQmx1cihldikge1xuICAgICAgICBjb25zdCBjbGFzc2VzID0gWydqcy1hdXRvY29tcGxldGlvbkl0ZW0nLCAnanMtcXVpY2tTZWFyY2hJY29uJywgJ2pzLW1vYmlsZVNlYXJjaEljb24nLCAnanMtbW9iaWxlU2VhcmNoJ107XG4gICAgICAgIGNvbnN0IHRhcmdldFZpYURvY3VtZW50ID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICAgICAgY29uc3QgdGFyZ2V0VmlhRXZlbnQgPSBldi5yZWxhdGVkVGFyZ2V0O1xuICAgICAgICByZXR1cm4gY2xhc3Nlcy5ldmVyeSgoaXRlbUNsYXNzKSA9PlxuICAgICAgICAgICAgISh0YXJnZXRWaWFEb2N1bWVudC5jbGFzc0xpc3QuY29udGFpbnMoaXRlbUNsYXNzKVxuICAgICAgICAgICAgICAgIHx8ICh0YXJnZXRWaWFFdmVudCAmJiAhdGFyZ2V0VmlhRXZlbnQuY2xhc3NMaXN0LmNvbnRhaW5zKGl0ZW1DbGFzcykpKVxuICAgICAgICApIHx8IGZhbHNlO1xuICAgIH0sXG5cbiAgICBrZXlkb3duKGV2KSB7XG4gICAgICAgIGlmIChldi53aGljaCA9PT0ga2V5Y29kZXMuVVAgfHwgZXYud2hpY2ggPT09IGtleWNvZGVzLkRPV04pIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZXYud2hpY2ggPT09IGtleWNvZGVzLlRBQikge1xuICAgICAgICAgICAgdGhpcy5ibHVyQXV0b2NvbXBsZXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZvaWQgMDtcbiAgICB9LFxuXG4gICAgYmx1ckF1dG9jb21wbGV0ZSgpIHtcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVCdXMudHJpZ2dlcigncXVpY2tzZWFyY2g6Ymx1cicpO1xuICAgIH0sXG5cbiAgICBibHVyKGV2KSB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuc2hvdWxkVHJpZ2dlckJsdXIoZXYpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5ibHVyQXV0b2NvbXBsZXRlKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDEpO1xuICAgIH0sXG5cbiAgICBmb2N1cygpIHtcbiAgICAgICAgdGhpcy5hdXRvY29tcGxldGVCdXMudHJpZ2dlcigncXVpY2tzZWFyY2g6Zm9jdXMnKTtcbiAgICB9LFxuXG4gICAga2V5dXBNYXA6IG5ldyBNYXAoW1xuICAgICAgICBba2V5Y29kZXMuVVAsIChzZWxmKSA9PiBzZWxmLmF1dG9jb21wbGV0ZUJ1cy50cmlnZ2VyKCdxdWlja3NlYXJjaDpoaWdobGlnaHRJdGVtJywgLTEpXSxcbiAgICAgICAgW2tleWNvZGVzLkRPV04sIChzZWxmKSA9PiBzZWxmLmF1dG9jb21wbGV0ZUJ1cy50cmlnZ2VyKCdxdWlja3NlYXJjaDpoaWdobGlnaHRJdGVtJywgMSldLFxuICAgICAgICBbLi4uU2VhcmNoQmFyLnByb3RvdHlwZS5rZXl1cE1hcF1cbiAgICBdKVxuXG59KTtcblxuZXhwb3J0IGRlZmF1bHQgQXV0b2NvbXBsZXRlU2VhcmNoQmFyO1xuIiwiZXhwb3J0IGRlZmF1bHQgKHtzaWduSW5VcmwsIHN0aWxsVHJvdWJsZVRleHR9KSA9PiBgXG48ZGl2IGNsYXNzPVwibW9kYWwtY29udGFpbmVyXCIgPlxuICAgIDxwID4gJHsgaHRtbCgncmVhdXRoZW50aWNhdGVNb2RhbC50ZXh0Qm9keScpIH0gPC9wPlxuXG4gICAgPHA+ICR7c3RpbGxUcm91YmxlVGV4dH0gPC9wPlxuXG4gICAgPGRpdiBjbGFzcz1cImJ1dHRvbi1jb250YWluZXJcIj5cbiAgICAgICAgPGEgaHJlZj1cIiR7IHNpZ25JblVybCB9XCIgcm9sZT1cImJ1dHRvblwiIGNsYXNzPVwiYnV0dG9uIG1hcmdpbi1zbWFsbCByYWRpdXMgc2Vjb25kYXJ5IHUtYWxsQ2Fwc1wiIGFyaWEtbGFiZWw9XCIkeyBodG1sKCdzaWduSW4nKSB9XCI+XG4gICAgICAgICAgICAkeyBodG1sKCdzaWduSW4nKSB9XG4gICAgICAgIDwvYT5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPVwiYnV0dG9uXCIgY2xhc3M9XCJidXR0b24gcmFkaXVzIG1hcmdpbi1zbWFsbCBvdXRsaW5lIGdyYXkgY2FuY2VsIHUtYWxsQ2Fwc1wiPiR7IGh0bWwoJ2NhbmNlbCcpIH08L2J1dHRvbj5cbiAgICA8L2Rpdj5cbjwvZGl2PlxuYDtcbiIsImltcG9ydCB7IE1vZGFsIH0gZnJvbSAnLi4vY29tbW9uL21vZGFsJztcbmltcG9ydCBTZXNzaW9uRXhwaXJlZE1vZGFsVGVtcGxhdGUgZnJvbSAnLi9TZXNzaW9uRXhwaXJlZE1vZGFsLmh0bWwnO1xuY29uc3QgeyB0ZXh0IH0gPSB3aW5kb3c7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNlc3Npb25FeHBpcmVkTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XG4gICAgY29uc3RydWN0b3IoZm9yd2FyZFVybCkge1xuICAgICAgICBsZXQgc3VwcG9ydFVybCA9IHdpbmRvdy5yb3V0ZXMuc3VwcG9ydE1lbWJlcnM7XG4gICAgICAgIGxldCBzaWduSW5VcmwgPSBgJHt3aW5kb3cucm91dGVzLmFjY291bnRJbnZhbGlkQ2FyZH0ke1xuICAgICAgICAgICAgZm9yd2FyZFVybCA/IGA/Zm9yd2FyZD0ke2VuY29kZVVSSUNvbXBvbmVudChmb3J3YXJkVXJsKX1gIDogJydcbiAgICAgICAgfWA7XG5cbiAgICAgICAgbGV0IGZvbGxvd1RoZXNlU3RlcHNMaW5rID0gYDxhIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vcmVmZXJyZXJcIiBocmVmPVwiJHtzdXBwb3J0VXJsfVwiPiR7dGV4dChcbiAgICAgICAgICAgICdwbGVhc2VDb250YWN0U3VwcG9ydCdcbiAgICAgICAgKX08L2E+YDtcbiAgICAgICAgbGV0IHN0aWxsVHJvdWJsZVRleHQgPSB0ZXh0KCdzZXNzaW9uRXhwaXJlZE1vZGFsLnN0aWxsSGF2aW5nVHJvdWJsZScsIHtcbiAgICAgICAgICAgIGZvbGxvd1RoZXNlU3RlcHM6IGZvbGxvd1RoZXNlU3RlcHNMaW5rLFxuICAgICAgICB9KTtcbiAgICAgICAgY29uc3QgbW9kYWxDb250ZW50cyA9IHtcbiAgICAgICAgICAgIGNsYXNzZXM6IFsnU2Vzc2lvbkV4cGlyZWRNb2RhbCddLFxuICAgICAgICAgICAgdGl0bGU6IHRleHQoJ3JlYXV0aGVudGljYXRlTW9kYWwuaGVhZGluZycpLFxuICAgICAgICAgICAgY29udGVudDogU2Vzc2lvbkV4cGlyZWRNb2RhbFRlbXBsYXRlKHtcbiAgICAgICAgICAgICAgICBzaWduSW5VcmwsXG4gICAgICAgICAgICAgICAgc3RpbGxUcm91YmxlVGV4dCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICB9O1xuXG4gICAgICAgIHN1cGVyKG1vZGFsQ29udGVudHMpO1xuICAgICAgICB0aGlzLiRlbC5maW5kKCcuY2FuY2VsJykub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jbG9zZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgVGl0bGVBY3Rpb25IYW5kbGVyIGZyb20gJy4uLy4uL3RpdGxlLWFjdGlvbnMvVGl0bGVBY3Rpb25IYW5kbGVyJztcbmltcG9ydCBTaGFyZWRBY3Rpb25zIGZyb20gJy4uLy4uL3RpdGxlLWFjdGlvbnMvc2hhcmVkL1NoYXJlZEFjdGlvbnMnO1xuaW1wb3J0IEJvcnJvd0FjdGlvbnMgZnJvbSAnLi4vLi4vdGl0bGUtYWN0aW9ucy9ib3Jyb3cvQm9ycm93QWN0aW9ucyc7XG5pbXBvcnQgSG9sZEFjdGlvbnMgZnJvbSAnLi4vLi4vdGl0bGUtYWN0aW9ucy9ob2xkcy9Ib2xkQWN0aW9ucyc7XG5pbXBvcnQgTm9va0FjdGlvbnMgZnJvbSAnLi4vLi4vdGl0bGUtYWN0aW9ucy9ub29rL05vb2tBY3Rpb25zJztcbmltcG9ydCBTdGFyUmF0aW5nQWN0aW9ucyBmcm9tICcuLi8uLi90aXRsZS1hY3Rpb25zL3JhdGluZ3MvU3RhclJhdGluZ0FjdGlvbnMnO1xuaW1wb3J0IFJlYWRpbmdIaXN0b3J5QWN0aW9ucyBmcm9tICcuLi8uLi90aXRsZS1hY3Rpb25zL2hpc3RvcnkvUmVhZGluZ0hpc3RvcnlBY3Rpb25zJztcblxuaW1wb3J0IFRyYWNraW5nQ2lyY3VsYXRpb24gZnJvbSAnLi9nYS9UcmFja2luZ0NpcmN1bGF0aW9uJztcbmltcG9ydCBUcmFja2luZ0tpbmRsZUZ1bGZpbGwgZnJvbSAnLi9nYS9UcmFja2luZ0tpbmRsZUZ1bGZpbGxtZW50JztcbmltcG9ydCBUcmFja2luZ1B1YmxpY0FwaUZ1bGZpbGxtZW50IGZyb20gJy4vZ2EvVHJhY2tpbmdQdWJsaWNBUElGdWxmaWxsbWVudCc7XG5pbXBvcnQgVHJhY2tpbmdTaWduSW5Gb3JtcyBmcm9tICcuL2dhL1RyYWNraW5nU2lnbkluRm9ybXMnO1xuaW1wb3J0IE5vdGlmaWNhdGlvbnNFdmVudFRyYWNrZXIgZnJvbSAnLi4vbm90aWZpY2F0aW9uc19ldmVudF90cmFja2VyL05vdGlmaWNhdGlvbnNFdmVudFRyYWNrZXInO1xuXG5jbGFzcyBFdmVudEJyaWRnZSB7XG4gICAgY29uc3RydWN0b3Ioe1xuICAgICAgICBidXMsXG4gICAgICAgIGNhcmQsXG4gICAgICAgIHBhdHJvblNldHRpbmdzLFxuICAgICAgICBmZWF0dXJlTWFuYWdlcixcbiAgICAgICAgZ2xvYmFsUHJlZmVyZW5jZXMsXG4gICAgfSkge1xuICAgICAgICB0aGlzLmJ1cyA9IGJ1cztcbiAgICAgICAgdGhpcy5jYXJkID0gY2FyZDtcbiAgICAgICAgdGhpcy5wYXRyb25TZXR0aW5ncyA9IHBhdHJvblNldHRpbmdzO1xuICAgICAgICB0aGlzLmZlYXR1cmVNYW5hZ2VyID0gZmVhdHVyZU1hbmFnZXI7XG4gICAgICAgIHRoaXMuZ2xvYmFsUHJlZmVyZW5jZXMgPSBnbG9iYWxQcmVmZXJlbmNlcztcblxuICAgICAgICB0aGlzLnJlZ2lzdGVyVGl0bGVBY3Rpb24oKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlclNoYXJlZEFjdGlvbkhhbmRsZXJzKCk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXJBbmFseXRpY3NJbnRlZ3JhdGlvbnMoKTtcbiAgICB9XG5cbiAgICByZWdpc3RlclRpdGxlQWN0aW9uKCkge1xuICAgICAgICB2b2lkIG5ldyBUaXRsZUFjdGlvbkhhbmRsZXIodGhpcy5idXMsIHRoaXMuY2FyZCwgdGhpcy5wYXRyb25TZXR0aW5ncyk7XG4gICAgICAgIHZvaWQgbmV3IEJvcnJvd0FjdGlvbnMoXG4gICAgICAgICAgICB0aGlzLmJ1cyxcbiAgICAgICAgICAgIHRoaXMuZmVhdHVyZU1hbmFnZXIsXG4gICAgICAgICAgICB0aGlzLmdsb2JhbFByZWZlcmVuY2VzXG4gICAgICAgICk7XG4gICAgICAgIHZvaWQgbmV3IEhvbGRBY3Rpb25zKHRoaXMuYnVzKTtcbiAgICAgICAgdm9pZCBuZXcgTm9va0FjdGlvbnModGhpcy5idXMpO1xuICAgICAgICB2b2lkIG5ldyBTdGFyUmF0aW5nQWN0aW9ucyh0aGlzLmJ1cyk7XG4gICAgICAgIHZvaWQgbmV3IFJlYWRpbmdIaXN0b3J5QWN0aW9ucyh0aGlzLmJ1cyk7XG5cbiAgICAgICAgaWYgKHRoaXMuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdOb3RpZmljYXRpb25zJykpIHtcbiAgICAgICAgICAgIHZvaWQgbmV3IE5vdGlmaWNhdGlvbnNFdmVudFRyYWNrZXIodGhpcy5idXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJTaGFyZWRBY3Rpb25IYW5kbGVycygpIHtcbiAgICAgICAgdm9pZCBuZXcgU2hhcmVkQWN0aW9ucyh0aGlzLmJ1cyk7XG4gICAgfVxuXG4gICAgcmVnaXN0ZXJBbmFseXRpY3NJbnRlZ3JhdGlvbnMoKSB7XG4gICAgICAgIHZvaWQgKHdpbmRvdy5PdmVyRHJpdmUuZ2FFdmVudExvZ2dlciA9IG5ldyBUcmFja2luZ0NpcmN1bGF0aW9uKFxuICAgICAgICAgICAgdGhpcy5idXNcbiAgICAgICAgKSk7XG4gICAgICAgIHZvaWQgbmV3IFRyYWNraW5nS2luZGxlRnVsZmlsbCh0aGlzLmJ1cyk7XG4gICAgICAgIHZvaWQgbmV3IFRyYWNraW5nU2lnbkluRm9ybXModGhpcy5idXMpO1xuICAgICAgICB2b2lkIG5ldyBUcmFja2luZ1B1YmxpY0FwaUZ1bGZpbGxtZW50KHRoaXMuYnVzKTtcbiAgICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRCcmlkZ2U7XG4iLCJjb25zdCB7IHVybCwgcm91dGVzIH0gPSB3aW5kb3c7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRyYWNraW5nQ2lyY3VsYXRpb24ge1xuICAgIGdldCBpc0RlYnVnKCkge1xuICAgICAgICByZXR1cm4gXyh3aW5kb3cuZ2EpLmlzRW1wdHkoKTtcbiAgICB9XG5cbiAgICBnZXQgZGVidWdJbnN0YW5jZSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHB1c2g6ICh7IGV2ZW50LCBjb250ZW50LCBpc05vdGlmaWNhdGlvbiB9KSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgZ2E6bG9nKFwiJHtldmVudH1cIik6YCwge1xuICAgICAgICAgICAgICAgICAgICBldmVudCxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudCxcbiAgICAgICAgICAgICAgICAgICAgaXNOb3RpZmljYXRpb24sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGJ1cykge1xuICAgICAgICB0aGlzLmJ1cyA9IGJ1cztcblxuICAgICAgICB0aGlzLl9kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IHRoaXMuZGVidWdJbnN0YW5jZTtcbiAgICAgICAgdGhpcy5fd2Vic2l0ZUlkID0gd2luZG93Lk92ZXJEcml2ZS50ZW5hbnQ7XG5cbiAgICAgICAgdGhpcy5idXNcbiAgICAgICAgICAgIC5vbigndGl0bGU6Ym9ycm93OnN1Y2Nlc3MnLCAocGFyYW1zKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMucHVzaEV2ZW50KHBhcmFtcywgJ3RpdGxlQm9ycm93JylcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vbigndGl0bGU6aG9sZDpzdWNjZXNzJywgKHBhcmFtcykgPT5cbiAgICAgICAgICAgICAgICB0aGlzLnB1c2hFdmVudChwYXJhbXMsICd0aXRsZUhvbGQnKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9uKCd0aXRsZTpob2xkLWNhbmNlbDpzdWNjZXNzJywgKHBhcmFtcykgPT5cbiAgICAgICAgICAgICAgICB0aGlzLnB1c2hFdmVudChwYXJhbXMsICd0aXRsZUhvbGRDYW5jZWwnKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9uKCd0aXRsZTpob2xkLWxhcHNlZDpkaXNtaXNzJywgKHBhcmFtcykgPT5cbiAgICAgICAgICAgICAgICB0aGlzLnB1c2hFdmVudChwYXJhbXMsICd0aXRsZUhvbGRMYXBzZWREaXNtaXNzJylcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vbigndGl0bGU6d2lzaGxpc3Q6c3VjY2VzcycsIChwYXJhbXMpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5wdXNoRXZlbnQocGFyYW1zLCAndGl0bGVXaXNobGlzdCcpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub24oJ3RpdGxlOmhpc3Rvcnk6YWRkOnN1Y2Nlc3MnLCAocGFyYW1zKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMucHVzaEV2ZW50KHBhcmFtcywgJ3RpdGxlSGlzdG9yeScpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub24oJ3RpdGxlOmRvd25sb2FkJywgKHBhcmFtcykgPT5cbiAgICAgICAgICAgICAgICB0aGlzLnB1c2hFdmVudChwYXJhbXMsICd0aXRsZURvd25sb2FkJylcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vbigndGl0bGU6c3VzcGVuZCcsIChwYXJhbXMpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5wdXNoRXZlbnQocGFyYW1zLCAndGl0bGVTdXNwZW5kJylcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vbigndGl0bGU6c3VzcGVuZDpjYW5jZWxsZWQnLCAocGFyYW1zKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMucHVzaEV2ZW50KHBhcmFtcywgJ3RpdGxlU3VzcGVuZENhbmNlbGxlZCcpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub24oJ3RpdGxlOnN1c3BlbmQ6ZGlzbWlzcycsIChwYXJhbXMpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5wdXNoRXZlbnQocGFyYW1zLCAndGl0bGVTdXNwZW5kRGlzbWlzcycpXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIHB1c2hFdmVudCh7IHRpdGxlTW9kZWwsIGNvbnRleHQgfSwgZXZlbnQpIHtcbiAgICAgICAgbGV0IGNvbnRlbnQgPSBfLmV4dGVuZChcbiAgICAgICAgICAgIHt9LFxuICAgICAgICAgICAgdGhpcy5nZXRUaXRsZVByb3BzKHRpdGxlTW9kZWwpLFxuICAgICAgICAgICAgdGhpcy5nZXRDb2xsZWN0aW9uUHJvcHMoXG4gICAgICAgICAgICAgICAgY29udGV4dCA/IGNvbnRleHQuY29sbGVjdGlvbkRlZmluaXRpb24gOiB7fVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHRoaXMuZ2V0Q2FtcGFpZ25Qcm9wcyhcbiAgICAgICAgICAgICAgICB0aXRsZU1vZGVsLmNvbnRleHQgPyB0aXRsZU1vZGVsLmNvbnRleHQuY2FtcGFpZ24gOiB7fVxuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIGNvbnRleHQgJiYgY29udGV4dC5mb3JtYXRJZCA/IHsgZm9ybWF0SWQ6IGNvbnRleHQuZm9ybWF0SWQgfSA6IHt9LFxuICAgICAgICAgICAgd2luZG93LmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnaG9sZFJlZGVsaXZlcnknKVxuICAgICAgICAgICAgICAgID8gdGhpcy5nZXRTdXNwZW5kVGl0bGVQcm9wcyhjb250ZXh0LCB0aXRsZU1vZGVsLCBldmVudClcbiAgICAgICAgICAgICAgICA6IHt9XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUmVuZXcgYW5kIHJlcXVlc3QgYWdhaW4gYXJlbid0IGRpc3RpbmN0IGV2ZW50cyBhcyBmYXIgYXMgbGlnaHRuaW5nJ3MgYXBpIGFyZSBjb25jZXJuZWQsIGJ1dCB3ZVxuICAgICAgICAvLyB3YW50IHRvIHJlcG9ydCB0aGVtIGFzIGRpc3RpbmN0IGV2ZW50cy5cbiAgICAgICAgaWYgKGV2ZW50ID09PSAndGl0bGVCb3Jyb3cnICYmIGNvbnRleHQuaXNSZW5ld2FsKSB7XG4gICAgICAgICAgICBldmVudCA9ICd0aXRsZVJlbmV3JztcbiAgICAgICAgfSBlbHNlIGlmIChldmVudCA9PT0gJ3RpdGxlSG9sZCcgJiYgY29udGV4dC5pc1JlcXVlc3RBZ2Fpbikge1xuICAgICAgICAgICAgZXZlbnQgPSAndGl0bGVSZXF1ZXN0QWdhaW4nO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGlzTm90aWZpY2F0aW9uO1xuICAgICAgICBjb250ZXh0XG4gICAgICAgICAgICA/IChpc05vdGlmaWNhdGlvbiA9IGNvbnRleHQuaXNOb3RpZmljYXRpb24pXG4gICAgICAgICAgICA6IChpc05vdGlmaWNhdGlvbiA9IGZhbHNlKTtcblxuICAgICAgICB0aGlzLl9kYXRhTGF5ZXIucHVzaCh7IGV2ZW50LCBjb250ZW50LCBpc05vdGlmaWNhdGlvbiB9KTtcbiAgICB9XG5cbiAgICBnZXRUaXRsZVByb3BzKHRpdGxlTW9kZWwpIHtcbiAgICAgICAgbGV0IHQgPSB0aXRsZU1vZGVsLmF0dHJpYnV0ZXM7XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIG1lZGlhSUQ6IHQuaWQsXG4gICAgICAgICAgICB0aXRsZU5hbWU6IHQudGl0bGUsXG4gICAgICAgICAgICBhdXRob3I6IHQuZmlyc3RDcmVhdG9yTmFtZSxcbiAgICAgICAgICAgIGZvcm1hdENsYXNzOiAodC50eXBlICYmIHQudHlwZS5pZCkgfHwgJ3Vua25vd24nLFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGdldFN0cmF0ZWd5KGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGNvbnRleHQgJiYgY29udGV4dC5zdHJhdGVneSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RyYXRlZ3k6IGNvbnRleHQuc3RyYXRlZ3kgfTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge307XG4gICAgfVxuXG4gICAgZ2V0Q29sbGVjdGlvblByb3BzKGNvbGxlY3Rpb25EZWZpbml0aW9uKSB7XG4gICAgICAgIGlmIChfKGNvbGxlY3Rpb25EZWZpbml0aW9uKS5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBjID0gY29sbGVjdGlvbkRlZmluaXRpb247XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsaXN0SUQ6IGMuYXR0cmlidXRlcy5pZCxcbiAgICAgICAgICAgIGxpc3ROYW1lOiBjLmF0dHJpYnV0ZXMubmFtZSxcbiAgICAgICAgICAgIGxpc3RVcmw6IHVybChyb3V0ZXMuY29sbGVjdGlvbkJ5SWQsIHtcbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uSWQ6IGMuYXR0cmlidXRlcy5pZCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgLy8gTEhUTkctMjE5OSAtIFRoaXMgaXMgY3VycmVudGx5IHRoZSBvbmx5IHBsYWNlIGluIHRoZSBjb2RlIHdoZXJlIHRoZXNlIGFyZSBkZWZpbmVkIGFzIHN0cmluZ3MsXG4gICAgICAgICAgICAvLyBhZGRpdGlvbm5hbGx5IHdlIGhhdmUgdG8gYmUgY29uc2lzdGVudCB3aXRoIGNhc2Ugc2Vuc2l0aXZpdHkgb3RoZXJ3aXNlIHdlIHdpbGwgbWVzc3VwIEdvb2dsZSBBbmFseXRpY3NcbiAgICAgICAgICAgIGxpc3RUeXBlOiBjLmlzQ3VyYXRlZCA/ICdDdXJhdGVkJyA6ICdHZW5lcmF0ZWQnLFxuICAgICAgICAgICAgaXNMdWNreURheTogYy5hdHRyaWJ1dGVzLnNob3dPbmx5THVja3lEYXlBdmFpbGFibGUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0Q2FtcGFpZ25Qcm9wcyhjYW1wYWlnbikge1xuICAgICAgICBpZiAoXyhjYW1wYWlnbikuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2FtcGFpZ25JZDogY2FtcGFpZ24uaWQsXG4gICAgICAgICAgICBjYW1wYWlnbk5hbWU6IGNhbXBhaWduLm5hbWUsXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgZ2V0U3VzcGVuZFRpdGxlUHJvcHMoY29udGV4dCwgdGl0bGVNb2RlbCwgZXZlbnQpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgZXZlbnQgPT09ICd0aXRsZVN1c3BlbmQnICYmXG4gICAgICAgICAgICAhXyhjb250ZXh0KS5pc0VtcHR5KCkgJiZcbiAgICAgICAgICAgIGNvbnRleHQubnVtT2ZEYXlzXG4gICAgICAgICkge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdXNwZW5kRGF5czogY29udGV4dC5udW1PZkRheXMsXG4gICAgICAgICAgICAgICAgaXNSZWRlbGl2ZXJlZDogY29udGV4dC5pc1JlZGVsaXZlcnksXG4gICAgICAgICAgICAgICAgaXNTdXNwZW5kZWQ6IGNvbnRleHQuaXNTdXNwZW5kZWQsXG4gICAgICAgICAgICAgICAgYXV0b1JlZGVsaXZlcmllc0NvdW50OiB0aXRsZU1vZGVsLmdldChcbiAgICAgICAgICAgICAgICAgICAgJ3JlZGVsaXZlcmllc0F1dG9tYXRlZENvdW50J1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgcmVxdWVzdGVkUmVkZWxpdmVyeUNvdW50OiB0aXRsZU1vZGVsLmdldChcbiAgICAgICAgICAgICAgICAgICAgJ3JlZGVsaXZlcmllc1JlcXVlc3RlZENvdW50J1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9IGVsc2UgaWYgKGV2ZW50ID09PSAndGl0bGVTdXNwZW5kQ2FuY2VsbGVkJykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhdXRvUmVkZWxpdmVyaWVzQ291bnQ6IHRpdGxlTW9kZWwuZ2V0KFxuICAgICAgICAgICAgICAgICAgICAncmVkZWxpdmVyaWVzQXV0b21hdGVkQ291bnQnXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0ZWRSZWRlbGl2ZXJ5Q291bnQ6IHRpdGxlTW9kZWwuZ2V0KFxuICAgICAgICAgICAgICAgICAgICAncmVkZWxpdmVyaWVzUmVxdWVzdGVkQ291bnQnXG4gICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRyYWNraW5nS2luZGxlRnVsZmlsbG1lbnQge1xuICAgIGdldCBpc0RlYnVnKCkge1xuICAgICAgICByZXR1cm4gXyh3aW5kb3cuZ2EpLmlzRW1wdHkoKTtcbiAgICB9XG5cbiAgICBnZXQgZGVidWdJbnN0YW5jZSgpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHB1c2g6ICh7IGV2ZW50LCBjb250ZW50IH0pID0+IHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgZ2E6bG9nKFwiJHtldmVudH1cIik6YCwgY29udGVudCk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tY29uc29sZVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIGNvbnN0cnVjdG9yKGJ1cykge1xuICAgICAgICB0aGlzLmJ1cyA9IGJ1cztcblxuICAgICAgICB0aGlzLl9kYXRhTGF5ZXIgPSB3aW5kb3cuZGF0YUxheWVyIHx8IHRoaXMuZGVidWdJbnN0YW5jZTtcblxuICAgICAgICB0aGlzLmJ1c1xuICAgICAgICAgICAgLm9uKCdwcmVmZXJlbmNlczpnbG9iYWw6dXBkYXRlOnN1Y2Nlc3MnLCh7Y29udGV4dCwgc291cmNlfSkgPT4gdGhpcy5wdXNoRXZlbnQoe2NvbnRleHQsIHNvdXJjZX0pKTtcbiAgICB9XG5cbiAgICBwdXNoRXZlbnQoe2NvbnRleHQsIHNvdXJjZX0pIHtcbiAgICAgICAgaWYgKF8oT2JqZWN0LmtleXMoY29udGV4dC5jaGFuZ2VkKSkuY29udGFpbnMoJ2tpbmRsZUZ1bGZpbGxtZW50JykpIHtcbiAgICAgICAgICAgIHRoaXMuX2RhdGFMYXllci5wdXNoKHtcbiAgICAgICAgICAgICAgICBldmVudDogJ2tpbmRsZUZ1bGZpbGxtZW50JyxcbiAgICAgICAgICAgICAgICBjb250ZW50OiB7XG4gICAgICAgICAgICAgICAgICAgIHNvdXJjZSwgLy8gc2V0dGluZ3NfcGFnZSwgcmVzdWx0c19maWx0ZXIsIG9yIGNvbnRlbnRfZnVsZmlsbG1lbnRcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGNvbnRleHQuY2hhbmdlZC5raW5kbGVGdWxmaWxsbWVudFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUcmFja2luZ1B1YmxpY0FwaUZ1bGZpbGxtZW50IHtcbiAgICBnZXQgaXNEZWJ1ZygpIHtcbiAgICAgICAgcmV0dXJuIF8od2luZG93LmdhKS5pc0VtcHR5KCk7XG4gICAgfVxuXG4gICAgZ2V0IGRlYnVnSW5zdGFuY2UoKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBwdXNoOiAoeyBldmVudCwgY29udGVudCB9KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYGdhOmxvZyhcIiR7ZXZlbnR9XCIpOmAsIGNvbnRlbnQpOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihidXMpIHtcbiAgICAgICAgdGhpcy5idXMgPSBidXM7XG5cbiAgICAgICAgdGhpcy5fZGF0YUxheWVyID0gd2luZG93LmRhdGFMYXllciB8fCB0aGlzLmRlYnVnSW5zdGFuY2U7XG5cbiAgICAgICAgdGhpcy5idXNcbiAgICAgICAgICAgIC5vbignYXBpZnVsZmlsbG1lbnQ6cmVuZGVyJywgICAgICAgICAgICAocGFyYW1zKSA9PiB0aGlzLnB1c2hFdmVudChwYXJhbXMsIFwibGh0bmdBUElQbHV0b1JlbmRlclwiKSlcbiAgICAgICAgICAgIC5vbignYXBpZnVsZmlsbG1lbnQ6ZnVsZmlsbCcsICAgICAgICAgICAgKHBhcmFtcykgPT4gdGhpcy5wdXNoRXZlbnQocGFyYW1zLCBcImxodG5nQVBJUGx1dG9GdWxmaWxsXCIpKVxuICAgICAgICAgICAgLm9uKCdhcGlmdWxmaWxsbWVudDphcHBTdG9yZScsICAgICAgICAgICAgKHBhcmFtcykgPT4gdGhpcy5wdXNoRXZlbnQocGFyYW1zLCBcImxodG5nQVBJUGx1dG9BcHBTdG9yZVwiKSlcbiAgICAgICAgICAgIC5vbignYXBpZnVsZmlsbG1lbnQ6dGV4dEdlbicsICAgICAgICAgICAgKHBhcmFtcykgPT4gdGhpcy5wdXNoRXZlbnQocGFyYW1zLCBcImxodG5nQVBJUGx1dG9UZXh0R2VuXCIpKVxuICAgICAgICAgICAgLm9uKCdhcGlmdWxmaWxsbWVudDp0ZXh0RG9uZScsICAgICAgICAgICAgKHBhcmFtcykgPT4gdGhpcy5wdXNoRXZlbnQocGFyYW1zLCBcImxodG5nQVBJUGx1dG9UZXh0RG9uZVwiKSlcbiAgICAgICAgICAgIC5vbignYXBpZnVsZmlsbG1lbnQ6ZXJyb3JzJywgICAgICAgICAgICAocGFyYW1zKSA9PiB0aGlzLnB1c2hFdmVudChwYXJhbXMsICdsaHRuZ0FQSVBsdXRvRXJyb3JzJykpXG4gICAgfVxuXG4gICAgcHVzaEV2ZW50KGNvbnRleHQsIGV2ZW50TmFtZSkge1xuICAgICAgICAgICAgdGhpcy5fZGF0YUxheWVyLnB1c2goe1xuICAgICAgICAgICAgICAgIGV2ZW50OiBldmVudE5hbWUsXG4gICAgICAgICAgICAgICAgY29udGVudDogY29udGV4dFxuICAgICAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiZXhwb3J0IGRlZmF1bHQgY2xhc3MgVHJhY2tpbmdTaWduSW5Gb3JtcyB7XG4gICAgY29uc3RydWN0b3IoYnVzKSB7XG4gICAgICAgIHRoaXMuYnVzID0gYnVzO1xuXG4gICAgICAgIHRoaXMuX2RhdGFMYXllciA9IHdpbmRvdy5kYXRhTGF5ZXIgfHwgdGhpcy5kZWJ1Z0luc3RhbmNlO1xuXG4gICAgICAgIHRoaXMuYnVzXG4gICAgICAgICAgICAub24oJ3NpZ25JbjpsaWJyYXJ5JywgKHBhcmFtcykgPT5cbiAgICAgICAgICAgICAgICB0aGlzLnB1c2hTaWduSW5FdmVudChwYXJhbXMsICdMaWJyYXJ5IENhcmQgU2lnbiBJbicpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub24oJ3NpZ25JbjpleHRlcm5hbCcsIChwYXJhbXMpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5wdXNoU2lnbkluRXZlbnQocGFyYW1zLCAnRXh0ZXJuYWwgU2lnbiBJbicpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub24oJ3NpZ25Jbi5lbWFpbCcsIChwYXJhbXMpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5wdXNoU2lnbkluRXZlbnQocGFyYW1zLCAnRW1haWwgU2lnbiBJbicpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub24oJ3NpZ25Jbjptb2JpbGVOdW0nLCAocGFyYW1zKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMucHVzaFNpZ25JbkV2ZW50KHBhcmFtcywgJ01vYmlsZSBOdW1iZXIgU2lnbiBJbicpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub24oJ3NpZ25JbjpnZW8nLCAocGFyYW1zKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMucHVzaFNpZ25JbkV2ZW50KHBhcmFtcywgJ0dlbyBTaWduIEluJylcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vbignbW9iaWxlOmNvZGU6dmVyaWZpZWQnLCAocGFyYW1zKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMucHVzaFNpZ25JbkV2ZW50KHBhcmFtcywgJ01vYmlsZSBOdW1iZXIgQ29kZSBWZXJpZmllZCcpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub24oJ21vYmlsZTpjb2RlOnNlbnQnLCAocGFyYW1zKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMucHVzaFNpZ25JbkV2ZW50KHBhcmFtcywgJ1NlbmQgTW9iaWxlIFZlcmlmaWNhdGlvbiBDb2RlJylcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vbignbW9iaWxlOmNvZGU6cmVzZW50JywgKHBhcmFtcykgPT5cbiAgICAgICAgICAgICAgICB0aGlzLnB1c2hTaWduSW5FdmVudChwYXJhbXMsICdSZXNlbmQgTW9iaWxlIFZlcmlmaWNhdGlvbiBDb2RlJylcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vbignZW1haWw6Y29kZTpzZW50JywgKHBhcmFtcykgPT5cbiAgICAgICAgICAgICAgICB0aGlzLnB1c2hTaWduSW5FdmVudChwYXJhbXMsICdTZW5kIEVtYWlsIFZlcmlmaWNhdGlvbiBDb2RlJylcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vbignZW1haWw6Y29kZTpyZXNlbnQnLCAocGFyYW1zKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMucHVzaFNpZ25JbkV2ZW50KHBhcmFtcywgJ1Jlc2VuZCBFbWFpbCBWZXJpZmljYXRpb24gQ29kZScpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub24oJ2VtYWlsOmNvZGU6dmVyaWZpZWQnLCAocGFyYW1zKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMucHVzaFNpZ25JbkV2ZW50KHBhcmFtcywgJ0VtYWlsIENvZGUgVmVyaWZpZWQnKVxuICAgICAgICAgICAgKVxuXG4gICAgICAgICAgICAub24oJ21vYmlsZTpyZWdpc3Rlcjpjb2RlOnNlbnQnLCAoKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMucHVzaFJlZ2lzdGVyRXZlbnQoJ1NlbmQgTW9iaWxlIHZlcmlmaWNhdGlvbiBjb2RlJylcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vbignbW9iaWxlOnJlZ2lzdGVyOmNvZGU6cmVzZW50JywgKCkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLnB1c2hSZWdpc3RlckV2ZW50KCdSZXNlbmQgTW9iaWxlIHZlcmlmaWNhdGlvbiBjb2RlJylcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vbignbW9iaWxlOnJlZ2lzdGVyOmNvZGU6dmVyaWZpZWQnLCAoKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMucHVzaFJlZ2lzdGVyRXZlbnQoJ01vYmlsZSBOdW1iZXIgQ29kZSBWZXJpZmllZCcpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub24oJ21vYmlsZTpyZWdpc3RlcjpzdWJtaXQnLCAoKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMucHVzaFJlZ2lzdGVyRXZlbnQoJ0Zvcm0gc3VibWl0JylcbiAgICAgICAgICAgIClcblxuICAgICAgICAgICAgLm9uKCdnZW86cmVnaXN0ZXI6dmlldycsICgpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5wdXNoUmVnaXN0ZXJFdmVudCgnVmlldyBnZW8gbG9naW4gcGFnZScpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub24oJ2dlbzpyZWdpc3RlcjphY2NlcHQ6c3RhcnQnLCAoKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMucHVzaFJlZ2lzdGVyRXZlbnQoJ0luaXRpYXRlZCBnZW8gYXV0aCcpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub24oJ2dlbzpyZWdpc3RlcjphY2NlcHQ6c3VjY2VzcycsICgpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5wdXNoUmVnaXN0ZXJFdmVudCgnR2VvIGF1dGggc3VjY2VzcycpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub24oJ2dlbzpyZWdpc3RlcjphY2NlcHQ6ZmFpbCcsICgpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5wdXNoUmVnaXN0ZXJFdmVudCgnR2VvIGF1dGggZmFpbHVyZScpXG4gICAgICAgICAgICApO1xuICAgIH1cblxuICAgIGdldCBkZWJ1Z0luc3RhbmNlKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcHVzaDogKHsgZXZlbnQsIGNvbnRlbnQgfSkgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBnYTpsb2coXCIke2V2ZW50fVwiKTpgLCB7IGV2ZW50LCBjb250ZW50IH0pOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgcHVzaFNpZ25JbkV2ZW50KHNlbGVjdGVkSUxTLCBhY3Rpb24pIHtcbiAgICAgICAgbGV0IGNvbnRlbnQgPSB7XG4gICAgICAgICAgICBldmVudDogJ2F1dGgnLFxuICAgICAgICAgICAgZXZlbnRDYXRlZ29yeTogJ0F1dGhlbnRpY2F0aW9uJyxcbiAgICAgICAgICAgIGV2ZW50QWN0aW9uOiBhY3Rpb24sXG4gICAgICAgICAgICBldmVudExhYmVsOiBzZWxlY3RlZElMUyxcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLl9kYXRhTGF5ZXIucHVzaChjb250ZW50KTtcbiAgICB9XG5cbiAgICBwdXNoUmVnaXN0ZXJFdmVudChhY3Rpb24pIHtcbiAgICAgICAgbGV0IGNvbnRlbnQgPSB7XG4gICAgICAgICAgICBldmVudDogJ3JlZ2lzdGVyJyxcbiAgICAgICAgICAgIGV2ZW50Q2F0ZWdvcnk6ICdTaWduIHVwJyxcbiAgICAgICAgICAgIGV2ZW50QWN0aW9uOiAnR2V0IGEgY2FyZCcsXG4gICAgICAgICAgICBldmVudExhYmVsOiBhY3Rpb24sXG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5fZGF0YUxheWVyLnB1c2goY29udGVudCk7XG4gICAgfVxufVxuIiwiaW1wb3J0IHsgdG9TdGF0aWNVcmwgfSBmcm9tICcuLi8uLi8uLi8uLi9saWIvYXNzZXRNYXBwZXInO1xuXG5leHBvcnQgZGVmYXVsdCAoKSA9PiBgXG4gICAgPGRpdj5cbiAgICAgICAgPGltZyBzcmM9XCIke3RvU3RhdGljVXJsKCdpbWcvc2hpZWxkLWxvY2suc3ZnJyl9XCIgLz5cbiAgICAgICAgPGgzPiR7dGV4dCgndGxzV2FybmluZy5ub0FjY2VzcycpfTwvaDM+XG4gICAgICAgIDxwIGNsYXNzPVwiYWxpZ24tbGVmdFwiPiR7dGV4dCgndGxzV2FybmluZy5kZXNjcmlwdGlvbicpfTwvcD5cbiAgICAgICAgPHA+PGEgaHJlZj1cImh0dHBzOi8vaGVscC5vdmVyZHJpdmUuY29tL2VuLXVzLzIyNzEuaHRtXCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9yZWZlcnJlclwiIGNsYXNzPVwidW5kZXJsaW5lXCI+JHt0ZXh0KFxuICAgICAgICAgICAgJ3Rsc1dhcm5pbmcubGVhcm5Nb3JlJ1xuICAgICAgICApfTwvYT48L3A+XG4gICAgICAgIDxidXR0b24gY2xhc3M9XCJidXR0b24gcmFkaXVzIHNlY29uZGFyeSBqcy1jbG9zZVwiPiR7dGV4dChcbiAgICAgICAgICAgICd0bHNXYXJuaW5nLmNvbnRpbnVlVG9MaWJyYXJ5J1xuICAgICAgICApfTwvYnV0dG9uPlxuICAgIDwvZGl2PlxuYDtcbiIsImltcG9ydCB7IE1vZGFsIH0gZnJvbSAnLi4vY29tbW9uL21vZGFsJztcbmltcG9ydCB0ZW1wbGF0ZSBmcm9tICcuL3Rsc1dhcm5pbmdNb2RhbC5odG1sJztcbmltcG9ydCBrZXlzIGZyb20gJy4uLy4uL3V0aWwva2V5Y29kZXMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUbHNXYXJuaW5nTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIGxldCBjb250ZW50ID0gdGVtcGxhdGUoKTtcbiAgICAgICAgbGV0IG1vZGFsQ29udGVudHMgPSB7XG4gICAgICAgICAgICBjbGFzc2VzOiBbJ3NtYWxsJywgJ3Rsc1dhcm5pbmdNb2RhbCddLFxuICAgICAgICAgICAgdGl0bGU6IHdpbmRvdy5odG1sKCd0bHNXYXJuaW5nLnRpdGxlJyksXG4gICAgICAgICAgICBoaWRkZW5UaXRsZTogdHJ1ZSxcbiAgICAgICAgICAgIGNvbnRlbnRcbiAgICAgICAgfTtcblxuICAgICAgICBzdXBlcihtb2RhbENvbnRlbnRzKTtcbiAgICB9XG5cbiAgICBjbG9zZSgpIHtcbiAgICAgICAgdGhpcy5zZXRDb29raWUoKTtcbiAgICAgICAgc3VwZXIuY2xvc2UoKTtcbiAgICB9XG5cbiAgICBzZXRDb29raWUoKSB7XG4gICAgICAgIENvb2tpZXMucmVtb3ZlKCd0bHMtZmluYWwtd2FybmluZycsIHtwYXRoOiAnLyd9KTtcbiAgICAgICAgQ29va2llcy5zZXQoJ3Rscy1maW5hbC13YXJuaW5nJywgJ2Rpc21pc3NlZCcsIHtwYXRoOiAnLycsIGV4cGlyZXM6IDE0fSk7XG4gICAgfVxufSIsImltcG9ydCBCYXNlVmlldyBmcm9tICcuLi8uLi92aWV3cy9iYXNlLmpzJztcbmltcG9ydCB7IHN0YW5kYXJkVG9hc3QgfSBmcm9tICcuL3RvYXN0ZXIuaHRtbCc7XG5jb25zdCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBwYXRoID0gcmVxdWlyZSgncGF0aCcpO1xuY29uc3QgdGVtcGxhdGUgPSBmcy5yZWFkRmlsZVN5bmMoXG4gICAgcGF0aC5qb2luKF9fZGlybmFtZSwgJy90ZW1wbGF0ZXMvdG9hc3Rlci5odG1sJyksXG4gICAgJ3V0ZjgnXG4pO1xuXG5jb25zdCBBUFBMRV9BUFBfU1RPUkVfSFJFRiA9XG4gICAgJ2h0dHBzOi8vaXR1bmVzLmFwcGxlLmNvbS91cy9hcHAvbGliYnktYnktb3ZlcmRyaXZlLWxhYnMvaWQxMDc2NDAyNjA2P3B0PTIxMTQ4MyZjdD1tZWV0TGliYnkmbXQ9OCZ1dG1fbWVkaXVtPXBvcF91cCZ1dG1fc291cmNlPW92ZXJkcml2ZV9hcHAmdXRtX2NhbXBhaWduPXN3aXRjaF90b19saWJieSZ1dG1fY29udGVudD1vZGFwcF9wb3B1cF9hcHBsZV9zdG9yZSc7XG5jb25zdCBHT09HTEVfUExBWV9TVE9SRV9IUkVGID1cbiAgICAnaHR0cHM6Ly9wbGF5Lmdvb2dsZS5jb20vc3RvcmUvYXBwcy9kZXRhaWxzP2lkPWNvbS5vdmVyZHJpdmUubW9iaWxlLmFuZHJvaWQubGliYnkmcmVmZXJyZXI9dXRtX3NvdXJjZSUzRG1lZXRfbGliYnkmdXRtX21lZGl1bT1wb3BfdXAmdXRtX3NvdXJjZT1vdmVyZHJpdmVfYXBwJnV0bV9jYW1wYWlnbj1zd2l0Y2hfdG9fbGliYnkmdXRtX2NvbnRlbnQ9b2RhcHBfcG9wdXBfZ29vZ2xlX3BsYXknO1xuXG5jb25zdCBUb2FzdGVyID0gQmFzZVZpZXcuZXh0ZW5kKHtcbiAgICBjbGFzc05hbWU6ICdUb2FzdGVyIGpzLXRvYXN0ZXJDb250ZW50JyxcblxuICAgIHRpbWVvdXQ6IG51bGwsXG5cbiAgICBsaW5lOiBudWxsLFxuXG4gICAgbG9hZjogW10sXG5cbiAgICBzdGFsZUxvYWY6IFtdLFxuXG4gICAgY3VycmVudFRvYXN0OiB7fSxcblxuICAgIGhvb2tzOiB7XG4gICAgICAgIHRpbWVyOiAnLmpzLXRvYXN0VGltZXInLFxuICAgICAgICBtZXNzYWdlOiAnLmpzLXRvYXN0TWVzc2FnZScsXG4gICAgICAgIHRvYXN0OiAnLmpzLXRvYXN0JyxcbiAgICAgICAgY2xvc2U6ICcuanMtY2xvc2VUb2FzdCcsXG4gICAgfSxcblxuICAgIHRvYXN0ZXJUeXBlczoge1xuICAgICAgICBtZXNzYWdlOiAnJyxcbiAgICAgICAgc3lzdGVtOiAnaXMtc3lzdGVtJyxcbiAgICAgICAgZXJyb3I6ICdpcy1idXJudCcsXG4gICAgICAgIHVzZXJBY3Rpb246ICdpcy11c2VyQWN0aW9uJyxcbiAgICB9LFxuXG4gICAgdGVtcGxhdGU6IF8udGVtcGxhdGUodGVtcGxhdGUpLFxuXG4gICAgZXZlbnRzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgW2BjbGljayAke3RoaXMuaG9va3MuY2xvc2V9YF06ICdjbG9zZVRvYXN0JyxcbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgaW5pdGlhbGl6ZSh7IHRhcmdldCB9KSB7XG4gICAgICAgIHRoaXMudGFyZ2V0ID0gdGFyZ2V0O1xuICAgIH0sXG5cbiAgICBjbG9zZVRvYXN0KCkge1xuICAgICAgICBjb25zdCAkZWxlbWVudCA9IHRoaXMuJCh0aGlzLmhvb2tzLm1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBicmVhZElkID0gJGVsZW1lbnQuYXR0cignaWQnKTtcblxuICAgICAgICBjb25zdCBrZXlzID0ge1xuICAgICAgICAgICAgJ2F1dG8tY2hlY2tvdXQtdG9hc3QnOiB7IG5hbWU6ICdhdXRvLWNoZWNrb3V0LXRvYXN0JywgdmFsdWU6ICcxJyB9LFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCB2YWx1ZSA9IGtleXNbYnJlYWRJZF07XG4gICAgICAgIGlmICh2YWx1ZSkge1xuICAgICAgICAgICAgQ29va2llcy5yZW1vdmUodmFsdWUubmFtZSwgeyBwYXRoOiAnLycgfSk7XG4gICAgICAgICAgICBDb29raWVzLnNldCh2YWx1ZS5uYW1lLCB2YWx1ZS52YWx1ZSwgeyBwYXRoOiAnLycsIGV4cGlyZXM6IDM2NSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChicmVhZElkID09PSAnc3lzdGVtLXRvYXN0Jykge1xuICAgICAgICAgICAgY29uc3QgbWVzc2FnZUlkID0gcGFyc2VJbnQoJGVsZW1lbnQuYXR0cignZGF0YS1tZXNzYWdlLWlkJyksIDEwKTtcbiAgICAgICAgICAgIGNvbnN0IGNvb2tpZSA9IENvb2tpZXMuZ2V0KCdzeXN0ZW0tbWVzc2FnaW5nJyk7XG4gICAgICAgICAgICBsZXQgbmV3Q29va2llID0ge307XG5cbiAgICAgICAgICAgIGlmIChjb29raWUpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBjb29raWVKU09OID0gSlNPTi5wYXJzZShjb29raWUpO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgdGhlIGNvb2tpZSBoYXMgYW4gYXR0cmlidXRlLCB0aGUgY29va2llIGlzIHZhbGlkIEpTT05cbiAgICAgICAgICAgICAgICBpZiAoY29va2llSlNPTi5vbGRlc3QgfHwgY29va2llSlNPTi5uZXdlc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgbmV3Q29va2llID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgb2xkZXN0OiBjb29raWVKU09OLm9sZGVzdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld2VzdDogY29va2llSlNPTi5uZXdlc3QsXG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcnNlSW50KGNvb2tpZUpTT04ub2xkZXN0LCAxMCkgPiBtZXNzYWdlSWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Nvb2tpZS5vbGRlc3QgPSBtZXNzYWdlSWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAocGFyc2VJbnQoY29va2llSlNPTi5uZXdlc3QsIDEwKSA8IG1lc3NhZ2VJZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbmV3Q29va2llLm5ld2VzdCA9IG1lc3NhZ2VJZDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFVzZXIgaGFzIG9sZCBjb29raWUgdmFsdWUgdGhhdCB3YXMgb25seSBhbiBpbnRlZ2VyXG4gICAgICAgICAgICAgICAgICAgIC8vIFNldHRpbmcgdGhpcyB3YXkgdG8gZ2V0IHRoZSBmb3JtIG9mIHRoZSBwcm9wZXIgY29va2llXG4gICAgICAgICAgICAgICAgICAgIG5ld0Nvb2tpZSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9sZGVzdDogbWVzc2FnZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmV3ZXN0OiBtZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBVc2VyIGRvZXMgbm90IGhhdmUgc3lzdGVtLW1lc3NhZ2luZyBjb29raWUgc2V0XG4gICAgICAgICAgICAgICAgbmV3Q29va2llID0ge1xuICAgICAgICAgICAgICAgICAgICBvbGRlc3Q6IG1lc3NhZ2VJZCxcbiAgICAgICAgICAgICAgICAgICAgbmV3ZXN0OiBtZXNzYWdlSWQsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgQ29va2llcy5yZW1vdmUoJ3N5c3RlbS1tZXNzYWdpbmcnLCB7IHBhdGg6ICcvJyB9KTtcbiAgICAgICAgICAgIENvb2tpZXMuc2V0KCdzeXN0ZW0tbWVzc2FnaW5nJywgbmV3Q29va2llLCB7XG4gICAgICAgICAgICAgICAgcGF0aDogJy8nLFxuICAgICAgICAgICAgICAgIGV4cGlyZXM6IDM2NSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGJyZWFkSWQgPT0gJ3Rscy13YXJuaW5nJykge1xuICAgICAgICAgICAgQ29va2llcy5yZW1vdmUoJ3Rscy13YXJuaW5nJywgeyBwYXRoOiAnLycgfSk7XG4gICAgICAgICAgICBDb29raWVzLnNldCgndGxzLXdhcm5pbmcnLCAnZGlzbWlzc2VkJywgeyBwYXRoOiAnLycsIGV4cGlyZXM6IDE0IH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wb3AoKTtcbiAgICAgICAgLy8gSWYgdGhlcmUgd2FzIGEgdG9hc3QgZGlzcGxheWluZyBhbHJlYWR5IHdoZW4gdGhlIGp1c3QgY2xvc2VkIHRvYXN0IHdhcyBwdXNoZWQsIGRpc3BsYXkgdGhhdCB0b2FzdFxuICAgICAgICBpZiAodGhpcy5zdGFsZUxvYWYubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5sb2FmLnB1c2godGhpcy5zdGFsZUxvYWYucG9wKCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY3VycmVudFRvYXN0ID0ge307XG4gICAgICAgIHRoaXMuc2hvd05leHRUb2FzdCgpO1xuICAgIH0sXG5cbiAgICAvKlxuICAgICAqIEVuc3VyZXMgbmV3bHkgZ2VuZXJhdGVkIHRvYXN0IGlzIHZpc2libGUuXG4gICAgICovXG4gICAgZW5zdXJlVmlzaWJpbGl0eSgpIHtcbiAgICAgICAgdGhpcy5lbnN1cmVPblRvcCgpO1xuICAgICAgICB0aGlzLmVuc3VyZUluVmlld3BvcnQoKTtcbiAgICAgICAgdGhpcy5zZXRQbGFjZWhvbGRlckhlaWdodCgpO1xuICAgIH0sXG5cbiAgICAvKlxuICAgICAqIFNob3cgbmV3bHkgcG9wcGVkIHRvYXN0IG9uIHRvcCBvZiBtb2RhbCBiYWNrZ3JvdW5kXG4gICAgICovXG4gICAgZW5zdXJlT25Ub3AoKSB7XG4gICAgICAgIGlmICgkKCcucmV2ZWFsLW1vZGFsLm9wZW4nKS5oYXNDbGFzcygnSG9sZFN1Y2Nlc3NNb2RhbCcpKSB7XG4gICAgICAgICAgICB0aGlzLiRlbC5jc3Moe1xuICAgICAgICAgICAgICAgICd6LWluZGV4JzogJzk5OTk5JyxcbiAgICAgICAgICAgICAgICAnLXdlYmtpdC10cmFuc2Zvcm0nOiAndHJhbnNsYXRlM2QoMCwwLDFweCknLFxuICAgICAgICAgICAgICAgIHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKDAsMCwxcHgpJyxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJ2ZpeGVkJyxcbiAgICAgICAgICAgICAgICB0b3A6ICcwIWltcG9ydGFudCcsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuJGVsLmNzcyh7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdpbmhlcml0JyxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qXG4gICAgICogQXV0b21hdGljYWxseSBzY3JvbGwgdG8gdG9wIG9mIHBhZ2Ugb24gZWFybGllciBhbmRyb2lkIGRldmljZXMuXG4gICAgICogKFRoZXkgZG8gbm90IHN1cHBvcnQgcG9zaXRpb246Zml4ZWQgd2VsbCkuXG4gICAgICovXG4gICAgZW5zdXJlSW5WaWV3cG9ydCgpIHtcbiAgICAgICAgaWYgKGJvd3NlciAmJiBib3dzZXIuYW5kcm9pZCkge1xuICAgICAgICAgICAgY29uc3QgYW5kcm9pZFZlcnNpb24gPSBwYXJzZUludChib3dzZXIub3N2ZXJzaW9uLCAxMCk7XG4gICAgICAgICAgICBpZiAoYW5kcm9pZFZlcnNpb24gPCAzKSB7XG4gICAgICAgICAgICAgICAgJCh3aW5kb3cpLnNjcm9sbFRvcCgwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBTZXQgaGVpZ2h0IG9mIHRvYXN0IHBsYWNlaG9sZGVyIHNvIHRoZSBwYWdlIGRvZXNuJ3QganVtcFxuICAgIHNldFBsYWNlaG9sZGVySGVpZ2h0KCkge1xuICAgICAgICAkKCcuanMtdG9hc3RQbGFjZWhvbGRlcicpLmNzcygnaGVpZ2h0JywgdGhpcy4kZWwuaGVpZ2h0KCkpO1xuICAgIH0sXG5cbiAgICAvKlxuICAgICAqIEdlbmVyYXRlIGEgc3VjY2VzcyB0b2FzdCBtZXNzYWdlXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGJyZWFkIFRoZSBtZXNzYWdlIHRvIHBsYWNlIGluIHRoZSB0b2FzdFxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSB0b2FzdGVyVHlwZSBUeXBlIG9mIHRvYXN0XG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGlkIElkIG9mIHRoZSB0b2FzdFxuICAgICAqIEBwYXJhbSB7aW50fSBtZXNzYWdlSWQgTWVzc2FnZSBpZCBvZiBzeXN0ZW0gdG9hc3RzLiBOZWVkZWQgb25seSBmb3Igc3lzdGVtIHRvYXN0c1xuICAgICAqL1xuICAgIHB1c2gobWVzc2FnZSwgdG9hc3RlclR5cGUgPSAnbWVzc2FnZScsIGlkID0gJycsIG1lc3NhZ2VJZCA9IDApIHtcbiAgICAgICAgaWYgKG1lc3NhZ2UgJiYgbWVzc2FnZSAhPT0gJycpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZi5wdXNoKHsgbWVzc2FnZSwgdG9hc3RlclR5cGUsIGlkLCBtZXNzYWdlSWQgfSk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zaG93TmV4dFRvYXN0KCk7XG4gICAgfSxcblxuICAgIC8qXG4gICAgICogUHVzaCBhcnJheSBvZiBzeXN0ZW0gbWVzc2FnZXMgdG8gbG9hZlxuICAgICAqIEBwYXJhbSBtc2dBcnIgQXJyYXkgb2Ygc3lzdGVtIG1lc3NhZ2VzXG4gICAgICovXG4gICAgYnVsa1N5c3RlbU1zZ1B1c2gobXNnQXJyKSB7XG4gICAgICAgIGxldCBtZXNzYWdlcyA9IG1zZ0FycjtcblxuICAgICAgICB0aGlzLmxvYWYgPSB0aGlzLmxvYWYuY29uY2F0KG1lc3NhZ2VzKTtcbiAgICAgICAgdGhpcy5zaG93TmV4dFRvYXN0KCk7XG4gICAgfSxcblxuICAgIC8qXG4gICAgICogU2hvdyBuZXh0IG1lc3NhZ2UgaW4gbG9hZlxuICAgICAqL1xuICAgIHNob3dOZXh0VG9hc3QoKSB7XG4gICAgICAgIGlmICh0aGlzLmxvYWYubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgY29uc3QgbmV4dFRvYXN0ID0gdGhpcy5sb2FmLnBvcCgpO1xuICAgICAgICAgICAgbmV4dFRvYXN0LnRvYXN0ZXJUeXBlID1cbiAgICAgICAgICAgICAgICB0aGlzLnRvYXN0ZXJUeXBlc1tuZXh0VG9hc3QudG9hc3RlclR5cGVdIHx8XG4gICAgICAgICAgICAgICAgbmV4dFRvYXN0LnRvYXN0ZXJUeXBlO1xuICAgICAgICAgICAgLy8gRG8gbm90IHN0YWNrIHVzZXIgYWN0aW9uIChib3Jyb3csIGhvbGQsIHdpc2hsaXN0KSB0b2FzdHNcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAhXy5pc0VtcHR5KHRoaXMuY3VycmVudFRvYXN0KSAmJlxuICAgICAgICAgICAgICAgIHRoaXMuY3VycmVudFRvYXN0LnRvYXN0ZXJUeXBlICE9PSB0aGlzLnRvYXN0ZXJUeXBlcy51c2VyQWN0aW9uXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICB0aGlzLnN0YWxlTG9hZi5wdXNoKHRoaXMuY3VycmVudFRvYXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVUb2FzdChuZXh0VG9hc3QpO1xuICAgICAgICAgICAgdGhpcy5jdXJyZW50VG9hc3QgPSBuZXh0VG9hc3Q7XG4gICAgICAgICAgICB0aGlzLmVuc3VyZVZpc2liaWxpdHkoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFN0b3Agc2hvd2luZyB0b2FzdCBwbGFjZWhvbGRlclxuICAgICAgICAgICAgJCgnLmpzLXRvYXN0UGxhY2Vob2xkZXInKS5oaWRlKCk7XG4gICAgICAgICAgICAkKHdpbmRvdykudW5iaW5kKCdzY3JvbGwudG9hc3QnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKlxuICAgICAqIEdlbmVyYXRlIHRvYXN0IFVJXG4gICAgICogQHBhcmFtIGRhdGEgVG9hc3Qgb2JqZWN0XG4gICAgICovXG4gICAgZ2VuZXJhdGVUb2FzdChkYXRhKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnTm90aWZpY2F0aW9ucycpICYmXG4gICAgICAgICAgICB3aW5kb3cubm90aWZpY2F0aW9uRHJhd2VyICYmXG4gICAgICAgICAgICB3aW5kb3cubm90aWZpY2F0aW9uRHJhd2VyLmlzT3BlblxuICAgICAgICApIHtcbiAgICAgICAgICAgIHdpbmRvdy5ub3RpZmljYXRpb25EcmF3ZXIuY2xvc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnN0IGRlZmF1bHRUZW1wbGF0ZURhdGEgPSB7XG4gICAgICAgICAgICBhcHBsZUFwcFN0b3JlSHJlZjogQVBQTEVfQVBQX1NUT1JFX0hSRUYsXG4gICAgICAgICAgICBnb29nbGVQbGF5U3RvcmVIcmVmOiBHT09HTEVfUExBWV9TVE9SRV9IUkVGLFxuICAgICAgICAgICAgaGlnaENvbnRyYXN0OiB3aW5kb3cuT3ZlckRyaXZlLmhpZ2hDb250cmFzdCxcbiAgICAgICAgICAgIGhvb2tzOiB0aGlzLmhvb2tzLFxuICAgICAgICAgICAgbWVzc2FnZUlkOiAwLFxuICAgICAgICAgICAgdG9hc3RlclR5cGU6IHRoaXMudG9hc3RlclR5cGVzLm1lc3NhZ2UsXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IHRlbXBsYXRlRGF0YSA9IF8uZXh0ZW5kKHt9LCBkZWZhdWx0VGVtcGxhdGVEYXRhLCBkYXRhKTtcbiAgICAgICAgdGhpcy5wb3AoKTtcblxuICAgICAgICB0aGlzLnRlbXBsYXRlID0gc3RhbmRhcmRUb2FzdDtcblxuICAgICAgICB0aGlzLnJlbmRlcih7IHRlbXBsYXRlRGF0YSB9KTtcblxuICAgICAgICB0aGlzLl9zdGlja1RvYXN0KCk7XG4gICAgICAgICQod2luZG93KS5vbignb3JpZW50YXRpb25jaGFuZ2UnLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9zdGlja1RvYXN0KCk7XG4gICAgICAgIH0pO1xuICAgICAgICAkKHdpbmRvdykub24oJ3Jlc2l6ZScsICgpID0+IHtcbiAgICAgICAgICAgIHRoaXMuX3N0aWNrVG9hc3QoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy4kKHRoaXMuaG9va3MubWVzc2FnZSkuZm9jdXMoKTtcbiAgICB9LFxuXG4gICAgLypcbiAgICAgKiBSZW1vdmUgdGhlIGN1cnJlbnRseSBkaXNwbGF5ZWQgdG9hc3QgbWVzc2FnZVxuICAgICAqL1xuICAgIHBvcCgpIHtcbiAgICAgICAgY29uc3QgdG9hc3QgPSB0aGlzLiQodGhpcy5ob29rcy50b2FzdCk7XG4gICAgICAgIHRvYXN0LnJlbW92ZUNsYXNzKCdhbmltYXRlZCBmYWRlSW4nKS5hZGRDbGFzcygnYW5pbWF0ZWQgZmFkZU91dCcpO1xuICAgICAgICB0b2FzdC5vbmUoXG4gICAgICAgICAgICAnd2Via2l0QW5pbWF0aW9uRW5kIG1vekFuaW1hdGlvbkVuZCBNU0FuaW1hdGlvbkVuZCBvYW5pbWF0aW9uZW5kIGFuaW1hdGlvbmVuZCcsXG4gICAgICAgICAgICB0b2FzdC5yZW1vdmUoKVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICAvKlxuICAgICAqIE1ha2UgdGhlIHRvYXN0IG1lc3NhZ2Ugc3RpY2t5XG4gICAgICogQHByaXZhdGVcbiAgICAgKi9cbiAgICBfc3RpY2tUb2FzdCgpIHtcbiAgICAgICAgY29uc3Qgd2lkdGggPSAkKHdpbmRvdykud2lkdGgoKTtcbiAgICAgICAgY29uc3Qgc2Nyb2xsVG9wID1cbiAgICAgICAgICAgICQod2luZG93KS5zY3JvbGxUb3AoKSAtICQoJy5qcy10b2FzdGVyJykub3V0ZXJIZWlnaHQodHJ1ZSk7XG4gICAgICAgIGNvbnN0IHRvYXN0ID0gdGhpcy4kZWw7XG4gICAgICAgIGNvbnN0IHNraXBIZWlnaHQgPSAkKCdkaXYuc2tpcC1saW5rcycpLmlzKCc6dmlzaWJsZScpXG4gICAgICAgICAgICA/ICQoJ2Rpdi5za2lwLWxpbmtzJykub3V0ZXJIZWlnaHQodHJ1ZSlcbiAgICAgICAgICAgIDogMDtcbiAgICAgICAgY29uc3QgbW9iaWxlTmF2SGVpZ2h0ID0gJCgnLmpzLW1vYmlsZU5hdicpLm91dGVySGVpZ2h0KHRydWUpO1xuICAgICAgICBjb25zdCBuYXZNZW51SGVpZ2h0ID0gJCgnLmpzLW5hdicpLmlzKCc6dmlzaWJsZScpXG4gICAgICAgICAgICA/ICQoJy5qcy1uYXYnKS5vdXRlckhlaWdodCh0cnVlKVxuICAgICAgICAgICAgOiAwO1xuICAgICAgICBjb25zdCBleHBhbmRlZFNlYXJjaEhlaWdodCA9ICQoJy5qcy1uYXYtc2VhcmNoLWRyb3AnKS5pcygnOnZpc2libGUnKVxuICAgICAgICAgICAgPyAkKCcuanMtbmF2LXNlYXJjaC1kcm9wJykub3V0ZXJIZWlnaHQodHJ1ZSlcbiAgICAgICAgICAgIDogMDtcbiAgICAgICAgbGV0IG5hdkhlaWdodCA9IDA7XG5cbiAgICAgICAgLy8gTW9iaWxlIHRvYXN0ZXIgbG9naWNcbiAgICAgICAgaWYgKHdpZHRoIDw9IDg3MCkge1xuICAgICAgICAgICAgbmF2SGVpZ2h0ID0gbmF2TWVudUhlaWdodCArIG1vYmlsZU5hdkhlaWdodCArIHNraXBIZWlnaHQ7XG4gICAgICAgIH0gZWxzZSBpZiAod2lkdGggPiA4NzApIHtcbiAgICAgICAgICAgIC8vIERlc2t0b3AgdG9hc3RlciBsb2dpY1xuICAgICAgICAgICAgbmF2SGVpZ2h0ID0gbmF2TWVudUhlaWdodCArIGV4cGFuZGVkU2VhcmNoSGVpZ2h0ICsgc2tpcEhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBob2xkIHN1Y2Nlc3MgbW9kYWwgaXMgb3BlbiwgdGFrZSBzcGVjaWFsIGFjdGlvbiB3aXRoIHRvYXN0XG4gICAgICAgIC8vIE90aGVyd2lzZSwgaGFuZGxlIHRvYXN0IGFzIG5vcm1hbFxuICAgICAgICBpZiAoJCgnLnJldmVhbC1tb2RhbC5vcGVuJykuaGFzQ2xhc3MoJ2pzLWhvbGRTdWNjZXNzTW9kYWwnKSkge1xuICAgICAgICAgICAgLy8gU2V0cyBwb3NpdGlvbiB0byBmaXhlZCBhbmQgdG9wIHRvIDBcbiAgICAgICAgICAgIHRvYXN0LmFkZENsYXNzKCdzdGlja3knKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuJGVsLmNzcyh7XG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICdpbmhlcml0JyxcbiAgICAgICAgICAgICAgICAnei1pbmRleCc6ICc5OTgnLFxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRvYXN0LmNzcygndG9wJywgbmF2SGVpZ2h0KTtcbiAgICAgICAgICAgIGlmIChzY3JvbGxUb3AgPj0gbmF2SGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgdG9hc3QuYWRkQ2xhc3MoJ3N0aWNreScpO1xuICAgICAgICAgICAgICAgICQoJy5qcy10b2FzdFBsYWNlaG9sZGVyJykuc2hvdygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0b2FzdC5yZW1vdmVDbGFzcygnc3RpY2t5Jyk7XG4gICAgICAgICAgICAgICAgJCgnLmpzLXRvYXN0UGxhY2Vob2xkZXInKS5oaWRlKCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICQod2luZG93KS5vbignc2Nyb2xsLnRvYXN0JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRvYXN0LnRvZ2dsZUNsYXNzKCdzdGlja3knLCAkKHdpbmRvdykuc2Nyb2xsVG9wKCkgPiBuYXZIZWlnaHQpO1xuICAgICAgICAgICAgICAgIGlmICh0b2FzdC5oYXNDbGFzcygnc3RpY2t5JykpIHtcbiAgICAgICAgICAgICAgICAgICAgJCgnLmpzLXRvYXN0UGxhY2Vob2xkZXInKS5zaG93KCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgJCgnLmpzLXRvYXN0UGxhY2Vob2xkZXInKS5oaWRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IG5ldyBUb2FzdGVyKHsgdGFyZ2V0OiAnLmpzLXRvYXN0ZXInIH0pO1xuIiwiaW1wb3J0IHsgdG9TdGF0aWNVcmwgfSBmcm9tICcuLi8uLi8uLi8uLi9saWIvYXNzZXRNYXBwZXInO1xuaW1wb3J0IHsgbGliYnlBcHBHcm91cCB9IGZyb20gJy4uL2xpYmJ5LWFwcC1ncm91cC9saWJieS1hcHAtZ3JvdXAuaHRtbCc7XG5cbmNvbnN0IGh0bWwgPSAoa2V5KSA9PiB3aW5kb3cuaHRtbChrZXkpO1xuXG5jb25zdCB0b2FzdCA9ICh7XG4gICAgY29sdW1ucyA9IDEwLFxuICAgIGlkLFxuICAgIG1lc3NhZ2UsXG4gICAgbWVzc2FnZUlkLFxuICAgIHNob3dEaXNtaXNzQnV0dG9uLFxuICAgIHRvYXN0ZXJUeXBlLFxufSkgPT4gYFxuICAgIDxkaXYgY2xhc3M9XCJUb2FzdGVyLXRvYXN0IGpzLXRvYXN0ICR7dG9hc3RlclR5cGV9IGFuaW1hdGVkIGZhZGVJblwiIHJvbGU9XCJhbGVydFwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicm93XCI+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwibGFyZ2UtJHtjb2x1bW5zfSBsYXJnZS1jZW50ZXJlZCBtZWRpdW0tJHtjb2x1bW5zfSBtZWRpdW0tY2VudGVyZWQgY29sdW1uc1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJUb2FzdGVyLWJyZWFkXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgcm9sZT1cImFsZXJ0XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cIlRvYXN0ZXItbWVzc2FnZSBqcy10b2FzdE1lc3NhZ2UgVG9hc3Rlci1tZXNzYWdlQ29udGVudFwiIFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCIwXCIgXG4gICAgICAgICAgICAgICAgICAgICAgICBpZD1cIiR7aWR9XCIgXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRhLW1lc3NhZ2UtaWQ9XCIke21lc3NhZ2VJZH1cIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICR7bWVzc2FnZX1cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgICAgICAke1xuICAgICAgICAgICAgICAgICAgICAgICAgc2hvd0Rpc21pc3NCdXR0b25cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGBcbiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJpYS1sYWJlbD1cIiR7aHRtbCgndG9hc3RzLmRpc21pc3NBcmlhJyl9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzcz1cImpzLWNsb3NlVG9hc3QgVG9hc3Rlci1jbG9zZVwiPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aW1lcztcbiAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICBgXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAnJ1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG5gO1xuXG5leHBvcnQgY29uc3Qgc3RhbmRhcmRUb2FzdCA9ICh7IGlkLCBtZXNzYWdlLCBtZXNzYWdlSWQsIHRvYXN0ZXJUeXBlIH0pID0+XG4gICAgdG9hc3QoeyBpZCwgbWVzc2FnZSwgbWVzc2FnZUlkLCBzaG93RGlzbWlzc0J1dHRvbjogdHJ1ZSwgdG9hc3RlclR5cGUgfSk7XG4iLCJpbXBvcnQgeyBNb2RhbCB9ICAgICAgICAgICAgICAgICAgICAgICAgZnJvbSAnLi4vY29tbW9uL21vZGFsJztcblxuY29uc3QgeyB0ZXh0IH0gPSB3aW5kb3c7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZpc2l0b3JBY3Rpb25EaXNhbGxvd2VkTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XG4gICAgY29uc3RydWN0b3IoYWN0aW9uKSB7XG4gICAgICAgIGxldCBhY3Rpb25UZXh0ID0gdGV4dChgdmlzaXRvckFjdGlvbkRpc2FsbG93ZWRNb2RhbC4ke2FjdGlvbi50cmltKCkudG9Mb3dlckNhc2UoKX1gKTtcbiAgICAgICAgaWYgKCFhY3Rpb25UZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYCcke2FjdGlvbn0nIGlzIG5vdCBhIHN1cHBvcnRlZCBhY3Rpb25gKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbWVzc2FnZSA9IHRleHQoJ3Zpc2l0b3JBY3Rpb25EaXNhbGxvd2VkTW9kYWwubWVzc2FnZScsIHtsaWJyYXJ5TmFtZTogd2luZG93Lk92ZXJEcml2ZS5saWJyYXJ5TmFtZSwgYWN0aW9uOiBhY3Rpb25UZXh0fSk7XG4gICAgICAgIGNvbnN0IG1vZGFsQ29udGVudHMgPSB7XG4gICAgICAgICAgICBjbGFzc2VzOiBbJ1Zpc2l0b3JBY3Rpb25EaXNhbGxvd2VkTW9kYWwnXSxcbiAgICAgICAgICAgIHRpdGxlOiB0ZXh0KCd2aXNpdG9yQWN0aW9uRGlzYWxsb3dlZE1vZGFsLmhlYWRpbmcnKSxcbiAgICAgICAgICAgIGNvbnRlbnQ6IGA8cD4ke21lc3NhZ2V9PC9wPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz0nYnV0dG9uLWNvbnRhaW5lcic+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSdidXR0b24nIGNsYXNzPSdjb25maXJtLWJ1dHRvbiBidXR0b24gcmFkaXVzIHNlY29uZGFyeSBjb250cmFzdCB1LWFsbENhcHMnPiR7aHRtbCgnb2snKX08L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDwvZGl2PmBcbiAgICAgICAgfTtcblxuICAgICAgICBzdXBlcihtb2RhbENvbnRlbnRzKTtcblxuICAgICAgICB0aGlzLiRlbC5maW5kKCcuY29uZmlybS1idXR0b24nKS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICB0aGlzLmNsb3NlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cbiIsImltcG9ydCBjcmVhdGVDb21wb25lbnRRdWlja1NlYXJjaENvbXBvbmVudCBmcm9tICcuL2NvbXBvbmVudHMvcXVpY2tfc2VhcmNoL21haW4uanMnO1xuaW1wb3J0IGNyZWF0ZUhvbGRzUmF0aW9Nb2RhbENvbXBvbmVudCBmcm9tICcuL2NvbXBvbmVudHMvaG9sZEluZm9ybWF0aW9uL21haW4uanMnO1xuaW1wb3J0IGNyZWF0ZUxhbmd1YWdlU2VsZWN0aW9uQ29tcG9uZW50IGZyb20gJy4vY29tcG9uZW50cy9sYW5ndWFnZV9zZWxlY3Rpb24vbWFpbi5qcyc7XG5pbXBvcnQgY3JlYXRlTW9iaWxlQWNjb3VudE1lbnVDb21wb25lbnQgZnJvbSAnLi9jb21wb25lbnRzL21vYmlsZV9hY2NvdW50X21lbnUvbWFpbi5qcyc7XG5pbXBvcnQgZXhwZW5zaXZlRG9tVHJhdmVyc2FsRm9yRHlzbGV4aWNJZkNvb2tpZVBsZWFzZURvTm90VXNlIGZyb20gJy4vdXRpbC9keXNsZXhpYy9leHBlbnNpdmVEb21UcmF2ZXJzYWxGb3JEeXNsZXhpY0lmQ29va2llUGxlYXNlRG9Ob3RVc2UuanMnO1xuaW1wb3J0IHsgcmVtb3ZlQ2Fyb3VzZWxGdW5jdGlvbkZvck9sZEFuZHJvaWQgfSBmcm9tICcuL3V0aWwvY29tcGF0aWJpbGl0eS9yZW1vdmVDYXJvdXNlbEZ1bmN0aW9uYWxpdHkuanMnO1xuaW1wb3J0IEhpc3RvcnlFdmVudFRyYWNrZXIgZnJvbSAnLi9jb21wb25lbnRzL2hpc3RvcnlfZXZlbnRfdHJhY2tlci9IaXN0b3J5RXZlbnRUcmFja2VyJztcbmltcG9ydCBzdmdMb2FkZXIgZnJvbSAnLi91dGlsL3N2Z0xvYWRlcic7XG5pbXBvcnQgQ29va2llU2V0dGluZ3NNb2RhbCBmcm9tICcuL2NvbXBvbmVudHMvY29va2llX3NldHRpbmdzX21vZGFsL2Nvb2tpZVNldHRpbmdzTW9kYWwnO1xuaW1wb3J0IE5vdGlmaWNhdGlvbkRyYXdlciBmcm9tICcuL2NvbXBvbmVudHMvbm90aWZpY2F0aW9uc19kcmF3ZXIvTm90aWZpY2F0aW9uc0RyYXdlcic7XG5pbXBvcnQga2V5cyBmcm9tICcuLi9lY21hc2NyaXB0L3V0aWwva2V5Y29kZXMnO1xuaW1wb3J0IFRsc1dhcm5pbmdNb2RhbCBmcm9tICcuL2NvbXBvbmVudHMvdGxzLXdhcm5pbmctbW9kYWwvdGxzV2FybmluZ01vZGFsLmpzJztcblxuLypcbiAqIEEgZnVuY3Rpb24gZnVsbCBvZiBmdW5jdGlvbnMgdG8gYmUgcnVuIG9uIGRvY3VtZW50IHJlYWR5XG4gKi9cbmNvbnN0IG9uRG9jdW1lbnRSZWFkeSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoIXdpbmRvdy5PdmVyRHJpdmUuaXNNaW5pbWFsTGF5b3V0KSB7XG4gICAgICAgIGNyZWF0ZUxhbmd1YWdlU2VsZWN0aW9uQ29tcG9uZW50KHtcbiAgICAgICAgICAgIGVsOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtbGFuZ3VhZ2VTZWxlY3Rpb24nKSxcbiAgICAgICAgICAgIGZvb3RlckVsOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtbGFuZ3VhZ2VTZWxlY3Rpb25Gb290ZXInKSxcbiAgICAgICAgICAgIG1vYmlsZUVsOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtbGFuZ3VhZ2VNb2JpbGVTZWxlY3Rpb24nKSxcbiAgICAgICAgICAgIG1vYmlsZUZvb3RlckVsOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgICAgICcuanMtbGFuZ3VhZ2VNb2JpbGVTZWxlY3Rpb25Gb290ZXInXG4gICAgICAgICAgICApLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDcmVhdGUgYW5kIGF0dGFjaCBob2xkcyByYXRpbyBoZWxwIG1vZGFsXG4gICAgICAgIGNyZWF0ZUhvbGRzUmF0aW9Nb2RhbENvbXBvbmVudCh7XG4gICAgICAgICAgICBlbDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYm9keScpLFxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDcmVhdGUgYW5kIGF0dGFjaCBkZXNrdG9wIGF1dG9jb21wbGV0ZSBjb21wb25lbnRcbiAgICAgICAgY3JlYXRlQ29tcG9uZW50UXVpY2tTZWFyY2hDb21wb25lbnQoe1xuICAgICAgICAgICAgc2VhcmNoRWw6IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5qcy1kZXNrdG9wU2VhcmNoQ29udGFpbmVyJyksXG4gICAgICAgICAgICBhdXRvY29tcGxldGlvbnNFbDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgICAnLmpzLXF1aWNrU2VhcmNoQXV0b2NvbXBsZXRpb25zRGVza3RvcCdcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB0b2dnbGVTZWFyY2hFbDogJCgnLmRlc2t0b3AgLmpzLXRvZ2dsZVNlYXJjaCcpLFxuICAgICAgICAgICAgb3B0aW9uczogeyBkZXNrdG9wOiB0cnVlIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIENyZWF0ZSBhbmQgYXR0YWNoIG1vYmlsZSBhdXRvY29tcGxldGUgY29tcG9uZW50XG4gICAgICAgIGNyZWF0ZUNvbXBvbmVudFF1aWNrU2VhcmNoQ29tcG9uZW50KHtcbiAgICAgICAgICAgIHNlYXJjaEVsOiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtbW9iaWxlU2VhcmNoQ29udGFpbmVyJyksXG4gICAgICAgICAgICBhdXRvY29tcGxldGlvbnNFbDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICAgICAnLmpzLXF1aWNrU2VhcmNoQXV0b2NvbXBsZXRpb25zTW9iaWxlJ1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIHRvZ2dsZVNlYXJjaEVsOiAkKCcuZGVza3RvcCAuanMtdG9nZ2xlU2VhcmNoJyksXG4gICAgICAgICAgICBvcHRpb25zOiB7IG1vYmlsZTogdHJ1ZSB9LFxuICAgICAgICB9KTtcblxuICAgICAgICBjcmVhdGVNb2JpbGVBY2NvdW50TWVudUNvbXBvbmVudCh7XG4gICAgICAgICAgICBlbDogZG9jdW1lbnQucXVlcnlTZWxlY3RvcignLm5hdi1jb250YWluZXInKSxcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRG8gZXhwZW5zaXZlIHRyYXZlcnNhbCBmb3IgZHlzbGV4aWMgaWYgY29va2llIHNldFxuICAgICAgICBleHBlbnNpdmVEb21UcmF2ZXJzYWxGb3JEeXNsZXhpY0lmQ29va2llUGxlYXNlRG9Ob3RVc2UoKTtcblxuICAgICAgICAvLyBSZW1vdmUgY2Fyb3VzZWwgZnVuY3Rpb25hbGl0eSBvbiBvbGQgYW5kcm9pZHNcbiAgICAgICAgcmVtb3ZlQ2Fyb3VzZWxGdW5jdGlvbkZvck9sZEFuZHJvaWQoYm93c2VyKTtcblxuICAgICAgICAvLyBuZXcgaGlzdG9yeSB0cmFja2VyIHVzaW5nIGNvb2tpZXMgZm9yIGF1dG8gc2Nyb2xsIGFuZCBiYWNrIGJ1dHRvbiByZWRpcmVjdFxuICAgICAgICBuZXcgSGlzdG9yeUV2ZW50VHJhY2tlcigpO1xuXG4gICAgICAgIHN2Z0xvYWRlcigpO1xuXG4gICAgICAgIGlmICh3aW5kb3cuT3ZlckRyaXZlLnNob3dDb29raWVTZXR0aW5nc01vZGFsKSB7XG4gICAgICAgICAgICBuZXcgQ29va2llU2V0dGluZ3NNb2RhbCh7IGlzRGlzbWlzc2FibGU6IGZhbHNlIH0pLnJlbmRlcigpO1xuICAgICAgICB9XG5cbiAgICAgICAgJCgnLmNvb2tpZVNldHRpbmdzQnV0dG9uJykub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgbmV3IENvb2tpZVNldHRpbmdzTW9kYWwoeyBpc0Rpc21pc3NhYmxlOiB0cnVlIH0pLnJlbmRlcigpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICB3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdOb3RpZmljYXRpb25zJykgJiZcbiAgICAgICAgICAgIHdpbmRvdy5PdmVyRHJpdmUuaXNBdXRoZW50aWNhdGVkXG4gICAgICAgICkge1xuICAgICAgICAgICAgLy8gV2UgZG9uJ3Qgd2FudCB0byBhdHRhY2ggdGhpcyB0byBib3RoIHRoZSBtb2JpbGUgYW5kIGRlc2t0b3AgbmF2IHRhcmdldHMgc2ltdWx0YW5lb3VzbHkuXG4gICAgICAgICAgICB3aW5kb3cubm90aWZpY2F0aW9uRHJhd2VyID0gbmV3IE5vdGlmaWNhdGlvbkRyYXdlcigpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgICB0b2FzdGVyICYmXG4gICAgICAgIHdpbmRvdy5PdmVyRHJpdmUuaW5zdWZmaWNpZW50VGxzICYmXG4gICAgICAgIHdpbmRvdy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ3Nob3ctdGxzLXZlcnNpb24td2FybmluZycpICYmXG4gICAgICAgICFDb29raWVzLmdldCgndGxzLXdhcm5pbmcnKVxuICAgICkge1xuICAgICAgICB2YXIgbGluayA9IGA8YSBocmVmPVwiaHR0cHM6Ly9oZWxwLm92ZXJkcml2ZS5jb20vZW4tdXMvMjI3MS5odG1cIiB0YXJnZXQ9XCJfYmxhbmtcIiByZWw9XCJub3JlZmVycmVyXCI+JHt3aW5kb3cuaHRtbChcbiAgICAgICAgICAgICd0bHNXYXJuaW5nLmxlYXJuTW9yZSdcbiAgICAgICAgKX0gPjwvYT5gO1xuICAgICAgICB0b2FzdGVyLnB1c2goXG4gICAgICAgICAgICBgJHt3aW5kb3cuaHRtbCgndGxzV2FybmluZy5ub0FjY2VzcycpfSAke2xpbmt9YCxcbiAgICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgICAndGxzLXdhcm5pbmcnXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKHdpbmRvdy5PdmVyRHJpdmUuc2hvd1Rsc1dhcm5pbmdNb2RhbCkge1xuICAgICAgICBuZXcgVGxzV2FybmluZ01vZGFsKCk7XG4gICAgfVxuXG4gICAgLy8gQ2xvc2UgZm91bmRhdGlvbiBkcm9wZG93bnMgd2l0aCBFU0MgYW5kIHJldHVybiBmb2N1cyB0byBwYXJlbnRcbiAgICAkKGRvY3VtZW50KS5rZXl1cChmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAoXG4gICAgICAgICAgICB3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdjbG9zZS1kcm9wZG93bnMtb24tZXNjJykgJiZcbiAgICAgICAgICAgIGUud2hpY2ggPT09IGtleXMuRVNDICYmXG4gICAgICAgICAgICAkKCcuZi1vcGVuLWRyb3Bkb3duJykubGVuZ3RoID4gMFxuICAgICAgICApIHtcbiAgICAgICAgICAgIHZhciBpZCA9ICQoJy5mLW9wZW4tZHJvcGRvd24nKS5hdHRyKCdpZCcpO1xuICAgICAgICAgICAgJChkb2N1bWVudCkuZm91bmRhdGlvbignZHJvcGRvd24nLCAnY2xvc2VhbGwnKTtcbiAgICAgICAgICAgICQoYFtkYXRhLWRyb3Bkb3duPSR7aWR9XWApLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IG9uRG9jdW1lbnRSZWFkeTtcbiIsImltcG9ydCBvbkRvY3VtZW50UmVhZHkgZnJvbSAnLi9kb2N1bWVudF9yZWFkeSc7XG5pbXBvcnQgb25XaW5kb3dQYWdlc2hvdyBmcm9tICcuL3dpbmRvd19wYWdlc2hvdyc7XG5cbi8vICoqKioqKiBCaW5kaW5ncyBUbyBOYXRpdmUgRXZlbnRzIE9uIFdpbmRvdyAqKioqKipcbiQod2luZG93KS5iaW5kKCdwYWdlc2hvdycsIG9uV2luZG93UGFnZXNob3cpO1xuXG4vLyAqKioqKiogQmluZGluZ3MgVG8gTmF0aXZlIEV2ZW50cyBPbiBEb2N1bWVudCAqKioqKipcbiQoZG9jdW1lbnQpLnJlYWR5KG9uRG9jdW1lbnRSZWFkeSk7XG5cbmlmICh3aW5kb3cuT3ZlckRyaXZlLmZlYXR1cmVzLmlzRW5hYmxlZCgnYWpheC1lcnJvci1yZXBvcnRpbmcnKSkge1xuICAgICQuYWpheFByZWZpbHRlcigoXywgX18sIGpxWGhyKSA9PiB7XG4gICAgICAgIGpxWGhyLl9jYWxsU3RhY2sgPSBuZXcgRXJyb3IoKS5zdGFjaztcbiAgICB9KTtcblxuICAgICQoZG9jdW1lbnQpLmFqYXhFcnJvcigoZXZlbnQsIGpxWGhyLCBzZXR0aW5ncykgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gTm8gbmVlZCB0byByZXBvcnQgaWYgdGhlIGFqYXhFcnJvciBlbmRwb2ludCBpcyBhbHNvIGZhaWxpbmcgKHdpbGwgY2FsbHMgYW4gaW5maW5pdGUgbG9vcClcbiAgICAgICAgICAgIGlmIChzZXR0aW5ncy51cmwgPT09ICcvYXBpL3JlcG9ydGluZy9hamF4RXJyb3InKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAkLnBvc3Qod2luZG93LnVybCh3aW5kb3cucm91dGVzLmFwaS5yZXBvcnRpbmcuYWpheEVycm9yKSwge1xuICAgICAgICAgICAgICAgIGNhbGxTdGFjazoganFYaHIuX2NhbGxTdGFjayxcbiAgICAgICAgICAgICAgICBldmVudFR5cGU6IGV2ZW50LnR5cGUsXG4gICAgICAgICAgICAgICAgcGFnZUhyZWY6IHdpbmRvdy5sb2NhdGlvbi5ocmVmLFxuICAgICAgICAgICAgICAgIHJlcXVlc3REYXRhVHlwZTogc2V0dGluZ3MuZGF0YVR5cGUsXG4gICAgICAgICAgICAgICAgcmVxdWVzdE1ldGhvZDogc2V0dGluZ3MudHlwZSxcbiAgICAgICAgICAgICAgICByZXF1ZXN0VXJsOiBzZXR0aW5ncy51cmwsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VTdGF0dXNDb2RlOiBqcVhoci5zdGF0dXMsXG4gICAgICAgICAgICAgICAgcmVzcG9uc2VUZXh0OiBqcVhoci5yZXNwb25zZVRleHRcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGNhdGNoIChlcnIpIHsgfVxuICAgIH0pO1xufVxuIiwiLy8gUmVtb3ZlIGFsbCBvZiB0aGVzZSBBU0FQXG4vLyBUT0RPOiBUaGUgbnVtYmVyIG9mIGFjY2Vzc2VzIHRvIGFtYmllbnQgZnVuY3Rpb24gYml0cyBzZWVtcyB0byBiZSBtb3VudGluZywgdHJ5aW5nIHRvIGRlY2lkZSBpZiB0aGVyZSBpcyBhIGJldHRlciB3YXkgdG8gcmVmZXJlbmNlIHRoZXNlXG4vLyBJZGVhISAtIE1ha2UgYSBjbGFzcyB0aGF0IGlzIGFuIGFnZ3JlZ2F0ZSBvZiBhbGwgdGhlIC5sb2NhbHMgZnVuY3Rpb25zIGFuZCBleHBvc2UgaXQgc3VjaCB0aGF0IHRoZSBmcm9udCBhbmQgYmFjayBlbmQgY2FuIGltcG9ydCBpdFxuXG4vLyBJbXBvcnRzIGZvciBHbG9iYWwgTmFtZXNwYWNlIFB1cnBvc2VzXG5pbXBvcnQgeyByZW1vdmVRdWVyeVBhcmFtIH0gZnJvbSAnLi91dGlsL3F1ZXJ5LmpzJztcbmltcG9ydCB7IHVybCwgcm91dGVzIH0gZnJvbSAnLi91dGlsL3JvdXRlcy5qcyc7XG5pbXBvcnQgeyBodG1sLCB0ZXh0IH0gZnJvbSAnLi4vLi4vbGliL2kxOG4vYnJvd3Nlcic7XG5pbXBvcnQgc3RyaXBOb0xpbmtlZENhcmRRdWVyeSBmcm9tICcuL3V0aWwvdXJsL3N0cmlwTm9MaW5rZWRDYXJkUXVlcnkuanMnO1xuaW1wb3J0IGdldENvb2tpZUV4cGxhbmF0aW9uIGZyb20gJy4vdXRpbC90b2FzdC9nZXRDb29raWVFeHBsYW5hdGlvbi5qcyc7XG5pbXBvcnQgcmZjMzk4NkVuY29kZVVSSUNvbXBvbmVudCBmcm9tICcuL3V0aWwvZW5jb2RpbmcvcmZjMzk4NkVuY29kZVVSSUNvbXBvbmVudC5qcyc7XG5pbXBvcnQgc2Nyb2xsQ2Fyb3VzZWwgZnJvbSAnLi91dGlsL2Nhcm91c2VsL3Njcm9sbENhcm91c2VsLmpzJztcbmltcG9ydCBoaWRlQ2Fyb3VzZWxBcnJvd3NGb3JFbCBmcm9tICcuL3V0aWwvY2Fyb3VzZWwvaGlkZUNhcm91c2VsQXJyb3dzLmpzJztcbmltcG9ydCBoaWRlQXJyb3dzT25FbmRPZlNjcm9sbEZvckVsIGZyb20gJy4vdXRpbC9jYXJvdXNlbC9oaWRlQXJyb3dzT25FbmRPZlNjcm9sbC5qcyc7XG5pbXBvcnQgYXJyb3dUYWJBY2NvdW50TWVudSBmcm9tICcuL3V0aWwvYWNjb3VudC9hcnJvd1RhYkFjY291bnRNZW51LmpzJztcbmltcG9ydCBhcnJvd1RhYk1lbnUgZnJvbSAnLi91dGlsL2NvbXBhdGliaWxpdHkvYXJyb3dUYWJNZW51LmpzJztcbmltcG9ydCBvbnVubG9hZCBmcm9tICcuL3V0aWwvY29tcGF0aWJpbGl0eS9vbnVubG9hZC5qcyc7XG5pbXBvcnQgZ2V0UXVlcnlQYXJhbXMgZnJvbSAnLi91dGlsL3VybC9nZXRRdWVyeVBhcmFtcy5qcyc7XG5pbXBvcnQgYWRkRGF5cyBmcm9tICcuL3V0aWwvZGF0ZXMvYWRkRGF5cy5qcyc7XG5pbXBvcnQgcmVwbGFjZVF1ZXJ5UGFyYW0gZnJvbSAnLi91dGlsL3VybC9yZXBsYWNlUXVlcnlQYXJhbS5qcyc7XG5pbXBvcnQgYWRkUXVlcnlQYXJhbSBmcm9tICcuL3V0aWwvdXJsL2FkZFF1ZXJ5UGFyYW0uanMnO1xuaW1wb3J0IGNvbXBvbmVudFRvSGV4IGZyb20gJy4vdXRpbC9jb2xvcnMvY29tcG9uZW50VG9IZXguanMnO1xuaW1wb3J0IHJnYlRvSGV4IGZyb20gJy4vdXRpbC9jb2xvcnMvcmdiVG9IZXguanMnO1xuaW1wb3J0IHByb2Nlc3NJbnN0YW50Rm9yd2FyZEFjdGlvbnMgZnJvbSAnLi91dGlsL3RpdGxlLWFjdGlvbnMvcHJvY2Vzc0luc3RhbnRGb3J3YXJkQWN0aW9ucy5qcyc7XG5pbXBvcnQgc2V0VXNlclN0YXJSYXRpbmcgZnJvbSAnLi91dGlsL3RpdGxlLWFjdGlvbnMvc2V0VXNlclN0YXJSYXRpbmcuanMnO1xuaW1wb3J0IGZpbGxTdGFycyBmcm9tICcuL3V0aWwvdGl0bGUtYWN0aW9ucy9maWxsU3RhcnMuanMnO1xuaW1wb3J0IHNlbGVjdFN0YXJSYXRpbmcgZnJvbSAnLi91dGlsL3RpdGxlLWFjdGlvbnMvc2VsZWN0U3RhclJhdGluZy5qcyc7XG5pbXBvcnQgb3BlbkhvbGRDb25mbGljdE1vZGFsIGZyb20gJy4vdXRpbC90aXRsZS1hY3Rpb25zL29wZW5Ib2xkQ29uZmxpY3RNb2RhbC5qcyc7XG5pbXBvcnQgaGFuZGxlRm9yd2FyZEFjdGlvbkhvbGQgZnJvbSAnLi91dGlsL3RpdGxlLWFjdGlvbnMvaGFuZGxlRm9yd2FyZEFjdGlvbkhvbGQuanMnO1xuaW1wb3J0IG5vQ2FyZCBmcm9tICcuL3V0aWwvbm9DYXJkLmpzJztcbmltcG9ydCBmaW5kRm9ybWF0SWQgZnJvbSAnLi91dGlsL2ZpbmRGb3JtYXRJZC5qcyc7XG5pbXBvcnQgdG9hc3RlciBmcm9tICcuL2NvbXBvbmVudHMvdG9hc3Rlci9hcHAuanMnO1xuaW1wb3J0IFRpdGxlIGZyb20gJy4vY29tcG9uZW50cy9tZWRpYS9tb2RlbHMvVGl0bGUuanMnO1xuaW1wb3J0IGJ1aWxkRmVhdHVyZU1hbmFnZXIgZnJvbSAnLi4vLi4vbGliL2ZlYXR1cmVNYW5hZ2VyQnVpbGRlcic7XG5pbXBvcnQgc3VwcG9ydFVybCBmcm9tICcuLi8uLi9saWIvc3VwcG9ydFVybCc7XG5pbXBvcnQgQXBwUHJvbW9NYW5hZ2VyIGZyb20gJy4uLy4uL2xpYi9hcHBQcm9tb01hbmFnZXInO1xuaW1wb3J0ICcuL3BvbHlmaWxscy9jdXN0b20tZXZlbnQnO1xuXG4vLyBBdHRhY2hpbmcgRnVuY3Rpb25zIHRvIEdsb2JhbCBOYW1lc3BhY2VcbndpbmRvdy5mZWF0dXJlTWFuYWdlciA9IGJ1aWxkRmVhdHVyZU1hbmFnZXIoXG4gICAgT3ZlckRyaXZlLmxpYnJhcnlDb25maWd1cmF0aW9ucyxcbiAgICBPdmVyRHJpdmUudGVuYW50LFxuICAgIE92ZXJEcml2ZS5hbGxGZWF0dXJlcyxcbiAgICBPdmVyRHJpdmUuZmVhdHVyZXNcbik7XG53aW5kb3cuVGl0bGUgPSBUaXRsZTtcbndpbmRvdy5yZW1vdmVRdWVyeVBhcmFtID0gcmVtb3ZlUXVlcnlQYXJhbTtcbndpbmRvdy5yb3V0ZXMgPSByb3V0ZXM7XG53aW5kb3cudXJsID0gdXJsO1xud2luZG93LnN1cHBvcnRVcmwgPSBzdXBwb3J0VXJsO1xud2luZG93Lmh0bWwgPSBodG1sO1xud2luZG93LnRleHQgPSB0ZXh0O1xud2luZG93LnN0cmlwTm9MaW5rZWRDYXJkUXVlcnkgPSBzdHJpcE5vTGlua2VkQ2FyZFF1ZXJ5O1xud2luZG93LmdldENvb2tpZUV4cGxhbmF0aW9uID0gZ2V0Q29va2llRXhwbGFuYXRpb247XG53aW5kb3cucmZjMzk4NkVuY29kZVVSSUNvbXBvbmVudCA9IHJmYzM5ODZFbmNvZGVVUklDb21wb25lbnQ7XG53aW5kb3cuc2Nyb2xsQ2Fyb3VzZWwgPSBzY3JvbGxDYXJvdXNlbDtcbndpbmRvdy5oaWRlQ2Fyb3VzZWxBcnJvd3MgPSBoaWRlQ2Fyb3VzZWxBcnJvd3NGb3JFbDtcbndpbmRvdy5oaWRlQXJyb3dzT25FbmRPZlNjcm9sbCA9IGhpZGVBcnJvd3NPbkVuZE9mU2Nyb2xsRm9yRWw7XG53aW5kb3cuYXJyb3dUYWJBY2NvdW50TWVudSA9IGFycm93VGFiQWNjb3VudE1lbnU7XG53aW5kb3cuYXJyb3dUYWJNZW51ID0gYXJyb3dUYWJNZW51O1xud2luZG93Lm9udW5sb2FkID0gb251bmxvYWQ7XG53aW5kb3cuZ2V0UXVlcnlQYXJhbXMgPSBnZXRRdWVyeVBhcmFtcztcbndpbmRvdy5hZGREYXlzID0gYWRkRGF5cztcbndpbmRvdy5yZXBsYWNlUXVlcnlQYXJhbSA9IHJlcGxhY2VRdWVyeVBhcmFtO1xud2luZG93LmFkZFF1ZXJ5UGFyYW0gPSBhZGRRdWVyeVBhcmFtO1xud2luZG93LmNvbXBvbmVudFRvSGV4ID0gY29tcG9uZW50VG9IZXg7XG53aW5kb3cucmdiVG9IZXggPSByZ2JUb0hleDtcbndpbmRvdy5wcm9jZXNzSW5zdGFudEZvcndhcmRBY3Rpb25zID0gcHJvY2Vzc0luc3RhbnRGb3J3YXJkQWN0aW9ucztcbndpbmRvdy5zZXRVc2VyU3RhclJhdGluZyA9IHNldFVzZXJTdGFyUmF0aW5nO1xud2luZG93LmZpbGxTdGFycyA9IGZpbGxTdGFycztcbndpbmRvdy5zZWxlY3RTdGFyUmF0aW5nID0gc2VsZWN0U3RhclJhdGluZztcbndpbmRvdy5vcGVuSG9sZENvbmZsaWN0TW9kYWwgPSBvcGVuSG9sZENvbmZsaWN0TW9kYWw7XG53aW5kb3cuaGFuZGxlRm9yd2FyZEFjdGlvbkhvbGQgPSBoYW5kbGVGb3J3YXJkQWN0aW9uSG9sZDtcbndpbmRvdy5ub0NhcmQgPSBub0NhcmQ7XG53aW5kb3cuZmluZEZvcm1hdElkID0gZmluZEZvcm1hdElkO1xud2luZG93LnRvYXN0ZXIgPSB3aW5kb3cuT3ZlckRyaXZlLmlzVG9saW5vRGV2aWNlID8gdW5kZWZpbmVkIDogdG9hc3RlcjtcbndpbmRvdy5hcHBQcm9tb01hbmFnZXIgPSBBcHBQcm9tb01hbmFnZXIuY3JlYXRlQ2xpZW50KHdpbmRvdyk7XG5cbi8qKlxuICogR2xvYmFsIGV2ZW50IGhhbmRsZXJcbiAqIFVzZWQgZm9yIGNvbnN1bWluZyBjb21wb25lbnQgbGV2ZWwgZXZlbnRzIHRoYXQgYXJlIGJldHRlclxuICogaGFuZGxlZCBhdCB0aGUgZ2xvYmFsIGxldmVsXG4gKiBEbyBub3QgZ28gYXR0YWNoaW5nIGV2ZW50cyB0byB0aGlzIGFsbCB3aWxseSBuaWxseSFcbiAqL1xud2luZG93Lmdsb2JhbEV2ZW50cyA9IF8uY2xvbmUod2luZG93LkJhY2tib25lLkV2ZW50cyk7XG5cbmRvY3VtZW50LmRpc3BhdGNoRXZlbnQobmV3IEN1c3RvbUV2ZW50KCdnbG9iYWwtYm9vdHN0cmFwcGluZy1yZWFkeScpKTtcbiIsImNvbnN0IHJvdXRlcyA9IHdpbmRvdy5yb3V0ZXM7XG5jb25zdCBDb29raWVzID0gd2luZG93LkNvb2tpZXM7XG5jb25zdCBudW1iZXJzID0gcmVxdWlyZSgnLi4vLi4vLi4vbGliL251bWJlcnMnKTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FyZCBleHRlbmRzIEJhY2tib25lLk1vZGVsIHtcbiAgICB1cmwgPSByb3V0ZXMucmVzdC5hY2NvdW50LmdldDtcblxuICAgIGRlZmF1bHRzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaG9sZExpbWl0OiAwLFxuICAgICAgICAgICAgYWNjb3VudHM6IFtdLFxuICAgICAgICAgICAgbGFzdEhvbGRFbWFpbDogJycsXG4gICAgICAgICAgICBiZXN0TGlicmFyeUtleTogJycsXG4gICAgICAgICAgICBkaXNwbGF5TmFtZTogJycsXG4gICAgICAgICAgICBlbWFpbDogJycsXG4gICAgICAgICAgICBjYW5QbGFjZUhvbGRzOiB0cnVlLFxuICAgICAgICAgICAgaXNWaXNpdGluZ0NhcmQ6IGZhbHNlLFxuXG4gICAgICAgICAgICBjaGVja291dExpbWl0c0J5TWVkaWFUeXBlOiB7XG4gICAgICAgICAgICAgICAgcGVyaW9kaWNhbDogMCxcbiAgICAgICAgICAgICAgICB2aWRlbzogMCxcbiAgICAgICAgICAgICAgICBhdWRpb2Jvb2s6IDAsXG4gICAgICAgICAgICAgICAgZWJvb2s6IDAsXG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cblxuICAgIC8vICdDbGllbnQgQWNjb3VudCBDb29raWUnIC0gQXV0aFV0aWxpdHkgaXMgYXdhcmUgb2YgdGhpcyBjb29raWUgYW5kIGNsZWFycyBpcyBvbiBTaWduT3V0XG4gICAgX2tleSA9ICdfY2FjJztcblxuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlciguLi5hcmd1bWVudHMpO1xuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHdpbmRvdy5PdmVyRHJpdmUuaXNBdXRoZW50aWNhdGVkICYmXG4gICAgICAgICAgICB3aW5kb3cuT3ZlckRyaXZlLmhhc0xpbmtlZENhcmRzXG4gICAgICAgICkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2hhc0NhY2hlZE1vZGVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQodGhpcy5fY2FjaGVHZXQoKSk7XG5cbiAgICAgICAgICAgICAgICAvLyBfZmV0Y2ggc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgYXN5bmMgc3luY2luZyBhbmQgbm90IGZvciByYXcgZGF0YSBhY2Nlc3NcbiAgICAgICAgICAgICAgICB0aGlzLl9mZXRjaCA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mZXRjaCA9IHRoaXMuZmV0Y2goKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9mZXRjaC50aGVuKCgpID0+IHRoaXMuX2NhY2hlU2V0KHRoaXMuYXR0cmlidXRlcykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0SG9sZEVtYWlsKGVtYWlsKSB7XG4gICAgICAgIHRoaXMuc2V0KHsgbGFzdEhvbGRFbWFpbDogZW1haWwgfSk7XG5cbiAgICAgICAgdGhpcy5fY2FjaGVTZXQodGhpcy5hdHRyaWJ1dGVzKTtcbiAgICB9XG5cbiAgICBnZXQgcHJlZmVycmVkSG9sZEVtYWlsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXQoJ2xhc3RIb2xkRW1haWwnKSB8fCB0aGlzLmdldCgndGhpcy5lbWFpbCcpIHx8ICcnO1xuICAgIH1cblxuICAgIGdldCBfaGFzQ2FjaGVkTW9kZWwoKSB7XG4gICAgICAgIHJldHVybiAhXyh0aGlzLl9jYWNoZUdldCgpKS5pc0VtcHR5KCk7XG4gICAgfVxuXG4gICAgZ2V0IGNhblBsYWNlSG9sZHMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldCgnY2FuUGxhY2VIb2xkcycpO1xuICAgIH1cblxuICAgIGdldCBpc1Zpc2l0aW5nQ2FyZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0KCdpc1Zpc2l0aW5nQ2FyZCcpO1xuICAgIH1cblxuICAgIHNldEFsbG93UmVhZGluZ0hpc3RvcnkoYWxsb3cpIHtcbiAgICAgICAgdGhpcy5zZXQoJ2FsbG93UmVhZGluZ0hpc3RvcnknLCAhIWFsbG93KTtcbiAgICAgICAgdGhpcy5fY2FjaGVTZXQodGhpcy5hdHRyaWJ1dGVzKTtcbiAgICB9XG5cbiAgICBfY2FjaGVHZXQoKSB7XG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKENvb2tpZXMuZ2V0KHRoaXMuX2tleSkgfHwgJ3t9Jyk7XG4gICAgfVxuXG4gICAgY2FjaGVSZXNldCgpIHtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgd2luZG93Lk92ZXJEcml2ZS5pc0F1dGhlbnRpY2F0ZWQgJiZcbiAgICAgICAgICAgIHdpbmRvdy5PdmVyRHJpdmUuaGFzTGlua2VkQ2FyZHNcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBDb29raWVzLnJlbW92ZSh0aGlzLl9rZXkpO1xuICAgICAgICAgICAgdGhpcy5fZmV0Y2ggPSB0aGlzLmZldGNoKCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZmV0Y2gudGhlbigoKSA9PiB0aGlzLl9jYWNoZVNldCh0aGlzLmF0dHJpYnV0ZXMpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgX2NhY2hlU2V0KG1vZGVsKSB7XG4gICAgICAgIENvb2tpZXMuc2V0KHRoaXMuX2tleSwgSlNPTi5zdHJpbmdpZnkobW9kZWwpLCB7XG4gICAgICAgICAgICBleHBpcmVzOiBuZXcgRGF0ZShcbiAgICAgICAgICAgICAgICBuZXcgRGF0ZSgpLmdldFRpbWUoKSArIDEwICogbnVtYmVycy5taW51dGVJbk1pbGxpc2Vjb25kc1xuICAgICAgICAgICAgKSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuIiwiaW1wb3J0IG51bWJlcnMgZnJvbSAnLi4vLi4vLi4vbGliL251bWJlcnMnO1xuXG5jb25zdCB7IHVybCwgcm91dGVzLCBDb29raWVzIH0gPSB3aW5kb3c7XG5cbi8vIEZha2VpbmcgaW4gdGhlIHBhdGggZm9yIG5vdyAuLi5cbnJvdXRlcy5yZXN0LnByZWZlcmVuY2VzID0geyBnbG9iYWw6IHsgaW5kZXg6Jy9yZXN0L3ByZWZlcmVuY2VzL2dsb2JhbC8nIH0gfTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgR2xvYmFsUHJlZmVyZW5jZXMgZXh0ZW5kcyBCYWNrYm9uZS5Nb2RlbCB7XG5cbiAgICAvLyBDb29raWUgQ2FjaGUgS2V5OiAnR2xvYmFsIEFjY291bnQgUHJlZmVyZW5jZXMnXG4gICAgX2tleSA9ICdfZ2FwJ1xuXG4gICAgdXJsKCkgICB7IHJldHVybiB1cmwocm91dGVzLnJlc3QucHJlZmVyZW5jZXMuZ2xvYmFsLmluZGV4KTsgfVxuICAgIGlzTmV3KCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICAgIGRlZmF1bHRzKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2luZGxlRnVsZmlsbG1lbnQ6IG51bGxcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBjb25zdHJ1Y3RvcihhdHRyaWJ1dGVzLCB7IGJ1cyB9KSB7XG4gICAgICAgIHN1cGVyKC4uLmFyZ3VtZW50cyk7XG4gICAgICAgIHRoaXMuYnVzID0gYnVzO1xuXG4gICAgICAgIHRoaXMuX2luaXRDYWNoZSgpO1xuICAgIH1cblxuICAgIHNldEtpbmRsZUZ1bGZpbGxtZW50UHJlZmVyZW5jZShlbmFibGVkID0gdHJ1ZSwgc291cmNlKSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICB0aGlzLnNhdmUoeyBraW5kbGVGdWxmaWxsbWVudDogISFlbmFibGVkIH0sIHtcbiAgICAgICAgICAgICAgICBwYXRjaCAgIDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB3YWl0ICAgIDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBzdWNjZXNzIDogKGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idXMudHJpZ2dlcigncHJlZmVyZW5jZXM6Z2xvYmFsOnVwZGF0ZTpzdWNjZXNzJywgeyBjb250ZXh0LCBzb3VyY2UgfSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhY2hlU2V0KHRoaXMuYXR0cmlidXRlcyk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGVycm9yICAgOiAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG5cbiAgICAvLyAtLSBDYWNoaW5nIEZ1bmN0aW9uYWxpdHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICBfaW5pdENhY2hlKCkge1xuICAgICAgICBpZiAod2luZG93Lk92ZXJEcml2ZS5pc0F1dGhlbnRpY2F0ZWQgJiYgd2luZG93Lk92ZXJEcml2ZS5oYXNMaW5rZWRDYXJkcykge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2hhc0NhY2hlZE1vZGVsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXQodGhpcy5fY2FjaGVHZXQoKSk7XG5cbiAgICAgICAgICAgICAgICAvLyBfZmV0Y2ggc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgYXN5bmMgc3luY2luZyBhbmQgbm90IGZvciByYXcgZGF0YSBhY2Nlc3NcbiAgICAgICAgICAgICAgICB0aGlzLl9mZXRjaCA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9mZXRjaCA9IHRoaXMuZmV0Y2goKTtcbiAgICAgICAgICAgICAgICB0aGlzLl9mZXRjaC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FjaGVTZXQodGhpcy5hdHRyaWJ1dGVzKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9jYWNoZUdldCgpIHtcbiAgICAgICAgcmV0dXJuIEpTT04ucGFyc2UoQ29va2llcy5nZXQodGhpcy5fa2V5KSB8fCAne30nKTtcbiAgICB9XG5cbiAgICBfY2FjaGVTZXQobW9kZWwpIHtcbiAgICAgICAgQ29va2llcy5zZXQodGhpcy5fa2V5LCBKU09OLnN0cmluZ2lmeShtb2RlbCksIHtcbiAgICAgICAgICAgIGV4cGlyZXM6IG5ldyBEYXRlKG5ldyBEYXRlKCkuZ2V0VGltZSgpICsgMTAgKiBudW1iZXJzLm1pbnV0ZUluTWlsbGlzZWNvbmRzKVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXQgX2hhc0NhY2hlZE1vZGVsKCkge1xuICAgICAgICByZXR1cm4gIV8odGhpcy5fY2FjaGVHZXQoKSkuaXNFbXB0eSgpO1xuICAgIH1cbn1cbiIsIi8vIGltcG9ydCB3aGVuIHdlIG1vdmUgbW9yZSB0byBtb2R1bGVzXG5leHBvcnQgZGVmYXVsdCB3aW5kb3cuQmFja2JvbmUuTW9kZWw7XG4iLCIvKiBub2RlLWVudiBicm93c2VyICovXG5cbmltcG9ydCBCYXNlTW9kZWwgZnJvbSAnLi9iYXNlJztcblxuY29uc3QgdG9KU09OTWFwcGVyID0ge1xuICAgIGF1dG9tYXRpY0hvbGRDaGVja291dDogJ2F1dG8tY2hlY2tvdXQtc2V0dGluZycsXG4gICAgYXVkaWVuY2U6ICdhdWRpZW5jZS1zZXR0aW5nJyxcbiAgICBoaWdoQ29udHJhc3Q6ICdoaWdoLWNvbnRyYXN0JyxcbiAgICBkeXNsZXhpYzogJ2R5c2xleGljJyxcbiAgICBsYW5ndWFnZVNlbGVjdGlvbjogJ2xhbmd1YWdlLXNlbGVjdGlvbicsXG4gICAga2luZGxlRnVsZmlsbG1lbnQ6ICdraW5kbGVGdWxmaWxsbWVudCcsXG59O1xuXG5jb25zdCBQcmVmZXJlbmNlc01vZGVsID0gQmFzZU1vZGVsLmV4dGVuZCh7XG4gICAgaW5pdGlhbGl6ZSgpIHtcbiAgICAgICAgdGhpcy5vbignY2hhbmdlOmF1dG9tYXRpY0hvbGRDaGVja291dCcsIHRoaXMudXBkYXRlSG9sZHMuYmluZCh0aGlzKSk7XG4gICAgfSxcblxuICAgIHVybCgpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5wcmVmZXJlbmNlcyk7XG4gICAgfSxcblxuICAgIGlzTmV3KCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSxcblxuICAgIGdldFBhcnNlZEF1ZGllbmNlKGF1ZGllbmNlKSB7XG4gICAgICAgIHJldHVybiBfLmZpbHRlcihcbiAgICAgICAgICAgIF8ubWFwKF8ucGFpcnMoYXVkaWVuY2UpLCAoaXRlbSkgPT4gaXRlbVsxXSA9PT0gdHJ1ZSAmJiBpdGVtWzBdKVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICBwYXJzZUJvb3RzdHJhcHBlZERhdGEoe1xuICAgICAgICBhdWRpZW5jZSxcbiAgICAgICAgaGlnaENvbnRyYXN0LFxuICAgICAgICBhdXRvbWF0aWNIb2xkQ2hlY2tvdXQsXG4gICAgICAgIGR5c2xleGljLFxuICAgICAgICBsYW5ndWFnZVNlbGVjdGlvbixcbiAgICAgICAga2luZGxlRnVsZmlsbG1lbnQsXG4gICAgfSkge1xuICAgICAgICB0aGlzLnNldChcbiAgICAgICAgICAgIF8uZXh0ZW5kKFxuICAgICAgICAgICAgICAgIHsgYXVkaWVuY2U6IHRoaXMuZ2V0UGFyc2VkQXVkaWVuY2UoYXVkaWVuY2UpIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICBhdXRvbWF0aWNIb2xkQ2hlY2tvdXQ6ICEhYXV0b21hdGljSG9sZENoZWNrb3V0LFxuICAgICAgICAgICAgICAgICAgICBoaWdoQ29udHJhc3Q6ICEhaGlnaENvbnRyYXN0LFxuICAgICAgICAgICAgICAgICAgICBkeXNsZXhpYzogISFkeXNsZXhpYyxcbiAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VTZWxlY3Rpb24sXG4gICAgICAgICAgICAgICAgICAgIGtpbmRsZUZ1bGZpbGxtZW50LFxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB7IHNpbGVudDogdHJ1ZSB9XG4gICAgICAgICk7XG4gICAgfSxcblxuICAgIGdldFBhdGNoRGF0YSgpIHtcbiAgICAgICAgY29uc3QgY2hhbmdlZEF0dHJpYnV0ZXMgPSBfLmtleXModGhpcy5jaGFuZ2VkQXR0cmlidXRlcygpKTtcbiAgICAgICAgY29uc3QgdG9KU09OID0gdGhpcy50b0pTT04oKTtcbiAgICAgICAgY29uc3QgZGF0YSA9IHt9O1xuXG4gICAgICAgIGNoYW5nZWRBdHRyaWJ1dGVzLmZvckVhY2goKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGRhdGFbdG9KU09OTWFwcGVyW2l0ZW1dXSA9IHRvSlNPTlt0b0pTT05NYXBwZXJbaXRlbV1dO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gXy5vbWl0KGRhdGEsICh2YWx1ZSkgPT4gdmFsdWUgPT09IHZvaWQgMCk7XG4gICAgfSxcblxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgdG9KU09OID0ge1xuICAgICAgICAgICAgW3RvSlNPTk1hcHBlci5hdWRpZW5jZV06IHRoaXMuZ2V0KCdhdWRpZW5jZScpLFxuICAgICAgICAgICAgW3RvSlNPTk1hcHBlci5hdXRvbWF0aWNIb2xkQ2hlY2tvdXRdOiB0aGlzLmdldChcbiAgICAgICAgICAgICAgICAnYXV0b21hdGljSG9sZENoZWNrb3V0J1xuICAgICAgICAgICAgKSxcbiAgICAgICAgICAgIFt0b0pTT05NYXBwZXIuaGlnaENvbnRyYXN0XTogdGhpcy5nZXQoJ2hpZ2hDb250cmFzdCcpLFxuICAgICAgICAgICAgW3RvSlNPTk1hcHBlci5keXNsZXhpY106IHRoaXMuZ2V0KCdkeXNsZXhpYycpLFxuICAgICAgICAgICAgW3RvSlNPTk1hcHBlci5sYW5ndWFnZVNlbGVjdGlvbl06IHRoaXMuZ2V0KCdsYW5ndWFnZVNlbGVjdGlvbicpLFxuICAgICAgICAgICAgW3RvSlNPTk1hcHBlci5raW5kbGVGdWxmaWxsbWVudF06IHRoaXMuZ2V0KCdraW5kbGVGdWxmaWxsbWVudCcpLFxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gXy5vbWl0KHRvSlNPTiwgKHZhbHVlKSA9PiB2YWx1ZSA9PT0gdm9pZCAwKTtcbiAgICB9LFxuXG4gICAgdXBkYXRlSG9sZHMoKSB7XG4gICAgICAgIC8vIFVwZGF0ZXMgYWxsIHByZXZpb3VzbHkgaGVsZCBpdGVtcyB0byBtYXRjaCBuZXcgYXV0b2NoZWNrb3V0IHNldHRpbmdcbiAgICAgICAgY29uc3QgYXV0b0NoZWNrb3V0ID0gdGhpcy5nZXQoJ2F1dG9tYXRpY0hvbGRDaGVja291dCcpO1xuICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMudXBkYXRlSG9sZFNldHRpbmdzKSxcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICB0eXBlOiAnUE9TVCcsXG4gICAgICAgICAgICBkYXRhOiBKU09OLnN0cmluZ2lmeSh7IHNob3VsZEF1dG9DaGVja291dDogYXV0b0NoZWNrb3V0IH0pLFxuICAgICAgICB9KTtcbiAgICB9LFxufSk7XG5cbmV4cG9ydCBkZWZhdWx0IFByZWZlcmVuY2VzTW9kZWw7XG4iLCJpbXBvcnQgJ2VzNS1zaGltJztcbmltcG9ydCAnYmFiZWwtcG9seWZpbGwnO1xuXG5pbXBvcnQgX29ubHlGb3JCb290c3RyYXBwaW5nICAgICBmcm9tICcuLi9nbG9iYWxfYm9vdHN0cmFwcGluZy5qcyc7XG5pbXBvcnQgX29ubHlGb3JCaW5kaW5ncyAgICAgICAgICBmcm9tICcuLi9nbG9iYWxfYmluZGluZ3MuanMnO1xuXG5pbXBvcnQgTG9nZ2VyICAgICAgICAgICAgICAgICAgICBmcm9tICcuLi91dGlsL2xvZ2dpbmcvbG9nZ2VyJztcbmltcG9ydCBFdmVudEJyaWRnZSAgICAgICAgICAgICAgIGZyb20gJy4uL2NvbXBvbmVudHMvc2l0ZS9FdmVudEJyaWRnZSc7XG5pbXBvcnQgQ2FyZCAgICAgICAgICAgICAgICAgICAgICBmcm9tICcuLi9tb2RlbHMvQ2FyZCc7XG5pbXBvcnQgR2xvYmFsUHJlZmVyZW5jZXMgICAgICAgICBmcm9tICcuLi9tb2RlbHMvR2xvYmFsUHJlZmVyZW5jZXMnO1xuaW1wb3J0IEhpZ2hsaWdodGVkRmVhdHVyZVN0YXRlICAgZnJvbSAnLi4vLi4vLi4vbW9kZWxzL0hpZ2hsaWdodGVkRmVhdHVyZVN0YXRlJztcbmltcG9ydCBGZWF0dXJlSGlnaGxpZ2h0TWFuYWdlciAgIGZyb20gJy4uL3V0aWwvRmVhdHVyZUhpZ2hsaWdodE1hbmFnZXInO1xuaW1wb3J0IENvb2tpZUNvbmZpZyAgICAgICAgICAgICAgZnJvbSAnLi4vLi4vLi4vbGliL2Nvb2tpZUNvbmZpZyc7XG5cbndpbmRvdy5Mb2dnZXIgPSBMb2dnZXI7XG5cbnZvaWQgKF9vbmx5Rm9yQm9vdHN0cmFwcGluZywgX29ubHlGb3JCaW5kaW5ncyk7XG5cbndpbmRvdy5nbG9iYWxQcmVmZXJlbmNlcyA9IG5ldyBHbG9iYWxQcmVmZXJlbmNlcyh7fSwgeyBidXM6IHdpbmRvdy5nbG9iYWxFdmVudHMgfSk7XG53aW5kb3cuY2FyZCA9IG5ldyBDYXJkKCk7XG5cbnZvaWQgKG5ldyBFdmVudEJyaWRnZSh7XG4gICAgYnVzICAgICAgICAgICAgICAgOiB3aW5kb3cuZ2xvYmFsRXZlbnRzLFxuICAgIGNhcmQgICAgICAgICAgICAgIDogd2luZG93LmNhcmQsXG4gICAgcGF0cm9uU2V0dGluZ3MgICAgOiB3aW5kb3cucGF0cm9uU2V0dGluZ3MsXG4gICAgZmVhdHVyZU1hbmFnZXIgICAgOiB3aW5kb3cuZmVhdHVyZU1hbmFnZXIsXG4gICAgZ2xvYmFsUHJlZmVyZW5jZXMgOiB3aW5kb3cuZ2xvYmFsUHJlZmVyZW5jZXNcbn0pKTtcblxud2luZG93Lk92ZXJEcml2ZS5oaWdobGlnaHRlZEZlYXR1cmVTdGF0ZSA9IG5ldyBIaWdobGlnaHRlZEZlYXR1cmVTdGF0ZShDb29raWVzLmdldChDb29raWVDb25maWcudmlzaXRlZEZlYXR1cmVzLm5hbWUpIHx8ICcwJywgd2luZG93LmZlYXR1cmVNYW5hZ2VyLCB3aW5kb3cuT3ZlckRyaXZlLmhhc1BhcnRuZXJMaWJyYXJpZXMpO1xud2luZG93Lk92ZXJEcml2ZS5mZWF0dXJlSGlnaGxpZ2h0TWFuYWdlciA9IG5ldyBGZWF0dXJlSGlnaGxpZ2h0TWFuYWdlcih3aW5kb3cuT3ZlckRyaXZlLmhpZ2hsaWdodGVkRmVhdHVyZVN0YXRlKTtcbiIsIigoKSA9PiB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cuQ3VzdG9tRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGNvbnN0IEN1c3RvbUV2ZW50ID0gKHR5cGUsIGV2ZW50SW5pdERpY3QpID0+IHtcbiAgICAgICAgY29uc3QgZXZlbnQgPSBkb2N1bWVudC5jcmVhdGVFdmVudCgnQ3VzdG9tRXZlbnQnKTtcbiAgICAgICAgaWYgKGV2ZW50SW5pdERpY3QpIHtcbiAgICAgICAgICAgIGV2ZW50LmluaXRDdXN0b21FdmVudCh0eXBlLCBldmVudEluaXREaWN0LmJ1YmJsZXMsIGV2ZW50SW5pdERpY3QuY2FuY2VsYWJsZSwgZXZlbnRJbml0RGljdC5kZXRhaWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZXZlbnQuaW5pdEN1c3RvbUV2ZW50KHR5cGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBldmVudDtcbiAgICB9O1xuXG4gICAgQ3VzdG9tRXZlbnQucHJvdG90eXBlID0gd2luZG93LkV2ZW50LnByb3RvdHlwZTtcbiAgICB3aW5kb3cuQ3VzdG9tRXZlbnQgPSBDdXN0b21FdmVudDtcbn0pKCk7XG4iLCJpbXBvcnQgeyBNb2RhbCB9IGZyb20gJy4uL2NvbXBvbmVudHMvY29tbW9uL21vZGFsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJldmlldyB7XG4gICAgY29uc3RydWN0b3IoYnVzKSB7XG4gICAgICAgIHRoaXMuYnVzID0gYnVzO1xuICAgIH1cblxuICAgIGdpdmVTYW1wbGUodGl0bGVNb2RlbCl7ICBcbiAgICAgICAgbGV0IG9wdHMgPSB7XG4gICAgICAgICAgICBhdXRvU2hvdzogZmFsc2UsXG4gICAgICAgICAgICB0aXRsZTogdGl0bGVNb2RlbC5nZXQoJ3RpdGxlJyksXG4gICAgICAgICAgICBjb250ZW50OiBgPGlmcmFtZSBzcmM9XCIkeyB0aXRsZU1vZGVsLmdldCgnc2FtcGxlJykuaHJlZiB9XCI+PC9pZnJhbWU+YCxcbiAgICAgICAgICAgIGNsYXNzZXM6IFsnc2FtcGxlLW1vZGFsJ10sXG4gICAgICAgICAgICBjbG9zZU9uRXNjIDogdHJ1ZSxcbiAgICAgICAgICAgIGNsb3NlT25CbHVyIDogdHJ1ZSxcbiAgICAgICAgICAgIHNob3dDbG9zZUJ1dHRvbjogdHJ1ZVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLm1vZGFsID0gbmV3IE1vZGFsKG9wdHMpO1xuICAgICAgICB0aGlzLm1vZGFsLnNob3coKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgQm9ycm93IGZyb20gJy4vYm9ycm93L0JvcnJvdyc7XG5pbXBvcnQgV2lzaGxpc3QgZnJvbSAnLi93aXNobGlzdC9XaXNobGlzdCc7XG5pbXBvcnQgSG9sZCBmcm9tICcuL2hvbGRzL0hvbGQnO1xuaW1wb3J0IE5vb2sgZnJvbSAnLi9ub29rL05vb2snO1xuaW1wb3J0IFN0YXJSYXRpbmcgZnJvbSAnLi9yYXRpbmdzL1N0YXJSYXRpbmcnO1xuaW1wb3J0IFJlYWRpbmdIaXN0b3J5IGZyb20gJy4vaGlzdG9yeS9SZWFkaW5nSGlzdG9yeSc7XG5cbmltcG9ydCBMYW5ndWFnZU1pc21hdGNoIGZyb20gJy4vY2hlY2tzL0xhbmd1YWdlTWlzbWF0Y2gvTGFuZ3VhZ2VNaXNtYXRjaCc7XG5pbXBvcnQgTGFuZ3VhZ2VNaXNtYXRjaE1vZGFsIGZyb20gJy4vY2hlY2tzL0xhbmd1YWdlTWlzbWF0Y2gvTGFuZ3VhZ2VNaXNtYXRjaE1vZGFsJztcbmltcG9ydCBQcmV2aWV3IGZyb20gJy4vUHJldmlldyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpdGxlQWN0aW9uSGFuZGxlciB7XG4gICAgY29uc3RydWN0b3IoYnVzLCBjYXJkLCBwYXRyb25TZXR0aW5ncykge1xuICAgICAgICB0aGlzLmJ1cyA9IGJ1cztcbiAgICAgICAgdGhpcy5jYXJkID0gY2FyZDtcbiAgICAgICAgdGhpcy5wYXRyb25TZXR0aW5ncyA9IHBhdHJvblNldHRpbmdzO1xuXG4gICAgICAgIHRoaXMuX2JvcnJvdyA9IG5ldyBCb3Jyb3codGhpcy5idXMpO1xuICAgICAgICB0aGlzLl9ob2xkID0gbmV3IEhvbGQodGhpcy5idXMsIHRoaXMuY2FyZCk7XG4gICAgICAgIHRoaXMuX3dpc2hsaXN0ID0gbmV3IFdpc2hsaXN0KHRoaXMuYnVzKTtcbiAgICAgICAgdGhpcy5fbm9vayA9IG5ldyBOb29rKHRoaXMuYnVzKTtcbiAgICAgICAgdGhpcy5fcmF0aW5nID0gbmV3IFN0YXJSYXRpbmcodGhpcy5idXMpO1xuICAgICAgICB0aGlzLl9oaXN0b3J5ID0gbmV3IFJlYWRpbmdIaXN0b3J5KHRoaXMuYnVzKTtcbiAgICAgICAgdGhpcy5fcHJldmlldyA9IG5ldyBQcmV2aWV3KHRoaXMuYnVzKTtcblxuICAgICAgICB0aGlzLmJ1c1xuICAgICAgICAgICAgLm9uKCd0aXRsZTpib3Jyb3cnLCAodGl0bGUsIGNvbnRleHQpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5wZXJmb3JtKCdib3Jyb3cnLCB0aXRsZSwgY29udGV4dClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vbigndGl0bGU6aG9sZCcsICh0aXRsZSwgY29udGV4dCkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLnBlcmZvcm0oJ2hvbGQnLCB0aXRsZSwgY29udGV4dClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vbigndGl0bGU6aG9sZC1jYW5jZWwnLCAodGl0bGUsIGNvbnRleHQpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5wZXJmb3JtKCdob2xkQ2FuY2VsJywgdGl0bGUsIGNvbnRleHQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAub24oJ3RpdGxlOndpc2hsaXN0JywgKHRpdGxlLCBjb250ZXh0KSA9PlxuICAgICAgICAgICAgICAgIHRoaXMucGVyZm9ybSgnd2lzaCcsIHRpdGxlLCBjb250ZXh0KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9uKCd0aXRsZTpub29rJywgKHRpdGxlLCBjb250ZXh0KSA9PlxuICAgICAgICAgICAgICAgIHRoaXMucGVyZm9ybSgnbm9vaycsIHRpdGxlLCBjb250ZXh0KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9uKCd0aXRsZTpyYXRpbmcnLCAodGl0bGUsIGNvbnRleHQpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5wZXJmb3JtKCdyYXRpbmcnLCB0aXRsZSwgY29udGV4dClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vbigndGl0bGU6aGlzdG9yeScsICh0aXRsZSwgY29udGV4dCkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLnBlcmZvcm0oJ2hpc3RvcnknLCB0aXRsZSwgY29udGV4dClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vbigndGl0bGU6cHJldmlldycsICh0aXRsZSwgY29udGV4dCkgPT5cbiAgICAgICAgICAgICAgICB0aGlzLnBlcmZvcm0oJ3ByZXZpZXcnLCB0aXRsZSwgY29udGV4dClcbiAgICAgICAgICAgIClcbiAgICAgICAgICAgIC5vbigndGl0bGU6cmVuZXcnLCAodGl0bGUsIGNvbnRleHQpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5wZXJmb3JtKCdyZW5ldycsIHRpdGxlLCBjb250ZXh0KVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLm9uKCd0aXRsZTpyZXF1ZXN0QWdhaW4nLCAodGl0bGUsIGNvbnRleHQpID0+XG4gICAgICAgICAgICAgICAgdGhpcy5wZXJmb3JtKCdyZXF1ZXN0QWdhaW4nLCB0aXRsZSwgY29udGV4dClcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgcGVyZm9ybShhY3Rpb24sIHRpdGxlTW9kZWwsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKCF3aW5kb3cuT3ZlckRyaXZlLmlzQXV0aGVudGljYXRlZCAmJiBhY3Rpb24gIT09ICdwcmV2aWV3Jykge1xuICAgICAgICAgICAgdGhpcy5fcmVkaXJlY3RUb0F1dGgoXG4gICAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICAgIHRpdGxlTW9kZWwuaWQsXG4gICAgICAgICAgICAgICAgdGl0bGVNb2RlbC5nZXQoJ3RlbXBTdGFyUmF0aW5nJylcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAhd2luZG93Lk92ZXJEcml2ZS5oYXNMaW5rZWRDYXJkcyAmJlxuICAgICAgICAgICAgIXdpbmRvdy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ3NhbXBsZU9ubHlNb2RlJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBsZXQgdGl0bGVBY3Rpb24gPSB0aXRsZU1vZGVsLmdldCgndGl0bGVTdGF0ZScpO1xuICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ3JhdGluZycpIHtcbiAgICAgICAgICAgICAgICB0aXRsZUFjdGlvbiA9IGByYXRpbmd+JHt0aXRsZU1vZGVsLmdldCgndGVtcFN0YXJSYXRpbmcnKX1gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndXNlcjpjYXJkOm5vbmUnLCB7IGFjdGlvbjogdGl0bGVBY3Rpb24gfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZW9mIHRoaXMuX2FjdGlvbnNbYCR7YWN0aW9ufWBdID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLl9leGVjdXRlQWN0aW9uKGFjdGlvbiwgdGl0bGVNb2RlbCwgY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX3JlZGlyZWN0VG9BdXRoKGFjdGlvbiwgaWQsIHJhdGluZykge1xuICAgICAgICBsZXQgYWN0aW9uU3RyID0gYCR7YWN0aW9ufX4ke2lkfWA7XG4gICAgICAgIGlmIChyYXRpbmcpIHtcbiAgICAgICAgICAgIGFjdGlvblN0ciArPSBgfiR7cmF0aW5nfWA7XG4gICAgICAgIH1cbiAgICAgICAgd2luZG93LmxvY2F0aW9uID0gd2luZG93LnVybCh3aW5kb3cucm91dGVzLmFjY291bnRTaWduSW4sIHtcbiAgICAgICAgICAgIGZvcndhcmQ6XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uc2VhcmNoICtcbiAgICAgICAgICAgICAgICAnI2FjdGlvbj0nICtcbiAgICAgICAgICAgICAgICBhY3Rpb25TdHIsXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIF9leGVjdXRlQWN0aW9uKGFjdGlvbiwgdGl0bGUsIGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2VDaGVjayhhY3Rpb24sIHRpdGxlLCAoKSA9PlxuICAgICAgICAgICAgdGhpcy5fYWN0aW9uc1tgJHthY3Rpb259YF0odGl0bGUsIGNvbnRleHQpXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgX2xhbmd1YWdlQ2hlY2soYWN0aW9uLCB0aXRsZSwgc3VjY2Vzc0NhbGxiYWNrKSB7XG4gICAgICAgIGxldCBzaG91bGRDaGVjayA9IGZhbHNlO1xuICAgICAgICBpZiAoXyhbJ2JvcnJvdycsICdob2xkJywgJ3ByZXZpZXcnXSkuY29udGFpbnMoYWN0aW9uKSkge1xuICAgICAgICAgICAgc2hvdWxkQ2hlY2sgPSB0cnVlO1xuICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ3dpc2gnKSB7XG4gICAgICAgICAgICBzaG91bGRDaGVjayA9IHRpdGxlLmdldCgnd2lzaGxpc3RTdGF0ZScpID09PSAnd2lzaGxpc3RBZGQnO1xuICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbiA9PT0gJ2hpc3RvcnknKSB7XG4gICAgICAgICAgICBzaG91bGRDaGVjayA9ICF0aXRsZS5nZXQoJ2lzSW5IaXN0b3J5Jyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc2hvdWxkQ2hlY2spIHtcbiAgICAgICAgICAgIGxldCBmZXRjaExhbmd1YWdlRGF0YSA9ICF0aXRsZS5nZXQoJ2xhbmd1YWdlcycpXG4gICAgICAgICAgICAgICAgPyB0aXRsZS5nZXRNaXNzaW5nQXR0cmlidXRlKCdsYW5ndWFnZXMnKVxuICAgICAgICAgICAgICAgIDogUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgICAgICBmZXRjaExhbmd1YWdlRGF0YS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2NoZWNrTGFuZ3VhZ2VNYXRjaCh0aXRsZSkgfHxcbiAgICAgICAgICAgICAgICAgICAgKENvb2tpZXMuZ2V0KCdsYW5ndWFnZS1taXNtYXRjaC1zZXR0aW5nJykgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIENvb2tpZXMuZ2V0KCdsYW5ndWFnZS1taXNtYXRjaC1zZXR0aW5nJykgPT09ICcxJylcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LkxvZ2dlci5sb2coXG4gICAgICAgICAgICAgICAgICAgICAgICAnd2FybicsXG4gICAgICAgICAgICAgICAgICAgICAgICAnbGF1bmNoaW5nIGxhbmd1YWdlIG1pc21hdGNoIG1vZGFsJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRyb25MYW5ndWFnZTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnBhdHJvblNldHRpbmdzWydsYW5ndWFnZS1zZWxlY3Rpb24nXSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUxhbmd1YWdlczogdGl0bGUuZ2V0KCdsYW5ndWFnZXMnKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgbWlzbWF0Y2hNb2RhbCA9IG5ldyBMYW5ndWFnZU1pc21hdGNoTW9kYWwoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbW9kZWw6IG5ldyBMYW5ndWFnZU1pc21hdGNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZXM6IHRpdGxlLmdldCgnbGFuZ3VhZ2VzJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICBtaXNtYXRjaE1vZGFsLiRlbFxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJy5jb25maXJtLWJ1dHRvbicpXG4gICAgICAgICAgICAgICAgICAgICAgICAub24oJ2NsaWNrJywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc21hdGNoTW9kYWwuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc21hdGNoTW9kYWwuJGVsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZmluZCgnLm5vLXNob3ctY2hlY2tib3gnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmlzKCc6Y2hlY2tlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1pbGxpc2Vjb25kc0luWWVhciA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDAwICogNjAgKiA2MCAqIDI0ICogMzY1O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBleHBpcmVEYXRlID0gbmV3IERhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRlLm5vdygpICsgbWlsbGlzZWNvbmRzSW5ZZWFyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvb2tpZXMuc2V0KCdsYW5ndWFnZS1taXNtYXRjaC1zZXR0aW5nJywgJzEnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBodHRwT25seTogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBpcmVzOiBleHBpcmVEYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY2Vzc0NhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgbWlzbWF0Y2hNb2RhbC4kZWwuZmluZCgnLmNhbmNlbC1idXR0b24nKS5vbignY2xpY2snLCAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtaXNtYXRjaE1vZGFsLmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aXRsZS50cmlnZ2VyKCdjaGFuZ2U6d2lzaGxpc3RTdGF0ZScpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHN1Y2Nlc3NDYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2NoZWNrTGFuZ3VhZ2VNYXRjaCh0aXRsZSkge1xuICAgICAgICBjb25zdCB0aXRsZUxhbmd1YWdlcyA9IHRpdGxlLmdldCgnbGFuZ3VhZ2VzJyk7XG4gICAgICAgIGNvbnN0IHRpdGxlTGFuZ3VhZ2VJZHMgPVxuICAgICAgICAgICAgKHRpdGxlTGFuZ3VhZ2VzICYmIHRpdGxlTGFuZ3VhZ2VzLm1hcCgobGFuZ3VhZ2UpID0+IGxhbmd1YWdlLmlkKSkgfHxcbiAgICAgICAgICAgIFtdO1xuICAgICAgICBsZXQgcGF0cm9uTGFuZ3VhZ2UgPSB3aW5kb3cucGF0cm9uU2V0dGluZ3NbJ2xhbmd1YWdlLXNlbGVjdGlvbiddO1xuICAgICAgICBpZiAoISFwYXRyb25MYW5ndWFnZSkge1xuICAgICAgICAgICAgY29uc3QgdmFyaWV0eUluZGV4ID0gcGF0cm9uTGFuZ3VhZ2UuaW5kZXhPZignLScpO1xuICAgICAgICAgICAgaWYgKHZhcmlldHlJbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBwYXRyb25MYW5ndWFnZSA9IHBhdHJvbkxhbmd1YWdlLnN1YnN0cmluZygwLCB2YXJpZXR5SW5kZXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKCF0aXRsZUxhbmd1YWdlSWRzLmluY2x1ZGVzKHBhdHJvbkxhbmd1YWdlKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBnZXQgX2FjdGlvbnMoKSB7XG4gICAgICAgIGxldCB0aGF0ID0gdGhpcztcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGJvcnJvdyh0aXRsZSwgY29udGV4dCkge1xuICAgICAgICAgICAgICAgIHRoYXQuX2JvcnJvdy5ib3Jyb3dUaXRsZSh0aXRsZSwgY29udGV4dCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBob2xkKHRpdGxlLCBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhhdC5faG9sZC5ob2xkVGl0bGUodGl0bGUsIGNvbnRleHQpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgaG9sZENhbmNlbCh0aXRsZSwgY29udGV4dCkge1xuICAgICAgICAgICAgICAgIHRoYXQuX2hvbGQuaG9sZENhbmNlbCh0aXRsZSwgY29udGV4dCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB3aXNoKHRpdGxlLCBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhhdC5fd2lzaGxpc3Qud2lzaGxpc3RBY3Rpb24odGl0bGUsIGNvbnRleHQpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgbm9vayh0aXRsZSwgY29udGV4dCkge1xuICAgICAgICAgICAgICAgIHRoYXQuX25vb2suc2VuZFRvTm9vayh0aXRsZSwgY29udGV4dCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICByYXRpbmcodGl0bGUsIGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICB0aGF0Ll9yYXRpbmcuaGFuZGxpbmdSYXRpbmcodGl0bGUsIGNvbnRleHQpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgaGlzdG9yeSh0aXRsZSwgY29udGV4dCkge1xuICAgICAgICAgICAgICAgIHRoYXQuX2hpc3RvcnkucmVhZGluZ0hpc3RvcnlBY3Rpb24odGl0bGUsIGNvbnRleHQpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgcHJldmlldyh0aXRsZSkge1xuICAgICAgICAgICAgICAgIHRoYXQuX3ByZXZpZXcuZ2l2ZVNhbXBsZSh0aXRsZSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICByZW5ldyh0aXRsZSwgY29udGV4dCkge1xuICAgICAgICAgICAgICAgIGNvbnRleHQuaXNSZW5ld2FsID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmZvcm1hdExvY2sgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmICh0aXRsZS5hdHRyaWJ1dGVzLmlzRm9ybWF0TG9ja2VkSW4pIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC5mb3JtYXRMb2NrID1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlLmF0dHJpYnV0ZXMub3RoZXJGb3JtYXRzLmxlbmd0aCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGUuYXR0cmlidXRlcy5vdGhlckZvcm1hdHNbMF0uaWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoYXQuX2JvcnJvdy5ib3Jyb3dUaXRsZSh0aXRsZSwgY29udGV4dCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICByZXF1ZXN0QWdhaW4odGl0bGUsIGNvbnRleHQpIHtcbiAgICAgICAgICAgICAgICBjb250ZXh0LmlzUmVxdWVzdEFnYWluID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGF0Ll9ob2xkLmhvbGRUaXRsZSh0aXRsZSwgY29udGV4dCk7XG4gICAgICAgICAgICB9LFxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0IGNsYXNzIFRpdGxlQWN0aW9ucyB7XG4gICAgY29uc3RydWN0b3IoeyBidXMsIGNvbnRleHQgfSkge1xuICAgICAgICB0aGlzLmJ1cyA9IGJ1cztcblxuICAgICAgICB0aGlzLmNvbnRleHQgPSB7XG4gICAgICAgICAgICByb29tOiB1bmRlZmluZWQsXG4gICAgICAgICAgICBjb2xsZWN0aW9uRGVmaW5pdGlvbjogdW5kZWZpbmVkLFxuICAgICAgICB9O1xuXG4gICAgICAgIF8uZXh0ZW5kKHRoaXMuY29udGV4dCwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgcGVyZm9ybShhY3Rpb24sIHRpdGxlTW9kZWwpIHtcbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzW2BfJHthY3Rpb259YF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXNbYF8ke2FjdGlvbn1gXSh0aXRsZU1vZGVsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9ib3Jyb3codGl0bGVNb2RlbCkge1xuICAgICAgICB0aGlzLmJ1cy50cmlnZ2VyKCd0aXRsZTpib3Jyb3cnLCB0aXRsZU1vZGVsLCB0aGlzLmNvbnRleHQpO1xuICAgIH1cblxuICAgIF9ob2xkKHRpdGxlTW9kZWwpIHtcbiAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndGl0bGU6aG9sZCcsIHRpdGxlTW9kZWwsIHRoaXMuY29udGV4dCk7XG4gICAgfVxuXG4gICAgX3dpc2godGl0bGVNb2RlbCkge1xuICAgICAgICB0aGlzLmJ1cy50cmlnZ2VyKCd0aXRsZTp3aXNobGlzdCcsIHRpdGxlTW9kZWwsIHRoaXMuY29udGV4dCk7XG4gICAgfVxuXG4gICAgX25vb2sodGl0bGVNb2RlbCkge1xuICAgICAgICB0aGlzLmJ1cy50cmlnZ2VyKCd0aXRsZTpub29rJywgdGl0bGVNb2RlbCwgdGhpcy5jb250ZXh0KTtcbiAgICB9XG5cbiAgICBfcmF0aW5nKHRpdGxlTW9kZWwpIHtcbiAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndGl0bGU6cmF0aW5nJywgdGl0bGVNb2RlbCwgdGhpcy5jb250ZXh0KTtcbiAgICB9XG5cbiAgICBfaGlzdG9yeSh0aXRsZU1vZGVsKSB7XG4gICAgICAgIHRoaXMuYnVzLnRyaWdnZXIoJ3RpdGxlOmhpc3RvcnknLCB0aXRsZU1vZGVsLCB0aGlzLmNvbnRleHQpO1xuICAgIH1cblxuICAgIF9kb3dubG9hZCh0aXRsZU1vZGVsKSB7XG4gICAgICAgIHRoaXMuYnVzLnRyaWdnZXIoJ3RpdGxlOmRvd25sb2FkJywgdGl0bGVNb2RlbCwgdGhpcy5jb250ZXh0KTtcbiAgICB9XG5cbiAgICBfcHJldmlldyh0aXRsZU1vZGVsKSB7XG4gICAgICAgIHRoaXMuYnVzLnRyaWdnZXIoJ3RpdGxlOnByZXZpZXcnLCB0aXRsZU1vZGVsLCB0aGlzLmNvbnRleHQpO1xuICAgIH1cblxuICAgIF9yZW5ldyh0aXRsZU1vZGVsKSB7XG4gICAgICAgIHRoaXMuYnVzLnRyaWdnZXIoJ3RpdGxlOnJlbmV3JywgdGl0bGVNb2RlbCwgdGhpcy5jb250ZXh0KTtcbiAgICB9XG5cbiAgICBfcmVxdWVzdEFnYWluKHRpdGxlTW9kZWwpIHtcbiAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndGl0bGU6cmVxdWVzdEFnYWluJywgdGl0bGVNb2RlbCwgdGhpcy5jb250ZXh0KTtcbiAgICB9XG5cbiAgICBzZXRDb250ZXh0Um9vbShyb29tKSB7XG4gICAgICAgIGlmIChfKHJvb20pLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29udGV4dC5yb29tO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnJvb20gPSByb29tO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG4gICAgc2V0Q29udGV4dENvbGxlY3Rpb24odGl0bGVDb2xsZWN0aW9uKSB7XG4gICAgICAgIGlmIChfKHRpdGxlQ29sbGVjdGlvbikuaXNFbXB0eSgpKSB7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5jb250ZXh0LnRpdGxlQ29sbGVjdGlvbjtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC50aXRsZUNvbGxlY3Rpb24gPSB0aXRsZUNvbGxlY3Rpb247XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG59XG4iLCJjbGFzcyBUaXRsZVN0YXRlIHtcbiAgICBzdGF0aWMgZ2V0U3RhdGUobWVkaWEsIHBhdHJvbkl0ZW1zKSB7XG4gICAgICAgIGNvbnN0IGZlYXR1cmVNYW5hZ2VyID0gd2luZG93LmZlYXR1cmVNYW5hZ2VyO1xuXG4gICAgICAgIGlmIChmZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ3NhbXBsZU9ubHlNb2RlJykpIHtcbiAgICAgICAgICAgIHJldHVybiAncHJldmlldyc7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbWVkaWFJZCA9IG1lZGlhLmlkO1xuXG4gICAgICAgIGxldCBpc09uSG9sZCA9IHBhdHJvbkl0ZW1zICYmIHBhdHJvbkl0ZW1zLm9uSG9sZHMuaW5kZXhPZihtZWRpYUlkKSA+IC0xO1xuICAgICAgICBsZXQgaXNPbkNoZWNrb3V0cyA9XG4gICAgICAgICAgICBwYXRyb25JdGVtcyAmJiBwYXRyb25JdGVtcy5vbkNoZWNrb3V0cy5pbmRleE9mKG1lZGlhSWQpID4gLTE7XG4gICAgICAgIGxldCBpc0F2YWlsYWJsZSA9XG4gICAgICAgICAgICBtZWRpYS5pc0F2YWlsYWJsZSB8fFxuICAgICAgICAgICAgKGZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnTHVja3lEYXknKSAmJlxuICAgICAgICAgICAgICAgIG1lZGlhLmx1Y2t5RGF5QXZhaWxhYmxlQ29waWVzID4gMCk7XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgL2FjY291bnRcXC9sb2Fucy8udGVzdCh3aW5kb3cubG9jYXRpb24uaHJlZikgJiZcbiAgICAgICAgICAgIG1lZGlhLmlzUmVuZXdhYmxlICYmXG4gICAgICAgICAgICBmZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ2NvbnRlbnQtaG9sZHMnKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIGlmIChpc09uSG9sZCkge1xuICAgICAgICAgICAgICAgIHJldHVybiAncmVxdWVzdGVkJztcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgbWVkaWEuaG9sZHNDb3VudCA8PSAwICYmXG4gICAgICAgICAgICAgICAgbWVkaWEub3duZWRDb3BpZXMgPj0gMCAmJlxuICAgICAgICAgICAgICAgICEoXG4gICAgICAgICAgICAgICAgICAgIGZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnTHVja3lEYXknKSAmJlxuICAgICAgICAgICAgICAgICAgICBtZWRpYS5pc0x1Y2t5RGF5Q2hlY2tvdXRcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3JlbmV3JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiAncmVxdWVzdEFnYWluJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc09uQ2hlY2tvdXRzKSB7XG4gICAgICAgICAgICByZXR1cm4gJ2JvcnJvd2VkJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc09uSG9sZCAmJiAhaXNBdmFpbGFibGUpIHtcbiAgICAgICAgICAgIHJldHVybiAnb25Ib2xkJztcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc0F2YWlsYWJsZSkge1xuICAgICAgICAgICAgaWYgKG1lZGlhLnR5cGUuaWQgPT09ICdwZXJpb2RpY2FscycpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ25vb2snO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gJ2JvcnJvdyc7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWVkaWEuaXNIb2xkYWJsZSAmJiBmZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ2NvbnRlbnQtaG9sZHMnKSkge1xuICAgICAgICAgICAgcmV0dXJuICdob2xkJztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAndW5hdmFpbGFibGUnO1xuICAgIH1cblxuICAgIHN0YXRpYyBpc09uV2lzaGxpc3QobWVkaWEsIHBhdHJvbkl0ZW1zKSB7XG4gICAgICAgIHJldHVybiBwYXRyb25JdGVtcyAmJiBwYXRyb25JdGVtcy5vbldpc2hsaXN0LmluZGV4T2YobWVkaWEuaWQpID4gLTE7XG4gICAgfVxuXG4gICAgc3RhdGljIGlzT25SZWFkaW5nSGlzdG9yeShtZWRpYSwgcGF0cm9uSXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIChcbiAgICAgICAgICAgIHBhdHJvbkl0ZW1zICYmIHBhdHJvbkl0ZW1zLm9uUmVhZGluZ0hpc3RvcnkuaW5kZXhPZihtZWRpYS5pZCkgPiAtMVxuICAgICAgICApO1xuICAgIH1cblxuICAgIHN0YXRpYyBzdGFyUmF0aW5nKG1lZGlhLCBwYXRyb25JdGVtcykge1xuICAgICAgICAvLyBSZXR1cm5zIDAgaWYgbm90IHJhdGVkXG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICAocGF0cm9uSXRlbXMgJiZcbiAgICAgICAgICAgICAgICBwYXRyb25JdGVtcy5zdGFyUmF0aW5ncyAmJlxuICAgICAgICAgICAgICAgIHBhdHJvbkl0ZW1zLnN0YXJSYXRpbmdzW21lZGlhLmlkXSkgfHxcbiAgICAgICAgICAgIDBcbiAgICAgICAgKTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFRpdGxlU3RhdGU7XG4iLCJpbXBvcnQgTGVuZGluZ1BlcmlvZE1vZGFsIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbGVuZGluZ19wZXJpb2RfbW9kYWwvTGVuZGluZ1BlcmlvZE1vZGFsJztcbmltcG9ydCBWaXNpdG9yQWN0aW9uRGlzYWxsb3dlZE1vZGFsIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdmlzaXRvcl9hY3Rpb25fZGlzYWxsb3dlZF9tb2RhbC9WaXNpdG9yQWN0aW9uRGlzYWxsb3dlZE1vZGFsJztcblxuY2xhc3MgQm9ycm93IHtcbiAgICBjb25zdHJ1Y3RvcihidXMpIHtcbiAgICAgICAgdGhpcy5idXMgPSBidXM7XG4gICAgfVxuXG4gICAgYm9ycm93VGl0bGUodGl0bGVNb2RlbCwgY29udGV4dCkge1xuICAgICAgICBsZXQgYm9ycm93ID0gKCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFjb250ZXh0LmlzUmVuZXdhbCkge1xuICAgICAgICAgICAgICAgIHRpdGxlTW9kZWwuc2V0KCd0aXRsZVN0YXRlJywgJ3dhaXRpbmcnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdm9pZCBuZXcgTGVuZGluZ1BlcmlvZE1vZGFsKHtcbiAgICAgICAgICAgICAgICBtb2RlbDogdGl0bGVNb2RlbCxcbiAgICAgICAgICAgICAgICBidXM6IHRoaXMuYnVzLFxuICAgICAgICAgICAgICAgIGlzUmVuZXdhbDogISFjb250ZXh0LmlzUmVuZXdhbCxcbiAgICAgICAgICAgICAgICBhY3Rpb246IChtb2RhbCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ib3Jyb3dBamF4KHRpdGxlTW9kZWwsIGNvbnRleHQpLmFsd2F5cygoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtb2RhbC5jbG9zZSgpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIG9uRXJyb3I6IChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9ib3Jyb3dGYWlsdXJlKHRpdGxlTW9kZWwsIHt9LCAnJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICBpZiAod2luZG93LmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnTEhUTkctMzM4NycpKSB7XG4gICAgICAgICAgICBpZiAodGl0bGVNb2RlbC5pc0F2YWlsYWJsZSB8fCAhIWNvbnRleHQuaXNSZW5ld2FsKSB7XG4gICAgICAgICAgICAgICAgYm9ycm93KCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdpbmRvdy5PdmVyRHJpdmUuaXNWaXNpdG9yKSB7XG4gICAgICAgICAgICAgICAgbmV3IFZpc2l0b3JBY3Rpb25EaXNhbGxvd2VkTW9kYWwoJ2JvcnJvdycpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYm9ycm93KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfYm9ycm93QWpheCh0aXRsZU1vZGVsLCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuYnVzLnRyaWdnZXIoJ3RpdGxlOmJvcnJvdzpzdGFydCcsIHsgdGl0bGVNb2RlbCwgY29udGV4dCB9KTtcblxuICAgICAgICBsZXQgeyBtb2JpbGUsIHRhYmxldCB9ID0gYm93c2VyO1xuXG4gICAgICAgIGNvbnN0IGxlbmRpbmdQZXJpb2QgPSB0aXRsZU1vZGVsLmdldCgnbGVuZGluZ1BlcmlvZCcpO1xuICAgICAgICByZXR1cm4gJC5wb3N0KFxuICAgICAgICAgICAgd2luZG93LnVybCh3aW5kb3cucm91dGVzLm1lZGlhQm9ycm93LCB7IG1lZGlhSWQ6IHRpdGxlTW9kZWwuaWQgfSksXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGVuZGluZ1BlcmlvZDogbGVuZGluZ1BlcmlvZC5sZW5kaW5nUGVyaW9kLFxuICAgICAgICAgICAgICAgIHVuaXRzOiBsZW5kaW5nUGVyaW9kLnVuaXRzLFxuICAgICAgICAgICAgICAgIGlzTW9iaWxlOiBtb2JpbGUgfHwgdGFibGV0LFxuICAgICAgICAgICAgICAgIHJldHVybkZ1bGxMb2FuT2JqZWN0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGlzUmVuZXdhbDogISFjb250ZXh0LmlzUmVuZXdhbCxcbiAgICAgICAgICAgICAgICBpc0x1Y2t5RGF5Q2hlY2tvdXQ6XG4gICAgICAgICAgICAgICAgICAgIHRpdGxlTW9kZWwuaXNMdWNreURheUNoZWNrb3V0ICYmICFjb250ZXh0LmlzUmVuZXdhbCxcbiAgICAgICAgICAgIH1cbiAgICAgICAgKVxuICAgICAgICAgICAgLmRvbmUoKHJlc3BvbnNlKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuX2JvcnJvd1N1Y2Nlc3ModGl0bGVNb2RlbCwgcmVzcG9uc2UsIGNvbnRleHQpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAuZmFpbCgoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuX2JvcnJvd0ZhaWx1cmUodGl0bGVNb2RlbCwganFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKVxuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLmFsd2F5cygoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndGl0bGU6Ym9ycm93OmVuZCcsIHRpdGxlTW9kZWwpO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2JvcnJvd1N1Y2Nlc3ModGl0bGVNb2RlbCwgcmVzcG9uc2UsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKCEhY29udGV4dC5pc1JlbmV3YWwpIHtcbiAgICAgICAgICAgIHRpdGxlTW9kZWwuc2V0KCd0aXRsZVN0YXRlJywgJ3JlbmV3ZWQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRpdGxlTW9kZWwuc2V0KCd0aXRsZVN0YXRlJywgJ2JvcnJvd2VkJyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJ1cy50cmlnZ2VyKCd0aXRsZTpib3Jyb3c6c3VjY2VzcycsIHtcbiAgICAgICAgICAgIGV4cGlyZXM6IHJlc3BvbnNlLmV4cGlyZXMsXG4gICAgICAgICAgICBsb2FuOiByZXNwb25zZSxcbiAgICAgICAgICAgIHRpdGxlTW9kZWwsXG4gICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICB9KTtcblxuICAgICAgICB0aXRsZU1vZGVsLnNldCgnaXNJbkhpc3RvcnknLCB0cnVlKTtcbiAgICB9XG5cbiAgICBfYm9ycm93RmFpbHVyZSh0aXRsZU1vZGVsLCBqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24sIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKCEvYWNjb3VudFxcL2xvYW5zLy50ZXN0KHdpbmRvdy5sb2NhdGlvbi5ocmVmKSkge1xuICAgICAgICAgICAgdGl0bGVNb2RlbC5zZXQoJ3RpdGxlU3RhdGUnLCAnYm9ycm93Jyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJ1cy50cmlnZ2VyKCd0aXRsZTpib3Jyb3c6ZmFpbCcsIHtcbiAgICAgICAgICAgIGpxWEhSLFxuICAgICAgICAgICAgdGV4dFN0YXR1cyxcbiAgICAgICAgICAgIGVycm9yVGhyb3duLFxuICAgICAgICAgICAgdGl0bGVNb2RlbCxcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgQm9ycm93O1xuIiwidmFyIHNlbXZlciA9IHJlcXVpcmUoJ3NlbXZlcicpO1xuXG5pbXBvcnQgSG9sZENvbmZsaWN0TW9kYWwgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9tZWRpYS92aWV3cy9Ib2xkQ29uZmxpY3RNb2RhbC5qcyc7XG5pbXBvcnQgVGl0bGVGdWxmaWxsbWVudE1vZGFsIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvVGl0bGVGdWxmaWxsbWVudE1vZGFsL1RpdGxlRnVsZmlsbG1lbnRNb2RhbC5qcyc7XG5pbXBvcnQgTG9hblRpdGxlIGZyb20gJy4uLy4uLy4uLy4uL2J1c2luZXNzLW9iamVjdHMvbG9hbi10aXRsZSc7XG5pbXBvcnQgQWNjb3VudExpbWl0cyBmcm9tICcuLi8uLi8uLi8uLi9idXNpbmVzcy1vYmplY3RzL2FjY291bnQtbGltaXRzJztcbmltcG9ydCBWaXNpdG9yQWN0aW9uRGlzYWxsb3dlZE1vZGFsIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdmlzaXRvcl9hY3Rpb25fZGlzYWxsb3dlZF9tb2RhbC9WaXNpdG9yQWN0aW9uRGlzYWxsb3dlZE1vZGFsJztcbmltcG9ydCBOb25Ib2xkQ29uZmxpY3RNb2RhbCBmcm9tICcuLi8uLi9jb21wb25lbnRzL25vbl9ob2xkX2NvbmZsaWN0X21vZGFsL05vbkhvbGRDb25mbGljdE1vZGFsJztcbmltcG9ydCB7IE1vZGFsIH0gZnJvbSAnLi4vLi4vY29tcG9uZW50cy9jb21tb24vbW9kYWwuanMnO1xuXG5jbGFzcyBCb3Jyb3dBY3Rpb25zIHtcbiAgICBjb25zdHJ1Y3RvcihidXMsIGZlYXR1cmVNYW5hZ2VyLCBnbG9iYWxQcmVmZXJlbmNlcykge1xuICAgICAgICB0aGlzLmJ1cyA9IGJ1cztcbiAgICAgICAgdGhpcy5mZWF0dXJlTWFuYWdlciA9IGZlYXR1cmVNYW5hZ2VyO1xuICAgICAgICB0aGlzLmdsb2JhbFByZWZlcmVuY2VzID0gZ2xvYmFsUHJlZmVyZW5jZXM7XG5cbiAgICAgICAgdGhpcy5idXNcbiAgICAgICAgICAgIC5vbigndGl0bGU6Ym9ycm93OnN1Y2Nlc3MnLCAoZGF0YSkgPT4gdGhpcy5ib3Jyb3dTdWNjZXNzKGRhdGEpKVxuICAgICAgICAgICAgLm9uKCd0aXRsZTpib3Jyb3c6ZmFpbCcsIChkYXRhKSA9PiB0aGlzLmJvcnJvd0ZhaWwoZGF0YSkpXG4gICAgICAgICAgICAub24oJ3RpdGxlOmJvcnJvdzpjb25mbGljdCcsIChkYXRhKSA9PlxuICAgICAgICAgICAgICAgIHRoaXMuX29wZW5Db25mbGljdE1vZGFsKGRhdGEudGl0bGVNb2RlbClcbiAgICAgICAgICAgICk7XG4gICAgfVxuXG4gICAgYm9ycm93U3VjY2VzcyhkYXRhKSB7XG4gICAgICAgIGNvbnN0IGV4cCA9IHdpbmRvdy5odG1sKCdkYXRlLWZ1bGwnLCB7IGQ6IGRhdGEuZXhwaXJlcyB9KTtcbiAgICAgICAgY29uc3QgbGlua1VybCA9IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5hY2NvdW50TG9hbnMpO1xuICAgICAgICBjb25zdCBsb2FucyA9IHdpbmRvdy5odG1sKCdsb2FucycpO1xuICAgICAgICBjb25zdCBsaW1pdHNVcmwgPSB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMucmVzdC5hY2NvdW50LmxpbWl0cyk7XG5cbiAgICAgICAgJC5hamF4KGxpbWl0c1VybCkudGhlbigocmVzdWx0KSA9PiB7XG4gICAgICAgICAgICBsZXQgYWNjb3VudExpbWl0cyA9IG5ldyBBY2NvdW50TGltaXRzKHJlc3VsdC5kYXRhKTtcbiAgICAgICAgICAgIGxldCBsaW1pdEZvcm1hdHMgPSB0aGlzLmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZChcbiAgICAgICAgICAgICAgICAna2luZGxlTG9hbkZvcm1hdExpbWl0J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGxldCBwcmVmZXJLaW5kbGUgPVxuICAgICAgICAgICAgICAgIChDb29raWVzLmdldCgna2luZGxlRnVsZmlsbG1lbnRBcHBPdmVycmlkZScpICYmXG4gICAgICAgICAgICAgICAgICAgIENvb2tpZXMuZ2V0KCdraW5kbGVGdWxmaWxsbWVudEFwcE92ZXJyaWRlJykgPT09ICcxJykgfHxcbiAgICAgICAgICAgICAgICAodGhpcy5nbG9iYWxQcmVmZXJlbmNlcyAmJlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmdsb2JhbFByZWZlcmVuY2VzLmdldCgna2luZGxlRnVsZmlsbG1lbnQnKSk7XG4gICAgICAgICAgICBsZXQgaW5BcHAgPSBDb29raWVzLmdldCgnb21jYnJvd3NlJykgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGxldCByZXN0cmljdFZpZGVvID1cbiAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnc3RyZWFtaW5nLXVwZGF0ZS1tZXNzYWdlJykgJiZcbiAgICAgICAgICAgICAgICBpbkFwcCAmJlxuICAgICAgICAgICAgICAgIHNlbXZlci5zYXRpc2ZpZXMoXG4gICAgICAgICAgICAgICAgICAgIHNlbXZlci5jb2VyY2Uod2luZG93Lk92ZXJEcml2ZS5hcHBWZXJzaW9uKSxcbiAgICAgICAgICAgICAgICAgICAgJzwzLjguNidcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBsZXQgbG9hbiA9IG5ldyBMb2FuVGl0bGUoXG4gICAgICAgICAgICAgICAgZGF0YS5sb2FuLFxuICAgICAgICAgICAgICAgIGxpbWl0Rm9ybWF0cyxcbiAgICAgICAgICAgICAgICBwcmVmZXJLaW5kbGUsXG4gICAgICAgICAgICAgICAgaW5BcHAsXG4gICAgICAgICAgICAgICAgd2luZG93LmJvd3Nlci5tYWMsXG4gICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ25vQXVkaW9ib29rc0Zvck1hY09TJyksXG4gICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoXG4gICAgICAgICAgICAgICAgICAgICdyZWVuYWJsZU1wM0Rvd25sb2FkTWFjT1NQcmVDYXRhbGluYSdcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIHdpbmRvdy5PdmVyRHJpdmUuaXNQcmVDYXRhbGluYU1hYyxcbiAgICAgICAgICAgICAgICByZXN0cmljdFZpZGVvLFxuICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdoaWRlLWRpc2FibGVkLWZvcm1hdHMnKSxcbiAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnb2RhcHAtc3Vuc2V0JyksXG4gICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoXG4gICAgICAgICAgICAgICAgICAgICdmaXgtdGl0bGVtb2RhbC1tYWdhemluZS1kaXNwbGF5J1xuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ29kcmVhZC1mdWxmaWxsbWVudC1maXJzdCcpXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBsZXQgbW9kYWwgPSBuZXcgVGl0bGVGdWxmaWxsbWVudE1vZGFsKHtcbiAgICAgICAgICAgICAgICBsb2FuOiBsb2FuLFxuICAgICAgICAgICAgICAgIHRpdGxlOiBkYXRhLnRpdGxlTW9kZWwsXG4gICAgICAgICAgICAgICAgYnVzOiB0aGlzLmJ1cyxcbiAgICAgICAgICAgICAgICBmZWF0dXJlTWFuYWdlcjogdGhpcy5mZWF0dXJlTWFuYWdlcixcbiAgICAgICAgICAgICAgICBnbG9iYWxQcmVmZXJlbmNlczogdGhpcy5nbG9iYWxQcmVmZXJlbmNlcyxcbiAgICAgICAgICAgICAgICBhY2NvdW50TGltaXRzOiBhY2NvdW50TGltaXRzLFxuICAgICAgICAgICAgICAgIGlzUmVuZXdhbDogISFkYXRhLmNvbnRleHQuaXNSZW5ld2FsLFxuICAgICAgICAgICAgICAgIGZvcm1hdExvY2s6IGRhdGEuY29udGV4dC5mb3JtYXRMb2NrIHx8IG51bGwsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG1vZGFsLnJlbmRlcigpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBib3Jyb3dGYWlsKGRhdGEpIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKGRhdGEuanFYSFIucmVzcG9uc2VUZXh0IHx8ICd7fScpO1xuICAgICAgICBpZiAocmVzcG9uc2UuZXJyb3JDb2RlID09PSAnUGF0cm9uQ2FyZEZhaWxlZEF1dGhlbnRpY2F0aW9uJykge1xuICAgICAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndXNlcjpjYXJkOmludmFsaWQnKTtcbiAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5zZXNzaW9uRXhwaXJlZCkge1xuICAgICAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndXNlcjpzZXNzaW9uOmV4cGlyZWQnLCB7XG4gICAgICAgICAgICAgICAgYWN0aW9uOiBgYm9ycm93fiR7ZGF0YS50aXRsZU1vZGVsLmlkfWAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHJlc3BvbnNlLmVycm9yQ29kZSA9PT0gJ0Nvc3RQZXJDaXJjQXZhaWxhYmlsaXR5RmFzdExhbmVPbmx5JyB8fFxuICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JDb2RlID09PSAnVGl0bGVOb0xvbmdlckF2YWlsYWJsZSdcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB0aGlzLl9vcGVuQ29uZmxpY3RNb2RhbChkYXRhLnRpdGxlTW9kZWwpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmVycm9yQ29kZSA9PT0gJ0Nvc3RQZXJDaXJjTm9CdWRnZXQnKSB7XG4gICAgICAgICAgICB0aGlzLl9vcGVuQ29uZmxpY3RNb2RhbChkYXRhLnRpdGxlTW9kZWwpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JDb2RlID09PSAnUmVuZXdhbEZhaWxlZCcgfHxcbiAgICAgICAgICAgIHJlc3BvbnNlLmVycm9yQ29kZSA9PT0gJ0hvbGRzUHJldmVudFJlbmV3YWwnXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5fb3BlbkNvbmZsaWN0TW9kYWwoZGF0YS50aXRsZU1vZGVsKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIHJlc3BvbnNlLmVycm9yQ29kZSA9PT0gJ1BhdHJvbkV4Y2VlZGVkTHVja3lEYXlMaW1pdCcgJiZcbiAgICAgICAgICAgIHRoaXMuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdMdWNreURheScpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5fb3BlbkNvbmZsaWN0TW9kYWwoZGF0YS50aXRsZU1vZGVsLCB7IGlzTHVja3lEYXk6IHRydWUgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICByZXNwb25zZS5lcnJvckNvZGUgPT09ICdQYXRyb25FeGNlZWRlZENvc3RQZXJDaXJjQ2hlY2tvdXRMaW1pdCdcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBpZiAod2luZG93LmxvY2F0aW9uLmhyZWYubWF0Y2goJ2FjY291bnQnKSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh0b2FzdGVyKVxuICAgICAgICAgICAgICAgICAgICB0b2FzdGVyLnB1c2goYCR7d2luZG93LnRleHQoJ2Vycm9yQ1BDTGltaXQnKX1gLCAnZXJyb3InKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fb3BlbkNvbmZsaWN0TW9kYWwoZGF0YS50aXRsZU1vZGVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5lcnJvckNvZGUgPT09ICdDaGVja291dE5vdEFsbG93ZWRGb3JWaXNpdG9yJykge1xuICAgICAgICAgICAgbmV3IFZpc2l0b3JBY3Rpb25EaXNhbGxvd2VkTW9kYWwoJ2JvcnJvdycpO1xuICAgICAgICAgICAgaWYgKHdpbmRvdy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ0xIVE5HLTMzODcnKSkge1xuICAgICAgICAgICAgICAgIGRhdGEudGl0bGVNb2RlbC5zZXQoe1xuICAgICAgICAgICAgICAgICAgICB0aXRsZVN0YXRlOiAndW5hdmFpbGFibGUnLFxuICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVDb3BpZXM6IDAsXG4gICAgICAgICAgICAgICAgICAgIGlzQXZhaWxhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChyZXNwb25zZS5lcnJvckNvZGUgPT09ICdMZW5kaW5nUGVyaW9kSW52YWxpZCcpIHtcbiAgICAgICAgICAgIG5ldyBNb2RhbCh7XG4gICAgICAgICAgICAgICAgdGl0bGU6IHdpbmRvdy50ZXh0KCdnZW5lcmljRXJyb3InKSxcbiAgICAgICAgICAgICAgICBjb250ZW50OiBgPHA+JHt3aW5kb3cuaHRtbCgnZXJyb3IuZGVmYXVsdEVycm9yJyl9PC9wPmAsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX2RlZmF1bHRFcnJvcihyZXNwb25zZS5lcnJvckNvZGUsIGRhdGEudGl0bGVNb2RlbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfZGVmYXVsdEVycm9yKGVycm9yQ29kZSwgdGl0bGVNb2RlbCkge1xuICAgICAgICBsZXQgaHJlZiA9ICcnO1xuICAgICAgICBsZXQgbGlua1RleHQgPSAnJztcblxuICAgICAgICBpZiAoXG4gICAgICAgICAgICBlcnJvckNvZGUgPT09ICdQYXRyb25FeGNlZWRlZENoZWNrb3V0TGltaXQnIHx8XG4gICAgICAgICAgICBlcnJvckNvZGUgPT09ICdMb2FuQWxyZWFkeUV4aXN0cydcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBocmVmID0gd2luZG93LnVybCh3aW5kb3cucm91dGVzLmFjY291bnRMb2Fucyk7XG4gICAgICAgICAgICBsaW5rVGV4dCA9IHdpbmRvdy5odG1sKCdsb2FucycpO1xuICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgZXJyb3JDb2RlID09PSAnUGF0cm9uRXhjZWVkZWRDaHVybmluZ0xpbWl0JyB8fFxuICAgICAgICAgICAgZXJyb3JDb2RlID09PSAnUGF0cm9uVHlwZVJlc3RyaWN0ZWRGcm9tVGl0bGUnXG4gICAgICAgICkge1xuICAgICAgICAgICAgaHJlZiA9IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5zdXBwb3J0TWVtYmVycyk7XG4gICAgICAgICAgICBsaW5rVGV4dCA9IHdpbmRvdy5odG1sKCdwbGVhc2VDb250YWN0U3VwcG9ydCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRvYXN0ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBgPGEgY2xhc3M9XCJib2xkXCIgaHJlZj1cIiR7aHJlZn1cIiB0YWJpbmRleD1cIjBcIj4ke2xpbmtUZXh0fTwvYT5gO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGVycm9yQ29kZSA9PT0gJ1BhdHJvbkV4Y2VlZGVkQ2hlY2tvdXRMaW1pdCcgJiZcbiAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnaG9sZFJlZGVsaXZlcnknKSAmJlxuICAgICAgICAgICAgICAgIHRpdGxlTW9kZWwuZ2V0KCdob2xkTGlzdFBvc2l0aW9uJykgPT09IDFcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIHRvYXN0ZXIucHVzaChcbiAgICAgICAgICAgICAgICAgICAgYCR7d2luZG93LnRleHQoYGhvbGRSZWRlbGl2ZXJ5LmxvYW5zTGltaXRgLCB7IGxpbmsgfSl9YCxcbiAgICAgICAgICAgICAgICAgICAgJ2Vycm9yJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRvYXN0ZXIucHVzaChcbiAgICAgICAgICAgICAgICAgICAgYDxzdHJvbmc+JHt3aW5kb3cuaHRtbChcbiAgICAgICAgICAgICAgICAgICAgICAgICdnZW5lcmljRXJyb3InXG4gICAgICAgICAgICAgICAgICAgICl9PC9zdHJvbmc+ICR7d2luZG93LnRleHQoYGVycm9yLiR7ZXJyb3JDb2RlfWAsIHsgbGluayB9KX1gLFxuICAgICAgICAgICAgICAgICAgICAnZXJyb3InXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vcGVuQ29uZmxpY3RNb2RhbCh0aXRsZU1vZGVsLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgLy8gV2UgbWFrZSBzb21lIGFzc3VtcHRpb25zIGFib3V0IHRoZSB0aXRsZSBzdGF0ZSBoZXJlIGJlY2F1c2UgYXQgdGhpcyBwb2ludFxuICAgICAgICAvLyB0aGUgZGF0YSByZXR1cm5lZCBieSB0aHVuZGVyIGlzIG5vdCB0cnVzdHdvcnRoeS4gSUU6IEl0IHdpbGwgcmV0dXJuIGF2YWlsYWJsZSBjb3BpZXMgd2hlbiB0aGVyZSBhcmUgbm9uZVxuICAgICAgICBpZiAoIXRpdGxlTW9kZWwuY2FuUGxhY2VIb2xkKSB7XG4gICAgICAgICAgICBuZXcgTm9uSG9sZENvbmZsaWN0TW9kYWwodGl0bGVNb2RlbCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB0aXRsZU1vZGVsLnNldCh7XG4gICAgICAgICAgICAgICAgdGl0bGVTdGF0ZTogdGl0bGVNb2RlbC5nZXQoJ2lzT25Ib2xkJylcbiAgICAgICAgICAgICAgICAgICAgPyAnb25Ib2xkJ1xuICAgICAgICAgICAgICAgICAgICA6ICd1bmF2YWlsYWJsZScsXG4gICAgICAgICAgICAgICAgYXZhaWxhYmxlQ29waWVzOiAwLFxuICAgICAgICAgICAgICAgIGlzQXZhaWxhYmxlOiBmYWxzZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbGV0IGlzUmVxdWVzdEFnYWluID0gL2FjY291bnRcXC9sb2Fucy8udGVzdCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgICAgICB0aXRsZU1vZGVsLnNldCh7XG4gICAgICAgICAgICAgICAgdGl0bGVTdGF0ZTogaXNSZXF1ZXN0QWdhaW4gPyAncmVxdWVzdEFnYWluJyA6ICdob2xkJyxcbiAgICAgICAgICAgICAgICBhdmFpbGFibGVDb3BpZXM6IDAsXG4gICAgICAgICAgICAgICAgaXNBdmFpbGFibGU6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBuZXcgSG9sZENvbmZsaWN0TW9kYWwodGhpcy5idXMsIHRpdGxlTW9kZWwsIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBCb3Jyb3dBY3Rpb25zO1xuIiwiY29uc3QgeyBodG1sIH0gPSB3aW5kb3c7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExhbmd1YWdlTWlzbWF0Y2ggZXh0ZW5kcyBCYWNrYm9uZS5Nb2RlbCB7XG4gICAgZ2V0IGxhbmd1YWdlVGV4dCgpIHtcbiAgICAgICAgY29uc3QgbGFuZ3VhZ2VDb2RlcyA9IHRoaXMuZ2V0KCdsYW5ndWFnZXMnKS5tYXAoXG4gICAgICAgICAgICAobGFuZ3VhZ2UpID0+IGxhbmd1YWdlLmlkICYmIGxhbmd1YWdlLmlkLnNwbGl0KCctJylbMF1cbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgdHJhbnNsYXRpb25zID0gbGFuZ3VhZ2VDb2Rlcy5tYXAoXG4gICAgICAgICAgICAoY29kZSkgPT4gY29kZSAmJiBodG1sKGBsYW5ndWFnZXMuY29kZS0ke2NvZGV9YClcbiAgICAgICAgKTtcbiAgICAgICAgcmV0dXJuIGh0bWwoJ2xhbmd1YWdlTWlzbWF0Y2guaW5MYW5ndWFnZScsIHtcbiAgICAgICAgICAgIGxhbmd1YWdlOiB0cmFuc2xhdGlvbnMuam9pbignLCAnKSxcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZ2V0IGFyZVlvdVN1cmVUZXh0KCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMuZ2V0KCdhY3Rpb24nKSkge1xuICAgICAgICAgICAgY2FzZSAnYm9ycm93JzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbCgnbGFuZ3VhZ2VNaXNtYXRjaC5hcmVZb3VTdXJlLmJvcnJvdycpO1xuICAgICAgICAgICAgY2FzZSAnaG9sZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGh0bWwoJ2xhbmd1YWdlTWlzbWF0Y2guYXJlWW91U3VyZS5ob2xkJyk7XG4gICAgICAgICAgICBjYXNlICd3aXNoJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gaHRtbCgnbGFuZ3VhZ2VNaXNtYXRjaC5hcmVZb3VTdXJlLndpc2gnKTtcbiAgICAgICAgICAgIGNhc2UgJ2hpc3RvcnknOlxuICAgICAgICAgICAgICAgIHJldHVybiBodG1sKCdsYW5ndWFnZU1pc21hdGNoLmFyZVlvdVN1cmUuaGlzdG9yeScpO1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXQgYWN0aW9uVGV4dCgpIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLmdldCgnYWN0aW9uJykpIHtcbiAgICAgICAgICAgIGNhc2UgJ2JvcnJvdyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGh0bWwoJ2JvcnJvdycpO1xuICAgICAgICAgICAgY2FzZSAnaG9sZCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGh0bWwoJ3BsYWNlSG9sZCcpO1xuICAgICAgICAgICAgY2FzZSAnd2lzaCc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGh0bWwoJ2FkZFRvV2lzaExpc3QnKTtcbiAgICAgICAgICAgIGNhc2UgJ2hpc3RvcnknOlxuICAgICAgICAgICAgICAgIHJldHVybiBodG1sKCdyZWFkaW5nSGlzdG9yeS5hZGQnKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIGh0bWwoJ2NvbmZpcm0nKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImV4cG9ydCBkZWZhdWx0ICh7bGFuZ3VhZ2VUZXh0LCBhcmVZb3VTdXJlVGV4dCwgYWN0aW9uVGV4dH0pID0+IGBcbiAgICA8ZGl2IGNsYXNzPSdtb2RhbC10ZXh0Jz5cbiAgICAgICAgJHtsYW5ndWFnZVRleHR9ICR7YXJlWW91U3VyZVRleHR9XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8aW5wdXQgdHlwZT0nY2hlY2tib3gnIGlkPSduby1zaG93LWNoZWNrYm94JyBjbGFzcz0nbm8tc2hvdy1jaGVja2JveCcgLz48bGFiZWwgY2xhc3M9J25vLXNob3ctbGFiZWwnIGZvcj0nbm8tc2hvdy1jaGVja2JveCc+JHt3aW5kb3cuaHRtbCgnZG9udFNob3cnKX08L2xhYmVsPlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPSdidXR0b24tY29udGFpbmVyJz5cbiAgICAgICAgPGJ1dHRvbiB0eXBlPSdidXR0b24nIGNsYXNzPSdjb25maXJtLWJ1dHRvbiBidXR0b24gbWFyZ2luLXNtYWxsIHJhZGl1cyBzZWNvbmRhcnkgY29udHJhc3QgdS1hbGxDYXBzJz4ke2FjdGlvblRleHR9PC9idXR0b24+XG4gICAgICAgIDxidXR0b24gdHlwZT0nYnV0dG9uJyBjbGFzcz0nY2FuY2VsLWJ1dHRvbiBidXR0b24gbWFyZ2luLXNtYWxsIG91dGxpbmUgZ3JheSB1LWFsbENhcHMnPiR7d2luZG93Lmh0bWwoJ2NhbmNlbCcpfTwvYnV0dG9uPlxuICAgIDwvZGl2PlxuYDtcbiIsImltcG9ydCB7IE1vZGFsIH0gZnJvbSAnLi4vLi4vLi4vY29tcG9uZW50cy9jb21tb24vbW9kYWwnO1xuaW1wb3J0IExhbmd1YWdlTWlzbWF0Y2hNb2RhbFRlbXBsYXRlIGZyb20gJy4vTGFuZ3VhZ2VNaXNtYXRjaE1vZGFsLmh0bWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMYW5ndWFnZU1pc21hdGNoTW9kYWwgZXh0ZW5kcyBNb2RhbCB7XG4gICAgY29uc3RydWN0b3Ioe21vZGVsfSkge1xuICAgICAgICBjb25zdCBtb2RhbENvbnRlbnRzID0ge1xuICAgICAgICAgICAgY2xhc3NlczogWydMYW5ndWFnZU1pc21hdGNoTW9kYWwnXSxcbiAgICAgICAgICAgIHRpdGxlOiB3aW5kb3cuaHRtbCgnbGFuZ3VhZ2VNaXNtYXRjaC5sYW5ndWFnZUNvbmZpcm1hdGlvbicpLFxuICAgICAgICAgICAgY29udGVudDogTGFuZ3VhZ2VNaXNtYXRjaE1vZGFsVGVtcGxhdGUoe1xuICAgICAgICAgICAgICAgIGxhbmd1YWdlVGV4dDogbW9kZWwubGFuZ3VhZ2VUZXh0LFxuICAgICAgICAgICAgICAgIGFyZVlvdVN1cmVUZXh0OiBtb2RlbC5hcmVZb3VTdXJlVGV4dCxcbiAgICAgICAgICAgICAgICBhY3Rpb25UZXh0OiBtb2RlbC5hY3Rpb25UZXh0XG4gICAgICAgICAgICB9KVxuICAgICAgICB9O1xuICAgICAgICBzdXBlcihtb2RhbENvbnRlbnRzKTtcbiAgICB9XG59XG4iLCJpbXBvcnQgUmVtb3ZlSGlzdG9yeU1vZGFsIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbWVkaWEvdmlld3MvUmVtb3ZlSGlzdG9yeU1vZGFsLmpzJztcblxuY2xhc3MgUmVhZGluZ0hpc3Rvcnkge1xuICAgIGNvbnN0cnVjdG9yKGJ1cykge1xuICAgICAgICB0aGlzLmJ1cyA9IGJ1cztcbiAgICB9XG5cbiAgICBpbXBvcnRGcm9tUmF0ZWQoKSB7XG4gICAgICAgIHRoaXMuYnVzLnRyaWdnZXIoJ2hpc3Rvcnk6aW1wb3J0RnJvbVJhdGVkOnN0YXJ0Jyk7XG5cbiAgICAgICAgcmV0dXJuICQucG9zdCh3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMucmVzdC5yZWFkaW5nSGlzdG9yeS5pbmRleCkpXG4gICAgICAgICAgICAuZG9uZSgoLi4ucGFyYW1zKSAgID0+IHRoaXMuYnVzLnRyaWdnZXIoJ2hpc3Rvcnk6aW1wb3J0RnJvbVJhdGVkOnN1Y2Nlc3MnLCAuLi5wYXJhbXMpKVxuICAgICAgICAgICAgLmZhaWwoKC4uLnBhcmFtcykgICA9PiB0aGlzLmJ1cy50cmlnZ2VyKCdoaXN0b3J5OmltcG9ydEZyb21SYXRlZDpmYWlsJywgLi4ucGFyYW1zKSlcbiAgICAgICAgICAgIC5hbHdheXMoKCkgICAgICAgICAgPT4gdGhpcy5idXMudHJpZ2dlcignaGlzdG9yeTppbXBvcnRGcm9tUmF0ZWQ6ZW5kJykpO1xuICAgIH1cblxuICAgIHJlYWRpbmdIaXN0b3J5QWN0aW9uKHRpdGxlTW9kZWwsIGNvbnRleHQpIHtcbiAgICAgICAgbGV0IGFjdGlvbiA9IHRpdGxlTW9kZWwuZ2V0KCdpc0luSGlzdG9yeScpID8gJ3JlbW92ZScgOiAnYWRkJztcblxuICAgICAgICB0aGlzLmJ1cy50cmlnZ2VyKCd0aXRsZTpoaXN0b3J5OnN0YXJ0JywgeyB0aXRsZU1vZGVsLCBhY3Rpb24gfSk7XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgaWYgKGFjdGlvbiA9PT0gJ3JlbW92ZScpIHtcbiAgICAgICAgICAgICAgICBuZXcgUmVtb3ZlSGlzdG9yeU1vZGFsKHtcbiAgICAgICAgICAgICAgICAgICAgYnVzICAgOiB0aGlzLmJ1cyxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGUgOiB0aXRsZU1vZGVsLFxuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2hpc3RvcnlSZW1vdmVBamF4KHRpdGxlTW9kZWwsIGNvbnRleHQpLnRoZW4ocmVzb2x2ZSkuZmFpbChyZWplY3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX2hpc3RvcnlBZGRBamF4KHRpdGxlTW9kZWwsIGNvbnRleHQpLnRoZW4ocmVzb2x2ZSkuZmFpbChyZWplY3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gcmVzcG9uc2VcbiAgICAgICAgICAgIC50aGVuKCguLi5wYXJhbXMpICAgPT4gdGhpcy5idXMudHJpZ2dlcigndGl0bGU6aGlzdG9yeTpzdWNjZXNzJywgICAgeyB0aXRsZU1vZGVsLCBhY3Rpb24sIGNvbnRleHQgfSwgLi4ucGFyYW1zKSlcbiAgICAgICAgICAgIC5jYXRjaCgoLi4ucGFyYW1zKSAgPT4gdGhpcy5idXMudHJpZ2dlcigndGl0bGU6aGlzdG9yeTpmYWlsJywgICAgICAgeyB0aXRsZU1vZGVsLCBhY3Rpb24sIGNvbnRleHQgfSwgLi4ucGFyYW1zKSlcbiAgICAgICAgICAgIC50aGVuKCgpICAgICAgICAgICAgPT4gdGhpcy5idXMudHJpZ2dlcigndGl0bGU6aGlzdG9yeTplbmQnLCAgICAgICAgeyB0aXRsZU1vZGVsLCBhY3Rpb24sIGNvbnRleHQgfSkpO1xuICAgIH1cblxuICAgIF9oaXN0b3J5QWRkQWpheCh0aXRsZU1vZGVsLCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuYnVzLnRyaWdnZXIoJ3RpdGxlOmhpc3Rvcnk6YWRkOnN0YXJ0JywgeyB0aXRsZU1vZGVsLCBjb250ZXh0IH0pO1xuXG4gICAgICAgIGxldCByZXNwb25zZSA9ICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5yZXN0LnJlYWRpbmdIaXN0b3J5LnRpdGxlLCB7aWQ6IHRpdGxlTW9kZWwuZ2V0KCdpZCcpfSksXG4gICAgICAgICAgICB0eXBlOiAnUFVUJ1xuICAgICAgICB9KTtcblxuICAgICAgICByZXNwb25zZVxuICAgICAgICAgICAgLmRvbmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRpdGxlTW9kZWwuc2V0KCdpc0luSGlzdG9yeScsICF0aXRsZU1vZGVsLmdldCgnaXNJbkhpc3RvcnknKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndGl0bGU6aGlzdG9yeTphZGQ6c3VjY2VzcycsIHsgdGl0bGVNb2RlbCwgY29udGV4dCB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZmFpbCgoLi4ucGFyYW1zKSA9PiB0aGlzLmJ1cy50cmlnZ2VyKCd0aXRsZTpoaXN0b3J5OmFkZDpmYWlsJywgeyB0aXRsZU1vZGVsLCBjb250ZXh0IH0sIC4uLnBhcmFtcykpXG4gICAgICAgICAgICAuYWx3YXlzKCgpID0+IHRoaXMuYnVzLnRyaWdnZXIoJ3RpdGxlOmhpc3Rvcnk6YWRkOmVuZCcsIHsgdGl0bGVNb2RlbCwgY29udGV4dCB9KSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIF9oaXN0b3J5UmVtb3ZlQWpheCh0aXRsZU1vZGVsLCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuYnVzLnRyaWdnZXIoJ3RpdGxlOmhpc3Rvcnk6cmVtb3ZlOnN0YXJ0JywgeyB0aXRsZU1vZGVsLCBjb250ZXh0IH0pO1xuXG4gICAgICAgIGxldCByZXNwb25zZSA9ICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5yZXN0LnJlYWRpbmdIaXN0b3J5LnRpdGxlLCB7aWQ6IHRpdGxlTW9kZWwuZ2V0KCdpZCcpfSksXG4gICAgICAgICAgICB0eXBlOiAnREVMRVRFJ1xuICAgICAgICB9KTtcblxuICAgICAgICByZXNwb25zZVxuICAgICAgICAgICAgLmRvbmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRpdGxlTW9kZWwuc2V0KCdpc0luSGlzdG9yeScsICF0aXRsZU1vZGVsLmdldCgnaXNJbkhpc3RvcnknKSk7XG4gICAgICAgICAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndGl0bGU6aGlzdG9yeTpyZW1vdmU6c3VjY2VzcycsIHsgdGl0bGVNb2RlbCwgY29udGV4dCB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZmFpbCgoLi4ucGFyYW1zKSA9PiB0aGlzLmJ1cy50cmlnZ2VyKCd0aXRsZTpoaXN0b3J5OnJlbW92ZTpmYWlsJywgeyB0aXRsZU1vZGVsLCBjb250ZXh0IH0sIC4uLnBhcmFtcykpXG4gICAgICAgICAgICAuYWx3YXlzKCgpID0+IHRoaXMuYnVzLnRyaWdnZXIoJ3RpdGxlOmhpc3Rvcnk6cmVtb3ZlOmVuZCcsIHsgdGl0bGVNb2RlbCwgY29udGV4dCB9KSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgUmVhZGluZ0hpc3Rvcnk7XG4iLCJpbXBvcnQgSW1wb3J0UmF0ZWRDb21wbGV0ZU1vZGFsIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvYWNjb3VudF9oaXN0b3J5L3ZpZXdzL0ltcG9ydEZyb21SYXRlZENvbXBsZXRlTW9kYWwnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZWFkaW5nSGlzdG9yeUFjdGlvbnMge1xuICAgIGNvbnN0cnVjdG9yKGJ1cykge1xuICAgICAgICB0aGlzLmJ1cyA9IGJ1cztcblxuICAgICAgICB0aGlzLmJ1c1xuICAgICAgICAgICAgLm9uKCdoaXN0b3J5OmltcG9ydEZyb21SYXRlZDpzdWNjZXNzJywgICguLi5wYXJhbXMpID0+IHRoaXMuaW1wb3J0RnJvbVJhdGluZ3NTdWNjZXNzKC4uLnBhcmFtcykpXG4gICAgICAgICAgICAub24oJ3RpdGxlOmhpc3Rvcnk6ZmFpbCcsICAgICAgICAgICAgICAgKC4uLnBhcmFtcykgPT4gdGhpcy5oaXN0b3J5RmFpbHVyZSguLi5wYXJhbXMpKTtcblxuICAgIH1cblxuICAgIGltcG9ydEZyb21SYXRpbmdzU3VjY2VzcyhkYXRhKSB7XG4gICAgICAgIG5ldyBJbXBvcnRSYXRlZENvbXBsZXRlTW9kYWwoZGF0YS5pbXBvcnRlZFRpdGxlQ291bnQsIGRhdGEucGF0cm9uSGFzUmF0ZWRUaXRsZXMpO1xuICAgIH1cblxuICAgIGhpc3RvcnlGYWlsdXJlKHsgdGl0bGVNb2RlbCB9LCBqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHtcbiAgICAgICAgbGV0IHJlc3BvbnNlID0gSlNPTi5wYXJzZShqcVhIUi5yZXNwb25zZVRleHQgfHwgJ3t9Jyk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLnNlc3Npb25FeHBpcmVkKSB7XG4gICAgICAgICAgICB0aGlzLmJ1cy50cmlnZ2VyKCd1c2VyOnNlc3Npb246ZXhwaXJlZCcpO1xuICAgICAgICB9IGVsc2UgaWYgKHRvYXN0ZXIpIHtcbiAgICAgICAgICAgIHRvYXN0ZXIucHVzaCh3aW5kb3cuaHRtbCgnZXJyb3IuZGVmYXVsdEVycm9ySHRtbCcpLCAnZXJyb3InKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBWaXNpdG9yQWN0aW9uRGlzYWxsb3dlZE1vZGFsIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvdmlzaXRvcl9hY3Rpb25fZGlzYWxsb3dlZF9tb2RhbC9WaXNpdG9yQWN0aW9uRGlzYWxsb3dlZE1vZGFsJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgSG9sZCB7XG4gICAgY29uc3RydWN0b3IoYnVzLCBjYXJkKSB7XG4gICAgICAgIHRoaXMuYnVzID0gYnVzO1xuICAgICAgICB0aGlzLmNhcmQgPSBjYXJkO1xuICAgIH1cblxuICAgIGhvbGRUaXRsZSh0aXRsZU1vZGVsLCBjb250ZXh0KSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHdpbmRvdy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ0xIVE5HLTMzODcnKSAmJlxuICAgICAgICAgICAgd2luZG93Lk92ZXJEcml2ZS5pc1Zpc2l0b3IgJiZcbiAgICAgICAgICAgICghd2luZG93LmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZCgnY29udGVudC1ob2xkcycpIHx8XG4gICAgICAgICAgICAgICAgIXRpdGxlTW9kZWwuZ2V0KCdpc0hvbGRhYmxlJykpXG4gICAgICAgICkge1xuICAgICAgICAgICAgbmV3IFZpc2l0b3JBY3Rpb25EaXNhbGxvd2VkTW9kYWwoJ2hvbGQnKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLmNhcmQucHJlZmVycmVkSG9sZEVtYWlsLmxlbmd0aCkge1xuICAgICAgICAgICAgLy8gTEhUTkctMTU4NCAtIERvbnQgcmUtY2hlY2sgYXZhaWxhYmlsaXR5LCBjYXVzZXMgVUkgbG9vcHNcbiAgICAgICAgICAgIHRoaXMuX2hvbGRBamF4KHRpdGxlTW9kZWwsIGNvbnRleHQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jYXJkLl9mZXRjaC50aGVuKCgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYXJkLnByZWZlcnJlZEhvbGRFbWFpbC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5faG9sZEFqYXgodGl0bGVNb2RlbCwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndGl0bGU6aG9sZDpyZXF1ZXN0LWVtYWlsJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVNb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaG9sZENhbmNlbCh0aXRsZU1vZGVsLCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiAkLmFqYXgoe1xuICAgICAgICAgICAgdHlwZTogJ0RFTEVURScsXG4gICAgICAgICAgICB1cmw6IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5tZWRpYVJlbW92ZUhvbGQsIHtcbiAgICAgICAgICAgICAgICBtZWRpYUlkOiB0aXRsZU1vZGVsLmlkLFxuICAgICAgICAgICAgfSksXG4gICAgICAgIH0pXG4gICAgICAgICAgICAuZG9uZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICB0aXRsZU1vZGVsLnNldCgndGl0bGVTdGF0ZScsICdob2xkJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndGl0bGU6aG9sZC1jYW5jZWw6c3VjY2VzcycsIHtcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVNb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dCxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZmFpbCgoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSA9PiB7XG4gICAgICAgICAgICAgICAgdGl0bGVNb2RlbC5zZXQoJ3RpdGxlU3RhdGUnLCAnb25Ib2xkJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndGl0bGU6aG9sZC1jYW5jZWw6ZmFpbCcsIHtcbiAgICAgICAgICAgICAgICAgICAganFYSFIsXG4gICAgICAgICAgICAgICAgICAgIHRleHRTdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yVGhyb3duLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZU1vZGVsLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jb21wbGV0ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndGl0bGU6aG9sZC1jYW5jZWw6ZW5kJywge1xuICAgICAgICAgICAgICAgICAgICB0aXRsZU1vZGVsLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgX2hvbGRBamF4KHRpdGxlTW9kZWwsIGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndGl0bGU6aG9sZDpzdGFydCcsIHtcbiAgICAgICAgICAgIHRpdGxlTW9kZWwsXG4gICAgICAgICAgICBlbWFpbDogdGhpcy5jYXJkLnByZWZlcnJlZEhvbGRFbWFpbCxcbiAgICAgICAgICAgIGNvbnRleHQsXG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmICghY29udGV4dC5pc1JlcXVlc3RBZ2Fpbikge1xuICAgICAgICAgICAgdGl0bGVNb2RlbC5zZXQoJ3RpdGxlU3RhdGUnLCAnd2FpdGluZycpO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHsgbW9iaWxlLCB0YWJsZXQgfSA9IGJvd3NlcjtcblxuICAgICAgICByZXR1cm4gJC5hamF4KHtcbiAgICAgICAgICAgIHVybDogd2luZG93LnVybCh3aW5kb3cucm91dGVzLm1lZGlhUGxhY2VIb2xkKSxcbiAgICAgICAgICAgIHR5cGU6ICdQT1NUJyxcbiAgICAgICAgICAgIGRhdGE6IHtcbiAgICAgICAgICAgICAgICBtZWRpYUlkOiB0aXRsZU1vZGVsLmlkLFxuICAgICAgICAgICAgICAgIGVtYWlsOiB0aGlzLmNhcmQucHJlZmVycmVkSG9sZEVtYWlsLFxuICAgICAgICAgICAgICAgIGlzTW9iaWxlOiBtb2JpbGUgfHwgdGFibGV0LFxuICAgICAgICAgICAgICAgIGxhbmd1YWdlQ29kZTpcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnBhdHJvblNldHRpbmdzWydsYW5ndWFnZS1zZWxlY3Rpb24nXSB8fFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuQ29va2llcy5nZXQoJ2xhbmd1YWdlLXNlbGVjdGlvbicpIHx8XG4gICAgICAgICAgICAgICAgICAgICQoJ2h0bWwnKS5hdHRyKCdsYW5nJykgfHxcbiAgICAgICAgICAgICAgICAgICAgJ2VuJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pXG4gICAgICAgICAgICAuZG9uZSgocmVzcG9uc2UpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgaXNSZXF1ZXN0QWdhaW4gPVxuICAgICAgICAgICAgICAgICAgICAhIWNvbnRleHQuaXNSZXF1ZXN0QWdhaW4gfHxcbiAgICAgICAgICAgICAgICAgICAgL2FjY291bnRcXC9sb2Fucy8udGVzdCh3aW5kb3cubG9jYXRpb24uaHJlZik7XG4gICAgICAgICAgICAgICAgdGl0bGVNb2RlbC5zZXQoXG4gICAgICAgICAgICAgICAgICAgICd0aXRsZVN0YXRlJyxcbiAgICAgICAgICAgICAgICAgICAgaXNSZXF1ZXN0QWdhaW4gPyAncmVxdWVzdGVkJyA6ICdvbkhvbGQnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1cy50cmlnZ2VyKCd0aXRsZTpob2xkOnN1Y2Nlc3MnLCB7IHRpdGxlTW9kZWwsIGNvbnRleHQgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZhaWwoKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgPT4ge1xuICAgICAgICAgICAgICAgIGlmICghY29udGV4dC5pc1JlcXVlc3RBZ2Fpbikge1xuICAgICAgICAgICAgICAgICAgICB0aXRsZU1vZGVsLnNldCgndGl0bGVTdGF0ZScsICdob2xkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuYnVzLnRyaWdnZXIoJ3RpdGxlOmhvbGQ6ZmFpbCcsIHtcbiAgICAgICAgICAgICAgICAgICAganFYSFIsXG4gICAgICAgICAgICAgICAgICAgIHRleHRTdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yVGhyb3duLFxuICAgICAgICAgICAgICAgICAgICB0aXRsZU1vZGVsLFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5jb21wbGV0ZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndGl0bGU6aG9sZDplbmQnLCB7IHRpdGxlTW9kZWwsIGNvbnRleHQgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG59XG4iLCJpbXBvcnQgSG9sZE1vZGFsICAgICAgICAgICAgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9tZWRpYS92aWV3cy9Ib2xkTW9kYWwnO1xuaW1wb3J0IEhvbGRTdWNjZXNzTW9kYWwgICAgIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvbWVkaWEvdmlld3MvSG9sZFN1Y2Nlc3NNb2RhbCc7XG5pbXBvcnQgVmlzaXRvckFjdGlvbkRpc2FsbG93ZWRNb2RhbCBmcm9tICcuLi8uLi9jb21wb25lbnRzL3Zpc2l0b3JfYWN0aW9uX2Rpc2FsbG93ZWRfbW9kYWwvVmlzaXRvckFjdGlvbkRpc2FsbG93ZWRNb2RhbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIEhvbGRBY3Rpb25zIHtcbiAgICBjb25zdHJ1Y3RvcihidXMpIHtcbiAgICAgICAgdGhpcy5idXMgPSBidXM7XG5cbiAgICAgICAgdGhpcy5idXNcbiAgICAgICAgICAgIC5vbigndGl0bGU6aG9sZDpzdWNjZXNzJywgICAgICAgKGRhdGEpID0+IHRoaXMuaG9sZFN1Y2Nlc3MoZGF0YSkpXG4gICAgICAgICAgICAub24oJ3RpdGxlOmhvbGQ6ZmFpbCcsICAgICAgICAgIChkYXRhKSA9PiB0aGlzLmhvbGRGYWlsKGRhdGEpKVxuICAgICAgICAgICAgLm9uKCd0aXRsZTpob2xkOnJlcXVlc3QtZW1haWwnLCAoZGF0YSkgPT4gdGhpcy5fb3BlbkhvbGRNb2RhbChkYXRhKSlcbiAgICAgICAgICAgIC5vbigndGl0bGU6aG9sZDpjb25mbGljdCcsICAgICAgKGRhdGEpID0+IHRoaXMuX29wZW5Db25mbGljdE1vZGFsKGRhdGEudGl0bGVNb2RlbCkpXG4gICAgICAgICAgICAub24oJ3RpdGxlOmhvbGQtY2FuY2VsOmZhaWwnLCAgIChkYXRhKSA9PiB0aGlzLmhvbGRDYW5jZWxGYWlsKGRhdGEpKTtcblxuICAgICAgICB0aGlzLmZlYXR1cmVNYW5hZ2VyID0gIHdpbmRvdy5mZWF0dXJlTWFuYWdlcjtcbiAgICB9XG5cbiAgICBob2xkU3VjY2VzcyhkYXRhKSB7XG4gICAgICAgIHdpbmRvdy5hamF4LmdldEhvbGQoZGF0YS50aXRsZU1vZGVsLmdldCgnaWQnKSkuZG9uZSgoaG9sZERhdGEpID0+IHtcbiAgICAgICAgICAgIGRhdGEudGl0bGVNb2RlbC5zZXQoe1xuICAgICAgICAgICAgICAgIGhvbGRzUmF0aW86IGhvbGREYXRhLmhvbGRzUmF0aW8sXG4gICAgICAgICAgICAgICAgaG9sZHNDb3VudDogaG9sZERhdGEuaG9sZHNDb3VudCxcbiAgICAgICAgICAgICAgICBob2xkTGlzdFBvc2l0aW9uOiBob2xkRGF0YS5ob2xkTGlzdFBvc2l0aW9uXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIG5ldyBIb2xkU3VjY2Vzc01vZGFsKHtidXM6dGhpcy5idXMsXG4gICAgICAgICAgICAgICAgdGl0bGVNb2RlbDogZGF0YS50aXRsZU1vZGVsLFxuICAgICAgICAgICAgICAgIGVtYWlsOiB3aW5kb3cuY2FyZC5wcmVmZXJyZWRIb2xkRW1haWwsXG4gICAgICAgICAgICAgICAgYXV0b0NoZWNrb3V0RW5hYmxlZDogd2luZG93LnBhdHJvblNldHRpbmdzWydhdXRvLWNoZWNrb3V0LXNldHRpbmcnXSA9PT0gMX0pO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBob2xkRmFpbCh7IGpxWEhSLCB0aXRsZU1vZGVsIH0pIHtcbiAgICAgICAgY29uc3QgcmVzcG9uc2UgPSBKU09OLnBhcnNlKGpxWEhSLnJlc3BvbnNlVGV4dCk7XG5cbiAgICAgICAgaWYgKHJlc3BvbnNlLmVycm9yQ29kZSA9PT0gJ1BhdHJvbkNhcmRGYWlsZWRBdXRoZW50aWNhdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMuYnVzLnRyaWdnZXIoJ3VzZXI6Y2FyZDppbnZhbGlkJyk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2Uuc2Vzc2lvbkV4cGlyZWQpIHtcbiAgICAgICAgICAgIHRoaXMuYnVzLnRyaWdnZXIoJ3VzZXI6c2Vzc2lvbjpleHBpcmVkJywgeyBhY3Rpb246IGBob2xkfiR7dGl0bGVNb2RlbC5pZH1gIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmVycm9yQ29kZSA9PT0gJ0hvbGRBbHJlYWR5RXhpc3RzJyB8fCByZXNwb25zZS5lcnJvckNvZGUgPT09ICdQYXRyb25FeGNlZWRlZEhvbGRMaW1pdCcpIHtcbiAgICAgICAgICAgIGxldCBsaW5rID0gYDxhIGNsYXNzPVwiYm9sZFwiIGhyZWY9XCIke3dpbmRvdy51cmwod2luZG93LnJvdXRlcy5hY2NvdW50SG9sZHMpfVwiIHRhYmluZGV4PVwiMFwiPiR7d2luZG93Lmh0bWwoJ2hvbGRzJyl9PC9hPmA7XG4gICAgICAgICAgICB0aGlzLl9lcnJvclRvYXN0KGxpbmssIHJlc3BvbnNlLmVycm9yQ29kZSk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuZXJyb3JDb2RlID09PSAnUGF0cm9uVHlwZVJlc3RyaWN0ZWRGcm9tVGl0bGUnIHx8IHJlc3BvbnNlLmVycm9yQ29kZSA9PT0gJ1BhdHJvbkhhc0hvbGRzRGlzYWJsZWQnKSB7XG4gICAgICAgICAgICBsZXQgbGluayA9IGA8YSBjbGFzcz1cImJvbGRcIiBocmVmPVwiJHt3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMuc3VwcG9ydE1lbWJlcnMpfVwiIHRhYmluZGV4PVwiMFwiPiR7d2luZG93Lmh0bWwoJ3BsZWFzZUNvbnRhY3RTdXBwb3J0Jyl9PC9hPmA7XG4gICAgICAgICAgICB0aGlzLl9lcnJvclRvYXN0KGxpbmssIHJlc3BvbnNlLmVycm9yQ29kZSk7XG4gICAgICAgIH0gZWxzZSBpZiAocmVzcG9uc2UuZXJyb3JDb2RlID09PSAnSG9sZE5vdEFsbG93ZWRGb3JWaXNpdG9yJyl7XG4gICAgICAgICAgICBuZXcgVmlzaXRvckFjdGlvbkRpc2FsbG93ZWRNb2RhbCgnaG9sZCcpO1xuICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmVycm9yQ29kZSkge1xuICAgICAgICAgICAgdGhpcy5fZXJyb3JUb2FzdCgnJywgcmVzcG9uc2UuZXJyb3JDb2RlKTtcbiAgICAgICAgfSBlbHNlIGlmICh0b2FzdGVyKSB7XG4gICAgICAgICAgICB0b2FzdGVyLnB1c2goYDxzdHJvbmc+JHt3aW5kb3cuaHRtbCgnZ2VuZXJpY0Vycm9yJyl9PC9zdHJvbmc+YCwgJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBob2xkQ2FuY2VsRmFpbCh7IGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93biwgdGl0bGVNb2RlbCwgY29udGV4dCB9KSB7XG4gICAgICAgIGxldCByZXNwb25zZSA9IEpTT04ucGFyc2UoanFYSFIucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgaWYocmVzcG9uc2Uuc2Vzc2lvbkV4cGlyZWQpe1xuICAgICAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndXNlcjpzZXNzaW9uOmV4cGlyZWQnKTtcbiAgICAgICAgfSBlbHNlIGlmICh0b2FzdGVyKSB7XG4gICAgICAgICAgICB0b2FzdGVyLnB1c2goYDxzdHJvbmc+JHt3aW5kb3cuaHRtbCgnZ2VuZXJpY0Vycm9yJyl9PC9zdHJvbmc+ICR7d2luZG93Lmh0bWwoJ2Vycm9yLicgKyByZXNwb25zZS5lcnJvckNvZGUpfWAsICdlcnJvcicpO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICBfZXJyb3JUb2FzdChwYWdlTGluaywgZXJyb3JDb2RlKSB7XG4gICAgICAgIGlmICh0b2FzdGVyKSB0b2FzdGVyLnB1c2goYDxzdHJvbmc+JHt3aW5kb3cuaHRtbCgnZ2VuZXJpY0Vycm9yJyl9PC9zdHJvbmc+ICR7d2luZG93LnRleHQoYGVycm9yLiR7ZXJyb3JDb2RlfWAsIHtsaW5rOiBwYWdlTGlua30pfWAsICdlcnJvcicpO1xuICAgIH1cblxuICAgIF9vcGVuSG9sZE1vZGFsKHsgdGl0bGVNb2RlbCwgY29udGV4dCB9KSB7XG4gICAgICAgIGlmICh3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdMSFRORy0zMzg3Jykpe1xuICAgICAgICAgICAgaWYgKHdpbmRvdy5PdmVyRHJpdmUuaXNWaXNpdG9yICYmICF0aGlzLmZlYXR1cmVNYW5hZ2VyLmlzRW5hYmxlZChcImNvbnRlbnQtaG9sZHNcIikpIHtcbiAgICAgICAgICAgICAgICBuZXcgVmlzaXRvckFjdGlvbkRpc2FsbG93ZWRNb2RhbCgnaG9sZCcpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBuZXcgSG9sZE1vZGFsKHtcbiAgICAgICAgICAgICAgICAgICAgYnVzOiB0aGlzLmJ1cyxcbiAgICAgICAgICAgICAgICAgICAgdGl0bGVNb2RlbCxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV3IEhvbGRNb2RhbCh7YnVzOiB0aGlzLmJ1cywgdGl0bGVNb2RlbCwgY29udGV4dH0pO1xuICAgICAgICB9XG5cblxuICAgIH1cbn1cbiIsImNsYXNzIE5vb2sge1xuICAgIGNvbnN0cnVjdG9yKGJ1cykge1xuICAgICAgICB0aGlzLmJ1cyA9IGJ1cztcblxuICAgICAgICB0aGlzLmJ1cy5vbigndGl0bGU6bm9vazpldWxhLWFjY2VwdGVkJywgKGRhdGEpID0+IHRoaXMuX3NldEV1bGFDb29raWUoZGF0YS50aXRsZSkpO1xuICAgIH1cblxuICAgIHNlbmRUb05vb2sodGl0bGUpIHtcbiAgICAgICAgaWYgKENvb2tpZXMuZ2V0KCdub29rLWV1bGEtc2V0dGluZycpID09PSAnMScpIHtcbiAgICAgICAgICAgIHRoaXMuX25vb2tBamF4KHRpdGxlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYnVzLnRyaWdnZXIoJ3RpdGxlOm5vb2s6cmVxdWVzdC1ldWxhJywgIHsgdGl0bGVNb2RlbDogdGl0bGUgfSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfbm9va0FqYXgodGl0bGUpIHtcbiAgICAgICAgdGl0bGUuc2V0KCd0aXRsZVN0YXRlJywgJ3dhaXRpbmcnKTtcbiAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndGl0bGU6bm9vazpzdGFydCcsIHRpdGxlKTtcblxuICAgICAgICByZXR1cm4gJC5hamF4KHtcbiAgICAgICAgICAgIHVybDogd2luZG93LnVybCh3aW5kb3cucm91dGVzLm1lZGlhQm9ycm93LCB7XG4gICAgICAgICAgICAgICAgbWVkaWFJZDogdGl0bGUuaWRcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdHlwZTogJ1BPU1QnXG4gICAgICAgIH0pXG4gICAgICAgIC5kb25lKChyZXNwb25zZSkgPT4gdGhpcy5fbm9va1N1Y2Nlc3ModGl0bGUsIHJlc3BvbnNlKSlcbiAgICAgICAgLmZhaWwoKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikgPT4gdGhpcy5fbm9va0ZhaWx1cmUodGl0bGUsIGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikpXG4gICAgICAgIC5jb21wbGV0ZSgoKSA9PiB7IHRoaXMuYnVzLnRyaWdnZXIoJ3RpdGxlOm5vb2s6ZW5kJywgdGl0bGUpOyB9KTtcbiAgICB9XG5cbiAgICBfbm9va1N1Y2Nlc3ModGl0bGUpIHtcbiAgICAgICAgdGl0bGUuc2V0KCd0aXRsZVN0YXRlJywgJ2JvcnJvd2VkJyk7XG4gICAgICAgIHRoaXMuYnVzLnRyaWdnZXIoJ3RpdGxlOm5vb2s6c3VjY2VzcycsIHt0aXRsZU1vZGVsOiB0aXRsZX0pO1xuICAgIH1cblxuICAgIF9ub29rRmFpbHVyZSh0aXRsZSwganFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7XG4gICAgICAgIHRpdGxlLnNldCgndGl0bGVTdGF0ZScsICdub29rJyk7XG5cbiAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndGl0bGU6bm9vazpmYWlsJywge2pxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93biwgdGl0bGVNb2RlbDogdGl0bGV9KTtcbiAgICB9XG5cbiAgICBfc2V0RXVsYUNvb2tpZSh0aXRsZU1vZGVsKSB7XG4gICAgICAgIENvb2tpZXMuc2V0KCdub29rLWV1bGEtc2V0dGluZycsICcxJyk7XG4gICAgICAgIHRoaXMuX25vb2tBamF4KHRpdGxlTW9kZWwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTm9vaztcbiIsImltcG9ydCBOb29rTW9kYWwgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9tZWRpYS92aWV3cy9Ob29rRXVsYU1vZGFsJztcblxuY2xhc3MgTm9va0FjdGlvbnMge1xuICAgIGNvbnN0cnVjdG9yKGJ1cykge1xuICAgICAgICB0aGlzLmJ1cyA9IGJ1cztcblxuICAgICAgICB0aGlzLmJ1c1xuICAgICAgICAgICAgLm9uKCd0aXRsZTpub29rOnN1Y2Nlc3MnLCAgICAgICAoZGF0YSkgPT4gdGhpcy5ub29rU3VjY2VzcyhkYXRhKSlcbiAgICAgICAgICAgIC5vbigndGl0bGU6bm9vazpmYWlsJywgICAgICAgICAgKGRhdGEpID0+IHRoaXMubm9va0ZhaWwoZGF0YSkpXG4gICAgICAgICAgICAub24oJ3RpdGxlOm5vb2s6cmVxdWVzdC1ldWxhJywgIChkYXRhKSA9PiB0aGlzLl9vcGVuTm9va0V1bGFNb2RhbChkYXRhLnRpdGxlTW9kZWwpKTtcbiAgICB9XG5cbiAgICBub29rU3VjY2VzcyhkYXRhKSB7XG4gICAgICAgIHdpbmRvdy5sb2NhdGlvbi5ocmVmID0gd2luZG93LnVybCh3aW5kb3cucm91dGVzLm1lZGlhRG93bmxvYWQsIHtmb3JtYXQ6ICdwZXJpb2RpY2Fscy1ub29rJywgbWVkaWFJZDogZGF0YS50aXRsZU1vZGVsLmlkfSk7XG4gICAgfVxuXG4gICAgbm9va0ZhaWwoZGF0YSkge1xuICAgICAgICBjb25zdCByZXNwb25zZSA9IEpTT04ucGFyc2UoZGF0YS5qcVhIUi5yZXNwb25zZVRleHQpO1xuXG4gICAgICAgIGlmIChyZXNwb25zZS5lcnJvckNvZGUgPT09ICdQYXRyb25DYXJkRmFpbGVkQXV0aGVudGljYXRpb24nKSB7XG4gICAgICAgICAgICB0aGlzLmJ1cy50cmlnZ2VyKCd1c2VyOmNhcmQ6aW52YWxpZCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHJlc3BvbnNlLmVycm9yQ29kZSA9PT0gJ1BhdHJvbkV4Y2VlZGVkUGVyaW9kaWNhbHNDaGVja291dExpbWl0Jykge1xuICAgICAgICAgICAgY29uc3QgaHJlZiA9IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5hY2NvdW50TG9hbnMpO1xuICAgICAgICAgICAgY29uc3QgbGlua1RleHQgPSB3aW5kb3cuaHRtbCgnbG9hbnMnKTtcbiAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBgPGEgY2xhc3M9XCJib2xkXCIgaHJlZj1cIiR7aHJlZn1cIiB0YWJpbmRleD1cIjBcIj4ke2xpbmtUZXh0fTwvYT5gO1xuICAgICAgICAgICAgaWYgKHRvYXN0ZXIpIHRvYXN0ZXIucHVzaChgPHN0cm9uZz4ke3dpbmRvdy5odG1sKCdnZW5lcmljRXJyb3InKX08L3N0cm9uZz4gJHt3aW5kb3cudGV4dChgZXJyb3IuJHtyZXNwb25zZS5lcnJvckNvZGV9YCwge2xpbmt9KX1gLCAnZXJyb3InKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChyZXNwb25zZS5zZXNzaW9uRXhwaXJlZCkge1xuICAgICAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndXNlcjpzZXNzaW9uOmV4cGlyZWQnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9vcGVuTm9va0V1bGFNb2RhbCh0aXRsZU1vZGVsKSB7XG4gICAgICAgIG5ldyBOb29rTW9kYWwodGhpcy5idXMsIHRpdGxlTW9kZWwpO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgTm9va0FjdGlvbnM7XG4iLCJcbmNsYXNzIFN0YXJSYXRpbmcge1xuICAgIGNvbnN0cnVjdG9yKGJ1cykge1xuICAgICAgICB0aGlzLmJ1cyA9IGJ1cztcbiAgICB9XG5cbiAgICBoYW5kbGluZ1JhdGluZyhtb2RlbCkge1xuICAgICAgICBpZiAobW9kZWwuZ2V0KCd1c2VyU3RhclJhdGluZycpID4gMCkge1xuICAgICAgICAgICAgLy8gVXNlciBpcyBhZGRpbmcgcmF0aW5nXG4gICAgICAgICAgICB0aGlzLl9yYXRlVGl0bGVBamF4KG1vZGVsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIFVzZXIgaXMgcmVtb3ZpbmcgcmF0aW5nXG4gICAgICAgICAgICB0aGlzLl9kZWxldGVSYXRpbmdBamF4KG1vZGVsKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIF9yYXRlVGl0bGVBamF4KG1vZGVsKSB7XG4gICAgICAgIHJldHVybiAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMucGF0cm9uTWVkaWFTdGFyUmF0aW5ncywge3RpdGxlSWQ6IG1vZGVsLmdldCgnaWQnKX0pLFxuICAgICAgICAgICAgdHlwZTogJ1BVVCcsXG4gICAgICAgICAgICBkYXRhOiB7cmF0aW5nOiBtb2RlbC5nZXQoJ3VzZXJTdGFyUmF0aW5nJyl9LFxuICAgICAgICAgICAgdGltZW91dDogMFxuICAgICAgICB9KVxuICAgICAgICAuZmFpbCgoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSA9PiB0aGlzLnJhdGluZ0ZhaWx1cmUobW9kZWwsIGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikpO1xuICAgIH1cblxuICAgIF9kZWxldGVSYXRpbmdBamF4KG1vZGVsKSB7XG4gICAgICAgIHJldHVybiAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMucGF0cm9uTWVkaWFTdGFyUmF0aW5ncywge3RpdGxlSWQ6IG1vZGVsLmdldCgnaWQnKX0pLFxuICAgICAgICAgICAgdHlwZTogJ0RFTEVURScsXG4gICAgICAgICAgICB0aW1lb3V0OiAwXG4gICAgICAgIH0pXG4gICAgICAgIC5mYWlsKChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pID0+IHRoaXMucmF0aW5nRmFpbHVyZShtb2RlbCwganFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSk7XG4gICAgfVxuXG4gICAgcmF0aW5nRmFpbHVyZShtb2RlbCwganFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7XG4gICAgICAgIHRoaXMuYnVzLnRyaWdnZXIoJ3RpdGxlOnJhdGluZzpmYWlsJywge21vZGVsLCBqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd259KTtcbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFN0YXJSYXRpbmc7XG4iLCJcbmNsYXNzIFN0YXJSYXRpbmdBY3Rpb25zIHtcbiAgICBjb25zdHJ1Y3RvcihidXMpIHtcbiAgICAgICAgdGhpcy5idXMgPSBidXM7XG5cbiAgICAgICAgdGhpcy5idXMub24oJ3RpdGxlOnJhdGluZzpmYWlsJywgKGRhdGEpID0+IHRoaXMucmF0aW5nRmFpbChkYXRhKSk7XG4gICAgfVxuXG4gICAgcmF0aW5nRmFpbChkYXRhKSB7XG4gICAgICAgIGxldCByZXNwb25zZTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHJlc3BvbnNlID0gSlNPTi5wYXJzZShkYXRhLmpxWEhSLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgIH0gY2F0Y2ggKGV4KXtcbiAgICAgICAgICAgIHJlc3BvbnNlID0ge307XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVzcG9uc2Uuc2Vzc2lvbkV4cGlyZWQpe1xuICAgICAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndXNlcjpzZXNzaW9uOmV4cGlyZWQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxldCBsaW5rID0gYDxhIGNsYXNzPVwiYm9sZFwiIGhyZWY9XCIke3dpbmRvdy51cmwod2luZG93LnJvdXRlcy5zdXBwb3J0TWVtYmVycyl9XCIgdGFiaW5kZXg9XCIwXCI+JHt3aW5kb3cuaHRtbCgncGxlYXNlQ29udGFjdFN1cHBvcnQnKX08L2E+YDtcbiAgICAgICAgICAgIHRvYXN0ZXIucHVzaChgPHN0cm9uZz4ke3dpbmRvdy5odG1sKCdnZW5lcmljRXJyb3InKX08L3N0cm9uZz4gJHt3aW5kb3cudGV4dCgnZXJyb3IuZXJyb3JDb250YWN0U3VwcG9ydCcsIHtsaW5rfSl9YCwgJ2Vycm9yJyk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IFN0YXJSYXRpbmdBY3Rpb25zO1xuIiwiaW1wb3J0IFNlc3Npb25FeHBpcmVkTW9kYWwgZnJvbSAnLi4vLi4vY29tcG9uZW50cy9zZXNzaW9uX2V4cGlyZWRfbW9kYWwvU2Vzc2lvbkV4cGlyZWRNb2RhbCc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoYXJlZEFjdGlvbnMge1xuICAgIGNvbnN0cnVjdG9yKGJ1cykge1xuICAgICAgICB0aGlzLmJ1cyA9IGJ1cztcblxuICAgICAgICB0aGlzLmJ1c1xuICAgICAgICAgICAgLm9uKCd1c2VyOnNlc3Npb246ZXhwaXJlZCcsIChkYXRhKSA9PiB0aGlzLl9zZXNzaW9uRXhwaXJlZChkYXRhKSlcbiAgICAgICAgICAgIC5vbigndXNlcjpjYXJkOmludmFsaWQnLCAoKSA9PiB0aGlzLl9wYXRyb25DYXJkRmFpbGVkQXV0aGVudGljYXRpb24oKSlcbiAgICAgICAgICAgIC5vbigndXNlcjpjYXJkOm5vbmUnLCAoZGF0YSkgPT4gdGhpcy5fbm9MaW5rZWRDYXJkcyhkYXRhLmFjdGlvbikpO1xuICAgIH1cblxuICAgIF9zZXNzaW9uRXhwaXJlZChkYXRhKSB7XG4gICAgICAgIGxldCBmb3J3YXJkVXJsID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICsgd2luZG93LmxvY2F0aW9uLnNlYXJjaDtcbiAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5hY3Rpb24pe1xuICAgICAgICAgICAgZm9yd2FyZFVybCArPSBgI2FjdGlvbj0ke2VuY29kZVVSSUNvbXBvbmVudChkYXRhLmFjdGlvbil9YDtcbiAgICAgICAgfVxuICAgICAgICBuZXcgU2Vzc2lvbkV4cGlyZWRNb2RhbChmb3J3YXJkVXJsKTtcbiAgICB9XG5cbiAgICBfbm9MaW5rZWRDYXJkcyhhY3Rpb24pIHtcbiAgICAgICAgaWYgKCF3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdzYW1wbGVPbmx5TW9kZScpKXtcbiAgICAgICAgICAgIGNvbnN0IGZvcndhcmRVcmwgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyB3aW5kb3cubG9jYXRpb24uc2VhcmNoLnJlcGxhY2UoLygmfFxcPyluby1saW5rZWQtY2FyZCg9dHJ1ZXxcXD1mYWxzZSkvLCAnJyk7XG4gICAgICAgICAgICBjb25zdCBpbml0aWF0ZUNhcmRMaW5rVXJsID0gd2luZG93LnVybCh3aW5kb3cucm91dGVzLmFjY291bnRTdGFydENhcmRMaW5rLCB7Zm9yd2FyZDogZm9yd2FyZFVybCwgYWN0aW9ufSk7XG4gICAgICAgICAgICAkKCcjYWRkLWNhcmQtYnV0dG9uJykuYXR0cignaHJlZicsIGluaXRpYXRlQ2FyZExpbmtVcmwpO1xuICAgICAgICAgICAgJCgnI2xpbmstY2FyZC1tb2RhbCcpLmZvdW5kYXRpb24oJ3JldmVhbCcsICdvcGVuJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBfcGF0cm9uQ2FyZEZhaWxlZEF1dGhlbnRpY2F0aW9uKCkge1xuICAgICAgICBpZiAod2luZG93Lk92ZXJEcml2ZS5hdXRoVHlwZSA9PT0gJ2xpYnJhcnknIHx8IHdpbmRvdy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ096b25lQXV0aGVudGljYXRpb24nKSkge1xuICAgICAgICAgICAgbmV3IFNlc3Npb25FeHBpcmVkTW9kYWwoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHRoZSB1c2VyJ3MgY2FyZCBpcyBubyBsb25nZXIgdmFsaWQuIERpcmVjdCB0aGVtIHRvIHRoZSBsaW5rIGEgY2FyZCBmbG93IHNvIHRoYXQgdGhleSBtYXkgcmVzb2x2ZSBhbnkgaXNzdWVzLlxuICAgICAgICAgICAgJCgnLmpzLWNhcmQtZXJyb3ItbW9kYWwnKS5mb3VuZGF0aW9uKCdyZXZlYWwnLCAnb3BlbicpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwiY2xhc3MgV2lzaGxpc3Qge1xuICAgIGNvbnN0cnVjdG9yKGJ1cykge1xuICAgICAgICB0aGlzLmJ1cyA9IGJ1cztcbiAgICB9XG5cbiAgICB3aXNobGlzdEFjdGlvbih0aXRsZU1vZGVsLCBjb250ZXh0KSB7XG4gICAgICAgIGxldCBhY3Rpb24gPSB0aXRsZU1vZGVsLmdldCgnd2lzaGxpc3RTdGF0ZScpID09PSAnd2lzaGxpc3RBZGQnID8gJ2FkZCcgOiAncmVtb3ZlJztcblxuICAgICAgICB0aGlzLmJ1cy50cmlnZ2VyKCd0aXRsZTp3aXNobGlzdDpzdGFydCcsIHsgdGl0bGVNb2RlbCwgYWN0aW9uIH0pO1xuXG4gICAgICAgIGxldCByZXF1ZXN0ID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgaWYgKHRpdGxlTW9kZWwuZ2V0KCd3aXNobGlzdFN0YXRlJykgPT09ICd3aXNobGlzdEFkZCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93aXNobGlzdEFkZEFqYXgodGl0bGVNb2RlbClcbiAgICAgICAgICAgICAgICAgICAgLnRoZW4ocmVzb2x2ZSlcbiAgICAgICAgICAgICAgICAgICAgLmZhaWwoKGpxWEhSKSA9PiByZWplY3QoeyBqcVhIUiwgdGl0bGVNb2RlbCB9KSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dpc2hsaXN0UmVtb3ZlQWpheCh0aXRsZU1vZGVsKVxuICAgICAgICAgICAgICAgICAgICAudGhlbihyZXNvbHZlKVxuICAgICAgICAgICAgICAgICAgICAuZmFpbCgoanFYSFIpID0+IHJlamVjdCh7IGpxWEhSLCB0aXRsZU1vZGVsIH0pKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmVxdWVzdFxuICAgICAgICAgICAgLnRoZW4oKC4uLnBhcmFtcykgICA9PiB0aGlzLmJ1cy50cmlnZ2VyKCd0aXRsZTp3aXNobGlzdDpzdWNjZXNzJywgeyB0aXRsZU1vZGVsLCBhY3Rpb24sIGNvbnRleHQgfSwgLi4ucGFyYW1zKSlcbiAgICAgICAgICAgIC5jYXRjaCgoLi4ucGFyYW1zKSAgPT4ge1xuICAgICAgICAgICAgICAgIGxldCB7IGpxWEhSIH0gPSAocGFyYW1zLmxlbmd0aCAmJiBwYXJhbXMgfHwgW3t9XSlbMF07XG5cbiAgICAgICAgICAgICAgICB0aGlzLl93aXNobGlzdEZhaWx1cmUodGl0bGVNb2RlbCwganFYSFIpO1xuICAgICAgICAgICAgICAgIHRoaXMuYnVzLnRyaWdnZXIoJ3RpdGxlOndpc2hsaXN0OmZhaWwnLCB7IHRpdGxlTW9kZWwsIGFjdGlvbiwgY29udGV4dCB9LCAuLi5wYXJhbXMpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuYnVzLnRyaWdnZXIoJ3RpdGxlOndpc2hsaXN0OmVuZCcsIHsgdGl0bGVNb2RlbCwgYWN0aW9uLCBjb250ZXh0IH0pKTtcblxuICAgICAgICByZXR1cm4gcmVxdWVzdDtcbiAgICB9XG5cbiAgICBfd2lzaGxpc3RBZGRBamF4KHRpdGxlTW9kZWwsIGNvbnRleHQpIHtcbiAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndGl0bGU6d2lzaGxpc3Q6YWRkOnN0YXJ0JywgeyB0aXRsZU1vZGVsLCBjb250ZXh0IH0pO1xuXG4gICAgICAgIGxldCByZXNwb25zZSA9ICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5hY2NvdW50V2lzaGxpc3RBZGQsIHttZWRpYUlkOiB0aXRsZU1vZGVsLmlkfSksXG4gICAgICAgICAgICB0eXBlOiAnUFVUJ1xuICAgICAgICB9KTtcblxuICAgICAgICByZXNwb25zZVxuICAgICAgICAgICAgLmRvbmUoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRpdGxlTW9kZWwuc2V0KCd3aXNobGlzdFN0YXRlJywgJ3dpc2hsaXN0UmVtb3ZlJyk7XG4gICAgICAgICAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndGl0bGU6d2lzaGxpc3Q6YWRkOnN1Y2Nlc3MnLCB7IHRpdGxlTW9kZWwsIGNvbnRleHQgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZhaWwoKC4uLnBhcmFtcykgPT4gdGhpcy5idXMudHJpZ2dlcigndGl0bGU6d2lzaGxpc3Q6YWRkOmZhaWwnLCB7IHRpdGxlTW9kZWwsIGNvbnRleHQgfSwgLi4ucGFyYW1zKSlcbiAgICAgICAgICAgIC5hbHdheXMoKCkgPT4gdGhpcy5idXMudHJpZ2dlcigndGl0bGU6d2lzaGxpc3Q6YWRkOmVuZCcsIHsgdGl0bGVNb2RlbCwgY29udGV4dCB9KSk7XG5cbiAgICAgICAgcmV0dXJuIHJlc3BvbnNlO1xuICAgIH1cblxuICAgIF93aXNobGlzdFJlbW92ZUFqYXgodGl0bGVNb2RlbCwgY29udGV4dCkge1xuICAgICAgICB0aGlzLmJ1cy50cmlnZ2VyKCd0aXRsZTp3aXNobGlzdDpyZW1vdmU6c3RhcnQnLCB7IHRpdGxlTW9kZWwsIGNvbnRleHQgfSk7XG5cbiAgICAgICAgbGV0IHJlc3BvbnNlID0gJC5hamF4KHtcbiAgICAgICAgICAgIHVybDogd2luZG93LnVybCh3aW5kb3cucm91dGVzLmFjY291bnRXaXNobGlzdFJlbW92ZSwge21lZGlhSWQ6IHRpdGxlTW9kZWwuaWR9KSxcbiAgICAgICAgICAgIHR5cGU6ICdERUxFVEUnXG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJlc3BvbnNlXG4gICAgICAgICAgICAuZG9uZSgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGl0bGVNb2RlbC5zZXQoJ3dpc2hsaXN0U3RhdGUnLCAnd2lzaGxpc3RBZGQnKTtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1cy50cmlnZ2VyKCd0aXRsZTp3aXNobGlzdDpyZW1vdmU6c3VjY2VzcycsIHsgdGl0bGVNb2RlbCwgY29udGV4dCB9KTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAuZmFpbCgoLi4ucGFyYW1zKSA9PiB0aGlzLmJ1cy50cmlnZ2VyKCd0aXRsZTp3aXNobGlzdDpyZW1vdmU6ZmFpbCcsIHsgdGl0bGVNb2RlbCwgY29udGV4dCB9LCAuLi5wYXJhbXMpKVxuICAgICAgICAgICAgLmFsd2F5cygoKSA9PiB0aGlzLmJ1cy50cmlnZ2VyKCd0aXRsZTp3aXNobGlzdDpyZW1vdmU6ZW5kJywgeyB0aXRsZU1vZGVsLCBjb250ZXh0IH0pKTtcblxuICAgICAgICByZXR1cm4gcmVzcG9uc2U7XG4gICAgfVxuXG4gICAgX3dpc2hsaXN0RmFpbHVyZSh0aXRsZU1vZGVsLCBqcVhIUikge1xuICAgICAgICBpZiAoanFYSFIucmVzcG9uc2VUZXh0ICYmIEpTT04ucGFyc2UoanFYSFIucmVzcG9uc2VUZXh0KS5zZXNzaW9uRXhwaXJlZCkge1xuICAgICAgICAgICAgdGhpcy5idXMudHJpZ2dlcigndXNlcjpzZXNzaW9uOmV4cGlyZWQnKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRvYXN0ZXIucHVzaCh3aW5kb3cuaHRtbCgnZXJyb3IuZGVmYXVsdEVycm9ySHRtbCcpLCAnZXJyb3InKTtcbiAgICAgICAgfVxuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgV2lzaGxpc3Q7XG4iLCJpbXBvcnQgY29va2llQ29uZmlnIGZyb20gJy4uLy4uLy4uL2xpYi9jb29raWVDb25maWcnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBGZWF0dXJlSGlnaGxpZ2h0TWFuYWdlciB7XG4gICAgY29uc3RydWN0b3IoaGlnaGxpZ2h0ZWRGZWF0dXJlU3RhdGUpe1xuICAgICAgICB0aGlzLmhpZ2hsaWdodGVkRmVhdHVyZVN0YXRlID0gaGlnaGxpZ2h0ZWRGZWF0dXJlU3RhdGU7XG5cbiAgICAgICAgJCgnLmhpZ2hsaWdodGVkRmVhdHVyZS5ub3RWaXNpdGVkIC5oaWdobGlnaHRlZEZlYXR1cmVUcmlnZ2VyRWxlbWVudCcpLm9uKCdjbGljaycsIChlKSA9PiB0aGlzLmhpZ2hsaWdodGVkRmVhdHVyZUNsaWNrZWQoZSkpO1xuICAgICAgICAkKCcudmlzaXRBbGxGZWF0dXJlc1RyaWdnZXJFbGVtZW50Jykub24oJ2NsaWNrJywgKCkgPT4gdGhpcy5hbGxGZWF0dXJlc1Zpc2l0ZWQoKSk7XG4gICAgfVxuXG4gICAgYWxsRmVhdHVyZXNWaXNpdGVkKCkge1xuICAgICAgICB0aGlzLmhpZ2hsaWdodGVkRmVhdHVyZVN0YXRlLnZpc2l0QWxsQWN0aXZlRmVhdHVyZXMoKTtcbiAgICAgICAgdGhpcy5zYXZlKCk7XG4gICAgfVxuXG4gICAgaGlnaGxpZ2h0ZWRGZWF0dXJlQ2xpY2tlZCAoZSl7XG4gICAgICAgIGxldCBmZWF0dXJlTmFtZSA9IHRoaXMuZ2V0RmVhdHVyZU5hbWUoZS5jdXJyZW50VGFyZ2V0KTtcblxuICAgICAgICBpZiAoIXRoaXMuaGlnaGxpZ2h0ZWRGZWF0dXJlU3RhdGUud2FzVmlzaXRlZChmZWF0dXJlTmFtZSkpe1xuICAgICAgICAgICAgdGhpcy5oaWdobGlnaHRlZEZlYXR1cmVTdGF0ZS52aXNpdChmZWF0dXJlTmFtZSk7XG4gICAgICAgICAgICB0aGlzLnNhdmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY2xlYXJGZWF0dXJlSGlnaGxpZ2h0KGZlYXR1cmVOYW1lKTtcbiAgICAgICAgdGhpcy51cGRhdGVkSGFtYnVyZ2VyRG90KCk7IC8vIHl1bW15XG4gICAgfVxuXG4gICAgZ2V0RmVhdHVyZU5hbWUoZWxlbWVudCl7XG4gICAgICAgIGxldCBwYXJlbnQgPSB0aGlzLmdldEZlYXR1cmVSb290RWxlbWVudChlbGVtZW50KTtcbiAgICAgICAgcmV0dXJuIHBhcmVudC5hdHRyaWJ1dGVzWydkYXRhLWZlYXR1cmUtbmFtZSddLnZhbHVlO1xuICAgIH1cblxuICAgIGNsZWFyRmVhdHVyZUhpZ2hsaWdodChmZWF0dXJlTmFtZSl7XG4gICAgICAgICQoYFtkYXRhLWZlYXR1cmUtbmFtZT1cIiR7ZmVhdHVyZU5hbWV9XCJdYCkucmVtb3ZlQ2xhc3MoJ25vdFZpc2l0ZWQnKTtcbiAgICB9XG5cbiAgICBnZXRGZWF0dXJlUm9vdEVsZW1lbnQoY3VycmVudEVsZW1lbnQpe1xuICAgICAgICBpZiAoJChjdXJyZW50RWxlbWVudCkuaGFzQ2xhc3MoJ2hpZ2hsaWdodGVkRmVhdHVyZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gY3VycmVudEVsZW1lbnQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgZmVhdHVyZVBhcmVudCA9ICQoY3VycmVudEVsZW1lbnQpLmNsb3Nlc3QoJy5oaWdobGlnaHRlZEZlYXR1cmUnKS5maXJzdCgpO1xuICAgICAgICAgICAgaWYgKCFmZWF0dXJlUGFyZW50IHx8IGZlYXR1cmVQYXJlbnQubGVuZ3RoID09PSAwKXtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ZvdW5kIG5vIGFuY2VzdG9yIHdpdGggY2xhc3MgXCJoaWdobGlnaHRlZEZlYXR1cmVcIicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZlYXR1cmVQYXJlbnRbMF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cGRhdGVkSGFtYnVyZ2VyRG90KCl7XG4gICAgICAgIGlmICghdGhpcy5oaWdobGlnaHRlZEZlYXR1cmVTdGF0ZS51bnZpc2l0ZWRGZWF0dXJlUHJlc2VudCkge1xuICAgICAgICAgICAgJCgnLk1vYmlsZU5hdi1hY2NvdW50TWVudScpLnJlbW92ZUNsYXNzKCdoaWdobGlnaHRlZEZlYXR1cmVQcmVzZW50Jyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzYXZlKCkge1xuICAgICAgICBsZXQgY29va2llSW5mbyA9IGNvb2tpZUNvbmZpZy52aXNpdGVkRmVhdHVyZXM7XG4gICAgICAgIENvb2tpZXMuc2V0KGNvb2tpZUluZm8ubmFtZSwgdGhpcy5oaWdobGlnaHRlZEZlYXR1cmVTdGF0ZS5mbGFncywgeyBleHBpcmVzOiBuZXcgRGF0ZShEYXRlLm5vdygpICsgY29va2llSW5mby5kdXJhdGlvbk1TKX0pO1xuXG4gICAgICAgIGlmKHdpbmRvdy5PdmVyRHJpdmUuaXNBdXRoZW50aWNhdGVkKSB7XG4gICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgIHVybDogd2luZG93LnVybCh3aW5kb3cucm91dGVzLnByZWZlcmVuY2VzKSxcbiAgICAgICAgICAgICAgICB0eXBlOiAnUEFUQ0gnLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlIDogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgICAgIGRhdGE6IEpTT04uc3RyaW5naWZ5KHsgdmlzaXRlZEZlYXR1cmVzOiB0aGlzLmhpZ2hsaWdodGVkRmVhdHVyZVN0YXRlLmZsYWdzfSksXG4gICAgICAgICAgICAgICAgZXJyb3IoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5Mb2dnZXIubG9nKCdlcnJvcicsICdmYWlsZWQgdG8gc2F2ZSB2aXNpdGVkRmVhdHVyZXMgZmxhZ3MgdG8gdXNlciBwcmVmZXJlbmNlcycse3N0YXR1czogdGV4dFN0YXR1cywgZXJyb3I6IGVycm9yVGhyb3dufSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCIvLyBFUzYgdmVyc2lvbiBvZiBzZXR0bGVcblByb21pc2Uuc2V0dGxlID0gZnVuY3Rpb24ocHJvbWlzZXMpIHtcbiAgICBjbGFzcyBQcm9taXNlSW5zcGVjdGlvbiB7XG4gICAgICAgIGNvbnN0cnVjdG9yKGZ1bGZpbGxlZCwgdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuZnVsZmlsbGVkID0gZnVsZmlsbGVkO1xuICAgICAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFByb21pc2UuYWxsKHByb21pc2VzLm1hcCgocCkgPT5cbiAgICAgICAgLy8gbWFrZSBzdXJlIGFueSB2YWx1ZXMgYXJlIHdyYXBwZWQgaW4gYSBwcm9taXNlXG4gICAgICAgIFByb21pc2UucmVzb2x2ZShwKS50aGVuKCh2YWwpID0+IG5ldyBQcm9taXNlSW5zcGVjdGlvbih0cnVlLCB2YWwpKS5jYXRjaCgoZXJyKSA9PiBuZXcgUHJvbWlzZUluc3BlY3Rpb24oZmFsc2UsIGVycikpKSk7XG59O1xuXG4vLyB3cmFwcGluZyBQcm9taXNlIG5vdGF0aW9uIGFyb3VuZCBhbiBhamF4IGNhbGxcblByb21pc2UuYWpheCA9IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT5cbiAgICAgICAgJC5hamF4KG9wdGlvbnMpXG4gICAgICAgICAgICAuZG9uZSgocmVzcG9uc2UpID0+IHJlc29sdmUocmVzcG9uc2UpKVxuICAgICAgICAgICAgLmZhaWwoKHhociwgc3RhdHVzLCBlcnIpID0+IHJlamVjdChlcnIpKVxuICAgICk7XG59O1xuIiwiaW1wb3J0IGtleUNvZGVzIGZyb20gJy4uL2tleWNvZGVzLmpzJztcbi8qXG4gKiBGb3JjZSBhY2NvdW50IG1lbnUgdG8gYmUgbmF2aWdhYmxlIHdpdGggYXJyb3cga2V5c1xuICogQHBhcmFtIHtvYmplY3R9IGUgZXZlbnQgb2JqZWN0XG4gKi9cbmNvbnN0IGFycm93VGFiQWNjb3VudE1lbnUgPSBmdW5jdGlvbihlKSB7XG4gICAgaWYgKGUud2hpY2ggPT09IGtleUNvZGVzLkRPV04pIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBpZiAoJChlLnRhcmdldCkuaXMoJ3VsJykpIHtcbiAgICAgICAgICAgICQoJ3VsI2Ryb3BBY2NvdW50IGxpOmZpcnN0LWNoaWxkIGEnKS5mb2N1cygpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJChlLnRhcmdldCkuZW11bGF0ZVRhYigpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGlmIChlLndoaWNoID09PSBrZXlDb2Rlcy5VUCkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICQoZS50YXJnZXQpLmVtdWxhdGVUYWIoLTEpO1xuICAgIH1cblxuICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBhcnJvd1RhYkFjY291bnRNZW51O1xuIiwiY29uc3QgaGlkZUFycm93c09uRW5kT2ZTY3JvbGwgPSBmdW5jdGlvbihlLCBlbCkge1xuICAgIGNvbnN0IG1lZGlhID0gJChlbCkuY2hpbGRyZW4oJy5qcy1jYXJvdXNlbEl0ZW0nKTtcbiAgICBjb25zdCBlbGVtV2lkdGggPSAkKGVsKVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICBjb25zdCBtZWRpYVdpZHRoID0gbWVkaWFbMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgY29uc3QgbWVkaWFBbW91bnQgPSBtZWRpYS5sZW5ndGg7XG5cbiAgICBpZiAoJChlbCkuc2Nyb2xsTGVmdCgpID09PSAwKSB7XG4gICAgICAgICQoZWwpLnBhcmVudCgpLnNpYmxpbmdzKCcuanMtY2Fyb3VzZWxBcnJvd0xlZnQnKS5jc3MoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgJChlbCkucGFyZW50KCkuc2libGluZ3MoJy5qcy1jYXJvdXNlbEFycm93TGVmdCcpLmNzcygndmlzaWJpbGl0eScsICd2aXNpYmxlJyk7XG4gICAgfVxuXG4gICAgaWYgKCQoZWwpLnNjcm9sbExlZnQoKSArIGVsZW1XaWR0aCA+PSAobWVkaWFXaWR0aCAqIG1lZGlhQW1vdW50KSArIChtZWRpYUFtb3VudCAqIDMuMykpIHtcbiAgICAgICAgJChlbCkucGFyZW50KCkuc2libGluZ3MoJy5qcy1jYXJvdXNlbEFycm93UmlnaHQnKS5jc3MoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7XG5cbiAgICAgICAgLy8gU3RvcCBzY3JvbGxpbmcgcGFzdCBjb250ZW50IGluIEZpcmVmb3hcbiAgICAgICAgaWYgKHdpbmRvdy5zY3JvbGxBbXQgPT09IDApIHtcbiAgICAgICAgICAgIHdpbmRvdy5zY3JvbGxBbXQgPSAkKGVsKS5zY3JvbGxMZWZ0KCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKGVsKS5zY3JvbGxMZWZ0KHdpbmRvdy5zY3JvbGxBbXQpO1xuICAgICAgICAgICAgd2luZG93LnNjcm9sbEFtdCA9IDA7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICAkKGVsKS5wYXJlbnQoKS5zaWJsaW5ncygnLmpzLWNhcm91c2VsQXJyb3dSaWdodCcpLmNzcygndmlzaWJpbGl0eScsICd2aXNpYmxlJyk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgaGlkZUFycm93c09uRW5kT2ZTY3JvbGw7XG4iLCJjb25zdCBoaWRlQ2Fyb3VzZWxBcnJvd3NGb3JFbCA9IGZ1bmN0aW9uKGVsKSB7XG4gICAgY29uc3QgbWVkaWEgPSAkKGVsKS5jaGlsZHJlbignLmpzLWNhcm91c2VsSXRlbScpO1xuICAgIGNvbnN0IG1lZGlhQW1vdW50ID0gbWVkaWEubGVuZ3RoO1xuICAgIGNvbnN0IG1lZGlhV2lkdGggPSBtZWRpYVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcbiAgICBjb25zdCBlbGVtV2lkdGggPSAkKGVsKVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aDtcblxuICAgICQoZWwpLnBhcmVudCgpLnNpYmxpbmdzKCcuanMtY2Fyb3VzZWxBcnJvd1JpZ2h0JykuY3NzKCd2aXNpYmlsaXR5JywgJ3Zpc2libGUnKTtcblxuICAgIGlmICgobWVkaWFBbW91bnQgKiBtZWRpYVdpZHRoKSA8PSBlbGVtV2lkdGgpIHtcbiAgICAgICAgJChlbCkucGFyZW50KCkuc2libGluZ3MoJy5qcy1jYXJvdXNlbEFycm93TGVmdCcpLmNzcygndmlzaWJpbGl0eScsICdoaWRkZW4nKTtcbiAgICAgICAgJChlbCkucGFyZW50KCkuc2libGluZ3MoJy5qcy1jYXJvdXNlbEFycm93UmlnaHQnKS5jc3MoJ3Zpc2liaWxpdHknLCAnaGlkZGVuJyk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgaGlkZUNhcm91c2VsQXJyb3dzRm9yRWw7XG4iLCIvKlxuICogU25hcCB0byBuZWFyZXN0IGNvdmVyXG4gKi9cbmNvbnN0IHJvdW5kU2Nyb2xsID0gZnVuY3Rpb24obiwgZGlyZWN0aW9uLCB3aWR0aCkge1xuICAgIGlmIChkaXJlY3Rpb24gPT09ICdsZWZ0Jykge1xuICAgICAgICByZXR1cm4gTWF0aC5jZWlsKG4gLyB3aWR0aCkgKiB3aWR0aDtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGguZmxvb3IobiAvIHdpZHRoKSAqIHdpZHRoO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcm91bmRTY3JvbGw7XG4iLCJpbXBvcnQgcm91bmRTY3JvbGwgZnJvbSAnLi9yb3VuZFNjcm9sbC5qcyc7XG5cbi8qXG4gKiBTY3JvbGwgYSBtZWRpYSBjYXJvdXNlbCB0byB0aGUgcmlnaHQgb3IgbGVmdFxuICogQHBhcmFtIHtzdHJpbmd9IGRpcmVjdGlvbiBUaGUgZGlyZWN0aW9uIHRoZSBjYXJvdXNlbCBzaG91bGQgc2Nyb2xsXG4gKiBAcGFyYW0ge3N0cmluZ30gZWxlbSBTZWxlY3RvciB0byBpbmRpY2F0ZSB0aGUgY2Fyb3VzZWwgZWxlbWVudCB0byBiZSBzY3JvbGxlZFxuICovXG5jb25zdCBzY3JvbGxDYXJvdXNlbCA9IGZ1bmN0aW9uKGRpcmVjdGlvbiwgZWxlbSkge1xuICAgIGNvbnN0IG1lZGlhID0gJChlbGVtKS5jaGlsZHJlbignLmpzLWNhcm91c2VsSXRlbScpO1xuICAgIGNvbnN0IGVsZW1XaWR0aCA9IGVsZW1bMF0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg7XG4gICAgY29uc3QgbWVkaWFXaWR0aCA9IG1lZGlhWzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoO1xuICAgIGNvbnN0IG1lZGlhQW1vdW50ID0gbWVkaWEubGVuZ3RoO1xuXG4gICAgLy8gQ2FsY3VsYXRlICMgb2YgdGl0bGVzIHRvIGxlZnRcbiAgICBjb25zdCB0b3RhbExlZnQgPSBNYXRoLmNlaWwoZWxlbS5zY3JvbGxMZWZ0KCkgLyBtZWRpYVdpZHRoKTtcblxuICAgIC8vIENhbGN1bGF0ZSBudW1iZXIgb2YgNHB4IGdhcHMgYmV0d2VlbiB0aXRsZXMgdG8gY29tcGVuc2F0ZVxuICAgIGNvbnN0IGdhcFRvdGFsTGVmdCA9ICh0b3RhbExlZnQgKyA0KSAqIDQ7XG5cbiAgICBpZiAoZGlyZWN0aW9uID09PSAncmlnaHQnKSB7XG4gICAgICAgIGlmIChlbGVtLnNjcm9sbExlZnQoKSArIGVsZW1XaWR0aCA8IChtZWRpYVdpZHRoICogbWVkaWFBbW91bnQpKSB7XG4gICAgICAgICAgICBjb25zdCBhID0gcm91bmRTY3JvbGwoZWxlbS5zY3JvbGxMZWZ0KCksICdyaWdodCcsIG1lZGlhV2lkdGgpO1xuICAgICAgICAgICAgY29uc3QgYiA9IHJvdW5kU2Nyb2xsKGVsZW1XaWR0aCwgJ3JpZ2h0JywgbWVkaWFXaWR0aCk7XG4gICAgICAgICAgICBjb25zdCBzY3JvbGxMZWZ0ID0gYSArIGIgKyBnYXBUb3RhbExlZnQ7XG4gICAgICAgICAgICBlbGVtLmFuaW1hdGUoe3Njcm9sbExlZnR9KTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENoZWNrIGZvciBvYnNjdXJlZCBjb3ZlciBhbmQgaWYgZ3JlYXRlciBvciBsZXNzIHRoYW4gNTAlIHNob3duXG4gICAgICAgIGxldCBtb2RpZmllciA9IDA7XG4gICAgICAgIGlmIChyb3VuZFNjcm9sbChlbGVtLnNjcm9sbExlZnQoKSwgJ2xlZnQnLCBtZWRpYVdpZHRoKSAtIGVsZW0uc2Nyb2xsTGVmdCgpID4gMTAwKSB7XG4gICAgICAgICAgICBtb2RpZmllciArPSBtZWRpYVdpZHRoO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGEgPSByb3VuZFNjcm9sbChlbGVtLnNjcm9sbExlZnQoKSwgJ2xlZnQnLCBtZWRpYVdpZHRoKTtcbiAgICAgICAgY29uc3QgYiA9IC1lbGVtV2lkdGg7XG4gICAgICAgIGNvbnN0IGMgPSBnYXBUb3RhbExlZnQ7XG4gICAgICAgIGNvbnN0IGQgPSAtMjQ7XG4gICAgICAgIGNvbnN0IGUgPSAtbW9kaWZpZXI7XG4gICAgICAgIGNvbnN0IHNjcm9sbExlZnQgPSBhICsgYiArIGMgKyBkICsgZTtcbiAgICAgICAgZWxlbS5hbmltYXRlKHtzY3JvbGxMZWZ0fSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgc2Nyb2xsQ2Fyb3VzZWw7XG4iLCJjb25zdCBjb21wb25lbnRUb0hleCA9IGZ1bmN0aW9uKGMpIHtcbiAgICBjb25zdCBoZXggPSBjLnRvU3RyaW5nKDE2KTtcbiAgICByZXR1cm4gaGV4Lmxlbmd0aCA9PT0gMSA/IGAwJHtoZXh9YCA6IGhleDtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNvbXBvbmVudFRvSGV4O1xuIiwiaW1wb3J0IGNvbXBvbmVudFRvSGV4IGZyb20gJy4vY29tcG9uZW50VG9IZXguanMnO1xuXG5jb25zdCByZ2JUb0hleCA9IGZ1bmN0aW9uKHIsIGcsIGIpIHtcbiAgICByZXR1cm4gYCMke2NvbXBvbmVudFRvSGV4KHIpfSR7Y29tcG9uZW50VG9IZXgoZyl9JHtjb21wb25lbnRUb0hleChiKX1gO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgcmdiVG9IZXg7XG4iLCJpbXBvcnQga2V5Q29kZXMgZnJvbSAnLi4va2V5Y29kZXMuanMnO1xuXG4vKlxuICogU29tZSBhbGwgZXhwcmVzc2lvblxuICovXG5jb25zdCBzb21lTG9uZ1RoaW5nID0gZnVuY3Rpb24oJHRhcmdldCkge1xuICAgIHJldHVybiAoXG4gICAgICAgICEkdGFyZ2V0LmlzKCdoMicpXG4gICAgICAgICYmICR0YXJnZXQuY2xvc2VzdCgnbGknKS5pcygnOmZpcnN0LWNoaWxkJylcbiAgICAgICAgJiYgKFxuICAgICAgICAgICAgKFxuICAgICAgICAgICAgICAgICR0YXJnZXQuY2xvc2VzdCgndWwnKS5oYXNDbGFzcygncG9wdWxhci1saW5rcycpXG4gICAgICAgICAgICAgICAgJiYgJHRhcmdldC5jbG9zZXN0KCd1bCcpLmNsb3Nlc3QoJ2xpJykuaXMoJzpmaXJzdC1jaGlsZCcpXG4gICAgICAgICAgICApXG4gICAgICAgICAgICB8fCAkdGFyZ2V0LmNsb3Nlc3QoJ3VsJykuaGFzQ2xhc3MoJ2ZlYXR1cmVkLWxpbmtzJylcbiAgICAgICAgKVxuICAgICk7XG59O1xuXG4vKlxuICogRm9yY2UgbmF2IG1lbnUgdG8gYmUgbmF2aWdhYmxlIHdpdGggYXJyb3cga2V5cyBpbiBhbGwgYnJvd3NlcnNcbiAqIEBwYXJhbSB7b2JqZWN0fSBlIEV2ZW50IG9iamVjdFxuICovXG5jb25zdCBhcnJvd1RhYk1lbnUgPSBmdW5jdGlvbihlKSB7XG4gICAgbGV0IGlkID0gJyc7XG4gICAgY29uc3QgJHRhcmdldCA9ICQoZS50YXJnZXQpO1xuICAgIGlmIChlLndoaWNoID09PSBrZXlDb2Rlcy5ET1dOKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgLy8gZm9jdXMgb24gbmV4dCBhdmFpbGFibGUgZWxlbWVudFxuICAgICAgICBpZiAoJHRhcmdldC5oYXNDbGFzcygnZi1kcm9wZG93bicpKSB7XG4gICAgICAgICAgICAkdGFyZ2V0LmNoaWxkcmVuKCdkaXYuZmVhdHVyZWQnKS5maW5kKCdoMjpmaXJzdCcpLmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoJHRhcmdldC5pcygnaDInKSkge1xuICAgICAgICAgICAgJHRhcmdldC5uZXh0KCd1bCcpLmZpbmQoJ2E6Zmlyc3QnKS5mb2N1cygpO1xuICAgICAgICB9IGVsc2UgaWYgKCR0YXJnZXQuaGFzQ2xhc3MoJ2Jyb3dzZS1hbGwnKSkge1xuICAgICAgICAgICAgaWYgKCR0YXJnZXQucGFyZW50cygnZGl2JykuaGFzQ2xhc3MoJ2ZlYXR1cmVkJykpIHtcbiAgICAgICAgICAgICAgICBpZiAoJHRhcmdldC5wYXJlbnRzKCcuZmVhdHVyZWQnKS5uZXh0KCdkaXYnKS5oYXNDbGFzcygncG9wdWxhcicpKSB7XG4gICAgICAgICAgICAgICAgICAgICR0YXJnZXQucGFyZW50cygnLmZlYXR1cmVkJykubmV4dCgnZGl2LnBvcHVsYXInKS5maW5kKCdoMjpmaXJzdCcpLmZvY3VzKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWQgPSAkdGFyZ2V0LmNsb3Nlc3QoJ3VsJykuYXR0cignaWQnKTtcbiAgICAgICAgICAgICAgICAgICAgJChgbGlbZGF0YS1kcm9wZG93bj1cIiR7aWR9XCJdIGFgKS5mb2N1cygpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaWQgPSAkdGFyZ2V0LmNsb3Nlc3QoJ3VsJykuYXR0cignaWQnKTtcbiAgICAgICAgICAgICAgICAkKGBsaVtkYXRhLWRyb3Bkb3duPVwiJHtpZH1cIl1gKS5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgJHRhcmdldC5lbXVsYXRlVGFiKCk7XG4gICAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGUud2hpY2ggPT09IGtleUNvZGVzLlVQKSB7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgaWYgKHNvbWVMb25nVGhpbmcoJHRhcmdldCkpIHtcbiAgICAgICAgICAgICR0YXJnZXQuY2xvc2VzdCgnZGl2JykuZmluZCgnaDInKS5mb2N1cygpO1xuICAgICAgICB9IGVsc2UgaWYgKCR0YXJnZXQuaGFzQ2xhc3MoJ2Jyb3dzZS1hbGwnKSkge1xuICAgICAgICAgICAgJHRhcmdldC5wcmV2KCd1bCcpLmZpbmQoJ2xpOmxhc3QtY2hpbGQgYScpLmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoJHRhcmdldC5pcygnaDInKSkge1xuICAgICAgICAgICAgaWYgKCR0YXJnZXQuY2xvc2VzdCgnZGl2JykuaGFzQ2xhc3MoJ3BvcHVsYXInKSkge1xuICAgICAgICAgICAgICAgICR0YXJnZXQuY2xvc2VzdCgnZGl2LnBvcHVsYXInKS5wcmV2KCdkaXYuZmVhdHVyZWQnKS5maW5kKCdhLmJyb3dzZS1hbGwnKS5mb2N1cygpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZCA9ICR0YXJnZXQuY2xvc2VzdCgndWwnKS5hdHRyKCdpZCcpO1xuICAgICAgICAgICAgICAgICQoYGxpW2RhdGEtZHJvcGRvd249XCIke2lkfVwiXSBhYCkuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICR0YXJnZXQuZW11bGF0ZVRhYigtMSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGFycm93VGFiTWVudTtcbiIsIi8vIEZvcmNlIGEgZnVsbCBwYWdlIHJlbG9hZCBmb3IgZGV2aWNlcyB0aGF0IHRyeVxuLy8gdG8gZHJhdyBmcm9tIGEgYmFjay9mb3J3YXJkIGNhY2hlLlxuY29uc3QgZm9yY2VSZWFsUGFnZVJlbG9hZCA9IChldmVudCkgPT4ge1xuICAgIGlmIChldmVudC5vcmlnaW5hbEV2ZW50LnBlcnNpc3RlZCkge1xuICAgICAgICB3aW5kb3cubG9jYXRpb24ucmVsb2FkKCk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZm9yY2VSZWFsUGFnZVJlbG9hZDtcbiIsIi8vIEZvcmNlIGZpcmVmb3ggdG8gcmVsb2FkIHBhZ2Ugd2hlbiBoaXR0aW5nIGJhY2sgYnV0dG9uLlxuLy8gQWxsb3dzIGRvY3VtZW50IHJlYWR5IGV2ZW50IHRvIGZpcmUuXG5jb25zdCBvbnVubG9hZCA9IGZ1bmN0aW9uKCkge307IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tZW1wdHktZnVuY3Rpb25cbmV4cG9ydCBkZWZhdWx0IG9udW5sb2FkO1xuIiwiLypcbiAqIFJlbW92ZSBjYXJvdXNlbCBmdW5jdGlvbmFsaXR5XG4gKi9cbmNvbnN0IHJlbW92ZUNhcm91c2VsRnVuY3Rpb25hbGl0eSA9IGZ1bmN0aW9uICgpIHtcbiAgICBjb25zdCB2ZXJ0T3JpZW50YXRpb24gPSBNYXRoLmFicyh3aW5kb3cub3JpZW50YXRpb24pICE9PSA5MDtcbiAgICAvLyBEZWxldGUgYWxsIGJ1dCAzIGluIGNhcm91c2Vsc1xuICAgICQoJy5jYXJvdXNlbC5sb2FkZWQnKS5lYWNoKChpbmRleCwgZWwpID0+IHtcbiAgICAgICAgbGV0IGNoaWxkcmVuID0gJChlbCkuY2hpbGRyZW4oKTtcbiAgICAgICAgZm9yIChsZXQgeCA9IDM7IHggPCBjaGlsZHJlbi5sZW5ndGg7IHgrKykge1xuICAgICAgICAgICAgJChjaGlsZHJlblt4XSkucmVtb3ZlKCk7XG4gICAgICAgIH1cblxuICAgICAgICBjaGlsZHJlbiA9IGNoaWxkcmVuLnNsaWNlKDAsIDMpO1xuICAgICAgICBjaGlsZHJlbi5hZGRDbGFzcygndGV4dC1sZWZ0Jyk7XG4gICAgICAgICQoZWwpLmFkZENsYXNzKCd0ZXh0LWNlbnRlcicpLmNzcygnb3ZlcmZsb3cteCcsICdoaWRkZW4nKTtcblxuICAgICAgICBpZiAodmVydE9yaWVudGF0aW9uKSB7XG4gICAgICAgICAgICBjaGlsZHJlbi5sYXN0KCkuaGlkZSgpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgJCgnLmpzLWNhcm91c2VsQXJyb3cnKS5yZW1vdmUoKTsgLy8gUmVtb3ZlIGFycm93c1xufTtcblxuLypcbiAqIE9uIG9yaWVudGF0aW9uIGNoYW5nZSwgZW5zdXJlIGNhcm91c2VsIGhhcyBubyBmdW5jdGlvbmFsaXR5XG4gKi9cbmNvbnN0IHBlcnNpc3RSZW1vdmFsT2ZDYXJvdXNlbEZ1bmN0aW9uYWxpdHkgPSBmdW5jdGlvbiAoKSB7XG4gICAgd2luZG93Lm9ub3JpZW50YXRpb25jaGFuZ2UgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICQoJy5jYXJvdXNlbC5sb2FkZWQnKS5lYWNoKChpbmRleCwgZWwpID0+XG4gICAgICAgICAgICAkKGVsKS5jaGlsZHJlbigpLmxhc3QoKS5oaWRlKClcbiAgICAgICAgKTtcbiAgICB9O1xufTtcblxuLypcbiAqIERpc3BsYXkgdGl0bGVzIHdpdGhvdXQgYSBjYXJvdXNlbCBuIG9sZCBBbmRyb2lkICg8IHYuIDMuMCkgZGV2aWNlc1xuICogQHBhcmFtIGRldmljZSAtIEJvd3NlciBvYmplY3RcbiAqL1xuY29uc3QgcmVtb3ZlQ2Fyb3VzZWxGdW5jdGlvbkZvck9sZEFuZHJvaWQgPSBmdW5jdGlvbiAoZGV2aWNlKSB7XG4gICAgY29uc3Qgc2VtdmVyID0gcmVxdWlyZSgnc2VtdmVyJyk7XG4gICAgbGV0IHRoaXNWZXJzaW9uID0gc2VtdmVyLmNvZXJjZShkZXZpY2Uub3N2ZXJzaW9uKTtcbiAgICBjb25zdCBpczJnZW5LaW5kbGUgPVxuICAgICAgICBkZXZpY2UuYW5kcm9pZCAmJlxuICAgICAgICBzZW12ZXIuc2F0aXNmaWVzKHRoaXNWZXJzaW9uLCAnPj00LjAuMycpICYmXG4gICAgICAgICEhd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0tGVFQvKTtcbiAgICBjb25zdCBpc09sZEFuZHJvaWQgPSBkZXZpY2UuYW5kcm9pZCAmJiBwYXJzZUludChkZXZpY2Uub3N2ZXJzaW9uLCAxMCkgPCAzO1xuXG4gICAgaWYgKGlzMmdlbktpbmRsZSB8fCBpc09sZEFuZHJvaWQpIHtcbiAgICAgICAgcmVtb3ZlQ2Fyb3VzZWxGdW5jdGlvbmFsaXR5KCk7XG4gICAgICAgIHBlcnNpc3RSZW1vdmFsT2ZDYXJvdXNlbEZ1bmN0aW9uYWxpdHkoKTtcbiAgICB9XG59O1xuXG5leHBvcnQgeyByZW1vdmVDYXJvdXNlbEZ1bmN0aW9uRm9yT2xkQW5kcm9pZCB9O1xuIiwiY29uc3QgYWRkRGF5cyA9IGZ1bmN0aW9uKGRheXMpIHtcbiAgICBjb25zdCBkID0gbmV3IERhdGUoKTtcbiAgICBkLnNldFRpbWUoZC5nZXRUaW1lKCkgKyBkYXlzICogMjQgKiA2MCAqIDYwICogMTAwMCk7XG4gICAgcmV0dXJuIGQudG9JU09TdHJpbmcoKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGFkZERheXM7XG4iLCJpbXBvcnQgZXhwZW5zaXZlRG9tVHJhdmVyc2FsRm9yRHlzbGV4aWNQbGVhc2VEb05vdFVzZSBmcm9tICcuL2V4cGVuc2l2ZURvbVRyYXZlcnNhbEZvckR5c2xleGljUGxlYXNlRG9Ob3RVc2UuanMnO1xuXG4vKlxuICogRG8gdGhlIGV4cGVuc2l2ZSBET00gdHJhdmVyc2FsIGlmIGNvb2tpZSBzZXQuXG4gKi9cbmNvbnN0IGV4cGVuc2l2ZURvbVRyYXZlcnNhbEZvckR5c2xleGljSWZDb29raWVQbGVhc2VEb05vdFVzZSA9IGZ1bmN0aW9uKCkge1xuICAgIGlmICh3aW5kb3cuQ29va2llcyAmJiB3aW5kb3cuQ29va2llcy5nZXQoJ2R5c2xleGljLXNldHRpbmcnKSA9PT0gJzEnKSB7XG4gICAgICAgIGV4cGVuc2l2ZURvbVRyYXZlcnNhbEZvckR5c2xleGljUGxlYXNlRG9Ob3RVc2UoJ29wZW4tZHlzbGV4aWMnLCAtMSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZXhwZW5zaXZlRG9tVHJhdmVyc2FsRm9yRHlzbGV4aWNJZkNvb2tpZVBsZWFzZURvTm90VXNlO1xuIiwiY29uc3QgZXhwZW5zaXZlRG9tVHJhdmVyc2FsRm9yRHlzbGV4aWNQbGVhc2VEb05vdFVzZSA9IChmb250LCBmb250c2l6ZU9mZnNldCkgPT4ge1xuICAgICQoJzpub3QoXCJpXCIpOm5vdChcIi5tZW51LWljb25cIik6bm90KFwic3R5bGVcIik6bm90KFwic2NyaXB0XCIpOm5vdCguaWNvbi1zZWFyY2gtbmF2KScpLmVhY2goKGluZGV4LCBlbCkgPT4ge1xuICAgICAgICBlbC5zdHlsZS5zZXRQcm9wZXJ0eSgnZm9udC1mYW1pbHknLCBmb250LCAnaW1wb3J0YW50Jyk7XG4gICAgICAgIGNvbnN0ICRlbCA9ICQoZWwpO1xuICAgICAgICBpZiAoJGVsLmNoaWxkcmVuKCkubGVuZ3RoID09PSAwIHx8ICgkZWwuY2hpbGRyZW4oKS5sZW5ndGggPT09IDEgJiYgJGVsLmNoaWxkcmVuKCdpJykubGVuZ3RoID49IDEpKSB7XG4gICAgICAgICAgICBjb25zdCBmb250c2l6ZSA9IHBhcnNlSW50KCRlbC5jc3MoJ2ZvbnQtc2l6ZScpLCAxMCk7XG4gICAgICAgICAgICAkZWwuY3NzKCdmb250LXNpemUnLCBgJHtmb250c2l6ZSArIGZvbnRzaXplT2Zmc2V0fXB4YCk7XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGV4cGVuc2l2ZURvbVRyYXZlcnNhbEZvckR5c2xleGljUGxlYXNlRG9Ob3RVc2U7XG4iLCIvKlxuICogRW5jb2RlIGEgc3RyaW5nXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyIFN0cmluZyB0byBiZSBlbmNvZGVkXG4gKiBAcmV0dXJucyB7c3RyaW5nfVxuICovXG5jb25zdCByZmMzOTg2RW5jb2RlVVJJQ29tcG9uZW50ID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgcmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChzdHIpLnJlcGxhY2UoL1smIScoKSpdL2csIGVzY2FwZSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZmMzOTg2RW5jb2RlVVJJQ29tcG9uZW50O1xuIiwiLypcbiAqIEBwYXJhbSBmb3JtYXRzXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZm9ybWF0IElEIG9yIG51bGxcbiAqL1xuY29uc3QgZmluZEZvcm1hdElkID0gZnVuY3Rpb24oZm9ybWF0cykge1xuICAgIGlmIChmb3JtYXRzICE9IG51bGwpIHtcbiAgICAgICAgZm9yIChsZXQgeCA9IDA7IHggPCBmb3JtYXRzLmxlbmd0aDsgeCsrKSB7XG4gICAgICAgICAgICBjb25zdCB2YWwgPSBmb3JtYXRzW3hdO1xuICAgICAgICAgICAgaWYgKHZhbC5pZCA9PT0gJ2Vib29rLWVwdWItYWRvYmUnXG4gICAgICAgICAgICAgICAgICAgIHx8IHZhbC5pZCA9PT0gJ2Vib29rLWVwdWItb3BlbidcbiAgICAgICAgICAgICAgICAgICAgfHwgdmFsLmlkID09PSAnYXVkaW9ib29rLW1wMydcbiAgICAgICAgICAgICAgICAgICAgfHwgdmFsLmlkID09PSAndmlkZW8tc3RyZWFtaW5nJykge1xuICAgICAgICAgICAgICAgIHJldHVybiB2YWwuaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIG51bGw7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBmaW5kRm9ybWF0SWQ7XG4iLCJjb25zdCBrZXlzID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgVEFCOiA5LFxuICAgIEVOVEVSOiAxMyxcbiAgICBMRUZUOiAzNyxcbiAgICBVUDogMzgsXG4gICAgUklHSFQ6IDM5LFxuICAgIERPV046IDQwLFxuICAgIFNQQUNFOiAzMixcbiAgICBFU0M6IDI3XG59KTtcbmV4cG9ydCBkZWZhdWx0IGtleXM7XG4iLCJjb25zdCB7IF8gfSA9IHdpbmRvdztcblxuY29uc3QgbG9nZ2VyID0ge1xuICAgIGxvZyhsZXZlbCwgbWVzc2FnZSwgZmllbGRzKSB7XG4gICAgICAgIGNvbnN0IGJvZHkgPSB7XG4gICAgICAgICAgICBsZXZlbDogbGV2ZWwgfHwgJ2luZm8nLFxuICAgICAgICAgICAgbWVzc2FnZTogbWVzc2FnZSB8fCAnTm8gbWVzc2FnZSBzcGVjaWZpZWQnLFxuICAgICAgICAgICAgZmllbGRzOiB7XG4gICAgICAgICAgICAgICAgcGF0aDogd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKGxldmVsID09PSAnZXJyb3InKSB7XG4gICAgICAgICAgICBib2R5LmZpZWxkcy5zdGFja1RyYWNlID0gbmV3IEVycm9yKCkuc3RhY2s7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIV8oZmllbGRzKS5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oYm9keS5maWVsZHMsIGZpZWxkcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBUT0RPOiByZW1vdmUgTEhUTkctMjU5OCB0ZXN0IGNvZGVcbiAgICAgICAgY29uc29sZS5sb2coYm9keSk7XG5cbiAgICAgICAgY29uc3QgcmVxdWVzdERhdGEgPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgICAgICBsZXQgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICByZXF1ZXN0Lm9wZW4oJ1BPU1QnLCAnL2xvZycsIHRydWUpO1xuICAgICAgICByZXF1ZXN0LnNldFJlcXVlc3RIZWFkZXIoJ0NvbnRlbnQtVHlwZScsICdhcHBsaWNhdGlvbi9qc29uJyk7XG4gICAgICAgIHJlcXVlc3Quc2VuZChyZXF1ZXN0RGF0YSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgT2JqZWN0LmZyZWV6ZShsb2dnZXIpO1xuIiwiY29uc3Qgbm9DYXJkID0gZnVuY3Rpb24oYWN0aW9uLCBtZWRpYUlkLCBzdHViKSB7XG4gICAgLy8gVE9ETzogVGhpcyBsb2dpYyBpcyBjb21wbGV0ZWx5IGJ1Z2d5IGFuZCB3cm9uZ1xuICAgIGNvbnN0IGZvcndhcmRVcmwgPSBzdHViLnJlcGxhY2UoZW5jb2RlVVJJQ29tcG9uZW50KCc/bm8tbGlua2VkLWNhcmQ9dHJ1ZScpLCAnJykucmVwbGFjZSgvKCZ8XFw/KW5vLWxpbmtlZC1jYXJkKD10cnVlfFxcPWZhbHNlKS8sICcnKTtcbiAgICBjb25zdCBjYXJkTGlua1VybCA9IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5hY2NvdW50U3RhcnRDYXJkTGluaywge2ZvcndhcmQ6IGZvcndhcmRVcmwsIGFjdGlvbjogW2FjdGlvbiwgbWVkaWFJZF0uam9pbignficpfSk7XG4gICAgJCgnI2FkZC1jYXJkLWJ1dHRvbicpLmF0dHIoJ2hyZWYnLCBjYXJkTGlua1VybCk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBub0NhcmQ7XG4iLCJjb25zdCBtYW5kYXRvcnkgPSAoKSA9PiB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHBhcmFtZXRlcicpO1xufTtcblxuZXhwb3J0IHtcbiAgICBtYW5kYXRvcnlcbn07XG4iLCJpbXBvcnQgcXVlcnlzdHJpbmcgZnJvbSAncXVlcnlzdHJpbmcnO1xuXG5jb25zdCByZW1vdmVRdWVyeVBhcmFtID0gKHFzLCBwYXJhbSkgPT4ge1xuICAgIGxldCBuZXdxcyA9IHFzLnRvTG93ZXJDYXNlKCk7XG4gICAgaWYgKHFzWzBdID09PSAnPycpIHtcbiAgICAgICAgbmV3cXMgPSBxcy5zdWJzdHIoMSk7IC8vIFJlbW92ZSBzdGFydGluZyAnPydcbiAgICB9XG4gICAgY29uc3QgcXVlcnlPYmogPSBxdWVyeXN0cmluZy5wYXJzZShuZXdxcyk7XG4gICAgZGVsZXRlIHF1ZXJ5T2JqW3BhcmFtXTtcbiAgICByZXR1cm4gYD8ke3F1ZXJ5c3RyaW5nLnN0cmluZ2lmeShxdWVyeU9iail9YDsgLy8gUmVhcHBlbmQgJz8nXG59O1xuXG5leHBvcnQge1xuICAgIHJlbW92ZVF1ZXJ5UGFyYW1cbn07XG4iLCJleHBvcnQgZGVmYXVsdCBmdW5jdGlvbihyZXF1ZXN0Rm4pIHtcbiAgICBjb25zdCBoZWFkZXJzID0gJC5hamF4U2V0dGluZ3MuaGVhZGVycztcbiAgICBkZWxldGUgJC5hamF4U2V0dGluZ3MuaGVhZGVycztcbiAgICBjb25zdCBwcm9taXNlID0gcmVxdWVzdEZuKCk7XG4gICAgJC5hamF4U2V0dGluZ3MuaGVhZGVycyA9IGhlYWRlcnM7XG4gICAgcmV0dXJuIHByb21pc2U7XG59XG4iLCJpbXBvcnQgcm91dGluZyBmcm9tICcuLi8uLi8uLi9saWIvaW50ZXJuYWwvcm91dGluZy5qcyc7XG5cbmNvbnN0IHJvdXRlcyA9IHJvdXRpbmcucm91dGVzO1xuXG5jb25zdCB1cmwgPSBmdW5jdGlvbihyb3V0ZSwgcGFyYW1ldGVycykge1xuICAgIGNvbnN0IHJlc3VsdCA9IHJvdXRpbmcuZ2V0Um91dGVVcmwoe2Jhc2VVcmw6IHdpbmRvdy5PdmVyRHJpdmUuX2Jhc2VVcmx9LCByb3V0ZSwgcGFyYW1ldGVycyk7XG5cbiAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBgRmFpbGVkIHRvIHJvdXRlICR7cm91dGV9YDtcbiAgICAgICAgICAgIGlmIChwYXJhbWV0ZXJzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbWV0ZXJzSlNPTiA9IEpTT04uc3RyaW5naWZ5KHBhcmFtZXRlcnMpO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UgKz0gYCB3aXRoIHBhcmFtZXRlcnMgJHtwYXJhbWV0ZXJzSlNPTn1gO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb25zdCBlcnJvciA9IG5ldyBFcnJvcihtZXNzYWdlKTtcblxuICAgICAgICAgICAgaWYgKHdpbmRvdy5OUkVVTSAmJiB3aW5kb3cuTlJFVU0ubm90aWNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuTlJFVU0ubm90aWNlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh3aW5kb3cuY29uc29sZSAmJiB3aW5kb3cuY29uc29sZS5lcnJvcikge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5jb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gwq9cXF8o44OEKV8vwq9cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcblxuZXhwb3J0IHtcbiAgICB1cmwsXG4gICAgcm91dGVzXG59O1xuIiwiaW1wb3J0IHsgdG9TdGF0aWNVcmwgfSBmcm9tICcuLi8uLi8uLi9saWIvYXNzZXRNYXBwZXInO1xuXG4vLyBMSFRORy0xODE3IC0gRHluYW1pYyBTVkcgTG9hZGVyXG5leHBvcnQgZGVmYXVsdCAoKSA9PiB7XG4gICAgJCgoKSA9PiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkZWxldGUgJC5hamF4U2V0dGluZ3MuaGVhZGVyc1snY3NyZi10b2tlbiddO1xuXG4gICAgICAgICAgICAkKCcuc3ZnLmR5bmFtaWMtbG9hZGVyJykuZWFjaCgoaSwgZWwpID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgJGVsbSA9ICQoZWwpO1xuICAgICAgICAgICAgICAgIGxldCBzcmMgPSAkZWxtLmF0dHIoJ2RhdGEtc3JjJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIV8oc3JjKS5pc0VtcHR5KCkgJiYgISRlbG0uaHRtbCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICQuZ2V0KHRvU3RhdGljVXJsKGBpbWcvJHtzcmN9YCkpLnRoZW4oKHJlc3BvbnNlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRlbG0uaHRtbCgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJGVsbS5hcHBlbmQoJCgnc3ZnJywgcmVzcG9uc2UpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICAkLmFqYXhTZXR1cCh7XG4gICAgICAgICAgICAgICAgaGVhZGVyczogeydjc3JmLXRva2VuJzogJCgnI2NzcmYnKS52YWwoKSB8fCBPdmVyRHJpdmUuX2NzcmZ9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xufTtcbiIsImltcG9ydCB7IG1hbmRhdG9yeSB9IGZyb20gJy4vcGFyYW1ldGVycyc7XG5cbmNvbnN0IGNyZWF0ZU9wZW5pbmdUYWcgPSAodGFnKSA9PiBgPCR7dGFnfT5gO1xuXG5jb25zdCBjcmVhdGVDbG9zaW5nVGFnID0gKHRhZykgPT4gYDwvJHt0YWd9PmA7XG5cbmNvbnN0IGRlY29kZUVudGl0aWVzID0gKGVuY29kZWRTdHJpbmcpID0+IHtcbiAgICBjb25zdCB0ZXh0QXJlYSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3RleHRhcmVhJyk7XG4gICAgdGV4dEFyZWEuaW5uZXJIVE1MID0gZW5jb2RlZFN0cmluZztcbiAgICByZXR1cm4gdGV4dEFyZWEudmFsdWU7XG59O1xuXG5jb25zdCBzcGVjaWFsQ2hhciA9IFtcbiAgICAncycsXG4gICAgJywnLFxuICAgICcuJyxcbiAgICAnKycsXG4gICAgJy0nLFxuICAgICcgJyxcbiAgICAnKCcsXG4gICAgJyknLFxuICAgICd8JyxcbiAgICAneycsXG4gICAgJ30nLFxuICAgICdbJyxcbiAgICAnXScsXG4gICAgJz8nLFxuICAgICcqJyxcbl07XG5cbmNvbnN0IGdldENsZWFuTWF0Y2hlciA9IChtYXRjaGVyKSA9PiB7XG4gICAgbGV0IGNsZWFuTWF0Y2hlciA9IG1hdGNoZXI7XG4gICAgc3BlY2lhbENoYXIuZm9yRWFjaCgoc2MpID0+IHtcbiAgICAgICAgY29uc3QgcGF0dGVybiA9IG5ldyBSZWdFeHAoYFxcXFwke3NjfWAsICdnJyk7XG4gICAgICAgIGNsZWFuTWF0Y2hlciA9IGNsZWFuTWF0Y2hlci5yZXBsYWNlKHBhdHRlcm4sICcnKTtcbiAgICB9KTtcbiAgICByZXR1cm4gY2xlYW5NYXRjaGVyO1xufTtcblxuY29uc3QgZ2V0TWF0Y2hTcGVjaWFsQ2hhclN0cmluZyA9ICgpID0+IHtcbiAgICBsZXQgc3BlY2lhbENoYXJMaXN0ID0gJyc7XG4gICAgc3BlY2lhbENoYXIuZm9yRWFjaCgoc2MpID0+IHtcbiAgICAgICAgaWYgKHNwZWNpYWxDaGFyTGlzdCA9PT0gJycpIHtcbiAgICAgICAgICAgIHNwZWNpYWxDaGFyTGlzdCA9IGBcXFxcJHtzY31gO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc3BlY2lhbENoYXJMaXN0ID0gYCR7c3BlY2lhbENoYXJMaXN0fXxcXFxcJHtzY31gO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGAoJHtzcGVjaWFsQ2hhckxpc3R9KSpgO1xufTtcblxuY29uc3Qgc3Vycm91bmRTdWJ0ZXh0ID0gKHtcbiAgICB0ZXh0ID0gbWFuZGF0b3J5KCksXG4gICAgbWF0Y2hlciA9IG1hbmRhdG9yeSgpLFxuICAgIHRhZyA9IG1hbmRhdG9yeSgpLFxuICAgIGlnbm9yZUNhc2UgPSBmYWxzZSxcbiAgICBnbG9iYWwgPSBmYWxzZSxcbn0pID0+IHtcbiAgICAvLyBNYWtlcyB1c2VycyBpbnB1dCBvZiBzcGVjaWFsIGNoYXJhY3RlcnMgYmUgZGlzcmVnYXJkXG4gICAgY29uc3QgY2xlYW5NYXRjaGVyID0gZ2V0Q2xlYW5NYXRjaGVyKG1hdGNoZXIpO1xuICAgIC8vIE1ha2VzIHVzZXJzIGlucHV0IG1hdGNoIHRob3NlIHdpdGggc3BlY2lhbCBjaGFyYWN0ZXJzXG4gICAgY29uc3QgcGF0dGVybiA9IGAoJHtjbGVhbk1hdGNoZXJcbiAgICAgICAgLnNwbGl0KCcnKVxuICAgICAgICAuam9pbihnZXRNYXRjaFNwZWNpYWxDaGFyU3RyaW5nKCkpfSlgO1xuICAgIGNvbnN0IGZsYWdzID0gYCR7aWdub3JlQ2FzZSA/ICdpJyA6ICcnfSR7Z2xvYmFsID8gJ2cnIDogJyd9YDtcbiAgICBjb25zdCByZWdleHAgPSBuZXcgUmVnRXhwKHBhdHRlcm4sIGZsYWdzKTtcbiAgICBjb25zdCBuZXdTdWJzdHJpbmcgPSBgJHtjcmVhdGVPcGVuaW5nVGFnKHRhZyl9JDEke2NyZWF0ZUNsb3NpbmdUYWcodGFnKX1gO1xuICAgIHJldHVybiB0ZXh0LnJlcGxhY2UocmVnZXhwLCBuZXdTdWJzdHJpbmcpO1xufTtcblxuY29uc3QgY3JlYXRlUmVnZXggPSAoe1xuICAgIHRleHQgPSBtYW5kYXRvcnkoKSxcbiAgICBpZ25vcmVDYXNlID0gZmFsc2UsXG4gICAgZ2xvYmFsID0gZmFsc2UsXG4gICAgaWdub3JlV2hpdGVzcGFjZSA9IGZhbHNlLFxufSkgPT4ge1xuICAgIGNvbnN0IHBhdHRlcm4gPSBpZ25vcmVXaGl0ZXNwYWNlXG4gICAgICAgID8gYCgke3RleHQuc3BsaXQoJycpLmpvaW4oJyhcXFxcc3xcXFxcbikqJyl9KWBcbiAgICAgICAgOiB0ZXh0O1xuICAgIGNvbnN0IGZsYWdzID0gYCR7aWdub3JlQ2FzZSA/ICdpJyA6ICcnfSR7Z2xvYmFsID8gJ2cnIDogJyd9YDtcbiAgICBjb25zdCByZWdleHAgPSBuZXcgUmVnRXhwKHBhdHRlcm4sIGZsYWdzKTtcbiAgICByZXR1cm4gcmVnZXhwO1xufTtcblxuZXhwb3J0IHtcbiAgICBjcmVhdGVPcGVuaW5nVGFnLFxuICAgIGNyZWF0ZUNsb3NpbmdUYWcsXG4gICAgZGVjb2RlRW50aXRpZXMsXG4gICAgc3Vycm91bmRTdWJ0ZXh0LFxuICAgIGNyZWF0ZVJlZ2V4LFxufTtcbiIsImNvbnN0IGZpbGxTdGFycyA9IGZ1bmN0aW9uKCRjb250YWluZXIsIHN0YXJzLCBvcHRpb25zKSB7XG4gICAgc3RhcnMgPSBzdGFycyB8fCAwO1xuICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgIGxldCBjaGlsZHJlbiA9ICRjb250YWluZXIuY2hpbGRyZW4oJy5pY29uLXN0YXInKTtcblxuICAgIGNoaWxkcmVuLnJlbW92ZUNsYXNzKCdmaWxsZWQnKTtcbiAgICBpZiAoIW9wdGlvbnMuaXNIb3ZlcikgeyAvLyBJZiB0aGUgdXNlciBpcyBhY3R1YWxseSBzZXR0aW5nIHRoZSByYXRpbmdcbiAgICAgICAgY2hpbGRyZW4uZWFjaCgoaSwgZWwpID0+IHtcbiAgICAgICAgICAgIGxldCByYXRpbmdDb3B5ID0gd2luZG93Lmh0bWwoJ3N0YXJSYXRpbmcudW5yYXRlZExhYmVsJywge251bWJlcjogaSArIDEsIGN1cnJlbnRSYXRpbmc6IHN0YXJzfSk7XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5zZXRSYXRpbmcpIHtcbiAgICAgICAgICAgICAgICByYXRpbmdDb3B5ID0gd2luZG93Lmh0bWwoJ3N0YXJSYXRpbmcucmF0ZWRMYWJlbExvbmcnLCB7bnVtYmVyOiBpICsgMSwgY3VycmVudFJhdGluZzogc3RhcnN9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICQoZWwpLmF0dHIoJ2FyaWEtbGFiZWwnLCByYXRpbmdDb3B5KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgY2hpbGRyZW4gPSBjaGlsZHJlbi5maWx0ZXIoKGkpID0+IChpICsgMSkgPD0gTWF0aC5yb3VuZChzdGFycykpXG4gICAgLmFkZENsYXNzKCdmaWxsZWQnKTtcblxuICAgIGlmIChvcHRpb25zLnNldFJhdGluZykge1xuICAgICAgICBjaGlsZHJlblxuICAgICAgICAgICAgLmxhc3QoKVxuICAgICAgICAgICAgLmF0dHIoJ2FyaWEtbGFiZWwnLCB3aW5kb3cuaHRtbCgnc3RhclJhdGluZy5yZW1vdmVSYXRpbmcnLCB7c3RhcnN9KSk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgZmlsbFN0YXJzO1xuIiwiaW1wb3J0IHtodG1sfSBmcm9tICcuLi8uLi8uLi8uLi9saWIvaTE4bi9icm93c2VyJztcbmltcG9ydCB7dG9TdGF0aWNVcmx9IGZyb20gJy4uLy4uLy4uLy4uL2xpYi9hc3NldE1hcHBlcic7XG5cbmNvbnN0IGhhbmRsZUZvcndhcmRBY3Rpb25Ib2xkID0gZnVuY3Rpb24oZGF0YSwgdGl0bGVJZCkge1xuICAgICQud2hlbihhamF4LmdldFBhdHJvbkVtYWlsKCkpLmRvbmUoKGVtYWlsUmVzcCkgPT4ge1xuICAgICAgICBpZiAoZW1haWxSZXNwID09PSAnJykge1xuICAgICAgICAgICAgY29uc3QgdGl0bGUgPSBkYXRhLnRpdGxlO1xuICAgICAgICAgICAgY29uc3QgdHlwZUlkID0gZGF0YS50eXBlLmlkO1xuICAgICAgICAgICAgY29uc3QgdHlwZU5hbWUgPSBkYXRhLnR5cGUubmFtZTtcbiAgICAgICAgICAgIGNvbnN0IGFydHdvcmsgPSBkYXRhLmNvdmVycy5jb3ZlcjMwMFdpZGUuaHJlZiA9PSBudWxsID8gdG9TdGF0aWNVcmwoJ2ltZy9uby1jb3Zlcl9lbl9VUy5qcGcnKSA6IGRhdGEuY292ZXJzLmNvdmVyMzAwV2lkZS5ocmVmO1xuICAgICAgICAgICAgY29uc3QgcHJlcmVsZWFzZURhdGUgPSBodG1sKCdkYXRlLWZ1bGwnLCB7ZDogZGF0YS5lc3RpbWF0ZWRSZWxlYXNlRGF0ZX0pO1xuICAgICAgICAgICAgY29uc3QgaXNQcmVyZWxlYXNlID0gZGF0YS5pc1ByZVJlbGVhc2VUaXRsZTtcbiAgICAgICAgICAgIGNvbnN0IG1lZGlhSWQgPSB0aXRsZUlkO1xuXG4gICAgICAgICAgICBjb25zdCBtb2RhbCA9ICQoJyNob2xkLWR5bmFtaWMtbW9kYWwnKTtcbiAgICAgICAgICAgICQoJ1tkYXRhLWlkPVwidGl0bGVcIl0nKS5odG1sKHRpdGxlKTtcbiAgICAgICAgICAgICQoJ1tkYXRhLWlkPVwiZm9ybWF0LWljb25cIl0nKS5yZW1vdmVDbGFzcygpLmFkZENsYXNzKGBpY29uLSR7dHlwZUlkfWApO1xuICAgICAgICAgICAgJCgnW2RhdGEtaWQ9XCJmb3JtYXQtbmFtZVwiXScpLmh0bWwodHlwZU5hbWUpO1xuICAgICAgICAgICAgJCgnW2RhdGEtaWQ9XCJjb3Zlci1pbWFnZVwiXScpLmF0dHIoJ3NyYycsIGFydHdvcmspO1xuICAgICAgICAgICAgaWYgKHByZXJlbGVhc2VEYXRlICE9IG51bGwgJiYgaXNQcmVyZWxlYXNlKSB7XG4gICAgICAgICAgICAgICAgJCgnW2RhdGEtaWQ9XCJwcmUtcmVsZWFzZS1sYWJlbFwiXScpLnRleHQod2luZG93LnRleHQoJ2FjY291bnRIb2xkcy5wcmVyZWxlYXNlRXhwZWN0ZWQnLCB7ZGF0ZTogcHJlcmVsZWFzZURhdGV9KSkucmVtb3ZlQ2xhc3MoJ2hpZGVNZScpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAkKCdbZGF0YS1pZD1cInByZS1yZWxlYXNlLWxhYmVsXCJdJykudGV4dCgnJykuYWRkQ2xhc3MoJ2hpZGVNZScpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAkKCdmb3JtI2hvbGQtZHluYW1pYy1mb3JtJykuYXR0cih7J2RhdGEtbWVkaWEtaWQnOiBtZWRpYUlkLCAnZGF0YS1mcm9tLWFqYXgnOiAndHJ1ZSd9KTtcblxuICAgICAgICAgICAgLy8gRGlzbmV5IHB1Ymxpc2hlciBpZHMgYXJlIDk4MTQ2IC0gOTgxNTVcbiAgICAgICAgICAgIGlmIChkYXRhLnB1Ymxpc2hlci5pZCA+PSA5ODE0NiAmJiBkYXRhLnB1Ymxpc2hlci5pZCA8PSA5ODE1NSAmJiBDb29raWVzLmdldCgnZGlzbmV5LWV1bGEtc2V0dGluZycpICE9PSAnMScpIHtcbiAgICAgICAgICAgICAgICAkKCcjZGlzbmV5LWV1bGEtbW9kYWwnKS5mb3VuZGF0aW9uKCdyZXZlYWwnLCAnb3BlbicpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtb2RhbC5mb3VuZGF0aW9uKCdyZXZlYWwnLCAnb3BlbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYWpheC5wbGFjZUhvbGQodGl0bGVJZCwgZW1haWxSZXNwLCAkKCdib2R5JykpO1xuICAgICAgICB9XG4gICAgfSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBoYW5kbGVGb3J3YXJkQWN0aW9uSG9sZDtcbiIsIi8qXG4gKiBIYW5kbGUgb3BlbmluZyB0aGUgaG9sZCBjb25mbGljdCBtb2RhbFxuICovXG5jb25zdCBvcGVuSG9sZENvbmZsaWN0TW9kYWwgPSBmdW5jdGlvbihtZWRpYURhdGEpIHtcbiAgICBjb25zdCBvcmlnaW5hbEhUTUxDb250ZW50cyA9ICQoYC5wcmltYXJ5LWFjdGlvbltkYXRhLW1lZGlhLWlkPVwiJHttZWRpYURhdGEuaWR9XCJdYCkuaHRtbCgpO1xuXG4gICAgJCgnLm1vZGFsJykuZm91bmRhdGlvbigncmV2ZWFsJywgJ2Nsb3NlJyk7XG5cbiAgICBjb25zdCBkYXRhVHlwZSA9IG1lZGlhRGF0YS50eXBlSWQ7XG4gICAgY29uc3QgaG9sZEJ1dHRvbiA9ICQoJy5ub3ctdW5hdmFpbGFibGUtYnV0dG9uLWNvbnRhaW5lciBhOm5vdChbZGF0YS1jYW5jZWxdKScpO1xuXG4gICAgJChgLnByaW1hcnktYWN0aW9uW2RhdGEtaWQ9XCIke21lZGlhRGF0YS5pZH1cIl1gKS5odG1sKG9yaWdpbmFsSFRNTENvbnRlbnRzKTtcbiAgICAkKCdbZGF0YS1pZD1cInRpdGxlXCJdJykuaHRtbChtZWRpYURhdGEudGl0bGUpO1xuICAgICQoJ1tkYXRhLWlkPVwiY292ZXItaW1hZ2VcIl0nKS5hdHRyKCdzcmMnLCBtZWRpYURhdGEuY292ZXIpO1xuXG4gICAgaG9sZEJ1dHRvbi5hdHRyKCdkYXRhLXRpdGxlJywgbWVkaWFEYXRhLnRpdGxlKS5hdHRyKCdkYXRhLWFydHdvcmsnLCBtZWRpYURhdGEuY292ZXIpXG4gICAgICAgIC5hdHRyKCdkYXRhLXR5cGUnLCBkYXRhVHlwZSkuYXR0cignZGF0YS10eXBlLW5hbWUnLCBkYXRhVHlwZS50b1VwcGVyQ2FzZSgpKS5hdHRyKCdkYXRhLXByZS1yZWxlYXNlJywgbWVkaWFEYXRhLnByZXJlbGVhc2UpO1xuXG4gICAgbG9hZGluZy5jaGFuZ2VCdXR0b25TdGF0ZShob2xkQnV0dG9uLCAnaG9sZCcpO1xuXG4gICAgaG9sZEJ1dHRvbi5hdHRyKCdkYXRhLW1lZGlhLWlkJywgbWVkaWFEYXRhLmlkKS5hdHRyKCdocmVmJywgJ2phdmFzY3JpcHQ6dm9pZCgwKScpLmF0dHIoJ2RhdGEtYWN0aW9uJywgJ2hvbGQnKTtcbiAgICAkKCcjbm93LXVuYXZhaWxhYmxlLW1vZGFsJykuZm91bmRhdGlvbigncmV2ZWFsJywgJ29wZW4nKTtcbn07XG5cblxuZXhwb3J0IGRlZmF1bHQgb3BlbkhvbGRDb25mbGljdE1vZGFsO1xuIiwiaW1wb3J0IEhhc2hNYW5hZ2VyIGZyb20gJy4uLy4uL2NvbXBvbmVudHMvY29tbW9uL0hhc2hNYW5hZ2VyJztcbmltcG9ydCBUaXRsZSBmcm9tICcuLi8uLi9jb21wb25lbnRzL21lZGlhL21vZGVscy9UaXRsZSc7XG5pbXBvcnQgVGl0bGVBY3Rpb25zIGZyb20gJy4uLy4uL3RpdGxlLWFjdGlvbnMvVGl0bGVBY3Rpb25zJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgUHJvY2Vzc0ZvcndhcmRlZEFjdGlvbiB7XG4gICAgY29uc3RydWN0b3IoY29sbGVjdGlvbiwgYnVzLCBtb2RlbCkge1xuICAgICAgICBsZXQgaGFzaCA9IEhhc2hNYW5hZ2VyLmdldCgnYWN0aW9uJylbMF07XG4gICAgICAgIHRoaXMuYWN0aW9uQXJyID0gaGFzaCA/IGhhc2guc3BsaXQoJ34nKSA6IFtdO1xuICAgICAgICB0aGlzLmFjdGlvbiA9IHRoaXMuYWN0aW9uQXJyWzBdIHx8IG51bGw7XG4gICAgICAgIHRoaXMubWVkaWFJZCA9IHRoaXMuYWN0aW9uQXJyWzFdIHx8IG51bGw7XG4gICAgICAgIHRoaXMucmF0aW5nID0gdGhpcy5hY3Rpb25BcnJbMl0gfHwgMDtcbiAgICAgICAgdGhpcy5tb2RlbCA9IG1vZGVsIHx8IG51bGw7XG4gICAgICAgIHRoaXMuY29sbGVjdGlvbiA9IGNvbGxlY3Rpb24ubW9kZWxzO1xuICAgICAgICB0aGlzLmJ1cyA9IGJ1cztcbiAgICB9XG5cbiAgICAvLyBFeGVjdXRlIHVzZXIgZm9yd2FyZGVkIGFjdGlvblxuICAgIGV4ZWN1dGVBY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5hY3Rpb24gfHwgIXRoaXMubWVkaWFJZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIXRoaXMubW9kZWwgfHxcbiAgICAgICAgICAgICh0aGlzLm1vZGVsICYmIHRoaXMubW9kZWwuZ2V0KCdpZCcpICE9PSB0aGlzLm1lZGlhSWQpXG4gICAgICAgICkge1xuICAgICAgICAgICAgdGhpcy5tb2RlbCA9IF8uZmluZChcbiAgICAgICAgICAgICAgICB0aGlzLmNvbGxlY3Rpb24sXG4gICAgICAgICAgICAgICAgKG1vZGVsKSA9PiBtb2RlbC5pZCA9PT0gdGhpcy5tZWRpYUlkXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHRpdGxlQWN0aW9ucyA9IG5ldyBUaXRsZUFjdGlvbnMoeyBidXM6IHRoaXMuYnVzIH0pO1xuXG4gICAgICAgIGlmICh0aGlzLm1vZGVsKSB7XG4gICAgICAgICAgICAvLyBUaXRsZSBtb2RlbCBpcyBvbiBwYWdlXG4gICAgICAgICAgICBIYXNoTWFuYWdlci5yZW1vdmUoJ2FjdGlvbicpO1xuICAgICAgICAgICAgdGhpcy5tb2RlbC5zZXQoJ3VzZXJTdGFyUmF0aW5nJywgdGhpcy5yYXRpbmcpO1xuICAgICAgICAgICAgdGl0bGVBY3Rpb25zLnBlcmZvcm0odGhpcy5hY3Rpb24sIHRoaXMubW9kZWwpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gVGl0bGUgbW9kZWwgaXMgbm90IG9uIHBhZ2UsIGZldGNoIGFzeW5jXG4gICAgICAgICAgICBsZXQgdGl0bGUgPSBuZXcgVGl0bGUoKTtcbiAgICAgICAgICAgIGxldCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgICAgIHRpdGxlLmdldFRpdGxlQXN5bmModGhpcy5tZWRpYUlkLCByZXNvbHZlLCByZWplY3QpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHByb21pc2UudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RlbCAmJiB0aGlzLm1vZGVsLnNldCgndXNlclN0YXJSYXRpbmcnLCB0aGlzLnJhdGluZyk7XG4gICAgICAgICAgICAgICAgdGl0bGVBY3Rpb25zLnBlcmZvcm0odGhpcy5hY3Rpb24sIHRpdGxlKTtcbiAgICAgICAgICAgICAgICBIYXNoTWFuYWdlci5yZW1vdmUoJ2FjdGlvbicpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCJpbXBvcnQgZ2V0UXVlcnlQYXJhbXMgZnJvbSAnLi4vdXJsL2dldFF1ZXJ5UGFyYW1zLmpzJztcbmltcG9ydCB7IHJlbW92ZVF1ZXJ5UGFyYW0gfSBmcm9tICcuLi9xdWVyeS5qcyc7XG5pbXBvcnQgc2VsZWN0U3RhclJhdGluZyBmcm9tICcuL3NlbGVjdFN0YXJSYXRpbmcnO1xuaW1wb3J0IHsgaHRtbCB9IGZyb20gJy4uLy4uLy4uLy4uL2xpYi9pMThuL2Jyb3dzZXInO1xuY29uc3Qgb3BlbkhvbGRDb25mbGljdE1vZGFsID0gJy4vb3BlbkhvbGRDb25mbGljdE1vZGFsLmpzJztcbmNvbnN0IGhhbmRsZUZvcndhcmRBY3Rpb25Ib2xkID0gJy4vaGFuZGxlRm9yd2FyZEFjdGlvbkhvbGQuanMnO1xuXG5jb25zdCBwcm9jZXNzSW5zdGFudEZvcndhcmRBY3Rpb25zID0gZnVuY3Rpb24gKHN0dWIpIHtcbiAgICBjb25zdCB0aGVTdHViID1cbiAgICAgICAgc3R1YiB8fFxuICAgICAgICB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgK1xuICAgICAgICAgICAgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggPyB3aW5kb3cubG9jYXRpb24uc2VhcmNoIDogJycpO1xuICAgIGxldCBhY3Rpb24gPSBnZXRRdWVyeVBhcmFtcyh3aW5kb3cubG9jYXRpb24uc2VhcmNoKS5hY3Rpb247XG4gICAgY29uc3Qgb25jZSA9ICQoJ2JvZHknKS5hdHRyKCdkYXRhLWFjdGlvbi1wcm9jZXNzZWQnKTtcbiAgICBjb25zdCBxcyA9IHJlbW92ZVF1ZXJ5UGFyYW0od2luZG93LmxvY2F0aW9uLnNlYXJjaCwgJ2FjdGlvbicpO1xuXG4gICAgaWYgKFxuICAgICAgICBhY3Rpb24gJiZcbiAgICAgICAgIW9uY2UgJiZcbiAgICAgICAgYWN0aW9uLmluZGV4T2YoJ34nKSA+IC0xICYmXG4gICAgICAgICQoJ2JvZHknKS5hdHRyKCduby1saW5rZWQtY2FyZHMnKSA9PT0gJ2ZhbHNlJ1xuICAgICkge1xuICAgICAgICBoaXN0b3J5LnJlcGxhY2VTdGF0ZShudWxsLCBudWxsLCB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgKyBxcyk7XG5cbiAgICAgICAgYWN0aW9uID0gYWN0aW9uLnNwbGl0KCd+Jyk7XG4gICAgICAgIGNvbnN0IHRpdGxlSWQgPSBhY3Rpb25bMV07XG4gICAgICAgIGNvbnN0IGFjdGlvbkVsZW0gPSAkKFxuICAgICAgICAgICAgYFtkYXRhLWFjdGlvbj1cIndpc2hsaXN0LWFkZFwiXVtkYXRhLW1lZGlhLWlkPVwiJHt0aXRsZUlkfVwiXWBcbiAgICAgICAgKTtcbiAgICAgICAgY29uc3QgdGl0bGVFbGVtID0gJChgZGl2Lndpc2hsaXN0W2RhdGEtaWQ9XCIke3RpdGxlSWR9XCJdIGFgKTtcbiAgICAgICAgY29uc3QgcmF0aW5nID0gcGFyc2VJbnQoYWN0aW9uWzJdLCAxMCk7XG4gICAgICAgIGNvbnN0IGFjdGlvbkJ1dHRvbiA9ICQoXG4gICAgICAgICAgICBgW2RhdGEtYWN0aW9uXVtkYXRhLW1lZGlhLWlkPVwiJHt0aXRsZUlkfVwiXWBcbiAgICAgICAgKS5maXJzdCgpOyAvLyBBY3Rpb24gYnV0dG9uXG4gICAgICAgIGNvbnN0IHRpdGxlQ2FyZExpbmsgPSAkKFxuICAgICAgICAgICAgYGEucHJpbWFyeS1hY3Rpb25bZGF0YS1tZWRpYS1pZD1cIiR7dGl0bGVJZH1cIl0sIC5UaXRsZUFjdGlvbi1idXR0b25bZGF0YS1tZWRpYS1pZD1cIiR7dGl0bGVJZH1cIl1gXG4gICAgICAgICkuZmlyc3QoKTsgLy8gTGluayBvbiBib3R0b20gb2YgdGl0bGUgY2FyZFxuICAgICAgICBsZXQgZWxlbSA9IG51bGw7XG4gICAgICAgIGxldCBwb3NzaWJsZUFjdGlvbiA9ICcnOyAvLyB0aGUgYWN0aW9uIGN1cnJlbnRseSBhdHRhY2hlZCB0byB0aGUgYnV0dG9uXG5cbiAgICAgICAgc3dpdGNoIChhY3Rpb25bMF0pIHtcbiAgICAgICAgICAgIGNhc2UgJ3dpc2gnOlxuICAgICAgICAgICAgY2FzZSAnd2lzaGxpc3QtYWRkJzpcbiAgICAgICAgICAgIGNhc2UgJ3dpc2hsaXN0LXJlbW92ZSc6XG4gICAgICAgICAgICAgICAgLy8gSWYgYWxyZWFkeSBhZGRlZCBvdCB0aGUgd2lzaGxpc3QgYnJlYWsuXG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAkKFxuICAgICAgICAgICAgICAgICAgICAgICAgYFtkYXRhLWFjdGlvbj1cIndpc2hsaXN0LXJlbW92ZVwiXVtkYXRhLW1lZGlhLWlkPVwiJHt0aXRsZUlkfVwiXWBcbiAgICAgICAgICAgICAgICAgICAgKS5sZW5ndGggfHxcbiAgICAgICAgICAgICAgICAgICAgJChcbiAgICAgICAgICAgICAgICAgICAgICAgIGBkaXYud2lzaGxpc3RbZGF0YS1pZD1cIiR7dGl0bGVJZH1cIl0gaS5pY29uLXdpc2gtbGlzdC1hZGRlZGBcbiAgICAgICAgICAgICAgICAgICAgKS5sZW5ndGhcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gQ2hlY2sgaWYgaXRlbSBleGlzdHMgb24gcGFnZSBpZiBpdCBkb2VzOiBjbGljayBlbGVtZW50IGVsc2U6IHRha2UgYWN0aW9uIG1hbnVhbGx5LlxuICAgICAgICAgICAgICAgIGlmIChhY3Rpb25FbGVtLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBBY3Rpb24gYnV0dG9uIGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb25FbGVtLmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0aXRsZUVsZW0ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEdyaWQgLyBjYXJvdXNlbCBpdGVtIGV4aXN0c1xuICAgICAgICAgICAgICAgICAgICB0aXRsZUVsZW0uY2xpY2soKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBGYWxsYmFjazogZ2V0IG1lZGlhIGluZm9cbiAgICAgICAgICAgICAgICAgICAgYWpheC53aXNoTGlzdEFkZCh0aXRsZUlkLCAkKCdib2R5JykpO1xuICAgICAgICAgICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdXJsOiB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMubWVkaWFJbmZvSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogdGl0bGVJZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0dFVCcsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ3N0YXInOlxuICAgICAgICAgICAgICAgIC8vIE5lZWRzIHRvIGhhcHBlbiBsYXN0IGluIHRoZSBxdWV1ZSBhZnRlciBtZWRpYSBzdGF0dXNcbiAgICAgICAgICAgICAgICAkKCdib2R5Jykub24oJ3VzZXJTdGFyUmF0aW5nU2V0JywgKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBzZWxlY3RTdGFyUmF0aW5nKFxuICAgICAgICAgICAgICAgICAgICAgICAgJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBgLnN0YXItcmF0aW5ncy1jb250YWluZXJbZGF0YS1tZWRpYS1pZD1cIiR7dGl0bGVJZH1cIl1gXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW5nXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBkZWZhdWx0OiAvLyBib3Jyb3cgYW5kIGhvbGRcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGFjdGlvbkJ1dHRvbi5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgKGFjdGlvbkJ1dHRvbi5pcygnOnZpc2libGUnKSB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgQ29va2llcy5nZXQoJ21lZGlhLXZpZXctcHJlZmVyZW5jZScpID09PSAnbGlzdCcpXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW0gPSBhY3Rpb25CdXR0b247XG4gICAgICAgICAgICAgICAgICAgIHBvc3NpYmxlQWN0aW9uID0gZWxlbS5hdHRyKCdkYXRhLWFjdGlvbicpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocG9zc2libGVBY3Rpb24gPT09ICdib3Jyb3ctc2ltcGxlJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGVBY3Rpb24gPSAnYm9ycm93JztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGl0bGVDYXJkTGluay5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgZWxlbSA9IHRpdGxlQ2FyZExpbms7XG4gICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIChlbGVtLmF0dHIoJ29uY2xpY2snKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ29uY2xpY2snKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAudG9Mb3dlckNhc2UoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaW5kZXhPZignYm9ycm93JykgPiAtMSkgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uaGFzQ2xhc3MoJ2pzLWJvcnJvdycpXG4gICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcG9zc2libGVBY3Rpb24gPSAnYm9ycm93JztcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgIChlbGVtLmF0dHIoJ29uY2xpY2snKSAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uYXR0cignb25jbGljaycpLnRvTG93ZXJDYXNlKCkuaW5kZXhPZignaG9sZCcpID5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTEpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmhhc0NsYXNzKCdqcy1ob2xkJylcbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NzaWJsZUFjdGlvbiA9ICdob2xkJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChlbGVtKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25bMF0gPT09IHBvc3NpYmxlQWN0aW9uIHx8IGFjdGlvblswXSA9PT0gJ25vb2snKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGVzaXJlZCBhY3Rpb24gYnV0dG9uIGlzIHZpc2libGUsIGNsaWNrIGl0XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmNsaWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zc2libGVBY3Rpb24gPT09ICdob2xkJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlbkhvbGRDb25mbGljdE1vZGFsKHRpdGxlSWQsIGVsZW0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gRmFsbGJhY2s6IEdldCBtZWRpYSBkZXRhaWxzXG4gICAgICAgICAgICAgICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB1cmw6IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5tZWRpYUluZm9JZCwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkOiB0aXRsZUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnR0VUJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MoZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uWzBdID09PSAnYm9ycm93JyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25bMF0gPT09ICdib3Jyb3ctc2ltcGxlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhamF4LmJvcnJvdyh0aXRsZUlkLCBmYWxzZSwgJCgnYm9keScpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5vbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYm9ycm93U3VjY2VzcycsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGUsIGV2ZW50RWxlbSwgZXhwRGF0ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlQm9vayBzaG91bGQgYmUgcHJvcGVybHkgY2FwaXRhbGl6ZWQsIGJ1dCBvdGhlciB0eXBlcyBzaG91bGQgYmUgbG93ZXJjYXNlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGUgPVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS50eXBlLmlkID09PSAnZWJvb2snXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBkYXRhLnR5cGUubmFtZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZGF0YS50eXBlLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhamF4LmJvcnJvd1N1Y2Nlc3NUb2FzdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cERhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdib3Jyb3dGYWlsdXJlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZSwgaW5uZXJFbGVtLCByZXNwb25zZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJzZWRSZXNwb25zZSA9IEpTT04ucGFyc2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5qcVhIUi5yZXNwb25zZVRleHRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGV4ZWN1dGUgaWYgdGhlIHRpdGxlIGNhbiBiZSBwbGFjZWQgb24gaG9sZCBhbmQgdGhlIHRhcmdldCB3YXMgdGhlIGJvZHlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkUmVzcG9uc2UuZXJyb3JDb2RlID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdUaXRsZU5vTG9uZ2VyQXZhaWxhYmxlJyAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJFbGVtLmNvbnRleHQudGFnTmFtZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnQk9EWSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmYWtlRWxlbSA9ICQoJzxhPicsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGF0YS10aXRsZSc6IGRhdGEudGl0bGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEtdHlwZSc6IGRhdGEudHlwZS5pZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGF0YS1hcnR3b3JrJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5jb3ZlcnMuY292ZXIzMDBXaWRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaHJlZiA9PSBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICdpbWcvbm8tY292ZXJfZW5fVVMuanBnJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBkYXRhLmNvdmVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNvdmVyMzAwV2lkZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmhyZWYsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEtcHJlcmVsZWFzZSc6IGh0bWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYXRlLWZ1bGwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkOiBkYXRhLmVzdGltYXRlZFJlbGVhc2VEYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BlbkhvbGRDb25mbGljdE1vZGFsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFrZUVsZW1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWRSZXNwb25zZS5lcnJvckNvZGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgaHJlZiA9ICcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxpbmtUZXh0ID0gJyc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkUmVzcG9uc2UuZXJyb3JDb2RlID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUGF0cm9uRXhjZWVkZWRDaGVja291dExpbWl0JyB8fFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZFJlc3BvbnNlLmVycm9yQ29kZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xvYW5BbHJlYWR5RXhpc3RzJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaHJlZiA9IHdpbmRvdy51cmwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5yb3V0ZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hY2NvdW50TG9hbnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUZXh0ID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lmh0bWwoJ2xvYW5zJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZFJlc3BvbnNlLmVycm9yQ29kZSA9PT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1BhdHJvbkV4Y2VlZGVkQ2h1cm5pbmdMaW1pdCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZWRSZXNwb25zZS5lcnJvckNvZGUgPT09XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdQYXRyb25UeXBlUmVzdHJpY3RlZEZyb21UaXRsZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhyZWYgPSB3aW5kb3cudXJsKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucm91dGVzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc3VwcG9ydE1lbWJlcnNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtUZXh0ID0gd2luZG93Lmh0bWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwbGVhc2VDb250YWN0U3VwcG9ydCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG9hc3Rlcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxpbmsgPSBgPGEgY2xhc3M9XCJib2xkXCIgaHJlZj1cIiR7aHJlZn1cIiB0YWJpbmRleD1cIjBcIj4ke2xpbmtUZXh0fTwvYT5gO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvYXN0ZXIucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYDxzdHJvbmc+JHt3aW5kb3cuaHRtbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdnZW5lcmljRXJyb3InXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9PC9zdHJvbmc+ICR7d2luZG93LnRleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBgZXJyb3IuJHtwYXJzZWRSZXNwb25zZS5lcnJvckNvZGV9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbGluayB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICl9YCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9yJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYWN0aW9uWzBdID09PSAnaG9sZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJC53aGVuKGFqYXguZ2V0QXZhaWxhYmlsaXR5KHRpdGxlSWQpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmRvbmUoKGlubmVyRGF0YSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbm5lckRhdGEuYXZhaWxhYmxlQ29waWVzID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmYWtlRWxlbSA9ICQoJzxhPicsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkYXRhLXRpdGxlJzogaW5uZXJEYXRhLnRpdGxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEtdHlwZSc6IGlubmVyRGF0YS50eXBlLmlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEtYXJ0d29yayc6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5uZXJEYXRhLmNvdmVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY292ZXIzMDBXaWRlLmhyZWYgPT1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJ2ltZy9uby1jb3Zlcl9lbl9VUy5qcGcnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW5uZXJEYXRhLmNvdmVyc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY292ZXIzMDBXaWRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5ocmVmLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEtcHJlcmVsZWFzZSc6IGh0bWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGUtZnVsbCcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkOiBpbm5lckRhdGEuZXN0aW1hdGVkUmVsZWFzZURhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRm9yd2FyZEFjdGlvbkhvbGQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbm5lckRhdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUlkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5mYWlsKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVGb3J3YXJkQWN0aW9uSG9sZChkYXRhLCB0aXRsZUlkKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgICQoJ2JvZHknKS5hdHRyKCdkYXRhLWFjdGlvbi1wcm9jZXNzZWQnLCB0cnVlKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICBhY3Rpb24gJiZcbiAgICAgICAgIW9uY2UgJiZcbiAgICAgICAgJCgnYm9keScpLmF0dHIoJ25vLWxpbmtlZC1jYXJkcycpID09PSAndHJ1ZSdcbiAgICApIHtcbiAgICAgICAgYWN0aW9uID0gYWN0aW9uLnNwbGl0KCd+Jyk7XG4gICAgICAgIGNvbnN0IHRpdGxlSWQgPSBhY3Rpb25bMV07XG5cbiAgICAgICAgLy8gVE9ETzogVGhpcyBsb2dpYyBpcyBjb21wbGV0ZWx5IGJ1Z2d5IGFuZCB3cm9uZ1xuICAgICAgICBjb25zdCBmb3J3YXJkVXJsID0gdGhlU3R1YlxuICAgICAgICAgICAgLnJlcGxhY2UoZW5jb2RlVVJJQ29tcG9uZW50KCc/bm8tbGlua2VkLWNhcmQ9dHJ1ZScpLCAnJylcbiAgICAgICAgICAgIC5yZXBsYWNlKC8oJnxcXD8pbm8tbGlua2VkLWNhcmQoPXRydWV8XFw9ZmFsc2UpLywgJycpO1xuICAgICAgICBjb25zdCBjYXJkTGlua1VybCA9IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5hY2NvdW50U3RhcnRDYXJkTGluaywge1xuICAgICAgICAgICAgZm9yd2FyZDogZm9yd2FyZFVybCxcbiAgICAgICAgICAgIGFjdGlvbjogW2FjdGlvblswXSwgdGl0bGVJZF0uam9pbignficpLFxuICAgICAgICB9KTtcblxuICAgICAgICAkKCcjYWRkLWNhcmQtYnV0dG9uJykuYXR0cignZGF0YS1md2QtYWN0aW9uJywgY2FyZExpbmtVcmwpO1xuICAgIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IHByb2Nlc3NJbnN0YW50Rm9yd2FyZEFjdGlvbnM7XG4iLCJpbXBvcnQgZmlsbFN0YXJzIGZyb20gJy4vZmlsbFN0YXJzLmpzJztcbmltcG9ydCBzZXRVc2VyU3RhclJhdGluZyBmcm9tICcuL3NldFVzZXJTdGFyUmF0aW5nLmpzJztcblxuLypcbiAqIEhhbmRsZXMgYSB1c2VyIHNlbGVjdGluZyBhIHJhdGluZ1xuICogKi9cbmNvbnN0IHNlbGVjdFN0YXJSYXRpbmcgPSBmdW5jdGlvbigkY29udGFpbmVyLCBzZWxlY3RlZFJhdGluZywgaXNIb3Zlcikge1xuICAgIGNvbnN0IG1lZGlhSWQgPSAkY29udGFpbmVyLmRhdGEoJ21lZGlhLWlkJyk7XG4gICAgY29uc3QgZXhpc3RpbmdSYXRpbmcgPSAkY29udGFpbmVyLmRhdGEoJ3VzZXItcmF0aW5nJyk7XG5cbiAgICBsZXQgaXNSZXNldCA9IGZhbHNlO1xuICAgIGlmIChleGlzdGluZ1JhdGluZyAhPSBudWxsICYmIGV4aXN0aW5nUmF0aW5nID09PSBzZWxlY3RlZFJhdGluZykge1xuICAgICAgICBpc1Jlc2V0ID0gdHJ1ZTtcbiAgICB9XG4gICAgY29uc3QgcmF0aW5nID0gaXNSZXNldCA/IDAgOiBzZWxlY3RlZFJhdGluZztcbiAgICBpZiAoaXNSZXNldCkge1xuICAgICAgICAkY29udGFpbmVyLmRhdGEoJ3VzZXItcmF0aW5nJywgbnVsbCk7XG4gICAgICAgICRjb250YWluZXIucmVtb3ZlQ2xhc3MoJ3VzZXItcmF0aW5nJyk7XG4gICAgICAgIGZpbGxTdGFycygkY29udGFpbmVyLCAkY29udGFpbmVyLmRhdGEoJ2dsb2JhbC1yYXRpbmcnKSwge3NldFJhdGluZzogZmFsc2UsIGlzSG92ZXJ9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzZXRVc2VyU3RhclJhdGluZygkY29udGFpbmVyLCByYXRpbmcsIHtzZXRSYXRpbmc6IHRydWUsIGlzSG92ZXJ9KTtcbiAgICB9XG5cbiAgICBpZiAoJGNvbnRhaW5lci5oYXNDbGFzcygnanMtbm8tYXV0aCcpKSB7XG4gICAgICAgIC8vIFRPRE86IFRoaXMgd2lsbCBicmVhayBvbiBwYWdlcyB0aGF0IG5lZWQgdGhlaXIgcXVlcnlzdHJpbmc/XG4gICAgICAgIGNvbnN0IGZvcndhcmRVcmwgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgICAgIGNvbnN0IGFjdGlvbiA9IFsnc3RhcicsIG1lZGlhSWQsIHJhdGluZ10uam9pbignficpO1xuICAgICAgICB3aW5kb3cubG9jYXRpb24gPSB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMuYWNjb3VudFNpZ25Jbiwge2ZvcndhcmQ6IGZvcndhcmRVcmwsIGFjdGlvbn0pO1xuICAgIH0gZWxzZSBpZiAoaXNSZXNldCkge1xuICAgICAgICBhamF4LmRlbGV0ZVN0YXJSYXRpbmcobWVkaWFJZCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYWpheC5zZXRTdGFyUmF0aW5nKG1lZGlhSWQsIHJhdGluZyk7XG4gICAgfVxufTtcblxuZXhwb3J0IGRlZmF1bHQgc2VsZWN0U3RhclJhdGluZztcbiIsImltcG9ydCBmaWxsU3RhcnMgZnJvbSAnLi9maWxsU3RhcnMuanMnO1xuXG4vKlxuICogRm9yY2VzIGEgdXNlciBzdGFyIHJhdGluZyB0byBiZSBkaXNwbGF5ZWQ7IGRvZXNuJ3QgcGVyc2lzdFxuICovXG5jb25zdCBzZXRVc2VyU3RhclJhdGluZyA9IGZ1bmN0aW9uKCRjb250YWluZXIsIHJhdGluZywgb3B0aW9ucykge1xuICAgICRjb250YWluZXIuZGF0YSgndXNlci1yYXRpbmcnLCByYXRpbmcpO1xuICAgICRjb250YWluZXIucmVtb3ZlQ2xhc3MoJ3VzZXItcmF0aW5nJykuYWRkQ2xhc3MoJ3VzZXItcmF0aW5nJyk7XG4gICAgZmlsbFN0YXJzKCRjb250YWluZXIsIHJhdGluZywgb3B0aW9ucyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBzZXRVc2VyU3RhclJhdGluZztcbiIsIi8qXG4gKiBBcHBlbmQgY29weSB0byB0b2FzdCBleHBsYWluaW5nIGNvb2tpZXMgdG8gdGhlIHVzZXJcbiAqL1xuY29uc3QgZ2V0Q29va2llRXhwbGFuYXRpb24gPSBmdW5jdGlvbiAoKSB7XG4gICAgY29uc3QgcHJpdmFjeVBvbGljeSA9IHdpbmRvdy5odG1sKCdwcml2YWN5UG9saWN5Q2xpY2tIZXJlJyk7XG4gICAgY29uc3QgZXhpdFNpdGUgPSB3aW5kb3cuaHRtbCgnZXhpdFNpdGUnKTtcbiAgICBjb25zdCBjb29raWVUb2FzdCA9IHdpbmRvdy5odG1sKCdjb29raWVUb2FzdCcsIHtcbiAgICAgICAgbGluazogYDxhIGhyZWY9XCJodHRwOi8vY29tcGFueS5vdmVyZHJpdmUuY29tL3ByaXZhY3ktcG9saWN5L1wiIHRhcmdldD1cIl9ibGFua1wiIHJlbD1cIm5vcmVmZXJyZXJcIj4ke3ByaXZhY3lQb2xpY3l9PC9hPmAsXG4gICAgfSk7XG4gICAgY29uc3QgY29va2llVG9hc3RFeGl0ID0gd2luZG93Lmh0bWwoJ2Nvb2tpZVRvYXN0RXhpdCcsIHtcbiAgICAgICAgbGluazogYDxhIGhyZWY9XCJodHRwczovL3d3dy5vdmVyZHJpdmUuY29tL1wiPiR7ZXhpdFNpdGV9PC9hPmAsXG4gICAgfSk7XG4gICAgJCgnI2V1LW5vdGlmeS10b2FzdCcpLmh0bWwoXG4gICAgICAgIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgcHJlZmVyLXRlbXBsYXRlXG4gICAgICAgIGAke2Nvb2tpZVRvYXN0fVxuICAgICAgICAgPGJyLz48YnIvPlxuICAgICAgICAgPHN0cm9uZz5cbiAgICAgICAgICAgICR7Y29va2llVG9hc3RFeGl0fVxuICAgICAgICAgPC9zdHJvbmc+YFxuICAgICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBnZXRDb29raWVFeHBsYW5hdGlvbjtcbiIsIi8qXG4gKiBBZGQgdGhlIHByb3ZpZGVkIHF1ZXJ5IHBhcmFtZXRlciBhbmQgbmF2aWdhdGUgdG8gdGhlIG5ldyBVUkxcbiAqIEBwYXJhbSB7c3RyaW5nfSBuYW1lIE5hbWUgb2YgdGhlIHF1ZXJ5IHBhcmFtZXRlciB0byBhZGRcbiAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBUaGUgbmV3IHZhbHVlIG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXIgdG8gYWRkXG4gKi9cbmNvbnN0IGFkZFF1ZXJ5UGFyYW0gPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgIGNvbnN0IHBhdGggPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgbGV0IHF1ZXJ5U3RyaW5nID0gd2luZG93LmxvY2F0aW9uLnNlYXJjaDtcblxuICAgIGlmIChxdWVyeVN0cmluZykge1xuICAgICAgICBxdWVyeVN0cmluZyArPSBgJiR7bmFtZX09JHt2YWx1ZX1gO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXJ5U3RyaW5nICs9IGA/JHtuYW1lfT0ke3ZhbHVlfWA7XG4gICAgfVxuXG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBwYXRoICsgcXVlcnlTdHJpbmc7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBhZGRRdWVyeVBhcmFtO1xuIiwiLyoqXG4gKiBHZXQgYWxsIHF1ZXJ5IHBhcmFtZXRlcnNcbiAqIEBwYXJhbSB7c3RyaW5nfSBxcyBUaGUgY3VycmVudCBxdWVyeSBzdHJpbmcgcHJvdmlkZWQgYnkgd2luZG93LmxvY2F0aW9uLnNlYXJjaFxuICogQHJldHVybnMge29iamVjdH0gQSBKU09OIG9iamVjdCBjb250YWluaW5nIHRoZSBxdWVyeSBzdHJpbmcgbmFtZSBhbmQgdmFsdWVzXG4gKi9cbmNvbnN0IGdldFF1ZXJ5UGFyYW1zID0gZnVuY3Rpb24gKHFzKSB7XG4gICAgY29uc3QgcXNSZXBsYWNlZCA9IHFzLnNwbGl0KCcrJykuam9pbignICcpO1xuXG4gICAgY29uc3QgcGFyYW1zID0ge307XG4gICAgY29uc3QgcmUgPSAvWz8mXT8oW149XSspPShbXiZdKikvZztcbiAgICBsZXQgdG9rZW5zID0gcmUuZXhlYyhxc1JlcGxhY2VkKTtcblxuICAgIHdoaWxlICh0b2tlbnMpIHtcbiAgICAgICAgcGFyYW1zW2RlY29kZVVSSUNvbXBvbmVudCh0b2tlbnNbMV0pXSA9IGRlY29kZVVSSUNvbXBvbmVudCh0b2tlbnNbMl0pO1xuICAgICAgICB0b2tlbnMgPSByZS5leGVjKHFzUmVwbGFjZWQpO1xuICAgIH1cblxuICAgIHJldHVybiBwYXJhbXM7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBnZXRRdWVyeVBhcmFtcztcbiIsImltcG9ydCBnZXRRdWVyeVBhcmFtcyBmcm9tICcuL2dldFF1ZXJ5UGFyYW1zJztcbi8qXG4gKiBSZXBsYWNlIHRoZSBwcm92aWRlZCBxdWVyeSBwYXJhbWV0ZXIgd2l0aCBhIGRpZmZlcmVudCBvbmUgYW5kIG5hdmlnYXRlIHRvIHRoZSBuZXcgVVJMXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSBOYW1lIG9mIHRoZSBxdWVyeSBwYXJhbWV0ZXIgdG8gcmVwbGFjZVxuICogQHBhcmFtIHtzdHJpbmd9IHZhbHVlIFRoZSBuZXcgdmFsdWUgb2YgdGhlIHF1ZXJ5IHBhcmFtZXRlciB0byByZXBsYWNlXG4gKi9cbmNvbnN0IHJlcGxhY2VRdWVyeVBhcmFtID0gZnVuY3Rpb24obmFtZSwgdmFsdWUpIHtcbiAgICBjb25zdCBwYXRoID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgIGxldCBxdWVyeVN0cmluZyA9IHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gucmVwbGFjZSgvJnBhZ2U9XFxkKy9nLCAnJnBhZ2U9MScpLnJlcGxhY2UoL1xcP3BhZ2U9XFxkKy9nLCAnP3BhZ2U9MScpO1xuICAgIGNvbnN0IHF1ZXJ5ID0gZ2V0UXVlcnlQYXJhbXMocXVlcnlTdHJpbmcpO1xuXG4gICAgaWYgKHF1ZXJ5U3RyaW5nKSB7XG4gICAgICAgIGlmIChxdWVyeVtuYW1lXSkge1xuICAgICAgICAgICAgcXVlcnlTdHJpbmcgPSBxdWVyeVN0cmluZy5yZXBsYWNlKGAke25hbWV9PSR7cXVlcnlbbmFtZV19YCwgYCR7bmFtZX09JHt2YWx1ZX1gKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHF1ZXJ5U3RyaW5nICs9IGAmJHtuYW1lfT0ke3ZhbHVlfWA7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICBxdWVyeVN0cmluZyA9IGA/JHtuYW1lfT0ke3ZhbHVlfWA7XG4gICAgfVxuXG4gICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBwYXRoICsgcXVlcnlTdHJpbmc7XG59O1xuXG5leHBvcnQgZGVmYXVsdCByZXBsYWNlUXVlcnlQYXJhbTtcbiIsIi8qXG4gKiBTdHJpcCB0aGUgbm9MaW5rZWRDYXJkIHBhcmFtZXRlciBmcm9tIHRoZSB1cmwgaWYgdGhlIHVzZXIgaGFzIGxpbmtlZCBjYXJkc1xuICogQHBhcmFtIHthcnJheX0gcXNcbiAqIEByZXR1cm5zIHsqfVxuICovXG5jb25zdCBzdHJpcE5vTGlua2VkQ2FyZFF1ZXJ5ID0gZnVuY3Rpb24ocXMpIHtcbiAgICBjb25zdCBhcnIgPSBxcy5zcGxpdCgnJicpO1xuXG4gICAgaWYgKGFyci5sZW5ndGggPT09IDEgJiYgYXJyWzBdLmluZGV4T2YoJ25vLWxpbmtlZC1jYXJkJykgPCAwKSB7XG4gICAgICAgIHJldHVybiBxcztcbiAgICB9XG5cbiAgICBsZXQgbmV3UVMgPSAnJztcbiAgICBmb3IgKGxldCB4ID0gMDsgeCA8IGFyci5sZW5ndGg7IHgrKykge1xuICAgICAgICBpZiAoYXJyW3hdLmluZGV4T2YoJ25vLWxpbmtlZC1jYXJkJykgPiAtMSkge1xuICAgICAgICAgICAgYXJyW3hdID0gJyc7XG4gICAgICAgIH0gZWxzZSBpZiAoeCA+IDAgJiYgeCA8IGFyci5sZW5ndGgpIHtcbiAgICAgICAgICAgIG5ld1FTICs9ICcmJztcbiAgICAgICAgfVxuICAgICAgICBuZXdRUyArPSBhcnJbeF07XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ld1FTO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgc3RyaXBOb0xpbmtlZENhcmRRdWVyeTtcbiIsIi8vIGltcG9ydCB3aGVuIHdlIG1vdmUgbW9yZSB0byBtb2R1bGVzXG5jb25zdCBCYWNrYm9uZSA9IHdpbmRvdy5CYWNrYm9uZTtcbmNvbnN0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHBhdGggPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCBsb2FkZXJUZW1wbGF0ZSA9IF8udGVtcGxhdGUoZnMucmVhZEZpbGVTeW5jKHBhdGguam9pbihfX2Rpcm5hbWUsICcvLi4vdGVtcGxhdGVzL2xvYWRlci5odG1sJyksICd1dGY4JykpO1xuXG5jb25zdCBCYXNlVmlldyA9IEJhY2tib25lLlZpZXcuZXh0ZW5kKHtcblxuICAgIGNsb3NlKCkge1xuICAgICAgICB0aGlzLnRyaWdnZXIoJ2Nsb3NlJyk7XG4gICAgICAgIHRoaXMucmVtb3ZlKCk7XG4gICAgICAgIHRoaXMudW5iaW5kKCk7XG4gICAgICAgIHRoaXMuc3RvcExpc3RlbmluZygpO1xuICAgICAgICAvLyBWaWV3cyBzaG91bGQgZGVmaW5lIHRoaXMgaW4gdGhlaXIgZXh0ZW5kIGRlY2xhcmF0aW9uXG4gICAgICAgIHRoaXMub25DbG9zZSAmJiB0aGlzLm9uQ2xvc2UoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIGdldEh0bWwoe3RlbXBsYXRlRGF0YX0gPSB7fSkge1xuICAgICAgICBjb25zdCBnbG9iYWxzID0ge1xuICAgICAgICAgICAgaHRtbDogd2luZG93Lmh0bWwsXG4gICAgICAgICAgICB0ZXh0OiB3aW5kb3cudGV4dFxuICAgICAgICB9O1xuICAgICAgICBjb25zdCBkYXRhID0gdGVtcGxhdGVEYXRhIHx8IHRoaXMuZ2V0VGVtcGxhdGVEYXRhKCk7XG4gICAgICAgIHJldHVybiB0aGlzLnRlbXBsYXRlKF8uZXh0ZW5kKHt9LCBkYXRhLCBnbG9iYWxzKSk7XG4gICAgfSxcblxuICAgIGJ1aWxkRWxlbWVudChvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLiRlbC5odG1sKHRoaXMuZ2V0SHRtbChvcHRpb25zKSk7XG4gICAgfSxcblxuICAgIGRvUmVuZGVyKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5idWlsZEVsZW1lbnQob3B0aW9ucyk7XG4gICAgICAgIGlmICh0aGlzLnRhcmdldCAmJiAhdGhpcy5hdHRhY2hlZCkge1xuICAgICAgICAgICAgdGhpcy5iZWZvcmVBdHRhY2ggJiYgdGhpcy5iZWZvcmVBdHRhY2goKTtcbiAgICAgICAgICAgIHRoaXMuYXR0YWNoKCk7XG4gICAgICAgICAgICB0aGlzLmF0dGFjaGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBhdHRhY2goKSB7XG4gICAgICAgIGlmICghKHRoaXMuJHRhcmdldCBpbnN0YW5jZW9mIEJhY2tib25lLiQpKSB7XG4gICAgICAgICAgICB0aGlzLiR0YXJnZXQgPSBCYWNrYm9uZS4kKHRoaXMudGFyZ2V0KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLiR0YXJnZXQuYXBwZW5kKHRoaXMuJGVsKTtcbiAgICB9LFxuXG4gICAgcmVuZGVyKG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5jbGVhckxvYWRlcigpO1xuXG4gICAgICAgIGlmICh0aGlzLmJlZm9yZVJlbmRlcikge1xuICAgICAgICAgICAgdGhpcy5iZWZvcmVSZW5kZXIoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRvUmVuZGVyKG9wdGlvbnMpO1xuICAgICAgICBpZiAodGhpcy5hZnRlclJlbmRlcikge1xuICAgICAgICAgICAgdGhpcy5hZnRlclJlbmRlcigpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBnZXRUZW1wbGF0ZURhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1vZGVsICYmIHRoaXMubW9kZWwudG9KU09OKCkgfHwge307XG4gICAgfSxcblxuICAgIHJlbmRlckxvYWRlcigpIHtcbiAgICAgICAgY29uc3QgZWxlbSA9ICQodGhpcy50YXJnZXQpLmxlbmd0aCA/ICQodGhpcy50YXJnZXQpIDogdGhpcy4kZWw7XG4gICAgICAgIGVsZW0uZW1wdHkoKS5hcHBlbmQobG9hZGVyVGVtcGxhdGUoe2h0bWw6IHdpbmRvdy5odG1sfSkpO1xuICAgIH0sXG5cbiAgICBjbGVhckxvYWRlcigpIHtcbiAgICAgICAgLy8gQ2xlYXIgbG9hZGVyIGlmIGl0IGV4aXN0c1xuICAgICAgICBjb25zdCAkbG9hZGVyID0gJCgnLmpzLWVzNmxvYWRlcicpO1xuICAgICAgICBpZiAoJGxvYWRlci5sZW5ndGgpIHtcbiAgICAgICAgICAgICRsb2FkZXIucmVtb3ZlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBCYXNlVmlldztcbiIsImltcG9ydCBCYXNlVmlldyBmcm9tICcuL2Jhc2UnO1xuXG5jb25zdCBDb2xsZWN0aW9uVmlldyA9IEJhc2VWaWV3LmV4dGVuZCh7XG5cbiAgICB2aWV3czogW10sXG5cbiAgICB0ZW1wOiBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSxcblxuICAgIGRlc3Ryb3lJdGVtcygpIHtcbiAgICAgICAgd2hpbGUgKHRoaXMudmlld3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy52aWV3c1swXS5kZWxldGVWaWV3KCk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy52aWV3c1swXTtcbiAgICAgICAgICAgIHRoaXMudmlld3Muc2hpZnQoKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBlbXB0eUVsKCkge1xuICAgICAgICB0aGlzLmRlc3Ryb3lJdGVtcygpO1xuICAgICAgICB0aGlzLiRlbC5lbXB0eSgpO1xuICAgICAgICB0aGlzLnRlbXAuaW5uZXJIdG1sID0gJyc7XG4gICAgfSxcblxuICAgIGJlZm9yZVJlbmRlcigpIHtcbiAgICAgICAgdGhpcy5lbXB0eUVsKCk7XG4gICAgfSxcblxuICAgIGRvUmVuZGVyKCkge1xuICAgICAgICB0aGlzLnRlbXBsYXRlICYmIEJhc2VWaWV3LnByb3RvdHlwZS5kb1JlbmRlci5jYWxsKHRoaXMpO1xuICAgICAgICB0aGlzLmJ1aWxkQW5kQXBwZW5kSXRlbXMoKTtcbiAgICB9LFxuXG4gICAgYnVpbGRBbmRBcHBlbmRJdGVtcygpIHtcbiAgICAgICAgdGhpcy5idWlsZEl0ZW1zKCk7XG4gICAgICAgIHRoaXMuYXBwZW5kSXRlbXMoKTtcbiAgICB9LFxuXG4gICAgYnVpbGRJdGVtcygpIHtcbiAgICAgICAgdGhpcy5jb2xsZWN0aW9uLmVhY2godGhpcy5hc3NpZ25PbmUsIHRoaXMpO1xuICAgIH0sXG5cbiAgICBhcHBlbmRJdGVtcygpIHtcbiAgICAgICAgdGhpcy4kZWwuYXBwZW5kKHRoaXMudGVtcCk7XG4gICAgfSxcblxuICAgIGFzc2lnbk9uZShtb2RlbCwgaW5kZXgpIHtcbiAgICAgICAgY29uc3QgdmlldyA9IHRoaXMuY3JlYXRlSXRlbVZpZXcoe21vZGVsfSk7XG4gICAgICAgIHRoaXMuYmVmb3JlQXBwZW5kICYmIHRoaXMuYmVmb3JlQXBwZW5kKHt2aWV3LCBtb2RlbCwgaW5kZXh9KTtcbiAgICAgICAgY29uc3QgaHRtbCA9IHZpZXcucmVuZGVyKCkuZWw7XG4gICAgICAgIHRoaXMuYXBwZW5kSXRlbSh7aHRtbCwgdmlldywgbW9kZWwsIGluZGV4fSk7XG4gICAgICAgIHRoaXMudmlld3MucHVzaCh2aWV3KTtcbiAgICB9LFxuXG4gICAgYXBwZW5kSXRlbSh7aHRtbH0pIHtcbiAgICAgICAgdGhpcy50ZW1wLmFwcGVuZENoaWxkKGh0bWwpO1xuICAgIH0sXG5cbiAgICBnZXRUZW1wbGF0ZURhdGEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNvbGxlY3Rpb24gJiYgdGhpcy5jb2xsZWN0aW9uLm1vZGVscyB8fCBbXTtcbiAgICB9XG5cbn0pO1xuXG5leHBvcnQgZGVmYXVsdCBDb2xsZWN0aW9uVmlldztcbiIsImltcG9ydCBmb3JjZVJlYWxQYWdlUmVsb2FkIGZyb20gJy4vdXRpbC9jb21wYXRpYmlsaXR5L2ZvcmNlX3JlYWxfcGFnZV9yZWxvYWQnO1xuXG5jb25zdCBvbldpbmRvd1BhZ2VzaG93ID0gZnVuY3Rpb24oZXZlbnQpIHtcblxuICAgIGZvcmNlUmVhbFBhZ2VSZWxvYWQoZXZlbnQpO1xuXG59O1xuXG5leHBvcnQgZGVmYXVsdCBvbldpbmRvd1BhZ2VzaG93O1xuIiwiLyoqXG4gKiBAZmlsZU92ZXJ2aWV3XG4gKiBhcHAuanNcbiAqIEdsb2JhbCBKUyBmaWxlIHRoYXQgYXBwbGllcyB0byBhbGwgdmlld3MuXG4gKiBAdHlwZSB7Tm9kZUxpc3R9XG4gKi9cblxuJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkge1xuICAgICQoJ2Zvcm0nKS5vbigndmFsaWQgaW52YWxpZCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmIChlLnR5cGUgIT0gJ3ZhbGlkLmZuZHRuLmFiaWRlJykge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvL1ByZXZlbnQgZm9ybSBzdWJtaXQgd2hlbiBlcnJvcnMgYXJlIHNob3dpbmdcbiAgICAkKCdmb3JtJykuc3VibWl0KGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmICgkKHRoaXMpLmZpbmQoJ3NtYWxsLmVycm9yJykuaXMoJzp2aXNpYmxlJykpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgaWYgKHR5cGVvZiBsYXp5bG9hZCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YXIgbHpsZCA9IGxhenlsb2FkKHsgc3JjOiAnZGF0YS1hbG9hZCcgfSk7XG5cbiAgICAgICAgJCgnaW1nW2RhdGEtYWxvYWRdJylcbiAgICAgICAgICAgIC8vIGFkZCBkaW1lbnNpb25zXG4gICAgICAgICAgICAuYWRkQ2xhc3MoJ2Jyb2tlbicpXG4gICAgICAgICAgICAvLyBhZGQgYmxhbmsgaW1hZ2Ugc28gaXQgZG9lc24ndCBsb29rIGJyb2tlbiAodGhpcyBpcyBzbWFsbGVyIHRoYW4gY2xlYXIuZ2lmKVxuICAgICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAgICAgJ3NyYycsXG4gICAgICAgICAgICAgICAgJ2RhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQUJBQUFBQUNINUJBRUtBQUVBTEFBQUFBQUJBQUVBQUFJQ1RBRUFPdz09J1xuICAgICAgICAgICAgKVxuICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBwbGFjZWhvbGRlciBzdHVmZiB3aGVuIHRoZSBpbWFnZSBpcyBsb2FkIGZvciByZWFsXG4gICAgICAgICAgICAub24oJ2xvYWQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuZ2V0QXR0cmlidXRlKCdkYXRhLWx6bGVkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUF0dHIoJ2Jyb2tlbiBkYXRhLWFsb2FkJylcbiAgICAgICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnYnJva2VuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC8vIHJlZ2lzdGVyIHRoZSBsYXp5IGxvYWRlciB3YXRjaGVyXG4gICAgICAgICAgICAuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgbHpsZCh0aGlzKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgICQoJ2ltZ1tkYXRhLWFsb2FkXScpLmF0dHIoJ3NyYycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHJldHVybiAkKHRoaXMpLmF0dHIoJ2RhdGEtYWxvYWQnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgJCgnW2RhdGEtZm9yd2FyZF0nKS5hdHRyKFxuICAgICAgICAnaHJlZicsXG4gICAgICAgICQoJ1tkYXRhLWZvcndhcmRdJykuYXR0cignaHJlZicpICtcbiAgICAgICAgICAgICc/Zm9yd2FyZD0nICtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5wYXRobmFtZSArXG4gICAgICAgICAgICBzdHJpcE5vTGlua2VkQ2FyZFF1ZXJ5KGxvY2F0aW9uLnNlYXJjaCkgK1xuICAgICAgICAgICAgbG9jYXRpb24uaGFzaC5yZXBsYWNlKCcjJywgJyZhY3Rpb249JylcbiAgICApO1xuXG4gICAgdmFyIGlzV2luZG93cyA9XG4gICAgICAgIHdpbmRvdy5uYXZpZ2F0b3IucGxhdGZvcm0ubWF0Y2goL1dpbi8pICYmICFib3dzZXIud2luZG93c3Bob25lXG4gICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgIDogZmFsc2U7XG4gICAgdmFyIGlzV2luZG93czhBbmRVcCA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKFxuICAgICAgICAvKFdpbmRvd3MgMTAuMHxXaW5kb3dzIE5UIDEwLjB8V2luZG93cyA4LjF8V2luZG93cyBOVCA2LjN8V2luZG93cyA4fFdpbmRvd3MgTlQgNi4yKS9cbiAgICApXG4gICAgICAgID8gdHJ1ZVxuICAgICAgICA6IGZhbHNlO1xuICAgIHZhciBpbkFwcCA9IENvb2tpZXMuZ2V0KCdvbWNicm93c2UnKSAhPSB1bmRlZmluZWQ7XG5cbiAgICBpZiAoaXNXaW5kb3dzICYmIGlzV2luZG93czhBbmRVcCAmJiBpbkFwcCkge1xuICAgICAgICB2YXIgZWxlbXMgPSAkKFxuICAgICAgICAgICAgJ2xpLnJlYWQtc2FtcGxlIGEsIGEuc2FtcGxlLCBhLnNhbXBsZS1jaXJjbGUtaWNvbiwgYS5zYW1wbGUtYnV0dG9uJ1xuICAgICAgICApO1xuICAgICAgICBlbGVtcy5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICgkKHRoaXMpLmF0dHIoJ2RhdGEtaHJlZicpKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignZGF0YS1tZXRybycsICd0cnVlJylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2hyZWYnLCAkKHRoaXMpLmF0dHIoJ2RhdGEtaHJlZicpKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cigndGFyZ2V0JywgJ19ibGFuaycpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdyZWwnLCAnbm9yZWZlcnJlcicpXG4gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVBdHRyKCdkYXRhLXJldmVhbC1pZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAgICQoJy5tb3JlLWFjdGlvbnMtZHJvcDpub3QoLmxpc3QtdmlldyknKVxuICAgICAgICAgICAgLmZpcnN0KClcbiAgICAgICAgICAgIC5maW5kKCcuanMtY29udGV4dExpbmsnKVxuICAgICAgICAgICAgLnRleHQoKS5sZW5ndGggPiAxMDVcbiAgICApIHtcbiAgICAgICAgJCgnLm1vcmUtYWN0aW9ucy1kcm9wJykuYWRkQ2xhc3MoJ2lzLXdpZGUnKTtcbiAgICB9XG5cbiAgICAvLyBMSFRORy0xNDMxLDE0MzIsMTgwNCAtIGFkZGluZyBzb3J0IG9wdGlvbnMgdG8gaG9sZHMsIHdpc2hsaXN0LCBhbmQgcmF0ZWQgdGl0bGVzXG4gICAgLy8gSSB0aG91Z2h0IGFib3V0IGNyZWF0aW5nIGEgc2VwYXJhdGUgc2NyaXB0IGZpbGUgYWNjb3VudC1yZWxhdGVkIHN0dWZmIHJhdGhlclxuICAgIC8vIHRoZW4gc2hvdmluZyB0aGlzIGluIGhlcmUsIGJ1dCBldHVuZyBlbmNvdXJhZ2VkIG1lIHRvIHVzZSB0aGlzIGNhdGNoLWFsbCBmaWxlIHNpbmNlXG4gICAgLy8gdGhlIGFjY291bnQgYXJlYSBpcyBnb2luZyB0byBiZSByZWRvbmUgaW4gdGhlIG5lYXIgZnV0dXJlLlxuICAgIHZhciBzb3J0QnlFbGVtID0gJCgnLmpzLWFjY291bnRTb3J0QnlPcHRpb25zJyk7XG4gICAgc29ydEJ5RWxlbS5vbignY2hhbmdlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICB3aW5kb3cucmVwbGFjZVF1ZXJ5UGFyYW0oJ3NvcnRCeScsICQodGhpcykudmFsKCkpO1xuICAgIH0pO1xufSk7XG5cbi8qKlxuICogQ2xvc2UgYSBtb2RhbCB3aGVuIHRoZSBjYW5jZWwgYnV0dG9uIGlzIGNsaWNrZWRcbiAqL1xuJCgnW2RhdGEtY2FuY2VsXScpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAkKHRoaXMpLmZvdW5kYXRpb24oJ3JldmVhbCcsICdjbG9zZScpO1xufSk7XG5cbndpbmRvdy5zY3JvbGxBbXQgPSAwO1xuXG4vKipcbiAqIEhpZGUgY2Fyb3VzZWwgYXJyb3dzIHdoZW4gcmVhY2hpbmcgdGhlIGVuZCBvZiBhIGNhcm91c2VsXG4gKi9cbiQoJy5jYXJvdXNlbC5sb2FkZWQnKS5vbignc2Nyb2xsJywgZnVuY3Rpb24gKGUpIHtcbiAgICBoaWRlQXJyb3dzT25FbmRPZlNjcm9sbChlLCB0aGlzKTtcbn0pO1xuXG4vKipcbiAqIFJlc2V0IHNjcm9sbEFtdCB0byBkZXRlY3QgZW5kIG9mIG5ldyBjYXJvdXNlbFxuICovXG4kKCcuY2Fyb3VzZWwubG9hZGVkJykub24oe1xuICAgIG1vdXNlbGVhdmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgd2luZG93LnNjcm9sbEFtdCA9IDA7XG4gICAgfSxcbn0pO1xuXG4kKCcuY2Fyb3VzZWwubG9hZGVkJykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgaGlkZUNhcm91c2VsQXJyb3dzKHRoaXMpO1xufSk7XG5cbmlmICghYm93c2VyLm1vYmlsZSAmJiAhYm93c2VyLnRhYmxldCkge1xuICAgICQoJy5jYXJvdXNlbC5sb2FkZWQnKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgUHMuaW5pdGlhbGl6ZSgkKHRoaXMpWzBdLCB7IHN1cHByZXNzU2Nyb2xsWTogdHJ1ZSB9KTtcbiAgICB9KTtcbn1cblxuJCgnaVtkYXRhLXNjcm9sbD1cInJpZ2h0XCJdJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgIHZhciBlbGVtID0gJCh0aGlzKVxuICAgICAgICAuc2libGluZ3MoJy5qcy1jYXJvdXNlbCcpXG4gICAgICAgIC5jaGlsZHJlbignZGl2W2RhdGEtc2Nyb2xsLWNvbnRhaW5lcl0nKTtcbiAgICBzY3JvbGxDYXJvdXNlbCgncmlnaHQnLCBlbGVtKTtcbn0pO1xuXG4kKCdpW2RhdGEtc2Nyb2xsPVwibGVmdFwiXScpLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZWxlbSA9ICQodGhpcylcbiAgICAgICAgLnNpYmxpbmdzKCcuanMtY2Fyb3VzZWwnKVxuICAgICAgICAuY2hpbGRyZW4oJ2RpdltkYXRhLXNjcm9sbC1jb250YWluZXJdJyk7XG4gICAgc2Nyb2xsQ2Fyb3VzZWwoJ2xlZnQnLCBlbGVtKTtcbn0pO1xuXG4vKipcbiAqIEFjdGlvbnMgdG8gcGVyZm9ybSB3aGVuIGEgZHJvcGRvd24gaXMgY2xvc2VkXG4gKi9cbiQoJy5kcm9wJykub24oJ2Nsb3NlZC5mbmR0bi5kcm9wZG93bicsIGZ1bmN0aW9uICgpIHtcbiAgICAkKHRoaXMpLmZpbmQoJ2EnKS5hdHRyKCd0YWJpbmRleCcsICctMScpO1xuICAgICQodGhpcykuZmluZCgnaDInKS5hdHRyKCd0YWJpbmRleCcsICctMScpO1xuICAgIHZhciBlbGVtID0gJCgnbGlbZGF0YS1kcm9wZG93bj1cIicgKyAkKHRoaXMpLmF0dHIoJ2lkJykgKyAnXCJdID4gYScpO1xuICAgIGVsZW0uYXR0cignYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xufSk7XG5cbiQoJ1tkYXRhLWxhc3QtbGlua10nKS5vbignZm9jdXNvdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG5leHRJdGVtID0gJCh0aGlzKS5wYXJlbnRzKCcuY29udGVudC5mLWRyb3Bkb3duJykubmV4dCgnbGknKTtcbiAgICBuZXh0SXRlbS5jaGlsZHJlbignYScpLmZvY3VzKCk7XG59KTtcblxuJCgndWwuZHJvcC5jb250ZW50LmYtZHJvcGRvd24nKVxuICAgIC5vbigna2V5ZG93bicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGFycm93VGFiTWVudShlKTtcbiAgICB9KVxuICAgIC5vbigna2V5ZG93bicsICcqJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgYXJyb3dUYWJNZW51KGUpO1xuICAgIH0pO1xuXG4kKCd1bCNkcm9wQWNjb3VudCcpXG4gICAgLm9uKCdrZXlkb3duJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgYXJyb3dUYWJBY2NvdW50TWVudShlKTtcbiAgICB9KVxuICAgIC5vbigna2V5ZG93bicsICcqJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgYXJyb3dUYWJBY2NvdW50TWVudShlKTtcbiAgICB9KTtcblxuLy8gRml4IGZvciBzZWxlY3QgZWxlbWVudHMgaW4gSU9TIGFwcCB2aWV3XG4kKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7XG4gICAgJChkb2N1bWVudCkub24oJ3BvcHVwYmVmb3JlcG9zaXRpb24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICQubW9iaWxlLmhhc2hMaXN0ZW5pbmdFbmFibGVkID0gZmFsc2U7XG4gICAgfSk7XG4gICAgJChkb2N1bWVudCkub24oJ3BvcHVwYWZ0ZXJjbG9zZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJC5tb2JpbGUuaGFzaExpc3RlbmluZ0VuYWJsZWQgPSB0cnVlO1xuICAgIH0pO1xufSk7XG5cbiQoJyNsaW5rLWNhcmQtbW9kYWwnKS5vbignb3BlbmVkLmZuZHRuLnJldmVhbCcsIGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgYnV0dG9uID0gJCgnI2FkZC1jYXJkLWJ1dHRvbicpO1xuICAgIGlmIChidXR0b24uYXR0cignZGF0YS1md2QtYWN0aW9uJykpIHtcbiAgICAgICAgYnV0dG9uLmF0dHIoJ2hyZWYnLCBidXR0b24uYXR0cignZGF0YS1md2QtYWN0aW9uJykpO1xuICAgICAgICBidXR0b24ucmVtb3ZlQXR0cignZGF0YS1md2QtYWN0aW9uJyk7XG4gICAgfVxufSk7XG5cbiQod2luZG93KS5yZXNpemUoZnVuY3Rpb24gKCkge1xuICAgIGNsZWFyVGltZW91dCh0aGlzLmlkKTtcbiAgICB0aGlzLmlkID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7fSwgNTAwKTsgLy8gRG8gbm90IHJ1biBjb25zdGFudGx5IG9uIHJlc2l6ZVxufSk7XG5cbi8vIERldGVjdCBpZiB1c2VyIGlzIHNjcm9sbGluZyBvciBub3RcbnZhciBzY3JvbGxpbmcgPSBmYWxzZTtcbiQoJ2JvZHknKVxuICAgIC5vbigndG91Y2htb3ZlJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBzY3JvbGxpbmcgPSB0cnVlO1xuICAgIH0pXG4gICAgLm9uKCd0b3VjaGVuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgc2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgfSk7XG5cbi8qKlxuICogVXNlZCB0byBhdXRvbWF0aWNhbGx5IHJlZGlyZWN0IGxpbmtzIGluIGNvbGxlY3Rpb25zIG1lbnUgb24gaU9TXG4gKiBTb21ldGltZXMgdGhleSBqdXN0IGxpa2UgdG8gaG92ZXIgaW5zdGVhZCBvZiBjbGljay4gQmVjYXVzZSBBcHBsZS5cbiAqL1xuJCgnLmpzLWxpbmsnKS5vbignY2xpY2sgdG91Y2hlbmQnLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmIChzY3JvbGxpbmcpIHtcbiAgICAgICAgc2Nyb2xsaW5nID0gZmFsc2U7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgd2luZG93LmxvY2F0aW9uID0gJCh0aGlzKS5hdHRyKCdocmVmJyk7XG59KTtcblxuLy8gQ3VzdG9tIGpxdWVyeSBmaWx0ZXIgdG8gc2VsZWN0IGZvY3VzYWJsZSBlbGVtZW50c1xuLy8gV2Fzbid0IHN1cmUgd2hlcmUgZWxzZSB0byBwdXQgdGhpcyBmb3IgdGhlIHRpbWUgYmVpbmdcbiQuZXh0ZW5kKCQuZXhwclsnOiddLCB7XG4gICAgZm9jdXNhYmxlOiBmdW5jdGlvbiAoZWwsIGluZGV4LCBzZWxlY3Rvcikge1xuICAgICAgICByZXR1cm4gJChlbCkuaXMoJ2EsIGJ1dHRvbiwgOmlucHV0LCBbdGFiaW5kZXhdJyk7XG4gICAgfSxcbn0pO1xuXG50cnkge1xuICAgIHdpbmRvdy5jb25zb2xlICYmXG4gICAgICAgIHdpbmRvdy5jb25zb2xlLmxvZyAmJlxuICAgICAgICB3aW5kb3cuY29uc29sZS5sb2coXG4gICAgICAgICAgICAnSGkgdGhlcmUhIFRoaXMgc2l0ZSBpcyBwb3dlcmVkIGJ5IE92ZXJEcml2ZSBhbmQgb3VyIHZpc2lvbiBpcyBhIHdvcmxkIGVubGlnaHRlbmVkIGJ5IHJlYWRpbmcuIE1heWJlIGEgY3VyaW91cyBjYXQgbGlrZSB5b3UgY2FuIGhlbHAgaHR0cHM6Ly9jb21wYW55Lm92ZXJkcml2ZS5jb20vY29tcGFueS9jYXJlZXJzL29wZW4tcG9zaXRpb25zLydcbiAgICAgICAgKTtcbn0gY2F0Y2ggKGUpIHt9XG4iLCIvKiBlc2xpbnQtZGlzYWJsZSBuby1pbnZhbGlkLXRoaXMgKi9cbndpbmRvdy5hamF4ID0ge1xuICAgIGJ1czogd2luZG93Lmdsb2JhbEV2ZW50cyxcbiAgICAvLyBBamF4IHJlcXVlc3QgdG8gYm9ycm93IGEgdGl0bGVcbiAgICBib3Jyb3c6IGZ1bmN0aW9uIChtZWRpYUlkLCBsZW5kaW5nUGVyaW9kLCBlbGVtZW50cywgdW5pdHMpIHtcbiAgICAgICAgZWxlbWVudHMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkKHRoaXMpLnRyaWdnZXIoJ2JvcnJvd1JlcXVlc3QnKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuICQucG9zdChcbiAgICAgICAgICAgIHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5tZWRpYUJvcnJvdywgeyBtZWRpYUlkOiBtZWRpYUlkIH0pLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGxlbmRpbmdQZXJpb2Q6IGxlbmRpbmdQZXJpb2QsXG4gICAgICAgICAgICAgICAgdW5pdHM6IHVuaXRzLFxuICAgICAgICAgICAgICAgIGlzTW9iaWxlOiBib3dzZXIubW9iaWxlIHx8IGJvd3Nlci50YWJsZXQsXG4gICAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgICAgICAgIC5kb25lKGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudHMuZWFjaChmdW5jdGlvbiAoaSwgZWwpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyICRlbG0gPSAkKGVsKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoJGVsbS5hdHRyKCdkYXRhLXR5cGUnKSA9PT0gJ3BlcmlvZGljYWxzJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkudHJpZ2dlcignbm9va1N1Y2Nlc3MnLCBbJGVsbSwgZGF0YV0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoJGVsbS5jb250ZXh0LnRhZ05hbWUgPT09ICdCT0RZJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRlbG0ucmVtb3ZlQXR0cignZGF0YS10eXBlJykucmVtb3ZlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZGF0YS1tZWRpYS1pZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApOyAvLyBSZW1vdmUgdGVtcG9yYXJ5IGRhdGEgdHlwZSBhdHRyaWJ1dGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLnRyaWdnZXIoJ2JvcnJvd1N1Y2Nlc3MnLCBbJGVsbSwgZGF0YV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICAgICAgLmZhaWwoZnVuY3Rpb24gKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRzLmVhY2goZnVuY3Rpb24gKGksIGVsKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciAkZWxtID0gJChlbCk7XG4gICAgICAgICAgICAgICAgICAgICRlbG0udHJpZ2dlcignYm9ycm93RmFpbHVyZScsIFtcbiAgICAgICAgICAgICAgICAgICAgICAgICRlbG0sXG4gICAgICAgICAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAganFYSFI6IGpxWEhSLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdGF0dXM6IHRleHRTdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JUaHJvd246IGVycm9yVGhyb3duLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgXSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgcmV0dXJuVGl0bGU6IGZ1bmN0aW9uIChtZWRpYUlkKSB7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgIHVybDogd2luZG93LnVybCh3aW5kb3cucm91dGVzLm1lZGlhUmV0dXJuLCB7XG4gICAgICAgICAgICAgICAgbWVkaWFJZDogcGFyc2VJbnQobWVkaWFJZCwgMTApLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0eXBlOiAnREVMRVRFJyxcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVzcG9uc2UgPSBKU09OLnBhcnNlKGpxWEhSLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICAgICAgaWYgKHJlc3BvbnNlLnNlc3Npb25FeHBpcmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYuYnVzLnRyaWdnZXIoJ3VzZXI6c2Vzc2lvbjpleHBpcmVkJyk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmICh0b2FzdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBsaW5rID0gJyc7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5lcnJvckNvZGUgPT09ICdUaXRsZUNhbm5vdEJlRWFybHlSZXR1cm5lZCcpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsgPSBgPGEgaHJlZj1cIiR7d2luZG93LnN1cHBvcnRVcmwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lk92ZXJEcml2ZS5fbG9jYWxlLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5PdmVyRHJpdmUuc3VwcG9ydEFydGljbGVzLmhvd1RvUmV0dXJuXG4gICAgICAgICAgICAgICAgICAgICAgICApfVwiIGNsYXNzPVwiYm9sZFwiPiR7d2luZG93Lmh0bWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2xlYXJuQWJvdXRSZXR1cm5pbmcnXG4gICAgICAgICAgICAgICAgICAgICAgICApfTwvYT5gO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JDb2RlID09PVxuICAgICAgICAgICAgICAgICAgICAgICAgJ0Nhbm5vdEVhcmx5UmV0dXJuV2hlbkZ1bGZpbGxlZE9uS2luZGxlJ1xuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmsgPSBgPGEgaHJlZj1cIiR7d2luZG93LnVybChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cucm91dGVzLm1lZGlhRG93bmxvYWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6ICdlYm9vay1raW5kbGUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUlkOiBtZWRpYUlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICl9XCIgY2xhc3M9XCJib2xkXCIgdGFyZ2V0PVwiX2JsYW5rXCIgcmVsPVwibm9yZWZlcnJlclwiPiR7d2luZG93Lmh0bWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FtYXpvbnNTaXRlJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKX08L2E+YDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRvYXN0ZXIucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICc8c3Ryb25nPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5odG1sKCdnZW5lcmljRXJyb3InKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvc3Ryb25nPiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cudGV4dCgnZXJyb3IuJyArIHJlc3BvbnNlLmVycm9yQ29kZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rOiBsaW5rLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2Vycm9yJ1xuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICQoJy5yZXZlYWwtbW9kYWwnKS5mb3VuZGF0aW9uKCdyZXZlYWwnLCAnY2xvc2UnKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvL0FqYXggcmVxdWVzdCBmb3IgcGxhY2luZyBhIGhvbGRcbiAgICBwbGFjZUhvbGQ6IGZ1bmN0aW9uIChtZWRpYUlkLCBlbWFpbCwgZWxlbWVudHMpIHtcbiAgICAgICAgZWxlbWVudHMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoISQodGhpcykuaGFzQ2xhc3MoJ3ByaW1hcnktYWN0aW9uJykpIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMpLnRyaWdnZXIoJ2hvbGRSZXF1ZXN0JywgJCh0aGlzKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5tZWRpYVBsYWNlSG9sZCksXG4gICAgICAgICAgICB0eXBlOiAnUE9TVCcsXG4gICAgICAgICAgICBkYXRhOiB7XG4gICAgICAgICAgICAgICAgZW1haWw6IGVtYWlsLFxuICAgICAgICAgICAgICAgIG1lZGlhSWQ6IG1lZGlhSWQsXG4gICAgICAgICAgICAgICAgaXNNb2JpbGU6IGJvd3Nlci5tb2JpbGUgfHwgYm93c2VyLnRhYmxldCxcbiAgICAgICAgICAgICAgICBsYW5ndWFnZUNvZGU6XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5wYXRyb25TZXR0aW5nc1snbGFuZ3VhZ2Utc2VsZWN0aW9uJ10gfHxcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LkNvb2tpZXMuZ2V0KCdsYW5ndWFnZS1zZWxlY3Rpb24nKSB8fFxuICAgICAgICAgICAgICAgICAgICAkKCdodG1sJykuYXR0cignbGFuZycpIHx8XG4gICAgICAgICAgICAgICAgICAgICdlbicsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEsIHRleHRTdGF0dXMsIHhocikge1xuICAgICAgICAgICAgICAgIGVsZW1lbnRzLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBJZiBzdGF0dXMgaXMgMzAzOiBob2xkIGZhaWxlZCBiZWNhdXNlIHRpdGxlIGhhcyBhbHJlYWR5IGJlZW4gcGxhY2VkIG9uIGhvbGQuXG4gICAgICAgICAgICAgICAgICAgIGlmICh4aHIuc3RhdHVzID09PSAzMDMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtZXNzYWdlID0geyByZXNwb25zZVRleHQ6IGRhdGEgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykudHJpZ2dlcignaG9sZEZhaWx1cmUnLCBbJCh0aGlzKSwgbWVzc2FnZV0pO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS50cmlnZ2VyKCdob2xkU3VjY2VzcycsIFskKHRoaXMpLCBkYXRhXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKHJlc3BvbnNlKSB7XG4gICAgICAgICAgICAgICAgZWxlbWVudHMuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcykudHJpZ2dlcignaG9sZEZhaWx1cmUnLCBbJCh0aGlzKSwgcmVzcG9uc2VdKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvL0FqYXggcmVxdWVzdCBmb3IgcmV0cmlldmluZyBhIHNpbmdsZSBob2xkXG4gICAgZ2V0SG9sZDogZnVuY3Rpb24gKG1lZGlhSWQpIHtcbiAgICAgICAgcmV0dXJuICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5nZXRTaW5nbGVIb2xkLCB7XG4gICAgICAgICAgICAgICAgbWVkaWFJZDogcGFyc2VJbnQobWVkaWFJZCksXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHR5cGU6ICdHRVQnLFxuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy9BamF4IHJlcXVlc3QgZm9yIHJldHJpZXZpbmcgYSBzaW5nbGUgbWVkaWEgaXRlbVxuICAgIGdldE1lZGlhSXRlbTogZnVuY3Rpb24gKG1lZGlhSWQpIHtcbiAgICAgICAgcmV0dXJuICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5tZWRpYUluZm9JZCwge1xuICAgICAgICAgICAgICAgIG1lZGlhSWQ6IHBhcnNlSW50KG1lZGlhSWQpLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0eXBlOiAnR0VUJyxcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIHJlbW92ZUhvbGQ6IGZ1bmN0aW9uIChlbGVtLCBtZWRpYUlkKSB7XG4gICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5tZWRpYVJlbW92ZUhvbGQsIHtcbiAgICAgICAgICAgICAgICBtZWRpYUlkOiBtZWRpYUlkLFxuICAgICAgICAgICAgICAgIGZvcndhcmQ6ICdhY2NvdW50JyxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdHlwZTogJ0RFTEVURScsXG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gSlNPTi5wYXJzZShqcVhIUi5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgIGlmICh0b2FzdGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRvYXN0ZXIucHVzaChcbiAgICAgICAgICAgICAgICAgICAgICAgICc8c3Ryb25nPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5odG1sKCdnZW5lcmljRXJyb3InKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvc3Ryb25nPiAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaHRtbCgnZXJyb3IuJyArIHJlc3BvbnNlLmVycm9yQ29kZSksXG4gICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3InXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICQoJy5tb2RhbCcpLmZvdW5kYXRpb24oJ3JldmVhbCcsICdjbG9zZScpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vQWpheCByZXF1ZXN0IGZvciBhZGRpbmcgdG8gd2lzaCBsaXN0XG4gICAgd2lzaExpc3RBZGQ6IGZ1bmN0aW9uIChtZWRpYUlkLCBlbGVtZW50cykge1xuICAgICAgICAkKGVsZW1lbnRzKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICQodGhpcykudHJpZ2dlcignd2lzaExpc3RBZGRSZXF1ZXN0Jyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5hY2NvdW50V2lzaGxpc3RBZGQsIHtcbiAgICAgICAgICAgICAgICBtZWRpYUlkOiBtZWRpYUlkLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0eXBlOiAnUFVUJyxcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgJChlbGVtZW50cykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcykudHJpZ2dlcignd2lzaExpc3RBZGRTdWNjZXNzJywgZGF0YSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHtcbiAgICAgICAgICAgICAgICAkKGVsZW1lbnRzKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS50cmlnZ2VyKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3dpc2hMaXN0QWRkRmFpbHVyZScsXG4gICAgICAgICAgICAgICAgICAgICAgICBqcVhIUixcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICBlcnJvclRocm93blxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vQWpheCByZXF1ZXN0IGZvciByZW1vdmluZyBmcm9tIHdpc2ggbGlzdFxuICAgIHdpc2hMaXN0UmVtb3ZlOiBmdW5jdGlvbiAobWVkaWFJZCwgZWxlbWVudHMsIHJlbG9hZCkge1xuICAgICAgICAkKGVsZW1lbnRzKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICQodGhpcykudHJpZ2dlcignd2lzaExpc3RSZW1vdmVSZXF1ZXN0JywgZWxlbWVudHMpO1xuICAgICAgICB9KTtcblxuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgIHVybDogd2luZG93LnVybCh3aW5kb3cucm91dGVzLmFjY291bnRXaXNobGlzdFJlbW92ZSwge1xuICAgICAgICAgICAgICAgIG1lZGlhSWQ6IG1lZGlhSWQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHR5cGU6ICdERUxFVEUnLFxuICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICBpZiAocmVsb2FkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFJlbG9hZCB3aXNobGlzdCBhY2NvdW50IHBhZ2VcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnJlbG9hZCgpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICQoZWxlbWVudHMpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS50cmlnZ2VyKCd3aXNoTGlzdFJlbW92ZVN1Y2Nlc3MnLCBkYXRhKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoanFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7XG4gICAgICAgICAgICAgICAgdmFyIHJlc3BvbnNlID0gSlNPTi5wYXJzZShqcVhIUi5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZS5zZXNzaW9uRXhwaXJlZCkge1xuICAgICAgICAgICAgICAgICAgICBzZWxmLmJ1cy50cmlnZ2VyKCd1c2VyOnNlc3Npb246ZXhwaXJlZCcpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICQoZWxlbWVudHMpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS50cmlnZ2VyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aXNoTGlzdFJlbW92ZUZhaWx1cmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRTdGF0dXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JUaHJvd25cbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBnZXRNZWRpYVN0YXR1czogZnVuY3Rpb24gKGl0ZW1zKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIGl0ZW1zICYmXG4gICAgICAgICAgICBpdGVtcy5sZW5ndGggJiZcbiAgICAgICAgICAgIHdpbmRvdy5PdmVyRHJpdmUuaXNBdXRoZW50aWNhdGVkICYmXG4gICAgICAgICAgICB3aW5kb3cuT3ZlckRyaXZlLmhhc0xpbmtlZENhcmRzXG4gICAgICAgICkge1xuICAgICAgICAgICAgJCgnYm9keScpLnRyaWdnZXIoJ21lZGlhU3RhdHVzUmVxdWVzdCcpO1xuXG4gICAgICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgICAgIHVybDogd2luZG93LnVybCh3aW5kb3cucm91dGVzLm1lZGlhSW5mbyksXG4gICAgICAgICAgICAgICAgdHlwZTogJ1BPU1QnLFxuICAgICAgICAgICAgICAgIGNvbnRlbnRUeXBlOiAnYXBwbGljYXRpb24vanNvbicsXG4gICAgICAgICAgICAgICAgdGltZW91dDogMTAwMDAsXG4gICAgICAgICAgICAgICAgZGF0YTogSlNPTi5zdHJpbmdpZnkoeyB0aXRsZUlkczogaXRlbXMgfSksXG4gICAgICAgICAgICAgICAgc3VjY2VzczogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgJCgnYm9keScpLnRyaWdnZXIoJ21lZGlhU3RhdHVzU3VjY2VzcycsIGRhdGEpO1xuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgJCgnYm9keScpLnRyaWdnZXIoXG4gICAgICAgICAgICAgICAgICAgICAgICAnbWVkaWFTdGF0dXNGYWlsdXJlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGpxWEhSLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dFN0YXR1cyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yVGhyb3duLFxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbXNcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZ2V0TGVuZGluZ1BlcmlvZHM6IGZ1bmN0aW9uIChtZWRpYUlkLCBlbGVtZW50cywgY2FsbGJhY2spIHtcbiAgICAgICAgaWYgKG1lZGlhSWQgPT0gJycgfHwgbWVkaWFJZCA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAkKGVsZW1lbnRzKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICQodGhpcykudHJpZ2dlcignbGVuZGluZ1BlcmlvZHNSZXF1ZXN0Jyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgJC5hamF4KHtcbiAgICAgICAgICAgIHVybDogd2luZG93LnVybCh3aW5kb3cucm91dGVzLnBhdHJvbkxlbmRpbmdQZXJpb2QsIHtcbiAgICAgICAgICAgICAgICBtZWRpYUlkOiBtZWRpYUlkLFxuICAgICAgICAgICAgfSksXG4gICAgICAgICAgICB0eXBlOiAnR0VUJyxcbiAgICAgICAgICAgIHRpbWVvdXQ6IDAsXG4gICAgICAgICAgICBzdWNjZXNzOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICQoZWxlbWVudHMpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLnRyaWdnZXIoJ2xlbmRpbmdQZXJpb2RzUmV0cmlldmVkJywgeyBpdGVtczogZGF0YSB9KTtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgIC8vIFVzaW5nIG5ldyBldmVudCBidXMgZm9yIGZ1dHVyZS1wcm9vZmluZ1xuICAgICAgICAgICAgICAgIHNlbGYuYnVzLnRyaWdnZXIoJ2xlbmRpbmdQZXJpb2RzOmZldGNoOmZhaWwnKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBnZXRBdmFpbGFiaWxpdHk6IGZ1bmN0aW9uIChtZWRpYUlkKSB7XG4gICAgICAgIHJldHVybiAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMubWVkaWFBdmFpbGFiaWxpdHlJZCwgeyBpZDogbWVkaWFJZCB9KSxcbiAgICAgICAgICAgIHR5cGU6ICdHRVQnLFxuICAgICAgICAgICAgdGltZW91dDogMCxcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIGdldFN0YXJSYXRpbmc6IGZ1bmN0aW9uIChtZWRpYUlkLCBlbGVtZW50cykge1xuICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMucGF0cm9uTWVkaWFTdGFyUmF0aW5ncywge1xuICAgICAgICAgICAgICAgIHRpdGxlSWQ6IG1lZGlhSWQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHR5cGU6ICdHRVQnLFxuICAgICAgICAgICAgdGltZW91dDogMCxcbiAgICAgICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgJChlbGVtZW50cykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcykudHJpZ2dlcignc3RhclJhdGluZ3NSZXRyaWV2ZWQnLCBkYXRhKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGVycm9yOiBmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICAgICAgICAgICQodGhpcykudHJpZ2dlcignc3RhclJhdGluZ3NHZXRFcnJvcicsIGRhdGEpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIHNldFN0YXJSYXRpbmc6IGZ1bmN0aW9uIChtZWRpYUlkLCByYXRpbmcpIHtcbiAgICAgICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgICAgICAkLmFqYXgoe1xuICAgICAgICAgICAgdXJsOiB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMucGF0cm9uTWVkaWFTdGFyUmF0aW5ncywge1xuICAgICAgICAgICAgICAgIHRpdGxlSWQ6IG1lZGlhSWQsXG4gICAgICAgICAgICB9KSxcbiAgICAgICAgICAgIHR5cGU6ICdQVVQnLFxuICAgICAgICAgICAgZGF0YTogeyByYXRpbmc6IHJhdGluZyB9LFxuICAgICAgICAgICAgdGltZW91dDogMCxcblxuICAgICAgICAgICAgZXJyb3I6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzKS50cmlnZ2VyKCdzdGFyUmF0aW5nc1NldEVycm9yJywgZGF0YSk7XG5cbiAgICAgICAgICAgICAgICAvLyBVc2luZyBuZXcgZXZlbnQgYnVzIGZvciBmdXR1cmUtcHJvb2ZpbmdcbiAgICAgICAgICAgICAgICBzZWxmLmJ1cy50cmlnZ2VyKCdyYXRpbmc6c2V0OmZhaWwnKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBkZWxldGVTdGFyUmF0aW5nOiBmdW5jdGlvbiAobWVkaWFJZCkge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgICAgICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5wYXRyb25NZWRpYVN0YXJSYXRpbmdzLCB7XG4gICAgICAgICAgICAgICAgdGl0bGVJZDogbWVkaWFJZCxcbiAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgdHlwZTogJ2RlbGV0ZScsXG4gICAgICAgICAgICB0aW1lb3V0OiAwLFxuXG4gICAgICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGRhdGEpIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMpLnRyaWdnZXIoJ3N0YXJSYXRpbmdzU2V0RXJyb3InLCBkYXRhKTtcblxuICAgICAgICAgICAgICAgIC8vIFVzaW5nIG5ldyBldmVudCBidXMgZm9yIGZ1dHVyZS1wcm9vZmluZ1xuICAgICAgICAgICAgICAgIHNlbGYuYnVzLnRyaWdnZXIoJ3JhdGluZzpkZWxldGU6ZmFpbCcpO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIGdldFBhdHJvbkVtYWlsOiBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuICQuYWpheCh7XG4gICAgICAgICAgICB1cmw6IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5wYXRyb25FbWFpbCksXG4gICAgICAgICAgICB0eXBlOiAnR0VUJyxcbiAgICAgICAgICAgIHRpbWVvdXQ6IDAsXG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBib3Jyb3dTdWNjZXNzVG9hc3Q6IGZ1bmN0aW9uIChleHBpcmVzLCBtZWRpYVR5cGVOYW1lKSB7XG4gICAgICAgIHZhciBleHAgPSB3aW5kb3cuaHRtbCgnZGF0ZS1mdWxsJywgeyBkOiBleHBpcmVzIH0pO1xuICAgICAgICB2YXIgdG9hc3RDb3B5S2V5ID0gJ3RvYXN0cy5ib3Jyb3dTdWNjZXNzSHRtbCc7XG4gICAgICAgIGlmIChleHAubWF0Y2goL2ludmFsaWQvaSkpIHtcbiAgICAgICAgICAgIHRvYXN0Q29weUtleSA9ICd0b2FzdHMuYm9ycm93U3VjY2Vzc05vRXhwSHRtbCc7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIGxpbmtVcmwgPSB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMuYWNjb3VudExvYW5zKTtcbiAgICAgICAgdmFyIGxvYW5zID0gd2luZG93Lmh0bWwoJ2xvYW5zJyk7XG4gICAgICAgIGlmICh0b2FzdGVyKSB7XG4gICAgICAgICAgICB0b2FzdGVyLnB1c2goXG4gICAgICAgICAgICAgICAgd2luZG93Lmh0bWwodG9hc3RDb3B5S2V5LCB7XG4gICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZU5hbWU6IG1lZGlhVHlwZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgIGV4cDogZXhwLFxuICAgICAgICAgICAgICAgICAgICBsaW5rOlxuICAgICAgICAgICAgICAgICAgICAgICAgJzxhIGNsYXNzPVwiYm9sZFwiIGhyZWY9XCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtVcmwgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1wiIHRhYmluZGV4PVwiMFwiPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9hbnMgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzwvYT4nLFxuICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgICd1c2VyQWN0aW9uJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH0sXG59O1xuIiwidmFyIGZvY3VzZWQgPSAkKCc6Zm9jdXMnKTtcblxuLyoqXG4gKiBBY3Rpb25zIHRvIHRha2Ugd2hlbiBvcGVuaW5nIG1vZGFsc1xuICovXG4kKCcucmV2ZWFsLW1vZGFsJykuZWFjaChmdW5jdGlvbigpIHtcbiAgICAvKiBDYXB0dXJlIGVsZW1lbnQgdGhhdCBvcGVuZWQgdGhlIG1vZGFsLCBzbyBpdCBjYW4gYmUgcmUtZm9jdXNlZCB3aGVuIHRoZSBtb2RhbCBjbG9zZXMgKi9cbiAgICAkKHRoaXMpLm9uKCdvcGVuLmZuZHRuLnJldmVhbCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICBmb2N1c2VkID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcbiAgICB9KTtcblxuICAgICQodGhpcykub24oJ29wZW5lZC5mbmR0bi5yZXZlYWwnLCBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG1vZGFsID0gdGhpcztcblxuICAgICAgICAkKG1vZGFsKS5hdHRyKCdhcmlhLWhpZGRlbicsIGZhbHNlKTtcbiAgICAgICAgJCgnLmNvbnRhaW5lcicpLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcbiAgICAgICAgJCgnLnJvdy5mb290ZXInKS5hdHRyKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG4gICAgICAgICQoJy5uYXYtY29udGFpbmVyJykuYXR0cignYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuXG4gICAgICAgIC8vUGxhY2UgaW5pdGlhbCBmb2N1cyBpbnNpZGUgb2YgbW9kYWxcbiAgICAgICAgJChtb2RhbCkuZmluZCgnLmpzLWZpcnN0LWZvY3VzJykuZm9jdXMoKTtcblxuICAgIH0pLm9uKCdjbG9zZWQuZm5kdG4ucmV2ZWFsJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICQodGhpcykuYXR0cignYXJpYS1oaWRkZW4nLCB0cnVlKTtcbiAgICAgICAgJCgnLmNvbnRhaW5lcicpLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7XG4gICAgICAgICQoJy5yb3cuZm9vdGVyJykuYXR0cignYXJpYS1oaWRkZW4nLCAnZmFsc2UnKTtcbiAgICAgICAgJCgnLm5hdi1jb250YWluZXInKS5hdHRyKCdhcmlhLWhpZGRlbicsICdmYWxzZScpO1xuICAgICAgICAvL1Jlc3RvcmUgZm9jdXMgdG8gbGFzdCBmb2N1c2VkIGVsZW1lbnQgb3V0c2lkZSBvZiBtb2RhbFxuICAgICAgICBmb2N1c2VkLmZvY3VzKCk7XG4gICAgfSk7XG59KTtcblxuLyoqXG4gKiBLZWVwIGZvY3VzIGluc2lkZSB0aGUgbW9kYWwuIElmIHRoZSB1c2VyIHRhYnMgcGFzdCB0aGUgbGFzdCBlbGVtZW50LCByZS1mb2N1c1xuICogb24gdGhlIGZpcnN0IGVsZW1lbnQgKGpzLWZpcnN0LWZvY3VzKS4gSWYgdGhlIHVzZXIgc2hpZnQtdGFicyBvbiB0aGUgZmlyc3RcbiAqIGVsZW1lbnQsIGZvY3VzIG9uIHRoZSBsYXN0IGVsZW1lbnQgKGpzLWxhc3QtZm9jdXMpLlxuICovXG4kKGRvY3VtZW50KS5vbigna2V5ZG93bicsICcucmV2ZWFsLW1vZGFsJywgZnVuY3Rpb24oZSkge1xuICAgIHZhciBhY3RpdmVFbGVtID0gZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtcblxuICAgIGlmICgkKGFjdGl2ZUVsZW0pLmhhc0NsYXNzKCdqcy1maXJzdC1mb2N1cycpICYmIGUud2hpY2ggPT09IDkgJiYgZS5zaGlmdEtleSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgICQodGhpcykuZmluZCgnLmpzLWxhc3QtZm9jdXMnKS5mb2N1cygpO1xuICAgIH0gZWxzZSBpZiAoJChhY3RpdmVFbGVtKS5oYXNDbGFzcygnanMtbGFzdC1mb2N1cycpICYmIGUud2hpY2ggPT09IDkgJiYgIWUuc2hpZnRLZXkpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICAkKHRoaXMpLmZpbmQoJy5qcy1maXJzdC1mb2N1cycpLmZvY3VzKCk7XG4gICAgfVxufSk7XG5cbi8vQ2xvc2UgbW9kYWwgd2hlbiBlbnRlciBwcmVzc2VkIG9uIGNsb3NlIGJ1dHRvblxuJCgnYS5jbG9zZS1yZXZlYWwtbW9kYWwnKS5rZXlkb3duKGZ1bmN0aW9uKGUpIHtcbiAgICBpZiAoZS53aGljaCA9PSAxMykge1xuICAgICAgICAkKHRoaXMpLmNsaWNrKCk7XG4gICAgfVxufSk7XG5cbi8vU3RvcCBzcGlubmVycyB3aGVuIGJvcnJvdyBvciBob2xkcyByZWxhdGVkIG1vZGFsIGlzIGNsb3NlZFxuJCgnI2hvbGQtZHluYW1pYy1tb2RhbCwgI25vdy1hdmFpbGFibGUtbW9kYWwsICNub3ctdW5hdmFpbGFibGUtbW9kYWwnKS5vbignY2xvc2VkLmZuZHRuLnJldmVhbCcsIGZ1bmN0aW9uKCkge1xuXG4gICAgLy9QdXQgdGl0bGUgZWxlbWVudHMgYmFjayB0byBvcmlnaW5hbCBzdGF0ZS5cbiAgICAkKCdhLnByaW1hcnktYWN0aW9uIGltZzp2aXNpYmxlJykuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGNvbnRhaW5lciA9ICQodGhpcykuY2xvc2VzdCgnYS5wcmltYXJ5LWFjdGlvbicpO1xuICAgICAgICBjb250YWluZXIuaHRtbChjb250YWluZXIuYXR0cignZGF0YS1vcmlnaW5hbC10ZXh0JykpO1xuICAgIH0pO1xufSk7XG4iLCJpbXBvcnQgeyBLYW5vcHlNZW51QWRWaWV3IH0gZnJvbSAnLi4vLi4vZWNtYXNjcmlwdC9jb21wb25lbnRzL2thbm9weS1tZW51LWFkL2thbm9weS1tZW51LWFkLXZpZXcnO1xuXG4vKiBlc2xpbnQgbm8taW52YWxpZC10aGlzOiBcIm9mZlwiICovXG4vKiBlc2xpbnQgZnVuYy1zdHlsZTogXCJvZmZcIiAqL1xudmFyIG9wZW5NZW51ID0gJ21haW4nO1xuXG52YXIgdHJpbU91dHNpZGVGb3J3YXJkU2xhc2hlcyA9IGZ1bmN0aW9uIChzKSB7XG4gICAgaWYgKHMpIHtcbiAgICAgICAgcmV0dXJuIHMucmVwbGFjZSgvXlxcLz8oLio/KVxcLz8kLywgJyQxJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfVxufTtcblxudmFyIGdldEZvcm1XaWR0aCA9IGZ1bmN0aW9uICgkZWxlbSkge1xuICAgIHJldHVybiAoXG4gICAgICAgICQoJy5qcy1tb2JpbGVTZWFyY2hDb250YWluZXInKS53aWR0aCgpIC1cbiAgICAgICAgJCgnLmpzLW1vYmlsZU5hdlNlYXJjaEljb24nKS53aWR0aCgpIC1cbiAgICAgICAgJGVsZW0ud2lkdGgoKSAtXG4gICAgICAgIDMwXG4gICAgKTtcbn07XG5cbmNvbnN0IHJlbmRlckthbm9weUFkID0gKCkgPT4ge1xuICAgIGNvbnN0IG1lbnVBZEVsID0gJCgnLmthbm9weS1tZW51LWFkLWNvbnRhaW5lcicpO1xuICAgIGlmICh3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdrYW5vcHktcHJvbW8nKSAmJiBtZW51QWRFbCkge1xuICAgICAgICBuZXcgS2Fub3B5TWVudUFkVmlldyh7XG4gICAgICAgICAgICBlbDogbWVudUFkRWwsXG4gICAgICAgICAgICBoaWdoQ29udHJhc3Q6IHdpbmRvdy5PdmVyRHJpdmUuaGlnaENvbnRyYXN0LFxuICAgICAgICAgICAgaXNUb2xpbm9EZXZpY2U6IHdpbmRvdy5PdmVyRHJpdmUuaXNUb2xpbm9EZXZpY2UsXG4gICAgICAgICAgICBrYW5vcHlTaWduVXBVcmw6IHdpbmRvdy5PdmVyRHJpdmUua2Fub3B5U2lnblVwVXJsLFxuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG4kKGRvY3VtZW50KS5yZWFkeShmdW5jdGlvbiAoKSB7XG4gICAgLy8gRG9uJ3Qgc3VibWl0IGEgYmxhbmsgc2VhcmNoXG4gICAgJChkb2N1bWVudCkub24oJ2tleXVwJywgJ2lucHV0W2RhdGEtc2VhcmNoXScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmIChlLndoaWNoID09IDEzKSB7XG4gICAgICAgICAgICBpZiAoJCh0aGlzKS52YWwoKSAhPSAnJykge1xuICAgICAgICAgICAgICAgICQodGhpcykucGFyZW50cygnZm9ybScpLnN1Ym1pdCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBpZiB0aGUgdXNlciBpcyBub3Qgb24gdGhlIGhvbWUgcGFnZS4uLlxuICAgIHZhciBjdXJyZW50UGF0aCA9IHRyaW1PdXRzaWRlRm9yd2FyZFNsYXNoZXMobG9jYXRpb24ucGF0aG5hbWUpO1xuICAgIHZhciBob21lUGF0aCA9IHRyaW1PdXRzaWRlRm9yd2FyZFNsYXNoZXMod2luZG93LnVybCh3aW5kb3cucm91dGVzLmhvbWUpKTtcbiAgICBpZiAoY3VycmVudFBhdGggIT09IGhvbWVQYXRoKSB7XG4gICAgICAgIC8vIC4uLnRoZW4gdW5kZXJsaW5lIHRoZSBuYXYgbGluayBvZiB0aGUgY3VycmVudCBwYWdlIGlmIGl0IGV4aXN0c1xuICAgICAgICAvLyBUT0RPOiBSZWZhY3RvciBhd2F5IHRoZXNlIGdlbmVyYWwgc2VsZWN0b3JzIGFuZCBkbyBpdCBtb3JlIGNsZWFubHlcbiAgICAgICAgJCgnYVtocmVmKj1cIicgKyBjdXJyZW50UGF0aCArICdcIl0nKS5hZGRDbGFzcygnc2VsZWN0ZWQnKTtcbiAgICAgICAgJCgnYVtocmVmKj1cIicgKyBjdXJyZW50UGF0aCArICdcIl0gbGkgc3BhbicpLmFkZENsYXNzKCdzZWxlY3RlZCcpO1xuICAgIH1cblxuICAgIGlmICgkKGRvY3VtZW50KS53aWR0aCgpID4gODcwKSB7XG4gICAgICAgICQoJy5qcy10b2dnbGVSb3cnKS5yZW1vdmVDbGFzcygncm93Jyk7XG4gICAgfVxuXG4gICAgLy8gRml0IG1vYmlsZSBzZWFyY2ggdG8gY29udGFpbmVyXG4gICAgJCgnLmpzLW1vYmlsZVNlYXJjaEZvcm0nKS5jc3MoXG4gICAgICAgICd3aWR0aCcsXG4gICAgICAgIGdldEZvcm1XaWR0aCgkKCcuanMtbW9iaWxlTmF2SWNvbkNvbnRhaW5lcicpKSArICdweCdcbiAgICApO1xufSk7XG5cbiQoJy5qcy1tb2JpbGVTZWFyY2hJbnB1dCcpXG4gICAgLm9uKCd0b3VjaHN0YXJ0IGNsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICghJCgnLmpzLWFkdmFuY2VkU2VhcmNoQ29udGFpbmVyJykuaXMoJzp2aXNpYmxlJykpIHtcbiAgICAgICAgICAgICAgICAkKCcuanMtYWR2YW5jZWRTZWFyY2hDb250YWluZXInKS50b2dnbGUoKTtcbiAgICAgICAgICAgICAgICBpZiAod2luZG93LnRvYXN0ZXIpIHdpbmRvdy50b2FzdGVyLl9zdGlja1RvYXN0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICgkKCcuanMtYWNjb3VudC1tZW51LW1vYmlsZScpLmhhc0NsYXNzKCdpcy1vcGVuJykpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuQWNjb3VudE1lbnVNb2JpbGVWaWV3LmNsb3NlKCk7XG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy50b2FzdGVyKSB3aW5kb3cudG9hc3Rlci5fc3RpY2tUb2FzdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAxKTtcbiAgICB9KVxuICAgIC5vbignZm9jdXNvdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIGZvY3VzZWQgPSAkKGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpO1xuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICFmb2N1c2VkLmhhc0NsYXNzKCdqcy1hZHZhbmNlZFNlYXJjaExpbmsnKSAmJlxuICAgICAgICAgICAgICAgICQoJy5qcy1hZHZhbmNlZFNlYXJjaENvbnRhaW5lcicpLmNzcygnZGlzcGxheScpID09ICdibG9jaycgJiZcbiAgICAgICAgICAgICAgICAhZm9jdXNlZC5oYXNDbGFzcygnanMtbW9iaWxlU2VhcmNoSW5wdXQnKVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy50b2FzdGVyKSB3aW5kb3cudG9hc3Rlci5fc3RpY2tUb2FzdCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LCAxKTtcbiAgICB9KTtcblxuJChcbiAgICAnLmpzLW5vdGlmaWNhdGlvbnNCdXR0b24sIC5Nb2JpbGVOYXYtYm9va3NoZWxmTGluaywgLmpzLW1vYmlsZU1lbnUsIC5qcy1hZHZhbmNlZFNlYXJjaENvbnRhaW5lciwgLmpzLW1vYmlsZVNlYXJjaElucHV0J1xuKS5vbignZm9jdXNvdXQnLCBmdW5jdGlvbiAoKSB7XG4gICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBmb2N1c2VkID0gJChkb2N1bWVudC5hY3RpdmVFbGVtZW50KTtcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgIWZvY3VzZWQuaGFzQ2xhc3MoJ2pzLW5vdGlmaWNhdGlvbnNCdXR0b24nKSAmJlxuICAgICAgICAgICAgIWZvY3VzZWQuaGFzQ2xhc3MoJ01vYmlsZU5hdi1ib29rc2hlbGZMaW5rJykgJiZcbiAgICAgICAgICAgICFmb2N1c2VkLmhhc0NsYXNzKCdqcy1tb2JpbGVNZW51JykgJiZcbiAgICAgICAgICAgICFmb2N1c2VkLmhhc0NsYXNzKCdqcy1hZHZhbmNlZFNlYXJjaExpbmsnKSAmJlxuICAgICAgICAgICAgIWZvY3VzZWQuaGFzQ2xhc3MoJ2pzLW1vYmlsZVNlYXJjaElucHV0JylcbiAgICAgICAgKSB7XG4gICAgICAgICAgICAkKCcuanMtYWR2YW5jZWRTZWFyY2hDb250YWluZXInKS5oaWRlKCk7XG4gICAgICAgIH1cbiAgICB9LCAxKTtcbn0pO1xuXG4vLyBIYW5kbGUgbW9iaWxlIG5hdiBtZW51XG4kKCcuanMtbW9iaWxlTWVudScpLm9uKFxuICAgICd0YXAgY2xpY2snLFxuICAgIF8uZGVib3VuY2UoZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgIC8vIExIVE5HLTM5MzggLSB0aGlzIGlzIGEgbGFzdCBkaXRjaCBoYWNrLiAgVGhlIG5vdGlmaWNhdGlvbiBkcmF3ZXIgdXNlcyBhIGNsaWNrIGhhbmRsZXIgb24gPGJvZHk+IHRvIGNsb3NlIGl0c2VsZiwgYnV0XG4gICAgICAgIC8vIHRoaXMgbWVudSBkb2Vzbid0IHBsYXkgbmljZSB3aXRoIHRoYXQgcGF0dGVybi4gSSB0cmllZCB0byBjbGVhbiB0aGF0IHVwIGFuZCBhbGxvdyB0aGUgY2xpY2sgdG8gcHJvcGFnYXRlIGJ1dCB0aGF0XG4gICAgICAgIC8vIHJldmVhbGVkIGEgaHVnZSBtZXNzIG9mIGlzc3VlcyB0aGF0IHdlIGNhbid0IHRhY2tsZSBub3cuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIHdpbmRvdy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ05vdGlmaWNhdGlvbnMnKSAmJlxuICAgICAgICAgICAgd2luZG93Lm5vdGlmaWNhdGlvbkRyYXdlclxuICAgICAgICApIHtcbiAgICAgICAgICAgIHdpbmRvdy5ub3RpZmljYXRpb25EcmF3ZXIuY2xvc2UoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJlbmRlckthbm9weUFkKCk7XG5cbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAod2luZG93LnRvYXN0ZXIpIHdpbmRvdy50b2FzdGVyLl9zdGlja1RvYXN0KCk7XG4gICAgICAgIH0sIDApO1xuXG4gICAgICAgIGlmICgkKCcuaWNvbi1zZWFyY2gtbmF2JykuaGFzQ2xhc3MoJ2V4cGFuZGVkJykpIHtcbiAgICAgICAgICAgICQoJy5pY29uLXNlYXJjaC1uYXYnKVxuICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnZXhwYW5kZWQnKVxuICAgICAgICAgICAgICAgIC5hZGRDbGFzcygndW5leHBhbmRlZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgJChcbiAgICAgICAgICAgICcjbW9iaWxlLW5hdi1mb3VuZGF0aW9uLWRyb3Bkb3duW2RhdGEtbWVudT1cIicgKyBvcGVuTWVudSArICdcIl0nXG4gICAgICAgICkudG9nZ2xlKCk7XG5cbiAgICAgICAgaWYgKCQoJy5qcy1hY2NvdW50LW1lbnUtbW9iaWxlJykuaGFzQ2xhc3MoJ2lzLW9wZW4nKSkge1xuICAgICAgICAgICAgd2luZG93LkFjY291bnRNZW51TW9iaWxlVmlldy5jbG9zZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCQodGhpcykuYXR0cignaWQnKSA9PSAnaGFtYnVyZ2VyJykge1xuICAgICAgICAgICAgaWYgKCQodGhpcykuYXR0cignYXJpYS1leHBhbmRlZCcpID09ICdmYWxzZScpIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMpLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCAndHJ1ZScpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMpLmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfSwgMzUwKVxuKTtcblxuLy8gQWR2YW50YWdlIHRvdXRcbiQoJ2RpdiNkcm9wQWNjb3VudC5sYXJnZScpXG4gICAgLm9uKCdvcGVuZWQuZm5kdG4uZHJvcGRvd24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICQoJy50b3AtYmFyJykuY3NzKCdvdmVyZmxvdycsICd2aXNpYmxlJyk7XG4gICAgICAgIHZhciBsaW5rID0gJCh0aGlzKS5maW5kKCdhJyk7XG4gICAgICAgICQodGhpcykuZmluZCgncCcpLmF0dHIoJ3RhYmluZGV4JywgbGluay5hdHRyKCdkYXRhLXRhYicpKTtcbiAgICAgICAgbGluay5hdHRyKCd0YWJpbmRleCcsIGxpbmsuYXR0cignZGF0YS10YWInKSk7XG4gICAgfSlcbiAgICAub24oJ2Nsb3NlZC5mbmR0bi5kcm9wZG93bicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJCh0aGlzKS5maW5kKCdwJykuYXR0cigndGFiaW5kZXgnLCAtMSk7XG4gICAgICAgICQodGhpcykuZmluZCgnYScpLmF0dHIoJ3RhYmluZGV4JywgLTEpO1xuICAgIH0pO1xuXG4kKHdpbmRvdykucmVzaXplKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgd2lkdGggPSAkKGRvY3VtZW50KS53aWR0aCgpO1xuICAgIGlmICh3aWR0aCA8PSA4NTUpIHtcbiAgICAgICAgJCgnLmpzLXRvZ2dsZVJvdycpLmFkZENsYXNzKCdyb3cnKTtcblxuICAgICAgICB2YXIgc2VhcmNoRm9ybSA9ICQoJy5qcy1tb2JpbGVTZWFyY2hGb3JtJyk7XG4gICAgICAgIGlmIChzZWFyY2hGb3JtLmhhc0NsYXNzKCdpcy1leHBhbmRlZCcpKSB7XG4gICAgICAgICAgICBzZWFyY2hGb3JtLmNzcyhcbiAgICAgICAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgICAgICAgIGdldEZvcm1XaWR0aCgkKCcuanMtc2VhcmNoQ29udHJvbENvbnRhaW5lcicpKSArICdweCdcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWFyY2hGb3JtLmNzcyhcbiAgICAgICAgICAgICAgICAnd2lkdGgnLFxuICAgICAgICAgICAgICAgIGdldEZvcm1XaWR0aCgkKCcuanMtbW9iaWxlTmF2SWNvbkNvbnRhaW5lcicpKSArICdweCdcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICAkKCcuanMtdG9nZ2xlUm93JykucmVtb3ZlQ2xhc3MoJ3JvdycpO1xuICAgIH1cbn0pO1xuXG5mdW5jdGlvbiBleGl0U2VhcmNoTW9kZSgpIHtcbiAgICAkKCcuanMtc2VhcmNoQ29udHJvbENvbnRhaW5lcicpLmFkZENsYXNzKCd1LWhpZGVNZScpO1xuICAgIHZhciBpY29uQ29udGFpbmVyID0gJCgnLmpzLW1vYmlsZU5hdkljb25Db250YWluZXInKTtcbiAgICBpY29uQ29udGFpbmVyLnJlbW92ZUNsYXNzKCd1LWhpZGVNZScpO1xuICAgICQoJy5qcy1tb2JpbGVTZWFyY2hGb3JtJylcbiAgICAgICAgLnJlbW92ZUNsYXNzKCdpcy1leHBhbmRlZCcpXG4gICAgICAgIC5hZGRDbGFzcygnaXMtdW5leHBhbmRlZCcpXG4gICAgICAgIC5jc3MoJ3dpZHRoJywgZ2V0Rm9ybVdpZHRoKGljb25Db250YWluZXIpICsgJ3B4Jyk7XG59XG5cbmZ1bmN0aW9uIGVudGVyU2VhcmNoTW9kZSgpIHtcbiAgICB2YXIgc2VhcmNoQ29udGFpbmVyID0gJCgnLmpzLXNlYXJjaENvbnRyb2xDb250YWluZXInKTtcbiAgICBzZWFyY2hDb250YWluZXIucmVtb3ZlQ2xhc3MoJ3UtaGlkZU1lJyk7XG4gICAgJCgnLmpzLW1vYmlsZU5hdkljb25Db250YWluZXInKS5hZGRDbGFzcygndS1oaWRlTWUnKTtcbiAgICAkKCcuanMtbW9iaWxlU2VhcmNoRm9ybScpXG4gICAgICAgIC5hZGRDbGFzcygnaXMtZXhwYW5kZWQnKVxuICAgICAgICAucmVtb3ZlQ2xhc3MoJ2lzLXVuZXhwYW5kZWQnKVxuICAgICAgICAuY3NzKCd3aWR0aCcsIGdldEZvcm1XaWR0aChzZWFyY2hDb250YWluZXIpICsgJ3B4Jyk7XG59XG5cbi8vIENsb3NlIG1vYmlsZSBzZWFyY2ggYmFyXG4kKCcuanMtY2xlYXJNb2JpbGVTZWFyY2gnKS5vbigndGFwIGNsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICQoJy5qcy1tb2JpbGVTZWFyY2hJbnB1dCcpLnZhbCgnJykudHJpZ2dlcigna2V5dXAnKS5mb2N1cygpO1xuICAgIGV4aXRTZWFyY2hNb2RlKCk7XG4gICAgJCgnLmpzLWFkdmFuY2VkU2VhcmNoQ29udGFpbmVyJykuc2hvdygpO1xuXG4gICAgLy9IYWNrcyB1bnRpbCBJIG1vdmUgYWxsIHRoaXMgbG9naWMgdG8gYmFja2JvbmUgdmlld3NcbiAgICAkKCcuanMtcXVpY2tTZWFyY2hJbnB1dCcsICcuanMtcXVpY2tTZWFyY2hNb2JpbGUnKS50cmlnZ2VyKCdrZXl1cCcpO1xuICAgICQoJy5qcy1xdWlja1NlYXJjaElucHV0JywgJy5qcy1xdWlja1NlYXJjaE1vYmlsZScpLnRyaWdnZXIoJ2ZvY3Vzb3V0Jyk7XG59KTtcblxuJCgnLmpzLW1vYmlsZVNlYXJjaElucHV0JylcbiAgICAub24oJ2tleXVwJywgZnVuY3Rpb24gKCkge1xuICAgICAgICBlbnRlclNlYXJjaE1vZGUoKTtcblxuICAgICAgICBpZiAoJCh0aGlzKS52YWwoKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGV4aXRTZWFyY2hNb2RlKCk7XG4gICAgICAgICAgICAkKCcuanMtYWR2YW5jZWRTZWFyY2hDb250YWluZXInKS5zaG93KCk7XG4gICAgICAgIH1cbiAgICB9KVxuICAgIC5vbignY2xpY2sgZm9jdXMnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICgkKHRoaXMpLnZhbCgpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGVudGVyU2VhcmNoTW9kZSgpO1xuICAgICAgICB9XG4gICAgICAgICQoJy5qcy1hZHZhbmNlZFNlYXJjaENvbnRhaW5lcicpLnNob3coKTtcbiAgICB9KVxuICAgIC5vbignYmx1cicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgLy8gV2hlbiBtb2JpbGUgc2VhcmNoIGlucHV0IGxvc2VzIGZvY3VzLCB1bmhpZGUgbW9iaWxlIGFjY291bnQgbWVudVxuICAgICAgICAkKCcuanMtYWNjb3VudC1tZW51LWxpbmssIC5qcy1hY2NvdW50LW1lbnUtbW9iaWxlJykucmVtb3ZlQ2xhc3MoXG4gICAgICAgICAgICAnaGlkZU1lSW1wb3J0YW50J1xuICAgICAgICApO1xuICAgIH0pO1xuXG4kKGRvY3VtZW50KS5jbGljayhmdW5jdGlvbiAoZSkge1xuICAgIGlmICghJChlLnRhcmdldCkucGFyZW50KCkucGFyZW50KCkuaGFzQ2xhc3MoJ2pzLW1vYmlsZVNlYXJjaENvbnRhaW5lcicpKSB7XG4gICAgICAgIGV4aXRTZWFyY2hNb2RlKCk7XG4gICAgfVxufSk7XG5cbiQoJy5qcy1kb1F1aWNrU2VhcmNoJykub24oJ3RvdWNoc3RhcnQgY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmICgkKCcuanMtbW9iaWxlU2VhcmNoSW5wdXQnKS52YWwoKSAhPT0gJycpIHtcbiAgICAgICAgJCgnI3NlYXJjaC1mb3JtLW1vYmlsZScpLnN1Ym1pdCgpO1xuICAgIH1cbn0pO1xuXG4vL1RvZ2dsZSBmb3VuZGF0aW9uIGFjY29yZGlvblxuJCgnLmFjY29yZGlvbi50b3AtbmF2IGxpLCBzcGFuLm5hdi1wYW5lbC1pY29uJykub24oXG4gICAgJ3RhcCBjbGljaycsXG4gICAgJ2E6ZXEoMCksIGE6ZXEoMSksIHNwYW4nLFxuICAgIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgdmFyIGxpX3BhcmVudCA9ICQodGhpcykucGFyZW50KCk7XG5cbiAgICAgICAgaWYgKGxpX3BhcmVudC5oYXNDbGFzcygnYWN0aXZlJykgJiYgbGlfcGFyZW50Lmhhc0NsYXNzKCd0b3AtbmF2JykpIHtcbiAgICAgICAgICAgIGxpX3BhcmVudC5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XG4gICAgICAgICAgICAkKCcuYWNjb3JkaW9uLnRvcC1uYXYgbGkgZGl2LmNvbnRlbnQ6dmlzaWJsZScpLnRvZ2dsZSgpO1xuICAgICAgICB9IGVsc2UgaWYgKGxpX3BhcmVudC5oYXNDbGFzcygndG9wLW5hdicpKSB7XG4gICAgICAgICAgICAkKCcuYWNjb3JkaW9uLW5hdmlnYXRpb24udG9wLW5hdicpLnJlbW92ZUNsYXNzKCdhY3RpdmUnKTtcbiAgICAgICAgICAgIGxpX3BhcmVudC5hZGRDbGFzcygnYWN0aXZlJyk7XG4gICAgICAgICAgICAkKCcuYWNjb3JkaW9uLnRvcC1uYXYgbGkgZGl2LmNvbnRlbnQ6dmlzaWJsZScpLnRvZ2dsZSgpO1xuICAgICAgICAgICAgJCh0aGlzKS5wYXJlbnQoKS5maW5kKCcuY29udGVudCcpLnRvZ2dsZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHdpbmRvdy50b2FzdGVyKSB3aW5kb3cudG9hc3Rlci5fc3RpY2tUb2FzdCgpO1xuICAgIH1cbik7XG5cbi8vIFJlbW92ZSBkZXNrdG9wIHZpZXcgc2VhcmNoYmFyIGF1dG9mb2N1cyBvbiBtb2JpbGUgZGV2aWNlc1xudmFyIG1vYmlsZSA9IGJvd3Nlci5tb2JpbGU7XG52YXIgdGFibGV0ID0gYm93c2VyLnRhYmxldDtcblxuaWYgKG1vYmlsZSB8fCB0YWJsZXQpIHtcbiAgICAkKCcuc2VhcmNoLWlucHV0JykucmVtb3ZlQXR0cignYXV0b2ZvY3VzJyk7XG59IGVsc2Uge1xuICAgICQoJy5zZWFyY2gtaW5wdXQnKS5mb2N1cygpO1xufVxuXG4vLyBUT0RPOiBFdmFsdWF0ZSBpZiB0aGlzIGlzIHN0aWxsIG5lZWRlZCAtIE1EXG53aW5kb3cub25vcmllbnRhdGlvbmNoYW5nZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAoXG4gICAgICAgICQoJy5zZWFyY2gtaW5wdXQtbW9iaWxlJykuY3NzKCdkaXNwbGF5JykgIT0gJ25vbmUnICYmXG4gICAgICAgICQoJy5zZWFyY2gtaW5wdXQnKS5jc3MoJ2Rpc3BsYXknKSA9PSAnbm9uZScgJiZcbiAgICAgICAgJCgnaW5wdXQ6Zm9jdXMnKS5sZW5ndGggPiAwICYmXG4gICAgICAgIE1hdGguYWJzKHdpbmRvdy5vcmllbnRhdGlvbikgIT0gOTBcbiAgICApIHtcbiAgICAgICAgJCgnLmpzLW1vYmlsZVNlYXJjaElucHV0JykudHJpZ2dlcignY2xpY2snKTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgICBNYXRoLmFicyh3aW5kb3cub3JpZW50YXRpb24pID09PSA5MCAmJlxuICAgICAgICAkKCdpbnB1dDpmb2N1cycpLmxlbmd0aCA+IDBcbiAgICApIHtcbiAgICAgICAgJCgnLnNlYXJjaC1pbnB1dCcpLnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgfSBlbHNlIGlmICgkKCdpbnB1dDpmb2N1cycpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgJCgnLmpzLW1vYmlsZVNlYXJjaElucHV0JykudHJpZ2dlcignY2xpY2snKTtcbiAgICB9XG59O1xuXG4kKCdpbnB1dFtkYXRhLXNlYXJjaF0nKS5jbGljayhmdW5jdGlvbiAoZSkge1xuICAgIGlmICghJCgnaW5wdXRbZGF0YS1zZWFyY2hdJykuaXMoJzpmb2N1cycpKSB7XG4gICAgICAgIGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQuYmx1cigpO1xuICAgICAgICAkKHRoaXMpLmJsdXIoKTtcbiAgICAgICAgdmFyIHRlbXAgPSAkKHRoaXMpLnZhbCgpO1xuICAgICAgICAkKCdpbnB1dFtkYXRhLXNlYXJjaF0nKS52YWwodGVtcCk7XG4gICAgICAgICQodGhpcykuZm9jdXMoKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbn0pO1xuXG5pZiAoJCgnLmpzLW1vYmlsZUxpYnJhcnlMb2dvJykuYXR0cignc3JjJykgPT0gJycpIHtcbiAgICBzaG93QWx0TG9nb01vYmlsZSgpO1xufVxuXG5pZiAoJCgnaDEjbG9nby1kZXNrdG9wIGEgaW1nJykuYXR0cignc3JjJykgPT0gJycpIHtcbiAgICBzaG93QWx0TG9nb0Rlc2t0b3AoKTtcbn1cblxuLyoqXG4gKiBTZXQgdGFiIGluZGljZXMgZm9yIG5hdiBtZW51XG4gKi9cblxudmFyIHJlc2l6ZWQgPSBmYWxzZTtcbiQoJ3VsI2Ryb3AtY29sbGVjdGlvbnMnKVxuICAgIC5vbignb3BlbmVkLmZuZHRuLmRyb3Bkb3duJywgZnVuY3Rpb24gKGV2ZW50KSB7XG4gICAgICAgICQodGhpcykuZmluZCgnYSwgaDInKS5hdHRyKCd0YWJpbmRleCcsIDApO1xuICAgICAgICAvLyAkKHRoaXMpLmZpbmQoJ2gyOmZpcnN0JykuZm9jdXMoKTtcbiAgICAgICAgaWYgKCFyZXNpemVkKSB7XG4gICAgICAgICAgICAvLyBEZXRlcm1pbmUgc2l6ZSBvZiBuYXZpZ2F0aW9uIGJhc2VkIG9uICMgb2YgY29sdW1uc1xuICAgICAgICAgICAgdmFyIG5hdiA9ICQoJ3VsI2Ryb3AtY29sbGVjdGlvbnMnKTtcbiAgICAgICAgICAgIHZhciBjb2x1bW5zID0gbmF2LmZpbmQoJ3VsOmZpcnN0LWNoaWxkJykuY2hpbGRyZW4oJ2xpJyk7XG4gICAgICAgICAgICB2YXIgY29sdW1uQ291bnQgPSBjb2x1bW5zLmxlbmd0aDtcbiAgICAgICAgICAgIHZhciBjb2x1bW5XaWR0aCA9ICgxIC8gY29sdW1uQ291bnQpICogMTAwICsgJyUnO1xuXG4gICAgICAgICAgICBjb2x1bW5zLmNzcygnd2lkdGgnLCBjb2x1bW5XaWR0aCk7XG5cbiAgICAgICAgICAgIGlmIChjb2x1bW5Db3VudCA9PT0gMykge1xuICAgICAgICAgICAgICAgIGNvbHVtbnMubGFzdCgpLmNzcygnd2lkdGgnLCAnMjAwcHgnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbmF2LmFkZENsYXNzKCduYXYtJyArIGNvbHVtbkNvdW50ICsgJy1jb2x1bW5zJyk7XG4gICAgICAgICAgICByZXNpemVkID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0pXG4gICAgLm9uKCdjbG9zZWQuZm5kdG4uZHJvcGRvd24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICQodGhpcykuZmluZCgnYSwgaDInKS5hdHRyKCd0YWJpbmRleCcsIC0xKTtcbiAgICB9KTtcblxuJCgnLk5hdi1jb2xsZWN0aW9uc0xpbmsnKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHdpbmRvdy5Gb3VuZGF0aW9uLmxpYnMuZHJvcGRvd24udG9nZ2xlKCQodGhpcykpO1xuXG4gICAgcmVuZGVyS2Fub3B5QWQoKTtcbn0pO1xuXG4kKCcuTmF2LWNvbGxlY3Rpb25zTGluaycpLm9uKCdrZXl1cCcsIGZ1bmN0aW9uIChldmVudCkge1xuICAgIGV2ZW50LnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgaWYgKGV2ZW50LndoaWNoID09PSAxMykge1xuICAgICAgICB3aW5kb3cuRm91bmRhdGlvbi5saWJzLmRyb3Bkb3duLnRvZ2dsZSgkKHRoaXMpKTtcblxuICAgICAgICByZW5kZXJLYW5vcHlBZCgpO1xuICAgIH1cbn0pO1xuXG4kKCd1bCNsYW5ndWFnZS1kcm9wZG93bicpXG4gICAgLm9uKCdvcGVuZWQuZm5kdG4uZHJvcGRvd24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICQodGhpcykuZmluZCgnYScpLmF0dHIoJ3RhYmluZGV4JywgMCk7XG4gICAgICAgICQodGhpcykuZmluZCgnYTpmaXJzdCcpO1xuICAgICAgICAkKHRoaXMpLmF0dHIoJ3RhYmluZGV4JywgMCkuZm9jdXMoKTtcbiAgICB9KVxuICAgIC5vbignY2xvc2VkLmZuZHRuLmRyb3Bkb3duJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAkKHRoaXMpLmZpbmQoJ2EnKS5hdHRyKCd0YWJpbmRleCcsIC0xKTtcbiAgICAgICAgJCh0aGlzKS5hdHRyKCd0YWJpbmRleCcsIC0xKTtcbiAgICB9KTtcblxuLy8gQ2xvc2UgbmF2IHdoZW4gYWNjb3VudCBkcm9wZG93biBpcyBvcGVuZWRcbiQoJyNkcm9wQWNjb3VudCcpLm9uKCdvcGVuZWQuZm5kdG4uZHJvcGRvd24nLCBmdW5jdGlvbiAoZSkge1xuICAgIHdpbmRvdy5Gb3VuZGF0aW9uLmxpYnMuZHJvcGRvd24uY2xvc2UoJCgnI2Ryb3AtY29sbGVjdGlvbnMnKSk7XG59KTtcblxuJCgnLmpzLWNsb3NlQWR2YW50YWdlVG91dCcpLm9uKCdjbGljayB0YXAnLCBmdW5jdGlvbiAoKSB7XG4gICAgQ29va2llcy5zZXQoJ2FkdmFudGFnZS1kaXNtaXNzZWQnLCAnMScsIHsgcGF0aDogJy8nLCBleHBpcmVzOiAxIH0pO1xuXG4gICAgdmFyIGFjY291bnRTaWduSW5VcmwgPSB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMuYWNjb3VudFNpZ25Jbik7XG5cbiAgICAkKCcuanMtYWR2YW50YWdlVG91dCcpLmhpZGUoKTtcbiAgICBpZiAod2luZG93LnRvYXN0ZXIpIHdpbmRvdy50b2FzdGVyLl9zdGlja1RvYXN0KCk7XG4gICAgJCgnYSNhY2NvdW50LWhvbGRlci1uYW1lLCBbZGF0YS1kcm9wZG93bj1cImRyb3BBY2NvdW50TW9iaWxlXCJdJylcbiAgICAgICAgLnJlbW92ZUF0dHIoJ2FyaWEtaGFzcG9wdXAgZGF0YS1vcHRpb25zIGFyaWEtY29udHJvbHMnKVxuICAgICAgICAuYXR0cih7IGhyZWY6IGFjY291bnRTaWduSW5VcmwsICdkYXRhLWZvcndhcmQnOiAnJyB9KTtcbiAgICAkKFxuICAgICAgICAnI2FjY291bnQtaG9sZGVyLW5hbWUsIGxpLmFjY291bnQtZHJvcGRvd24tbW9iaWxlIGEgaS5pY29uLWFjY291bnQsIFtkYXRhLWRyb3Bkb3duPVwiZHJvcEFjY291bnRNb2JpbGVcIl0nXG4gICAgKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgIH0pO1xufSk7XG4iLCIkKCcuc2FtcGxlLW1vZGFsJykub24oJ2Nsb3NlZC5mbmR0bi5yZXZlYWwnLCBmdW5jdGlvbiAoZSkge1xuICAgICQoJ2lmcmFtZSNzYW1wbGUtZHluYW1pYy1pZnJhbWUnKS5hdHRyKCdzcmMnLCAnYWJvdXQ6YmxhbmsnKTtcbn0pO1xuXG4kKCgpID0+IHtcbiAgICBpZiAoIXdpbmRvdy5mZWF0dXJlTWFuYWdlci5pc0VuYWJsZWQoJ2NsZWFudXBDb250ZXh0TWVudVRvZ2dsZScpKSB7XG4gICAgICAgICQoJ2JvZHknKS5vbignY2xpY2sga2V5dXAnLCAnLmpzLWNvbnRleHQtYnV0dG9uJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG5cbiAgICAgICAgICAgIGlmIChlLnR5cGUgPT09ICdjbGljaycgfHwgZS53aGljaCA9PT0gMzIgfHwgZS53aGljaCA9PT0gMTMpIHtcbiAgICAgICAgICAgICAgICAvL0lmIG1lbnUgaXMgYWxyZWFkeSBvcGVuIGNsb3NlIGl0XG4gICAgICAgICAgICAgICAgdmFyIGRyb3Bkb3duID0gJCh0aGlzKS5hdHRyKCdkYXRhLWRyb3Bkb3duJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoJCgndWwjJyArIGRyb3Bkb3duKS5vZmZzZXQoKS5sZWZ0ID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBGb3VuZGF0aW9uLmxpYnMuZHJvcGRvd24uY2xvc2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAkKCcjJyArIGRyb3Bkb3duKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5qcy1jb250ZXh0LWJ1dHRvbltkYXRhLWRyb3Bkb3duPVwiJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJyMnICsgZHJvcGRvd24pLmF0dHIoJ2lkJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCJdJ1xuICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAkKCd1bCMnICsgZHJvcGRvd24gKyAnIGxpIGEnKS5hdHRyKCd0YWJpbmRleCcsIC0xKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5mb3VuZGF0aW9uKCdkcm9wZG93bicsICdjbG9zZWFsbCcpO1xuICAgICAgICAgICAgICAgICAgICAkKCd1bCMnICsgZHJvcGRvd24gKyAnIGxpIGEnKS5hdHRyKCd0YWJpbmRleCcsIDApO1xuICAgICAgICAgICAgICAgICAgICBGb3VuZGF0aW9uLmxpYnMuZHJvcGRvd24ub3BlbihcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJyMnICsgZHJvcGRvd24pLFxuICAgICAgICAgICAgICAgICAgICAgICAgJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLmpzLWNvbnRleHQtYnV0dG9uW2RhdGEtZHJvcGRvd249XCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCgnIycgKyBkcm9wZG93bikuYXR0cignaWQnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcIl0nXG4gICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICQodGhpcykuZm9jdXMoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn0pO1xuXG4kKCdib2R5Jykub24oJ2Nsb3NlZC5mbmR0bi5kcm9wZG93bicsICcuanMtY29udGV4dC1kcm9wJywgZnVuY3Rpb24gKGUpIHtcbiAgICAkKGUudGFyZ2V0KS5maW5kKCdhJykuYXR0cigndGFiaW5kZXgnLCAnLTEnKTtcbn0pO1xuXG4kKCdib2R5Jykub24oJ29wZW5lZC5mbmR0bi5kcm9wZG93bicsICcuanMtY29udGV4dC1kcm9wJywgZnVuY3Rpb24gKGUpIHtcbiAgICAkKGUudGFyZ2V0KS5maW5kKCdhJykuYXR0cigndGFiaW5kZXgnLCAnMCcpO1xufSk7XG5cbiQoJ2JvZHknKS5vbihcbiAgICAnY2xpY2snLFxuICAgICdsaS5yZWFkLXNhbXBsZSBhLCAuYnV0dG9uLnNhbXBsZSwgLmpzLWRldGFpbHMtY292ZXItc2FtcGxlJyxcbiAgICBmdW5jdGlvbiAoZSkge1xuICAgICAgICBsZXQgc2lnbkluVXJsID0gd2luZG93LnVybCh3aW5kb3cucm91dGVzLmFjY291bnRTaWduSW4sIHtcbiAgICAgICAgICAgIGZvcndhcmQ6IHdpbmRvdy5sb2NhdGlvbi5ocmVmLFxuICAgICAgICB9KTtcbiAgICAgICAgbGV0IHBlcmZvcm1TYW1wbGVTaWduSW5SZWRpcmVjdCA9XG4gICAgICAgICAgICB3aW5kb3cuZmVhdHVyZU1hbmFnZXIuaXNFbmFibGVkKCdzYW1wbGUtc2lnbmluLXJlZGlyZWN0JykgJiZcbiAgICAgICAgICAgICF3aW5kb3cuT3ZlckRyaXZlLmlzQXV0aGVudGljYXRlZCAmJlxuICAgICAgICAgICAgIXdpbmRvdy5PdmVyRHJpdmUuYWxsb3dBbm9ueW1vdXNTYW1wbGluZztcbiAgICAgICAgaWYgKHBlcmZvcm1TYW1wbGVTaWduSW5SZWRpcmVjdCkge1xuICAgICAgICAgICAgZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKTtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5hc3NpZ24oc2lnbkluVXJsKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIElmIGluIG1vYmlsZSBvciBpbi1hcHAgb3BlbiBzYW1wbGUgbGluayBpbiBuZXcgd2luZG93LiBFbHNlIG9wZW4gaW4gbW9kYWwuXG4gICAgICAgICAgICB2YXIgaW5BcHAgPSBDb29raWVzLmdldCgnb21jYnJvd3NlJykgIT09IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSAkKGUudGFyZ2V0KS5jbG9zZXN0KCdhJyk7XG4gICAgICAgICAgICB2YXIgaXNNZWRpYURvVGl0bGUgPSBmYWxzZTtcblxuICAgICAgICAgICAgLy9mb3Igc2FtcGxlcyBvbiB0aGUgaG9tZSBwYWdlXG4gICAgICAgICAgICBpZiAodGFyZ2V0LmF0dHIoJ21lZGlhLWRvLWZvcm1hdCcpKSB7XG4gICAgICAgICAgICAgICAgaXNNZWRpYURvVGl0bGUgPVxuICAgICAgICAgICAgICAgICAgICB0YXJnZXQuYXR0cignbWVkaWEtZG8tZm9ybWF0JykgPT09ICd0cnVlJyA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGlzTWVkaWFEb1RpdGxlID09PSBmYWxzZSAmJiB3aW5kb3cuT3ZlckRyaXZlLm1lZGlhSXRlbXMpIHtcbiAgICAgICAgICAgICAgICB2YXIgdGl0bGUgPVxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuT3ZlckRyaXZlLm1lZGlhSXRlbXNbdGFyZ2V0LmF0dHIoJ2RhdGEtbWVkaWEtaWQnKV07XG4gICAgICAgICAgICAgICAgdmFyIGZvcm1hdHMgPSB0aXRsZVsnZm9ybWF0cyddO1xuICAgICAgICAgICAgICAgIGZvcm1hdHMuZm9yRWFjaCgoZWxlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGVbJ2lkJ10gPT09ICdlYm9vay1tZWRpYS1kbycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlzTWVkaWFEb1RpdGxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgJChkb2N1bWVudCkud2lkdGgoKSA8PSA2NDAgfHxcbiAgICAgICAgICAgICAgICB0YXJnZXQuYXR0cignZGF0YS10eXBlJykgPT09ICd2aWRlbycgfHxcbiAgICAgICAgICAgICAgICB0YXJnZXQuYXR0cignZGF0YS1tZXRybycpIHx8XG4gICAgICAgICAgICAgICAgaW5BcHAgfHxcbiAgICAgICAgICAgICAgICBpc01lZGlhRG9UaXRsZVxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgdGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldDogJ19ibGFuaycsXG4gICAgICAgICAgICAgICAgICAgICAgICByZWw6ICdub3JlZmVycmVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGhyZWY6IHRhcmdldC5hdHRyKCdkYXRhLWhyZWYnKSxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUF0dHIoJ2RhdGEtcmV2ZWFsLWlkJyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhcmdldC5hdHRyKCdkYXRhLXJldmVhbC1pZCcsICdzYW1wbGUtZHluYW1pYy1tb2RhbCcpO1xuXG4gICAgICAgICAgICAgICAgaWYgKHRhcmdldC5hdHRyKCdkYXRhLWhyZWYnKSkge1xuICAgICAgICAgICAgICAgICAgICAkKCdpZnJhbWUjc2FtcGxlLWR5bmFtaWMtaWZyYW1lJykuYXR0cihcbiAgICAgICAgICAgICAgICAgICAgICAgICdzcmMnLFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmF0dHIoJ2RhdGEtaHJlZicpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICQoJy5tb2RhbC10aXRsZVtkYXRhLXNhbXBsZS10aXRsZV0nKS5odG1sKFxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LmF0dHIoJ2RhdGEtdGl0bGUnKVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5mb3VuZGF0aW9uKCdyZXZlYWwnLCAncmVmbG93Jyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuKTtcbiIsIi8qKlxuICogSG9sZHMgZnVuY3Rpb25zXG4gKiBAdHlwZSB7e2hvbGRQbGFjZWQ6IGhvbGRzLmhvbGRQbGFjZWQsIHJldmVhbEhvbGRNb2RhbDogaG9sZHMucmV2ZWFsSG9sZE1vZGFsfX1cbiAqL1xud2luZG93LmhvbGRzID0ge1xuICAgIGhvbGRQbGFjZWQ6IGZ1bmN0aW9uIChlbGVtZW50cykge1xuICAgICAgICB3aW5kb3cuYWpheC5wbGFjZUhvbGQoXG4gICAgICAgICAgICBlbGVtZW50cy5hdHRyKCdkYXRhLW1lZGlhLWlkJyksXG4gICAgICAgICAgICAkKCcucGF0cm9uLWhvbGQtZW1haWwtZHluYW1pYycpLnZhbCgpLFxuICAgICAgICAgICAgZWxlbWVudHNcbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUmV2ZWFsIHRoZSBwbGFjZSBhIGhvbGQgbW9kYWxcbiAgICAgKi9cbiAgICByZXZlYWxIb2xkTW9kYWw6IGZ1bmN0aW9uIChlbGVtKSB7XG4gICAgICAgIGlmICghZWxlbS5oYXNDbGFzcygnZGlzYWJsZWQnKSkge1xuICAgICAgICAgICAgdmFyIHRpdGxlLFxuICAgICAgICAgICAgICAgIHR5cGVJZCxcbiAgICAgICAgICAgICAgICB0eXBlTmFtZSxcbiAgICAgICAgICAgICAgICBhcnR3b3JrLFxuICAgICAgICAgICAgICAgIHByZXJlbGVhc2VEYXRlLFxuICAgICAgICAgICAgICAgIGlzUHJlcmVsZWFzZSxcbiAgICAgICAgICAgICAgICBtZWRpYUlkO1xuXG4gICAgICAgICAgICB0aXRsZSA9IGVsZW0uYXR0cignZGF0YS10aXRsZScpO1xuICAgICAgICAgICAgdHlwZUlkID0gZWxlbS5hdHRyKCdkYXRhLXR5cGUnKTtcbiAgICAgICAgICAgIHR5cGVOYW1lID0gZWxlbS5hdHRyKCdkYXRhLXR5cGUtbmFtZScpO1xuICAgICAgICAgICAgYXJ0d29yayA9IGVsZW0uYXR0cignZGF0YS1hcnR3b3JrJyk7XG4gICAgICAgICAgICBwcmVyZWxlYXNlRGF0ZSA9IGVsZW0uYXR0cignZGF0YS1wcmVyZWxlYXNlLWRhdGUnKTtcbiAgICAgICAgICAgIGlzUHJlcmVsZWFzZSA9IGVsZW0uYXR0cignZGF0YS1wcmVyZWxlYXNlLWRhdGUnKSAhPSAnJztcbiAgICAgICAgICAgIG1lZGlhSWQgPSBlbGVtLmF0dHIoJ2RhdGEtbWVkaWEtaWQnKTtcblxuICAgICAgICAgICAgdmFyIG1vZGFsID0gJCgnI2hvbGQtZHluYW1pYy1tb2RhbCcpO1xuICAgICAgICAgICAgJCgnW2RhdGEtaWQ9XCJ0aXRsZVwiXScpLmh0bWwodGl0bGUpO1xuICAgICAgICAgICAgJCgnW2RhdGEtaWQ9XCJmb3JtYXQtaWNvblwiXScpXG4gICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKClcbiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ljb24tJyArIHR5cGVJZCk7XG4gICAgICAgICAgICAkKCdbZGF0YS1pZD1cImZvcm1hdC1uYW1lXCJdJykuaHRtbCh0eXBlTmFtZSk7XG4gICAgICAgICAgICAkKCdbZGF0YS1pZD1cImNvdmVyLWltYWdlXCJdJykuYXR0cignc3JjJywgYXJ0d29yayk7XG5cbiAgICAgICAgICAgIHZhciBsYWJlbENvcHkgPSB3aW5kb3cuaHRtbCgnZHluYW1pY0hvbGRNb2RhbC5wbGFjZUhvbGREZXNjJywge1xuICAgICAgICAgICAgICAgIGxpYnJhcnlOYW1lOiB3aW5kb3cuT3ZlckRyaXZlLmxpYnJhcnlOYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAod2luZG93Lk92ZXJEcml2ZS5tZWRpYUl0ZW1zW21lZGlhSWRdLm93bmVkQ29waWVzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgbGFiZWxDb3B5ID0gd2luZG93Lmh0bWwoJ2hvbGRzUmF0aW9IZWxwTW9kYWwubm9Db3BpZXNUZXh0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAkKCcuanMtaG9sZC1tb2RhbC1sYWJlbCcpLmh0bWwobGFiZWxDb3B5KTtcblxuICAgICAgICAgICAgaWYgKHByZXJlbGVhc2VEYXRlICE9IHVuZGVmaW5lZCAmJiBpc1ByZXJlbGVhc2UpIHtcbiAgICAgICAgICAgICAgICAkKCdbZGF0YS1pZD1cInByZS1yZWxlYXNlLWxhYmVsXCJdJylcbiAgICAgICAgICAgICAgICAgICAgLnRleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cudGV4dCgncHJlcmVsZWFzZUxhYmVsJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXJlbGVhc2VEYXRlOiBwcmVyZWxlYXNlRGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCdoaWRlTWUnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgJCgnW2RhdGEtaWQ9XCJwcmUtcmVsZWFzZS1sYWJlbFwiXScpLnRleHQoJycpLmFkZENsYXNzKCdoaWRlTWUnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJCgnZm9ybSNob2xkLWR5bmFtaWMtZm9ybScpLmF0dHIoJ2RhdGEtbWVkaWEtaWQnLCBtZWRpYUlkKTtcblxuICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgIGVsZW0uYXR0cignZGF0YS1wdWJsaXNoZXInKSA+PSAnOTgxNDYnICYmXG4gICAgICAgICAgICAgICAgZWxlbS5hdHRyKCdkYXRhLXB1Ymxpc2hlcicpIDw9ICc5ODE1NScgJiZcbiAgICAgICAgICAgICAgICBDb29raWVzLmdldCgnZGlzbmV5LWV1bGEtc2V0dGluZycpICE9ICcxJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgLy8gRGlzbmV5IHB1Ymxpc2hlciBpZHMgYXJlIDk4MTQ2IC0gOTgxNTVcbiAgICAgICAgICAgICAgICAkKCcjZGlzbmV5LWV1bGEtbW9kYWwnKS5mb3VuZGF0aW9uKCdyZXZlYWwnLCAnb3BlbicpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBtb2RhbC5mb3VuZGF0aW9uKCdyZXZlYWwnLCAnb3BlbicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcbn07XG5cbi8qKlxuICogIEZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgYWN0aW9uIGJ1dHRvbiBzdGF0ZXNcbiAqL1xud2luZG93LmxvYWRpbmcgPSB7XG4gICAgc3Bpbm5lcnM6IHt9LFxuXG4gICAgYW5pbWF0ZUljb246IGZ1bmN0aW9uIChlbGVtLCBhbmltYXRpb24pIHtcbiAgICAgICAgZWxlbS5yZW1vdmVDbGFzcygnYW5pbWF0ZWQgYm91bmNlSW4gYm91bmNlT3V0IHB1bHNlIGluZmluaXRlJykuYWRkQ2xhc3MoXG4gICAgICAgICAgICAnYW5pbWF0ZWQgJyArIGFuaW1hdGlvblxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICBjaGFuZ2VCdXR0b25TdGF0ZTogZnVuY3Rpb24gKGVsZW0sIGFjdGlvbiwgb25TdGF0dXNSZXEpIHtcbiAgICAgICAgZWxlbSA9IGVsZW0uYXR0cignZGF0YS1hY3Rpb24nKVxuICAgICAgICAgICAgPyBlbGVtXG4gICAgICAgICAgICA6IGVsZW0uY2xvc2VzdChcbiAgICAgICAgICAgICAgICAgICdbZGF0YS1hY3Rpb25dOm5vdChbZGF0YS1hY3Rpb249XCJtYWluLW5hdmlnYXRpb25cIl0pJ1xuICAgICAgICAgICAgICApO1xuICAgICAgICB2YXIgaW5uZXIgPSAnJztcbiAgICAgICAgdmFyIHR5cGUgPSBlbGVtLmRhdGEoJ3R5cGUnKTtcbiAgICAgICAgdmFyIG1lZGlhSWQgPSBlbGVtLmRhdGEoJ21lZGlhLWlkJyk7XG4gICAgICAgIHZhciBmb3JtYXRzID0gZWxlbS5kYXRhKCdmb3JtYXRzJyk7XG4gICAgICAgIHZhciBidXR0b25UZXh0ID0gJyc7XG4gICAgICAgIHZhciBpbkFwcCA9IENvb2tpZXMuZ2V0KCdvbWNicm93c2UnKSAhPSB1bmRlZmluZWQ7XG4gICAgICAgIHZhciBmb3JtYXRJZCA9IGZpbmRGb3JtYXRJZChmb3JtYXRzKTtcbiAgICAgICAgdmFyIGlzQ2hyb21lYm9vayA9IHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC9Dck9TLylcbiAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgdmFyIG92ZXJkcml2ZUZvcm1hdCA9ICcnO1xuXG4gICAgICAgIHZhciBpc0FuZHJvaWQ0MUFuZFVwID1cbiAgICAgICAgICAgIGJvd3Nlci5hbmRyb2lkICYmIHBhcnNlSW50KGJvd3Nlci5vc3ZlcnNpb24sIDEwKSA+PSA0LjFcbiAgICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICB2YXIgaXNBbmRyb2lkU3RvY2sgPVxuICAgICAgICAgICAgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL1ZlcnNpb25cXC9cXGRcXC5cXGQvKSAmJlxuICAgICAgICAgICAgYm93c2VyLmFuZHJvaWRcbiAgICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgICA6IGZhbHNlO1xuICAgICAgICB2YXIgaXNEb2xwaGluID0gd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goL0RvbGZpbi8pXG4gICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgIDogZmFsc2U7XG4gICAgICAgIHZhciBpc05vb2sgPVxuICAgICAgICAgICAgd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goLyhCTlRWfEJOUlYpL2cpICYmICFib3dzZXIuY2hyb21lXG4gICAgICAgICAgICAgICAgPyB0cnVlXG4gICAgICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgdmFyIGlzU2lsayA9IC9cXGJTaWxrXFwvKFswLTkuXy1dKylcXGIvLmV4ZWMobmF2aWdhdG9yLnVzZXJBZ2VudClcbiAgICAgICAgICAgID8gdHJ1ZVxuICAgICAgICAgICAgOiBmYWxzZTtcbiAgICAgICAgdmFyIGlzTGlzdGVuSW5jb21wYXRpYmxlID1cbiAgICAgICAgICAgICghaXNBbmRyb2lkNDFBbmRVcCAmJiAoaXNBbmRyb2lkU3RvY2sgfHwgaXNEb2xwaGluIHx8IGlzU2lsaykpIHx8XG4gICAgICAgICAgICBpc05vb2tcbiAgICAgICAgICAgICAgICA/IHRydWVcbiAgICAgICAgICAgICAgICA6IGZhbHNlO1xuXG4gICAgICAgIHZhciByZW1vdmVDbGFzc0xpc3QgPVxuICAgICAgICAgICAgJ3NlY29uZGFyeSBwcmltYXJ5IHBsYWNlLWEtaG9sZCByYWRpdXMgcmFkaXVzLWxlZnQgbGVuZGluZy1vcHRpb25zJztcblxuICAgICAgICB2YXIgYmFubmVyID0gJChcbiAgICAgICAgICAgICdkaXYudGl0bGUtaGVhZGVyLWJhcltkYXRhLW1lZGlhLWlkPVwiJyArXG4gICAgICAgICAgICAgICAgZWxlbS5hdHRyKCdkYXRhLW1lZGlhLWlkJykgK1xuICAgICAgICAgICAgICAgICdcIl0gYSdcbiAgICAgICAgKTtcblxuICAgICAgICBpZiAoZm9ybWF0cykge1xuICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmb3JtYXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXRzW2ldWydpZCddID09ICd2aWRlby1zdHJlYW1pbmcnIHx8XG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHNbaV1bJ2lkJ10gPT0gJ2Vib29rLW92ZXJkcml2ZScgfHxcbiAgICAgICAgICAgICAgICAgICAgZm9ybWF0c1tpXVsnaWQnXSA9PSAnYXVkaW9ib29rLW92ZXJkcml2ZSdcbiAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmRyaXZlRm9ybWF0ID0gZm9ybWF0c1tpXVsnaWQnXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBzd2l0Y2ggKGFjdGlvbikge1xuICAgICAgICAgICAgY2FzZSAnYm9ycm93JzpcbiAgICAgICAgICAgICAgICAvL1VzZXIgaGFzIG5vdCB5ZXQgYm9ycm93ZWQgYSB0aXRsZSBTaG93IGJvcnJvdyBidXR0b25cbiAgICAgICAgICAgICAgICB2YXIgbGVuZGluZ1BlcmlvZCA9ICQoJ2lucHV0I2xlbmRpbmctcGVyaW9kLScgKyBtZWRpYUlkKS52YWwoKTtcbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSAncGVyaW9kaWNhbHMnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlubmVyID0gd2luZG93Lmh0bWwoJ2RheScpO1xuICAgICAgICAgICAgICAgICAgICBlbGVtLmFkZENsYXNzKCdzZWNvbmRhcnkgcmFkaXVzJykucmVtb3ZlQ2xhc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICAnbGVuZGluZy1vcHRpb25zIHJhZGl1cy1sZWZ0J1xuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vJCgnYnV0dG9uLmxlbmRpbmctcGVyaW9kLWRyb3Bkb3duJykuaGlkZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChDb29raWVzLmdldCgnbm9vay1ldWxhLXNldHRpbmcnKSA9PSAnMScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0ucmVtb3ZlQXR0cignZGF0YS1yZXZlYWwtaWQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGVuZGluZ1BlcmlvZCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgaW5uZXIgPVxuICAgICAgICAgICAgICAgICAgICAgICAgJzxzcGFuIGNsYXNzPVwiYm9ycm93LW1haW4tdGV4dCB1LWFsbENhcHNcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5odG1sKCdib3Jyb3cnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPjxici8+PHNwYW4gY2xhc3M9XCJib3Jyb3ctc3ViLXRleHQgdS1hbGxDYXBzXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaHRtbCgnZm9yWERheXMnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZGluZ1BlcmlvZDogbGVuZGluZ1BlcmlvZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8L3NwYW4+JztcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpbm5lciA9ICc8c3Bhbj4nICsgd2luZG93Lmh0bWwoJ2JvcnJvdycpICsgJzwvc3Bhbj4nO1xuICAgICAgICAgICAgICAgICAgICBlbGVtLmNzcygnbGluZS1oZWlnaHQnLCAnMjFweCcpOyAvLyBBbGlnbiB0ZXh0IHdpdGggb3RoZXIgYnV0dG9uc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbGVtLnJlbW92ZUNsYXNzKHJlbW92ZUNsYXNzTGlzdClcbiAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ3NlY29uZGFyeSByYWRpdXMtbGVmdCBsZW5kaW5nLW9wdGlvbnMganMtc3RhdHVzVXBkYXRlZCdcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignaHJlZicsICdqYXZhc2NyaXB0OnZvaWQoMCknKTtcblxuICAgICAgICAgICAgICAgICQoJy5sZW5kaW5nLXBlcmlvZC1kcm9wZG93bicpXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnc2Vjb25kYXJ5JylcbiAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCdkaXNhYmxlZCcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdib3Jyb3ctc2ltcGxlJzpcbiAgICAgICAgICAgICAgICAvL1VzZXIgaGFzIG5vdCB5ZXQgYm9ycm93ZWQgYSB0aXRsZSBTaG93IGJvcnJvdyBidXR0b25cbiAgICAgICAgICAgICAgICBpZiAodHlwZSA9PSAncGVyaW9kaWNhbHMnKSB7XG4gICAgICAgICAgICAgICAgICAgIGlubmVyID0gJzxzcGFuPicgKyB3aW5kb3cuaHRtbCgnc2VuZFRvTm9vaycpICsgJzwvc3Bhbj4nO1xuICAgICAgICAgICAgICAgICAgICBlbGVtLmFkZENsYXNzKCdzZWNvbmRhcnkgcmFkaXVzJykucmVtb3ZlQ2xhc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICAnbGVuZGluZy1vcHRpb25zIHJhZGl1cy1sZWZ0J1xuICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vJCgnYnV0dG9uLmxlbmRpbmctcGVyaW9kLWRyb3Bkb3duJykuaGlkZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChDb29raWVzLmdldCgnbm9vay1ldWxhLXNldHRpbmcnKSA9PSAnMScpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0ucmVtb3ZlQXR0cignZGF0YS1yZXZlYWwtaWQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlubmVyID1cbiAgICAgICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cImJvcnJvdy1tYWluLXRleHQgdS1hbGxDYXBzXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaHRtbCgnYm9ycm93JykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzwvc3Bhbj4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbGVtLnJlbW92ZUNsYXNzKHJlbW92ZUNsYXNzTGlzdClcbiAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdzZWNvbmRhcnkgcmFkaXVzIGpzLXN0YXR1c1VwZGF0ZWQnKVxuICAgICAgICAgICAgICAgICAgICAuYXR0cignaHJlZicsICdqYXZhc2NyaXB0OnZvaWQoMCknKTtcblxuICAgICAgICAgICAgICAgIGVsZW0ucmVtb3ZlQ2xhc3MoJ3BsYWNlLWEtaG9sZCcpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdob2xkJzpcbiAgICAgICAgICAgICAgICAvL1VzZXIgaGFzIG5vdCB5ZXQgcGxhY2VkIHRoaXMgdGl0bGUgb24gaG9sZCBzaG93IGhvbGQgYnV0dG9uXG4gICAgICAgICAgICAgICAgaW5uZXIgPSAnPHNwYW4+JyArIHdpbmRvdy5odG1sKCdwbGFjZUFIb2xkJykgKyAnPC9zcGFuPic7XG4gICAgICAgICAgICAgICAgZWxlbS5yZW1vdmVDbGFzcyhyZW1vdmVDbGFzc0xpc3QpXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygncGxhY2UtYS1ob2xkIHJhZGl1cyBqcy1zdGF0dXNVcGRhdGVkJylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2hyZWYnLCAnamF2YXNjcmlwdDp2b2lkKDApJyk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ2JvcnJvd2VkJzpcbiAgICAgICAgICAgICAgICB2YXIgaXNpb3M2SW5jb21wYXRpYmxlID1cbiAgICAgICAgICAgICAgICAgICAgYm93c2VyLmlvcyAmJiBib3dzZXIub3N2ZXJzaW9uWzBdID09PSAnNic7XG5cbiAgICAgICAgICAgICAgICAvL1VzZXIgaGFzIGFscmVhZHkgYm9ycm93ZWQgdGhpcyB0aXRsZS4gU2hvdyBHTyBUTyBMT0FOU1xuXG4gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0ZW1wb3JhcnkgdG8gZGlzYWJsZSB0aGUgYWRkIHRvIGFwcCBjb3B5LiBUaGlzIHdpbGwgYmUgcmVmYWN0b3JlZCBvdXQgc29vbi4uXG4gICAgICAgICAgICAgICAgdmFyIHNob3dBZGRUb0FwcCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgdmFyIHBsYWluVGV4dCA9IHdpbmRvdy5odG1sKCdnb1RvTG9hbnMnKTtcbiAgICAgICAgICAgICAgICBidXR0b25UZXh0ID0gJzxzcGFuPicgKyBwbGFpblRleHQgKyAnPC9zcGFuPic7XG5cbiAgICAgICAgICAgICAgICBlbGVtLmF0dHIoJ2hyZWYnLCB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMuYWNjb3VudExvYW5zKSlcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ3RhYmluZGV4JywgJzAnKVxuICAgICAgICAgICAgICAgICAgICAuaHRtbCh3aW5kb3cuaHRtbCgnZ29Ub0xvYW5zJykpXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygndS1hbGxDYXBzJyk7XG5cbiAgICAgICAgICAgICAgICBpbm5lciA9IGJ1dHRvblRleHRcbiAgICAgICAgICAgICAgICAgICAgPyBidXR0b25UZXh0XG4gICAgICAgICAgICAgICAgICAgIDogJzxzcGFuPicgKyB3aW5kb3cuaHRtbCgnZ29Ub0xvYW5zJykgKyAnPC9zcGFuPic7XG4gICAgICAgICAgICAgICAgZWxlbS5hZGRDbGFzcygnc2Vjb25kYXJ5IHJhZGl1cycpLnJlbW92ZUNsYXNzKFxuICAgICAgICAgICAgICAgICAgICAnbGVuZGluZy1vcHRpb25zIHJhZGl1cy1sZWZ0J1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgZWxlbS5yZW1vdmVDbGFzcygncGxhY2UtYS1ob2xkJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoZWxlbS5hdHRyKCdkYXRhLXR5cGUnKSA9PSAncGVyaW9kaWNhbHMnKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW0ucmVtb3ZlQXR0cignZGF0YS1yZXZlYWwtaWQnKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBlbGVtLmF0dHIoJ2RhdGEtYWN0aW9uJywgJ2JvcnJvd2VkJylcbiAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKHJlbW92ZUNsYXNzTGlzdClcbiAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdzZWNvbmRhcnkgcmFkaXVzIGpzLXN0YXR1c1VwZGF0ZWQnKTtcbiAgICAgICAgICAgICAgICBpZiAoIWVsZW0ucGFyZW50KCkuaGFzQ2xhc3MoJ2xpc3QtdmlldycpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW0uYWRkQ2xhc3MoJ3dpZGVyLWJ1dHRvbicpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocGxhaW5UZXh0Lmxlbmd0aCA+IDIxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmFkZENsYXNzKCdkZWNyZWFzZWQtcGFkZGluZycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBsYWluVGV4dC5sZW5ndGggPiAyMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5hZGRDbGFzcygnZGVjcmVhc2VkLXBhZGRpbmctbGlzdHZpZXctc21hbGwnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwbGFpblRleHQubGVuZ3RoID4gMTkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uYWRkQ2xhc3MoJ2RlY3JlYXNlZC1wYWRkaW5nLWxpc3R2aWV3Jyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBiYW5uZXIudGV4dCh3aW5kb3cuaHRtbCgnYXZhaWxhYmlsaXR5Qm9ycm93ZWQnKSk7XG4gICAgICAgICAgICAgICAgYmFubmVyXG4gICAgICAgICAgICAgICAgICAgIC5jbG9zZXN0KCcudGl0bGUtaGVhZGVyLWJhcicpXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnYXZhaWxhYmxlLXRpdGxlIHNlY29uZGFyeS1iYWNrZ3JvdW5kJylcbiAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCd1bmF2YWlsYWJsZS10aXRsZScpO1xuXG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ2hlbGQnOlxuICAgICAgICAgICAgICAgIC8vVXNlciBoYXMgYWxyZWFkeSBwbGFjZWQgdGhpcyB0aXRsZSBvbiBob2xkLiBTaG93IEdPIFRPIEhPTERTXG4gICAgICAgICAgICAgICAgaW5uZXIgPSAnPHNwYW4+JyArIHdpbmRvdy5odG1sKCdnb1RvSG9sZHMnKSArICc8L3NwYW4+JztcblxuICAgICAgICAgICAgICAgIGVsZW0uYXR0cihcbiAgICAgICAgICAgICAgICAgICAgJ2hyZWYnLFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMuYWNjb3VudEhvbGRzKVxuICAgICAgICAgICAgICAgICkucmVtb3ZlQXR0cignb25jbGljaycpO1xuICAgICAgICAgICAgICAgIGVsZW0ucmVtb3ZlQ2xhc3MocmVtb3ZlQ2xhc3NMaXN0KS5hZGRDbGFzcygncHJpbWFyeSByYWRpdXMnKTtcbiAgICAgICAgICAgICAgICBpZiAoIWVsZW0ucGFyZW50KCkuaGFzQ2xhc3MoJ2xpc3QtdmlldycpKSB7XG4gICAgICAgICAgICAgICAgICAgIGVsZW0uYWRkQ2xhc3MoJ3dpZGVyLWJ1dHRvbicpO1xuICAgICAgICAgICAgICAgICAgICAvLyBBY2NvdW50IGZvciBUYW1pbFxuICAgICAgICAgICAgICAgICAgICBpZiAoaW5uZXIubGVuZ3RoID4gMzApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0uYWRkQ2xhc3MoJ2luY3JlYXNlZC1oZWlnaHQnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbm5lci5sZW5ndGggPiAyNCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5hZGRDbGFzcygnZGVjcmVhc2VkLXBhZGRpbmcnKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEFjY291bnQgZm9yIFRhbWlsXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbm5lci5sZW5ndGggPiAzMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbS5hZGRDbGFzcygnaW5jcmVhc2VkLWhlaWdodC1saXN0dmlldycpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyLmxlbmd0aCA+IDI1KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmFkZENsYXNzKCdkZWNyZWFzZWQtcGFkZGluZy1saXN0dmlldy1zbWFsbCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGlubmVyLmxlbmd0aCA+IDIyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmFkZENsYXNzKCdkZWNyZWFzZWQtcGFkZGluZy1saXN0dmlldycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsZW0uYXR0cignZGF0YS1hY3Rpb24nLCAnaGVsZCcpLmFkZENsYXNzKCcuanMtc3RhdHVzVXBkYXRlZCcpO1xuICAgICAgICAgICAgICAgIGJhbm5lci50ZXh0KHdpbmRvdy5odG1sKCdvbkhvbGQnKSk7XG4gICAgICAgICAgICAgICAgYmFubmVyXG4gICAgICAgICAgICAgICAgICAgIC5jbG9zZXN0KCcudGl0bGUtaGVhZGVyLWJhcicpXG4gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnYXZhaWxhYmxlLXRpdGxlIHNlY29uZGFyeS1iYWNrZ3JvdW5kJylcbiAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCd1bmF2YWlsYWJsZS10aXRsZScpXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygndS1hbGxDYXBzJyk7XG4gICAgICAgICAgICAgICAgLy8gQWNjb3VudCBmb3IgVGFtaWxcbiAgICAgICAgICAgICAgICBpZiAoYmFubmVyLnRleHQoKS5sZW5ndGggPiAxNikge1xuICAgICAgICAgICAgICAgICAgICBlbGVtLnBhcmVudCgpXG4gICAgICAgICAgICAgICAgICAgICAgICAuc2libGluZ3MoJy50aXRsZS1kZXNjcmlwdGlvbicpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2lzLXRvcC1wYWRkZWQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG5cbiAgICAgICAgICAgIGNhc2UgJ3dpc2hsaXN0LWFkZCc6XG4gICAgICAgICAgICAgICAgaW5uZXIgPVxuICAgICAgICAgICAgICAgICAgICAnPHNwYW4gY2xhc3M9XCJ1LWFsbENhcHNcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lmh0bWwoJ2FkZFRvV2lzaExpc3QnKSArXG4gICAgICAgICAgICAgICAgICAgICc8L3NwYW4+JztcbiAgICAgICAgICAgICAgICBlbGVtLmFkZENsYXNzKCdhZGQganMtc3RhdHVzVXBkYXRlZCcpXG4gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygncmVtb3ZlJylcbiAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2RhdGEtYWN0aW9uJywgJ3dpc2hsaXN0LWFkZCcpO1xuICAgICAgICAgICAgICAgIGVsZW0uY2xvc2VzdCgnLmpzLXdpc2hsaXN0LWJ1dHRvbicpXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnaXMtYWRkJylcbiAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCdpcy1yZW1vdmUnKTtcbiAgICAgICAgICAgICAgICBlbGVtLnJlbW92ZUNsYXNzKCdwbGFjZS1hLWhvbGQnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSAnd2lzaGxpc3QtcmVtb3ZlJzpcbiAgICAgICAgICAgICAgICBpbm5lciA9XG4gICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInUtYWxsQ2Fwc1wiPicgK1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaHRtbCgncmVtb3ZlRnJvbVdpc2hMaXN0JykgK1xuICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPic7XG4gICAgICAgICAgICAgICAgZWxlbS5hZGRDbGFzcygncmVtb3ZlIGpzLXN0YXR1c1VwZGF0ZWQnKVxuICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2FkZCcpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdkYXRhLWFjdGlvbicsICd3aXNobGlzdC1yZW1vdmUnKTtcbiAgICAgICAgICAgICAgICBlbGVtLmNsb3Nlc3QoJy5qcy13aXNobGlzdC1idXR0b24nKVxuICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2lzLXJlbW92ZScpXG4gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnaXMtYWRkJyk7XG4gICAgICAgICAgICAgICAgZWxlbS5yZW1vdmVDbGFzcygncGxhY2UtYS1ob2xkJyk7XG5cbiAgICAgICAgICAgICAgICBlbGVtLmF0dHIoJ2RhdGEtYWN0aW9uJywgJ3dpc2hsaXN0LXJlbW92ZScpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuXG4gICAgICAgICAgICBjYXNlICdzcGVjaWFsJzpcbiAgICAgICAgICAgICAgICBpbm5lciA9XG4gICAgICAgICAgICAgICAgICAgICc8c3BhbiBjbGFzcz1cInUtYWxsQ2Fwc1wiPicgK1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaHRtbCgncmVtb3ZlRnJvbVdpc2hMaXN0JykgK1xuICAgICAgICAgICAgICAgICAgICAnPC9zcGFuPic7XG4gICAgICAgICAgICAgICAgZWxlbS5hZGRDbGFzcygncmVtb3ZlIGpzLXN0YXR1c1VwZGF0ZWQnKVxuICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2FkZCcpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdkYXRhLWFjdGlvbicsICd3aXNobGlzdC1yZW1vdmUnKTtcbiAgICAgICAgICAgICAgICBlbGVtLnJlbW92ZUNsYXNzKCdwbGFjZS1hLWhvbGQnKTtcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgY2FzZSBudWxsOlxuICAgICAgICAgICAgY2FzZSBmYWxzZTpcbiAgICAgICAgICAgICAgICBlbGVtLmNoaWxkcmVuKCdkaXYnKS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBpbm5lciA9IGVsZW0uaHRtbCgpO1xuICAgICAgICAgICAgICAgIGFjdGlvbiA9ICdkZWZhdWx0JztcbiAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICBlbGVtLmNoaWxkcmVuKCdkaXYnKS5yZW1vdmUoKTtcbiAgICAgICAgICAgICAgICBpbm5lciA9IGVsZW0uaHRtbCgpO1xuICAgICAgICAgICAgICAgIGFjdGlvbiA9ICdkZWZhdWx0JztcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW0uYXR0cignYXJpYS1idXN5JywgJ2ZhbHNlJylcbiAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnZGlzYWJsZWQnKVxuICAgICAgICAgICAgLnJlbW92ZUF0dHIoJ2Rpc2FibGVkJyk7XG4gICAgICAgIGVsZW0ubmV4dCgnYnV0dG9uLmxlbmRpbmctcGVyaW9kLWRyb3Bkb3duJykucmVtb3ZlQ2xhc3MoJ2Rpc2FibGVkJyk7XG5cbiAgICAgICAgaWYgKGFjdGlvbiAhPSAnZGVmYXVsdCcpIHtcbiAgICAgICAgICAgIGVsZW0uYXR0cignZGF0YS1hY3Rpb24nLCBhY3Rpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGFjdGlvbiAhPSAnYm9ycm93JyAmJiBlbGVtLmF0dHIoJ2RhdGEtdHlwZScpICE9ICdwZXJpb2RpY2FscycpIHtcbiAgICAgICAgICAgIGVsZW0uYWRkQ2xhc3MoJ3JhZGl1cycpXG4gICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCdsZW5kaW5nLW9wdGlvbnMnKVxuICAgICAgICAgICAgICAgIC5jc3MoJ3Bvc2l0aW9uJywgJ3JlbGF0aXZlJyk7XG4gICAgICAgICAgICBlbGVtLm5leHQoJ2J1dHRvbi5sZW5kaW5nLXBlcmlvZC1kcm9wZG93bicpLmhpZGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW0uaHRtbChpbm5lcikuYWRkQ2xhc3MoJ3UtYWxsQ2FwcycpO1xuXG4gICAgICAgIHByb2Nlc3NJbnN0YW50Rm9yd2FyZEFjdGlvbnMoXG4gICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgK1xuICAgICAgICAgICAgICAgICh3aW5kb3cubG9jYXRpb24uc2VhcmNoID8gd2luZG93LmxvY2F0aW9uLnNlYXJjaCA6ICcnKVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICB1cGRhdGVDb3ZlckFsdDogZnVuY3Rpb24gKG1lZGlhSWQsIHRleHQpIHtcbiAgICAgICAgdmFyIGNvdmVySW1hZ2UgPSAkKCcudGl0bGUtaGVhZGVyLWJhcltkYXRhLW1lZGlhLWlkPVwiJyArIG1lZGlhSWQgKyAnXCJdJylcbiAgICAgICAgICAgIC5uZXh0KCdhJylcbiAgICAgICAgICAgIC5jaGlsZHJlbignaW1nJyk7XG4gICAgICAgIGlmIChjb3ZlckltYWdlLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIHJlID0gbmV3IFJlZ0V4cChcbiAgICAgICAgICAgICAgICAnKCcgK1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaHRtbCgnYXZhaWxhYmlsaXR5Qm9ycm93ZWQnKSArXG4gICAgICAgICAgICAgICAgICAgICcpfCgnICtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lmh0bWwoJ2hlbGQnKSArXG4gICAgICAgICAgICAgICAgICAgICcpfCgnICtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lmh0bWwoJ29uSG9sZCcpICtcbiAgICAgICAgICAgICAgICAgICAgJyl8KCcgK1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaHRtbCgnYXZhaWxhYmlsaXR5QXZhaWxhYmxlJykgK1xuICAgICAgICAgICAgICAgICAgICAnKXwoJyArXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5odG1sKCdhdmFpbGFiaWxpdHlXYWl0TGlzdCcpICtcbiAgICAgICAgICAgICAgICAgICAgJyl8KCcgK1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaHRtbCgnYXZhaWxhYmlsaXR5Q29taW5nU29vbicpICtcbiAgICAgICAgICAgICAgICAgICAgJyknLFxuICAgICAgICAgICAgICAgICdnaSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBjb3ZlckltYWdlLmF0dHIoJ2FsdCcsIGNvdmVySW1hZ2UuYXR0cignYWx0JykucmVwbGFjZShyZSwgdGV4dCkpO1xuICAgICAgICB9XG4gICAgfSxcbn07XG5cbi8qKlxuICogRm9yIHJlZGlyZWN0aW5nIHdoZW4gYSB1c2VyJ3MgY2FyZCBiZWNvbWVzIGludmFsaWRcbiAqL1xud2luZG93LmhhbmRsZUludmFsaWRDYXJkID0gZnVuY3Rpb24gKCkge1xuICAgIHdpbmRvdy5nbG9iYWxFdmVudHMudHJpZ2dlcigndXNlcjpjYXJkOmludmFsaWQnKTtcbn07XG5cbi8qKlxuICogQk9SUk9XIEVWRU5UIExJU1RFTkVSU1xuICovXG4kKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZWN0b3IgPVxuICAgICAgICAnW2RhdGEtYWN0aW9uPVwiYm9ycm93XCJdOm5vdChbZGF0YS1uby1saW5rZWQtY2FyZHNdKSwgW2RhdGEtYWN0aW9uPVwiYm9ycm93LXNpbXBsZVwiXTpub3QoW2RhdGEtbm8tbGlua2VkLWNhcmRzXSknO1xuICAgICQoZG9jdW1lbnQpLm9uKCdjbGljaycsIHNlbGVjdG9yLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgZWxlbSA9XG4gICAgICAgICAgICAkKGUudGFyZ2V0KS5pcygnW2RhdGEtYWN0aW9uPVwiYm9ycm93XCJdJykgfHxcbiAgICAgICAgICAgICQoZS50YXJnZXQpLmlzKCdbZGF0YS1hY3Rpb249XCJib3Jyb3ctc2ltcGxlXCJdJylcbiAgICAgICAgICAgICAgICA/ICQoZS50YXJnZXQpXG4gICAgICAgICAgICAgICAgOiAkKGUudGFyZ2V0KS5jbG9zZXN0KCdbZGF0YS1hY3Rpb249XCJib3Jyb3dcIl0nKS5sZW5ndGhcbiAgICAgICAgICAgICAgICA/ICQoZS50YXJnZXQpLmNsb3Nlc3QoJ1tkYXRhLWFjdGlvbj1cImJvcnJvd1wiXScpXG4gICAgICAgICAgICAgICAgOiAkKGUudGFyZ2V0KS5jbG9zZXN0KCdbZGF0YS1hY3Rpb249XCJib3Jyb3ctc2ltcGxlXCJdJyk7XG4gICAgICAgIHZhciBtZWRpYUlkID0gZWxlbS5hdHRyKCdkYXRhLW1lZGlhLWlkJyk7XG5cbiAgICAgICAgaWYgKGVsZW0uYXR0cignZGF0YS10eXBlJykgIT0gJ3BlcmlvZGljYWxzJykge1xuICAgICAgICAgICAgdmFyIGxlbmRpbmdQZXJpb2RJbnB1dCA9ICQoJyNsZW5kaW5nLXBlcmlvZC1tb2RhbC0nICsgbWVkaWFJZClcbiAgICAgICAgICAgICAgICAubGVuZ3RoXG4gICAgICAgICAgICAgICAgPyAkKCcjbGVuZGluZy1wZXJpb2QtbW9kYWwtJyArIG1lZGlhSWQpXG4gICAgICAgICAgICAgICAgOiAkKCcjbGVuZGluZy1wZXJpb2QtJyArIG1lZGlhSWQpO1xuICAgICAgICAgICAgd2luZG93LmFqYXguYm9ycm93KG1lZGlhSWQsIGxlbmRpbmdQZXJpb2RJbnB1dC52YWwoKSwgZWxlbSk7XG5cbiAgICAgICAgICAgIC8vUmVtb3ZlIGV2ZW50IGhhbmRsZXIgdG8gcHJldmVudCByZS10cmlnZ2VyaW5nIGV2ZW50XG4gICAgICAgICAgICBlbGVtLm9mZignY2xpY2snKTtcbiAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgIGVsZW0uYXR0cignZGF0YS10eXBlJykgPT0gJ3BlcmlvZGljYWxzJyAmJlxuICAgICAgICAgICAgQ29va2llcy5nZXQoJ25vb2stZXVsYS1zZXR0aW5nJykgIT0gJzEnXG4gICAgICAgICkge1xuICAgICAgICAgICAgJCgnYSNhY2NlcHQtbm9vay1keW5hbWljJykuYXR0cignZGF0YS1tZWRpYS1pZCcsIG1lZGlhSWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gUGVyaW9kaWNhbCBhbmQgTm9vayBFVUxBIGFjY2VwdGVkXG4gICAgICAgICAgICBlbGVtLmF0dHIoJ2RhdGEtYWN0aW9uJywgJ25vb2snKS5jbGljaygpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAvL0ZvciBib3Jyb3cgYW5kIG5vb2sgYnV0dG9uc1xuICAgICQoZG9jdW1lbnQpLm9uKCdib3Jyb3dTdWNjZXNzIG5vb2tTdWNjZXNzJywgZnVuY3Rpb24gKGUsIGVsZW0sIGRhdGEpIHtcbiAgICAgICAgdmFyIG1lZGlhSWQgPSBlbGVtLmF0dHIoJ2RhdGEtbWVkaWEtaWQnKTtcbiAgICAgICAgdmFyIGFjdGlvbkJ1dHRvbiA9ICQoXG4gICAgICAgICAgICAnW2RhdGEtYWN0aW9uPVwiYm9ycm93LXNpbXBsZVwiXVtkYXRhLW1lZGlhLWlkPVwiJyArXG4gICAgICAgICAgICAgICAgbWVkaWFJZCArXG4gICAgICAgICAgICAgICAgJ1wiXSwgW2RhdGEtYWN0aW9uPVwibm9va1wiXVtkYXRhLW1lZGlhLWlkPVwiJyArXG4gICAgICAgICAgICAgICAgbWVkaWFJZCArXG4gICAgICAgICAgICAgICAgJ1wiXSdcbiAgICAgICAgKTtcblxuICAgICAgICAvL1JlbW92ZSBsb2FkaW5nIGdpZiBhbmQgYWN0aW9uIGJ1dHRvbiBmcm9tIHRpdGxlIGVsZW1lbnRzXG4gICAgICAgICQoJy5wcmltYXJ5LWFjdGlvbltkYXRhLW1lZGlhLWlkPVwiJyArIG1lZGlhSWQgKyAnXCJdJykuY3NzKFxuICAgICAgICAgICAgJ3Zpc2liaWxpdHknLFxuICAgICAgICAgICAgJ2hpZGRlbidcbiAgICAgICAgKTtcbiAgICB9KTtcblxuICAgIC8vRm9yIGJvcnJvdyBidXR0b25zIG9ubHlcbiAgICAkKGRvY3VtZW50KVxuICAgICAgICAub24oJ2JvcnJvd1N1Y2Nlc3MnLCBmdW5jdGlvbiAoZSwgZWxlbSwgZGF0YSkge1xuICAgICAgICAgICAgdmFyIG1lZGlhSWQgPSBlbGVtLmF0dHIoJ2RhdGEtbWVkaWEtaWQnKTtcbiAgICAgICAgICAgIHZhciBhY3Rpb25CdXR0b24gPSAkKFxuICAgICAgICAgICAgICAgICdbZGF0YS1hY3Rpb249XCJib3Jyb3ctc2ltcGxlXCJdW2RhdGEtbWVkaWEtaWQ9XCInICsgbWVkaWFJZCArICdcIl0nXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAvL1VwZGF0ZSBiYW5uZXJzXG4gICAgICAgICAgICB2YXIgY29weSA9IHdpbmRvdy5odG1sKCdhdmFpbGFiaWxpdHlCb3Jyb3dlZCcpLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgICAgICAkKCcudGl0bGUtaGVhZGVyLWJhcltkYXRhLW1lZGlhLWlkPVwiJyArIG1lZGlhSWQgKyAnXCJdIGEnKVxuICAgICAgICAgICAgICAgIC5odG1sKFxuICAgICAgICAgICAgICAgICAgICBjb3B5ICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgPGkgY2xhc3M9XCJpY29uIGljb24taWNvbi1jaGVja2VkIHRpdGxlLWxhYmVsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPidcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hyZWYnLCB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMuYWNjb3VudExvYW5zKSk7XG5cbiAgICAgICAgICAgIC8vVXBkYXRlIGFjdGlvbiBidXR0b25zXG4gICAgICAgICAgICB3aW5kb3cubG9hZGluZy5jaGFuZ2VCdXR0b25TdGF0ZShhY3Rpb25CdXR0b24sICdib3Jyb3dlZCcpO1xuXG4gICAgICAgICAgICAvL1Nob3cgdG9hc3RcbiAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICBhY3Rpb25CdXR0b24uYXR0cignZGF0YS10eXBlJykgIT09ICdwZXJpb2RpY2FscycgJiZcbiAgICAgICAgICAgICAgICAhZGF0YS5zZXNzaW9uRXhwaXJlZFxuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LmFqYXguYm9ycm93U3VjY2Vzc1RvYXN0KFxuICAgICAgICAgICAgICAgICAgICBkYXRhLFxuICAgICAgICAgICAgICAgICAgICBlbGVtLmF0dHIoJ2RhdGEtdHlwZS1uYW1lJylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBIaWRlIG1vZGFsXG4gICAgICAgICAgICAkKCcubW9kYWwnKS5mb3VuZGF0aW9uKCdyZXZlYWwnLCAnY2xvc2UnKTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdib3Jyb3dSZXF1ZXN0JywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIC8vIFNob3cgc3Bpbm5lclxuICAgICAgICAgICAgaWYgKCQoZS50YXJnZXQpLmNvbnRleHQudGFnTmFtZSAhPT0gJ0JPRFknKSB7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignYm9ycm93RmFpbHVyZScsIGZ1bmN0aW9uIChlLCBlbGVtLCByZXNwb25zZSkge1xuICAgICAgICAgICAgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlLmpxWEhSLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICB2YXIgdGFyZ2V0ID0gZWxlbTtcbiAgICAgICAgICAgIHZhciBtZWRpYUlkID0gdGFyZ2V0LmF0dHIoJ2RhdGEtbWVkaWEtaWQnKTtcblxuICAgICAgICAgICAgLy8gSWYgdGhlIHVzZXIncyBjYXJkIGlzIGludmFsaWQgcHJvbXB0IHRoZW0gdG8gbGluayBhIGNhcmRcbiAgICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gZXJyb3IgYmVzaWRlcyB0aGUgdGl0bGUgaXMgb3V0IG9mIGNvcGllcywgcG9wIGEgdG9hc3RcbiAgICAgICAgICAgIC8vIElmIHRoZSBib3Jyb3dGYWlsdXJlIGlzIG9uIHRoZSBib2R5LCB0aGlzIG1lYW5zIGFuIGZvcndhcmRlZCBhY3Rpb24gaGFwcGVuZWQgYW5kIHRoZSB0aXRsZSB3YXNuJ3Qgb24gdGhlIHBhZ2VcbiAgICAgICAgICAgIC8vICAtLSBEbyBub3RoaW5nIGluIHRoaXMgaGFuZGxlcjsgY2hlY2sgYm9ycm93RmFpbHVyZSBpbiB1dGlsaXR5IGhhbmRsZXJcbiAgICAgICAgICAgIGlmIChyZXNwb25zZS5lcnJvckNvZGUgPT09ICdQYXRyb25DYXJkRmFpbGVkQXV0aGVudGljYXRpb24nKSB7XG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5PdmVyRHJpdmUuYXV0aFR5cGUgPT09ICdsaWJyYXJ5Jykge1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaGFuZGxlSW52YWxpZENhcmQoKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdXNlcidzIGNhcmQgaXMgbm8gbG9uZ2VyIHZhbGlkLiBEaXJlY3QgdGhlbSB0byB0aGUgbGluayBhIGNhcmQgZmxvdyBzbyB0aGF0IHRoZXkgbWF5IHJlc29sdmUgYW55IGlzc3Vlcy5cbiAgICAgICAgICAgICAgICAgICAgJCgnLmpzLWNhcmQtZXJyb3ItbW9kYWwnKS5mb3VuZGF0aW9uKCdyZXZlYWwnLCAnb3BlbicpO1xuICAgICAgICAgICAgICAgICAgICAkKCcucHJpbWFyeS1hY3Rpb25bZGF0YS1tZWRpYS1pZD1cIicgKyBtZWRpYUlkICsgJ1wiXScpLmh0bWwoXG4gICAgICAgICAgICAgICAgICAgICAgICAkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICcucHJpbWFyeS1hY3Rpb25bZGF0YS1tZWRpYS1pZD1cIicgKyBtZWRpYUlkICsgJ1wiXSdcbiAgICAgICAgICAgICAgICAgICAgICAgICkuYXR0cignZGF0YS1vcmlnaW5hbC10ZXh0JylcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLnNlc3Npb25FeHBpcmVkKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZvcndhcmRVcmwgPSB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWU7XG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yd2FyZFVybCArPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoICsgJyZib3Jyb3d+JyArIG1lZGlhSWQ7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZm9yd2FyZFVybCArPSAnP2JvcnJvd34nICsgbWVkaWFJZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgJCgnLmpzLXJlYXV0aGVudGljYXRlJykuYXR0cihcbiAgICAgICAgICAgICAgICAgICAgJ2hyZWYnLFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMuYWNjb3VudFNpZ25Jbiwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yd2FyZDogZm9yd2FyZFVybCxcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICQoJyNhdXRoZW50aWNhdGUtbW9kYWwnKS5mb3VuZGF0aW9uKCdyZXZlYWwnLCAnb3BlbicpO1xuICAgICAgICAgICAgICAgICQoJy5wcmltYXJ5LWFjdGlvbltkYXRhLW1lZGlhLWlkPVwiJyArIG1lZGlhSWQgKyAnXCJdJykuaHRtbChcbiAgICAgICAgICAgICAgICAgICAgJCgnLnByaW1hcnktYWN0aW9uW2RhdGEtbWVkaWEtaWQ9XCInICsgbWVkaWFJZCArICdcIl0nKS5hdHRyKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2RhdGEtb3JpZ2luYWwtdGV4dCdcbiAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHJlc3BvbnNlLmVycm9yQ29kZSAhPT0gJ1RpdGxlTm9Mb25nZXJBdmFpbGFibGUnKSB7XG4gICAgICAgICAgICAgICAgdmFyIGhyZWYgPSAnJztcbiAgICAgICAgICAgICAgICB2YXIgbGlua1RleHQgPSAnJztcbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9yQ29kZSA9PT0gJ1BhdHJvbkV4Y2VlZGVkQ2hlY2tvdXRMaW1pdCcgfHxcbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2UuZXJyb3JDb2RlID09PSAnTG9hbkFscmVhZHlFeGlzdHMnXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIGhyZWYgPSB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMuYWNjb3VudExvYW5zKTtcbiAgICAgICAgICAgICAgICAgICAgbGlua1RleHQgPSB3aW5kb3cuaHRtbCgnbG9hbnMnKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvckNvZGUgPT09ICdQYXRyb25FeGNlZWRlZENodXJuaW5nTGltaXQnIHx8XG4gICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9yQ29kZSA9PT0gJ1BhdHJvblR5cGVSZXN0cmljdGVkRnJvbVRpdGxlJ1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICBocmVmID0gd2luZG93LnVybCh3aW5kb3cucm91dGVzLnN1cHBvcnRNZW1iZXJzKTtcbiAgICAgICAgICAgICAgICAgICAgbGlua1RleHQgPSB3aW5kb3cuaHRtbCgncGxlYXNlQ29udGFjdFN1cHBvcnQnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGxpbmsgPVxuICAgICAgICAgICAgICAgICAgICAnPGEgY2xhc3M9XCJib2xkXCIgaHJlZj1cIicgK1xuICAgICAgICAgICAgICAgICAgICBocmVmICtcbiAgICAgICAgICAgICAgICAgICAgJ1wiIHRhYmluZGV4PVwiMFwiPicgK1xuICAgICAgICAgICAgICAgICAgICBsaW5rVGV4dCArXG4gICAgICAgICAgICAgICAgICAgICc8L2E+JztcbiAgICAgICAgICAgICAgICBpZiAod2luZG93LnRvYXN0ZXIpXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy50b2FzdGVyLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAnPHN0cm9uZz4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaHRtbCgnZ2VuZXJpY0Vycm9yJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICc8L3N0cm9uZz4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnRleHQoJ2Vycm9yLicgKyByZXNwb25zZS5lcnJvckNvZGUsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluazogbGluayxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvcidcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAkKCcucHJpbWFyeS1hY3Rpb25bZGF0YS1tZWRpYS1pZD1cIicgKyBtZWRpYUlkICsgJ1wiXScpLmh0bWwoXG4gICAgICAgICAgICAgICAgICAgICQoJy5wcmltYXJ5LWFjdGlvbltkYXRhLW1lZGlhLWlkPVwiJyArIG1lZGlhSWQgKyAnXCJdJykuYXR0cihcbiAgICAgICAgICAgICAgICAgICAgICAgICdkYXRhLW9yaWdpbmFsLXRleHQnXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChlbGVtLmNvbnRleHQudGFnTmFtZSAhPT0gJ0JPRFknKSB7XG4gICAgICAgICAgICAgICAgdmFyIG1lZGlhRGF0YSA9IHtcbiAgICAgICAgICAgICAgICAgICAgaWQ6IG1lZGlhSWQsXG4gICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0YXJnZXQuYXR0cignZGF0YS10aXRsZScpLFxuICAgICAgICAgICAgICAgICAgICBjb3ZlcjogdGFyZ2V0LmF0dHIoJ2FydHdvcmsnKSxcbiAgICAgICAgICAgICAgICAgICAgdHlwZUlkOiB0YXJnZXQuYXR0cignZGF0YS10eXBlJyksXG4gICAgICAgICAgICAgICAgICAgIHByZXJlbGVhc2U6IHRhcmdldC5hdHRyKCdkYXRhLXByZS1yZWxlYXNlJyksXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIG9wZW5Ib2xkQ29uZmxpY3RNb2RhbChtZWRpYURhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIC8vRm9yIE5vb2sgYnV0dG9ucyBvbmx5XG4gICAgLy9BZnRlciBhY2NlcHRpbmcgbm9vayBtb2RhbFxuICAgICQoZG9jdW1lbnQpLm9uKFxuICAgICAgICAnY2xpY2sgdGFwJyxcbiAgICAgICAgJ1tkYXRhLWFjdGlvbj1cIm5vb2tcIl06bm90KFtkYXRhLW5vLWxpbmtlZC1jYXJkc10pJyxcbiAgICAgICAgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHZhciBlbGVtID0gJChlLnRhcmdldCkuaXMoJ1tkYXRhLWFjdGlvbj1cIm5vb2tcIl0nKVxuICAgICAgICAgICAgICAgID8gJChlLnRhcmdldClcbiAgICAgICAgICAgICAgICA6ICQoZS50YXJnZXQpLmNsb3Nlc3QoJ1tkYXRhLWFjdGlvbj1cIm5vb2tcIl0nKTtcbiAgICAgICAgICAgIHZhciBpZCA9XG4gICAgICAgICAgICAgICAgZWxlbS5hdHRyKCdpZCcpID09ICdhY2NlcHQtbm9vay1keW5hbWljJyB8fFxuICAgICAgICAgICAgICAgIENvb2tpZXMuZ2V0KCdub29rLWV1bGEtc2V0dGluZycpID09ICcxJztcblxuICAgICAgICAgICAgaWYgKGlkKSB7XG4gICAgICAgICAgICAgICAgZWxlbSA9ICQoXG4gICAgICAgICAgICAgICAgICAgICdhW2RhdGEtYWN0aW9uPVwibm9va1wiXVtkYXRhLW1lZGlhLWlkPVwiJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmF0dHIoJ2RhdGEtbWVkaWEtaWQnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXCJdJ1xuICAgICAgICAgICAgICAgICk7IC8vIEZpbmQgb3JpZ2luYWwgZWxlbWVudFxuICAgICAgICAgICAgICAgIHdpbmRvdy5hamF4LmJvcnJvdyhlbGVtLmF0dHIoJ2RhdGEtbWVkaWEtaWQnKSwgbnVsbCwgZWxlbSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICQoJ2EjYWNjZXB0LW5vb2stZHluYW1pYycpLmF0dHIoXG4gICAgICAgICAgICAgICAgICAgICdkYXRhLW1lZGlhLWlkJyxcbiAgICAgICAgICAgICAgICAgICAgZWxlbS5hdHRyKCdkYXRhLW1lZGlhLWlkJylcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgKTtcblxuICAgIC8vVXBkYXRlIGR5bmFtaWMgbm9vayBtb2RhbCBtZWRpYUlEXG4gICAgJCgnLnByaW1hcnktYWN0aW9uW2RhdGEtdHlwZT1cInBlcmlvZGljYWxzXCJdJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAkKCcjYWNjZXB0LW5vb2stZHluYW1pYycpLmF0dHIoe1xuICAgICAgICAgICAgJ2RhdGEtbWVkaWEtaWQnOiAkKHRoaXMpLmF0dHIoJ2RhdGEtbWVkaWEtaWQnKSxcbiAgICAgICAgICAgICdkYXRhLXR5cGUnOiAkKHRoaXMpLmF0dHIoJ2RhdGEtdHlwZScpLFxuICAgICAgICB9KTtcbiAgICB9KTtcbn0pO1xuXG53aW5kb3cuYm9ycm93RnJvbVRpdGxlRWxlbSA9IGZ1bmN0aW9uIChtZWRpYUlkKSB7XG4gICAgdmFyIGVsZW0gPSAkKCcucHJpbWFyeS1hY3Rpb25bZGF0YS1tZWRpYS1pZD1cIicgKyBtZWRpYUlkICsgJ1wiXTpmaXJzdCcpO1xuICAgIGVsZW0uYXR0cignZGF0YS1vcmlnaW5hbC10ZXh0JywgZWxlbS5odG1sKCkpO1xuICAgIGVsZW0uaHRtbChwcmltYXJ5QWN0aW9uTG9hZGluZ0dpZik7XG4gICAgYWpheC5ib3Jyb3cobWVkaWFJZCwgbnVsbCwgZWxlbSk7XG59O1xuXG4vKipcbiAqIEhPTEQgRVZFTlQgTElTVEVORVJTIC0tIGZyb20gdGhlIGJpZyBvbCcgYnV0dG9uc1xuICovXG4kKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgc2VsZWN0b3IgPSAnW2RhdGEtYWN0aW9uPVwiaG9sZFwiXTpub3QoW2RhdGEtbm8tbGlua2VkLWNhcmRzXSknO1xuICAgICQoZG9jdW1lbnQpXG4gICAgICAgIC5vbignY2xpY2snLCBzZWxlY3RvciwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHZhciB0YXJnZXQgPSAkKGUudGFyZ2V0KS5jbG9zZXN0KHNlbGVjdG9yKTtcbiAgICAgICAgICAgIHZhciBtZWRpYUlkID0gdGFyZ2V0LmF0dHIoJ2RhdGEtbWVkaWEtaWQnKTtcblxuICAgICAgICAgICAgLy8gTEhUTkctMTU4NFxuICAgICAgICAgICAgd2luZG93LmhhbmRsZUhvbGQodGFyZ2V0LCBtZWRpYUlkKTtcblxuICAgICAgICAgICAgJCgnZm9ybSNob2xkLWR5bmFtaWMtZm9ybScpLnJlbW92ZUF0dHIoJ2RhdGEtZnJvbS10aXRsZScpO1xuXG4gICAgICAgICAgICAvL1JlbW92ZSBldmVudCBoYW5kbGVyIHRvIHByZXZlbnQgcmUtdHJpZ2dlcmluZyBldmVudFxuICAgICAgICAgICAgJCgkKGUudGFyZ2V0KSkub2ZmKCdjbGljaycpO1xuICAgICAgICB9KVxuICAgICAgICAub24oJ2hvbGRTdWNjZXNzJywgZnVuY3Rpb24gKGUsIGVsZW0sIGRhdGEpIHtcbiAgICAgICAgICAgIHZhciBtZWRpYUlkID0gZWxlbS5hdHRyKCdkYXRhLW1lZGlhLWlkJyk7XG4gICAgICAgICAgICB2YXIgaG9sZHNVcmwgPSB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMuYWNjb3VudEhvbGRzKTtcblxuICAgICAgICAgICAgLy8gR2V0IHRoZSB1c2VyJ3MgbmV3IHdhaXQgbGlzdCBwb3NpdGlvbiBpbiBvcmRlciB0byB1cGRhdGUgaG9sZHMgcmF0aW8gbW9kYWxzLlxuICAgICAgICAgICAgd2luZG93LmFqYXguZ2V0SG9sZChtZWRpYUlkKS5kb25lKGZ1bmN0aW9uIChtZWRpYSkge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5zZXREeW5hbWljSG9sZHNSYXRpb01vZGFscyhtZWRpYSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdmFyIGVtYWlsID0gJCgnLnBhdHJvbi1ob2xkLWVtYWlsLWR5bmFtaWMnKS52YWwoKTtcblxuICAgICAgICAgICAgLy8gT3BlbiBTdWNjZXNzIG1vZGFsXG4gICAgICAgICAgICB2YXIgdGl0bGUgPSBuZXcgd2luZG93LlRpdGxlKHdpbmRvdy5PdmVyRHJpdmUubWVkaWFJdGVtc1ttZWRpYUlkXSk7XG4gICAgICAgICAgICB3aW5kb3cuZ2xvYmFsRXZlbnRzLnRyaWdnZXIoJ3RpdGxlOmhvbGQ6c3VjY2VzcycsIHtcbiAgICAgICAgICAgICAgICB0aXRsZU1vZGVsOiB0aXRsZSxcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAkKCcucHJpbWFyeS1hY3Rpb25bZGF0YS1tZWRpYS1pZD1cIicgKyBtZWRpYUlkICsgJ1wiXScpLmNzcyhcbiAgICAgICAgICAgICAgICAndmlzaWJpbGl0eScsXG4gICAgICAgICAgICAgICAgJ2hpZGRlbidcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIHZhciBsaW5rID1cbiAgICAgICAgICAgICAgICAnPGEgaHJlZj1cIicgKyBob2xkc1VybCArICdcIj4nICsgd2luZG93Lmh0bWwoJ2hvbGRzJykgKyAnPC9hPic7XG4gICAgICAgICAgICAkKCdwLnByZS1yZWxlYXNlLWV4cGxhbmF0aW9uJykuaHRtbChcbiAgICAgICAgICAgICAgICB3aW5kb3cuaHRtbCgncHJlcmVsZWFzZUV4cGxhbmF0aW9uJywgeyBsaW5rOiBsaW5rIH0pXG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgJCh0aGlzKS5wYXJlbnRzKCcubm93LXVuYXZhaWxhYmxlLWJ1dHRvbi1jb250YWluZXInKS5sZW5ndGggPCAwXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMpLmF0dHIoJ2RhdGEtYWN0aW9uJywgJ2hlbGQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdpbmRvdy5sb2FkaW5nLmNoYW5nZUJ1dHRvblN0YXRlKFxuICAgICAgICAgICAgICAgICQoXG4gICAgICAgICAgICAgICAgICAgICdhW2RhdGEtYWN0aW9uPVwiaG9sZFwiXVtkYXRhLW1lZGlhLWlkPVwiJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUlkICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdcIl0sIGFbZGF0YS1hY3Rpb249XCJib3Jyb3dcIl1bZGF0YS1tZWRpYS1pZD1cIicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJZCArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXCJdLCBhW2RhdGEtYWN0aW9uPVwiYm9ycm93LXNpbXBsZVwiXVtkYXRhLW1lZGlhLWlkPVwiJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUlkICtcbiAgICAgICAgICAgICAgICAgICAgICAgICdcIl0sIGFbZGF0YS1hY3Rpb249XCJoZWxkXCJdW2RhdGEtbWVkaWEtaWQ9XCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSWQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1wiXSdcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICdoZWxkJ1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy9DaGFuZ2UgZ3JpZCBpdGVtcyB0byBtYXRjaFxuICAgICAgICAgICAgJCgnLnRpdGxlLWhlYWRlci1iYXJbZGF0YS1tZWRpYS1pZD1cIicgKyBtZWRpYUlkICsgJ1wiXSBhJylcbiAgICAgICAgICAgICAgICAuaHRtbChcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lmh0bWwoJ29uSG9sZCcpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICcgPGkgY2xhc3M9XCJpY29uIGljb24taWNvbi1jaGVja2VkIHRpdGxlLWxhYmVsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPidcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmF0dHIoJ2hyZWYnLCBob2xkc1VybClcbiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ3UtYWxsQ2FwcycpO1xuICAgICAgICAgICAgd2luZG93LmxvYWRpbmcudXBkYXRlQ292ZXJBbHQobWVkaWFJZCwgd2luZG93LnRleHQoJ29uSG9sZCcpKTtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIGhvbGRzIHJhdGlvIGhlbHAgdGlwIGNsYXNzXG4gICAgICAgICAgICAkKCcuanMtaG9sZHMtcmF0aW8tbm90LWhlbGRbZGF0YS1tZWRpYS1pZD1cIicgKyBtZWRpYUlkICsgJ1wiXScpXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKCdqcy1ob2xkcy1yYXRpby1oZWxkJylcbiAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2pzLWhvbGRzLXJhdGlvLW5vdC1oZWxkJyk7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBwcmVyZWxlYXNlIHRpcFxuICAgICAgICAgICAgJCgnLmpzLXByZXJlbGVhc2VbZGF0YS1tZWRpYS1pZD1cIicgKyBtZWRpYUlkICsgJ1wiXScpLmFkZENsYXNzKFxuICAgICAgICAgICAgICAgICdpcy1oZWxkJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdob2xkRmFpbHVyZScsIGZ1bmN0aW9uIChlLCBlbGVtLCByZXNwb25zZSkge1xuICAgICAgICAgICAgd2luZG93LmxvYWRpbmcuY2hhbmdlQnV0dG9uU3RhdGUoZWxlbSwgJ2hvbGQnKTtcblxuICAgICAgICAgICAgcmVzcG9uc2UgPSBKU09OLnBhcnNlKHJlc3BvbnNlLnJlc3BvbnNlVGV4dCk7XG4gICAgICAgICAgICB2YXIgbGluayA9ICcnO1xuICAgICAgICAgICAgdmFyIG1lZGlhSWQgPSBlbGVtLmF0dHIoJ2RhdGEtbWVkaWEtaWQnKTtcblxuICAgICAgICAgICAgZnVuY3Rpb24gZXJyb3JUb2FzdChwYWdlTGluaykge1xuICAgICAgICAgICAgICAgIHdpbmRvdy50b2FzdGVyLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICc8c3Ryb25nPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lmh0bWwoJ2dlbmVyaWNFcnJvcicpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8L3N0cm9uZz4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cudGV4dCgnZXJyb3IuJyArIHJlc3BvbnNlLmVycm9yQ29kZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbms6IHBhZ2VMaW5rLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICdlcnJvcidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAocmVzcG9uc2Uuc2Vzc2lvbkV4cGlyZWQpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cuZ2xvYWJsRXZlbnRzLnRyaWdnZXIoJ3VzZXI6c2Vzc2lvbjpleHBpcmVkJywge1xuICAgICAgICAgICAgICAgICAgICBhY3Rpb246ICdob2xkficgKyBtZWRpYUlkLFxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvckNvZGUgPT09ICdQYXRyb25DYXJkRmFpbGVkQXV0aGVudGljYXRpb24nXG4gICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAkKCcjaG9sZC1keW5hbWljLW1vZGFsJykuZm91bmRhdGlvbigncmV2ZWFsJywgJ2Nsb3NlJyk7XG4gICAgICAgICAgICAgICAgd2luZG93LmhhbmRsZUludmFsaWRDYXJkKCk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9yQ29kZSA9PT0gJ0hvbGRBbHJlYWR5RXhpc3RzJyB8fFxuICAgICAgICAgICAgICAgIHJlc3BvbnNlLmVycm9yQ29kZSA9PT0gJ1BhdHJvbkV4Y2VlZGVkSG9sZExpbWl0J1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgJCgnI2hvbGQtZHluYW1pYy1tb2RhbCcpLmZvdW5kYXRpb24oJ3JldmVhbCcsICdjbG9zZScpO1xuICAgICAgICAgICAgICAgIGxpbmsgPVxuICAgICAgICAgICAgICAgICAgICAnPGEgY2xhc3M9XCJib2xkXCIgaHJlZj1cIicgK1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMuYWNjb3VudEhvbGRzKSArXG4gICAgICAgICAgICAgICAgICAgICdcIiB0YWJpbmRleD1cIjBcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lmh0bWwoJ2hvbGRzJykgK1xuICAgICAgICAgICAgICAgICAgICAnPC9hPic7XG4gICAgICAgICAgICAgICAgaWYgKHdpbmRvdy50b2FzdGVyKSBlcnJvclRvYXN0KGxpbmspO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChcbiAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvckNvZGUgPT09ICdQYXRyb25UeXBlUmVzdHJpY3RlZEZyb21UaXRsZScgfHxcbiAgICAgICAgICAgICAgICByZXNwb25zZS5lcnJvckNvZGUgPT09ICdQYXRyb25IYXNIb2xkc0Rpc2FibGVkJ1xuICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgJCgnI2hvbGQtZHluYW1pYy1tb2RhbCcpLmZvdW5kYXRpb24oJ3JldmVhbCcsICdjbG9zZScpO1xuICAgICAgICAgICAgICAgIGxpbmsgPVxuICAgICAgICAgICAgICAgICAgICAnPGEgY2xhc3M9XCJib2xkXCIgaHJlZj1cIicgK1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMuc3VwcG9ydE1lbWJlcnMpICtcbiAgICAgICAgICAgICAgICAgICAgJ1wiIHRhYmluZGV4PVwiMFwiPicgK1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaHRtbCgncGxlYXNlQ29udGFjdFN1cHBvcnQnKSArXG4gICAgICAgICAgICAgICAgICAgICc8L2E+JztcbiAgICAgICAgICAgICAgICBpZiAod2luZG93LnRvYXN0ZXIpIGVycm9yVG9hc3QobGluayk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICQoJyNob2xkLWR5bmFtaWMtbW9kYWwnKS5mb3VuZGF0aW9uKCdyZXZlYWwnLCAnY2xvc2UnKTtcbiAgICAgICAgICAgICAgICBpZiAod2luZG93LnRvYXN0ZXIpIGVycm9yVG9hc3QoJycpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAkKFxuICAgICAgICAgICAgICAgICcucHJpbWFyeS1hY3Rpb25bZGF0YS1tZWRpYS1pZD1cIicgK1xuICAgICAgICAgICAgICAgICAgICBlbGVtLmF0dHIoJ2RhdGEtbWVkaWEtaWQnKSArXG4gICAgICAgICAgICAgICAgICAgICdcIl0nXG4gICAgICAgICAgICApLmh0bWwoZWxlbS5hdHRyKCdkYXRhLW9yaWdpbmFsLXRleHQnKSk7XG4gICAgICAgIH0pO1xuXG4gICAgLyoqXG4gICAgICogUGxhY2UgYSBob2xkIG9uIGEgdGl0bGUgd2hlbiBmb3JtIHZhbGlkYXRlc1xuICAgICAqL1xuICAgICQoJ2Zvcm0jaG9sZC1keW5hbWljLWZvcm0nKS5vbigndmFsaWQuZm5kdG4uYWJpZGUnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICB2YXIgZWxlbSA9ICQoXG4gICAgICAgICAgICAnW2RhdGEtYWN0aW9uPVwiaG9sZFwiXVtkYXRhLW1lZGlhLWlkPVwiJyArXG4gICAgICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCdkYXRhLW1lZGlhLWlkJykgK1xuICAgICAgICAgICAgICAgICdcIl0nXG4gICAgICAgICkuZmlyc3QoKTtcblxuICAgICAgICAvL0NoZWNrIGlmIGhvbGQgd2FzIHBsYWNlZCBmcm9tIHRpdGxlIGVsZW0gb3IgYWN0aW9uIGJ1dHRvblxuICAgICAgICBpZiAoJCgnZm9ybSNob2xkLWR5bmFtaWMtZm9ybScpLmF0dHIoJ2RhdGEtZnJvbS10aXRsZScpKSB7XG4gICAgICAgICAgICB3aW5kb3cuaG9sZEZyb21UaXRsZUVsZW0oXG4gICAgICAgICAgICAgICAgJCgnZm9ybSNob2xkLWR5bmFtaWMtZm9ybScpLmF0dHIoJ2RhdGEtbWVkaWEtaWQnKSxcbiAgICAgICAgICAgICAgICAkKCdmb3JtI2hvbGQtZHluYW1pYy1mb3JtIFtkYXRhLWlkPVwidGl0bGVcIl0nKS50ZXh0KClcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSBpZiAoJCgnZm9ybSNob2xkLWR5bmFtaWMtZm9ybScpLmF0dHIoJ2RhdGEtZnJvbS1hamF4JykpIHtcbiAgICAgICAgICAgIHdpbmRvdy5hamF4LnBsYWNlSG9sZChcbiAgICAgICAgICAgICAgICAkKCdmb3JtI2hvbGQtZHluYW1pYy1mb3JtJykuYXR0cignZGF0YS1tZWRpYS1pZCcpLFxuICAgICAgICAgICAgICAgICQoJy5wYXRyb24taG9sZC1lbWFpbC1keW5hbWljJykudmFsKCksXG4gICAgICAgICAgICAgICAgJCgnYm9keScpXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgd2luZG93LmhvbGRzLmhvbGRQbGFjZWQoZWxlbSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn0pO1xuXG53aW5kb3cuaGFuZGxlSG9sZCA9IGZ1bmN0aW9uICh0YXJnZXQsIG1lZGlhSWQpIHtcbiAgICBmdW5jdGlvbiByZXZlYWxIb2xkTW9kYWwoKSB7XG4gICAgICAgICQoJyNob2xkLWR5bmFtaWMtbW9kYWwgaDJbZGF0YS1pZD1cInRpdGxlXCJdJykuaHRtbChcbiAgICAgICAgICAgICQoJ1tkYXRhLWlkPVwidGl0bGVcIl0nKS5hdHRyKCdkYXRhLXRpdGxlJylcbiAgICAgICAgKTtcbiAgICAgICAgaWYgKHRhcmdldC5hdHRyKCdkYXRhLWFydHdvcmsnKSkge1xuICAgICAgICAgICAgJCgnW2RhdGEtaWQ9XCJjb3Zlci1pbWFnZVwiXScpLmF0dHIoXG4gICAgICAgICAgICAgICAgJ3NyYycsXG4gICAgICAgICAgICAgICAgdGFyZ2V0LmF0dHIoJ2RhdGEtYXJ0d29yaycpXG4gICAgICAgICAgICApO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGFydCA9ICQoJ2Rpdi50aXRsZVtkYXRhLXRpdGxlLWlkPVwiJyArIG1lZGlhSWQgKyAnXCJdIGltZycpLmF0dHIoXG4gICAgICAgICAgICAgICAgJ3NyYydcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGFydCA9PSAndW5kZWZpbmVkJykge1xuICAgICAgICAgICAgICAgIGFydCA9ICQoJ2Rpdi5tb2RhbC1jb250YWluZXIgaW1nW2RhdGEtaWQ9XCJjb3Zlci1pbWFnZVwiXScpLmF0dHIoXG4gICAgICAgICAgICAgICAgICAgICdzcmMnXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgICQoJ1tkYXRhLWlkPVwiY292ZXItaW1hZ2VcIl0nKS5hdHRyKCdzcmMnLCBhcnQpO1xuICAgICAgICB9XG4gICAgICAgIHdpbmRvdy5ob2xkcy5yZXZlYWxIb2xkTW9kYWwodGFyZ2V0KTtcbiAgICB9XG5cbiAgICB3aW5kb3cuYWpheFxuICAgICAgICAuZ2V0UGF0cm9uRW1haWwoKVxuICAgICAgICAuZG9uZShmdW5jdGlvbiAoZW1haWwpIHtcbiAgICAgICAgICAgIGlmIChlbWFpbCAhPSAnJykge1xuICAgICAgICAgICAgICAgICQoJ2lucHV0I2VtYWlsLWR5bmFtaWMsIGlucHV0I2VtYWlsLWNvbmYtZHluYW1pYycpLnZhbChlbWFpbCk7XG4gICAgICAgICAgICAgICAgJChcbiAgICAgICAgICAgICAgICAgICAgJy5wcmltYXJ5LWFjdGlvbiwgW2RhdGEtYWN0aW9uXTpub3QoW2RhdGEtYWN0aW9uPVwibWFpbi1uYXZpZ2F0aW9uXCJdKSdcbiAgICAgICAgICAgICAgICApLmFkZENsYXNzKCd2YWxpZC1lbWFpbCcpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5ob2xkcy5ob2xkUGxhY2VkKHRhcmdldCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldmVhbEhvbGRNb2RhbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuZmFpbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICByZXZlYWxIb2xkTW9kYWwoKTtcbiAgICAgICAgfSk7XG59O1xuXG4vKipcbiAqIEhPTEQgRlJPTSBUSVRMRSBFTEVNRU5UIC0tIGUuZy4gdGhhdCBsaXR0bGUgbGluayB1bmRlciB0aGUgY292ZXIgaW4gYSBjYXJvdXNlbCBvciBncmlkIHZpZXdcbiAqL1xuZnVuY3Rpb24gb3BlbkhvbGRGcm9tVGl0bGVFbGVtKFxuICAgIHRpdGxlLFxuICAgIHR5cGVJZCxcbiAgICB0eXBlTmFtZSxcbiAgICBhcnR3b3JrLFxuICAgIG1lZGlhSWQsXG4gICAgcHJlcmVsZWFzZURhdGUsXG4gICAgaXNQcmVyZWxlYXNlXG4pIHtcbiAgICB2YXIgbW9kYWwgPSAkKCcjaG9sZC1keW5hbWljLW1vZGFsJyk7XG4gICAgJCgnZm9ybSNob2xkLWR5bmFtaWMtZm9ybScpLmF0dHIoJ2RhdGEtZnJvbS10aXRsZScsIHRydWUpO1xuICAgIHZhciBidXR0b24gPSAkKCcucHJpbWFyeS1hY3Rpb25bZGF0YS1tZWRpYS1pZD1cIicgKyBtZWRpYUlkICsgJ1wiXTpmaXJzdCcpO1xuXG4gICAgYnV0dG9uLmF0dHIoJ2RhdGEtb3JpZ2luYWwtdGV4dCcsIGJ1dHRvbi50ZXh0KCkpO1xuICAgIGJ1dHRvbi5odG1sKHByaW1hcnlBY3Rpb25Mb2FkaW5nR2lmKTtcblxuICAgICQud2hlbih3aW5kb3cuYWpheC5nZXRBdmFpbGFiaWxpdHkobWVkaWFJZCksIHdpbmRvdy5hamF4LmdldFBhdHJvbkVtYWlsKCkpXG4gICAgICAgIC5kb25lKGZ1bmN0aW9uIChhdmFpbGFiaWxpdHlSZXNwLCBlbWFpbFJlc3ApIHtcbiAgICAgICAgICAgIHZhciBhdmFpbGFiaWxpdHlEYXRhID0gYXZhaWxhYmlsaXR5UmVzcFswXTtcbiAgICAgICAgICAgIHZhciBlbWFpbCA9IGVtYWlsUmVzcFswXTtcblxuICAgICAgICAgICAgaWYgKGVtYWlsICE9ICcnIHx8IGF2YWlsYWJpbGl0eURhdGEuYXZhaWxhYmxlQ29waWVzID4gMCkge1xuICAgICAgICAgICAgICAgICQoJ2lucHV0I2VtYWlsLWR5bmFtaWMsIGlucHV0I2VtYWlsLWNvbmYtZHluYW1pYycpLnZhbChlbWFpbCk7XG4gICAgICAgICAgICAgICAgJChcbiAgICAgICAgICAgICAgICAgICAgJy5wcmltYXJ5LWFjdGlvbiwgW2RhdGEtYWN0aW9uXTpub3QoW2RhdGEtYWN0aW9uPVwibWFpbi1uYXZpZ2F0aW9uXCJdKSdcbiAgICAgICAgICAgICAgICApLmFkZENsYXNzKCd2YWxpZC1lbWFpbCcpO1xuICAgICAgICAgICAgICAgICQoJ2Zvcm0jaG9sZC1keW5hbWljLWZvcm0nKS5hdHRyKCdkYXRhLW1lZGlhLWlkJywgbWVkaWFJZCk7XG4gICAgICAgICAgICAgICAgd2luZG93LmhvbGRGcm9tVGl0bGVFbGVtKFxuICAgICAgICAgICAgICAgICAgICBtZWRpYUlkLFxuICAgICAgICAgICAgICAgICAgICBhdmFpbGFiaWxpdHlEYXRhLmF2YWlsYWJsZUNvcGllcyA+IDBcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAkKCdbZGF0YS1pZD1cInRpdGxlXCJdJykuaHRtbCh0aXRsZSk7XG4gICAgICAgICAgICAgICAgJCgnW2RhdGEtaWQ9XCJmb3JtYXQtaWNvblwiXScpXG4gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygpXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnaWNvbi0nICsgdHlwZUlkKTtcbiAgICAgICAgICAgICAgICAkKCdbZGF0YS1pZD1cImZvcm1hdC1uYW1lXCJdJykuaHRtbCh0eXBlTmFtZSk7XG4gICAgICAgICAgICAgICAgJCgnW2RhdGEtaWQ9XCJjb3Zlci1pbWFnZVwiXScpLmF0dHIoJ3NyYycsIGFydHdvcmspO1xuICAgICAgICAgICAgICAgIGlmIChwcmVyZWxlYXNlRGF0ZSAhPSB1bmRlZmluZWQgJiYgaXNQcmVyZWxlYXNlKSB7XG4gICAgICAgICAgICAgICAgICAgICQoJ1tkYXRhLWlkPVwicHJlLXJlbGVhc2UtbGFiZWxcIl0nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQoJ1ByZS1yZWxlYXNlOiBFeHBlY3RlZCAnICsgcHJlcmVsZWFzZURhdGUpXG4gICAgICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2hpZGVNZScpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICQoJ1tkYXRhLWlkPVwicHJlLXJlbGVhc2UtbGFiZWxcIl0nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQoJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2hpZGVNZScpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBsYWJlbENvcHkgPSB3aW5kb3cuaHRtbCgnZHluYW1pY0hvbGRNb2RhbC5wbGFjZUhvbGREZXNjJywge1xuICAgICAgICAgICAgICAgICAgICBsaWJyYXJ5TmFtZTogd2luZG93Lk92ZXJEcml2ZS5saWJyYXJ5TmFtZSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAod2luZG93Lk92ZXJEcml2ZS5tZWRpYUl0ZW1zW21lZGlhSWRdLm93bmVkQ29waWVzID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsQ29weSA9IHdpbmRvdy5odG1sKCdob2xkc1JhdGlvSGVscE1vZGFsLm5vQ29waWVzVGV4dCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAkKCcuanMtaG9sZC1tb2RhbC1sYWJlbCcpLmh0bWwobGFiZWxDb3B5KTtcblxuICAgICAgICAgICAgICAgICQoJ2Zvcm0jaG9sZC1keW5hbWljLWZvcm0nKS5hdHRyKCdkYXRhLW1lZGlhLWlkJywgbWVkaWFJZCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5hdHRyKCdkYXRhLXB1Ymxpc2hlcicpID49ICc5ODE0NicgJiZcbiAgICAgICAgICAgICAgICAgICAgYnV0dG9uLmF0dHIoJ2RhdGEtcHVibGlzaGVyJykgPD0gJzk4MTU1JyAmJlxuICAgICAgICAgICAgICAgICAgICBDb29raWVzLmdldCgnZGlzbmV5LWV1bGEtc2V0dGluZycpICE9ICcxJ1xuICAgICAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgICAgICAvLyBEaXNuZXkgcHVibGlzaGVyIGlkcyBhcmUgOTgxNDYgLSA5ODE1NVxuICAgICAgICAgICAgICAgICAgICAkKCcjZGlzbmV5LWV1bGEtbW9kYWwnKS5mb3VuZGF0aW9uKCdyZXZlYWwnLCAnb3BlbicpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG1vZGFsLmZvdW5kYXRpb24oJ3JldmVhbCcsICdvcGVuJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KVxuICAgICAgICAuZmFpbChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB3aW5kb3cuaGFuZGxlSG9sZChidXR0b24sIG1lZGlhSWQpO1xuICAgICAgICB9KTtcbn1cblxud2luZG93LmhvbGRGcm9tVGl0bGVFbGVtID0gZnVuY3Rpb24gKG1lZGlhSWQsIGF2YWlsYWJsZUNvcGllcykge1xuICAgIHZhciBlbGVtID0gJCgnLnByaW1hcnktYWN0aW9uW2RhdGEtbWVkaWEtaWQ9XCInICsgbWVkaWFJZCArICdcIl0nKTtcblxuICAgIHZhciBvcmlnaW5hbEhUTUxDb250ZW50cyA9ICQoXG4gICAgICAgICcucHJpbWFyeS1hY3Rpb25bZGF0YS1tZWRpYS1pZD1cIicgKyBtZWRpYUlkICsgJ1wiXSdcbiAgICApLmh0bWwoKTtcbiAgICBlbGVtLmh0bWwod2luZG93LnByaW1hcnlBY3Rpb25Mb2FkaW5nR2lmKTtcbiAgICAkKFxuICAgICAgICAnLnByaW1hcnktYWN0aW9uLCBbZGF0YS1hY3Rpb25dOm5vdChbZGF0YS1hY3Rpb249XCJtYWluLW5hdmlnYXRpb25cIl0pJ1xuICAgICkuYWRkQ2xhc3MoJ3ZhbGlkLWVtYWlsJyk7XG5cbiAgICB3aW5kb3cuYWpheC5wbGFjZUhvbGQoXG4gICAgICAgIG1lZGlhSWQsXG4gICAgICAgIGVuY29kZVVSSUNvbXBvbmVudCgkKCcucGF0cm9uLWhvbGQtZW1haWwtZHluYW1pYycpLnZhbCgpKSxcbiAgICAgICAgZWxlbVxuICAgICk7XG59O1xuXG53aW5kb3cub3BlbkhvbGRTdWNjZXNzTW9kYWwgPSBmdW5jdGlvbiAocGFyYW1zKSB7XG4gICAgdmFyIG1vZGFsID0gJCgnI2pzLUhvbGRTdWNjZXNzTW9kYWwnKTtcbiAgICB2YXIgbGlua1VybCA9IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5hY2NvdW50SG9sZHMpO1xuICAgIHZhciBtYW5hZ2VIb2xkcyA9XG4gICAgICAgICc8YSBjbGFzcz1cIkhvbGRTdWNjZXNzTW9kYWwtbGlua1wiIGhyZWY9XCInICtcbiAgICAgICAgbGlua1VybCArXG4gICAgICAgICdcIiB0YWJpbmRleD1cIjBcIj4nICtcbiAgICAgICAgd2luZG93Lmh0bWwoJ2hvbGRTdWNjZXNzTW9kYWwubWFuYWdlSG9sZHMnKSArXG4gICAgICAgICc8L2E+JztcbiAgICB2YXIgc3VjY2Vzc0NvcHk7XG4gICAgaWYgKHBhcmFtcy5hdXRvQ2hlY2tvdXRTZXR0aW5nID09IDEpIHtcbiAgICAgICAgc3VjY2Vzc0NvcHkgPSB3aW5kb3cuaHRtbCgndG9hc3RzLmhvbGRTdWNjZXNzQXV0b0NoZWNrb3V0SHRtbCcsIHtcbiAgICAgICAgICAgIGVtYWlsOiBwYXJhbXMuZW1haWwsXG4gICAgICAgICAgICBtYW5hZ2VIb2xkc0xpbms6IG1hbmFnZUhvbGRzLFxuICAgICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzdWNjZXNzQ29weSA9IHdpbmRvdy5odG1sKCd0b2FzdHMuaG9sZFN1Y2Nlc3NIdG1sJywge1xuICAgICAgICAgICAgZW1haWw6IHBhcmFtcy5lbWFpbCxcbiAgICAgICAgICAgIG1hbmFnZUhvbGRzTGluazogbWFuYWdlSG9sZHMsXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBtb2RhbC5maW5kKCdbZGF0YS1pZD1cImxvYWRpbmctY29udGFpbmVyXCJdJykuaHRtbChwcmltYXJ5QWN0aW9uTG9hZGluZ0dpZik7XG4gICAgJC5nZXQoXG4gICAgICAgIHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5tZWRpYVJlbGF0ZWRGb3JIb2xkU3VjY2Vzcywge1xuICAgICAgICAgICAgbWVkaWFJZDogcGFyYW1zLm1lZGlhSWQsXG4gICAgICAgIH0pLFxuICAgICAgICBmdW5jdGlvbiAocmVzKSB7XG4gICAgICAgICAgICAkKCcuanMtaG9sZFN1Y2Nlc3NDb250ZW50JykuaHRtbChyZXMpO1xuICAgICAgICAgICAgbW9kYWwuZmluZCgnW2RhdGEtaWQ9XCJzdWNjZXNzLW1lc3NhZ2VcIl0nKS5odG1sKHN1Y2Nlc3NDb3B5KTtcbiAgICAgICAgICAgIHZhciBsemxkID0gbGF6eWxvYWQoeyBzcmM6ICdkYXRhLWFsb2FkJyB9KTtcbiAgICAgICAgICAgICQoJ2ltZ1tkYXRhLWFsb2FkXScpXG4gICAgICAgICAgICAgICAgLy8gYWRkIGRpbWVuc2lvbnNcbiAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2Jyb2tlbicpXG4gICAgICAgICAgICAgICAgLy8gYWRkIGJsYW5rIGltYWdlIHNvIGl0IGRvZXNuJ3QgbG9vayBicm9rZW4gKHRoaXMgaXMgc21hbGxlciB0aGFuIGNsZWFyLmdpZilcbiAgICAgICAgICAgICAgICAuYXR0cihcbiAgICAgICAgICAgICAgICAgICAgJ3NyYycsXG4gICAgICAgICAgICAgICAgICAgICdkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBUUFCQUFBQUFDSDVCQUVLQUFFQUxBQUFBQUFCQUFFQUFBSUNUQUVBT3c9PSdcbiAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHRoZSBwbGFjZWhvbGRlciBzdHVmZiB3aGVuIHRoZSBpbWFnZSBpcyBsb2FkIGZvciByZWFsXG4gICAgICAgICAgICAgICAgLm9uKCdsb2FkJywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5nZXRBdHRyaWJ1dGUoJ2RhdGEtbHpsZWQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZW1vdmVBdHRyKCdicm9rZW4gZGF0YS1hbG9hZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCdicm9rZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLy8gcmVnaXN0ZXIgdGhlIGxhenkgbG9hZGVyIHdhdGNoZXJcbiAgICAgICAgICAgICAgICAuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGx6bGQodGhpcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBtb2RhbC5maW5kKCdbZGF0YS1pZD1cImxvYWRpbmctY29udGFpbmVyXCJdJykuaHRtbCgnJyk7XG4gICAgICAgICAgICBtb2RhbC5mb3VuZGF0aW9uKCdyZXZlYWwnLCAnb3BlbicpO1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwYXJhbXMub25Mb2FkID09ICdmdW5jdGlvbicpIHBhcmFtcy5vbkxvYWQoKTtcbiAgICAgICAgfVxuICAgICk7XG59O1xuXG4vLyBIb2xkIHN1Y2Nlc3MgbW9kYWwgZXZlbnRzXG4kKCcjanMtSG9sZFN1Y2Nlc3NNb2RhbCcpLm9uKCdjbG9zZWQuZm5kdG4ucmV2ZWFsJywgZnVuY3Rpb24gKGUpIHtcbiAgICAvLyBEb24ndCBjbGVhciBjb250ZW50IGlmIHRoZSBtb2RhbCBuZWVkcyB0byBiZSByZW9wZW5lZCBvciB0aGUgZHJvcGRvd24gaXMgY2xvc2VkXG4gICAgaWYgKFxuICAgICAgICAkKCcuanMtaG9sZHMtcmF0aW8taGVscC1tb2RhbCcpLmF0dHIoJ2RhdGEtaG9sZFN1Y2Nlc3MnKSAhPT0gJ3RydWUnICYmXG4gICAgICAgICEkKGUudGFyZ2V0KS5oYXNDbGFzcygnanMtY29udGV4dC1kcm9wJylcbiAgICApIHtcbiAgICAgICAgJCgnLmpzLWhvbGRTdWNjZXNzQ29udGVudCcpLmh0bWwoJycpO1xuICAgIH1cbiAgICBpZiAod2luZG93LnRvYXN0ZXIpIHdpbmRvdy50b2FzdGVyLl9zdGlja1RvYXN0KCk7XG59KTtcblxuJCgnLmpzLWhvbGRTdWNjZXNzQ29udGVudCcpLm9uKCdjbGljayB0YXAnLCBmdW5jdGlvbiAoZSkge1xuICAgIGlmICgkKGUudGFyZ2V0KS5oYXNDbGFzcygnanMtaG9sZHMtcmF0aW8taGVscC1pY29uJykpIHtcbiAgICAgICAgJCgnLmpzLWhvbGRzLXJhdGlvLWhlbHAtbW9kYWwnKS5hdHRyKCdkYXRhLWhvbGRTdWNjZXNzJywgdHJ1ZSk7XG4gICAgfVxufSk7XG5cbiQoJy5qcy1ob2xkcy1yYXRpby1oZWxwLW1vZGFsJykub24oJ2Nsb3NlZC5mbmR0bi5yZXZlYWwnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKCQodGhpcykuYXR0cignZGF0YS1ob2xkU3VjY2VzcycpID09PSAndHJ1ZScpIHtcbiAgICAgICAgJCgnI2pzLUhvbGRTdWNjZXNzTW9kYWwnKS5mb3VuZGF0aW9uKCdyZXZlYWwnLCAnb3BlbicpO1xuICAgICAgICAkKHRoaXMpLmF0dHIoJ2RhdGEtaG9sZFN1Y2Nlc3MnLCBmYWxzZSk7XG4gICAgfVxufSk7XG5cbi8qKlxuICogRWRpdCBhIGhvbGRzIGVtYWlsIGFkZHJlc3NcbiAqL1xuJChkb2N1bWVudCkub24oJ3ZhbGlkLmZuZHRuLmFiaWRlJywgJyNob2xkLWVtYWlsLWZvcm0nLCBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIG1lZGlhSWQgPSAkKCcjbWVkaWFJZCcpLnZhbCgpO1xuXG4gICAgJC5hamF4KHtcbiAgICAgICAgdXJsOiB3aW5kb3cudXJsKHdpbmRvdy5yb3V0ZXMubWVkaWFFZGl0SG9sZCwgeyBtZWRpYUlkOiBtZWRpYUlkIH0pLFxuICAgICAgICB0eXBlOiAnUFVUJyxcbiAgICAgICAgZGF0YToge1xuICAgICAgICAgICAgZW1haWw6ICQoJy5wYXRyb24taG9sZC1lbWFpbCcpLnZhbCgpLFxuICAgICAgICAgICAgYXV0b0NoZWNrb3V0OiB3aW5kb3cucGF0cm9uU2V0dGluZ3NbJ2F1dG8tY2hlY2tvdXQtc2V0dGluZyddID09IDEsXG4gICAgICAgIH0sXG4gICAgICAgIHN1Y2Nlc3M6IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgICAgICAgICB2YXIgZW1haWwgPSAkKCcucGF0cm9uLWhvbGQtZW1haWwnKS52YWwoKTtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBlbWFpbCBvbiB0aGUgQ2FyZCBtYW5hZ2VyIGluc3RhbmNlXG4gICAgICAgICAgICB3aW5kb3cuY2FyZCAmJiB3aW5kb3cuY2FyZC5zZXRIb2xkRW1haWwoZW1haWwpO1xuICAgICAgICAgICAgJCgnI2VkaXQtaG9sZC1lbWFpbC1tb2RhbCcpLmZvdW5kYXRpb24oJ3JldmVhbCcsICdjbG9zZScpO1xuICAgICAgICB9LFxuICAgICAgICBlcnJvcjogZnVuY3Rpb24gKGpxWEhSLCB0ZXh0U3RhdHVzLCBlcnJvclRocm93bikge1xuICAgICAgICAgICAgJCgnI2VkaXQtaG9sZC1lbWFpbC1tb2RhbCcpLmZvdW5kYXRpb24oJ3JldmVhbCcsICdjbG9zZScpO1xuICAgICAgICAgICAgaWYgKHdpbmRvdy50b2FzdGVyKVxuICAgICAgICAgICAgICAgIHdpbmRvdy50b2FzdGVyLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICc8c3Ryb25nPicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lmh0bWwoJ2dlbmVyaWNFcnJvcicpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICc8L3N0cm9uZz4gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICBqcVhIUi5yZXNwb25zZVRleHQsXG4gICAgICAgICAgICAgICAgICAgICdlcnJvcidcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICB9LFxuICAgIH0pO1xufSk7XG5cbi8qKlxuICogV0lTSCBMSVNUIEVWRU5UIExJU1RFTkVSU1xuICovXG4kKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgZWxlbUFkZCA9ICdbZGF0YS1hY3Rpb249XCJ3aXNobGlzdC1hZGRcIl06bm90KFtkYXRhLW5vLWxpbmtlZC1jYXJkc10pJztcblxuICAgICQoJ2JvZHknKVxuICAgICAgICAub24oJ2NsaWNrJywgZWxlbUFkZCwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHdpbmRvdy5hamF4Lndpc2hMaXN0QWRkKFxuICAgICAgICAgICAgICAgICQoZS50YXJnZXQpLmNsb3Nlc3QoJ2EnKS5hdHRyKCdkYXRhLW1lZGlhLWlkJyksXG4gICAgICAgICAgICAgICAgJChlLnRhcmdldCkuY2xvc2VzdCgnYScpXG4gICAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAub24oJ3dpc2hMaXN0QWRkUmVxdWVzdCcsIGVsZW1BZGQsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICB2YXIgaWNvbiA9ICQoZS50YXJnZXQpLmNsb3Nlc3QoJ2RpdicpLmNoaWxkcmVuKCdpJyk7XG4gICAgICAgICAgICB3aW5kb3cubG9hZGluZy5hbmltYXRlSWNvbihpY29uLCAnYm91bmNlT3V0Jyk7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignd2lzaExpc3RBZGRTdWNjZXNzJywgZWxlbUFkZCwgZnVuY3Rpb24gKGUsIGRhdGEpIHtcbiAgICAgICAgICAgIHZhciBpY29uID0gJChlLnRhcmdldCkuY2xvc2VzdCgnZGl2JykuY2hpbGRyZW4oJ2knKTtcbiAgICAgICAgICAgIGljb24ucmVtb3ZlQ2xhc3MoJ2ljb24td2lzaC1saXN0JykuYWRkQ2xhc3MoJ2ljb24td2lzaC1saXN0LWFkZGVkJyk7XG4gICAgICAgICAgICB2YXIgbWVkaWFJZCA9ICQoZS50YXJnZXQpLmNsb3Nlc3QoJ2EnKS5hdHRyKCdkYXRhLW1lZGlhLWlkJyk7XG4gICAgICAgICAgICB3aW5kb3cubG9hZGluZy5jaGFuZ2VCdXR0b25TdGF0ZShcbiAgICAgICAgICAgICAgICAkKGUudGFyZ2V0KS5jbG9zZXN0KCdhJyksXG4gICAgICAgICAgICAgICAgJ3dpc2hsaXN0LXJlbW92ZSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB3aW5kb3cubG9hZGluZy5hbmltYXRlSWNvbihpY29uLCAnYm91bmNlSW4nKTtcblxuICAgICAgICAgICAgLy9DaGFuZ2Ugc3RhdGUgb2YgYW55IGdyaWQgdmlldyBpdGVtcyB3aXRoIHNhbWUgbWVkaWEgaWRcbiAgICAgICAgICAgIHZhciBncmlkSWNvbiA9ICQoXG4gICAgICAgICAgICAgICAgJ2Rpdi53aXNobGlzdFtkYXRhLW1lZGlhLWlkPVwiJyArIG1lZGlhSWQgKyAnXCJdJ1xuICAgICAgICAgICAgKS5maW5kKCdpJyk7XG4gICAgICAgICAgICBncmlkSWNvbi5oYXNDbGFzcygnaWNvbi13aXNoLWxpc3QnKVxuICAgICAgICAgICAgICAgID8gZ3JpZEljb25cbiAgICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2ljb24td2lzaC1saXN0JylcbiAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ljb24td2lzaC1saXN0LWFkZGVkJylcbiAgICAgICAgICAgICAgICA6IGdyaWRJY29uXG4gICAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCdpY29uLXdpc2gtbGlzdC1hZGRlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdpY29uLXdpc2gtbGlzdCcpO1xuICAgICAgICB9KTtcblxuICAgIHZhciBlbGVtUmVtb3ZlID0gJ1tkYXRhLWFjdGlvbj1cIndpc2hsaXN0LXJlbW92ZVwiXSc7XG4gICAgJCgnYm9keScpXG4gICAgICAgIC5vbignY2xpY2snLCBlbGVtUmVtb3ZlLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgd2luZG93LmFqYXgud2lzaExpc3RSZW1vdmUoXG4gICAgICAgICAgICAgICAgJChlLnRhcmdldCkuY2xvc2VzdCgnYScpLmF0dHIoJ2RhdGEtbWVkaWEtaWQnKSxcbiAgICAgICAgICAgICAgICAkKGUudGFyZ2V0KS5jbG9zZXN0KCdhJyksXG4gICAgICAgICAgICAgICAgZmFsc2VcbiAgICAgICAgICAgICk7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignd2lzaExpc3RSZW1vdmVSZXF1ZXN0JywgZWxlbVJlbW92ZSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHZhciBpY29uID0gJChlLnRhcmdldCkuY2xvc2VzdCgnZGl2JykuY2hpbGRyZW4oJ2knKTtcbiAgICAgICAgICAgIHdpbmRvdy5sb2FkaW5nLmFuaW1hdGVJY29uKGljb24sICdib3VuY2VPdXQnKTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCd3aXNoTGlzdFJlbW92ZVN1Y2Nlc3MnLCBlbGVtUmVtb3ZlLCBmdW5jdGlvbiAoZSwgZGF0YSkge1xuICAgICAgICAgICAgdmFyIGljb24gPSAkKGUudGFyZ2V0KS5jbG9zZXN0KCdkaXYnKS5jaGlsZHJlbignaScpO1xuICAgICAgICAgICAgaWNvbi5yZW1vdmVDbGFzcygnaWNvbi13aXNoLWxpc3QtYWRkZWQnKS5hZGRDbGFzcygnaWNvbi13aXNoLWxpc3QnKTtcbiAgICAgICAgICAgIHZhciBtZWRpYUlkID0gJChlLnRhcmdldCkuY2xvc2VzdCgnYScpLmF0dHIoJ2RhdGEtbWVkaWEtaWQnKTtcbiAgICAgICAgICAgICQoZS50YXJnZXQpLmNsb3Nlc3QoJ2EnKS5hdHRyKCdkYXRhLWFjdGlvbicsICd3aXNobGlzdC1hZGQnKTtcbiAgICAgICAgICAgIHdpbmRvdy5sb2FkaW5nLmNoYW5nZUJ1dHRvblN0YXRlKFxuICAgICAgICAgICAgICAgICQoZS50YXJnZXQpLmNsb3Nlc3QoJ2EnKSxcbiAgICAgICAgICAgICAgICAnd2lzaGxpc3QtYWRkJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHdpbmRvdy5sb2FkaW5nLmFuaW1hdGVJY29uKGljb24sICdib3VuY2VJbicpO1xuXG4gICAgICAgICAgICAvL0NoYW5nZSBzdGF0ZSBvZiBhbnkgZ3JpZCB2aWV3IGl0ZW1zIHdpdGggc2FtZSBtZWRpYSBpZFxuICAgICAgICAgICAgdmFyIGdyaWRJY29uID0gJCgnZGl2Lndpc2hsaXN0W2RhdGEtaWQ9XCInICsgbWVkaWFJZCArICdcIl0nKS5maW5kKFxuICAgICAgICAgICAgICAgICdpJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGdyaWRJY29uLmhhc0NsYXNzKCdpY29uLXdpc2gtbGlzdCcpXG4gICAgICAgICAgICAgICAgPyBncmlkSWNvblxuICAgICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnaWNvbi13aXNoLWxpc3QnKVxuICAgICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnaWNvbi13aXNoLWxpc3QtYWRkZWQnKVxuICAgICAgICAgICAgICAgIDogZ3JpZEljb25cbiAgICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2ljb24td2lzaC1saXN0LWFkZGVkJylcbiAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ljb24td2lzaC1saXN0Jyk7XG4gICAgICAgIH0pO1xufSk7XG5cbi8qKlxuICogV0lTSCBMSVNUIEZST00gVElUTEUgRUxFTUVOVFxuICovXG53aW5kb3cud2lzaGxpc3RPblRpdGxlRWxlbSA9IGZ1bmN0aW9uIChtZWRpYUlkLCBlbGVtKSB7XG4gICAgdmFyIHdpc2hsaXN0VXJsID0gd2luZG93LnVybCh3aW5kb3cucm91dGVzLmFjY291bnRXaXNobGlzdCk7XG4gICAgdmFyIGljb24gPSAkKGVsZW0pLmNoaWxkcmVuKCc6Zmlyc3QnKTtcbiAgICB2YXIgdGl0bGVOYW1lID0gJChcbiAgICAgICAgJy50aXRsZS1uYW1lW2RhdGEtbWVkaWEtaWQ9XCInICsgbWVkaWFJZCArICdcIl0gYTpmaXJzdCdcbiAgICApLnRleHQoKTtcbiAgICAkKGljb24pLmFkZENsYXNzKCdib3VuY2VPdXQnKTtcblxuICAgIGlmICgkKGljb24pLmhhc0NsYXNzKCdpY29uLXdpc2gtbGlzdCcpKSB7XG4gICAgICAgIC8vIEFkZCB0byB3aXNoIGxpc3RcbiAgICAgICAgd2luZG93LmFqYXgud2lzaExpc3RBZGQobWVkaWFJZCwgZWxlbSk7XG5cbiAgICAgICAgJChkb2N1bWVudClcbiAgICAgICAgICAgIC5vbignd2lzaExpc3RBZGRTdWNjZXNzJywgZWxlbSwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICQoaWNvbilcbiAgICAgICAgICAgICAgICAgICAgLnJlbW92ZUNsYXNzKCdpY29uLXdpc2gtbGlzdCcpXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnaWNvbi13aXNoLWxpc3QtYWRkZWQnKVxuICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2JvdW5jZU91dCcpXG4gICAgICAgICAgICAgICAgICAgIC5hZGRDbGFzcygnYm91bmNlSW4nKTtcbiAgICAgICAgICAgICAgICAkKGVsZW0pLmF0dHIoXG4gICAgICAgICAgICAgICAgICAgICdhcmlhLWxhYmVsJyxcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lmh0bWwoJ3JlbW92ZVRpdGxlRnJvbVdpc2hMaXN0JywgeyB0aXRsZTogdGl0bGVOYW1lIH0pXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIC8vVXBkYXRlIGFueSBsaXN0IHZpZXcgaXRlbXMgdG8gbWF0Y2hcbiAgICAgICAgICAgICAgICB2YXIgbWVkaWFJZCA9ICQoZWxlbSlcbiAgICAgICAgICAgICAgICAgICAgLmNsb3Nlc3QoJ2Rpdi53aXNobGlzdCcpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKCdkYXRhLW1lZGlhLWlkJyk7XG4gICAgICAgICAgICAgICAgdmFyIGxpc3RFbGVtID0gJChcbiAgICAgICAgICAgICAgICAgICAgJ2FbZGF0YS1hY3Rpb249XCJ3aXNobGlzdC1hZGRcIl1bZGF0YS1tZWRpYS1pZD1cIicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJZCArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXCJdJ1xuICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgdmFyIGxpc3RJY29uID0gbGlzdEVsZW0ucHJldignaScpO1xuICAgICAgICAgICAgICAgIGxpc3RFbGVtLmF0dHIoJ2RhdGEtYWN0aW9uJywgJ3dpc2hsaXN0LXJlbW92ZScpO1xuICAgICAgICAgICAgICAgIGxpc3RJY29uXG4gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnaWNvbi13aXNoLWxpc3QnKVxuICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2ljb24td2lzaC1saXN0LWFkZGVkJyk7XG4gICAgICAgICAgICAgICAgd2luZG93LmxvYWRpbmcuYW5pbWF0ZUljb24obGlzdEljb24sICdib3VuY2VJbicpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2FkaW5nLmNoYW5nZUJ1dHRvblN0YXRlKGxpc3RFbGVtLCAnd2lzaGxpc3QtcmVtb3ZlJyk7XG5cbiAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5vZmYoJ3dpc2hMaXN0QWRkU3VjY2VzcycpO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgICAgIC5vbihcbiAgICAgICAgICAgICAgICAnd2lzaExpc3RBZGRGYWlsdXJlJyxcbiAgICAgICAgICAgICAgICBlbGVtLFxuICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChlLCBqcVhIUiwgdGV4dFN0YXR1cywgZXJyb3JUaHJvd24pIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coZXJyb3JUaHJvd24pO1xuICAgICAgICAgICAgICAgICAgICB2YXIgbWVkaWFJZCA9ICQoZWxlbSlcbiAgICAgICAgICAgICAgICAgICAgICAgIC5jbG9zZXN0KCdkaXYud2lzaGxpc3QnKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoJ2RhdGEtbWVkaWEtaWQnKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICBqcVhIUi5yZXNwb25zZVRleHQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgIEpTT04ucGFyc2UoanFYSFIucmVzcG9uc2VUZXh0KVsnc2Vzc2lvbkV4cGlyZWQnXVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmb3J3YXJkVXJsID0gd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2gpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3J3YXJkVXJsICs9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggKyAnJndpc2h+JyArIG1lZGlhSWQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmRVcmwgKz0gJz93aXNoficgKyBtZWRpYUlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgJCgnLmpzLXJlYXV0aGVudGljYXRlJykuYXR0cihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaHJlZicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnVybCh3aW5kb3cucm91dGVzLmFjY291bnRTaWduSW4sIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yd2FyZDogZm9yd2FyZFVybCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJyNhdXRoZW50aWNhdGUtbW9kYWwnKS5mb3VuZGF0aW9uKCdyZXZlYWwnLCAnb3BlbicpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHdpbmRvdy50b2FzdGVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy50b2FzdGVyLnB1c2goXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5odG1sKCdlcnJvci5kZWZhdWx0RXJyb3JIdG1sJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdlcnJvcidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGljb24gPSAkKGVsZW0pLmNoaWxkcmVuKCdpJyk7XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2FkaW5nLmFuaW1hdGVJY29uKGljb24sICdib3VuY2VJbicpO1xuXG4gICAgICAgICAgICAgICAgICAgICQoZG9jdW1lbnQpLm9mZignd2lzaExpc3RBZGRGYWlsdXJlJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKCQoaWNvbikuaGFzQ2xhc3MoJ2ljb24td2lzaC1saXN0LWFkZGVkJykpIHtcbiAgICAgICAgLy8gUmVtb3ZlIGZyb20gd2lzaCBsaXN0XG4gICAgICAgIHdpbmRvdy5hamF4Lndpc2hMaXN0UmVtb3ZlKG1lZGlhSWQsIGVsZW0sIGZhbHNlKTtcblxuICAgICAgICAkKGRvY3VtZW50KVxuICAgICAgICAgICAgLm9uKCd3aXNoTGlzdFJlbW92ZVN1Y2Nlc3MnLCBlbGVtLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgJChpY29uKVxuICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2ljb24td2lzaC1saXN0LWFkZGVkJylcbiAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdpY29uLXdpc2gtbGlzdCcpXG4gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnYm91bmNlT3V0JylcbiAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdib3VuY2VJbicpO1xuICAgICAgICAgICAgICAgICQoZWxlbSkuYXR0cihcbiAgICAgICAgICAgICAgICAgICAgJ2FyaWEtbGFiZWwnLFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaHRtbCgnYWRkVGl0bGVUb1dpc2hMaXN0JywgeyB0aXRsZTogdGl0bGVOYW1lIH0pXG4gICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgIC8vVXBkYXRlIGFueSBsaXN0IHZpZXcgaXRlbXMgdG8gbWF0Y2hcbiAgICAgICAgICAgICAgICB2YXIgbWVkaWFJZCA9ICQoZWxlbSkuY2xvc2VzdCgnZGl2Lndpc2hsaXN0JykuYXR0cignZGF0YS1pZCcpO1xuICAgICAgICAgICAgICAgIHZhciBsaXN0RWxlbSA9ICQoXG4gICAgICAgICAgICAgICAgICAgICdhW2RhdGEtYWN0aW9uPVwid2lzaGxpc3QtcmVtb3ZlXCJdW2RhdGEtbWVkaWEtaWQ9XCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSWQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1wiXSdcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIHZhciBsaXN0SWNvbiA9IGxpc3RFbGVtLnByZXYoJ2knKTtcbiAgICAgICAgICAgICAgICBsaXN0RWxlbS5hdHRyKCdkYXRhLWFjdGlvbicsICd3aXNobGlzdC1hZGQnKTtcbiAgICAgICAgICAgICAgICBsaXN0SWNvblxuICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2ljb24td2lzaC1saXN0LWFkZGVkJylcbiAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdpY29uLXdpc2gtbGlzdCcpO1xuICAgICAgICAgICAgICAgIHdpbmRvdy5sb2FkaW5nLmFuaW1hdGVJY29uKGxpc3RJY29uLCAnYm91bmNlSW4nKTtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9hZGluZy5jaGFuZ2VCdXR0b25TdGF0ZShsaXN0RWxlbSwgJ3dpc2hsaXN0LWFkZCcpO1xuXG4gICAgICAgICAgICAgICAgJChkb2N1bWVudCkub2ZmKCd3aXNoTGlzdFJlbW92ZVN1Y2Nlc3MnKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAub24oXG4gICAgICAgICAgICAgICAgJ3dpc2hMaXN0UmVtb3ZlRmFpbHVyZScsXG4gICAgICAgICAgICAgICAgZWxlbSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZSwganFYSFIsIHRleHRTdGF0dXMsIGVycm9yVGhyb3duKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtZWRpYUlkID0gJChlbGVtKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmNsb3Nlc3QoJ2Rpdi53aXNobGlzdCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignZGF0YS1pZCcpO1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZyhlcnJvclRocm93bik7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAganFYSFIucmVzcG9uc2VUZXh0ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICBKU09OLnBhcnNlKGpxWEhSLnJlc3BvbnNlVGV4dClbJ3Nlc3Npb25FeHBpcmVkJ11cbiAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZm9yd2FyZFVybCA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICsgd2luZG93LmxvY2F0aW9uLnNlYXJjaDtcbiAgICAgICAgICAgICAgICAgICAgICAgICQoJy5qcy1yZWF1dGhlbnRpY2F0ZScpLmF0dHIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hyZWYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5hY2NvdW50U2lnbkluLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcndhcmQ6IGZvcndhcmRVcmwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAkKCcjYXV0aGVudGljYXRlLW1vZGFsJykuZm91bmRhdGlvbigncmV2ZWFsJywgJ29wZW4nKTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3aW5kb3cudG9hc3RlcilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cudG9hc3Rlci5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaHRtbCgnZXJyb3IuZGVmYXVsdEVycm9ySHRtbCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXJyb3InXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHZhciBpY29uID0gJChlbGVtKS5jaGlsZHJlbignaScpO1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9hZGluZy5hbmltYXRlSWNvbihpY29uLCAnYm91bmNlSW4nKTtcblxuICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS5vZmYoJ3dpc2hMaXN0UmVtb3ZlRmFpbHVyZScpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgfVxufTtcblxuLyoqXG4gKiBQQVRST04gTUVESUEgU1RBVFVTIEVWRU5UIExJU1RFTkVSU1xuICovXG4kKGZ1bmN0aW9uICgpIHtcbiAgICB2YXIgaXRlbXMgPSBbXTtcbiAgICB2YXIgd2lzaExpc3RJdGVtcyA9IFtdO1xuXG4gICAgJCgnYm9keScpXG4gICAgICAgIC5vbignbWVkaWFTdGF0dXNSZXF1ZXN0JywgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgJChcbiAgICAgICAgICAgICAgICAnW2RhdGEtYWN0aW9uXTpub3QoW2RhdGEtbm8tbGlua2VkLWNhcmRzXSk6bm90KC5qcy1zdGF0dXNVcGRhdGVkKSdcbiAgICAgICAgICAgICkuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIGFjdGlvbiA9ICQodGhpcykuYXR0cignZGF0YS1hY3Rpb24nKTtcbiAgICAgICAgICAgICAgICBpZiAoYWN0aW9uID09ICd3aXNobGlzdC1hZGQnIHx8IGFjdGlvbiA9PSAnd2lzaGxpc3QtcmVtb3ZlJykge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaWNvbiA9ICQodGhpcykuY2xvc2VzdCgnZGl2JykuY2hpbGRyZW4oJ2knKTtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvYWRpbmcuYW5pbWF0ZUljb24oaWNvbiwgJ2JvdW5jZU91dCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KVxuICAgICAgICAub24oJ21lZGlhU3RhdHVzU3VjY2VzcycsIGZ1bmN0aW9uIChlLCBkYXRhKSB7XG4gICAgICAgICAgICB2YXIgZWxlbTtcblxuICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlXG4gICAgICAgICAgICAvLyAkKCcubWVkaWEtY29udGFpbmVyLmxvYWRpbmcnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgICAgICAgLy8gaWYgKHR5cGVvZiB0b2dnbGVMaXN0Vmlld0ZlYXR1cmUgPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gICAgIHRvZ2dsZUxpc3RWaWV3RmVhdHVyZSgpO1xuICAgICAgICAgICAgLy8gfVxuXG4gICAgICAgICAgICBhc3luYy5wYXJhbGxlbChcbiAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9MT09QIEFMTCBCT1JST1dFRCBUSVRMRVNcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLm9uQ2hlY2tvdXRzICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciB4ID0gMDsgeCA8IGRhdGEub25DaGVja291dHMubGVuZ3RoOyB4KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRpdGxlSWQgPSBkYXRhLm9uQ2hlY2tvdXRzW3hdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVtcy5zcGxpY2UoaXRlbXMuaW5kZXhPZigrdGl0bGVJZCksIDEpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSGFuZGxlIGdyaWQgdmlldyBpdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy50aXRsZS1oZWFkZXItYmFyW2RhdGEtbWVkaWEtaWQ9XCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUlkICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCJdIGEnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5odG1sKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5odG1sKCdib3Jyb3dlZCcpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyA8aSBjbGFzcz1cImljb24gaWNvbi1pY29uLWNoZWNrZWQgdGl0bGUtbGFiZWxcIiBhcmlhLWhpZGRlbj1cInRydWVcIj48L2k+J1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2hyZWYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5hY2NvdW50TG9hbnMpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ3UtYWxsQ2FwcycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9hZGluZy51cGRhdGVDb3ZlckFsdChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cudGV4dCgnYm9ycm93ZWQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy5wcmltYXJ5LWFjdGlvbltkYXRhLW1lZGlhLWlkPVwiJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVJZCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wiXSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5hZGRDbGFzcygnaW52aXNpYmxlIGpzLXN0YXR1c1VwZGF0ZWQnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0hhbmRsZSBsaXN0IHZpZXcgaXRlbXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSA9ICQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnW2RhdGEtYWN0aW9uPVwiYm9ycm93XCJdW2RhdGEtbWVkaWEtaWQ9XCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUlkICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCJdLCBbZGF0YS1hY3Rpb249XCJib3Jyb3ctc2ltcGxlXCJdW2RhdGEtbWVkaWEtaWQ9XCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUlkICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCJdLCBbZGF0YS1hY3Rpb249XCJob2xkXCJdW2RhdGEtbWVkaWEtaWQ9XCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUlkICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCJdLCBbZGF0YS1hY3Rpb249XCJub29rXCJdW2RhdGEtbWVkaWEtaWQ9XCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUlkICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCJdJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9hZGluZy5jaGFuZ2VCdXR0b25TdGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYm9ycm93ZWQnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL0NoYW5nZSBiYW5uZXIgdGV4dFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1tkYXRhLWJhbm5lcl1bZGF0YS1tZWRpYS1pZD1cIicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlSWQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcIl0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkudGV4dChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvd1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5odG1sKCdhdmFpbGFiaWxpdHlCb3Jyb3dlZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRvVXBwZXJDYXNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIChjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy9MT09QIEFMTCBIRUxEIFRJVExFU1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEub25Ib2xkcyAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeSA9IDA7IHkgPCBkYXRhLm9uSG9sZHMubGVuZ3RoOyB5KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9JZiB0aXRsZSBpcyBhbHJlYWR5IGJvcnJvd2VkIGRvIG5vdCB0YWtlIGFjdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLm9uQ2hlY2tvdXRzLmluZGV4T2YoZGF0YS5vbkhvbGRzW3ldKSA9PVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTFcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdGl0bGVJZCA9IGRhdGEub25Ib2xkc1t5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnNwbGljZShpdGVtcy5pbmRleE9mKCt0aXRsZUlkKSwgMSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy50aXRsZS1oZWFkZXItYmFyW2RhdGEtbWVkaWEtaWQ9XCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVJZCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcIl0gYSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuaHRtbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lmh0bWwoJ29uSG9sZCcpICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgPGkgY2xhc3M9XCJpY29uIGljb24taWNvbi1jaGVja2VkIHRpdGxlLWxhYmVsXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9pPidcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmF0dHIoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdocmVmJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnVybChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5yb3V0ZXMuYWNjb3VudEhvbGRzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCd1LWFsbENhcHMnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2FkaW5nLnVwZGF0ZUNvdmVyQWx0KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlSWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LnRleHQoJ29uSG9sZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcucHJpbWFyeS1hY3Rpb25bZGF0YS1tZWRpYS1pZD1cIicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUlkICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wiXSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkuYWRkQ2xhc3MoJ2ludmlzaWJsZSBqcy1zdGF0dXNVcGRhdGVkJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSGFuZGxlIGxpc3QgdmlldyBpdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSA9ICQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1tkYXRhLWFjdGlvbj1cImhvbGRcIl1bZGF0YS1tZWRpYS1pZD1cIicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUlkICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wiXSwgW2RhdGEtYWN0aW9uPVwiYm9ycm93XCJdW2RhdGEtbWVkaWEtaWQ9XCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVJZCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcIl0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvYWRpbmcuY2hhbmdlQnV0dG9uU3RhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnaGVsZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vQ2hhbmdlIGJhbm5lciB0ZXh0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbZGF0YS1iYW5uZXJdW2RhdGEtbWVkaWEtaWQ9XCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVJZCArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcIl0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLnRleHQod2luZG93LnRleHQoJ29uSG9sZCcpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIGhvbGRzIHJhdGlvIGhlbHAgdGlwIGNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuanMtaG9sZHMtcmF0aW8tbm90LWhlbGRbZGF0YS1tZWRpYS1pZD1cIicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUlkICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wiXSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2pzLWhvbGRzLXJhdGlvLWhlbGQnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnanMtaG9sZHMtcmF0aW8tbm90LWhlbGQnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHByZXJlbGVhc2UgdGlwXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcuanMtcHJlcmVsZWFzZVtkYXRhLW1lZGlhLWlkPVwiJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlSWQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCJdJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5hZGRDbGFzcygnaXMtaGVsZCcpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAoY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vTE9PUCBBTEwgVElUTEVTIE9OIFdJU0ggTElTVFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEub25XaXNobGlzdCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgeiA9IDA7IHogPCBkYXRhLm9uV2lzaGxpc3QubGVuZ3RoOyB6KyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHRpdGxlSWQgPSBkYXRhLm9uV2lzaGxpc3Rbel07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0aXRsZU5hbWUgPSAkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJy50aXRsZS1uYW1lW2RhdGEtbWVkaWEtaWQ9XCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUlkICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCJdIGE6Zmlyc3QnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkudGV4dCgpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnLndpc2hsaXN0W2RhdGEtbWVkaWEtaWQ9XCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZUlkICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnXCJdIGknXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnaWNvbi13aXNoLWxpc3QnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpY29uLXdpc2gtbGlzdC1hZGRlZCBqcy1zdGF0dXNVcGRhdGVkJ1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcud2lzaGxpc3RbZGF0YS1tZWRpYS1pZD1cIicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlSWQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcIl0gYSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKS5hdHRyKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2FyaWEtbGFiZWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93Lmh0bWwoJ3JlbW92ZVRpdGxlRnJvbVdpc2hMaXN0Jywge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlOiB0aXRsZU5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vSGFuZGxlIGxpc3QgdmlldyBpdGVtc1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtID0gJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbZGF0YS1hY3Rpb249XCJ3aXNobGlzdC1hZGRcIl1bZGF0YS1tZWRpYS1pZD1cIicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpdGxlSWQgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcIl0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpY29uID0gZWxlbS5jbG9zZXN0KCdkaXYnKS5jaGlsZHJlbignaScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9hZGluZy5hbmltYXRlSWNvbihpY29uLCAnYm91bmNlSW4nKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvYWRpbmcuY2hhbmdlQnV0dG9uU3RhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3dpc2hsaXN0LXJlbW92ZSdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWNvbi5yZW1vdmVDbGFzcygnaWNvbi13aXNoLWxpc3QnKS5hZGRDbGFzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdpY29uLXdpc2gtbGlzdC1hZGRlZCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAoZXJyLCByZXN1bHRzKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vU3RvcCBzcGlubmVyIGFuZCBjaGFuZ2Ugc3RhdGUgb24gcmVtYWluaW5nIGl0ZW1zXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgaXRlbXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBlbGVtID0gJChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnW2RhdGEtYWN0aW9uXVtkYXRhLW1lZGlhLWlkPVwiJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1zW2ldICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wiXTpub3QoLmxlbmRpbmctb3B0aW9ucyknXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2FkaW5nLmNoYW5nZUJ1dHRvblN0YXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmF0dHIoJ2RhdGEtYWN0aW9uJyksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAvL0dldCByZW1haW5pbmcgd2lzaCBsaXN0IGl0ZW1zXG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgd2lzaExpc3RJdGVtcy5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW0gPSAkKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdbZGF0YS1hY3Rpb249XCJ3aXNobGlzdC1hZGRcIl1bZGF0YS1tZWRpYS1pZD1cIicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXNoTGlzdEl0ZW1zW2pdICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1wiXSdcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpY29uID0gZWxlbS5jbG9zZXN0KCdkaXYnKS5jaGlsZHJlbignaScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvYWRpbmcuYW5pbWF0ZUljb24oaWNvbiwgJ2JvdW5jZUluJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9hZGluZy5jaGFuZ2VCdXR0b25TdGF0ZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cignZGF0YS1hY3Rpb24nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLnRvU3RyaW5nKCk7XG5cbiAgICAgICAgICAgIC8vT25seSBwcm9jZXNzIGhlcmUgaWYgbm90IG9uIHRoZSBkZXRhaWxzIHBhZ2VcbiAgICAgICAgICAgIGlmIChsb2NhdGlvbi5pbmRleE9mKCcvbWVkaWEvJykgPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzSW5zdGFudEZvcndhcmRBY3Rpb25zKFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggPyB3aW5kb3cubG9jYXRpb24uc2VhcmNoIDogJycpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJCgnLmNhcm91c2VsLmxvYWRlZCcpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIGlmICghYm93c2VyLm1vYmlsZSAmJiAhYm93c2VyLnRhYmxldCkge1xuICAgICAgICAgICAgICAgICAgICBQcy51cGRhdGUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIGhpZGVDYXJvdXNlbEFycm93cyh0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgJCgnLm1lZGlhLWNvbnRhaW5lci5sb2FkaW5nJykuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgICQoJy5tZWRpYS1jb250YWluZXIubG9hZGVkJylcbiAgICAgICAgICAgICAgICAuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJylcbiAgICAgICAgICAgICAgICAucHJvbWlzZSgpXG4gICAgICAgICAgICAgICAgLmRvbmUoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAkKGRvY3VtZW50KS50cmlnZ2VyKCdtZWRpYUl0ZW1zTG9hZGVkJyk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICQoJ1tkYXRhLWFjdGlvbl06bm90KFtkYXRhLWFjdGlvbj1cIm1haW4tbmF2aWdhdGlvblwiXSknKS5yZW1vdmVDbGFzcyhcbiAgICAgICAgICAgICAgICAnZGlzYWJsZWQnXG4gICAgICAgICAgICApO1xuICAgICAgICB9KVxuICAgICAgICAub24oJ21lZGlhU3RhdHVzRmFpbHVyZScsIGZ1bmN0aW9uIChlLCBqcVhIUikge1xuICAgICAgICAgICAgJCgnW2RhdGEtYWN0aW9uXTpub3QoW2RhdGEtYWN0aW9uPVwibWFpbi1uYXZpZ2F0aW9uXCJdKScpLmVhY2goXG4gICAgICAgICAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmF0dHIoJ2RhdGEtYWN0aW9uJykgPT0gJ3dpc2hsaXN0LWFkZCcgfHxcbiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cignZGF0YS1hY3Rpb24nKSA9PSAnd2lzaGxpc3QtcmVtb3ZlJ1xuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2FkaW5nLmFuaW1hdGVJY29uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY2xvc2VzdCgnZGl2JykuY2hpbGRyZW4oJ2knKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYm91bmNlSW4nXG4gICAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5sb2FkaW5nLmNoYW5nZUJ1dHRvblN0YXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cignZGF0YS1hY3Rpb24nKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRydWVcbiAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAkKCcuY2Fyb3VzZWwubG9hZGVkJykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFib3dzZXIubW9iaWxlICYmICFib3dzZXIudGFibGV0KSB7XG4gICAgICAgICAgICAgICAgICAgIFBzLnVwZGF0ZSh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgaGlkZUNhcm91c2VsQXJyb3dzKHRoaXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcblxuICAgIHZhciBsb2NhdGlvbiA9IHdpbmRvdy5sb2NhdGlvbi50b1N0cmluZygpO1xuICAgIGlmIChcbiAgICAgICAgJCgnYm9keScpLmF0dHIoJ2F1dGhlbnRpY2F0ZWQnKSAhPSAnZmFsc2UnICYmXG4gICAgICAgIGxvY2F0aW9uLmluZGV4T2YoJy9ob2xkcycpID09IC0xXG4gICAgKSB7XG4gICAgICAgICQoXG4gICAgICAgICAgICAnW2RhdGEtYWN0aW9uXTpub3QoW2RhdGEtYWN0aW9uPVwibWFpbi1uYXZpZ2F0aW9uXCJdKSwgLnByaW1hcnktYWN0aW9uLCAuanMtYmFubmVyLWxpbmtbZGF0YS1iYW5uZXJdLCBbZGF0YS1tZWRpYS1pZF0nXG4gICAgICAgICkuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbWVkaWFJZCA9XG4gICAgICAgICAgICAgICAgdHlwZW9mICQodGhpcykuYXR0cignZGF0YS1tZWRpYS1pZCcpID09PSAndW5kZWZpbmVkJ1xuICAgICAgICAgICAgICAgICAgICA/ICQodGhpcykuYXR0cignZGF0YS1pZCcpXG4gICAgICAgICAgICAgICAgICAgIDogJCh0aGlzKS5hdHRyKCdkYXRhLW1lZGlhLWlkJyk7XG4gICAgICAgICAgICBpZiAoaXRlbXMuaW5kZXhPZigrbWVkaWFJZCkgPCAwICYmIG1lZGlhSWQpIHtcbiAgICAgICAgICAgICAgICBpdGVtcy5wdXNoKCttZWRpYUlkKTtcbiAgICAgICAgICAgICAgICB3aXNoTGlzdEl0ZW1zLnB1c2goK21lZGlhSWQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy9oYWNrIHRvIGdldCByaWQgb2YgZXh0cmEgY2FsbCBvbiBtZWRpYSBkZXRhaWxzIHBhZ2Ugc2luY2UgdGhlIGJ1dHRvbiB3YXMgcmVmYWN0b3JlZCB0byBub3QgdXNlIHRpdGxlLWFjdGlvbnNcbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgKGl0ZW1zLmxlbmd0aCA9PT0gMSAmJiBsb2NhdGlvbi5pbmRleE9mKCdtZWRpYS8nICsgaXRlbXNbMF0pIDwgMCkgfHxcbiAgICAgICAgICAgIGl0ZW1zLmxlbmd0aCA+IDFcbiAgICAgICAgKSB7XG4gICAgICAgICAgICB3aW5kb3cuYWpheC5nZXRNZWRpYVN0YXR1cyhpdGVtcyk7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICAkKCdbZGF0YS1hY3Rpb25dOm5vdChbZGF0YS1hY3Rpb249XCJtYWluLW5hdmlnYXRpb25cIl0pJykuZWFjaChcbiAgICAgICAgICAgIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9hZGluZy5jaGFuZ2VCdXR0b25TdGF0ZShcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKSxcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCdkYXRhLWFjdGlvbicpLFxuICAgICAgICAgICAgICAgICAgICB0cnVlXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcblxuICAgICAgICAkKCcubWVkaWEtY29udGFpbmVyLmxvYWRpbmcnKS5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgICAkKCcubWVkaWEtY29udGFpbmVyLmxvYWRlZCcpLmNzcygnZGlzcGxheScsICdibG9jaycpO1xuICAgICAgICAkKCcubWVkaWEtY29udGFpbmVyLmxvYWRlZC5ncmlkLXZpZXcnKS5jc3MoJ2Rpc3BsYXknLCAnYmxvY2snKTtcblxuICAgICAgICBpZiAoJCgnYm9keScpLmF0dHIoJ25vLWxpbmtlZC1jYXJkcycpID09PSAndHJ1ZScpIHtcbiAgICAgICAgICAgICQoZG9jdW1lbnQpLnJlYWR5KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgJChkb2N1bWVudCkudHJpZ2dlcignbWVkaWFTdGF0dXNOb0NhcmQnKTtcbiAgICAgICAgICAgICAgICB9LCAyMDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAkKCcuY2Fyb3VzZWwubG9hZGVkJykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIWJvd3Nlci5tb2JpbGUgJiYgIWJvd3Nlci50YWJsZXQpIHtcbiAgICAgICAgICAgICAgICBQcy51cGRhdGUodGhpcyk7XG4gICAgICAgICAgICAgICAgaGlkZUNhcm91c2VsQXJyb3dzKHRoaXMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG59KTtcblxuLyoqXG4gKiBMRU5ESU5HIFBFUklPRCBPUFRJT05TIEVWRU5UIExJU1RFTkVSU1xuICovXG4kKGZ1bmN0aW9uICgpIHtcbiAgICAkKCdbZGF0YS1sZW5kaW5nLXBlcmlvZC1kcm9wZG93bl0nKVxuICAgICAgICAub24oJ2xlbmRpbmdQZXJpb2RzUmV0cmlldmVkJywgZnVuY3Rpb24gKGUsIGRhdGEpIHtcbiAgICAgICAgICAgIHZhciBsZW5kaW5nUGVyaW9kTGlzdCA9ICQoJy5qcy1sZW5kaW5nLXBlcmlvZC1saXN0Jyk7XG4gICAgICAgICAgICBsZW5kaW5nUGVyaW9kTGlzdC5lbXB0eSgpOyAvLyBDbGVhciBhbnkgcmVtYWluaW5nIG9wdGlvbnNcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZGF0YS5pdGVtcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciBkYXlzO1xuICAgICAgICAgICAgICAgIGlmIChkYXRhLml0ZW1zW2ldLnVuaXRzID09ICdkYXlzJykge1xuICAgICAgICAgICAgICAgICAgICBkYXlzID0gZGF0YS5pdGVtc1tpXS5sZW5kaW5nUGVyaW9kO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIG1pbnV0ZXNcbiAgICAgICAgICAgICAgICAgICAgZGF5cyA9IGRhdGEuaXRlbXNbaV0ubGVuZGluZ1BlcmlvZCAvIDE0NDA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHZhciBzZWxlY3RlZENsYXNzID0gZGF0YS5pdGVtc1tpXS5pc1ByZWZlcnJlZExlbmRpbmdQZXJpb2RcbiAgICAgICAgICAgICAgICAgICAgPyAnaXMtY2hlY2tlZCBkZWZhdWx0J1xuICAgICAgICAgICAgICAgICAgICA6ICcnO1xuICAgICAgICAgICAgICAgIHZhciBzZWxlY3RlZEFyaWEgPSBkYXRhLml0ZW1zW2ldLmlzUHJlZmVycmVkTGVuZGluZ1BlcmlvZFxuICAgICAgICAgICAgICAgICAgICA/ICdhcmlhLXNlbGVjdGVkPVwidHJ1ZVwiJ1xuICAgICAgICAgICAgICAgICAgICA6ICdhcmlhLXNlbGVjdGVkPVwiZmFsc2VcIic7XG4gICAgICAgICAgICAgICAgdmFyIHNlbGVjdGVkTGFiZWwgPSBkYXRhLml0ZW1zW2ldLmlzUHJlZmVycmVkTGVuZGluZ1BlcmlvZFxuICAgICAgICAgICAgICAgICAgICA/IHdpbmRvdy5odG1sKCdzZWxlY3RlZCcpXG4gICAgICAgICAgICAgICAgICAgIDogJyc7XG5cbiAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9XG4gICAgICAgICAgICAgICAgICAgICc8bGkgcm9sZT1cIm1lbnVpdGVtXCIgdGFiaW5kZXg9XCItMVwiIGNsYXNzPVwiTGVuZGluZ1BlcmlvZHMtbGVuZGluZ1BlcmlvZExpc3RJdGVtXCI+PGEgdGFiaW5kZXg9XCItMVwiIGhyZWY9XCJcIiByb2xlPVwiYnV0dG9uXCInICtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRBcmlhICtcbiAgICAgICAgICAgICAgICAgICAgJyBhcmlhLWxhYmVsPVwiJyArXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5odG1sKCdib3Jyb3dCdXR0b25MYWJlbCcsIHsgZGF5czogZGF5cyB9KSArXG4gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTGFiZWwgK1xuICAgICAgICAgICAgICAgICAgICAnXCIgY2xhc3M9XCInICtcbiAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRDbGFzcyArXG4gICAgICAgICAgICAgICAgICAgICcgbGVuZGluZy1vcHRpb24gTGVuZGluZ1BlcmlvZHMtbGVuZGluZ1BlcmlvZExpc3RJdGVtTGluayBqcy1sZW5kaW5nLXBlcmlvZC1vcHRpb25cIiBkYXRhLXRleHQ9XCInICtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93Lmh0bWwoJ2ZvclhEYXlzJywgeyBsZW5kaW5nUGVyaW9kOiBkYXlzIH0pICtcbiAgICAgICAgICAgICAgICAgICAgJ1wiIGRhdGEtZGF5cz1cIicgK1xuICAgICAgICAgICAgICAgICAgICBkYXlzICtcbiAgICAgICAgICAgICAgICAgICAgJ1wiIGlkPVwibGVuZGluZy0nICtcbiAgICAgICAgICAgICAgICAgICAgZGF5cyArXG4gICAgICAgICAgICAgICAgICAgICctZGF5c1wiPicgK1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaHRtbCgneERheXMnLCB7IGxlbmRpbmdQZXJpb2Q6IGRheXMgfSkgK1xuICAgICAgICAgICAgICAgICAgICAnPC9hPjwvbGk+JztcblxuICAgICAgICAgICAgICAgIGxlbmRpbmdQZXJpb2RMaXN0LmFwcGVuZChjb250ZW50KTtcblxuICAgICAgICAgICAgICAgIGlmIChkYXRhLml0ZW1zW2ldLmlzUHJlZmVycmVkTGVuZGluZ1BlcmlvZCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgdGhhdCA9IHRoaXM7XG4gICAgICAgICAgICAgICAgICAgIHNldFRpbWVvdXQoXG4gICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbiAodGhhdCwgZGF5cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhhdClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnByZXYoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnYVtkYXRhLW1lZGlhLWlkPVwiJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGF0KS5hdHRyKCdkYXRhLW1lZGlhLWlkJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcIl0nXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmNoaWxkcmVuKCcuYm9ycm93LXN1Yi10ZXh0JylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnRleHQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cudGV4dCgnZm9yWERheXMnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZGluZ1BlcmlvZDogZGF5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgMCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoYXQsXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXlzXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICQoXG4gICAgICAgICAgICAgICAgICAgICAgICAnaW5wdXQjbGVuZGluZy1wZXJpb2QtJyArICQodGhpcykuYXR0cignZGF0YS1tZWRpYS1pZCcpXG4gICAgICAgICAgICAgICAgICAgICkudmFsKGRheXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgd2luZG93LmxvYWRpbmcuY2hhbmdlQnV0dG9uU3RhdGUoXG4gICAgICAgICAgICAgICAgJCh0aGlzKS5wcmV2KCdbZGF0YS1hY3Rpb249XCJib3Jyb3dcIl0nKSxcbiAgICAgICAgICAgICAgICAnYm9ycm93J1xuICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgLy9JZiBvbiB0aGUgZGV0YWlscyBwYWdlOiBleGVjdXRlIGZvcndhcmRlZCBhY3Rpb24gYWZ0ZXIgbGVuZGluZyBwZXJpb2RzIHJldHJpZXZlZFxuICAgICAgICAgICAgdmFyIGxvY2F0aW9uID0gd2luZG93LmxvY2F0aW9uLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAobG9jYXRpb24uaW5kZXhPZignL21lZGlhLycpID4gLTEpIHtcbiAgICAgICAgICAgICAgICBwcm9jZXNzSW5zdGFudEZvcndhcmRBY3Rpb25zKFxuICAgICAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24ucGF0aG5hbWUgK1xuICAgICAgICAgICAgICAgICAgICAgICAgKHdpbmRvdy5sb2NhdGlvbi5zZWFyY2ggPyB3aW5kb3cubG9jYXRpb24uc2VhcmNoIDogJycpXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgLy9Pbmx5IGNoZWNrIG1lZGlhIHN0YXR1cyBpZiBidXR0b24gaGFzIGRpc3BsYXkgb3RoZXIgdGhhbiBub25lXG4gICAgICAgICAgICBpZiAoXG4gICAgICAgICAgICAgICAgKCQodGhpcykucGFyZW50cygnLm5vdy1hdmFpbGFibGUtYnV0dG9uLWNvbnRhaW5lcicpLmxlbmd0aCA9PVxuICAgICAgICAgICAgICAgICAgICAwICYmXG4gICAgICAgICAgICAgICAgICAgICEkKHRoaXMpLmNsb3Nlc3QoJy5hY3Rpb24tYnV0dG9ucycpLmxlbmd0aCkgfHxcbiAgICAgICAgICAgICAgICAoJCh0aGlzKS5jbG9zZXN0KCcuYWN0aW9uLWJ1dHRvbnMnKS5sZW5ndGggJiZcbiAgICAgICAgICAgICAgICAgICAgZ2V0Q29tcHV0ZWRTdHlsZShcbiAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuY2xvc2VzdCgnLmFjdGlvbi1idXR0b25zJylbMF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBudWxsXG4gICAgICAgICAgICAgICAgICAgICkuZGlzcGxheSAhPSAnbm9uZScpIHx8XG4gICAgICAgICAgICAgICAgJCgnLm1lZGlhLWNvbnRhaW5lci5ncmlkLXZpZXcnKS5sZW5ndGhcbiAgICAgICAgICAgICkge1xuICAgICAgICAgICAgICAgIGlmIChcbiAgICAgICAgICAgICAgICAgICAgJCgnYm9keScpLmF0dHIoJ2F1dGhlbnRpY2F0ZWQnKSA9PSAnZmFsc2UnICYmXG4gICAgICAgICAgICAgICAgICAgICQoJ2JvZHknKS5hdHRyKCduby1saW5rZWQtY2FyZHMnKSA9PSAnZmFsc2UnXG4gICAgICAgICAgICAgICAgKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBtZWRpYUlkID0gJCh0aGlzKS5hdHRyKCdkYXRhLW1lZGlhLWlkJyk7XG4gICAgICAgICAgICAgICAgICAgIHZhciBmb3J3YXJkVXJsID0gd2luZG93LnVybCh3aW5kb3cucm91dGVzLm1lZGlhSWQsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlkOiBtZWRpYUlkLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNpZ25JblVybCA9IHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5hY2NvdW50U2lnbkluLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3J3YXJkOiBmb3J3YXJkVXJsLFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHNpZ25JbkxpbmsgPVxuICAgICAgICAgICAgICAgICAgICAgICAgJzxhIGNsYXNzPVwibGVuZGluZy1vcHRpb24tbGluayBqcy1sZW5kaW5nLXBlcmlvZC1saW5rXCIgdGFiaW5kZXg9XCItMVwiIGFyaWEtbGFiZWw9XCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5odG1sKCdsZW5kaW5nUGVyaW9kVGV4dExhYmVsTm9BdXRoJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJ1wiIGhyZWY9XCInICtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25JblVybCArXG4gICAgICAgICAgICAgICAgICAgICAgICAnXCI+JyArXG4gICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaHRtbCgnc2lnbkluJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgJzwvYT4nO1xuICAgICAgICAgICAgICAgICAgICB2YXIgY29udGVudCA9IHdpbmRvdy5odG1sKFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2xlbmRpbmdQZXJpb2RUZXh0Tm9BdXRoV2l0aExpbmtIdG1sJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHsgbGluazogc2lnbkluTGluayB9XG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgICQoXG4gICAgICAgICAgICAgICAgICAgICAgICAndWwjbGVuZGluZy1wZXJpb2Qtb3B0aW9ucy0nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmF0dHIoJ2RhdGEtbWVkaWEtaWQnKVxuICAgICAgICAgICAgICAgICAgICApLmFwcGVuZChjb250ZW50KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvL0lmIG5vIGxpbmtlZCBjYXJkcyBwb3B1bGF0ZSBsZW5kaW5nIHBlcmlvZCBkcm9wZG93blxuICAgICAgICAgICAgICAgICAgICB2YXIgYXR0ciA9ICQodGhpcykuYXR0cignZGF0YS1uby1saW5rZWQtY2FyZHMnKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBhdHRyICE9PSAndW5kZWZpbmVkJyAmJiBhdHRyICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGFkZENhcmRMaW5rID1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGEgY2xhc3M9XCJsZW5kaW5nLW9wdGlvbi1saW5rIGpzLWxlbmRpbmctcGVyaW9kLWxpbmtcIiB0YWJpbmRleD1cIi0xXCIgYXJpYS1sYWJlbD1cIicgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5odG1sKCdsZW5kaW5nUGVyaW9kVGV4dExhYmVsTm9DYXJkJykgK1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdcIiBkYXRhLXJldmVhbC1pZD1cImxpbmstY2FyZC1tb2RhbFwiIGhyZWY9XCJqYXZhc2NyaXB0OnZvaWQoMClcIj4nICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaHRtbCgnYWRkQUNhcmQnKSArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJzwvYT4nO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGNvbnRlbnQgPSB3aW5kb3cuaHRtbChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnbGVuZGluZ1BlcmlvZFRleHROb0NhcmRXaXRoTGlua0h0bWwnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgbGluazogYWRkQ2FyZExpbmsgfVxuICAgICAgICAgICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICQoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3VsI2xlbmRpbmctcGVyaW9kLW9wdGlvbnMtJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cignZGF0YS1tZWRpYS1pZCcpXG4gICAgICAgICAgICAgICAgICAgICAgICApLmFwcGVuZChjb250ZW50KTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdpbmRvdy5hamF4LmdldExlbmRpbmdQZXJpb2RzKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cignZGF0YS1tZWRpYS1pZCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQodGhpcylcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgd2luZG93Lmdsb2JhbEV2ZW50cy5vbignbGVuZGluZ1BlcmlvZHM6ZmV0Y2g6ZmFpbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgJCgnLmpzLWxlbmRpbmctcGVyaW9kLWxpc3QnKS5odG1sKFxuICAgICAgICAgICAgJzxzcGFuPicgKyB3aW5kb3cuaHRtbCgnZXJyb3IuZXJyb3JUcnlBZ2FpbicpICsgJzwvc3Bhbj4nXG4gICAgICAgICk7XG4gICAgfSk7XG5cbiAgICAvKlxuICAgICAqIENoYW5nZSBsZW5kaW5nIHBlcmlvZCBvcHRpb25zIGFuZCBjb250cm9sIGZvY3VzIHdpdGgga2V5Ym9hcmRcbiAgICAgKi9cbiAgICAkKCdib2R5Jykub24oJ2NsaWNrIGtleWRvd24nLCAnW2RhdGEtbGVuZGluZy11bF0gbGkgYScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmIChlLnR5cGUgPT0gJ2NsaWNrJyB8fCBlLndoaWNoID09IDEzIHx8IGUud2hpY2ggPT0gMzIpIHtcbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgdmFyIGRyb3Bkb3duQnV0dG9uID0gJChlLnRhcmdldClcbiAgICAgICAgICAgICAgICAuY2xvc2VzdCgndWwnKVxuICAgICAgICAgICAgICAgIC5wcmV2KCdbZGF0YS1sZW5kaW5nLXBlcmlvZC1kcm9wZG93bl0nKTtcbiAgICAgICAgICAgIHZhciBtZWRpYUlkID0gZHJvcGRvd25CdXR0b24uYXR0cignZGF0YS1tZWRpYS1pZCcpO1xuXG4gICAgICAgICAgICB2YXIgbGVuZGluZ0Ryb3Bkb3duID0gJChcbiAgICAgICAgICAgICAgICAndWwjbGVuZGluZy1wZXJpb2Qtb3B0aW9ucy1tb2RhbC0nICsgbWVkaWFJZFxuICAgICAgICAgICAgKS5sZW5ndGhcbiAgICAgICAgICAgICAgICA/ICd1bCNsZW5kaW5nLXBlcmlvZC1vcHRpb25zLW1vZGFsLScgKyBtZWRpYUlkXG4gICAgICAgICAgICAgICAgOiAndWwjbGVuZGluZy1wZXJpb2Qtb3B0aW9ucy0nICsgbWVkaWFJZDtcbiAgICAgICAgICAgICQobGVuZGluZ0Ryb3Bkb3duICsgJyBsaSBhJykuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzKVxuICAgICAgICAgICAgICAgICAgICAucmVtb3ZlQ2xhc3MoJ2NoZWNrZWQgaXMtY2hlY2tlZCcpXG4gICAgICAgICAgICAgICAgICAgIC5hdHRyKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICdhcmlhLXNlbGVjdGVkJzogJ2ZhbHNlJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdhcmlhLWxhYmVsJzogJCh0aGlzKS5hdHRyKCdhcmlhLWxhYmVsJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICQodGhpcylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXR0cignYXJpYS1sYWJlbCcpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2Uod2luZG93Lmh0bWwoJ3NlbGVjdGVkJyksICcnKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJycsXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICQoXG4gICAgICAgICAgICAgICAgbGVuZGluZ0Ryb3Bkb3duICtcbiAgICAgICAgICAgICAgICAgICAgJyBsaSBhW2RhdGEtZGF5cz1cIicgK1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmRhdGEoJ2RheXMnKSArXG4gICAgICAgICAgICAgICAgICAgICdcIl0nXG4gICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgLmFkZENsYXNzKCdjaGVja2VkIGlzLWNoZWNrZWQnKVxuICAgICAgICAgICAgICAgIC5hdHRyKHtcbiAgICAgICAgICAgICAgICAgICAgJ2FyaWEtc2VsZWN0ZWQnOiAndHJ1ZScsXG4gICAgICAgICAgICAgICAgICAgICdhcmlhLWxhYmVsJzogd2luZG93Lmh0bWwoJ2JvcnJvd0J1dHRvbkxhYmVsJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF5czogJCh0aGlzKS5kYXRhKCdkYXlzJyksXG4gICAgICAgICAgICAgICAgICAgIH0pLFxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBkcm9wZG93bkJ1dHRvblxuICAgICAgICAgICAgICAgIC5wcmV2KCdbZGF0YS1hY3Rpb249XCJib3Jyb3dcIl0nKVxuICAgICAgICAgICAgICAgIC5maW5kKCdzcGFuLmJvcnJvdy1zdWItdGV4dCcpXG4gICAgICAgICAgICAgICAgLnRleHQoJCh0aGlzKS5kYXRhKCd0ZXh0JykpO1xuXG4gICAgICAgICAgICB2YXIgbGVuZGluZ1BlcmlvZElucHV0ID0gJCgnI2xlbmRpbmctcGVyaW9kLW1vZGFsLScgKyBtZWRpYUlkKVxuICAgICAgICAgICAgICAgIC5sZW5ndGhcbiAgICAgICAgICAgICAgICA/ICQoJyNsZW5kaW5nLXBlcmlvZC1tb2RhbC0nICsgbWVkaWFJZClcbiAgICAgICAgICAgICAgICA6ICQoJyNsZW5kaW5nLXBlcmlvZC0nICsgbWVkaWFJZCk7XG5cbiAgICAgICAgICAgIGxlbmRpbmdQZXJpb2RJbnB1dC52YWwoJCh0aGlzKS5kYXRhKCdkYXlzJykpO1xuXG4gICAgICAgICAgICBpZiAoISQodGhpcykuaGFzQ2xhc3MoJ2RlZmF1bHQnKSkge1xuICAgICAgICAgICAgICAgIGRyb3Bkb3duQnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIC5wcmV2KCdbZGF0YS1hY3Rpb249XCJib3Jyb3dcIl0nKVxuICAgICAgICAgICAgICAgICAgICAuYWRkQ2xhc3MoJ2NoYW5nZWQnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgZHJvcGRvd25CdXR0b25cbiAgICAgICAgICAgICAgICAgICAgLnByZXYoJ1tkYXRhLWFjdGlvbj1cImJvcnJvd1wiXScpXG4gICAgICAgICAgICAgICAgICAgIC5yZW1vdmVDbGFzcygnY2hhbmdlZCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyQoJy5qcy1sZW5kaW5nLXBlcmlvZC1vcHRpb24nKS5hdHRyKCd0YWJpbmRleCcsIC0xKTtcbiAgICAgICAgICAgICQoJy5qcy1sZW5kaW5nLXBlcmlvZC1saXN0JykuaGlkZSgpO1xuICAgICAgICAgICAgJCgnLmpzLWxlbmRpbmctcGVyaW9kLWRyb3Bkb3duLWJ1dHRvbicpLmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZS53aGljaCA9PSA0MCkge1xuICAgICAgICAgICAgLy9Eb3duIGFycm93IHByZXNzZWQgbW92ZSBmb2N1cyBmb3J3YXJkXG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJ2xpJykubmV4dCgnbGknKS5jaGlsZHJlbignYScpLmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSBpZiAoZS53aGljaCA9PSAzOCkge1xuICAgICAgICAgICAgLy9VcCBhcnJvdyBwcmVzc2VkIG1vdmUgZm9jdXMgYmFja1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAvL0lmIGZpcnN0IGl0ZW0gaW4gbGlzdCBnbyBiYWNrIHRvIGRyb3Bkb3duIGJ1dHRvblxuICAgICAgICAgICAgaWYgKCQodGhpcykuY2xvc2VzdCgnbGknKS5pcygnOmZpcnN0LWNoaWxkJykpIHtcbiAgICAgICAgICAgICAgICAkKHRoaXMpLmNsb3Nlc3QoJ3VsJykucHJldignYnV0dG9uLmRyb3Bkb3duJykuZm9jdXMoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzKS5jbG9zZXN0KCdsaScpLnByZXYoJ2xpJykuY2hpbGRyZW4oJ2EnKS5mb2N1cygpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAkKCcubGVuZGluZy1wZXJpb2QtZHJvcGRvd24nKS5vbigna2V5ZG93bicsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmIChlLndoaWNoID09IDQwKSB7XG4gICAgICAgICAgICAvL0Rvd24gYXJyb3cgcHJlc3NlZCBtb3ZlIGZvY3VzIHRvIGZpcnN0IGl0ZW1cbiAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgIHZhciBkcm9wRG93biA9ICQodGhpcykuZGF0YSgnZHJvcGRvd24nKTtcbiAgICAgICAgICAgICQoJ3VsIycgKyBkcm9wRG93bilcbiAgICAgICAgICAgICAgICAuY2hpbGRyZW4oJ2xpJylcbiAgICAgICAgICAgICAgICAuZmlyc3QoKVxuICAgICAgICAgICAgICAgIC5jaGlsZHJlbignYScpXG4gICAgICAgICAgICAgICAgLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIC8vQ29udHJvbCBsZW5kaW5nIHBlcmlvZCBkcm9wZG93biB0YWJpbmRleFxuICAgICQoJ1tkYXRhLWxlbmRpbmctdWxdLCB1bC5zaWduaW4tZHJvcGRvd24nKVxuICAgICAgICAub24oJ29wZW5lZC5mbmR0bi5kcm9wZG93bicsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICQodGhpcykuZmluZCgnYScpLmF0dHIoJ3RhYmluZGV4JywgJzAnKTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKCdjbG9zZWQuZm5kdG4uZHJvcGRvd24nLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB2YXIgbWVkaWFJZCA9ICQodGhpcykuYXR0cignZGF0YS1tZWRpYS1pZCcpO1xuICAgICAgICAgICAgJCh0aGlzKS5maW5kKCdhJykuYXR0cigndGFiaW5kZXgnLCAnLTEnKTtcbiAgICAgICAgICAgICQoJ2lucHV0I2xlbmRpbmctcGVyaW9kLScgKyBtZWRpYUlkKS50cmlnZ2VyKCdjaGFuZ2UnKTtcbiAgICAgICAgfSk7XG5cbiAgICAvL0ZvY3VzIG9uIGJvcnJvdyBidXR0b24gYWZ0ZXIgc2VsZWN0aW5nIG5ldyBsZW5kaW5nIHBlcmlvZFxuICAgICQoJ1tkYXRhLWxlbmRpbmctcGVyaW9kLWlucHV0XScpLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICQodGhpcykucHJldignW2RhdGEtYWN0aW9uPVwiYm9ycm93XCJdJykuZm9jdXMoKTtcbiAgICB9KTtcbn0pO1xuXG4vKipcbiAqIEhhbmRsZSBzdGFyIHJhdGluZ3MuIFN0YXIgcmF0aW5ncyBldmVudCBsaXN0ZW5lcnNcbiAqL1xuJChmdW5jdGlvbiAoKSB7XG4gICAgLy9BY3Rpb24gb24gc3RhciBjbGljayAoU2V0IHJhdGluZylcbiAgICAkKCcuc3Rhci1yYXRpbmdzLWNvbnRhaW5lci5lZGl0YWJsZS5pcy1vbGQnKS5vbihcbiAgICAgICAgJ2NsaWNrJyxcbiAgICAgICAgJy5pY29uLXN0YXInLFxuICAgICAgICBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgdmFyICR0YXJnZXQgPSAkKGUudGFyZ2V0KTtcbiAgICAgICAgICAgIHZhciAkY29udGFpbmVyID0gJHRhcmdldC5jbG9zZXN0KCcuc3Rhci1yYXRpbmdzLWNvbnRhaW5lcicpO1xuICAgICAgICAgICAgdmFyIHJhdGluZyA9ICR0YXJnZXQuZGF0YSgnaW5kZXgnKTtcblxuICAgICAgICAgICAgc2VsZWN0U3RhclJhdGluZygkY29udGFpbmVyLCByYXRpbmcsIGZhbHNlKTtcbiAgICAgICAgfVxuICAgICk7XG5cbiAgICAvL1JldHJpZXZlIGFsbCBzdGFyIHJhdGluZ3NcbiAgICAkKCdib2R5Jykub24oJ21lZGlhU3RhdHVzU3VjY2VzcycsIGZ1bmN0aW9uIChlLCBkYXRhKSB7XG4gICAgICAgIGZvciAodmFyIG1lZGlhSWQgaW4gZGF0YS5zdGFyUmF0aW5ncykge1xuICAgICAgICAgICAgdmFyICRjb250YWluZXIgPSAkKFxuICAgICAgICAgICAgICAgICcuc3Rhci1yYXRpbmdzLWNvbnRhaW5lci5pcy1vbGRbZGF0YS1tZWRpYS1pZD1cIicgK1xuICAgICAgICAgICAgICAgICAgICBtZWRpYUlkICtcbiAgICAgICAgICAgICAgICAgICAgJ1wiXSdcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICB2YXIgcmF0aW5nID0gZGF0YS5zdGFyUmF0aW5nc1ttZWRpYUlkXTtcblxuICAgICAgICAgICAgc2V0VXNlclN0YXJSYXRpbmcoJGNvbnRhaW5lciwgcmF0aW5nLCB7XG4gICAgICAgICAgICAgICAgc2V0UmF0aW5nOiB0cnVlLFxuICAgICAgICAgICAgICAgIGlzSG92ZXI6IGZhbHNlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgJCh0aGlzKS50cmlnZ2VyKCd1c2VyU3RhclJhdGluZ1NldCcpOyAvLyBBbGxvdyBmb3J3YXJkZWQgc3RhciBhY3Rpb24gdG8gYmUgcHJvY2Vzc2VkXG4gICAgfSk7XG5cbiAgICAvL0NvbnRyb2wgaG92ZXIgc3RhdGVcbiAgICAkKCcuc3Rhci1yYXRpbmdzLWNvbnRhaW5lci5lZGl0YWJsZS5pcy1vbGQgLmljb24tc3RhcicpLmhvdmVyKGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyk7XG4gICAgICAgIHZhciAkY29udGFpbmVyID0gJHRoaXMuY2xvc2VzdCgnLnN0YXItcmF0aW5ncy1jb250YWluZXInKTtcbiAgICAgICAgdmFyIHVzZXJSYXRpbmcgPSAkY29udGFpbmVyLmRhdGEoJ3VzZXItcmF0aW5nJyk7XG5cbiAgICAgICAgJGNvbnRhaW5lci5hZGRDbGFzcygndXNlci1yYXRpbmcnKTtcblxuICAgICAgICB2YXIgaHlwb3RoZXRpY2FsUmF0aW5nID0gJHRoaXMuZGF0YSgnaW5kZXgnKTtcbiAgICAgICAgZmlsbFN0YXJzKCRjb250YWluZXIsIGh5cG90aGV0aWNhbFJhdGluZywge1xuICAgICAgICAgICAgc2V0UmF0aW5nOiBmYWxzZSxcbiAgICAgICAgICAgIGlzSG92ZXI6IHRydWUsXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG4gICAgJCgnLnN0YXItcmF0aW5ncy1jb250YWluZXIuZWRpdGFibGUuaXMtb2xkJykub24oJ21vdXNlbGVhdmUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyk7XG4gICAgICAgIHZhciAkY29udGFpbmVyID0gJHRoaXMuY2xvc2VzdCgnLnN0YXItcmF0aW5ncy1jb250YWluZXInKTtcbiAgICAgICAgdmFyIHVzZXJSYXRpbmcgPSAkY29udGFpbmVyLmRhdGEoJ3VzZXItcmF0aW5nJyk7XG4gICAgICAgIHZhciBoYXNVc2VyUmF0aW5nID0gdXNlclJhdGluZyA+IDA7XG5cbiAgICAgICAgaWYgKCFoYXNVc2VyUmF0aW5nKSB7XG4gICAgICAgICAgICAkY29udGFpbmVyLnJlbW92ZUNsYXNzKCd1c2VyLXJhdGluZycpO1xuXG4gICAgICAgICAgICBmaWxsU3RhcnMoJGNvbnRhaW5lciwgJGNvbnRhaW5lci5kYXRhKCdnbG9iYWwtcmF0aW5nJyksIHtcbiAgICAgICAgICAgICAgICBzZXRSYXRpbmc6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGlzSG92ZXI6IHRydWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGZpbGxTdGFycygkY29udGFpbmVyLCB1c2VyUmF0aW5nLCB7XG4gICAgICAgICAgICAgICAgc2V0UmF0aW5nOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBpc0hvdmVyOiB0cnVlLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIHdpbmRvdy5nbG9iYWxFdmVudHMub24oJ3JhdGluZzpzZXQ6ZmFpbCcsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIGxpbmsgPVxuICAgICAgICAgICAgJzxhIGNsYXNzPVwiYm9sZFwiIGhyZWY9XCInICtcbiAgICAgICAgICAgIHdpbmRvdy51cmwod2luZG93LnJvdXRlcy5zdXBwb3J0TWVtYmVycykgK1xuICAgICAgICAgICAgJ1wiIHRhYmluZGV4PVwiMFwiPicgK1xuICAgICAgICAgICAgd2luZG93Lmh0bWwoJ3BsZWFzZUNvbnRhY3RTdXBwb3J0JykgK1xuICAgICAgICAgICAgJzwvYT4nO1xuICAgICAgICBpZiAod2luZG93LnRvYXN0ZXIpXG4gICAgICAgICAgICB3aW5kb3cudG9hc3Rlci5wdXNoKFxuICAgICAgICAgICAgICAgICc8c3Ryb25nPicgK1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cuaHRtbCgnZ2VuZXJpY0Vycm9yJykgK1xuICAgICAgICAgICAgICAgICAgICAnPC9zdHJvbmc+ICcgK1xuICAgICAgICAgICAgICAgICAgICB3aW5kb3cudGV4dCgnZXJyb3IuZXJyb3JDb250YWN0U3VwcG9ydCcsIHsgbGluazogbGluayB9KSxcbiAgICAgICAgICAgICAgICAnZXJyb3InXG4gICAgICAgICAgICApO1xuICAgIH0pO1xuXG4gICAgd2luZG93Lmdsb2JhbEV2ZW50cy5vbigncmF0aW5nOmRlbGV0ZTpmYWlsJywgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgbGluayA9XG4gICAgICAgICAgICAnPGEgY2xhc3M9XCJib2xkXCIgaHJlZj1cIicgK1xuICAgICAgICAgICAgd2luZG93LnVybCh3aW5kb3cucm91dGVzLnN1cHBvcnRNZW1iZXJzKSArXG4gICAgICAgICAgICAnXCIgdGFiaW5kZXg9XCIwXCI+JyArXG4gICAgICAgICAgICB3aW5kb3cuaHRtbCgncGxlYXNlQ29udGFjdFN1cHBvcnQnKSArXG4gICAgICAgICAgICAnPC9hPic7XG4gICAgICAgIGlmICh3aW5kb3cudG9hc3RlcilcbiAgICAgICAgICAgIHdpbmRvdy50b2FzdGVyLnB1c2goXG4gICAgICAgICAgICAgICAgJzxzdHJvbmc+JyArXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy5odG1sKCdnZW5lcmljRXJyb3InKSArXG4gICAgICAgICAgICAgICAgICAgICc8L3N0cm9uZz4gJyArXG4gICAgICAgICAgICAgICAgICAgIHdpbmRvdy50ZXh0KCdlcnJvci5lcnJvckNvbnRhY3RTdXBwb3J0JywgeyBsaW5rOiBsaW5rIH0pLFxuICAgICAgICAgICAgICAgICdlcnJvcidcbiAgICAgICAgICAgICk7XG4gICAgfSk7XG59KTtcblxuJChkb2N1bWVudCkub24oJ2NsaWNrJywgJ2FbZGF0YS1yZXZlYWwtaWRdJywgZnVuY3Rpb24gKGUpIHtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG59KTtcblxuJChkb2N1bWVudCkucmVhZHkoZnVuY3Rpb24gKCkge1xuICAgICQoZG9jdW1lbnQpLm9uKFxuICAgICAgICAnY2xpY2snLFxuICAgICAgICAnW2RhdGEtYWN0aW9uXVtkYXRhLW5vLWxpbmtlZC1jYXJkc10sIC5pY29uLXN0YXJbZGF0YS1uby1saW5rZWQtY2FyZHNdJyxcbiAgICAgICAgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHN0cmlwcGVkUXVlcnlzdHJpbmcgPSB3aW5kb3cubG9jYXRpb24uc2VhcmNoLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgLyhbPyZdbm8tbGlua2VkLWNhcmQ9KD86dHJ1ZXxmYWxzZSkmPykvaSxcbiAgICAgICAgICAgICAgICBmdW5jdGlvbiAobWF0Y2gpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGxhc3RDaGFyID0gbWF0Y2hbbWF0Y2gubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgICAgIGlmIChsYXN0Q2hhciA9PT0gJyYnKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSdzIG1vcmUgYWZ0ZXIgdXM7IHdoZW4gd2UncmUgcmVtb3ZlZCB3ZSBuZWVkIHRvIHVzZSBvdXIgYmVnaW5uaW5nIHNlcGVyYXRvciB0byByZXBsYWNlIHRoZSBhbXBlcnNhbmRcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXRjaFswXTtcbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGhpbmcgYWZ0ZXIgdXM7IGNhbiBqdXN0IHJlcGxhY2Ugd2l0aCBub3RoaW5nXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuXG4gICAgICAgICAgICB2YXIgZm9yd2FyZFVybCA9XG4gICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLnBhdGhuYW1lICtcbiAgICAgICAgICAgICAgICB3aW5kb3cubG9jYXRpb24uc2VhcmNoLnJlcGxhY2UoXG4gICAgICAgICAgICAgICAgICAgIC8oJnxcXD8pbm8tbGlua2VkLWNhcmQoPXRydWV8XFw9ZmFsc2UpLyxcbiAgICAgICAgICAgICAgICAgICAgJydcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgdmFyIGFjdGlvbiA9ICcnO1xuICAgICAgICAgICAgaWYgKCQodGhpcykuaGFzQ2xhc3MoJ2ljb24tc3RhcicpKSB7XG4gICAgICAgICAgICAgICAgYWN0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgJ3N0YXJ+JyArXG4gICAgICAgICAgICAgICAgICAgICQodGhpcykucGFyZW50KCkuYXR0cignZGF0YS1tZWRpYS1pZCcpICtcbiAgICAgICAgICAgICAgICAgICAgJ34nICtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5kYXRhKCdpbmRleCcpOyAvLyBBZGQgc3RhciByYXRpbmdcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgYWN0aW9uID1cbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCdkYXRhLWFjdGlvbicpICtcbiAgICAgICAgICAgICAgICAgICAgJ34nICtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCdkYXRhLW1lZGlhLWlkJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB2YXIgaW5pdGlhdGVDYXJkTGlua1VybCA9IHdpbmRvdy51cmwoXG4gICAgICAgICAgICAgICAgd2luZG93LnJvdXRlcy5hY2NvdW50U3RhcnRDYXJkTGluayxcbiAgICAgICAgICAgICAgICB7IGZvcndhcmQ6IGZvcndhcmRVcmwsIGFjdGlvbjogYWN0aW9uIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICAkKCcjYWRkLWNhcmQtYnV0dG9uJykuYXR0cignaHJlZicsIGluaXRpYXRlQ2FyZExpbmtVcmwpO1xuICAgICAgICAgICAgJCgnI2xpbmstY2FyZC1tb2RhbCcpLmZvdW5kYXRpb24oJ3JldmVhbCcsICdvcGVuJyk7XG4gICAgICAgIH1cbiAgICApO1xuXG4gICAgLyogUmVzZXQgc3RhciByYXRpbmcgd2hlbiB1c2VyIGhhcyBubyBsaW5rZWQgY2FyZCBhbmQgY2xvc2UgbGluayBhIGNhciBtb2RhbCAqL1xuICAgICQoJy5saW5rLWNhcmQtbW9kYWwnKS5vbignY2xvc2UuZm5kdG4ucmV2ZWFsJywgZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgY29udGFpbmVyID0gJCgnLnN0YXItcmF0aW5ncy1jb250YWluZXInKTtcbiAgICAgICAgY29udGFpbmVyLmRhdGEoJ3VzZXItcmF0aW5nJywgbnVsbCkucmVtb3ZlQ2xhc3MoJ3VzZXItcmF0aW5nJyk7XG4gICAgICAgIGZpbGxTdGFycyhjb250YWluZXIsIE1hdGgucm91bmQoY29udGFpbmVyLmRhdGEoJ2dsb2JhbC1yYXRpbmcnKSkpO1xuICAgIH0pO1xufSk7XG5cbi8vQ2xpY2sgb24gbGluayB3aGVuIGNsaWNraW5nIHdpc2hsaXN0IGljb25cbiQoZG9jdW1lbnQpLm9uKCdjbGljaycsICcud2lzaGxpc3QtY29udGFpbmVyIGknLCBmdW5jdGlvbiAoKSB7XG4gICAgJCh0aGlzKS5uZXh0KCdhJykuY2xpY2soKTtcbn0pO1xuXG53aW5kb3cuc2V0RHluYW1pY0hvbGRzUmF0aW9Nb2RhbHMgPSBmdW5jdGlvbiAobWVkaWEpIHtcbiAgICBtZWRpYSA9IG1lZGlhIHx8IHt9O1xuICAgICQoJ2EjaG9sZHMtZXhwbGFuYXRpb24nKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCQodGhpcykuYXR0cignZGF0YS1ob2xkTGlzdFBvc2l0aW9uJykgIT0gJycpIHtcbiAgICAgICAgICAgICQodGhpcykuYXR0cihcbiAgICAgICAgICAgICAgICAnb25jbGljaycsXG4gICAgICAgICAgICAgICAgJ2R5bmFtaWNIb2xkc1JhdGlvTW9kYWwoJyArXG4gICAgICAgICAgICAgICAgICAgICQodGhpcykuYXR0cignZGF0YS1ob2xkc0NvdW50JykgK1xuICAgICAgICAgICAgICAgICAgICAnLCAnICtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCdkYXRhLW93bmVkQ29waWVzJykgK1xuICAgICAgICAgICAgICAgICAgICAnLCAnICtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5hdHRyKCdkYXRhLWhvbGRzUmF0aW8nKSArXG4gICAgICAgICAgICAgICAgICAgICcsICcgK1xuICAgICAgICAgICAgICAgICAgICAkKHRoaXMpLmF0dHIoJ2RhdGEtaG9sZExpc3RQb3NpdGlvbicpICtcbiAgICAgICAgICAgICAgICAgICAgJyk7J1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChcbiAgICAgICAgICAgICQodGhpcykuYXR0cignZGF0YS1vd25lZENvcGllcycpID09ICcnIHx8XG4gICAgICAgICAgICAkKHRoaXMpLmF0dHIoJ2RhdGEtb3duZWRDb3BpZXMnKSA9PSAwXG4gICAgICAgICkge1xuICAgICAgICAgICAgJCgnI2hlbHAtaG9sZC1sYWJlbCcpLmFkZENsYXNzKCdoaWRlTWUnKTtcbiAgICAgICAgICAgICQoJyNjbG9zZS1yYXRpby1oZWxwJykuYXR0cihcbiAgICAgICAgICAgICAgICAnYXJpYS1sYWJlbGxlZGJ5JyxcbiAgICAgICAgICAgICAgICAnaG9sZC1oZWxwLWxhYmVsLW5vQ29waWVzJ1xuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG4gICAgJCgnYSNob2xkcy1leHBsYW5hdGlvbi1kZXRhaWxzJykuYXR0cihcbiAgICAgICAgJ29uY2xpY2snLFxuICAgICAgICAnZHluYW1pY0hvbGRzUmF0aW9Nb2RhbCgnICtcbiAgICAgICAgICAgIG1lZGlhLmhvbGRzQ291bnQgK1xuICAgICAgICAgICAgJywgJyArXG4gICAgICAgICAgICBtZWRpYS5vd25lZENvcGllcyArXG4gICAgICAgICAgICAnLCAnICtcbiAgICAgICAgICAgIG1lZGlhLmhvbGRzUmF0aW8gK1xuICAgICAgICAgICAgJywgJyArXG4gICAgICAgICAgICBtZWRpYS5ob2xkTGlzdFBvc2l0aW9uICtcbiAgICAgICAgICAgICcpOydcbiAgICApO1xufTtcbiIsIi8vIFJlbGVhc2VkIHVuZGVyIE1JVCBsaWNlbnNlOiBodHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL21pdC1saWNlbnNlLnBocFxuXG5pZiAoYm93c2VyICYmIGJvd3Nlci5tc2llKSB7XG4gICAgKGZ1bmN0aW9uICgkKSB7XG4gICAgICAgICd1c2Ugc3RyaWN0JztcbiAgICAgICAgJChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkKCdbcGxhY2Vob2xkZXJdJylcbiAgICAgICAgICAgICAgICAuZm9jdXMoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgaW5wdXQgPSAkKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW5wdXQudmFsKCkgPT09IGlucHV0LmF0dHIoJ3BsYWNlaG9sZGVyJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbCgnJykucmVtb3ZlQ2xhc3MoJ3BsYWNlaG9sZGVyJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgICAgIC5ibHVyKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGlucHV0ID0gJCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFxuICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQudmFsKCkgPT09ICcnIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC52YWwoKSA9PT0gaW5wdXQuYXR0cigncGxhY2Vob2xkZXInKVxuICAgICAgICAgICAgICAgICAgICApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFkZENsYXNzKCdwbGFjZWhvbGRlcicpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLnZhbChpbnB1dC5hdHRyKCdwbGFjZWhvbGRlcicpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgLmJsdXIoKVxuICAgICAgICAgICAgICAgIC5wYXJlbnRzKCdmb3JtJylcbiAgICAgICAgICAgICAgICAuc3VibWl0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgJCh0aGlzKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmQoJ1twbGFjZWhvbGRlcl0nKVxuICAgICAgICAgICAgICAgICAgICAgICAgLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpbnB1dCA9ICQodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0LnZhbCgpID09PSBpbnB1dC5hdHRyKCdwbGFjZWhvbGRlcicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnZhbCgnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH0pKGpRdWVyeSk7XG59XG4iLCJjb25zdCB7IHJvdXRlcyB9ID0gcmVxdWlyZSgnLi9pbmRleF8nKTtcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgcm91dGVzOiBPYmplY3QuZnJlZXplKHJvdXRlcylcbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMucm91dGVzID0gdm9pZCAwO1xuZXhwb3J0cy5yb3V0ZXMgPSB7XG4gICAgaG9tZTogJy8nLFxuICAgIGJyb3dzZTogJy9icm93c2UnLFxuICAgIHNlYXJjaDogJy9zZWFyY2gnLFxuICAgIHNlYXJjaEJ5VHlwZTogJy9zZWFyY2gvOnR5cGUnLFxuICAgIGFkdmFuY2VkU2VhcmNoOiAnL2FkdmFuY2VkLXNlYXJjaCcsXG4gICAgY29sbGVjdGlvbkJ5SWQ6ICcvY29sbGVjdGlvbi86Y29sbGVjdGlvbklkJyxcbiAgICBmZWF0dXJlZENvbGxlY3Rpb246ICcvY29sbGVjdGlvbnMvZmVhdHVyZWQvOnZpZXdJZCcsXG4gICAgbWVkaWFJZDogJy9tZWRpYS86aWQnLFxuICAgIG1lZGlhSW5mb0lkOiAnL21lZGlhL2luZm8vOmlkJyxcbiAgICBtZWRpYVJlbGF0ZWRJZDogJy9tZWRpYS9yZWxhdGVkLzppZCcsXG4gICAgbWVkaWFSZWxhdGVkRm9ySG9sZFN1Y2Nlc3M6ICcvbWVkaWEvcmVsYXRlZGZvcmhvbGRzdWNjZXNzLzptZWRpYUlkJyxcbiAgICBtZWRpYUluZm86ICcvbWVkaWEvaW5mbycsXG4gICAgbWVkaWFBdmFpbGFiaWxpdHlJZDogJy9tZWRpYS9hdmFpbGFiaWxpdHkvOmlkJyxcbiAgICBtZWRpYURvd25sb2FkOiAnL21lZGlhL2Rvd25sb2FkLzpmb3JtYXQvOm1lZGlhSWQnLFxuICAgIG1lZGlhQm9ycm93OiAnL21lZGlhL2JvcnJvdy86bWVkaWFJZCcsXG4gICAgbWVkaWFCb3Jyb3dTdGF0dXM6ICcvbWVkaWEvbG9hbnMvOm1lZGlhSWQvOmxpYnJhcnlLZXknLFxuICAgIG1lZGlhUmV0dXJuOiAnL21lZGlhL3JldHVybi86bWVkaWFJZCcsXG4gICAgcGF0cm9uTWVkaWFTdGFyUmF0aW5nczogJy9wYXRyb24vbWVkaWEvc3Rhci1yYXRpbmcvOnRpdGxlSWQnLFxuICAgIG1lZGlhSG9sZFN0YXR1czogJy9tZWRpYS9ob2xkcy9zdGF0dXMvOm1lZGlhSWQnLFxuICAgIGdldFNpbmdsZUhvbGQ6ICcvbWVkaWEvaG9sZC86bWVkaWFJZCcsXG4gICAgbWVkaWFQbGFjZUhvbGQ6ICcvbWVkaWEvaG9sZCcsXG4gICAgbWVkaWFFZGl0SG9sZDogJy9tZWRpYS9ob2xkcy9lZGl0LzptZWRpYUlkJyxcbiAgICBtZWRpYVN1c3BlbmRIb2xkOiAnL21lZGlhL2hvbGRzL3N1c3BlbmQvOm1lZGlhSWQnLFxuICAgIG1lZGlhUmVtb3ZlSG9sZFN1c3BlbnNpb246ICcvbWVkaWEvaG9sZHMvc3VzcGVuZC9yZW1vdmUvOm1lZGlhSWQnLFxuICAgIG1lZGlhUmVtb3ZlSG9sZDogJy9tZWRpYS9ob2xkcy9yZW1vdmUvOm1lZGlhSWQnLFxuICAgIGFjY291bnRTZXR0aW5nczogJy9hY2NvdW50L3NldHRpbmdzJyxcbiAgICBhY2NvdW50V2lzaGxpc3Q6ICcvYWNjb3VudC9saXN0cy93aXNobGlzdCcsXG4gICAgYWNjb3VudFdpc2hsaXN0U3RhdHVzOiAnL2FjY291bnQvbGlzdHMvd2lzaGxpc3Qvc3RhdHVzLzptZWRpYUlkLzpsaWJyYXJ5S2V5JyxcbiAgICBhY2NvdW50V2lzaGxpc3RSZW1vdmU6ICcvYWNjb3VudC9saXN0cy93aXNobGlzdC9yZW1vdmUvOm1lZGlhSWQnLFxuICAgIGFjY291bnRXaXNobGlzdEFkZDogJy9hY2NvdW50L2xpc3RzL3dpc2hsaXN0L2FkZC86bWVkaWFJZCcsXG4gICAgc3VwcG9ydE1lbWJlcnM6ICcvc3VwcG9ydC9tZW1iZXJzJyxcbiAgICBzdXBwb3J0Q2FyZDogJy9zdXBwb3J0L2NhcmQnLFxuICAgIGFjY291bnRIb2xkczogJy9hY2NvdW50L2hvbGRzJyxcbiAgICBhY2NvdW50SW52YWxpZENhcmQ6ICcvYWNjb3VudC9jYXJkL2ludmFsaWQnLFxuICAgIGFjY291bnRMb2FuczogJy9hY2NvdW50L2xvYW5zJyxcbiAgICBhY2NvdW50TGlua0NhcmQ6ICcvYWNjb3VudC9saW5rY2FyZCcsXG4gICAgYWNjb3VudEdldEFDYXJkOiAnL2FjY291bnQvc2lnbi1pbj9pbnRlbnQ9Z2FjJyxcbiAgICBhY2NvdW50UmF0aW5nczogJy9hY2NvdW50L3JhdGluZ3MnLFxuICAgIGFjY291bnRTdGFydENhcmRMaW5rOiAnL2FjY291bnQvaW5pdGlhdGUtY2FyZC1saW5rJyxcbiAgICBhY2NvdW50U2lnbkluOiAnL2FjY291bnQvc2lnbi1pbicsXG4gICAgYWNjb3VudFNpZ25JbkNvbXBsZXRlOiAnL2FjY291bnQvc2lnbi1pbi9jb21wbGV0ZScsXG4gICAgYWNjb3VudFNpZ25vdXQ6ICcvYWNjb3VudC9zaWduLW91dCcsXG4gICAgYXBwQXV0aGVudGljYXRlOiAnL2FjY291bnQvYXBwLWF1dGhlbnRpY2F0ZScsXG4gICAgb3pvbmU6IHtcbiAgICAgICAgc2lnbkluOiAnL2FjY291bnQvb3pvbmUvc2lnbi1pbicsXG4gICAgICAgIGF1dGhlbnRpY2F0ZTogJy9hY2NvdW50L3NpZ25Jbk96b25lJyxcbiAgICAgICAgYWNjb3VudFNpZ25vdXRDb21wbGV0ZTogJy9hY2NvdW50L3NpZ24tb3V0L2NvbXBsZXRlJyxcbiAgICAgICAgZXh0ZXJuYWw6ICcvYWNjb3VudC9vem9uZS9leHRlcm5hbCcsXG4gICAgfSxcbiAgICBhY2NvdW50VmVyaWZ5TGlua2VkQ2FyZHM6ICcvYWNjb3VudC92ZXJpZnktbGlua2VkLWNhcmQnLFxuICAgIGFjY291bnRMaW5rTGlicmFyeUNhcmRDb21wbGV0ZTogJy9hY2NvdW50L2xpbmstbGlicmFyeS1jYXJkL2NvbXBsZXRlJyxcbiAgICBwYXRyb25FbWFpbDogJy9wYXRyb24vZW1haWwnLFxuICAgIHBhdHJvbkxlbmRpbmdQZXJpb2Q6ICcvcGF0cm9uL21lZGlhL2xlbmRpbmdQZXJpb2RzLzptZWRpYUlkJyxcbiAgICBnb0JhY2s6ICcvZ29iYWNrJyxcbiAgICBkbHJSb29tOiAnL2Rsci1yb29tJyxcbiAgICBkbHJBdXRoZW50aWNhdGU6ICcvQkFOR0F1dGhlbnRpY2F0ZS5kbGwnLFxuICAgIGRsck1lZGlhSWQ6ICcvQ29udGVudERldGFpbHMuaHRtJyxcbiAgICBzZXJpZXNieVRpdGxlOiAnL3Nlcmllcy1ieS10aXRsZS86bWVkaWFJZCcsXG4gICAgdXBkYXRlSG9sZFNldHRpbmdzOiAnL21lZGlhL2hvbGRzL3NldHRpbmdzJyxcbiAgICBnZXRCcmFuY2hlczogJy9icmFuY2hlcycsXG4gICAgcHJlZmVyZW5jZXM6ICcvcHJlZmVyZW5jZXMnLFxuICAgIGxlbmRpbmdTZXR0aW5nczogJy9sZW5kaW5nLXNldHRpbmdzJyxcbiAgICByZXZpZXdzOiAnL21lZGlhL3Jldmlld3MvOm1lZGlhSWQnLFxuICAgIHJlbGF0ZWRDYXJvdXNlbDogJy9tZWRpYS9yZWxhdGVkVGl0bGVzQ2Fyb3VzZWwvOmlkJyxcbiAgICBhY2NvdW50SGlzdG9yeTogJy9hY2NvdW50L2hpc3RvcnknLFxuICAgIHJlc3Q6IHtcbiAgICAgICAgYWNjb3VudDoge1xuICAgICAgICAgICAgZ2V0OiAnL3Jlc3QvYWNjb3VudC8nLFxuICAgICAgICAgICAgbGltaXRzOiAnL3Jlc3QvYWNjb3VudC9saW1pdHMnLFxuICAgICAgICAgICAgYXV0aExvY2FsOiAnL3Jlc3QvYWNjb3VudC9hdXRoZW50aWNhdGUvbG9jYWwnLFxuICAgICAgICB9LFxuICAgICAgICBjb2xsZWN0aW9uczoge1xuICAgICAgICAgICAgZ2V0QnlJZDogJy9yZXN0L2NvbGxlY3Rpb25zLzppZCcsXG4gICAgICAgIH0sXG4gICAgICAgIG1lZGlhOiB7XG4gICAgICAgICAgICBpbmRleDogJy9yZXN0L21lZGlhJyxcbiAgICAgICAgICAgIHJlbGF0ZWQ6ICcvcmVzdC9tZWRpYS86aWQvcmVsYXRlZFRpdGxlcycsXG4gICAgICAgICAgICByZWxhdGVkVGl0bGVzUGFnZTogJy9yZXN0L21lZGlhLzppZC9yZWxhdGVkVGl0bGVzUGFnZScsXG4gICAgICAgICAgICBhdmFpbGFibGVSZWxhdGVkOiAnL3Jlc3QvbWVkaWEvOmlkL2F2YWlsYWJsZVJlbGF0ZWRUaXRsZXMnLFxuICAgICAgICAgICAgcmVjZW50SXNzdWVzOiAnL3Jlc3QvbWVkaWEvcmVjZW50SXNzdWVzLzppZCcsXG4gICAgICAgIH0sXG4gICAgICAgIHN1YmplY3RzOiB7XG4gICAgICAgICAgICBnZXRHcm91cGVkQnlQYXJlbnQ6ICcvcmVzdC9zdWJqZWN0cy9ieXBhcmVudCcsXG4gICAgICAgICAgICBnZXRDb3VudEJ5TWVkaWFUeXBlOiAnL3Jlc3Qvc3ViamVjdHMvY291bnRieS9tZWRpYXR5cGUnLFxuICAgICAgICB9LFxuICAgICAgICBzZWFyY2g6IHtcbiAgICAgICAgICAgIGNvbGxlY3Rpb25NZXRhZGF0YTogJy9yZXN0L3NlYXJjaC9jb2xsZWN0aW9uTWV0YWRhdGEnLFxuICAgICAgICB9LFxuICAgICAgICByZWFkaW5nSGlzdG9yeToge1xuICAgICAgICAgICAgaW5kZXg6ICcvcmVzdC9yZWFkaW5nSGlzdG9yeScsXG4gICAgICAgICAgICB0aXRsZTogJy9yZXN0L3JlYWRpbmdIaXN0b3J5L3RpdGxlLzppZCcsXG4gICAgICAgICAgICBzZXR0aW5nczogJy9yZXN0L3JlYWRpbmdIaXN0b3J5L3NldHRpbmdzJyxcbiAgICAgICAgICAgIGV4cG9ydDogJy9yZXN0L3JlYWRpbmdIaXN0b3J5L2V4cG9ydCcsXG4gICAgICAgIH0sXG4gICAgICAgIHJvb21zOiB7XG4gICAgICAgICAgICBnZXQ6ICcvcmVzdC9yb29tcy86cm9vbUlkJyxcbiAgICAgICAgfSxcbiAgICAgICAgY2FtcGFpZ25zOiB7XG4gICAgICAgICAgICBnZXQ6ICcvcmVzdC9jYW1wYWlnbnMvOmNhbXBhaWduSWQnLFxuICAgICAgICAgICAgZ2V0Rmlyc3REaXNwbGF5YWJsZTogJy9yZXN0L2NhbXBhaWduL2ZpcnN0RGlzcGxheWFibGUvOnJvb21JZCcsXG4gICAgICAgIH0sXG4gICAgICAgIHByZWZlcmVuY2VzOiB7XG4gICAgICAgICAgICBnbG9iYWw6IHtcbiAgICAgICAgICAgICAgICBpbmRleDogJy9yZXN0L3ByZWZlcmVuY2VzL2dsb2JhbC8nLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgaWRjOiB7XG4gICAgICAgICAgICBwaG9uZToge1xuICAgICAgICAgICAgICAgIHNlbmRDb2RlOiAnL3Jlc3QvaWRjL3Bob25lL3NlbmQtY29kZScsXG4gICAgICAgICAgICAgICAgc2lnblVwOiAnL3Jlc3QvaWRjL3Bob25lL3NpZ24tdXAnLFxuICAgICAgICAgICAgICAgIHZlcmlmeUNvZGU6ICcvcmVzdC9pZGMvcGhvbmUvdmVyaWZ5LWNvZGUnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGdlbzoge1xuICAgICAgICAgICAgICAgIGF1dGhvcml6ZTogJy9yZXN0L2lkYy9nZW8vYXV0aG9yaXplJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBlbWFpbDoge1xuICAgICAgICAgICAgICAgIHNlbmRDb2RlOiAnL3Jlc3QvaWRjL2VtYWlsL3NlbmQtY29kZScsXG4gICAgICAgICAgICAgICAgdmVyaWZ5Q29kZTogJy9yZXN0L2lkYy9lbWFpbC92ZXJpZnktY29kZScsXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2lnblVwOiAnL3Jlc3QvaWRjL3NpZ24tdXAnLFxuICAgICAgICB9LFxuICAgICAgICBwYXRyb25Ob3RpZmljYXRpb25zOiB7XG4gICAgICAgICAgICBnZXQ6ICcvcmVzdC9ub3RpZmljYXRpb25zLycsXG4gICAgICAgICAgICBkaXNtaXNzOiAnL3Jlc3Qvbm90aWZpY2F0aW9ucy86aWQnLFxuICAgICAgICAgICAgZGlzbWlzc0J5QWN0aW9uOiAnL3Jlc3Qvbm90aWZpY2F0aW9ucy9jaXJjLWFjdGlvbicsXG4gICAgICAgIH0sXG4gICAgfSxcbiAgICBhc3NldHM6IHtcbiAgICAgICAgY3NzOiB7XG4gICAgICAgICAgICB2ZXJzaW9uZWRDb2xvcnM6ICcvYXNzZXRzL3YyL2Nzcy86dmVyc2lvbi9jb2xvcnMuY3NzJyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIGZ1bGZpbGxtZW50RXJyb3I6ICcvZnVsZmlsbG1lbnRFcnJvcicsXG4gICAgbGliYnlJbnRlcmNlcHQ6ICcvbGliYnlQcm9tbycsXG4gICAgbWVyZ2VkU2l0ZTogJy9tZXJnZWQnLFxuICAgIG9kQXBwU3Vuc2V0OiAnL29kQXBwU3Vuc2V0JyxcbiAgICB0ZXJtaW5hdGVkU2l0ZTogJy90ZXJtaW5hdGVkJyxcbiAgICB0bHNTaXRlOiAnL3RscycsXG4gICAgcHVibGljQXBpRnVsZmlsbG1lbnQ6IHtcbiAgICAgICAgaW5kZXg6ICcvZnVsZmlsbG1lbnQvOnJlc2VydmVJZCcsXG4gICAgICAgIHNtczogJy9mdWxmaWxsbWVudC1zbXMvOmtleScsXG4gICAgICAgIGdldERvd25sb2FkTGluazogJy9kb3dubG9hZC86Zm9ybWF0LzptZWRpYUlkJyxcbiAgICAgICAgZ2V0RG93bmxvYWRSZWRpcmVjdDogJy9mdWxmaWxsbWVudC9kb3dubG9hZC1yZWRpcmVjdC86Zm9ybWF0LzptZWRpYUlkJyxcbiAgICAgICAgZ2V0TWVkaWE6ICcvZnVsZmlsbG1lbnQvbWVkaWEvOmZvcm1hdC86bWVkaWFJZCcsXG4gICAgfSxcbiAgICBhcGk6IHtcbiAgICAgICAgbGlicmFyeTogJy9hcGkvbGlicmFyeScsXG4gICAgICAgIHJlcG9ydGluZzoge1xuICAgICAgICAgICAgYWpheEVycm9yOiAnL2FwaS9yZXBvcnRpbmcvYWpheEVycm9yJyxcbiAgICAgICAgfSxcbiAgICAgICAgcGF0cm9uOiB7XG4gICAgICAgICAgICBjaGVja291dHM6ICcvYXBpL2xpYnJhcmllcy86bGlicmFyeUtleS9wYXRyb25zL21lL2NhcmRzLzpjYXJkSWQvY2hlY2tvdXRzJyxcbiAgICAgICAgICAgIGNoZWNrb3V0OiAnL2FwaS9saWJyYXJpZXMvOmxpYnJhcnlLZXkvcGF0cm9ucy9tZS9jYXJkcy86Y2FyZElkL2NoZWNrb3V0cy86cmVzZXJ2ZUlkJyxcbiAgICAgICAgfSxcbiAgICB9LFxuICAgIGthbm9weToge1xuICAgICAgICBub1N1YnNjcmlwdGlvbjogJy9rYW5vcHkvbm8tc3Vic2NyaXB0aW9uJyxcbiAgICAgICAgcHJvbW86ICcvZ2V0a2Fub3B5JyxcbiAgICB9LFxuICAgIG50Yzoge1xuICAgICAgICBkZXRhaWw6ICcvZXh0cmFzLzpzbHVnJyxcbiAgICAgICAgZmFxOiAnL2V4dHJhcy9mYXEnLFxuICAgICAgICBpbmRleDogJy9leHRyYXMnLFxuICAgICAgICBhcGk6IHtcbiAgICAgICAgICAgIHByb3ZpZGVyOiAnL2FwaS9leHRyYXMvcHJvdmlkZXJzLzpzbHVnJyxcbiAgICAgICAgICAgIHByb3ZpZGVyczogJy9hcGkvZXh0cmFzL3Byb3ZpZGVycycsXG4gICAgICAgICAgICBhdXRoOiAnL2FwaS9leHRyYXMvYXV0aCcsXG4gICAgICAgICAgICBhdXRvUmVkaXJlY3Q6ICcvYXBpL2V4dHJhcy9hdXRoL3JlZGlyZWN0JyxcbiAgICAgICAgICAgIGF1dG9Qb3N0Rm9ybXM6ICcvYXBpL2V4dHJhcy9hdXRoL2F1dG9Qb3N0JyxcbiAgICAgICAgfSxcbiAgICAgICAgc2lnbkluOiAnL2V4dHJhcy9zaWduLWluJyxcbiAgICB9LFxufTtcblxuLy8jIHNvdXJjZU1hcHBpbmdVUkw9aW5kZXhfLmpzLm1hcFxuXG4vLyMgc291cmNlTWFwcGluZ1VSTD1pbmRleF8uanMubWFwXG4iXX0="}